132
154
gchar const *type_name;
133
155
gchar const *data_name;
134
156
GtkWidget *(*create_func)(SPDesktop *desktop);
157
void (*prep_func)(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
158
gchar const *ui_name;
160
gchar const *swatch_tool;
161
gchar const *swatch_tip;
135
162
} const aux_toolboxes[] = {
136
{ "SPSelectContext", "select_toolbox", sp_select_toolbox_new },
137
{ "SPNodeContext", "node_toolbox", sp_node_toolbox_new },
138
{ "SPZoomContext", "zoom_toolbox", sp_zoom_toolbox_new },
139
{ "SPStarContext", "star_toolbox", sp_star_toolbox_new },
140
{ "SPRectContext", "rect_toolbox", sp_rect_toolbox_new },
141
{ "SPArcContext", "arc_toolbox", sp_arc_toolbox_new },
142
{ "SPSpiralContext", "spiral_toolbox", sp_spiral_toolbox_new },
143
{ "SPPencilContext", "pencil_toolbox", sp_pencil_toolbox_new },
144
{ "SPPenContext", "pen_toolbox", sp_pen_toolbox_new },
145
{ "SPDynaDrawContext", "calligraphy_toolbox", sp_calligraphy_toolbox_new },
146
{ "SPTextContext", "text_toolbox", sp_text_toolbox_new },
147
{ "SPDropperContext", "dropper_toolbox", sp_dropper_toolbox_new },
148
{ "SPGradientContext", "gradient_toolbox", sp_gradient_toolbox_new },
149
{ "SPConnectorContext", "connector_toolbox", sp_connector_toolbox_new },
163
{ "SPSelectContext", "select_toolbox", 0, sp_select_toolbox_prep, "SelectToolbar",
164
SP_VERB_INVALID, 0, 0},
165
{ "SPNodeContext", "node_toolbox", 0, sp_node_toolbox_prep, "NodeToolbar",
166
SP_VERB_INVALID, 0, 0},
167
{ "SPTweakContext", "tweak_toolbox", 0, sp_tweak_toolbox_prep, "TweakToolbar",
168
SP_VERB_CONTEXT_TWEAK_PREFS, "tools.tweak", _("Color/opacity used for color tweaking")},
169
{ "SPZoomContext", "zoom_toolbox", 0, sp_zoom_toolbox_prep, "ZoomToolbar",
170
SP_VERB_INVALID, 0, 0},
171
{ "SPStarContext", "star_toolbox", 0, sp_star_toolbox_prep, "StarToolbar",
172
SP_VERB_CONTEXT_STAR_PREFS, "tools.shapes.star", _("Style of new stars")},
173
{ "SPRectContext", "rect_toolbox", 0, sp_rect_toolbox_prep, "RectToolbar",
174
SP_VERB_CONTEXT_RECT_PREFS, "tools.shapes.rect", _("Style of new rectangles")},
175
{ "Box3DContext", "3dbox_toolbox", 0, box3d_toolbox_prep, "3DBoxToolbar",
176
SP_VERB_CONTEXT_3DBOX_PREFS, "tools.shapes.3dbox", _("Style of new 3D boxes")},
177
{ "SPArcContext", "arc_toolbox", 0, sp_arc_toolbox_prep, "ArcToolbar",
178
SP_VERB_CONTEXT_ARC_PREFS, "tools.shapes.arc", _("Style of new ellipses")},
179
{ "SPSpiralContext", "spiral_toolbox", 0, sp_spiral_toolbox_prep, "SpiralToolbar",
180
SP_VERB_CONTEXT_SPIRAL_PREFS, "tools.shapes.spiral", _("Style of new spirals")},
181
{ "SPPencilContext", "pencil_toolbox", 0, sp_pencil_toolbox_prep, "PencilToolbar",
182
SP_VERB_CONTEXT_PENCIL_PREFS, "tools.freehand.pencil", _("Style of new paths created by Pencil")},
183
{ "SPPenContext", "pen_toolbox", 0, sp_pen_toolbox_prep, "PenToolbar",
184
SP_VERB_CONTEXT_PEN_PREFS, "tools.freehand.pen", _("Style of new paths created by Pen")},
185
{ "SPDynaDrawContext", "calligraphy_toolbox", 0, sp_calligraphy_toolbox_prep,"CalligraphyToolbar",
186
SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "tools.calligraphic", _("Style of new calligraphic strokes")},
187
{ "SPTextContext", "text_toolbox", sp_text_toolbox_new, 0, 0,
188
SP_VERB_INVALID, 0, 0},
189
{ "SPDropperContext", "dropper_toolbox", 0, sp_dropper_toolbox_prep, "DropperToolbar",
190
SP_VERB_INVALID, 0, 0},
191
{ "SPGradientContext", "gradient_toolbox", sp_gradient_toolbox_new, 0, 0,
192
SP_VERB_INVALID, 0, 0},
193
{ "SPConnectorContext", "connector_toolbox", 0, sp_connector_toolbox_prep, "ConnectorToolbar",
194
SP_VERB_INVALID, 0, 0},
195
{ "SPFloodContext", "paintbucket_toolbox", 0, sp_paintbucket_toolbox_prep, "PaintbucketToolbar",
196
SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "tools.paintbucket", _("Style of Paint Bucket fill objects")},
197
{ NULL, NULL, NULL, NULL, NULL, SP_VERB_INVALID, NULL, NULL }
201
static gchar const * ui_descr =
203
" <toolbar name='SelectToolbar'>"
204
" <toolitem action='EditSelectAll' />"
205
" <toolitem action='EditSelectAllInAllLayers' />"
206
" <toolitem action='EditDeselect' />"
208
" <toolitem action='ObjectRotate90CCW' />"
209
" <toolitem action='ObjectRotate90' />"
210
" <toolitem action='ObjectFlipHorizontally' />"
211
" <toolitem action='ObjectFlipVertically' />"
213
" <toolitem action='SelectionToBack' />"
214
" <toolitem action='SelectionLower' />"
215
" <toolitem action='SelectionRaise' />"
216
" <toolitem action='SelectionToFront' />"
218
" <toolitem action='XAction' />"
219
" <toolitem action='YAction' />"
220
" <toolitem action='WidthAction' />"
221
" <toolitem action='LockAction' />"
222
" <toolitem action='HeightAction' />"
223
" <toolitem action='UnitsAction' />"
225
" <toolitem action='transform_affect_label' />"
226
" <toolitem action='transform_stroke' />"
227
" <toolitem action='transform_corners' />"
228
" <toolitem action='transform_gradient' />"
229
" <toolitem action='transform_pattern' />"
232
" <toolbar name='NodeToolbar'>"
233
" <toolitem action='NodeInsertAction' />"
234
" <toolitem action='NodeDeleteAction' />"
236
" <toolitem action='NodeJoinAction' />"
237
" <toolitem action='NodeJoinSegmentAction' />"
238
" <toolitem action='NodeDeleteSegmentAction' />"
239
" <toolitem action='NodeBreakAction' />"
241
" <toolitem action='NodeCuspAction' />"
242
" <toolitem action='NodeSmoothAction' />"
243
" <toolitem action='NodeSymmetricAction' />"
245
" <toolitem action='NodeLineAction' />"
246
" <toolitem action='NodeCurveAction' />"
248
" <toolitem action='ObjectToPath' />"
249
" <toolitem action='StrokeToPath' />"
251
" <toolitem action='NodesShowHandlesAction' />"
253
" <toolitem action='EditNextLPEParameterAction' />"
255
" <toolitem action='NodeXAction' />"
256
" <toolitem action='NodeYAction' />"
257
" <toolitem action='NodeUnitsAction' />"
260
" <toolbar name='TweakToolbar'>"
261
" <toolitem action='TweakWidthAction' />"
263
" <toolitem action='TweakForceAction' />"
264
" <toolitem action='TweakPressureAction' />"
266
" <toolitem action='TweakModeAction' />"
268
" <toolitem action='TweakFidelityAction' />"
270
" <toolitem action='TweakChannelsLabel' />"
271
" <toolitem action='TweakDoH' />"
272
" <toolitem action='TweakDoS' />"
273
" <toolitem action='TweakDoL' />"
274
" <toolitem action='TweakDoO' />"
277
" <toolbar name='ZoomToolbar'>"
278
" <toolitem action='ZoomIn' />"
279
" <toolitem action='ZoomOut' />"
281
" <toolitem action='Zoom1:0' />"
282
" <toolitem action='Zoom1:2' />"
283
" <toolitem action='Zoom2:1' />"
285
" <toolitem action='ZoomSelection' />"
286
" <toolitem action='ZoomDrawing' />"
287
" <toolitem action='ZoomPage' />"
288
" <toolitem action='ZoomPageWidth' />"
290
" <toolitem action='ZoomPrev' />"
291
" <toolitem action='ZoomNext' />"
294
" <toolbar name='StarToolbar'>"
296
" <toolitem action='StarStateAction' />"
298
" <toolitem action='FlatAction' />"
300
" <toolitem action='MagnitudeAction' />"
301
" <toolitem action='SpokeAction' />"
302
" <toolitem action='RoundednessAction' />"
303
" <toolitem action='RandomizationAction' />"
305
" <toolitem action='StarResetAction' />"
308
" <toolbar name='RectToolbar'>"
309
" <toolitem action='RectStateAction' />"
310
" <toolitem action='RectWidthAction' />"
311
" <toolitem action='RectHeightAction' />"
312
" <toolitem action='RadiusXAction' />"
313
" <toolitem action='RadiusYAction' />"
314
" <toolitem action='RectUnitsAction' />"
316
" <toolitem action='RectResetAction' />"
319
" <toolbar name='3DBoxToolbar'>"
320
" <toolitem action='3DBoxAngleXAction' />"
321
" <toolitem action='3DBoxVPXStateAction' />"
323
" <toolitem action='3DBoxAngleYAction' />"
324
" <toolitem action='3DBoxVPYStateAction' />"
326
" <toolitem action='3DBoxAngleZAction' />"
327
" <toolitem action='3DBoxVPZStateAction' />"
330
" <toolbar name='SpiralToolbar'>"
331
" <toolitem action='SpiralStateAction' />"
332
" <toolitem action='SpiralRevolutionAction' />"
333
" <toolitem action='SpiralExpansionAction' />"
334
" <toolitem action='SpiralT0Action' />"
336
" <toolitem action='SpiralResetAction' />"
339
" <toolbar name='PenToolbar'>"
342
" <toolbar name='PencilToolbar'>"
345
" <toolbar name='CalligraphyToolbar'>"
347
" <toolitem action='CalligraphyWidthAction' />"
348
" <toolitem action='PressureAction' />"
349
" <toolitem action='TraceAction' />"
350
" <toolitem action='ThinningAction' />"
352
" <toolitem action='AngleAction' />"
353
" <toolitem action='TiltAction' />"
354
" <toolitem action='FixationAction' />"
356
" <toolitem action='CapRoundingAction' />"
358
" <toolitem action='TremorAction' />"
359
" <toolitem action='WiggleAction' />"
360
" <toolitem action='MassAction' />"
362
" <toolitem action='CalligraphyResetAction' />"
365
" <toolbar name='ArcToolbar'>"
366
" <toolitem action='ArcStateAction' />"
368
" <toolitem action='ArcStartAction' />"
369
" <toolitem action='ArcEndAction' />"
371
" <toolitem action='ArcOpenAction' />"
373
" <toolitem action='ArcResetAction' />"
377
" <toolbar name='PaintbucketToolbar'>"
378
" <toolitem action='ChannelsAction' />"
380
" <toolitem action='ThresholdAction' />"
382
" <toolitem action='OffsetAction' />"
383
" <toolitem action='PaintbucketUnitsAction' />"
385
" <toolitem action='AutoGapAction' />"
387
" <toolitem action='PaintbucketResetAction' />"
390
" <toolbar name='DropperToolbar'>"
391
" <toolitem action='DropperPickAlphaAction' />"
392
" <toolitem action='DropperSetAlphaAction' />"
395
" <toolbar name='ConnectorToolbar'>"
396
" <toolitem action='ConnectorAvoidAction' />"
397
" <toolitem action='ConnectorIgnoreAction' />"
398
" <toolitem action='ConnectorSpacingAction' />"
399
" <toolitem action='ConnectorGraphAction' />"
400
" <toolitem action='ConnectorLengthAction' />"
401
" <toolitem action='ConnectorDirectedAction' />"
402
" <toolitem action='ConnectorOverlapAction' />"
408
static GtkActionGroup* create_or_fetch_actions( SPDesktop* desktop );
153
410
static void toolbox_set_desktop (GtkWidget *toolbox, SPDesktop *desktop, SetupFunction setup_func, UpdateFunction update_func, sigc::connection*);
155
412
static void setup_tool_toolbox (GtkWidget *toolbox, SPDesktop *desktop);
692
static EgeAdjustmentAction * create_adjustment_action( gchar const *name,
693
gchar const *label, gchar const *shortLabel, gchar const *tooltip,
694
gchar const *path, gchar const *data, gdouble def,
695
GtkWidget *focusTarget,
698
gboolean altx, gchar const *altx_mark,
699
gdouble lower, gdouble upper, gdouble step, gdouble page,
700
gchar const** descrLabels, gdouble const* descrValues, guint descrCount,
701
void (*callback)(GtkAdjustment *, GObject *),
702
gdouble climb = 0.1, guint digits = 3, double factor = 1.0 )
704
GtkAdjustment* adj = GTK_ADJUSTMENT( gtk_adjustment_new( prefs_get_double_attribute(path, data, def) * factor,
705
lower, upper, step, page, page ) );
707
sp_unit_selector_add_adjustment( SP_UNIT_SELECTOR(us), adj );
710
gtk_signal_connect( GTK_OBJECT(adj), "value-changed", GTK_SIGNAL_FUNC(callback), dataKludge );
712
EgeAdjustmentAction* act = ege_adjustment_action_new( adj, name, label, tooltip, 0, climb, digits );
714
g_object_set( act, "short_label", shortLabel, NULL );
717
if ( (descrCount > 0) && descrLabels && descrValues ) {
718
ege_adjustment_action_set_descriptions( act, descrLabels, descrValues, descrCount );
722
ege_adjustment_action_set_focuswidget( act, focusTarget );
725
if ( altx && altx_mark ) {
726
g_object_set( G_OBJECT(act), "self-id", altx_mark, NULL );
730
g_object_set_data( dataKludge, data, adj );
733
// Using a cast just to make sure we pass in the right kind of function pointer
734
g_object_set( G_OBJECT(act), "tool-post", static_cast<EgeWidgetFixup>(sp_set_font_size_smaller), NULL );
329
740
//####################################
330
741
//# node editing callbacks
331
742
//####################################
745
* FIXME: Returns current shape_editor in context. // later eliminate this function at all!
747
static ShapeEditor *get_current_shape_editor()
749
if (!SP_ACTIVE_DESKTOP) {
753
SPEventContext *event_context = (SP_ACTIVE_DESKTOP)->event_context;
755
if (!SP_IS_NODE_CONTEXT(event_context)) {
759
return SP_NODE_CONTEXT(event_context)->shape_editor;
334
764
sp_node_path_edit_add(void)
336
sp_node_selected_add_node();
766
ShapeEditor *shape_editor = get_current_shape_editor();
767
if (shape_editor) shape_editor->add_node();
340
771
sp_node_path_edit_delete(void)
342
sp_node_selected_delete();
773
ShapeEditor *shape_editor = get_current_shape_editor();
774
if (shape_editor) shape_editor->delete_nodes();
346
778
sp_node_path_edit_delete_segment(void)
348
sp_node_selected_delete_segment();
780
ShapeEditor *shape_editor = get_current_shape_editor();
781
if (shape_editor) shape_editor->delete_segment();
352
785
sp_node_path_edit_break(void)
354
sp_node_selected_break();
787
ShapeEditor *shape_editor = get_current_shape_editor();
788
if (shape_editor) shape_editor->break_at_nodes();
358
792
sp_node_path_edit_join(void)
360
sp_node_selected_join();
794
ShapeEditor *shape_editor = get_current_shape_editor();
795
if (shape_editor) shape_editor->join_nodes();
364
799
sp_node_path_edit_join_segment(void)
366
sp_node_selected_join_segment();
801
ShapeEditor *shape_editor = get_current_shape_editor();
802
if (shape_editor) shape_editor->join_segments();
370
806
sp_node_path_edit_toline(void)
372
sp_node_selected_set_line_type(NR_LINETO);
808
ShapeEditor *shape_editor = get_current_shape_editor();
809
if (shape_editor) shape_editor->set_type_of_segments(NR_LINETO);
376
813
sp_node_path_edit_tocurve(void)
378
sp_node_selected_set_line_type(NR_CURVETO);
815
ShapeEditor *shape_editor = get_current_shape_editor();
816
if (shape_editor) shape_editor->set_type_of_segments(NR_CURVETO);
382
820
sp_node_path_edit_cusp(void)
384
sp_node_selected_set_type(Inkscape::NodePath::NODE_CUSP);
822
ShapeEditor *shape_editor = get_current_shape_editor();
823
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_CUSP);
388
827
sp_node_path_edit_smooth(void)
390
sp_node_selected_set_type(Inkscape::NodePath::NODE_SMOOTH);
829
ShapeEditor *shape_editor = get_current_shape_editor();
830
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SMOOTH);
394
834
sp_node_path_edit_symmetrical(void)
396
sp_node_selected_set_type(Inkscape::NodePath::NODE_SYMM);
836
ShapeEditor *shape_editor = get_current_shape_editor();
837
if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SYMM);
399
static void toggle_show_handles (GtkWidget *button, gpointer data) {
400
bool show = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button));
840
static void toggle_show_handles (GtkToggleAction *act, gpointer /*data*/) {
841
bool show = gtk_toggle_action_get_active( act );
401
842
prefs_set_int_attribute ("tools.nodes", "show_handles", show ? 1 : 0);
402
sp_nodepath_show_handles(show);
843
ShapeEditor *shape_editor = get_current_shape_editor();
844
if (shape_editor) shape_editor->show_handles(show);
847
void sp_node_path_edit_nextLPEparam (GtkAction */*act*/, gpointer data) {
848
sp_selection_next_patheffect_param( reinterpret_cast<SPDesktop*>(data) );
851
/* is called when the node selection is modified */
853
sp_node_toolbox_coord_changed(gpointer /*shape_editor*/, GObject *tbl)
855
GtkAction* xact = GTK_ACTION( g_object_get_data( tbl, "nodes_x_action" ) );
856
GtkAction* yact = GTK_ACTION( g_object_get_data( tbl, "nodes_y_action" ) );
857
GtkAdjustment *xadj = ege_adjustment_action_get_adjustment(EGE_ADJUSTMENT_ACTION(xact));
858
GtkAdjustment *yadj = ege_adjustment_action_get_adjustment(EGE_ADJUSTMENT_ACTION(yact));
860
// quit if run by the attr_changed listener
861
if (g_object_get_data( tbl, "freeze" )) {
865
// in turn, prevent listener from responding
866
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE));
868
UnitTracker* tracker = reinterpret_cast<UnitTracker*>( g_object_get_data( tbl, "tracker" ) );
869
SPUnit const *unit = tracker->getActiveUnit();
871
ShapeEditor *shape_editor = get_current_shape_editor();
872
if (shape_editor && shape_editor->has_nodepath()) {
873
Inkscape::NodePath::Path *nodepath = shape_editor->get_nodepath();
876
n_selected = nodepath->numSelected();
879
if (n_selected == 0) {
880
gtk_action_set_sensitive(xact, FALSE);
881
gtk_action_set_sensitive(yact, FALSE);
883
gtk_action_set_sensitive(xact, TRUE);
884
gtk_action_set_sensitive(yact, TRUE);
885
NR::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit);
886
NR::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit);
888
if (n_selected == 1) {
889
NR::Point sel_node = nodepath->singleSelectedCoords();
890
if (oldx != sel_node[NR::X] || oldy != sel_node[NR::Y]) {
891
gtk_adjustment_set_value(xadj, sp_pixels_get_units(sel_node[NR::X], *unit));
892
gtk_adjustment_set_value(yadj, sp_pixels_get_units(sel_node[NR::Y], *unit));
895
NR::Maybe<NR::Coord> x = sp_node_selected_common_coord(nodepath, NR::X);
896
NR::Maybe<NR::Coord> y = sp_node_selected_common_coord(nodepath, NR::Y);
897
if ((x && ((*x) != oldx)) || (y && ((*y) != oldy))) {
898
/* Note: Currently x and y will always have a value, even if the coordinates of the
899
selected nodes don't coincide (in this case we use the coordinates of the center
900
of the bounding box). So the entries are never set to zero. */
901
// FIXME: Maybe we should clear the entry if several nodes are selected
902
// instead of providing a kind of average value
903
gtk_adjustment_set_value(xadj, sp_pixels_get_units(x ? (*x) : 0.0, *unit));
904
gtk_adjustment_set_value(yadj, sp_pixels_get_units(y ? (*y) : 0.0, *unit));
909
// no shape-editor or nodepath yet (when we just switched to the tool); coord entries must be inactive
910
gtk_action_set_sensitive(xact, FALSE);
911
gtk_action_set_sensitive(yact, FALSE);
914
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
918
sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_name)
920
SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
922
UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
923
SPUnit const *unit = tracker->getActiveUnit();
925
if (sp_document_get_undo_sensitive(sp_desktop_document(desktop))) {
926
prefs_set_double_attribute("tools.nodes", value_name, sp_units_get_pixels(adj->value, *unit));
929
// quit if run by the attr_changed listener
930
if (g_object_get_data( tbl, "freeze" )) {
934
// in turn, prevent listener from responding
935
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE));
937
ShapeEditor *shape_editor = get_current_shape_editor();
938
if (shape_editor && shape_editor->has_nodepath()) {
939
double val = sp_units_get_pixels(gtk_adjustment_get_value(adj), *unit);
940
if (!strcmp(value_name, "x")) {
941
sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::X);
943
if (!strcmp(value_name, "y")) {
944
sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::Y);
948
g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
952
sp_node_path_x_value_changed(GtkAdjustment *adj, GObject *tbl)
954
sp_node_path_value_changed(adj, tbl, "x");
958
sp_node_path_y_value_changed(GtkAdjustment *adj, GObject *tbl)
960
sp_node_path_value_changed(adj, tbl, "y");
405
963
//################################
406
964
//## Node Editing Toolbox ##
407
965
//################################
410
sp_node_toolbox_new(SPDesktop *desktop)
967
static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
412
Inkscape::UI::View::View *view = desktop;
414
GtkTooltips *tt = gtk_tooltips_new();
415
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
417
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
419
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_insert",
420
GTK_SIGNAL_FUNC(sp_node_path_edit_add), tt, _("Insert new nodes into selected segments"));
421
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_delete",
422
GTK_SIGNAL_FUNC(sp_node_path_edit_delete), tt, _("Delete selected nodes"));
424
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
426
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_join",
427
GTK_SIGNAL_FUNC(sp_node_path_edit_join), tt, _("Join selected endnodes"));
428
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_join_segment",
429
GTK_SIGNAL_FUNC(sp_node_path_edit_join_segment), tt, _("Join selected endnodes with a new segment"));
431
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_delete_segment",
432
GTK_SIGNAL_FUNC(sp_node_path_edit_delete_segment), tt, _("Split path between two non-endpoint nodes"));
434
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_break",
435
GTK_SIGNAL_FUNC(sp_node_path_edit_break), tt, _("Break path at selected nodes"));
437
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
439
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_cusp",
440
GTK_SIGNAL_FUNC(sp_node_path_edit_cusp), tt, _("Make selected nodes corner"));
442
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_smooth",
443
GTK_SIGNAL_FUNC(sp_node_path_edit_smooth), tt, _("Make selected nodes smooth"));
445
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_symmetric",
446
GTK_SIGNAL_FUNC(sp_node_path_edit_symmetrical), tt, _("Make selected nodes symmetric"));
448
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
450
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_line",
451
GTK_SIGNAL_FUNC(sp_node_path_edit_toline), tt, _("Make selected segments lines"));
453
sp_toolbox_button_new(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, "node_curve",
454
GTK_SIGNAL_FUNC(sp_node_path_edit_tocurve), tt, _("Make selected segments curves"));
456
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
458
sp_toolbox_button_normal_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, Inkscape::Verb::get(SP_VERB_OBJECT_TO_CURVE), view, tt);
460
sp_toolbox_button_normal_new_from_verb(tb, Inkscape::ICON_SIZE_SMALL_TOOLBAR, Inkscape::Verb::get(SP_VERB_SELECTION_OUTLINE), view, tt);
462
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
464
GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
465
GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
468
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
469
SP_BUTTON_TYPE_TOGGLE,
471
"nodes_show_handles",
472
_("Show the Bezier handles of selected nodes"),
474
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.nodes", "show_handles", 1));
475
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (toggle_show_handles), desktop);
476
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
479
gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
480
gtk_box_pack_start(GTK_BOX(tb), cvbox, FALSE, FALSE, 0);
482
gtk_widget_show_all(tb);
486
} // end of sp_node_toolbox_new()
969
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
970
tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
971
g_object_set_data( holder, "tracker", tracker );
974
InkAction* inky = ink_action_new( "NodeInsertAction",
976
_("Insert new nodes into selected segments"),
978
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
979
g_object_set( inky, "short_label", _("Insert"), NULL );
980
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_add), 0 );
981
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
985
InkAction* inky = ink_action_new( "NodeDeleteAction",
987
_("Delete selected nodes"),
989
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
990
g_object_set( inky, "short_label", _("Delete"), NULL );
991
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete), 0 );
992
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
996
InkAction* inky = ink_action_new( "NodeJoinAction",
998
_("Join selected endnodes"),
1000
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1001
g_object_set( inky, "short_label", _("Join"), NULL );
1002
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join), 0 );
1003
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1007
InkAction* inky = ink_action_new( "NodeJoinSegmentAction",
1009
_("Join selected endnodes with a new segment"),
1010
"node_join_segment",
1011
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1012
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_join_segment), 0 );
1013
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1017
InkAction* inky = ink_action_new( "NodeDeleteSegmentAction",
1018
_("Delete Segment"),
1019
_("Split path between two non-endpoint nodes"),
1020
"node_delete_segment",
1021
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1022
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_delete_segment), 0 );
1023
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1027
InkAction* inky = ink_action_new( "NodeBreakAction",
1029
_("Break path at selected nodes"),
1031
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1032
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_break), 0 );
1033
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1037
InkAction* inky = ink_action_new( "NodeCuspAction",
1039
_("Make selected nodes corner"),
1041
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1042
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_cusp), 0 );
1043
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1047
InkAction* inky = ink_action_new( "NodeSmoothAction",
1049
_("Make selected nodes smooth"),
1051
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1052
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_smooth), 0 );
1053
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1057
InkAction* inky = ink_action_new( "NodeSymmetricAction",
1058
_("Node Symmetric"),
1059
_("Make selected nodes symmetric"),
1061
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1062
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_symmetrical), 0 );
1063
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1067
InkAction* inky = ink_action_new( "NodeLineAction",
1069
_("Make selected segments lines"),
1071
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1072
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_toline), 0 );
1073
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1077
InkAction* inky = ink_action_new( "NodeCurveAction",
1079
_("Make selected segments curves"),
1081
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
1082
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_tocurve), 0 );
1083
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1087
InkToggleAction* act = ink_toggle_action_new( "NodesShowHandlesAction",
1089
_("Show the Bezier handles of selected nodes"),
1090
"nodes_show_handles",
1091
Inkscape::ICON_SIZE_DECORATION );
1092
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
1093
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_show_handles), desktop );
1094
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.nodes", "show_handles", 1 ) );
1098
InkAction* inky = ink_action_new( "EditNextLPEParameterAction",
1099
_("Next Path Effect Parameter"),
1100
_("Show next Path Effect parameter for editing"),
1101
"edit_next_parameter",
1102
Inkscape::ICON_SIZE_DECORATION );
1103
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_node_path_edit_nextLPEparam), desktop );
1104
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1107
/* X coord of selected node(s) */
1109
EgeAdjustmentAction* eact = 0;
1110
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1111
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
1112
eact = create_adjustment_action( "NodeXAction",
1113
_("X coordinate:"), _("X:"), _("X coordinate of selected node(s)"),
1114
"tools.nodes", "Xcoord", 0,
1115
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-nodes",
1116
-1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1117
labels, values, G_N_ELEMENTS(labels),
1118
sp_node_path_x_value_changed );
1119
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
1120
g_object_set_data( holder, "nodes_x_action", eact );
1121
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1122
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1125
/* Y coord of selected node(s) */
1127
EgeAdjustmentAction* eact = 0;
1128
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
1129
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
1130
eact = create_adjustment_action( "NodeYAction",
1131
_("Y coordinate:"), _("Y:"), _("Y coordinate of selected node(s)"),
1132
"tools.nodes", "Ycoord", 0,
1133
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1134
-1e6, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1135
labels, values, G_N_ELEMENTS(labels),
1136
sp_node_path_y_value_changed );
1137
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
1138
g_object_set_data( holder, "nodes_y_action", eact );
1139
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1140
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1143
// add the units menu
1145
GtkAction* act = tracker->createAction( "NodeUnitsAction", _("Units"), ("") );
1146
gtk_action_group_add_action( mainActions, act );
1149
sigc::connection *connection = new sigc::connection (
1150
desktop->connectToolSubselectionChanged(sigc::bind (sigc::ptr_fun(sp_node_toolbox_coord_changed), (GObject *)holder))
1153
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
1154
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1155
} // end of sp_node_toolbox_prep()
489
1158
//########################
490
1159
//## Zoom Toolbox ##
491
1160
//########################
494
sp_zoom_toolbox_new(SPDesktop *desktop)
1162
static void sp_zoom_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
496
Inkscape::UI::View::View *view=desktop;
498
GtkTooltips *tt = gtk_tooltips_new();
499
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
501
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0),
502
FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
504
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);
506
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);
508
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
510
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);
512
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);
514
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);
516
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);
518
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
520
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);
522
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);
524
gtk_box_pack_start(GTK_BOX(tb), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
526
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);
528
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);
530
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);
532
gtk_widget_show_all(tb);
536
} // end of sp_zoom_toolbox_new()
1164
// no custom GtkAction setup needed
1165
} // end of sp_zoom_toolbox_prep()
539
1168
sp_tool_toolbox_set_desktop(GtkWidget *toolbox, SPDesktop *desktop)
660
1361
setup_commands_toolbox(GtkWidget *toolbox, SPDesktop *desktop)
662
Inkscape::UI::View::View *view = desktop;
664
GtkTooltips *tt = gtk_tooltips_new();
665
GtkWidget *tb = gtk_hbox_new(FALSE, 0);
1363
gchar const * descr =
1365
" <toolbar name='CommandsToolbar'>"
1366
" <toolitem action='FileNew' />"
1367
" <toolitem action='FileOpen' />"
1368
" <toolitem action='FileSave' />"
1369
" <toolitem action='FilePrint' />"
1371
" <toolitem action='FileImport' />"
1372
" <toolitem action='FileExport' />"
1374
" <toolitem action='EditUndo' />"
1375
" <toolitem action='EditRedo' />"
1377
" <toolitem action='EditCopy' />"
1378
" <toolitem action='EditCut' />"
1379
" <toolitem action='EditPaste' />"
1381
" <toolitem action='ZoomSelection' />"
1382
" <toolitem action='ZoomDrawing' />"
1383
" <toolitem action='ZoomPage' />"
1385
" <toolitem action='EditDuplicate' />"
1386
" <toolitem action='EditClone' />"
1387
" <toolitem action='EditUnlinkClone' />"
1389
" <toolitem action='SelectionGroup' />"
1390
" <toolitem action='SelectionUnGroup' />"
1392
" <toolitem action='DialogFillStroke' />"
1393
" <toolitem action='DialogText' />"
1394
" <toolitem action='DialogXMLEditor' />"
1395
" <toolitem action='DialogAlignDistribute' />"
1397
" <toolitem action='DialogPreferences' />"
1398
" <toolitem action='DialogDocumentProperties' />"
1401
GtkActionGroup* mainActions = create_or_fetch_actions( desktop );
1404
GtkUIManager* mgr = gtk_ui_manager_new();
1407
gtk_ui_manager_insert_action_group( mgr, mainActions, 0 );
1408
gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal );
1410
GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/CommandsToolbar" );
1411
if ( prefs_get_int_attribute_limited( "toolbox", "icononly", 1, 0, 1 ) ) {
1412
gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
667
1414
gint shrinkTop = prefs_get_int_attribute_limited( "toolbox", "small", 1, 0, 1 );
668
1415
Inkscape::IconSize toolboxSize = shrinkTop ? Inkscape::ICON_SIZE_SMALL_TOOLBAR : Inkscape::ICON_SIZE_LARGE_TOOLBAR;
670
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_NEW), view, tt);
671
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_OPEN), view, tt);
672
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_SAVE), view, tt);
673
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_PRINT), 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_FILE_IMPORT), view, tt);
678
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_FILE_EXPORT), 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_UNDO), view, tt);
683
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_REDO), view, tt);
685
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
687
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_COPY), view, tt);
688
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_CUT), view, tt);
689
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_PASTE), view, tt);
691
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
693
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_SELECTION), view, tt);
694
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_DRAWING), view, tt);
695
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_ZOOM_PAGE), view, tt);
697
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
699
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_DUPLICATE), view, tt);
700
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_CLONE), view, tt);
701
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_UNLINK_CLONE), view, tt);
703
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
705
sp_toolbox_button_normal_new_from_verb(tb, toolboxSize, Inkscape::Verb::get(SP_VERB_SELECTION_GROUP), view, tt);
706
sp_toolbox_button_normal_new_from_verb(tb, toolboxSize, Inkscape::Verb::get(SP_VERB_SELECTION_UNGROUP), view, tt);
708
// disabled until we have icons for them:
712
//sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_TILE), view, tt);
713
//sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_EDIT_UNTILE), view, tt);
715
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
717
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_FILL_STROKE), view, tt);
718
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_TEXT), view, tt);
719
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_XML_EDITOR), view, tt);
720
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_ALIGN_DISTRIBUTE), view, tt);
722
aux_toolbox_space(tb, AUX_BETWEEN_BUTTON_GROUPS);
724
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_DISPLAY), view, tt);
725
sp_toolbox_button_new_from_verb(tb, toolboxSize, SP_BUTTON_TYPE_NORMAL, Inkscape::Verb::get(SP_VERB_DIALOG_NAMEDVIEW), view, tt);
727
gtk_widget_show_all(tb);
729
gtk_container_add(GTK_CONTAINER(toolbox), tb);
1416
gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), (GtkIconSize)toolboxSize );
1419
gtk_container_add( GTK_CONTAINER(toolbox), toolBar );
733
update_commands_toolbox(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox)
1423
update_commands_toolbox(SPDesktop */*desktop*/, SPEventContext */*eventcontext*/, GtkWidget */*toolbox*/)
1245
sp_star_toolbox_new(SPDesktop *desktop)
1858
static void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1247
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1249
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1250
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1252
GtkTooltips *tt = gtk_tooltips_new();
1254
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
1256
gchar const *flatsidedstr = NULL;
1258
/* Flatsided checkbox */
1260
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1261
GtkWidget *fscb = gtk_check_button_new_with_label(_("Polygon"));
1262
gtk_widget_set_sensitive(GTK_WIDGET(fscb), TRUE);
1263
flatsidedstr = prefs_get_string_attribute("tools.shapes.star", "isflatsided");
1264
if (!flatsidedstr || (flatsidedstr && !strcmp(flatsidedstr, "false")))
1265
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), FALSE);
1267
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), TRUE);
1268
gtk_tooltips_set_tip(tt, fscb, _("Regular polygon (with one handle) instead of a star"), NULL);
1269
gtk_widget_show(fscb);
1270
gtk_object_set_data(GTK_OBJECT(tbl), "flat_checkbox", fscb);
1271
gtk_container_add(GTK_CONTAINER(hb), fscb);
1272
g_signal_connect(G_OBJECT(fscb), "toggled", GTK_SIGNAL_FUNC(sp_stb_sides_flat_state_changed ), tbl);
1273
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_SPACING);
1861
EgeOutputAction* act = ege_output_action_new( "StarStateAction", _("<b>New:</b>"), "", 0 );
1862
ege_output_action_set_use_markup( act, TRUE );
1863
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
1864
g_object_set_data( holder, "mode_action", act );
1276
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
1280
GtkWidget *hb = sp_tb_spinbutton(_("Corners:"), _("Number of corners of a polygon or star"),
1868
EgeAdjustmentAction* eact = 0;
1869
gchar const *flatsidedstr = prefs_get_string_attribute( "tools.shapes.star", "isflatsided" );
1870
bool isFlatSided = flatsidedstr ? (strcmp(flatsidedstr, "false") != 0) : true;
1872
/* Flatsided checkbox */
1874
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
1877
gtk_list_store_append( model, &iter );
1878
gtk_list_store_set( model, &iter,
1880
1, _("Regular polygon (with one handle) instead of a star"),
1884
gtk_list_store_append( model, &iter );
1885
gtk_list_store_set( model, &iter,
1887
1, _("Star instead of a regular polygon (with one handle)"),
1891
EgeSelectOneAction* act = ege_select_one_action_new( "FlatAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
1892
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
1893
g_object_set_data( holder, "flat_action", act );
1895
ege_select_one_action_set_appearance( act, "full" );
1896
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
1897
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
1898
ege_select_one_action_set_icon_column( act, 2 );
1899
ege_select_one_action_set_tooltip_column( act, 1 );
1901
ege_select_one_action_set_active( act, isFlatSided ? 0 : 1 );
1902
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_stb_sides_flat_state_changed), holder);
1907
gchar const* labels[] = {_("triangle/tri-star"), _("square/quad-star"), _("pentagon/five-pointed star"), _("hexagon/six-pointed star"), 0, 0, 0, 0, 0};
1908
gdouble values[] = {3, 4, 5, 6, 7, 8, 10, 12, 20};
1909
eact = create_adjustment_action( "MagnitudeAction",
1910
_("Corners"), _("Corners:"), _("Number of corners of a polygon or star"),
1281
1911
"tools.shapes.star", "magnitude", 3,
1282
NULL, tbl, TRUE, "altx-star",
1284
sp_stb_magnitude_value_changed, 1, 0);
1285
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1912
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1914
labels, values, G_N_ELEMENTS(labels),
1915
sp_stb_magnitude_value_changed,
1917
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1918
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1290
GtkWidget *hb = sp_tb_spinbutton(_("Spoke ratio:"),
1923
gchar const* labels[] = {_("thin-ray star"), 0, _("pentagram"), _("hexagram"), _("heptagram"), _("octagram"), _("regular polygon")};
1924
gdouble values[] = {0.01, 0.2, 0.382, 0.577, 0.692, 0.765, 1};
1925
eact = create_adjustment_action( "SpokeAction",
1926
_("Spoke ratio"), _("Spoke ratio:"),
1291
1927
// TRANSLATORS: Tip radius of a star is the distance from the center to the farthest handle.
1292
1928
// Base radius is the same for the closest handle.
1293
1929
_("Base radius to tip radius ratio"),
1294
1930
"tools.shapes.star", "proportion", 0.5,
1295
NULL, tbl, FALSE, NULL,
1931
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1296
1932
0.01, 1.0, 0.01, 0.1,
1297
sp_stb_proportion_value_changed);
1298
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1299
g_object_set_data(G_OBJECT(tbl), "prop_widget", hb);
1300
if (!flatsidedstr || (flatsidedstr && !strcmp(flatsidedstr, "false")))
1301
gtk_widget_set_sensitive(GTK_WIDGET(hb), TRUE);
1303
gtk_widget_set_sensitive(GTK_WIDGET(hb), FALSE);
1308
GtkWidget *hb = sp_tb_spinbutton(_("Rounded:"), _("How much rounded are the corners (0 for sharp)"),
1933
labels, values, G_N_ELEMENTS(labels),
1934
sp_stb_proportion_value_changed );
1935
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1936
g_object_set_data( holder, "prop_action", eact );
1939
if ( !isFlatSided ) {
1940
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1942
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
1947
gchar const* labels[] = {_("stretched"), _("twisted"), _("slightly pinched"), _("NOT rounded"), _("slightly rounded"), _("visibly rounded"), _("well rounded"), _("amply rounded"), 0, _("stretched"), _("blown up")};
1948
gdouble values[] = {-1, -0.2, -0.03, 0, 0.05, 0.1, 0.2, 0.3, 0.5, 1, 10};
1949
eact = create_adjustment_action( "RoundednessAction",
1950
_("Rounded"), _("Rounded:"), _("How much rounded are the corners (0 for sharp)"),
1309
1951
"tools.shapes.star", "rounded", 0.0,
1310
NULL, tbl, FALSE, NULL,
1311
-100.0, 100.0, 0.01, 0.1,
1312
sp_stb_rounded_value_changed);
1313
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1952
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1953
-10.0, 10.0, 0.01, 0.1,
1954
labels, values, G_N_ELEMENTS(labels),
1955
sp_stb_rounded_value_changed );
1956
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1957
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1318
GtkWidget *hb = sp_tb_spinbutton(_("Randomized:"), _("Scatter randomly the corners and angles"),
1962
gchar const* labels[] = {_("NOT randomized"), _("slightly irregular"), _("visibly randomized"), _("strongly randomized"), _("blown up")};
1963
gdouble values[] = {0, 0.01, 0.1, 0.5, 10};
1964
eact = create_adjustment_action( "RandomizationAction",
1965
_("Randomized"), _("Randomized:"), _("Scatter randomly the corners and angles"),
1319
1966
"tools.shapes.star", "randomized", 0.0,
1320
NULL, tbl, FALSE, NULL,
1967
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1321
1968
-10.0, 10.0, 0.001, 0.01,
1322
sp_stb_randomized_value_changed, 0.1, 3);
1323
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
1969
labels, values, G_N_ELEMENTS(labels),
1970
sp_stb_randomized_value_changed, 0.1, 3 );
1971
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1972
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
1326
aux_toolbox_space(tbl, AUX_SPACING);
1330
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1331
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
1332
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
1334
gtk_container_add(GTK_CONTAINER(hb), b);
1335
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_stb_defaults), tbl);
1336
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_SPACING);
1979
GtkAction* act = gtk_action_new( "StarResetAction",
1981
_("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
1983
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_stb_defaults), holder );
1984
gtk_action_group_add_action( mainActions, act );
1985
gtk_action_set_sensitive( act, TRUE );
1339
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1340
swatch->setWatchedTool ("tools.shapes.star", true);
1341
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1342
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1344
gtk_widget_show_all(tbl);
1345
sp_set_font_size_smaller (tbl);
1347
1989
sigc::connection *connection = new sigc::connection(
1348
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), (GtkObject *)tbl))
1990
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), (GObject *)holder))
1350
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
1992
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
1993
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1584
2214
// FIXME: implement averaging of all parameters for multiple selected
1585
2215
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
1586
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
1587
sp_rtb_sensitivize (GTK_WIDGET(tbl));
2216
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
2217
sp_rtb_sensitivize( tbl );
1593
sp_rect_toolbox_new(SPDesktop *desktop)
2222
static void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1595
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1597
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1598
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1600
GtkTooltips *tt = gtk_tooltips_new();
1602
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2224
EgeAdjustmentAction* eact = 0;
2227
EgeOutputAction* act = ege_output_action_new( "RectStateAction", _("<b>New:</b>"), "", 0 );
2228
ege_output_action_set_use_markup( act, TRUE );
2229
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2230
g_object_set_data( holder, "mode_action", act );
1604
2233
// rx/ry units menu: create
1605
GtkWidget *us = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
1606
sp_unit_selector_setsize(us, AUX_OPTION_MENU_WIDTH, AUX_OPTION_MENU_HEIGHT);
1607
sp_unit_selector_set_unit(SP_UNIT_SELECTOR(us), desktop->namedview->doc_units);
2234
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
2235
//tracker->addUnit( SP_UNIT_PERCENT, 0 );
1608
2236
// fixme: add % meaning per cent of the width/height
2237
tracker->setActiveUnit( sp_desktop_namedview(desktop)->doc_units );
2238
g_object_set_data( holder, "tracker", tracker );
1612
GtkWidget *hb = sp_tb_spinbutton(_("W:"), _("Width of rectangle"),
2242
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2243
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
2244
eact = create_adjustment_action( "RectWidthAction",
2245
_("Width"), _("W:"), _("Width of rectangle"),
1613
2246
"tools.shapes.rect", "width", 0,
1614
us, tbl, TRUE, "altx-rect",
2247
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-rect",
1615
2248
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1616
sp_rtb_width_value_changed);
1617
gtk_object_set_data(GTK_OBJECT(tbl), "width_sb", hb);
1618
gtk_widget_set_sensitive(hb, FALSE);
1619
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2249
labels, values, G_N_ELEMENTS(labels),
2250
sp_rtb_width_value_changed );
2251
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2252
g_object_set_data( holder, "width_action", eact );
2253
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2254
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1624
GtkWidget *hb = sp_tb_spinbutton(_("H:"), _("Height of rectangle"),
2259
gchar const* labels[] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
2260
gdouble values[] = {1, 2, 3, 5, 10, 20, 50, 100, 200, 500};
2261
eact = create_adjustment_action( "RectHeightAction",
2262
_("Height"), _("H:"), _("Height of rectangle"),
1625
2263
"tools.shapes.rect", "height", 0,
1626
us, tbl, FALSE, NULL,
2264
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1627
2265
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
1628
sp_rtb_height_value_changed);
1629
gtk_object_set_data(GTK_OBJECT(tbl), "height_sb", hb);
1630
gtk_widget_set_sensitive(hb, FALSE);
1631
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2266
labels, values, G_N_ELEMENTS(labels),
2267
sp_rtb_height_value_changed );
2268
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2269
g_object_set_data( holder, "height_action", eact );
2270
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2271
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1636
GtkWidget *hb = sp_tb_spinbutton(_("Rx:"), _("Horizontal radius of rounded corners"),
2276
gchar const* labels[] = {_("not rounded"), 0, 0, 0, 0, 0, 0, 0, 0};
2277
gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2278
eact = create_adjustment_action( "RadiusXAction",
2279
_("Horizontal radius"), _("Rx:"), _("Horizontal radius of rounded corners"),
1637
2280
"tools.shapes.rect", "rx", 0,
1638
us, tbl, FALSE, NULL,
2281
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1639
2282
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
2283
labels, values, G_N_ELEMENTS(labels),
1640
2284
sp_rtb_rx_value_changed);
1641
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2285
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2286
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1646
GtkWidget *hb = sp_tb_spinbutton(_("Ry:"), _("Vertical radius of rounded corners"),
2291
gchar const* labels[] = {_("not rounded"), 0, 0, 0, 0, 0, 0, 0, 0};
2292
gdouble values[] = {0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2293
eact = create_adjustment_action( "RadiusYAction",
2294
_("Vertical radius"), _("Ry:"), _("Vertical radius of rounded corners"),
1647
2295
"tools.shapes.rect", "ry", 0,
1648
us, tbl, FALSE, NULL,
2296
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
1649
2297
0, 1e6, SPIN_STEP, SPIN_PAGE_STEP,
2298
labels, values, G_N_ELEMENTS(labels),
1650
2299
sp_rtb_ry_value_changed);
1651
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2300
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
2301
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1654
2304
// add the units menu
1655
gtk_widget_show(us);
1656
gtk_box_pack_start(GTK_BOX(tbl), us, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
1657
gtk_object_set_data(GTK_OBJECT(tbl), "units", us);
2306
GtkAction* act = tracker->createAction( "RectUnitsAction", _("Units"), ("") );
2307
gtk_action_group_add_action( mainActions, act );
1661
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1662
GtkWidget *b = gtk_button_new_with_label(_("Not rounded"));
1663
gtk_object_set_data(GTK_OBJECT(tbl), "not_rounded", b);
1664
gtk_tooltips_set_tip(tt, b, _("Make corners sharp"), NULL);
1666
gtk_container_add(GTK_CONTAINER(hb), b);
1667
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_rtb_defaults), tbl);
1668
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2312
InkAction* inky = ink_action_new( "RectResetAction",
2314
_("Make corners sharp"),
2316
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
2317
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_rtb_defaults), holder );
2318
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
2319
gtk_action_set_sensitive( GTK_ACTION(inky), TRUE );
2320
g_object_set_data( holder, "not_rounded", inky );
1671
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1672
swatch->setWatchedTool ("tools.shapes.rect", true);
1673
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1674
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1676
g_object_set_data(G_OBJECT(tbl), "single", GINT_TO_POINTER(TRUE));
1677
sp_rtb_sensitivize (tbl);
1679
gtk_widget_show_all(tbl);
1680
sp_set_font_size_smaller (tbl);
2323
g_object_set_data( holder, "single", GINT_TO_POINTER(TRUE) );
2324
sp_rtb_sensitivize( holder );
1682
2326
sigc::connection *connection = new sigc::connection(
1683
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), (GtkObject *)tbl))
2327
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), (GObject *)holder))
1685
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2329
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
2330
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
2333
//########################
2335
//########################
2337
// normalize angle so that it lies in the interval [0,360]
2338
static double box3d_normalize_angle (double a) {
2339
double angle = a + ((int) (a/360.0))*360;
2347
box3d_set_button_and_adjustment(Persp3D *persp, Proj::Axis axis,
2348
GtkAdjustment *adj, GtkAction *act, GtkToggleAction *tact) {
2349
// TODO: Take all selected perspectives into account but don't touch the state button if not all of them
2350
// have the same state (otherwise a call to box3d_vp_z_state_changed() is triggered and the states
2352
bool is_infinite = !persp3d_VP_is_finite(persp, axis);
2355
gtk_toggle_action_set_active(tact, TRUE);
2356
gtk_action_set_sensitive(act, TRUE);
2358
double angle = persp3d_get_infinite_angle(persp, axis);
2359
if (angle != NR_HUGE) { // FIXME: We should catch this error earlier (don't show the spinbutton at all)
2360
gtk_adjustment_set_value(adj, box3d_normalize_angle(angle));
2363
gtk_toggle_action_set_active(tact, FALSE);
2364
gtk_action_set_sensitive(act, FALSE);
2369
box3d_resync_toolbar(Inkscape::XML::Node *persp_repr, GObject *data) {
2371
g_print ("No perspective given to box3d_resync_toolbar().\n");
2375
GtkWidget *tbl = GTK_WIDGET(data);
2376
GtkAdjustment *adj = 0;
2378
GtkToggleAction *tact = 0;
2379
Persp3D *persp = persp3d_get_from_repr(persp_repr);
2381
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_x"));
2382
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_x_action"));
2383
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_x_state_action"))->action;
2385
box3d_set_button_and_adjustment(persp, Proj::X, adj, act, tact);
2388
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_y"));
2389
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_y_action"));
2390
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_y_state_action"))->action;
2392
box3d_set_button_and_adjustment(persp, Proj::Y, adj, act, tact);
2395
adj = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "box3d_angle_z"));
2396
act = GTK_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_angle_z_action"));
2397
tact = &INK_TOGGLE_ACTION(g_object_get_data(G_OBJECT(tbl), "box3d_vp_z_state_action"))->action;
2399
box3d_set_button_and_adjustment(persp, Proj::Z, adj, act, tact);
2403
static void box3d_persp_tb_event_attr_changed(Inkscape::XML::Node *repr, gchar const *name,
2404
gchar const */*old_value*/, gchar const */*new_value*/,
2405
bool /*is_interactive*/, gpointer data)
2407
GtkWidget *tbl = GTK_WIDGET(data);
2409
// quit if run by the attr_changed listener
2410
// note: it used to work without the differently called freeze_ attributes (here and in
2411
// box3d_angle_value_changed()) but I now it doesn't so I'm leaving them in for now
2412
if (g_object_get_data(G_OBJECT(tbl), "freeze_angle")) {
2416
// set freeze so that it can be caught in box3d_angle_z_value_changed() (to avoid calling
2417
// sp_document_maybe_done() when the document is undo insensitive)
2418
g_object_set_data(G_OBJECT(tbl), "freeze_attr", GINT_TO_POINTER(TRUE));
2420
// TODO: Only update the appropriate part of the toolbar
2421
// if (!strcmp(name, "inkscape:vp_z")) {
2422
box3d_resync_toolbar(repr, G_OBJECT(tbl));
2425
Persp3D *persp = persp3d_get_from_repr(repr);
2426
persp3d_update_box_reprs(persp);
2428
g_object_set_data(G_OBJECT(tbl), "freeze_attr", GINT_TO_POINTER(FALSE));
2431
static Inkscape::XML::NodeEventVector box3d_persp_tb_repr_events =
2433
NULL, /* child_added */
2434
NULL, /* child_removed */
2435
box3d_persp_tb_event_attr_changed,
2436
NULL, /* content_changed */
2437
NULL /* order_changed */
2441
* \param selection Should not be NULL.
2443
// FIXME: This should rather be put into persp3d-reference.cpp or something similar so that it reacts upon each
2444
// Change of the perspective, and not of the current selection (but how to refer to the toolbar then?)
2446
box3d_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
2448
// Here the following should be done: If all selected boxes have finite VPs in a certain direction,
2449
// disable the angle entry fields for this direction (otherwise entering a value in them should only
2450
// update the perspectives with infinite VPs and leave the other ones untouched).
2452
Inkscape::XML::Node *persp_repr = NULL;
2453
purge_repr_listener(tbl, tbl);
2455
SPItem *item = selection->singleItem();
2456
if (item && SP_IS_BOX3D(item)) {
2457
// FIXME: Also deal with multiple selected boxes
2458
SPBox3D *box = SP_BOX3D(item);
2459
Persp3D *persp = box3d_get_perspective(box);
2460
persp_repr = SP_OBJECT_REPR(persp);
2462
g_object_set_data(tbl, "repr", persp_repr);
2463
Inkscape::GC::anchor(persp_repr);
2464
sp_repr_add_listener(persp_repr, &box3d_persp_tb_repr_events, tbl);
2465
sp_repr_synthesize_events(persp_repr, &box3d_persp_tb_repr_events, tbl);
2468
inkscape_active_document()->current_persp3d = persp3d_get_from_repr(persp_repr);
2469
prefs_set_string_attribute("tools.shapes.3dbox", "persp", persp_repr->attribute("id"));
2471
box3d_resync_toolbar(persp_repr, tbl);
2476
box3d_angle_value_changed(GtkAdjustment *adj, GObject *dataKludge, Proj::Axis axis)
2478
SPDesktop *desktop = (SPDesktop *) g_object_get_data( dataKludge, "desktop" );
2479
SPDocument *document = sp_desktop_document(desktop);
2481
// quit if run by the attr_changed listener
2482
// note: it used to work without the differently called freeze_ attributes (here and in
2483
// box3d_persp_tb_event_attr_changed()) but I now it doesn't so I'm leaving them in for now
2484
if (g_object_get_data( dataKludge, "freeze_attr" )) {
2488
// in turn, prevent listener from responding
2489
g_object_set_data(dataKludge, "freeze_angle", GINT_TO_POINTER(TRUE));
2491
//Persp3D *persp = document->current_persp3d;
2492
std::set<Persp3D *> sel_persps = persp3d_currently_selected_persps (inkscape_active_event_context());
2493
if (sel_persps.empty()) {
2494
// this can happen when the document is created; we silently ignore it
2497
Persp3D *persp = *(sel_persps.begin());
2499
persp->tmat.set_infinite_direction (axis, adj->value);
2500
SP_OBJECT(persp)->updateRepr();
2502
// TODO: use the correct axis here, too
2503
sp_document_maybe_done(document, "perspangle", SP_VERB_CONTEXT_3DBOX, _("3D Box: Change perspective (angle of infinite axis)"));
2505
g_object_set_data( dataKludge, "freeze_angle", GINT_TO_POINTER(FALSE) );
2510
box3d_angle_x_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2512
box3d_angle_value_changed(adj, dataKludge, Proj::X);
2516
box3d_angle_y_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2518
box3d_angle_value_changed(adj, dataKludge, Proj::Y);
2522
box3d_angle_z_value_changed(GtkAdjustment *adj, GObject *dataKludge)
2524
box3d_angle_value_changed(adj, dataKludge, Proj::Z);
2528
static void box3d_vp_state_changed( GtkToggleAction *act, GtkAction *box3d_angle, Proj::Axis axis )
2530
// TODO: Take all selected perspectives into account
2531
std::set<Persp3D *> sel_persps = persp3d_currently_selected_persps (inkscape_active_event_context());
2532
if (sel_persps.empty()) {
2533
// this can happen when the document is created; we silently ignore it
2536
Persp3D *persp = *(sel_persps.begin());
2538
bool set_infinite = gtk_toggle_action_get_active(act);
2539
persp3d_set_VP_state (persp, axis, set_infinite ? Proj::VP_INFINITE : Proj::VP_FINITE);
2542
static void box3d_vp_x_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2544
box3d_vp_state_changed(act, box3d_angle, Proj::X);
2547
static void box3d_vp_y_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2549
box3d_vp_state_changed(act, box3d_angle, Proj::Y);
2552
static void box3d_vp_z_state_changed( GtkToggleAction *act, GtkAction *box3d_angle )
2554
box3d_vp_state_changed(act, box3d_angle, Proj::Z);
2557
static void box3d_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2559
EgeAdjustmentAction* eact = 0;
2560
SPDocument *document = sp_desktop_document (desktop);
2561
Persp3D *persp = document->current_persp3d;
2563
EgeAdjustmentAction* box3d_angle_x = 0;
2564
EgeAdjustmentAction* box3d_angle_y = 0;
2565
EgeAdjustmentAction* box3d_angle_z = 0;
2569
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2570
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2571
eact = create_adjustment_action( "3DBoxAngleXAction",
2572
_("Angle in X direction"), _("Angle X:"),
2573
// Translators: PL is short for 'perspective line'
2574
_("Angle of PLs in X direction"),
2575
"tools.shapes.3dbox", "box3d_angle_x", 30,
2576
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-box3d",
2577
-360.0, 360.0, 1.0, 10.0,
2578
labels, values, G_N_ELEMENTS(labels),
2579
box3d_angle_x_value_changed );
2580
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2581
g_object_set_data( holder, "box3d_angle_x_action", eact );
2582
box3d_angle_x = eact;
2585
if (!persp3d_VP_is_finite(persp, Proj::X)) {
2586
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2588
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2594
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPXStateAction",
2595
// Translators: VP is short for 'vanishing point'
2596
_("State of VP in X direction"),
2597
_("Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"),
2599
Inkscape::ICON_SIZE_DECORATION );
2600
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2601
g_object_set_data( holder, "box3d_vp_x_state_action", act );
2602
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_x_state_changed), box3d_angle_x );
2603
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_x), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_x_state", 1 ) );
2604
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_x_state", 1 ) );
2609
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2610
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2611
eact = create_adjustment_action( "3DBoxAngleYAction",
2612
_("Angle in Y direction"), _("Angle Y:"),
2613
// Translators: PL is short for 'perspective line'
2614
_("Angle of PLs in Y direction"),
2615
"tools.shapes.3dbox", "box3d_angle_y", 30,
2616
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2617
-360.0, 360.0, 1.0, 10.0,
2618
labels, values, G_N_ELEMENTS(labels),
2619
box3d_angle_y_value_changed );
2620
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2621
g_object_set_data( holder, "box3d_angle_y_action", eact );
2622
box3d_angle_y = eact;
2625
if (!persp3d_VP_is_finite(persp, Proj::Y)) {
2626
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2628
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2633
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPYStateAction",
2634
// Translators: VP is short for 'vanishing point'
2635
_("State of VP in Y direction"),
2636
_("Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"),
2638
Inkscape::ICON_SIZE_DECORATION );
2639
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2640
g_object_set_data( holder, "box3d_vp_y_state_action", act );
2641
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_y_state_changed), box3d_angle_y );
2642
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_y), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_y_state", 1 ) );
2643
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_y_state", 1 ) );
2648
gchar const* labels[] = { 0, 0, 0, 0, 0, 0, 0 };
2649
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
2650
eact = create_adjustment_action( "3DBoxAngleZAction",
2651
_("Angle in Z direction"), _("Angle Z:"),
2652
// Translators: PL is short for 'perspective line'
2653
_("Angle of PLs in Z direction"),
2654
"tools.shapes.3dbox", "box3d_angle_z", 30,
2655
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2656
-360.0, 360.0, 1.0, 10.0,
2657
labels, values, G_N_ELEMENTS(labels),
2658
box3d_angle_z_value_changed );
2659
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2660
g_object_set_data( holder, "box3d_angle_z_action", eact );
2661
box3d_angle_z = eact;
2664
if (!persp3d_VP_is_finite(persp, Proj::Z)) {
2665
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2667
gtk_action_set_sensitive( GTK_ACTION(eact), FALSE );
2672
InkToggleAction* act = ink_toggle_action_new( "3DBoxVPZStateAction",
2673
// Translators: VP is short for 'vanishing point'
2674
_("State of VP in Z direction"),
2675
_("Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"),
2677
Inkscape::ICON_SIZE_DECORATION );
2678
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2679
g_object_set_data( holder, "box3d_vp_z_state_action", act );
2680
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(box3d_vp_z_state_changed), box3d_angle_z );
2681
gtk_action_set_sensitive( GTK_ACTION(box3d_angle_z), !prefs_get_int_attribute( "tools.shapes.3dbox", "vp_z_state", 1 ) );
2682
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.shapes.3dbox", "vp_z_state", 1 ) );
2685
sigc::connection *connection = new sigc::connection(
2686
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(box3d_toolbox_selection_changed), (GObject *)holder))
2688
g_signal_connect(holder, "destroy", G_CALLBACK(delete_connection), connection);
2689
g_signal_connect(holder, "destroy", G_CALLBACK(purge_repr_listener), holder);
1690
2692
//########################
1859
2852
// FIXME: implement averaging of all parameters for multiple selected
1860
2853
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
1861
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
2854
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
1867
sp_spiral_toolbox_new(SPDesktop *desktop)
2859
static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
1869
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1870
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1871
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1873
GtkTooltips *tt = gtk_tooltips_new();
1875
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2861
EgeAdjustmentAction* eact = 0;
2864
EgeOutputAction* act = ege_output_action_new( "SpiralStateAction", _("<b>New:</b>"), "", 0 );
2865
ege_output_action_set_use_markup( act, TRUE );
2866
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2867
g_object_set_data( holder, "mode_action", act );
1877
2870
/* Revolution */
1879
GtkWidget *hb = sp_tb_spinbutton(_("Turns:"), _("Number of revolutions"),
2872
gchar const* labels[] = {_("just a curve"), 0, _("one full revolution"), 0, 0, 0, 0, 0, 0};
2873
gdouble values[] = {0.01, 0.5, 1, 2, 3, 5, 10, 20, 50, 100};
2874
eact = create_adjustment_action( "SpiralRevolutionAction",
2875
_("Number of turns"), _("Turns:"), _("Number of revolutions"),
1880
2876
"tools.shapes.spiral", "revolution", 3.0,
1881
NULL, tbl, TRUE, "altx-spiral",
2877
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-spiral",
1882
2878
0.01, 1024.0, 0.1, 1.0,
2879
labels, values, G_N_ELEMENTS(labels),
1883
2880
sp_spl_tb_revolution_value_changed, 1, 2);
1884
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2881
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1887
2884
/* Expansion */
1889
GtkWidget *hb = sp_tb_spinbutton(_("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"),
2886
gchar const* labels[] = {_("circle"), _("edge is much denser"), _("edge is denser"), _("even"), _("center is denser"), _("center is much denser"), 0};
2887
gdouble values[] = {0, 0.1, 0.5, 1, 1.5, 5, 20};
2888
eact = create_adjustment_action( "SpiralExpansionAction",
2889
_("Divergence"), _("Divergence:"), _("How much denser/sparser are outer revolutions; 1 = uniform"),
1890
2890
"tools.shapes.spiral", "expansion", 1.0,
1891
NULL, tbl, FALSE, NULL,
2891
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1892
2892
0.0, 1000.0, 0.01, 1.0,
2893
labels, values, G_N_ELEMENTS(labels),
1893
2894
sp_spl_tb_expansion_value_changed);
1894
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2895
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1899
GtkWidget *hb = sp_tb_spinbutton(_("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"),
2900
gchar const* labels[] = {_("starts from center"), _("starts mid-way"), _("starts near edge")};
2901
gdouble values[] = {0, 0.5, 0.9};
2902
eact = create_adjustment_action( "SpiralT0Action",
2903
_("Inner radius"), _("Inner radius:"), _("Radius of the innermost revolution (relative to the spiral size)"),
1900
2904
"tools.shapes.spiral", "t0", 0.0,
1901
NULL, tbl, FALSE, NULL,
2905
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
1902
2906
0.0, 0.999, 0.01, 1.0,
2907
labels, values, G_N_ELEMENTS(labels),
1903
2908
sp_spl_tb_t0_value_changed);
1904
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2909
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
1907
aux_toolbox_space(tbl, AUX_SPACING);
1911
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
1912
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
1913
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
1915
gtk_container_add(GTK_CONTAINER(hb), b);
1916
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_spl_tb_defaults), tbl);
1917
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2914
InkAction* inky = ink_action_new( "SpiralResetAction",
2916
_("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
2918
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
2919
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_spl_tb_defaults), holder );
2920
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
1920
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1921
swatch->setWatchedTool ("tools.shapes.spiral", true);
1922
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1923
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1925
gtk_widget_show_all(tbl);
1926
sp_set_font_size_smaller (tbl);
1928
2924
sigc::connection *connection = new sigc::connection(
1929
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), (GtkObject *)tbl))
2925
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), (GObject *)holder))
1931
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2927
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
2928
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
1936
2931
//########################
1938
2933
//########################
1942
sp_pen_toolbox_new(SPDesktop *desktop)
1944
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1945
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1946
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1948
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1949
swatch->setWatchedTool ("tools.freehand.pen", true);
1950
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1951
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1953
gtk_widget_show_all(tbl);
1954
sp_set_font_size_smaller (tbl);
1960
sp_pencil_toolbox_new(SPDesktop *desktop)
1962
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
1963
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
1964
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
1966
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
1967
swatch->setWatchedTool ("tools.freehand.pencil", true);
1968
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
1969
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
1971
gtk_widget_show_all(tbl);
1972
sp_set_font_size_smaller (tbl);
2936
static void sp_pen_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
2941
static void sp_pencil_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* /*mainActions*/, GObject* /*holder*/)
2946
//########################
2948
//########################
2950
static void sp_tweak_width_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2952
prefs_set_double_attribute( "tools.tweak", "width", adj->value * 0.01 );
2955
static void sp_tweak_force_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2957
prefs_set_double_attribute( "tools.tweak", "force", adj->value * 0.01 );
2960
static void sp_tweak_pressure_state_changed( GtkToggleAction *act, gpointer /*data*/ )
2962
prefs_set_int_attribute( "tools.tweak", "usepressure", gtk_toggle_action_get_active( act ) ? 1 : 0);
2965
static void sp_tweak_mode_changed( EgeSelectOneAction *act, GObject *tbl )
2967
int mode = ege_select_one_action_get_active( act );
2968
prefs_set_int_attribute("tools.tweak", "mode", mode);
2970
GtkAction *doh = GTK_ACTION(g_object_get_data( tbl, "tweak_doh"));
2971
GtkAction *dos = GTK_ACTION(g_object_get_data( tbl, "tweak_dos"));
2972
GtkAction *dol = GTK_ACTION(g_object_get_data( tbl, "tweak_dol"));
2973
GtkAction *doo = GTK_ACTION(g_object_get_data( tbl, "tweak_doo"));
2974
GtkAction *fid = GTK_ACTION(g_object_get_data( tbl, "tweak_fidelity"));
2975
GtkAction *dolabel = GTK_ACTION(g_object_get_data( tbl, "tweak_channels_label"));
2976
if (mode == TWEAK_MODE_COLORPAINT || mode == TWEAK_MODE_COLORJITTER) {
2977
if (doh) gtk_action_set_sensitive (doh, TRUE);
2978
if (dos) gtk_action_set_sensitive (dos, TRUE);
2979
if (dol) gtk_action_set_sensitive (dol, TRUE);
2980
if (doo) gtk_action_set_sensitive (doo, TRUE);
2981
if (dolabel) gtk_action_set_sensitive (dolabel, TRUE);
2982
if (fid) gtk_action_set_sensitive (fid, FALSE);
2984
if (doh) gtk_action_set_sensitive (doh, FALSE);
2985
if (dos) gtk_action_set_sensitive (dos, FALSE);
2986
if (dol) gtk_action_set_sensitive (dol, FALSE);
2987
if (doo) gtk_action_set_sensitive (doo, FALSE);
2988
if (dolabel) gtk_action_set_sensitive (dolabel, FALSE);
2989
if (fid) gtk_action_set_sensitive (fid, TRUE);
2993
static void sp_tweak_fidelity_value_changed( GtkAdjustment *adj, GObject */*tbl*/ )
2995
prefs_set_double_attribute( "tools.tweak", "fidelity", adj->value * 0.01 );
2998
static void tweak_toggle_doh (GtkToggleAction *act, gpointer /*data*/) {
2999
bool show = gtk_toggle_action_get_active( act );
3000
prefs_set_int_attribute ("tools.tweak", "doh", show ? 1 : 0);
3002
static void tweak_toggle_dos (GtkToggleAction *act, gpointer /*data*/) {
3003
bool show = gtk_toggle_action_get_active( act );
3004
prefs_set_int_attribute ("tools.tweak", "dos", show ? 1 : 0);
3006
static void tweak_toggle_dol (GtkToggleAction *act, gpointer /*data*/) {
3007
bool show = gtk_toggle_action_get_active( act );
3008
prefs_set_int_attribute ("tools.tweak", "dol", show ? 1 : 0);
3010
static void tweak_toggle_doo (GtkToggleAction *act, gpointer /*data*/) {
3011
bool show = gtk_toggle_action_get_active( act );
3012
prefs_set_int_attribute ("tools.tweak", "doo", show ? 1 : 0);
3015
static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
3019
gchar const* labels[] = {_("(pinch tweak)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad tweak)")};
3020
gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
3021
EgeAdjustmentAction *eact = create_adjustment_action( "TweakWidthAction",
3022
_("Width"), _("Width:"), _("The width of the tweak area (relative to the visible canvas area)"),
3023
"tools.tweak", "width", 15,
3024
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-tweak",
3026
labels, values, G_N_ELEMENTS(labels),
3027
sp_tweak_width_value_changed, 0.01, 0, 100 );
3028
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3029
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3035
gchar const* labels[] = {_("(minimum force)"), 0, 0, _("(default)"), 0, 0, 0, _("(maximum force)")};
3036
gdouble values[] = {1, 5, 10, 20, 30, 50, 70, 100};
3037
EgeAdjustmentAction *eact = create_adjustment_action( "TweakForceAction",
3038
_("Force"), _("Force:"), _("The force of the tweak action"),
3039
"tools.tweak", "force", 20,
3040
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-force",
3042
labels, values, G_N_ELEMENTS(labels),
3043
sp_tweak_force_value_changed, 0.01, 0, 100 );
3044
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3045
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3050
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
3053
gtk_list_store_append( model, &iter );
3054
gtk_list_store_set( model, &iter,
3056
1, _("Push parts of paths in any direction"),
3057
2, "tweak_push_mode",
3060
gtk_list_store_append( model, &iter );
3061
gtk_list_store_set( model, &iter,
3062
0, _("Shrink mode"),
3063
1, _("Shrink (inset) parts of paths"),
3064
2, "tweak_shrink_mode",
3067
gtk_list_store_append( model, &iter );
3068
gtk_list_store_set( model, &iter,
3070
1, _("Grow (outset) parts of paths"),
3071
2, "tweak_grow_mode",
3074
gtk_list_store_append( model, &iter );
3075
gtk_list_store_set( model, &iter,
3076
0, _("Attract mode"),
3077
1, _("Attract parts of paths towards cursor"),
3078
2, "tweak_attract_mode",
3081
gtk_list_store_append( model, &iter );
3082
gtk_list_store_set( model, &iter,
3084
1, _("Repel parts of paths from cursor"),
3085
2, "tweak_repel_mode",
3088
gtk_list_store_append( model, &iter );
3089
gtk_list_store_set( model, &iter,
3090
0, _("Roughen mode"),
3091
1, _("Roughen parts of paths"),
3092
2, "tweak_roughen_mode",
3095
gtk_list_store_append( model, &iter );
3096
gtk_list_store_set( model, &iter,
3097
0, _("Color paint mode"),
3098
1, _("Paint the tool's color upon selected objects"),
3099
2, "tweak_colorpaint_mode",
3102
gtk_list_store_append( model, &iter );
3103
gtk_list_store_set( model, &iter,
3104
0, _("Color jitter mode"),
3105
1, _("Jitter the colors of selected objects"),
3106
2, "tweak_colorjitter_mode",
3109
EgeSelectOneAction* act = ege_select_one_action_new( "TweakModeAction", _("Mode"), (""), NULL, GTK_TREE_MODEL(model) );
3110
g_object_set( act, "short_label", _("Mode:"), NULL );
3111
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
3112
g_object_set_data( holder, "mode_action", act );
3114
ege_select_one_action_set_appearance( act, "full" );
3115
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
3116
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
3117
ege_select_one_action_set_icon_column( act, 2 );
3118
ege_select_one_action_set_tooltip_column( act, 1 );
3120
gint mode = prefs_get_int_attribute("tools.tweak", "mode", 0);
3121
ege_select_one_action_set_active( act, mode );
3122
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_tweak_mode_changed), holder );
3124
g_object_set_data( G_OBJECT(holder), "tweak_tool_mode", act);
3127
guint mode = prefs_get_int_attribute("tools.tweak", "mode", 0);
3130
EgeOutputAction* act = ege_output_action_new( "TweakChannelsLabel", _("Channels:"), "", 0 );
3131
ege_output_action_set_use_markup( act, TRUE );
3132
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3133
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3134
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3135
g_object_set_data( holder, "tweak_channels_label", act);
3139
InkToggleAction* act = ink_toggle_action_new( "TweakDoH",
3141
_("In color mode, act on objects' hue"),
3143
Inkscape::ICON_SIZE_DECORATION );
3144
g_object_set( act, "short_label", _("H"), NULL );
3145
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3146
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_doh), desktop );
3147
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "doh", 1 ) );
3148
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3149
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3150
g_object_set_data( holder, "tweak_doh", act);
3153
InkToggleAction* act = ink_toggle_action_new( "TweakDoS",
3155
_("In color mode, act on objects' saturation"),
3157
Inkscape::ICON_SIZE_DECORATION );
3158
g_object_set( act, "short_label", _("S"), NULL );
3159
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3160
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_dos), desktop );
3161
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "dos", 1 ) );
3162
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3163
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3164
g_object_set_data( holder, "tweak_dos", act );
3167
InkToggleAction* act = ink_toggle_action_new( "TweakDoL",
3169
_("In color mode, act on objects' lightness"),
3171
Inkscape::ICON_SIZE_DECORATION );
3172
g_object_set( act, "short_label", _("L"), NULL );
3173
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3174
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_dol), desktop );
3175
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "dol", 1 ) );
3176
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3177
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3178
g_object_set_data( holder, "tweak_dol", act );
3181
InkToggleAction* act = ink_toggle_action_new( "TweakDoO",
3183
_("In color mode, act on objects' opacity"),
3185
Inkscape::ICON_SIZE_DECORATION );
3186
g_object_set( act, "short_label", _("O"), NULL );
3187
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3188
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(tweak_toggle_doo), desktop );
3189
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "doo", 1 ) );
3190
if (mode != TWEAK_MODE_COLORPAINT && mode != TWEAK_MODE_COLORJITTER)
3191
gtk_action_set_sensitive (GTK_ACTION(act), FALSE);
3192
g_object_set_data( holder, "tweak_doo", act );
3196
gchar const* labels[] = {_("(rough, simplified)"), 0, 0, _("(default)"), 0, 0, _("(fine, but many nodes)")};
3197
gdouble values[] = {10, 25, 35, 50, 60, 80, 100};
3198
EgeAdjustmentAction *eact = create_adjustment_action( "TweakFidelityAction",
3199
_("Fidelity"), _("Fidelity:"),
3200
_("Low fidelity simplifies paths; high fidelity preserves path features but may generate a lot of new nodes"),
3201
"tools.tweak", "fidelity", 50,
3202
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-fidelity",
3204
labels, values, G_N_ELEMENTS(labels),
3205
sp_tweak_fidelity_value_changed, 0.01, 0, 100 );
3206
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
3207
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3208
if (mode == TWEAK_MODE_COLORPAINT || mode == TWEAK_MODE_COLORJITTER)
3209
gtk_action_set_sensitive (GTK_ACTION(eact), FALSE);
3210
g_object_set_data( holder, "tweak_fidelity", eact );
3214
/* Use Pressure button */
3216
InkToggleAction* act = ink_toggle_action_new( "TweakPressureAction",
3218
_("Use the pressure of the input device to alter the force of tweak action"),
3220
Inkscape::ICON_SIZE_DECORATION );
3221
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3222
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_tweak_pressure_state_changed), NULL);
3223
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "usepressure", 1 ) );
2059
3307
for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
2060
3308
KeyValue const &kv = key_values[i];
2061
GtkAdjustment* adj = static_cast<GtkAdjustment *>(gtk_object_get_data(GTK_OBJECT(dataKludge), kv.key));
3309
GtkAdjustment* adj = static_cast<GtkAdjustment *>(g_object_get_data(dataKludge, kv.key));
2063
3311
gtk_adjustment_set_value(adj, kv.value);
2067
// spinbutton_defocus(GTK_OBJECT(tbl));
2071
sp_ddc_mass_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2073
prefs_set_double_attribute("tools.calligraphic", "mass", adj->value);
2074
spinbutton_defocus(GTK_OBJECT(tbl));
2078
sp_ddc_wiggle_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2080
prefs_set_double_attribute("tools.calligraphic", "wiggle", adj->value);
2081
spinbutton_defocus(GTK_OBJECT(tbl));
2085
sp_ddc_angle_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2087
prefs_set_double_attribute("tools.calligraphic", "angle", adj->value);
2088
spinbutton_defocus(GTK_OBJECT(tbl));
2092
sp_ddc_width_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2094
prefs_set_double_attribute("tools.calligraphic", "width", adj->value * 0.01);
2095
spinbutton_defocus(GTK_OBJECT(tbl));
2099
sp_ddc_velthin_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2101
prefs_set_double_attribute("tools.calligraphic", "thinning", adj->value);
2102
spinbutton_defocus(GTK_OBJECT(tbl));
2106
sp_ddc_flatness_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2108
prefs_set_double_attribute("tools.calligraphic", "flatness", adj->value);
2109
spinbutton_defocus(GTK_OBJECT(tbl));
2113
sp_ddc_tremor_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2115
prefs_set_double_attribute("tools.calligraphic", "tremor", adj->value);
2116
spinbutton_defocus(GTK_OBJECT(tbl));
2120
sp_ddc_cap_rounding_value_changed(GtkAdjustment *adj, GtkWidget *tbl)
2122
prefs_set_double_attribute("tools.calligraphic", "cap_rounding", adj->value);
2123
spinbutton_defocus(GTK_OBJECT(tbl));
2127
sp_ddc_pressure_state_changed(GtkWidget *button, gpointer data)
2129
prefs_set_int_attribute ("tools.calligraphic", "usepressure", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? 1 : 0);
2133
sp_ddc_tilt_state_changed(GtkWidget *button, GtkWidget *calligraphy_angle)
2135
prefs_set_int_attribute ("tools.calligraphic", "usetilt", gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? 1 : 0);
2137
gtk_widget_set_sensitive(GTK_WIDGET(calligraphy_angle), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
2140
static void sp_ddc_defaults(GtkWidget *, GtkWidget *tbl)
2142
// FIXME: make defaults settable via Inkscape Options
2146
} const key_values[] = {
2154
{"cap_rounding", 0.0}
2157
for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
2158
KeyValue const &kv = key_values[i];
2159
GtkAdjustment &adj = *static_cast<GtkAdjustment *>(gtk_object_get_data(GTK_OBJECT(tbl), kv.key));
2160
gtk_adjustment_set_value(&adj, kv.value);
2163
spinbutton_defocus(GTK_OBJECT(tbl));
2170
sp_calligraphy_toolbox_new(SPDesktop *desktop)
2172
if ( prefs_get_int_attribute_limited( "options.stocktoolbars", "value", 1, 0, 1 ) ) {
2173
GtkWidget *toolBar = 0;
2174
GtkWidget* holder = gtk_table_new( 1, 2, FALSE );
2176
gchar const * descr =
2178
" <toolbar name='CalligraphyToolbar'>"
2180
" <toolitem name='Width' action='WidthAction' />"
2181
" <toolitem name='Thinning' action='ThinningAction' />"
2183
" <toolitem name='Angle' action='AngleAction' />"
2184
" <toolitem action='FixationAction' />"
2185
" <toolitem action='CapRoundingAction' />"
2187
" <toolitem action='TremorAction' />"
2188
" <toolitem action='WiggleAction' />"
2189
" <toolitem action='MassAction' />"
2191
" <toolitem action='PressureAction' />"
2192
" <toolitem action='TiltAction' />"
2193
" <toolitem action='ResetAction' />"
2196
GtkUIManager* mgr = gtk_ui_manager_new();
2198
GtkActionGroup* mainActions = gtk_action_group_new("main");
3317
static void sp_calligraphy_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2201
3320
EgeAdjustmentAction* calligraphy_angle = 0;
2202
EgeAdjustmentAction* eact = 0;
2205
eact = create_adjustment_action( "WidthAction",
2206
_("Width:"), _("The width of the calligraphic pen (relative to the visible canvas area)"),
2207
"tools.calligraphic", "width", 15,
2208
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-calligraphy",
2210
sp_ddc_width_value_changed2, 0.01, 0, 100 );
3324
gchar const* labels[] = {_("(hairline)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad stroke)")};
3325
gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
3326
EgeAdjustmentAction *eact = create_adjustment_action( "CalligraphyWidthAction",
3327
_("Pen Width"), _("Width:"),
3328
_("The width of the calligraphic pen (relative to the visible canvas area)"),
3329
"tools.calligraphic", "width", 15,
3330
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-calligraphy",
3332
labels, values, G_N_ELEMENTS(labels),
3333
sp_ddc_width_value_changed, 0.01, 0, 100 );
2211
3334
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2212
3335
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2215
eact = create_adjustment_action( "ThinningAction",
2216
_("Thinning:"), _("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"),
2217
"tools.calligraphic", "thinning", 0.1,
2218
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2219
-1.0, 1.0, 0.01, 0.1,
2220
sp_ddc_velthin_value_changed2, 0.01, 2);
3340
gchar const* labels[] = {_("(speed blows up stroke)"), 0, 0, _("(slight widening)"), _("(constant width)"), _("(slight thinning, default)"), 0, 0, _("(speed deflates stroke)")};
3341
gdouble values[] = {-1, -0.4, -0.2, -0.1, 0, 0.1, 0.2, 0.4, 1};
3342
EgeAdjustmentAction* eact = create_adjustment_action( "ThinningAction",
3343
_("Stroke Thinning"), _("Thinning:"),
3344
_("How much velocity thins the stroke (> 0 makes fast strokes thinner, < 0 makes them broader, 0 makes width independent of velocity)"),
3345
"tools.calligraphic", "thinning", 0.1,
3346
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3347
-1.0, 1.0, 0.01, 0.1,
3348
labels, values, G_N_ELEMENTS(labels),
3349
sp_ddc_velthin_value_changed, 0.01, 2);
2221
3350
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2222
3351
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2225
eact = create_adjustment_action( "AngleAction",
2226
_("Angle:"), _("The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)"),
2227
"tools.calligraphic", "angle", 30,
2228
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "calligraphy-angle",
2229
-90.0, 90.0, 1.0, 10.0,
2230
sp_ddc_angle_value_changed2, 1, 0 );
3356
gchar const* labels[] = {_("(left edge up)"), 0, 0, _("(horizontal)"), _("(default)"), 0, _("(right edge up)")};
3357
gdouble values[] = {-90, -60, -30, 0, 30, 60, 90};
3358
EgeAdjustmentAction* eact = create_adjustment_action( "AngleAction",
3359
_("Pen Angle"), _("Angle:"),
3360
_("The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)"),
3361
"tools.calligraphic", "angle", 30,
3362
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "calligraphy-angle",
3363
-90.0, 90.0, 1.0, 10.0,
3364
labels, values, G_N_ELEMENTS(labels),
3365
sp_ddc_angle_value_changed, 1, 0 );
2231
3366
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2232
3367
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2233
3368
calligraphy_angle = eact;
2236
eact = create_adjustment_action( "FixationAction",
2237
_("Fixation:"), _("Angle behavior (0 = nib always perpendicular to stroke direction, 1 = fixed angle)"),
2238
"tools.calligraphic", "flatness", 0.9,
2239
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2240
0.0, 1.0, 0.01, 0.1,
2241
sp_ddc_flatness_value_changed2, 0.01, 2 );
3373
gchar const* labels[] = {_("(perpendicular to stroke, \"brush\")"), 0, 0, 0, _("(almost fixed, default)"), _("(fixed by Angle, \"pen\")")};
3374
gdouble values[] = {0, 0.2, 0.4, 0.6, 0.9, 1.0};
3375
EgeAdjustmentAction* eact = create_adjustment_action( "FixationAction",
3376
_("Fixation"), _("Fixation:"),
3377
_("Angle behavior (0 = nib always perpendicular to stroke direction, 1 = fixed angle)"),
3378
"tools.calligraphic", "flatness", 0.9,
3379
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3380
0.0, 1.0, 0.01, 0.1,
3381
labels, values, G_N_ELEMENTS(labels),
3382
sp_ddc_flatness_value_changed, 0.01, 2 );
2242
3383
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2243
3384
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2245
3388
/* Cap Rounding */
3389
gchar const* labels[] = {_("(blunt caps, default)"), _("(slightly bulging)"), 0, 0, _("(approximately round)"), _("(long protruding caps)")};
3390
gdouble values[] = {0, 0.3, 0.5, 1.0, 1.4, 5.0};
2246
3391
// TRANSLATORS: "cap" means "end" (both start and finish) here
2247
eact = create_adjustment_action( "CapRoundingAction",
2248
_("Caps:"), _("Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)"),
2249
"tools.calligraphic", "cap_rounding", 0.0,
2250
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2251
0.0, 5.0, 0.01, 0.1,
2252
sp_ddc_cap_rounding_value_changed2, 0.01, 2 );
3392
EgeAdjustmentAction* eact = create_adjustment_action( "CapRoundingAction",
3393
_("Cap rounding"), _("Caps:"),
3394
_("Increase to make caps at the ends of strokes protrude more (0 = no caps, 1 = round caps)"),
3395
"tools.calligraphic", "cap_rounding", 0.0,
3396
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3397
0.0, 5.0, 0.01, 0.1,
3398
labels, values, G_N_ELEMENTS(labels),
3399
sp_ddc_cap_rounding_value_changed, 0.01, 2 );
2253
3400
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2254
3401
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2257
eact = create_adjustment_action( "TremorAction",
2258
_("Tremor:"), _("Increase to make strokes rugged and trembling"),
2259
"tools.calligraphic", "tremor", 0.0,
2260
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2261
0.0, 1.0, 0.01, 0.1,
2262
sp_ddc_tremor_value_changed2, 0.01, 2 );
3406
gchar const* labels[] = {_("(smooth line)"), _("(slight tremor)"), _("(noticeable tremor)"), 0, 0, _("(maximum tremor)")};
3407
gdouble values[] = {0, 0.1, 0.2, 0.4, 0.6, 1.0};
3408
EgeAdjustmentAction* eact = create_adjustment_action( "TremorAction",
3409
_("Stroke Tremor"), _("Tremor:"),
3410
_("Increase to make strokes rugged and trembling"),
3411
"tools.calligraphic", "tremor", 0.0,
3412
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3413
0.0, 1.0, 0.01, 0.1,
3414
labels, values, G_N_ELEMENTS(labels),
3415
sp_ddc_tremor_value_changed, 0.01, 2 );
2264
3417
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2265
3418
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2268
eact = create_adjustment_action( "WiggleAction",
2269
_("Wiggle:"), _("Increase to make the pen waver and wiggle"),
2270
"tools.calligraphic", "wiggle", 0.0,
2271
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2272
0.0, 1.0, 0.01, 0.1,
2273
sp_ddc_wiggle_value_changed2, 0.01, 2 );
3423
gchar const* labels[] = {_("(no wiggle)"), _("(slight deviation)"), 0, 0, _("(wild waves and curls)")};
3424
gdouble values[] = {0, 0.2, 0.4, 0.6, 1.0};
3425
EgeAdjustmentAction* eact = create_adjustment_action( "WiggleAction",
3426
_("Pen Wiggle"), _("Wiggle:"),
3427
_("Increase to make the pen waver and wiggle"),
3428
"tools.calligraphic", "wiggle", 0.0,
3429
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3430
0.0, 1.0, 0.01, 0.1,
3431
labels, values, G_N_ELEMENTS(labels),
3432
sp_ddc_wiggle_value_changed, 0.01, 2 );
2274
3433
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2275
3434
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
2278
eact = create_adjustment_action( "MassAction",
2279
_("Mass:"), _("Increase to make the pen drag behind, as if slowed by inertia"),
2280
"tools.calligraphic", "mass", 0.02,
2281
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
2282
0.0, 1.0, 0.01, 0.1,
2283
sp_ddc_mass_value_changed2, 0.01, 2 );
3439
gchar const* labels[] = {_("(no inertia)"), _("(slight smoothing, default)"), _("(noticeable lagging)"), 0, 0, _("(maximum inertia)")};
3440
gdouble values[] = {0.0, 0.02, 0.1, 0.2, 0.5, 1.0};
3441
EgeAdjustmentAction* eact = create_adjustment_action( "MassAction",
3442
_("Pen Mass"), _("Mass:"),
3443
_("Increase to make the pen drag behind, as if slowed by inertia"),
3444
"tools.calligraphic", "mass", 0.02,
3445
GTK_WIDGET(desktop->canvas), NULL, holder, FALSE, NULL,
3446
0.0, 1.0, 0.01, 0.1,
3447
labels, values, G_N_ELEMENTS(labels),
3448
sp_ddc_mass_value_changed, 0.01, 2 );
2284
3449
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2285
3450
gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
3454
/* Trace Background button */
3456
InkToggleAction* act = ink_toggle_action_new( "TraceAction",
3457
_("Trace Background"),
3458
_("Trace the lightness of the background by the width of the pen (white - minimum width, black - maximum width)"),
3460
Inkscape::ICON_SIZE_DECORATION );
3461
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3462
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_trace_background_changed), NULL);
3463
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.calligraphic", "tracebackground", 0 ) );
2288
3466
/* Use Pressure button */
2306
3484
Inkscape::ICON_SIZE_DECORATION );
2307
3485
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
2308
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_tilt_state_changed2), calligraphy_angle );
3486
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_ddc_tilt_state_changed), calligraphy_angle );
2309
3487
gtk_action_set_sensitive( GTK_ACTION(calligraphy_angle), !prefs_get_int_attribute( "tools.calligraphic", "usetilt", 1 ) );
2310
3488
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.calligraphic", "usetilt", 1 ) );
2315
GtkAction* act = gtk_action_new( "ResetAction",
3493
GtkAction* act = gtk_action_new( "CalligraphyResetAction",
2317
_("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
3495
_("Reset all parameters to defaults"),
2318
3496
GTK_STOCK_CLEAR );
2319
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_ddc_defaults2), holder );
3497
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_ddc_defaults), holder );
2320
3498
gtk_action_group_add_action( mainActions, act );
2321
3499
gtk_action_set_sensitive( act, TRUE );
2326
gtk_ui_manager_insert_action_group( mgr, mainActions, 0 );
2327
gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal );
2329
toolBar = gtk_ui_manager_get_widget( mgr, "/ui/CalligraphyToolbar" );
2330
gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
2331
gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), GTK_ICON_SIZE_SMALL_TOOLBAR );
2334
gtk_table_attach( GTK_TABLE(holder), toolBar, 0, 1, 0, 1, (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), 0, 0 );
2336
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
2337
swatch->setWatchedTool ("tools.calligraphic", true);
2338
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
2339
gtk_table_attach( GTK_TABLE(holder), swatch_, 1, 2, 0, 1, (GtkAttachOptions)(GTK_SHRINK | GTK_FILL), (GtkAttachOptions)(GTK_EXPAND | GTK_FILL), AUX_BETWEEN_BUTTON_GROUPS, 0 );
2341
gtk_widget_show_all(holder);
2342
//sp_set_font_size_smaller (tbl);
2346
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2347
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2348
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2350
GtkTooltips *tt = gtk_tooltips_new();
2351
GtkWidget *calligraphy_angle;
2354
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2358
GtkWidget *hb = sp_tb_spinbutton(_("Width:"), _("The width of the calligraphic pen (relative to the visible canvas area)"),
2359
"tools.calligraphic", "width", 15,
2360
NULL, tbl, TRUE, "altx-calligraphy",
2362
sp_ddc_width_value_changed, 0.01, 0, 100);
2363
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2368
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)"),
2369
"tools.calligraphic", "thinning", 0.1,
2370
NULL, tbl, FALSE, NULL,
2371
-1.0, 1.0, 0.01, 0.1,
2372
sp_ddc_velthin_value_changed, 0.01, 2);
2373
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2377
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2381
calligraphy_angle = sp_tb_spinbutton(_("Angle:"), _("The angle of the pen's nib (in degrees; 0 = horizontal; has no effect if fixation = 0)"),
2382
"tools.calligraphic", "angle", 30,
2383
NULL, tbl, TRUE, "calligraphy-angle",
2384
-90.0, 90.0, 1.0, 10.0,
2385
sp_ddc_angle_value_changed, 1, 0);
2386
gtk_box_pack_start(GTK_BOX(tbl), calligraphy_angle, FALSE, FALSE, AUX_SPACING);
2391
GtkWidget *hb = sp_tb_spinbutton(_("Fixation:"), _("Angle behavior (0 = nib always perpendicular to stroke direction, 1 = fixed angle)"),
2392
"tools.calligraphic", "flatness", 0.9,
2393
NULL, tbl, FALSE, NULL,
2394
0.0, 1.0, 0.01, 0.1,
2395
sp_ddc_flatness_value_changed, 0.01, 2);
2396
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2401
// TRANSLATORS: "cap" means "end" (both start and finish) here
2402
GtkWidget *hb = sp_tb_spinbutton(_("Round:"), _("Increase to round the ends of strokes"),
2403
"tools.calligraphic", "cap_rounding", 0.0,
2404
NULL, tbl, FALSE, NULL,
2405
0.0, 1.0, 0.01, 0.1,
2406
sp_ddc_cap_rounding_value_changed, 0.01, 2);
2407
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2411
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2415
GtkWidget *hb = sp_tb_spinbutton(_("Tremor:"), _("Increase to make strokes rugged and trembling"),
2416
"tools.calligraphic", "tremor", 0.0,
2417
NULL, tbl, FALSE, NULL,
2418
0.0, 1.0, 0.01, 0.1,
2419
sp_ddc_tremor_value_changed, 0.01, 2);
2420
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2425
GtkWidget *hb = sp_tb_spinbutton(_("Wiggle:"), _("Increase to make the pen waver and wiggle"),
2426
"tools.calligraphic", "wiggle", 0.0,
2427
NULL, tbl, FALSE, NULL,
2428
0.0, 1.0, 0.01, 0.1,
2429
sp_ddc_wiggle_value_changed, 0.01, 2);
2430
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2436
GtkWidget *hb = sp_tb_spinbutton(_("Mass:"), _("Increase to make the pen drag behind, as if slowed by inertia"),
2437
"tools.calligraphic", "mass", 0.02,
2438
NULL, tbl, FALSE, NULL,
2439
0.0, 1.0, 0.01, 0.1,
2440
sp_ddc_mass_value_changed, 0.01, 2);
2441
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_SPACING);
2445
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2447
GtkWidget *cvbox = gtk_vbox_new (FALSE, 0);
2448
GtkWidget *cbox = gtk_hbox_new (FALSE, 0);
2450
/* Use Pressure button */
2452
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
2453
SP_BUTTON_TYPE_TOGGLE,
2456
_("Use the pressure of the input device to alter the width of the pen"),
2458
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (sp_ddc_pressure_state_changed), NULL);
2459
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.calligraphic", "usepressure", 1));
2460
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
2463
/* Use Tilt button */
2465
GtkWidget *button = sp_button_new_from_data( Inkscape::ICON_SIZE_DECORATION,
2466
SP_BUTTON_TYPE_TOGGLE,
2469
_("Use the tilt of the input device to alter the angle of the pen's nib"),
2471
g_signal_connect_after (G_OBJECT (button), "clicked", G_CALLBACK (sp_ddc_tilt_state_changed), calligraphy_angle);
2472
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button), prefs_get_int_attribute ("tools.calligraphic", "usetilt", 1));
2473
gtk_widget_set_sensitive(GTK_WIDGET(calligraphy_angle), !gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(button)));
2474
gtk_box_pack_start(GTK_BOX(cbox), button, FALSE, FALSE, 0);
2477
gtk_box_pack_start(GTK_BOX(cvbox), cbox, TRUE, FALSE, 0);
2478
gtk_box_pack_start(GTK_BOX(tbl), cvbox, FALSE, FALSE, 0);
2482
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2483
GtkWidget *b = gtk_button_new_with_label(_("Defaults"));
2484
gtk_tooltips_set_tip(tt, b, _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"), NULL);
2486
gtk_container_add(GTK_CONTAINER(hb), b);
2487
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_ddc_defaults), tbl);
2488
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
2492
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
2493
swatch->setWatchedTool ("tools.calligraphic", true);
2494
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
2495
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
2497
gtk_widget_show_all(tbl);
2498
sp_set_font_size_smaller (tbl);
2764
3743
// FIXME: implement averaging of all parameters for multiple selected
2765
3744
//gtk_label_set_markup(GTK_LABEL(l), _("<b>Average:</b>"));
2766
gtk_label_set_markup(GTK_LABEL(l), _("<b>Change:</b>"));
2767
sp_arctb_sensitivize (GTK_WIDGET(tbl), 1, 0);
3745
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
3746
sp_arctb_sensitivize( tbl, 1, 0 );
2773
sp_arc_toolbox_new(SPDesktop *desktop)
3751
static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
2775
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2777
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2778
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2780
GtkTooltips *tt = gtk_tooltips_new();
2782
sp_toolbox_add_label(tbl, _("<b>New:</b>"));
3753
EgeAdjustmentAction* eact = 0;
3757
EgeOutputAction* act = ege_output_action_new( "ArcStateAction", _("<b>New:</b>"), "", 0 );
3758
ege_output_action_set_use_markup( act, TRUE );
3759
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3760
g_object_set_data( holder, "mode_action", act );
2786
GtkWidget *hb = sp_tb_spinbutton(_("Start:"), _("The angle (in degrees) from the horizontal to the arc's start point"),
3765
eact = create_adjustment_action( "ArcStartAction",
3766
_("Start"), _("Start:"),
3767
_("The angle (in degrees) from the horizontal to the arc's start point"),
2787
3768
"tools.shapes.arc", "start", 0.0,
2788
NULL, tbl, TRUE, "altx-arc",
3769
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE, "altx-arc",
2789
3770
-360.0, 360.0, 1.0, 10.0,
2790
3772
sp_arctb_start_value_changed);
2791
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3773
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2796
GtkWidget *hb = sp_tb_spinbutton(_("End:"), _("The angle (in degrees) from the horizontal to the arc's end point"),
3778
eact = create_adjustment_action( "ArcEndAction",
3779
_("End"), _("End:"),
3780
_("The angle (in degrees) from the horizontal to the arc's end point"),
2797
3781
"tools.shapes.arc", "end", 0.0,
2798
NULL, tbl, FALSE, NULL,
3782
GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, FALSE, NULL,
2799
3783
-360.0, 360.0, 1.0, 10.0,
2800
3785
sp_arctb_end_value_changed);
2801
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3786
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
2804
3789
/* Segments / Pie checkbox */
2806
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2807
GtkWidget *fscb = gtk_check_button_new_with_label(_("Open arc"));
2808
gtk_tooltips_set_tip(tt, fscb, _("Switch between arc (unclosed shape) and segment (closed shape with two radii)"), NULL);
2810
gchar const *openstr = NULL;
2811
openstr = prefs_get_string_attribute("tools.shapes.arc", "open");
2812
if (!openstr || (openstr && !strcmp(openstr, "false")))
2813
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), FALSE);
2815
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(fscb), TRUE);
2817
gtk_widget_show(fscb);
2818
gtk_object_set_data(GTK_OBJECT(tbl), "open_checkbox", fscb);
2819
gtk_container_add(GTK_CONTAINER(hb), fscb);
2820
g_signal_connect(G_OBJECT(fscb), "toggled", GTK_SIGNAL_FUNC(sp_arctb_open_state_changed ), tbl);
2821
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3791
GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
3794
gtk_list_store_append( model, &iter );
3795
gtk_list_store_set( model, &iter,
3797
1, _("Switch to segment (closed shape with two radii)"),
3798
2, "circle_closed_arc",
3801
gtk_list_store_append( model, &iter );
3802
gtk_list_store_set( model, &iter,
3804
1, _("Switch to arc (unclosed shape)"),
3805
2, "circle_open_arc",
3808
EgeSelectOneAction* act = ege_select_one_action_new( "ArcOpenAction", (""), (""), NULL, GTK_TREE_MODEL(model) );
3809
gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
3810
g_object_set_data( holder, "open_action", act );
3812
ege_select_one_action_set_appearance( act, "full" );
3813
ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
3814
g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
3815
ege_select_one_action_set_icon_column( act, 2 );
3816
ege_select_one_action_set_tooltip_column( act, 1 );
3818
gchar const *openstr = prefs_get_string_attribute("tools.shapes.arc", "open");
3819
bool isClosed = (!openstr || (openstr && !strcmp(openstr, "false")));
3820
ege_select_one_action_set_active( act, isClosed ? 0 : 1 );
3821
g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_arctb_open_state_changed), holder );
2824
3824
/* Make Whole */
2826
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2827
GtkWidget *b = gtk_button_new_with_label(_("Make whole"));
2828
gtk_object_set_data(GTK_OBJECT(tbl), "make_whole", b);
2829
gtk_tooltips_set_tip(tt, b, _("Make the shape a whole ellipse, not arc or segment"), NULL);
2831
gtk_container_add(GTK_CONTAINER(hb), b);
2832
gtk_signal_connect(GTK_OBJECT(b), "clicked", GTK_SIGNAL_FUNC(sp_arctb_defaults), tbl);
2833
gtk_box_pack_start(GTK_BOX(tbl),hb, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
3826
InkAction* inky = ink_action_new( "ArcResetAction",
3828
_("Make the shape a whole ellipse, not arc or segment"),
3830
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
3831
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_arctb_defaults), holder );
3832
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
3833
gtk_action_set_sensitive( GTK_ACTION(inky), TRUE );
3834
g_object_set_data( holder, "make_whole", inky );
2836
g_object_set_data(G_OBJECT(tbl), "single", GINT_TO_POINTER(TRUE));
3837
g_object_set_data( G_OBJECT(holder), "single", GINT_TO_POINTER(TRUE) );
2837
3838
// sensitivize make whole and open checkbox
2839
GtkAdjustment *adj1 = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "start"));
2840
GtkAdjustment *adj2 = GTK_ADJUSTMENT(gtk_object_get_data(GTK_OBJECT(tbl), "end"));
2841
sp_arctb_sensitivize (tbl, adj1->value, adj2->value);
3840
GtkAdjustment *adj1 = GTK_ADJUSTMENT( g_object_get_data( holder, "start" ) );
3841
GtkAdjustment *adj2 = GTK_ADJUSTMENT( g_object_get_data( holder, "end" ) );
3842
sp_arctb_sensitivize( holder, adj1->value, adj2->value );
2844
3846
sigc::connection *connection = new sigc::connection(
2845
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), (GtkObject *)tbl))
3847
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), (GObject *)holder))
2847
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection), connection);
2849
Inkscape::UI::Widget::StyleSwatch *swatch = new Inkscape::UI::Widget::StyleSwatch(NULL);
2850
swatch->setWatchedTool ("tools.shapes.arc", true);
2851
GtkWidget *swatch_ = GTK_WIDGET(swatch->gobj());
2852
gtk_box_pack_end(GTK_BOX(tbl), swatch_, FALSE, FALSE, 0);
2854
gtk_widget_show_all(tbl);
2855
sp_set_font_size_smaller (tbl);
3849
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
3850
g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
2969
3886
* TODO: Add queue of last 5 or so colors selected with new swatches so that
2970
3887
* can drag and drop places. Will provide a nice mixing palette.
2973
sp_dropper_toolbox_new(SPDesktop *desktop)
3889
static void sp_dropper_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* mainActions, GObject* holder)
2975
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
2977
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
2978
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
2980
GtkTooltips *tt = gtk_tooltips_new();
2983
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
2984
AUX_BETWEEN_BUTTON_GROUPS);
2985
// sp_toolbox_add_label(tbl, _("<b>New:</b>"));
2989
/* RGB Input Field */
2991
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
2992
GtkWidget *dropper_rgba_label = gtk_label_new ("Color:");
2993
gtk_widget_show (dropper_rgba_label);
2994
gtk_container_add(GTK_CONTAINER(hb), dropper_rgba_label);
2996
dropper_rgb_entry = gtk_entry_new ();
2997
sp_dialog_defocus_on_enter (dropper_rgb_entry);
2998
gtk_entry_set_max_length (GTK_ENTRY (dropper_rgb_entry), 7);
2999
gtk_entry_set_width_chars (GTK_ENTRY (dropper_rgb_entry), 7);
3000
gtk_tooltips_set_tip(tt, dropper_rgb_entry,
3001
_("Hexidecimal representation of last selected "
3004
gtk_widget_show (dropper_rgb_entry);
3005
gtk_container_add(GTK_CONTAINER(hb), dropper_rgb_entry);
3007
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3008
AUX_BETWEEN_BUTTON_GROUPS);
3011
/* Opacity Input Field */
3013
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3014
GtkWidget *dropper_opacity_label = gtk_label_new ( _("Opacity:") );
3015
gtk_widget_show (dropper_opacity_label);
3016
gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_label);
3018
dropper_opacity_entry = gtk_entry_new ();
3019
sp_dialog_defocus_on_enter (dropper_opacity_entry);
3020
gtk_entry_set_max_length (GTK_ENTRY (dropper_opacity_entry), 11);
3021
gtk_entry_set_width_chars (GTK_ENTRY (dropper_opacity_entry), 11);
3022
gtk_tooltips_set_tip(tt, dropper_opacity_entry,
3023
_("Opacity of last selected color"),
3025
gtk_widget_show (dropper_opacity_entry);
3026
gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_entry);
3028
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3029
AUX_BETWEEN_BUTTON_GROUPS);
3033
/* Copy to Clipboard */
3035
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3036
GtkWidget *b = gtk_button_new_with_label(_("Copy as RGBA"));
3037
gtk_tooltips_set_tip(tt, b, _("Copy last saved color as hexidecimal "
3038
"RGB + Alpha (RGBA) to "
3042
gtk_container_add(GTK_CONTAINER(hb), b);
3043
gtk_signal_connect(GTK_OBJECT(b), "clicked",
3044
GTK_SIGNAL_FUNC(sp_dropper_copy), tbl);
3045
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3046
AUX_BETWEEN_BUTTON_GROUPS);
3050
/* Copy to Clipboard as HEX */
3052
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3053
GtkWidget *b = gtk_button_new_with_label(_("Copy as HEX"));
3054
gtk_tooltips_set_tip(tt, b, _("Copy last saved color as "
3055
"hexidecimal RGB without alpha "
3056
"to clipboard"), NULL);
3058
gtk_container_add(GTK_CONTAINER(hb), b);
3059
gtk_signal_connect(GTK_OBJECT(b), "clicked",
3060
GTK_SIGNAL_FUNC(sp_dropper_copy_as_hex), tbl);
3061
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3062
AUX_BETWEEN_BUTTON_GROUPS);
3065
// aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
3891
gint pickAlpha = prefs_get_int_attribute( "tools.dropper", "pick", 1 );
3068
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3070
GtkWidget *button = gtk_check_button_new_with_label(_("Pick alpha"));
3071
gtk_tooltips_set_tip(tt, button, _("Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha"), NULL);
3072
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
3073
prefs_get_int_attribute ("tools.dropper",
3075
gtk_widget_show(button);
3076
gtk_container_add (GTK_CONTAINER (hb), button);
3077
gtk_object_set_data(GTK_OBJECT(tbl), "pick_checkbox", button);
3078
g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_pick_alpha), tbl);
3079
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3080
AUX_BETWEEN_BUTTON_GROUPS);
3894
InkToggleAction* act = ink_toggle_action_new( "DropperPickAlphaAction",
3896
_("Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha"),
3898
Inkscape::ICON_SIZE_DECORATION );
3899
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3900
g_object_set_data( holder, "pick_action", act );
3901
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), pickAlpha );
3902
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_pick_alpha), holder );
3084
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
3086
GtkWidget *button = gtk_check_button_new_with_label(_("Set alpha"));
3087
gtk_tooltips_set_tip(tt, button, _("If alpha was picked, assign it to selection as fill or stroke transparency"), NULL);
3088
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
3089
prefs_get_int_attribute ("tools.dropper",
3091
gtk_widget_show(button);
3092
gtk_container_add (GTK_CONTAINER (hb), button);
3093
gtk_object_set_data(GTK_OBJECT(tbl), "set_checkbox", button);
3094
g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_set_alpha), tbl);
3906
InkToggleAction* act = ink_toggle_action_new( "DropperSetAlphaAction",
3908
_("If alpha was picked, assign it to selection as fill or stroke transparency"),
3910
Inkscape::ICON_SIZE_DECORATION );
3911
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
3912
g_object_set_data( holder, "set_action", act );
3913
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.dropper", "setalpha", 1 ) );
3096
3914
// make sure it's disabled if we're not picking alpha
3097
GtkWidget *pick_checkbox = (GtkWidget*) g_object_get_data(G_OBJECT(tbl), "pick_checkbox");
3098
if (pick_checkbox) {
3099
if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pick_checkbox))) {
3100
gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
3102
gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
3106
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
3107
AUX_BETWEEN_BUTTON_GROUPS);
3915
gtk_action_set_sensitive( GTK_ACTION(act), pickAlpha );
3916
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_set_alpha), holder );
3110
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
3113
// where new gtkmm stuff should go
3115
gtk_widget_show_all(tbl);
3116
sp_set_font_size_smaller (tbl);
3119
sigc::connection *connection = new sigc::connection(
3120
desktop->connectSetStyle(
3121
sigc::bind(sigc::ptr_fun(sp_style_changed),
3124
g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection),
3998
4921
Inkscape::ConnectionPool::connect_destroy (G_OBJECT (tbl), pool);
4004
GtkWidget *px= sp_icon_new(Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_WRITING_MODE_LR);
4005
GtkWidget *b = group = gtk_radio_button_new (NULL);
4006
gtk_container_add (GTK_CONTAINER (b), px);
4007
gtk_tooltips_set_tip (tt, b, _("Horizontal text"), NULL);
4008
gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE);
4009
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE );
4010
gtk_box_pack_start (GTK_BOX (tbl), b, FALSE, FALSE, 0);
4015
GtkWidget *px = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_WRITING_MODE_TB);
4016
GtkWidget *b = gtk_radio_button_new (gtk_radio_button_group (GTK_RADIO_BUTTON (group)));
4017
gtk_container_add (GTK_CONTAINER (b), px);
4018
gtk_tooltips_set_tip (tt, b, _("Vertical text"), NULL);
4019
gtk_button_set_relief (GTK_BUTTON (b), GTK_RELIEF_NONE);
4020
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (b), FALSE );
4021
gtk_box_pack_start (GTK_BOX (tbl), b, FALSE, FALSE, 0);
4024
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
4029
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_LETTER_SPACING);
4030
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
4031
gtk_container_add (GTK_CONTAINER (hb), image);
4032
gtk_widget_show(image);
4033
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
4037
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Spacing between letters"),
4038
"tools.text", "letter_spacing", 0.0,
4039
us, tbl, FALSE, NULL,
4040
-1000.0, 1000.0, 0.1, 0.1,
4041
sp_text_letter_changed, 0.1, 1);
4042
gtk_widget_set_size_request (hb, 45, 6);
4043
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
4050
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_LINE_SPACING);
4051
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
4052
gtk_container_add (GTK_CONTAINER (hb), image);
4053
gtk_widget_show(image);
4054
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
4058
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Spacing between lines"),
4059
"tools.text", "line_spacing", 0,
4060
us, tbl, FALSE, NULL,
4061
-1000.0, 1000.0, 0.1, 0.1,
4062
sp_text_line_changed, 0.1, 1);
4063
gtk_widget_set_size_request (hb, 45, 0);
4064
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 3);
4069
// horizontal kerning/vertical kerning units menu: create
4070
GtkWidget *us = sp_unit_selector_new(SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE);
4071
sp_unit_selector_setsize(us, AUX_OPTION_MENU_WIDTH, AUX_OPTION_MENU_HEIGHT);
4072
sp_unit_selector_set_unit(SP_UNIT_SELECTOR(us), desktop->namedview->doc_units);
4074
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
4076
// horizontal kerning
4079
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_HORZ_KERN);
4080
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
4081
gtk_container_add (GTK_CONTAINER (hb), image);
4082
gtk_widget_show(image);
4083
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
4087
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Horizontal kerning"),
4088
"tools.text", "horizontal_kerning", 0,
4089
us, tbl, FALSE, NULL,
4090
-100.00, 100.00, 0.01, 0.1,
4091
sp_text_horiz_kern_changed);
4092
gtk_widget_set_size_request (hb, 45, 0);
4093
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
4100
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_VERT_KERN);
4101
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
4102
gtk_container_add (GTK_CONTAINER (hb), image);
4103
gtk_widget_show(image);
4104
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
4108
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Vertical kerning"),
4109
"tools.text", "vertical_kerning", 0,
4110
us, tbl, FALSE, NULL,
4111
-100.00, 100.00, 0.01, 0.1,
4112
sp_text_vert_kern_changed);
4113
gtk_widget_set_size_request (hb, 45, 0);
4114
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 5);
4118
// add the units menu
4119
gtk_widget_show(us);
4120
gtk_box_pack_start(GTK_BOX(tbl), us, FALSE, FALSE, 1);
4121
gtk_object_set_data(GTK_OBJECT(tbl), "units", us);
4125
aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
4128
GtkWidget *image = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_ROTATION);
4129
GtkWidget *hb = gtk_hbox_new(FALSE, 1);
4130
gtk_container_add (GTK_CONTAINER (hb), image);
4131
gtk_widget_show(image);
4132
gtk_box_pack_start (GTK_BOX (tbl), hb, FALSE, FALSE, 0);
4135
GtkWidget *hb = sp_tb_spinbutton(_(""), _("Letter rotation"),
4136
"tools.text", "letter_rotation", 0,
4137
us, tbl, FALSE, NULL,
4138
-180.0, 180.0, 0.1, 0.1,
4139
sp_text_letter_rotation_changed, 0.1, 1);
4140
gtk_widget_set_size_request (hb, 45, 0);
4141
gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE, 6);
4143
// rotation degree label
4145
GtkWidget *label = gtk_widget_new (GTK_TYPE_LABEL, "label", "\302\260", "xalign", 0.0, NULL);
4146
gtk_box_pack_start(GTK_BOX(tbl), label, FALSE, FALSE, 0);
4150
// Remove Manual Kerns
4152
GtkWidget *px = sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, INKSCAPE_STOCK_TEXT_REMOVE_KERNS);
4153
GtkWidget *button = gtk_button_new ();
4154
gtk_container_add (GTK_CONTAINER (button), px);
4155
gtk_widget_show(button);
4156
gtk_tooltips_set_tip (tt, button, _("Remove manual kerns"), NULL);
4157
gtk_button_set_relief (GTK_BUTTON (button), GTK_RELIEF_NONE);
4158
gtk_widget_set_sensitive(button, TRUE);
4159
gtk_box_pack_start (GTK_BOX (tbl), button, FALSE, FALSE, AUX_BETWEEN_BUTTON_GROUPS);
4163
4924
gtk_widget_show_all (tbl);
4308
sp_connector_toolbox_new(SPDesktop *desktop)
5076
static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder )
4310
GtkTooltips *tt = gtk_tooltips_new();
4311
GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
4313
gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
4314
gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
4316
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
4317
AUX_BETWEEN_BUTTON_GROUPS);
4319
sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
4320
"connector_avoid", GTK_SIGNAL_FUNC(sp_connector_path_set_avoid),
4321
tt, _("Make connectors avoid selected objects"));
4323
sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
4324
"connector_ignore", GTK_SIGNAL_FUNC(sp_connector_path_set_ignore),
4325
tt, _("Make connectors ignore selected objects"));
4328
gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
4329
AUX_BETWEEN_BUTTON_GROUPS);
5079
InkAction* inky = ink_action_new( "ConnectorAvoidAction",
5081
_("Make connectors avoid selected objects"),
5083
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5084
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_avoid), holder );
5085
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
5089
InkAction* inky = ink_action_new( "ConnectorIgnoreAction",
5091
_("Make connectors ignore selected objects"),
5093
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5094
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_ignore), holder );
5095
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
5098
EgeAdjustmentAction* eact = 0;
4331
5100
// Spacing spinbox
4333
GtkWidget *object_spacing = sp_tb_spinbutton(_("Spacing:"),
4334
_("The amount of space left around objects by auto-routing connectors"),
4335
"tools.connector", "spacing", 10, NULL, tbl, TRUE,
4336
"inkscape:connector-spacing", 0, 100, 1.0, 10.0,
4337
connector_spacing_changed, 1, 0);
5101
eact = create_adjustment_action( "ConnectorSpacingAction",
5102
_("Connector Spacing"), _("Spacing:"),
5103
_("The amount of space left around objects by auto-routing connectors"),
5104
"tools.connector", "spacing", defaultConnSpacing,
5105
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
5108
connector_spacing_changed, 1, 0 );
5109
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
4339
gtk_box_pack_start(GTK_BOX(tbl), object_spacing, FALSE, FALSE,
4342
5111
// Graph (connector network) layout
4343
sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
4344
"graph_layout", GTK_SIGNAL_FUNC(sp_connector_graph_layout),
4345
tt, _("Nicely arrange selected connector network"));
5113
InkAction* inky = ink_action_new( "ConnectorGraphAction",
5115
_("Nicely arrange selected connector network"),
5117
Inkscape::ICON_SIZE_SMALL_TOOLBAR );
5118
g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_graph_layout), holder );
5119
gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
4346
5122
// Default connector length spinbox
4348
GtkWidget *connector_length = sp_tb_spinbutton(_("Length:"),
4349
_("Ideal length for connectors when layout is applied"),
4350
"tools.connector", "length", 100, NULL, tbl, TRUE,
4351
"inkscape:connector-length", 10, 1000, 10.0, 100.0,
4352
connector_length_changed, 1, 0);
4354
gtk_box_pack_start(GTK_BOX(tbl), connector_length, FALSE, FALSE,
4357
gchar const *tbuttonstate;
5123
eact = create_adjustment_action( "ConnectorLengthAction",
5124
_("Connector Length"), _("Length:"),
5125
_("Ideal length for connectors when layout is applied"),
5126
"tools.connector", "length", 100,
5127
GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-length",
5128
10, 1000, 10.0, 100.0,
5130
connector_length_changed, 1, 0 );
5131
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
4358
5134
// Directed edges toggle button
4360
GtkWidget *tbutton = gtk_toggle_button_new ();
4361
gtk_button_set_relief (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
4362
gtk_container_add (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "directed_graph"));
4363
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (tbutton), FALSE);
4364
gtk_tooltips_set_tip(tt, tbutton, _("Make connectors with end-markers (arrows) point downwards"), NULL);
4366
gtk_box_pack_start (GTK_BOX (tbl), tbutton, FALSE, FALSE, 0);
4367
g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_directed_graph_layout_toggled), tbl);
4368
tbuttonstate = prefs_get_string_attribute("tools.connector", "directedlayout");
4369
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton),
4370
(tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
5136
InkToggleAction* act = ink_toggle_action_new( "ConnectorDirectedAction",
5138
_("Make connectors with end-markers (arrows) point downwards"),
5140
Inkscape::ICON_SIZE_DECORATION );
5141
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
5143
gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "directedlayout" );
5144
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
5145
(tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
5147
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder );
4372
5150
// Avoid overlaps toggle button
4374
GtkWidget *tbutton = gtk_toggle_button_new ();
4375
gtk_button_set_relief (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
4376
gtk_container_add (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "remove_overlaps"));
4377
gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (tbutton), FALSE);
4378
gtk_tooltips_set_tip(tt, tbutton, _("Do not allow overlapping shapes"), NULL);
4380
gtk_box_pack_start (GTK_BOX (tbl), tbutton, FALSE, FALSE, 0);
4381
g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_nooverlaps_graph_layout_toggled), tbl);
4382
tbuttonstate = prefs_get_string_attribute("tools.connector", "avoidoverlaplayout");
4383
gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton),
4384
(tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
5152
InkToggleAction* act = ink_toggle_action_new( "ConnectorOverlapAction",
5153
_("Remove overlaps"),
5154
_("Do not allow overlapping shapes"),
5156
Inkscape::ICON_SIZE_DECORATION );
5157
gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
5159
gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "avoidoverlaplayout" );
5160
gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
5161
(tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
5163
g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_nooverlaps_graph_layout_toggled), holder );
4387
gtk_widget_show_all(tbl);
4388
sp_set_font_size_smaller (tbl);
4390
5166
// Code to watch for changes to the connector-spacing attribute in
4392
5168
Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);
4393
5169
g_assert(repr != NULL);
4395
Inkscape::XML::Node *oldrepr = (Inkscape::XML::Node *)
4396
gtk_object_get_data(GTK_OBJECT(tbl), "repr");
4398
if (oldrepr) { // remove old listener
4399
sp_repr_remove_listener_by_data(oldrepr, tbl);
4400
Inkscape::GC::release(oldrepr);
4402
g_object_set_data(G_OBJECT(tbl), "repr", NULL);
5171
purge_repr_listener( holder, holder );
4406
g_object_set_data(G_OBJECT(tbl), "repr", repr);
5174
g_object_set_data( holder, "repr", repr );
4407
5175
Inkscape::GC::anchor(repr);
4408
sp_repr_add_listener(repr, &connector_tb_repr_events, tbl);
4409
sp_repr_synthesize_events(repr, &connector_tb_repr_events, tbl);
4414
} // end of sp_connector_toolbox_new()
5176
sp_repr_add_listener( repr, &connector_tb_repr_events, holder );
5177
sp_repr_synthesize_events( repr, &connector_tb_repr_events, holder );
5179
} // end of sp_connector_toolbox_prep()
5182
//#########################
5184
//#########################
5186
static void paintbucket_channels_changed(EgeSelectOneAction* act, GObject* /*tbl*/)
5188
gint channels = ege_select_one_action_get_active( act );
5189
flood_channels_set_channels( channels );
5192
static void paintbucket_threshold_changed(GtkAdjustment *adj, GObject */*tbl*/)
5194
prefs_set_int_attribute("tools.paintbucket", "threshold", (gint)adj->value);
5197
static void paintbucket_autogap_changed(EgeSelectOneAction* act, GObject */*tbl*/)
5199
prefs_set_int_attribute("tools.paintbucket", "autogap", ege_select_one_action_get_active( act ));
5202
static void paintbucket_offset_changed(GtkAdjustment *adj, GObject *tbl)
5204
UnitTracker* tracker = static_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
5205
SPUnit const *unit = tracker->getActiveUnit();
5207
prefs_set_double_attribute("tools.paintbucket", "offset", (gdouble)sp_units_get_pixels(adj->value, *unit));
5209
prefs_set_string_attribute("tools.paintbucket", "offsetunits", sp_unit_get_abbreviation(unit));
5212
static void paintbucket_defaults(GtkWidget *, GObject *dataKludge)
5214
// FIXME: make defaults settable via Inkscape Options
5218
} const key_values[] = {
5223
for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
5224
KeyValue const &kv = key_values[i];
5225
GtkAdjustment* adj = static_cast<GtkAdjustment *>(g_object_get_data(dataKludge, kv.key));
5227
gtk_adjustment_set_value(adj, kv.value);
5231
EgeSelectOneAction* channels_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "channels_action" ) );
5232
ege_select_one_action_set_active( channels_action, FLOOD_CHANNELS_RGB );
5233
EgeSelectOneAction* autogap_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "autogap_action" ) );
5234
ege_select_one_action_set_active( autogap_action, 0 );
5237
static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
5239
EgeAdjustmentAction* eact = 0;
5242
GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
5246
for ( items = flood_channels_dropdown_items_list(); items ; items = g_list_next(items) )
5249
gtk_list_store_append( model, &iter );
5250
gtk_list_store_set( model, &iter, 0, reinterpret_cast<gchar*>(items->data), 1, count, -1 );
5253
g_list_free( items );
5255
EgeSelectOneAction* act1 = ege_select_one_action_new( "ChannelsAction", _("Fill by"), (""), NULL, GTK_TREE_MODEL(model) );
5256
g_object_set( act1, "short_label", _("Fill by:"), NULL );
5257
ege_select_one_action_set_appearance( act1, "compact" );
5258
ege_select_one_action_set_active( act1, prefs_get_int_attribute("tools.paintbucket", "channels", 0) );
5259
g_signal_connect( G_OBJECT(act1), "changed", G_CALLBACK(paintbucket_channels_changed), holder );
5260
gtk_action_group_add_action( mainActions, GTK_ACTION(act1) );
5261
g_object_set_data( holder, "channels_action", act1 );
5266
eact = create_adjustment_action(
5268
_("Fill Threshold"), _("Threshold:"),
5269
_("The maximum allowed difference between the clicked pixel and the neighboring pixels to be counted in the fill"),
5270
"tools.paintbucket", "threshold", 5, GTK_WIDGET(desktop->canvas), NULL, holder, TRUE,
5271
"inkscape:paintbucket-threshold", 0, 100.0, 1.0, 10.0,
5273
paintbucket_threshold_changed, 1, 0 );
5275
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5278
// Create the units menu.
5279
UnitTracker* tracker = new UnitTracker( SP_UNIT_ABSOLUTE | SP_UNIT_DEVICE );
5280
tracker->setActiveUnit(sp_unit_get_by_abbreviation(prefs_get_string_attribute("tools.paintbucket", "offsetunits")));
5281
g_object_set_data( holder, "tracker", tracker );
5283
GtkAction* act = tracker->createAction( "PaintbucketUnitsAction", _("Units"), ("") );
5284
gtk_action_group_add_action( mainActions, act );
5289
eact = create_adjustment_action(
5291
_("Grow/shrink by"), _("Grow/shrink by:"),
5292
_("The amount to grow (positive) or shrink (negative) the created fill path"),
5293
"tools.paintbucket", "offset", 0, GTK_WIDGET(desktop->canvas), NULL/*us*/, holder, TRUE,
5294
"inkscape:paintbucket-offset", -1e6, 1e6, 0.1, 0.5,
5296
paintbucket_offset_changed, 1, 2);
5297
tracker->addAdjustment( ege_adjustment_action_get_adjustment(eact) );
5299
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
5304
GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
5308
for ( items = flood_autogap_dropdown_items_list(); items ; items = g_list_next(items) )
5311
gtk_list_store_append( model, &iter );
5312
gtk_list_store_set( model, &iter, 0, reinterpret_cast<gchar*>(items->data), 1, count, -1 );
5315
g_list_free( items );
5317
EgeSelectOneAction* act2 = ege_select_one_action_new( "AutoGapAction", _("Close gaps"), (""), NULL, GTK_TREE_MODEL(model) );
5318
g_object_set( act2, "short_label", _("Close gaps:"), NULL );
5319
ege_select_one_action_set_appearance( act2, "compact" );
5320
ege_select_one_action_set_active( act2, prefs_get_int_attribute("tools.paintbucket", "autogap", 0) );
5321
g_signal_connect( G_OBJECT(act2), "changed", G_CALLBACK(paintbucket_autogap_changed), holder );
5322
gtk_action_group_add_action( mainActions, GTK_ACTION(act2) );
5323
g_object_set_data( holder, "autogap_action", act2 );
5328
GtkAction* act = gtk_action_new( "PaintbucketResetAction",
5330
_("Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
5332
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(paintbucket_defaults), holder );
5333
gtk_action_group_add_action( mainActions, act );
5334
gtk_action_set_sensitive( act, TRUE );
4418
5340
Local Variables: