[gnome-builder/wip/gtk4-port] libide/gui: use theme selector within primary menu



commit 6c4542d45cb846c801144547f330e01d1463e866
Author: Christian Hergert <chergert redhat com>
Date:   Wed Mar 30 13:02:31 2022 -0700

    libide/gui: use theme selector within primary menu
    
    We can also finally remove dayhack/nighthack actions now that the toggle
    is quick and accessible from the menu. We can always add commands for them
    later when we land the new global search/command palette.

 data/gsettings/org.gnome.builder.gschema.xml |  4 ++--
 src/libide/gui/gtk/menus.ui                  |  5 ++++
 src/libide/gui/ide-application-actions.c     | 29 ++++------------------
 src/libide/gui/ide-application-color.c       | 12 ++++++++--
 src/libide/gui/ide-header-bar.c              | 36 ++++++++++++++++++++++++++++
 5 files changed, 58 insertions(+), 28 deletions(-)
---
diff --git a/data/gsettings/org.gnome.builder.gschema.xml b/data/gsettings/org.gnome.builder.gschema.xml
index fcc44bc7d..c9b2a1b4b 100644
--- a/data/gsettings/org.gnome.builder.gschema.xml
+++ b/data/gsettings/org.gnome.builder.gschema.xml
@@ -12,11 +12,11 @@
     </key>
     <key name="style-variant" type="s">
       <choices>
-        <choice value="follow"/>
+        <choice value="default"/>
         <choice value="light"/>
         <choice value="dark"/>
       </choices>
-      <default>'follow'</default>
+      <default>'default'</default>
       <summary>Style Variant</summary>
       <description>Use the light or dark variant of the GTK theme and/or GtkSourceView style 
scheme.</description>
     </key>
diff --git a/src/libide/gui/gtk/menus.ui b/src/libide/gui/gtk/menus.ui
index d9af95591..b2033aa0e 100644
--- a/src/libide/gui/gtk/menus.ui
+++ b/src/libide/gui/gtk/menus.ui
@@ -1,6 +1,11 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <interface>
   <menu id="ide-primary-workspace-menu">
+    <section id="ide-primary-workspace-menu-theme-section">
+      <item>
+        <attribute name="custom">theme_selector</attribute>
+      </item>
+    </section>
     <section id="ide-primary-workspace-menu-projects-section"/>
     <section id="ide-primary-workspace-menu-placeholder1"/>
     <section id="ide-primary-workspace-menu-placeholder2"/>
diff --git a/src/libide/gui/ide-application-actions.c b/src/libide/gui/ide-application-actions.c
index 275f0b9b6..36f9e560d 100644
--- a/src/libide/gui/ide-application-actions.c
+++ b/src/libide/gui/ide-application-actions.c
@@ -249,28 +249,6 @@ ide_application_actions_help (GSimpleAction *action,
   IDE_EXIT;
 }
 
-static void
-ide_application_actions_nighthack (GSimpleAction *action,
-                                   GVariant      *variant,
-                                   gpointer       user_data)
-{
-  g_autoptr(GSettings) settings = NULL;
-
-  settings = g_settings_new ("org.gnome.builder");
-  g_settings_set_string (settings, "style-variant", "dark");
-}
-
-static void
-ide_application_actions_dayhack (GSimpleAction *action,
-                                 GVariant      *variant,
-                                 gpointer       user_data)
-{
-  g_autoptr(GSettings) settings = NULL;
-
-  settings = g_settings_new ("org.gnome.builder");
-  g_settings_set_string (settings, "style-variant", "light");
-}
-
 static void
 ide_application_actions_load_project (GSimpleAction *action,
                                       GVariant      *args,
@@ -372,8 +350,6 @@ ide_application_actions_stats (GSimpleAction *action,
 static const GActionEntry IdeApplicationActions[] = {
   { "about:types",  ide_application_actions_stats },
   { "about",        ide_application_actions_about },
-  { "dayhack",      ide_application_actions_dayhack },
-  { "nighthack",    ide_application_actions_nighthack },
   { "load-project", ide_application_actions_load_project, "s"},
   { "preferences",  ide_application_actions_preferences },
   { "quit",         ide_application_actions_quit },
@@ -383,6 +359,8 @@ static const GActionEntry IdeApplicationActions[] = {
 void
 _ide_application_init_actions (IdeApplication *self)
 {
+  g_autoptr(GAction) style_action = NULL;
+
   g_assert (IDE_IS_MAIN_THREAD ());
   g_assert (IDE_IS_APPLICATION (self));
 
@@ -390,6 +368,9 @@ _ide_application_init_actions (IdeApplication *self)
                                    IdeApplicationActions,
                                    G_N_ELEMENTS (IdeApplicationActions),
                                    self);
+
+  style_action = g_settings_create_action (self->settings, "style-variant");
+  g_action_map_add_action (G_ACTION_MAP (self), style_action);
 }
 
 static void
diff --git a/src/libide/gui/ide-application-color.c b/src/libide/gui/ide-application-color.c
index e631e8ab3..0f42e698a 100644
--- a/src/libide/gui/ide-application-color.c
+++ b/src/libide/gui/ide-application-color.c
@@ -110,9 +110,11 @@ _ide_application_update_color (IdeApplication *self)
   style_variant = g_settings_get_string (self->settings, "style-variant");
   manager = adw_style_manager_get_default ();
 
-  if (!g_strcmp0 (style_variant, "follow"))
+  g_debug ("Style variant changed to %s", style_variant);
+
+  if (g_strcmp0 (style_variant, "follow") == 0)
     adw_style_manager_set_color_scheme (manager, ADW_COLOR_SCHEME_PREFER_LIGHT);
-  else if (!g_strcmp0 (style_variant, "dark"))
+  else if (g_strcmp0 (style_variant, "dark") == 0)
     adw_style_manager_set_color_scheme (manager, ADW_COLOR_SCHEME_FORCE_DARK);
   else
     adw_style_manager_set_color_scheme (manager, ADW_COLOR_SCHEME_FORCE_LIGHT);
@@ -156,6 +158,12 @@ _ide_application_init_color (IdeApplication *self)
 
   if (g_getenv ("GTK_THEME") == NULL)
     {
+      g_autofree char *style_variant = NULL;
+
+      /* We must read "style-variant" to get changed notifications */
+      style_variant = g_settings_get_string (self->settings, "style-variant");
+      g_debug ("Initialized with style-variant %s", style_variant);
+
       g_signal_connect_object (self->settings,
                                "changed::style-variant",
                                G_CALLBACK (_ide_application_update_color),
diff --git a/src/libide/gui/ide-header-bar.c b/src/libide/gui/ide-header-bar.c
index 9a283a20f..a0b320554 100644
--- a/src/libide/gui/ide-header-bar.c
+++ b/src/libide/gui/ide-header-bar.c
@@ -165,6 +165,33 @@ ide_header_bar_get_menu_id (IdeHeaderBar *self)
   return priv->menu_id;
 }
 
+static gboolean
+menu_has_custom (GMenuModel *model,
+                 const char *name)
+{
+  guint n_items;
+
+  if (model == NULL || name == NULL)
+    return FALSE;
+
+  n_items = g_menu_model_get_n_items (model);
+  for (int i = 0; i < n_items; i++)
+    {
+      g_autofree char *custom = NULL;
+      g_autoptr(GMenuModel) section = NULL;
+
+      if (g_menu_model_get_item_attribute (model, i, "custom", "s", &custom) &&
+          g_strcmp0 (custom, name) == 0)
+        return TRUE;
+
+      if ((section = g_menu_model_get_item_link (model, i, G_MENU_LINK_SECTION)) &&
+          menu_has_custom (section, name))
+        return TRUE;
+    }
+
+  return FALSE;
+}
+
 /**
  * ide_header_bar_set_menu_id:
  * @self: a #IdeHeaderBar
@@ -185,6 +212,7 @@ ide_header_bar_set_menu_id (IdeHeaderBar *self,
 
   if (!ide_str_equal0 (menu_id, priv->menu_id))
     {
+      GtkPopover *popover;
       GMenu *menu = NULL;
 
       g_free (priv->menu_id);
@@ -196,6 +224,14 @@ ide_header_bar_set_menu_id (IdeHeaderBar *self,
       g_object_set (priv->menu_button, "menu-model", menu, NULL);
       gtk_widget_set_visible (GTK_WIDGET (priv->menu_button), !ide_str_empty0 (menu_id));
 
+      popover = gtk_menu_button_get_popover (priv->menu_button);
+      if (menu_has_custom (G_MENU_MODEL (menu), "theme_selector"))
+        gtk_popover_menu_add_child (GTK_POPOVER_MENU (popover),
+                                    g_object_new (PANEL_TYPE_THEME_SELECTOR,
+                                                  "action-name", "app.style-variant",
+                                                  NULL),
+                                    "theme_selector");
+
       g_object_notify_by_pspec (G_OBJECT (self), properties [PROP_MENU_ID]);
     }
 }


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]