From 31bb8269c26a781036448ed8f8cd93cc84fb2118 Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Sun, 29 Nov 2009 16:33:18 +0100 Subject: First GSoC node tool commit to Bazaar (bzr r8846.1.1) --- src/selection-chemistry.cpp | 89 ++++++++++++++++++++++----------------------- 1 file changed, 43 insertions(+), 46 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index e55bba2a5..a9736e991 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -88,9 +88,7 @@ // For clippath editing #include "tools-switch.h" -#include "shape-editor.h" -#include "node-context.h" -#include "nodepath.h" +#include "ui/tool/node-tool.h" #include "ui/clipboard.h" @@ -1716,53 +1714,52 @@ void sp_selection_next_patheffect_param(SPDesktop * dt) } } +/*bool has_path_recursive(SPObject *obj) +{ + if (!obj) return false; + if (SP_IS_PATH(obj)) { + return true; + } + if (SP_IS_GROUP(obj) || SP_IS_OBJECTGROUP(obj)) { + for (SPObject *c = obj->children; c; c = c->next) { + if (has_path_recursive(c)) return true; + } + } + return false; +}*/ + void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip) { - if (!dt) return; + return; + /*if (!dt) return; + using namespace Inkscape::UI; Inkscape::Selection *selection = sp_desktop_selection(dt); - if ( selection && !selection->isEmpty() ) { - SPItem *item = selection->singleItem(); - if ( item ) { - SPObject *obj = NULL; - if (clip) - obj = item->clip_ref ? SP_OBJECT(item->clip_ref->getObject()) : NULL; - else - obj = item->mask_ref ? SP_OBJECT(item->mask_ref->getObject()) : NULL; - - if (obj) { - // obj is a group object, the children are the actual clippers - for ( SPObject *child = obj->children ; child ; child = child->next ) { - if ( SP_IS_ITEM(child) ) { - // If not already in nodecontext, goto it! - if (!tools_isactive(dt, TOOLS_NODES)) { - tools_switch(dt, TOOLS_NODES); - } - - ShapeEditor * shape_editor = dt->event_context->shape_editor; - // TODO: should we set the item for nodepath or knotholder or both? seems to work with both. - shape_editor->set_item(SP_ITEM(child), SH_NODEPATH); - shape_editor->set_item(SP_ITEM(child), SH_KNOTHOLDER); - Inkscape::NodePath::Path *np = shape_editor->get_nodepath(); - if (np) { - // take colors from prefs (same as used in outline mode) - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - np->helperpath_rgba = clip ? - prefs->getInt("/options/wireframecolors/clips", 0x00ff00ff) : - prefs->getInt("/options/wireframecolors/masks", 0x0000ffff); - np->helperpath_width = 1.0; - sp_nodepath_show_helperpath(np, true); - } - break; // break out of for loop after 1st encountered item - } - } - } else if (clip) { - dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("The selection has no applied clip path.")); - } else { - dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("The selection has no applied mask.")); - } - } - } + if (!selection || selection->isEmpty()) return; + + GSList const *items = selection->itemList(); + bool has_path = false; + for (GSList *i = const_cast(items); i; i= i->next) { + SPItem *item = SP_ITEM(i->data); + SPObject *search = clip + ? SP_OBJECT(item->clip_ref ? item->clip_ref->getObject() : NULL) + : SP_OBJECT(item->mask_ref ? item->mask_ref->getObject() : NULL); + has_path |= has_path_recursive(search); + if (has_path) break; + } + if (has_path) { + if (!tools_isactive(dt, TOOLS_NODES)) { + tools_switch(dt, TOOLS_NODES); + } + ink_node_tool_set_mode(INK_NODE_TOOL(dt->event_context), + clip ? NODE_TOOL_EDIT_CLIPPING_PATHS : NODE_TOOL_EDIT_MASKS); + } else if (clip) { + dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, + _("The selection has no applied clip path.")); + } else { + dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, + _("The selection has no applied mask.")); + }*/ } -- cgit v1.2.3 From 59ac8467a1a2655b42c04e92d10d3283bab17205 Mon Sep 17 00:00:00 2001 From: Josh Andler Date: Thu, 7 Jan 2010 21:43:33 -0800 Subject: Patch by Alex Leone to add margins to resize page options in Document Properties (bzr r8952) --- src/selection-chemistry.cpp | 25 ++++++++++++++++++------- 1 file changed, 18 insertions(+), 7 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 31e899d8a..d97687267 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -2932,10 +2932,12 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { } /** - * Returns true if an undoable change should be recorded. + * \param with_margins margins defined in the xml under + * "fit-margin-..." attributes. See SPDocument::fitToRect. + * \return true if an undoable change should be recorded. */ bool -fit_canvas_to_selection(SPDesktop *desktop) +fit_canvas_to_selection(SPDesktop *desktop, bool with_margins) { g_return_val_if_fail(desktop != NULL, false); SPDocument *doc = sp_desktop_document(desktop); @@ -2949,7 +2951,7 @@ fit_canvas_to_selection(SPDesktop *desktop) } Geom::OptRect const bbox(desktop->selection->bounds()); if (bbox) { - doc->fitToRect(*bbox); + doc->fitToRect(*bbox, with_margins); return true; } else { return false; @@ -2968,8 +2970,12 @@ verb_fit_canvas_to_selection(SPDesktop *const desktop) } } +/** + * \param with_margins margins defined in the xml under + * "fit-margin-..." attributes. See SPDocument::fitToRect. + */ bool -fit_canvas_to_drawing(SPDocument *doc) +fit_canvas_to_drawing(SPDocument *doc, bool with_margins) { g_return_val_if_fail(doc != NULL, false); @@ -2977,7 +2983,7 @@ fit_canvas_to_drawing(SPDocument *doc) SPItem const *const root = SP_ITEM(doc->root); Geom::OptRect const bbox(root->getBounds(sp_item_i2d_affine(root))); if (bbox) { - doc->fitToRect(*bbox); + doc->fitToRect(*bbox, with_margins); return true; } else { return false; @@ -2993,6 +2999,11 @@ verb_fit_canvas_to_drawing(SPDesktop *desktop) } } +/** + * Fits canvas to selection or drawing with margins from + * "fit-margin-..." attributes. See SPDocument::fitToRect and + * ui/dialog/page-sizer. + */ void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) { g_return_if_fail(desktop != NULL); SPDocument *doc = sp_desktop_document(desktop); @@ -3001,8 +3012,8 @@ void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) { g_return_if_fail(desktop->selection != NULL); bool const changed = ( desktop->selection->isEmpty() - ? fit_canvas_to_drawing(doc) - : fit_canvas_to_selection(desktop) ); + ? fit_canvas_to_drawing(doc, true) + : fit_canvas_to_selection(desktop, true) ); if (changed) { sp_document_done(sp_desktop_document(desktop), SP_VERB_FIT_CANVAS_TO_SELECTION_OR_DRAWING, _("Fit Page to Selection or Drawing")); -- cgit v1.2.3 From 2ab01d69f9d427bdf3536e1508a465372cd040c6 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Thu, 14 Jan 2010 17:02:46 -0800 Subject: Warning cleanup. (bzr r8981) --- src/selection-chemistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index d4978af3b..dfe47bee8 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1751,7 +1751,7 @@ void sp_selection_next_patheffect_param(SPDesktop * dt) return false; }*/ -void sp_selection_edit_clip_or_mask(SPDesktop * dt, bool clip) +void sp_selection_edit_clip_or_mask(SPDesktop * /*dt*/, bool /*clip*/) { return; /*if (!dt) return; -- cgit v1.2.3 From 23eacbbc876cdef12857ca48725cee350ed4696f Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Thu, 14 Jan 2010 22:45:34 -0800 Subject: Restore encapsulation of selection implementation. (bzr r8983) --- src/selection-chemistry.cpp | 109 ++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 106 insertions(+), 3 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index dfe47bee8..e81d133c2 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1,5 +1,3 @@ -#define __SP_SELECTION_CHEMISTRY_C__ - /** @file * @brief Miscellanous operations on selected items */ @@ -9,8 +7,9 @@ * MenTaLguY * bulia byak * Andrius R. + * Jon A. Cruz * - * Copyright (C) 1999-2006 authors + * Copyright (C) 1999-2010 authors * Copyright (C) 2001-2002 Ximian, Inc. * * Released under GNU GPL, read the file 'COPYING' for more information @@ -22,6 +21,10 @@ #include "selection-chemistry.h" +// TOOD fixme: This should be moved into preference repr +SPCycleType SP_CYCLING = SP_CYCLE_FOCUS; + + #include #include "svg/svg.h" @@ -61,6 +64,7 @@ #include "sp-linear-gradient-fns.h" #include "sp-pattern.h" #include "sp-radial-gradient-fns.h" +#include "gradient-context.h" #include "sp-namedview.h" #include "preferences.h" #include "sp-offset.h" @@ -86,6 +90,9 @@ #include "display/curve.h" #include "display/canvas-bpath.h" #include "inkscape-private.h" +#include "path-chemistry.h" +#include "ui/tool/control-point-selection.h" +#include "ui/tool/multi-path-manipulator.h" // For clippath editing #include "tools-switch.h" @@ -100,6 +107,102 @@ using Geom::Y; because the layer manipulation code uses them. It should be rewritten specifically for that purpose. */ + + +namespace Inkscape { + +void SelectionHelper::selectAll(SPDesktop *dt) +{ + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_multipath->selectSubpaths(); + } else { + sp_edit_select_all(dt); + } +} + +void SelectionHelper::selectAllInAll(SPDesktop *dt) +{ + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_selected_nodes->selectAll(); + } else { + sp_edit_select_all_in_all_layers(dt); + } +} + +void SelectionHelper::selectNone(SPDesktop *dt) +{ + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_selected_nodes->clear(); + } else { + sp_desktop_selection(dt)->clear(); + } +} + +void SelectionHelper::invert(SPDesktop *dt) +{ + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_multipath->invertSelectionInSubpaths(); + } else { + sp_edit_invert(dt); + } +} + +void SelectionHelper::invertAllInAll(SPDesktop *dt) +{ + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_selected_nodes->invertSelection(); + } else { + sp_edit_invert_in_all_layers(dt); + } +} + +void SelectionHelper::reverse(SPDesktop *dt) +{ + // TODO make this a virtual method of event context! + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_multipath->reverseSubpaths(); + } else { + sp_selected_path_reverse(dt); + } +} + +void SelectionHelper::selectNext(SPDesktop *dt) +{ + SPEventContext *ec = dt->event_context; + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_multipath->shiftSelection(1); + } else if (tools_isactive(dt, TOOLS_GRADIENT) + && ec->_grdrag->isNonEmpty()) { + sp_gradient_context_select_next(ec); + } else { + sp_selection_item_next(dt); + } +} + +void SelectionHelper::selectPrev(SPDesktop *dt) +{ + SPEventContext *ec = dt->event_context; + if (tools_isactive(dt, TOOLS_NODES)) { + InkNodeTool *nt = static_cast(dt->event_context); + nt->_multipath->shiftSelection(-1); + } else if (tools_isactive(dt, TOOLS_GRADIENT) + && ec->_grdrag->isNonEmpty()) { + sp_gradient_context_select_prev(ec); + } else { + sp_selection_item_prev(dt); + } +} + +} // namespace Inkscape + + /** * Copies repr and its inherited css style elements, along with the accumulated transform 'full_t', * then prepends the copy to 'clip'. -- cgit v1.2.3 From 779b0933f576cf50448395aa32c1cb65edf590ff Mon Sep 17 00:00:00 2001 From: Josh Andler Date: Thu, 4 Feb 2010 11:50:48 -0800 Subject: Patch by Martin Sucha to add preferences to for grouping on Clip/Mask (bzr r9050) --- src/selection-chemistry.cpp | 146 ++++++++++++++++++++++++++++++++++++-------- 1 file changed, 119 insertions(+), 27 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index e81d133c2..a5c6ae961 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -94,6 +94,9 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS; #include "ui/tool/control-point-selection.h" #include "ui/tool/multi-path-manipulator.h" +#include "enums.h" +#include "sp-item-group.h" + // For clippath editing #include "tools-switch.h" #include "ui/tool/node-tool.h" @@ -551,36 +554,15 @@ void sp_edit_invert_in_all_layers(SPDesktop *desktop) sp_edit_select_all_full(desktop, true, true); } -void sp_selection_group(SPDesktop *desktop) -{ - if (desktop == NULL) - return; - - SPDocument *doc = sp_desktop_document(desktop); - Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc); - - Inkscape::Selection *selection = sp_desktop_selection(desktop); - - // Check if something is selected. - if (selection->isEmpty()) { - desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select some objects to group.")); - return; - } - - GSList const *l = (GSList *) selection->reprList(); - - GSList *p = g_slist_copy((GSList *) l); - - selection->clear(); - +void sp_selection_group_impl(GSList const *reprs_to_group, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) { + GSList *p = g_slist_copy((GSList *) reprs_to_group); + p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position); - + // Remember the position and parent of the topmost object. gint topmost = ((Inkscape::XML::Node *) g_slist_last(p)->data)->position(); Inkscape::XML::Node *topmost_parent = ((Inkscape::XML::Node *) g_slist_last(p)->data)->parent(); - - Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - + while (p) { Inkscape::XML::Node *current = (Inkscape::XML::Node *) p->data; @@ -634,10 +616,35 @@ void sp_selection_group(SPDesktop *desktop) // Move to the position of the topmost, reduced by the number of items deleted from topmost_parent group->setPosition(topmost + 1); +} + +void sp_selection_group(SPDesktop *desktop) +{ + if (desktop == NULL) + return; + + SPDocument *doc = sp_desktop_document(desktop); + Inkscape::XML::Document *xml_doc = sp_document_repr_doc(doc); + + Inkscape::Selection *selection = sp_desktop_selection(desktop); + + // Check if something is selected. + if (selection->isEmpty()) { + desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select some objects to group.")); + return; + } + + GSList const *l = (GSList *) selection->reprList(); + + + Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); + + sp_selection_group_impl(l, group, xml_doc, doc); sp_document_done(sp_desktop_document(desktop), SP_VERB_SELECTION_GROUP, _("Group")); + selection->clear(); selection->set(group); Inkscape::GC::release(group); } @@ -2856,6 +2863,7 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool topmost = prefs->getBool("/options/maskobject/topmost", true); bool remove_original = prefs->getBool("/options/maskobject/remove", true); + int grouping = prefs->getInt("/options/maskobject/grouping", PREFS_MASKOBJECT_GROUPING_NONE); if (apply_to_layer) { // all selected items are used for mask, which is applied to a layer @@ -2901,6 +2909,36 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la g_slist_free(items); items = NULL; + + if (apply_to_items && grouping == PREFS_MASKOBJECT_GROUPING_ALL) { + // group all those objects into one group + // and apply mask to that + Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); + + // make a note we should ungroup this when unsetting mask + group->setAttribute("inkscape:groupmode", "maskhelper"); + + GSList *reprs_to_group = NULL; + + for (GSList *i = apply_to_items ; NULL != i ; i = i->next) { + reprs_to_group = g_slist_prepend(reprs_to_group, SP_OBJECT_REPR(i->data)); + selection->remove(SP_OBJECT(i->data)); + } + reprs_to_group = g_slist_reverse(reprs_to_group); + + sp_selection_group_impl(reprs_to_group, group, xml_doc, doc); + + g_slist_free(reprs_to_group); + + // apply clip/mask only to newly created group + g_slist_free(apply_to_items); + apply_to_items = NULL; + apply_to_items = g_slist_prepend(apply_to_items, doc->getObjectByRepr(group)); + + selection->add(group); + + Inkscape::GC::release(group); + } gchar const *attributeName = apply_clip_path ? "clip-path" : "mask"; for (GSList *i = apply_to_items; NULL != i; i = i->next) { @@ -2925,7 +2963,34 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la g_slist_free(mask_items_dup); mask_items_dup = NULL; - SP_OBJECT_REPR(i->data)->setAttribute(attributeName, g_strdup_printf("url(#%s)", mask_id)); + Inkscape::XML::Node *current = SP_OBJECT_REPR(i->data); + // Node to apply mask to + Inkscape::XML::Node *apply_mask_to = current; + + if (grouping == PREFS_MASKOBJECT_GROUPING_SEPARATE) { + // enclose current node in group, and apply crop/mask on that + Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); + // make a note we should ungroup this when unsetting mask + group->setAttribute("inkscape:groupmode", "maskhelper"); + + Inkscape::XML::Node *spnew = current->duplicate(xml_doc); + gint position = current->position(); + selection->remove(current); + current->parent()->appendChild(group); + sp_repr_unparent(current); + group->appendChild(spnew); + group->setPosition(position); + + // Apply clip/mask to group instead + apply_mask_to = group; + + selection->add(group); + Inkscape::GC::release(spnew); + Inkscape::GC::release(group); + } + + apply_mask_to->setAttribute(attributeName, g_strdup_printf("url(#%s)", mask_id)); + } g_slist_free(mask_items); @@ -2959,10 +3024,14 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool remove_original = prefs->getBool("/options/maskobject/remove", true); + bool ungroup_masked = prefs->getBool("/options/maskobject/ungrouping", true); sp_document_ensure_up_to_date(doc); gchar const *attributeName = apply_clip_path ? "clip-path" : "mask"; std::map referenced_objects; + + GSList *items_to_ungroup = NULL; + // SPObject* refers to a group containing the clipped path or mask itself, // whereas SPItem* refers to the item being clipped or masked for (GSList const *i = selection->itemList(); NULL != i; i = i->next) { @@ -2984,6 +3053,18 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { } SP_OBJECT_REPR(i->data)->setAttribute(attributeName, "none"); + + if (ungroup_masked && SP_IS_GROUP(i->data)) { + // if we had previously enclosed masked object in group, + // add it to list so we can ungroup it later + SPGroup *item = SP_GROUP(i->data); + + // ungroup only groups we created when setting clip/mask + if (item->layerMode() == SPGroup::MASK_HELPER) { + items_to_ungroup = g_slist_prepend(items_to_ungroup, item); + } + + } } // restore mask objects into a document @@ -3024,6 +3105,17 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { g_slist_free(items_to_move); } + + // ungroup marked groups added when setting mask + for (GSList *i = items_to_ungroup ; NULL != i ; i = i->next) { + selection->remove(SP_GROUP(i->data)); + GSList *children = NULL; + sp_item_group_ungroup(SP_GROUP(i->data), &children, false); + selection->addList(children); + g_slist_free(children); + } + + g_slist_free(items_to_ungroup); if (apply_clip_path) sp_document_done(doc, SP_VERB_OBJECT_UNSET_CLIPPATH, _("Release clipping path")); -- cgit v1.2.3 From 81f88ca0856da56bdf426cd065ff0acd3414567f Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Tue, 9 Feb 2010 03:20:18 +0100 Subject: Fix multiple minor problems in the node tool (bzr r9070) --- src/selection-chemistry.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index a5c6ae961..4dfb4597d 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -118,10 +118,12 @@ void SelectionHelper::selectAll(SPDesktop *dt) { if (tools_isactive(dt, TOOLS_NODES)) { InkNodeTool *nt = static_cast(dt->event_context); - nt->_multipath->selectSubpaths(); - } else { - sp_edit_select_all(dt); + if (!nt->_multipath->empty()) { + nt->_multipath->selectSubpaths(); + return; + } } + sp_edit_select_all(dt); } void SelectionHelper::selectAllInAll(SPDesktop *dt) -- cgit v1.2.3 From fd703018ee505f643f866aa4e0cc3f1bebf7aa7d Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Mon, 1 Mar 2010 22:10:16 -0800 Subject: Cleanup on id access. (bzr r9127) --- src/selection-chemistry.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 4dfb4597d..3bfde6de9 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -333,7 +333,7 @@ void add_ids_recursive(std::vector &ids, SPObject *obj) if (!obj) return; - ids.push_back(SP_OBJECT_ID(obj)); + ids.push_back(obj->getId()); if (SP_IS_GROUP(obj)) { for (SPObject *child = sp_object_first_child(obj) ; child != NULL; child = SP_OBJECT_NEXT(child) ) { @@ -403,7 +403,7 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone) if (!orig) // orphaned continue; for (unsigned int j = 0; j < old_ids.size(); j++) { - if (!strcmp(SP_OBJECT_ID(orig), old_ids[j])) { + if (!strcmp(orig->getId(), old_ids[j])) { // we have both orig and clone in selection, relink // std::cout << id << " old, its ori: " << SP_OBJECT_ID(orig) << "; will relink:" << new_ids[i] << " to " << new_ids[j] << "\n"; gchar *newref = g_strdup_printf("#%s", new_ids[j]); -- cgit v1.2.3 From a9b7c9028767417b2adda38f3dbf99418c73390f Mon Sep 17 00:00:00 2001 From: Krzysztof Kosi??ski Date: Fri, 5 Mar 2010 01:15:39 +0100 Subject: Always embed bitmap copies created with Alt+B. Fixed bugs: - https://launchpad.net/bugs/169108 (bzr r9144) --- src/selection-chemistry.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 3bfde6de9..7f8fafea5 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -43,6 +43,7 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS; #include "sp-tref.h" #include "sp-flowtext.h" #include "sp-flowregion.h" +#include "sp-image.h" #include "text-editing.h" #include "text-context.h" #include "connector-context.h" @@ -2770,12 +2771,7 @@ sp_selection_create_bitmap_copy(SPDesktop *desktop) if (pb) { // Create the repr for the image Inkscape::XML::Node * repr = xml_doc->createElement("svg:image"); - { - repr->setAttribute("sodipodi:absref", filepath); - gchar *abs_base = Inkscape::XML::calc_abs_doc_base(document->base); - repr->setAttribute("xlink:href", sp_relative_path_from_path(filepath, abs_base)); - g_free(abs_base); - } + sp_embed_image(repr, pb, "image/png"); if (res == PX_PER_IN) { // for default 90 dpi, snap it to pixel grid sp_repr_set_svg_double(repr, "width", width); sp_repr_set_svg_double(repr, "height", height); -- cgit v1.2.3 From 86d58e07f051eab72dffc20a972a63c81a786cca Mon Sep 17 00:00:00 2001 From: Nicolas Dufour Date: Sat, 6 Mar 2010 09:10:15 +0100 Subject: i18n. Remove underscores in message context. Fixed bugs: - https://launchpad.net/bugs/505157 (bzr r9154) --- src/selection-chemistry.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 7f8fafea5..5d6394316 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -845,7 +845,7 @@ sp_selection_raise(SPDesktop *desktop) //TRANSLATORS: only translate "string" in "context|string". // For more details, see http://developer.gnome.org/doc/API/2.0/glib/glib-I18N.html#Q-:CAPS // "Raise" means "to raise an object" in the undo history - Q_("undo_action|Raise")); + Q_("undo action|Raise")); } void sp_selection_raise_to_top(SPDesktop *desktop) -- cgit v1.2.3 From 847b4f57816ba691e471cf891beca6d263438f03 Mon Sep 17 00:00:00 2001 From: "Jon A. Cruz" Date: Thu, 18 Mar 2010 23:21:16 -0700 Subject: Cleanup of SP_ACTIVE_DESKTOP to prepare clipboard code for reuse. (bzr r9209) --- src/selection-chemistry.cpp | 79 ++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 37 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 5d6394316..17875075e 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -559,13 +559,13 @@ void sp_edit_invert_in_all_layers(SPDesktop *desktop) void sp_selection_group_impl(GSList const *reprs_to_group, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) { GSList *p = g_slist_copy((GSList *) reprs_to_group); - + p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position); - + // Remember the position and parent of the topmost object. gint topmost = ((Inkscape::XML::Node *) g_slist_last(p)->data)->position(); Inkscape::XML::Node *topmost_parent = ((Inkscape::XML::Node *) g_slist_last(p)->data)->parent(); - + while (p) { Inkscape::XML::Node *current = (Inkscape::XML::Node *) p->data; @@ -639,10 +639,10 @@ void sp_selection_group(SPDesktop *desktop) GSList const *l = (GSList *) selection->reprList(); - + Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - - sp_selection_group_impl(l, group, xml_doc, doc); + + sp_selection_group_impl(l, group, xml_doc, doc); sp_document_done(sp_desktop_document(desktop), SP_VERB_SELECTION_GROUP, _("Group")); @@ -1009,7 +1009,7 @@ sp_redo(SPDesktop *desktop, SPDocument *) void sp_selection_cut(SPDesktop *desktop) { - sp_selection_copy(); + sp_selection_copy(desktop); sp_selection_delete(desktop); } @@ -1054,33 +1054,36 @@ take_style_from_item(SPItem *item) } -void sp_selection_copy() +void sp_selection_copy(SPDesktop *desktop) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - cm->copy(); + cm->copy(desktop); } void sp_selection_paste(SPDesktop *desktop, bool in_place) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - if (cm->paste(in_place)) + if (cm->paste(desktop, in_place)) { sp_document_done(sp_desktop_document(desktop), SP_VERB_EDIT_PASTE, _("Paste")); + } } void sp_selection_paste_style(SPDesktop *desktop) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - if (cm->pasteStyle()) + if (cm->pasteStyle(desktop)) { sp_document_done(sp_desktop_document(desktop), SP_VERB_EDIT_PASTE_STYLE, _("Paste style")); + } } void sp_selection_paste_livepatheffect(SPDesktop *desktop) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - if (cm->pastePathEffect()) + if (cm->pastePathEffect(desktop)) { sp_document_done(sp_desktop_document(desktop), SP_VERB_EDIT_PASTE_LIVEPATHEFFECT, _("Paste live path effect")); + } } @@ -1140,17 +1143,19 @@ void sp_selection_remove_filter(SPDesktop *desktop) void sp_selection_paste_size(SPDesktop *desktop, bool apply_x, bool apply_y) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - if (cm->pasteSize(false, apply_x, apply_y)) + if (cm->pasteSize(desktop, false, apply_x, apply_y)) { sp_document_done(sp_desktop_document(desktop), SP_VERB_EDIT_PASTE_SIZE, _("Paste size")); + } } void sp_selection_paste_size_separately(SPDesktop *desktop, bool apply_x, bool apply_y) { Inkscape::UI::ClipboardManager *cm = Inkscape::UI::ClipboardManager::get(); - if (cm->pasteSize(true, apply_x, apply_y)) + if (cm->pasteSize(desktop, true, apply_x, apply_y)) { sp_document_done(sp_desktop_document(desktop), SP_VERB_EDIT_PASTE_SIZE_SEPARATELY, _("Paste size separately")); + } } void sp_selection_to_next_layer(SPDesktop *dt, bool suppressDone) @@ -2907,34 +2912,34 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la g_slist_free(items); items = NULL; - + if (apply_to_items && grouping == PREFS_MASKOBJECT_GROUPING_ALL) { // group all those objects into one group // and apply mask to that Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - + // make a note we should ungroup this when unsetting mask group->setAttribute("inkscape:groupmode", "maskhelper"); - + GSList *reprs_to_group = NULL; - + for (GSList *i = apply_to_items ; NULL != i ; i = i->next) { reprs_to_group = g_slist_prepend(reprs_to_group, SP_OBJECT_REPR(i->data)); selection->remove(SP_OBJECT(i->data)); } reprs_to_group = g_slist_reverse(reprs_to_group); - + sp_selection_group_impl(reprs_to_group, group, xml_doc, doc); - + g_slist_free(reprs_to_group); - + // apply clip/mask only to newly created group g_slist_free(apply_to_items); apply_to_items = NULL; apply_to_items = g_slist_prepend(apply_to_items, doc->getObjectByRepr(group)); - + selection->add(group); - + Inkscape::GC::release(group); } @@ -2964,13 +2969,13 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la Inkscape::XML::Node *current = SP_OBJECT_REPR(i->data); // Node to apply mask to Inkscape::XML::Node *apply_mask_to = current; - + if (grouping == PREFS_MASKOBJECT_GROUPING_SEPARATE) { // enclose current node in group, and apply crop/mask on that Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); // make a note we should ungroup this when unsetting mask group->setAttribute("inkscape:groupmode", "maskhelper"); - + Inkscape::XML::Node *spnew = current->duplicate(xml_doc); gint position = current->position(); selection->remove(current); @@ -2978,17 +2983,17 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la sp_repr_unparent(current); group->appendChild(spnew); group->setPosition(position); - + // Apply clip/mask to group instead apply_mask_to = group; - + selection->add(group); - Inkscape::GC::release(spnew); + Inkscape::GC::release(spnew); Inkscape::GC::release(group); } - + apply_mask_to->setAttribute(attributeName, g_strdup_printf("url(#%s)", mask_id)); - + } g_slist_free(mask_items); @@ -3027,9 +3032,9 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { gchar const *attributeName = apply_clip_path ? "clip-path" : "mask"; std::map referenced_objects; - + GSList *items_to_ungroup = NULL; - + // SPObject* refers to a group containing the clipped path or mask itself, // whereas SPItem* refers to the item being clipped or masked for (GSList const *i = selection->itemList(); NULL != i; i = i->next) { @@ -3051,17 +3056,17 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { } SP_OBJECT_REPR(i->data)->setAttribute(attributeName, "none"); - + if (ungroup_masked && SP_IS_GROUP(i->data)) { // if we had previously enclosed masked object in group, // add it to list so we can ungroup it later SPGroup *item = SP_GROUP(i->data); - + // ungroup only groups we created when setting clip/mask if (item->layerMode() == SPGroup::MASK_HELPER) { items_to_ungroup = g_slist_prepend(items_to_ungroup, item); } - + } } @@ -3103,7 +3108,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { g_slist_free(items_to_move); } - + // ungroup marked groups added when setting mask for (GSList *i = items_to_ungroup ; NULL != i ; i = i->next) { selection->remove(SP_GROUP(i->data)); @@ -3112,7 +3117,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { selection->addList(children); g_slist_free(children); } - + g_slist_free(items_to_ungroup); if (apply_clip_path) -- cgit v1.2.3 From 9c02bb9cf04b5396b9d580539511f94531151f21 Mon Sep 17 00:00:00 2001 From: Josh Andler Date: Sat, 20 Mar 2010 12:15:35 -0700 Subject: Patch by Martin Sucha for 542004 (bzr r9216) --- src/selection-chemistry.cpp | 71 +++++++++++++++++++++++++++++++-------------- 1 file changed, 50 insertions(+), 21 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 17875075e..730467ee5 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -8,6 +8,7 @@ * bulia byak * Andrius R. * Jon A. Cruz + * Martin Sucha * * Copyright (C) 1999-2010 authors * Copyright (C) 2001-2002 Ximian, Inc. @@ -557,9 +558,8 @@ void sp_edit_invert_in_all_layers(SPDesktop *desktop) sp_edit_select_all_full(desktop, true, true); } -void sp_selection_group_impl(GSList const *reprs_to_group, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) { - GSList *p = g_slist_copy((GSList *) reprs_to_group); - +void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inkscape::XML::Document *xml_doc, SPDocument *doc) { + p = g_slist_sort(p, (GCompareFunc) sp_repr_compare_position); // Remember the position and parent of the topmost object. @@ -638,16 +638,18 @@ void sp_selection_group(SPDesktop *desktop) } GSList const *l = (GSList *) selection->reprList(); - + + GSList *p = g_slist_copy((GSList *) l); + + selection->clear(); Inkscape::XML::Node *group = xml_doc->createElement("svg:g"); - sp_selection_group_impl(l, group, xml_doc, doc); + sp_selection_group_impl(p, group, xml_doc, doc); sp_document_done(sp_desktop_document(desktop), SP_VERB_SELECTION_GROUP, _("Group")); - selection->clear(); selection->set(group); Inkscape::GC::release(group); } @@ -684,7 +686,7 @@ void sp_selection_ungroup(SPDesktop *desktop) /* We do not allow ungrouping etc. (lauris) */ if (strcmp(SP_OBJECT_REPR(group)->name(), "svg:g") && strcmp(SP_OBJECT_REPR(group)->name(), "svg:switch")) { // keep the non-group item in the new selection - selection->add(group); + new_select = g_slist_append(new_select, group); continue; } @@ -2858,11 +2860,16 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la GSList *items = g_slist_copy((GSList *) selection->itemList()); items = g_slist_sort(items, (GCompareFunc) sp_object_compare_position); + + // See lp bug #542004 + selection->clear(); // create a list of duplicates GSList *mask_items = NULL; GSList *apply_to_items = NULL; GSList *items_to_delete = NULL; + GSList *items_to_select = NULL; + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool topmost = prefs->getBool("/options/maskobject/topmost", true); bool remove_original = prefs->getBool("/options/maskobject/remove", true); @@ -2871,15 +2878,18 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la if (apply_to_layer) { // all selected items are used for mask, which is applied to a layer apply_to_items = g_slist_prepend(apply_to_items, desktop->currentLayer()); - + for (GSList *i = items; i != NULL; i = i->next) { Inkscape::XML::Node *dup = (SP_OBJECT_REPR(i->data))->duplicate(xml_doc); mask_items = g_slist_prepend(mask_items, dup); - if (remove_original) { - SPObject *item = SP_OBJECT(i->data); + SPObject *item = SP_OBJECT(i->data); + if (remove_original) { items_to_delete = g_slist_prepend(items_to_delete, item); } + else { + items_to_select = g_slist_prepend(items_to_select, item); + } } } else if (!topmost) { // topmost item is used as a mask, which is applied to other items in a selection @@ -2894,11 +2904,13 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la for (i = i->next; i != NULL; i = i->next) { apply_to_items = g_slist_prepend(apply_to_items, i->data); + items_to_select = g_slist_prepend(items_to_select, i->data); } } else { GSList *i = NULL; for (i = items; NULL != i->next; i = i->next) { apply_to_items = g_slist_prepend(apply_to_items, i->data); + items_to_select = g_slist_prepend(items_to_select, i->data); } Inkscape::XML::Node *dup = (SP_OBJECT_REPR(i->data))->duplicate(xml_doc); @@ -2925,20 +2937,20 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la for (GSList *i = apply_to_items ; NULL != i ; i = i->next) { reprs_to_group = g_slist_prepend(reprs_to_group, SP_OBJECT_REPR(i->data)); - selection->remove(SP_OBJECT(i->data)); + items_to_select = g_slist_remove(items_to_select, i->data); } reprs_to_group = g_slist_reverse(reprs_to_group); sp_selection_group_impl(reprs_to_group, group, xml_doc, doc); - - g_slist_free(reprs_to_group); + + reprs_to_group = NULL; // apply clip/mask only to newly created group g_slist_free(apply_to_items); apply_to_items = NULL; apply_to_items = g_slist_prepend(apply_to_items, doc->getObjectByRepr(group)); - selection->add(group); + items_to_select = g_slist_prepend(items_to_select, doc->getObjectByRepr(group)); Inkscape::GC::release(group); } @@ -2978,7 +2990,7 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la Inkscape::XML::Node *spnew = current->duplicate(xml_doc); gint position = current->position(); - selection->remove(current); + items_to_select = g_slist_remove(items_to_select, item); current->parent()->appendChild(group); sp_repr_unparent(current); group->appendChild(spnew); @@ -2987,7 +2999,7 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la // Apply clip/mask to group instead apply_mask_to = group; - selection->add(group); + items_to_select = g_slist_prepend(items_to_select, doc->getObjectByRepr(group)); Inkscape::GC::release(spnew); Inkscape::GC::release(group); } @@ -3002,8 +3014,14 @@ sp_selection_set_mask(SPDesktop *desktop, bool apply_clip_path, bool apply_to_la for (GSList *i = items_to_delete; NULL != i; i = i->next) { SPObject *item = SP_OBJECT(i->data); item->deleteObject(false); + items_to_select = g_slist_remove(items_to_select, item); } g_slist_free(items_to_delete); + + items_to_select = g_slist_reverse(items_to_select); + + selection->addList(items_to_select); + g_slist_free(items_to_select); if (apply_clip_path) sp_document_done(doc, SP_VERB_OBJECT_SET_CLIPPATH, _("Set clipping path")); @@ -3033,11 +3051,17 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { gchar const *attributeName = apply_clip_path ? "clip-path" : "mask"; std::map referenced_objects; + GSList *items = g_slist_copy((GSList *) selection->itemList()); + selection->clear(); + GSList *items_to_ungroup = NULL; + GSList *items_to_select = g_slist_copy(items); + items_to_select = g_slist_reverse(items_to_select); + // SPObject* refers to a group containing the clipped path or mask itself, // whereas SPItem* refers to the item being clipped or masked - for (GSList const *i = selection->itemList(); NULL != i; i = i->next) { + for (GSList const *i = items; NULL != i; i = i->next) { if (remove_original) { // remember referenced mask/clippath, so orphaned masks can be moved back to document SPItem *item = reinterpret_cast(i->data); @@ -3069,6 +3093,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { } } + g_slist_free(items); // restore mask objects into a document for ( std::map::iterator it = referenced_objects.begin() ; it != referenced_objects.end() ; ++it) { @@ -3098,7 +3123,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { repr->setPosition((pos + 1) > 0 ? (pos + 1) : 0); SPItem *mask_item = (SPItem *) sp_desktop_document(desktop)->getObjectByRepr(repr); - selection->add(repr); + items_to_select = g_slist_prepend(items_to_select, mask_item); // transform mask, so it is moved the same spot where mask was applied Geom::Matrix transform(mask_item->transform); @@ -3111,14 +3136,18 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) { // ungroup marked groups added when setting mask for (GSList *i = items_to_ungroup ; NULL != i ; i = i->next) { - selection->remove(SP_GROUP(i->data)); + items_to_select = g_slist_remove(items_to_select, SP_GROUP(i->data)); GSList *children = NULL; sp_item_group_ungroup(SP_GROUP(i->data), &children, false); - selection->addList(children); - g_slist_free(children); + items_to_select = g_slist_concat(children, items_to_select); } g_slist_free(items_to_ungroup); + + // rebuild selection + items_to_select = g_slist_reverse(items_to_select); + selection->addList(items_to_select); + g_slist_free(items_to_select); if (apply_clip_path) sp_document_done(doc, SP_VERB_OBJECT_UNSET_CLIPPATH, _("Release clipping path")); -- cgit v1.2.3