From 3d395133aeed47b08c6f8baecb71c64b2ffa173d Mon Sep 17 00:00:00 2001 From: Patrick McDermott Date: Fri, 13 Oct 2017 02:33:32 -0400 Subject: MqStopReloadButton: New class --- (limited to 'src/stop-reload-button.c') diff --git a/src/stop-reload-button.c b/src/stop-reload-button.c new file mode 100644 index 0000000..a55f571 --- /dev/null +++ b/src/stop-reload-button.c @@ -0,0 +1,176 @@ +/* + * Stop/reload button + * + * Copyright (C) 2017 Patrick McDermott + * + * This file is part of Marquee. + * + * Marquee 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 3 of the License, or + * (at your option) any later version. + * + * Marquee 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 Marquee. If not, see . + */ + +#include +#include +#include + +#include "stop-reload-button.h" +#include "web-view.h" + +struct _MqStopReloadButton { + GtkToolButton parent_instance; + GtkWidget *stop_icon; + GtkWidget *reload_icon; + MqWebView *web_view; +}; + +enum { + PROP_WEB_VIEW = 1, + N_PROPERTIES +}; + +static GParamSpec *obj_properties[N_PROPERTIES] = {NULL,}; + +struct _MqStopReloadButtonClass { + GtkToolButtonClass parent_class; +}; + +G_DEFINE_TYPE(MqStopReloadButton, mq_stop_reload_button, GTK_TYPE_TOOL_BUTTON) + +static void +loading_cb(MqWebView *web_view, GParamSpec G_GNUC_UNUSED *paramspec, + MqStopReloadButton *stop_reload_button) +{ + if (webkit_web_view_is_loading(WEBKIT_WEB_VIEW(web_view))) { + gtk_tool_button_set_icon_widget( + GTK_TOOL_BUTTON(stop_reload_button), + stop_reload_button->stop_icon); + gtk_tool_button_set_label( + GTK_TOOL_BUTTON(stop_reload_button), "Stop"); + gtk_widget_set_tooltip_text( + GTK_WIDGET(stop_reload_button), + "Stop loading the current page"); + } else { + gtk_tool_button_set_icon_widget( + GTK_TOOL_BUTTON(stop_reload_button), + stop_reload_button->reload_icon); + gtk_tool_button_set_label( + GTK_TOOL_BUTTON(stop_reload_button), "Reload"); + gtk_widget_set_tooltip_text( + GTK_WIDGET(stop_reload_button), + "Reload the current page"); + } + gtk_widget_show_all(GTK_WIDGET(stop_reload_button)); +} + +static void +clicked_cb(MqStopReloadButton *stop_reload_button) +{ + WebKitWebView *web_view; + + web_view = WEBKIT_WEB_VIEW(stop_reload_button->web_view); + + if (webkit_web_view_is_loading(web_view)) { + webkit_web_view_stop_loading(web_view); + } else { + webkit_web_view_reload(web_view); + } +} + +static void +set_web_view(MqStopReloadButton *stop_reload_button, MqWebView *web_view) +{ + stop_reload_button->web_view = web_view; + + g_signal_connect(web_view, "notify::is-loading", + G_CALLBACK(loading_cb), stop_reload_button); +} + +static void +get_property(GObject *object, guint property_id, GValue *value, + GParamSpec *pspec) +{ + switch (property_id) { + case PROP_WEB_VIEW: + g_value_set_object(value, NULL); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, + pspec); + break; + } +} + +static void +set_property(GObject *object, guint property_id, const GValue *value, + GParamSpec *pspec) +{ + MqStopReloadButton *stop_reload_button; + + stop_reload_button = MQ_STOP_RELOAD_BUTTON(object); + + switch (property_id) { + case PROP_WEB_VIEW: + set_web_view(stop_reload_button, + g_value_get_object(value)); + break; + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID(object, property_id, + pspec); + break; + } +} + +static void +mq_stop_reload_button_class_init(MqStopReloadButtonClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS(klass); + + object_class->get_property = get_property; + object_class->set_property = set_property; + + obj_properties[PROP_WEB_VIEW] = g_param_spec_object( + "web-view", + "MqWebView", + "The associated MqWebView instance", + MQ_TYPE_WEB_VIEW, + G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | + G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB); + g_object_class_install_properties(object_class, N_PROPERTIES, + obj_properties); +} + +static void +mq_stop_reload_button_init(MqStopReloadButton *stop_reload_button) +{ + stop_reload_button->stop_icon = gtk_image_new_from_icon_name( + "process-stop", GTK_ICON_SIZE_SMALL_TOOLBAR); + g_object_ref_sink(stop_reload_button->stop_icon); + stop_reload_button->reload_icon = gtk_image_new_from_icon_name( + "view-refresh", GTK_ICON_SIZE_SMALL_TOOLBAR); + g_object_ref_sink(stop_reload_button->reload_icon); + gtk_tool_button_set_icon_widget(GTK_TOOL_BUTTON(stop_reload_button), + stop_reload_button->stop_icon); + gtk_tool_button_set_label(GTK_TOOL_BUTTON(stop_reload_button), "Stop"); + gtk_widget_set_tooltip_text(GTK_WIDGET(stop_reload_button), + "Stop loading the current page"); + g_signal_connect(stop_reload_button, "clicked", + G_CALLBACK(clicked_cb), NULL); +} + +GtkToolItem * +mq_stop_reload_button_new(MqWebView *web_view) +{ + return g_object_new(MQ_TYPE_STOP_RELOAD_BUTTON, + "web-view", web_view, + NULL); +} -- cgit v0.9.1