X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fselection-chemistry.cpp;h=1225a66f369dcbef3c0d23e87a79407ff4e2bcfd;hb=4832d71a0d49fe090b917e233370be20d1d72884;hp=19f6c4751d569f211766ce1d066934625c8491c2;hpb=a42a6d4d0cc81a03c2e0e36bd48f7bd079ee5390;p=inkscape.git diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp index 19f6c4751..1225a66f3 100644 --- a/src/selection-chemistry.cpp +++ b/src/selection-chemistry.cpp @@ -39,6 +39,9 @@ #include "sp-flowregion.h" #include "text-editing.h" #include "text-context.h" +#include "connector-context.h" +#include "sp-path.h" +#include "sp-conn-end.h" #include "dropper-context.h" #include #include "libnr/nr-matrix-rotate-ops.h" @@ -1099,7 +1102,7 @@ void sp_selection_paste(bool in_place) /* Snap the offset of the new item(s) to the grid */ /* FIXME: this gridsnap fiddling is a hack. */ - Inkscape::GridSnapper &s = desktop->namedview->grid_snapper; + Inkscape::GridSnapper &s = desktop->namedview->snap_manager.grid; gdouble const curr_gridsnap = s.getDistance(); s.setDistance(NR_HUGE); m = s.freeSnap(Inkscape::Snapper::SNAP_POINT, m, NULL).getPoint(); @@ -1225,18 +1228,30 @@ void sp_selection_to_next_layer () const GSList *items = g_slist_copy ((GSList *) selection->itemList()); + bool no_more = false; // Set to true, if no more layers above SPObject *next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer()); if (next) { GSList *temp_clip = NULL; sp_selection_copy_impl (items, &temp_clip, NULL, NULL); // we're in the same doc, so no need to copy defs sp_selection_delete_impl (items); - GSList *copied = sp_selection_paste_impl (sp_desktop_document (dt), next, &temp_clip, NULL); + next=Inkscape::next_layer(dt->currentRoot(), dt->currentLayer()); // Fixes bug 1482973: crash while moving layers + GSList *copied; + if(next) { + copied = sp_selection_paste_impl (sp_desktop_document (dt), next, &temp_clip, NULL); + } else { + copied = sp_selection_paste_impl (sp_desktop_document (dt), dt->currentLayer(), &temp_clip, NULL); + no_more = true; + } selection->setReprList((GSList const *) copied); g_slist_free (copied); if (temp_clip) g_slist_free (temp_clip); - dt->setCurrentLayer(next); + if (next) dt->setCurrentLayer(next); sp_document_done(sp_desktop_document (dt)); } else { + no_more = true; + } + + if (no_more) { dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers above.")); } @@ -1257,18 +1272,30 @@ void sp_selection_to_prev_layer () const GSList *items = g_slist_copy ((GSList *) selection->itemList()); + bool no_more = false; // Set to true, if no more layers below SPObject *next=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer()); if (next) { GSList *temp_clip = NULL; sp_selection_copy_impl (items, &temp_clip, NULL, NULL); // we're in the same doc, so no need to copy defs sp_selection_delete_impl (items); - GSList *copied = sp_selection_paste_impl (sp_desktop_document (dt), next, &temp_clip, NULL); + next=Inkscape::previous_layer(dt->currentRoot(), dt->currentLayer()); // Fixes bug 1482973: crash while moving layers + GSList *copied; + if(next) { + copied = sp_selection_paste_impl (sp_desktop_document (dt), next, &temp_clip, NULL); + } else { + copied = sp_selection_paste_impl (sp_desktop_document (dt), dt->currentLayer(), &temp_clip, NULL); + no_more = true; + } selection->setReprList((GSList const *) copied); g_slist_free (copied); if (temp_clip) g_slist_free (temp_clip); - dt->setCurrentLayer(next); + if (next) dt->setCurrentLayer(next); sp_document_done(sp_desktop_document (dt)); } else { + no_more = true; + } + + if (no_more) { dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers below.")); } @@ -1303,7 +1330,21 @@ void sp_selection_apply_affine(Inkscape::Selection *selection, NR::Matrix const bool transform_textpath_with_path = (SP_IS_TEXT_TEXTPATH(item) && selection->includes( sp_textpath_get_path_item (SP_TEXTPATH(sp_object_first_child(SP_OBJECT(item)))) )); bool transform_flowtext_with_frame = (SP_IS_FLOWTEXT(item) && selection->includes( SP_FLOWTEXT(item)->get_frame (NULL))); // only the first frame so far bool transform_offset_with_source = (SP_IS_OFFSET(item) && SP_OFFSET (item)->sourceHref) && selection->includes( sp_offset_get_source (SP_OFFSET(item)) ); - + + // If we're moving a connector, we want to detach it + // from shapes that aren't part of the selection, but + // leave it attached if they are + if (cc_item_is_connector(item)) { + SPItem *attItem[2]; + SP_PATH(item)->connEndPair.getAttachedItems(attItem); + + for (int n = 0; n < 2; ++n) { + if (!selection->includes(attItem[n])) { + sp_conn_end_detach(item, n); + } + } + } + // "clones are unmoved when original is moved" preference int compensation = prefs_get_int_attribute("options.clonecompensation", "value", SP_CLONE_COMPENSATION_UNMOVED); bool prefs_unmoved = (compensation == SP_CLONE_COMPENSATION_UNMOVED);