diff --git a/src/gui/core/gui_definition.cpp b/src/gui/core/gui_definition.cpp index 3729705cf63..7f7a2c9dbd5 100644 --- a/src/gui/core/gui_definition.cpp +++ b/src/gui/core/gui_definition.cpp @@ -205,45 +205,48 @@ resolution_definition_ptr get_control(const std::string& control_type, const std const auto& current_types = current_gui->second.widget_types; const auto& default_types = default_gui->second.widget_types; - const auto widget_definitions = current_types.find(control_type); + const auto find_definition = + [&](const auto& widget_types) -> utils::optional<gui_definition::widget_definition_map_t::const_iterator> + { + // Get all possible definitions for the given widget type. + const auto widget_definitions = widget_types.find(control_type); - gui_definition::widget_definition_map_t::const_iterator control; + // We don't have a fallback here since all types should be valid in all themes. + VALIDATE(widget_definitions != widget_types.end(), + formatter() << "Control: type '" << control_type << "' is unknown."); - if(widget_definitions == current_types.end()) { - goto fallback; + const auto& options = widget_definitions->second; + + // Out of all definitions for that type, find the requested one. + if(auto control = options.find(definition); control != options.end()) { + return control; + } else { + return utils::nullopt; + } + }; + + auto control = find_definition(current_types); + + // Definition not found in the current theme, try the default theme. + if(!control) { + control = find_definition(default_types); } - control = widget_definitions->second.find(definition); - - if(control == widget_definitions->second.end()) { - fallback: - bool found_fallback = false; - - if(current_gui != default_gui) { - auto default_widget_definitions = default_types.find(control_type); - - VALIDATE(widget_definitions != current_types.end(), - formatter() << "Type '" << control_type << "' is unknown."); - - control = default_widget_definitions->second.find(definition); - found_fallback = control != default_widget_definitions->second.end(); - } - - if(!found_fallback) { - if(definition != "default") { - LOG_GUI_G << "Control: type '" << control_type << "' definition '" << definition - << "' not found, falling back to 'default'."; - return get_control(control_type, "default"); - } - - FAIL(formatter() << "default definition not found for styled_widget " << control_type); - } + // Still no match. Try the default definition. + if(!control && definition != "default") { + LOG_GUI_G << "Control: type '" << control_type << "' definition '" << definition + << "' not found, falling back to 'default'."; + return get_control(control_type, "default"); } - const auto& resolutions = (*control->second).resolutions; + VALIDATE(control, + formatter() << "Control: definition '" << definition << "' not found for styled_widget " << control_type); + + // Finally, resolve the appropriate resolution + const auto& resolutions = (*control)->second->resolutions; VALIDATE(!resolutions.empty(), - formatter() << "Control: type '" << control_type << "' definition '" << definition << "' has no resolutions.\n"); + formatter() << "Control: type '" << control_type << "' definition '" << definition << "' has no resolutions."); return get_best_resolution(resolutions, [&](const resolution_definition_ptr& ptr) { return point(