127
155
gchar const *type_name;
128
156
gchar const *data_name;
129
157
GtkWidget *(*create_func)(SPDesktop *desktop);
158
void (*prep_func)(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
159
gchar const *ui_name;
161
gchar const *swatch_tool;
162
gchar const *swatch_tip;
130
163
} const aux_toolboxes[] = {
131
{ "SPSelectContext", "select_toolbox", sp_select_toolbox_new },
132
{ "SPNodeContext", "node_toolbox", sp_node_toolbox_new },
133
{ "SPZoomContext", "zoom_toolbox", sp_zoom_toolbox_new },
134
{ "SPStarContext", "star_toolbox", sp_star_toolbox_new },
135
{ "SPRectContext", "rect_toolbox", sp_rect_toolbox_new },
136
{ "SPArcContext", "arc_toolbox", sp_arc_toolbox_new },
137
{ "SPSpiralContext", "spiral_toolbox", sp_spiral_toolbox_new },
138
{ "SPPencilContext", "pencil_toolbox", sp_pencil_toolbox_new },
139
{ "SPPenContext", "pen_toolbox", sp_pen_toolbox_new },
140
{ "SPDynaDrawContext", "calligraphy_toolbox", sp_calligraphy_toolbox_new },
141
{ "SPTextContext", "text_toolbox", sp_text_toolbox_new },
142
{ "SPDropperContext", "dropper_toolbox", sp_dropper_toolbox_new },
143
{ "SPGradientContext", "gradient_toolbox", sp_gradient_toolbox_new },
144
{ "SPConnectorContext", "connector_toolbox", sp_connector_toolbox_new },
164
{ "SPSelectContext", "select_toolbox", 0, sp_select_toolbox_prep, "SelectToolbar",
165
SP_VERB_INVALID, 0, 0},
166
{ "SPNodeContext", "node_toolbox", 0, sp_node_toolbox_prep, "NodeToolbar",
167
SP_VERB_INVALID, 0, 0},
168
{ "SPTweakContext", "tweak_toolbox", 0, sp_tweak_toolbox_prep, "TweakToolbar",
169
SP_VERB_CONTEXT_TWEAK_PREFS, "tools.tweak", _("Color/opacity used for color tweaking")},
170
{ "SPZoomContext", "zoom_toolbox", 0, sp_zoom_toolbox_prep, "ZoomToolbar",
171
SP_VERB_INVALID, 0, 0},
172
{ "SPStarContext", "star_toolbox", 0, sp_star_toolbox_prep, "StarToolbar",
173
SP_VERB_CONTEXT_STAR_PREFS, "tools.shapes.star", _("Style of new stars")},
174
{ "SPRectContext", "rect_toolbox", 0, sp_rect_toolbox_prep, "RectToolbar",
175
SP_VERB_CONTEXT_RECT_PREFS, "tools.shapes.rect", _("Style of new rectangles")},
176
{ "Box3DContext", "3dbox_toolbox", 0, box3d_toolbox_prep, "3DBoxToolbar",
177
SP_VERB_CONTEXT_3DBOX_PREFS, "tools.shapes.3dbox", _("Style of new 3D boxes")},
178
{ "SPArcContext", "arc_toolbox", 0, sp_arc_toolbox_prep, "ArcToolbar",
179
SP_VERB_CONTEXT_ARC_PREFS, "tools.shapes.arc", _("Style of new ellipses")},
180
{ "SPSpiralContext", "spiral_toolbox", 0, sp_spiral_toolbox_prep, "SpiralToolbar",
181
SP_VERB_CONTEXT_SPIRAL_PREFS, "tools.shapes.spiral", _("Style of new spirals")},
182
{ "SPPencilContext", "pencil_toolbox", 0, sp_pencil_toolbox_prep, "PencilToolbar",
183
SP_VERB_CONTEXT_PENCIL_PREFS, "tools.freehand.pencil", _("Style of new paths created by Pencil")},
184
{ "SPPenContext", "pen_toolbox", 0, sp_pen_toolbox_prep, "PenToolbar",
185
SP_VERB_CONTEXT_PEN_PREFS, "tools.freehand.pen", _("Style of new paths created by Pen")},
186
{ "SPDynaDrawContext", "calligraphy_toolbox", 0, sp_calligraphy_toolbox_prep,"CalligraphyToolbar",
187
SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "tools.calligraphic", _("Style of new calligraphic strokes")},
188
{ "SPTextContext", "text_toolbox", sp_text_toolbox_new, 0, 0,
189
SP_VERB_INVALID, 0, 0},
190
{ "SPDropperContext", "dropper_toolbox", 0, sp_dropper_toolbox_prep, "DropperToolbar",
191
SP_VERB_INVALID, 0, 0},
192
{ "SPGradientContext", "gradient_toolbox", sp_gradient_toolbox_new, 0, 0,
193
SP_VERB_INVALID, 0, 0},
194
{ "SPConnectorContext", "connector_toolbox", 0, sp_connector_toolbox_prep, "ConnectorToolbar",
195
SP_VERB_INVALID, 0, 0},
196
{ "SPFloodContext", "paintbucket_toolbox", 0, sp_paintbucket_toolbox_prep, "PaintbucketToolbar",
197
SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "tools.paintbucket", _("Style of Paint Bucket fill objects")},
198
{ NULL, NULL, NULL, NULL, NULL, SP_VERB_INVALID, NULL, NULL }
202
static gchar const * ui_descr =
204
" <toolbar name='SelectToolbar'>"
205
" <toolitem action='EditSelectAll' />"
206
" <toolitem action='EditSelectAllInAllLayers' />"
207
" <toolitem action='EditDeselect' />"
209
" <toolitem action='ObjectRotate90CCW' />"
210
" <toolitem action='ObjectRotate90' />"
211
" <toolitem action='ObjectFlipHorizontally' />"
212
" <toolitem action='ObjectFlipVertically' />"
214
" <toolitem action='SelectionToBack' />"
215
" <toolitem action='SelectionLower' />"
216
" <toolitem action='SelectionRaise' />"
217
" <toolitem action='SelectionToFront' />"
219
" <toolitem action='XAction' />"
220
" <toolitem action='YAction' />"
221
" <toolitem action='WidthAction' />"
222
" <toolitem action='LockAction' />"
223
" <toolitem action='HeightAction' />"
224
" <toolitem action='UnitsAction' />"
226
" <toolitem action='transform_affect_label' />"
227
" <toolitem action='transform_stroke' />"
228
" <toolitem action='transform_corners' />"
229
" <toolitem action='transform_gradient' />"
230
" <toolitem action='transform_pattern' />"
233
" <toolbar name='NodeToolbar'>"
234
" <toolitem action='NodeInsertAction' />"
235
" <toolitem action='NodeDeleteAction' />"
237
" <toolitem action='NodeJoinAction' />"
238
" <toolitem action='NodeJoinSegmentAction' />"
239
" <toolitem action='NodeDeleteSegmentAction' />"
240
" <toolitem action='NodeBreakAction' />"
242
" <toolitem action='NodeCuspAction' />"
243
" <toolitem action='NodeSmoothAction' />"
244
" <toolitem action='NodeSymmetricAction' />"
246
" <toolitem action='NodeLineAction' />"
247
" <toolitem action='NodeCurveAction' />"
249
" <toolitem action='ObjectToPath' />"
250
" <toolitem action='StrokeToPath' />"
252
" <toolitem action='NodesShowHandlesAction' />"
254
" <toolitem action='EditNextLPEParameterAction' />"
256
" <toolitem action='NodeXAction' />"
257
" <toolitem action='NodeYAction' />"
258
" <toolitem action='NodeUnitsAction' />"
261
" <toolbar name='TweakToolbar'>"
262
" <toolitem action='TweakWidthAction' />"
264
" <toolitem action='TweakForceAction' />"
265
" <toolitem action='TweakPressureAction' />"
267
" <toolitem action='TweakModeAction' />"
269
" <toolitem action='TweakFidelityAction' />"
271
" <toolitem action='TweakChannelsLabel' />"
272
" <toolitem action='TweakDoH' />"
273
" <toolitem action='TweakDoS' />"
274
" <toolitem action='TweakDoL' />"
275
" <toolitem action='TweakDoO' />"
278
" <toolbar name='ZoomToolbar'>"
279
" <toolitem action='ZoomIn' />"
280
" <toolitem action='ZoomOut' />"
282
" <toolitem action='Zoom1:0' />"
283
" <toolitem action='Zoom1:2' />"
284
" <toolitem action='Zoom2:1' />"
286
" <toolitem action='ZoomSelection' />"
287
" <toolitem action='ZoomDrawing' />"
288
" <toolitem action='ZoomPage' />"
289
" <toolitem action='ZoomPageWidth' />"
291
" <toolitem action='ZoomPrev' />"
292
" <toolitem action='ZoomNext' />"
295
" <toolbar name='StarToolbar'>"
297
" <toolitem action='StarStateAction' />"
299
" <toolitem action='FlatAction' />"
301
" <toolitem action='MagnitudeAction' />"
302
" <toolitem action='SpokeAction' />"
303
" <toolitem action='RoundednessAction' />"
304
" <toolitem action='RandomizationAction' />"
306
" <toolitem action='StarResetAction' />"
309
" <toolbar name='RectToolbar'>"
310
" <toolitem action='RectStateAction' />"
311
" <toolitem action='RectWidthAction' />"
312
" <toolitem action='RectHeightAction' />"
313
" <toolitem action='RadiusXAction' />"
314
" <toolitem action='RadiusYAction' />"
315
" <toolitem action='RectUnitsAction' />"
317
" <toolitem action='RectResetAction' />"
320
" <toolbar name='3DBoxToolbar'>"
321
" <toolitem action='3DBoxAngleXAction' />"
322
" <toolitem action='3DBoxVPXStateAction' />"
324
" <toolitem action='3DBoxAngleYAction' />"
325
" <toolitem action='3DBoxVPYStateAction' />"
327
" <toolitem action='3DBoxAngleZAction' />"
328
" <toolitem action='3DBoxVPZStateAction' />"
331
" <toolbar name='SpiralToolbar'>"
332
" <toolitem action='SpiralStateAction' />"
333
" <toolitem action='SpiralRevolutionAction' />"
334
" <toolitem action='SpiralExpansionAction' />"
335
" <toolitem action='SpiralT0Action' />"
337
" <toolitem action='SpiralResetAction' />"
340
" <toolbar name='PenToolbar'>"
343
" <toolbar name='PencilToolbar'>"
346
" <toolbar name='CalligraphyToolbar'>"
348
" <toolitem action='CalligraphyWidthAction' />"
349
" <toolitem action='PressureAction' />"
350
" <toolitem action='TraceAction' />"
351
" <toolitem action='ThinningAction' />"
353
" <toolitem action='AngleAction' />"
354
" <toolitem action='TiltAction' />"
355
" <toolitem action='FixationAction' />"
357
" <toolitem action='CapRoundingAction' />"
359
" <toolitem action='TremorAction' />"
360
" <toolitem action='WiggleAction' />"
361
" <toolitem action='MassAction' />"
363
" <toolitem action='CalligraphyResetAction' />"
366
" <toolbar name='ArcToolbar'>"
367
" <toolitem action='ArcStateAction' />"
369
" <toolitem action='ArcStartAction' />"
370
" <toolitem action='ArcEndAction' />"
372
" <toolitem action='ArcOpenAction' />"
374
" <toolitem action='ArcResetAction' />"
378
" <toolbar name='PaintbucketToolbar'>"
379
" <toolitem action='ChannelsAction' />"
381
" <toolitem action='ThresholdAction' />"
383
" <toolitem action='OffsetAction' />"
384
" <toolitem action='PaintbucketUnitsAction' />"
386
" <toolitem action='AutoGapAction' />"
388
" <toolitem action='PaintbucketResetAction' />"
391
" <toolbar name='DropperToolbar'>"
392
" <toolitem action='DropperPickAlphaAction' />"
393
" <toolitem action='DropperSetAlphaAction' />"
396
" <toolbar name='ConnectorToolbar'>"
397
" <toolitem action='ConnectorAvoidAction' />"
398
" <toolitem action='ConnectorIgnoreAction' />"
399
" <toolitem action='ConnectorSpacingAction' />"
400
" <toolitem action='ConnectorGraphAction' />"
401
" <toolitem action='ConnectorLengthAction' />"
402
" <toolitem action='ConnectorDirectedAction' />"
403
" <toolitem action='ConnectorOverlapAction' />"
409
static GtkActionGroup* create_or_fetch_actions( SPDesktop* desktop );
148
411
static void toolbox_set_desktop (GtkWidget *toolbox, SPDesktop *desktop, SetupFunction setup_func, UpdateFunction update_func, sigc::connection*);
150
413
static void setup_tool_toolbox (GtkWidget *toolbox, SPDesktop *desktop);
693
static EgeAdjustmentAction * create_adjustment_action( gchar const *name,
694
gchar const *label, gchar const *shortLabel, gchar const *tooltip,
695
gchar const *path, gchar const *data, gdouble def,
696
GtkWidget *focusTarget,
699
gboolean altx, gchar const *altx_mark,
700
gdouble lower, gdouble upper, gdouble step, gdouble page,
701
gchar const** descrLabels, gdouble const* descrValues, guint descrCount,
702
void (*callback)(GtkAdjustment *, GObject *),
703
gdouble climb = 0.1, guint digits = 3, double factor = 1.0 )
705
GtkAdjustment* adj = GTK_ADJUSTMENT( gtk_adjustment_new( prefs_get_double_attribute(path, data, def) * factor,
706
lower, upper, step, page, page ) );
708
sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(us), adj );
711
gtk_signal_connect( GTK_OBJECT(adj), "value-changed", GTK_SIGNAL_FUNC(callback), dataKludge );
713
EgeAdjustmentAction* act = ege_adjustment_action_new( adj, name, label, tooltip, 0, climb, digits );
715
g_object_set( act, "short_label", shortLabel, NULL );
718
if ( (descrCount > 0) && descrLabels && descrValues ) {
719
ege_adjustment_action_set_descriptions( act, descrLabels, descrValues, descrCount );
723
ege_adjustment_action_set_focuswidget( act, focusTarget );
726
if ( altx && altx_mark ) {
727
g_object_set( G_OBJECT(act), "self-id", altx_mark, NULL );
731
g_object_set_data( dataKludge, data, adj );
734
// Using a cast just to make sure we pass in the right kind of function pointer
735
g_object_set( G_OBJECT(act), "tool-post", static_cast<EgeWidgetFixup>(sp_set_font_size_smaller), NULL );
324
741
//####################################
325
742
//# node editing callbacks
326
743
//####################################
746
* FIXME: Returns current shape_editor in context. // later eliminate this function at all!
748
static ShapeEditor *get_current_shape_editor()
750
if (!SP_ACTIVE_DESKTOP) {
754
SPEventContext *event_context = (SP_ACTIVE_DESKTOP)->event_context;
756
if (!SP_IS_NODE_CONTEXT(event_context)) {
760
return SP_NODE_CONTEXT(event_context)->shape_editor;
329
765
sp_node_path_edit_add(void)
331
sp_node_selected_add_node();
767
ShapeEditor *shape_editor = get_current_shape_editor();
768
if (shape_editor) shape_editor->add_node();
335
772
sp_node_path_edit_delete(void)
337
sp_node_selected_delete();
774
ShapeEditor *shape_editor = get_current_shape_editor();
775
if (shape_editor) shape_editor->delete_nodes();
341
779
sp_node_path_edit_delete_segment(void)
343
sp_node_selected_delete_segment();
781
ShapeEditor *shape_editor = get_current_shape_editor();
782
if (shape_editor) shape_editor->delete_segment();
347
786
sp_node_path_edit_break(void)
349
sp_node_selected_break();
788
ShapeEditor *shape_editor = get_current_shape_editor();
789
if (shape_editor) shape_editor->break_at_nodes();
353
793
sp_node_path_edit_join(void)
355
sp_node_selected_join();
795
ShapeEditor *shape_editor = get_current_shape_editor();
796
if (shape_editor) shape_editor->join_nodes();
359
800
sp_node_path_edit_join_segment(void)
361
sp_node_selected_join_segment();
802
ShapeEditor *shape_editor = get_current_shape_editor();
803
if (shape_editor) shape_editor->join_segments();
365
807
sp_node_path_edit_toline(void)
367
sp_node_selected_set_line_type(NR_LINETO);
809
ShapeEditor *shape_editor = get_current_shape_editor();
810
if (shape_editor) shape_editor->set_type_of_segments(NR_LINETO);
371
814
sp_node_path_edit_tocurve(void)
373
sp_node_selected_set_line_type(NR_CURVETO);
816
ShapeEditor *shape_editor = get_current_shape_editor();
817
if (shape_editor) shape_editor->set_type_of_segments(NR_CURVETO);
377
821
sp_node_path_edit_cusp(void)
379
sp_node_selected_set_type(Inkscape::NodePath::NODE_CUSP);
823
ShapeEditor *shape_editor = get_current_shape_editor();
824
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_CUSP);
383
828
sp_node_path_edit_smooth(void)
385
sp_node_selected_set_type(Inkscape::NodePath::NODE_SMOOTH);
830
ShapeEditor *shape_editor = get_current_shape_editor();
831
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SMOOTH);
389
835
sp_node_path_edit_symmetrical(void)
391
sp_node_selected_set_type(Inkscape::NodePath::NODE_SYMM);
837
ShapeEditor *shape_editor = get_current_shape_editor();
838
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SYMM);
394
static void toggle_show_handles (GtkWidget *button, gpointer data) {
395
bool show = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
841
static void toggle_show_handles (GtkToggleAction *act, gpointer /*data*/) {
842
bool show = gtk_toggle_action_get_active( act );
396
843
prefs_set_int_attribute ("tools.nodes", "show_handles", show ? 1 : 0);
397
sp_nodepath_show_handles(show);
844
ShapeEditor *shape_editor = get_current_shape_editor();
845
if (shape_editor) shape_editor->show_handles(show);
848
void sp_node_path_edit_nextLPEparam (GtkAction */*act*/, gpointer data) {
849
sp_selection_next_patheffect_param( reinterpret_cast<SPDesktop*>(data) );
852
/* is called when the node selection is modified */
854
sp_node_toolbox_coord_changed(gpointer /*shape_editor*/, GObject *tbl)
856
GtkAction* xact = GTK_ACTION( g_object_get_data( tbl, "nodes_x_action" ) );
857
GtkAction* yact = GTK_ACTION( g_object_get_data( tbl, "nodes_y_action" ) );
858
GtkAdjustment *xadj = ege_adjustment_action_get_adjustment(EGE_ADJUSTMENT_ACTION(xact));
859
GtkAdjustment *yadj = ege_adjustment_action_get_adjustment(EGE_ADJUSTMENT_ACTION(yact));
861
// quit if run by the attr_changed listener
862
if (g_object_get_data( tbl, "freeze" )) {
866
// in turn, prevent listener from responding
867
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE));
869
UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) );
870
SPUnit const *unit = tracker->getActiveUnit();
872
ShapeEditor *shape_editor = get_current_shape_editor();
873
if (shape_editor && shape_editor->has_nodepath()) {
874
Inkscape::NodePath::Path *nodepath = shape_editor->get_nodepath();
877
n_selected = nodepath->numSelected();
880
if (n_selected == 0) {
881
gtk_action_set_sensitive(xact, FALSE);
882
gtk_action_set_sensitive(yact, FALSE);
884
gtk_action_set_sensitive(xact, TRUE);
885
gtk_action_set_sensitive(yact, TRUE);
886
NR::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit);
887
NR::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit);
889
if (n_selected == 1) {
890
NR::Point sel_node = nodepath->singleSelectedCoords();
891
if (oldx != sel_node[NR::X] || oldy != sel_node[NR::Y]) {
892
gtk_adjustment_set_value(xadj, sp_pixels_get_units(sel_node[NR::X], *unit));
893
gtk_adjustment_set_value(yadj, sp_pixels_get_units(sel_node[NR::Y], *unit));
896
NR::Maybe<NR::Coord> x = sp_node_selected_common_coord(nodepath, NR::X);
897
NR::Maybe<NR::Coord> y = sp_node_selected_common_coord(nodepath, NR::Y);
898
if ((x && ((*x) != oldx)) || (y && ((*y) != oldy))) {
899
/* Note: Currently x and y will always have a value, even if the coordinates of the
900
selected nodes don't coincide (in this case we use the coordinates of the center
901
of the bounding box). So the entries are never set to zero. */
902
// FIXME: Maybe we should clear the entry if several nodes are selected
903
// instead of providing a kind of average value
904
gtk_adjustment_set_value(xadj, sp_pixels_get_units(x ? (*x) : 0.0, *unit));
905
gtk_adjustment_set_value(yadj, sp_pixels_get_units(y ? (*y) : 0.0, *unit));
910
// no shape-editor or nodepath yet (when we just switched to the tool); coord entries must be inactive
911
gtk_action_set_sensitive(xact, FALSE);
912
gtk_action_set_sensitive(yact, FALSE);
915
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
919
sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_name)
921
SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
923
UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
924
SPUnit const *unit = tracker->getActiveUnit();
926
if (sp_document_get_undo_sensitive(sp_desktop_document(desktop))) {
927
prefs_set_double_attribute("tools.nodes", value_name, sp_units_get_pixels(adj->value, *unit));
930
// quit if run by the attr_changed listener
931
if (g_object_get_data( tbl, "freeze" )) {
935
// in turn, prevent listener from responding
936
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE));
938
ShapeEditor *shape_editor = get_current_shape_editor();
939
if (shape_editor && shape_editor->has_nodepath()) {
940
double val = sp_units_get_pixels(gtk_adjustment_get_value(adj), *unit);
941
if (!strcmp(value_name, "x")) {
942
sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::X);
944
if (!strcmp(value_name, "y")) {
945
sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::Y);
949
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
953
sp_node_path_x_value_changed(GtkAdjustment *adj, GObject *tbl)
955
sp_node_path_value_changed(adj, tbl, "x");
959
sp_node_path_y_value_changed(GtkAdjustment *adj, GObject *tbl)
961
sp_node_path_value_changed(adj, tbl, "y");
400
964
//################################
401
965
//## Node Editing Toolbox ##
402
966
//################################
405
sp_node_toolbox_new(SPDesktop *desktop)
968
static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
407
Inkscape::UI::View::View *view = desktop;
409
GtkTooltips *tt = gtk_tooltips_new();
410
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
412
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
414
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_insert",
415
GTK_SIGNAL_FUNC(sp_node_path_edit_add), tt, _("Insert new nodes into selected segments"));
416
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_delete",
417
GTK_SIGNAL_FUNC(sp_node_path_edit_delete), tt, _("Delete selected nodes"));
419
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
421
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_join",
422
GTK_SIGNAL_FUNC(sp_node_path_edit_join), tt, _("Join selected endnodes"));
423
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_join_segment",
424
GTK_SIGNAL_FUNC(sp_node_path_edit_join_segment), tt, _("Join selected endnodes with a new segment"));
426
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_delete_segment",
427
GTK_SIGNAL_FUNC(sp_node_path_edit_delete_segment), tt, _("Split path between two non-endpoint nodes"));
429
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_break",
430
GTK_SIGNAL_FUNC(sp_node_path_edit_break), tt, _("Break path at selected nodes"));
432
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
434
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_cusp",
435
GTK_SIGNAL_FUNC(sp_node_path_edit_cusp), tt, _("Make selected nodes corner"));
437
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_smooth",
438
GTK_SIGNAL_FUNC(sp_node_path_edit_smooth), tt, _("Make selected nodes smooth"));
440
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_symmetric",
441
GTK_SIGNAL_FUNC(sp_node_path_edit_symmetrical), tt, _("Make selected nodes symmetric"));
443
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
445
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_line",
446
GTK_SIGNAL_FUNC(sp_node_path_edit_toline), tt, _("Make selected segments lines"));
448
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_curve",
449
GTK_SIGNAL_FUNC(sp_node_path_edit_tocurve), tt, _("Make selected segments curves"));
451
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
453
sp_toolbox_button_normal_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, Inkscape::Verb::get(SP_VERB_OBJECT_TO_CURVE), view, tt);
455
sp_toolbox_button_normal_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, Inkscape::Verb::get(SP_VERB_SELECTION_OUTLINE), view, tt);
457
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
459
GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
460
GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
463
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
464
SP_BUTTON_TYPE_TOGGLE,
466
"nodes_show_handles",
467
_("Show the Bezier handles of selected nodes"),
469
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.nodes", "show_handles", 1));
470
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (toggle_show_handles), desktop);
471
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
474
gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
475
gtk_box_pack_start(GTK_BOX(tb), cvbox, FALSE, FALSE, 0);
477
gtk_widget_show_all(tb);
481
} // end of sp_node_toolbox_new()
970
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
971
tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
972
g_object_set_data( holder, "tracker", tracker );
975
InkAction* inky = ink_action_new( "NodeInsertAction",
977
_("Insert new nodes into selected segments"),
979
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
980
g_object_set( inky, "short_label", _("Insert"), NULL );
981
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add), 0 );
982
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
986
InkAction* inky = ink_action_new( "NodeDeleteAction",
988
_("Delete selected nodes"),
990
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
991
g_object_set( inky, "short_label", _("Delete"), NULL );
992
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete), 0 );
993
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
997
InkAction* inky = ink_action_new( "NodeJoinAction",
999
_("Join selected endnodes"),
1001
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1002
g_object_set( inky, "short_label", _("Join"), NULL );
1003
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join), 0 );
1004
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1008
InkAction* inky = ink_action_new( "NodeJoinSegmentAction",
1010
_("Join selected endnodes with a new segment"),
1011
"node_join_segment",
1012
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1013
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join_segment), 0 );
1014
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1018
InkAction* inky = ink_action_new( "NodeDeleteSegmentAction",
1019
_("Delete Segment"),
1020
_("Split path between two non-endpoint nodes"),
1021
"node_delete_segment",
1022
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1023
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete_segment), 0 );
1024
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1028
InkAction* inky = ink_action_new( "NodeBreakAction",
1030
_("Break path at selected nodes"),
1032
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1033
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_break), 0 );
1034
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1038
InkAction* inky = ink_action_new( "NodeCuspAction",
1040
_("Make selected nodes corner"),
1042
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1043
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_cusp), 0 );
1044
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1048
InkAction* inky = ink_action_new( "NodeSmoothAction",
1050
_("Make selected nodes smooth"),
1052
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1053
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_smooth), 0 );
1054
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1058
InkAction* inky = ink_action_new( "NodeSymmetricAction",
1059
_("Node Symmetric"),
1060
_("Make selected nodes symmetric"),
1062
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1063
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_symmetrical), 0 );
1064
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1068
InkAction* inky = ink_action_new( "NodeLineAction",
1070
_("Make selected segments lines"),
1072
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1073
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_toline), 0 );
1074
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1078
InkAction* inky = ink_action_new( "NodeCurveAction",
1080
_("Make selected segments curves"),
1082
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1083
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_tocurve), 0 );
1084
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1088
InkToggleAction* act = ink_toggle_action_new( "NodesShowHandlesAction",
1090
_("Show the Bezier handles of selected nodes"),
1091
"nodes_show_handles",
1092
Inkscape::ICON_SIZE_DECORATION );
1093
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
1094
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_handles), desktop );
1095
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.nodes", "show_handles", 1 ) );
1099
InkAction* inky = ink_action_new( "EditNextLPEParameterAction",
1100
_("Next Path Effect Parameter"),
1101
_("Show next Path Effect parameter for editing"),
1102
"edit_next_parameter",
1103
Inkscape::ICON_SIZE_DECORATION );
1104
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_nextLPEparam), desktop );
1105
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1108
/* X coord of selected node(s) */
1110
EgeAdjustmentAction* eact = 0;
1111
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1112
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
1113
eact = create_adjustment_action( "NodeXAction",
1114
_("X coordinate:"), _("X:"), _("X coordinate of selected node(s)"),
1115
"tools.nodes", "Xcoord", 0,
1116
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-nodes",
1117
-1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1118
labels, values, G_N_ELEMENTS(labels),
1119
sp_node_path_x_value_changed );
1120
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
1121
g_object_set_data( holder, "nodes_x_action", eact );
1122
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1123
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1126
/* Y coord of selected node(s) */
1128
EgeAdjustmentAction* eact = 0;
1129
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1130
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
1131
eact = create_adjustment_action( "NodeYAction",
1132
_("Y coordinate:"), _("Y:"), _("Y coordinate of selected node(s)"),
1133
"tools.nodes", "Ycoord", 0,
1134
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1135
-1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1136
labels, values, G_N_ELEMENTS(labels),
1137
sp_node_path_y_value_changed );
1138
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
1139
g_object_set_data( holder, "nodes_y_action", eact );
1140
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1141
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1144
// add the units menu
1146
GtkAction* act = tracker->createAction( "NodeUnitsAction", _("Units"), ("") );
1147
gtk_action_group_add_action( mainActions, act );
1150
sigc::connection *connection = new sigc::connection (
1151
desktop->connectToolSubselectionChanged(sigc::bind (sigc::ptr_fun(sp_node_toolbox_coord_changed), (GObject *)holder))
1154
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
1155
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1156
} // end of sp_node_toolbox_prep()
484
1159
//########################
485
1160
//## Zoom Toolbox ##
486
1161
//########################
489
sp_zoom_toolbox_new(SPDesktop *desktop)
1163
static void sp_zoom_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
491
Inkscape::UI::View::View *view=desktop;
493
GtkTooltips *tt = gtk_tooltips_new();
494
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
496
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0),
497
FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
499
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_IN), view, tt);
501
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_OUT), view, tt);
503
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
505
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_SELECTION), view, tt);
507
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_DRAWING), view, tt);
509
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_PAGE), view, tt);
511
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_PAGE_WIDTH), view, tt);
513
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
515
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_PREV), view, tt);
517
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_NEXT), view, tt);
519
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
521
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_1_1), view, tt);
523
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_1_2), view, tt);
525
sp_toolbox_button_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_2_1), view, tt);
527
gtk_widget_show_all(tb);
531
} // end of sp_zoom_toolbox_new()
1165
// no custom GtkAction setup needed
1166
} // end of sp_zoom_toolbox_prep()
534
1169
sp_tool_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop)
655
1362
setup_commands_toolbox(GtkWidget *toolbox, SPDesktop *desktop)
657
Inkscape::UI::View::View *view = desktop;
659
GtkTooltips *tt = gtk_tooltips_new();
660
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
1364
gchar const * descr =
1366
" <toolbar name='CommandsToolbar'>"
1367
" <toolitem action='FileNew' />"
1368
" <toolitem action='FileOpen' />"
1369
" <toolitem action='FileSave' />"
1370
" <toolitem action='FilePrint' />"
1372
" <toolitem action='FileImport' />"
1373
" <toolitem action='FileExport' />"
1375
" <toolitem action='EditUndo' />"
1376
" <toolitem action='EditRedo' />"
1378
" <toolitem action='EditCopy' />"
1379
" <toolitem action='EditCut' />"
1380
" <toolitem action='EditPaste' />"
1382
" <toolitem action='ZoomSelection' />"
1383
" <toolitem action='ZoomDrawing' />"
1384
" <toolitem action='ZoomPage' />"
1386
" <toolitem action='EditDuplicate' />"
1387
" <toolitem action='EditClone' />"
1388
" <toolitem action='EditUnlinkClone' />"
1390
" <toolitem action='SelectionGroup' />"
1391
" <toolitem action='SelectionUnGroup' />"
1393
" <toolitem action='DialogFillStroke' />"
1394
" <toolitem action='DialogText' />"
1395
" <toolitem action='DialogXMLEditor' />"
1396
" <toolitem action='DialogAlignDistribute' />"
1398
" <toolitem action='DialogPreferences' />"
1399
" <toolitem action='DialogDocumentProperties' />"
1402
GtkActionGroup* mainActions = create_or_fetch_actions( desktop );
1405
GtkUIManager* mgr = gtk_ui_manager_new();
1408
gtk_ui_manager_insert_action_group( mgr, mainActions, 0 );
1409
gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal );
1411
GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/CommandsToolbar" );
1412
if ( prefs_get_int_attribute_limited( "toolbox", "icononly", 1, 0, 1 ) ) {
1413
gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
662
1415
gint shrinkTop = prefs_get_int_attribute_limited( "toolbox", "small", 1, 0, 1 );
663
1416
Inkscape::IconSize toolboxSize = shrinkTop ? Inkscape::ICON_SIZE_SMALL_TOOLBAR : Inkscape::ICON_SIZE_LARGE_TOOLBAR;
665
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_NEW), view, tt);
666
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_OPEN), view, tt);
667
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_SAVE), view, tt);
668
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_PRINT), view, tt);
670
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
672
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_IMPORT), view, tt);
673
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_EXPORT), view, tt);
675
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
677
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_UNDO), view, tt);
678
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_REDO), view, tt);
680
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
682
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_COPY), view, tt);
683
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_CUT), view, tt);
684
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_PASTE), view, tt);
686
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
688
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_SELECTION), view, tt);
689
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_DRAWING), view, tt);
690
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_PAGE), view, tt);
692
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
694
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_DUPLICATE), view, tt);
695
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_CLONE), view, tt);
696
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_UNLINK_CLONE), view, tt);
698
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
700
sp_toolbox_button_normal_new_from_verb(tb, toolboxSize, Inkscape::Verb::get(SP_VERB_SELECTION_GROUP), view, tt);
701
sp_toolbox_button_normal_new_from_verb(tb, toolboxSize, Inkscape::Verb::get(SP_VERB_SELECTION_UNGROUP), view, tt);
703
// disabled until we have icons for them:
707
//sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_TILE), view, tt);
708
//sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_UNTILE), view, tt);
710
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
712
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_FILL_STROKE), view, tt);
713
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_TEXT), view, tt);
714
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_XML_EDITOR), view, tt);
715
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_ALIGN_DISTRIBUTE), view, tt);
717
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
719
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_DISPLAY), view, tt);
720
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_NAMEDVIEW), view, tt);
722
gtk_widget_show_all(tb);
724
gtk_container_add(GTK_CONTAINER(toolbox), tb);
1417
gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), (GtkIconSize)toolboxSize );
1420
gtk_container_add( GTK_CONTAINER(toolbox), toolBar );
728
update_commands_toolbox(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox)
1424
update_commands_toolbox(SPDesktop */*desktop*/, SPEventContext */*eventcontext*/, GtkWidget */*toolbox*/)
1195
sp_star_toolbox_new(SPDesktop *desktop)
1862
static void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1197
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1199
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1200
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1202
GtkTooltips *tt = gtk_tooltips_new();
1204
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
1206
gchar const *flatsidedstr = NULL;
1208
/* Flatsided checkbox */
1210
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1211
GtkWidget *fscb = gtk_check_button_new_with_label(_("Polygon"));
1212
gtk_widget_set_sensitive(GTK_WIDGET(fscb), TRUE);
1213
flatsidedstr = prefs_get_string_attribute("tools.shapes.star", "isflatsided");
1214
if (!flatsidedstr || (flatsidedstr && !strcmp(flatsidedstr, "false")))
1215
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), FALSE);
1217
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), TRUE);
1218
gtk_tooltips_set_tip(tt, fscb, _("Regular polygon (with one handle) instead of a star"), NULL);
1219
gtk_widget_show(fscb);
1220
gtk_object_set_data(GTK_OBJECT(tbl), "flat_checkbox", fscb);
1221
gtk_container_add(GTK_CONTAINER(hb), fscb);
1222
g_signal_connect(G_OBJECT(fscb), "toggled", GTK_SIGNAL_FUNC(sp_stb_sides_flat_state_changed ), tbl);
1223
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_SPACING);
1865
EgeOutputAction* act = ege_output_action_new( "StarStateAction", _("<b>New:</b>"), "", 0 );
1866
ege_output_action_set_use_markup( act, TRUE );
1867
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
1868
g_object_set_data( holder, "mode_action", act );
1226
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
1230
GtkWidget *hb = sp_tb_spinbutton(_("Corners:"), _("Number of corners of a polygon or star"),
1872
EgeAdjustmentAction* eact = 0;
1873
gchar const *flatsidedstr = prefs_get_string_attribute( "tools.shapes.star", "isflatsided" );
1874
bool isFlatSided = flatsidedstr ? (strcmp(flatsidedstr, "false") != 0) : true;
1876
/* Flatsided checkbox */
1878
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
1881
gtk_list_store_append( model, &iter );
1882
gtk_list_store_set( model, &iter,
1884
1, _("Regular polygon (with one handle) instead of a star"),
1888
gtk_list_store_append( model, &iter );
1889
gtk_list_store_set( model, &iter,
1891
1, _("Star instead of a regular polygon (with one handle)"),
1895
EgeSelectOneAction* act = ege_select_one_action_new( "FlatAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
1896
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
1897
g_object_set_data( holder, "flat_action", act );
1899
ege_select_one_action_set_appearance( act, "full" );
1900
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
1901
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
1902
ege_select_one_action_set_icon_column( act, 2 );
1903
ege_select_one_action_set_tooltip_column( act, 1 );
1905
ege_select_one_action_set_active( act, isFlatSided ? 0 : 1 );
1906
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_stb_sides_flat_state_changed), holder);
1911
gchar const* labels[] = {_("triangle/tri-star"), _("square/quad-star"), _("pentagon/five-pointed star"), _("hexagon/six-pointed star"), 0, 0, 0, 0, 0};
1912
gdouble values[] = {3, 4, 5, 6, 7, 8, 10, 12, 20};
1913
eact = create_adjustment_action( "MagnitudeAction",
1914
_("Corners"), _("Corners:"), _("Number of corners of a polygon or star"),
1231
1915
"tools.shapes.star", "magnitude", 3,
1232
NULL, tbl, TRUE, "altx-star",
1234
sp_stb_magnitude_value_changed, 1, 0);
1235
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1916
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1918
labels, values, G_N_ELEMENTS(labels),
1919
sp_stb_magnitude_value_changed,
1921
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1922
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1240
GtkWidget *hb = sp_tb_spinbutton(_("Spoke ratio:"),
1927
gchar const* labels[] = {_("thin-ray star"), 0, _("pentagram"), _("hexagram"), _("heptagram"), _("octagram"), _("regular polygon")};
1928
gdouble values[] = {0.01, 0.2, 0.382, 0.577, 0.692, 0.765, 1};
1929
eact = create_adjustment_action( "SpokeAction",
1930
_("Spoke ratio"), _("Spoke ratio:"),
1241
1931
// TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle.
1242
1932
// Base radius is the same for the closest handle.
1243
1933
_("Base radius to tip radius ratio"),
1244
1934
"tools.shapes.star", "proportion", 0.5,
1245
NULL, tbl, FALSE, NULL,
1935
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1246
1936
0.01, 1.0, 0.01, 0.1,
1247
sp_stb_proportion_value_changed);
1248
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1249
g_object_set_data(G_OBJECT(tbl), "prop_widget", hb);
1250
if (!flatsidedstr || (flatsidedstr && !strcmp(flatsidedstr, "false")))
1251
gtk_widget_set_sensitive(GTK_WIDGET(hb), TRUE);
1253
gtk_widget_set_sensitive(GTK_WIDGET(hb), FALSE);
1258
GtkWidget *hb = sp_tb_spinbutton(_("Rounded:"), _("How much rounded are the corners (0 for sharp)"),
1937
labels, values, G_N_ELEMENTS(labels),
1938
sp_stb_proportion_value_changed );
1939
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1940
g_object_set_data( holder, "prop_action", eact );
1943
if ( !isFlatSided ) {
1944
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1946
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1951
gchar const* labels[] = {_("stretched"), _("twisted"), _("slightly pinched"), _("NOT rounded"), _("slightly rounded"), _("visibly rounded"), _("well rounded"), _("amply rounded"), 0, _("stretched"), _("blown up")};
1952
gdouble values[] = {-1, -0.2, -0.03, 0, 0.05, 0.1, 0.2, 0.3, 0.5, 1, 10};
1953
eact = create_adjustment_action( "RoundednessAction",
1954
_("Rounded"), _("Rounded:"), _("How much rounded are the corners (0 for sharp)"),
1259
1955
"tools.shapes.star", "rounded", 0.0,
1260
NULL, tbl, FALSE, NULL,
1261
-100.0, 100.0, 0.01, 0.1,
1262
sp_stb_rounded_value_changed);
1263
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1956
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1957
-10.0, 10.0, 0.01, 0.1,
1958
labels, values, G_N_ELEMENTS(labels),
1959
sp_stb_rounded_value_changed );
1960
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1961
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1268
GtkWidget *hb = sp_tb_spinbutton(_("Randomized:"), _("Scatter randomly the corners and angles"),
1966
gchar const* labels[] = {_("NOT randomized"), _("slightly irregular"), _("visibly randomized"), _("strongly randomized"), _("blown up")};
1967
gdouble values[] = {0, 0.01, 0.1, 0.5, 10};
1968
eact = create_adjustment_action( "RandomizationAction",
1969
_("Randomized"), _("Randomized:"), _("Scatter randomly the corners and angles"),
1269
1970
"tools.shapes.star", "randomized", 0.0,
1270
NULL, tbl, FALSE, NULL,
1971
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1271
1972
-10.0, 10.0, 0.001, 0.01,
1272
sp_stb_randomized_value_changed, 0.1, 3);
1273
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1973
labels, values, G_N_ELEMENTS(labels),
1974
sp_stb_randomized_value_changed, 0.1, 3 );
1975
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1976
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1276
aux_toolbox_space(tbl, AUX_SPACING);
1280
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1281
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
1282
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
1284
gtk_container_add(GTK_CONTAINER(hb), b);
1285
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_stb_defaults), tbl);
1286
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_SPACING);
1983
GtkAction* act = gtk_action_new( "StarResetAction",
1985
_("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
1987
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_stb_defaults), holder );
1988
gtk_action_group_add_action( mainActions, act );
1989
gtk_action_set_sensitive( act, TRUE );
1289
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1290
swatch->setWatchedTool ("tools.shapes.star", true);
1291
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1292
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1294
gtk_widget_show_all(tbl);
1295
sp_set_font_size_smaller (tbl);
1297
1993
sigc::connection *connection = new sigc::connection(
1298
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), (GtkObject *)tbl))
1994
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), (GObject *)holder))
1300
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
1996
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
1997
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1533
2218
// FIXME: implement averaging of all parameters for multiple selected
1534
2219
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
1535
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
1536
sp_rtb_sensitivize (GTK_WIDGET(tbl));
2220
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
2221
sp_rtb_sensitivize( tbl );
1542
sp_rect_toolbox_new(SPDesktop *desktop)
2226
static void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1544
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1546
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1547
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1549
GtkTooltips *tt = gtk_tooltips_new();
1551
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2228
EgeAdjustmentAction* eact = 0;
2231
EgeOutputAction* act = ege_output_action_new( "RectStateAction", _("<b>New:</b>"), "", 0 );
2232
ege_output_action_set_use_markup( act, TRUE );
2233
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2234
g_object_set_data( holder, "mode_action", act );
1553
2237
// rx/ry units menu: create
1554
GtkWidget *us = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
1555
sp_unit_selector_setsize(us, AUX_OPTION_MENU_WIDTH, AUX_OPTION_MENU_HEIGHT);
1556
sp_unit_selector_set_unit(SP_UNIT_SELECTOR(us), desktop->namedview->doc_units);
2238
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
2239
//tracker->addUnit( SP_UNIT_PERCENT, 0 );
1557
2240
// fixme: add % meaning per cent of the width/height
2241
tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
2242
g_object_set_data( holder, "tracker", tracker );
1561
GtkWidget *hb = sp_tb_spinbutton(_("W:"), _("Width of rectangle"),
2246
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2247
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
2248
eact = create_adjustment_action( "RectWidthAction",
2249
_("Width"), _("W:"), _("Width of rectangle"),
1562
2250
"tools.shapes.rect", "width", 0,
1563
us, tbl, TRUE, "altx-rect",
2251
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-rect",
1564
2252
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1565
sp_rtb_width_value_changed);
1566
gtk_object_set_data(GTK_OBJECT(tbl), "width_sb", hb);
1567
gtk_widget_set_sensitive(hb, FALSE);
1568
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2253
labels, values, G_N_ELEMENTS(labels),
2254
sp_rtb_width_value_changed );
2255
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2256
g_object_set_data( holder, "width_action", eact );
2257
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2258
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1573
GtkWidget *hb = sp_tb_spinbutton(_("H:"), _("Height of rectangle"),
2263
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2264
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
2265
eact = create_adjustment_action( "RectHeightAction",
2266
_("Height"), _("H:"), _("Height of rectangle"),
1574
2267
"tools.shapes.rect", "height", 0,
1575
us, tbl, FALSE, NULL,
2268
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1576
2269
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1577
sp_rtb_height_value_changed);
1578
gtk_object_set_data(GTK_OBJECT(tbl), "height_sb", hb);
1579
gtk_widget_set_sensitive(hb, FALSE);
1580
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2270
labels, values, G_N_ELEMENTS(labels),
2271
sp_rtb_height_value_changed );
2272
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2273
g_object_set_data( holder, "height_action", eact );
2274
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2275
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1585
GtkWidget *hb = sp_tb_spinbutton(_("Rx:"), _("Horizontal radius of rounded corners"),
2280
gchar const* labels[] = {_("not rounded"), 0, 0, 0, 0, 0, 0, 0, 0};
2281
gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2282
eact = create_adjustment_action( "RadiusXAction",
2283
_("Horizontal radius"), _("Rx:"), _("Horizontal radius of rounded corners"),
1586
2284
"tools.shapes.rect", "rx", 0,
1587
us, tbl, FALSE, NULL,
2285
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1588
2286
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
2287
labels, values, G_N_ELEMENTS(labels),
1589
2288
sp_rtb_rx_value_changed);
1590
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2289
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2290
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1595
GtkWidget *hb = sp_tb_spinbutton(_("Ry:"), _("Vertical radius of rounded corners"),
2295
gchar const* labels[] = {_("not rounded"), 0, 0, 0, 0, 0, 0, 0, 0};
2296
gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2297
eact = create_adjustment_action( "RadiusYAction",
2298
_("Vertical radius"), _("Ry:"), _("Vertical radius of rounded corners"),
1596
2299
"tools.shapes.rect", "ry", 0,
1597
us, tbl, FALSE, NULL,
2300
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1598
2301
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
2302
labels, values, G_N_ELEMENTS(labels),
1599
2303
sp_rtb_ry_value_changed);
1600
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2304
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2305
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1603
2308
// add the units menu
1604
gtk_widget_show(us);
1605
gtk_box_pack_start(GTK_BOX(tbl), us, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
1606
gtk_object_set_data(GTK_OBJECT(tbl), "units", us);
2310
GtkAction* act = tracker->createAction( "RectUnitsAction", _("Units"), ("") );
2311
gtk_action_group_add_action( mainActions, act );
1610
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1611
GtkWidget *b = gtk_button_new_with_label(_("Not rounded"));
1612
gtk_object_set_data(GTK_OBJECT(tbl), "not_rounded", b);
1613
gtk_tooltips_set_tip(tt, b, _("Make corners sharp"), NULL);
1615
gtk_container_add(GTK_CONTAINER(hb), b);
1616
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_rtb_defaults), tbl);
1617
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2316
InkAction* inky = ink_action_new( "RectResetAction",
2318
_("Make corners sharp"),
2320
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
2321
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_rtb_defaults), holder );
2322
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
2323
gtk_action_set_sensitive( GTK_ACTION(inky), TRUE );
2324
g_object_set_data( holder, "not_rounded", inky );
1620
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1621
swatch->setWatchedTool ("tools.shapes.rect", true);
1622
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1623
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1625
g_object_set_data(G_OBJECT(tbl), "single", GINT_TO_POINTER(TRUE));
1626
sp_rtb_sensitivize (tbl);
1628
gtk_widget_show_all(tbl);
1629
sp_set_font_size_smaller (tbl);
2327
g_object_set_data( holder, "single", GINT_TO_POINTER(TRUE) );
2328
sp_rtb_sensitivize( holder );
1631
2330
sigc::connection *connection = new sigc::connection(
1632
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), (GtkObject *)tbl))
2331
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), (GObject *)holder))
1634
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2333
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
2334
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
2337
//########################
2339
//########################
2341
// normalize angle so that it lies in the interval [0,360]
2342
static double box3d_normalize_angle (double a) {
2343
double angle = a + ((int) (a/360.0))*360;
2351
box3d_set_button_and_adjustment(Persp3D *persp, Proj::Axis axis,
2352
GtkAdjustment *adj, GtkAction *act, GtkToggleAction *tact) {
2353
// TODO: Take all selected perspectives into account but don't touch the state button if not all of them
2354
// have the same state (otherwise a call to box3d_vp_z_state_changed() is triggered and the states
2356
bool is_infinite = !persp3d_VP_is_finite(persp, axis);
2359
gtk_toggle_action_set_active(tact, TRUE);
2360
gtk_action_set_sensitive(act, TRUE);
2362
double angle = persp3d_get_infinite_angle(persp, axis);
2363
if (angle != NR_HUGE) { // FIXME: We should catch this error earlier (don't show the spinbutton at all)
2364
gtk_adjustment_set_value(adj, box3d_normalize_angle(angle));
2367
gtk_toggle_action_set_active(tact, FALSE);
2368
gtk_action_set_sensitive(act, FALSE);
2373
box3d_resync_toolbar(Inkscape::XML::Node *persp_repr, GObject *data) {
2375
g_print ("No perspective given to box3d_resync_toolbar().\n");
2379
GtkWidget *tbl = GTK_WIDGET(data);
2380
GtkAdjustment *adj = 0;
2382
GtkToggleAction *tact = 0;
2383
Persp3D *persp = persp3d_get_from_repr(persp_repr);
2385
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_x"));
2386
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_x_action"));
2387
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_x_state_action"))->action;
2389
box3d_set_button_and_adjustment(persp, Proj::X, adj, act, tact);
2392
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_y"));
2393
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_y_action"));
2394
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_y_state_action"))->action;
2396
box3d_set_button_and_adjustment(persp, Proj::Y, adj, act, tact);
2399
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_z"));
2400
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_z_action"));
2401
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_z_state_action"))->action;
2403
box3d_set_button_and_adjustment(persp, Proj::Z, adj, act, tact);
2407
static void box3d_persp_tb_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name,
2408
gchar const */*old_value*/, gchar const */*new_value*/,
2409
bool /*is_interactive*/, gpointer data)
2411
GtkWidget *tbl = GTK_WIDGET(data);
2413
// quit if run by the attr_changed listener
2414
// note: it used to work without the differently called freeze_ attributes (here and in
2415
// box3d_angle_value_changed()) but I now it doesn't so I'm leaving them in for now
2416
if (g_object_get_data(G_OBJECT(tbl), "freeze_angle")) {
2420
// set freeze so that it can be caught in box3d_angle_z_value_changed() (to avoid calling
2421
// sp_document_maybe_done() when the document is undo insensitive)
2422
g_object_set_data(G_OBJECT(tbl), "freeze_attr", GINT_TO_POINTER(TRUE));
2424
// TODO: Only update the appropriate part of the toolbar
2425
// if (!strcmp(name, "inkscape:vp_z")) {
2426
box3d_resync_toolbar(repr, G_OBJECT(tbl));
2429
Persp3D *persp = persp3d_get_from_repr(repr);
2430
persp3d_update_box_reprs(persp);
2432
g_object_set_data(G_OBJECT(tbl), "freeze_attr", GINT_TO_POINTER(FALSE));
2435
static Inkscape::XML::NodeEventVector box3d_persp_tb_repr_events =
2437
NULL, /* child_added */
2438
NULL, /* child_removed */
2439
box3d_persp_tb_event_attr_changed,
2440
NULL, /* content_changed */
2441
NULL /* order_changed */
2445
* \param selection Should not be NULL.
2447
// FIXME: This should rather be put into persp3d-reference.cpp or something similar so that it reacts upon each
2448
// Change of the perspective, and not of the current selection (but how to refer to the toolbar then?)
2450
box3d_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
2452
// Here the following should be done: If all selected boxes have finite VPs in a certain direction,
2453
// disable the angle entry fields for this direction (otherwise entering a value in them should only
2454
// update the perspectives with infinite VPs and leave the other ones untouched).
2456
Inkscape::XML::Node *persp_repr = NULL;
2457
purge_repr_listener(tbl, tbl);
2459
SPItem *item = selection->singleItem();
2460
if (item && SP_IS_BOX3D(item)) {
2461
// FIXME: Also deal with multiple selected boxes
2462
SPBox3D *box = SP_BOX3D(item);
2463
Persp3D *persp = box3d_get_perspective(box);
2464
persp_repr = SP_OBJECT_REPR(persp);
2466
g_object_set_data(tbl, "repr", persp_repr);
2467
Inkscape::GC::anchor(persp_repr);
2468
sp_repr_add_listener(persp_repr, &box3d_persp_tb_repr_events, tbl);
2469
sp_repr_synthesize_events(persp_repr, &box3d_persp_tb_repr_events, tbl);
2472
inkscape_active_document()->current_persp3d = persp3d_get_from_repr(persp_repr);
2473
prefs_set_string_attribute("tools.shapes.3dbox", "persp", persp_repr->attribute("id"));
2475
box3d_resync_toolbar(persp_repr, tbl);
2480
box3d_angle_value_changed(GtkAdjustment *adj, GObject *dataKludge, Proj::Axis axis)
2482
SPDesktop *desktop = (SPDesktop *) g_object_get_data( dataKludge, "desktop" );
2483
SPDocument *document = sp_desktop_document(desktop);
2485
// quit if run by the attr_changed listener
2486
// note: it used to work without the differently called freeze_ attributes (here and in
2487
// box3d_persp_tb_event_attr_changed()) but I now it doesn't so I'm leaving them in for now
2488
if (g_object_get_data( dataKludge, "freeze_attr" )) {
2492
// in turn, prevent listener from responding
2493
g_object_set_data(dataKludge, "freeze_angle", GINT_TO_POINTER(TRUE));
2495
//Persp3D *persp = document->current_persp3d;
2496
std::set<Persp3D *> sel_persps = persp3d_currently_selected_persps (inkscape_active_event_context());
2497
if (sel_persps.empty()) {
2498
// this can happen when the document is created; we silently ignore it
2501
Persp3D *persp = *(sel_persps.begin());
2503
persp->tmat.set_infinite_direction (axis, adj->value);
2504
SP_OBJECT(persp)->updateRepr();
2506
// TODO: use the correct axis here, too
2507
sp_document_maybe_done(document, "perspangle", SP_VERB_CONTEXT_3DBOX, _("3D Box: Change perspective (angle of infinite axis)"));
2509
g_object_set_data( dataKludge, "freeze_angle", GINT_TO_POINTER(FALSE) );
2514
box3d_angle_x_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2516
box3d_angle_value_changed(adj, dataKludge, Proj::X);
2520
box3d_angle_y_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2522
box3d_angle_value_changed(adj, dataKludge, Proj::Y);
2526
box3d_angle_z_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2528
box3d_angle_value_changed(adj, dataKludge, Proj::Z);
2532
static void box3d_vp_state_changed( GtkToggleAction *act, GtkAction *box3d_angle, Proj::Axis axis )
2534
// TODO: Take all selected perspectives into account
2535
std::set<Persp3D *> sel_persps = persp3d_currently_selected_persps (inkscape_active_event_context());
2536
if (sel_persps.empty()) {
2537
// this can happen when the document is created; we silently ignore it
2540
Persp3D *persp = *(sel_persps.begin());
2542
bool set_infinite = gtk_toggle_action_get_active(act);
2543
persp3d_set_VP_state (persp, axis, set_infinite ? Proj::VP_INFINITE : Proj::VP_FINITE);
2546
static void box3d_vp_x_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2548
box3d_vp_state_changed(act, box3d_angle, Proj::X);
2551
static void box3d_vp_y_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2553
box3d_vp_state_changed(act, box3d_angle, Proj::Y);
2556
static void box3d_vp_z_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2558
box3d_vp_state_changed(act, box3d_angle, Proj::Z);
2561
static void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2563
EgeAdjustmentAction* eact = 0;
2564
SPDocument *document = sp_desktop_document (desktop);
2565
Persp3D *persp = document->current_persp3d;
2567
EgeAdjustmentAction* box3d_angle_x = 0;
2568
EgeAdjustmentAction* box3d_angle_y = 0;
2569
EgeAdjustmentAction* box3d_angle_z = 0;
2573
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2574
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2575
eact = create_adjustment_action( "3DBoxAngleXAction",
2576
_("Angle in X direction"), _("Angle X:"),
2577
// Translators: PL is short for 'perspective line'
2578
_("Angle of PLs in X direction"),
2579
"tools.shapes.3dbox", "box3d_angle_x", 30,
2580
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-box3d",
2581
-360.0, 360.0, 1.0, 10.0,
2582
labels, values, G_N_ELEMENTS(labels),
2583
box3d_angle_x_value_changed );
2584
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2585
g_object_set_data( holder, "box3d_angle_x_action", eact );
2586
box3d_angle_x = eact;
2589
if (!persp3d_VP_is_finite(persp, Proj::X)) {
2590
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2592
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2598
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPXStateAction",
2599
// Translators: VP is short for 'vanishing point'
2600
_("State of VP in X direction"),
2601
_("Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"),
2603
Inkscape::ICON_SIZE_DECORATION );
2604
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2605
g_object_set_data( holder, "box3d_vp_x_state_action", act );
2606
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_x_state_changed), box3d_angle_x );
2607
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_x), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_x_state", 1 ) );
2608
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_x_state", 1 ) );
2613
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2614
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2615
eact = create_adjustment_action( "3DBoxAngleYAction",
2616
_("Angle in Y direction"), _("Angle Y:"),
2617
// Translators: PL is short for 'perspective line'
2618
_("Angle of PLs in Y direction"),
2619
"tools.shapes.3dbox", "box3d_angle_y", 30,
2620
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2621
-360.0, 360.0, 1.0, 10.0,
2622
labels, values, G_N_ELEMENTS(labels),
2623
box3d_angle_y_value_changed );
2624
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2625
g_object_set_data( holder, "box3d_angle_y_action", eact );
2626
box3d_angle_y = eact;
2629
if (!persp3d_VP_is_finite(persp, Proj::Y)) {
2630
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2632
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2637
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPYStateAction",
2638
// Translators: VP is short for 'vanishing point'
2639
_("State of VP in Y direction"),
2640
_("Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"),
2642
Inkscape::ICON_SIZE_DECORATION );
2643
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2644
g_object_set_data( holder, "box3d_vp_y_state_action", act );
2645
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_y_state_changed), box3d_angle_y );
2646
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_y), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_y_state", 1 ) );
2647
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_y_state", 1 ) );
2652
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2653
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2654
eact = create_adjustment_action( "3DBoxAngleZAction",
2655
_("Angle in Z direction"), _("Angle Z:"),
2656
// Translators: PL is short for 'perspective line'
2657
_("Angle of PLs in Z direction"),
2658
"tools.shapes.3dbox", "box3d_angle_z", 30,
2659
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2660
-360.0, 360.0, 1.0, 10.0,
2661
labels, values, G_N_ELEMENTS(labels),
2662
box3d_angle_z_value_changed );
2663
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2664
g_object_set_data( holder, "box3d_angle_z_action", eact );
2665
box3d_angle_z = eact;
2668
if (!persp3d_VP_is_finite(persp, Proj::Z)) {
2669
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2671
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2676
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPZStateAction",
2677
// Translators: VP is short for 'vanishing point'
2678
_("State of VP in Z direction"),
2679
_("Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"),
2681
Inkscape::ICON_SIZE_DECORATION );
2682
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2683
g_object_set_data( holder, "box3d_vp_z_state_action", act );
2684
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_z_state_changed), box3d_angle_z );
2685
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_z), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_z_state", 1 ) );
2686
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_z_state", 1 ) );
2689
sigc::connection *connection = new sigc::connection(
2690
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(box3d_toolbox_selection_changed), (GObject *)holder))
2692
g_signal_connect(holder, "destroy", G_CALLBACK(delete_connection), connection);
2693
g_signal_connect(holder, "destroy", G_CALLBACK(purge_repr_listener), holder);
1639
2696
//########################
1807
2856
// FIXME: implement averaging of all parameters for multiple selected
1808
2857
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
1809
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
2858
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
1815
sp_spiral_toolbox_new(SPDesktop *desktop)
2863
static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1817
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1818
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1819
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1821
GtkTooltips *tt = gtk_tooltips_new();
1823
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2865
EgeAdjustmentAction* eact = 0;
2868
EgeOutputAction* act = ege_output_action_new( "SpiralStateAction", _("<b>New:</b>"), "", 0 );
2869
ege_output_action_set_use_markup( act, TRUE );
2870
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2871
g_object_set_data( holder, "mode_action", act );
1825
2874
/* Revolution */
1827
GtkWidget *hb = sp_tb_spinbutton(_("Turns:"), _("Number of revolutions"),
2876
gchar const* labels[] = {_("just a curve"), 0, _("one full revolution"), 0, 0, 0, 0, 0, 0};
2877
gdouble values[] = {0.01, 0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2878
eact = create_adjustment_action( "SpiralRevolutionAction",
2879
_("Number of turns"), _("Turns:"), _("Number of revolutions"),
1828
2880
"tools.shapes.spiral", "revolution", 3.0,
1829
NULL, tbl, TRUE, "altx-spiral",
2881
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-spiral",
1830
2882
0.01, 1024.0, 0.1, 1.0,
2883
labels, values, G_N_ELEMENTS(labels),
1831
2884
sp_spl_tb_revolution_value_changed, 1, 2);
1832
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2885
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1835
2888
/* Expansion */
1837
GtkWidget *hb = sp_tb_spinbutton(_("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"),
2890
gchar const* labels[] = {_("circle"), _("edge is much denser"), _("edge is denser"), _("even"), _("center is denser"), _("center is much denser"), 0};
2891
gdouble values[] = {0, 0.1, 0.5, 1, 1.5, 5, 20};
2892
eact = create_adjustment_action( "SpiralExpansionAction",
2893
_("Divergence"), _("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"),
1838
2894
"tools.shapes.spiral", "expansion", 1.0,
1839
NULL, tbl, FALSE, NULL,
2895
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1840
2896
0.0, 1000.0, 0.01, 1.0,
2897
labels, values, G_N_ELEMENTS(labels),
1841
2898
sp_spl_tb_expansion_value_changed);
1842
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2899
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1847
GtkWidget *hb = sp_tb_spinbutton(_("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"),
2904
gchar const* labels[] = {_("starts from center"), _("starts mid-way"), _("starts near edge")};
2905
gdouble values[] = {0, 0.5, 0.9};
2906
eact = create_adjustment_action( "SpiralT0Action",
2907
_("Inner radius"), _("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"),
1848
2908
"tools.shapes.spiral", "t0", 0.0,
1849
NULL, tbl, FALSE, NULL,
2909
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1850
2910
0.0, 0.999, 0.01, 1.0,
2911
labels, values, G_N_ELEMENTS(labels),
1851
2912
sp_spl_tb_t0_value_changed);
1852
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2913
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1855
aux_toolbox_space(tbl, AUX_SPACING);
1859
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1860
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
1861
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
1863
gtk_container_add(GTK_CONTAINER(hb), b);
1864
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_spl_tb_defaults), tbl);
1865
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2918
InkAction* inky = ink_action_new( "SpiralResetAction",
2920
_("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
2922
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
2923
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_spl_tb_defaults), holder );
2924
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1868
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1869
swatch->setWatchedTool ("tools.shapes.spiral", true);
1870
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1871
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1873
gtk_widget_show_all(tbl);
1874
sp_set_font_size_smaller (tbl);
1876
2928
sigc::connection *connection = new sigc::connection(
1877
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), (GtkObject *)tbl))
2929
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), (GObject *)holder))
1879
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2931
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
2932
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1884
2935
//########################
1886
2937
//########################
1890
sp_pen_toolbox_new(SPDesktop *desktop)
1892
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1893
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1894
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1896
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1897
swatch->setWatchedTool ("tools.freehand.pen", true);
1898
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1899
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1901
gtk_widget_show_all(tbl);
1902
sp_set_font_size_smaller (tbl);
1908
sp_pencil_toolbox_new(SPDesktop *desktop)
1910
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1911
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1912
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1914
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1915
swatch->setWatchedTool ("tools.freehand.pencil", true);
1916
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1917
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1919
gtk_widget_show_all(tbl);
1920
sp_set_font_size_smaller (tbl);
2940
static void sp_pen_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
2945
static void sp_pencil_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
2950
//########################
2952
//########################
2954
static void sp_tweak_width_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2956
prefs_set_double_attribute( "tools.tweak", "width", adj->value * 0.01 );
2959
static void sp_tweak_force_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2961
prefs_set_double_attribute( "tools.tweak", "force", adj->value * 0.01 );
2964
static void sp_tweak_pressure_state_changed( GtkToggleAction *act, gpointer /*data*/ )
2966
prefs_set_int_attribute( "tools.tweak", "usepressure", gtk_toggle_action_get_active( act ) ? 1 : 0);
2969
static void sp_tweak_mode_changed( EgeSelectOneAction *act, GObject *tbl )
2971
int mode = ege_select_one_action_get_active( act );
2972
prefs_set_int_attribute("tools.tweak", "mode", mode);
2974
GtkAction *doh = GTK_ACTION(g_object_get_data( tbl, "tweak_doh"));
2975
GtkAction *dos = GTK_ACTION(g_object_get_data( tbl, "tweak_dos"));
2976
GtkAction *dol = GTK_ACTION(g_object_get_data( tbl, "tweak_dol"));
2977
GtkAction *doo = GTK_ACTION(g_object_get_data( tbl, "tweak_doo"));
2978
GtkAction *fid = GTK_ACTION(g_object_get_data( tbl, "tweak_fidelity"));
2979
GtkAction *dolabel = GTK_ACTION(g_object_get_data( tbl, "tweak_channels_label"));
2980
if (mode == TWEAK_MODE_COLORPAINT || mode == TWEAK_MODE_COLORJITTER) {
2981
if (doh) gtk_action_set_sensitive (doh, TRUE);
2982
if (dos) gtk_action_set_sensitive (dos, TRUE);
2983
if (dol) gtk_action_set_sensitive (dol, TRUE);
2984
if (doo) gtk_action_set_sensitive (doo, TRUE);
2985
if (dolabel) gtk_action_set_sensitive (dolabel, TRUE);
2986
if (fid) gtk_action_set_sensitive (fid, FALSE);
2988
if (doh) gtk_action_set_sensitive (doh, FALSE);
2989
if (dos) gtk_action_set_sensitive (dos, FALSE);
2990
if (dol) gtk_action_set_sensitive (dol, FALSE);
2991
if (doo) gtk_action_set_sensitive (doo, FALSE);
2992
if (dolabel) gtk_action_set_sensitive (dolabel, FALSE);
2993
if (fid) gtk_action_set_sensitive (fid, TRUE);
2997
static void sp_tweak_fidelity_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2999
prefs_set_double_attribute( "tools.tweak", "fidelity", adj->value * 0.01 );
3002
static void tweak_toggle_doh (GtkToggleAction *act, gpointer /*data*/) {
3003
bool show = gtk_toggle_action_get_active( act );
3004
prefs_set_int_attribute ("tools.tweak", "doh", show ? 1 : 0);
3006
static void tweak_toggle_dos (GtkToggleAction *act, gpointer /*data*/) {
3007
bool show = gtk_toggle_action_get_active( act );
3008
prefs_set_int_attribute ("tools.tweak", "dos", show ? 1 : 0);
3010
static void tweak_toggle_dol (GtkToggleAction *act, gpointer /*data*/) {
3011
bool show = gtk_toggle_action_get_active( act );
3012
prefs_set_int_attribute ("tools.tweak", "dol", show ? 1 : 0);
3014
static void tweak_toggle_doo (GtkToggleAction *act, gpointer /*data*/) {
3015
bool show = gtk_toggle_action_get_active( act );
3016
prefs_set_int_attribute ("tools.tweak", "doo", show ? 1 : 0);
3019
static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
3023
gchar const* labels[] = {_("(pinch tweak)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad tweak)")};
3024
gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
3025
EgeAdjustmentAction *eact = create_adjustment_action( "TweakWidthAction",
3026
_("Width"), _("Width:"), _("The width of the tweak area (relative to the visible canvas area)"),
3027
"tools.tweak", "width", 15,
3028
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-tweak",
3030
labels, values, G_N_ELEMENTS(labels),
3031
sp_tweak_width_value_changed, 0.01, 0, 100 );
3032
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3033
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3039
gchar const* labels[] = {_("(minimum force)"), 0, 0, _("(default)"), 0, 0, 0, _("(maximum force)")};
3040
gdouble values[] = {1, 5, 10, 20, 30, 50, 70, 100};
3041
EgeAdjustmentAction *eact = create_adjustment_action( "TweakForceAction",
3042
_("Force"), _("Force:"), _("The force of the tweak action"),
3043
"tools.tweak", "force", 20,
3044
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-force",
3046
labels, values, G_N_ELEMENTS(labels),
3047
sp_tweak_force_value_changed, 0.01, 0, 100 );
3048
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3049
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3054
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
3057
gtk_list_store_append( model, &iter );
3058
gtk_list_store_set( model, &iter,
3060
1, _("Push parts of paths in any direction"),
3061
2, "tweak_push_mode",
3064
gtk_list_store_append( model, &iter );
3065
gtk_list_store_set( model, &iter,
3066
0, _("Shrink mode"),
3067
1, _("Shrink (inset) parts of paths"),
3068
2, "tweak_shrink_mode",
3071
gtk_list_store_append( model, &iter );
3072
gtk_list_store_set( model, &iter,
3074
1, _("Grow (outset) parts of paths"),
3075
2, "tweak_grow_mode",
3078
gtk_list_store_append( model, &iter );
3079
gtk_list_store_set( model, &iter,
3080
0, _("Attract mode"),
3081
1, _("Attract parts of paths towards cursor"),
3082
2, "tweak_attract_mode",
3085
gtk_list_store_append( model, &iter );
3086
gtk_list_store_set( model, &iter,
3088
1, _("Repel parts of paths from cursor"),
3089
2, "tweak_repel_mode",
3092
gtk_list_store_append( model, &iter );
3093
gtk_list_store_set( model, &iter,
3094
0, _("Roughen mode"),
3095
1, _("Roughen parts of paths"),
3096
2, "tweak_roughen_mode",
3099
gtk_list_store_append( model, &iter );
3100
gtk_list_store_set( model, &iter,
3101
0, _("Color paint mode"),
3102
1, _("Paint the tool's color upon selected objects"),
3103
2, "tweak_colorpaint_mode",
3106
gtk_list_store_append( model, &iter );
3107
gtk_list_store_set( model, &iter,
3108
0, _("Color jitter mode"),
3109
1, _("Jitter the colors of selected objects"),
3110
2, "tweak_colorjitter_mode",
3113
EgeSelectOneAction* act = ege_select_one_action_new( "TweakModeAction", _("Mode"), (""), NULL, GTK_TREE_MODEL(model) );
3114
g_object_set( act, "short_label", _("Mode:"), NULL );
3115
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
3116
g_object_set_data( holder, "mode_action", act );
3118
ege_select_one_action_set_appearance( act, "full" );
3119
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
3120
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
3121
ege_select_one_action_set_icon_column( act, 2 );
3122
ege_select_one_action_set_tooltip_column( act, 1 );
3124
gint mode = prefs_get_int_attribute("tools.tweak", "mode", 0);
3125
ege_select_one_action_set_active( act, mode );
3126
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_tweak_mode_changed), holder );
3128
g_object_set_data( G_OBJECT(holder), "tweak_tool_mode", act);
3131
guint mode = prefs_get_int_attribute("tools.tweak", "mode", 0);
3134
EgeOutputAction* act = ege_output_action_new( "TweakChannelsLabel", _("Channels:"), "", 0 );
3135
ege_output_action_set_use_markup( act, TRUE );
3136
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3137
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3138
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3139
g_object_set_data( holder, "tweak_channels_label", act);
3143
InkToggleAction* act = ink_toggle_action_new( "TweakDoH",
3145
_("In color mode, act on objects' hue"),
3147
Inkscape::ICON_SIZE_DECORATION );
3148
g_object_set( act, "short_label", _("H"), NULL );
3149
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3150
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_doh), desktop );
3151
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "doh", 1 ) );
3152
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3153
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3154
g_object_set_data( holder, "tweak_doh", act);
3157
InkToggleAction* act = ink_toggle_action_new( "TweakDoS",
3159
_("In color mode, act on objects' saturation"),
3161
Inkscape::ICON_SIZE_DECORATION );
3162
g_object_set( act, "short_label", _("S"), NULL );
3163
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3164
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_dos), desktop );
3165
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "dos", 1 ) );
3166
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3167
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3168
g_object_set_data( holder, "tweak_dos", act );
3171
InkToggleAction* act = ink_toggle_action_new( "TweakDoL",
3173
_("In color mode, act on objects' lightness"),
3175
Inkscape::ICON_SIZE_DECORATION );
3176
g_object_set( act, "short_label", _("L"), NULL );
3177
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3178
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_dol), desktop );
3179
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "dol", 1 ) );
3180
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3181
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3182
g_object_set_data( holder, "tweak_dol", act );
3185
InkToggleAction* act = ink_toggle_action_new( "TweakDoO",
3187
_("In color mode, act on objects' opacity"),
3189
Inkscape::ICON_SIZE_DECORATION );
3190
g_object_set( act, "short_label", _("O"), NULL );
3191
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3192
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_doo), desktop );
3193
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "doo", 1 ) );
3194
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3195
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3196
g_object_set_data( holder, "tweak_doo", act );
3200
gchar const* labels[] = {_("(rough, simplified)"), 0, 0, _("(default)"), 0, 0, _("(fine, but many nodes)")};
3201
gdouble values[] = {10, 25, 35, 50, 60, 80, 100};
3202
EgeAdjustmentAction *eact = create_adjustment_action( "TweakFidelityAction",
3203
_("Fidelity"), _("Fidelity:"),
3204
_("Low fidelity simplifies paths; high fidelity preserves path features but may generate a lot of new nodes"),
3205
"tools.tweak", "fidelity", 50,
3206
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-fidelity",
3208
labels, values, G_N_ELEMENTS(labels),
3209
sp_tweak_fidelity_value_changed, 0.01, 0, 100 );
3210
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3211
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3212
if (mode == TWEAK_MODE_COLORPAINT || mode == TWEAK_MODE_COLORJITTER)
3213
gtk_action_set_sensitive (GTK_ACTION(eact), FALSE);
3214
g_object_set_data( holder, "tweak_fidelity", eact );
3218
/* Use Pressure button */
3220
InkToggleAction* act = ink_toggle_action_new( "TweakPressureAction",
3222
_("Use the pressure of the input device to alter the force of tweak action"),
3224
Inkscape::ICON_SIZE_DECORATION );
3225
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3226
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_tweak_pressure_state_changed), NULL);
3227
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "usepressure", 1 ) );
1999
3300
} const key_values[] = {
2000
3301
{"mass", 0.02},
2002
3303
{"angle", 30.0},
2004
3305
{"thinning", 0.1},
2005
3306
{"tremor", 0.0},
3308
{"cap_rounding", 0.0}
2009
3311
for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
2010
3312
KeyValue const &kv = key_values[i];
2011
GtkAdjustment &adj = *static_cast<GtkAdjustment *>(gtk_object_get_data(GTK_OBJECT(tbl), kv.key));
2012
gtk_adjustment_set_value(&adj, kv.value);
3313
GtkAdjustment* adj = static_cast<GtkAdjustment *>(g_object_get_data(dataKludge, kv.key));
3315
gtk_adjustment_set_value(adj, kv.value);
2015
spinbutton_defocus(GTK_OBJECT(tbl));
2019
sp_calligraphy_toolbox_new(SPDesktop *desktop)
3321
static void sp_calligraphy_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2021
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2022
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2023
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2025
GtkTooltips *tt = gtk_tooltips_new();
2026
GtkWidget *calligraphy_angle;
2029
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2033
GtkWidget *hb = sp_tb_spinbutton(_("Width:"), _("The width of the calligraphic pen (relative to the visible canvas area)"),
2034
"tools.calligraphic", "width", 15,
2035
NULL, tbl, TRUE, "altx-calligraphy",
2037
sp_ddc_width_value_changed, 0.01, 0, 100);
2038
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2043
GtkWidget *hb = sp_tb_spinbutton(_("Thinning:"), _("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"),
2044
"tools.calligraphic", "thinning", 0.1,
2045
NULL, tbl, FALSE, NULL,
2046
-1.0, 1.0, 0.01, 0.1,
2047
sp_ddc_velthin_value_changed, 0.01, 2);
2048
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2052
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2056
calligraphy_angle = sp_tb_spinbutton(_("Angle:"), _("The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)"),
2057
"tools.calligraphic", "angle", 30,
2058
NULL, tbl, TRUE, "calligraphy-angle",
2059
-90.0, 90.0, 1.0, 10.0,
2060
sp_ddc_angle_value_changed, 1, 0);
2061
gtk_box_pack_start(GTK_BOX(tbl), calligraphy_angle, FALSE, FALSE, AUX_SPACING);
2066
GtkWidget *hb = sp_tb_spinbutton(_("Fixation:"), _("How fixed is the pen angle (0 = always perpendicular to stroke direction, 1 = fixed)"),
2067
"tools.calligraphic", "flatness", 0.9,
2068
NULL, tbl, FALSE, NULL,
2069
0.0, 1.0, 0.01, 0.1,
2070
sp_ddc_flatness_value_changed, 0.01, 2);
2071
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2075
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2079
GtkWidget *hb = sp_tb_spinbutton(_("Tremor:"), _("How uneven or trembling is the pen stroke"),
2080
"tools.calligraphic", "tremor", 0.0,
2081
NULL, tbl, FALSE, NULL,
2082
0.0, 1.0, 0.01, 0.1,
2083
sp_ddc_tremor_value_changed, 0.01, 2);
2084
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2088
GtkWidget *hb = sp_tb_spinbutton(_("Mass:"), _("How much inertia affects the movement of the pen"),
2089
"tools.calligraphic", "mass", 0.02,
2090
NULL, tbl, FALSE, NULL,
2091
0.0, 1.0, 0.01, 0.1,
2092
sp_ddc_mass_value_changed, 0.01, 2);
2093
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2098
// TRANSLATORS: "drag" means "resistance" here
2099
GtkWidget *hb = sp_tb_spinbutton(_("Drag:"), _("How much resistance affects the movement of the pen"),
2100
"tools.calligraphic", "drag", 1,
2101
NULL, tbl, FALSE, NULL,
2102
0.0, 1.0, 0.01, 0.1,
2103
sp_ddc_drag_value_changed, 0.01, 2);
2104
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2108
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2110
GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
2111
GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
2113
/* Use Pressure button */
2115
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
2116
SP_BUTTON_TYPE_TOGGLE,
2119
_("Use the pressure of the input device to alter the width of the pen"),
2121
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (sp_ddc_pressure_state_changed), NULL);
2122
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.calligraphic", "usepressure", 1));
2123
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
2126
/* Use Tilt button */
2128
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
2129
SP_BUTTON_TYPE_TOGGLE,
2132
_("Use the tilt of the input device to alter the angle of the pen's nib"),
2134
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (sp_ddc_tilt_state_changed), calligraphy_angle);
2135
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.calligraphic", "usetilt", 1));
2136
gtk_widget_set_sensitive(GTK_WIDGET(calligraphy_angle), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
2137
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
2140
gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
2141
gtk_box_pack_start(GTK_BOX(tbl), cvbox, FALSE, FALSE, 0);
2145
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2146
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
2147
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
2149
gtk_container_add(GTK_CONTAINER(hb), b);
2150
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_ddc_defaults), tbl);
2151
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2155
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
2156
swatch->setWatchedTool ("tools.calligraphic", true);
2157
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
2158
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
2160
gtk_widget_show_all(tbl);
2161
sp_set_font_size_smaller (tbl);
3324
EgeAdjustmentAction* calligraphy_angle = 0;
3328
gchar const* labels[] = {_("(hairline)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad stroke)")};
3329
gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
3330
EgeAdjustmentAction *eact = create_adjustment_action( "CalligraphyWidthAction",
3331
_("Pen Width"), _("Width:"),
3332
_("The width of the calligraphic pen (relative to the visible canvas area)"),
3333
"tools.calligraphic", "width", 15,
3334
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-calligraphy",
3336
labels, values, G_N_ELEMENTS(labels),
3337
sp_ddc_width_value_changed, 0.01, 0, 100 );
3338
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3339
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3344
gchar const* labels[] = {_("(speed blows up stroke)"), 0, 0, _("(slight widening)"), _("(constant width)"), _("(slight thinning, default)"), 0, 0, _("(speed deflates stroke)")};
3345
gdouble values[] = {-1, -0.4, -0.2, -0.1, 0, 0.1, 0.2, 0.4, 1};
3346
EgeAdjustmentAction* eact = create_adjustment_action( "ThinningAction",
3347
_("Stroke Thinning"), _("Thinning:"),
3348
_("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"),
3349
"tools.calligraphic", "thinning", 0.1,
3350
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3351
-1.0, 1.0, 0.01, 0.1,
3352
labels, values, G_N_ELEMENTS(labels),
3353
sp_ddc_velthin_value_changed, 0.01, 2);
3354
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3355
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3360
gchar const* labels[] = {_("(left edge up)"), 0, 0, _("(horizontal)"), _("(default)"), 0, _("(right edge up)")};
3361
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
3362
EgeAdjustmentAction* eact = create_adjustment_action( "AngleAction",
3363
_("Pen Angle"), _("Angle:"),
3364
_("The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)"),
3365
"tools.calligraphic", "angle", 30,
3366
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "calligraphy-angle",
3367
-90.0, 90.0, 1.0, 10.0,
3368
labels, values, G_N_ELEMENTS(labels),
3369
sp_ddc_angle_value_changed, 1, 0 );
3370
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3371
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3372
calligraphy_angle = eact;
3377
gchar const* labels[] = {_("(perpendicular to stroke, \"brush\")"), 0, 0, 0, _("(almost fixed, default)"), _("(fixed by Angle, \"pen\")")};
3378
gdouble values[] = {0, 0.2, 0.4, 0.6, 0.9, 1.0};
3379
EgeAdjustmentAction* eact = create_adjustment_action( "FixationAction",
3380
_("Fixation"), _("Fixation:"),
3381
_("Angle behavior (0 = nib always perpendicular to stroke direction, 1 = fixed angle)"),
3382
"tools.calligraphic", "flatness", 0.9,
3383
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3384
0.0, 1.0, 0.01, 0.1,
3385
labels, values, G_N_ELEMENTS(labels),
3386
sp_ddc_flatness_value_changed, 0.01, 2 );
3387
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3388
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3393
gchar const* labels[] = {_("(blunt caps, default)"), _("(slightly bulging)"), 0, 0, _("(approximately round)"), _("(long protruding caps)")};
3394
gdouble values[] = {0, 0.3, 0.5, 1.0, 1.4, 5.0};
3395
// TRANSLATORS: "cap" means "end" (both start and finish) here
3396
EgeAdjustmentAction* eact = create_adjustment_action( "CapRoundingAction",
3397
_("Cap rounding"), _("Caps:"),
3398
_("Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)"),
3399
"tools.calligraphic", "cap_rounding", 0.0,
3400
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3401
0.0, 5.0, 0.01, 0.1,
3402
labels, values, G_N_ELEMENTS(labels),
3403
sp_ddc_cap_rounding_value_changed, 0.01, 2 );
3404
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3405
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3410
gchar const* labels[] = {_("(smooth line)"), _("(slight tremor)"), _("(noticeable tremor)"), 0, 0, _("(maximum tremor)")};
3411
gdouble values[] = {0, 0.1, 0.2, 0.4, 0.6, 1.0};
3412
EgeAdjustmentAction* eact = create_adjustment_action( "TremorAction",
3413
_("Stroke Tremor"), _("Tremor:"),
3414
_("Increase to make strokes rugged and trembling"),
3415
"tools.calligraphic", "tremor", 0.0,
3416
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3417
0.0, 1.0, 0.01, 0.1,
3418
labels, values, G_N_ELEMENTS(labels),
3419
sp_ddc_tremor_value_changed, 0.01, 2 );
3421
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3422
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3427
gchar const* labels[] = {_("(no wiggle)"), _("(slight deviation)"), 0, 0, _("(wild waves and curls)")};
3428
gdouble values[] = {0, 0.2, 0.4, 0.6, 1.0};
3429
EgeAdjustmentAction* eact = create_adjustment_action( "WiggleAction",
3430
_("Pen Wiggle"), _("Wiggle:"),
3431
_("Increase to make the pen waver and wiggle"),
3432
"tools.calligraphic", "wiggle", 0.0,
3433
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3434
0.0, 1.0, 0.01, 0.1,
3435
labels, values, G_N_ELEMENTS(labels),
3436
sp_ddc_wiggle_value_changed, 0.01, 2 );
3437
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3438
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3443
gchar const* labels[] = {_("(no inertia)"), _("(slight smoothing, default)"), _("(noticeable lagging)"), 0, 0, _("(maximum inertia)")};
3444
gdouble values[] = {0.0, 0.02, 0.1, 0.2, 0.5, 1.0};
3445
EgeAdjustmentAction* eact = create_adjustment_action( "MassAction",
3446
_("Pen Mass"), _("Mass:"),
3447
_("Increase to make the pen drag behind, as if slowed by inertia"),
3448
"tools.calligraphic", "mass", 0.02,
3449
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3450
0.0, 1.0, 0.01, 0.1,
3451
labels, values, G_N_ELEMENTS(labels),
3452
sp_ddc_mass_value_changed, 0.01, 2 );
3453
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3454
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3458
/* Trace Background button */
3460
InkToggleAction* act = ink_toggle_action_new( "TraceAction",
3461
_("Trace Background"),
3462
_("Trace the lightness of the background by the width of the pen (white - minimum width, black - maximum width)"),
3464
Inkscape::ICON_SIZE_DECORATION );
3465
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3466
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_trace_background_changed), NULL);
3467
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.calligraphic", "tracebackground", 0 ) );
3470
/* Use Pressure button */
3472
InkToggleAction* act = ink_toggle_action_new( "PressureAction",
3474
_("Use the pressure of the input device to alter the width of the pen"),
3476
Inkscape::ICON_SIZE_DECORATION );
3477
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3478
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_pressure_state_changed), NULL);
3479
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.calligraphic", "usepressure", 1 ) );
3482
/* Use Tilt button */
3484
InkToggleAction* act = ink_toggle_action_new( "TiltAction",
3486
_("Use the tilt of the input device to alter the angle of the pen's nib"),
3488
Inkscape::ICON_SIZE_DECORATION );
3489
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3490
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_tilt_state_changed), calligraphy_angle );
3491
gtk_action_set_sensitive( GTK_ACTION(calligraphy_angle), !prefs_get_int_attribute( "tools.calligraphic", "usetilt", 1 ) );
3492
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.calligraphic", "usetilt", 1 ) );
3497
GtkAction* act = gtk_action_new( "CalligraphyResetAction",
3499
_("Reset all parameters to defaults"),
3501
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_ddc_defaults), holder );
3502
gtk_action_group_add_action( mainActions, act );
3503
gtk_action_set_sensitive( act, TRUE );
2424
3747
// FIXME: implement averaging of all parameters for multiple selected
2425
3748
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
2426
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
2427
sp_arctb_sensitivize (GTK_WIDGET(tbl), 1, 0);
3749
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
3750
sp_arctb_sensitivize( tbl, 1, 0 );
2433
sp_arc_toolbox_new(SPDesktop *desktop)
3755
static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2435
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2437
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2438
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2440
GtkTooltips *tt = gtk_tooltips_new();
2442
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
3757
EgeAdjustmentAction* eact = 0;
3761
EgeOutputAction* act = ege_output_action_new( "ArcStateAction", _("<b>New:</b>"), "", 0 );
3762
ege_output_action_set_use_markup( act, TRUE );
3763
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3764
g_object_set_data( holder, "mode_action", act );
2446
GtkWidget *hb = sp_tb_spinbutton(_("Start:"), _("The angle (in degrees) from the horizontal to the arc's start point"),
3769
eact = create_adjustment_action( "ArcStartAction",
3770
_("Start"), _("Start:"),
3771
_("The angle (in degrees) from the horizontal to the arc's start point"),
2447
3772
"tools.shapes.arc", "start", 0.0,
2448
NULL, tbl, TRUE, "altx-arc",
3773
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-arc",
2449
3774
-360.0, 360.0, 1.0, 10.0,
2450
3776
sp_arctb_start_value_changed);
2451
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3777
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2456
GtkWidget *hb = sp_tb_spinbutton(_("End:"), _("The angle (in degrees) from the horizontal to the arc's end point"),
3782
eact = create_adjustment_action( "ArcEndAction",
3783
_("End"), _("End:"),
3784
_("The angle (in degrees) from the horizontal to the arc's end point"),
2457
3785
"tools.shapes.arc", "end", 0.0,
2458
NULL, tbl, FALSE, NULL,
3786
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
2459
3787
-360.0, 360.0, 1.0, 10.0,
2460
3789
sp_arctb_end_value_changed);
2461
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3790
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2464
3793
/* Segments / Pie checkbox */
2466
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2467
GtkWidget *fscb = gtk_check_button_new_with_label(_("Open arc"));
2468
gtk_tooltips_set_tip(tt, fscb, _("Switch between arc (unclosed shape) and segment (closed shape with two radii)"), NULL);
2470
gchar const *openstr = NULL;
2471
openstr = prefs_get_string_attribute("tools.shapes.arc", "open");
2472
if (!openstr || (openstr && !strcmp(openstr, "false")))
2473
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), FALSE);
2475
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), TRUE);
2477
gtk_widget_show(fscb);
2478
gtk_object_set_data(GTK_OBJECT(tbl), "open_checkbox", fscb);
2479
gtk_container_add(GTK_CONTAINER(hb), fscb);
2480
g_signal_connect(G_OBJECT(fscb), "toggled", GTK_SIGNAL_FUNC(sp_arctb_open_state_changed ), tbl);
2481
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3795
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
3798
gtk_list_store_append( model, &iter );
3799
gtk_list_store_set( model, &iter,
3801
1, _("Switch to segment (closed shape with two radii)"),
3802
2, "circle_closed_arc",
3805
gtk_list_store_append( model, &iter );
3806
gtk_list_store_set( model, &iter,
3808
1, _("Switch to arc (unclosed shape)"),
3809
2, "circle_open_arc",
3812
EgeSelectOneAction* act = ege_select_one_action_new( "ArcOpenAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
3813
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
3814
g_object_set_data( holder, "open_action", act );
3816
ege_select_one_action_set_appearance( act, "full" );
3817
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
3818
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
3819
ege_select_one_action_set_icon_column( act, 2 );
3820
ege_select_one_action_set_tooltip_column( act, 1 );
3822
gchar const *openstr = prefs_get_string_attribute("tools.shapes.arc", "open");
3823
bool isClosed = (!openstr || (openstr && !strcmp(openstr, "false")));
3824
ege_select_one_action_set_active( act, isClosed ? 0 : 1 );
3825
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_arctb_open_state_changed), holder );
2484
3828
/* Make Whole */
2486
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2487
GtkWidget *b = gtk_button_new_with_label(_("Make whole"));
2488
gtk_object_set_data(GTK_OBJECT(tbl), "make_whole", b);
2489
gtk_tooltips_set_tip(tt, b, _("Make the shape a whole ellipse, not arc or segment"), NULL);
2491
gtk_container_add(GTK_CONTAINER(hb), b);
2492
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_arctb_defaults), tbl);
2493
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3830
InkAction* inky = ink_action_new( "ArcResetAction",
3832
_("Make the shape a whole ellipse, not arc or segment"),
3834
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
3835
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_arctb_defaults), holder );
3836
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
3837
gtk_action_set_sensitive( GTK_ACTION(inky), TRUE );
3838
g_object_set_data( holder, "make_whole", inky );
2496
g_object_set_data(G_OBJECT(tbl), "single", GINT_TO_POINTER(TRUE));
3841
g_object_set_data( G_OBJECT(holder), "single", GINT_TO_POINTER(TRUE) );
2497
3842
// sensitivize make whole and open checkbox
2499
GtkAdjustment *adj1 = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "start"));
2500
GtkAdjustment *adj2 = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "end"));
2501
sp_arctb_sensitivize (tbl, adj1->value, adj2->value);
3844
GtkAdjustment *adj1 = GTK_ADJUSTMENT( g_object_get_data( holder, "start" ) );
3845
GtkAdjustment *adj2 = GTK_ADJUSTMENT( g_object_get_data( holder, "end" ) );
3846
sp_arctb_sensitivize( holder, adj1->value, adj2->value );
2504
3850
sigc::connection *connection = new sigc::connection(
2505
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), (GtkObject *)tbl))
3851
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), (GObject *)holder))
2507
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2509
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
2510
swatch->setWatchedTool ("tools.shapes.arc", true);
2511
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
2512
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
2514
gtk_widget_show_all(tbl);
2515
sp_set_font_size_smaller (tbl);
3853
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
3854
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
2615
3890
* TODO: Add queue of last 5 or so colors selected with new swatches so that
2616
3891
* can drag and drop places. Will provide a nice mixing palette.
2619
sp_dropper_toolbox_new(SPDesktop *desktop)
3893
static void sp_dropper_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* mainActions, GObject* holder)
2621
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2623
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2624
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2626
GtkTooltips *tt = gtk_tooltips_new();
2629
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
2630
AUX_BETWEEN_BUTTON_GROUPS);
2631
// sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2635
/* RGB Input Field */
2637
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2638
GtkWidget *dropper_rgba_label = gtk_label_new ("Color:");
2639
gtk_widget_show (dropper_rgba_label);
2640
gtk_container_add(GTK_CONTAINER(hb), dropper_rgba_label);
2642
dropper_rgb_entry = gtk_entry_new ();
2643
sp_dialog_defocus_on_enter (dropper_rgb_entry);
2644
gtk_entry_set_max_length (GTK_ENTRY (dropper_rgb_entry), 7);
2645
gtk_entry_set_width_chars (GTK_ENTRY (dropper_rgb_entry), 7);
2646
gtk_tooltips_set_tip(tt, dropper_rgb_entry,
2647
_("Hexidecimal representation of last selected "
2650
gtk_widget_show (dropper_rgb_entry);
2651
gtk_container_add(GTK_CONTAINER(hb), dropper_rgb_entry);
2653
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
2654
AUX_BETWEEN_BUTTON_GROUPS);
2657
/* Opacity Input Field */
2659
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2660
GtkWidget *dropper_opacity_label = gtk_label_new ( _("Opacity:") );
2661
gtk_widget_show (dropper_opacity_label);
2662
gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_label);
2664
dropper_opacity_entry = gtk_entry_new ();
2665
sp_dialog_defocus_on_enter (dropper_opacity_entry);
2666
gtk_entry_set_max_length (GTK_ENTRY (dropper_opacity_entry), 11);
2667
gtk_entry_set_width_chars (GTK_ENTRY (dropper_opacity_entry), 11);
2668
gtk_tooltips_set_tip(tt, dropper_opacity_entry,
2669
_("Opacity of last selected color"),
2671
gtk_widget_show (dropper_opacity_entry);
2672
gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_entry);
2674
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
2675
AUX_BETWEEN_BUTTON_GROUPS);
2679
/* Copy to Clipboard */
2681
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2682
GtkWidget *b = gtk_button_new_with_label(_("Copy as RGBA"));
2683
gtk_tooltips_set_tip(tt, b, _("Copy last saved color as hexidecimal "
2684
"RGB + Alpha (RGBA) to "
2688
gtk_container_add(GTK_CONTAINER(hb), b);
2689
gtk_signal_connect(GTK_OBJECT(b), "clicked",
2690
GTK_SIGNAL_FUNC(sp_dropper_copy), tbl);
2691
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
2692
AUX_BETWEEN_BUTTON_GROUPS);
2696
/* Copy to Clipboard as HEX */
2698
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2699
GtkWidget *b = gtk_button_new_with_label(_("Copy as HEX"));
2700
gtk_tooltips_set_tip(tt, b, _("Copy last saved color as "
2701
"hexidecimal RGB without alpha "
2702
"to clipboard"), NULL);
2704
gtk_container_add(GTK_CONTAINER(hb), b);
2705
gtk_signal_connect(GTK_OBJECT(b), "clicked",
2706
GTK_SIGNAL_FUNC(sp_dropper_copy_as_hex), tbl);
2707
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
2708
AUX_BETWEEN_BUTTON_GROUPS);
2711
// aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
2714
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2717
sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
2718
SP_BUTTON_TYPE_TOGGLE,
2721
_("When pressed, picks visible color "
2722
"without alpha and when not pressed, "
2723
"picks color including its "
2727
gtk_widget_show(button);
2728
gtk_container_add (GTK_CONTAINER (hb), button);
2730
g_signal_connect_after (G_OBJECT (button), "clicked",
2731
G_CALLBACK (toggle_dropper_color_pick), NULL);
2732
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
2733
!prefs_get_int_attribute ("tools.dropper",
2735
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
2736
AUX_BETWEEN_BUTTON_GROUPS);
2739
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
2742
// where new gtkmm stuff should go
2744
gtk_widget_show_all(tbl);
2745
sp_set_font_size_smaller (tbl);
2748
sigc::connection *connection = new sigc::connection(
2749
desktop->connectSetStyle(
2750
sigc::bind(sigc::ptr_fun(sp_style_changed),
2753
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection),
3895
gint pickAlpha = prefs_get_int_attribute( "tools.dropper", "pick", 1 );
3898
InkToggleAction* act = ink_toggle_action_new( "DropperPickAlphaAction",
3900
_("Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha"),
3902
Inkscape::ICON_SIZE_DECORATION );
3903
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3904
g_object_set_data( holder, "pick_action", act );
3905
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), pickAlpha );
3906
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_pick_alpha), holder );
3910
InkToggleAction* act = ink_toggle_action_new( "DropperSetAlphaAction",
3912
_("If alpha was picked, assign it to selection as fill or stroke transparency"),
3914
Inkscape::ICON_SIZE_DECORATION );
3915
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3916
g_object_set_data( holder, "set_action", act );
3917
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.dropper", "setalpha", 1 ) );
3918
// make sure it's disabled if we're not picking alpha
3919
gtk_action_set_sensitive( GTK_ACTION(act), pickAlpha );
3920
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_set_alpha), holder );
3612
4950
Inkscape::ConnectionPool::connect_destroy (G_OBJECT (tbl), pool);
3618
GtkWidget *px= sp_icon_new(Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_WRITING_MODE_LR);
3619
GtkWidget *b = group = gtk_radio_button_new (NULL);
3620
gtk_container_add (GTK_CONTAINER (b), px);
3621
gtk_tooltips_set_tip (tt, b, _("Horizontal text"), NULL);
3622
gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE);
3623
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE );
3624
gtk_box_pack_start (GTK_BOX (tbl), b, FALSE, FALSE, 0);
3629
GtkWidget *px = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_WRITING_MODE_TB);
3630
GtkWidget *b = gtk_radio_button_new (gtk_radio_button_group (GTK_RADIO_BUTTON (group)));
3631
gtk_container_add (GTK_CONTAINER (b), px);
3632
gtk_tooltips_set_tip (tt, b, _("Vertical text"), NULL);
3633
gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE);
3634
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE );
3635
gtk_box_pack_start (GTK_BOX (tbl), b, FALSE, FALSE, 0);
3638
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
3643
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_LETTER_SPACING);
3644
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3645
gtk_container_add (GTK_CONTAINER (hb), image);
3646
gtk_widget_show(image);
3647
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
3651
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Spacing between letters"),
3652
"tools.text", "letter_spacing", 0.0,
3653
us, tbl, FALSE, NULL,
3654
-1000.0, 1000.0, 0.1, 0.1,
3655
sp_text_letter_changed, 0.1, 1);
3656
gtk_widget_set_size_request (hb, 45, 6);
3657
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
3664
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_LINE_SPACING);
3665
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3666
gtk_container_add (GTK_CONTAINER (hb), image);
3667
gtk_widget_show(image);
3668
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
3672
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Spacing between lines"),
3673
"tools.text", "line_spacing", 0,
3674
us, tbl, FALSE, NULL,
3675
-1000.0, 1000.0, 0.1, 0.1,
3676
sp_text_line_changed, 0.1, 1);
3677
gtk_widget_set_size_request (hb, 45, 0);
3678
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 3);
3683
// horizontal kerning/vertical kerning units menu: create
3684
GtkWidget *us = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
3685
sp_unit_selector_setsize(us, AUX_OPTION_MENU_WIDTH, AUX_OPTION_MENU_HEIGHT);
3686
sp_unit_selector_set_unit(SP_UNIT_SELECTOR(us), desktop->namedview->doc_units);
3688
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
3690
// horizontal kerning
3693
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_HORZ_KERN);
3694
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3695
gtk_container_add (GTK_CONTAINER (hb), image);
3696
gtk_widget_show(image);
3697
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
3701
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Horizontal kerning"),
3702
"tools.text", "horizontal_kerning", 0,
3703
us, tbl, FALSE, NULL,
3704
-100.00, 100.00, 0.01, 0.1,
3705
sp_text_horiz_kern_changed);
3706
gtk_widget_set_size_request (hb, 45, 0);
3707
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
3714
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_VERT_KERN);
3715
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3716
gtk_container_add (GTK_CONTAINER (hb), image);
3717
gtk_widget_show(image);
3718
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
3722
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Vertical kerning"),
3723
"tools.text", "vertical_kerning", 0,
3724
us, tbl, FALSE, NULL,
3725
-100.00, 100.00, 0.01, 0.1,
3726
sp_text_vert_kern_changed);
3727
gtk_widget_set_size_request (hb, 45, 0);
3728
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 5);
3732
// add the units menu
3733
gtk_widget_show(us);
3734
gtk_box_pack_start(GTK_BOX(tbl), us, FALSE, FALSE, 1);
3735
gtk_object_set_data(GTK_OBJECT(tbl), "units", us);
3739
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
3742
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_ROTATION);
3743
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3744
gtk_container_add (GTK_CONTAINER (hb), image);
3745
gtk_widget_show(image);
3746
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
3749
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Letter rotation"),
3750
"tools.text", "letter_rotation", 0,
3751
us, tbl, FALSE, NULL,
3752
-180.0, 180.0, 0.1, 0.1,
3753
sp_text_letter_rotation_changed, 0.1, 1);
3754
gtk_widget_set_size_request (hb, 45, 0);
3755
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
3757
// rotation degree label
3759
GtkWidget *label = gtk_widget_new (GTK_TYPE_LABEL, "label", "\302\260", "xalign", 0.0, NULL);
3760
gtk_box_pack_start(GTK_BOX(tbl), label, FALSE, FALSE, 0);
3764
// Remove Manual Kerns
3766
GtkWidget *px = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_REMOVE_KERNS);
3767
GtkWidget *button = gtk_button_new ();
3768
gtk_container_add (GTK_CONTAINER (button), px);
3769
gtk_widget_show(button);
3770
gtk_tooltips_set_tip (tt, button, _("Remove manual kerns"), NULL);
3771
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
3772
gtk_widget_set_sensitive(button, TRUE);
3773
gtk_box_pack_start (GTK_BOX (tbl), button, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3777
4953
gtk_widget_show_all (tbl);
3876
sp_connector_toolbox_new(SPDesktop *desktop)
5105
static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder )
3878
GtkTooltips *tt = gtk_tooltips_new();
3879
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
3881
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
3882
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
3884
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
3885
AUX_BETWEEN_BUTTON_GROUPS);
3887
sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
3888
"connector_avoid", GTK_SIGNAL_FUNC(sp_connector_path_set_avoid),
3889
tt, _("Make connectors avoid selected objects"));
3891
sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
3892
"connector_ignore", GTK_SIGNAL_FUNC(sp_connector_path_set_ignore),
3893
tt, _("Make connectors ignore selected objects"));
3896
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
3897
AUX_BETWEEN_BUTTON_GROUPS);
5108
InkAction* inky = ink_action_new( "ConnectorAvoidAction",
5110
_("Make connectors avoid selected objects"),
5112
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5113
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_avoid), holder );
5114
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
5118
InkAction* inky = ink_action_new( "ConnectorIgnoreAction",
5120
_("Make connectors ignore selected objects"),
5122
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5123
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_ignore), holder );
5124
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
5127
EgeAdjustmentAction* eact = 0;
3899
5129
// Spacing spinbox
3901
GtkWidget *object_spacing = sp_tb_spinbutton(_("Spacing:"),
3902
_("The amount of space left around objects by auto-routing connectors"),
3903
"tools.connector", "spacing", 10, NULL, tbl, TRUE,
3904
"inkscape:connector-spacing", 0, 100, 1.0, 10.0,
3905
connector_spacing_changed, 1, 0);
3907
gtk_box_pack_start(GTK_BOX(tbl), object_spacing, FALSE, FALSE,
3911
gtk_widget_show_all(tbl);
3912
sp_set_font_size_smaller (tbl);
5130
eact = create_adjustment_action( "ConnectorSpacingAction",
5131
_("Connector Spacing"), _("Spacing:"),
5132
_("The amount of space left around objects by auto-routing connectors"),
5133
"tools.connector", "spacing", defaultConnSpacing,
5134
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
5137
connector_spacing_changed, 1, 0 );
5138
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5140
// Graph (connector network) layout
5142
InkAction* inky = ink_action_new( "ConnectorGraphAction",
5144
_("Nicely arrange selected connector network"),
5146
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5147
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_graph_layout), holder );
5148
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
5151
// Default connector length spinbox
5152
eact = create_adjustment_action( "ConnectorLengthAction",
5153
_("Connector Length"), _("Length:"),
5154
_("Ideal length for connectors when layout is applied"),
5155
"tools.connector", "length", 100,
5156
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-length",
5157
10, 1000, 10.0, 100.0,
5159
connector_length_changed, 1, 0 );
5160
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5163
// Directed edges toggle button
5165
InkToggleAction* act = ink_toggle_action_new( "ConnectorDirectedAction",
5167
_("Make connectors with end-markers (arrows) point downwards"),
5169
Inkscape::ICON_SIZE_DECORATION );
5170
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
5172
gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "directedlayout" );
5173
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
5174
(tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
5176
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder );
5179
// Avoid overlaps toggle button
5181
InkToggleAction* act = ink_toggle_action_new( "ConnectorOverlapAction",
5182
_("Remove overlaps"),
5183
_("Do not allow overlapping shapes"),
5185
Inkscape::ICON_SIZE_DECORATION );
5186
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
5188
gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "avoidoverlaplayout" );
5189
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
5190
(tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
5192
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_nooverlaps_graph_layout_toggled), holder );
3914
5195
// Code to watch for changes to the connector-spacing attribute in
3916
5197
Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);
3917
5198
g_assert(repr != NULL);
3919
Inkscape::XML::Node *oldrepr = (Inkscape::XML::Node *)
3920
gtk_object_get_data(GTK_OBJECT(tbl), "repr");
3922
if (oldrepr) { // remove old listener
3923
sp_repr_remove_listener_by_data(oldrepr, tbl);
3924
Inkscape::GC::release(oldrepr);
3926
g_object_set_data(G_OBJECT(tbl), "repr", NULL);
5200
purge_repr_listener( holder, holder );
3930
g_object_set_data(G_OBJECT(tbl), "repr", repr);
5203
g_object_set_data( holder, "repr", repr );
3931
5204
Inkscape::GC::anchor(repr);
3932
sp_repr_add_listener(repr, &connector_tb_repr_events, tbl);
3933
sp_repr_synthesize_events(repr, &connector_tb_repr_events, tbl);
3938
} // end of sp_connector_toolbox_new()
5205
sp_repr_add_listener( repr, &connector_tb_repr_events, holder );
5206
sp_repr_synthesize_events( repr, &connector_tb_repr_events, holder );
5208
} // end of sp_connector_toolbox_prep()
5211
//#########################
5213
//#########################
5215
static void paintbucket_channels_changed(EgeSelectOneAction* act, GObject* /*tbl*/)
5217
gint channels = ege_select_one_action_get_active( act );
5218
flood_channels_set_channels( channels );
5221
static void paintbucket_threshold_changed(GtkAdjustment *adj, GObject */*tbl*/)
5223
prefs_set_int_attribute("tools.paintbucket", "threshold", (gint)adj->value);
5226
static void paintbucket_autogap_changed(EgeSelectOneAction* act, GObject */*tbl*/)
5228
prefs_set_int_attribute("tools.paintbucket", "autogap", ege_select_one_action_get_active( act ));
5231
static void paintbucket_offset_changed(GtkAdjustment *adj, GObject *tbl)
5233
UnitTracker* tracker = static_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
5234
SPUnit const *unit = tracker->getActiveUnit();
5236
prefs_set_double_attribute("tools.paintbucket", "offset", (gdouble)sp_units_get_pixels(adj->value, *unit));
5238
prefs_set_string_attribute("tools.paintbucket", "offsetunits", sp_unit_get_abbreviation(unit));
5241
static void paintbucket_defaults(GtkWidget *, GObject *dataKludge)
5243
// FIXME: make defaults settable via Inkscape Options
5247
} const key_values[] = {
5252
for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
5253
KeyValue const &kv = key_values[i];
5254
GtkAdjustment* adj = static_cast<GtkAdjustment *>(g_object_get_data(dataKludge, kv.key));
5256
gtk_adjustment_set_value(adj, kv.value);
5260
EgeSelectOneAction* channels_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "channels_action" ) );
5261
ege_select_one_action_set_active( channels_action, FLOOD_CHANNELS_RGB );
5262
EgeSelectOneAction* autogap_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "autogap_action" ) );
5263
ege_select_one_action_set_active( autogap_action, 0 );
5266
static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
5268
EgeAdjustmentAction* eact = 0;
5271
GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
5275
for ( items = flood_channels_dropdown_items_list(); items ; items = g_list_next(items) )
5278
gtk_list_store_append( model, &iter );
5279
gtk_list_store_set( model, &iter, 0, reinterpret_cast<gchar*>(items->data), 1, count, -1 );
5282
g_list_free( items );
5284
EgeSelectOneAction* act1 = ege_select_one_action_new( "ChannelsAction", _("Fill by"), (""), NULL, GTK_TREE_MODEL(model) );
5285
g_object_set( act1, "short_label", _("Fill by:"), NULL );
5286
ege_select_one_action_set_appearance( act1, "compact" );
5287
ege_select_one_action_set_active( act1, prefs_get_int_attribute("tools.paintbucket", "channels", 0) );
5288
g_signal_connect( G_OBJECT(act1), "changed", G_CALLBACK(paintbucket_channels_changed), holder );
5289
gtk_action_group_add_action( mainActions, GTK_ACTION(act1) );
5290
g_object_set_data( holder, "channels_action", act1 );
5295
eact = create_adjustment_action(
5297
_("Fill Threshold"), _("Threshold:"),
5298
_("The maximum allowed difference between the clicked pixel and the neighboring pixels to be counted in the fill"),
5299
"tools.paintbucket", "threshold", 5, GTK_WIDGET(desktop->canvas), NULL, holder, TRUE,
5300
"inkscape:paintbucket-threshold", 0, 100.0, 1.0, 10.0,
5302
paintbucket_threshold_changed, 1, 0 );
5304
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5307
// Create the units menu.
5308
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
5309
const gchar *stored_unit = prefs_get_string_attribute("tools.paintbucket", "offsetunits");
5311
tracker->setActiveUnit(sp_unit_get_by_abbreviation(stored_unit));
5312
g_object_set_data( holder, "tracker", tracker );
5314
GtkAction* act = tracker->createAction( "PaintbucketUnitsAction", _("Units"), ("") );
5315
gtk_action_group_add_action( mainActions, act );
5320
eact = create_adjustment_action(
5322
_("Grow/shrink by"), _("Grow/shrink by:"),
5323
_("The amount to grow (positive) or shrink (negative) the created fill path"),
5324
"tools.paintbucket", "offset", 0, GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE,
5325
"inkscape:paintbucket-offset", -1e6, 1e6, 0.1, 0.5,
5327
paintbucket_offset_changed, 1, 2);
5328
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
5330
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5335
GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
5339
for ( items = flood_autogap_dropdown_items_list(); items ; items = g_list_next(items) )
5342
gtk_list_store_append( model, &iter );
5343
gtk_list_store_set( model, &iter, 0, reinterpret_cast<gchar*>(items->data), 1, count, -1 );
5346
g_list_free( items );
5348
EgeSelectOneAction* act2 = ege_select_one_action_new( "AutoGapAction", _("Close gaps"), (""), NULL, GTK_TREE_MODEL(model) );
5349
g_object_set( act2, "short_label", _("Close gaps:"), NULL );
5350
ege_select_one_action_set_appearance( act2, "compact" );
5351
ege_select_one_action_set_active( act2, prefs_get_int_attribute("tools.paintbucket", "autogap", 0) );
5352
g_signal_connect( G_OBJECT(act2), "changed", G_CALLBACK(paintbucket_autogap_changed), holder );
5353
gtk_action_group_add_action( mainActions, GTK_ACTION(act2) );
5354
g_object_set_data( holder, "autogap_action", act2 );
5359
GtkAction* act = gtk_action_new( "PaintbucketResetAction",
5361
_("Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
5363
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(paintbucket_defaults), holder );
5364
gtk_action_group_add_action( mainActions, act );
5365
gtk_action_set_sensitive( act, TRUE );
3942
5371
Local Variables: