diff --git a/src/ink-action.cpp b/src/ink-action.cpp
index ecdc8e63cc933ae7a30c39779bb60b222864da97..f1dcaf04b5aa4d875458e1a18e7c5aad6f08b730 100644 (file)
--- a/src/ink-action.cpp
+++ b/src/ink-action.cpp
#include <gtk/gtktoolitem.h>
#include <gtk/gtktoggletoolbutton.h>
#include <gtk/gtkcheckmenuitem.h>
+#include <gtk/gtkimagemenuitem.h>
#include "icon-size.h"
#include "ink-action.h"
@@ -182,9 +183,37 @@ void ink_action_set_property( GObject* obj, guint propId, const GValue *value, G
}
}
+#include <gtk/gtkstock.h>
+
static GtkWidget* ink_action_create_menu_item( GtkAction* action )
{
- GtkWidget* item = gInkActionParentClass->create_menu_item( action );
+ InkAction* act = INK_ACTION( action );
+ GtkWidget* item = 0;
+
+ if ( act->private_data->iconId ) {
+ gchar* label = 0;
+ g_object_get( G_OBJECT(act), "label", &label, NULL );
+
+ item = gtk_image_menu_item_new_with_mnemonic( label );
+ GtkWidget* child = sp_icon_new( Inkscape::ICON_SIZE_MENU, act->private_data->iconId );
+ // TODO this work-around is until SPIcon will live properly inside of a popup menu
+ if ( SP_IS_ICON(child) ) {
+ SPIcon* icon = SP_ICON(child);
+ sp_icon_fetch_pixbuf( icon );
+ GdkPixbuf* target = gtk_action_is_sensitive(action) ? icon->pb : icon->pb_faded;
+ if ( target ) {
+ child = gtk_image_new_from_pixbuf( target );
+ gtk_widget_destroy( GTK_WIDGET(icon) );
+ }
+ }
+ gtk_widget_show_all( child );
+ gtk_image_menu_item_set_image( GTK_IMAGE_MENU_ITEM(item), child );
+
+ g_free( label );
+ label = 0;
+ } else {
+ item = gInkActionParentClass->create_menu_item( action );
+ }
return item;
}
@@ -230,6 +259,8 @@ static void ink_toggle_action_set_property( GObject* obj, guint propId, const GV
static GtkWidget* ink_toggle_action_create_menu_item( GtkAction* action );
static GtkWidget* ink_toggle_action_create_tool_item( GtkAction* action );
+static void ink_toggle_action_update_icon( InkToggleAction* action );
+
static GtkToggleActionClass* gInkToggleActionParentClass = 0;
struct _InkToggleActionPrivate
@@ -368,6 +399,8 @@ void ink_toggle_action_set_property( GObject* obj, guint propId, const GValue *v
gchar* tmp = action->private_data->iconId;
action->private_data->iconId = g_value_dup_string( value );
g_free( tmp );
+
+ ink_toggle_action_update_icon( action );
}
break;
static GtkWidget* ink_toggle_action_create_tool_item( GtkAction* action )
{
- InkToggleAction* act = INK_TOGGLE_ACTION( action );
- GtkWidget* item = gInkToggleActionParentClass->parent_class.create_tool_item(action);
+ InkToggleAction* act = INK_TOGGLE_ACTION( action );
+ GtkWidget* item = gInkToggleActionParentClass->parent_class.create_tool_item(action);
+ if ( GTK_IS_TOOL_BUTTON(item) ) {
+ GtkToolButton* button = GTK_TOOL_BUTTON(item);
if ( act->private_data->iconId ) {
- if ( GTK_IS_TOOL_BUTTON(item) ) {
- GtkToolButton* button = GTK_TOOL_BUTTON(item);
+ GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
+ gtk_tool_button_set_icon_widget( button, child );
+ } else {
+ gchar *label;
+ g_object_get (G_OBJECT(action), "label", &label, NULL);
+ gtk_tool_button_set_label( button, label );
+ }
+ } else {
+ // For now trigger a warning but don't do anything else
+ GtkToolButton* button = GTK_TOOL_BUTTON(item);
+ (void)button;
+ }
+ gtk_widget_show_all( item );
+
+ return item;
+}
- GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
- gtk_tool_button_set_icon_widget( button, child );
- } else {
- // For now trigger a warning but don't do anything else
- GtkToolButton* button = GTK_TOOL_BUTTON(item);
- (void)button;
+
+static void ink_toggle_action_update_icon( InkToggleAction* action )
+{
+ if ( action ) {
+ GSList* proxies = gtk_action_get_proxies( GTK_ACTION(action) );
+ while ( proxies ) {
+ if ( GTK_IS_TOOL_ITEM(proxies->data) ) {
+ if ( GTK_IS_TOOL_BUTTON(proxies->data) ) {
+ GtkToolButton* button = GTK_TOOL_BUTTON(proxies->data);
+
+ GtkWidget* child = sp_icon_new( action->private_data->iconSize, action->private_data->iconId );
+ gtk_widget_show_all( child );
+ gtk_tool_button_set_icon_widget( button, child );
+ }
+ }
+
+ proxies = g_slist_next( proxies );
}
}
-
- // TODO investigate if needed
- gtk_widget_show_all( item );
-
- return item;
}
-
/* --------------------------------------------------------------- */
/* --------------------------------------------------------------- */
/* --------------------------------------------------------------- */