[gnome-builder/wip/gtk4-port] libide/gui: use theme selector within primary menu
- From: Christian Hergert <chergert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-builder/wip/gtk4-port] libide/gui: use theme selector within primary menu
- Date: Wed, 30 Mar 2022 20:02:57 +0000 (UTC)
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]