diff options
64 files changed, 229 insertions, 136 deletions
diff --git a/data/graphics/gui/button.png b/data/graphics/gui/button.png Binary files differindex 4f6a5a81..9ebbea63 100644 --- a/data/graphics/gui/button.png +++ b/data/graphics/gui/button.png diff --git a/data/graphics/gui/button_disabled.png b/data/graphics/gui/button_disabled.png Binary files differindex 2a8fdf43..0ce3aa6f 100644 --- a/data/graphics/gui/button_disabled.png +++ b/data/graphics/gui/button_disabled.png diff --git a/data/graphics/gui/buttonhi.png b/data/graphics/gui/buttonhi.png Binary files differindex 24c09718..c4772634 100644 --- a/data/graphics/gui/buttonhi.png +++ b/data/graphics/gui/buttonhi.png diff --git a/data/graphics/gui/buttonpress.png b/data/graphics/gui/buttonpress.png Binary files differindex d192534a..e9cd1765 100644 --- a/data/graphics/gui/buttonpress.png +++ b/data/graphics/gui/buttonpress.png diff --git a/data/graphics/gui/checkbox.png b/data/graphics/gui/checkbox.png Binary files differindex b68893fc..669ecf03 100644 --- a/data/graphics/gui/checkbox.png +++ b/data/graphics/gui/checkbox.png diff --git a/data/graphics/gui/close_button.png b/data/graphics/gui/close_button.png Binary files differindex a4f802e0..f87cc2a9 100644 --- a/data/graphics/gui/close_button.png +++ b/data/graphics/gui/close_button.png diff --git a/data/graphics/gui/deepbox.png b/data/graphics/gui/deepbox.png Binary files differindex 6b63168a..084b5f61 100644 --- a/data/graphics/gui/deepbox.png +++ b/data/graphics/gui/deepbox.png diff --git a/data/graphics/gui/gui.xml b/data/graphics/gui/gui.xml index 015c6ce3..f27dbc7f 100644 --- a/data/graphics/gui/gui.xml +++ b/data/graphics/gui/gui.xml @@ -1,19 +1,18 @@ <skinset name="Default" image="window.png"> <widget type="Window"> - <!-- <option name="padding" value="5" /> --> <!-- Top Row --> - <part type="top-left-corner" xpos="0" ypos="0" width="10" height="10" /> - <part type="top-edge" xpos="11" ypos="0" width="127" height="10" /> - <part type="top-right-corner" xpos="139" ypos="0" width="12" height="10" /> + <part type="top-left-corner" xpos="0" ypos="0" width="4" height="4" /> + <part type="top-edge" xpos="4" ypos="0" width="32" height="4" /> + <part type="top-right-corner" xpos="36" ypos="0" width="4" height="4" /> <!-- Middle Row --> - <part type="left-edge" xpos="0" ypos="11" width="10" height="81" /> - <part type="bg-quad" xpos="11" ypos="11" width="127" height="81" /> - <part type="right-edge" xpos="139" ypos="11" width="12" height="81" /> + <part type="left-edge" xpos="0" ypos="4" width="4" height="216" /> + <part type="bg-quad" xpos="4" ypos="4" width="32" height="216" /> + <part type="right-edge" xpos="36" ypos="4" width="4" height="216" /> <!-- Bottom Row --> - <part type="bottom-left-corner" xpos="0" ypos="93" width="10" height="12" /> - <part type="bottom-edge" xpos="11" ypos="93" width="127" height="12" /> - <part type="bottom-right-corner" xpos="139" ypos="93" width="12" height="12" /> + <part type="bottom-left-corner" xpos="0" ypos="220" width="4" height="4" /> + <part type="bottom-edge" xpos="4" ypos="220" width="32" height="4" /> + <part type="bottom-right-corner" xpos="36" ypos="220" width="4" height="4" /> </widget> </skinset> diff --git a/data/graphics/gui/hscroll_left_default.png b/data/graphics/gui/hscroll_left_default.png Binary files differindex 07e5e078..2f763d30 100644 --- a/data/graphics/gui/hscroll_left_default.png +++ b/data/graphics/gui/hscroll_left_default.png diff --git a/data/graphics/gui/hscroll_left_highlight.png b/data/graphics/gui/hscroll_left_highlight.png Binary files differindex c77427f8..6be5ae25 100644 --- a/data/graphics/gui/hscroll_left_highlight.png +++ b/data/graphics/gui/hscroll_left_highlight.png diff --git a/data/graphics/gui/hscroll_left_pressed.png b/data/graphics/gui/hscroll_left_pressed.png Binary files differindex 081eaa3a..b8ebcb46 100644 --- a/data/graphics/gui/hscroll_left_pressed.png +++ b/data/graphics/gui/hscroll_left_pressed.png diff --git a/data/graphics/gui/hscroll_right_default.png b/data/graphics/gui/hscroll_right_default.png Binary files differindex ee74c071..33fdddd0 100644 --- a/data/graphics/gui/hscroll_right_default.png +++ b/data/graphics/gui/hscroll_right_default.png diff --git a/data/graphics/gui/hscroll_right_highlight.png b/data/graphics/gui/hscroll_right_highlight.png Binary files differindex 9f8911e4..e9e633ea 100644 --- a/data/graphics/gui/hscroll_right_highlight.png +++ b/data/graphics/gui/hscroll_right_highlight.png diff --git a/data/graphics/gui/hscroll_right_pressed.png b/data/graphics/gui/hscroll_right_pressed.png Binary files differindex 6ef987a5..53972f2b 100644 --- a/data/graphics/gui/hscroll_right_pressed.png +++ b/data/graphics/gui/hscroll_right_pressed.png diff --git a/data/graphics/gui/item_shortcut_bgr.png b/data/graphics/gui/item_shortcut_bgr.png Binary files differindex 5b3c5e7c..0543e38a 100644 --- a/data/graphics/gui/item_shortcut_bgr.png +++ b/data/graphics/gui/item_shortcut_bgr.png diff --git a/data/graphics/gui/radioin.png b/data/graphics/gui/radioin.png Binary files differindex 8d0e5f74..12e027fe 100644 --- a/data/graphics/gui/radioin.png +++ b/data/graphics/gui/radioin.png diff --git a/data/graphics/gui/radioout.png b/data/graphics/gui/radioout.png Binary files differindex 70a25256..5eb67bd8 100644 --- a/data/graphics/gui/radioout.png +++ b/data/graphics/gui/radioout.png diff --git a/data/graphics/gui/resize.png b/data/graphics/gui/resize.png Binary files differindex dfe79ebf..6b31ac64 100644 --- a/data/graphics/gui/resize.png +++ b/data/graphics/gui/resize.png diff --git a/data/graphics/gui/selection.png b/data/graphics/gui/selection.png Binary files differindex a117a78a..78827daf 100644 --- a/data/graphics/gui/selection.png +++ b/data/graphics/gui/selection.png diff --git a/data/graphics/gui/slider.png b/data/graphics/gui/slider.png Binary files differindex df9abe56..465ad0e8 100644 --- a/data/graphics/gui/slider.png +++ b/data/graphics/gui/slider.png diff --git a/data/graphics/gui/sticky_button.png b/data/graphics/gui/sticky_button.png Binary files differindex 2708dd99..8c570573 100644 --- a/data/graphics/gui/sticky_button.png +++ b/data/graphics/gui/sticky_button.png diff --git a/data/graphics/gui/tab.png b/data/graphics/gui/tab.png Binary files differindex 689981a9..91eadf08 100644 --- a/data/graphics/gui/tab.png +++ b/data/graphics/gui/tab.png diff --git a/data/graphics/gui/tabselected.png b/data/graphics/gui/tabselected.png Binary files differindex 72a48973..e2983060 100644 --- a/data/graphics/gui/tabselected.png +++ b/data/graphics/gui/tabselected.png diff --git a/data/graphics/gui/vscroll_down_default.png b/data/graphics/gui/vscroll_down_default.png Binary files differindex 0ec2a3ee..c4292489 100644 --- a/data/graphics/gui/vscroll_down_default.png +++ b/data/graphics/gui/vscroll_down_default.png diff --git a/data/graphics/gui/vscroll_down_highlight.png b/data/graphics/gui/vscroll_down_highlight.png Binary files differindex d2934daa..ac88f7c7 100644 --- a/data/graphics/gui/vscroll_down_highlight.png +++ b/data/graphics/gui/vscroll_down_highlight.png diff --git a/data/graphics/gui/vscroll_down_pressed.png b/data/graphics/gui/vscroll_down_pressed.png Binary files differindex 6aa44ba6..9dcc89f6 100644 --- a/data/graphics/gui/vscroll_down_pressed.png +++ b/data/graphics/gui/vscroll_down_pressed.png diff --git a/data/graphics/gui/vscroll_grey.png b/data/graphics/gui/vscroll_grey.png Binary files differindex 3f65a883..f99da467 100644 --- a/data/graphics/gui/vscroll_grey.png +++ b/data/graphics/gui/vscroll_grey.png diff --git a/data/graphics/gui/vscroll_up_default.png b/data/graphics/gui/vscroll_up_default.png Binary files differindex 73a4266f..1cecc351 100644 --- a/data/graphics/gui/vscroll_up_default.png +++ b/data/graphics/gui/vscroll_up_default.png diff --git a/data/graphics/gui/vscroll_up_highlight.png b/data/graphics/gui/vscroll_up_highlight.png Binary files differindex 6fc3884d..7b5009f3 100644 --- a/data/graphics/gui/vscroll_up_highlight.png +++ b/data/graphics/gui/vscroll_up_highlight.png diff --git a/data/graphics/gui/vscroll_up_pressed.png b/data/graphics/gui/vscroll_up_pressed.png Binary files differindex bfa8e175..2320ec42 100644 --- a/data/graphics/gui/vscroll_up_pressed.png +++ b/data/graphics/gui/vscroll_up_pressed.png diff --git a/data/graphics/gui/window.png b/data/graphics/gui/window.png Binary files differindex 671b7740..f0ef1af4 100644 --- a/data/graphics/gui/window.png +++ b/data/graphics/gui/window.png diff --git a/docs/example.mana b/docs/example.mana index aa87b96f..9802c280 100644 --- a/docs/example.mana +++ b/docs/example.mana @@ -19,4 +19,5 @@ filename / path as a command line parameter <option name="defaultUpdateHost" value="http://updates.themanaworld.org"/> <option name="font" value="fonts/dejavusans.ttf" /> <option name="boldFont" value="fonts/dejavusans-bold.ttf" /> + <option name="theme" value="wood" /> </configuration> diff --git a/src/client.cpp b/src/client.cpp index 9fa61364..a1b7a512 100644 --- a/src/client.cpp +++ b/src/client.cpp @@ -249,13 +249,6 @@ Client::Client(const Options &options): "Exiting.", mLocalDataDir.c_str())); } - // Add the local data directory to PhysicsFS search path - resman->addToSearchPath(mLocalDataDir, false); - - // Add the main data directories to our PhysicsFS search path - if (!options.dataPath.empty()) - resman->addToSearchPath(options.dataPath, true); - resman->addToSearchPath("data", true); #if defined __APPLE__ CFBundleRef mainBundle = CFBundleGetMainBundle(); CFURLRef resourcesURL = CFBundleCopyResourcesDirectoryURL(mainBundle); @@ -267,10 +260,40 @@ Client::Client(const Options &options): } CFRelease(resourcesURL); strncat(path, "/data", PATH_MAX - 1); - resman->addToSearchPath(path, true); + resman->addToSearchPath(path, false); + mPackageDir = path; +#else + resman->addToSearchPath(PKG_DATADIR "data", false); + mPackageDir = PKG_DATADIR "data"; +#endif + + resman->addToSearchPath("data", false); + + // Add branding/data to PhysFS search path + if (!options.brandingPath.empty()) + { + std::string path = options.brandingPath; + + // Strip blah.mana from the path +#ifdef WIN32 + int loc1 = path.find_last_of('/'); + int loc2 = path.find_last_of('\\'); + int loc = std::max(loc1, loc2); #else - resman->addToSearchPath(PKG_DATADIR "data", true); + int loc = path.find_last_of('/'); #endif + if (loc > 0) + path = path.substr(0, loc + 1); + + resman->addToSearchPath(path + "data", false); + } + + // Add the main data directories to our PhysicsFS search path + if (!options.dataPath.empty()) + resman->addToSearchPath(options.dataPath, false); + + // Add the local data directory to PhysicsFS search path + resman->addToSearchPath(mLocalDataDir, false); #ifdef WIN32 static SDL_SysWMinfo pInfo; @@ -319,6 +342,8 @@ Client::Client(const Options &options): // Initialize for drawing graphics->_beginDraw(); + SkinLoader::prepareThemePath(); + // Initialize the item shortcuts. itemShortcut = new ItemShortcut; diff --git a/src/client.h b/src/client.h index 934ba9d2..233ee646 100644 --- a/src/client.h +++ b/src/client.h @@ -165,6 +165,9 @@ public: static State getState() { return instance()->mState; } + static const std::string &getPackageDirectory() + { return instance()->mPackageDir; } + static const std::string &getConfigDirectory() { return instance()->mConfigDir; } @@ -189,6 +192,7 @@ private: Options mOptions; + std::string mPackageDir; std::string mConfigDir; std::string mLocalDataDir; std::string mUpdateHost; diff --git a/src/gui/emotepopup.cpp b/src/gui/emotepopup.cpp index 2711161e..e0c0a409 100644 --- a/src/gui/emotepopup.cpp +++ b/src/gui/emotepopup.cpp @@ -29,10 +29,11 @@ #include "localplayer.h" #include "log.h" +#include "gui/skin.h" + #include "resources/emotedb.h" #include "resources/image.h" #include "resources/iteminfo.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -56,8 +57,7 @@ EmotePopup::EmotePopup(): mEmotes.push_back(EmoteDB::getAnimation(i)); } - ResourceManager *resman = ResourceManager::getInstance(); - mSelectionImage = resman->getImage("graphics/gui/selection.png"); + mSelectionImage = SkinLoader::getImageFromTheme("selection.png"); if (!mSelectionImage) logger->error("Unable to load selection.png"); diff --git a/src/gui/gui.cpp b/src/gui/gui.cpp index e82a33b9..bc3eb675 100644 --- a/src/gui/gui.cpp +++ b/src/gui/gui.cpp @@ -209,9 +209,8 @@ void Gui::setUseCustomCursor(bool customCursor) SDL_ShowCursor(SDL_DISABLE); // Load the mouse cursor - ResourceManager *resman = ResourceManager::getInstance(); - mMouseCursors = - resman->getImageSet("graphics/gui/mouse.png", 40, 40); + mMouseCursors = SkinLoader::getImageSetFromTheme("mouse.png", + 40, 40); if (!mMouseCursors) logger->error("Unable to load mouse cursors."); diff --git a/src/gui/skilldialog.cpp b/src/gui/skilldialog.cpp index 78c5c998..d53a1867 100644 --- a/src/gui/skilldialog.cpp +++ b/src/gui/skilldialog.cpp @@ -25,6 +25,7 @@ #include "log.h" #include "gui/setup.h" +#include "gui/skin.h" #include "gui/widgets/button.h" #include "gui/widgets/container.h" @@ -85,7 +86,7 @@ struct SkillInfo } else { - icon = res->getImage("graphics/gui/unknown-item.png"); + icon = SkinLoader::getImageFromTheme("unknown-item.png"); } } diff --git a/src/gui/skin.cpp b/src/gui/skin.cpp index a682bf8f..22153720 100644 --- a/src/gui/skin.cpp +++ b/src/gui/skin.cpp @@ -23,22 +23,26 @@ #include "gui/skin.h" +#include "client.h" #include "configuration.h" #include "configlistener.h" #include "log.h" #include "resources/image.h" +#include "resources/imageset.h" #include "resources/resourcemanager.h" #include "utils/dtor.h" #include "utils/stringutils.h" #include "utils/xml.h" +#include <physfs.h> + #include <algorithm> +std::string SkinLoader::mThemePath; SkinLoader *SkinLoader::mInstance = 0; - class SkinConfigListener : public ConfigListener { public: @@ -197,7 +201,7 @@ Skin *SkinLoader::readSkin(const std::string &filename) logger->log("Loading skin '%s'.", filename.c_str()); - XML::Document doc(filename); + XML::Document doc(resolveThemePath(filename)); xmlNodePtr rootNode = doc.rootNode(); if (!rootNode || !xmlStrEqual(rootNode->name, BAD_CAST "skinset")) @@ -215,8 +219,7 @@ Skin *SkinLoader::readSkin(const std::string &filename) logger->log("SkinLoader::load(): <skinset> defines " "'%s' as a skin image.", skinSetImage.c_str()); - ResourceManager *resman = ResourceManager::getInstance(); - Image *dBorders = resman->getImage("graphics/gui/" + skinSetImage); + Image *dBorders = SkinLoader::getImageFromTheme(skinSetImage); ImageRect border; // iterate <widget>'s @@ -286,8 +289,8 @@ Skin *SkinLoader::readSkin(const std::string &filename) logger->log("Finished loading skin."); // Hard-coded for now until we update the above code to look for window buttons - Image *closeImage = resman->getImage("graphics/gui/close_button.png"); - Image *sticky = resman->getImage("graphics/gui/sticky_button.png"); + Image *closeImage = SkinLoader::getImageFromTheme("close_button.png"); + Image *sticky = SkinLoader::getImageFromTheme("sticky_button.png"); Image *stickyImageUp = sticky->getSubImage(0, 0, 15, 15); Image *stickyImageDown = sticky->getSubImage(15, 0, 15, 15); sticky->decRef(); @@ -297,3 +300,68 @@ Skin *SkinLoader::readSkin(const std::string &filename) skin->updateAlpha(mMinimumOpacity); return skin; } + +bool SkinLoader::tryThemePath(std::string themePath) +{ + if (!themePath.empty()) + { + themePath = "graphics/gui/" + themePath; + if (PHYSFS_exists(themePath.c_str())) + { + mThemePath = themePath; + return true; + } + } + + return false; +} + +void SkinLoader::prepareThemePath() +{ + // Try theme from settings + if (tryThemePath(config.getValue("theme", ""))) + return; + + // Try theme from branding + if (tryThemePath(branding.getValue("theme", ""))) + return; + + // Use default + mThemePath = "graphics/gui"; +} + +std::string SkinLoader::resolveThemePath(const std::string &path) +{ + // Need to strip off any dye info for the existence tests + int pos = path.find('|'); + std::string file; + if (pos > 0) + file = path.substr(0, pos); + else + file = path; + + // Might be a valid path already + if (PHYSFS_exists(file.c_str())) + return path; + + // Try the theme + file = getThemePath() + "/" + file; + if (PHYSFS_exists(file.c_str())) + return getThemePath() + "/" + path; + + // Backup + return "graphics/gui/" + path; +} + +Image *SkinLoader::getImageFromTheme(const std::string &path) +{ + ResourceManager *resman = ResourceManager::getInstance(); + return resman->getImage(resolveThemePath(path)); +} + +ImageSet *SkinLoader::getImageSetFromTheme(const std::string &path, + int w, int h) +{ + ResourceManager *resman = ResourceManager::getInstance(); + return resman->getImageSet(resolveThemePath(path), w, h); +} diff --git a/src/gui/skin.h b/src/gui/skin.h index 15d55972..091d3001 100644 --- a/src/gui/skin.h +++ b/src/gui/skin.h @@ -31,6 +31,7 @@ class ConfigListener; class Image; +class ImageSet; class Skin { @@ -101,11 +102,24 @@ class SkinLoader static SkinLoader *instance(); static void deleteInstance(); + static void prepareThemePath(); + static std::string getThemePath() { return mThemePath; } + + /** + * Returns the patch to the given gui resource relative to the theme + * or, if it isn't in the theme, relative to 'graphics/gui'. + */ + static std::string resolveThemePath(const std::string &path); + + static Image *getImageFromTheme(const std::string &path); + static ImageSet *getImageSetFromTheme(const std::string &path, + int w, int h); + /** * Loads a skin. */ Skin *load(const std::string &filename, - const std::string &defaultPath); + const std::string &defaultPath = getThemePath()); /** * Updates the alpha values of all of the skins. @@ -141,8 +155,11 @@ class SkinLoader */ ConfigListener *mSkinConfigListener; + static std::string mThemePath; static SkinLoader *mInstance; + static bool tryThemePath(std::string themePath); + /** * Tells if the current skins opacity * should not get less than the given value diff --git a/src/gui/specialswindow.cpp b/src/gui/specialswindow.cpp index 1513dcf1..3ca0f037 100644 --- a/src/gui/specialswindow.cpp +++ b/src/gui/specialswindow.cpp @@ -24,6 +24,7 @@ #include "log.h" #include "gui/setup.h" +#include "gui/skin.h" #include "gui/widgets/button.h" #include "gui/widgets/container.h" @@ -219,7 +220,7 @@ SpecialEntry::SpecialEntry(SpecialInfo *info) : if (!info->icon.empty()) mIcon = new Icon(info->icon); else - mIcon = new Icon("graphics/gui/unknown-item.png"); + mIcon = new Icon(SkinLoader::resolveThemePath("unknown-item.png")); mIcon->setPosition(1, 0); add(mIcon); diff --git a/src/gui/speechbubble.cpp b/src/gui/speechbubble.cpp index 3a87992b..f02965d1 100644 --- a/src/gui/speechbubble.cpp +++ b/src/gui/speechbubble.cpp @@ -25,6 +25,7 @@ #include "graphics.h" #include "gui/gui.h" +#include "gui/skin.h" #include "gui/widgets/textbox.h" @@ -33,7 +34,7 @@ #include <guichan/widgets/label.hpp> SpeechBubble::SpeechBubble(): - Popup("Speech", "graphics/gui/speechbubble.xml") + Popup("Speech", "speechbubble.xml") { setContentSize(140, 46); setMinWidth(29); diff --git a/src/gui/widgets/avatarlistbox.cpp b/src/gui/widgets/avatarlistbox.cpp index f5a9ea18..92386739 100644 --- a/src/gui/widgets/avatarlistbox.cpp +++ b/src/gui/widgets/avatarlistbox.cpp @@ -25,6 +25,7 @@ #include "gui/chat.h" #include "gui/gui.h" #include "gui/palette.h" +#include "gui/skin.h" #include "resources/image.h" #include "resources/resourcemanager.h" @@ -44,8 +45,8 @@ AvatarListBox::AvatarListBox(AvatarListModel *model): if (instances == 1) { - onlineIcon = ResourceManager::getInstance()->getImage("graphics/gui/circle-green.png"); - offlineIcon = ResourceManager::getInstance()->getImage("graphics/gui/circle-gray.png"); + onlineIcon = SkinLoader::getImageFromTheme("circle-green.png"); + offlineIcon = SkinLoader::getImageFromTheme("circle-gray.png"); } setWidth(200); diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp index 6589c96e..36a47859 100644 --- a/src/gui/widgets/button.cpp +++ b/src/gui/widgets/button.cpp @@ -28,7 +28,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -54,10 +53,10 @@ struct ButtonData }; static ButtonData const data[BUTTON_COUNT] = { - { "graphics/gui/button.png", 0, 0 }, - { "graphics/gui/buttonhi.png", 9, 4 }, - { "graphics/gui/buttonpress.png", 16, 19 }, - { "graphics/gui/button_disabled.png", 25, 23 } + { "button.png", 0, 0 }, + { "buttonhi.png", 9, 4 }, + { "buttonpress.png", 16, 19 }, + { "button_disabled.png", 25, 23 } }; ImageRect Button::button[BUTTON_COUNT]; @@ -85,14 +84,13 @@ void Button::init() if (mInstances == 0) { // Load the skin - ResourceManager *resman = ResourceManager::getInstance(); Image *btn[BUTTON_COUNT]; int a, x, y, mode; for (mode = 0; mode < BUTTON_COUNT; mode++) { - btn[mode] = resman->getImage(data[mode].file); + btn[mode] = SkinLoader::getImageFromTheme(data[mode].file); a = 0; for (y = 0; y < 3; y++) { diff --git a/src/gui/widgets/checkbox.cpp b/src/gui/widgets/checkbox.cpp index dc6d94b3..d5253d7c 100644 --- a/src/gui/widgets/checkbox.cpp +++ b/src/gui/widgets/checkbox.cpp @@ -28,7 +28,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" int CheckBox::instances = 0; float CheckBox::mAlpha = 1.0; @@ -45,8 +44,7 @@ CheckBox::CheckBox(const std::string &caption, bool selected): { if (instances == 0) { - ResourceManager *resman = ResourceManager::getInstance(); - Image *checkBox = resman->getImage("graphics/gui/checkbox.png"); + Image *checkBox = SkinLoader::getImageFromTheme("checkbox.png"); checkBoxNormal = checkBox->getSubImage(0, 0, 9, 10); checkBoxChecked = checkBox->getSubImage(9, 0, 9, 10); checkBoxDisabled = checkBox->getSubImage(18, 0, 9, 10); diff --git a/src/gui/widgets/dropdown.cpp b/src/gui/widgets/dropdown.cpp index 32b42553..eb0cdef2 100644 --- a/src/gui/widgets/dropdown.cpp +++ b/src/gui/widgets/dropdown.cpp @@ -32,7 +32,6 @@ #include "gui/widgets/scrollarea.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -54,17 +53,16 @@ DropDown::DropDown(gcn::ListModel *listModel): if (instances == 0) { // Load the background skin - ResourceManager *resman = ResourceManager::getInstance(); // Get the button skin buttons[1][0] = - resman->getImage("graphics/gui/vscroll_up_default.png"); + SkinLoader::getImageFromTheme("vscroll_up_default.png"); buttons[0][0] = - resman->getImage("graphics/gui/vscroll_down_default.png"); + SkinLoader::getImageFromTheme("vscroll_down_default.png"); buttons[1][1] = - resman->getImage("graphics/gui/vscroll_up_pressed.png"); + SkinLoader::getImageFromTheme("vscroll_up_pressed.png"); buttons[0][1] = - resman->getImage("graphics/gui/vscroll_down_pressed.png"); + SkinLoader::getImageFromTheme("vscroll_down_pressed.png"); buttons[0][0]->setAlpha(mAlpha); buttons[0][1]->setAlpha(mAlpha); @@ -72,7 +70,7 @@ DropDown::DropDown(gcn::ListModel *listModel): buttons[1][1]->setAlpha(mAlpha); // get the border skin - Image *boxBorder = resman->getImage("graphics/gui/deepbox.png"); + Image *boxBorder = SkinLoader::getImageFromTheme("deepbox.png"); int gridx[4] = {0, 3, 28, 31}; int gridy[4] = {0, 3, 28, 31}; int a = 0, x, y; diff --git a/src/gui/widgets/emoteshortcutcontainer.cpp b/src/gui/widgets/emoteshortcutcontainer.cpp index 41be172f..dd13c679 100644 --- a/src/gui/widgets/emoteshortcutcontainer.cpp +++ b/src/gui/widgets/emoteshortcutcontainer.cpp @@ -32,10 +32,10 @@ #include "log.h" #include "gui/palette.h" +#include "gui/skin.h" #include "resources/emotedb.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -49,9 +49,7 @@ EmoteShortcutContainer::EmoteShortcutContainer(): addMouseListener(this); addWidgetListener(this); - ResourceManager *resman = ResourceManager::getInstance(); - - mBackgroundImg = resman->getImage("graphics/gui/item_shortcut_bgr.png"); + mBackgroundImg = SkinLoader::getImageFromTheme("item_shortcut_bgr.png"); mBackgroundImg->setAlpha(config.getValue("guialpha", 0.8)); diff --git a/src/gui/widgets/itemcontainer.cpp b/src/gui/widgets/itemcontainer.cpp index f801822c..b4270912 100644 --- a/src/gui/widgets/itemcontainer.cpp +++ b/src/gui/widgets/itemcontainer.cpp @@ -32,6 +32,7 @@ #include "gui/outfitwindow.h" #include "gui/palette.h" #include "gui/sdlinput.h" +#include "gui/skin.h" #include "gui/viewport.h" #include "net/net.h" @@ -39,7 +40,6 @@ #include "resources/image.h" #include "resources/iteminfo.h" -#include "resources/resourcemanager.h" #include "utils/stringutils.h" @@ -67,9 +67,7 @@ ItemContainer::ItemContainer(Inventory *inventory, bool forceQuantity): mItemPopup = new ItemPopup; setFocusable(true); - ResourceManager *resman = ResourceManager::getInstance(); - - mSelImg = resman->getImage("graphics/gui/selection.png"); + mSelImg = SkinLoader::getImageFromTheme("selection.png"); if (!mSelImg) logger->error("Unable to load selection.png"); diff --git a/src/gui/widgets/itemshortcutcontainer.cpp b/src/gui/widgets/itemshortcutcontainer.cpp index 66e053d8..92a3e7d0 100644 --- a/src/gui/widgets/itemshortcutcontainer.cpp +++ b/src/gui/widgets/itemshortcutcontainer.cpp @@ -32,11 +32,11 @@ #include "gui/inventorywindow.h" #include "gui/itempopup.h" #include "gui/palette.h" +#include "gui/skin.h" #include "gui/viewport.h" #include "resources/image.h" #include "resources/iteminfo.h" -#include "resources/resourcemanager.h" #include "utils/stringutils.h" @@ -50,9 +50,7 @@ ItemShortcutContainer::ItemShortcutContainer(): mItemPopup = new ItemPopup; - ResourceManager *resman = ResourceManager::getInstance(); - - mBackgroundImg = resman->getImage("graphics/gui/item_shortcut_bgr.png"); + mBackgroundImg = SkinLoader::getImageFromTheme("item_shortcut_bgr.png"); mMaxItems = itemShortcut->getItemCount(); mBackgroundImg->setAlpha(config.getValue("guialpha", 0.8)); diff --git a/src/gui/widgets/playerbox.cpp b/src/gui/widgets/playerbox.cpp index 23da2afd..24395db7 100644 --- a/src/gui/widgets/playerbox.cpp +++ b/src/gui/widgets/playerbox.cpp @@ -26,8 +26,9 @@ #include "graphics.h" #include "player.h" +#include "gui/skin.h" + #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -43,8 +44,7 @@ PlayerBox::PlayerBox(const Player *player): if (instances == 0) { // Load the background skin - ResourceManager *resman = ResourceManager::getInstance(); - Image *textbox = resman->getImage("graphics/gui/deepbox.png"); + Image *textbox = SkinLoader::getImageFromTheme("deepbox.png"); int bggridx[4] = {0, 3, 28, 31}; int bggridy[4] = {0, 3, 28, 31}; int a = 0, x, y; diff --git a/src/gui/widgets/popup.h b/src/gui/widgets/popup.h index 449c2f7b..d63b59ca 100644 --- a/src/gui/widgets/popup.h +++ b/src/gui/widgets/popup.h @@ -55,7 +55,7 @@ class Popup : public Container * @param skin The location where the Popup's skin XML can be found. */ Popup(const std::string &name = "", - const std::string &skin = "graphics/gui/gui.xml"); + const std::string &skin = "gui.xml"); /** * Destructor. Deletes all the added widgets. diff --git a/src/gui/widgets/progressbar.cpp b/src/gui/widgets/progressbar.cpp index db2a8692..31c32132 100644 --- a/src/gui/widgets/progressbar.cpp +++ b/src/gui/widgets/progressbar.cpp @@ -30,7 +30,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -59,8 +58,7 @@ ProgressBar::ProgressBar(float progress, if (mInstances == 0) { - ResourceManager *resman = ResourceManager::getInstance(); - Image *dBorders = resman->getImage("graphics/gui/vscroll_grey.png"); + Image *dBorders = SkinLoader::getImageFromTheme("vscroll_grey.png"); mBorder.grid[0] = dBorders->getSubImage(0, 0, 4, 4); mBorder.grid[1] = dBorders->getSubImage(4, 0, 3, 4); mBorder.grid[2] = dBorders->getSubImage(7, 0, 4, 4); diff --git a/src/gui/widgets/progressindicator.cpp b/src/gui/widgets/progressindicator.cpp index d1b6bb87..f88f6045 100644 --- a/src/gui/widgets/progressindicator.cpp +++ b/src/gui/widgets/progressindicator.cpp @@ -20,6 +20,8 @@ #include "progressindicator.h" +#include "gui/skin.h" + #include "resources/animation.h" #include "resources/imageset.h" #include "resources/resourcemanager.h" @@ -31,9 +33,8 @@ ProgressIndicator::ProgressIndicator() { - ResourceManager *rm = ResourceManager::getInstance(); - ImageSet *images = rm->getImageSet("graphics/gui/progress-indicator.png", - 32, 32); + ImageSet *images = + SkinLoader::getImageSetFromTheme("progress-indicator.png", 32, 32); Animation *anim = new Animation; for (ImageSet::size_type i = 0; i < images->size(); ++i) diff --git a/src/gui/widgets/radiobutton.cpp b/src/gui/widgets/radiobutton.cpp index adbc4dd7..41c8faf7 100644 --- a/src/gui/widgets/radiobutton.cpp +++ b/src/gui/widgets/radiobutton.cpp @@ -24,8 +24,9 @@ #include "configuration.h" #include "graphics.h" +#include "gui/skin.h" + #include "resources/image.h" -#include "resources/resourcemanager.h" int RadioButton::instances = 0; float RadioButton::mAlpha = 1.0; @@ -43,13 +44,12 @@ RadioButton::RadioButton(const std::string &caption, const std::string &group, { if (instances == 0) { - ResourceManager *resman = ResourceManager::getInstance(); - radioNormal = resman->getImage("graphics/gui/radioout.png"); - radioChecked = resman->getImage("graphics/gui/radioin.png"); - radioDisabled = resman->getImage("graphics/gui/radioout.png"); - radioDisabledChecked = resman->getImage("graphics/gui/radioin.png"); - radioNormalHi = resman->getImage("graphics/gui/radioout_highlight.png"); - radioCheckedHi = resman->getImage("graphics/gui/radioin_highlight.png"); + radioNormal = SkinLoader::getImageFromTheme("radioout.png"); + radioChecked = SkinLoader::getImageFromTheme("radioin.png"); + radioDisabled = SkinLoader::getImageFromTheme("radioout.png"); + radioDisabledChecked = SkinLoader::getImageFromTheme("radioin.png"); + radioNormalHi = SkinLoader::getImageFromTheme("radioout_highlight.png"); + radioCheckedHi = SkinLoader::getImageFromTheme("radioin_highlight.png"); radioNormal->setAlpha(mAlpha); radioChecked->setAlpha(mAlpha); radioDisabled->setAlpha(mAlpha); diff --git a/src/gui/widgets/resizegrip.cpp b/src/gui/widgets/resizegrip.cpp index 106118da..d0b9b845 100644 --- a/src/gui/widgets/resizegrip.cpp +++ b/src/gui/widgets/resizegrip.cpp @@ -24,8 +24,9 @@ #include "configuration.h" #include "graphics.h" +#include "gui/skin.h" + #include "resources/image.h" -#include "resources/resourcemanager.h" #include <guichan/graphics.hpp> @@ -38,8 +39,7 @@ ResizeGrip::ResizeGrip(const std::string &image) if (mInstances == 0) { // Load the grip image - ResourceManager *resman = ResourceManager::getInstance(); - gripImage = resman->getImage(image); + gripImage = SkinLoader::getImageFromTheme(image); gripImage->setAlpha(mAlpha); } diff --git a/src/gui/widgets/resizegrip.h b/src/gui/widgets/resizegrip.h index 4cc195cc..5ef93f29 100644 --- a/src/gui/widgets/resizegrip.h +++ b/src/gui/widgets/resizegrip.h @@ -39,7 +39,7 @@ class ResizeGrip : public gcn::Widget /** * Constructor. */ - ResizeGrip(const std::string &image = "graphics/gui/resize.png"); + ResizeGrip(const std::string &image = "resize.png"); /** * Destructor. diff --git a/src/gui/widgets/scrollarea.cpp b/src/gui/widgets/scrollarea.cpp index b3e28329..dea99e8e 100644 --- a/src/gui/widgets/scrollarea.cpp +++ b/src/gui/widgets/scrollarea.cpp @@ -27,7 +27,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -96,8 +95,7 @@ void ScrollArea::init() if (instances == 0) { // Load the background skin - ResourceManager *resman = ResourceManager::getInstance(); - Image *textbox = resman->getImage("graphics/gui/deepbox.png"); + Image *textbox = SkinLoader::getImageFromTheme("deepbox.png"); const int bggridx[4] = {0, 3, 28, 31}; const int bggridy[4] = {0, 3, 28, 31}; int a = 0, x, y; @@ -118,8 +116,8 @@ void ScrollArea::init() textbox->decRef(); // Load vertical scrollbar skin - Image *vscroll = resman->getImage("graphics/gui/vscroll_grey.png"); - Image *vscrollHi = resman->getImage("graphics/gui/vscroll_highlight.png"); + Image *vscroll = SkinLoader::getImageFromTheme("vscroll_grey.png"); + Image *vscrollHi = SkinLoader::getImageFromTheme("vscroll_highlight.png"); int vsgridx[4] = {0, 4, 7, 11}; int vsgridy[4] = {0, 4, 15, 19}; @@ -147,21 +145,21 @@ void ScrollArea::init() vscrollHi->decRef(); buttons[UP][0] = - resman->getImage("graphics/gui/vscroll_up_default.png"); + SkinLoader::getImageFromTheme("vscroll_up_default.png"); buttons[DOWN][0] = - resman->getImage("graphics/gui/vscroll_down_default.png"); + SkinLoader::getImageFromTheme("vscroll_down_default.png"); buttons[LEFT][0] = - resman->getImage("graphics/gui/hscroll_left_default.png"); + SkinLoader::getImageFromTheme("hscroll_left_default.png"); buttons[RIGHT][0] = - resman->getImage("graphics/gui/hscroll_right_default.png"); + SkinLoader::getImageFromTheme("hscroll_right_default.png"); buttons[UP][1] = - resman->getImage("graphics/gui/vscroll_up_pressed.png"); + SkinLoader::getImageFromTheme("vscroll_up_pressed.png"); buttons[DOWN][1] = - resman->getImage("graphics/gui/vscroll_down_pressed.png"); + SkinLoader::getImageFromTheme("vscroll_down_pressed.png"); buttons[LEFT][1] = - resman->getImage("graphics/gui/hscroll_left_pressed.png"); + SkinLoader::getImageFromTheme("hscroll_left_pressed.png"); buttons[RIGHT][1] = - resman->getImage("graphics/gui/hscroll_right_pressed.png"); + SkinLoader::getImageFromTheme("hscroll_right_pressed.png"); } instances++; diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp index f02c6b5c..af36518a 100644 --- a/src/gui/widgets/slider.cpp +++ b/src/gui/widgets/slider.cpp @@ -27,7 +27,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" Image *Slider::hStart, *Slider::hMid, *Slider::hEnd, *Slider::hGrip; Image *Slider::vStart, *Slider::vMid, *Slider::vEnd, *Slider::vGrip; @@ -83,9 +82,8 @@ void Slider::init() // Load resources if (mInstances == 0) { - ResourceManager *resman = ResourceManager::getInstance(); - Image *slider = resman->getImage("graphics/gui/slider.png"); - Image *sliderHi = resman->getImage("graphics/gui/slider_hilight.png"); + Image *slider = SkinLoader::getImageFromTheme("slider.png"); + Image *sliderHi = SkinLoader::getImageFromTheme("slider_hilight.png"); x = 0; y = 0; w = 15; h = 6; diff --git a/src/gui/widgets/tab.cpp b/src/gui/widgets/tab.cpp index 68dc2190..17145eae 100644 --- a/src/gui/widgets/tab.cpp +++ b/src/gui/widgets/tab.cpp @@ -30,7 +30,6 @@ #include "gui/widgets/tabbedarea.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/dtor.h" @@ -55,10 +54,10 @@ struct TabData }; static TabData const data[TAB_COUNT] = { - { "graphics/gui/tab.png", 0, 0 }, - { "graphics/gui/tab_hilight.png", 9, 4 }, - { "graphics/gui/tabselected.png", 16, 19 }, - { "graphics/gui/tab.png", 25, 23 } + { "tab.png", 0, 0 }, + { "tab_hilight.png", 9, 4 }, + { "tabselected.png", 16, 19 }, + { "tab.png", 25, 23 } }; ImageRect Tab::tabImg[TAB_COUNT]; @@ -91,14 +90,13 @@ void Tab::init() if (mInstances == 0) { // Load the skin - ResourceManager *resman = ResourceManager::getInstance(); Image *tab[TAB_COUNT]; int a, x, y, mode; for (mode = 0; mode < TAB_COUNT; mode++) { - tab[mode] = resman->getImage(data[mode].file); + tab[mode] = SkinLoader::getImageFromTheme(data[mode].file); a = 0; for (y = 0; y < 3; y++) { diff --git a/src/gui/widgets/textfield.cpp b/src/gui/widgets/textfield.cpp index 278b4cb9..e599c37d 100644 --- a/src/gui/widgets/textfield.cpp +++ b/src/gui/widgets/textfield.cpp @@ -29,7 +29,6 @@ #include "gui/skin.h" #include "resources/image.h" -#include "resources/resourcemanager.h" #include "utils/copynpaste.h" #include "utils/dtor.h" @@ -53,8 +52,7 @@ TextField::TextField(const std::string &text, bool loseFocusOnTab): if (instances == 0) { // Load the skin - ResourceManager *resman = ResourceManager::getInstance(); - Image *textbox = resman->getImage("graphics/gui/deepbox.png"); + Image *textbox = SkinLoader::getImageFromTheme("deepbox.png"); int gridx[4] = {0, 3, 28, 31}; int gridy[4] = {0, 3, 28, 31}; int a = 0, x, y; diff --git a/src/gui/widgets/window.h b/src/gui/widgets/window.h index a54016bc..fd7fd6b7 100644 --- a/src/gui/widgets/window.h +++ b/src/gui/widgets/window.h @@ -57,7 +57,7 @@ class Window : public gcn::Window, gcn::WidgetListener * @param skin The location where the window's skin XML can be found. */ Window(const std::string &caption = "Window", bool modal = false, - Window *parent = NULL, const std::string &skin = "graphics/gui/gui.xml"); + Window *parent = NULL, const std::string &skin = "gui.xml"); /** * Destructor. Deletes all the added widgets. diff --git a/src/item.cpp b/src/item.cpp index e20ef57a..378c7efe 100644 --- a/src/item.cpp +++ b/src/item.cpp @@ -21,6 +21,8 @@ #include "item.h" +#include "gui/skin.h" + #include "resources/image.h" #include "resources/iteminfo.h" #include "resources/resourcemanager.h" @@ -60,8 +62,8 @@ void Item::setId(int id) mDrawImage = resman->getImage(imagePath); if (!mImage) - mImage = resman->getImage("graphics/gui/unknown-item.png"); + mImage = SkinLoader::getImageFromTheme("unknown-item.png"); if (!mDrawImage) - mDrawImage = resman->getImage("graphics/gui/unknown-item.png"); + mDrawImage = SkinLoader::getImageFromTheme("unknown-item.png"); } diff --git a/src/localplayer.cpp b/src/localplayer.cpp index 8ce03bba..750c8c45 100644 --- a/src/localplayer.cpp +++ b/src/localplayer.cpp @@ -43,6 +43,7 @@ #include "gui/ministatus.h" #include "gui/palette.h" #include "gui/skilldialog.h" +#include "gui/skin.h" #include "gui/statuswindow.h" #include "gui/storagewindow.h" @@ -1050,18 +1051,12 @@ void LocalPlayer::handleStatusEffect(StatusEffect *effect, int effectId) void LocalPlayer::initTargetCursor() { // Load target cursors - loadTargetCursor("graphics/gui/target-cursor-blue-s.png", 44, 35, - false, TC_SMALL); - loadTargetCursor("graphics/gui/target-cursor-red-s.png", 44, 35, - true, TC_SMALL); - loadTargetCursor("graphics/gui/target-cursor-blue-m.png", 62, 44, - false, TC_MEDIUM); - loadTargetCursor("graphics/gui/target-cursor-red-m.png", 62, 44, - true, TC_MEDIUM); - loadTargetCursor("graphics/gui/target-cursor-blue-l.png", 82, 60, - false, TC_LARGE); - loadTargetCursor("graphics/gui/target-cursor-red-l.png", 82, 60, - true, TC_LARGE); + loadTargetCursor("target-cursor-blue-s.png", 44, 35, false, TC_SMALL); + loadTargetCursor("target-cursor-red-s.png", 44, 35, true, TC_SMALL); + loadTargetCursor("target-cursor-blue-m.png", 62, 44, false, TC_MEDIUM); + loadTargetCursor("target-cursor-red-m.png", 62, 44, true, TC_MEDIUM); + loadTargetCursor("target-cursor-blue-l.png", 82, 60, false, TC_LARGE); + loadTargetCursor("target-cursor-red-l.png", 82, 60, true, TC_LARGE); } void LocalPlayer::loadTargetCursor(const std::string &filename, @@ -1071,9 +1066,8 @@ void LocalPlayer::loadTargetCursor(const std::string &filename, assert(size > -1); assert(size < 3); - ResourceManager *resman = ResourceManager::getInstance(); - - ImageSet *currentImageSet = resman->getImageSet(filename, width, height); + ImageSet *currentImageSet = SkinLoader::getImageSetFromTheme(filename, + width, height); Animation *anim = new Animation; for (unsigned int i = 0; i < currentImageSet->size(); ++i) diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index 8b5ecca3..24f346f7 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -21,6 +21,7 @@ #include "resources/resourcemanager.h" +#include "client.h" #include "log.h" #include "resources/dye.h" @@ -211,7 +212,7 @@ std::string ResourceManager::getPath(const std::string &file) else { // if not found in search path return the default path - path = std::string(PKG_DATADIR) + std::string("data") + "/" + file; + path = Client::getPackageDirectory() + "/" + file; } return path; diff --git a/src/text.cpp b/src/text.cpp index 0b6b77ea..ce09146f 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -28,6 +28,7 @@ #include "gui/gui.h" #include "gui/palette.h" +#include "gui/skin.h" #include "resources/resourcemanager.h" #include "resources/image.h" @@ -49,8 +50,7 @@ Text::Text(const std::string &text, int x, int y, if (textManager == 0) { textManager = new TextManager; - ResourceManager *resman = ResourceManager::getInstance(); - Image *sbImage = resman->getImage("graphics/gui/bubble.png|W:#" + Image *sbImage = SkinLoader::getImageFromTheme("bubble.png|W:#" + config.getValue("speechBubblecolor", "000000")); mBubble.grid[0] = sbImage->getSubImage(0, 0, 5, 5); mBubble.grid[1] = sbImage->getSubImage(5, 0, 5, 5); |