diff --git a/data/gui/screens/options/options_ui.stkgui b/data/gui/screens/options/options_ui.stkgui
index cbab4d55b..9685dbc82 100644
--- a/data/gui/screens/options/options_ui.stkgui
+++ b/data/gui/screens/options/options_ui.stkgui
@@ -34,12 +34,20 @@
@@ -54,7 +62,7 @@
-
+
diff --git a/data/skins/cartoon-coal/stkskin.xml b/data/skins/cartoon-coal/stkskin.xml
index 89f876d93..fd80247ca 100644
--- a/data/skins/cartoon-coal/stkskin.xml
+++ b/data/skins/cartoon-coal/stkskin.xml
@@ -8,7 +8,7 @@ Cartoon Skin by LCP and QwertyChouskie, released under CC-BY-SA 4.0+
See SKIN_MAKING.md for more details on how the skin elements work.
-->
-
+
-
+
-
+
diff --git a/data/skins/cartoon-ocean/stkskin.xml b/data/skins/cartoon-ocean/stkskin.xml
index 8bf6d5627..e659bf230 100644
--- a/data/skins/cartoon-ocean/stkskin.xml
+++ b/data/skins/cartoon-ocean/stkskin.xml
@@ -8,7 +8,7 @@ Cartoon skin by LCP and QwertyChouskie, released under CC-BY-SA 4.0+
See SKIN_MAKING.md for more details on how the skin elements work.
-->
-
+
-
+
-
+
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/skins/desert/table_header_down.png b/data/skins/classic-desert/table_header_down.png
similarity index 100%
rename from data/skins/desert/table_header_down.png
rename to data/skins/classic-desert/table_header_down.png
diff --git a/data/skins/desert/textbubble.png b/data/skins/classic-desert/textbubble.png
similarity index 100%
rename from data/skins/desert/textbubble.png
rename to data/skins/classic-desert/textbubble.png
diff --git a/data/skins/desert/textbubble2.png b/data/skins/classic-desert/textbubble2.png
similarity index 100%
rename from data/skins/desert/textbubble2.png
rename to data/skins/classic-desert/textbubble2.png
diff --git a/data/skins/forest/License.txt b/data/skins/classic-forest/License.txt
similarity index 100%
rename from data/skins/forest/License.txt
rename to data/skins/classic-forest/License.txt
diff --git a/data/skins/forest/achievement.png b/data/skins/classic-forest/achievement.png
similarity index 100%
rename from data/skins/forest/achievement.png
rename to data/skins/classic-forest/achievement.png
diff --git a/data/skins/forest/bubble.png b/data/skins/classic-forest/bubble.png
similarity index 100%
rename from data/skins/forest/bubble.png
rename to data/skins/classic-forest/bubble.png
diff --git a/data/skins/forest/error.png b/data/skins/classic-forest/error.png
similarity index 100%
rename from data/skins/forest/error.png
rename to data/skins/classic-forest/error.png
diff --git a/data/skins/forest/friend.png b/data/skins/classic-forest/friend.png
similarity index 100%
rename from data/skins/forest/friend.png
rename to data/skins/classic-forest/friend.png
diff --git a/data/skins/forest/generic.png b/data/skins/classic-forest/generic.png
similarity index 100%
rename from data/skins/forest/generic.png
rename to data/skins/classic-forest/generic.png
diff --git a/data/skins/forest/glass_iconhighlight_focus.png b/data/skins/classic-forest/glass_iconhighlight_focus.png
similarity index 100%
rename from data/skins/forest/glass_iconhighlight_focus.png
rename to data/skins/classic-forest/glass_iconhighlight_focus.png
diff --git a/data/skins/forest/glassbutton.png b/data/skins/classic-forest/glassbutton.png
similarity index 100%
rename from data/skins/forest/glassbutton.png
rename to data/skins/classic-forest/glassbutton.png
diff --git a/data/skins/forest/glassbutton_focused.png b/data/skins/classic-forest/glassbutton_focused.png
similarity index 100%
rename from data/skins/forest/glassbutton_focused.png
rename to data/skins/classic-forest/glassbutton_focused.png
diff --git a/data/skins/forest/glasscheckbox.png b/data/skins/classic-forest/glasscheckbox.png
similarity index 100%
rename from data/skins/forest/glasscheckbox.png
rename to data/skins/classic-forest/glasscheckbox.png
diff --git a/data/skins/forest/glasscheckbox_checked.png b/data/skins/classic-forest/glasscheckbox_checked.png
similarity index 100%
rename from data/skins/forest/glasscheckbox_checked.png
rename to data/skins/classic-forest/glasscheckbox_checked.png
diff --git a/data/skins/forest/glasscheckbox_checked_focus.png b/data/skins/classic-forest/glasscheckbox_checked_focus.png
similarity index 100%
rename from data/skins/forest/glasscheckbox_checked_focus.png
rename to data/skins/classic-forest/glasscheckbox_checked_focus.png
diff --git a/data/skins/forest/glasscheckbox_focus.png b/data/skins/classic-forest/glasscheckbox_focus.png
similarity index 100%
rename from data/skins/forest/glasscheckbox_focus.png
rename to data/skins/classic-forest/glasscheckbox_focus.png
diff --git a/data/skins/forest/glasssgauge_fill.png b/data/skins/classic-forest/glasssgauge_fill.png
similarity index 100%
rename from data/skins/forest/glasssgauge_fill.png
rename to data/skins/classic-forest/glasssgauge_fill.png
diff --git a/data/skins/forest/glassspinner_down.png b/data/skins/classic-forest/glassspinner_down.png
similarity index 100%
rename from data/skins/forest/glassspinner_down.png
rename to data/skins/classic-forest/glassspinner_down.png
diff --git a/data/skins/forest/glassspinner_focus.png b/data/skins/classic-forest/glassspinner_focus.png
similarity index 100%
rename from data/skins/forest/glassspinner_focus.png
rename to data/skins/classic-forest/glassspinner_focus.png
diff --git a/data/skins/forest/glassspinner_halo.png b/data/skins/classic-forest/glassspinner_halo.png
similarity index 100%
rename from data/skins/forest/glassspinner_halo.png
rename to data/skins/classic-forest/glassspinner_halo.png
diff --git a/data/skins/forest/glasstab.png b/data/skins/classic-forest/glasstab.png
similarity index 100%
rename from data/skins/forest/glasstab.png
rename to data/skins/classic-forest/glasstab.png
diff --git a/data/skins/forest/glasstab_focus.png b/data/skins/classic-forest/glasstab_focus.png
similarity index 100%
rename from data/skins/forest/glasstab_focus.png
rename to data/skins/classic-forest/glasstab_focus.png
diff --git a/data/skins/forest/glasstab_vert.png b/data/skins/classic-forest/glasstab_vert.png
similarity index 100%
rename from data/skins/forest/glasstab_vert.png
rename to data/skins/classic-forest/glasstab_vert.png
diff --git a/data/skins/forest/glasstab_vert_focus.png b/data/skins/classic-forest/glasstab_vert_focus.png
similarity index 100%
rename from data/skins/forest/glasstab_vert_focus.png
rename to data/skins/classic-forest/glasstab_vert_focus.png
diff --git a/data/skins/forest/left_arrow_focus.png b/data/skins/classic-forest/left_arrow_focus.png
similarity index 100%
rename from data/skins/forest/left_arrow_focus.png
rename to data/skins/classic-forest/left_arrow_focus.png
diff --git a/data/skins/forest/right_arrow_focus.png b/data/skins/classic-forest/right_arrow_focus.png
similarity index 100%
rename from data/skins/forest/right_arrow_focus.png
rename to data/skins/classic-forest/right_arrow_focus.png
diff --git a/data/skins/forest/scrollbar_btn_down.png b/data/skins/classic-forest/scrollbar_btn_down.png
similarity index 100%
rename from data/skins/forest/scrollbar_btn_down.png
rename to data/skins/classic-forest/scrollbar_btn_down.png
diff --git a/data/skins/forest/scrollbar_thumb.png b/data/skins/classic-forest/scrollbar_thumb.png
similarity index 100%
rename from data/skins/forest/scrollbar_thumb.png
rename to data/skins/classic-forest/scrollbar_thumb.png
diff --git a/data/skins/forest/select.png b/data/skins/classic-forest/select.png
similarity index 100%
rename from data/skins/forest/select.png
rename to data/skins/classic-forest/select.png
diff --git a/data/skins/forest/stkskin.xml b/data/skins/classic-forest/stkskin.xml
similarity index 99%
rename from data/skins/forest/stkskin.xml
rename to data/skins/classic-forest/stkskin.xml
index 393646f12..2115dc77f 100644
--- a/data/skins/forest/stkskin.xml
+++ b/data/skins/classic-forest/stkskin.xml
@@ -9,7 +9,7 @@ Except stars, by s@f
See SKIN_MAKING.md for more details on how the skin elements work.
-->
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/config/user_config.hpp b/src/config/user_config.hpp
index 277a49145..0c4cbd081 100644
--- a/src/config/user_config.hpp
+++ b/src/config/user_config.hpp
@@ -1244,7 +1244,7 @@ namespace UserConfigParams
"If debug logging should be enabled for rich presence") );
PARAM_PREFIX StringUserConfigParam m_skin_file
- PARAM_DEFAULT( StringUserConfigParam("peach", "skin_name",
+ PARAM_DEFAULT( StringUserConfigParam("classic", "skin_name",
"Name of the skin to use") );
// ---- settings for minimap display
diff --git a/src/states_screens/options/options_screen_ui.cpp b/src/states_screens/options/options_screen_ui.cpp
index 1b92b9a6c..ba0b0f2f0 100644
--- a/src/states_screens/options/options_screen_ui.cpp
+++ b/src/states_screens/options/options_screen_ui.cpp
@@ -48,10 +48,14 @@ void OptionsScreenUI::loadedFromFile()
{
m_inited = false;
- GUIEngine::SpinnerWidget* skinSelector = getWidget("skinchoice");
- assert( skinSelector != NULL );
+ GUIEngine::SpinnerWidget* baseSkinSelector = getWidget("base_skinchoice");
+ assert( baseSkinSelector != NULL );
- skinSelector->m_properties[PROP_WRAP_AROUND] = "true";
+ GUIEngine::SpinnerWidget* variantSkinSelector = getWidget("variant_skinchoice");
+ assert( variantSkinSelector != NULL );
+
+ baseSkinSelector->m_properties[PROP_WRAP_AROUND] = "true";
+ variantSkinSelector->m_properties[PROP_WRAP_AROUND] = "true";
// Setup the minimap options spinner
GUIEngine::SpinnerWidget* minimap_options = getWidget("minimap");
@@ -145,16 +149,25 @@ void OptionsScreenUI::loadedFromFile()
void OptionsScreenUI::init()
{
Screen::init();
+
+ bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU;
+
RibbonWidget* ribbon = getWidget("options_choice");
assert(ribbon != NULL);
ribbon->setFocusForPlayer(PLAYER_ID_GAME_MASTER);
ribbon->select( "tab_ui", PLAYER_ID_GAME_MASTER );
- GUIEngine::SpinnerWidget* skinSelector = getWidget("skinchoice");
- assert( skinSelector != NULL );
+ GUIEngine::SpinnerWidget* baseSkinSelector = getWidget("base_skinchoice");
+ assert( baseSkinSelector != NULL );
+
+ GUIEngine::SpinnerWidget* variantSkinSelector = getWidget("variant_skinchoice");
+ assert( variantSkinSelector != NULL );
m_skins.clear();
- skinSelector->clearLabels();
+ m_base_skins.clear();
+ m_current_skin_variants.clear();
+ baseSkinSelector->clearLabels();
+ variantSkinSelector->clearLabels();
std::set skin_files;
file_manager->listFiles(skin_files /* out */, file_manager->getAsset(FileManager::SKIN,""),
@@ -163,45 +176,54 @@ void OptionsScreenUI::init()
file_manager->listFiles(addon_skin_files /* out */, file_manager->getAddonsFile("skins/"),
true /* make full path */ );
- auto lb = [](const std::set& files, bool addon,
- std::map& result)->void
- {
- for (auto& f : files)
- {
- std::string stkskin = f + "/stkskin.xml";
- if (file_manager->fileExists(stkskin))
- {
- XMLNode* root = file_manager->createXMLTree(stkskin);
- if (!root)
- continue;
- core::stringw skin_name;
- if (root->get("name", &skin_name))
- {
- std::string skin_id = StringUtils::getBasename(f);
- if (addon)
- skin_id = std::string("addon_") + skin_id;
- result[skin_name] = skin_id;
- }
- delete root;
- }
- }
- };
- lb(skin_files, false, m_skins);
- lb(addon_skin_files, true, m_skins);
+ loadSkins(skin_files, false);
+ loadSkins(addon_skin_files, true);
if (m_skins.size() == 0)
{
Log::warn("OptionsScreenUI", "Could not find a single skin, make sure that "
"the data files are correctly installed");
- skinSelector->setActive(false);
+ baseSkinSelector->setActive(false);
+ variantSkinSelector->setActive(false);
return;
}
- const int skin_count = (int)m_skins.size();
- for (auto& p : m_skins)
- skinSelector->addLabel(p.first);
- skinSelector->m_properties[GUIEngine::PROP_MIN_VALUE] = "0";
- skinSelector->m_properties[GUIEngine::PROP_MAX_VALUE] = StringUtils::toString(skin_count-1);
+ const int base_skin_count = (int)m_base_skins.size();
+ for (auto& p : m_base_skins)
+ baseSkinSelector->addLabel(p);
+ baseSkinSelector->m_properties[GUIEngine::PROP_MIN_VALUE] = "0";
+ baseSkinSelector->m_properties[GUIEngine::PROP_MAX_VALUE] = StringUtils::toString(base_skin_count-1);
+
+ // --- select the right skin in the spinner
+ bool currSkinFound = false;
+ const std::string& user_skin = UserConfigParams::m_skin_file;
+ baseSkinSelector->setActive(!in_game);
+ variantSkinSelector->setActive(!in_game);
+
+ for (unsigned int i = 0; i < m_skins.size(); i++)
+ {
+ if (m_skins[i].m_folder_name == user_skin)
+ {
+ m_active_base_skin = m_skins[i].m_base_theme_name;
+ baseSkinSelector->setValue(getBaseID(m_skins[i]));
+ loadCurrentSkinVariants();
+ variantSkinSelector->setValue(getVariantID(m_skins[i]));
+ currSkinFound = true;
+ break;
+ }
+ }
+ if (!currSkinFound)
+ {
+ Log::warn("OptionsScreenUI",
+ "Couldn't find current skin in the list of skins!");
+ baseSkinSelector->setValue(0);
+ variantSkinSelector->setValue(0);
+ irr_driver->unsetMaxTextureSize();
+ GUIEngine::reloadSkin();
+ irr_driver->setMaxTextureSize();
+ }
+
+ // --- Setup other spinners and checkboxes
GUIEngine::SpinnerWidget* minimap_options = getWidget("minimap");
assert( minimap_options != NULL );
@@ -217,8 +239,6 @@ void OptionsScreenUI::init()
}
minimap_options->setValue(UserConfigParams::m_minimap_display);
- bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU;
-
GUIEngine::SpinnerWidget* font_size = getWidget("font_size");
assert( font_size != NULL );
@@ -276,35 +296,6 @@ void OptionsScreenUI::init()
}
speedrun_timer->setState( UserConfigParams::m_speedrun_mode );
- // --- select the right skin in the spinner
- bool currSkinFound = false;
- const std::string& user_skin = UserConfigParams::m_skin_file;
- skinSelector->setActive(!in_game);
-
- for (int n = 0; n <= skinSelector->getMax(); n++)
- {
- auto ret = m_skins.find(skinSelector->getStringValueFromID(n));
- if (ret == m_skins.end())
- continue;
- const std::string skinFileName = ret->second;
-
- if (user_skin == skinFileName)
- {
- skinSelector->setValue(n);
- currSkinFound = true;
- break;
- }
- }
- if (!currSkinFound)
- {
- Log::warn("OptionsScreenUI",
- "Couldn't find current skin in the list of skins!");
- skinSelector->setValue(0);
- irr_driver->unsetMaxTextureSize();
- GUIEngine::reloadSkin();
- irr_driver->setMaxTextureSize();
- }
-
// --- select the right camera in the spinner
GUIEngine::SpinnerWidget* camera_preset = getWidget("camera_preset");
assert( camera_preset != NULL );
@@ -313,6 +304,126 @@ void OptionsScreenUI::init()
updateCameraPresetSpinner();
} // init
+// -----------------------------------------------------------------------------
+void OptionsScreenUI::loadSkins(const std::set& files, bool addon)
+{
+ for (auto& f : files)
+ {
+ std::string stkskin = f + "/stkskin.xml";
+ if (file_manager->fileExists(stkskin))
+ {
+ XMLNode* root = file_manager->createXMLTree(stkskin);
+ if (!root)
+ continue;
+
+ SkinID skin;
+ std::string folder_name = StringUtils::getBasename(f);
+ if (addon)
+ folder_name = std::string("addon_") + folder_name;
+
+ if (root->get("base_theme_name", &skin.m_base_theme_name))
+ {
+ if (!root->get("variant_name", &skin.m_variant_name))
+ skin.m_variant_name = core::stringw(" ");
+ }
+ else if (root->get("name", &skin.m_base_theme_name))
+ {
+ skin.m_variant_name = " ";
+ }
+ else
+ {
+ delete root;
+ return;
+ }
+
+ skin.m_folder_name = folder_name;
+ m_skins.push_back(skin);
+
+ // Add the base theme to the list of base Themes
+ bool new_base_theme = true;
+ for (int i = 0; i<(int)m_base_skins.size(); i++)
+ {
+ if (m_base_skins[i] == skin.m_base_theme_name)
+ new_base_theme = false;
+ }
+ if (new_base_theme)
+ m_base_skins.push_back(skin.m_base_theme_name);
+
+ delete root;
+ }
+ }
+} // loadSkins
+
+// -----------------------------------------------------------------------------
+/** Set up the variant spinner with the appropriate values based on the current base skin. */
+void OptionsScreenUI::loadCurrentSkinVariants()
+{
+ GUIEngine::SpinnerWidget* variantSkinSelector = getWidget("variant_skinchoice");
+ variantSkinSelector->clearLabels();
+
+ m_current_skin_variants.clear();
+ for (int i=0; i<(int)m_skins.size();i++)
+ {
+ if (m_skins[i].m_base_theme_name == m_active_base_skin)
+ {
+ m_current_skin_variants.push_back(m_skins[i].m_variant_name);
+ variantSkinSelector->addLabel(m_skins[i].m_variant_name);
+ }
+ }
+
+ variantSkinSelector->m_properties[GUIEngine::PROP_MIN_VALUE] = "0";
+ variantSkinSelector->m_properties[GUIEngine::PROP_MAX_VALUE] =
+ StringUtils::toString(m_current_skin_variants.size()-1);
+
+ bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU;
+
+ if (m_current_skin_variants.size() == 1)
+ variantSkinSelector->setActive(false);
+ else
+ variantSkinSelector->setActive(!in_game);
+} // loadCurrentSkinVariants
+
+// -----------------------------------------------------------------------------
+/** Returns the spinner value matching the given name */
+int OptionsScreenUI::getBaseID(SkinID skin)
+{
+ for (int i=0; i<(int)m_base_skins.size(); i++)
+ {
+ if (m_base_skins[i] == skin.m_base_theme_name)
+ return i;
+ }
+ return 0;
+} // getBaseID
+
+// -----------------------------------------------------------------------------
+/** Returns the spinner value matching the given name */
+int OptionsScreenUI::getVariantID(SkinID skin)
+{
+ for (int i=0; i<(int)m_current_skin_variants.size(); i++)
+ {
+ if (m_current_skin_variants[i] == skin.m_variant_name)
+ return i;
+ }
+ return 0;
+} // getVariantID
+
+// -----------------------------------------------------------------------------
+/** Returns the folder name of the current skin based on the spinners */
+std::string OptionsScreenUI::getCurrentSpinnerSkin()
+{
+ GUIEngine::SpinnerWidget* baseSkinSelector = getWidget("base_skinchoice");
+ GUIEngine::SpinnerWidget* variantSkinSelector = getWidget("variant_skinchoice");
+
+ for (int i=0; i<(int)m_skins.size();i++)
+ {
+ if (m_skins[i].m_base_theme_name == baseSkinSelector->getStringValue() &&
+ m_skins[i].m_variant_name == variantSkinSelector->getStringValue())
+ return m_skins[i].m_folder_name;
+ }
+ return "classic"; // Default if nothing is found
+} // getCurrentSpinnerSkin
+
+// -----------------------------------------------------------------------------
void OptionsScreenUI::updateCamera()
{
bool in_game = StateManager::get()->getGameState() == GUIEngine::INGAME_MENU;
@@ -325,15 +436,15 @@ void OptionsScreenUI::updateCamera()
camera->setDistanceToKart(UserConfigParams::m_camera_distance);
}
}
-}
+} // updateCamera
+// -----------------------------------------------------------------------------
void OptionsScreenUI::updateCameraPresetSpinner()
{
updateCamera();
} // updateCameraPresetSpinner
// -----------------------------------------------------------------------------
-
void OptionsScreenUI::eventCallback(Widget* widget, const std::string& name, const int playerID)
{
#ifndef SERVER_ONLY
@@ -348,23 +459,23 @@ void OptionsScreenUI::eventCallback(Widget* widget, const std::string& name, con
{
StateManager::get()->escapePressed();
}
- else if (name == "skinchoice")
+ else if (name == "base_skinchoice")
{
- GUIEngine::SpinnerWidget* skinSelector = getWidget("skinchoice");
- assert( skinSelector != NULL );
-
- const core::stringw selectedSkin = skinSelector->getStringValue();
- bool right = skinSelector->isButtonSelected(true/*right*/);
- UserConfigParams::m_skin_file = m_skins[selectedSkin];
- bool prev_font = GUIEngine::getSkin()->hasFont();
- irr_driver->unsetMaxTextureSize();
- GUIEngine::reloadSkin();
- // Reload GUIEngine will clear widgets so we don't do that in eventCallback
- m_reload_option = std::unique_ptr(new ReloadOption);
- m_reload_option->m_reload_font = prev_font != GUIEngine::getSkin()->hasFont();
- m_reload_option->m_reload_skin = true;
- m_reload_option->m_focus_name = "skinchoice";
- m_reload_option->m_focus_right = right;
+ GUIEngine::SpinnerWidget* baseSkinSelector = getWidget("base_skinchoice");
+ m_active_base_skin = baseSkinSelector->getStringValue();
+ loadCurrentSkinVariants();
+ UserConfigParams::m_skin_file = getCurrentSpinnerSkin();
+ onSkinChange();
+ m_reload_option->m_focus_name = "base_skinchoice";
+ m_reload_option->m_focus_right = baseSkinSelector->isButtonSelected(true/*right*/);
+ }
+ else if (name == "variant_skinchoice")
+ {
+ GUIEngine::SpinnerWidget* variantSkinSelector = getWidget("variant_skinchoice");
+ UserConfigParams::m_skin_file = getCurrentSpinnerSkin();
+ onSkinChange();
+ m_reload_option->m_focus_name = "variant_skinchoice";
+ m_reload_option->m_focus_right = variantSkinSelector->isButtonSelected(true/*right*/);
}
else if (name == "minimap")
{
@@ -542,6 +653,18 @@ void OptionsScreenUI::reloadGUIEngine()
OptionsScreenUI::getInstance()->m_reload_option = nullptr;
} // reloadGUIEngine
+// -----------------------------------------------------------------------------
+void OptionsScreenUI::onSkinChange()
+{
+ bool prev_font = GUIEngine::getSkin()->hasFont();
+ irr_driver->unsetMaxTextureSize();
+ GUIEngine::reloadSkin();
+ // Reload GUIEngine will clear widgets so we don't do that in eventCallback
+ m_reload_option = std::unique_ptr(new ReloadOption);
+ m_reload_option->m_reload_font = prev_font != GUIEngine::getSkin()->hasFont();
+ m_reload_option->m_reload_skin = true;
+} // onSkinChange
+
// -----------------------------------------------------------------------------
void OptionsScreenUI::tearDown()
diff --git a/src/states_screens/options/options_screen_ui.hpp b/src/states_screens/options/options_screen_ui.hpp
index ac9b754cd..05d0aad5a 100644
--- a/src/states_screens/options/options_screen_ui.hpp
+++ b/src/states_screens/options/options_screen_ui.hpp
@@ -39,13 +39,30 @@ class OptionsScreenUI : public GUIEngine::Screen, public GUIEngine::ScreenSingle
std::string m_focus_name;
bool m_focus_right;
};
+
+ struct SkinID
+ {
+ core::stringw m_base_theme_name;
+ core::stringw m_variant_name;
+ std::string m_folder_name;
+ };
std::unique_ptr m_reload_option;
OptionsScreenUI();
bool m_inited;
- std::map m_skins;
+ std::vector m_skins;
+ std::vector m_base_skins;
+ std::vector m_current_skin_variants;
+ core::stringw m_active_base_skin;
void updateCamera();
+
+ void loadSkins(const std::set& files, bool addon);
+ void loadCurrentSkinVariants();
+ int getBaseID(SkinID skin);
+ int getVariantID(SkinID skin);
+ std::string getCurrentSpinnerSkin();
+ void onSkinChange();
public:
friend class GUIEngine::ScreenSingleton;