X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fwidgets%2Ftoolbox.cpp;h=07b388d140127087fdd2283e75babdc92a200168;hb=8b9a820756fdf348239872236be2257f854e094a;hp=53911e519b4d861e30375e70c0566528b10e3d40;hpb=020719809075415209a051d5b7e6013eb784c0a7;p=inkscape.git diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 53911e519..07b388d14 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -66,7 +66,7 @@ #include "connector-context.h" #include "node-context.h" -#include "draw-context.h" +#include "pen-context.h" #include "shape-editor.h" #include "tweak-context.h" #include "sp-rect.h" @@ -1097,18 +1097,18 @@ sp_node_toolbox_coord_changed(gpointer /*shape_editor*/, GObject *tbl) } else { gtk_action_set_sensitive(xact, TRUE); gtk_action_set_sensitive(yact, TRUE); - NR::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); - NR::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); + Geom::Coord oldx = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); + Geom::Coord oldy = sp_units_get_pixels(gtk_adjustment_get_value(xadj), *unit); if (n_selected == 1) { - NR::Point sel_node = nodepath->singleSelectedCoords(); - if (oldx != sel_node[NR::X] || oldy != sel_node[NR::Y]) { - gtk_adjustment_set_value(xadj, sp_pixels_get_units(sel_node[NR::X], *unit)); - gtk_adjustment_set_value(yadj, sp_pixels_get_units(sel_node[NR::Y], *unit)); + Geom::Point sel_node = nodepath->singleSelectedCoords(); + if (oldx != sel_node[Geom::X] || oldy != sel_node[Geom::Y]) { + gtk_adjustment_set_value(xadj, sp_pixels_get_units(sel_node[Geom::X], *unit)); + gtk_adjustment_set_value(yadj, sp_pixels_get_units(sel_node[Geom::Y], *unit)); } } else { - NR::Maybe x = sp_node_selected_common_coord(nodepath, NR::X); - NR::Maybe y = sp_node_selected_common_coord(nodepath, NR::Y); + boost::optional x = sp_node_selected_common_coord(nodepath, Geom::X); + boost::optional y = sp_node_selected_common_coord(nodepath, Geom::Y); if ((x && ((*x) != oldx)) || (y && ((*y) != oldy))) { /* Note: Currently x and y will always have a value, even if the coordinates of the selected nodes don't coincide (in this case we use the coordinates of the center @@ -1153,10 +1153,10 @@ sp_node_path_value_changed(GtkAdjustment *adj, GObject *tbl, gchar const *value_ if (shape_editor && shape_editor->has_nodepath()) { double val = sp_units_get_pixels(gtk_adjustment_get_value(adj), *unit); if (!strcmp(value_name, "x")) { - sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::X); + sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, Geom::X); } if (!strcmp(value_name, "y")) { - sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, NR::Y); + sp_node_selected_move_absolute(shape_editor->get_nodepath(), val, Geom::Y); } } @@ -3265,9 +3265,10 @@ static void sp_spiral_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActio } //######################## -//## Pen/Pencil ## +//## Pen/Pencil ## //######################## +/* This is used in generic functions below to share large portions of code between pen and pencil tool */ static char const * freehand_tool_name(GObject *dataKludge) { @@ -3277,18 +3278,27 @@ freehand_tool_name(GObject *dataKludge) : "tools.freehand.pencil" ); } -static void sp_pc_spiro_spline_mode_changed(EgeSelectOneAction* act, GObject* tbl) +static void freehand_mode_changed(EgeSelectOneAction* act, GObject* tbl) { - prefs_set_int_attribute(freehand_tool_name(tbl), "spiro-spline-mode", ege_select_one_action_get_active(act)); + gint mode = ege_select_one_action_get_active(act); + + prefs_set_int_attribute(freehand_tool_name(tbl), "freehand-mode", mode); + + SPDesktop *desktop = (SPDesktop *) g_object_get_data(tbl, "desktop"); + + // in pen tool we have more options than in pencil tool; if one of them was chosen, we do any + // preparatory work here + if (SP_IS_PEN_CONTEXT(desktop->event_context)) { + SPPenContext *pc = SP_PEN_CONTEXT(desktop->event_context); + pc->polylines_only = (mode == 2); + } } -static void sp_add_spiro_toggle(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil) +static void sp_add_freehand_mode_toggle(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil) { /* Freehand mode toggle buttons */ { - // FIXME: spiroMode seems not to be read correctly here during startup, although the - // correct mode is used in pen/pencil tool later on; same for freehand shapes - guint spiroMode = prefs_get_int_attribute(freehand_tool_name(holder), "spiro-spline-mode", 0); + guint freehandMode = prefs_get_int_attribute(tool_is_pencil ? "tools.freehand.pencil" : "tools.freehand.pen", "freehand-mode", 0); Inkscape::IconSize secondarySize = prefToSize("toolbox", "secondary", 1); { @@ -3309,6 +3319,15 @@ static void sp_add_spiro_toggle(GtkActionGroup* mainActions, GObject* holder, bo 2, "spiro_splines_mode", -1 ); + if (!tool_is_pencil) { + gtk_list_store_append( model, &iter ); + gtk_list_store_set( model, &iter, + 0, _("Zigzag"), + 1, _("Create a sequence of straight line segments"), + 2, "polylines_mode", + -1 ); + } + EgeSelectOneAction* act = ege_select_one_action_new(tool_is_pencil ? "FreehandModeActionPencil" : "FreehandModeActionPen", @@ -3322,13 +3341,13 @@ static void sp_add_spiro_toggle(GtkActionGroup* mainActions, GObject* holder, bo ege_select_one_action_set_icon_size( act, secondarySize ); ege_select_one_action_set_tooltip_column( act, 1 ); - ege_select_one_action_set_active( act, spiroMode); - g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(sp_pc_spiro_spline_mode_changed), holder); + ege_select_one_action_set_active( act, freehandMode); + g_signal_connect_after( G_OBJECT(act), "changed", G_CALLBACK(freehand_mode_changed), holder); } } } -static void sp_freehand_change_shape(EgeSelectOneAction* act, GObject *dataKludge) { +static void freehand_change_shape(EgeSelectOneAction* act, GObject *dataKludge) { gint shape = ege_select_one_action_get_active( act ); prefs_set_int_attribute(freehand_tool_name(dataKludge), "shape", shape); } @@ -3349,7 +3368,7 @@ GList * freehand_shape_dropdown_items_list() { } static void -sp_freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil) { +freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GObject* holder, bool tool_is_pencil) { /*advanced shape options */ { GtkListStore* model = gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_INT ); @@ -3370,8 +3389,8 @@ sp_freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GObject* hol _("Shape:"), ("Shape"), NULL, GTK_TREE_MODEL(model)); g_object_set( act1, "short_label", _("Shape:"), NULL ); ege_select_one_action_set_appearance( act1, "compact" ); - ege_select_one_action_set_active( act1, prefs_get_int_attribute(freehand_tool_name(holder), "shape", 0) ); - g_signal_connect( G_OBJECT(act1), "changed", G_CALLBACK(sp_freehand_change_shape), holder ); + ege_select_one_action_set_active( act1, prefs_get_int_attribute(tool_is_pencil ? "tools.freehand.pencil" : "tools.freehand.pen", "shape", 0) ); + g_signal_connect( G_OBJECT(act1), "changed", G_CALLBACK(freehand_change_shape), holder ); gtk_action_group_add_action( mainActions, GTK_ACTION(act1) ); g_object_set_data( holder, "shape_action", act1 ); } @@ -3379,8 +3398,8 @@ sp_freehand_add_advanced_shape_options(GtkActionGroup* mainActions, GObject* hol static void sp_pen_toolbox_prep(SPDesktop */*desktop*/, GtkActionGroup* mainActions, GObject* holder) { - sp_add_spiro_toggle(mainActions, holder, false); - sp_freehand_add_advanced_shape_options(mainActions, holder, false); + sp_add_freehand_mode_toggle(mainActions, holder, false); + freehand_add_advanced_shape_options(mainActions, holder, false); } @@ -3456,7 +3475,7 @@ static Inkscape::XML::NodeEventVector pencil_node_events = static void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActions, GObject* holder) { - sp_add_spiro_toggle(mainActions, holder, true); + sp_add_freehand_mode_toggle(mainActions, holder, true); EgeAdjustmentAction* eact = 0; @@ -3486,7 +3505,7 @@ static void sp_pencil_toolbox_prep(SPDesktop *desktop, GtkActionGroup* mainActio } /* advanced shape options */ - sp_freehand_add_advanced_shape_options(mainActions, holder, true); + freehand_add_advanced_shape_options(mainActions, holder, true); /* Reset */ { @@ -3929,8 +3948,7 @@ static void sp_ddc_tilt_state_changed( GtkToggleAction *act, GObject* tbl ) } -#define NUMBER_OF_PRESET_PARAMS 11 -static gchar * widget_names[NUMBER_OF_PRESET_PARAMS] = { +static gchar const *const widget_names[] = { "width", "mass", "wiggle", @@ -4030,8 +4048,8 @@ static void sp_dcc_save_profile (GtkWidget */*widget*/, GObject *tbl) g_free(profile_id); } - for (unsigned i = 0; i < NUMBER_OF_PRESET_PARAMS; ++i) { - gchar *widget_name = widget_names[i]; + for (unsigned i = 0; i < G_N_ELEMENTS(widget_names); ++i) { + gchar const *const widget_name = widget_names[i]; void *widget = g_object_get_data(tbl, widget_name); if (widget) { if (GTK_IS_ADJUSTMENT(widget)) { @@ -4075,7 +4093,7 @@ static void sp_ddc_change_profile(EgeSelectOneAction* act, GObject* tbl) { if (g_object_get_data(tbl, "presets_blocked")) return; - gchar *preset_path = get_pref_nth_child("tools.calligraphic.preset", preset_index); + gchar *const preset_path = get_pref_nth_child("tools.calligraphic.preset", preset_index); if (preset_path) { g_object_set_data(tbl, "presets_blocked", GINT_TO_POINTER(TRUE)); //temporarily block the selector so no one will updadte it while we're reading it @@ -4107,7 +4125,7 @@ static void sp_ddc_change_profile(EgeSelectOneAction* act, GObject* tbl) { g_warning("Bad key found in a preset record: %s\n", attr_name); } } - free(preset_path); + g_free(preset_path); g_object_set_data(tbl, "presets_blocked", GINT_TO_POINTER(FALSE)); } @@ -4942,12 +4960,14 @@ sp_text_toolbox_selection_changed (Inkscape::Selection */*selection*/, GObject * } //Size - GtkWidget *cbox = GTK_WIDGET (g_object_get_data (G_OBJECT (tbl), "combo-box-size")); - char *str = g_strdup_printf ("%.5g", query->font_size.computed); - g_object_set_data (tbl, "size-block", gpointer(1)); - gtk_entry_set_text (GTK_ENTRY(GTK_BIN (cbox)->child), str); - g_object_set_data (tbl, "size-block", gpointer(0)); - free (str); + { + GtkWidget *cbox = GTK_WIDGET(g_object_get_data(G_OBJECT(tbl), "combo-box-size")); + gchar *const str = g_strdup_printf("%.5g", query->font_size.computed); + g_object_set_data(tbl, "size-block", gpointer(1)); + gtk_entry_set_text(GTK_ENTRY(GTK_BIN(cbox)->child), str); + g_object_set_data(tbl, "size-block", gpointer(0)); + g_free(str); + } //Anchor if (query->text_align.computed == SP_CSS_TEXT_ALIGN_JUSTIFY) @@ -5142,7 +5162,7 @@ sp_text_toolbox_family_changed (GtkTreeSelection *selection, sp_document_done (sp_desktop_document (SP_ACTIVE_DESKTOP), SP_VERB_CONTEXT_TEXT, _("Text: Change font family")); sp_repr_css_attr_unref (css); - free (family); + g_free(family); gtk_widget_hide (GTK_WIDGET (g_object_get_data (G_OBJECT(tbl), "warning-image"))); gtk_widget_grab_focus (GTK_WIDGET(desktop->canvas)); @@ -5416,14 +5436,17 @@ sp_text_toolbox_size_changed (GtkComboBox *cbox, if (gtk_combo_box_get_active (cbox) < 0 && !g_object_get_data (tbl, "enter-pressed")) return; - gchar *endptr; gdouble value = -1; - char *text = gtk_combo_box_get_active_text (cbox); - if (text) { - value = g_strtod (text, &endptr); - if (endptr == text) // conversion failed, non-numeric input - value = -1; - free (text); + { + gchar *endptr; + gchar *const text = gtk_combo_box_get_active_text(cbox); + if (text) { + value = g_strtod(text, &endptr); + if (endptr == text) { // Conversion failed, non-numeric input. + value = -1; + } + g_free(text); + } } if (value <= 0) { return; // could not parse value @@ -5576,24 +5599,21 @@ cell_data_func (GtkTreeViewColumn */*column*/, GtkTreeIter *iter, gpointer /*data*/) { - char *family, - *family_escaped, - *sample_escaped; + gchar *family; + gtk_tree_model_get(tree_model, iter, 0, &family, -1); + gchar *const family_escaped = g_markup_escape_text(family, -1); - static const char *sample = _("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()"); - - gtk_tree_model_get (tree_model, iter, 0, &family, -1); - - family_escaped = g_markup_escape_text (family, -1); - sample_escaped = g_markup_escape_text (sample, -1); + static char const *const sample = _("AaBbCcIiPpQq12369$\342\202\254\302\242?.;/()"); + gchar *const sample_escaped = g_markup_escape_text(sample, -1); std::stringstream markup; - markup << family_escaped << " " << sample_escaped << ""; + markup << family_escaped << " " << sample_escaped << ""; g_object_set (G_OBJECT (cell), "markup", markup.str().c_str(), NULL); - free (family); - free (family_escaped); - free (sample_escaped); + g_free(family); + g_free(family_escaped); + g_free(sample_escaped); } static void delete_completion(GObject */*obj*/, GtkWidget *entry) { @@ -5692,14 +5712,16 @@ sp_text_toolbox_new (SPDesktop *desktop) g_signal_connect_swapped (G_OBJECT (tbl), "show", G_CALLBACK (gtk_widget_hide), box); ////////////Size - const char *sizes[] = { + gchar const *const sizes[] = { "4", "6", "8", "9", "10", "11", "12", "13", "14", "16", "18", "20", "22", "24", "28", "32", "36", "40", "48", "56", "64", "72", "144" }; GtkWidget *cbox = gtk_combo_box_entry_new_text (); - for (unsigned int n = 0; n < G_N_ELEMENTS (sizes); gtk_combo_box_append_text (GTK_COMBO_BOX(cbox), sizes[n++])); + for (unsigned int i = 0; i < G_N_ELEMENTS(sizes); ++i) { + gtk_combo_box_append_text(GTK_COMBO_BOX(cbox), sizes[i]); + } gtk_widget_set_size_request (cbox, 80, -1); gtk_toolbar_append_widget( tbl, cbox, "", ""); g_object_set_data (G_OBJECT (tbl), "combo-box-size", cbox);