summaryrefslogtreecommitdiffstats
path: root/src/selection-chemistry.cpp
diff options
context:
space:
mode:
authorMarkus Engel <markus.engel@tum.de>2013-07-14 21:09:41 +0000
committerMarkus Engel <markus.engel@tum.de>2013-07-14 21:09:41 +0000
commitd32efb61f1c2c18d1018e510bbe9bafc04a03905 (patch)
treeb447bf9856baf1cf485e38c4ce55edb27285129e /src/selection-chemistry.cpp
parentMerged from trunk (r12305) (diff)
parentMinor C++ish refactoring pass. (diff)
downloadinkscape-d32efb61f1c2c18d1018e510bbe9bafc04a03905.tar.gz
inkscape-d32efb61f1c2c18d1018e510bbe9bafc04a03905.zip
Merged from trunk (r12419).
(bzr r11608.1.107)
Diffstat (limited to 'src/selection-chemistry.cpp')
-rw-r--r--src/selection-chemistry.cpp179
1 files changed, 98 insertions, 81 deletions
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index bea65a8e6..983742d32 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -35,6 +35,7 @@ SPCycleType SP_CYCLING = SP_CYCLE_FOCUS;
#include "desktop.h"
#include "desktop-style.h"
#include "dir-util.h"
+#include "layer-model.h"
#include "selection.h"
#include "tools-switch.h"
#include "desktop-handles.h"
@@ -124,6 +125,21 @@ because the layer manipulation code uses them. It should be rewritten specifical
for that purpose. */
+// helper for printing error messages, regardless of whether we have a GUI or not
+// If desktop == NULL, errors will be shown on stderr
+static void
+selection_display_message(SPDesktop *desktop, Inkscape::MessageType msgType, Glib::ustring const &msg)
+{
+ if (desktop) {
+ desktop->messageStack()->flash(msgType, msg);
+ } else {
+ if (msgType == Inkscape::IMMEDIATE_MESSAGE ||
+ msgType == Inkscape::WARNING_MESSAGE ||
+ msgType == Inkscape::ERROR_MESSAGE) {
+ g_printerr("%s\n", msg.c_str());
+ }
+ }
+}
namespace Inkscape {
@@ -250,6 +266,36 @@ void SelectionHelper::selectPrev(SPDesktop *dt)
}
}
+/*
+ * Fixes the current selection, removing locked objects from it
+ */
+void SelectionHelper::fixSelection(SPDesktop *dt)
+{
+ if(!dt)
+ return;
+
+ Inkscape::Selection *selection = sp_desktop_selection(dt);
+
+ GSList *items = NULL;
+
+ GSList const *selList = selection->itemList();
+
+ for( GSList const *i = selList; i; i = i->next ) {
+ if( SP_IS_ITEM(i->data) &&
+ !dt->isLayer(SP_ITEM(i->data)) &&
+ (!SP_ITEM(i->data)->isLocked()))
+ {
+ items = g_slist_prepend(items, SP_ITEM(i->data));
+ }
+ }
+
+ selection->setList(items);
+
+ if(items) {
+ g_slist_free(items);
+ }
+}
+
} // namespace Inkscape
@@ -491,16 +537,16 @@ void sp_selection_duplicate(SPDesktop *desktop, bool suppressDone)
g_slist_free(newsel);
}
-void sp_edit_clear_all(SPDesktop *dt)
+void sp_edit_clear_all(Inkscape::Selection *selection)
{
- if (!dt)
+ if (!selection)
return;
- SPDocument *doc = sp_desktop_document(dt);
- sp_desktop_selection(dt)->clear();
+ SPDocument *doc = selection->layers()->getDocument();
+ selection->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(selection->layers()->currentLayer()));
+ GSList *items = sp_item_group_item_list(SP_GROUP(selection->layers()->currentLayer()));
while (items) {
reinterpret_cast<SPObject*>(items->data)->deleteObject();
@@ -691,20 +737,14 @@ static void sp_selection_group_impl(GSList *p, Inkscape::XML::Node *group, Inksc
group->setPosition(topmost + 1);
}
-void sp_selection_group(SPDesktop *desktop)
+void sp_selection_group(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (desktop == NULL) {
- return;
- }
-
- SPDocument *doc = sp_desktop_document(desktop);
+ SPDocument *doc = selection->layers()->getDocument();
Inkscape::XML::Document *xml_doc = doc->getReprDoc();
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
-
// Check if something is selected.
if (selection->isEmpty()) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>some objects</b> to group."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>some objects</b> to group."));
return;
}
@@ -718,22 +758,17 @@ void sp_selection_group(SPDesktop *desktop)
sp_selection_group_impl(p, group, xml_doc, doc);
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_GROUP,
+ DocumentUndo::done(doc, SP_VERB_SELECTION_GROUP,
_("Group"));
selection->set(group);
Inkscape::GC::release(group);
}
-void sp_selection_ungroup(SPDesktop *desktop)
+void sp_selection_ungroup(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (desktop == NULL)
- return;
-
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
-
if (selection->isEmpty()) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select a <b>group</b> to ungroup."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select a <b>group</b> to ungroup."));
return;
}
@@ -754,8 +789,10 @@ void sp_selection_ungroup(SPDesktop *desktop)
continue;
}
- /* We do not allow ungrouping <svg> etc. (lauris) */
- if (strcmp(group->getRepr()->name(), "svg:g") && strcmp(group->getRepr()->name(), "svg:switch")) {
+ // This check reflects the g_return_if_fail in sp_item_group_ungroup and
+ // may be a redundent. It also allows ungrouping of 'a' tags and we dont
+ if (strcmp(group->getRepr()->name(), "svg:g") && strcmp(group->getRepr()->name(), "svg:switch") &&
+ strcmp(group->getRepr()->name(), "svg:svg")) {
// keep the non-group item in the new selection
new_select = g_slist_append(new_select, group);
continue;
@@ -774,12 +811,12 @@ void sp_selection_ungroup(SPDesktop *desktop)
g_slist_free(new_select);
}
if (!ungrouped) {
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("<b>No groups</b> to ungroup in the selection."));
+ selection_display_message(desktop, Inkscape::ERROR_MESSAGE, _("<b>No groups</b> to ungroup in the selection."));
}
g_slist_free(items);
-
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_UNGROUP,
+
+ DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_UNGROUP,
_("Ungroup"));
}
@@ -857,22 +894,17 @@ static SPObject *prev_sibling(SPObject *child)
}
void
-sp_selection_raise(SPDesktop *desktop)
+sp_selection_raise(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (!desktop)
- return;
-
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
-
GSList const *items = const_cast<GSList *>(selection->itemList());
if (!items) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise."));
return;
}
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
+ selection_display_message(desktop, Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
return;
}
@@ -910,21 +942,17 @@ sp_selection_raise(SPDesktop *desktop)
g_slist_free(rev);
}
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_RAISE,
+ DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_RAISE,
//TRANSLATORS: "Raise" means "to raise an object" in the undo history
C_("Undo action", "Raise"));
}
-void sp_selection_raise_to_top(SPDesktop *desktop)
+void sp_selection_raise_to_top(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (desktop == NULL)
- return;
-
- SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ SPDocument *document = selection->layers()->getDocument();
if (selection->isEmpty()) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise to top."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to raise to top."));
return;
}
@@ -932,7 +960,7 @@ void sp_selection_raise_to_top(SPDesktop *desktop)
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
+ selection_display_message(desktop, Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
return;
}
@@ -950,22 +978,17 @@ void sp_selection_raise_to_top(SPDesktop *desktop)
_("Raise to top"));
}
-void sp_selection_lower(SPDesktop *desktop)
+void sp_selection_lower(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (desktop == NULL)
- return;
-
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
-
GSList const *items = const_cast<GSList *>(selection->itemList());
if (!items) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower."));
return;
}
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
+ selection_display_message(desktop, Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
return;
}
@@ -1008,20 +1031,16 @@ void sp_selection_lower(SPDesktop *desktop)
g_slist_free(rev);
}
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_SELECTION_LOWER,
+ DocumentUndo::done(selection->layers()->getDocument(), SP_VERB_SELECTION_LOWER,
_("Lower"));
}
-void sp_selection_lower_to_bottom(SPDesktop *desktop)
+void sp_selection_lower_to_bottom(Inkscape::Selection *selection, SPDesktop *desktop)
{
- if (desktop == NULL)
- return;
-
- SPDocument *document = sp_desktop_document(desktop);
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
+ SPDocument *document = selection->layers()->getDocument();
if (selection->isEmpty()) {
- desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower to bottom."));
+ selection_display_message(desktop, Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to lower to bottom."));
return;
}
@@ -1029,7 +1048,7 @@ void sp_selection_lower_to_bottom(SPDesktop *desktop)
SPGroup const *group = sp_item_list_common_parent_group(items);
if (!group) {
- desktop->messageStack()->flash(Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
+ selection_display_message(desktop, Inkscape::ERROR_MESSAGE, _("You cannot raise/lower objects from <b>different groups</b> or <b>layers</b>."));
return;
}
@@ -2125,49 +2144,49 @@ sp_selection_scale_times(Inkscape::Selection *selection, gdouble times)
}
void
-sp_selection_move(SPDesktop *desktop, gdouble dx, gdouble dy)
+sp_selection_move(Inkscape::Selection *selection, gdouble dx, gdouble dy)
{
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
if (selection->isEmpty()) {
return;
}
sp_selection_move_relative(selection, dx, dy);
+ SPDocument *doc = selection->layers()->getDocument();
if (dx == 0) {
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "selector:move:vertical", SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::maybeDone(doc, "selector:move:vertical", SP_VERB_CONTEXT_SELECT,
_("Move vertically"));
} else if (dy == 0) {
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "selector:move:horizontal", SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::maybeDone(doc, "selector:move:horizontal", SP_VERB_CONTEXT_SELECT,
_("Move horizontally"));
} else {
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::done(doc, SP_VERB_CONTEXT_SELECT,
_("Move"));
}
}
void
-sp_selection_move_screen(SPDesktop *desktop, gdouble dx, gdouble dy)
+sp_selection_move_screen(Inkscape::Selection *selection, gdouble dx, gdouble dy)
{
- Inkscape::Selection *selection = sp_desktop_selection(desktop);
- if (selection->isEmpty()) {
+ if (selection->isEmpty() || !selection->desktop()) {
return;
}
// same as sp_selection_move but divide deltas by zoom factor
- gdouble const zoom = desktop->current_zoom();
+ gdouble const zoom = selection->desktop()->current_zoom();
gdouble const zdx = dx / zoom;
gdouble const zdy = dy / zoom;
sp_selection_move_relative(selection, zdx, zdy);
+ SPDocument *doc = selection->layers()->getDocument();
if (dx == 0) {
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "selector:move:vertical", SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::maybeDone(doc, "selector:move:vertical", SP_VERB_CONTEXT_SELECT,
_("Move vertically by pixels"));
} else if (dy == 0) {
- DocumentUndo::maybeDone(sp_desktop_document(desktop), "selector:move:horizontal", SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::maybeDone(doc, "selector:move:horizontal", SP_VERB_CONTEXT_SELECT,
_("Move horizontally by pixels"));
} else {
- DocumentUndo::done(sp_desktop_document(desktop), SP_VERB_CONTEXT_SELECT,
+ DocumentUndo::done(doc, SP_VERB_CONTEXT_SELECT,
_("Move"));
}
}
@@ -3000,19 +3019,17 @@ void sp_selection_unsymbol(SPDesktop *desktop)
return;
}
- SPObject* use = selection->single();
+ SPObject* symbol = selection->single();
// Make sure we have only one object in selection.
// Require that we really have a <use> that references a <symbol>.
- if( use == NULL || ( !SP_IS_USE( use ) && !SP_IS_SYMBOL( use->firstChild() ))) {
+ if( symbol == NULL || !SP_IS_SYMBOL( symbol )) {
desktop->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select only one <b>symbol</b> to convert to group."));
return;
}
doc->ensureUpToDate();
- SPObject* symbol = use->firstChild();
-
Inkscape::XML::Node *group = xml_doc->createElement("svg:g");
group->setAttribute("style", symbol->getAttribute("style"));
group->setAttribute("title", symbol->getAttribute("title"));
@@ -3030,14 +3047,14 @@ void sp_selection_unsymbol(SPDesktop *desktop)
child->deleteObject(true);
}
- SPObject* parent = use->parent; // So we insert <g> next to <use> (easier to find)
+ // So we insert <g> inside the current layer
+ SPObject *parent = desktop->currentLayer();
// Need to delete <symbol>; all other <use> elements that referenced <symbol> should
// auto-magically reference <g>.
symbol->deleteObject(true);
group->setAttribute("id",id.c_str()); // After we delete symbol with same id.
parent->getRepr()->appendChild(group);
- //use->deleteObject(true);
SPItem *group_item = static_cast<SPItem *>(sp_desktop_document(desktop)->getObjectByRepr(group));
Inkscape::GC::release(group);
@@ -3765,7 +3782,7 @@ void sp_selection_unset_mask(SPDesktop *desktop, bool apply_clip_path) {
}
// collect distinct mask object (and associate with item to apply transform)
- if (NULL != uri_ref && NULL != uri_ref->getObject()) {
+ if ((NULL != uri_ref) && (NULL != uri_ref->getObject())) {
referenced_objects[uri_ref->getObject()] = item;
}
}