|
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 |
}
|