[libadwaita/wip/exalm/tab-overview: 5/7] demo: Extract tab view pages into a separate class
- From: Alexander Mikhaylenko <alexm src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [libadwaita/wip/exalm/tab-overview: 5/7] demo: Extract tab view pages into a separate class
- Date: Thu, 8 Sep 2022 03:16:42 +0000 (UTC)
commit 08d8af426cce7a35a22d88e15874fe6c681e8e2a
Author: Alexander Mikhaylenko <alexm gnome org>
Date: Tue Sep 6 20:59:55 2022 +0400
demo: Extract tab view pages into a separate class
demo/adwaita-demo.gresources.xml | 1 +
demo/meson.build | 1 +
demo/pages/tab-view/adw-tab-view-demo-page.c | 187 +++++++++++++++++++++++++
demo/pages/tab-view/adw-tab-view-demo-page.h | 18 +++
demo/pages/tab-view/adw-tab-view-demo-page.ui | 14 ++
demo/pages/tab-view/adw-tab-view-demo-window.c | 86 ++++--------
6 files changed, 245 insertions(+), 62 deletions(-)
---
diff --git a/demo/adwaita-demo.gresources.xml b/demo/adwaita-demo.gresources.xml
index b307ecea..f470e937 100644
--- a/demo/adwaita-demo.gresources.xml
+++ b/demo/adwaita-demo.gresources.xml
@@ -59,6 +59,7 @@
<file preprocess="xml-stripblanks">pages/styles/adw-demo-page-styles.ui</file>
<file preprocess="xml-stripblanks">pages/styles/adw-style-demo-window.ui</file>
<file preprocess="xml-stripblanks">pages/tab-view/adw-demo-page-tab-view.ui</file>
+ <file preprocess="xml-stripblanks">pages/tab-view/adw-tab-view-demo-page.ui</file>
<file preprocess="xml-stripblanks">pages/tab-view/adw-tab-view-demo-window.ui</file>
<file preprocess="xml-stripblanks">pages/toasts/adw-demo-page-toasts.ui</file>
<file preprocess="xml-stripblanks">pages/view-switcher/adw-demo-page-view-switcher.ui</file>
diff --git a/demo/meson.build b/demo/meson.build
index d41d19e9..ee805e78 100644
--- a/demo/meson.build
+++ b/demo/meson.build
@@ -37,6 +37,7 @@ adwaita_demo_sources = [
'pages/styles/adw-demo-page-styles.c',
'pages/styles/adw-style-demo-window.c',
'pages/tab-view/adw-demo-page-tab-view.c',
+ 'pages/tab-view/adw-tab-view-demo-page.c',
'pages/tab-view/adw-tab-view-demo-window.c',
'pages/toasts/adw-demo-page-toasts.c',
'pages/view-switcher/adw-demo-page-view-switcher.c',
diff --git a/demo/pages/tab-view/adw-tab-view-demo-page.c b/demo/pages/tab-view/adw-tab-view-demo-page.c
new file mode 100644
index 00000000..e9d143c3
--- /dev/null
+++ b/demo/pages/tab-view/adw-tab-view-demo-page.c
@@ -0,0 +1,187 @@
+#include "adw-tab-view-demo-page.h"
+
+struct _AdwTabViewDemoPage
+{
+ AdwBin parent_instance;
+
+ GtkEditable *title_entry;
+
+ char *title;
+ GIcon *icon;
+ GIcon *last_icon;
+};
+
+G_DEFINE_TYPE (AdwTabViewDemoPage, adw_tab_view_demo_page, ADW_TYPE_BIN)
+
+enum {
+ PROP_0,
+ PROP_TITLE,
+ PROP_ICON,
+ LAST_PROP,
+};
+
+static GParamSpec *props[LAST_PROP];
+
+char **icon_names = NULL;
+gsize n_icon_names = 0;
+
+static void
+init_icon_names (GtkIconTheme *theme)
+{
+ if (icon_names)
+ return;
+
+ icon_names = gtk_icon_theme_get_icon_names (theme);
+ n_icon_names = g_strv_length (icon_names);
+}
+
+static GIcon *
+get_random_icon (void)
+{
+ GdkDisplay *display = gdk_display_get_default ();
+ GtkIconTheme *theme = gtk_icon_theme_get_for_display (display);
+ int index;
+
+ init_icon_names (theme);
+
+ index = g_random_int_range (0, n_icon_names);
+
+ return g_themed_icon_new (icon_names[index]);
+}
+
+static void
+adw_tab_view_demo_page_finalize (GObject *object)
+{
+ AdwTabViewDemoPage *self = ADW_TAB_VIEW_DEMO_PAGE (object);
+
+ g_clear_pointer (&self->title, g_free);
+ g_clear_object (&self->icon);
+ g_clear_object (&self->last_icon);
+
+ G_OBJECT_CLASS (adw_tab_view_demo_page_parent_class)->finalize (object);
+}
+
+static void
+adw_tab_view_demo_page_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ AdwTabViewDemoPage *self = ADW_TAB_VIEW_DEMO_PAGE (object);
+
+ switch (prop_id) {
+ case PROP_TITLE:
+ g_value_set_string (value, self->title);
+ break;
+ case PROP_ICON:
+ g_value_set_object (value, self->icon);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+adw_tab_view_demo_page_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ AdwTabViewDemoPage *self = ADW_TAB_VIEW_DEMO_PAGE (object);
+
+ switch (prop_id) {
+ case PROP_TITLE:
+ g_clear_pointer (&self->title, g_free);
+ self->title = g_value_dup_string (value);
+ break;
+ case PROP_ICON:
+ g_set_object (&self->icon, g_value_get_object (value));
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ }
+}
+
+static void
+adw_tab_view_demo_page_class_init (AdwTabViewDemoPageClass *klass)
+{
+ GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
+
+ object_class->finalize = adw_tab_view_demo_page_finalize;
+ object_class->get_property = adw_tab_view_demo_page_get_property;
+ object_class->set_property = adw_tab_view_demo_page_set_property;
+
+ props[PROP_TITLE] =
+ g_param_spec_string ("title", NULL, NULL,
+ NULL,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ props[PROP_ICON] =
+ g_param_spec_object ("icon", NULL, NULL,
+ G_TYPE_ICON,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, LAST_PROP, props);
+
+ gtk_widget_class_set_template_from_resource (widget_class,
"/org/gnome/Adwaita1/Demo/ui/pages/tab-view/adw-tab-view-demo-page.ui");
+ gtk_widget_class_bind_template_child (widget_class, AdwTabViewDemoPage, title_entry);
+}
+
+static void
+adw_tab_view_demo_page_init (AdwTabViewDemoPage *self)
+{
+ self->icon = get_random_icon ();
+
+ gtk_widget_init_template (GTK_WIDGET (self));
+}
+
+AdwTabViewDemoPage *
+adw_tab_view_demo_page_new (const char *title)
+{
+ return g_object_new (ADW_TYPE_TAB_VIEW_DEMO_PAGE,
+ "title", title,
+ NULL);
+}
+
+AdwTabViewDemoPage *
+adw_tab_view_demo_page_new_duplicate (AdwTabViewDemoPage *self)
+{
+ g_return_val_if_fail (ADW_IS_TAB_VIEW_DEMO_PAGE (self), NULL);
+
+ return g_object_new (ADW_TYPE_TAB_VIEW_DEMO_PAGE,
+ "title", self->title,
+ "icon", self->icon,
+ NULL);
+}
+
+void
+adw_tab_view_demo_page_refresh_icon (AdwTabViewDemoPage *self)
+{
+ GIcon *icon;
+
+ g_return_if_fail (ADW_IS_TAB_VIEW_DEMO_PAGE (self));
+
+ icon = get_random_icon ();
+
+ g_object_set (self, "icon", icon, NULL);
+
+ g_object_unref (icon);
+}
+
+void
+adw_tab_view_demo_page_set_enable_icon (AdwTabViewDemoPage *self,
+ gboolean enable_icon)
+{
+ g_return_if_fail (ADW_IS_TAB_VIEW_DEMO_PAGE (self));
+
+ enable_icon = !!enable_icon;
+
+ if (enable_icon) {
+ g_object_set (self, "icon", self->last_icon, NULL);
+ g_clear_object (&self->last_icon);
+ } else {
+ self->last_icon = g_object_ref (self->icon);
+ g_object_set (self, "icon", NULL, NULL);
+ }
+}
diff --git a/demo/pages/tab-view/adw-tab-view-demo-page.h b/demo/pages/tab-view/adw-tab-view-demo-page.h
new file mode 100644
index 00000000..dab3bf9d
--- /dev/null
+++ b/demo/pages/tab-view/adw-tab-view-demo-page.h
@@ -0,0 +1,18 @@
+#pragma once
+
+#include <adwaita.h>
+
+G_BEGIN_DECLS
+
+#define ADW_TYPE_TAB_VIEW_DEMO_PAGE (adw_tab_view_demo_page_get_type())
+
+G_DECLARE_FINAL_TYPE (AdwTabViewDemoPage, adw_tab_view_demo_page, ADW, TAB_VIEW_DEMO_PAGE, AdwBin)
+
+AdwTabViewDemoPage *adw_tab_view_demo_page_new (const char *title);
+AdwTabViewDemoPage *adw_tab_view_demo_page_new_duplicate (AdwTabViewDemoPage *self);
+
+void adw_tab_view_demo_page_refresh_icon (AdwTabViewDemoPage *self);
+void adw_tab_view_demo_page_set_enable_icon (AdwTabViewDemoPage *self,
+ gboolean enable_icon);
+
+G_END_DECLS
diff --git a/demo/pages/tab-view/adw-tab-view-demo-page.ui b/demo/pages/tab-view/adw-tab-view-demo-page.ui
new file mode 100644
index 00000000..9814b990
--- /dev/null
+++ b/demo/pages/tab-view/adw-tab-view-demo-page.ui
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<interface>
+ <requires lib="gtk" version="4.0"/>
+ <requires lib="libadwaita" version="1.0"/>
+ <template class="AdwTabViewDemoPage" parent="AdwBin">
+ <property name="child">
+ <object class="GtkEntry" id="title_entry">
+ <property name="halign">center</property>
+ <property name="valign">center</property>
+ <property name="text" bind-source="AdwTabViewDemoPage" bind-property="title"
bind-flags="bidirectional"/>
+ </object>
+ </property>
+ </template>
+</interface>
diff --git a/demo/pages/tab-view/adw-tab-view-demo-window.c b/demo/pages/tab-view/adw-tab-view-demo-window.c
index 65d15861..01a54132 100644
--- a/demo/pages/tab-view/adw-tab-view-demo-window.c
+++ b/demo/pages/tab-view/adw-tab-view-demo-window.c
@@ -2,6 +2,8 @@
#include <glib/gi18n.h>
+#include "adw-tab-view-demo-page.h"
+
struct _AdwTabViewDemoWindow
{
AdwWindow parent_instance;
@@ -24,33 +26,6 @@ enum {
static GParamSpec *props[LAST_PROP];
-char **icon_names = NULL;
-gsize n_icon_names = 0;
-
-static void
-init_icon_names (GtkIconTheme *theme)
-{
- if (icon_names)
- return;
-
- icon_names = gtk_icon_theme_get_icon_names (theme);
- n_icon_names = g_strv_length (icon_names);
-}
-
-static GIcon *
-get_random_icon (AdwTabViewDemoWindow *self)
-{
- GdkDisplay *display = gtk_widget_get_display (GTK_WIDGET (self));
- GtkIconTheme *theme = gtk_icon_theme_get_for_display (display);
- int index;
-
- init_icon_names (theme);
-
- index = g_random_int_range (0, n_icon_names);
-
- return g_themed_icon_new (icon_names[index]);
-}
-
static void
window_new (GSimpleAction *action,
GVariant *parameter,
@@ -80,30 +55,24 @@ text_to_tooltip (GBinding *binding,
static AdwTabPage *
add_page (AdwTabViewDemoWindow *self,
AdwTabPage *parent,
- const char *title,
- GIcon *icon)
+ AdwTabViewDemoPage *content)
{
- GtkWidget *content;
AdwTabPage *page;
- content = g_object_new (GTK_TYPE_ENTRY,
- "text", title,
- "halign", GTK_ALIGN_CENTER,
- "valign", GTK_ALIGN_CENTER,
- NULL);
-
page = adw_tab_view_add_page (self->view, GTK_WIDGET (content), parent);
- g_object_bind_property (content, "text",
+ g_object_bind_property (content, "title",
page, "title",
- G_BINDING_SYNC_CREATE | G_BINDING_BIDIRECTIONAL);
- g_object_bind_property_full (content, "text",
+ G_BINDING_SYNC_CREATE);
+ g_object_bind_property_full (content, "title",
page, "tooltip",
G_BINDING_SYNC_CREATE,
text_to_tooltip, NULL,
NULL, NULL);
+ g_object_bind_property (content, "icon",
+ page, "icon",
+ G_BINDING_SYNC_CREATE);
- adw_tab_page_set_icon (page, icon);
adw_tab_page_set_indicator_activatable (page, TRUE);
return page;
@@ -117,19 +86,17 @@ tab_new (GSimpleAction *action,
AdwTabViewDemoWindow *self = ADW_TAB_VIEW_DEMO_WINDOW (user_data);
char *title;
AdwTabPage *page;
- GtkWidget *content;
- GIcon *icon;
+ AdwTabViewDemoPage *content;
static int next_page = 1;
title = g_strdup_printf (_("Tab %d"), next_page);
- icon = get_random_icon (self);
- page = add_page (self, NULL, title, icon);
- content = adw_tab_page_get_child (page);
+ content = adw_tab_view_demo_page_new (title);
+ page = add_page (self, NULL, content);
adw_tab_view_set_selected_page (self->view, page);
- gtk_widget_grab_focus (content);
+ gtk_widget_grab_focus (GTK_WIDGET (content));
next_page++;
@@ -306,16 +273,11 @@ tab_change_icon (GSimpleAction *action,
{
AdwTabViewDemoWindow *self = ADW_TAB_VIEW_DEMO_WINDOW (user_data);
gboolean enable_icon = g_variant_get_boolean (parameter);
+ AdwTabPage *page = get_current_page (self);
+ GtkWidget *child = adw_tab_page_get_child (page);
- if (enable_icon) {
- GIcon *icon = get_random_icon (self);
-
- adw_tab_page_set_icon (get_current_page (self), icon);
-
- g_object_unref (icon);
- } else {
- adw_tab_page_set_icon (get_current_page (self), NULL);
- }
+ adw_tab_view_demo_page_set_enable_icon (ADW_TAB_VIEW_DEMO_PAGE (child),
+ enable_icon);
g_simple_action_set_state (action, g_variant_new_boolean (enable_icon));
}
@@ -326,11 +288,10 @@ tab_refresh_icon (GSimpleAction *action,
gpointer user_data)
{
AdwTabViewDemoWindow *self = ADW_TAB_VIEW_DEMO_WINDOW (user_data);
- GIcon *icon = get_random_icon (self);
+ AdwTabPage *page = get_current_page (self);
+ GtkWidget *child = adw_tab_page_get_child (page);
- adw_tab_page_set_icon (get_current_page (self), icon);
-
- g_object_unref (icon);
+ adw_tab_view_demo_page_refresh_icon (ADW_TAB_VIEW_DEMO_PAGE (child));
}
static void
@@ -340,11 +301,12 @@ tab_duplicate (GSimpleAction *action,
{
AdwTabViewDemoWindow *self = ADW_TAB_VIEW_DEMO_WINDOW (user_data);
AdwTabPage *parent = get_current_page (self);
+ GtkWidget *parent_content = adw_tab_page_get_child (parent);
+ AdwTabViewDemoPage *content;
AdwTabPage *page;
- page = add_page (self, parent,
- adw_tab_page_get_title (parent),
- adw_tab_page_get_icon (parent));
+ content = adw_tab_view_demo_page_new_duplicate (ADW_TAB_VIEW_DEMO_PAGE (parent_content));
+ page = add_page (self, parent, content);
adw_tab_page_set_indicator_icon (page, adw_tab_page_get_indicator_icon (parent));
adw_tab_page_set_indicator_tooltip (page, adw_tab_page_get_indicator_tooltip (parent));
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]