Blame src/dh-tab-label.c

Packit 116408
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 8 -*- */
Packit 116408
/*
Packit 116408
 * Copyright (C) 2018 Sébastien Wilmet <swilmet@gnome.org>
Packit 116408
 *
Packit 116408
 * This program is free software; you can redistribute it and/or
Packit 116408
 * modify it under the terms of the GNU General Public License as
Packit 116408
 * published by the Free Software Foundation; either version 2 of the
Packit 116408
 * License, or (at your option) any later version.
Packit 116408
 *
Packit 116408
 * This program is distributed in the hope that it will be useful,
Packit 116408
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 116408
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 116408
 * General Public License for more details.
Packit 116408
 *
Packit 116408
 * You should have received a copy of the GNU General Public License
Packit 116408
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
Packit 116408
 */
Packit 116408
Packit 116408
#include "dh-tab-label.h"
Packit 116408
#include "dh-web-view.h"
Packit 116408
Packit 116408
struct _DhTabLabelPrivate {
Packit 116408
        /* Weak ref */
Packit 116408
        DhTab *tab;
Packit 116408
Packit 116408
        GtkLabel *label;
Packit 116408
};
Packit 116408
Packit 116408
enum {
Packit 116408
        PROP_0,
Packit 116408
        PROP_TAB,
Packit 116408
        N_PROPERTIES
Packit 116408
};
Packit 116408
Packit 116408
static GParamSpec *properties[N_PROPERTIES];
Packit 116408
Packit 116408
G_DEFINE_TYPE_WITH_PRIVATE (DhTabLabel, dh_tab_label, GTK_TYPE_GRID)
Packit 116408
Packit 116408
static void
Packit 116408
update_label (DhTabLabel *tab_label)
Packit 116408
{
Packit 116408
        DhWebView *web_view;
Packit 116408
        const gchar *title;
Packit 116408
Packit 116408
        if (tab_label->priv->tab == NULL)
Packit 116408
                return;
Packit 116408
Packit 116408
        web_view = dh_tab_get_web_view (tab_label->priv->tab);
Packit 116408
        title = dh_web_view_get_devhelp_title (web_view);
Packit 116408
        gtk_label_set_text (tab_label->priv->label, title);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
web_view_title_notify_cb (DhWebView  *web_view,
Packit 116408
                          GParamSpec *pspec,
Packit 116408
                          DhTabLabel *tab_label)
Packit 116408
{
Packit 116408
        update_label (tab_label);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
set_tab (DhTabLabel *tab_label,
Packit 116408
         DhTab      *tab)
Packit 116408
{
Packit 116408
        DhWebView *web_view;
Packit 116408
Packit 116408
        if (tab == NULL)
Packit 116408
                return;
Packit 116408
Packit 116408
        g_return_if_fail (DH_IS_TAB (tab));
Packit 116408
Packit 116408
        g_assert (tab_label->priv->tab == NULL);
Packit 116408
        tab_label->priv->tab = tab;
Packit 116408
        g_object_add_weak_pointer (G_OBJECT (tab_label->priv->tab),
Packit 116408
                                   (gpointer *) &tab_label->priv->tab);
Packit 116408
Packit 116408
        web_view = dh_tab_get_web_view (tab);
Packit 116408
        g_signal_connect_object (web_view,
Packit 116408
                                 "notify::title",
Packit 116408
                                 G_CALLBACK (web_view_title_notify_cb),
Packit 116408
                                 tab_label,
Packit 116408
                                 0);
Packit 116408
Packit 116408
        update_label (tab_label);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_tab_label_get_property (GObject    *object,
Packit 116408
                           guint       prop_id,
Packit 116408
                           GValue     *value,
Packit 116408
                           GParamSpec *pspec)
Packit 116408
{
Packit 116408
        DhTabLabel *tab_label = DH_TAB_LABEL (object);
Packit 116408
Packit 116408
        switch (prop_id) {
Packit 116408
                case PROP_TAB:
Packit 116408
                        g_value_set_object (value, dh_tab_label_get_tab (tab_label));
Packit 116408
                        break;
Packit 116408
Packit 116408
                default:
Packit 116408
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 116408
                        break;
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_tab_label_set_property (GObject      *object,
Packit 116408
                           guint         prop_id,
Packit 116408
                           const GValue *value,
Packit 116408
                           GParamSpec   *pspec)
Packit 116408
{
Packit 116408
        DhTabLabel *tab_label = DH_TAB_LABEL (object);
Packit 116408
Packit 116408
        switch (prop_id) {
Packit 116408
                case PROP_TAB:
Packit 116408
                        set_tab (tab_label, g_value_get_object (value));
Packit 116408
                        break;
Packit 116408
Packit 116408
                default:
Packit 116408
                        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
Packit 116408
                        break;
Packit 116408
        }
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_tab_label_dispose (GObject *object)
Packit 116408
{
Packit 116408
        DhTabLabel *tab_label = DH_TAB_LABEL (object);
Packit 116408
Packit 116408
        if (tab_label->priv->tab != NULL) {
Packit 116408
                g_object_remove_weak_pointer (G_OBJECT (tab_label->priv->tab),
Packit 116408
                                              (gpointer *) &tab_label->priv->tab);
Packit 116408
                tab_label->priv->tab = NULL;
Packit 116408
        }
Packit 116408
Packit 116408
        G_OBJECT_CLASS (dh_tab_label_parent_class)->dispose (object);
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_tab_label_class_init (DhTabLabelClass *klass)
Packit 116408
{
Packit 116408
        GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 116408
Packit 116408
        object_class->get_property = dh_tab_label_get_property;
Packit 116408
        object_class->set_property = dh_tab_label_set_property;
Packit 116408
        object_class->dispose = dh_tab_label_dispose;
Packit 116408
Packit 116408
        properties[PROP_TAB] =
Packit 116408
                g_param_spec_object ("tab",
Packit 116408
                                     "tab",
Packit 116408
                                     "",
Packit 116408
                                     DH_TYPE_TAB,
Packit 116408
                                     G_PARAM_READWRITE |
Packit 116408
                                     G_PARAM_CONSTRUCT_ONLY |
Packit 116408
                                     G_PARAM_STATIC_STRINGS);
Packit 116408
Packit 116408
        g_object_class_install_properties (object_class, N_PROPERTIES, properties);
Packit 116408
}
Packit 116408
Packit 116408
static GtkWidget *
Packit 116408
create_close_button (void)
Packit 116408
{
Packit 116408
        GtkWidget *close_button;
Packit 116408
        GtkStyleContext *style_context;
Packit 116408
Packit 116408
        close_button = gtk_button_new_from_icon_name ("window-close-symbolic",
Packit 116408
                                                      GTK_ICON_SIZE_BUTTON);
Packit 116408
        gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
Packit 116408
        gtk_widget_set_focus_on_click (close_button, FALSE);
Packit 116408
Packit 116408
        style_context = gtk_widget_get_style_context (close_button);
Packit 116408
        gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_FLAT);
Packit 116408
Packit 116408
        return close_button;
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
close_button_clicked_cb (GtkButton  *close_button,
Packit 116408
			 DhTabLabel *tab_label)
Packit 116408
{
Packit 116408
        if (tab_label->priv->tab != NULL)
Packit 116408
                gtk_widget_destroy (GTK_WIDGET (tab_label->priv->tab));
Packit 116408
}
Packit 116408
Packit 116408
static void
Packit 116408
dh_tab_label_init (DhTabLabel *tab_label)
Packit 116408
{
Packit 116408
        GtkWidget *close_button;
Packit 116408
Packit 116408
        tab_label->priv = dh_tab_label_get_instance_private (tab_label);
Packit 116408
Packit 116408
        gtk_grid_set_column_spacing (GTK_GRID (tab_label), 4);
Packit 116408
Packit 116408
        /* Label */
Packit 116408
Packit 116408
        tab_label->priv->label = GTK_LABEL (gtk_label_new (NULL));
Packit 116408
        gtk_widget_set_hexpand (GTK_WIDGET (tab_label->priv->label), TRUE);
Packit 116408
        gtk_widget_set_vexpand (GTK_WIDGET (tab_label->priv->label), TRUE);
Packit 116408
        gtk_widget_set_halign (GTK_WIDGET (tab_label->priv->label), GTK_ALIGN_CENTER);
Packit 116408
        gtk_label_set_ellipsize (tab_label->priv->label, PANGO_ELLIPSIZE_END);
Packit 116408
Packit 116408
        gtk_widget_show (GTK_WIDGET (tab_label->priv->label));
Packit 116408
        gtk_container_add (GTK_CONTAINER (tab_label),
Packit 116408
                           GTK_WIDGET (tab_label->priv->label));
Packit 116408
Packit 116408
        /* Close button */
Packit 116408
Packit 116408
        close_button = create_close_button ();
Packit 116408
Packit 116408
        g_signal_connect (close_button,
Packit 116408
                          "clicked",
Packit 116408
                          G_CALLBACK (close_button_clicked_cb),
Packit 116408
                          tab_label);
Packit 116408
Packit 116408
        gtk_widget_show (close_button);
Packit 116408
        gtk_container_add (GTK_CONTAINER (tab_label), close_button);
Packit 116408
}
Packit 116408
Packit 116408
GtkWidget *
Packit 116408
dh_tab_label_new (DhTab *tab)
Packit 116408
{
Packit 116408
        g_return_val_if_fail (DH_IS_TAB (tab), NULL);
Packit 116408
Packit 116408
        return g_object_new (DH_TYPE_TAB_LABEL,
Packit 116408
                             "tab", tab,
Packit 116408
                             NULL);
Packit 116408
}
Packit 116408
Packit 116408
/* Returns: (transfer none) (nullable): the #DhTabLabel:tab. */
Packit 116408
DhTab *
Packit 116408
dh_tab_label_get_tab (DhTabLabel *tab_label)
Packit 116408
{
Packit 116408
        g_return_val_if_fail (DH_IS_TAB_LABEL (tab_label), NULL);
Packit 116408
Packit 116408
        return tab_label->priv->tab;
Packit 116408
}