diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-04-19 04:40:50 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-06-02 09:50:16 +0000 |
| commit | 8105c909005759e79a292c8ffe8695f8970b0c81 (patch) | |
| tree | a6bf37e270e9574ed7f602a207c8972193d3f892 /src | |
| parent | Working on simplify (diff) | |
| download | inkscape-8105c909005759e79a292c8ffe8695f8970b0c81.tar.gz inkscape-8105c909005759e79a292c8ffe8695f8970b0c81.zip | |
Adding a TreeModelFilter
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/dialog/styledialog.cpp | 92 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.h | 37 |
2 files changed, 99 insertions, 30 deletions
diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp index 5c52072a3..2726b3007 100644 --- a/src/ui/dialog/styledialog.cpp +++ b/src/ui/dialog/styledialog.cpp @@ -63,7 +63,19 @@ StyleDialog::StyleDialog(bool stylemode) : _desktopTracker(), _stylemode(stylemode) { - set_size_request(20, 15); + g_debug("StyleDialog::StyleDialog"); + + // Tree + Inkscape::UI::Widget::IconRenderer * addRenderer = manage( + new Inkscape::UI::Widget::IconRenderer() ); + addRenderer->add_icon("edit-delete"); + addRenderer->add_icon("list-add"); + addRenderer->add_icon("object-locked"); + + _store = TreeStore::create(this); + _modelfilter = Gtk::TreeModelFilter::create(_store); + _modelfilter->set_visible_column(_mColumns._colVisible); + _treeView.set_model(_modelfilter); _treeView.set_headers_visible(true); _treeView.enable_model_drag_source(); _treeView.enable_model_drag_dest( Gdk::ACTION_MOVE ); @@ -304,6 +316,7 @@ void StyleDialog::setDesktop(SPDesktop* desktop) row[_mColumns._colType] = colType; row[_mColumns._colObj] = objVec; row[_mColumns._colProperties] = properties; + row[_mColumns._colVisible] = true; if (colType == SELECTOR) { // Add as children, objects that match selector. for (auto &obj : objVec) { @@ -313,6 +326,7 @@ void StyleDialog::setDesktop(SPDesktop* desktop) childrow[_mColumns._colType] = OBJECT; childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); childrow[_mColumns._colProperties] = ""; // Unused + childrow[_mColumns._colVisible] = true; // Unused } } } @@ -355,10 +369,63 @@ std::map<Glib::ustring, Glib::ustring> StyleDialog::parseStyle(Glib::ustring sty REMOVE_SPACES(style_string); // We'd use const, but we need to trip spaces std::vector<Glib::ustring> props = r_props->split(style_string); - for (auto const token : props) { - if (token.empty()) - break; - std::vector<Glib::ustring> pair = r_pair->split(token); + if (!found) { + // Update row + objVec.push_back(obj); // Adding to copy so need to update tree + row[_mColumns._colObj] = objVec; + row[_mColumns._colSelector] = _getIdList( objVec ); + row[_mColumns._colExpand] = true; + // Add child row + Gtk::TreeModel::Row childrow = *(_store->append(row->children())); + childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); + childrow[_mColumns._colType] = OBJECT; + childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); + childrow[_mColumns._colProperties] = ""; // Unused + childrow[_mColumns._colVisible] = true; // Unused + } + } + } + + else if (selector[0] == '.') { + // 'class' selector... add value to class attribute of selected objects. + + // Get first class (split on white space or comma) + std::vector<Glib::ustring> tokens = Glib::Regex::split_simple("[,\\s]+", selector); + Glib::ustring className = tokens[0]; + className.erase(0,1); + Inkscape::Selection* selection = getDesktop()->getSelection(); + std::vector<SPObject *> sel_obj(selection->objects().begin(), selection->objects().end()); + _insertClass(sel_obj, className); + std::vector<SPObject *> objVec = _getObjVec(selector); + ; + for (auto &obj : sel_obj) { + + Glib::ustring id = (obj->getId() ? obj->getId() : ""); + bool found = false; + for (auto &obj : objVec) { + if (id == obj->getId()) { + found = true; + break; + } + } + + if (!found) { + // Update row + objVec.push_back(obj); // Adding to copy so need to update tree + row[_mColumns._colObj] = objVec; + row[_mColumns._colExpand] = true; + + // Update row + Gtk::TreeModel::Row childrow = *(_store->append(row->children())); + childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); + childrow[_mColumns._colExpand] = false; + childrow[_mColumns._colType] = OBJECT; + childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); + childrow[_mColumns._colProperties] = ""; // Unused + childrow[_mColumns._colVisible] = true; // Unused + } + } + } if (pair.size() > 1) { ret[pair[0]] = pair[1]; @@ -667,7 +734,6 @@ void CssDialog::nameEdited (const Glib::ustring& path, const Glib::ustring& name if (!selection->isEmpty()) { obj = selection->objects().back(); } - std::vector<Gtk::TreeModel::Row> toshow; for (auto row : children) { std::vector<SPObject *> objVec = row[_mColumns._colObj]; if (obj) { @@ -675,9 +741,10 @@ void CssDialog::nameEdited (const Glib::ustring& path, const Glib::ustring& name if (obj->getId() == i->getId()) { if (!_stylemode) { _treeView.get_selection()->select(row); - } else { - toshow.push_back(row); } + row[_mColumns._colVisible] = true; + } else if(_stylemode) { + row[_mColumns._colVisible] = false; } } } @@ -687,14 +754,7 @@ void CssDialog::nameEdited (const Glib::ustring& path, const Glib::ustring& name this->setUndo(_("Rename CSS attribute")); } if (_stylemode) { - _store->clear(); - for (auto row:toshow) { - _store->clear(); - _store->insert(row); - if (row[_mColumns._colExpand]) { - _treeView.expand_to_path(Gtk::TreePath(row)); - } - } + _modelfilter->refilter(); } /* if (_stylemode) { _store->foreach_iter(sigc::bind<std::vector<Gtk::TreeModel::Row> >(sigc::mem_fun(*this, &StyleDialog::_showStyleSelectors), toshow)); diff --git a/src/ui/dialog/styledialog.h b/src/ui/dialog/styledialog.h index f9b10812f..b06ea3065 100644 --- a/src/ui/dialog/styledialog.h +++ b/src/ui/dialog/styledialog.h @@ -15,8 +15,14 @@ #ifndef SEEN_UI_DIALOGS_STYLEDIALOG_H #define SEEN_UI_DIALOGS_STYLEDIALOG_H -#include "desktop.h" -#include "message.h" +#include <ui/widget/panel.h> +#include <gtkmm/treeview.h> +#include <gtkmm/treestore.h> +#include <gtkmm/treemodelfilter.h> +#include <gtkmm/scrolledwindow.h> +#include <gtkmm/dialog.h> +#include <gtkmm/treeselection.h> +#include <gtkmm/paned.h> #include <glibmm/regex.h> #include <gtkmm/dialog.h> @@ -52,7 +58,7 @@ public: StyleDialog(StyleDialog const &d) = delete; StyleDialog operator=(StyleDialog const &d) = delete; - static StyleDialog &getInstance() { return *new StyleDialog(); } + static StyleDialog &getInstance() { return *new StyleDialog(false); } private: // Monitor <style> element for changes. class NodeObserver; @@ -67,18 +73,20 @@ public: // Data structure class CssColumns : public Gtk::TreeModel::ColumnRecord { public: - CssColumns() { - add(deleteButton); - add(label); - add(_styleAttrVal); - add(label_color); - add(attr_color); + ModelColumns() { + add(_colSelector); + add(_colExpand); + add(_colType); + add(_colObj); + add(_colProperties); + add(_colVisible); } - Gtk::TreeModelColumn<bool> deleteButton; - Gtk::TreeModelColumn<Glib::ustring> label; - Gtk::TreeModelColumn<Glib::ustring> _styleAttrVal; - Gtk::TreeModelColumn<Gdk::RGBA> label_color; - Gtk::TreeModelColumn<Gdk::RGBA> attr_color; + Gtk::TreeModelColumn<Glib::ustring> _colSelector; // Selector or matching object id. + Gtk::TreeModelColumn<bool> _colExpand; // Open/Close store row. + Gtk::TreeModelColumn<gint> _colType; // Selector row or child object row. + Gtk::TreeModelColumn<std::vector<SPObject *> > _colObj; // List of matching objects. + Gtk::TreeModelColumn<Glib::ustring> _colProperties; // List of properties. + Gtk::TreeModelColumn<bool> _colVisible; // Make visible or not. }; CssColumns _cssColumns; @@ -89,6 +97,7 @@ public: std::unique_ptr<Inkscape::MessageContext> _message_context; // TreeView + Glib::RefPtr<Gtk::TreeModelFilter> _modelfilter; Glib::RefPtr<TreeStore> _store; Gtk::TreeView _treeView; // Widgets |
