[gtk/emoji-grid: 5/5] gtk-demo: Add a sectioned grid
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/emoji-grid: 5/5] gtk-demo: Add a sectioned grid
- Date: Sat, 26 Feb 2022 02:22:21 +0000 (UTC)
commit fec7a920335bc22aabfa162ef972b4c9f9daf07e
Author: Matthias Clasen <mclasen redhat com>
Date: Fri Feb 25 21:21:14 2022 -0500
gtk-demo: Add a sectioned grid
demos/gtk-demo/demo.gresource.xml | 1 +
demos/gtk-demo/listview_emoji.c | 130 ++++++++++++++++++++++++++++++++++++++
demos/gtk-demo/meson.build | 1 +
3 files changed, 132 insertions(+)
---
diff --git a/demos/gtk-demo/demo.gresource.xml b/demos/gtk-demo/demo.gresource.xml
index 5cb524328f..11fceb3aa4 100644
--- a/demos/gtk-demo/demo.gresource.xml
+++ b/demos/gtk-demo/demo.gresource.xml
@@ -303,6 +303,7 @@
<file>listview_applauncher.c</file>
<file>listview_colors.c</file>
<file>listview_clocks.c</file>
+ <file>listview_emoji.c</file>
<file>listview_filebrowser.c</file>
<file>listview_minesweeper.c</file>
<file>listview_objects.c</file>
diff --git a/demos/gtk-demo/listview_emoji.c b/demos/gtk-demo/listview_emoji.c
new file mode 100644
index 0000000000..d8a2de0bce
--- /dev/null
+++ b/demos/gtk-demo/listview_emoji.c
@@ -0,0 +1,130 @@
+/* Lists/Emoji
+ * #Keywords: GtkListItemFactory, GtkGridView
+ *
+ * This demo uses the GtkGridView widget to show Emoji.
+ *
+ * It shows how to use sections in GtkGridView
+ */
+
+#include <gtk/gtk.h>
+
+static char *
+get_section (GtkEmojiObject *object)
+{
+ switch (gtk_emoji_object_get_group (object))
+ {
+ case GTK_EMOJI_GROUP_SMILEYS: return g_strdup ("Smileys");
+ case GTK_EMOJI_GROUP_BODY: return g_strdup ("People");
+ case GTK_EMOJI_GROUP_COMPONENT: return g_strdup ("Components");
+ case GTK_EMOJI_GROUP_NATURE: return g_strdup ("Nature");
+ case GTK_EMOJI_GROUP_FOOD: return g_strdup ("Food");
+ case GTK_EMOJI_GROUP_PLACES: return g_strdup ("Places");
+ case GTK_EMOJI_GROUP_ACTIVITIES: return g_strdup ("Activities");
+ case GTK_EMOJI_GROUP_OBJECTS: return g_strdup ("Objects");
+ case GTK_EMOJI_GROUP_SYMBOLS: return g_strdup ("Symbols");
+ case GTK_EMOJI_GROUP_FLAGS: return g_strdup ("Flags");
+ default: return g_strdup ("Something else");
+ }
+}
+
+static void
+setup_section_listitem_cb (GtkListItemFactory *factory,
+ GtkListItem *list_item)
+{
+ GtkWidget *label;
+
+ label = gtk_label_new ("");
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_widget_add_css_class (label, "heading");
+ gtk_widget_set_margin_top (label, 4);
+ gtk_widget_set_margin_bottom (label, 4);
+ gtk_list_item_set_child (list_item, label);
+}
+
+static void
+bind_section_listitem_cb (GtkListItemFactory *factory,
+ GtkListItem *list_item)
+{
+ GtkWidget *label;
+ GtkEmojiObject *item;
+ char *text;
+
+ label = gtk_list_item_get_child (list_item);
+ item = gtk_list_item_get_item (list_item);
+
+ text = get_section (item);
+ gtk_label_set_label (GTK_LABEL (label), text);
+ g_free (text);
+}
+
+static void
+setup_listitem_cb (GtkListItemFactory *factory,
+ GtkListItem *list_item)
+{
+ GtkWidget *label;
+
+ label = gtk_label_new ("");
+ gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+ gtk_list_item_set_child (list_item, label);
+}
+
+static void
+bind_listitem_cb (GtkListItemFactory *factory,
+ GtkListItem *list_item)
+{
+ GtkWidget *label;
+ GtkEmojiObject *item;
+ char buffer[64];
+
+ label = gtk_list_item_get_child (list_item);
+ item = gtk_list_item_get_item (list_item);
+
+ gtk_emoji_object_get_text (item, buffer, sizeof (buffer), 0);
+ gtk_label_set_label (GTK_LABEL (label), buffer);
+}
+
+static GtkWidget *window = NULL;
+
+GtkWidget *
+do_listview_emoji (GtkWidget *do_widget)
+{
+ if (window == NULL)
+ {
+ GtkWidget *list, *sw;
+ GListModel *model;
+ GtkListItemFactory *factory;
+
+ /* Create a window and set a few defaults */
+ window = gtk_window_new ();
+ gtk_window_set_default_size (GTK_WINDOW (window), 300, 400);
+ gtk_window_set_display (GTK_WINDOW (window),
+ gtk_widget_get_display (do_widget));
+ gtk_window_set_title (GTK_WINDOW (window), "Emoji");
+ g_object_add_weak_pointer (G_OBJECT (window), (gpointer *) &window);
+
+ factory = gtk_signal_list_item_factory_new ();
+ g_signal_connect (factory, "setup", G_CALLBACK (setup_listitem_cb), NULL);
+ g_signal_connect (factory, "bind", G_CALLBACK (bind_listitem_cb), NULL);
+
+ model = G_LIST_MODEL (gtk_emoji_list_new ());
+
+ list = gtk_grid_view_new (GTK_SELECTION_MODEL (gtk_no_selection_new (model)), factory);
+
+ factory = gtk_signal_list_item_factory_new ();
+ g_signal_connect (factory, "setup", G_CALLBACK (setup_section_listitem_cb), NULL);
+ g_signal_connect (factory, "bind", G_CALLBACK (bind_section_listitem_cb), NULL);
+ gtk_grid_view_set_section_factory (GTK_GRID_VIEW (list), factory);
+ g_object_unref (factory);
+
+ sw = gtk_scrolled_window_new ();
+ gtk_window_set_child (GTK_WINDOW (window), sw);
+ gtk_scrolled_window_set_child (GTK_SCROLLED_WINDOW (sw), list);
+ }
+
+ if (!gtk_widget_get_visible (window))
+ gtk_widget_show (window);
+ else
+ gtk_window_destroy (GTK_WINDOW (window));
+
+ return window;
+}
diff --git a/demos/gtk-demo/meson.build b/demos/gtk-demo/meson.build
index cc18609f77..b7db366998 100644
--- a/demos/gtk-demo/meson.build
+++ b/demos/gtk-demo/meson.build
@@ -52,6 +52,7 @@ demos = files([
'listview_applauncher.c',
'listview_clocks.c',
'listview_colors.c',
+ 'listview_emoji.c',
'listview_filebrowser.c',
'listview_minesweeper.c',
'listview_objects.c',
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]