diff --git a/src/app/ui/skin/skin_theme.cpp b/src/app/ui/skin/skin_theme.cpp index 68413f6d5..a26f23a79 100644 --- a/src/app/ui/skin/skin_theme.cpp +++ b/src/app/ui/skin/skin_theme.cpp @@ -144,7 +144,6 @@ SkinTheme* SkinTheme::instance() SkinTheme::SkinTheme() : m_cursors(ui::kCursorTypes, NULL) { - m_selected_skin = Preferences::instance().theme.selected(); m_defaultFont = nullptr; m_miniFont = nullptr; @@ -176,9 +175,29 @@ SkinTheme::~SkinTheme() m_miniFont->dispose(); } -void SkinTheme::loadSheet() +void SkinTheme::onRegenerate() { - TRACE("SkinTheme::loadSheet()\n"); + Preferences& pref = Preferences::instance(); + + // First we load the skin from default theme, which is more proper + // to have every single needed skin part/color/dimension. + loadAll(pref.theme.selected.defaultValue()); + + // Then we load the selected theme to redefine default theme parts. + if (pref.theme.selected.defaultValue() != pref.theme.selected()) + loadAll(pref.theme.selected()); +} + +void SkinTheme::loadAll(const std::string& skinId) +{ + loadSheet(skinId); + loadFonts(skinId); + loadXml(skinId); +} + +void SkinTheme::loadSheet(const std::string& skinId) +{ + TRACE("SkinTheme::loadSheet(%s)\n", skinId.c_str()); if (m_sheet) { m_sheet->dispose(); @@ -186,7 +205,7 @@ void SkinTheme::loadSheet() } // Load the skin sheet - std::string sheet_filename("skins/" + m_selected_skin + "/sheet.png"); + std::string sheet_filename("skins/" + skinId + "/sheet.png"); ResourceFinder rf; rf.includeDataDir(sheet_filename.c_str()); @@ -201,26 +220,25 @@ void SkinTheme::loadSheet() } } -void SkinTheme::loadFonts() +void SkinTheme::loadFonts(const std::string& skinId) { - TRACE("SkinTheme::loadFonts()\n"); + TRACE("SkinTheme::loadFonts(%s)\n", skinId.c_str()); if (m_defaultFont) m_defaultFont->dispose(); if (m_miniFont) m_miniFont->dispose(); Preferences& pref = Preferences::instance(); - m_defaultFont = loadFont(pref.theme.font(), "skins/" + m_selected_skin + "/font.png"); - m_miniFont = loadFont(pref.theme.miniFont(), "skins/" + m_selected_skin + "/minifont.png"); + m_defaultFont = loadFont(pref.theme.font(), "skins/" + skinId + "/font.png"); + m_miniFont = loadFont(pref.theme.miniFont(), "skins/" + skinId + "/minifont.png"); } -void SkinTheme::onRegenerate() +void SkinTheme::loadXml(const std::string& skinId) { - loadSheet(); - loadFonts(); + TRACE("SkinTheme::loadXml(%s)\n", skinId.c_str()); // Load the skin XML - std::string xml_filename = "skins/" + m_selected_skin + "/skin.xml"; + std::string xml_filename = "skins/" + skinId + "/skin.xml"; ResourceFinder rf; rf.includeDataDir(xml_filename.c_str()); if (!rf.findFirst()) diff --git a/src/app/ui/skin/skin_theme.h b/src/app/ui/skin/skin_theme.h index 35daf7d47..60e7301bd 100644 --- a/src/app/ui/skin/skin_theme.h +++ b/src/app/ui/skin/skin_theme.h @@ -119,8 +119,10 @@ namespace app { void onRegenerate() override; private: - void loadSheet(); - void loadFonts(); + void loadAll(const std::string& skinId); + void loadSheet(const std::string& skinId); + void loadFonts(const std::string& skinId); + void loadXml(const std::string& skinId); she::Surface* sliceSheet(she::Surface* sur, const gfx::Rect& bounds); gfx::Color getWidgetBgColor(ui::Widget* widget); @@ -133,7 +135,6 @@ namespace app { she::Font* loadFont(const std::string& userFont, const std::string& themeFont); - std::string m_selected_skin; she::Surface* m_sheet; std::map m_parts_by_id; std::map m_toolicon;