summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-04-19 04:40:50 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-06-02 09:50:16 +0000
commit8105c909005759e79a292c8ffe8695f8970b0c81 (patch)
treea6bf37e270e9574ed7f602a207c8972193d3f892 /src
parentWorking on simplify (diff)
downloadinkscape-8105c909005759e79a292c8ffe8695f8970b0c81.tar.gz
inkscape-8105c909005759e79a292c8ffe8695f8970b0c81.zip
Adding a TreeModelFilter
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/styledialog.cpp92
-rw-r--r--src/ui/dialog/styledialog.h37
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