diff options
| author | Jabiertxof <jabier.arraiza@marker.es> | 2019-06-24 18:36:55 +0000 |
|---|---|---|
| committer | Jabiertxof <jabier.arraiza@marker.es> | 2019-06-24 18:36:55 +0000 |
| commit | d1c0d705f63ce234d4b9a73b938fa6c469487774 (patch) | |
| tree | 021b342d16e7a96c0da73237ce089af696d73ab0 | |
| parent | Update pen tool path instantly on mode change (diff) | |
| download | inkscape-d1c0d705f63ce234d4b9a73b938fa6c469487774.tar.gz inkscape-d1c0d705f63ce234d4b9a73b938fa6c469487774.zip | |
Fixes for scrolling on selectors and style dialogs
| -rw-r--r-- | src/ui/dialog/selectorsdialog.cpp | 99 | ||||
| -rw-r--r-- | src/ui/dialog/selectorsdialog.h | 5 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.cpp | 86 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.h | 3 |
4 files changed, 160 insertions, 33 deletions
diff --git a/src/ui/dialog/selectorsdialog.cpp b/src/ui/dialog/selectorsdialog.cpp index 315ce1cc8..bae266112 100644 --- a/src/ui/dialog/selectorsdialog.cpp +++ b/src/ui/dialog/selectorsdialog.cpp @@ -5,7 +5,8 @@ /* Authors: * Kamalpreet Kaur Grewal * Tavmjong Bah - * + * Jabiertxof + * * Copyright (C) Kamalpreet Kaur Grewal 2016 <grewalkamal005@gmail.com> * Copyright (C) Tavmjong Bah 2017 <tavmjong@free.fr> * @@ -33,6 +34,7 @@ #include <regex> #include <utility> +// G_MESSAGES_DEBUG=DEBUG_STYLEDIALOG gdb ./inkscape //#define DEBUG_SELECTORSDIALOG //#define G_LOG_DOMAIN "SELECTORSDIALOG" @@ -79,6 +81,7 @@ void SelectorsDialog::NodeObserver::notifyContentChanged(Inkscape::XML::Node & / { g_debug("SelectorsDialog::NodeObserver::notifyContentChanged"); + _selectorsdialog->_scroollock = true; _selectorsdialog->_updating = false; _selectorsdialog->_readStyleElement(); _selectorsdialog->_selectRow(); @@ -139,7 +142,8 @@ class SelectorsDialog::NodeWatcher : public Inkscape::XML::NodeObserver { void SelectorsDialog::_nodeAdded(Inkscape::XML::Node &node) { - + g_debug("SelectorsDialog::NodeAdded"); + _scroollock = true; SelectorsDialog::NodeWatcher *w = new SelectorsDialog::NodeWatcher(this, &node); node.addObserver (*w); _nodeWatchers.push_back(w); @@ -151,6 +155,9 @@ void SelectorsDialog::_nodeAdded(Inkscape::XML::Node &node) void SelectorsDialog::_nodeRemoved(Inkscape::XML::Node &repr) { + g_debug("SelectorsDialog::NodeRemoved"); + + _scroollock = true; for (auto it = _nodeWatchers.begin(); it != _nodeWatchers.end(); ++it) { if ( (*it)->_repr == &repr ) { (*it)->_repr->removeObserver (**it); @@ -166,6 +173,10 @@ void SelectorsDialog::_nodeRemoved(Inkscape::XML::Node &repr) void SelectorsDialog::_nodeChanged(Inkscape::XML::Node &object) { + g_debug("SelectorsDialog::NodeChanged"); + + _scroollock = true; + _readStyleElement(); _selectRow(); } @@ -192,6 +203,7 @@ bool SelectorsDialog::TreeStore::row_draggable_vfunc(const Gtk::TreeModel::Path void SelectorsDialog::fixCSSSelectors(Glib::ustring &selector) { + g_debug("SelectorsDialog::fixCSSSelectors"); REMOVE_SPACES(selector); Glib::ustring my_selector = selector + " {"; // Parsing fails sometimes without '{'. Fix me CRSelector *cr_selector = cr_selector_parse_from_buf((guchar *)my_selector.c_str(), CR_UTF_8); @@ -280,6 +292,8 @@ void SelectorsDialog::TreeStore::on_row_deleted(const TreeModel::Path &path) Glib::RefPtr<SelectorsDialog::TreeStore> SelectorsDialog::TreeStore::create(SelectorsDialog *selectorsdialog) { + g_debug("SelectorsDialog::TreeStore::create"); + SelectorsDialog::TreeStore *store = new SelectorsDialog::TreeStore(); store->_selectorsdialog = selectorsdialog; store->set_column_types(store->_selectorsdialog->_mColumns); @@ -296,6 +310,8 @@ SelectorsDialog::SelectorsDialog() : UI::Widget::Panel("/dialogs/selectors", SP_VERB_DIALOG_SELECTORS) , _updating(false) , _textNode(nullptr) + , _scroolpos(0) + , _scroollock(false) , _desktopTracker() { g_debug("SelectorsDialog::SelectorsDialog"); @@ -363,17 +379,32 @@ SelectorsDialog::SelectorsDialog() show_all(); } + +void SelectorsDialog::_vscrool() +{ + if (!_scroollock) { + _scroolpos = _vadj->get_value(); + } else { + _vadj->set_value(_scroolpos); + _scroollock = false; + } +} + void SelectorsDialog::_showWidgets() { // Pack widgets + g_debug("SelectorsDialog::_showWidgets"); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool dir = prefs->getBool("/dialogs/selectors/vertical", true); _paned.set_orientation(dir ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL); _selectors_box.set_orientation(Gtk::ORIENTATION_VERTICAL); _selectors_box.set_name("SelectorsDialog"); - _selectors_box.pack_start(_scrolled_window_selectors, Gtk::PACK_EXPAND_WIDGET); _scrolled_window_selectors.add(_treeView); _scrolled_window_selectors.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + _vadj = _scrolled_window_selectors.get_vadjustment(); + _vadj->signal_value_changed().connect(sigc::mem_fun(*this, &SelectorsDialog::_vscrool)); + _selectors_box.pack_start(_scrolled_window_selectors, Gtk::PACK_EXPAND_WIDGET); Gtk::Label *dirtogglerlabel = Gtk::manage(new Gtk::Label(_("Paned vertical"))); dirtogglerlabel->get_style_context()->add_class("inksmall"); _direction.property_active() = dir; @@ -390,7 +421,7 @@ void SelectorsDialog::_showWidgets() _del.signal_clicked().connect(sigc::mem_fun(*this, &SelectorsDialog::_delSelector)); _del.hide(); _style_dialog = new StyleDialog; - _selectors_box.set_name("StyleDialog"); + _style_dialog->set_name("StyleDialog"); _paned.pack1(*_style_dialog, Gtk::SHRINK); _paned.pack2(_selectors_box, true, true); _getContents()->pack_start(_paned, Gtk::PACK_EXPAND_WIDGET); @@ -407,20 +438,24 @@ void SelectorsDialog::_showWidgets() bool SelectorsDialog::_resized(GdkEventButton *event) { + g_debug("SelectorsDialog::_resized"); + _scroollock = true; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setInt("/dialogs/selectors/pannedpos", _paned.get_position()); + prefs->setInt("/dialogs/selectors/panedpos", _paned.get_position()); return false; } void SelectorsDialog::_toggleDirection() { + g_debug("SelectorsDialog::_toggleDirection"); + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); bool dir = !prefs->getBool("/dialogs/selectors/vertical", true); prefs->setBool("/dialogs/selectors/vertical", dir); _paned.set_orientation(dir ? Gtk::ORIENTATION_VERTICAL : Gtk::ORIENTATION_HORIZONTAL); int widthpos = _paned.property_max_position(); - prefs->setInt("/dialogs/xml/panedpos", widthpos / 2); + prefs->setInt("/dialogs/selectors/panedpos", widthpos / 2); _paned.set_position(widthpos / 2); } @@ -443,7 +478,7 @@ SelectorsDialog::~SelectorsDialog() */ Inkscape::XML::Node *SelectorsDialog::_getStyleTextNode() { - + g_debug("SelectorsDialog::_getStyleTextNode"); Inkscape::XML::Node *styleNode = nullptr; Inkscape::XML::Node *textNode = nullptr; @@ -501,7 +536,7 @@ void SelectorsDialog::_readStyleElement() if (_updating) return; // Don't read if we wrote style element. _updating = true; - + _scroollock = true; Inkscape::XML::Node * textNode = _getStyleTextNode(); if (textNode == nullptr) { std::cerr << "SelectorsDialog::_readStyleElement: No text node!" << std::endl; @@ -542,6 +577,7 @@ void SelectorsDialog::_readStyleElement() for (unsigned i = 0; i < tokens.size() - 1; i += 2) { Glib::ustring selector = tokens[i]; REMOVE_SPACES(selector); // Remove leading/trailing spaces + fixCSSSelectors(selector); for (auto &row : _store->children()) { Glib::ustring selectorold = row[_mColumns._colSelector]; if (selectorold == selector) { @@ -599,7 +635,6 @@ void SelectorsDialog::_readStyleElement() childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); childrow[_mColumns._colExpand] = false; childrow[_mColumns._colType] = colType == OBJECT; - ; childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); childrow[_mColumns._colProperties] = ""; // Unused childrow[_mColumns._colVisible] = true; // Unused @@ -612,6 +647,8 @@ void SelectorsDialog::_readStyleElement() if (rewrite) { _writeStyleElement(); } + _scroollock = false; + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } void SelectorsDialog::_rowExpand(const Gtk::TreeModel::iterator &iter, const Gtk::TreeModel::Path &path) @@ -632,9 +669,14 @@ void SelectorsDialog::_rowCollapse(const Gtk::TreeModel::iterator &iter, const G */ void SelectorsDialog::_writeStyleElement() { + if (_updating) { return; } + + g_debug("SelectorsDialog::_writeStyleElement"); + + _scroollock = true; _updating = true; SPDocument *document = SP_ACTIVE_DOCUMENT; Glib::ustring styleContent; @@ -657,7 +699,8 @@ void SelectorsDialog::_writeStyleElement() DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_SELECTORS, _("Edited style element.")); _updating = false; - + _scroollock = false; + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); g_debug("SelectorsDialog::_writeStyleElement(): | %s |", styleContent.c_str()); } @@ -681,6 +724,8 @@ void SelectorsDialog::_addWatcherRecursive(Inkscape::XML::Node *node) */ void SelectorsDialog::_updateWatchers() { + g_debug("SelectorsDialog::_updateWatchers"); + _updating = true; // Remove old document watchers @@ -728,6 +773,8 @@ void sp_get_selector_active(Glib::ustring &selector) Glib::ustring sp_get_selector_classes(Glib::ustring selector) //, SelectorType selectortype, Glib::ustring id = "") { + g_debug("SelectorsDialog::sp_get_selector_classes"); + std::pair<Glib::ustring, Glib::ustring> result; std::vector<Glib::ustring> tokensplus = Glib::Regex::split_simple("[ ]+", selector); selector = tokensplus[tokensplus.size() - 1]; @@ -825,7 +872,6 @@ void SelectorsDialog::_addToSelector(Gtk::TreeModel::Row row) objVec = _getObjVec(multiselector); row[_mColumns._colSelector] = multiselector; row[_mColumns._colObj] = objVec; - row[_mColumns._colExpand] = true; _updating = false; // Add entry to style element @@ -841,6 +887,7 @@ void SelectorsDialog::_removeFromSelector(Gtk::TreeModel::Row row) { g_debug("SelectorsDialog::_removeFromSelector: Entrance"); if (*row) { + _scroollock = true; _updating = true; SPObject *obj = nullptr; Glib::ustring objectLabel = row[_mColumns._colSelector]; @@ -882,6 +929,8 @@ void SelectorsDialog::_removeFromSelector(Gtk::TreeModel::Row row) // Add entry to style element _writeStyleElement(); + _scroollock = false; + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } } @@ -893,6 +942,8 @@ void SelectorsDialog::_removeFromSelector(Gtk::TreeModel::Row row) */ Glib::ustring SelectorsDialog::_getIdList(std::vector<SPObject *> sel) { + g_debug("SelectorsDialog::_getIdList"); + Glib::ustring str; for (auto& obj: sel) { str += "#" + Glib::ustring(obj->getId()) + ", "; @@ -944,6 +995,8 @@ std::vector<SPObject *> SelectorsDialog::_getObjVec(Glib::ustring selector) */ void SelectorsDialog::_insertClass(const std::vector<SPObject *> &objVec, const Glib::ustring &className) { + g_debug("SelectorsDialog::_insertClass"); + for (auto& obj: objVec) { _insertClass(obj, className); } @@ -956,6 +1009,8 @@ void SelectorsDialog::_insertClass(const std::vector<SPObject *> &objVec, const */ void SelectorsDialog::_insertClass(SPObject *obj, const Glib::ustring &className) { + g_debug("SelectorsDialog::_insertClass"); + Glib::ustring classAttr = Glib::ustring(""); if (obj->getRepr()->attribute("class")) { classAttr = obj->getRepr()->attribute("class"); @@ -985,6 +1040,8 @@ void SelectorsDialog::_insertClass(SPObject *obj, const Glib::ustring &className */ void SelectorsDialog::_removeClass(const std::vector<SPObject *> &objVec, const Glib::ustring &className, bool all) { + g_debug("SelectorsDialog::_removeClass"); + for (auto &obj : objVec) { _removeClass(obj, className, all); } @@ -997,6 +1054,8 @@ void SelectorsDialog::_removeClass(const std::vector<SPObject *> &objVec, const */ void SelectorsDialog::_removeClass(SPObject *obj, const Glib::ustring &className, bool all) // without "." { + g_debug("SelectorsDialog::_removeClass"); + if (obj->getRepr()->attribute("class")) { std::vector<Glib::ustring> tokens = Glib::Regex::split_simple("[.]+", className); Glib::ustring classAttr = obj->getRepr()->attribute("class"); @@ -1065,7 +1124,7 @@ void SelectorsDialog::_selectObjects(int eventX, int eventY) void SelectorsDialog::_addSelector() { g_debug("SelectorsDialog::_addSelector: Entrance"); - + _scroollock = true; // Store list of selected elements on desktop (not to be confused with selector). Inkscape::Selection* selection = getDesktop()->getSelection(); std::vector<SPObject *> objVec( selection->objects().begin(), @@ -1179,6 +1238,8 @@ void SelectorsDialog::_addSelector() } // Add entry to style element _writeStyleElement(); + _scroollock = false; + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } void SelectorsDialog::_closeDialog(Gtk::Dialog *textDialogPtr) { textDialogPtr->response(Gtk::RESPONSE_OK); } @@ -1191,6 +1252,7 @@ void SelectorsDialog::_delSelector() { g_debug("SelectorsDialog::_delSelector"); + _scroollock = true; Glib::RefPtr<Gtk::TreeSelection> refTreeSelection = _treeView.get_selection(); _treeView.get_selection()->set_mode(Gtk::SELECTION_SINGLE); Gtk::TreeModel::iterator iter = refTreeSelection->get_selected(); @@ -1204,6 +1266,8 @@ void SelectorsDialog::_delSelector() _updating = false; _writeStyleElement(); _del.hide(); + _scroollock = false; + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } } @@ -1219,6 +1283,7 @@ bool SelectorsDialog::_handleButtonEvent(GdkEventButton *event) { g_debug("SelectorsDialog::_handleButtonEvent: Entrance"); if (event->type == GDK_BUTTON_RELEASE && event->button == 1) { + _scroollock = true; Gtk::TreeViewColumn *col = nullptr; Gtk::TreeModel::Path path; int x = static_cast<int>(event->x); @@ -1235,6 +1300,7 @@ bool SelectorsDialog::_handleButtonEvent(GdkEventButton *event) } else { _removeFromSelector(row); } + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } } } @@ -1350,6 +1416,7 @@ void SelectorsDialog::_buttonEventsSelectObjs(GdkEventButton *event) */ void SelectorsDialog::_selectRow() { + _scroollock = true; g_debug("SelectorsDialog::_selectRow: updating: %s", (_updating ? "true" : "false")); _del.hide(); std::vector<Gtk::TreeModel::Path> selectedrows = _treeView.get_selection()->get_selected_rows(); @@ -1401,6 +1468,12 @@ void SelectorsDialog::_selectRow() } } } + for (auto row : children) { + if (row[_mColumns._colExpand]) { + _treeView.expand_to_path(Gtk::TreePath(row)); + } + } + _vadj->set_value(std::min(_scroolpos, _vadj->get_upper())); } /** @@ -1411,6 +1484,8 @@ void SelectorsDialog::_selectRow() */ void SelectorsDialog::_styleButton(Gtk::Button &btn, char const *iconName, char const *tooltip) { + g_debug("SelectorsDialog::_styleButton"); + GtkWidget *child = sp_get_icon_image(iconName, GTK_ICON_SIZE_SMALL_TOOLBAR); gtk_widget_show(child); btn.add(*manage(Glib::wrap(child))); diff --git a/src/ui/dialog/selectorsdialog.h b/src/ui/dialog/selectorsdialog.h index 4a0e8dc1b..6830a0124 100644 --- a/src/ui/dialog/selectorsdialog.h +++ b/src/ui/dialog/selectorsdialog.h @@ -119,10 +119,10 @@ class SelectorsDialog : public Widget::Panel { Gtk::TreeView _treeView; // Widgets Gtk::Paned _paned; + Glib::RefPtr<Gtk::Adjustment> _vadj; Gtk::Switch _direction; Gtk::Box _button_box; Gtk::Box _selectors_box; - Gtk::ScrolledWindow _scrolled_window_style; Gtk::ScrolledWindow _scrolled_window_selectors; Gtk::Button _del; @@ -153,6 +153,8 @@ class SelectorsDialog : public Widget::Panel { void _selectObjects(int, int); // Variables bool _updating; // Prevent cyclic actions: read <-> write, select via dialog <-> via desktop + double _scroolpos; + bool _scroollock; Inkscape::XML::Node *_textNode; // Track so we know when to add a NodeObserver. // Signals and handlers - External @@ -177,6 +179,7 @@ class SelectorsDialog : public Widget::Panel { bool _handleButtonEvent(GdkEventButton *event); void _buttonEventsSelectObjs(GdkEventButton *event); void _selectRow(); // Select row in tree when selection changed. + void _vscrool(); // GUI void _styleButton(Gtk::Button& btn, char const* iconName, char const* tooltip); diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp index 3cdf5092b..1427b4964 100644 --- a/src/ui/dialog/styledialog.cpp +++ b/src/ui/dialog/styledialog.cpp @@ -1,10 +1,11 @@ // SPDX-License-Identifier: GPL-2.0-or-later /** @file - * @brief A dialog for CSS selectors + * @brief A dialog for CSS styles */ /* Authors: * Kamalpreet Kaur Grewal * Tavmjong Bah + * Jabiertxof * * Copyright (C) Kamalpreet Kaur Grewal 2016 <grewalkamal005@gmail.com> * Copyright (C) Tavmjong Bah 2017 <tavmjong@free.fr> @@ -35,8 +36,9 @@ #include <gdk/gdkkeysyms.h> #include <glibmm/i18n.h> -//#define DEBUG_STYLEDIALOG -//#define G_LOG_DOMAIN "STYLEDIALOG" +// G_MESSAGES_DEBUG=DEBUG_STYLEDIALOG gdb ./inkscape +// #define DEBUG_STYLEDIALOG +// #define G_LOG_DOMAIN "STYLEDIALOG" using Inkscape::DocumentUndo; using Inkscape::Util::List; @@ -140,6 +142,8 @@ class StyleDialog::NodeWatcher : public Inkscape::XML::NodeObserver { void StyleDialog::_nodeAdded(Inkscape::XML::Node &node) { + g_debug("StyleDialog::_nodeAdded"); + StyleDialog::NodeWatcher *w = new StyleDialog::NodeWatcher(this, &node); node.addObserver(*w); _nodeWatchers.push_back(w); @@ -150,6 +154,8 @@ void StyleDialog::_nodeAdded(Inkscape::XML::Node &node) void StyleDialog::_nodeRemoved(Inkscape::XML::Node &repr) { + g_debug("StyleDialog::_nodeRemoved"); + for (auto it = _nodeWatchers.begin(); it != _nodeWatchers.end(); ++it) { if ((*it)->_repr == &repr) { (*it)->_repr->removeObserver(**it); @@ -160,7 +166,10 @@ void StyleDialog::_nodeRemoved(Inkscape::XML::Node &repr) _readStyleElement(); } -void StyleDialog::_nodeChanged(Inkscape::XML::Node &object) { _readStyleElement(); } +void StyleDialog::_nodeChanged(Inkscape::XML::Node &object) { + g_debug("StyleDialog::_nodeChanged"); + _readStyleElement(); +} /* void StyleDialog::_stylesheetChanged( Inkscape::XML::Node &repr ) { @@ -178,6 +187,7 @@ StyleDialog::StyleDialog() : UI::Widget::Panel("/dialogs/style", SP_VERB_DIALOG_STYLE) , _updating(false) , _textNode(nullptr) + , _scroolpos(0) , _desktopTracker() { g_debug("StyleDialog::StyleDialog"); @@ -191,9 +201,8 @@ StyleDialog::StyleDialog() Gtk::Label *infotoggler = Gtk::manage(new Gtk::Label(_("Edit Full Stylesheet"))); infotoggler->get_style_context()->add_class("inksmall"); _all_css = Gtk::manage(new Gtk::Switch()); - _scroolpos = 0; - vadj = _scrolledWindow.get_vadjustment(); - vadj->signal_changed().connect(sigc::mem_fun(*this, &StyleDialog::_vscrool)); + _vadj = _scrolledWindow.get_vadjustment(); + _vadj->signal_value_changed().connect(sigc::mem_fun(*this, &StyleDialog::_vscrool)); //_all_css->property_active().signal_changed().connect(sigc::mem_fun(*this, &StyleDialog::_reload)); // alltoggler->pack_start(*_all_css, false, false, 0); // alltoggler->pack_start(*infotoggler, false, false, 0); @@ -222,8 +231,11 @@ StyleDialog::StyleDialog() void StyleDialog::_vscrool() { - if (!_updating) { - _scroolpos = vadj->get_value(); + if (!_scroollock) { + _scroolpos = _vadj->get_value(); + } else { + _vadj->set_value(_scroolpos); + _scroollock = false; } } @@ -247,6 +259,7 @@ void StyleDialog::_reload() { _readStyleElement(); } */ Inkscape::XML::Node *StyleDialog::_getStyleTextNode() { + g_debug("StyleDialog::_getStyleTextNoded"); Inkscape::XML::Node *styleNode = nullptr; Inkscape::XML::Node *textNode = nullptr; @@ -299,6 +312,8 @@ Inkscape::XML::Node *StyleDialog::_getStyleTextNode() Glib::RefPtr<Gtk::TreeModel> StyleDialog::_selectTree(Glib::ustring selector) { + g_debug("StyleDialog::_selectTree"); + Gtk::Label *selectorlabel; Glib::RefPtr<Gtk::TreeModel> model; for (auto fullstyle : _styleBox.get_children()) { @@ -334,6 +349,7 @@ Glib::RefPtr<Gtk::TreeModel> StyleDialog::_selectTree(Glib::ustring selector) void StyleDialog::setCurrentSelector(Glib::ustring current_selector) { + g_debug("StyleDialog::setCurrentSelector"); _current_selector = current_selector; _readStyleElement(); } @@ -347,6 +363,7 @@ void StyleDialog::_readStyleElement() if (_updating) return; // Don't read if we wrote style element. _updating = true; + _scroollock = true; Inkscape::XML::Node *textNode = _getStyleTextNode(); if (textNode == nullptr) { std::cerr << "StyleDialog::_readStyleElement: No text node!" << std::endl; @@ -776,6 +793,8 @@ void StyleDialog::_readStyleElement() bool StyleDialog::_on_foreach_iter(const Gtk::TreeModel::iterator &iter) { + g_debug("StyleDialog::_on_foreach_iter"); + Gtk::TreeModel::Row row = *(iter); Glib::ustring owner = row[_mColumns._colOwner]; if (owner.empty()) { @@ -797,6 +816,8 @@ bool StyleDialog::_on_foreach_iter(const Gtk::TreeModel::iterator &iter) */ void StyleDialog::_onPropDelete(Glib::ustring path, Glib::RefPtr<Gtk::TreeStore> store) { + g_debug("StyleDialog::_onPropDelete"); + Gtk::TreeModel::Row row = *store->get_iter(path); if (row) { Glib::ustring selector = row[_mColumns._colSelector]; @@ -808,6 +829,8 @@ void StyleDialog::_onPropDelete(Glib::ustring path, Glib::RefPtr<Gtk::TreeStore> void StyleDialog::_addOwnerStyle(Glib::ustring name, Glib::ustring selector) { + g_debug("StyleDialog::_addOwnerStyle"); + if (_owner_style.find(name) == _owner_style.end()) { _owner_style[name] = selector; } @@ -822,6 +845,8 @@ void StyleDialog::_addOwnerStyle(Glib::ustring name, Glib::ustring selector) */ std::map<Glib::ustring, Glib::ustring> StyleDialog::parseStyle(Glib::ustring style_string) { + g_debug("StyleDialog::parseStyle"); + std::map<Glib::ustring, Glib::ustring> ret; REMOVE_SPACES(style_string); // We'd use const, but we need to trip spaces @@ -847,9 +872,11 @@ std::map<Glib::ustring, Glib::ustring> StyleDialog::parseStyle(Glib::ustring sty */ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::ustring selector) { + g_debug("StyleDialog::_writeStyleElemen"); if (_updating) { return; } + _scroollock = true; Inkscape::Selection *selection = getDesktop()->getSelection(); SPObject *obj = nullptr; if (selection->objects().size() == 1) { @@ -933,8 +960,9 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u bool StyleDialog::_addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree, Glib::ustring selector, gint pos) { + g_debug("StyleDialog::_addRow"); + if (evt->type == GDK_BUTTON_RELEASE && evt->button == 1) { - _vscrool(); Gtk::TreeIter iter = store->append(); Gtk::TreeModel::Path path = (Gtk::TreeModel::Path)iter; Gtk::TreeModel::Row row = *(iter); @@ -957,6 +985,8 @@ bool StyleDialog::_addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> stor void StyleDialog::_setAutocompletion(Gtk::Entry *entry, SPStyleEnum const cssenum[]) { + g_debug("StyleDialog::_setAutocompletion"); + Glib::RefPtr<Gtk::ListStore> completionModel = Gtk::ListStore::create(_mCSSData); Glib::RefPtr<Gtk::EntryCompletion> entry_completion = Gtk::EntryCompletion::create(); entry_completion->set_model(completionModel); @@ -976,6 +1006,8 @@ void StyleDialog::_setAutocompletion(Gtk::Entry *entry, SPStyleEnum const cssenu /*Harcode values non in enum*/ void StyleDialog::_setAutocompletion(Gtk::Entry *entry, Glib::ustring name) { + g_debug("StyleDialog::_setAutocompletion"); + Glib::RefPtr<Gtk::ListStore> completionModel = Gtk::ListStore::create(_mCSSData); Glib::RefPtr<Gtk::EntryCompletion> entry_completion = Gtk::EntryCompletion::create(); entry_completion->set_model(completionModel); @@ -1003,7 +1035,9 @@ void StyleDialog::_setAutocompletion(Gtk::Entry *entry, Glib::ustring name) void StyleDialog::_startValueEdit(Gtk::CellEditable* cell, const Glib::ustring& path, Glib::RefPtr<Gtk::TreeStore> store) { - vadj->set_value(_scroolpos); + g_debug("StyleDialog::_startValueEdit"); + + _scroollock = true; Gtk::TreeModel::Row row = *store->get_iter(path); if (row) { Gtk::Entry *entry = dynamic_cast<Gtk::Entry *>(cell); @@ -1062,7 +1096,9 @@ StyleDialog::_startValueEdit(Gtk::CellEditable* cell, const Glib::ustring& path, void StyleDialog::_startNameEdit(Gtk::CellEditable *cell, const Glib::ustring &path) { - vadj->set_value(_scroolpos); + g_debug("StyleDialog::_startNameEdit"); + + _scroollock = true; Glib::RefPtr<Gtk::ListStore> completionModel = Gtk::ListStore::create(_mCSSData); Glib::RefPtr<Gtk::EntryCompletion> entry_completion = Gtk::EntryCompletion::create(); entry_completion->set_model(completionModel); @@ -1087,11 +1123,13 @@ void StyleDialog::_startNameEdit(Gtk::CellEditable *cell, const Glib::ustring &p void StyleDialog::_nameEdited(const Glib::ustring &path, const Glib::ustring &name, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree) { + g_debug("StyleDialog::_nameEdited"); + + _scroollock = true; Gtk::TreeModel::Row row = *store->get_iter(path); Gtk::TreeModel::Path pathel = (Gtk::TreeModel::Path)*store->get_iter(path); if (row) { - _vscrool(); Glib::ustring finalname = name; auto i = std::min(finalname.find(";"), finalname.find(":")); if (i != std::string::npos) { @@ -1120,7 +1158,6 @@ void StyleDialog::_nameEdited(const Glib::ustring &path, const Glib::ustring &na css_tree->set_cursor(pathel, *(css_tree->get_column(col)), true); grab_focus(); } - vadj->set_value(_scroolpos); } } @@ -1133,9 +1170,12 @@ void StyleDialog::_nameEdited(const Glib::ustring &path, const Glib::ustring &na void StyleDialog::_valueEdited(const Glib::ustring &path, const Glib::ustring &value, Glib::RefPtr<Gtk::TreeStore> store) { + g_debug("StyleDialog::_valueEdited"); + + _scroollock = true; + Gtk::TreeModel::Row row = *store->get_iter(path); if (row) { - _vscrool(); Glib::ustring finalvalue = value; auto i = std::min(finalvalue.find(";"), finalvalue.find(":")); if (i != std::string::npos) { @@ -1148,24 +1188,26 @@ void StyleDialog::_valueEdited(const Glib::ustring &path, const Glib::ustring &v store->erase(row); } _writeStyleElement(store, selector); - vadj->set_value(_scroolpos); } } void StyleDialog::_activeToggled(const Glib::ustring &path, Glib::RefPtr<Gtk::TreeStore> store) { + g_debug("StyleDialog::_activeToggled"); + + _scroollock = true; Gtk::TreeModel::Row row = *store->get_iter(path); if (row) { row[_mColumns._colActive] = !row[_mColumns._colActive]; Glib::ustring selector = row[_mColumns._colSelector]; - _vscrool(); _writeStyleElement(store, selector); - vadj->set_value(_scroolpos); } } bool StyleDialog::_onNameKeyReleased(GdkEventKey *event, Gtk::CellEditable *cell) { + g_debug("StyleDialog::_onNameKeyReleased"); + switch (event->keyval) { case GDK_KEY_Tab: case GDK_KEY_KP_Tab: @@ -1190,6 +1232,8 @@ bool StyleDialog::_onNameKeyReleased(GdkEventKey *event, Gtk::CellEditable *cell bool StyleDialog::_onValueKeyReleased(GdkEventKey *event, Gtk::CellEditable *cell) { + g_debug("StyleDialog::_onValueKeyReleased"); + switch (event->keyval) { case GDK_KEY_Tab: case GDK_KEY_KP_Tab: @@ -1231,6 +1275,8 @@ void StyleDialog::_addWatcherRecursive(Inkscape::XML::Node *node) */ void StyleDialog::_updateWatchers() { + g_debug("StyleDialog::_updateWatchers"); + _updating = true; // Remove old document watchers @@ -1258,6 +1304,7 @@ void StyleDialog::_updateWatchers() */ std::vector<SPObject *> StyleDialog::_getObjVec(Glib::ustring selector) { + g_debug("StyleDialog::_getObjVec"); std::vector<SPObject *> objVec = SP_ACTIVE_DOCUMENT->getObjectsBySelector(selector); @@ -1305,7 +1352,6 @@ void StyleDialog::_handleDesktopChanged(SPDesktop *desktop) _selection_changed_connection.disconnect(); _document_replaced_connection.disconnect(); - setDesktop(desktop); _selection_changed_connection = @@ -1324,6 +1370,8 @@ void StyleDialog::_handleDesktopChanged(SPDesktop *desktop) void StyleDialog::_handleSelectionChanged() { g_debug("StyleDialog::_handleSelectionChanged()"); + _scroolpos = 0; + _vadj->set_value(0); _readStyleElement(); } diff --git a/src/ui/dialog/styledialog.h b/src/ui/dialog/styledialog.h index 7e7d36f46..5adc24da1 100644 --- a/src/ui/dialog/styledialog.h +++ b/src/ui/dialog/styledialog.h @@ -112,7 +112,7 @@ class StyleDialog : public Widget::Panel { // Widgets Gtk::ScrolledWindow _scrolledWindow; - Glib::RefPtr<Gtk::Adjustment> vadj; + Glib::RefPtr<Gtk::Adjustment> _vadj; Gtk::Box _mainBox; Gtk::Box _styleBox; Gtk::Switch *_all_css; @@ -139,6 +139,7 @@ class StyleDialog : public Widget::Panel { bool _on_foreach_iter(const Gtk::TreeModel::iterator &iter); void _reload(); void _vscrool(); + bool _scroollock; double _scroolpos; Glib::ustring _current_selector; |
