index 7296ae9acf1a08db877535e5ad3c3c0371d4999b..9801c9f48876c056fe53b0370b611d9275d45c09 100644 (file)
--- a/src/widgets/toolbox.cpp
+++ b/src/widgets/toolbox.cpp
#include "sp-namedview.h"
#include "desktop.h"
#include "desktop-handles.h"
-#include "nodepath.h"
#include "xml/repr.h"
#include "xml/node-event-vector.h"
#include <glibmm/i18n.h>
#include "gradient-toolbar.h"
#include "connector-context.h"
+#include "node-context.h"
+#include "shape-editor.h"
#include "sp-rect.h"
+#include "box3d.h"
+#include "box3d-context.h"
#include "sp-star.h"
#include "sp-spiral.h"
#include "sp-ellipse.h"
typedef void (*UpdateFunction)(SPDesktop *desktop, SPEventContext *eventcontext, GtkWidget *toolbox);
static void sp_node_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
+static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_zoom_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
+static void sp_3dbox_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_pen_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_calligraphy_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
-static GtkWidget *sp_dropper_toolbox_new(SPDesktop *desktop);
+static void sp_dropper_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static GtkWidget *sp_empty_toolbox_new(SPDesktop *desktop);
-static GtkWidget *sp_connector_toolbox_new(SPDesktop *desktop);
+static void sp_connector_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder);
namespace { GtkWidget *sp_text_toolbox_new (SPDesktop *desktop); }
} const tools[] = {
{ "SPSelectContext", "select_tool", SP_VERB_CONTEXT_SELECT, SP_VERB_CONTEXT_SELECT_PREFS},
{ "SPNodeContext", "node_tool", SP_VERB_CONTEXT_NODE, SP_VERB_CONTEXT_NODE_PREFS },
+ { "SPTweakContext", "tweak_tool", SP_VERB_CONTEXT_TWEAK, SP_VERB_CONTEXT_TWEAK_PREFS },
{ "SPZoomContext", "zoom_tool", SP_VERB_CONTEXT_ZOOM, SP_VERB_CONTEXT_ZOOM_PREFS },
{ "SPRectContext", "rect_tool", SP_VERB_CONTEXT_RECT, SP_VERB_CONTEXT_RECT_PREFS },
+// { "SP3DBoxContext", "3dbox_tool", SP_VERB_CONTEXT_3DBOX, SP_VERB_CONTEXT_3DBOX_PREFS },
{ "SPArcContext", "arc_tool", SP_VERB_CONTEXT_ARC, SP_VERB_CONTEXT_ARC_PREFS },
{ "SPStarContext", "star_tool", SP_VERB_CONTEXT_STAR, SP_VERB_CONTEXT_STAR_PREFS },
{ "SPSpiralContext", "spiral_tool", SP_VERB_CONTEXT_SPIRAL, SP_VERB_CONTEXT_SPIRAL_PREFS },
SP_VERB_INVALID, 0, 0},
{ "SPNodeContext", "node_toolbox", 0, sp_node_toolbox_prep, "NodeToolbar",
SP_VERB_INVALID, 0, 0},
+ { "SPTweakContext", "tweak_toolbox", 0, sp_tweak_toolbox_prep, "TweakToolbar",
+ SP_VERB_INVALID, 0, 0},
{ "SPZoomContext", "zoom_toolbox", 0, sp_zoom_toolbox_prep, "ZoomToolbar",
SP_VERB_INVALID, 0, 0},
{ "SPStarContext", "star_toolbox", 0, sp_star_toolbox_prep, "StarToolbar",
SP_VERB_CONTEXT_STAR_PREFS, "tools.shapes.star", _("Style of new stars")},
{ "SPRectContext", "rect_toolbox", 0, sp_rect_toolbox_prep, "RectToolbar",
SP_VERB_CONTEXT_RECT_PREFS, "tools.shapes.rect", _("Style of new rectangles")},
+ { "SP3DBoxContext", "3dbox_toolbox", 0, sp_3dbox_toolbox_prep, "3DBoxToolbar",
+ SP_VERB_CONTEXT_3DBOX_PREFS, "tools.shapes.3dbox", _("Style of new 3D boxes")},
{ "SPArcContext", "arc_toolbox", 0, sp_arc_toolbox_prep, "ArcToolbar",
SP_VERB_CONTEXT_ARC_PREFS, "tools.shapes.arc", _("Style of new ellipses")},
{ "SPSpiralContext", "spiral_toolbox", 0, sp_spiral_toolbox_prep, "SpiralToolbar",
SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "tools.calligraphic", _("Style of new calligraphic strokes")},
{ "SPTextContext", "text_toolbox", sp_text_toolbox_new, 0, 0,
SP_VERB_INVALID, 0, 0},
- { "SPDropperContext", "dropper_toolbox", sp_dropper_toolbox_new, 0, 0,
+ { "SPDropperContext", "dropper_toolbox", 0, sp_dropper_toolbox_prep, "DropperToolbar",
SP_VERB_INVALID, 0, 0},
{ "SPGradientContext", "gradient_toolbox", sp_gradient_toolbox_new, 0, 0,
SP_VERB_INVALID, 0, 0},
- { "SPConnectorContext", "connector_toolbox", sp_connector_toolbox_new, 0, 0,
+ { "SPConnectorContext", "connector_toolbox", 0, sp_connector_toolbox_prep, "ConnectorToolbar",
SP_VERB_INVALID, 0, 0},
{ "SPFloodContext", "paintbucket_toolbox", 0, sp_paintbucket_toolbox_prep, "PaintbucketToolbar",
SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "tools.paintbucket", _("Style of Paint Bucket fill objects")},
" <toolitem action='NodesShowHandlesAction' />"
" </toolbar>"
+ " <toolbar name='TweakToolbar'>"
+ " <toolitem action='TweakWidthAction' />"
+ " <toolitem action='TweakForceAction' />"
+ " <separator />"
+ " <toolitem action='TweakModeAction' />"
+ " <separator />"
+ " <toolitem action='TweakFidelityAction' />"
+ " <toolitem action='TweakPressureAction' />"
+ " </toolbar>"
+
" <toolbar name='ZoomToolbar'>"
" <toolitem action='ZoomIn' />"
" <toolitem action='ZoomOut' />"
" <toolitem action='RectResetAction' />"
" </toolbar>"
+ " <toolbar name='3DBoxToolbar'>"
+ " <toolitem action='3DBoxVPXAction' />"
+ " <toolitem action='3DBoxVPYAction' />"
+ " <toolitem action='3DBoxVPZAction' />"
+ " <separator />"
+ " </toolbar>"
+
" <toolbar name='SpiralToolbar'>"
" <toolitem action='SpiralStateAction' />"
" <toolitem action='SpiralRevolutionAction' />"
" <separator />"
" <toolitem action='OffsetAction' />"
" <toolitem action='PaintbucketUnitsAction' />"
+ " <separator />"
+ " <toolitem action='AutoGapAction' />"
+ " <separator />"
+ " <toolitem action='PaintbucketResetAction' />"
" </toolbar>"
+
+ " <toolbar name='DropperToolbar'>"
+ " <toolitem action='DropperPickAlphaAction' />"
+ " <toolitem action='DropperSetAlphaAction' />"
+ " </toolbar>"
+
+ " <toolbar name='ConnectorToolbar'>"
+ " <toolitem action='ConnectorAvoidAction' />"
+ " <toolitem action='ConnectorIgnoreAction' />"
+ " <toolitem action='ConnectorSpacingAction' />"
+ " <toolitem action='ConnectorGraphAction' />"
+ " <toolitem action='ConnectorLengthAction' />"
+ " <toolitem action='ConnectorDirectedAction' />"
+ " <toolitem action='ConnectorOverlapAction' />"
+ " </toolbar>"
+
"</ui>"
;
delete connection;
}
-static GtkWidget *
-sp_toolbox_button_new(GtkWidget *t, Inkscape::IconSize size, gchar const *pxname, GtkSignalFunc handler,
- GtkTooltips *tt, gchar const *tip)
+static void purge_repr_listener( GObject* obj, GObject* tbl )
{
- GtkWidget *b = sp_button_new_from_data(size, SP_BUTTON_TYPE_NORMAL, NULL, pxname, tip, tt);
- gtk_widget_show(b);
- if (handler) gtk_signal_connect(GTK_OBJECT(b), "clicked", handler, NULL);
- gtk_box_pack_start(GTK_BOX(t), b, FALSE, FALSE, 0);
-
- return b;
+ (void)obj;
+ Inkscape::XML::Node* oldrepr = reinterpret_cast<Inkscape::XML::Node *>( g_object_get_data( tbl, "repr" ) );
+ if (oldrepr) { // remove old listener
+ sp_repr_remove_listener_by_data(oldrepr, tbl);
+ Inkscape::GC::release(oldrepr);
+ oldrepr = 0;
+ g_object_set_data( tbl, "repr", NULL );
+ }
}
GtkWidget *
//# node editing callbacks
//####################################
+/**
+ * FIXME: Returns current shape_editor in context. // later eliminate this function at all!
+ */
+static ShapeEditor *get_current_shape_editor()
+{
+ if (!SP_ACTIVE_DESKTOP) {
+ return NULL;
+ }
+
+ SPEventContext *event_context = (SP_ACTIVE_DESKTOP)->event_context;
+
+ if (!SP_IS_NODE_CONTEXT(event_context)) {
+ return NULL;
+ }
+
+ return SP_NODE_CONTEXT(event_context)->shape_editor;
+}
+
+
void
sp_node_path_edit_add(void)
{
- sp_node_selected_add_node();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->add_node();
}
void
sp_node_path_edit_delete(void)
{
- sp_node_selected_delete();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->delete_nodes();
}
void
sp_node_path_edit_delete_segment(void)
{
- sp_node_selected_delete_segment();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->delete_segment();
}
void
sp_node_path_edit_break(void)
{
- sp_node_selected_break();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->break_at_nodes();
}
void
sp_node_path_edit_join(void)
{
- sp_node_selected_join();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->join_nodes();
}
void
sp_node_path_edit_join_segment(void)
{
- sp_node_selected_join_segment();
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->join_segments();
}
void
sp_node_path_edit_toline(void)
{
- sp_node_selected_set_line_type(NR_LINETO);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->set_type_of_segments(NR_LINETO);
}
void
sp_node_path_edit_tocurve(void)
{
- sp_node_selected_set_line_type(NR_CURVETO);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->set_type_of_segments(NR_CURVETO);
}
void
sp_node_path_edit_cusp(void)
{
- sp_node_selected_set_type(Inkscape::NodePath::NODE_CUSP);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_CUSP);
}
void
sp_node_path_edit_smooth(void)
{
- sp_node_selected_set_type(Inkscape::NodePath::NODE_SMOOTH);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SMOOTH);
}
void
sp_node_path_edit_symmetrical(void)
{
- sp_node_selected_set_type(Inkscape::NodePath::NODE_SYMM);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->set_node_type(Inkscape::NodePath::NODE_SYMM);
}
static void toggle_show_handles (GtkToggleAction *act, gpointer data) {
bool show = gtk_toggle_action_get_active( act );
prefs_set_int_attribute ("tools.nodes", "show_handles", show ? 1 : 0);
- sp_nodepath_show_handles(show);
+ ShapeEditor *shape_editor = get_current_shape_editor();
+ if (shape_editor) shape_editor->show_handles(show);
}
//################################
setup_tool_toolbox(GtkWidget *toolbox, SPDesktop *desktop)
{
GtkTooltips *tooltips=GTK_TOOLTIPS(g_object_get_data(G_OBJECT(toolbox), "tooltips"));
- gint shrinkLeft = prefs_get_int_attribute_limited( "toolbox.left", "small", 0, 0, 1 );
+ gint shrinkLeft = prefs_get_int_attribute_limited( "toolbox.tools", "small", 0, 0, 1 );
+ if ( (shrinkLeft == 0) && (prefs_get_int_attribute_limited( "toolbox.tools", "small", 1, 0, 1 ) == 1) ) {
+ // "toolbox.tools" was not set. Fallback to older value
+ shrinkLeft = prefs_get_int_attribute_limited( "toolbox.left", "small", 0, 0, 1 );
+
+ // Copy the setting forwards
+ prefs_set_int_attribute( "toolbox.tools", "small", shrinkLeft );
+ }
Inkscape::IconSize toolboxSize = shrinkLeft ? Inkscape::ICON_SIZE_SMALL_TOOLBAR : Inkscape::ICON_SIZE_LARGE_TOOLBAR;
for (int i = 0 ; tools[i].type_name ; i++ ) {
gint shrinkTop = prefs_get_int_attribute_limited( "toolbox", "small", 1, 0, 1 );
Inkscape::IconSize toolboxSize = shrinkTop ? Inkscape::ICON_SIZE_SMALL_TOOLBAR : Inkscape::ICON_SIZE_LARGE_TOOLBAR;
- gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
+ if ( prefs_get_int_attribute_limited( "toolbox", "icononly", 1, 0, 1 ) ) {
+ gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
+ }
gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast<GtkIconSize>(toolboxSize) );
gtk_ui_manager_add_ui_from_string( mgr, descr, -1, &errVal );
GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, "/ui/CommandsToolbar" );
- gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
+ if ( prefs_get_int_attribute_limited( "toolbox", "icononly", 1, 0, 1 ) ) {
+ gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS );
+ }
gint shrinkTop = prefs_get_int_attribute_limited( "toolbox", "small", 1, 0, 1 );
Inkscape::IconSize toolboxSize = shrinkTop ? Inkscape::ICON_SIZE_SMALL_TOOLBAR : Inkscape::ICON_SIZE_LARGE_TOOLBAR;
gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), (GtkIconSize)toolboxSize );
@@ -1481,7 +1571,8 @@ sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
{
int n_selected = 0;
Inkscape::XML::Node *repr = NULL;
- Inkscape::XML::Node *oldrepr = NULL;
+
+ purge_repr_listener( tbl, tbl );
for (GSList const *items = selection->itemList();
items != NULL;
@@ -1500,14 +1591,6 @@ sp_star_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
} else if (n_selected == 1) {
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
- oldrepr = (Inkscape::XML::Node *) g_object_get_data( tbl, "repr" );
- if (oldrepr) { // remove old listener
- sp_repr_remove_listener_by_data(oldrepr, tbl);
- Inkscape::GC::release(oldrepr);
- oldrepr = 0;
- g_object_set_data( tbl, "repr", NULL );
- }
-
if (repr) {
g_object_set_data( tbl, "repr", repr );
Inkscape::GC::anchor(repr);
@@ -1701,6 +1784,7 @@ static void sp_star_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_star_toolbox_selection_changed), (GObject *)holder))
);
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
}
@@ -1876,7 +1960,11 @@ sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
int n_selected = 0;
Inkscape::XML::Node *repr = NULL;
SPItem *item = NULL;
- Inkscape::XML::Node *oldrepr = NULL;
+
+ if ( g_object_get_data( tbl, "repr" ) ) {
+ g_object_set_data( tbl, "item", NULL );
+ }
+ purge_repr_listener( tbl, tbl );
for (GSList const *items = selection->itemList();
items != NULL;
@@ -1909,14 +1997,6 @@ sp_rect_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl)
GtkAction* h = GTK_ACTION( g_object_get_data( tbl, "height_action" ) );
gtk_action_set_sensitive(h, TRUE);
- oldrepr = (Inkscape::XML::Node *) g_object_get_data( tbl, "repr" );
- if (oldrepr) { // remove old listener
- sp_repr_remove_listener_by_data(oldrepr, tbl);
- Inkscape::GC::release(oldrepr);
- oldrepr = 0;
- g_object_set_data( tbl, "repr", NULL );
- g_object_set_data( tbl, "item", NULL );
- }
if (repr) {
g_object_set_data( tbl, "repr", repr );
g_object_set_data( tbl, "item", item );
@@ -2033,6 +2113,75 @@ static void sp_rect_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_rect_toolbox_selection_changed), (GObject *)holder))
);
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
+}
+
+//########################
+//## 3D Box ##
+//########################
+
+static void sp_3dbox_toggle_vp_changed( GtkToggleAction *act, gpointer data )
+{
+ SPDocument *document = sp_desktop_document (inkscape_active_desktop ());
+ Box3D::Axis axis = (Box3D::Axis) GPOINTER_TO_INT(data);
+
+ if (document->current_perspective) {
+ document->current_perspective->toggle_boxes (axis);
+ }
+
+}
+
+static void sp_3dbox_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
+{
+ SPDocument *document = sp_desktop_document (desktop);
+ bool toggled = false;
+ /* toggle VP in X direction */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "3DBoxVPXAction",
+ _("Toggle VP in X direction"),
+ _("Toggle VP in X direction between 'finite' and 'infinite' (=parallel)"),
+ "toggle_vp_x",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ if (document->current_perspective) {
+ toggled = !document->current_perspective->get_vanishing_point(Box3D::X)->is_finite();
+ }
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), toggled );
+ /* we connect the signal after setting the state to avoid switching the state again */
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_3dbox_toggle_vp_changed), GINT_TO_POINTER(Box3D::X));
+ }
+
+ /* toggle VP in Y direction */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "3DBoxVPYAction",
+ _("Toggle VP in Y direction"),
+ _("Toggle VP in Y direction between 'finite' and 'infinite' (=parallel)"),
+ "toggle_vp_y",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ if (document->current_perspective) {
+ toggled = !document->current_perspective->get_vanishing_point(Box3D::Y)->is_finite();
+ }
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), toggled );
+ /* we connect the signal after setting the state to avoid switching the state again */
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_3dbox_toggle_vp_changed), GINT_TO_POINTER(Box3D::Y));
+ }
+
+ /* toggle VP in Z direction */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "3DBoxVPZAction",
+ _("Toggle VP in Z direction"),
+ _("Toggle VP in Z direction between 'finite' and 'infinite' (=parallel)"),
+ "toggle_vp_z",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ if (document->current_perspective) {
+ toggled = !document->current_perspective->get_vanishing_point(Box3D::Z)->is_finite();
+ }
+ /* we connect the signal after setting the state to avoid switching the state again */
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), toggled );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_3dbox_toggle_vp_changed), GINT_TO_POINTER(Box3D::Z));
+ }
}
//########################
@@ -2168,7 +2317,8 @@ sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl
{
int n_selected = 0;
Inkscape::XML::Node *repr = NULL;
- Inkscape::XML::Node *oldrepr = NULL;
+
+ purge_repr_listener( tbl, tbl );
for (GSList const *items = selection->itemList();
items != NULL;
@@ -2187,14 +2337,6 @@ sp_spiral_toolbox_selection_changed(Inkscape::Selection *selection, GObject *tbl
} else if (n_selected == 1) {
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
- oldrepr = (Inkscape::XML::Node *) g_object_get_data( tbl, "repr" );
- if (oldrepr) { // remove old listener
- sp_repr_remove_listener_by_data(oldrepr, tbl);
- Inkscape::GC::release(oldrepr);
- oldrepr = 0;
- g_object_set_data( tbl, "repr", NULL );
- }
-
if (repr) {
g_object_set_data( tbl, "repr", repr );
Inkscape::GC::anchor(repr);
@@ -2272,6 +2414,7 @@ static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActio
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_spiral_toolbox_selection_changed), (GObject *)holder))
);
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
}
//########################
@@ -2289,6 +2432,148 @@ static void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActio
// Put stuff here
}
+//########################
+//## Tweak ##
+//########################
+
+static void sp_tweak_width_value_changed( GtkAdjustment *adj, GObject *tbl )
+{
+ prefs_set_double_attribute( "tools.tweak", "width", adj->value * 0.01 );
+}
+
+static void sp_tweak_force_value_changed( GtkAdjustment *adj, GObject *tbl )
+{
+ prefs_set_double_attribute( "tools.tweak", "force", adj->value * 0.01 );
+}
+
+static void sp_tweak_pressure_state_changed( GtkToggleAction *act, gpointer data )
+{
+ prefs_set_int_attribute( "tools.tweak", "usepressure", gtk_toggle_action_get_active( act ) ? 1 : 0);
+}
+
+static void sp_tweak_mode_changed( EgeSelectOneAction *act, GObject *tbl )
+{
+ prefs_set_int_attribute("tools.tweak", "mode", ege_select_one_action_get_active( act ));
+}
+
+static void sp_tweak_fidelity_value_changed( GtkAdjustment *adj, GObject *tbl )
+{
+ prefs_set_double_attribute( "tools.tweak", "fidelity", adj->value * 0.01 );
+}
+
+
+static void sp_tweak_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
+{
+ {
+ /* Width */
+ gchar const* labels[] = {_("(pinch tweak)"), 0, 0, 0, _("(default)"), 0, 0, 0, 0, _("(broad tweak)")};
+ gdouble values[] = {1, 3, 5, 10, 15, 20, 30, 50, 75, 100};
+ EgeAdjustmentAction *eact = create_adjustment_action( "TweakWidthAction",
+ _("Width:"), _("The width of the tweak area (relative to the visible canvas area)"),
+ "tools.tweak", "width", 15,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "altx-tweak",
+ 1, 100, 1.0, 10.0,
+ labels, values, G_N_ELEMENTS(labels),
+ sp_tweak_width_value_changed, 0.01, 0, 100 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+ gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
+ }
+
+
+ {
+ /* Force */
+ gchar const* labels[] = {_("(minimum force)"), 0, 0, _("(default)"), 0, 0, 0, _("(maximum force)")};
+ gdouble values[] = {1, 5, 10, 20, 30, 50, 70, 100};
+ EgeAdjustmentAction *eact = create_adjustment_action( "TweakForceAction",
+ _("Force:"), _("The force of the tweak action"),
+ "tools.tweak", "force", 20,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-force",
+ 1, 100, 1.0, 10.0,
+ labels, values, G_N_ELEMENTS(labels),
+ sp_tweak_force_value_changed, 0.01, 0, 100 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+ gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
+ }
+
+ /* Mode */
+ {
+ GtkListStore* model = gtk_list_store_new( 3, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING );
+
+ GtkTreeIter iter;
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Push mode"),
+ 1, _("Switch to Push mode"),
+ 2, "tweak_push_mode",
+ -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Melt mode"),
+ 1, _("Switch to Melt mode"),
+ 2, "tweak_suck_mode",
+ -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Blow mode"),
+ 1, _("Switch to Blow mode"),
+ 2, "tweak_blow_mode",
+ -1 );
+
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter,
+ 0, _("Roughen mode"),
+ 1, _("Switch to Roughen mode"),
+ 2, "tweak_roughen_mode",
+ -1 );
+
+ EgeSelectOneAction* act = ege_select_one_action_new( "TweakModeAction", _(""), _(""), NULL, GTK_TREE_MODEL(model) );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act) );
+ g_object_set_data( holder, "mode_action", act );
+
+ ege_select_one_action_set_appearance( act, "full" );
+ ege_select_one_action_set_radio_action_type( act, INK_RADIO_ACTION_TYPE );
+ g_object_set( G_OBJECT(act), "icon-property", "iconId", NULL );
+ ege_select_one_action_set_icon_column( act, 2 );
+ ege_select_one_action_set_tooltip_column( act, 1 );
+
+ gint mode = prefs_get_int_attribute("tools.tweak", "mode", 0);
+ ege_select_one_action_set_active( act, mode );
+ g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_tweak_mode_changed), holder );
+
+ g_object_set_data( G_OBJECT(holder), "tweak_tool_mode", act);
+ }
+
+ { /* Fidelity */
+ gchar const* labels[] = {_("(rough, simplified)"), 0, 0, _("(default)"), 0, 0, _("(fine, but many nodes)")};
+ gdouble values[] = {10, 25, 35, 50, 60, 80, 100};
+ EgeAdjustmentAction *eact = create_adjustment_action( "TweakFidelityAction",
+ _("Fidelity:"), _("Low fidelity simplifies paths; high fidelity preserves path features but may generate a lot of new nodes"),
+ "tools.tweak", "fidelity", 50,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "tweak-fidelity",
+ 1, 100, 1.0, 10.0,
+ labels, values, G_N_ELEMENTS(labels),
+ sp_tweak_fidelity_value_changed, 0.01, 0, 100 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+ gtk_action_set_sensitive( GTK_ACTION(eact), TRUE );
+ }
+
+
+ /* Use Pressure button */
+ {
+ InkToggleAction* act = ink_toggle_action_new( "TweakPressureAction",
+ _("Pressure"),
+ _("Use the pressure of the input device to alter the width of the area"),
+ "use_pressure",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_tweak_pressure_state_changed), NULL);
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.tweak", "usepressure", 1 ) );
+ }
+
+}
+
//########################
//## Calligraphy ##
@@ -2548,7 +2833,7 @@ static void sp_calligraphy_toolbox_prep(SPDesktop *desktop, GtkActionGroup* main
{
GtkAction* act = gtk_action_new( "CalligraphyResetAction",
_("Defaults"),
- _("Reset shape parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
+ _("Reset all parameters to defaults"),
GTK_STOCK_CLEAR );
g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(sp_ddc_defaults), holder );
gtk_action_group_add_action( mainActions, act );
@@ -2767,7 +3052,8 @@ static void sp_arc_toolbox_selection_changed(Inkscape::Selection *selection, GOb
{
int n_selected = 0;
Inkscape::XML::Node *repr = NULL;
- Inkscape::XML::Node *oldrepr = NULL;
+
+ purge_repr_listener( tbl, tbl );
for (GSList const *items = selection->itemList();
items != NULL;
@@ -2788,15 +3074,6 @@ static void sp_arc_toolbox_selection_changed(Inkscape::Selection *selection, GOb
g_object_set_data( tbl, "single", GINT_TO_POINTER(TRUE) );
g_object_set( G_OBJECT(act), "label", _("<b>Change:</b>"), NULL );
- oldrepr = (Inkscape::XML::Node *) g_object_get_data( tbl, "repr" );
-
- if (oldrepr) { // remove old listener
- sp_repr_remove_listener_by_data(oldrepr, tbl);
- Inkscape::GC::release(oldrepr);
- oldrepr = 0;
- g_object_set_data( tbl, "repr", NULL );
- }
-
if (repr) {
g_object_set_data( tbl, "repr", repr );
Inkscape::GC::anchor(repr);
@@ -2909,6 +3186,7 @@ static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions,
sp_desktop_selection(desktop)->connectChanged(sigc::bind(sigc::ptr_fun(sp_arc_toolbox_selection_changed), (GObject *)holder))
);
g_signal_connect( holder, "destroy", G_CALLBACK(delete_connection), connection );
+ g_signal_connect( holder, "destroy", G_CALLBACK(purge_repr_listener), holder );
}
@@ -2920,100 +3198,24 @@ static void sp_arc_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions,
//## Dropper ##
//########################
-static void toggle_dropper_pick_alpha (GtkWidget *button, gpointer tbl) {
- prefs_set_int_attribute ("tools.dropper", "pick",
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)));
- GtkWidget *set_checkbox = (GtkWidget*) g_object_get_data(G_OBJECT(tbl), "set_checkbox");
- if (set_checkbox) {
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button))) {
- gtk_widget_set_sensitive (GTK_WIDGET (set_checkbox), TRUE);
+static void toggle_dropper_pick_alpha( GtkToggleAction* act, gpointer tbl ) {
+ prefs_set_int_attribute( "tools.dropper", "pick", gtk_toggle_action_get_active( act ) );
+ GtkAction* set_action = GTK_ACTION( g_object_get_data(G_OBJECT(tbl), "set_action") );
+ if ( set_action ) {
+ if ( gtk_toggle_action_get_active( act ) ) {
+ gtk_action_set_sensitive( set_action, TRUE );
} else {
- gtk_widget_set_sensitive (GTK_WIDGET (set_checkbox), FALSE);
+ gtk_action_set_sensitive( set_action, FALSE );
}
}
- spinbutton_defocus(GTK_OBJECT(tbl));
-}
-static void toggle_dropper_set_alpha (GtkWidget *button, gpointer tbl) {
- prefs_set_int_attribute ("tools.dropper", "setalpha",
- gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (button)) ? 1 : 0);
spinbutton_defocus(GTK_OBJECT(tbl));
}
-
-/**
- * Copy the current saved desktop color to the clipboard as full hex + alpha
- * color representation. This is useful for passing values between various
- * input boxes, or directly to xml.
- */
-/* static void
-sp_dropper_copy( GtkWidget *widget, GtkObject *obj)
-{
- GtkWidget *tbl = GTK_WIDGET(obj);
-
- SPDesktop *desktop =
- (SPDesktop *) gtk_object_get_data(GTK_OBJECT(tbl), "desktop");
-
-
- sp_dropper_c32_color_copy( sp_desktop_get_color(desktop, true) );
-}*/
-
-
-/**
- * Copies currently saved desktop color to the clipboard as a hex value. This
- * is useful for editing webpages and needing a value quickly for web
- * colors.
- *
- * TODO: When the toggle of the dropper is set to not mix color against
- * page background, this still just gets the color of the page and
- * doesn't get the actual mixed against background which is needed
- * for the hex value ppl. want for web pages, etc.
- */
-
-/* static void
-sp_dropper_copy_as_hex ( GtkWidget *widget, GtkObject *obj)
-{
- GtkWidget *tbl = GTK_WIDGET(obj);
-
- SPDesktop *desktop =
- (SPDesktop *) gtk_object_get_data(GTK_OBJECT(tbl), "desktop");
-
- sp_dropper_c32_color_copy_hex( sp_desktop_get_color(desktop, true) );
-}*/
-
-
-/**
- * Sets the input boxes with the changed color and opacity. This is used as a
- * callback for style changing.
- */
-/* static bool
-sp_style_changed (const SPCSSAttr *css, gpointer data)
-{
- // GrDrag *drag = (GrDrag *) data;
-
- // set fill of text entry box
- if (css->attribute("fill"))
- gtk_entry_set_text((GtkEntry *)dropper_rgb_entry,
- css->attribute("fill"));
-
- // set opacity of text entry box
- if (css->attribute("fill-opacity"))
- gtk_entry_set_text((GtkEntry *)dropper_opacity_entry,
- css->attribute("fill-opacity"));
-
- // set fill of text entry box
- if (css->attribute("stroke"))
- gtk_entry_set_text((GtkEntry *)dropper_rgb_entry,
- css->attribute("stroke"));
-
- // set opacity of text entry box
- if (css->attribute("stroke-opacity"))
- gtk_entry_set_text((GtkEntry *)dropper_opacity_entry,
- css->attribute("stroke-opacity"));
- return false;
-
+static void toggle_dropper_set_alpha( GtkToggleAction* act, gpointer tbl ) {
+ prefs_set_int_attribute( "tools.dropper", "setalpha", gtk_toggle_action_get_active( act ) ? 1 : 0 );
+ spinbutton_defocus(GTK_OBJECT(tbl));
}
-*/
/**
* TODO: Add queue of last 5 or so colors selected with new swatches so that
* can drag and drop places. Will provide a nice mixing palette.
*/
-static GtkWidget *
-sp_dropper_toolbox_new(SPDesktop *desktop)
+static void sp_dropper_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
- GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
-
- gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
- gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
-
- GtkTooltips *tt = gtk_tooltips_new();
-
-
- gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
- // sp_toolbox_add_label(tbl, _("<b>New:</b>"));
-
-
-
- /* RGB Input Field */
- /* {
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
- GtkWidget *dropper_rgba_label = gtk_label_new ("Color:");
- gtk_widget_show (dropper_rgba_label);
- gtk_container_add(GTK_CONTAINER(hb), dropper_rgba_label);
-
- dropper_rgb_entry = gtk_entry_new ();
- sp_dialog_defocus_on_enter (dropper_rgb_entry);
- gtk_entry_set_max_length (GTK_ENTRY (dropper_rgb_entry), 7);
- gtk_entry_set_width_chars (GTK_ENTRY (dropper_rgb_entry), 7);
- gtk_tooltips_set_tip(tt, dropper_rgb_entry,
- _("Hexidecimal representation of last selected "
- "color"),
- NULL);
- gtk_widget_show (dropper_rgb_entry);
- gtk_container_add(GTK_CONTAINER(hb), dropper_rgb_entry);
-
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
- } */
-
- /* Opacity Input Field */
-/* {
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
- GtkWidget *dropper_opacity_label = gtk_label_new ( _("Opacity:") );
- gtk_widget_show (dropper_opacity_label);
- gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_label);
-
- dropper_opacity_entry = gtk_entry_new ();
- sp_dialog_defocus_on_enter (dropper_opacity_entry);
- gtk_entry_set_max_length (GTK_ENTRY (dropper_opacity_entry), 11);
- gtk_entry_set_width_chars (GTK_ENTRY (dropper_opacity_entry), 11);
- gtk_tooltips_set_tip(tt, dropper_opacity_entry,
- _("Opacity of last selected color"),
- NULL);
- gtk_widget_show (dropper_opacity_entry);
- gtk_container_add(GTK_CONTAINER(hb), dropper_opacity_entry);
-
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
- } */
-
-
- /* Copy to Clipboard */
-/* {
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
- GtkWidget *b = gtk_button_new_with_label(_("Copy as RGBA"));
- gtk_tooltips_set_tip(tt, b, _("Copy last saved color as hexidecimal "
- "RGB + Alpha (RGBA) to "
- "clipboard"),
- NULL);
- gtk_widget_show(b);
- gtk_container_add(GTK_CONTAINER(hb), b);
- gtk_signal_connect(GTK_OBJECT(b), "clicked",
- GTK_SIGNAL_FUNC(sp_dropper_copy), tbl);
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
- } */
-
-
- /* Copy to Clipboard as HEX */
-/* {
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
- GtkWidget *b = gtk_button_new_with_label(_("Copy as HEX"));
- gtk_tooltips_set_tip(tt, b, _("Copy last saved color as "
- "hexidecimal RGB without alpha "
- "to clipboard"), NULL);
- gtk_widget_show(b);
- gtk_container_add(GTK_CONTAINER(hb), b);
- gtk_signal_connect(GTK_OBJECT(b), "clicked",
- GTK_SIGNAL_FUNC(sp_dropper_copy_as_hex), tbl);
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
- } */
-
- // aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
+ gint pickAlpha = prefs_get_int_attribute( "tools.dropper", "pick", 1 );
{
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
-
- GtkWidget *button = gtk_check_button_new_with_label(_("Pick alpha"));
- 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);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
- prefs_get_int_attribute ("tools.dropper",
- "pick", 1));
- gtk_widget_show(button);
- gtk_container_add (GTK_CONTAINER (hb), button);
- gtk_object_set_data(GTK_OBJECT(tbl), "pick_checkbox", button);
- g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_pick_alpha), tbl);
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
+ InkToggleAction* act = ink_toggle_action_new( "DropperPickAlphaAction",
+ _("Pick alpha"),
+ _("Pick both the color and the alpha (transparency) under cursor; otherwise, pick only the visible color premultiplied by alpha"),
+ "color_alpha_get",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ g_object_set_data( holder, "pick_action", act );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), pickAlpha );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_pick_alpha), holder );
}
{
- GtkWidget *hb = gtk_hbox_new(FALSE, 1);
-
- GtkWidget *button = gtk_check_button_new_with_label(_("Set alpha"));
- gtk_tooltips_set_tip(tt, button, _("If alpha was picked, assign it to selection as fill or stroke transparency"), NULL);
- gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (button),
- prefs_get_int_attribute ("tools.dropper",
- "setalpha", 1));
- gtk_widget_show(button);
- gtk_container_add (GTK_CONTAINER (hb), button);
- gtk_object_set_data(GTK_OBJECT(tbl), "set_checkbox", button);
- g_signal_connect (G_OBJECT (button), "toggled", G_CALLBACK (toggle_dropper_set_alpha), tbl);
-
+ InkToggleAction* act = ink_toggle_action_new( "DropperSetAlphaAction",
+ _("Set alpha"),
+ _("If alpha was picked, assign it to selection as fill or stroke transparency"),
+ "color_alpha_set",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+ g_object_set_data( holder, "set_action", act );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act), prefs_get_int_attribute( "tools.dropper", "setalpha", 1 ) );
// make sure it's disabled if we're not picking alpha
- GtkWidget *pick_checkbox = (GtkWidget*) g_object_get_data(G_OBJECT(tbl), "pick_checkbox");
- if (pick_checkbox) {
- if (gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (pick_checkbox))) {
- gtk_widget_set_sensitive (GTK_WIDGET (button), TRUE);
- } else {
- gtk_widget_set_sensitive (GTK_WIDGET (button), FALSE);
- }
- }
-
- gtk_box_pack_start(GTK_BOX(tbl), hb, FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
+ gtk_action_set_sensitive( GTK_ACTION(act), pickAlpha );
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(toggle_dropper_set_alpha), holder );
}
-
- aux_toolbox_space(tbl, AUX_BETWEEN_BUTTON_GROUPS);
-
-
- // where new gtkmm stuff should go
-
- gtk_widget_show_all(tbl);
- sp_set_font_size_smaller (tbl);
-
- /*
- sigc::connection *connection = new sigc::connection(
- desktop->connectSetStyle(
- sigc::bind(sigc::ptr_fun(sp_style_changed),
- desktop)) );
-
- g_signal_connect(G_OBJECT(tbl), "destroy", G_CALLBACK(delete_connection),
- connection); */
-
- return tbl;
}
void
sp_text_toolbox_selection_changed (Inkscape::Selection *selection, GObject *tbl)
{
-
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_family =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTFAMILY);
@@ -3371,6 +3445,8 @@ sp_text_toolbox_selection_changed (Inkscape::Selection *selection, GObject *tbl)
g_object_set_data (G_OBJECT (button), "block", gpointer(0));
g_object_set_data (G_OBJECT (button1), "block", gpointer(0));
}
+
+ sp_style_unref(query);
}
void
gtk_entry_set_text (GTK_ENTRY (entry), family);
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_numbers =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
sp_desktop_set_style (desktop, css, true, true);
}
+ sp_style_unref(query);
+
sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT,
_("Text: Change font family"));
sp_repr_css_attr_unref (css);
}
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_numbers =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
sp_repr_css_change (inkscape_get_repr (INKSCAPE, "tools.text"), css, "style");
}
+ sp_style_unref(query);
+
sp_desktop_set_style (desktop, css, true, true);
sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT,
_("Text: Change alignment"));
}
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_numbers =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
sp_repr_css_change (inkscape_get_repr (INKSCAPE, "tools.text"), css, "style");
}
+ sp_style_unref(query);
+
sp_desktop_set_style (desktop, css, true, true);
sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT,
_("Text: Change font style"));
}
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_numbers =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
free (text);
SPStyle *query =
- sp_style_new ();
+ sp_style_new (SP_ACTIVE_DOCUMENT);
int result_numbers =
sp_desktop_query_style (SP_ACTIVE_DESKTOP, query, QUERY_STYLE_PROPERTY_FONTNUMBERS);
sp_repr_css_change (inkscape_get_repr (INKSCAPE, "tools.text"), css, "style");
}
+ sp_style_unref(query);
+
sp_desktop_set_style (desktop, css, true, true);
sp_document_maybe_done (sp_desktop_document (SP_ACTIVE_DESKTOP), "ttb:size", SP_VERB_NONE,
_("Text: Change font size"));
-static void connector_spacing_changed(GtkAdjustment *adj, GtkWidget *tbl)
+static void connector_spacing_changed(GtkAdjustment *adj, GObject* tbl)
{
// quit if run by the _changed callbacks
- if (g_object_get_data(G_OBJECT(tbl), "freeze")) {
+ if (g_object_get_data( tbl, "freeze" )) {
return;
}
- SPDesktop *desktop = (SPDesktop *) gtk_object_get_data(GTK_OBJECT(tbl),
- "desktop");
+ SPDesktop *desktop = (SPDesktop *) g_object_get_data( tbl, "desktop" );
SPDocument *doc = sp_desktop_document(desktop);
if (!sp_document_get_undo_sensitive(doc))
return;
}
- // in turn, prevent callbacks from responding
- g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(TRUE));
-
Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);
+ if ( repr->attribute("inkscape:connector-spacing") ) {
+ gdouble priorValue = gtk_adjustment_get_value(adj);
+ sp_repr_get_double( repr, "inkscape:connector-spacing", &priorValue );
+ if ( priorValue == gtk_adjustment_get_value(adj) ) {
+ return;
+ }
+ } else if ( adj->value == defaultConnSpacing ) {
+ return;
+ }
+
+ // in turn, prevent callbacks from responding
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(TRUE) );
+
sp_repr_set_css_double(repr, "inkscape:connector-spacing", adj->value);
SP_OBJECT(desktop->namedview)->updateRepr();
sp_document_done(doc, SP_VERB_CONTEXT_CONNECTOR,
_("Change connector spacing"));
- g_object_set_data(G_OBJECT(tbl), "freeze", GINT_TO_POINTER(FALSE));
+ g_object_set_data( tbl, "freeze", GINT_TO_POINTER(FALSE) );
spinbutton_defocus(GTK_OBJECT(tbl));
}
sp_document_done(sp_desktop_document(SP_ACTIVE_DESKTOP), SP_VERB_DIALOG_ALIGN_DISTRIBUTE, _("Arrange connector network"));
}
-static void
-sp_directed_graph_layout_toggled(GtkWidget *widget, GtkObject *tbl)
+static void sp_directed_graph_layout_toggled( GtkToggleAction* act, GtkObject *tbl )
{
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+ if ( gtk_toggle_action_get_active( act ) ) {
prefs_set_string_attribute("tools.connector", "directedlayout",
"true");
} else {
"false");
}
}
-static void
-sp_nooverlaps_graph_layout_toggled(GtkWidget *widget, GtkObject *tbl)
+
+static void sp_nooverlaps_graph_layout_toggled( GtkToggleAction* act, GtkObject *tbl )
{
- if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
+ if ( gtk_toggle_action_get_active( act ) ) {
prefs_set_string_attribute("tools.connector", "avoidoverlaplayout",
"true");
} else {
}
-static void connector_length_changed(GtkAdjustment *adj, GtkWidget *tbl)
+static void connector_length_changed(GtkAdjustment *adj, GObject* tbl)
{
prefs_set_double_attribute("tools.connector", "length", adj->value);
spinbutton_defocus(GTK_OBJECT(tbl));
};
-static GtkWidget *
-sp_connector_toolbox_new(SPDesktop *desktop)
+static void sp_connector_toolbox_prep( SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder )
{
- GtkTooltips *tt = gtk_tooltips_new();
- GtkWidget *tbl = gtk_hbox_new(FALSE, 0);
-
- gtk_object_set_data(GTK_OBJECT(tbl), "dtw", desktop->canvas);
- gtk_object_set_data(GTK_OBJECT(tbl), "desktop", desktop);
-
- gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
-
- sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
- "connector_avoid", GTK_SIGNAL_FUNC(sp_connector_path_set_avoid),
- tt, _("Make connectors avoid selected objects"));
+ {
+ InkAction* inky = ink_action_new( "ConnectorAvoidAction",
+ _("Avoid"),
+ _("Make connectors avoid selected objects"),
+ "connector_avoid",
+ Inkscape::ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_avoid), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ }
- sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
- "connector_ignore", GTK_SIGNAL_FUNC(sp_connector_path_set_ignore),
- tt, _("Make connectors ignore selected objects"));
+ {
+ InkAction* inky = ink_action_new( "ConnectorIgnoreAction",
+ _("Ignore"),
+ _("Make connectors ignore selected objects"),
+ "connector_ignore",
+ Inkscape::ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_path_set_ignore), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
+ }
- // interval
- gtk_box_pack_start(GTK_BOX(tbl), gtk_hbox_new(FALSE, 0), FALSE, FALSE,
- AUX_BETWEEN_BUTTON_GROUPS);
+ EgeAdjustmentAction* eact = 0;
// Spacing spinbox
- {
- GtkWidget *object_spacing = sp_tb_spinbutton(_("Spacing:"),
- _("The amount of space left around objects by auto-routing connectors"),
- "tools.connector", "spacing", 10, NULL, tbl, TRUE,
- "inkscape:connector-spacing", 0, 100, 1.0, 10.0,
- connector_spacing_changed, 1, 0);
+ eact = create_adjustment_action( "ConnectorSpacingAction",
+ _("Spacing:"), _("The amount of space left around objects by auto-routing connectors"),
+ "tools.connector", "spacing", defaultConnSpacing,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-spacing",
+ 0, 100, 1.0, 10.0,
+ 0, 0, 0,
+ connector_spacing_changed, 1, 0 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
- gtk_box_pack_start(GTK_BOX(tbl), object_spacing, FALSE, FALSE,
- AUX_SPACING);
- }
// Graph (connector network) layout
- sp_toolbox_button_new(tbl, Inkscape::ICON_SIZE_SMALL_TOOLBAR,
- "graph_layout", GTK_SIGNAL_FUNC(sp_connector_graph_layout),
- tt, _("Nicely arrange selected connector network"));
- // Default connector length spinbox
{
- GtkWidget *connector_length = sp_tb_spinbutton(_("Length:"),
- _("Ideal length for connectors when layout is applied"),
- "tools.connector", "length", 100, NULL, tbl, TRUE,
- "inkscape:connector-length", 10, 1000, 10.0, 100.0,
- connector_length_changed, 1, 0);
-
- gtk_box_pack_start(GTK_BOX(tbl), connector_length, FALSE, FALSE,
- AUX_SPACING);
+ InkAction* inky = ink_action_new( "ConnectorGraphAction",
+ _("Graph"),
+ _("Nicely arrange selected connector network"),
+ "graph_layout",
+ Inkscape::ICON_SIZE_SMALL_TOOLBAR );
+ g_signal_connect_after( G_OBJECT(inky), "activate", G_CALLBACK(sp_connector_graph_layout), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(inky) );
}
- gchar const *tbuttonstate;
+
+ // Default connector length spinbox
+ eact = create_adjustment_action( "ConnectorLengthAction",
+ _("Length:"), _("Ideal length for connectors when layout is applied"),
+ "tools.connector", "length", 100,
+ GTK_WIDGET(desktop->canvas), NULL, holder, TRUE, "inkscape:connector-length",
+ 10, 1000, 10.0, 100.0,
+ 0, 0, 0,
+ connector_length_changed, 1, 0 );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
+
+
// Directed edges toggle button
{
- GtkWidget *tbutton = gtk_toggle_button_new ();
- gtk_button_set_relief (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
- gtk_container_add (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "directed_graph"));
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (tbutton), FALSE);
- gtk_tooltips_set_tip(tt, tbutton, _("Make connectors with end-markers (arrows) point downwards"), NULL);
-
- gtk_box_pack_start (GTK_BOX (tbl), tbutton, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_directed_graph_layout_toggled), tbl);
- tbuttonstate = prefs_get_string_attribute("tools.connector", "directedlayout");
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton),
- (tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
+ InkToggleAction* act = ink_toggle_action_new( "ConnectorDirectedAction",
+ _("Downwards"),
+ _("Make connectors with end-markers (arrows) point downwards"),
+ "directed_graph",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
+
+ gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "directedlayout" );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
+ (tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
+
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_directed_graph_layout_toggled), holder );
}
+
// Avoid overlaps toggle button
{
- GtkWidget *tbutton = gtk_toggle_button_new ();
- gtk_button_set_relief (GTK_BUTTON (tbutton), GTK_RELIEF_NONE);
- gtk_container_add (GTK_CONTAINER (tbutton), sp_icon_new (Inkscape::ICON_SIZE_SMALL_TOOLBAR, "remove_overlaps"));
- gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (tbutton), FALSE);
- gtk_tooltips_set_tip(tt, tbutton, _("Do not allow overlapping shapes"), NULL);
+ InkToggleAction* act = ink_toggle_action_new( "ConnectorOverlapAction",
+ _("Remove overlaps"),
+ _("Do not allow overlapping shapes"),
+ "remove_overlaps",
+ Inkscape::ICON_SIZE_DECORATION );
+ gtk_action_group_add_action( mainActions, GTK_ACTION( act ) );
- gtk_box_pack_start (GTK_BOX (tbl), tbutton, FALSE, FALSE, 0);
- g_signal_connect(G_OBJECT(tbutton), "toggled", GTK_SIGNAL_FUNC(sp_nooverlaps_graph_layout_toggled), tbl);
- tbuttonstate = prefs_get_string_attribute("tools.connector", "avoidoverlaplayout");
- gtk_toggle_button_set_active( GTK_TOGGLE_BUTTON(tbutton),
- (tbuttonstate && !strcmp(tbuttonstate, "true"))?TRUE:FALSE );
- }
+ gchar const* tbuttonstate = prefs_get_string_attribute( "tools.connector", "avoidoverlaplayout" );
+ gtk_toggle_action_set_active( GTK_TOGGLE_ACTION(act),
+ (tbuttonstate && !strcmp(tbuttonstate, "true")) ? TRUE:FALSE );
- gtk_widget_show_all(tbl);
- sp_set_font_size_smaller (tbl);
+ g_signal_connect_after( G_OBJECT(act), "toggled", G_CALLBACK(sp_nooverlaps_graph_layout_toggled), holder );
+ }
// Code to watch for changes to the connector-spacing attribute in
// the XML.
Inkscape::XML::Node *repr = SP_OBJECT_REPR(desktop->namedview);
g_assert(repr != NULL);
- Inkscape::XML::Node *oldrepr = (Inkscape::XML::Node *)
- gtk_object_get_data(GTK_OBJECT(tbl), "repr");
-
- if (oldrepr) { // remove old listener
- sp_repr_remove_listener_by_data(oldrepr, tbl);
- Inkscape::GC::release(oldrepr);
- oldrepr = NULL;
- g_object_set_data(G_OBJECT(tbl), "repr", NULL);
- }
+ purge_repr_listener( holder, holder );
if (repr) {
- g_object_set_data(G_OBJECT(tbl), "repr", repr);
+ g_object_set_data( holder, "repr", repr );
Inkscape::GC::anchor(repr);
- sp_repr_add_listener(repr, &connector_tb_repr_events, tbl);
- sp_repr_synthesize_events(repr, &connector_tb_repr_events, tbl);
+ sp_repr_add_listener( repr, &connector_tb_repr_events, holder );
+ sp_repr_synthesize_events( repr, &connector_tb_repr_events, holder );
}
-
- return tbl;
-
-} // end of sp_connector_toolbox_new()
+} // end of sp_connector_toolbox_prep()
static void paintbucket_channels_changed(EgeSelectOneAction* act, GObject* tbl)
{
prefs_set_int_attribute("tools.paintbucket", "threshold", (gint)adj->value);
}
+static void paintbucket_autogap_changed(EgeSelectOneAction* act, GObject *tbl)
+{
+ prefs_set_int_attribute("tools.paintbucket", "autogap", ege_select_one_action_get_active( act ));
+}
+
static void paintbucket_offset_changed(GtkAdjustment *adj, GObject *tbl)
{
UnitTracker* tracker = reinterpret_cast<UnitTracker*>(g_object_get_data( tbl, "tracker" ));
prefs_set_double_attribute("tools.paintbucket", "offset", (gdouble)sp_units_get_pixels(adj->value, *unit));
}
+static void paintbucket_defaults(GtkWidget *, GObject *dataKludge)
+{
+ // FIXME: make defaults settable via Inkscape Options
+ struct KeyValue {
+ char const *key;
+ double value;
+ } const key_values[] = {
+ {"threshold", 15},
+ {"offset", 0.0}
+ };
+
+ for (unsigned i = 0; i < G_N_ELEMENTS(key_values); ++i) {
+ KeyValue const &kv = key_values[i];
+ GtkAdjustment* adj = static_cast<GtkAdjustment *>(g_object_get_data(dataKludge, kv.key));
+ if ( adj ) {
+ gtk_adjustment_set_value(adj, kv.value);
+ }
+ }
+
+ EgeSelectOneAction* channels_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "channels_action" ) );
+ ege_select_one_action_set_active( channels_action, FLOOD_CHANNELS_RGB );
+ EgeSelectOneAction* autogap_action = EGE_SELECT_ONE_ACTION( g_object_get_data( dataKludge, "autogap_action" ) );
+ ege_select_one_action_set_active( autogap_action, 0 );
+}
+
static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder)
{
EgeAdjustmentAction* eact = 0;
@@ -4509,6 +4625,7 @@ static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* main
ege_select_one_action_set_active( act1, prefs_get_int_attribute("tools.paintbucket", "channels", 0) );
g_signal_connect( G_OBJECT(act1), "changed", G_CALLBACK(paintbucket_channels_changed), holder );
gtk_action_group_add_action( mainActions, GTK_ACTION(act1) );
+ g_object_set_data( holder, "channels_action", act1 );
}
// Spacing spinbox
@@ -4548,6 +4665,40 @@ static void sp_paintbucket_toolbox_prep(SPDesktop *desktop, GtkActionGroup* main
gtk_action_group_add_action( mainActions, GTK_ACTION(eact) );
}
+
+ /* Auto Gap */
+ {
+ GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT );
+
+ GList* items = 0;
+ gint count = 0;
+ for ( items = flood_autogap_dropdown_items_list(); items ; items = g_list_next(items) )
+ {
+ GtkTreeIter iter;
+ gtk_list_store_append( model, &iter );
+ gtk_list_store_set( model, &iter, 0, reinterpret_cast<gchar*>(items->data), 1, count, -1 );
+ count++;
+ }
+ g_list_free( items );
+ items = 0;
+ EgeSelectOneAction* act2 = ege_select_one_action_new( "AutoGapAction", _("Fill gaps:"), _(""), NULL, GTK_TREE_MODEL(model) );
+ ege_select_one_action_set_active( act2, prefs_get_int_attribute("tools.paintbucket", "autogap", 0) );
+ g_signal_connect( G_OBJECT(act2), "changed", G_CALLBACK(paintbucket_autogap_changed), holder );
+ gtk_action_group_add_action( mainActions, GTK_ACTION(act2) );
+ g_object_set_data( holder, "autogap_action", act2 );
+ }
+
+ /* Reset */
+ {
+ GtkAction* act = gtk_action_new( "PaintbucketResetAction",
+ _("Defaults"),
+ _("Reset paint bucket parameters to defaults (use Inkscape Preferences > Tools to change defaults)"),
+ GTK_STOCK_CLEAR );
+ g_signal_connect_after( G_OBJECT(act), "activate", G_CALLBACK(paintbucket_defaults), holder );
+ gtk_action_group_add_action( mainActions, act );
+ gtk_action_set_sensitive( act, TRUE );
+ }
+
}
/*