Code

Don't force focus on the canvas when the desktop is given
[inkscape.git] / src / ink-action.cpp
index ecdc8e63cc933ae7a30c39779bb60b222864da97..f1dcaf04b5aa4d875458e1a18e7c5aad6f08b730 100644 (file)
@@ -6,6 +6,7 @@
 #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;
 
@@ -393,30 +426,51 @@ static GtkWidget* ink_toggle_action_create_menu_item( GtkAction* action )
 
 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;
 }
 
 
-
 /* --------------------------------------------------------------- */
 /* --------------------------------------------------------------- */
 /* --------------------------------------------------------------- */