summaryrefslogtreecommitdiff
path: root/gtk/gtktoggletoolbutton.c
diff options
context:
space:
mode:
authorMatthias Clasen <matthiasc@src.gnome.org>2009-01-23 15:15:28 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2009-01-23 15:15:28 +0000
commitbb72b647f6a40831a46fb731a5929831d95c2b29 (patch)
tree5bd4a577f50fe360a0cd9a06ada7adc65c3c5508 /gtk/gtktoggletoolbutton.c
parentacd40c45f781a84c297be34d5d18f7681e78d46e (diff)
downloadgtk+-bb72b647f6a40831a46fb731a5929831d95c2b29.tar.gz
i Bug 560228 – Add "action-controller" property to GtkWidgetClass
Rework the way actions and proxies interact, to make the interaction less ad hoc, more extensible, and better suited for support in GUI builders like glade. To be used as a proxy, a widget must now implement the GtkActivatable interface, and GtkActivatable implementations are responsible for syncing their appearance with the action and for activating the action. All the widgets that are commonly used as proxies implement GtkActivatable now. Patch by Tristan van Berkom. * gtk/gtkactivatable.[hc]: The GtkActivatable interface. * gtk/gtkbutton.c: * gtk/gtktogglebutton.c: * gtk/gtktoolitem.c: * gtk/gtktoolbutton.c: * gtk/gtktoggletoolbutton.c: * gtk/gtkmenuitem.c: * gtk/gtkcheckmenuitem.c: * gtk/gtkimagemenuitem.c: * gtk/gtkradiomenuitem.c: * gtk/gtkrecentchooserprivate.h: * gtk/gtkrecentchooser.c: * gtk/gtkrecentchooserdefault.c: * gtk/gtkrecentchoosermenu.c: Implement GtkActivatable. * gtk/gtkaction.[hc]: Move appearance synchronization to GtkActivatable implementations. * gtk/gtkradioaction.c: * gtk/gtkrecentaction.c: * gtk/gtktoggleaction.c: * gtk/gtkactiongroup.c: Adapt. * gtk/gtk.h: Include gtkactivatable.h * gtk/gtk.symbols: Add new functions svn path=/trunk/; revision=22195
Diffstat (limited to 'gtk/gtktoggletoolbutton.c')
-rw-r--r--gtk/gtktoggletoolbutton.c65
1 files changed, 62 insertions, 3 deletions
diff --git a/gtk/gtktoggletoolbutton.c b/gtk/gtktoggletoolbutton.c
index 1076458aae..c527c136b2 100644
--- a/gtk/gtktoggletoolbutton.c
+++ b/gtk/gtktoggletoolbutton.c
@@ -1,4 +1,4 @@
-/* gtktoggletoolbutton.c
+ /* gtktoggletoolbutton.c
*
* Copyright (C) 2002 Anders Carlsson <andersca@gnome.org>
* Copyright (C) 2002 James Henstridge <james@daa.com.au>
@@ -27,6 +27,8 @@
#include "gtkstock.h"
#include "gtkintl.h"
#include "gtkradiotoolbutton.h"
+#include "gtktoggleaction.h"
+#include "gtkactivatable.h"
#include "gtkprivate.h"
#include "gtkalias.h"
@@ -67,9 +69,20 @@ static void button_toggled (GtkWidget *widget,
static void menu_item_activated (GtkWidget *widget,
GtkToggleToolButton *button);
-static guint toggle_signals[LAST_SIGNAL] = { 0 };
-G_DEFINE_TYPE (GtkToggleToolButton, gtk_toggle_tool_button, GTK_TYPE_TOOL_BUTTON)
+static void gtk_toggle_tool_button_activatable_interface_init (GtkActivatableIface *iface);
+static void gtk_toggle_tool_button_activatable_update (GtkActivatable *activatable,
+ GtkAction *action,
+ const gchar *property_name);
+static void gtk_toggle_tool_button_activatable_reset (GtkActivatable *activatable,
+ GtkAction *action);
+
+static GtkActivatableIface *parent_activatable_iface;
+static guint toggle_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE_WITH_CODE (GtkToggleToolButton, gtk_toggle_tool_button, GTK_TYPE_TOOL_BUTTON,
+ G_IMPLEMENT_INTERFACE (GTK_TYPE_ACTIVATABLE,
+ gtk_toggle_tool_button_activatable_interface_init))
static void
gtk_toggle_tool_button_class_init (GtkToggleToolButtonClass *klass)
@@ -292,6 +305,52 @@ button_toggled (GtkWidget *widget,
}
}
+static void
+gtk_toggle_tool_button_activatable_interface_init (GtkActivatableIface *iface)
+{
+ parent_activatable_iface = g_type_interface_peek_parent (iface);
+ iface->update = gtk_toggle_tool_button_activatable_update;
+ iface->reset = gtk_toggle_tool_button_activatable_reset;
+}
+
+static void
+gtk_toggle_tool_button_activatable_update (GtkActivatable *activatable,
+ GtkAction *action,
+ const gchar *property_name)
+{
+ GtkToggleToolButton *button;
+
+ parent_activatable_iface->update (activatable, action, property_name);
+
+ button = GTK_TOGGLE_TOOL_BUTTON (activatable);
+
+ if (strcmp (property_name, "active") == 0)
+ {
+ gtk_action_block_activate (action);
+ gtk_toggle_tool_button_set_active (button, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+ gtk_action_unblock_activate (action);
+ }
+}
+
+static void
+gtk_toggle_tool_button_activatable_reset (GtkActivatable *activatable,
+ GtkAction *action)
+{
+ GtkToggleToolButton *button;
+
+ parent_activatable_iface->reset (activatable, action);
+
+ if (!action)
+ return;
+
+ button = GTK_TOGGLE_TOOL_BUTTON (activatable);
+
+ gtk_action_block_activate (action);
+ gtk_toggle_tool_button_set_active (button, gtk_toggle_action_get_active (GTK_TOGGLE_ACTION (action)));
+ gtk_action_unblock_activate (action);
+}
+
+
/**
* gtk_toggle_tool_button_new:
*