[tepl] TabGroup: add the :active-tab property
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [tepl] TabGroup: add the :active-tab property
- Date: Thu, 20 Jul 2017 17:33:35 +0000 (UTC)
commit fcb35bd1e0216f1ca9489b22b44f1571b9140d19
Author: Sébastien Wilmet <swilmet gnome org>
Date: Thu Jul 20 18:21:18 2017 +0200
TabGroup: add the :active-tab property
And implement it in the classes that implement the TeplTabGroup
interface.
tepl/tepl-application-window.c | 21 +++++++++++++
tepl/tepl-notebook.c | 64 ++++++++++++++++++++++++++++++++++++++--
tepl/tepl-tab-group.c | 15 +++++++++
tepl/tepl-tab.c | 7 ++++
4 files changed, 104 insertions(+), 3 deletions(-)
---
diff --git a/tepl/tepl-application-window.c b/tepl/tepl-application-window.c
index 7604061..2ebc6bf 100644
--- a/tepl/tepl-application-window.c
+++ b/tepl/tepl-application-window.c
@@ -66,6 +66,7 @@ enum
{
PROP_0,
PROP_APPLICATION_WINDOW,
+ PROP_ACTIVE_TAB,
};
#define TEPL_APPLICATION_WINDOW_KEY "tepl-application-window-key"
@@ -94,6 +95,10 @@ tepl_application_window_get_property (GObject *object,
g_value_set_object (value, tepl_application_window_get_application_window
(tepl_window));
break;
+ case PROP_ACTIVE_TAB:
+ g_value_set_object (value, tepl_tab_group_get_active_tab (TEPL_TAB_GROUP
(tepl_window)));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -171,6 +176,8 @@ tepl_application_window_class_init (TeplApplicationWindowClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+
+ g_object_class_override_property (object_class, PROP_ACTIVE_TAB, "active-tab");
}
static GList *
@@ -265,6 +272,14 @@ tepl_application_window_get_application_window (TeplApplicationWindow *tepl_wind
return tepl_window->priv->gtk_window;
}
+static void
+active_tab_notify_cb (TeplTabGroup *tab_group,
+ GParamSpec *pspec,
+ TeplApplicationWindow *tepl_window)
+{
+ g_object_notify (G_OBJECT (tepl_window), "active-tab");
+}
+
/**
* tepl_application_window_set_tab_group:
* @tepl_window: a #TeplApplicationWindow.
@@ -294,6 +309,12 @@ tepl_application_window_set_tab_group (TeplApplicationWindow *tepl_window,
}
tepl_window->priv->tab_group = g_object_ref_sink (tab_group);
+
+ g_signal_connect_object (tab_group,
+ "notify::active-tab",
+ G_CALLBACK (active_tab_notify_cb),
+ tepl_window,
+ 0);
}
/* ex:set ts=8 noet: */
diff --git a/tepl/tepl-notebook.c b/tepl/tepl-notebook.c
index 4b1718f..95973fe 100644
--- a/tepl/tepl-notebook.c
+++ b/tepl/tepl-notebook.c
@@ -36,6 +36,12 @@ struct _TeplNotebookPrivate
gint something;
};
+enum
+{
+ PROP_0,
+ PROP_ACTIVE_TAB,
+};
+
static void tepl_tab_group_interface_init (gpointer g_iface,
gpointer iface_data);
@@ -47,18 +53,70 @@ G_DEFINE_TYPE_WITH_CODE (TeplNotebook,
tepl_tab_group_interface_init))
static void
-tepl_notebook_finalize (GObject *object)
+tepl_notebook_get_property (GObject *object,
+ guint prop_id,
+ GValue *value,
+ GParamSpec *pspec)
{
+ TeplTabGroup *tab_group = TEPL_TAB_GROUP (object);
- G_OBJECT_CLASS (tepl_notebook_parent_class)->finalize (object);
+ switch (prop_id)
+ {
+ case PROP_ACTIVE_TAB:
+ g_value_set_object (value, tepl_tab_group_get_active_tab (tab_group));
+ break;
+
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+tepl_notebook_set_property (GObject *object,
+ guint prop_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ switch (prop_id)
+ {
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+ break;
+ }
+}
+
+static void
+tepl_notebook_switch_page (GtkNotebook *notebook,
+ GtkWidget *page,
+ guint page_num)
+{
+ if (GTK_NOTEBOOK_CLASS (tepl_notebook_parent_class)->switch_page != NULL)
+ {
+ GTK_NOTEBOOK_CLASS (tepl_notebook_parent_class)->switch_page (notebook,
+ page,
+ page_num);
+ }
+
+ /* FIXME: we connect only to the switch-page signal to notify the
+ * active-tab property. Is it enough? Do we also need to connect to
+ * other GtkNotebook signals?
+ */
+ g_object_notify (G_OBJECT (notebook), "active-tab");
}
static void
tepl_notebook_class_init (TeplNotebookClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
+ GtkNotebookClass *notebook_class = GTK_NOTEBOOK_CLASS (klass);
+
+ object_class->get_property = tepl_notebook_get_property;
+ object_class->set_property = tepl_notebook_set_property;
+
+ notebook_class->switch_page = tepl_notebook_switch_page;
- object_class->finalize = tepl_notebook_finalize;
+ g_object_class_override_property (object_class, PROP_ACTIVE_TAB, "active-tab");
}
static GList *
diff --git a/tepl/tepl-tab-group.c b/tepl/tepl-tab-group.c
index 0872c23..70bf7c9 100644
--- a/tepl/tepl-tab-group.c
+++ b/tepl/tepl-tab-group.c
@@ -52,6 +52,21 @@ tepl_tab_group_default_init (TeplTabGroupInterface *interface)
{
interface->get_tabs = tepl_tab_group_get_tabs_default;
interface->get_active_tab = tepl_tab_group_get_active_tab_default;
+
+ /**
+ * TeplTabGroup:active-tab:
+ *
+ * The #TeplTab currently shown.
+ *
+ * Since: 3.0
+ */
+ g_object_interface_install_property (interface,
+ g_param_spec_object ("active-tab",
+ "Active Tab",
+ "",
+ TEPL_TYPE_TAB,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS));
}
/**
diff --git a/tepl/tepl-tab.c b/tepl/tepl-tab.c
index 5e13f75..148c57f 100644
--- a/tepl/tepl-tab.c
+++ b/tepl/tepl-tab.c
@@ -55,6 +55,7 @@ enum
{
PROP_0,
PROP_VIEW,
+ PROP_ACTIVE_TAB,
};
static void tepl_tab_group_interface_init (gpointer g_iface,
@@ -178,6 +179,10 @@ tepl_tab_get_property (GObject *object,
g_value_set_object (value, tepl_tab_get_view (tab));
break;
+ case PROP_ACTIVE_TAB:
+ g_value_set_object (value, tepl_tab_group_get_active_tab (TEPL_TAB_GROUP (tab)));
+ break;
+
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -243,6 +248,8 @@ tepl_tab_class_init (TeplTabClass *klass)
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_STRINGS));
+
+ g_object_class_override_property (object_class, PROP_ACTIVE_TAB, "active-tab");
}
static GList *
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]