[devhelp] Create DhTabLabel class



commit a85aca302ce39268f29c43a658656ca1422f91ad
Author: Sébastien Wilmet <swilmet gnome org>
Date:   Sun Feb 11 13:37:28 2018 +0100

    Create DhTabLabel class
    
    Implemented similarly to TeplTabLabel.

 docs/reference/Makefile.am |    1 +
 po/POTFILES.in             |    1 +
 src/Makefile.am            |    2 +
 src/dh-tab-label.c         |  236 ++++++++++++++++++++++++++++++++++++++++++++
 src/dh-tab-label.h         |   59 +++++++++++
 5 files changed, 299 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/Makefile.am b/docs/reference/Makefile.am
index 54daeb3..4132f04 100644
--- a/docs/reference/Makefile.am
+++ b/docs/reference/Makefile.am
@@ -55,6 +55,7 @@ IGNORE_HFILES = \
        dh-search-context.h \
        dh-settings.h \
        dh-tab.h \
+       dh-tab-label.h \
        dh-util.h \
        dh-web-view.h \
        dh-window.h \
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 04f5e20..32e406e 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -20,6 +20,7 @@ src/dh-preferences.ui
 src/dh-search-context.c
 src/dh-sidebar.c
 src/dh-tab.c
+src/dh-tab-label.c
 src/dh-util.c
 src/dh-web-view.c
 src/dh-window.c
diff --git a/src/Makefile.am b/src/Makefile.am
index e84e3c9..2296ad3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -70,6 +70,7 @@ app_headers =                 \
        dh-app.h                \
        dh-assistant.h          \
        dh-tab.h                \
+       dh-tab-label.h          \
        dh-web-view.h           \
        dh-window.h             \
        tepl-info-bar.h         \
@@ -80,6 +81,7 @@ app_c_files =                 \
        dh-assistant.c          \
        dh-main.c               \
        dh-tab.c                \
+       dh-tab-label.c          \
        dh-web-view.c           \
        dh-window.c             \
        tepl-info-bar.c         \
diff --git a/src/dh-tab-label.c b/src/dh-tab-label.c
new file mode 100644
index 0000000..894d1c9
--- /dev/null
+++ b/src/dh-tab-label.c
@@ -0,0 +1,236 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2018 Sébastien Wilmet <swilmet gnome org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "dh-tab-label.h"
+#include "dh-web-view.h"
+
+struct _DhTabLabelPrivate {
+        /* Weak ref */
+        DhTab *tab;
+
+        GtkLabel *label;
+};
+
+enum {
+        PROP_0,
+        PROP_TAB,
+        N_PROPERTIES
+};
+
+static GParamSpec *properties[N_PROPERTIES];
+
+G_DEFINE_TYPE_WITH_PRIVATE (DhTabLabel, dh_tab_label, GTK_TYPE_GRID)
+
+static void
+update_label (DhTabLabel *tab_label)
+{
+        DhWebView *web_view;
+        const gchar *title;
+
+        if (tab_label->priv->tab == NULL)
+                return;
+
+        web_view = dh_tab_get_web_view (tab_label->priv->tab);
+        title = dh_web_view_get_devhelp_title (web_view);
+        gtk_label_set_text (tab_label->priv->label, title);
+}
+
+static void
+web_view_title_notify_cb (DhWebView  *web_view,
+                          GParamSpec *pspec,
+                          DhTabLabel *tab_label)
+{
+        update_label (tab_label);
+}
+
+static void
+set_tab (DhTabLabel *tab_label,
+         DhTab      *tab)
+{
+        DhWebView *web_view;
+
+        if (tab == NULL)
+                return;
+
+        g_return_if_fail (DH_IS_TAB (tab));
+
+        g_assert (tab_label->priv->tab == NULL);
+        tab_label->priv->tab = tab;
+        g_object_add_weak_pointer (G_OBJECT (tab_label->priv->tab),
+                                   (gpointer *) &tab_label->priv->tab);
+
+        web_view = dh_tab_get_web_view (tab);
+        g_signal_connect_object (web_view,
+                                 "notify::title",
+                                 G_CALLBACK (web_view_title_notify_cb),
+                                 tab_label,
+                                 0);
+
+        update_label (tab_label);
+}
+
+static void
+dh_tab_label_get_property (GObject    *object,
+                           guint       prop_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+        DhTabLabel *tab_label = DH_TAB_LABEL (object);
+
+        switch (prop_id) {
+                case PROP_TAB:
+                        g_value_set_object (value, dh_tab_label_get_tab (tab_label));
+                        break;
+
+                default:
+                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                        break;
+        }
+}
+
+static void
+dh_tab_label_set_property (GObject      *object,
+                           guint         prop_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+        DhTabLabel *tab_label = DH_TAB_LABEL (object);
+
+        switch (prop_id) {
+                case PROP_TAB:
+                        set_tab (tab_label, g_value_get_object (value));
+                        break;
+
+                default:
+                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+                        break;
+        }
+}
+
+static void
+dh_tab_label_dispose (GObject *object)
+{
+        DhTabLabel *tab_label = DH_TAB_LABEL (object);
+
+        if (tab_label->priv->tab != NULL) {
+                g_object_remove_weak_pointer (G_OBJECT (tab_label->priv->tab),
+                                              (gpointer *) &tab_label->priv->tab);
+                tab_label->priv->tab = NULL;
+        }
+
+        G_OBJECT_CLASS (dh_tab_label_parent_class)->dispose (object);
+}
+
+static void
+dh_tab_label_class_init (DhTabLabelClass *klass)
+{
+        GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+        object_class->get_property = dh_tab_label_get_property;
+        object_class->set_property = dh_tab_label_set_property;
+        object_class->dispose = dh_tab_label_dispose;
+
+        properties[PROP_TAB] =
+                g_param_spec_object ("tab",
+                                     "tab",
+                                     "",
+                                     DH_TYPE_TAB,
+                                     G_PARAM_READWRITE |
+                                     G_PARAM_CONSTRUCT_ONLY |
+                                     G_PARAM_STATIC_STRINGS);
+
+        g_object_class_install_properties (object_class, N_PROPERTIES, properties);
+}
+
+static GtkWidget *
+create_close_button (void)
+{
+        GtkWidget *close_button;
+        GtkStyleContext *style_context;
+
+        close_button = gtk_button_new_from_icon_name ("window-close-symbolic",
+                                                      GTK_ICON_SIZE_BUTTON);
+        gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
+        gtk_widget_set_focus_on_click (close_button, FALSE);
+
+        style_context = gtk_widget_get_style_context (close_button);
+        gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_FLAT);
+
+        return close_button;
+}
+
+static void
+close_button_clicked_cb (GtkButton  *close_button,
+                        DhTabLabel *tab_label)
+{
+        if (tab_label->priv->tab != NULL)
+                gtk_widget_destroy (GTK_WIDGET (tab_label->priv->tab));
+}
+
+static void
+dh_tab_label_init (DhTabLabel *tab_label)
+{
+        GtkWidget *close_button;
+
+        tab_label->priv = dh_tab_label_get_instance_private (tab_label);
+
+        gtk_grid_set_column_spacing (GTK_GRID (tab_label), 4);
+
+        /* Label */
+
+        tab_label->priv->label = GTK_LABEL (gtk_label_new (NULL));
+        gtk_widget_set_hexpand (GTK_WIDGET (tab_label->priv->label), TRUE);
+        gtk_widget_set_vexpand (GTK_WIDGET (tab_label->priv->label), TRUE);
+        gtk_widget_set_halign (GTK_WIDGET (tab_label->priv->label), GTK_ALIGN_CENTER);
+        gtk_label_set_ellipsize (tab_label->priv->label, PANGO_ELLIPSIZE_END);
+
+        gtk_widget_show (GTK_WIDGET (tab_label->priv->label));
+        gtk_container_add (GTK_CONTAINER (tab_label),
+                           GTK_WIDGET (tab_label->priv->label));
+
+        /* Close button */
+
+        close_button = create_close_button ();
+
+        g_signal_connect (close_button,
+                          "clicked",
+                          G_CALLBACK (close_button_clicked_cb),
+                          tab_label);
+
+        gtk_widget_show (close_button);
+        gtk_container_add (GTK_CONTAINER (tab_label), close_button);
+}
+
+GtkWidget *
+dh_tab_label_new (DhTab *tab)
+{
+        g_return_val_if_fail (DH_IS_TAB (tab), NULL);
+
+        return g_object_new (DH_TYPE_TAB_LABEL,
+                             "tab", tab,
+                             NULL);
+}
+
+/* Returns: (transfer none) (nullable): the #DhTabLabel:tab. */
+DhTab *
+dh_tab_label_get_tab (DhTabLabel *tab_label)
+{
+        g_return_val_if_fail (DH_IS_TAB_LABEL (tab_label), NULL);
+
+        return tab_label->priv->tab;
+}
diff --git a/src/dh-tab-label.h b/src/dh-tab-label.h
new file mode 100644
index 0000000..bf115a0
--- /dev/null
+++ b/src/dh-tab-label.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
+/*
+ * Copyright (C) 2018 Sébastien Wilmet <swilmet gnome org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef DH_TAB_LABEL_H
+#define DH_TAB_LABEL_H
+
+#include <gtk/gtk.h>
+#include "dh-tab.h"
+
+G_BEGIN_DECLS
+
+#define DH_TYPE_TAB_LABEL             (dh_tab_label_get_type ())
+#define DH_TAB_LABEL(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), DH_TYPE_TAB_LABEL, DhTabLabel))
+#define DH_TAB_LABEL_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), DH_TYPE_TAB_LABEL, DhTabLabelClass))
+#define DH_IS_TAB_LABEL(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), DH_TYPE_TAB_LABEL))
+#define DH_IS_TAB_LABEL_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), DH_TYPE_TAB_LABEL))
+#define DH_TAB_LABEL_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), DH_TYPE_TAB_LABEL, DhTabLabelClass))
+
+typedef struct _DhTabLabel         DhTabLabel;
+typedef struct _DhTabLabelClass    DhTabLabelClass;
+typedef struct _DhTabLabelPrivate  DhTabLabelPrivate;
+
+struct _DhTabLabel {
+        GtkGrid parent;
+
+        DhTabLabelPrivate *priv;
+};
+
+struct _DhTabLabelClass {
+        GtkGridClass parent_class;
+
+       /* Padding for future expansion */
+        gpointer padding[12];
+};
+
+GType           dh_tab_label_get_type           (void);
+
+GtkWidget *     dh_tab_label_new                (DhTab *tab);
+
+DhTab *         dh_tab_label_get_tab            (DhTabLabel *tab_label);
+
+G_END_DECLS
+
+#endif /* DH_TAB_LABEL_H */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]