Browse Source

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.
Sam Atkins 3 years ago
parent
commit
b51d2fee05

+ 22 - 0
Userland/Applications/ThemeEditor/ThemeEditor.gml

@@ -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]

+ 51 - 3
Userland/Applications/ThemeEditor/main.cpp

@@ -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));