From 9e41caf4b7e8b759febcbe9f99b29fdee8413538 Mon Sep 17 00:00:00 2001 From: Christophe Date: Fri, 6 Sep 2024 12:42:34 +0200 Subject: [PATCH] vkconfig3: Implement layer version switching --- vkconfig_cmd/main_doc.cpp | 2 +- vkconfig_core/configuration.cpp | 104 ++++++++++++++++-- vkconfig_core/configuration.h | 11 +- vkconfig_core/configuration_manager.cpp | 32 ++++-- vkconfig_core/configurator.cpp | 2 +- vkconfig_core/parameter.cpp | 58 ++-------- vkconfig_core/parameter.h | 11 +- vkconfig_core/test/test_configuration.cpp | 2 +- vkconfig_core/test/test_util.cpp | 29 +++++ vkconfig_core/util.h | 7 +- vkconfig_gui/settings_tree.cpp | 14 ++- vkconfig_gui/tab_configurations.cpp | 18 ++- vkconfig_gui/widget_setting_flags.cpp | 12 ++ .../widget_tab_configurations_layer.cpp | 9 +- .../widget_tab_configurations_layer.h | 3 +- vkconfig_gui/widget_tab_layers_path.cpp | 2 +- 16 files changed, 219 insertions(+), 97 deletions(-) diff --git a/vkconfig_cmd/main_doc.cpp b/vkconfig_cmd/main_doc.cpp index 6a39c120fb..ef1d52047b 100644 --- a/vkconfig_cmd/main_doc.cpp +++ b/vkconfig_cmd/main_doc.cpp @@ -74,7 +74,7 @@ int run_doc_settings(const CommandLine& command_line) { ConfigurationManager configuration_manager; Configuration config = configuration_manager.CreateConfiguration(layers, "Config"); - config.parameters = GatherParameters(config.parameters, layers); + config.GatherParameters(layers); config.parameters[0].control = LAYER_CONTROL_ON; ExportSettingsDoc(layers.selected_layers, config, command_line.doc_out_dir + "/vk_layer_settings.txt"); diff --git a/vkconfig_core/configuration.cpp b/vkconfig_core/configuration.cpp index f1cd2adab5..8947aa7d39 100644 --- a/vkconfig_core/configuration.cpp +++ b/vkconfig_core/configuration.cpp @@ -83,7 +83,7 @@ Configuration Configuration::Create(const LayerManager& layers, const std::strin Configuration result; result.key = key; - result.parameters = GatherParameters(result.parameters, layers); + result.GatherParameters(layers); AddApplicationEnabledParameters(result.parameters); @@ -93,7 +93,7 @@ Configuration Configuration::Create(const LayerManager& layers, const std::strin Configuration Configuration::CreateDisabled(const LayerManager& layers) { Configuration result; result.key = "_DisablingConfiguration"; - result.parameters = GatherParameters(result.parameters, layers); + result.GatherParameters(layers); for (std::size_t i = 0, n = result.parameters.size(); i < n; ++i) { result.parameters[i].control = LAYER_CONTROL_OFF; @@ -239,7 +239,7 @@ bool Configuration::Load(const Path& full_path, const LayerManager& layers) { this->parameters.push_back(parameter); } - this->parameters = GatherParameters(this->parameters, layers); + this->GatherParameters(layers); AddApplicationEnabledParameters(this->parameters); @@ -337,9 +337,9 @@ bool Configuration::Save(const Path& full_path, bool exporter) const { } } -Parameter* Configuration::Find(std::string parameter_key) { +Parameter* Configuration::Find(const std::string& layer_key) { for (std::size_t i = 0, n = this->parameters.size(); i < n; ++i) { - if (this->parameters[i].key == parameter_key) { + if (this->parameters[i].key == layer_key) { return &this->parameters[i]; } } @@ -357,7 +357,7 @@ void Configuration::Reset(const LayerManager& layers) { const bool result = this->Load(builtin_configuration_files[i], layers); assert(result); - OrderParameter(this->parameters, layers.selected_layers); + OrderParameter(this->parameters, layers); return; } } @@ -371,7 +371,7 @@ void Configuration::Reset(const LayerManager& layers) { const bool result = this->Load(full_path, layers); assert(result); - OrderParameter(this->parameters, layers.selected_layers); + OrderParameter(this->parameters, layers); return; } @@ -385,7 +385,7 @@ void Configuration::Reset(const LayerManager& layers) { } } - OrderParameter(this->parameters, layers.selected_layers); + OrderParameter(this->parameters, layers); } } @@ -403,6 +403,82 @@ bool Configuration::HasOverride() const { return false; } +void Configuration::SwitchLayerVersion(const LayerManager& layers, const std::string& layer_key, const Version& version) { + Parameter* parameter = this->Find(layer_key); + assert(parameter != nullptr); + + const Layer* new_layer = layers.Find(layer_key, version); + + parameter->api_version = version; + CollectDefaultSettingData(new_layer->settings, parameter->settings); +} + +void Configuration::GatherParameters(const LayerManager& layers) { + const std::vector& previous_parameters = this->parameters; + + std::vector gathered_parameters; + + // Loop through the layers. They are expected to be in order + for (std::size_t i = 0, n = parameters.size(); i < n; ++i) { + const Parameter& parameter = parameters[i]; + assert(!parameter.key.empty()); + + gathered_parameters.push_back(parameter); + } + + const std::vector& list = layers.BuildLayerNameList(); + + for (std::size_t i = 0, n = list.size(); i < n; ++i) { + const Layer* layer = layers.Find(list[i], Version::LATEST); + + // The layer is already in the layer tree + if (this->Find(layer->key.c_str())) { + continue; + } + + Parameter parameter; + parameter.key = layer->key; + parameter.control = LAYER_CONTROL_AUTO; + parameter.api_version = Version::LATEST; + CollectDefaultSettingData(layer->settings, parameter.settings); + + gathered_parameters.push_back(parameter); + } + + // OrderParameter(gathered_parameters, layers); + + this->parameters = gathered_parameters; +} + +void Configuration::Reorder(const std::vector& layer_names) { + std::vector ordered_parameters; + + for (std::size_t i = 0, n = layer_names.size(); i < n; ++i) { + Parameter* parameter = this->Find(layer_names[i]); + assert(parameter != nullptr); + ordered_parameters.push_back(*parameter); + } + + if (!this->view_advanced_layers) { + for (std::size_t i = 0, n = this->parameters.size(); i < n; ++i) { + Parameter& parameter = this->parameters[i]; + + bool found = false; + for (std::size_t j = 0, o = ordered_parameters.size(); j < o; ++j) { + if (ordered_parameters[j].key == parameter.key) { + found = true; + } + } + + if (!found) { + ordered_parameters.push_back(parameter); + } + } + } + + this->parameters = ordered_parameters; +} + bool Configuration::IsBuiltIn() const { const std::vector& builtin_configuration_files = CollectFilePaths(":/configurations/"); for (std::size_t i = 0, n = builtin_configuration_files.size(); i < n; ++i) { @@ -420,13 +496,19 @@ static const size_t NOT_FOUND = static_cast(-1); static std::size_t ExtractDuplicateNumber(const std::string& configuration_name) { const std::size_t name_open = configuration_name.find_last_of("("); - if (name_open == NOT_FOUND) return NOT_FOUND; + if (name_open == NOT_FOUND) { + return NOT_FOUND; + } const std::size_t name_close = configuration_name.find_last_of(")"); - if (name_close == NOT_FOUND) return NOT_FOUND; + if (name_close == NOT_FOUND) { + return NOT_FOUND; + } const std::string number = configuration_name.substr(name_open + 1, name_close - (name_open + 1)); - if (!IsNumber(number)) return NOT_FOUND; + if (!IsNumber(number)) { + return NOT_FOUND; + } return std::stoi(number); } diff --git a/vkconfig_core/configuration.h b/vkconfig_core/configuration.h index c7060799b7..b0c0dc97ec 100644 --- a/vkconfig_core/configuration.h +++ b/vkconfig_core/configuration.h @@ -34,17 +34,20 @@ class LayerManager; class Configuration { public: static Configuration CreateDisabled(const LayerManager& layers); - static Configuration Create(const LayerManager& layers, const std::string& key); + static Configuration Create(const LayerManager& layers, const std::string& layer_key); bool Load(const Path& full_path, const LayerManager& layers); bool Save(const Path& full_path, bool exporter = false) const; - bool HasOverride() const; - Parameter* Find(std::string parameter_key); - void Reset(const LayerManager& layers); + bool HasOverride() const; + Parameter* Find(const std::string& layer_key); std::size_t Size() const { return this->parameters.size(); }; + void SwitchLayerVersion(const LayerManager& layers, const std::string& layer_key, const Version& version); + void GatherParameters(const LayerManager& layers); + void Reorder(const std::vector& layer_names); + std::string key = "New Configuration"; // User readable display of the configuration name (may contain spaces) int version = 1; int platform_flags = PLATFORM_DESKTOP_BIT; diff --git a/vkconfig_core/configuration_manager.cpp b/vkconfig_core/configuration_manager.cpp index 46c232afac..c3045c5436 100644 --- a/vkconfig_core/configuration_manager.cpp +++ b/vkconfig_core/configuration_manager.cpp @@ -41,6 +41,8 @@ bool ConfigurationManager::Load(const QJsonObject &json_root_object) { this->active_application = json_configurations_object.value("active_application").toString().toStdString(); if (json_configurations_object.value("infos") != QJsonValue::Undefined) { + this->configuration_infos.clear(); + const QJsonObject &json_infos_object = json_configurations_object.value("infos").toObject(); const QStringList &json_infos_keys = json_infos_object.keys(); for (int i = 0, n = json_infos_keys.length(); i < n; ++i) { @@ -145,7 +147,7 @@ void ConfigurationManager::LoadDefaultConfigurations(const LayerManager &layers) } #endif - OrderParameter(configuration.parameters, layers.selected_layers); + OrderParameter(configuration.parameters, layers); Configuration *found_configuration = this->FindConfiguration(configuration.key); if (found_configuration == nullptr) { @@ -184,13 +186,13 @@ void ConfigurationManager::LoadConfigurationsPath(const LayerManager &layers) { continue; } - if (FindByKey(available_configurations, configuration.key.c_str()) != nullptr) { + if (this->FindConfiguration(configuration.key) != nullptr) { continue; } std::string missing_layer; - if (!HasMissingLayer(configuration.parameters, layers.selected_layers, missing_layer)) { - OrderParameter(configuration.parameters, layers.selected_layers); + if (!HasMissingLayer(configuration.parameters, layers, missing_layer)) { + OrderParameter(configuration.parameters, layers); } available_configurations.push_back(configuration); @@ -255,7 +257,7 @@ bool ConfigurationManager::HasActiveConfiguration() const { Configuration &ConfigurationManager::CreateConfiguration(const LayerManager &layers, const std::string &configuration_name, bool duplicate) { - Configuration *duplicate_configuration = FindByKey(available_configurations, configuration_name.c_str()); + Configuration *duplicate_configuration = this->FindConfiguration(configuration_name); Configuration new_configuration = duplicate_configuration != nullptr && duplicate ? *duplicate_configuration : Configuration(); new_configuration.key = MakeConfigurationName(available_configurations, configuration_name); @@ -273,7 +275,7 @@ Configuration &ConfigurationManager::CreateConfiguration(const LayerManager &lay this->GetActiveConfigurationInfo()->name = configuration.key; - return *FindByKey(this->available_configurations, configuration.key.c_str()); + return *this->FindConfiguration(configuration.key); } bool ConfigurationManager::HasFile(const Configuration &configuration) const { @@ -344,7 +346,13 @@ Configuration *ConfigurationManager::FindConfiguration(const std::string &config return nullptr; } - return FindByKey(this->available_configurations, configuration_name.c_str()); + for (std::size_t i = 0, n = this->available_configurations.size(); i < n; ++i) { + if (this->available_configurations[i].key == configuration_name) { + return &this->available_configurations[i]; + } + } + + return nullptr; } const Configuration *ConfigurationManager::FindConfiguration(const std::string &configuration_name) const { @@ -356,7 +364,13 @@ const Configuration *ConfigurationManager::FindConfiguration(const std::string & return nullptr; } - return FindByKey(this->available_configurations, configuration_name.c_str()); + for (std::size_t i = 0, n = this->available_configurations.size(); i < n; ++i) { + if (this->available_configurations[i].key == configuration_name) { + return &this->available_configurations[i]; + } + } + + return nullptr; } void ConfigurationManager::ImportConfiguration(const LayerManager &layers, const Path &full_import_path) { @@ -385,7 +399,7 @@ void ConfigurationManager::ExportConfiguration(const LayerManager &layers, const assert(!configuration_name.empty()); assert(!full_export_path.Empty()); - Configuration *configuration = FindByKey(available_configurations, configuration_name.c_str()); + Configuration *configuration = this->FindConfiguration(configuration_name); assert(configuration); if (!configuration->Save(full_export_path, true)) { diff --git a/vkconfig_core/configurator.cpp b/vkconfig_core/configurator.cpp index fd34cec15e..61fd06eba4 100644 --- a/vkconfig_core/configurator.cpp +++ b/vkconfig_core/configurator.cpp @@ -186,7 +186,7 @@ void Configurator::BuildLoaderSettings(const ConfigurationInfo& info, const std: if (parameter.control == LAYER_CONTROL_APPLICATIONS_API || parameter.control == LAYER_CONTROL_APPLICATIONS_ENV) { loader_layer_settings.control = parameter.control; } else { - const Layer* layer = FindByKey(this->layers.selected_layers, parameter.key.c_str()); + const Layer* layer = this->layers.Find(parameter.key, parameter.api_version); if (layer == nullptr) { continue; } diff --git a/vkconfig_core/parameter.cpp b/vkconfig_core/parameter.cpp index 19f6d8900a..99a62d6ce4 100644 --- a/vkconfig_core/parameter.cpp +++ b/vkconfig_core/parameter.cpp @@ -55,10 +55,10 @@ bool Parameter::ApplyPresetSettings(const LayerPreset& preset) { return true; } -ParameterRank GetParameterOrdering(const std::vector& available_layers, const Parameter& parameter) { +ParameterRank GetParameterOrdering(const LayerManager& layers, const Parameter& parameter) { assert(!parameter.key.empty()); - const Layer* layer = FindByKey(available_layers, parameter.key.c_str()); + const Layer* layer = layers.Find(parameter.key, parameter.api_version); if (layer == nullptr) { return PARAMETER_RANK_MISSING; } else if (parameter.control == LAYER_CONTROL_OFF) { @@ -77,8 +77,7 @@ ParameterRank GetParameterOrdering(const std::vector& available_layers, c } } -Version ComputeMinApiVersion(const Version api_version, const std::vector& parameters, - const std::vector& layers) { +Version ComputeMinApiVersion(const Version api_version, const std::vector& parameters, const LayerManager& layers) { if (parameters.empty()) { return Version::NONE; } @@ -86,7 +85,7 @@ Version ComputeMinApiVersion(const Version api_version, const std::vector& parameters, const std::vector& layers) { +void OrderParameter(std::vector& parameters, const LayerManager& layers) { struct ParameterCompare { - ParameterCompare(const std::vector& layers) : layers(layers) {} + ParameterCompare(const LayerManager& layers) : layers(layers) {} bool operator()(const Parameter& a, const Parameter& b) const { const ParameterRank rankA = GetParameterOrdering(layers, a); @@ -132,7 +131,7 @@ void OrderParameter(std::vector& parameters, const std::vector return rankA < rankB; } - const std::vector& layers; + const LayerManager& layers; }; std::sort(parameters.begin(), parameters.end(), ParameterCompare(layers)); @@ -159,7 +158,7 @@ void FilterParameters(std::vector& parameters, const LayerControl con parameters = filtered_parameters; } -bool HasMissingLayer(const std::vector& parameters, const std::vector& layers, std::string& missing_layer) { +bool HasMissingLayer(const std::vector& parameters, const LayerManager& layers, std::string& missing_layer) { for (auto it = parameters.begin(), end = parameters.end(); it != end; ++it) { if (it->control == LAYER_CONTROL_OFF) { continue; // If excluded are missing, it doesn't matter @@ -169,7 +168,7 @@ bool HasMissingLayer(const std::vector& parameters, const std::vector continue; // If unsupported are missing, it doesn't matter } - if (!IsFound(layers, it->key.c_str())) { + if (layers.Find(it->key, it->api_version) == nullptr) { missing_layer = it->key; return true; } @@ -196,7 +195,7 @@ std::size_t CountOverriddenLayers(const std::vector& parameters) { return count; } -std::size_t CountExcludedLayers(const std::vector& parameters, const std::vector& layers) { +std::size_t CountExcludedLayers(const std::vector& parameters, const LayerManager& layers) { std::size_t count = 0; for (std::size_t i = 0, n = parameters.size(); i < n; ++i) { @@ -209,7 +208,7 @@ std::size_t CountExcludedLayers(const std::vector& parameters, const continue; } - const Layer* layer = FindByKey(layers, parameter.key.c_str()); + const Layer* layer = layers.Find(parameter.key, parameter.api_version); if (layer == nullptr) { continue; // Do not display missing excluded layers } @@ -219,38 +218,3 @@ std::size_t CountExcludedLayers(const std::vector& parameters, const return count; } - -std::vector GatherParameters(const std::vector& parameters, const LayerManager& layers) { - std::vector gathered_parameters; - - // Loop through the layers. They are expected to be in order - for (std::size_t i = 0, n = parameters.size(); i < n; ++i) { - const Parameter& parameter = parameters[i]; - assert(!parameter.key.empty()); - - gathered_parameters.push_back(parameter); - } - - const std::vector& list = layers.BuildLayerNameList(); - - for (std::size_t i = 0, n = list.size(); i < n; ++i) { - const Layer* layer = layers.Find(list[i], Version::LATEST); - - // The layer is already in the layer tree - if (IsFound(parameters, layer->key.c_str())) { - continue; - } - - Parameter parameter; - parameter.key = layer->key; - parameter.control = LAYER_CONTROL_AUTO; - parameter.api_version = Version::LATEST; - CollectDefaultSettingData(layer->settings, parameter.settings); - - gathered_parameters.push_back(parameter); - } - - // OrderParameter(gathered_parameters, available_layers); - - return gathered_parameters; -} diff --git a/vkconfig_core/parameter.h b/vkconfig_core/parameter.h index 5bf3fb0565..c1bd2424bb 100644 --- a/vkconfig_core/parameter.h +++ b/vkconfig_core/parameter.h @@ -53,13 +53,12 @@ struct Parameter { QByteArray setting_tree_state; // Recall editor tree state }; -ParameterRank GetParameterOrdering(const std::vector& available_layers, const Parameter& parameter); -Version ComputeMinApiVersion(const Version api_version, const std::vector& parameters, const std::vector& layers); -void OrderParameter(std::vector& parameters, const std::vector& layers); +ParameterRank GetParameterOrdering(const LayerManager& layers, const Parameter& parameter); +Version ComputeMinApiVersion(const Version api_version, const std::vector& parameters, const LayerManager& layers); +void OrderParameter(std::vector& parameters, const LayerManager& layers); void FilterParameters(std::vector& parameters, const LayerControl control); -std::vector GatherParameters(const std::vector& parameters, const LayerManager& layers); -bool HasMissingLayer(const std::vector& parameters, const std::vector& layers, std::string& missing_layer); +bool HasMissingLayer(const std::vector& parameters, const LayerManager& layers, std::string& missing_layer); std::size_t CountOverriddenLayers(const std::vector& parameters); -std::size_t CountExcludedLayers(const std::vector& parameters, const std::vector& layers); +std::size_t CountExcludedLayers(const std::vector& parameters, const LayerManager& layers); diff --git a/vkconfig_core/test/test_configuration.cpp b/vkconfig_core/test/test_configuration.cpp index b90d369d66..8c457dd198 100644 --- a/vkconfig_core/test/test_configuration.cpp +++ b/vkconfig_core/test/test_configuration.cpp @@ -67,7 +67,7 @@ TEST(test_configuration, load_and_save) { EXPECT_EQ(3, configuration_loaded.parameters.size()); EXPECT_TRUE(!configuration_loaded.description.empty()); - Parameter* parameter = FindByKey(configuration_loaded.parameters, "VK_LAYER_LUNARG_reference_1_2_1"); + Parameter* parameter = configuration_loaded.Find("VK_LAYER_LUNARG_reference_1_2_1"); EXPECT_TRUE(parameter != nullptr); EXPECT_EQ(LAYER_CONTROL_ON, parameter->control); diff --git a/vkconfig_core/test/test_util.cpp b/vkconfig_core/test/test_util.cpp index 24e6133548..60c97bf1a2 100644 --- a/vkconfig_core/test/test_util.cpp +++ b/vkconfig_core/test/test_util.cpp @@ -27,6 +27,35 @@ #include +template +T* FindByKey(std::vector& container, const char* key) { + assert(key != nullptr); + assert(std::strcmp(key, "") != 0); + + for (std::size_t i = 0, n = container.size(); i < n; ++i) { + if (container[i].key == key) return &container[i]; + } + + return nullptr; +} + +template +const T* FindByKey(const std::vector& container, const char* key) { + assert(key != nullptr); + assert(std::strcmp(key, "") != 0); + + for (std::size_t i = 0, n = container.size(); i < n; ++i) { + if (container[i].key == key) return &container[i]; + } + + return nullptr; +} + +template +bool IsFound(const std::vector& container, const char* key) { + return FindByKey(container, key) != nullptr; +} + TEST(test_util, format_int_1) { EXPECT_EQ("Test 1", format("Test %d", 1)); } TEST(test_util, format_strings_list) { diff --git a/vkconfig_core/util.h b/vkconfig_core/util.h index 5e94840cd5..074ae94f03 100644 --- a/vkconfig_core/util.h +++ b/vkconfig_core/util.h @@ -42,7 +42,7 @@ bool IsFrames(const std::string& s); bool IsNumber(const std::string& s); bool IsFloat(const std::string& s); - +/* template T* FindByKey(std::vector& container, const char* key) { assert(key != nullptr); @@ -66,12 +66,13 @@ const T* FindByKey(const std::vector& container, const char* key) { return nullptr; } - +*/ +/* template bool IsFound(const std::vector& container, const char* key) { return FindByKey(container, key) != nullptr; } - +*/ // Remove a value if it's present void RemoveString(std::vector& list, const std::string& value); diff --git a/vkconfig_gui/settings_tree.cpp b/vkconfig_gui/settings_tree.cpp index 325d808185..72e43c4c68 100644 --- a/vkconfig_gui/settings_tree.cpp +++ b/vkconfig_gui/settings_tree.cpp @@ -64,8 +64,10 @@ void SettingsTreeManager::CreateGUI(QComboBox *preset_combobox, QTreeWidget *bui Configuration *configuration = configurator.GetActiveConfiguration(); if (configuration == nullptr) { + preset_combobox->setVisible(false); return; } else if (configuration->selected_layer_name.empty()) { + preset_combobox->setVisible(false); return; } @@ -115,8 +117,7 @@ void SettingsTreeManager::CreateGUI(QComboBox *preset_combobox, QTreeWidget *bui this->parameter = ¶meter; - const std::vector &selected_layers = configurator.layers.selected_layers; - const Layer *layer = FindByKey(selected_layers, parameter.key.c_str()); + const Layer *layer = configurator.layers.Find(parameter.key, parameter.api_version); /* QTreeWidgetItem *layer_item = new QTreeWidgetItem(); this->tree->addTopLevelItem(layer_item); @@ -373,11 +374,12 @@ void SettingsTreeManager::BuildTreeItem(QTreeWidgetItem *parent, Parameter ¶ } void SettingsTreeManager::BuildGenericTree(Parameter ¶meter) { - std::vector &available_layers = Configurator::Get().layers.selected_layers; + Configurator &configurator = Configurator::Get(); + const Layer *layer = configurator.layers.Find(parameter.key, parameter.api_version); + assert(layer != nullptr); - const SettingMetaSet &settings = FindByKey(available_layers, parameter.key.c_str())->settings; - for (std::size_t i = 0, n = settings.size(); i < n; ++i) { - this->BuildTreeItem(nullptr, parameter, *settings[i]); + for (std::size_t i = 0, n = layer->settings.size(); i < n; ++i) { + this->BuildTreeItem(nullptr, parameter, *layer->settings[i]); } if (!parameter.setting_tree_state.isEmpty()) { diff --git a/vkconfig_gui/tab_configurations.cpp b/vkconfig_gui/tab_configurations.cpp index ef2782f595..5ef56d0b73 100644 --- a/vkconfig_gui/tab_configurations.cpp +++ b/vkconfig_gui/tab_configurations.cpp @@ -259,6 +259,7 @@ void TabConfigurations::UpdateUI_Settings(UpdateUIMode mode) { if (configurator.configurations.GetActiveConfigurationInfo() == nullptr) { this->_settings_tree_manager.CleanupGUI(); + ui->configurations_presets_comboBox->setVisible(false); } else { this->_settings_tree_manager.CreateGUI(ui->configurations_presets_comboBox, ui->configurations_settings_tree); } @@ -312,7 +313,18 @@ bool TabConfigurations::EventFilter(QObject *target, QEvent *event) { if (event_type == QEvent::ChildRemoved) { // Layers were reordered, we need to update the configuration - Configurator::Get().Override(OVERRIDE_AREA_LOADER_SETTINGS_BIT); + Configurator &configurator = Configurator::Get(); + Configuration *configuration = configurator.GetActiveConfiguration(); + + std::vector layer_names; + for (int i = 0, n = ui->configurations_layers_list->count(); i < n; ++i) { + QWidget *widget = ui->configurations_layers_list->itemWidget(ui->configurations_layers_list->item(i)); + const std::string &layer_name = static_cast(widget)->layer_name; + layer_names.push_back(layer_name); + } + configuration->Reorder(layer_names); + + configurator.Override(OVERRIDE_AREA_LOADER_SETTINGS_BIT); return true; } @@ -469,6 +481,7 @@ void TabConfigurations::OnSelectConfiguration(int currentRow) { this->UpdateUI_Configurations(UPDATE_REFRESH_UI); this->UpdateUI_LoaderMessages(); this->UpdateUI_Layers(UPDATE_REBUILD_UI); + this->UpdateUI_Settings(UPDATE_REBUILD_UI); } } @@ -656,8 +669,7 @@ void TabConfigurations::OnContextMenuResetClicked(ConfigurationListItem *item) { assert(!item->configuration_name.empty()); Configurator &configurator = Configurator::Get(); - Configuration *configuration = - FindByKey(configurator.configurations.available_configurations, item->configuration_name.c_str()); + Configuration *configuration = configurator.configurations.FindConfiguration(item->configuration_name); assert(configuration != nullptr); QMessageBox alert; diff --git a/vkconfig_gui/widget_setting_flags.cpp b/vkconfig_gui/widget_setting_flags.cpp index e47396b57b..faff74a7a4 100644 --- a/vkconfig_gui/widget_setting_flags.cpp +++ b/vkconfig_gui/widget_setting_flags.cpp @@ -29,6 +29,18 @@ #include +template +static const T* FindByKey(const std::vector& container, const char* key) { + assert(key != nullptr); + assert(std::strcmp(key, "") != 0); + + for (std::size_t i = 0, n = container.size(); i < n; ++i) { + if (container[i].key == key) return &container[i]; + } + + return nullptr; +} + WidgetSettingFlag::WidgetSettingFlag(QTreeWidget* tree, QTreeWidgetItem* item, const SettingMetaFlags& meta, SettingDataSet& data_set, const std::string& flag) : WidgetSettingBase(tree, item), meta(meta), data_set(data_set), flag(flag), field(new QCheckBox(this)) { diff --git a/vkconfig_gui/widget_tab_configurations_layer.cpp b/vkconfig_gui/widget_tab_configurations_layer.cpp index 7b02399ba3..75df1cc620 100644 --- a/vkconfig_gui/widget_tab_configurations_layer.cpp +++ b/vkconfig_gui/widget_tab_configurations_layer.cpp @@ -201,9 +201,12 @@ void ConfigurationLayerWidget::on_layer_version_currentIndexChanged(int index) { const std::string &text = this->layer_version->itemText(index).toStdString(); Version version = text == "latest" ? Version::LATEST : Version(text.c_str()); - Configuration *configuration = Configurator::Get().GetActiveConfiguration(); - Parameter *parameter = configuration->Find(this->layer_name); - parameter->api_version = version; + Configurator &configurator = Configurator::Get(); + + Configuration *configuration = configurator.GetActiveConfiguration(); + configuration->SwitchLayerVersion(configurator.layers, this->layer_name, version); + + this->tab->UpdateUI_Settings(UPDATE_REBUILD_UI); } void ConfigurationLayerWidget::on_layer_state_currentIndexChanged(int index) { diff --git a/vkconfig_gui/widget_tab_configurations_layer.h b/vkconfig_gui/widget_tab_configurations_layer.h index c7cccf7b10..d8d60041ab 100644 --- a/vkconfig_gui/widget_tab_configurations_layer.h +++ b/vkconfig_gui/widget_tab_configurations_layer.h @@ -40,6 +40,8 @@ class ConfigurationLayerWidget : public QLabel { ConfigurationLayerWidget(TabConfigurations *tab, const Parameter ¶meter, const std::vector &layer_version, bool advanced_view); + std::string layer_name; + protected: bool eventFilter(QObject *target, QEvent *event); void resizeEvent(QResizeEvent *event) override; @@ -50,7 +52,6 @@ class ConfigurationLayerWidget : public QLabel { private: TabConfigurations *tab; - std::string layer_name; QComboBox *layer_version = nullptr; QComboBox *layer_state = nullptr; diff --git a/vkconfig_gui/widget_tab_layers_path.cpp b/vkconfig_gui/widget_tab_layers_path.cpp index c05c1f9208..48986020f5 100644 --- a/vkconfig_gui/widget_tab_layers_path.cpp +++ b/vkconfig_gui/widget_tab_layers_path.cpp @@ -28,7 +28,7 @@ LayersPathWidget::LayersPathWidget(LayersPathInfo* path_info) : path_info(path_i this->setChecked(this->path_info->enabled); this->buttom_remove = new QPushButton(this); - this->buttom_remove->setText("x"); + this->buttom_remove->setText("-"); this->buttom_remove->show(); this->setText(path_info->path.RelativePath().c_str());