From 6c05c1c14cb8d29fb06d6779ec9817615c518ab5 Mon Sep 17 00:00:00 2001 From: chr Date: Thu, 18 May 2017 19:58:59 +0200 Subject: fix a brunch of memory leaks (bzr r15698.1.2) --- src/selection-chemistry.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 5d585ab5d..39846ba2c 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -3175,8 +3175,11 @@ void ObjectSet::toSymbol() the_parent_repr->appendChild(clone); if( single_group && transform.isTranslation() ) { - if( !transform.isIdentity() ) - clone->setAttribute("transform", sp_svg_transform_write( transform )); + if( !transform.isIdentity() ) { + gchar *c = sp_svg_transform_write( transform ); + clone->setAttribute("transform", c); + g_free(c); + } } // Change selection to new element. -- cgit v1.2.3 From dc80e5d0bf82f005628881134b929aa4838308d5 Mon Sep 17 00:00:00 2001 From: chr Date: Tue, 23 May 2017 21:48:22 +0200 Subject: selection chemistry: implement z-stack order Bug #1395452 "raise and lower objects" used to stack objects above/below the next overlapping object, which makes it impossible to change the z-order of objects that don't overlap. Fixes also the object manager panel Conflicts: src/selection-chemistry.cpp src/selection-chemistry.h src/sp-item.cpp (bzr r15698.1.7) --- src/selection-chemistry.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 39846ba2c..7d5d921b0 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1140,6 +1140,45 @@ void ObjectSet::lowerToBottom(bool skip_undo){ } } +void ObjectSet::stackUp(bool skip_undo) { + if (isEmpty()) { + selection_display_message(desktop(), Inkscape::WARNING_MESSAGE, _("Select object(s) to stack up.")); + return; + } + + std::vector selection(items().begin(), items().end()); + sort(selection.begin(), selection.end(), sp_item_repr_compare_position_bool); + + for (auto item: selection | boost::adaptors::reversed) { + if (!item->raiseOne()) // stop if top was reached + break; + } + + if(document() && !skip_undo) + DocumentUndo::done(document(), SP_VERB_SELECTION_STACK_UP, + //TRANSLATORS: undo history: "stack up" means to raise an object of its ordinal position by 1 + C_("Undo action", "stack up")); +} + +void ObjectSet::stackDown(bool skip_undo) { + if (isEmpty()) { + selection_display_message(desktop(), Inkscape::WARNING_MESSAGE, _("Select object(s) to stack down.")); + return; + } + + std::vector selection(items().begin(), items().end()); + sort(selection.begin(), selection.end(), sp_item_repr_compare_position_bool); + + for (auto item: selection) { + if (!item->lowerOne()) // stop if bottom was reached + break; + } + + if(document() && !skip_undo) + DocumentUndo::done(document(), SP_VERB_SELECTION_STACK_DOWN, + //TRANSLATORS: undo history: "stack down" means to lower an object of its ordinal position by 1 + C_("Undo action", "stack down")); +} void sp_undo(SPDesktop *desktop, SPDocument *) -- cgit v1.2.3 From a2e04c5fb43ae6331ac34e6ea809cbb7a0a1136a Mon Sep 17 00:00:00 2001 From: chr Date: Tue, 23 May 2017 21:48:27 +0200 Subject: selection chemistry: cancel if we hit top/bottom avoid unpredictable results in multi selections (bzr r15698.1.13) --- src/selection-chemistry.cpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'src/selection-chemistry.cpp') diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 7d5d921b0..b3d910700 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -1150,8 +1150,12 @@ void ObjectSet::stackUp(bool skip_undo) { sort(selection.begin(), selection.end(), sp_item_repr_compare_position_bool); for (auto item: selection | boost::adaptors::reversed) { - if (!item->raiseOne()) // stop if top was reached - break; + if (!item->raiseOne()) { // stop if top was reached + if(document() && !skip_undo) + DocumentUndo::cancel(document()); + selection_display_message(desktop(), Inkscape::WARNING_MESSAGE, _("We hit top.")); + return; + } } if(document() && !skip_undo) @@ -1170,8 +1174,12 @@ void ObjectSet::stackDown(bool skip_undo) { sort(selection.begin(), selection.end(), sp_item_repr_compare_position_bool); for (auto item: selection) { - if (!item->lowerOne()) // stop if bottom was reached - break; + if (!item->lowerOne()) { // stop if bottom was reached + if(document() && !skip_undo) + DocumentUndo::cancel(document()); + selection_display_message(desktop(), Inkscape::WARNING_MESSAGE, _("We hit bottom.")); + return; + } } if(document() && !skip_undo) -- cgit v1.2.3