index e7e3ec4a35e25436ccbfc7001efc85d8d52909ec..1225a66f369dcbef3c0d23e87a79407ff4e2bcfd 100644 (file)
#include "sp-flowregion.h"
#include "text-editing.h"
#include "text-context.h"
#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 <glibmm/i18n.h>
#include "libnr/nr-matrix-rotate-ops.h"
#include "dropper-context.h"
#include <glibmm/i18n.h>
#include "libnr/nr-matrix-rotate-ops.h"
#include "layer-fns.h"
#include "context-fns.h"
#include <map>
#include "layer-fns.h"
#include "context-fns.h"
#include <map>
+#include "helper/units.h"
+#include "sp-item.h"
using NR::X;
using NR::Y;
using NR::X;
using NR::Y;
GSList *clipboard = NULL;
GSList *defs_clipboard = NULL;
SPCSSAttr *style_clipboard = NULL;
GSList *clipboard = NULL;
GSList *defs_clipboard = NULL;
SPCSSAttr *style_clipboard = NULL;
+NR::Rect size_clipboard(NR::Point(0,0), NR::Point(0,0));
static void sp_copy_stuff_used_by_item(GSList **defs_clip, SPItem *item, const GSList *items);
static void sp_copy_stuff_used_by_item(GSList **defs_clip, SPItem *item, const GSList *items);
if (tools_isactive (desktop, TOOLS_TEXT))
if (sp_text_delete_selection(desktop->event_context)) {
if (tools_isactive (desktop, TOOLS_TEXT))
if (sp_text_delete_selection(desktop->event_context)) {
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
return;
}
return;
}
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
*/
tools_switch ( desktop, tools_active ( desktop ) );
*/
tools_switch ( desktop, tools_active ( desktop ) );
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
/* fixme: sequencing */
}
/* fixme: sequencing */
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
Inkscape::GC::release(copy);
}
Inkscape::GC::release(copy);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
selection->setReprList(newsel);
selection->setReprList(newsel);
if (!dt)
return;
if (!dt)
return;
- SPDocument *doc = SP_DT_DOCUMENT(dt);
- SP_DT_SELECTION(dt)->clear();
+ SPDocument *doc = sp_desktop_document(dt);
+ sp_desktop_selection(dt)->clear();
g_return_if_fail(SP_IS_GROUP(dt->currentLayer()));
GSList *items = sp_item_group_item_list(SP_GROUP(dt->currentLayer()));
g_return_if_fail(SP_IS_GROUP(dt->currentLayer()));
GSList *items = sp_item_group_item_list(SP_GROUP(dt->currentLayer()));
if (!dt)
return;
if (!dt)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(dt);
+ Inkscape::Selection *selection = sp_desktop_selection(dt);
g_return_if_fail(SP_IS_GROUP(dt->currentLayer()));
g_return_if_fail(SP_IS_GROUP(dt->currentLayer()));
- bool inlayer = prefs_get_int_attribute ("options.kbselection", "inlayer", 1);
+ PrefsSelectionContext inlayer = (PrefsSelectionContext)prefs_get_int_attribute ("options.kbselection", "inlayer", PREFS_SELECTION_LAYER);
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
exclude = selection->itemList();
}
exclude = selection->itemList();
}
- if (inlayer && !force_all_layers) {
+ if (force_all_layers)
+ inlayer = PREFS_SELECTION_ALL;
+ switch (inlayer) {
+ case PREFS_SELECTION_LAYER: {
if ( (onlysensitive && SP_ITEM(dt->currentLayer())->isLocked()) ||
(onlyvisible && dt->itemIsHidden(SP_ITEM(dt->currentLayer()))) )
return;
if ( (onlysensitive && SP_ITEM(dt->currentLayer())->isLocked()) ||
(onlyvisible && dt->itemIsHidden(SP_ITEM(dt->currentLayer()))) )
return;
}
g_slist_free (all_items);
}
g_slist_free (all_items);
-
- } else {
+ break;
+ }
+ case PREFS_SELECTION_LAYER_RECURSIVE: {
+ items = get_all_items (NULL, dt->currentLayer(), dt, onlyvisible, onlysensitive, exclude);
+ break;
+ }
+ default: {
items = get_all_items (NULL, dt->currentRoot(), dt, onlyvisible, onlysensitive, exclude);
items = get_all_items (NULL, dt->currentRoot(), dt, onlyvisible, onlysensitive, exclude);
+ break;
+ }
}
selection->setList (items);
}
selection->setList (items);
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT (desktop);
+ SPDocument *document = sp_desktop_document (desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// Check if something is selected.
if (selection->isEmpty()) {
// Check if something is selected.
if (selection->isEmpty()) {
// Move to the position of the topmost, reduced by the number of items deleted from topmost_parent
group->setPosition(topmost + 1);
// Move to the position of the topmost, reduced by the number of items deleted from topmost_parent
group->setPosition(topmost + 1);
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
selection->set(group);
Inkscape::GC::release(group);
selection->set(group);
Inkscape::GC::release(group);
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select a <b>group</b> to ungroup."));
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select a <b>group</b> to ungroup."));
g_slist_free(items);
g_slist_free(items);
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
static SPGroup *
}
static SPGroup *
if (!desktop)
return;
if (!desktop)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
GSList const *items = (GSList *) selection->itemList();
if (!items) {
GSList const *items = (GSList *) selection->itemList();
if (!items) {
rev = g_slist_remove(rev, child);
}
rev = g_slist_remove(rev, child);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
void sp_selection_raise_to_top()
}
void sp_selection_raise_to_top()
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise to top."));
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise to top."));
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
GSList const *items = (GSList *) selection->itemList();
if (!items) {
GSList const *items = (GSList *) selection->itemList();
if (!items) {
rev = g_slist_remove(rev, child);
}
rev = g_slist_remove(rev, child);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
}
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower to bottom."));
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower to bottom."));
void
sp_undo(SPDesktop *desktop, SPDocument *)
{
void
sp_undo(SPDesktop *desktop, SPDocument *)
{
- if (!sp_document_undo(SP_DT_DOCUMENT(desktop)))
+ if (!sp_document_undo(sp_desktop_document(desktop)))
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to undo."));
}
void
sp_redo(SPDesktop *desktop, SPDocument *)
{
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to undo."));
}
void
sp_redo(SPDesktop *desktop, SPDocument *)
{
- if (!sp_document_redo(SP_DT_DOCUMENT(desktop)))
+ if (!sp_document_redo(sp_desktop_document(desktop)))
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to redo."));
}
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing to redo."));
}
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (tools_isactive (desktop, TOOLS_DROPPER)) {
sp_dropper_context_copy(desktop->event_context);
if (tools_isactive (desktop, TOOLS_DROPPER)) {
sp_dropper_context_copy(desktop->event_context);
g_free (query);
}
g_free (query);
}
+ size_clipboard = selection->bounds();
+
g_slist_free ((GSList *) items);
}
g_slist_free ((GSList *) items);
}
return;
}
return;
}
- SPDocument *document = SP_DT_DOCUMENT(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
if (Inkscape::have_viable_layer(desktop, desktop->messageStack()) == false) {
return;
}
if (Inkscape::have_viable_layer(desktop, desktop->messageStack()) == false) {
return;
}
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (tools_isactive (desktop, TOOLS_TEXT)) {
if (sp_text_paste_inline(desktop->event_context))
if (tools_isactive (desktop, TOOLS_TEXT)) {
if (sp_text_paste_inline(desktop->event_context))
/* Snap the offset of the new item(s) to the grid */
/* FIXME: this gridsnap fiddling is a hack. */
/* 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();
gdouble const curr_gridsnap = s.getDistance();
s.setDistance(NR_HUGE);
m = s.freeSnap(Inkscape::Snapper::SNAP_POINT, m, NULL).getPoint();
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop == NULL) return;
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
if (desktop == NULL) return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is in the clipboard
if (clipboard == NULL) {
// check if something is in the clipboard
if (clipboard == NULL) {
return;
}
return;
}
- paste_defs (&defs_clipboard, SP_DT_DOCUMENT(desktop));
+ paste_defs (&defs_clipboard, sp_desktop_document(desktop));
sp_desktop_set_style (desktop, style_clipboard);
sp_desktop_set_style (desktop, style_clipboard);
- sp_document_done(SP_DT_DOCUMENT (desktop));
+ sp_document_done(sp_desktop_document (desktop));
+}
+
+void sp_selection_paste_size (bool apply_x, bool apply_y)
+{
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ if (desktop == NULL) return;
+
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+
+ // check if something is in the clipboard
+ if (size_clipboard.extent(NR::X) < 1e-6 || size_clipboard.extent(NR::Y) < 1e-6) {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing on the clipboard."));
+ return;
+ }
+
+ // check if something is selected
+ if (selection->isEmpty()) {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to paste size to."));
+ return;
+ }
+
+ NR::Rect current = selection->bounds();
+ if (current.extent(NR::X) < 1e-6 || current.extent(NR::Y) < 1e-6) {
+ return;
+ }
+
+ double scale_x = size_clipboard.extent(NR::X) / current.extent(NR::X);
+ double scale_y = size_clipboard.extent(NR::Y) / current.extent(NR::Y);
+
+ sp_selection_scale_relative (selection, current.midpoint(),
+ NR::scale(
+ apply_x? scale_x : (desktop->isToolboxButtonActive ("lock")? scale_y : 1.0),
+ apply_y? scale_y : (desktop->isToolboxButtonActive ("lock")? scale_x : 1.0)));
+
+ sp_document_done(sp_desktop_document (desktop));
+}
+
+void sp_selection_paste_size_separately (bool apply_x, bool apply_y)
+{
+ SPDesktop *desktop = SP_ACTIVE_DESKTOP;
+ if (desktop == NULL) return;
+
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
+
+ // check if something is in the clipboard
+ if (size_clipboard.extent(NR::X) < 1e-6 || size_clipboard.extent(NR::Y) < 1e-6) {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Nothing on the clipboard."));
+ return;
+ }
+
+ // check if something is selected
+ if (selection->isEmpty()) {
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to paste size to."));
+ return;
+ }
+
+ for (GSList const *l = selection->itemList(); l != NULL; l = l->next) {
+ SPItem *item = SP_ITEM(l->data);
+
+ NR::Rect current = sp_item_bbox_desktop(item);
+ if (current.extent(NR::X) < 1e-6 || current.extent(NR::Y) < 1e-6) {
+ continue;
+ }
+
+ double scale_x = size_clipboard.extent(NR::X) / current.extent(NR::X);
+ double scale_y = size_clipboard.extent(NR::Y) / current.extent(NR::Y);
+
+ sp_item_scale_rel (item,
+ NR::scale(
+ apply_x? scale_x : (desktop->isToolboxButtonActive ("lock")? scale_y : 1.0),
+ apply_y? scale_y : (desktop->isToolboxButtonActive ("lock")? scale_x : 1.0)));
+
+ }
+
+ sp_document_done(sp_desktop_document (desktop));
}
void sp_selection_to_next_layer ()
{
SPDesktop *dt = SP_ACTIVE_DESKTOP;
}
void sp_selection_to_next_layer ()
{
SPDesktop *dt = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(dt);
+ Inkscape::Selection *selection = sp_desktop_selection(dt);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
const GSList *items = g_slist_copy ((GSList *) selection->itemList());
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);
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_DT_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);
selection->setReprList((GSList const *) copied);
g_slist_free (copied);
if (temp_clip) g_slist_free (temp_clip);
- dt->setCurrentLayer(next);
- sp_document_done(SP_DT_DOCUMENT (dt));
+ if (next) dt->setCurrentLayer(next);
+ sp_document_done(sp_desktop_document (dt));
} else {
} else {
+ no_more = true;
+ }
+
+ if (no_more) {
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers above."));
}
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers above."));
}
{
SPDesktop *dt = SP_ACTIVE_DESKTOP;
{
SPDesktop *dt = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(dt);
+ Inkscape::Selection *selection = sp_desktop_selection(dt);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
const GSList *items = g_slist_copy ((GSList *) selection->itemList());
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);
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_DT_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);
selection->setReprList((GSList const *) copied);
g_slist_free (copied);
if (temp_clip) g_slist_free (temp_clip);
- dt->setCurrentLayer(next);
- sp_document_done(SP_DT_DOCUMENT (dt));
+ if (next) dt->setCurrentLayer(next);
+ sp_document_done(sp_desktop_document (dt));
} else {
} else {
+ no_more = true;
+ }
+
+ if (no_more) {
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers below."));
}
dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("No more layers below."));
}
@@ -1213,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)) );
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);
// "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);
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
GSList const *l = (GSList *) selection->reprList();
while (l != NULL) {
GSList const *l = (GSList *) selection->reprList();
while (l != NULL) {
l = l->next;
}
l = l->next;
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
void
}
void
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty())
return;
if (selection->isEmpty())
return;
sp_item_rotate_rel(item, rot_neg_90);
}
sp_item_rotate_rel(item, rot_neg_90);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
}
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty())
return;
if (selection->isEmpty())
return;
sp_item_rotate_rel(item, rot_neg_90);
}
sp_item_rotate_rel(item, rot_neg_90);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
void
}
void
@@ -1450,11 +1581,11 @@ sp_selection_rotate(Inkscape::Selection *selection, gdouble const angle_degrees)
if (selection->isEmpty())
return;
if (selection->isEmpty())
return;
- NR::Point const center(selection->bounds().midpoint());
+ NR::Point center = selection->center();
sp_selection_rotate_relative(selection, center, angle_degrees);
sp_selection_rotate_relative(selection, center, angle_degrees);
- sp_document_maybe_done(SP_DT_DOCUMENT(selection->desktop()),
+ sp_document_maybe_done(sp_desktop_document(selection->desktop()),
( ( angle_degrees > 0 )
? "selector:rotate:ccw"
: "selector:rotate:cw" ));
( ( angle_degrees > 0 )
? "selector:rotate:ccw"
: "selector:rotate:cw" ));
return;
NR::Rect const bbox(selection->bounds());
return;
NR::Rect const bbox(selection->bounds());
- NR::Point const center(bbox.midpoint());
+
+ NR::Point center = selection->center();
gdouble const zoom = selection->desktop()->current_zoom();
gdouble const zmove = angle / zoom;
gdouble const zoom = selection->desktop()->current_zoom();
gdouble const zmove = angle / zoom;
sp_selection_rotate_relative(selection, center, zangle);
sp_selection_rotate_relative(selection, center, zangle);
- sp_document_maybe_done(SP_DT_DOCUMENT(selection->desktop()),
+ sp_document_maybe_done(sp_desktop_document(selection->desktop()),
( (angle > 0)
? "selector:rotate:ccw"
: "selector:rotate:cw" ));
( (angle > 0)
? "selector:rotate:ccw"
: "selector:rotate:cw" ));
double const times = 1.0 + grow / max_len;
sp_selection_scale_relative(selection, center, NR::scale(times, times));
double const times = 1.0 + grow / max_len;
sp_selection_scale_relative(selection, center, NR::scale(times, times));
- sp_document_maybe_done(SP_DT_DOCUMENT(selection->desktop()),
+ sp_document_maybe_done(sp_desktop_document(selection->desktop()),
( (grow > 0)
? "selector:scale:larger"
: "selector:scale:smaller" ));
( (grow > 0)
? "selector:scale:larger"
: "selector:scale:smaller" ));
NR::Point const center(selection->bounds().midpoint());
sp_selection_scale_relative(selection, center, NR::scale(times, times));
NR::Point const center(selection->bounds().midpoint());
sp_selection_scale_relative(selection, center, NR::scale(times, times));
- sp_document_done(SP_DT_DOCUMENT(selection->desktop()));
+ sp_document_done(sp_desktop_document(selection->desktop()));
}
void
sp_selection_move(gdouble dx, gdouble dy)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
}
void
sp_selection_move(gdouble dx, gdouble dy)
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
return;
}
if (selection->isEmpty()) {
return;
}
sp_selection_move_relative(selection, dx, dy);
if (dx == 0) {
sp_selection_move_relative(selection, dx, dy);
if (dx == 0) {
- sp_document_maybe_done(SP_DT_DOCUMENT(desktop), "selector:move:vertical");
+ sp_document_maybe_done(sp_desktop_document(desktop), "selector:move:vertical");
} else if (dy == 0) {
} else if (dy == 0) {
- sp_document_maybe_done(SP_DT_DOCUMENT(desktop), "selector:move:horizontal");
+ sp_document_maybe_done(sp_desktop_document(desktop), "selector:move:horizontal");
} else {
} else {
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
}
}
}
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
return;
}
if (selection->isEmpty()) {
return;
}
sp_selection_move_relative(selection, zdx, zdy);
if (dx == 0) {
sp_selection_move_relative(selection, zdx, zdy);
if (dx == 0) {
- sp_document_maybe_done(SP_DT_DOCUMENT(desktop), "selector:move:vertical");
+ sp_document_maybe_done(sp_desktop_document(desktop), "selector:move:vertical");
} else if (dy == 0) {
} else if (dy == 0) {
- sp_document_maybe_done(SP_DT_DOCUMENT(desktop), "selector:move:horizontal");
+ sp_document_maybe_done(sp_desktop_document(desktop), "selector:move:horizontal");
} else {
} else {
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
}
}
}
template <typename D>
SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
template <typename D>
SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
- bool only_in_viewport, bool inlayer, bool onlyvisible, bool onlysensitive);
+ bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive);
template <typename D>
SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items, SPObject *root,
template <typename D>
SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items, SPObject *root,
- bool only_in_viewport, bool inlayer, bool onlyvisible, bool onlysensitive);
+ bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive);
struct Forward {
typedef SPObject *Iterator;
struct Forward {
typedef SPObject *Iterator;
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
g_return_if_fail(desktop != NULL);
{
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
g_return_if_fail(desktop != NULL);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
- bool inlayer = prefs_get_int_attribute ("options.kbselection", "inlayer", 1);
+ PrefsSelectionContext inlayer = (PrefsSelectionContext)prefs_get_int_attribute ("options.kbselection", "inlayer", PREFS_SELECTION_LAYER);
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
SPObject *root;
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
SPObject *root;
- if (inlayer) {
- root = desktop->currentLayer();
+ if (PREFS_SELECTION_ALL != inlayer) {
+ root = selection->activeContext();
} else {
root = desktop->currentRoot();
}
} else {
root = desktop->currentRoot();
}
SPItem *item=next_item_from_list<Forward>(desktop, selection->itemList(), root, SP_CYCLING == SP_CYCLE_VISIBLE, inlayer, onlyvisible, onlysensitive);
if (item) {
SPItem *item=next_item_from_list<Forward>(desktop, selection->itemList(), root, SP_CYCLING == SP_CYCLE_VISIBLE, inlayer, onlyvisible, onlysensitive);
if (item) {
- selection->set(item);
+ selection->set(item, PREFS_SELECTION_LAYER_RECURSIVE == inlayer);
if ( SP_CYCLING == SP_CYCLE_FOCUS ) {
scroll_to_show_item(desktop, item);
}
if ( SP_CYCLING == SP_CYCLE_FOCUS ) {
scroll_to_show_item(desktop, item);
}
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
g_return_if_fail(document != NULL);
g_return_if_fail(desktop != NULL);
SPDesktop *desktop = SP_ACTIVE_DESKTOP;
g_return_if_fail(document != NULL);
g_return_if_fail(desktop != NULL);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
- bool inlayer = prefs_get_int_attribute ("options.kbselection", "inlayer", 1);
+ PrefsSelectionContext inlayer = (PrefsSelectionContext)prefs_get_int_attribute ("options.kbselection", "inlayer", PREFS_SELECTION_LAYER);
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
SPObject *root;
bool onlyvisible = prefs_get_int_attribute ("options.kbselection", "onlyvisible", 1);
bool onlysensitive = prefs_get_int_attribute ("options.kbselection", "onlysensitive", 1);
SPObject *root;
- if (inlayer) {
- root = desktop->currentLayer();
+ if (PREFS_SELECTION_ALL != inlayer) {
+ root = selection->activeContext();
} else {
root = desktop->currentRoot();
}
} else {
root = desktop->currentRoot();
}
SPItem *item=next_item_from_list<Reverse>(desktop, selection->itemList(), root, SP_CYCLING == SP_CYCLE_VISIBLE, inlayer, onlyvisible, onlysensitive);
if (item) {
SPItem *item=next_item_from_list<Reverse>(desktop, selection->itemList(), root, SP_CYCLING == SP_CYCLE_VISIBLE, inlayer, onlyvisible, onlysensitive);
if (item) {
- selection->set(item);
+ selection->set(item, PREFS_SELECTION_LAYER_RECURSIVE == inlayer);
if ( SP_CYCLING == SP_CYCLE_FOCUS ) {
scroll_to_show_item(desktop, item);
}
if ( SP_CYCLING == SP_CYCLE_FOCUS ) {
scroll_to_show_item(desktop, item);
}
template <typename D>
SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items,
template <typename D>
SPItem *next_item_from_list(SPDesktop *desktop, GSList const *items,
- SPObject *root, bool only_in_viewport, bool inlayer, bool onlyvisible, bool onlysensitive)
+ SPObject *root, bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
{
SPObject *current=root;
while (items) {
{
SPObject *current=root;
while (items) {
template <typename D>
SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
template <typename D>
SPItem *next_item(SPDesktop *desktop, GSList *path, SPObject *root,
- bool only_in_viewport, bool inlayer, bool onlyvisible, bool onlysensitive)
+ bool only_in_viewport, PrefsSelectionContext inlayer, bool onlyvisible, bool onlysensitive)
{
typename D::Iterator children;
typename D::Iterator iter;
{
typename D::Iterator children;
typename D::Iterator iter;
while ( iter && !found ) {
SPObject *object=D::object(iter);
if (desktop->isLayer(object)) {
while ( iter && !found ) {
SPObject *object=D::object(iter);
if (desktop->isLayer(object)) {
- if (!inlayer) { // recurse into sublayers
+ if (PREFS_SELECTION_LAYER != inlayer) { // recurse into sublayers
found = next_item<D>(desktop, NULL, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
}
} else if ( SP_IS_ITEM(object) &&
found = next_item<D>(desktop, NULL, object, only_in_viewport, inlayer, onlyvisible, onlysensitive);
}
} else if ( SP_IS_ITEM(object) &&
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
sp_repr_set_attr(clone, "x", "0");
sp_repr_set_attr(clone, "y", "0");
sp_repr_set_attr(clone, "xlink:href", g_strdup_printf("#%s", sel_repr->attribute("id")));
sp_repr_set_attr(clone, "x", "0");
sp_repr_set_attr(clone, "y", "0");
sp_repr_set_attr(clone, "xlink:href", g_strdup_printf("#%s", sel_repr->attribute("id")));
+
+ sp_repr_set_attr(clone, "inkscape:transform-center-x", sel_repr->attribute("inkscape:transform-center-x"));
+ sp_repr_set_attr(clone, "inkscape:transform-center-y", sel_repr->attribute("inkscape:transform-center-y"));
// add the new clone to the top of the original's parent
parent->appendChild(clone);
// add the new clone to the top of the original's parent
parent->appendChild(clone);
Inkscape::GC::release(clone);
}
Inkscape::GC::release(clone);
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
selection->setReprList(newsel);
selection->setReprList(newsel);
if (!desktop)
return;
if (!desktop)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select a <b>clone</b> to unlink."));
if (selection->isEmpty()) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select a <b>clone</b> to unlink."));
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No clones to unlink</b> in the selection."));
}
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No clones to unlink</b> in the selection."));
}
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
}
void
}
void
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
SPItem *item = selection->singleItem();
SPItem *item = selection->singleItem();
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
// restore parent and position
SP_OBJECT_REPR (parent)->appendChild(rect);
rect->setPosition(pos > 0 ? pos : 0);
// restore parent and position
SP_OBJECT_REPR (parent)->appendChild(rect);
rect->setPosition(pos > 0 ? pos : 0);
- SPItem *rectangle = (SPItem *) SP_DT_DOCUMENT (desktop)->getObjectByRepr(rect);
+ SPItem *rectangle = (SPItem *) sp_desktop_document (desktop)->getObjectByRepr(rect);
Inkscape::GC::release(rect);
Inkscape::GC::release(rect);
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
if (!did) {
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No pattern fills</b> in the selection."));
} else {
if (!did) {
desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No pattern fills</b> in the selection."));
} else {
- sp_document_done(SP_DT_DOCUMENT(desktop));
+ sp_document_done(sp_desktop_document(desktop));
selection->setList(new_select);
}
}
selection->setList(new_select);
}
}
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
bool is_empty = selection->isEmpty();
if ( apply_to_layer && is_empty) {
// check if something is selected
bool is_empty = selection->isEmpty();
if ( apply_to_layer && is_empty) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to create mask from."));
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to create clippath or mask from."));
return;
} else if (!apply_to_layer && ( is_empty || NULL == selection->itemList()->next )) {
return;
} else if (!apply_to_layer && ( is_empty || NULL == selection->itemList()->next )) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select mask object and <b>object(s)</b> to apply mask to."));
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select mask object and <b>object(s)</b> to apply clippath or mask to."));
return;
}
return;
}
if (desktop == NULL)
return;
if (desktop == NULL)
return;
- SPDocument *document = SP_DT_DOCUMENT(desktop);
- Inkscape::Selection *selection = SP_DT_SELECTION(desktop);
+ SPDocument *document = sp_desktop_document(desktop);
+ Inkscape::Selection *selection = sp_desktop_selection(desktop);
// check if something is selected
if (selection->isEmpty()) {
// check if something is selected
if (selection->isEmpty()) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to remove mask from."));
+ desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to remove clippath or mask from."));
return;
}
return;
}
obj->deleteObject(false);
}
obj->deleteObject(false);
}
+ // remember parent and position of the item to which the clippath/mask was applied
+ Inkscape::XML::Node *parent = SP_OBJECT_REPR((*it).second)->parent();
+ gint pos = SP_OBJECT_REPR((*it).second)->position();
+
for (GSList *i = items_to_move; NULL != i; i = i->next) {
for (GSList *i = items_to_move; NULL != i; i = i->next) {
- SPItem *item = SP_ITEM(desktop->currentLayer()->appendChildRepr((Inkscape::XML::Node *)i->data));
- selection->add((Inkscape::XML::Node *)i->data);
+ Inkscape::XML::Node *repr = (Inkscape::XML::Node *)i->data;
+
+ // insert into parent, restore pos
+ parent->appendChild(repr);
+ repr->setPosition((pos + 1) > 0 ? (pos + 1) : 0);
- // transform mask, so it is moved the same spot there mask was applied
- NR::Matrix transform (item->transform);
+ SPItem *mask_item = (SPItem *) sp_desktop_document (desktop)->getObjectByRepr(repr);
+ selection->add(repr);
+
+ // transform mask, so it is moved the same spot where mask was applied
+ NR::Matrix transform (mask_item->transform);
transform *= (*it).second->transform;
transform *= (*it).second->transform;
- sp_item_write_transform(item, SP_OBJECT_REPR(item), transform);
+ sp_item_write_transform(mask_item, SP_OBJECT_REPR(mask_item), transform);
}
g_slist_free (items_to_move);
}
g_slist_free (items_to_move);
sp_document_done (document);
}
sp_document_done (document);
}
+void fit_canvas_to_selection(SPDesktop *desktop) {
+ g_return_if_fail(desktop != NULL);
+ SPDocument *doc = sp_desktop_document(desktop);
+
+ g_return_if_fail(doc != NULL);
+ g_return_if_fail(desktop->selection != NULL);
+ g_return_if_fail(!desktop->selection->isEmpty());
+ NRRect bbox = {0,0,0,0};
+
+ desktop->selection->bounds(&bbox);
+ if (!empty(bbox)) {
+ doc->fitToRect(bbox);
+ }
+};
+
+void fit_canvas_to_drawing(SPDocument *doc) {
+ g_return_if_fail(doc != NULL);
+ NRRect bbox = {0,0,0,0};
+
+ sp_document_ensure_up_to_date (doc);
+ sp_item_invoke_bbox(SP_ITEM(doc->root), &bbox, sp_item_i2r_affine(SP_ITEM(doc->root)), TRUE);
+
+ if (!empty(bbox)) {
+ doc->fitToRect(bbox);
+ }
+};
+
+void fit_canvas_to_selection_or_drawing(SPDesktop *desktop) {
+ g_return_if_fail(desktop != NULL);
+ SPDocument *doc = sp_desktop_document(desktop);
+
+ g_return_if_fail(doc != NULL);
+ g_return_if_fail(desktop->selection != NULL);
+
+ if (desktop->selection->isEmpty()) {
+ fit_canvas_to_drawing(doc);
+ } else {
+ fit_canvas_to_selection(desktop);
+ }
+
+ sp_document_done(doc);
+};
+
/*
Local Variables:
mode:c++
/*
Local Variables:
mode:c++