summaryrefslogtreecommitdiffstats
path: root/src/ui
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2017-05-23 20:48:47 +0000
committerMarc Jeanmougin <marcjeanmougin@free.fr>2017-05-23 20:48:47 +0000
commitde37ea2c3d4a1c857186dda0b113da04cd2bd79b (patch)
tree4b52381825a1d0efcbe4cada1c4bf61ade04b6a1 /src/ui
parentcmake/MSYS2: Include libyaml for xverb feature (diff)
parentselection chemistry: cancel if we hit top/bottom (diff)
downloadinkscape-de37ea2c3d4a1c857186dda0b113da04cd2bd79b.tar.gz
inkscape-de37ea2c3d4a1c857186dda0b113da04cd2bd79b.zip
merge chr[] branch : Objects panel improvements, mem leaks.
(bzr r15700)
Diffstat (limited to 'src/ui')
-rw-r--r--src/ui/dialog/objects.cpp115
-rw-r--r--src/ui/dialog/objects.h5
-rw-r--r--src/ui/widget/clipmaskicon.cpp24
-rw-r--r--src/ui/widget/clipmaskicon.h4
4 files changed, 91 insertions, 57 deletions
diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp
index c7c696cdc..fd78fec90 100644
--- a/src/ui/dialog/objects.cpp
+++ b/src/ui/dialog/objects.cpp
@@ -30,6 +30,7 @@
#include "helper/action.h"
#include "inkscape.h"
#include "layer-manager.h"
+#include "shortcuts.h"
#include "sp-clippath.h"
#include "sp-mask.h"
#include "sp-root.h"
@@ -308,11 +309,13 @@ void ObjectsPanel::_objectsChanged(SPObject */*obj*/)
SPRoot* root = document->getRoot();
if ( root ) {
_selectedConnection.block();
+ _documentChangedCurrentLayer.block();
//Clear the tree store
_store->clear();
//Add all items recursively
_addObject( root, 0 );
_selectedConnection.unblock();
+ _documentChangedCurrentLayer.unblock();
//Set the tree selection
_objectsSelected(_desktop->selection);
//Handle button sensitivity
@@ -350,13 +353,17 @@ void ObjectsPanel::_addObject(SPObject* obj, Gtk::TreeModel::Row* parentRow)
row[_model->_colLocked] = !item->isSensitive();
row[_model->_colType] = group ? (group->layerMode() == SPGroup::LAYER ? 2 : 1) : 0;
row[_model->_colHighlight] = item->isHighlightSet() ? item->highlight_color() : item->highlight_color() & 0xffffff00;
- row[_model->_colClipMask] = item->clip_ref && item->clip_ref->getObject() ? 1 : (item->mask_ref && item->mask_ref->getObject() ? 2 : 0);
+ row[_model->_colClipMask] = item ? (
+ (item->clip_ref && item->clip_ref->getObject() ? 1 : 0) |
+ (item->mask_ref && item->mask_ref->getObject() ? 2 : 0)
+ ) : 0;
//row[_model->_colInsertOrder] = group ? (group->insertBottom() ? 2 : 1) : 0;
//If our parent object is a group and it's expanded, expand the tree
if (SP_IS_GROUP(obj) && SP_GROUP(obj)->expanded())
{
_tree.expand_to_path( _store->get_path(iter) );
+ _tree.collapse_row( _store->get_path(iter) );
}
//Add an object watcher to the item
@@ -413,7 +420,10 @@ bool ObjectsPanel::_checkForUpdated(const Gtk::TreeIter& iter, SPObject* obj)
row[_model->_colLocked] = item ? !item->isSensitive() : false;
row[_model->_colType] = group ? (group->layerMode() == SPGroup::LAYER ? 2 : 1) : 0;
row[_model->_colHighlight] = item ? (item->isHighlightSet() ? item->highlight_color() : item->highlight_color() & 0xffffff00) : 0;
- row[_model->_colClipMask] = item ? (item->clip_ref && item->clip_ref->getObject() ? 1 : (item->mask_ref && item->mask_ref->getObject() ? 2 : 0)) : 0;
+ row[_model->_colClipMask] = item ? (
+ (item->clip_ref && item->clip_ref->getObject() ? 1 : 0) |
+ (item->mask_ref && item->mask_ref->getObject() ? 2 : 0)
+ ) : 0;
//row[_model->_colInsertOrder] = group ? (group->insertBottom() ? 2 : 1) : 0;
return true;
@@ -473,13 +483,13 @@ void ObjectsPanel::_objectsSelected( Selection *sel ) {
_setCompositingValues(item);
setOpacity = false;
}
- _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, (*i)==items.back()));
+ _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, (*i)==items.back(), false));
}
if (!item) {
if (_desktop->currentLayer() && SP_IS_ITEM(_desktop->currentLayer())) {
item = SP_ITEM(_desktop->currentLayer());
_setCompositingValues(item);
- _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, true));
+ _store->foreach(sigc::bind<SPItem *, bool>( sigc::mem_fun(*this, &ObjectsPanel::_checkForSelected), item, false, true));
}
}
_selectedConnection.unblock();
@@ -545,7 +555,7 @@ void ObjectsPanel::_setCompositingValues(SPItem *item)
* @param scrollto Whether to scroll to the item
* @return Whether to continue searching the tree
*/
-bool ObjectsPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto)
+bool ObjectsPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto, bool expand)
{
bool stopGoing = false;
@@ -554,13 +564,16 @@ bool ObjectsPanel::_checkForSelected(const Gtk::TreePath &path, const Gtk::TreeI
{
//We found the item! Expand to the path and select it in the tree.
_tree.expand_to_path( path );
+ if (!expand)
+ // but don't expand itself, just the path
+ _tree.collapse_row(path);
Glib::RefPtr<Gtk::TreeSelection> select = _tree.get_selection();
select->select(iter);
if (scrollto) {
//Scroll to the item in the tree
- _tree.scroll_to_row(path);
+ _tree.scroll_to_row(path, 0.5);
}
stopGoing = true;
@@ -577,6 +590,7 @@ void ObjectsPanel::_pushTreeSelectionToCurrent()
if ( _desktop && _desktop->currentRoot() ) {
//block connections for selection and compositing values to prevent interference
_selectionChangedConnection.block();
+ _documentChangedCurrentLayer.block();
//Clear the selection and then iterate over the tree selection, pushing each item to the desktop
_desktop->selection->clear();
@@ -584,6 +598,7 @@ void ObjectsPanel::_pushTreeSelectionToCurrent()
_tree.get_selection()->selected_foreach_iter( sigc::bind<bool *>(sigc::mem_fun(*this, &ObjectsPanel::_selected_row_callback), &setOpacity));
//unblock connections
_selectionChangedConnection.unblock();
+ _documentChangedCurrentLayer.unblock();
_checkTreeSelection();
}
@@ -682,53 +697,63 @@ void ObjectsPanel::_setLockedIter( const Gtk::TreeModel::iterator& iter, const b
*/
bool ObjectsPanel::_handleKeyEvent(GdkEventKey *event)
{
+ if (!_desktop)
+ return false;
+
+ unsigned int shortcut;
+ shortcut = Inkscape::UI::Tools::get_group0_keyval(event) |
+ ( event->state & GDK_SHIFT_MASK ?
+ SP_SHORTCUT_SHIFT_MASK : 0 ) |
+ ( event->state & GDK_CONTROL_MASK ?
+ SP_SHORTCUT_CONTROL_MASK : 0 ) |
+ ( event->state & GDK_MOD1_MASK ?
+ SP_SHORTCUT_ALT_MASK : 0 );
+
+ switch (shortcut) {
+ // how to get users key binding for the action “start-interactive-search” ??
+ // ctrl+f is just the default
+ case GDK_KEY_f | SP_SHORTCUT_CONTROL_MASK:
+ return false;
+ break;
+ // shall we slurp ctrl+w to close panel?
+
+ // defocus:
+ case GDK_KEY_Escape:
+ if (_desktop->canvas) {
+ gtk_widget_grab_focus (GTK_WIDGET(_desktop->canvas));
+ return true;
+ }
+ break;
+ }
+
+ // invoke user defined shortcuts first
+ bool done = sp_shortcut_invoke(shortcut, _desktop);
+ if (done)
+ return true;
+ // handle events for the treeview
bool empty = _desktop->selection->isEmpty();
switch (Inkscape::UI::Tools::get_group0_keyval(event)) {
case GDK_KEY_Return:
case GDK_KEY_KP_Enter:
- case GDK_KEY_F2:
{
- Gtk::TreeModel::iterator iter = _tree.get_selection()->get_selected();
- if (iter && !_text_renderer->property_editable()) {
+ Gtk::TreeModel::Path path;
+ Gtk::TreeViewColumn *focus_column = 0;
+
+ _tree.get_cursor(path, focus_column);
+ if (focus_column == _name_column && !_text_renderer->property_editable()) {
//Rename item
- Gtk::TreeModel::Path *path = new Gtk::TreeModel::Path(iter);
_text_renderer->property_editable() = true;
- _tree.set_cursor(*path, *_name_column, true);
+ _tree.set_cursor(path, *_name_column, true);
grab_focus();
return true;
}
- }
- break;
- case GDK_KEY_Home:
- //Move item(s) to top of containing group/layer
- _fireAction( empty ? SP_VERB_LAYER_TO_TOP : SP_VERB_SELECTION_TO_FRONT );
- break;
- case GDK_KEY_End:
- //Move item(s) to bottom of containing group/layer
- _fireAction( empty ? SP_VERB_LAYER_TO_BOTTOM : SP_VERB_SELECTION_TO_BACK );
- break;
- case GDK_KEY_Page_Up:
- {
- //Move item(s) up in containing group/layer
- int ch = event->state & GDK_SHIFT_MASK ? SP_VERB_LAYER_MOVE_TO_NEXT : SP_VERB_SELECTION_RAISE;
- _fireAction( empty ? SP_VERB_LAYER_RAISE : ch );
- break;
- }
- case GDK_KEY_Page_Down:
- {
- //Move item(s) down in containing group/layer
- int ch = event->state & GDK_SHIFT_MASK ? SP_VERB_LAYER_MOVE_TO_PREV : SP_VERB_SELECTION_LOWER;
- _fireAction( empty ? SP_VERB_LAYER_LOWER : ch );
+ return false;
break;
}
-
- //TODO: Handle Ctrl-A, etc.
- default:
- return false;
}
- return true;
+ return false;
}
/**
@@ -1172,7 +1197,7 @@ bool ObjectsPanel::_executeAction()
}
else
{
- _fireAction( SP_VERB_SELECTION_RAISE );
+ _fireAction( SP_VERB_SELECTION_STACK_UP );
}
}
break;
@@ -1184,7 +1209,7 @@ bool ObjectsPanel::_executeAction()
}
else
{
- _fireAction( SP_VERB_SELECTION_LOWER );
+ _fireAction( SP_VERB_SELECTION_STACK_DOWN );
}
}
break;
@@ -1734,6 +1759,8 @@ ObjectsPanel::ObjectsPanel() :
//Set the expander and search columns
_tree.set_expander_column( *_tree.get_column(nameColNum) );
_tree.set_search_column(_model->_colLabel);
+ // use ctrl+f to start search
+ _tree.set_enable_search(false);
//Set up the tree selection
_tree.get_selection()->set_mode(Gtk::SELECTION_MULTIPLE);
@@ -1893,8 +1920,8 @@ ObjectsPanel::ObjectsPanel() :
_popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
- _watchingNonTop.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_RAISE, "gtk-go-up", _("Up"), (int)BUTTON_UP ) );
- _watchingNonBottom.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_LOWER, "gtk-go-down", _("Down"), (int)BUTTON_DOWN ) );
+ _watchingNonTop.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_STACK_UP, "gtk-go-up", _("Up"), (int)BUTTON_UP ) );
+ _watchingNonBottom.push_back( &_addPopupItem( targetDesktop, SP_VERB_SELECTION_STACK_DOWN, "gtk-go-down", _("Down"), (int)BUTTON_DOWN ) );
_popupMenu.append(*Gtk::manage(new Gtk::SeparatorMenuItem()));
@@ -2033,6 +2060,7 @@ void ObjectsPanel::setDesktop( SPDesktop* desktop )
if ( desktop != _desktop ) {
_documentChangedConnection.disconnect();
+ _documentChangedCurrentLayer.disconnect();
_selectionChangedConnection.disconnect();
if ( _desktop ) {
_desktop = 0;
@@ -2042,6 +2070,9 @@ void ObjectsPanel::setDesktop( SPDesktop* desktop )
if ( _desktop ) {
//Connect desktop signals
_documentChangedConnection = _desktop->connectDocumentReplaced( sigc::mem_fun(*this, &ObjectsPanel::setDocument));
+
+ _documentChangedCurrentLayer = _desktop->connectCurrentLayerChanged( sigc::mem_fun(*this, &ObjectsPanel::_objectsChanged));
+
_selectionChangedConnection = _desktop->selection->connectChanged( sigc::mem_fun(*this, &ObjectsPanel::_objectsSelected));
setDocument(_desktop, _desktop->doc());
diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h
index 018f9191f..21305669e 100644
--- a/src/ui/dialog/objects.h
+++ b/src/ui/dialog/objects.h
@@ -77,6 +77,9 @@ private:
//Connection for when the document changes
sigc::connection _documentChangedConnection;
+ //Connection for when the active layer changes
+ sigc::connection _documentChangedCurrentLayer;
+
//Connection for when the active selection in the document changes
sigc::connection _selectionChangedConnection;
@@ -216,7 +219,7 @@ private:
bool _checkForUpdated(const Gtk::TreeIter& iter, SPObject* obj);
void _objectsSelected(Selection *sel);
- bool _checkForSelected(const Gtk::TreePath& path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto);
+ bool _checkForSelected(const Gtk::TreePath& path, const Gtk::TreeIter& iter, SPItem* item, bool scrollto, bool expand);
void _objectsChanged(SPObject *obj);
void _addObject( SPObject* obj, Gtk::TreeModel::Row* parentRow );
diff --git a/src/ui/widget/clipmaskicon.cpp b/src/ui/widget/clipmaskicon.cpp
index 4f791042a..a1e3eaf82 100644
--- a/src/ui/widget/clipmaskicon.cpp
+++ b/src/ui/widget/clipmaskicon.cpp
@@ -27,13 +27,13 @@ namespace Widget {
ClipMaskIcon::ClipMaskIcon() :
Glib::ObjectBase(typeid(ClipMaskIcon)),
Gtk::CellRendererPixbuf(),
- _pixClipName(INKSCAPE_ICON("path-intersection")),
- _pixInverseName(INKSCAPE_ICON("path-difference")),
- _pixMaskName(INKSCAPE_ICON("mask-intersection")),
+ _pixClipName(INKSCAPE_ICON("path-cut")),
+ _pixMaskName(INKSCAPE_ICON("path-difference")),
+ _pixBothName(INKSCAPE_ICON("bitmap-trace")),
_property_active(*this, "active", 0),
_property_pixbuf_clip(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
- _property_pixbuf_inverse(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0)),
- _property_pixbuf_mask(*this, "pixbuf_off", Glib::RefPtr<Gdk::Pixbuf>(0))
+ _property_pixbuf_mask(*this, "pixbuf_off", Glib::RefPtr<Gdk::Pixbuf>(0)),
+ _property_pixbuf_both(*this, "pixbuf_on", Glib::RefPtr<Gdk::Pixbuf>(0))
{
property_mode() = Gtk::CELL_RENDERER_MODE_ACTIVATABLE;
@@ -43,22 +43,22 @@ ClipMaskIcon::ClipMaskIcon() :
if (!icon_theme->has_icon(_pixClipName)) {
Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixClipName.data()), Inkscape::ICON_SIZE_DECORATION );
}
- if (!icon_theme->has_icon(_pixInverseName)) {
- Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixInverseName.data()), Inkscape::ICON_SIZE_DECORATION );
- }
if (!icon_theme->has_icon(_pixMaskName)) {
Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixMaskName.data()), Inkscape::ICON_SIZE_DECORATION );
}
+ if (!icon_theme->has_icon(_pixBothName)) {
+ Inkscape::queueIconPrerender( INKSCAPE_ICON(_pixBothName.data()), Inkscape::ICON_SIZE_DECORATION );
+ }
if (icon_theme->has_icon(_pixClipName)) {
_property_pixbuf_clip = icon_theme->load_icon(_pixClipName, phys, (Gtk::IconLookupFlags)0);
}
- if (icon_theme->has_icon(_pixInverseName)) {
- _property_pixbuf_inverse = icon_theme->load_icon(_pixInverseName, phys, (Gtk::IconLookupFlags)0);
- }
if (icon_theme->has_icon(_pixMaskName)) {
_property_pixbuf_mask = icon_theme->load_icon(_pixMaskName, phys, (Gtk::IconLookupFlags)0);
}
+ if (icon_theme->has_icon(_pixBothName)) {
+ _property_pixbuf_both = icon_theme->load_icon(_pixBothName, phys, (Gtk::IconLookupFlags)0);
+ }
property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
}
@@ -108,7 +108,7 @@ void ClipMaskIcon::render_vfunc( const Cairo::RefPtr<Cairo::Context>& cr,
property_pixbuf() = _property_pixbuf_mask;
break;
case 3:
- property_pixbuf() = _property_pixbuf_inverse;
+ property_pixbuf() = _property_pixbuf_both;
break;
default:
property_pixbuf() = Glib::RefPtr<Gdk::Pixbuf>(0);
diff --git a/src/ui/widget/clipmaskicon.h b/src/ui/widget/clipmaskicon.h
index 0d149edb8..deb4554df 100644
--- a/src/ui/widget/clipmaskicon.h
+++ b/src/ui/widget/clipmaskicon.h
@@ -58,13 +58,13 @@ private:
int phys;
Glib::ustring _pixClipName;
- Glib::ustring _pixInverseName;
Glib::ustring _pixMaskName;
+ Glib::ustring _pixBothName;
Glib::Property<int> _property_active;
Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_clip;
- Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_inverse;
Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_mask;
+ Glib::Property< Glib::RefPtr<Gdk::Pixbuf> > _property_pixbuf_both;
};