diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-05-29 08:16:32 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-06-02 09:50:17 +0000 |
| commit | a2aa66acf986f27198468ba99e7fa6fd5307372f (patch) | |
| tree | 6a732f260f6056a3444cf85dcafb54f3d64c9af6 /src | |
| parent | working on selector dialog (diff) | |
| download | inkscape-a2aa66acf986f27198468ba99e7fa6fd5307372f.tar.gz inkscape-a2aa66acf986f27198468ba99e7fa6fd5307372f.zip | |
Improvements to hadle whols CSS file
Diffstat (limited to 'src')
| -rw-r--r-- | src/ui/dialog/attrdialog.cpp | 16 | ||||
| -rw-r--r-- | src/ui/dialog/selectordialog.cpp | 127 | ||||
| -rw-r--r-- | src/ui/dialog/selectordialog.h | 5 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.cpp | 336 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.h | 8 |
5 files changed, 253 insertions, 239 deletions
diff --git a/src/ui/dialog/attrdialog.cpp b/src/ui/dialog/attrdialog.cpp index 974a1189a..4e98ca1ef 100644 --- a/src/ui/dialog/attrdialog.cpp +++ b/src/ui/dialog/attrdialog.cpp @@ -235,7 +235,8 @@ void AttrDialog::onAttrChanged(Inkscape::XML::Node *repr, const gchar * name, co } } } - if (new_value) { + std::cout << new_value << "aaa" << new_value << std::endl; + if (new_value && strcmp(new_value, "") != 0) { if ((repr->type() == Inkscape::XML::TEXT_NODE || repr->type() == Inkscape::XML::COMMENT_NODE) && strcmp(name, "content") != 0) { @@ -338,9 +339,16 @@ bool AttrDialog::onKeyPressed(GdkEventKey *event) */ void AttrDialog::nameEdited (const Glib::ustring& path, const Glib::ustring& name) { - Gtk::TreeModel::Row row = *_store->get_iter(path); + Gtk::TreeIter iter = this->_store->append(); + Gtk::TreeModel::Path modelpath = (Gtk::TreeModel::Path)iter; + Gtk::TreeModel::Row row = *iter; if(row && this->_repr) { Glib::ustring old_name = row[_attrColumns._attributeName]; + if (old_name == name) { + _treeView.set_cursor(modelpath, *_valueCol, true); + grab_focus(); + return; + } if (old_name == "content" || old_name == name) { @@ -353,8 +361,10 @@ void AttrDialog::nameEdited (const Glib::ustring& path, const Glib::ustring& nam _repr->setAttribute(old_name.c_str(), nullptr, false); } if (!name.empty()) { - _repr->setAttribute(name.c_str(), value, false); row[_attrColumns._attributeName] = name; + _repr->setAttribute(name.c_str(), value, false); + _treeView.set_cursor(modelpath, *_valueCol, true); + grab_focus(); } this->setUndo(_("Rename attribute")); } diff --git a/src/ui/dialog/selectordialog.cpp b/src/ui/dialog/selectordialog.cpp index 4dedd02df..81130e61a 100644 --- a/src/ui/dialog/selectordialog.cpp +++ b/src/ui/dialog/selectordialog.cpp @@ -229,12 +229,11 @@ Glib::RefPtr<SelectorDialog::TreeStore> SelectorDialog::TreeStore::create(Select * adds selectors to treeview. _delSelector deletes the selector from the dialog. * Any addition/deletion of the selectors updates XML style element accordingly. */ -SelectorDialog::SelectorDialog(bool stylemode) : +SelectorDialog::SelectorDialog() : UI::Widget::Panel("/dialogs/style", SP_VERB_DIALOG_STYLE), _updating(false), _textNode(nullptr), - _desktopTracker(), - _stylemode(stylemode) + _desktopTracker() { g_debug("SelectorDialog::SelectorDialog"); @@ -246,19 +245,9 @@ SelectorDialog::SelectorDialog(bool stylemode) : addRenderer->add_icon("object-locked"); _store = TreeStore::create(this); - if (_stylemode) { - _modelfilter = Gtk::TreeModelFilter::create(_store); - _modelfilter->set_visible_column(_mColumns._colVisible); - _treeView.set_model(_modelfilter); - } else { - _treeView.set_model(_store); - } - if (_stylemode) { - _treeView.set_headers_visible(false); - _treeView.set_grid_lines (Gtk::TREE_VIEW_GRID_LINES_HORIZONTAL); - } else { - _treeView.set_headers_visible(true); - } + _treeView.set_model(_store); + + _treeView.set_headers_visible(true); _treeView.enable_model_drag_source(); _treeView.enable_model_drag_dest( Gdk::ACTION_MOVE ); int addCol = _treeView.append_column("", *addRenderer) - 1; @@ -273,25 +262,21 @@ SelectorDialog::SelectorDialog(bool stylemode) : _paned.set_orientation(Gtk::ORIENTATION_VERTICAL); _paned.pack1(_mainBox, Gtk::SHRINK); _mainBox.set_orientation(Gtk::ORIENTATION_VERTICAL); - if (!_stylemode) { - _mainBox.pack_start(_scrolledWindow, Gtk::PACK_EXPAND_WIDGET); - _scrolledWindow.add(_treeView); - _scrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); - create = manage( new Gtk::Button() ); - _styleButton(*create, "list-add", "Add a new CSS Selector"); - create->signal_clicked().connect(sigc::mem_fun(*this, &SelectorDialog::_addSelector)); - - del = manage( new Gtk::Button() ); - _styleButton(*del, "list-remove", "Remove a CSS Selector"); - del->signal_clicked().connect(sigc::mem_fun(*this, &SelectorDialog::_delSelector)); - del->hide(); - _mainBox.pack_end(_buttonBox, Gtk::PACK_SHRINK); - - _buttonBox.pack_start(*create, Gtk::PACK_SHRINK); - _buttonBox.pack_start(*del, Gtk::PACK_SHRINK); - } else { - _mainBox.pack_start(_treeView, Gtk::PACK_EXPAND_WIDGET); - } + _mainBox.pack_start(_scrolledWindow, Gtk::PACK_EXPAND_WIDGET); + _scrolledWindow.add(_treeView); + _scrolledWindow.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC); + create = manage( new Gtk::Button() ); + _styleButton(*create, "list-add", "Add a new CSS Selector"); + create->signal_clicked().connect(sigc::mem_fun(*this, &SelectorDialog::_addSelector)); + + del = manage( new Gtk::Button() ); + _styleButton(*del, "list-remove", "Remove a CSS Selector"); + del->signal_clicked().connect(sigc::mem_fun(*this, &SelectorDialog::_delSelector)); + del->hide(); + _mainBox.pack_end(_buttonBox, Gtk::PACK_SHRINK); + + _buttonBox.pack_start(*create, Gtk::PACK_SHRINK); + _buttonBox.pack_start(*del, Gtk::PACK_SHRINK); _getContents()->pack_start(_paned, Gtk::PACK_EXPAND_WIDGET); @@ -326,7 +311,7 @@ SelectorDialog::SelectorDialog(bool stylemode) : _readStyleElement(); _selectRow(); - if (!_stylemode && !_store->children().empty()) { + if (!_store->children().empty()) { del->show(); } @@ -498,29 +483,17 @@ void SelectorDialog::_readStyleElement() row[_mColumns._colObj] = objVec; row[_mColumns._colProperties] = properties; row[_mColumns._colVisible] = true; - if (!_stylemode) { - // Add as children, objects that match selector. - for (auto &obj : objVec) { - Gtk::TreeModel::Row childrow = *(_store->append(row->children())); - childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); - childrow[_mColumns._colExpand] = false; - childrow[_mColumns._colType] = colType == UNHANDLED ? UNHANDLED : OBJECT;; - childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); - childrow[_mColumns._colProperties] = ""; // Unused - childrow[_mColumns._colVisible] = true; // Unused - } - } else { - for (auto property : properties_data) { - Gtk::TreeModel::Row childrow = *(_store->append(row->children())); - childrow[_mColumns._colSelector] = Glib::ustring(property); - childrow[_mColumns._colExpand] = false; - childrow[_mColumns._colType] = 0; - childrow[_mColumns._colObj] = {}; - childrow[_mColumns._colProperties] = ""; // Unused - childrow[_mColumns._colVisible] = true; // Unused - } + // Add as children, objects that match selector. + for (auto &obj : objVec) { + Gtk::TreeModel::Row childrow = *(_store->append(row->children())); + childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); + childrow[_mColumns._colExpand] = false; + childrow[_mColumns._colType] = colType == UNHANDLED ? UNHANDLED : OBJECT;; + childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); + childrow[_mColumns._colProperties] = ""; // Unused + childrow[_mColumns._colVisible] = true; // Unused } - } +} _updating = false; @@ -880,9 +853,6 @@ void SelectorDialog::_insertClass(const std::vector<SPObject *>& objVec, const G void SelectorDialog::_selectObjects(int eventX, int eventY) { g_debug("SelectorDialog::_selectObjects: %d, %d", eventX, eventY); - if (_stylemode) { - return; - } getDesktop()->selection->clear(); Gtk::TreeViewColumn *col = _treeView.get_column(1); Gtk::TreeModel::Path path; @@ -895,7 +865,7 @@ void SelectorDialog::_selectObjects(int eventX, int eventY) if (iter) { Gtk::TreeModel::Row row = *iter; Gtk::TreeModel::Children children = row.children(); - if ((children.empty() || children.size() == 1) && !_stylemode) { + if (children.empty() || children.size() == 1) { del->show(); } std::vector<SPObject *> objVec = row[_mColumns._colObj]; @@ -980,9 +950,7 @@ void SelectorDialog::_addSelector() * set to ".Class1" */ selectorValue = textEditPtr->get_text(); - if (!_stylemode) { - del->show(); - } + del->show(); std::vector<Glib::ustring> tokensplus = Glib::Regex::split_simple("[,]+", selectorValue); bool unhandled = false; bool partialinvalid = false; @@ -1084,9 +1052,7 @@ void SelectorDialog::_delSelector() _store->erase(iter); _updating = false; _writeStyleElement(); - if (!_stylemode) { - del->hide(); - } + del->hide(); } } @@ -1225,9 +1191,7 @@ void SelectorDialog::_buttonEventsSelectObjs(GdkEventButton* event ) g_debug("SelectorDialog::_buttonEventsSelectObjs"); _treeView.get_selection()->set_mode(Gtk::SELECTION_SINGLE); _updating = true; - if (!_stylemode) { - del->show(); - } + del->show(); if (event->type == GDK_BUTTON_RELEASE && event->button == 1) { int x = static_cast<int>(event->x); int y = static_cast<int>(event->y); @@ -1244,16 +1208,22 @@ void SelectorDialog::_buttonEventsSelectObjs(GdkEventButton* event ) void SelectorDialog::_selectRow() { g_debug("SelectorDialog::_selectRow: updating: %s", (_updating ? "true" : "false")); - if (!_stylemode) { - del->hide(); - } else { - del->show(); + del->hide(); + std::vector< Gtk::TreeModel::Path > selectedrows = _treeView.get_selection()->get_selected_rows(); + if(selectedrows.size() == 1) { + Gtk::TreeModel::Row row = *_store->get_iter(selectedrows[0]); + if (!row->parent() && row->children().size() < 2 ) { + del->show(); + } + } else if(selectedrows.size() == 0) { + del->show(); } if (_updating || !getDesktop()) return; // Avoid updating if we have set row via dialog. if (SP_ACTIVE_DESKTOP != getDesktop()) { std::cerr << "SelectorDialog::_selectRow: SP_ACTIVE_DESKTOP != getDesktop()" << std::endl; return; } + _treeView.get_selection()->unselect_all(); Gtk::TreeModel::Children children = _store->children(); Inkscape::Selection* selection = getDesktop()->getSelection(); @@ -1261,6 +1231,7 @@ void SelectorDialog::_selectRow() if (!selection->isEmpty()) { obj = selection->objects().back(); } + for (auto row : children) { std::vector<SPObject *> objVec = row[_mColumns._colObj]; if (obj) { @@ -1269,8 +1240,6 @@ void SelectorDialog::_selectRow() _treeView.get_selection()->select(row); row[_mColumns._colVisible] = true; break; - } else if(_stylemode) { - row[_mColumns._colVisible] = false; } } } @@ -1278,10 +1247,6 @@ void SelectorDialog::_selectRow() _treeView.expand_to_path(Gtk::TreePath(row)); } } - if (_stylemode) { - _modelfilter->refilter(); - _treeView.get_selection()->unselect_all(); - } } /** diff --git a/src/ui/dialog/selectordialog.h b/src/ui/dialog/selectordialog.h index d03ef6e49..35a7167f3 100644 --- a/src/ui/dialog/selectordialog.h +++ b/src/ui/dialog/selectordialog.h @@ -48,11 +48,11 @@ class SelectorDialog : public Widget::Panel { public: ~SelectorDialog() override; // No default constructor, noncopyable, nonassignable - SelectorDialog(bool stylemode = false); + SelectorDialog(); SelectorDialog(SelectorDialog const &d) = delete; SelectorDialog operator=(SelectorDialog const &d) = delete; - static SelectorDialog &getInstance() { return *new SelectorDialog(false); } + static SelectorDialog &getInstance() { return *new SelectorDialog(); } private: // Monitor <style> element for changes. class NodeObserver; @@ -137,7 +137,6 @@ public: // Variables bool _updating; // Prevent cyclic actions: read <-> write, select via dialog <-> via desktop - bool _stylemode; // Show dialog of items in selector widget or in css styles in CSS dialog Inkscape::XML::Node *_textNode; // Track so we know when to add a NodeObserver. // Signals and handlers - External diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp index 42ecda6e4..de23aafc9 100644 --- a/src/ui/dialog/styledialog.cpp +++ b/src/ui/dialog/styledialog.cpp @@ -134,6 +134,16 @@ public: if ( name == "id" || name == "class" || name == "style" ) { _styledialog->_nodeChanged( node ); } + SPObject *obj = SP_ACTIVE_DOCUMENT->getObjectById(node.attribute("id")); + if (obj) { + for (auto iter : obj->style->properties()) { + if (iter->style_src != SP_STYLE_SRC_UNSET) { + if( iter->name == name) { + _styledialog->_nodeChanged( node ); + } + } + } + } } } @@ -194,6 +204,16 @@ StyleDialog::StyleDialog() : _styleBox.set_orientation(Gtk::ORIENTATION_VERTICAL); _styleBox.set_valign(Gtk::ALIGN_START); _scrolledWindow.add(_styleBox); + Gtk::Box *alltoggler = Gtk::manage(new Gtk::Box(Gtk::ORIENTATION_HORIZONTAL)); + Gtk::Label *infotoggler = Gtk::manage(new Gtk::Label(_("Edit Full Stylesheet"))); + _all_css = Gtk::manage(new Gtk::Switch()); + _all_css->get_style_context()->add_class("switchclean"); + _all_css->set_margin_right(5); + _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); + _all_css->set_active(false); + _mainBox.pack_start(*alltoggler, false, false, 0); _mainBox.set_orientation(Gtk::ORIENTATION_VERTICAL); _getContents()->pack_start(_mainBox, Gtk::PACK_EXPAND_WIDGET); // Document & Desktop @@ -203,10 +223,9 @@ StyleDialog::StyleDialog() : _document_replaced_connection = getDesktop()->connectDocumentReplaced( sigc::mem_fun(this, &StyleDialog::_handleDocumentReplaced)); - + _selection_changed_connection = getDesktop()->getSelection()->connectChanged( sigc::hide(sigc::mem_fun(this, &StyleDialog::_handleSelectionChanged))); - // Add watchers _updateWatchers(); @@ -214,7 +233,6 @@ StyleDialog::StyleDialog() : _readStyleElement(); } - /** * Class destructor */ @@ -226,6 +244,11 @@ StyleDialog::~StyleDialog() _selection_changed_connection.disconnect(); } +void +StyleDialog::_reload() +{ + _readStyleElement(); +} /** * @return Inkscape::XML::Node* pointing to a style element's text node. @@ -411,6 +434,7 @@ void StyleDialog::_readStyleElement() g_warning("Glade file loading failed for filter effect dialog"); return; } + gint selectorpos = 0; Gtk::Box *css_selector_container; _builder->get_widget("CSSSelectorContainer", css_selector_container); Gtk::Label *css_selector; @@ -432,8 +456,8 @@ void StyleDialog::_readStyleElement() } */ css_selector_event_add->signal_button_release_event().connect( - sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Glib::ustring, gint>( - sigc::mem_fun(*this, &StyleDialog::_addRow), store, "style_properties", 0)); + sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView *, Glib::ustring, gint>( + sigc::mem_fun(*this, &StyleDialog::_addRow), store, css_tree, "style_properties", selectorpos)); Inkscape::UI::Widget::IconRenderer * addRenderer = manage(new Inkscape::UI::Widget::IconRenderer()); addRenderer->add_icon("edit-delete"); int addCol = css_tree->append_column("Delete row", *addRenderer) - 1; @@ -444,7 +468,7 @@ void StyleDialog::_readStyleElement() Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText()); label->property_placeholder_text() = _("property"); label->property_editable() = true; - label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store)); + label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView *>(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store, css_tree)); addCol = css_tree->append_column("CSS Property", *label) - 1; col = css_tree->get_column(addCol); if (col) { @@ -462,128 +486,102 @@ void StyleDialog::_readStyleElement() col->add_attribute(value->property_strikethrough(), _mColumns._colStrike); } std::map<Glib::ustring, Glib::ustring> attr_prop; - if (obj && obj->getRepr()->attribute("style")) { - Glib::ustring style = obj->getRepr()->attribute("style"); - // We need to handle comments on SPStyle to activate - /* Glib::ustring comments = ""; - while(style.find("/*") != std::string::npos) { - size_t beg = style.find(""); //opening cooment - size_t end = style.find("");//closing coment - if (end != std::string::npos && - beg != std::string::npos) - { - comments = comments.append(style, beg + 2, end - beg - 2); - style = style.erase(beg, end - beg + 2); - } - } */ - attr_prop = parseStyle(style); - for (auto iter : obj->style->properties()) { - if (attr_prop.count(iter->name)) { - Gtk::TreeModel::Row row = *(store->append()); - row[_mColumns._colSelector] = "style_properties"; - row[_mColumns._colSelectorPos] = 0; - row[_mColumns._colActive] = true; - row[_mColumns._colName] = iter->name; - row[_mColumns._colValue] = iter->get_value(); - row[_mColumns._colStrike] = false; - } - } - // We need to handle comments on SPStyle to activate - /* std::map<Glib::ustring, Glib::ustring> attr_prop_comments = parseStyle(comments); - for (auto iter : attr_prop_comments) { - if (!attr_prop.count(iter.first)) { - Gtk::TreeModel::Row row = *(store->append()); - row[_mColumns._colActive] = false; - row[_mColumns._colSelector] = "style_properties"; - row[_mColumns._colName] = iter.first; - row[_mColumns._colValue] = iter.second; - row[_mColumns._colStrike] = true; - contract = false; + if (obj || _all_css->get_active()) { + Gtk::TreeModel::Path path; + if(!_all_css->get_active() && obj && obj->getRepr()->attribute("style")) { + Glib::ustring style = obj->getRepr()->attribute("style"); + attr_prop = parseStyle(style); + for (auto iter : obj->style->properties()) { + if (attr_prop.count(iter->name)) { + Gtk::TreeModel::Row row = *(store->append()); + row[_mColumns._colSelector] = "style_properties"; + row[_mColumns._colSelectorPos] = 0; + row[_mColumns._colActive] = true; + row[_mColumns._colName] = iter->name; + row[_mColumns._colValue] = iter->get_value(); + row[_mColumns._colStrike] = false; + } } - } */ _styleBox.pack_start(*css_selector_container, Gtk::PACK_EXPAND_WIDGET); - bool hasattributes = false; - Glib::RefPtr<Gtk::Builder> _builder; + } + selectorpos ++; try { _builder = Gtk::Builder::create_from_file(gladefile); } catch (const Glib::Error &ex) { g_warning("Glade file loading failed for filter effect dialog"); return; } - Gtk::Label *css_selector; _builder->get_widget("CSSSelector", css_selector); css_selector->set_text("element.attributes"); - Gtk::Box *css_selector_container; _builder->get_widget("CSSSelectorContainer", css_selector_container); - Gtk::EventBox *css_selector_event_add; _builder->get_widget("CSSSelectorEventAdd", css_selector_event_add); css_selector_event_add->add_events(Gdk::BUTTON_RELEASE_MASK); - Glib::RefPtr<Gtk::TreeStore> store = Gtk::TreeStore::create(_mColumns); - bool show = false; - for (auto iter : obj->style->properties()) { - if (iter->style_src != SP_STYLE_SRC_UNSET) { - if( iter->name != "font" && iter->name != "d" && iter->name != "marker") { - const gchar *attr = obj->getRepr()->attribute(iter->name.c_str()); - if (attr) { - if (!hasattributes) { - Gtk::TreeView *css_tree; - _builder->get_widget("CSSTree", css_tree); - css_tree->set_model(store); - css_selector_event_add->signal_button_release_event().connect( - sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Glib::ustring, gint>( - sigc::mem_fun(*this, &StyleDialog::_addRow), store, "style_properties", 0)); - - Inkscape::UI::Widget::IconRenderer * addRenderer = manage(new Inkscape::UI::Widget::IconRenderer()); - addRenderer->add_icon("edit-delete"); - int addCol = css_tree->append_column("Delete row", *addRenderer) - 1; - Gtk::TreeViewColumn *col = css_tree->get_column(addCol); - if (col) { - addRenderer->signal_activated().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_onPropDelete), store)); - } - Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText()); - label->property_placeholder_text() = _("property"); - label->property_editable() = true; - label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store)); - addCol = css_tree->append_column("CSS Property", *label) - 1; - col = css_tree->get_column(addCol); - if (col) { - col->add_attribute(label->property_text(), _mColumns._colName); + store = Gtk::TreeStore::create(_mColumns); + _builder->get_widget("CSSTree", css_tree); + css_tree->set_model(store); + css_selector_event_add->signal_button_release_event().connect( + sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView *, Glib::ustring, gint>( + sigc::mem_fun(*this, &StyleDialog::_addRow), store, css_tree, "attributes", selectorpos)); + bool hasattributes = false; + if(!_all_css->get_active()) { + for (auto iter : obj->style->properties()) { + if (iter->style_src != SP_STYLE_SRC_UNSET) { + if( iter->name != "font" && iter->name != "d" && iter->name != "marker") { + const gchar *attr = obj->getRepr()->attribute(iter->name.c_str()); + if (attr) { + if (!hasattributes) { + Inkscape::UI::Widget::IconRenderer * addRenderer = manage(new Inkscape::UI::Widget::IconRenderer()); + addRenderer->add_icon("edit-delete"); + int addCol = css_tree->append_column("Delete row", *addRenderer) - 1; + Gtk::TreeViewColumn *col = css_tree->get_column(addCol); + if (col) { + addRenderer->signal_activated().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_onPropDelete), store)); + } + Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText()); + label->property_placeholder_text() = _("property"); + label->property_editable() = true; + label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView * >(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store, css_tree)); + addCol = css_tree->append_column("CSS Property", *label) - 1; + col = css_tree->get_column(addCol); + if (col) { + col->add_attribute(label->property_text(), _mColumns._colName); + } + Gtk::CellRendererText *value = Gtk::manage(new Gtk::CellRendererText()); + value->property_placeholder_text() = _("value"); + value->property_editable() = true; + value->signal_edited().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_valueEdited), store)); + css_tree->set_focus_vadjustment(_scrolledWindow.get_vadjustment()); + addCol = css_tree->append_column("CSS Value", *value) - 1; + col = css_tree->get_column(addCol); + if (col) { + col->add_attribute(value->property_text(), _mColumns._colValue); + col->add_attribute(value->property_strikethrough(), _mColumns._colStrike); + } } - Gtk::CellRendererText *value = Gtk::manage(new Gtk::CellRendererText()); - value->property_placeholder_text() = _("value"); - value->property_editable() = true; - value->signal_edited().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_valueEdited), store)); - css_tree->set_focus_vadjustment(_scrolledWindow.get_vadjustment()); - addCol = css_tree->append_column("CSS Value", *value) - 1; - col = css_tree->get_column(addCol); - if (col) { - col->add_attribute(value->property_text(), _mColumns._colValue); - col->add_attribute(value->property_strikethrough(), _mColumns._colStrike); + Gtk::TreeModel::Row row = *(store->append()); + row[_mColumns._colSelector] = "attributes"; + row[_mColumns._colSelectorPos] = 1; + row[_mColumns._colActive] = true; + row[_mColumns._colName] = iter->name; + row[_mColumns._colValue] = attr; + if (attr_prop.count(iter->name)) { + row[_mColumns._colStrike] = true; + } else { + row[_mColumns._colStrike] = false; } + hasattributes = true; } - Gtk::TreeModel::Row row = *(store->append()); - row[_mColumns._colSelector] = "attributes"; - row[_mColumns._colSelectorPos] = 0; - row[_mColumns._colActive] = true; - row[_mColumns._colName] = iter->name; - row[_mColumns._colValue] = attr; - if (attr_prop.count(iter->name)) { - row[_mColumns._colStrike] = true; - } else { - row[_mColumns._colStrike] = false; - } - show = true; - hasattributes = true; } } } - } - if (show) { + if (!hasattributes) { + for (auto widg:css_selector_container->get_children()) { + delete widg; + } + } _styleBox.pack_start(*css_selector_container, Gtk::PACK_EXPAND_WIDGET); } - } - gint selectorpos = -1; - if (obj) { + selectorpos ++; if (tokens.size() == 0) { _updating = false; return; @@ -597,16 +595,18 @@ void StyleDialog::_readStyleElement() } // Get list of objects selector matches std::vector<SPObject *> objVec = _getObjVec( selector ); - bool stop = true; - for (auto objel:objVec) { - if (objel->getId() == obj->getId()){ - stop = false; + if (!_all_css->get_active()) { + bool stop = true; + for (auto objel:objVec) { + if (objel->getId() == obj->getId()){ + stop = false; + } + } + if (stop) { + _updating = false; + selectorpos ++; + continue; } - } - selectorpos ++; - if (stop) { - _updating = false; - continue; } Glib::ustring properties; // Check to make sure we do have a value to match selector. @@ -653,7 +653,7 @@ void StyleDialog::_readStyleElement() Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText()); label->property_placeholder_text() = _("property"); label->property_editable() = true; - label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store)); + label->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView * >(sigc::mem_fun(*this, &StyleDialog::_nameEdited), store, css_tree)); addCol = css_tree->append_column("CSS Selector", *label) - 1; col = css_tree->get_column(addCol); if (col) { @@ -684,25 +684,36 @@ void StyleDialog::_readStyleElement() } std::map<Glib::ustring, Glib::ustring> attr_prop_styleshet = parseStyle(style); css_selector_event_add->signal_button_release_event().connect( - sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Glib::ustring, gint>( - sigc::mem_fun(*this, &StyleDialog::_addRow), store, selector, selectorpos)); - - for (auto iter : obj->style->properties()) { - if (iter->style_src != SP_STYLE_SRC_UNSET) { - if (attr_prop_styleshet.count(iter->name)) { - Gtk::TreeModel::Row row = *(store->append()); - row[_mColumns._colSelector] = selector; - row[_mColumns._colSelectorPos] = selectorpos; - row[_mColumns._colActive] = true; - row[_mColumns._colName] = iter->name; - row[_mColumns._colValue] = attr_prop_styleshet[iter->name]; - if (attr_prop.count(iter->name) || row[_mColumns._colValue] != iter->get_value()) { - row[_mColumns._colStrike] = true; - } else { - row[_mColumns._colStrike] = false; + sigc::bind<Glib::RefPtr<Gtk::TreeStore>, Gtk::TreeView *, Glib::ustring, gint>( + sigc::mem_fun(*this, &StyleDialog::_addRow), store, css_tree, selector, selectorpos)); + if (!_all_css->get_active()) { + for (auto iter : obj->style->properties()) { + if (iter->style_src != SP_STYLE_SRC_UNSET) { + if (attr_prop_styleshet.count(iter->name)) { + Gtk::TreeModel::Row row = *(store->append()); + row[_mColumns._colSelector] = selector; + row[_mColumns._colSelectorPos] = selectorpos; + row[_mColumns._colActive] = true; + row[_mColumns._colName] = iter->name; + row[_mColumns._colValue] = attr_prop_styleshet[iter->name]; + if (attr_prop.count(iter->name) || row[_mColumns._colValue] != iter->get_value()) { + row[_mColumns._colStrike] = true; + } else { + row[_mColumns._colStrike] = false; + } } } } + } else { + for (auto iter : attr_prop_styleshet) { + Gtk::TreeModel::Row row = *(store->append()); + row[_mColumns._colSelector] = selector; + row[_mColumns._colSelectorPos] = selectorpos; + row[_mColumns._colActive] = true; + row[_mColumns._colName] = iter.first; + row[_mColumns._colValue] = iter.second; + row[_mColumns._colStrike] = false; + } } std::map<Glib::ustring, Glib::ustring> attr_prop_styleshet_comments = parseStyle(comments); @@ -718,6 +729,7 @@ void StyleDialog::_readStyleElement() } } _styleBox.pack_start(*css_selector_container, Gtk::PACK_EXPAND_WIDGET); + selectorpos ++; } } _mainBox.show_all_children(); @@ -739,8 +751,11 @@ StyleDialog::_onPropDelete(Glib::ustring path, Glib::RefPtr<Gtk::TreeStore> stor { Gtk::TreeModel::Row row = *store->get_iter(path); if (row) { + _updating = true; //to avoid a crash on deleting an obsolete widget Glib::ustring selector = row[_mColumns._colSelector]; + row[_mColumns._colName] = ""; store->erase(row); + _updating = false; _writeStyleElement(store, selector); } } @@ -787,14 +802,16 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u if (selection->objects().size() == 1) { obj = selection->objects().back(); } - if (!obj) { + if (!obj && !_all_css->get_active()) { + _readStyleElement(); return; } _updating = true; gint selectorpos = 0; std::string styleContent = ""; if (selector != "style_properties" && - selector != "attributes") { + selector != "attributes") + { styleContent = "\n" + selector + " { \n"; } for (auto& row: store->children()) { @@ -843,7 +860,7 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u SP_ACTIVE_DOCUMENT->setStyleSheet(nullptr); std::string pos = std::to_string(selectorpos); std::string selectormatch = "("; - for (selectorpos; selectorpos > 0; selectorpos--) { + for (selectorpos; selectorpos > 2; selectorpos--) { selectormatch = selectormatch + "[^}]*?}"; } selectormatch = selectormatch + ")([^}]*?})((.|\n)*)"; @@ -854,44 +871,65 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u std::regex_replace (std::back_inserter(result), content.begin(), content.end(), e, "$1" + styleContent + "$3"); textNode->setContent(result.c_str()); } - + _readStyleElement(); DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_STYLE, _("Edited style element.")); _updating = false; - _readStyleElement(); g_debug("StyleDialog::_writeStyleElement(): | %s |", styleContent.c_str()); } -bool StyleDialog::_addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> store, Glib::ustring selector, gint pos) { - Gtk::TreeModel::Row rowadded = *(store->append()); - rowadded[_mColumns._colSelector] = selector; - rowadded[_mColumns._colSelectorPos] = pos; - rowadded[_mColumns._colActive] = false; - rowadded[_mColumns._colName] = ""; - rowadded[_mColumns._colValue] = ""; - rowadded[_mColumns._colStrike] = false; +bool StyleDialog::_addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree, Glib::ustring selector, gint pos) { + Gtk::TreeIter iter = store->append(); + Gtk::TreeModel::Path path = (Gtk::TreeModel::Path)iter; + Gtk::TreeModel::Row row = *(iter); + row[_mColumns._colSelector] = selector; + row[_mColumns._colSelectorPos] = pos; + row[_mColumns._colActive] = true; + row[_mColumns._colName] = ""; + row[_mColumns._colValue] = ""; + row[_mColumns._colStrike] = false; + gint col = 2; + if (pos < 2 ){ + col = 1; + } + css_tree->set_cursor(path, *(css_tree->get_column(col)), true); + grab_focus(); return false; } - /** * @brief StyleDialog::nameEdited * @param event * @return * Called when the name is edited in the TreeView editable column */ -void StyleDialog::_nameEdited (const Glib::ustring& path, const Glib::ustring& name, Glib::RefPtr<Gtk::TreeStore> store) +void StyleDialog::_nameEdited (const Glib::ustring& path, const Glib::ustring& name, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree) { Gtk::TreeModel::Row row = *store->get_iter(path); Gtk::TreeModel::Path pathel = (Gtk::TreeModel::Path)*store->get_iter(path); + if(row) { + gint pos = row[_mColumns._colSelectorPos]; + bool write = false; + if (row[_mColumns._colName] != name && row[_mColumns._colValue] != "") { + write = true; + } Glib::ustring value = row[_mColumns._colValue]; Glib::ustring selector = row[_mColumns._colSelector]; row[_mColumns._colName] = name; if(name.empty() && value.empty()) { store->erase(row); } - _writeStyleElement(store, selector); + gint col = 3; + if (pos < 2 ){ + col = 2; + } + if (write) { + _writeStyleElement(store, selector); + } else { + css_tree->set_cursor(pathel, *(css_tree->get_column(col)), true); + grab_focus(); + } } } diff --git a/src/ui/dialog/styledialog.h b/src/ui/dialog/styledialog.h index 533397a4e..5f65ad7a7 100644 --- a/src/ui/dialog/styledialog.h +++ b/src/ui/dialog/styledialog.h @@ -22,6 +22,7 @@ #include <gtkmm/scrolledwindow.h> #include <gtkmm/dialog.h> #include <gtkmm/treeselection.h> +#include <gtkmm/switch.h> #include <gtkmm/eventbox.h> #include <gtkmm/paned.h> #include <glibmm/regex.h> @@ -93,17 +94,18 @@ public: Gtk::ScrolledWindow _scrolledWindow; Gtk::Box _mainBox; Gtk::Box _styleBox; - + Gtk::Switch *_all_css; // Reading and writing the style element. Inkscape::XML::Node *_getStyleTextNode(); void _readStyleElement(); Glib::RefPtr< Gtk::TreeModel > _selectTree(Glib::ustring selector); void _writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::ustring selector); void _activeToggled(const Glib::ustring& path, Glib::RefPtr<Gtk::TreeStore> store); - bool _addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> store, Glib::ustring selector, gint pos); - void _nameEdited(const Glib::ustring& path, const Glib::ustring& name, Glib::RefPtr<Gtk::TreeStore> store); + bool _addRow(GdkEventButton *evt, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree, Glib::ustring selector, gint pos); + void _nameEdited(const Glib::ustring& path, const Glib::ustring& name, Glib::RefPtr<Gtk::TreeStore> store, Gtk::TreeView *css_tree); void _valueEdited(const Glib::ustring& path, const Glib::ustring& value, Glib::RefPtr<Gtk::TreeStore> store); void _onPropDelete(Glib::ustring path, Glib::RefPtr<Gtk::TreeStore> store); + void _reload(); // Update watchers void _addWatcherRecursive(Inkscape::XML::Node *node); |
