[devhelp] Create DhTabLabel class
- From: Sébastien Wilmet <swilmet src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [devhelp] Create DhTabLabel class
- Date: Sun, 11 Feb 2018 15:08:43 +0000 (UTC)
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]