summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJabiertxof <jabier.arraiza@marker.es>2019-06-24 18:36:55 +0000
committerJabiertxof <jabier.arraiza@marker.es>2019-06-24 18:36:55 +0000
commitd1c0d705f63ce234d4b9a73b938fa6c469487774 (patch)
tree021b342d16e7a96c0da73237ce089af696d73ab0
parentUpdate pen tool path instantly on mode change (diff)
downloadinkscape-d1c0d705f63ce234d4b9a73b938fa6c469487774.tar.gz
inkscape-d1c0d705f63ce234d4b9a73b938fa6c469487774.zip
Fixes for scrolling on selectors and style dialogs
-rw-r--r--src/ui/dialog/selectorsdialog.cpp99
-rw-r--r--src/ui/dialog/selectorsdialog.h5
-rw-r--r--src/ui/dialog/styledialog.cpp86
-rw-r--r--src/ui/dialog/styledialog.h3
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;