From 34a04d798ed0b4f4b652082da994c8648e4517e6 Mon Sep 17 00:00:00 2001 From: Andrei Karas Date: Wed, 28 Oct 2015 19:54:36 +0300 Subject: Add support for images in npc skined menu. --- src/CMakeLists.txt | 2 ++ src/Makefile.am | 2 ++ src/enums/simpletypes/autorelease.h | 28 +++++++++++++++++++++++++ src/gui/widgets/icon.cpp | 14 +++++++++---- src/gui/widgets/icon.h | 9 ++++++-- src/gui/windows/npcdialog.cpp | 13 ++++++++++++ src/resources/db/npcdialogdb.cpp | 18 ++++++++++++++++ src/resources/npcdialoginfo.h | 3 +++ src/resources/npcimageinfo.h | 42 +++++++++++++++++++++++++++++++++++++ 9 files changed, 125 insertions(+), 6 deletions(-) create mode 100644 src/enums/simpletypes/autorelease.h create mode 100644 src/resources/npcimageinfo.h diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 016c59f6f..474354b95 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -674,6 +674,7 @@ SET(SRCS resources/notifications.h resources/npcbuttoninfo.h resources/npcdialoginfo.h + resources/npcimageinfo.h enums/resources/notifyflags.h enums/resources/notifytypes.h resources/db/monsterdb.cpp @@ -1093,6 +1094,7 @@ SET(SRCS enums/state.h enums/simpletypes/allowsort.h enums/simpletypes/allplayers.h + enums/simpletypes/autorelease.h enums/simpletypes/autotarget.h enums/simpletypes/beingid.h enums/simpletypes/beingtypeid.h diff --git a/src/Makefile.am b/src/Makefile.am index 2d583f5b3..7a29b24cb 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -339,6 +339,7 @@ SRC += events/actionevent.h \ resources/notifications.h \ resources/npcbuttoninfo.h \ resources/npcdialoginfo.h \ + resources/npcimageinfo.h \ enums/resources/notifyflags.h \ enums/resources/notifytypes.h \ resources/imagerect.h \ @@ -556,6 +557,7 @@ SRC += events/actionevent.h \ enums/state.h \ enums/simpletypes/allowsort.h \ enums/simpletypes/allplayers.h \ + enums/simpletypes/autorelease.h \ enums/simpletypes/autotarget.h \ enums/simpletypes/beingid.h \ enums/simpletypes/beingtypeid.h \ diff --git a/src/enums/simpletypes/autorelease.h b/src/enums/simpletypes/autorelease.h new file mode 100644 index 000000000..bb7249a91 --- /dev/null +++ b/src/enums/simpletypes/autorelease.h @@ -0,0 +1,28 @@ +/* + * The ManaPlus Client + * Copyright (C) 2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef ENUMS_SIMPLETYPES_AUTORELEASE_H +#define ENUMS_SIMPLETYPES_AUTORELEASE_H + +#include "enums/simpletypes/booldefines.h" + +defBoolEnum(AutoRelease); + +#endif // ENUMS_SIMPLETYPES_AUTORELEASE_H diff --git a/src/gui/widgets/icon.cpp b/src/gui/widgets/icon.cpp index 5876b1201..6c44cdc3a 100644 --- a/src/gui/widgets/icon.cpp +++ b/src/gui/widgets/icon.cpp @@ -30,9 +30,11 @@ #include "debug.h" Icon::Icon(const Widget2 *const widget, - const std::string &file) : + const std::string &file, + const AutoRelease autoRelease) : Widget(widget), - mImage(resourceManager->getImage(file)) + mImage(resourceManager->getImage(file)), + mAutoRelease(autoRelease) { if (mImage) { @@ -43,9 +45,11 @@ Icon::Icon(const Widget2 *const widget, } Icon::Icon(const Widget2 *const widget, - Image *const image) : + Image *const image, + const AutoRelease autoRelease) : Widget(widget), - mImage(image) + mImage(image), + mAutoRelease(autoRelease) { if (mImage) { @@ -59,6 +63,8 @@ Icon::~Icon() { if (gui) gui->removeDragged(this); + if (mImage && mAutoRelease == AutoRelease_true) + mImage->decRef(); } void Icon::setImage(Image *const image) diff --git a/src/gui/widgets/icon.h b/src/gui/widgets/icon.h index e48f71b24..c54c314ba 100644 --- a/src/gui/widgets/icon.h +++ b/src/gui/widgets/icon.h @@ -25,6 +25,8 @@ #include "gui/widgets/widget.h" +#include "enums/simpletypes/autorelease.h" + #include "localconsts.h" class Image; @@ -41,13 +43,15 @@ class Icon final : public Widget * Constructor. */ Icon(const Widget2 *const widget, - const std::string &filename); + const std::string &filename, + const AutoRelease autoRelease = AutoRelease_false); /** * Constructor, uses an existing Image. */ Icon(const Widget2 *const widget, - Image *const image); + Image *const image, + const AutoRelease autoRelease = AutoRelease_false); A_DELETE_COPY(Icon) @@ -73,6 +77,7 @@ class Icon final : public Widget private: Image *mImage; + AutoRelease mAutoRelease; }; #endif // GUI_WIDGETS_ICON_H diff --git a/src/gui/windows/npcdialog.cpp b/src/gui/windows/npcdialog.cpp index 53f64f41c..f375e9509 100644 --- a/src/gui/windows/npcdialog.cpp +++ b/src/gui/windows/npcdialog.cpp @@ -43,6 +43,7 @@ #include "gui/widgets/browserbox.h" #include "gui/widgets/button.h" #include "gui/widgets/createwidget.h" +#include "gui/widgets/icon.h" #include "gui/widgets/inttextfield.h" #include "gui/widgets/itemcontainer.h" #include "gui/widgets/itemlinkhandler.h" @@ -1166,6 +1167,18 @@ void NpcDialog::createSkinControls() } mHideText = dialog->hideText; + FOR_EACH (std::vector::const_iterator, it, dialog->images) + { + const NpcImageInfo *const info = *it; + Image *const image = Theme::getImageFromTheme(info->name); + if (image) + { + Icon *const icon = new Icon(this, image, AutoRelease_true); + icon->setPosition(info->x, info->y); + mSkinContainer->add(icon); + } + } + FOR_EACH (std::vector::const_iterator, it, dialog->buttons) { const NpcButtonInfo *const info = *it; diff --git a/src/resources/db/npcdialogdb.cpp b/src/resources/db/npcdialogdb.cpp index cdb96a2ee..86bc712f2 100644 --- a/src/resources/db/npcdialogdb.cpp +++ b/src/resources/db/npcdialogdb.cpp @@ -80,6 +80,22 @@ static void loadNpcDialog(NpcDialogInfo *const dialog, childNode, "imageHeight", 16, 1, 1000); dialog->buttons.push_back(button); } + else if (xmlNameEqual(childNode, "image")) + { + const std::string image = XML::getProperty(childNode, "image", ""); + if (image.empty()) + { + logger->log("Error: no image attribute found in image tag."); + continue; + } + NpcImageInfo *const imageInfo = new NpcImageInfo; + imageInfo->name = image; + imageInfo->x = XML::getIntProperty( + childNode, "x", 0, 0, 10000); + imageInfo->y = XML::getIntProperty( + childNode, "y", 0, 0, 10000); + dialog->images.push_back(imageInfo); + } } } @@ -132,6 +148,7 @@ void NpcDialogDB::deleteDialog(const std::string &name) NpcDialogInfo *dialog = (*it).second; delete_all(dialog->buttons); + delete_all(dialog->images); mDialogs.erase(it); delete dialog; } @@ -144,6 +161,7 @@ void NpcDialogDB::unload() { NpcDialogInfo *dialog = (*it).second; delete_all(dialog->buttons); + delete_all(dialog->images); delete dialog; } mDialogs.clear(); diff --git a/src/resources/npcdialoginfo.h b/src/resources/npcdialoginfo.h index ce3e8e92a..aa73d2c01 100644 --- a/src/resources/npcdialoginfo.h +++ b/src/resources/npcdialoginfo.h @@ -22,6 +22,7 @@ #define RESOURCES_NPCDIALOGINFO_H #include "resources/npcbuttoninfo.h" +#include "resources/npcimageinfo.h" #include "utils/stringvector.h" @@ -31,12 +32,14 @@ struct NpcDialogInfo final { NpcDialogInfo() : buttons(), + images(), name(), hideText(false) { } std::vector buttons; + std::vector images; std::string name; bool hideText; }; diff --git a/src/resources/npcimageinfo.h b/src/resources/npcimageinfo.h new file mode 100644 index 000000000..94bb60f44 --- /dev/null +++ b/src/resources/npcimageinfo.h @@ -0,0 +1,42 @@ +/* + * The ManaPlus Client + * Copyright (C) 2011-2015 The ManaPlus Developers + * + * This file is part of The ManaPlus Client. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#ifndef RESOURCES_NPCIMAGEINFO_H +#define RESOURCES_NPCIMAGEINFO_H + +#include + +#include "localconsts.h" + +struct NpcImageInfo final +{ + NpcImageInfo() : + name(), + x(0), + y(0) + { + } + + std::string name; + int x; + int y; +}; + +#endif // RESOURCES_NPCIMAGEINFO_H -- cgit v1.2.3-70-g09d2