Code

Updated simple action to work like toggle and radion versions
[inkscape.git] / src / ink-action.cpp
4 #include <glib/gi18n.h>
5 #include <gtk/gtktooltips.h>
6 #include <gtk/gtktoolitem.h>
7 #include <gtk/gtktoggletoolbutton.h>
8 #include <gtk/gtkcheckmenuitem.h>
10 #include "icon-size.h"
11 #include "ink-action.h"
13 #include "widgets/button.h"
14 #include "widgets/icon.h"
18 static void ink_action_class_init( InkActionClass* klass );
19 static void ink_action_init( InkAction* action );
20 static void ink_action_finalize( GObject* obj );
21 static void ink_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec );
22 static void ink_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec );
24 static GtkWidget* ink_action_create_menu_item( GtkAction* action );
25 static GtkWidget* ink_action_create_tool_item( GtkAction* action );
27 static GtkActionClass* gInkActionParentClass = 0;
29 struct _InkActionPrivate
30 {
31     gchar* iconId;
32     Inkscape::IconSize iconSize;
33 };
35 #define INK_ACTION_GET_PRIVATE( o ) ( G_TYPE_INSTANCE_GET_PRIVATE( (o), INK_ACTION_TYPE, InkActionPrivate ) )
37 GType ink_action_get_type( void )
38 {
39     static GType myType = 0;
40     if ( !myType ) {
41         static const GTypeInfo myInfo = {
42             sizeof( InkActionClass ),
43             NULL, /* base_init */
44             NULL, /* base_finalize */
45             (GClassInitFunc)ink_action_class_init,
46             NULL, /* class_finalize */
47             NULL, /* class_data */
48             sizeof( InkAction ),
49             0, /* n_preallocs */
50             (GInstanceInitFunc)ink_action_init,
51             NULL
52         };
54         myType = g_type_register_static( GTK_TYPE_ACTION, "InkAction", &myInfo, (GTypeFlags)0 );
55     }
57     return myType;
58 }
60 enum {
61     PROP_INK_ID = 1,
62     PROP_INK_SIZE
63 };
65 static void ink_action_class_init( InkActionClass* klass )
66 {
67     if ( klass ) {
68         gInkActionParentClass = GTK_ACTION_CLASS( g_type_class_peek_parent( klass ) );
69         GObjectClass * objClass = G_OBJECT_CLASS( klass );
71         objClass->finalize = ink_action_finalize;
72         objClass->get_property = ink_action_get_property;
73         objClass->set_property = ink_action_set_property;
75         klass->parent_class.create_menu_item = ink_action_create_menu_item;
76         klass->parent_class.create_tool_item = ink_action_create_tool_item;
77         /*klass->parent_class.connect_proxy = connect_proxy;*/
78         /*klass->parent_class.disconnect_proxy = disconnect_proxy;*/
80         g_object_class_install_property( objClass,
81                                          PROP_INK_ID,
82                                          g_param_spec_string( "iconId",
83                                                               "Icon ID",
84                                                               "The id for the icon",
85                                                               "",
86                                                               (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
88         g_object_class_install_property( objClass,
89                                          PROP_INK_SIZE,
90                                          g_param_spec_int( "iconSize",
91                                                            "Icon Size",
92                                                            "The size the icon",
93                                                            (int)Inkscape::ICON_SIZE_MENU,
94                                                            (int)Inkscape::ICON_SIZE_DECORATION,
95                                                            (int)Inkscape::ICON_SIZE_SMALL_TOOLBAR,
96                                                            (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
98         g_type_class_add_private( klass, sizeof(InkActionClass) );
99     }
102 static void ink_action_init( InkAction* action )
104     action->private_data = INK_ACTION_GET_PRIVATE( action );
105     action->private_data->iconId = 0;
106     action->private_data->iconSize = Inkscape::ICON_SIZE_SMALL_TOOLBAR;
109 static void ink_action_finalize( GObject* obj )
111     InkAction* action = INK_ACTION( obj );
113     g_free( action->private_data->iconId );
114     g_free( action->private_data );
118 InkAction* ink_action_new( const gchar *name,
119                            const gchar *label,
120                            const gchar *tooltip,
121                            const gchar *inkId,
122                            Inkscape::IconSize size )
124     GObject* obj = (GObject*)g_object_new( INK_ACTION_TYPE,
125                                            "name", name,
126                                            "label", label,
127                                            "tooltip", tooltip,
128                                            "iconId", inkId,
129                                            "iconSize", size,
130                                            NULL );
132     InkAction* action = INK_ACTION( obj );
134     return action;
137 static void ink_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec )
139     InkAction* action = INK_ACTION( obj );
140     (void)action;
141     switch ( propId ) {
142         case PROP_INK_ID:
143         {
144             g_value_set_string( value, action->private_data->iconId );
145         }
146         break;
148         case PROP_INK_SIZE:
149         {
150             g_value_set_int( value, action->private_data->iconSize );
151         }
152         break;
154         default:
155             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
156     }
159 void ink_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec )
161     InkAction* action = INK_ACTION( obj );
162     (void)action;
163     switch ( propId ) {
164         case PROP_INK_ID:
165         {
166             gchar* tmp = action->private_data->iconId;
167             action->private_data->iconId = g_value_dup_string( value );
168             g_free( tmp );
169         }
170         break;
172         case PROP_INK_SIZE:
173         {
174             action->private_data->iconSize = (Inkscape::IconSize)g_value_get_int( value );
175         }
176         break;
178         default:
179         {
180             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
181         }
182     }
185 static GtkWidget* ink_action_create_menu_item( GtkAction* action )
187     GtkWidget* item = gInkActionParentClass->create_menu_item( action );
189     return item;
192 static GtkWidget* ink_action_create_tool_item( GtkAction* action )
194     InkAction* act = INK_ACTION( action );
195     GtkWidget* item = gInkActionParentClass->create_tool_item(action);
197     if ( act->private_data->iconId ) {
198         if ( GTK_IS_TOOL_BUTTON(item) ) {
199             GtkToolButton* button = GTK_TOOL_BUTTON(item);
201             GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
202             gtk_tool_button_set_icon_widget( button, child );
203         } else {
204             // For now trigger a warning but don't do anything else
205             GtkToolButton* button = GTK_TOOL_BUTTON(item);
206             (void)button;
207         }
208     }
210     // TODO investigate if needed
211     gtk_widget_show_all( item );
213     return item;
218 /* --------------------------------------------------------------- */
219 /* --------------------------------------------------------------- */
220 /* --------------------------------------------------------------- */
221 /* --------------------------------------------------------------- */
224 static void ink_toggle_action_class_init( InkToggleActionClass* klass );
225 static void ink_toggle_action_init( InkToggleAction* action );
226 static void ink_toggle_action_finalize( GObject* obj );
227 static void ink_toggle_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec );
228 static void ink_toggle_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec );
230 static GtkWidget* ink_toggle_action_create_menu_item( GtkAction* action );
231 static GtkWidget* ink_toggle_action_create_tool_item( GtkAction* action );
233 static GtkToggleActionClass* gInkToggleActionParentClass = 0;
235 struct _InkToggleActionPrivate
237     gchar* iconId;
238     Inkscape::IconSize iconSize;
239 };
241 #define INK_TOGGLE_ACTION_GET_PRIVATE( o ) ( G_TYPE_INSTANCE_GET_PRIVATE( (o), INK_TOGGLE_ACTION_TYPE, InkToggleActionPrivate ) )
243 GType ink_toggle_action_get_type( void )
245     static GType myType = 0;
246     if ( !myType ) {
247         static const GTypeInfo myInfo = {
248             sizeof( InkToggleActionClass ),
249             NULL, /* base_init */
250             NULL, /* base_finalize */
251             (GClassInitFunc)ink_toggle_action_class_init,
252             NULL, /* class_finalize */
253             NULL, /* class_data */
254             sizeof( InkToggleAction ),
255             0, /* n_preallocs */
256             (GInstanceInitFunc)ink_toggle_action_init,
257             NULL
258         };
260         myType = g_type_register_static( GTK_TYPE_TOGGLE_ACTION, "InkToggleAction", &myInfo, (GTypeFlags)0 );
261     }
263     return myType;
267 static void ink_toggle_action_class_init( InkToggleActionClass* klass )
269     if ( klass ) {
270         gInkToggleActionParentClass = GTK_TOGGLE_ACTION_CLASS( g_type_class_peek_parent( klass ) );
271         GObjectClass * objClass = G_OBJECT_CLASS( klass );
273         objClass->finalize = ink_toggle_action_finalize;
274         objClass->get_property = ink_toggle_action_get_property;
275         objClass->set_property = ink_toggle_action_set_property;
277         klass->parent_class.parent_class.create_menu_item = ink_toggle_action_create_menu_item;
278         klass->parent_class.parent_class.create_tool_item = ink_toggle_action_create_tool_item;
279         /*klass->parent_class.connect_proxy = connect_proxy;*/
280         /*klass->parent_class.disconnect_proxy = disconnect_proxy;*/
282         g_object_class_install_property( objClass,
283                                          PROP_INK_ID,
284                                          g_param_spec_string( "iconId",
285                                                               "Icon ID",
286                                                               "The id for the icon",
287                                                               "",
288                                                               (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
290         g_object_class_install_property( objClass,
291                                          PROP_INK_SIZE,
292                                          g_param_spec_int( "iconSize",
293                                                            "Icon Size",
294                                                            "The size the icon",
295                                                            (int)Inkscape::ICON_SIZE_MENU,
296                                                            (int)Inkscape::ICON_SIZE_DECORATION,
297                                                            (int)Inkscape::ICON_SIZE_SMALL_TOOLBAR,
298                                                            (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
300         g_type_class_add_private( klass, sizeof(InkToggleActionClass) );
301     }
304 static void ink_toggle_action_init( InkToggleAction* action )
306     action->private_data = INK_TOGGLE_ACTION_GET_PRIVATE( action );
307     action->private_data->iconId = 0;
308     action->private_data->iconSize = Inkscape::ICON_SIZE_SMALL_TOOLBAR;
311 static void ink_toggle_action_finalize( GObject* obj )
313     InkToggleAction* action = INK_TOGGLE_ACTION( obj );
315     g_free( action->private_data->iconId );
316     g_free( action->private_data );
320 InkToggleAction* ink_toggle_action_new( const gchar *name,
321                            const gchar *label,
322                            const gchar *tooltip,
323                            const gchar *inkId,
324                            Inkscape::IconSize size )
326     GObject* obj = (GObject*)g_object_new( INK_TOGGLE_ACTION_TYPE,
327                                            "name", name,
328                                            "label", label,
329                                            "tooltip", tooltip,
330                                            "iconId", inkId,
331                                            "iconSize", size,
332                                            NULL );
334     InkToggleAction* action = INK_TOGGLE_ACTION( obj );
336     return action;
339 static void ink_toggle_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec )
341     InkToggleAction* action = INK_TOGGLE_ACTION( obj );
342     (void)action;
343     switch ( propId ) {
344         case PROP_INK_ID:
345         {
346             g_value_set_string( value, action->private_data->iconId );
347         }
348         break;
350         case PROP_INK_SIZE:
351         {
352             g_value_set_int( value, action->private_data->iconSize );
353         }
354         break;
356         default:
357             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
358     }
361 void ink_toggle_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec )
363     InkToggleAction* action = INK_TOGGLE_ACTION( obj );
364     (void)action;
365     switch ( propId ) {
366         case PROP_INK_ID:
367         {
368             gchar* tmp = action->private_data->iconId;
369             action->private_data->iconId = g_value_dup_string( value );
370             g_free( tmp );
371         }
372         break;
374         case PROP_INK_SIZE:
375         {
376             action->private_data->iconSize = (Inkscape::IconSize)g_value_get_int( value );
377         }
378         break;
380         default:
381         {
382             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
383         }
384     }
387 static GtkWidget* ink_toggle_action_create_menu_item( GtkAction* action )
389     GtkWidget* item = gInkToggleActionParentClass->parent_class.create_menu_item(action);
391     return item;
394 static GtkWidget* ink_toggle_action_create_tool_item( GtkAction* action )
396     InkToggleAction* act = INK_TOGGLE_ACTION( action );
397     GtkWidget* item = gInkToggleActionParentClass->parent_class.create_tool_item(action);
399     if ( act->private_data->iconId ) {
400         if ( GTK_IS_TOOL_BUTTON(item) ) {
401             GtkToolButton* button = GTK_TOOL_BUTTON(item);
403             GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
404             gtk_tool_button_set_icon_widget( button, child );
405         } else {
406             // For now trigger a warning but don't do anything else
407             GtkToolButton* button = GTK_TOOL_BUTTON(item);
408             (void)button;
409         }
410     }
412     // TODO investigate if needed
413     gtk_widget_show_all( item );
415     return item;
420 /* --------------------------------------------------------------- */
421 /* --------------------------------------------------------------- */
422 /* --------------------------------------------------------------- */
423 /* --------------------------------------------------------------- */
426 static void ink_radio_action_class_init( InkRadioActionClass* klass );
427 static void ink_radio_action_init( InkRadioAction* action );
428 static void ink_radio_action_finalize( GObject* obj );
429 static void ink_radio_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec );
430 static void ink_radio_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec );
432 static GtkWidget* ink_radio_action_create_menu_item( GtkAction* action );
433 static GtkWidget* ink_radio_action_create_tool_item( GtkAction* action );
435 static GtkRadioActionClass* gInkRadioActionParentClass = 0;
437 struct _InkRadioActionPrivate
439     gchar* iconId;
440     Inkscape::IconSize iconSize;
441 };
443 #define INK_RADIO_ACTION_GET_PRIVATE( o ) ( G_TYPE_INSTANCE_GET_PRIVATE( (o), INK_RADIO_ACTION_TYPE, InkRadioActionPrivate ) )
445 GType ink_radio_action_get_type( void )
447     static GType myType = 0;
448     if ( !myType ) {
449         static const GTypeInfo myInfo = {
450             sizeof( InkRadioActionClass ),
451             NULL, /* base_init */
452             NULL, /* base_finalize */
453             (GClassInitFunc)ink_radio_action_class_init,
454             NULL, /* class_finalize */
455             NULL, /* class_data */
456             sizeof( InkRadioAction ),
457             0, /* n_preallocs */
458             (GInstanceInitFunc)ink_radio_action_init,
459             NULL
460         };
462         myType = g_type_register_static( GTK_TYPE_RADIO_ACTION, "InkRadioAction", &myInfo, (GTypeFlags)0 );
463     }
465     return myType;
469 static void ink_radio_action_class_init( InkRadioActionClass* klass )
471     if ( klass ) {
472         gInkRadioActionParentClass = GTK_RADIO_ACTION_CLASS( g_type_class_peek_parent( klass ) );
473         GObjectClass * objClass = G_OBJECT_CLASS( klass );
475         objClass->finalize = ink_radio_action_finalize;
476         objClass->get_property = ink_radio_action_get_property;
477         objClass->set_property = ink_radio_action_set_property;
479         klass->parent_class.parent_class.parent_class.create_menu_item = ink_radio_action_create_menu_item;
480         klass->parent_class.parent_class.parent_class.create_tool_item = ink_radio_action_create_tool_item;
481         /*klass->parent_class.connect_proxy = connect_proxy;*/
482         /*klass->parent_class.disconnect_proxy = disconnect_proxy;*/
484         g_object_class_install_property( objClass,
485                                          PROP_INK_ID,
486                                          g_param_spec_string( "iconId",
487                                                               "Icon ID",
488                                                               "The id for the icon",
489                                                               "",
490                                                               (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
492         g_object_class_install_property( objClass,
493                                          PROP_INK_SIZE,
494                                          g_param_spec_int( "iconSize",
495                                                            "Icon Size",
496                                                            "The size the icon",
497                                                            (int)Inkscape::ICON_SIZE_MENU,
498                                                            (int)Inkscape::ICON_SIZE_DECORATION,
499                                                            (int)Inkscape::ICON_SIZE_SMALL_TOOLBAR,
500                                                            (GParamFlags)(G_PARAM_READABLE | G_PARAM_WRITABLE | G_PARAM_CONSTRUCT) ) );
502         g_type_class_add_private( klass, sizeof(InkRadioActionClass) );
503     }
506 static void ink_radio_action_init( InkRadioAction* action )
508     action->private_data = INK_RADIO_ACTION_GET_PRIVATE( action );
509     action->private_data->iconId = 0;
510     action->private_data->iconSize = Inkscape::ICON_SIZE_SMALL_TOOLBAR;
513 static void ink_radio_action_finalize( GObject* obj )
515     InkRadioAction* action = INK_RADIO_ACTION( obj );
517     g_free( action->private_data->iconId );
518     g_free( action->private_data );
522 InkRadioAction* ink_radio_action_new( const gchar *name,
523                            const gchar *label,
524                            const gchar *tooltip,
525                            const gchar *inkId,
526                            Inkscape::IconSize size )
528     GObject* obj = (GObject*)g_object_new( INK_RADIO_ACTION_TYPE,
529                                            "name", name,
530                                            "label", label,
531                                            "tooltip", tooltip,
532                                            "iconId", inkId,
533                                            "iconSize", size,
534                                            NULL );
536     InkRadioAction* action = INK_RADIO_ACTION( obj );
538     return action;
541 static void ink_radio_action_get_property( GObject* obj, guint propId, GValue* value, GParamSpec * pspec )
543     InkRadioAction* action = INK_RADIO_ACTION( obj );
544     (void)action;
545     switch ( propId ) {
546         case PROP_INK_ID:
547         {
548             g_value_set_string( value, action->private_data->iconId );
549         }
550         break;
552         case PROP_INK_SIZE:
553         {
554             g_value_set_int( value, action->private_data->iconSize );
555         }
556         break;
558         default:
559             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
560     }
563 void ink_radio_action_set_property( GObject* obj, guint propId, const GValue *value, GParamSpec* pspec )
565     InkRadioAction* action = INK_RADIO_ACTION( obj );
566     (void)action;
567     switch ( propId ) {
568         case PROP_INK_ID:
569         {
570             gchar* tmp = action->private_data->iconId;
571             action->private_data->iconId = g_value_dup_string( value );
572             g_free( tmp );
573         }
574         break;
576         case PROP_INK_SIZE:
577         {
578             action->private_data->iconSize = (Inkscape::IconSize)g_value_get_int( value );
579         }
580         break;
582         default:
583         {
584             G_OBJECT_WARN_INVALID_PROPERTY_ID( obj, propId, pspec );
585         }
586     }
589 static GtkWidget* ink_radio_action_create_menu_item( GtkAction* action )
591     GtkWidget* item = gInkRadioActionParentClass->parent_class.parent_class.create_menu_item(action);
593     return item;
596 static GtkWidget* ink_radio_action_create_tool_item( GtkAction* action )
598     InkRadioAction* act = INK_RADIO_ACTION( action );
599     GtkWidget* item = gInkRadioActionParentClass->parent_class.parent_class.create_tool_item(action);
601     if ( act->private_data->iconId ) {
602         if ( GTK_IS_TOOL_BUTTON(item) ) {
603             GtkToolButton* button = GTK_TOOL_BUTTON(item);
605             GtkWidget* child = sp_icon_new( act->private_data->iconSize, act->private_data->iconId );
606             gtk_tool_button_set_icon_widget( button, child );
607         } else {
608             // For now trigger a warning but don't do anything else
609             GtkToolButton* button = GTK_TOOL_BUTTON(item);
610             (void)button;
611         }
612     }
614     // TODO investigate if needed
615     gtk_widget_show_all( item );
617     return item;