[tepl] TabGroup: add the :active-tab property



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]