summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-05-29 08:16:32 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-06-02 09:50:17 +0000
commita2aa66acf986f27198468ba99e7fa6fd5307372f (patch)
tree6a732f260f6056a3444cf85dcafb54f3d64c9af6 /src
parentworking on selector dialog (diff)
downloadinkscape-a2aa66acf986f27198468ba99e7fa6fd5307372f.tar.gz
inkscape-a2aa66acf986f27198468ba99e7fa6fd5307372f.zip
Improvements to hadle whols CSS file
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/attrdialog.cpp16
-rw-r--r--src/ui/dialog/selectordialog.cpp127
-rw-r--r--src/ui/dialog/selectordialog.h5
-rw-r--r--src/ui/dialog/styledialog.cpp336
-rw-r--r--src/ui/dialog/styledialog.h8
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);