summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorJabier Arraiza <jabier.arraiza@marker.es>2019-05-09 23:39:11 +0000
committerJabier Arraiza <jabier.arraiza@marker.es>2019-06-02 09:50:17 +0000
commitcef6965936aeaa938296672c2d29ed54d562fbd4 (patch)
tree1b5322a4c36bdb107437d8ee1835f07efa0d9676 /src
parentWorking on add row (diff)
downloadinkscape-cef6965936aeaa938296672c2d29ed54d562fbd4.tar.gz
inkscape-cef6965936aeaa938296672c2d29ed54d562fbd4.zip
First full working
Diffstat (limited to 'src')
-rw-r--r--src/ui/dialog/styledialog.cpp122
-rw-r--r--src/ui/dialog/styledialog.h4
2 files changed, 107 insertions, 19 deletions
diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp
index a59b4dff7..961e04467 100644
--- a/src/ui/dialog/styledialog.cpp
+++ b/src/ui/dialog/styledialog.cpp
@@ -29,14 +29,12 @@
#include "xml/attribute-record.h"
#include "xml/node-observer.h"
-#include <gtkmm/builder.h>
-#include <glibmm/i18n.h>
-#include <glibmm/regex.h>
-
#include <regex>
#include <map>
#include <utility>
+#include <glibmm/i18n.h>
+
//#define DEBUG_STYLEDIALOG
//#define G_LOG_DOMAIN "STYLEDIALOG"
@@ -283,6 +281,43 @@ Inkscape::XML::Node* StyleDialog::_getStyleTextNode()
return textNode;
}
+Glib::RefPtr< Gtk::TreeModel > StyleDialog::_selectTree(Glib::ustring selector)
+{
+ Gtk::Label * selectorlabel;
+ Glib::RefPtr< Gtk::TreeModel > model;
+ for (auto fullstyle:_styleBox.get_children()){
+ Gtk::Box *style = dynamic_cast<Gtk::Box *>(fullstyle);
+ for (auto stylepart:style->get_children()){
+ switch (style->child_property_position(*stylepart)) {
+ case 0:
+ {
+ Gtk::Box *selectorbox = dynamic_cast<Gtk::Box *>(stylepart);
+ for (auto styleheader:selectorbox->get_children()){
+ if (!selectorbox->child_property_position(*styleheader)) {
+ selectorlabel = dynamic_cast<Gtk::Label *>(styleheader);
+ }
+ }
+ break;
+ }
+ case 1:
+ {
+ Glib::ustring wdg_selector = selectorlabel->get_text();
+ if (wdg_selector == selector){
+ Gtk::TreeView* treeview = dynamic_cast<Gtk::TreeView *>(stylepart);
+ if (treeview) {
+ return treeview->get_model();
+ }
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+ return model;
+}
+
/**
* Fill the Gtk::TreeStore from the svg:style element.
*/
@@ -382,6 +417,9 @@ void StyleDialog::_readStyleElement()
_builder->get_widget("CSSSelector", CSSSelector);
Gtk::Label *CSSSelectorAdd;
_builder->get_widget("CSSSelectorAdd", CSSSelectorAdd);
+ Gtk::EventBox *CSSSelectorEventAdd;
+ _builder->get_widget("CSSSelectorEventAdd", CSSSelectorEventAdd);
+ CSSSelectorEventAdd->add_events(Gdk::BUTTON_RELEASE_MASK);
Gtk::Label *CSSSelectorFilled;
_builder->get_widget("CSSSelectorFilled", CSSSelectorFilled);
CSSSelector->set_text("element");
@@ -396,6 +434,10 @@ void StyleDialog::_readStyleElement()
if (col) {
col->add_attribute(active->property_active(), _mColumns._colActive);
} */
+
+ CSSSelectorEventAdd->signal_button_release_event().connect(
+ sigc::bind<Glib::RefPtr<Gtk::Builder>, Glib::ustring, gint>(
+ sigc::mem_fun(*this, &StyleDialog::_addFirstRow), _builder, "style_properties", 0));
CSSTree->set_headers_visible(false);
Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText());
CSSTree->set_reorderable(false);
@@ -410,6 +452,7 @@ void StyleDialog::_readStyleElement()
CSSTree->set_reorderable(false);
value->property_editable() = true;
value->signal_edited().connect(sigc::bind< Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_valueEdited), store));
+ CSSTree->set_focus_vadjustment(_scrolledWindow.get_vadjustment());
addCol = CSSTree->append_column("CSS Selector", *value) - 1;
col = CSSTree->get_column(addCol);
if (col) {
@@ -482,6 +525,9 @@ void StyleDialog::_readStyleElement()
_builder->get_widget("CSSSelectorContainer", CSSSelectorContainer);
Gtk::Label *CSSSelectorAdd;
_builder->get_widget("CSSSelectorAdd", CSSSelectorAdd);
+ Gtk::EventBox *CSSSelectorEventAdd;
+ _builder->get_widget("CSSSelectorEventAdd", CSSSelectorEventAdd);
+ CSSSelectorEventAdd->add_events(Gdk::BUTTON_RELEASE_MASK);
Gtk::Label *CSSSelectorFilled;
_builder->get_widget("CSSSelectorFilled", CSSSelectorFilled);
Glib::RefPtr<Gtk::TreeStore> store = Gtk::TreeStore::create(_mColumns);
@@ -494,6 +540,10 @@ void StyleDialog::_readStyleElement()
Gtk::TreeView *CSSTree;
_builder->get_widget("CSSTree", CSSTree);
CSSTree->set_model(store);
+ CSSSelectorEventAdd->signal_button_release_event().connect(
+ sigc::bind<Glib::RefPtr<Gtk::Builder>, Glib::ustring, gint>(
+ sigc::mem_fun(*this, &StyleDialog::_addFirstRow), _builder, "style_properties", 0));
+
// We need to handle comments on SPStyle to activate
/* Gtk::CellRendererToggle *active = Gtk::manage(new Gtk::CellRendererToggle);
int addCol = CSSTree->append_column("", *active) - 1;
@@ -515,6 +565,7 @@ void StyleDialog::_readStyleElement()
CSSTree->set_reorderable(false);
value->property_editable() = true;
value->signal_edited().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_valueEdited), store));
+ CSSTree->set_focus_vadjustment(_scrolledWindow.get_vadjustment());
addCol = CSSTree->append_column("CSS Selector", *value) - 1;
col = CSSTree->get_column(addCol);
if (col) {
@@ -592,6 +643,9 @@ void StyleDialog::_readStyleElement()
_builder->get_widget("CSSSelector", CSSSelector);
Gtk::Label *CSSSelectorAdd;
_builder->get_widget("CSSSelectorAdd", CSSSelectorAdd);
+ Gtk::EventBox *CSSSelectorEventAdd;
+ _builder->get_widget("CSSSelectorEventAdd", CSSSelectorEventAdd);
+ CSSSelectorEventAdd->add_events(Gdk::BUTTON_RELEASE_MASK);
Gtk::Label *CSSSelectorFilled;
_builder->get_widget("CSSSelectorFilled", CSSSelectorFilled);
CSSSelector->set_text(selector);
@@ -621,6 +675,7 @@ void StyleDialog::_readStyleElement()
CSSTree->set_reorderable(false);
value->property_editable() = true;
value->signal_edited().connect(sigc::bind<Glib::RefPtr<Gtk::TreeStore> >(sigc::mem_fun(*this, &StyleDialog::_valueEdited), store));
+ CSSTree->set_focus_vadjustment(_scrolledWindow.get_vadjustment());
addCol = CSSTree->append_column("CSS Selector", *value) - 1;
col = CSSTree->get_column(addCol);
if (col) {
@@ -641,6 +696,10 @@ void StyleDialog::_readStyleElement()
}
std::map<Glib::ustring, Glib::ustring> attr_prop_styleshet = parseStyle(style);
contract = true;
+ CSSSelectorEventAdd->signal_button_release_event().connect(
+ sigc::bind<Glib::RefPtr<Gtk::Builder>, Glib::ustring, gint>(
+ sigc::mem_fun(*this, &StyleDialog::_addFirstRow), _builder, selector, selectorpos));
+
for (auto iter : obj->style->properties()) {
if (iter->style_src != SP_STYLE_SRC_UNSET) {
if (attr_prop_styleshet.count(iter->name)) {
@@ -749,9 +808,9 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store)
closecomment = row[_mColumns._colActive] ? "\n" : "*/\n" ;
}
Glib::ustring name = row[_mColumns._colName];
- Glib::ustring value = row[_mColumns._colValue] + ";";
+ Glib::ustring value = row[_mColumns._colValue];
if (!(name.empty() && value.empty())){
- styleContent = styleContent + opencomment + name + ":" + value + closecomment;
+ styleContent = styleContent + opencomment + name + ":" + value + ";" + closecomment;
}
}
if (selector != "style_properties" &&
@@ -823,6 +882,29 @@ void StyleDialog::_nameEdited (const Glib::ustring& path, const Glib::ustring& n
}
}
+bool StyleDialog::_addFirstRow(GdkEventButton *evt, Glib::RefPtr<Gtk::Builder> builder, Glib::ustring selector, gint pos) {
+ Gtk::Label *CSSSelectorAdd;
+ builder->get_widget("CSSSelectorAdd", CSSSelectorAdd);
+ Gtk::Label *CSSSelectorFilled;
+ builder->get_widget("CSSSelectorFilled", CSSSelectorFilled);
+ Gtk::TreeView *CSSTree;
+ builder->get_widget("CSSTree", CSSTree);
+ Glib::RefPtr< Gtk::TreeModel > model = CSSTree->get_model();
+ Glib::RefPtr< Gtk::TreeStore > store = Glib::RefPtr< Gtk::TreeStore >::cast_static(model);
+ if ( CSSSelectorAdd->get_text() == " + }") {
+ CSSSelectorAdd->hide();
+ CSSSelectorFilled->show();
+ 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;
+ }
+ return false;
+}
+
/**
* @brief AttrDialog::valueEdited
* @param event
@@ -835,24 +917,26 @@ void StyleDialog::_valueEdited(const Glib::ustring& path, const Glib::ustring& v
if(row) {
row[_mColumns._colValue] = value;
Glib::ustring name = row[_mColumns._colName];
- Gtk::TreeIter iter = store->get_iter(path);
- ++iter;
if(name.empty() && value.empty()) {
store->erase(row);
}
Glib::ustring selector = row[_mColumns._colSelector];
_writeStyleElement(store);
- /* if (!iter && !value.empty()) {
- Gtk::TreeModel::Row rowadded = *(store->append());
- Glib::ustring selector = row[_mColumns._colSelector];
- gint pos = row[_mColumns._colSelectorPos];
- rowadded[_mColumns._colSelector] = selector;
- rowadded[_mColumns._colSelectorPos] = pos;
- rowadded[_mColumns._colActive] = false;
- rowadded[_mColumns._colName] = "";
- rowadded[_mColumns._colValue] = "";
- rowadded[_mColumns._colStrike] = false;
- } */
+ Glib::RefPtr< Gtk::TreeStore > new_store = Glib::RefPtr< Gtk::TreeStore >::cast_static(_selectTree(selector));
+ if (new_store) {
+ Gtk::TreeIter iter = new_store->get_iter(path);
+ ++iter;
+ if (!iter && !value.empty()) {
+ Gtk::TreeModel::Row rowadded = *(new_store->append());
+ gint pos = row[_mColumns._colSelectorPos];
+ rowadded[_mColumns._colSelector] = selector;
+ rowadded[_mColumns._colSelectorPos] = pos;
+ rowadded[_mColumns._colActive] = false;
+ rowadded[_mColumns._colName] = "";
+ rowadded[_mColumns._colValue] = "";
+ rowadded[_mColumns._colStrike] = false;
+ }
+ }
}
}
diff --git a/src/ui/dialog/styledialog.h b/src/ui/dialog/styledialog.h
index 397427be9..b94040e1d 100644
--- a/src/ui/dialog/styledialog.h
+++ b/src/ui/dialog/styledialog.h
@@ -22,8 +22,10 @@
#include <gtkmm/scrolledwindow.h>
#include <gtkmm/dialog.h>
#include <gtkmm/treeselection.h>
+#include <gtkmm/eventbox.h>
#include <gtkmm/paned.h>
#include <glibmm/regex.h>
+#include <gtkmm/builder.h>
#include "ui/dialog/desktop-tracker.h"
@@ -94,8 +96,10 @@ public:
// 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);
void _activeToggled(const Glib::ustring& path, Glib::RefPtr<Gtk::TreeStore> store);
+ bool _addFirstRow(GdkEventButton *evt, Glib::RefPtr<Gtk::Builder> _builder, Glib::ustring selector, gint pos);
void _nameEdited(const Glib::ustring& path, const Glib::ustring& name, Glib::RefPtr<Gtk::TreeStore> store);
void _valueEdited(const Glib::ustring& path, const Glib::ustring& value, Glib::RefPtr<Gtk::TreeStore> store);