From 0647852f65598ef9cb9ebff6dfb508e8b1a98c1c Mon Sep 17 00:00:00 2001
From: Andrei Karas <akaras@inbox.ru>
Date: Fri, 3 Aug 2012 02:11:25 +0300
Subject: Add support for default theme file names.

---
 src/gui/questswindow.cpp                   |  6 ++++--
 src/gui/theme.cpp                          | 26 ++++++++++++++++----------
 src/gui/theme.h                            | 13 ++++++++-----
 src/gui/widgets/avatarlistbox.cpp          |  4 ++--
 src/gui/widgets/button.cpp                 |  5 ++++-
 src/gui/widgets/checkbox.cpp               |  2 +-
 src/gui/widgets/dropdown.cpp               |  8 ++++++--
 src/gui/widgets/dropshortcutcontainer.cpp  |  2 +-
 src/gui/widgets/emoteshortcutcontainer.cpp |  2 +-
 src/gui/widgets/itemcontainer.cpp          |  2 +-
 src/gui/widgets/itemshortcutcontainer.cpp  |  2 +-
 src/gui/widgets/playerbox.cpp              |  3 ++-
 src/gui/widgets/popup.cpp                  |  2 +-
 src/gui/widgets/progressbar.cpp            |  2 +-
 src/gui/widgets/radiobutton.cpp            |  2 +-
 src/gui/widgets/resizegrip.cpp             |  2 +-
 src/gui/widgets/scrollarea.cpp             | 10 ++++++----
 src/gui/widgets/slider.cpp                 |  5 ++++-
 src/gui/widgets/spellshortcutcontainer.cpp |  2 +-
 src/gui/widgets/tab.cpp                    |  5 ++++-
 src/gui/widgets/textfield.cpp              |  2 +-
 src/gui/widgets/window.cpp                 |  2 +-
 src/text.cpp                               |  2 +-
 23 files changed, 69 insertions(+), 42 deletions(-)

diff --git a/src/gui/questswindow.cpp b/src/gui/questswindow.cpp
index 5ffdf45c5..8969c51e8 100644
--- a/src/gui/questswindow.cpp
+++ b/src/gui/questswindow.cpp
@@ -93,8 +93,8 @@ QuestsWindow::QuestsWindow() :
     mTextScrollArea(new ScrollArea(mText,
         getOptionBool("showtextbackground"))),
     mCloseButton(new Button(_("Close"), "close", this)),
-    mCompleteIcon(Theme::getImageFromThemeXml("complete_icon.xml")),
-    mIncompleteIcon(Theme::getImageFromThemeXml("incomplete_icon.xml"))
+    mCompleteIcon(Theme::getImageFromThemeXml("complete_icon.xml", "")),
+    mIncompleteIcon(Theme::getImageFromThemeXml("incomplete_icon.xml", ""))
 {
     setWindowName("Quests");
     setResizable(true);
@@ -148,6 +148,8 @@ QuestsWindow::~QuestsWindow()
             delete *it2;
         }
     }
+    delete mItemLinkHandler;
+    mItemLinkHandler = nullptr;
     mQuests.clear();
     mQuestLinks.clear();
     if (mCompleteIcon)
diff --git a/src/gui/theme.cpp b/src/gui/theme.cpp
index 2ea8ba840..44de72cdc 100644
--- a/src/gui/theme.cpp
+++ b/src/gui/theme.cpp
@@ -230,8 +230,8 @@ gcn::Color Theme::getProgressColor(int type, float progress)
     return gcn::Color(color[0], color[1], color[2]);
 }
 
-Skin *Theme::load(const std::string &filename, bool full,
-                  const std::string &defaultPath)
+Skin *Theme::load(const std::string &filename, const std::string &filename2,
+                  bool full, const std::string &defaultPath)
 {
     // Check if this skin was already loaded
 
@@ -245,7 +245,10 @@ Skin *Theme::load(const std::string &filename, bool full,
 
     Skin *skin = readSkin(filename, full);
 
-    if (!skin && filename != "window.xml")
+    if (!skin && !filename2.empty() && filename2 != filename)
+        skin = readSkin(filename2, full);
+
+    if (!skin && filename2 != "window.xml")
         skin = readSkin("window.xml", full);
 
     if (!skin)
@@ -873,9 +876,10 @@ void Theme::loadColors(std::string file)
     }
 }
 
-void Theme::loadRect(ImageRect &image, std::string name, int start, int end)
+void Theme::loadRect(ImageRect &image, std::string name, std::string name2,
+                     int start, int end)
 {
-    Skin *skin = load(name, false);
+    Skin *skin = load(name, name2, false);
     if (skin)
     {
         const ImageRect &rect = skin->getBorder();
@@ -892,9 +896,9 @@ void Theme::loadRect(ImageRect &image, std::string name, int start, int end)
 }
 
 Skin *Theme::loadSkinRect(ImageRect &image, std::string name,
-                          int start, int end)
+                          std::string name2, int start, int end)
 {
-    Skin *skin = load(name);
+    Skin *skin = load(name, name2);
     if (skin)
     {
         const ImageRect &rect = skin->getBorder();
@@ -919,10 +923,11 @@ void Theme::unloadRect(ImageRect &rect, int start, int end)
     }
 }
 
-Image *Theme::getImageFromThemeXml(const std::string &name)
+Image *Theme::getImageFromThemeXml(const std::string &name,
+                                   const std::string &name2)
 {
     Theme *theme = Theme::instance();
-    Skin *skin = theme->load(name, false);
+    Skin *skin = theme->load(name, name2, false);
     if (skin)
     {
         const ImageRect &rect = skin->getBorder();
@@ -939,10 +944,11 @@ Image *Theme::getImageFromThemeXml(const std::string &name)
 }
 
 ImageSet *Theme::getImageSetFromThemeXml(const std::string &name,
+                                         const std::string &name2,
                                          int w, int h)
 {
     Theme *theme = Theme::instance();
-    Skin *skin = theme->load(name, false);
+    Skin *skin = theme->load(name, name2, false);
     if (skin)
     {
         const ImageRect &rect = skin->getBorder();
diff --git a/src/gui/theme.h b/src/gui/theme.h
index 216b19802..2a3a4aa2d 100644
--- a/src/gui/theme.h
+++ b/src/gui/theme.h
@@ -161,6 +161,7 @@ class Theme : public Palette, public ConfigListener
                                               int w, int h);
 
         ImageSet *getImageSetFromThemeXml(const std::string &name,
+                                          const std::string &name2,
                                           int w, int h);
         enum ThemePalette
         {
@@ -261,11 +262,12 @@ class Theme : public Palette, public ConfigListener
         /**
          * Loads a skin.
          */
-        Skin *load(const std::string &filename, bool full = true,
-                   const std::string &defaultPath = getThemePath());
+        Skin *load(const std::string &filename, const std::string &filename2,
+                   bool full = true, const std::string
+                   &defaultPath = getThemePath());
 
         Skin *loadSkinRect(ImageRect &image, std::string name,
-                           int start = 0, int end = 8);
+                           std::string name2, int start = 0, int end = 8);
 
         void unload(Skin *skin);
 
@@ -288,12 +290,13 @@ class Theme : public Palette, public ConfigListener
 
         void optionChanged(const std::string &);
 
-        void loadRect(ImageRect &image, std::string name,
+        void loadRect(ImageRect &image, std::string name, std::string name2,
                       int start = 0, int end = 8);
 
         void unloadRect(ImageRect &rect, int start = 0, int end = 8);
 
-        static Image *getImageFromThemeXml(const std::string &name);
+        static Image *getImageFromThemeXml(const std::string &name,
+                                           const std::string &name2);
 
     private:
         Theme();
diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp
index 914437281..ad139159a 100644
--- a/src/gui/widgets/avatarlistbox.cpp
+++ b/src/gui/widgets/avatarlistbox.cpp
@@ -58,8 +58,8 @@ AvatarListBox::AvatarListBox(AvatarListModel *model):
 
     if (instances == 1)
     {
-        onlineIcon = Theme::getImageFromThemeXml("circle-on.xml");
-        offlineIcon = Theme::getImageFromThemeXml("circle-off.xml");
+        onlineIcon = Theme::getImageFromThemeXml("circle-on.xml", "");
+        offlineIcon = Theme::getImageFromThemeXml("circle-off.xml", "");
     }
 
     setWidth(200);
diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp
index 15b4abdc2..51d4efc6c 100644
--- a/src/gui/widgets/button.cpp
+++ b/src/gui/widgets/button.cpp
@@ -176,7 +176,10 @@ void Button::init()
         if (Theme::instance())
         {
             for (int mode = 0; mode < BUTTON_COUNT; mode ++)
-                Theme::instance()->loadRect(button[mode], data[mode]);
+            {
+                Theme::instance()->loadRect(button[mode],
+                    data[mode], "button.xml");
+            }
         }
 
         updateAlpha();
diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp
index ab08a95d0..04ac998bf 100644
--- a/src/gui/widgets/checkbox.cpp
+++ b/src/gui/widgets/checkbox.cpp
@@ -56,7 +56,7 @@ CheckBox::CheckBox(const std::string &caption, bool selected,
         if (Theme::instance())
         {
             ImageRect rect;
-            Theme::instance()->loadRect(rect, "checkbox.xml", 0, 5);
+            Theme::instance()->loadRect(rect, "checkbox.xml", "", 0, 5);
             checkBoxNormal = rect.grid[0];
             checkBoxChecked = rect.grid[1];
             checkBoxDisabled = rect.grid[2];
diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp
index dd9bbb4e5..7e810390a 100644
--- a/src/gui/widgets/dropdown.cpp
+++ b/src/gui/widgets/dropdown.cpp
@@ -70,7 +70,8 @@ DropDown::DropDown(gcn::ListModel *listModel, gcn::ActionListener* listener,
         // Load the background skin
         for (int i = 0; i < 2; i ++)
         {
-            Skin *skin = Theme::instance()->load(dropdownFiles[i]);
+            Skin *skin = Theme::instance()->load(
+                dropdownFiles[i], "dropdown.xml");
             if (skin)
             {
                 const ImageRect &rect = skin->getBorder();
@@ -98,7 +99,10 @@ DropDown::DropDown(gcn::ListModel *listModel, gcn::ActionListener* listener,
 
         // get the border skin
         if (Theme::instance())
-            Theme::instance()->loadRect(skinRect, "dropdown_background.xml");
+        {
+            Theme::instance()->loadRect(skinRect,
+                "dropdown_background.xml", "");
+        }
     }
 
     instances++;
diff --git a/src/gui/widgets/dropshortcutcontainer.cpp b/src/gui/widgets/dropshortcutcontainer.cpp
index d70f153d7..a471ab8ff 100644
--- a/src/gui/widgets/dropshortcutcontainer.cpp
+++ b/src/gui/widgets/dropshortcutcontainer.cpp
@@ -57,7 +57,7 @@ DropShortcutContainer::DropShortcutContainer():
     addWidgetListener(this);
 
     mBackgroundImg = Theme::getImageFromThemeXml(
-        "item_shortcut_background.xml");
+        "item_shortcut_background.xml", "background.xml");
     if (dropShortcut)
         mMaxItems = dropShortcut->getItemCount();
     else
diff --git a/src/gui/widgets/emoteshortcutcontainer.cpp b/src/gui/widgets/emoteshortcutcontainer.cpp
index d3de9e8de..17d825909 100644
--- a/src/gui/widgets/emoteshortcutcontainer.cpp
+++ b/src/gui/widgets/emoteshortcutcontainer.cpp
@@ -57,7 +57,7 @@ EmoteShortcutContainer::EmoteShortcutContainer():
     addWidgetListener(this);
 
     mBackgroundImg = Theme::getImageFromThemeXml(
-        "item_shortcut_background.xml");
+        "item_shortcut_background.xml", "background.xml");
 
     if (mBackgroundImg)
         mBackgroundImg->setAlpha(Client::getGuiAlpha());
diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp
index 6963bad31..e315a336c 100644
--- a/src/gui/widgets/itemcontainer.cpp
+++ b/src/gui/widgets/itemcontainer.cpp
@@ -157,7 +157,7 @@ ItemContainer::ItemContainer(Inventory *inventory, bool forceQuantity):
     mInventory(inventory),
     mGridColumns(1),
     mGridRows(1),
-    mSelImg(Theme::getImageFromThemeXml("item_selection.xml")),
+    mSelImg(Theme::getImageFromThemeXml("item_selection.xml", "")),
     mSelectedIndex(-1),
     mHighlightedIndex(-1),
     mLastUsedSlot(-1),
diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp
index e27d5efd6..50fc0de0f 100644
--- a/src/gui/widgets/itemshortcutcontainer.cpp
+++ b/src/gui/widgets/itemshortcutcontainer.cpp
@@ -64,7 +64,7 @@ ItemShortcutContainer::ItemShortcutContainer(unsigned number):
     addWidgetListener(this);
 
     mBackgroundImg = Theme::getImageFromThemeXml(
-        "item_shortcut_background.xml");
+        "item_shortcut_background.xml", "background.xml");
     if (itemShortcut[mNumber])
         mMaxItems = itemShortcut[mNumber]->getItemCount();
     else
diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp
index 423f26563..b9f6657a9 100644
--- a/src/gui/widgets/playerbox.cpp
+++ b/src/gui/widgets/playerbox.cpp
@@ -73,7 +73,8 @@ void PlayerBox::init(std::string skin)
     {
         if (skin.empty())
             skin = "playerbox_background.xml";
-        mSkin = Theme::instance()->loadSkinRect(mBackground, skin);
+        mSkin = Theme::instance()->loadSkinRect(mBackground,
+            skin, "background.xml");
         if (mSkin)
             mDrawBackground = (mSkin->getOption("drawbackground") != 0);
     }
diff --git a/src/gui/widgets/popup.cpp b/src/gui/widgets/popup.cpp
index e206a3246..34079afb2 100644
--- a/src/gui/widgets/popup.cpp
+++ b/src/gui/widgets/popup.cpp
@@ -64,7 +64,7 @@ Popup::Popup(const std::string &name, std::string skin):
     // Loads the skin
     if (Theme::instance())
     {
-        mSkin = Theme::instance()->load(skin);
+        mSkin = Theme::instance()->load(skin, "popup.xml");
         if (mSkin)
             setPadding(mSkin->getPadding());
     }
diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp
index 2ddd2b0b9..0d0211bcc 100644
--- a/src/gui/widgets/progressbar.cpp
+++ b/src/gui/widgets/progressbar.cpp
@@ -75,7 +75,7 @@ ProgressBar::ProgressBar(float progress,
             mBorder.grid[f] = nullptr;
 
         if (Theme::instance())
-            Theme::instance()->loadRect(mBorder, "progressbar.xml");
+            Theme::instance()->loadRect(mBorder, "progressbar.xml", "");
     }
 
     mInstances++;
diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp
index e0e01d4ed..6a89b3080 100644
--- a/src/gui/widgets/radiobutton.cpp
+++ b/src/gui/widgets/radiobutton.cpp
@@ -54,7 +54,7 @@ RadioButton::RadioButton(const std::string &caption, const std::string &group,
         if (Theme::instance())
         {
             ImageRect rect;
-            Theme::instance()->loadRect(rect, "radio.xml", 0, 3);
+            Theme::instance()->loadRect(rect, "radio.xml", "", 0, 3);
             radioChecked = rect.grid[0];
             radioDisabledChecked = rect.grid[0];
             radioCheckedHi = rect.grid[1];
diff --git a/src/gui/widgets/resizegrip.cpp b/src/gui/widgets/resizegrip.cpp
index 4b299a5dc..53254193d 100644
--- a/src/gui/widgets/resizegrip.cpp
+++ b/src/gui/widgets/resizegrip.cpp
@@ -43,7 +43,7 @@ ResizeGrip::ResizeGrip(const std::string &image)
     if (mInstances == 0)
     {
         // Load the grip image
-        gripImage = Theme::getImageFromThemeXml(image);
+        gripImage = Theme::getImageFromThemeXml(image, "");
 
         if (gripImage)
             gripImage->setAlpha(mAlpha);
diff --git a/src/gui/widgets/scrollarea.cpp b/src/gui/widgets/scrollarea.cpp
index 6bc75d5a2..2906ab641 100644
--- a/src/gui/widgets/scrollarea.cpp
+++ b/src/gui/widgets/scrollarea.cpp
@@ -127,7 +127,7 @@ void ScrollArea::init(std::string skinName)
 
     if (skinName == "")
         skinName = "scroll_background.xml";
-    Theme::instance()->loadRect(background, skinName);
+    Theme::instance()->loadRect(background, skinName, "scroll_background.xml");
     if (instances == 0)
     {
         for (int f = 0; f < 9; f ++)
@@ -139,13 +139,15 @@ void ScrollArea::init(std::string skinName)
 
         if (Theme::instance())
         {
-            Theme::instance()->loadRect(vMarker, "scroll.xml");
-            Theme::instance()->loadRect(vMarkerHi, "scroll_highlighted.xml");
+            Theme::instance()->loadRect(vMarker, "scroll.xml", "");
+            Theme::instance()->loadRect(vMarkerHi, "scroll_highlighted.xml",
+                "scroll.xml");
         }
 
         for (int i = 0; i < 2; i ++)
         {
-            Skin *skin = Theme::instance()->load(buttonFiles[i]);
+            Skin *skin = Theme::instance()->load(
+                buttonFiles[i], "scrollbuttons.xml");
             if (skin)
             {
                 const ImageRect &rect = skin->getBorder();
diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp
index d97e3e57d..630bd7e28 100644
--- a/src/gui/widgets/slider.cpp
+++ b/src/gui/widgets/slider.cpp
@@ -79,7 +79,10 @@ void Slider::init()
         if (Theme::instance())
         {
             for (int mode = 0; mode < 2; mode ++)
-                Theme::instance()->loadRect(buttons[mode], data[mode], 0, 8);
+            {
+                Theme::instance()->loadRect(buttons[mode],
+                    data[mode], "slider.xml", 0, 8);
+            }
         }
         updateAlpha();
     }
diff --git a/src/gui/widgets/spellshortcutcontainer.cpp b/src/gui/widgets/spellshortcutcontainer.cpp
index c3e3b1495..25dd3fb6d 100644
--- a/src/gui/widgets/spellshortcutcontainer.cpp
+++ b/src/gui/widgets/spellshortcutcontainer.cpp
@@ -64,7 +64,7 @@ SpellShortcutContainer::SpellShortcutContainer(unsigned number):
     mSpellPopup = new SpellPopup;
 
     mBackgroundImg = Theme::getImageFromThemeXml(
-        "item_shortcut_background.xml");
+        "item_shortcut_background.xml", "background.xml");
     if (spellShortcut)
         mMaxItems = spellShortcut->getSpellsCount();
     else
diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp
index 3faa874ca..81b43445c 100644
--- a/src/gui/widgets/tab.cpp
+++ b/src/gui/widgets/tab.cpp
@@ -102,7 +102,10 @@ void Tab::init()
         if (Theme::instance())
         {
             for (int mode = 0; mode < TAB_COUNT; mode ++)
-                Theme::instance()->loadRect(tabImg[mode], data[mode]);
+            {
+                Theme::instance()->loadRect(tabImg[mode],
+                    data[mode], "tab.xml");
+            }
         }
         updateAlpha();
     }
diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp
index 1c054f04b..d5fb58cb9 100644
--- a/src/gui/widgets/textfield.cpp
+++ b/src/gui/widgets/textfield.cpp
@@ -67,7 +67,7 @@ TextField::TextField(const std::string &text, bool loseFocusOnTab,
     if (instances == 0)
     {
         if (Theme::instance())
-            Theme::instance()->loadRect(skin, "textfield_background.xml");
+            Theme::instance()->loadRect(skin, "textfield_background.xml", "");
     }
 
     instances++;
diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp
index 3fb0649c2..bfb4d883c 100644
--- a/src/gui/widgets/window.cpp
+++ b/src/gui/widgets/window.cpp
@@ -85,7 +85,7 @@ Window::Window(const std::string &caption, bool modal, Window *parent,
     // Loads the skin
     if (Theme::instance())
     {
-        mSkin = Theme::instance()->load(skin);
+        mSkin = Theme::instance()->load(skin, "window.xml");
         if (mSkin)
             setPadding(mSkin->getPadding());
     }
diff --git a/src/text.cpp b/src/text.cpp
index 6e08a048a..96d493cc5 100644
--- a/src/text.cpp
+++ b/src/text.cpp
@@ -60,7 +60,7 @@ Text::Text(const std::string &text, int x, int y,
         textManager = new TextManager;
         if (Theme::instance())
         {
-            Theme::instance()->loadRect(mBubble, "bubble.xml");
+            Theme::instance()->loadRect(mBubble, "bubble.xml", "");
         }
         else
         {
-- 
cgit v1.2.3-70-g09d2