summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-09-22 12:14:14 +0000
committerJohn Smith <john.smith7545@yahoo.com>2012-09-22 12:14:14 +0000
commit3f61bc675d5f2f0c92d7906b8552b09df3cd411f (patch)
treea8fdb8a10dd8d071c703d2cb7e1984a528001ea3 /src
parentFix for 367548 : Invert doesnt work on objects with gradients (diff)
downloadinkscape-3f61bc675d5f2f0c92d7906b8552b09df3cd411f.tar.gz
inkscape-3f61bc675d5f2f0c92d7906b8552b09df3cd411f.zip
Fix for 172222 : Move direct to specified layer
(bzr r11695)
Diffstat (limited to 'src')
-rw-r--r--src/interface.cpp18
-rw-r--r--src/interface.h1
-rw-r--r--src/menus-skeleton.h1
-rw-r--r--src/selection-chemistry.cpp30
-rw-r--r--src/selection-chemistry.h1
-rw-r--r--src/ui/dialog/layer-properties.cpp147
-rw-r--r--src/ui/dialog/layer-properties.h44
-rw-r--r--src/ui/dialog/livepatheffect-add.cpp3
-rw-r--r--src/verbs.cpp6
-rw-r--r--src/verbs.h1
10 files changed, 249 insertions, 3 deletions
diff --git a/src/interface.cpp b/src/interface.cpp
index acd56f8da..c3dbc47c8 100644
--- a/src/interface.cpp
+++ b/src/interface.cpp
@@ -79,6 +79,7 @@
// #include "inkscape.h"
#include "ui/dialog/dialog-manager.h"
// #include "../xml/repr.h"
+#include "ui/dialog/layer-properties.h"
#include <gdk/gdkkeysyms.h>
#include <gtk/gtk.h>
@@ -1823,6 +1824,16 @@ void ContextMenu::MakeItemMenu (void)
mi->show();
select_same_submenu->append(*mi);
+ /* Move to layer */
+ mi = manage(new Gtk::MenuItem(_("_Move to layer ..."),1));
+ if (_desktop->selection->isEmpty()) {
+ mi->set_sensitive(FALSE);
+ } else {
+ mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ItemMoveTo));
+ }
+ mi->show();
+ append(*mi);
+
/* Create link */
mi = manage(new Gtk::MenuItem(_("Create _Link"),1));
mi->signal_activate().connect(sigc::mem_fun(*this, &ContextMenu::ItemCreateLink));
@@ -1938,6 +1949,13 @@ void ContextMenu::ItemSelectThis(void)
_desktop->selection->set(_item);
}
+void ContextMenu::ItemMoveTo(void)
+{
+ Inkscape::UI::Dialogs::LayerPropertiesDialog::showMove(_desktop, _desktop->currentLayer());
+}
+
+
+
void ContextMenu::ItemCreateLink(void)
{
Inkscape::XML::Document *xml_doc = _desktop->doc()->getReprDoc();
diff --git a/src/interface.h b/src/interface.h
index aa0281db3..ef520be28 100644
--- a/src/interface.h
+++ b/src/interface.h
@@ -171,6 +171,7 @@ class ContextMenu : public Gtk::Menu
//callbacks for the context menu entries of an SP_TYPE_ITEM object
void ItemProperties(void);
void ItemSelectThis(void);
+ void ItemMoveTo(void);
void SelectSameFillStroke(void);
void SelectSameFillColor(void);
void SelectSameStrokeColor(void);
diff --git a/src/menus-skeleton.h b/src/menus-skeleton.h
index 999fb52fc..09366a33f 100644
--- a/src/menus-skeleton.h
+++ b/src/menus-skeleton.h
@@ -167,6 +167,7 @@ static char const menus_skeleton[] =
" <separator/>\n"
" <verb verb-id=\"LayerMoveToNext\" />\n"
" <verb verb-id=\"LayerMoveToPrev\" />\n"
+" <verb verb-id=\"LayerMoveTo\" />\n"
" <separator/>\n"
" <verb verb-id=\"LayerRaise\" />\n"
" <verb verb-id=\"LayerLower\" />\n"
diff --git a/src/selection-chemistry.cpp b/src/selection-chemistry.cpp
index 068928d8f..4cdab4336 100644
--- a/src/selection-chemistry.cpp
+++ b/src/selection-chemistry.cpp
@@ -1314,6 +1314,36 @@ void sp_selection_to_prev_layer(SPDesktop *dt, bool suppressDone)
g_slist_free(const_cast<GSList *>(items));
}
+void sp_selection_to_layer(SPDesktop *dt, SPObject *moveto, bool suppressDone)
+{
+ Inkscape::Selection *selection = sp_desktop_selection(dt);
+
+ // check if something is selected
+ if (selection->isEmpty()) {
+ dt->messageStack()->flash(Inkscape::WARNING_MESSAGE, _("Select <b>object(s)</b> to move."));
+ return;
+ }
+
+ GSList const *items = g_slist_copy(const_cast<GSList *>(selection->itemList()));
+
+ if (moveto) {
+ GSList *temp_clip = NULL;
+ sp_selection_copy_impl(items, &temp_clip, dt->doc()->getReprDoc()); // we're in the same doc, so no need to copy defs
+ sp_selection_delete_impl(items, false, false);
+ GSList *copied = sp_selection_paste_impl(sp_desktop_document(dt), moveto, &temp_clip);
+ selection->setReprList((GSList const *) copied);
+ g_slist_free(copied);
+ if (temp_clip) g_slist_free(temp_clip);
+ if (moveto) dt->setCurrentLayer(moveto);
+ if ( !suppressDone ) {
+ DocumentUndo::done(sp_desktop_document(dt), SP_VERB_LAYER_MOVE_TO,
+ _("Move selection to layer"));
+ }
+ }
+
+ g_slist_free(const_cast<GSList *>(items));
+}
+
bool
selection_contains_original(SPItem *item, Inkscape::Selection *selection)
{
diff --git a/src/selection-chemistry.h b/src/selection-chemistry.h
index 0ae2a9b06..3c9c1aea9 100644
--- a/src/selection-chemistry.h
+++ b/src/selection-chemistry.h
@@ -97,6 +97,7 @@ void sp_selection_paste_size_separately(SPDesktop *desktop, bool apply_x, bool a
void sp_selection_to_next_layer( SPDesktop *desktop, bool suppressDone = false );
void sp_selection_to_prev_layer( SPDesktop *desktop, bool suppressDone = false );
+void sp_selection_to_layer( SPDesktop *desktop, SPObject *layer, bool suppressDone = false );
void sp_selection_apply_affine(Inkscape::Selection *selection, Geom::Affine const &affine, bool set_i2d = true, bool compensate = true);
void sp_selection_remove_transform (SPDesktop *desktop);
diff --git a/src/ui/dialog/layer-properties.cpp b/src/ui/dialog/layer-properties.cpp
index 465192aee..35a235dbc 100644
--- a/src/ui/dialog/layer-properties.cpp
+++ b/src/ui/dialog/layer-properties.cpp
@@ -28,7 +28,10 @@
#include "sp-item.h"
#include "verbs.h"
#include "selection.h"
-
+#include "selection-chemistry.h"
+#include "ui/icon-names.h"
+#include "ui/widget/imagetoggler.h"
+#include "event-context.h"
namespace Inkscape {
namespace UI {
@@ -51,7 +54,7 @@ LayerPropertiesDialog::LayerPropertiesDialog()
0, 1, 0, 1, Gtk::FILL, Gtk::FILL);
_layout_table.attach(_layer_name_entry,
1, 2, 0, 1, Gtk::FILL | Gtk::EXPAND, Gtk::FILL);
- mainVBox->pack_start(_layout_table, false, false, 4);
+ mainVBox->pack_start(_layout_table, true, true, 4);
// Buttons
_close_button.set_use_stock(true);
@@ -82,6 +85,7 @@ LayerPropertiesDialog::LayerPropertiesDialog()
}
LayerPropertiesDialog::~LayerPropertiesDialog() {
+
_setDesktop(NULL);
_setLayer(NULL);
}
@@ -168,6 +172,131 @@ LayerPropertiesDialog::_setup_position_controls() {
show_all_children();
}
+void
+LayerPropertiesDialog::_setup_layers_controls() {
+
+ ModelColumns *zoop = new ModelColumns();
+ _model = zoop;
+ _store = Gtk::TreeStore::create( *zoop );
+ _tree.set_model( _store );
+ _tree.set_headers_visible(false);
+
+ Inkscape::UI::Widget::ImageToggler *eyeRenderer = manage( new Inkscape::UI::Widget::ImageToggler(
+ INKSCAPE_ICON("object-visible"), INKSCAPE_ICON("object-hidden")) );
+ int visibleColNum = _tree.append_column("vis", *eyeRenderer) - 1;
+ Gtk::TreeViewColumn* col = _tree.get_column(visibleColNum);
+ if ( col ) {
+ col->add_attribute( eyeRenderer->property_active(), _model->_colVisible );
+ }
+
+ Inkscape::UI::Widget::ImageToggler * renderer = manage( new Inkscape::UI::Widget::ImageToggler(
+ INKSCAPE_ICON("object-locked"), INKSCAPE_ICON("object-unlocked")) );
+ int lockedColNum = _tree.append_column("lock", *renderer) - 1;
+ col = _tree.get_column(lockedColNum);
+ if ( col ) {
+ col->add_attribute( renderer->property_active(), _model->_colLocked );
+ }
+
+ Gtk::CellRendererText *_text_renderer = manage(new Gtk::CellRendererText());
+ int nameColNum = _tree.append_column("Name", *_text_renderer) - 1;
+ Gtk::TreeView::Column *_name_column = _tree.get_column(nameColNum);
+ _name_column->add_attribute(_text_renderer->property_text(), _model->_colLabel);
+
+ _tree.set_expander_column( *_tree.get_column(nameColNum) );
+ _tree.signal_key_press_event().connect( sigc::mem_fun(*this, &LayerPropertiesDialog::_handleKeyEvent), false );
+ _tree.signal_button_press_event().connect_notify( sigc::mem_fun(*this, &LayerPropertiesDialog::_handleButtonEvent) );
+
+ _scroller.add( _tree );
+ _scroller.set_policy( Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC );
+ _scroller.set_shadow_type(Gtk::SHADOW_IN);
+ _scroller.set_size_request(220, 180);
+
+ SPDocument* document = _desktop->doc();
+ SPRoot* root = document->getRoot();
+ if ( root ) {
+ SPObject* target = _desktop->currentLayer();
+ _store->clear();
+ _addLayer( document, (SPObject *)root, 0, target, 0 );
+ }
+
+ _layout_table.remove(_layer_name_entry);
+ _layout_table.remove(_layer_name_label);
+
+ _layout_table.attach(_scroller,
+ 0, 2, 1, 2, Gtk::FILL | Gtk::EXPAND, Gtk::FILL | Gtk::EXPAND);
+ show_all_children();
+}
+
+void LayerPropertiesDialog::_addLayer( SPDocument* doc, SPObject* layer, Gtk::TreeModel::Row* parentRow, SPObject* target, int level )
+{
+ int _maxNestDepth = 20;
+ if ( _desktop && _desktop->layer_manager && layer && (level < _maxNestDepth) ) {
+ unsigned int counter = _desktop->layer_manager->childCount(layer);
+ for ( unsigned int i = 0; i < counter; i++ ) {
+ SPObject *child = _desktop->layer_manager->nthChildOf(layer, i);
+ if ( child ) {
+#if DUMP_LAYERS
+ g_message(" %3d layer:%p {%s} [%s]", level, child, child->id, child->label() );
+#endif // DUMP_LAYERS
+
+ Gtk::TreeModel::iterator iter = parentRow ? _store->prepend(parentRow->children()) : _store->prepend();
+ Gtk::TreeModel::Row row = *iter;
+ row[_model->_colObject] = child;
+ row[_model->_colLabel] = child->label() ? child->label() : child->getId();
+ row[_model->_colVisible] = SP_IS_ITEM(child) ? !SP_ITEM(child)->isHidden() : false;
+ row[_model->_colLocked] = SP_IS_ITEM(child) ? SP_ITEM(child)->isLocked() : false;
+
+ if ( target && child == target ) {
+ _tree.expand_to_path( _store->get_path(iter) );
+
+ Glib::RefPtr<Gtk::TreeSelection> select = _tree.get_selection();
+ select->select(iter);
+
+ //_checkTreeSelection();
+ }
+
+ _addLayer( doc, child, &row, target, level + 1 );
+ }
+ }
+ }
+}
+
+SPObject* LayerPropertiesDialog::_selectedLayer()
+{
+ SPObject* obj = 0;
+
+ Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
+ if ( iter ) {
+ Gtk::TreeModel::Row row = *iter;
+ obj = row[_model->_colObject];
+ }
+
+ return obj;
+}
+
+bool LayerPropertiesDialog::_handleKeyEvent(GdkEventKey *event)
+{
+
+ switch (get_group0_keyval(event)) {
+ case GDK_KEY_Return:
+ case GDK_KEY_KP_Enter: {
+ _strategy->perform(*this);
+ _close();
+ return true;
+ }
+ break;
+ }
+ return false;
+}
+
+void LayerPropertiesDialog::_handleButtonEvent(GdkEventButton* event)
+{
+ if ( (event->type == GDK_2BUTTON_PRESS) && (event->button == 1) ) {
+ _strategy->perform(*this);
+ _close();
+ }
+}
+
/** Formats the label for a given layer row
*/
void LayerPropertiesDialog::_prepareLabelRenderer(
@@ -231,6 +360,20 @@ void LayerPropertiesDialog::Create::perform(LayerPropertiesDialog &dialog) {
desktop->messageStack()->flash(Inkscape::NORMAL_MESSAGE, _("New layer created."));
}
+void LayerPropertiesDialog::Move::setup(LayerPropertiesDialog &dialog) {
+ dialog.set_title(_("Move to Layer"));
+ //TODO: find an unused layer number, forming name from _("Layer ") + "%d"
+ dialog._layer_name_entry.set_text(_("Layer"));
+ dialog._apply_button.set_label(_("_Move"));
+ dialog._setup_layers_controls();
+}
+
+void LayerPropertiesDialog::Move::perform(LayerPropertiesDialog &dialog) {
+
+ SPObject *moveto = dialog._selectedLayer();
+ sp_selection_to_layer(dialog._desktop, moveto, false);
+}
+
void LayerPropertiesDialog::_setDesktop(SPDesktop *desktop) {
if (desktop) {
Inkscape::GC::anchor (desktop);
diff --git a/src/ui/dialog/layer-properties.h b/src/ui/dialog/layer-properties.h
index c7d7de130..46b31ad35 100644
--- a/src/ui/dialog/layer-properties.h
+++ b/src/ui/dialog/layer-properties.h
@@ -18,8 +18,12 @@
#include <gtkmm/table.h>
#include <gtkmm/combobox.h>
#include <gtkmm/liststore.h>
+#include <gtkmm/treeview.h>
+#include <gtkmm/treestore.h>
+#include <gtkmm/scrolledwindow.h>
#include "layer-fns.h"
+#include "ui/widget/layer-selector.h"
class SPDesktop;
@@ -40,6 +44,9 @@ class LayerPropertiesDialog : public Gtk::Dialog {
static void showCreate(SPDesktop *desktop, SPObject *layer) {
_showDialog(Create::instance(), desktop, layer);
}
+ static void showMove(SPDesktop *desktop, SPObject *layer) {
+ _showDialog(Move::instance(), desktop, layer);
+ }
protected:
struct Strategy {
@@ -57,9 +64,15 @@ protected:
void setup(LayerPropertiesDialog &dialog);
void perform(LayerPropertiesDialog &dialog);
};
+ struct Move : public Strategy {
+ static Move &instance() { static Move instance; return instance; }
+ void setup(LayerPropertiesDialog &dialog);
+ void perform(LayerPropertiesDialog &dialog);
+ };
friend class Rename;
friend class Create;
+ friend class Move;
Strategy *_strategy;
SPDesktop *_desktop;
@@ -82,6 +95,31 @@ protected:
Gtk::Table _layout_table;
bool _position_visible;
+ class ModelColumns : public Gtk::TreeModel::ColumnRecord
+ {
+ public:
+
+ ModelColumns()
+ {
+ add(_colObject);
+ add(_colVisible);
+ add(_colLocked);
+ add(_colLabel);
+ }
+ virtual ~ModelColumns() {}
+
+ Gtk::TreeModelColumn<SPObject*> _colObject;
+ Gtk::TreeModelColumn<Glib::ustring> _colLabel;
+ Gtk::TreeModelColumn<bool> _colVisible;
+ Gtk::TreeModelColumn<bool> _colLocked;
+ };
+
+ Gtk::TreeView _tree;
+ ModelColumns* _model;
+ Glib::RefPtr<Gtk::TreeStore> _store;
+ Gtk::ScrolledWindow _scroller;
+
+
PositionDropdownColumns _dropdown_columns;
Gtk::CellRendererText _label_renderer;
Glib::RefPtr<Gtk::ListStore> _dropdown_list;
@@ -104,8 +142,14 @@ protected:
void _close();
void _setup_position_controls();
+ void _setup_layers_controls();
void _prepareLabelRenderer(Gtk::TreeModel::const_iterator const &row);
+ void _addLayer( SPDocument* doc, SPObject* layer, Gtk::TreeModel::Row* parentRow, SPObject* target, int level );
+ SPObject* _selectedLayer();
+ bool _handleKeyEvent(GdkEventKey *event);
+ void _handleButtonEvent(GdkEventButton* event);
+
private:
LayerPropertiesDialog(LayerPropertiesDialog const &); // no copy
LayerPropertiesDialog &operator=(LayerPropertiesDialog const &); // no assign
diff --git a/src/ui/dialog/livepatheffect-add.cpp b/src/ui/dialog/livepatheffect-add.cpp
index c22aace37..e899dbcfc 100644
--- a/src/ui/dialog/livepatheffect-add.cpp
+++ b/src/ui/dialog/livepatheffect-add.cpp
@@ -48,6 +48,7 @@ LivePathEffectAdd::LivePathEffectAdd() :
effectlist_treeview.set_model(effectlist_store);
effectlist_treeview.set_headers_visible(false);
effectlist_treeview.append_column("Name", _columns.name);
+ //effectlist_treeview.set_activates_default(true);
/**
* Initialize Effect list
@@ -68,7 +69,7 @@ LivePathEffectAdd::LivePathEffectAdd() :
* Buttons
*/
close_button.set_use_stock(true);
- close_button.set_can_default();
+ //close_button.set_can_default();
add_button.set_use_underline(true);
add_button.set_can_default();
diff --git a/src/verbs.cpp b/src/verbs.cpp
index d02472383..edfc45f8e 100644
--- a/src/verbs.cpp
+++ b/src/verbs.cpp
@@ -1190,6 +1190,10 @@ void LayerVerb::perform(SPAction *action, void *data)
sp_selection_to_prev_layer(dt);
break;
}
+ case SP_VERB_LAYER_MOVE_TO: {
+ Inkscape::UI::Dialogs::LayerPropertiesDialog::showMove(dt, dt->currentLayer());
+ break;
+ }
case SP_VERB_LAYER_TO_TOP:
case SP_VERB_LAYER_TO_BOTTOM:
case SP_VERB_LAYER_RAISE:
@@ -2465,6 +2469,8 @@ Verb *Verb::_base_verbs[] = {
N_("Move selection to the layer above the current"), INKSCAPE_ICON("selection-move-to-layer-above")),
new LayerVerb(SP_VERB_LAYER_MOVE_TO_PREV, "LayerMoveToPrev", N_("Move Selection to Layer Bel_ow"),
N_("Move selection to the layer below the current"), INKSCAPE_ICON("selection-move-to-layer-below")),
+ new LayerVerb(SP_VERB_LAYER_MOVE_TO, "LayerMoveTo", N_("Move Selection to Layer..."),
+ N_("Move selection to layer"), INKSCAPE_ICON("layer-rename")),
new LayerVerb(SP_VERB_LAYER_TO_TOP, "LayerToTop", N_("Layer to _Top"),
N_("Raise the current layer to the top"), INKSCAPE_ICON("layer-top")),
new LayerVerb(SP_VERB_LAYER_TO_BOTTOM, "LayerToBottom", N_("Layer to _Bottom"),
diff --git a/src/verbs.h b/src/verbs.h
index 2f0ae85c1..aa801803c 100644
--- a/src/verbs.h
+++ b/src/verbs.h
@@ -139,6 +139,7 @@ enum {
SP_VERB_LAYER_PREV,
SP_VERB_LAYER_MOVE_TO_NEXT,
SP_VERB_LAYER_MOVE_TO_PREV,
+ SP_VERB_LAYER_MOVE_TO,
SP_VERB_LAYER_TO_TOP,
SP_VERB_LAYER_TO_BOTTOM,
SP_VERB_LAYER_RAISE,