[gtk/wip/ebassi/shortcut: 248/267] shortcutcontroller: Add gtk_shortcut_controller_new_for_model()
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/wip/ebassi/shortcut: 248/267] shortcutcontroller: Add gtk_shortcut_controller_new_for_model()
- Date: Thu, 6 Feb 2020 18:24:42 +0000 (UTC)
commit 410a2917a3e8123247064444f46f39072ebf0723
Author: Benjamin Otte <otte redhat com>
Date: Sun Aug 19 07:12:00 2018 +0200
shortcutcontroller: Add gtk_shortcut_controller_new_for_model()
This is mainly for internal use, but I can't see a reason to not have it
public for people who want to maintain their own lists.
I'm sure gnome-builder will never ever find a way to misuse it.
docs/reference/gtk/gtk4-sections.txt | 1 +
gtk/gtkshortcutcontroller.c | 67 ++++++++++++++++++++++++++++++++----
gtk/gtkshortcutcontroller.h | 2 ++
3 files changed, 64 insertions(+), 6 deletions(-)
---
diff --git a/docs/reference/gtk/gtk4-sections.txt b/docs/reference/gtk/gtk4-sections.txt
index dd5782d9f0..6287f6544f 100644
--- a/docs/reference/gtk/gtk4-sections.txt
+++ b/docs/reference/gtk/gtk4-sections.txt
@@ -6422,6 +6422,7 @@ gtk_shortcut_get_type
<TITLE>GtkShortcutController</TITLE>
GtkShortcutController
gtk_shortcut_controller_new
+gtk_shortcut_controller_new_with_model
GtkShortcutScope
GtkShortcutManager
GtkShortcutManagerInterface
diff --git a/gtk/gtkshortcutcontroller.c b/gtk/gtkshortcutcontroller.c
index 099802d456..a995cc0d24 100644
--- a/gtk/gtkshortcutcontroller.c
+++ b/gtk/gtkshortcutcontroller.c
@@ -52,6 +52,7 @@ struct _GtkShortcutController
GtkShortcutScope scope;
GdkModifierType mnemonics_modifiers;
+ guint custom_shortcuts : 1;
guint run_class : 1;
guint run_managed : 1;
};
@@ -64,6 +65,7 @@ struct _GtkShortcutControllerClass
enum {
PROP_0,
PROP_MNEMONICS_MODIFIERS,
+ PROP_MODEL,
PROP_SCOPE,
N_PROPS
@@ -131,6 +133,29 @@ gtk_shortcut_controller_set_property (GObject *object,
gtk_shortcut_controller_set_mnemonics_modifiers (self, g_value_get_flags (value));
break;
+ case PROP_MODEL:
+ {
+ GListModel *model = g_value_get_object (value);
+ if (model && g_list_model_get_item_type (model) != GTK_TYPE_SHORTCUT)
+ {
+ g_warning ("Setting a model with type '%s' on a shortcut controller that requires 'GtkShortcut'",
+ g_type_name (g_list_model_get_item_type (model)));
+ model = NULL;
+ }
+ if (model == NULL)
+ {
+ self->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
+ self->custom_shortcuts = TRUE;
+ }
+ else
+ {
+ self->shortcuts = g_object_ref (model);
+ self->custom_shortcuts = FALSE;
+ }
+ g_signal_connect_swapped (self->shortcuts, "items-changed", G_CALLBACK (g_list_model_items_changed),
self);
+ }
+ break;
+
case PROP_SCOPE:
gtk_shortcut_controller_set_scope (self, g_value_get_enum (value));
break;
@@ -168,7 +193,8 @@ gtk_shortcut_controller_dispose (GObject *object)
{
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
- g_list_store_remove_all (G_LIST_STORE (self->shortcuts));
+ if (self->custom_shortcuts)
+ g_list_store_remove_all (G_LIST_STORE (self->shortcuts));
G_OBJECT_CLASS (gtk_shortcut_controller_parent_class)->dispose (object);
}
@@ -323,6 +349,18 @@ gtk_shortcut_controller_class_init (GtkShortcutControllerClass *klass)
GDK_MOD1_MASK,
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
+ /**
+ * GtkShortcutController:model:
+ *
+ * A list model to take shortcuts from
+ */
+ properties[PROP_MODEL] =
+ g_param_spec_object ("model",
+ P_("Model"),
+ P_("A list model to take shortcuts from"),
+ G_TYPE_LIST_MODEL,
+ G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY |
G_PARAM_STATIC_STRINGS);
+
/**
* GtkShortcutController:scope:
*
@@ -343,9 +381,6 @@ static void
gtk_shortcut_controller_init (GtkShortcutController *self)
{
self->mnemonics_modifiers = GDK_MOD1_MASK;
-
- self->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
- g_signal_connect_swapped (self->shortcuts, "items-changed", G_CALLBACK (g_list_model_items_changed), self);
}
void
@@ -445,6 +480,17 @@ gtk_shortcut_controller_new (void)
NULL);
}
+GtkEventController *
+gtk_shortcut_controller_new_for_model (GListModel *model)
+{
+ g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
+ g_return_val_if_fail (g_list_model_get_item_type (model) == GTK_TYPE_SHORTCUT, NULL);
+
+ return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER,
+ "model", model,
+ NULL);
+}
+
void
gtk_shortcut_controller_set_run_class (GtkShortcutController *controller,
gboolean run_class)
@@ -466,6 +512,9 @@ gtk_shortcut_controller_set_run_managed (GtkShortcutController *controller,
*
* Adds @shortcut to the list of shortcuts handled by @self.
*
+ * If this controller uses an external shortcut list, this function does
+ * nothing.
+ *
* The shortcut is added to the list so that it is triggered before
* all existing shortcuts.
*
@@ -478,6 +527,9 @@ gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
+ if (!self->custom_shortcuts)
+ return;
+
g_list_store_append (G_LIST_STORE (self->shortcuts), shortcut);
}
@@ -488,8 +540,8 @@ gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
*
* Removes @shortcut from the list of shortcuts handled by @self.
*
- * If @shortcut had not been added to @controller, this function does
- * nothing.
+ * If @shortcut had not been added to @controller or this controller
+ * uses an external shortcut list, this function does nothing.
**/
void
gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
@@ -500,6 +552,9 @@ gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
+ if (!self->custom_shortcuts)
+ return;
+
for (i = 0; i < g_list_model_get_n_items (self->shortcuts); i++)
{
GtkShortcut *item = g_list_model_get_item (self->shortcuts, i);
diff --git a/gtk/gtkshortcutcontroller.h b/gtk/gtkshortcutcontroller.h
index 28d3362756..6f311f142b 100644
--- a/gtk/gtkshortcutcontroller.h
+++ b/gtk/gtkshortcutcontroller.h
@@ -44,6 +44,8 @@ GType gtk_shortcut_controller_get_type (void) G
GDK_AVAILABLE_IN_ALL
GtkEventController * gtk_shortcut_controller_new (void);
+GDK_AVAILABLE_IN_ALL
+GtkEventController * gtk_shortcut_controller_new_for_model (GListModel *list);
GDK_AVAILABLE_IN_ALL
void gtk_shortcut_controller_set_mnemonics_modifiers (GtkShortcutController *self,
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]