ThemeEditor: Add support for FlagRoles

The GUI for this is a bit odd, especially since we only have one flag,
but otherwise adding new flags would require modifying ThemeEditor. At
least it is consistent with the other theme properties.
This commit is contained in:
Sam Atkins 2021-11-01 16:51:18 +00:00 committed by Andreas Kling
parent f22043a225
commit b51d2fee05
2 changed files with 73 additions and 3 deletions

View file

@ -25,6 +25,28 @@
}
}
@GUI::GroupBox {
layout: @GUI::HorizontalBoxLayout {
margins: [16, 8, 8, 8]
}
shrink_to_fit: true
title: "Flags"
@GUI::ComboBox {
name: "flag_combo_box"
model_only: true
fixed_width: 230
}
@GUI::Widget {
}
@GUI::CheckBox {
name: "flag_input"
fixed_width: 13
}
}
@GUI::GroupBox {
layout: @GUI::HorizontalBoxLayout {
margins: [16, 8, 8, 8]

View file

@ -14,6 +14,7 @@
#include <LibGUI/Application.h>
#include <LibGUI/BoxLayout.h>
#include <LibGUI/Button.h>
#include <LibGUI/CheckBox.h>
#include <LibGUI/ColorInput.h>
#include <LibGUI/ComboBox.h>
#include <LibGUI/FilePicker.h>
@ -44,6 +45,24 @@ public:
}
};
class FlagRoleModel final : public GUI::ItemListModel<Gfx::FlagRole> {
public:
explicit FlagRoleModel(Vector<Gfx::FlagRole> const& data)
: ItemListModel<Gfx::FlagRole>(data)
{
}
virtual GUI::Variant data(GUI::ModelIndex const& index, GUI::ModelRole role) const override
{
if (role == GUI::ModelRole::Display)
return Gfx::to_string(m_data[(size_t)index.row()]);
if (role == GUI::ModelRole::Custom)
return m_data[(size_t)index.row()];
return ItemListModel::data(index, role);
}
};
class MetricRoleModel final : public GUI::ItemListModel<Gfx::MetricRole> {
public:
explicit MetricRoleModel(Vector<Gfx::MetricRole> const& data)
@ -54,7 +73,7 @@ public:
virtual GUI::Variant data(GUI::ModelIndex const& index, GUI::ModelRole role) const override
{
if (role == GUI::ModelRole::Display)
return Gfx::to_string(static_cast<Gfx::MetricRole>(m_data[(size_t)index.row()]));
return Gfx::to_string(m_data[(size_t)index.row()]);
if (role == GUI::ModelRole::Custom)
return m_data[(size_t)index.row()];
@ -72,7 +91,7 @@ public:
virtual GUI::Variant data(GUI::ModelIndex const& index, GUI::ModelRole role) const override
{
if (role == GUI::ModelRole::Display)
return Gfx::to_string(static_cast<Gfx::PathRole>(m_data[(size_t)index.row()]));
return Gfx::to_string(m_data[(size_t)index.row()]);
if (role == GUI::ModelRole::Custom)
return m_data[(size_t)index.row()];
@ -139,6 +158,11 @@ int main(int argc, char** argv)
ENUMERATE_COLOR_ROLES(__ENUMERATE_COLOR_ROLE)
#undef __ENUMERATE_COLOR_ROLE
Vector<Gfx::FlagRole> flag_roles;
#define __ENUMERATE_FLAG_ROLE(role) flag_roles.append(Gfx::FlagRole::role);
ENUMERATE_FLAG_ROLES(__ENUMERATE_FLAG_ROLE)
#undef __ENUMERATE_FLAG_ROLE
Vector<Gfx::MetricRole> metric_roles;
#define __ENUMERATE_METRIC_ROLE(role) metric_roles.append(Gfx::MetricRole::role);
ENUMERATE_METRIC_ROLES(__ENUMERATE_METRIC_ROLE)
@ -156,6 +180,8 @@ int main(int argc, char** argv)
->add<ThemeEditor::PreviewWidget>(startup_preview_palette);
auto& color_combo_box = *main_widget.find_descendant_of_type_named<GUI::ComboBox>("color_combo_box");
auto& color_input = *main_widget.find_descendant_of_type_named<GUI::ColorInput>("color_input");
auto& flag_combo_box = *main_widget.find_descendant_of_type_named<GUI::ComboBox>("flag_combo_box");
auto& flag_input = *main_widget.find_descendant_of_type_named<GUI::CheckBox>("flag_input");
auto& metric_combo_box = *main_widget.find_descendant_of_type_named<GUI::ComboBox>("metric_combo_box");
auto& metric_input = *main_widget.find_descendant_of_type_named<GUI::SpinBox>("metric_input");
auto& path_combo_box = *main_widget.find_descendant_of_type_named<GUI::ComboBox>("path_combo_box");
@ -177,6 +203,21 @@ int main(int argc, char** argv)
};
color_input.set_color(startup_preview_palette.color(Gfx::ColorRole::Window));
flag_combo_box.set_model(adopt_ref(*new FlagRoleModel(flag_roles)));
flag_combo_box.on_change = [&](auto&, auto& index) {
auto role = index.model()->data(index, GUI::ModelRole::Custom).to_flag_role();
flag_input.set_checked(preview_widget.preview_palette().flag(role), GUI::AllowCallback::No);
};
flag_combo_box.set_selected_index((size_t)Gfx::FlagRole::IsDark - 1);
flag_input.on_checked = [&](bool checked) {
auto role = flag_combo_box.model()->index(flag_combo_box.selected_index()).data(GUI::ModelRole::Custom).to_flag_role();
auto preview_palette = preview_widget.preview_palette();
preview_palette.set_flag(role, checked);
preview_widget.set_preview_palette(preview_palette);
};
flag_input.set_checked(startup_preview_palette.flag(Gfx::FlagRole::IsDark), GUI::AllowCallback::No);
metric_combo_box.set_model(adopt_ref(*new MetricRoleModel(metric_roles)));
metric_combo_box.on_change = [&](auto&, auto& index) {
auto role = index.model()->data(index, GUI::ModelRole::Custom).to_metric_role();
@ -231,6 +272,9 @@ int main(int argc, char** argv)
auto selected_color_role = color_combo_box.model()->index(color_combo_box.selected_index()).data(GUI::ModelRole::Custom).to_color_role();
color_input.set_color(preview_widget.preview_palette().color(selected_color_role));
auto selected_flag_role = flag_combo_box.model()->index(flag_combo_box.selected_index()).data(GUI::ModelRole::Custom).to_flag_role();
flag_input.set_checked(preview_widget.preview_palette().flag(selected_flag_role), GUI::AllowCallback::No);
auto selected_metric_role = metric_combo_box.model()->index(metric_combo_box.selected_index()).data(GUI::ModelRole::Custom).to_metric_role();
metric_input.set_value(preview_widget.preview_palette().metric(selected_metric_role), GUI::AllowCallback::No);
@ -250,6 +294,10 @@ int main(int argc, char** argv)
theme->write_entry("Colors", to_string(role), preview_widget.preview_palette().color(role).to_string());
}
for (auto role : flag_roles) {
theme->write_bool_entry("Flags", to_string(role), preview_widget.preview_palette().flag(role));
}
for (auto role : metric_roles) {
theme->write_num_entry("Metrics", to_string(role), preview_widget.preview_palette().metric(role));
}
@ -289,7 +337,7 @@ int main(int argc, char** argv)
update_window_title();
window->resize(480, 500);
window->resize(480, 520);
window->set_resizable(false);
window->show();
window->set_icon(app_icon.bitmap_for_size(16));