X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fgradient-context.cpp;h=fc5c1af446593c0db42626003aab45e8d9ec11bc;hb=b63477f37e705766e07ed720a7df566a2decbe1e;hp=2a4d3c91dfa3a2695387e761ae2e8357fe91bcd7;hpb=f8f1765c7dd464ed47e31b46842cca451959af7e;p=inkscape.git diff --git a/src/gradient-context.cpp b/src/gradient-context.cpp index 2a4d3c91d..fc5c1af44 100644 --- a/src/gradient-context.cpp +++ b/src/gradient-context.cpp @@ -32,7 +32,7 @@ #include "gradient-context.h" #include "gradient-chemistry.h" #include -#include "prefs-utils.h" +#include "preferences.h" #include "gradient-drag.h" #include "gradient-chemistry.h" #include "xml/repr.h" @@ -57,7 +57,7 @@ static void sp_gradient_context_setup(SPEventContext *ec); static gint sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event); -static void sp_gradient_drag(SPGradientContext &rc, NR::Point const pt, guint state, guint32 etime); +static void sp_gradient_drag(SPGradientContext &rc, Geom::Point const pt, guint state, guint32 etime); static SPEventContextClass *parent_class; @@ -140,13 +140,16 @@ const gchar *gr_handle_descr [] = { N_("Radial gradient mid stop") }; -static void +static void gradient_selection_changed (Inkscape::Selection *, gpointer data) { SPGradientContext *rc = (SPGradientContext *) data; GrDrag *drag = rc->_grdrag; Inkscape::Selection *selection = sp_desktop_selection(SP_EVENT_CONTEXT(rc)->desktop); + if (selection == NULL) { + return; + } guint n_obj = g_slist_length((GSList *) selection->itemList()); if (!drag->isNonEmpty() || selection->isEmpty()) @@ -154,20 +157,37 @@ gradient_selection_changed (Inkscape::Selection *, gpointer data) guint n_tot = drag->numDraggers(); guint n_sel = drag->numSelected(); + //The use of ngettext in the following code is intentional even if the English singular form would never be used if (n_sel == 1) { if (drag->singleSelectedDraggerNumDraggables() == 1) { - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, - ngettext("%s selected out of %d gradient handles on %d selected object","%s selected out of %d gradient handles on %d selected objects",n_obj), gr_handle_descr[drag->singleSelectedDraggerSingleDraggableType()], n_tot, n_obj); + gchar * message = g_strconcat( + //TRANSLATORS: %s will be substituted with the point name (see previous messages); This is part of a compound message + _("%s selected"), + //TRANSLATORS: Mind the space in front. This is part of a compound message + ngettext(" out of %d gradient handle"," out of %d gradient handles",n_tot), + ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); + rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, + message,_(gr_handle_descr[drag->singleSelectedDraggerSingleDraggableType()]), n_tot, n_obj); } else { - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, - _("One handle merging %d stops (drag with Shift to separate) selected out of %d gradient handles on %d selected object(s)"), drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); + gchar * message = g_strconcat( + //TRANSLATORS: This is a part of a compound message (out of two more indicating: grandint handle count & object count) + ngettext("One handle merging %d stop (drag with Shift to separate) selected", + "One handle merging %d stops (drag with Shift to separate) selected",drag->singleSelectedDraggerNumDraggables()), + ngettext(" out of %d gradient handle"," out of %d gradient handles",n_tot), + ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); + rc->_message_context->setF(Inkscape::NORMAL_MESSAGE,message,drag->singleSelectedDraggerNumDraggables(), n_tot, n_obj); } } else if (n_sel > 1) { - rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, - _("%d gradient handles selected out of %d on %d selected object(s)"), n_sel, n_tot, n_obj); + //TRANSLATORS: The plural refers to number of selected gradient handles. This is part of a compound message (part two indicates selected object count) + gchar * message = g_strconcat(ngettext("%d gradient handle selected out of %d","%d gradient handles selected out of %d",n_sel), + //TRANSLATORS: Mind the space in front. (Refers to gradient handles selected). This is part of a compound message + ngettext(" on %d selected object"," on %d selected objects",n_obj),NULL); + rc->_message_context->setF(Inkscape::NORMAL_MESSAGE,message, n_sel, n_tot, n_obj); } else if (n_sel == 0) { rc->_message_context->setF(Inkscape::NORMAL_MESSAGE, - _("No gradient handles selected out of %d on %d selected object(s)"), n_tot, n_obj); + //TRANSLATORS: The plural refers to number of selected objects + ngettext("No gradient handles selected out of %d on %d selected object", + "No gradient handles selected out of %d on %d selected objects",n_obj), n_tot, n_obj); } } @@ -186,7 +206,8 @@ static void sp_gradient_context_setup(SPEventContext *ec) ((SPEventContextClass *) parent_class)->setup(ec); } - if (prefs_get_int_attribute("tools.gradient", "selcue", 1) != 0) { + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (prefs->getBool("/tools/gradient/selcue", true)) { ec->enableSelectionCue(); } @@ -208,7 +229,7 @@ sp_gradient_context_select_next (SPEventContext *event_context) GrDragger *d = drag->select_next(); - event_context->desktop->scroll_to_point(&(d->point), 1.0); + event_context->desktop->scroll_to_point(d->point, 1.0); } void @@ -219,11 +240,11 @@ sp_gradient_context_select_prev (SPEventContext *event_context) GrDragger *d = drag->select_prev(); - event_context->desktop->scroll_to_point(&(d->point), 1.0); + event_context->desktop->scroll_to_point(d->point, 1.0); } static bool -sp_gradient_context_is_over_line (SPGradientContext *rc, SPItem *item, NR::Point event_p) +sp_gradient_context_is_over_line (SPGradientContext *rc, SPItem *item, Geom::Point event_p) { SPDesktop *desktop = SP_EVENT_CONTEXT (rc)->desktop; @@ -232,8 +253,8 @@ sp_gradient_context_is_over_line (SPGradientContext *rc, SPItem *item, NR::Point SPCtrlLine* line = SP_CTRLLINE(item); - NR::Point nearest = snap_vector_midpoint (rc->mousepoint_doc, line->s, line->e, 0); - double dist_screen = NR::L2 (rc->mousepoint_doc - nearest) * desktop->current_zoom(); + Geom::Point nearest = snap_vector_midpoint (rc->mousepoint_doc, line->s, line->e, 0); + double dist_screen = Geom::L2 (rc->mousepoint_doc - nearest) * desktop->current_zoom(); double tolerance = (double) SP_EVENT_CONTEXT(rc)->tolerance; @@ -242,10 +263,10 @@ sp_gradient_context_is_over_line (SPGradientContext *rc, SPItem *item, NR::Point return close; } -std::vector +std::vector sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSList **next_stops) { - std::vector coords; + std::vector coords; // for all selected draggers for (GList *i = drag->selected; i != NULL; i = i->next) { @@ -253,7 +274,7 @@ sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSLi // remember the coord of the dragger to reselect it later coords.push_back(dragger->point); // for all draggables of dragger - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { + for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { GrDraggable *d = (GrDraggable *) j->data; // find the gradient @@ -261,9 +282,9 @@ sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSLi SPGradient *vector = sp_gradient_get_forked_vector_if_necessary (gradient, false); // these draggable types cannot have a next draggabe to insert a stop between them - if (d->point_type == POINT_LG_END || - d->point_type == POINT_RG_FOCUS || - d->point_type == POINT_RG_R1 || + if (d->point_type == POINT_LG_END || + d->point_type == POINT_RG_FOCUS || + d->point_type == POINT_RG_R1 || d->point_type == POINT_RG_R2) { continue; } @@ -281,7 +302,7 @@ sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSLi // if there's a next stop, if (next_stop) { GrDragger *dnext = NULL; - // find its dragger + // find its dragger // (complex because it may have different types, and because in radial, // more than one dragger may correspond to a stop, so we must distinguish) if (type == POINT_LG_BEGIN || type == POINT_LG_MID) { @@ -293,14 +314,14 @@ sp_gradient_context_get_stop_intervals (GrDrag *drag, GSList **these_stops, GSLi if (type == POINT_RG_CENTER || type == POINT_RG_MID1) { if (next_stop == last_stop) dnext = drag->getDraggerFor (item, POINT_RG_R1, p_i+1, fs); - else + else dnext = drag->getDraggerFor (item, POINT_RG_MID1, p_i+1, fs); - } - if ((type == POINT_RG_MID2) || + } + if ((type == POINT_RG_MID2) || (type == POINT_RG_CENTER && dnext && !dnext->isSelected())) { if (next_stop == last_stop) dnext = drag->getDraggerFor (item, POINT_RG_R2, p_i+1, fs); - else + else dnext = drag->getDraggerFor (item, POINT_RG_MID2, p_i+1, fs); } } @@ -331,12 +352,12 @@ sp_gradient_context_add_stops_between_selected_stops (SPGradientContext *rc) GSList *these_stops = NULL; GSList *next_stops = NULL; - std::vector coords = sp_gradient_context_get_stop_intervals (drag, &these_stops, &next_stops); + std::vector coords = sp_gradient_context_get_stop_intervals (drag, &these_stops, &next_stops); if (g_slist_length(these_stops) == 0 && drag->numSelected() == 1) { // if a single stop is selected, add between that stop and the next one GrDragger *dragger = (GrDragger *) drag->selected->data; - for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { + for (GSList const* j = dragger->draggables; j != NULL; j = j->next) { GrDraggable *d = (GrDraggable *) j->data; SPGradient *gradient = sp_item_gradient (d->item, d->fill_or_stroke); SPGradient *vector = sp_gradient_get_forked_vector_if_necessary (gradient, false); @@ -388,7 +409,7 @@ sp_gradient_simplify(SPGradientContext *rc, double tolerance) GSList *these_stops = NULL; GSList *next_stops = NULL; - std::vector coords = sp_gradient_context_get_stop_intervals (drag, &these_stops, &next_stops); + std::vector coords = sp_gradient_context_get_stop_intervals (drag, &these_stops, &next_stops); GSList *todel = NULL; @@ -410,10 +431,10 @@ sp_gradient_simplify(SPGradientContext *rc, double tolerance) guint32 const c0 = sp_stop_get_rgba32(stop0); guint32 const c2 = sp_stop_get_rgba32(stop2); guint32 const c1r = sp_stop_get_rgba32(stop1); - guint32 c1 = average_color (c0, c2, + guint32 c1 = average_color (c0, c2, (stop1->offset - stop0->offset) / (stop2->offset - stop0->offset)); - double diff = + double diff = sqr(SP_RGBA32_R_F(c1) - SP_RGBA32_R_F(c1r)) + sqr(SP_RGBA32_G_F(c1) - SP_RGBA32_G_F(c1r)) + sqr(SP_RGBA32_B_F(c1) - SP_RGBA32_B_F(c1r)) + @@ -446,7 +467,7 @@ sp_gradient_simplify(SPGradientContext *rc, double tolerance) static void -sp_gradient_context_add_stop_near_point (SPGradientContext *rc, SPItem *item, NR::Point mouse_p, guint32 /*etime*/) +sp_gradient_context_add_stop_near_point (SPGradientContext *rc, SPItem *item, Geom::Point mouse_p, guint32 /*etime*/) { // item is the selected item. mouse_p the location in doc coordinates of where to add the stop @@ -471,11 +492,12 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) SPDesktop *desktop = event_context->desktop; Inkscape::Selection *selection = sp_desktop_selection (desktop); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); SPGradientContext *rc = SP_GRADIENT_CONTEXT(event_context); - event_context->tolerance = prefs_get_int_attribute_limited("options.dragtolerance", "value", 0, 0, 100); - double const nudge = prefs_get_double_attribute_limited("options.nudgedistance", "value", 2, 0, 1000); // in px + event_context->tolerance = prefs->getIntLimited("/options/dragtolerance/value", 0, 0, 100); + double const nudge = prefs->getDoubleLimited("/options/nudgedistance/value", 2, 0, 1000); // in px GrDrag *drag = event_context->_grdrag; g_assert (drag); @@ -489,7 +511,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) if (drag->lines) { for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { line = (SPCtrlLine*) l->data; - over_line |= sp_gradient_context_is_over_line (rc, (SPItem*) line, NR::Point(event->motion.x, event->motion.y)); + over_line |= sp_gradient_context_is_over_line (rc, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); } } if (over_line) { @@ -499,8 +521,8 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) } else { for (GSList const* i = selection->itemList(); i != NULL; i = i->next) { SPItem *item = SP_ITEM(i->data); - SPGradientType new_type = (SPGradientType) prefs_get_int_attribute ("tools.gradient", "newgradient", SP_GRADIENT_TYPE_LINEAR); - guint new_fill = prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1); + SPGradientType new_type = (SPGradientType) prefs->getInt("/tools/gradient/newgradient", SP_GRADIENT_TYPE_LINEAR); + guint new_fill = prefs->getInt("/tools/gradient/newfillorstroke", 1); SPGradient *vector = sp_gradient_vector_for_object(sp_desktop_document(desktop), desktop, SP_OBJECT (item), new_fill); @@ -516,27 +538,28 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) break; case GDK_BUTTON_PRESS: if ( event->button.button == 1 && !event_context->space_panning ) { - NR::Point const button_w(event->button.x, event->button.y); + Geom::Point button_w(event->button.x, event->button.y); // save drag origin - event_context->xp = (gint) button_w[NR::X]; - event_context->yp = (gint) button_w[NR::Y]; + event_context->xp = (gint) button_w[Geom::X]; + event_context->yp = (gint) button_w[Geom::Y]; event_context->within_tolerance = true; dragging = true; - NR::Point const button_dt = desktop->w2d(button_w); + Geom::Point button_dt = to_2geom(desktop->w2d(button_w)); if (event->button.state & GDK_SHIFT_MASK) { - Inkscape::Rubberband::get()->start(desktop, button_dt); + Inkscape::Rubberband::get(desktop)->start(desktop, from_2geom(button_dt)); } else { // remember clicked item, disregarding groups, honoring Alt; do nothing with Crtl to // enable Ctrl+doubleclick of exactly the selected item(s) if (!(event->button.state & GDK_CONTROL_MASK)) event_context->item_to_select = sp_event_context_find_item (desktop, button_w, event->button.state & GDK_MOD1_MASK, TRUE); - /* Snap center to nearest magnetic point */ - SnapManager const &m = desktop->namedview->snap_manager; - rc->origin = m.freeSnap(Inkscape::Snapper::SNAPPOINT_NODE, button_dt, NULL).getPoint(); + SnapManager &m = desktop->namedview->snap_manager; + m.setup(desktop); + m.freeSnapReturnByRef(Inkscape::SnapPreferences::SNAPPOINT_NODE, button_dt, Inkscape::SNAPSOURCE_HANDLE); + rc->origin = from_2geom(button_dt); } ret = TRUE; @@ -556,12 +579,12 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) // motion notify coordinates as given (no snapping back to origin) event_context->within_tolerance = false; - NR::Point const motion_w(event->motion.x, + Geom::Point const motion_w(event->motion.x, event->motion.y); - NR::Point const motion_dt = event_context->desktop->w2d(motion_w); + Geom::Point const motion_dt = event_context->desktop->w2d(motion_w); - if (Inkscape::Rubberband::get()->is_started()) { - Inkscape::Rubberband::get()->move(motion_dt); + if (Inkscape::Rubberband::get(desktop)->is_started()) { + Inkscape::Rubberband::get(desktop)->move(motion_dt); event_context->defaultMessageContext()->set(Inkscape::NORMAL_MESSAGE, _("Draw around handles to select them")); } else { sp_gradient_drag(*rc, motion_dt, event->motion.state, event->motion.time); @@ -573,7 +596,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) bool over_line = false; if (drag->lines) { for (GSList *l = drag->lines; l != NULL; l = l->next) { - over_line |= sp_gradient_context_is_over_line (rc, (SPItem*) l->data, NR::Point(event->motion.x, event->motion.y)); + over_line |= sp_gradient_context_is_over_line (rc, (SPItem*) l->data, Geom::Point(event->motion.x, event->motion.y)); } } @@ -597,7 +620,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) if (drag->lines) { for (GSList *l = drag->lines; (l != NULL) && (!over_line); l = l->next) { line = (SPCtrlLine*) l->data; - over_line = sp_gradient_context_is_over_line (rc, (SPItem*) line, NR::Point(event->motion.x, event->motion.y)); + over_line = sp_gradient_context_is_over_line (rc, (SPItem*) line, Geom::Point(event->motion.x, event->motion.y)); if (over_line) break; } @@ -609,7 +632,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) } else { dragging = false; - // unless clicked with Ctrl (to enable Ctrl+doubleclick). + // unless clicked with Ctrl (to enable Ctrl+doubleclick). if (event->button.state & GDK_CONTROL_MASK) { ret = TRUE; break; @@ -618,11 +641,11 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) if (!event_context->within_tolerance) { // we've been dragging, either do nothing (grdrag handles that), // or rubberband-select if we have rubberband - Inkscape::Rubberband::Rubberband *r = Inkscape::Rubberband::get(); + Inkscape::Rubberband::Rubberband *r = Inkscape::Rubberband::get(desktop); if (r->is_started() && !event_context->within_tolerance) { // this was a rubberband drag if (r->getMode() == RUBBERBAND_MODE_RECT) { - NR::Maybe const b = r->getRectangle(); + Geom::OptRect const b = r->getRectangle(); drag->selectRect(*b); } } @@ -646,7 +669,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) event_context->item_to_select = NULL; ret = TRUE; } - Inkscape::Rubberband::get()->stop(); + Inkscape::Rubberband::get(desktop)->stop(); } break; case GDK_KEY_PRESS: @@ -834,7 +857,7 @@ sp_gradient_context_root_handler(SPEventContext *event_context, GdkEvent *event) return ret; } -static void sp_gradient_drag(SPGradientContext &rc, NR::Point const pt, guint /*state*/, guint32 etime) +static void sp_gradient_drag(SPGradientContext &rc, Geom::Point const pt, guint /*state*/, guint32 etime) { SPDesktop *desktop = SP_EVENT_CONTEXT(&rc)->desktop; Inkscape::Selection *selection = sp_desktop_selection(desktop); @@ -842,8 +865,9 @@ static void sp_gradient_drag(SPGradientContext &rc, NR::Point const pt, guint /* SPEventContext *ec = SP_EVENT_CONTEXT(&rc); if (!selection->isEmpty()) { - int type = prefs_get_int_attribute ("tools.gradient", "newgradient", 1); - int fill_or_stroke = prefs_get_int_attribute ("tools.gradient", "newfillorstroke", 1); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + int type = prefs->getInt("/tools/gradient/newgradient", 1); + int fill_or_stroke = prefs->getInt("/tools/gradient/newfillorstroke", 1); SPGradient *vector; if (ec->item_to_select) {