diff --git a/gtk/inspector/shortcuts.c b/gtk/inspector/shortcuts.c index c5627ff892..08a1a419c2 100644 --- a/gtk/inspector/shortcuts.c +++ b/gtk/inspector/shortcuts.c @@ -20,135 +20,140 @@ #include "shortcuts.h" #include "gtklabel.h" -#include "gtklistbox.h" #include "gtksizegroup.h" #include "gtkstack.h" #include "gtkshortcut.h" #include "gtkshortcuttrigger.h" #include "gtkshortcutcontroller.h" +#include "gtksignallistitemfactory.h" +#include "gtklistitem.h" +#include "gtkcolumnview.h" +#include "gtkcolumnviewcolumn.h" +#include "gtkscrolledwindow.h" +#include "gtknoselection.h" +#include "gtkbinlayout.h" + struct _GtkInspectorShortcuts { GtkWidget parent; - GtkWidget *box; - GtkWidget *list; - - GtkSizeGroup *trigger; - GtkSizeGroup *action; + GtkWidget *view; }; G_DEFINE_TYPE (GtkInspectorShortcuts, gtk_inspector_shortcuts, GTK_TYPE_WIDGET) static void -gtk_inspector_shortcuts_init (GtkInspectorShortcuts *sl) +setup_row (GtkSignalListItemFactory *factory, + GtkListItem *list_item, + gpointer data) { - gtk_widget_init_template (GTK_WIDGET (sl)); -} - -static GtkWidget * -create_row (gpointer item, - gpointer user_data) -{ - GtkShortcut *shortcut = GTK_SHORTCUT (item); - GtkInspectorShortcuts *sl = GTK_INSPECTOR_SHORTCUTS (user_data); - GtkShortcutTrigger *trigger; - GtkShortcutAction *action; - char *s; - GtkWidget *row; GtkWidget *label; + label = gtk_label_new (""); + gtk_label_set_xalign (GTK_LABEL (label), 0); + gtk_list_item_set_child (list_item, label); +} + +static void +bind_trigger (GtkSignalListItemFactory *factory, + GtkListItem *list_item, + gpointer data) +{ + GtkWidget *label; + GtkShortcut *shortcut; + GtkShortcutTrigger *trigger; + char *str; + + label = gtk_list_item_get_child (list_item); + shortcut = gtk_list_item_get_item (list_item); trigger = gtk_shortcut_get_trigger (shortcut); + str = gtk_shortcut_trigger_to_label (trigger, gtk_widget_get_display (label)); + gtk_label_set_label (GTK_LABEL (label), str); + g_free (str); +} + +static void +bind_action (GtkSignalListItemFactory *factory, + GtkListItem *list_item, + gpointer data) +{ + GtkWidget *label; + GtkShortcut *shortcut; + GtkShortcutAction *action; + char *str; + + label = gtk_list_item_get_child (list_item); + shortcut = gtk_list_item_get_item (list_item); action = gtk_shortcut_get_action (shortcut); + str = gtk_shortcut_action_to_string (action); + gtk_label_set_label (GTK_LABEL (label), str); + g_free (str); +} - row = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 10); +static void +gtk_inspector_shortcuts_init (GtkInspectorShortcuts *self) +{ + GtkWidget *sw; + GtkListItemFactory *factory; + GtkColumnViewColumn *column; - s = gtk_shortcut_trigger_to_string (trigger); - label = gtk_label_new (s); - gtk_label_set_xalign (GTK_LABEL (label), 0.0); - g_free (s); - gtk_box_append (GTK_BOX (row), label); - gtk_size_group_add_widget (sl->trigger, label); + sw = gtk_scrolled_window_new (); - s = gtk_shortcut_action_to_string (action); - label = gtk_label_new (s); - gtk_label_set_xalign (GTK_LABEL (label), 0.0); - g_free (s); - gtk_box_append (GTK_BOX (row), label); - gtk_size_group_add_widget (sl->action, label); + self->view = gtk_column_view_new (NULL); - return row; + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_row), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (bind_trigger), NULL); + + column = gtk_column_view_column_new ("Trigger", factory); + gtk_column_view_append_column (GTK_COLUMN_VIEW (self->view), column); + g_object_unref (column); + + factory = gtk_signal_list_item_factory_new (); + g_signal_connect (factory, "setup", G_CALLBACK (setup_row), NULL); + g_signal_connect (factory, "bind", G_CALLBACK (bind_action), NULL); + + column = gtk_column_view_column_new ("Action", factory); + gtk_column_view_append_column (GTK_COLUMN_VIEW (self->view), column); + g_object_unref (column); + + gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), self->view); + + gtk_widget_set_parent (sw, GTK_WIDGET (self)); } void -gtk_inspector_shortcuts_set_object (GtkInspectorShortcuts *sl, +gtk_inspector_shortcuts_set_object (GtkInspectorShortcuts *self, GObject *object) { GtkWidget *stack; GtkStackPage *page; + GtkNoSelection *no_selection; - stack = gtk_widget_get_parent (GTK_WIDGET (sl)); - page = gtk_stack_get_page (GTK_STACK (stack), GTK_WIDGET (sl)); + stack = gtk_widget_get_parent (GTK_WIDGET (self)); + page = gtk_stack_get_page (GTK_STACK (stack), GTK_WIDGET (self)); - if (GTK_IS_SHORTCUT_CONTROLLER (object)) - { - g_object_set (page, "visible", TRUE, NULL); - gtk_list_box_bind_model (GTK_LIST_BOX (sl->list), - G_LIST_MODEL (object), - create_row, - sl, - NULL); - } - else + if (!GTK_IS_SHORTCUT_CONTROLLER (object)) { + gtk_column_view_set_model (GTK_COLUMN_VIEW (self->view), NULL); g_object_set (page, "visible", FALSE, NULL); - gtk_list_box_bind_model (GTK_LIST_BOX (sl->list), - NULL, - NULL, - NULL, - NULL); + return; } -} -static void -gtk_inspector_shortcuts_measure (GtkWidget *widget, - GtkOrientation orientation, - int for_size, - int *minimum, - int *natural, - int *minimum_baseline, - int *natural_baseline) -{ - GtkInspectorShortcuts *shortcuts = GTK_INSPECTOR_SHORTCUTS (widget); + g_object_set (page, "visible", TRUE, NULL); - gtk_widget_measure (shortcuts->box, - orientation, - for_size, - minimum, natural, - minimum_baseline, natural_baseline); -} - -static void -gtk_inspector_shortcuts_size_allocate (GtkWidget *widget, - int width, - int height, - int baseline) -{ - GtkInspectorShortcuts *shortcuts = GTK_INSPECTOR_SHORTCUTS (widget); - - gtk_widget_size_allocate (shortcuts->box, - &(GtkAllocation) { 0, 0, width, height }, - baseline); + no_selection = gtk_no_selection_new (g_object_ref (G_LIST_MODEL (object))); + gtk_column_view_set_model (GTK_COLUMN_VIEW (self->view), GTK_SELECTION_MODEL (no_selection)); + g_object_unref (no_selection); } static void dispose (GObject *object) { - GtkInspectorShortcuts *shortcuts = GTK_INSPECTOR_SHORTCUTS (object); - GtkWidget *child; + GtkInspectorShortcuts *self = GTK_INSPECTOR_SHORTCUTS (object); - while ((child = gtk_widget_get_first_child (GTK_WIDGET (shortcuts)))) - gtk_widget_unparent (child); + gtk_widget_unparent (gtk_widget_get_first_child (GTK_WIDGET (self))); G_OBJECT_CLASS (gtk_inspector_shortcuts_parent_class)->dispose (object); } @@ -161,12 +166,5 @@ gtk_inspector_shortcuts_class_init (GtkInspectorShortcutsClass *klass) object_class->dispose = dispose; - widget_class->measure = gtk_inspector_shortcuts_measure; - widget_class->size_allocate = gtk_inspector_shortcuts_size_allocate; - - gtk_widget_class_set_template_from_resource (widget_class, "/org/gtk/libgtk/inspector/shortcuts.ui"); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorShortcuts, box); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorShortcuts, list); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorShortcuts, trigger); - gtk_widget_class_bind_template_child (widget_class, GtkInspectorShortcuts, action); + gtk_widget_class_set_layout_manager_type (widget_class, GTK_TYPE_BIN_LAYOUT); }