index 4da9b33b86e15680b3588c2cee35c1ab2826a41d..e6684010e6b705c5a1f8a039e1b4674dd21129f5 100644 (file)
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);
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;
}
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);
+ break;
+ }
}
selection->setList (items);
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,
- 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;
g_return_if_fail(desktop != NULL);
Inkscape::Selection *selection = SP_DT_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;
- if (inlayer) {
- root = desktop->currentLayer();
+ if (PREFS_SELECTION_ALL != inlayer) {
+ root = selection->activeContext();
} 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) {
- selection->set(item);
+ selection->set(item, PREFS_SELECTION_LAYER_RECURSIVE == inlayer);
if ( SP_CYCLING == SP_CYCLE_FOCUS ) {
scroll_to_show_item(desktop, item);
}
g_return_if_fail(desktop != NULL);
Inkscape::Selection *selection = SP_DT_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;
- if (inlayer) {
- root = desktop->currentLayer();
+ if (PREFS_SELECTION_ALL != inlayer) {
+ root = selection->activeContext();
} 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) {
- selection->set(item);
+ selection->set(item, PREFS_SELECTION_LAYER_RECURSIVE == inlayer);
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,
- 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) {
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;
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) &&
// 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 )) {
- 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;
}
// 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;
}
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) {
- 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);
+
+ SPItem *mask_item = (SPItem *) SP_DT_DOCUMENT (desktop)->getObjectByRepr(repr);
+ selection->add(repr);
- // transform mask, so it is moved the same spot there mask was applied
- NR::Matrix transform (item->transform);
+ // transform mask, so it is moved the same spot where mask was applied
+ NR::Matrix transform (mask_item->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);