Added _fiction_ resizing for correct MainFrame rendering after DPI changed_object

+ Added a calculation of a empty bitmaps inside presets in respect to em_unit (to avoid assert)
 + Added scaling for PrintHostDialogs and MsgDialog
 + some code refactoring
This commit is contained in:
YuSanka 2019-04-23 16:33:06 +02:00
parent 5e45cff855
commit aa147482b7
11 changed files with 73 additions and 42 deletions

View File

@ -258,12 +258,6 @@ bool MainFrame::can_delete_all() const
void MainFrame::on_dpi_changed(const wxRect &suggested_rect) void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
{ {
// const float old_sc_factor = prev_scale_factor();
// const float new_sc_factor = scale_factor();
//
// printf("old_sc_factor: %.2f \n", old_sc_factor);
// printf("new_sc_factor: %.2f\n\n", new_sc_factor);
wxGetApp().update_fonts(); wxGetApp().update_fonts();
// _strange_ workaround for correct em_unit calculation // _strange_ workaround for correct em_unit calculation
@ -281,6 +275,13 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
// update Tabs // update Tabs
for (auto tab : wxGetApp().tabs_list) for (auto tab : wxGetApp().tabs_list)
tab->rescale(); tab->rescale();
/* To correct window rendering (especially redraw of a status bar)
* we should imitate window resizing.
*/
const wxSize& sz = this->GetSize();
this->SetSize(sz.x + 1, sz.y + 1);
this->SetSize(sz);
} }
void MainFrame::init_menubar() void MainFrame::init_menubar()

View File

@ -25,12 +25,14 @@ namespace GUI {
MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxWindowID button_id, wxBitmap bitmap) MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &headline, wxWindowID button_id, wxBitmap bitmap)
: wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) : wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, boldfont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)) , boldfont(wxGetApp().normal_font()/*wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT)*/)
, content_sizer(new wxBoxSizer(wxVERTICAL)) , content_sizer(new wxBoxSizer(wxVERTICAL))
, btn_sizer(new wxBoxSizer(wxHORIZONTAL)) , btn_sizer(new wxBoxSizer(wxHORIZONTAL))
{ {
boldfont.SetWeight(wxFONTWEIGHT_BOLD); boldfont.SetWeight(wxFONTWEIGHT_BOLD);
this->SetFont(wxGetApp().normal_font());
auto *topsizer = new wxBoxSizer(wxHORIZONTAL); auto *topsizer = new wxBoxSizer(wxHORIZONTAL);
auto *rightsizer = new wxBoxSizer(wxVERTICAL); auto *rightsizer = new wxBoxSizer(wxVERTICAL);

View File

@ -235,7 +235,8 @@ void SlicedInfo::SetTextAndShow(SlisedInfoIdx idx, const wxString& text, const w
PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) : PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) :
wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), 0, nullptr, wxCB_READONLY), wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), 0, nullptr, wxCB_READONLY),
preset_type(preset_type), preset_type(preset_type),
last_selected(wxNOT_FOUND) last_selected(wxNOT_FOUND),
m_em_unit(wxGetApp().em_unit())
{ {
Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) { Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) {
auto selected_item = this->GetSelection(); auto selected_item = this->GetSelection();
@ -280,7 +281,7 @@ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, wxSize(15 *
cfg.set_key_value("extruder_colour", colors); cfg.set_key_value("extruder_colour", colors);
wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg); wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg);
wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this, wxGetApp().em_unit()); wxGetApp().preset_bundle->update_platter_filament_ui(extruder_idx, this);
wxGetApp().plater()->on_config_change(cfg); wxGetApp().plater()->on_config_change(cfg);
} }
dialog->Destroy(); dialog->Destroy();
@ -340,8 +341,7 @@ void PresetComboBox::check_selection()
void PresetComboBox::rescale() void PresetComboBox::rescale()
{ {
// update min control's height from new scaled size m_em_unit = wxGetApp().em_unit();
this->SetMinSize(wxSize(20*wxGetApp().em_unit(), this->GetSize().GetHeight()));
edit_btn->rescale(); edit_btn->rescale();
} }
@ -798,8 +798,6 @@ void Sidebar::update_all_preset_comboboxes()
PresetBundle &preset_bundle = *wxGetApp().preset_bundle; PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
const auto print_tech = preset_bundle.printers.get_edited_preset().printer_technology(); const auto print_tech = preset_bundle.printers.get_edited_preset().printer_technology();
// wxWindowUpdateLocker noUpdates_scrolled(p->scrolled);
// Update the print choosers to only contain the compatible presets, update the dirty flags. // Update the print choosers to only contain the compatible presets, update the dirty flags.
if (print_tech == ptFFF) if (print_tech == ptFFF)
preset_bundle.prints.update_platter_ui(p->combo_print); preset_bundle.prints.update_platter_ui(p->combo_print);
@ -813,9 +811,8 @@ void Sidebar::update_all_preset_comboboxes()
// update the dirty flags. // update the dirty flags.
if (print_tech == ptFFF) { if (print_tech == ptFFF) {
for (size_t i = 0; i < p->combos_filament.size(); ++i) for (size_t i = 0; i < p->combos_filament.size(); ++i)
preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
} }
p->show_preset_comboboxes();
} }
void Sidebar::update_presets(Preset::Type preset_type) void Sidebar::update_presets(Preset::Type preset_type)
@ -837,7 +834,7 @@ void Sidebar::update_presets(Preset::Type preset_type)
} }
for (size_t i = 0; i < filament_cnt; i++) { for (size_t i = 0; i < filament_cnt; i++) {
preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); preset_bundle.update_platter_filament_ui(i, p->combos_filament[i]);
} }
break; break;
@ -874,8 +871,8 @@ void Sidebar::update_presets(Preset::Type preset_type)
// for (size_t i = 0; i < p->combos_filament.size(); ++ i) // for (size_t i = 0; i < p->combos_filament.size(); ++ i)
// preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit()); // preset_bundle.update_platter_filament_ui(i, p->combos_filament[i], wxGetApp().em_unit());
// } // }
// p->show_preset_comboboxes();
update_all_preset_comboboxes(); update_all_preset_comboboxes();
p->show_preset_comboboxes();
break; break;
} }
@ -905,19 +902,18 @@ void Sidebar::rescale()
p->mode_sizer->rescale(); p->mode_sizer->rescale();
// first of all : recreate preset comboboxes, because of // Rescale preset comboboxes in respect to the current em_unit ...
// in AddBitmap() function autonaticaly set the size of controll
update_all_preset_comboboxes();
// then rescale them to current min size to correct layout of the sidebar
for (PresetComboBox* combo : std::vector<PresetComboBox*> { p->combo_print, for (PresetComboBox* combo : std::vector<PresetComboBox*> { p->combo_print,
p->combo_sla_print, p->combo_sla_print,
p->combo_sla_material, p->combo_sla_material,
p->combo_printer } ) p->combo_printer } )
combo->rescale(); combo->rescale();
for (PresetComboBox* combo : p->combos_filament) for (PresetComboBox* combo : p->combos_filament)
combo->rescale(); combo->rescale();
// ... then refill them and set min size to correct layout of the sidebar
update_all_preset_comboboxes();
p->frequently_changed_parameters->get_og(true)->rescale(); p->frequently_changed_parameters->get_og(true)->rescale();
p->frequently_changed_parameters->get_og(false)->rescale(); p->frequently_changed_parameters->get_og(false)->rescale();
@ -2669,7 +2665,7 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
// TODO: ? // TODO: ?
if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) { if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) {
// Only update the platter UI for the 2nd and other filaments. // Only update the platter UI for the 2nd and other filaments.
wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo, wxGetApp().em_unit()); wxGetApp().preset_bundle->update_platter_filament_ui(idx, combo);
} }
else { else {
wxWindowUpdateLocker noUpdates(sidebar->presets_panel()); wxWindowUpdateLocker noUpdates(sidebar->presets_panel());
@ -3650,7 +3646,7 @@ void Plater::on_extruders_change(int num_extruders)
choices.push_back(choice); choices.push_back(choice);
// initialize selection // initialize selection
wxGetApp().preset_bundle->update_platter_filament_ui(i, choice, wxGetApp().em_unit()); wxGetApp().preset_bundle->update_platter_filament_ui(i, choice);
++i; ++i;
} }

View File

@ -57,6 +57,7 @@ public:
void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER); void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER);
void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; } void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; }
int get_extruder_idx() const { return extruder_idx; } int get_extruder_idx() const { return extruder_idx; }
int em_unit() const { return m_em_unit; }
void check_selection(); void check_selection();
void rescale(); void rescale();
@ -67,6 +68,7 @@ private:
Preset::Type preset_type; Preset::Type preset_type;
int last_selected; int last_selected;
int extruder_idx = -1; int extruder_idx = -1;
int m_em_unit;
}; };
class Sidebar : public wxPanel class Sidebar : public wxPanel

View File

@ -914,6 +914,16 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
// and draw a red flag in front of the selected preset. // and draw a red flag in front of the selected preset.
bool wide_icons = ! selected_preset.is_compatible && m_bitmap_incompatible != nullptr; bool wide_icons = ! selected_preset.is_compatible && m_bitmap_incompatible != nullptr;
/* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
* So set sizes for solid_colored icons used for filament preset
* and scale them in respect to em_unit value
*/
const float scale_f = ui->em_unit() * 0.1f;
const int icon_height = 16 * scale_f + 0.5f;
const int icon_width = 16 * scale_f + 0.5f;
const int thin_space_icon_width = 4 * scale_f + 0.5f;
const int wide_space_icon_width = 6 * scale_f + 0.5f;
std::map<wxString, wxBitmap*> nonsys_presets; std::map<wxString, wxBitmap*> nonsys_presets;
wxString selected = ""; wxString selected = "";
if (!this->m_presets.front().is_visible) if (!this->m_presets.front().is_visible)
@ -934,13 +944,13 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
std::vector<wxBitmap> bmps; std::vector<wxBitmap> bmps;
if (wide_icons) if (wide_icons)
// Paint a red flag for incompatible presets. // Paint a red flag for incompatible presets.
bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(16, 16) : *m_bitmap_incompatible); bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(icon_width, icon_height) : *m_bitmap_incompatible);
// Paint the color bars. // Paint the color bars.
bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
bmps.emplace_back(*m_bitmap_main_frame); bmps.emplace_back(*m_bitmap_main_frame);
// Paint a lock at the system presets. // Paint a lock at the system presets.
bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
bmp = m_bitmap_cache->insert(bitmap_key, bmps); bmp = m_bitmap_cache->insert(bitmap_key, bmps);
} }
@ -981,12 +991,12 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
std::vector<wxBitmap> bmps; std::vector<wxBitmap> bmps;
if (wide_icons) if (wide_icons)
// Paint a red flag for incompatible presets. // Paint a red flag for incompatible presets.
bmps.emplace_back(m_bitmap_cache->mkclear(16, 16)); bmps.emplace_back(m_bitmap_cache->mkclear(icon_width, icon_height));
// Paint the color bars. // Paint the color bars.
bmps.emplace_back(m_bitmap_cache->mkclear(4, 16)); bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
bmps.emplace_back(*m_bitmap_main_frame); bmps.emplace_back(*m_bitmap_main_frame);
// Paint a lock at the system presets. // Paint a lock at the system presets.
bmps.emplace_back(m_bitmap_cache->mkclear(6, 16)); bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap); bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap);
bmp = m_bitmap_cache->insert(bitmap_key, bmps); bmp = m_bitmap_cache->insert(bitmap_key, bmps);
} }
@ -996,10 +1006,14 @@ void PresetCollection::update_platter_ui(GUI::PresetComboBox *ui)
ui->SetSelection(selected_preset_item); ui->SetSelection(selected_preset_item);
ui->SetToolTip(ui->GetString(selected_preset_item)); ui->SetToolTip(ui->GetString(selected_preset_item));
ui->check_selection(); ui->check_selection();
ui->Thaw(); ui->Thaw();
// Update control min size after rescale (changed Display DPI under MSW)
if (ui->GetMinWidth() != 20 * ui->em_unit())
ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
} }
size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible) size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em/* = 10*/)
{ {
if (ui == nullptr) if (ui == nullptr)
return 0; return 0;
@ -1007,6 +1021,14 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati
ui->Clear(); ui->Clear();
size_t selected_preset_item = 0; size_t selected_preset_item = 0;
/* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
* So set sizes for solid_colored(empty) icons used for preset
* and scale them in respect to em_unit value
*/
const float scale_f = em * 0.1f;
const int icon_height = 16 * scale_f + 0.5f;
const int icon_width = 16 * scale_f + 0.5f;
std::map<wxString, wxBitmap*> nonsys_presets; std::map<wxString, wxBitmap*> nonsys_presets;
wxString selected = ""; wxString selected = "";
if (!this->m_presets.front().is_visible) if (!this->m_presets.front().is_visible)
@ -1025,7 +1047,7 @@ size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompati
const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible; const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible;
bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp); bmps.emplace_back((tmp_bmp == 0) ? (m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap) : *tmp_bmp);
// Paint a lock at the system presets. // Paint a lock at the system presets.
bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(16, 16)); bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
bmp = m_bitmap_cache->insert(bitmap_key, bmps); bmp = m_bitmap_cache->insert(bitmap_key, bmps);
} }

View File

@ -394,7 +394,7 @@ public:
// Update the choice UI from the list of presets. // Update the choice UI from the list of presets.
// If show_incompatible, all presets are shown, otherwise only the compatible presets are shown. // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown.
// If an incompatible preset is selected, it is shown as well. // If an incompatible preset is selected, it is shown as well.
size_t update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible); size_t update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em = 10);
// Update the choice UI from the list of presets. // Update the choice UI from the list of presets.
// Only the compatible presets are shown. // Only the compatible presets are shown.
// If an incompatible preset is selected, it is shown as well. // If an incompatible preset is selected, it is shown as well.

View File

@ -1451,7 +1451,7 @@ void PresetBundle::load_default_preset_bitmaps(wxWindow *window)
this->load_compatible_bitmaps(window); this->load_compatible_bitmaps(window);
} }
void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em/* = 10*/) void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui)
{ {
if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA || if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA ||
this->filament_presets.size() <= idx_extruder ) this->filament_presets.size() <= idx_extruder )
@ -1479,9 +1479,9 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
/* It's supposed that standard size of an icon is 16px*16px for 100% scaled display. /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
* So set sizes for solid_colored icons used for filament preset * So set sizes for solid_colored icons used for filament preset
* and scale then in respect to em_unit value * and scale them in respect to em_unit value
*/ */
const float scale_f = em * 0.1f; const float scale_f = ui->em_unit() * 0.1f;
const int icon_height = 16 * scale_f + 0.5f; const int icon_height = 16 * scale_f + 0.5f;
const int normal_icon_width = 16 * scale_f + 0.5f; const int normal_icon_width = 16 * scale_f + 0.5f;
const int space_icon_width = 2 * scale_f + 0.5f; const int space_icon_width = 2 * scale_f + 0.5f;
@ -1556,6 +1556,10 @@ void PresetBundle::update_platter_filament_ui(unsigned int idx_extruder, GUI::Pr
ui->SetToolTip(ui->GetString(selected_preset_item)); ui->SetToolTip(ui->GetString(selected_preset_item));
ui->check_selection(); ui->check_selection();
ui->Thaw(); ui->Thaw();
// Update control min size after rescale (changed Display DPI under MSW)
if (ui->GetMinWidth() != 20 * ui->em_unit())
ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
} }
void PresetBundle::set_default_suppressed(bool default_suppressed) void PresetBundle::set_default_suppressed(bool default_suppressed)

View File

@ -107,7 +107,7 @@ public:
void export_configbundle(const std::string &path, bool export_system_settings = false); void export_configbundle(const std::string &path, bool export_system_settings = false);
// Update a filament selection combo box on the platter for an idx_extruder. // Update a filament selection combo box on the platter for an idx_extruder.
void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui, const int em = 10); void update_platter_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui);
// Enable / disable the "- default -" preset. // Enable / disable the "- default -" preset.
void set_default_suppressed(bool default_suppressed); void set_default_suppressed(bool default_suppressed);

View File

@ -131,7 +131,7 @@ wxEvent *PrintHostQueueDialog::Event::Clone() const
} }
PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent) PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent)
: wxDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) : DPIDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, on_progress_evt(this, EVT_PRINTHOST_PROGRESS, &PrintHostQueueDialog::on_progress, this) , on_progress_evt(this, EVT_PRINTHOST_PROGRESS, &PrintHostQueueDialog::on_progress, this)
, on_error_evt(this, EVT_PRINTHOST_ERROR, &PrintHostQueueDialog::on_error, this) , on_error_evt(this, EVT_PRINTHOST_ERROR, &PrintHostQueueDialog::on_error, this)
, on_cancel_evt(this, EVT_PRINTHOST_CANCEL, &PrintHostQueueDialog::on_cancel, this) , on_cancel_evt(this, EVT_PRINTHOST_CANCEL, &PrintHostQueueDialog::on_cancel, this)

View File

@ -41,7 +41,7 @@ private:
}; };
class PrintHostQueueDialog : public wxDialog class PrintHostQueueDialog : public DPIDialog
{ {
public: public:
class Event : public wxEvent class Event : public wxEvent
@ -62,6 +62,10 @@ public:
PrintHostQueueDialog(wxWindow *parent); PrintHostQueueDialog(wxWindow *parent);
void append_job(const PrintHostJob &job); void append_job(const PrintHostJob &job);
protected:
void on_dpi_changed(const wxRect &suggested_rect) override { Refresh(); }
private: private:
enum Column { enum Column {
COL_ID, COL_ID,

View File

@ -713,7 +713,7 @@ void Tab::update_dirty()
void Tab::update_tab_ui() void Tab::update_tab_ui()
{ {
m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets); m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets, m_em_unit);
} }
// Load a provied DynamicConfig into the tab, modifying the active preset. // Load a provied DynamicConfig into the tab, modifying the active preset.