diff options
| author | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-06-23 17:15:35 +0000 |
|---|---|---|
| committer | Jabier Arraiza <jabier.arraiza@marker.es> | 2019-06-23 17:15:53 +0000 |
| commit | e82a32013c7837f830b11637182ce3da8a097372 (patch) | |
| tree | 3be83a1533bb0d22ca4c6ef1d89aa636fedf2d00 /src | |
| parent | Update macOS build pipeline (diff) | |
| download | inkscape-e82a32013c7837f830b11637182ce3da8a097372.tar.gz inkscape-e82a32013c7837f830b11637182ce3da8a097372.zip | |
Remove experimental code to work in MR and fixes for selectors
Diffstat (limited to 'src')
| -rw-r--r-- | src/inkscape.cpp | 44 | ||||
| -rw-r--r-- | src/inkscape.h | 5 | ||||
| -rw-r--r-- | src/object/sp-style-elem.cpp | 14 | ||||
| -rw-r--r-- | src/preferences-skeleton.h | 4 | ||||
| -rw-r--r-- | src/ui/dialog/dialog-manager.cpp | 5 | ||||
| -rw-r--r-- | src/ui/dialog/dialog.cpp | 27 | ||||
| -rw-r--r-- | src/ui/dialog/dialog.h | 4 | ||||
| -rw-r--r-- | src/ui/dialog/inkscape-preferences.cpp | 36 | ||||
| -rw-r--r-- | src/ui/dialog/inkscape-preferences.h | 5 | ||||
| -rw-r--r-- | src/ui/dialog/selectorsdialog.cpp | 60 | ||||
| -rw-r--r-- | src/ui/dialog/selectorsdialog.h | 2 | ||||
| -rw-r--r-- | src/ui/dialog/styledialog.cpp | 20 | ||||
| -rw-r--r-- | src/ui/dialog/symbols.cpp | 2 | ||||
| -rw-r--r-- | src/widgets/desktop-widget.cpp | 1 |
14 files changed, 126 insertions, 103 deletions
diff --git a/src/inkscape.cpp b/src/inkscape.cpp index 7b250f6dd..1871bff85 100644 --- a/src/inkscape.cpp +++ b/src/inkscape.cpp @@ -54,6 +54,9 @@ #include "libnrtype/FontFactory.h" +#include "object/sp-root.h" +#include "object/sp-style-elem.h" + #include "svg/svg-color.h" #include "ui/dialog/debug.h" @@ -417,29 +420,12 @@ Application::add_gtk_css() if (prefs->getBool("/theme/symbolicIcons", false)) { if (!prefs->getBool("/theme/symbolicIconsDefaultColor", true)) { gchar colornamed[64]; - gchar colornamedsuccess[64]; - gchar colornamedwarning[64]; - gchar colornamederror[64]; gchar colornamed_inverse[64]; int colorset = prefs->getInt("/theme/symbolicColor", 0x2E3436ff); sp_svg_write_color(colornamed, sizeof(colornamed), colorset); - int colorsetsuccess = prefs->getInt("/theme/symbolicSuccessColor", 0x4AD589ff); - sp_svg_write_color(colornamedsuccess, sizeof(colornamedsuccess), colorsetsuccess); - int colorsetwarning = prefs->getInt("/theme/symbolicWarningColor", 0xF57900ff); - sp_svg_write_color(colornamedwarning, sizeof(colornamedwarning), colorsetwarning); - int colorseterror = prefs->getInt("/theme/symbolicErrorColor", 0xcc0000ff); - sp_svg_write_color(colornamederror, sizeof(colornamederror), colorseterror); // Use in case the special widgets have inverse theme background and symbolic int colorset_inverse = colorset ^ 0xffffff00; sp_svg_write_color(colornamed_inverse, sizeof(colornamed_inverse), colorset_inverse); - - css_str += "*{-gtk-icon-palette: success "; - css_str += colornamedsuccess; - css_str += ", warning "; - css_str += colornamedwarning; - css_str += ", error "; - css_str += colornamederror; - css_str += ";}"; css_str += "SPRuler, ruler-widget,"; css_str += ".bright image, .dark image"; css_str += "{color:"; @@ -479,6 +465,30 @@ Application::add_gtk_css() } } +void Application::readStyleSheets(bool forceupd) +{ + SPDocument *document = SP_ACTIVE_DOCUMENT; + Inkscape::XML::Node *root = document->getReprRoot(); + std::vector<Inkscape::XML::Node *> styles; + for (unsigned i = 0; i < root->childCount(); ++i) { + Inkscape::XML::Node *child = root->nthChild(i); + if (child && strcmp(child->name(), "svg:style") == 0) { + styles.insert(styles.begin(), child); + } + } + if (forceupd || styles.size() > 1) { + document->setStyleSheet(nullptr); + for (auto style : styles) { + gchar const *id = style->attribute("id"); + if (id) { + SPStyleElem *styleelem = dynamic_cast<SPStyleElem *>(document->getObjectById(id)); + styleelem->read_content(); + } + } + document->getRoot()->emitModified(SP_OBJECT_MODIFIED_CASCADE); + } +} + /* \brief Constructor for the application. * Creates a new Inkscape::Application. * diff --git a/src/inkscape.h b/src/inkscape.h index 815da0f1d..a673f0d49 100644 --- a/src/inkscape.h +++ b/src/inkscape.h @@ -124,6 +124,7 @@ public: void switch_desktops_prev (); void get_all_desktops (std::list< SPDesktop* >& listbuf); void reactivate_desktop (SPDesktop * desktop); + void readStyleSheets(bool forceupd = false); SPDesktop * find_desktop_by_dkey (unsigned int dkey); unsigned int maximum_dkey(); SPDesktop * next_desktop (); @@ -176,7 +177,9 @@ public: sigc::signal<void, SPDesktop *> signal_activate_desktop; // some desktop lost focus sigc::signal<void, SPDesktop *> signal_deactivate_desktop; - + // user change theme + sigc::signal<void> signal_change_theme; + // these are orphaned signals (nothing emits them and nothing connects to them) sigc::signal<void, SPDocument *> signal_destroy_document; sigc::signal<void, SPColor *, double /*opacity*/> signal_color_set; diff --git a/src/object/sp-style-elem.cpp b/src/object/sp-style-elem.cpp index 439a1b3cb..3b93ff190 100644 --- a/src/object/sp-style-elem.cpp +++ b/src/object/sp-style-elem.cpp @@ -188,10 +188,6 @@ import_style_cb (CRDocHandler *a_handler, std::cerr << "import_style_cb: No document!" << std::endl; return; } - if (!document->getStyleSheet()) { - std::cerr << "import_style_cb: No document style sheet!" << std::endl; - return; - } if (!document->getDocumentURI()) { std::cerr << "import_style_cb: Document URI is NULL" << std::endl; return; @@ -207,7 +203,15 @@ import_style_cb (CRDocHandler *a_handler, CRStatus const parse_status = cr_parser_parse_file (parser, reinterpret_cast<const guchar *>(import_file.c_str()), CR_UTF_8); if (parse_status == CR_OK) { - cr_stylesheet_append_import (document->getStyleSheet(), stylesheet); + if (!document->getStyleSheet()) { + // if the style is the first style sheet that we've seen, set the document's + // first style sheet to this style and create a cascade object with it. + document->setStyleSheet(stylesheet); + cr_cascade_set_sheet(document->getStyleCascade(), document->getStyleSheet(), ORIGIN_AUTHOR); + } else { + // If not the first, then chain up this style_sheet + cr_stylesheet_append_import(document->getStyleSheet(), stylesheet); + } } else { std::cerr << "import_style_cb: Could not parse: " << import_file << std::endl; cr_stylesheet_destroy (stylesheet); diff --git a/src/preferences-skeleton.h b/src/preferences-skeleton.h index fa975f8b9..569908868 100644 --- a/src/preferences-skeleton.h +++ b/src/preferences-skeleton.h @@ -79,10 +79,6 @@ R"=====( inkscape:window-height="480" /> </group> - <group id="theme" - gtkTheme="" iconTheme="" symbolicIcons="0" darkTheme="0" symbolicColor="0x2E3436ff" > - </group> - <group id="tools" bounding_box="0"> <group id="shapes" style="fill-rule:evenodd;" selcue="1" gradientdrag="1"> diff --git a/src/ui/dialog/dialog-manager.cpp b/src/ui/dialog/dialog-manager.cpp index 727e578e2..66a682de6 100644 --- a/src/ui/dialog/dialog-manager.cpp +++ b/src/ui/dialog/dialog-manager.cpp @@ -16,14 +16,14 @@ #include "ui/dialog/dialog-manager.h" -#include "ui/dialog/prototype.h" +#include "style.h" #include "ui/dialog/align-and-distribute.h" #include "ui/dialog/document-metadata.h" #include "ui/dialog/document-properties.h" #include "ui/dialog/extension-editor.h" #include "ui/dialog/fill-and-stroke.h" -#include "ui/dialog/filter-effects-dialog.h" #include "ui/dialog/filter-editor.h" +#include "ui/dialog/filter-effects-dialog.h" #include "ui/dialog/find.h" #include "ui/dialog/glyphs.h" #include "ui/dialog/inkscape-preferences.h" @@ -31,6 +31,7 @@ #include "ui/dialog/livepatheffect-editor.h" #include "ui/dialog/memory.h" #include "ui/dialog/messages.h" +#include "ui/dialog/prototype.h" #include "ui/dialog/symbols.h" #include "ui/dialog/tile.h" diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp index 2ba2856ff..3baec5106 100644 --- a/src/ui/dialog/dialog.cpp +++ b/src/ui/dialog/dialog.cpp @@ -74,11 +74,13 @@ Dialog::Dialog(Behavior::BehaviorFactory behavior_factory, const char *prefs_pat INKSCAPE.signal_dialogs_hide.connect(sigc::mem_fun(*this, &Dialog::onHideF12)); INKSCAPE.signal_dialogs_unhide.connect(sigc::mem_fun(*this, &Dialog::onShowF12)); INKSCAPE.signal_shut_down.connect(sigc::mem_fun(*this, &Dialog::onShutdown)); + INKSCAPE.signal_change_theme.connect(sigc::mem_fun(*this, &Dialog::addTopWindowClasses)); Glib::wrap(gobj())->signal_event().connect(sigc::mem_fun(*this, &Dialog::_onEvent)); Glib::wrap(gobj())->signal_key_press_event().connect(sigc::mem_fun(*this, &Dialog::_onKeyPress)); read_geometry(); + addTopWindowClasses(); } Dialog::~Dialog() @@ -308,6 +310,31 @@ Dialog::_getSelection() return SP_ACTIVE_DESKTOP->getSelection(); } +void Dialog::addTopWindowClasses() +{ + SPDesktop *desktop = SP_ACTIVE_DESKTOP; + if (desktop) { + Gtk::Widget *canvas = Glib::wrap(GTK_WIDGET(desktop->canvas)); + Gtk::Window *toplevel_window = dynamic_cast<Gtk::Window *>(canvas->get_toplevel()); + if (toplevel_window) { + if (toplevel_window->get_style_context()->has_class("dark")) { + Glib::wrap(gobj())->get_style_context()->add_class("dark"); + Glib::wrap(gobj())->get_style_context()->remove_class("bright"); + } else { + Glib::wrap(gobj())->get_style_context()->add_class("bright"); + Glib::wrap(gobj())->get_style_context()->remove_class("dark"); + } + if (toplevel_window->get_style_context()->has_class("symbolic")) { + Glib::wrap(gobj())->get_style_context()->add_class("symbolic"); + Glib::wrap(gobj())->get_style_context()->remove_class("regular"); + } else { + Glib::wrap(gobj())->get_style_context()->remove_class("symbolic"); + Glib::wrap(gobj())->get_style_context()->add_class("regular"); + } + } + } +} + } // namespace Dialog } // namespace UI } // namespace Inkscape diff --git a/src/ui/dialog/dialog.h b/src/ui/dialog/dialog.h index 404f4f9a3..7b668a4ba 100644 --- a/src/ui/dialog/dialog.h +++ b/src/ui/dialog/dialog.h @@ -144,9 +144,11 @@ protected: sigc::connection _dialogs_hidden_connection; sigc::connection _dialogs_unhidden_connection; sigc::connection _shutdown_connection; + sigc::connection _change_theme_connection; -private: + private: Behavior::Behavior* _behavior; + void addTopWindowClasses(); Dialog() = delete; // no constructor without params diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 6151eeef0..0b7b68304 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -480,7 +480,7 @@ void InkscapePreferences::initPageTools() cb->init ( _("Show font samples in the drop-down list"), "/tools/text/show_sample_in_list", true); _page_text.add_line( false, "", *cb, "", _("Show font samples alongside font names in the drop-down list in Text bar")); - _font_dialog.init ( _("Show font substitution warning dialog"), "/options/font/substitutedlg", false); + _font_dialog.init ( _("Show font substitution inng dialog"), "/options/font/substitutedlg", false); _page_text.add_line( false, "", _font_dialog, "", _("Show font substitution warning dialog when requested fonts are not available on the system")); cb = Gtk::manage(new PrefCheckButton); @@ -651,28 +651,12 @@ void InkscapePreferences::symbolicStyling() Glib::ustring css_str = ""; if (prefs->getBool("/theme/symbolicIcons", false)) { gchar colornamed[64]; - gchar colornamedsuccess[64]; - gchar colornamedwarning[64]; - gchar colornamederror[64]; gchar colornamed_inverse[64]; int colorset = prefs->getInt("/theme/symbolicColor", 0x2E3436ff); sp_svg_write_color(colornamed, sizeof(colornamed), colorset); - int colorsetsuccess = prefs->getInt("/theme/symbolicSuccessColor", 0x4AD589ff); - sp_svg_write_color(colornamedsuccess, sizeof(colornamedsuccess), colorsetsuccess); - int colorsetwarning = prefs->getInt("/theme/symbolicWarningColor", 0xF57900ff); - sp_svg_write_color(colornamedwarning, sizeof(colornamedwarning), colorsetwarning); - int colorseterror = prefs->getInt("/theme/symbolicErrorColor", 0xcc0000ff); - sp_svg_write_color(colornamederror, sizeof(colornamederror), colorseterror); // Use in case the special widgets have inverse theme background and symbolic int colorset_inverse = colorset ^ 0xffffff00; sp_svg_write_color(colornamed_inverse, sizeof(colornamed_inverse), colorset_inverse); - css_str += "*{-gtk-icon-palette: success "; - css_str += colornamedsuccess; - css_str += ", warning "; - css_str += colornamedwarning; - css_str += ", error "; - css_str += colornamederror; - css_str += ";}"; css_str += "SPRuler, ruler-widget,"; css_str += ".bright image, .dark image"; css_str += "{color:"; @@ -694,6 +678,7 @@ void InkscapePreferences::symbolicStyling() window->get_style_context()->remove_class("symbolic"); } } + INKSCAPE.signal_change_theme.emit(); try { INKSCAPE.colorizeprovider->load_from_data(css_str); } catch (const Gtk::CssProviderError &ex) { @@ -732,9 +717,15 @@ void InkscapePreferences::themeChange() window->get_style_context()->add_class("bright"); window->get_style_context()->remove_class("dark"); } + INKSCAPE.signal_change_theme.emit(); } } +void InkscapePreferences::changeIconsColor(guint32 /*color*/) +{ + symbolicStyling(); +} + void InkscapePreferences::initPageUI() { Gtk::TreeModel::iterator iter_ui = this->AddPage(_page_ui, _("Interface"), PREFS_PAGE_UI); @@ -964,24 +955,15 @@ void InkscapePreferences::initPageUI() _symbolic_icons.signal_clicked().connect(sigc::mem_fun(*this, &InkscapePreferences::symbolicStyling)); _page_theme.add_line(true, "", _symbolic_icons, "", "", true); _symbolic_color.init(_("Color for symbolic icons:"), "/theme/symbolicColor", 0x2E3436ff); - _symbolic_success_color.init(_("Color for symbolic success icons:"), "/theme/symbolicSuccessColor", 0x4AD589ff); - _symbolic_warning_color.init(_("Color for symbolic warning icons:"), "/theme/symbolicWarningColor", 0xF57900ff); - _symbolic_error_color.init(_("Color for symbolic error icons:"), "/theme/symbolicErrorColor", 0xcc0000ff); Gtk::Label *_symbolic_color_label = Gtk::manage(new Gtk::Label(_("Change colors:"))); - Gtk::Button *apply_color = Gtk::manage(new Gtk::Button(_("Apply color"))); - apply_color->set_tooltip_text(_("Apply color to symbolic icons)")); - apply_color->signal_clicked().connect(sigc::mem_fun(*this, &InkscapePreferences::symbolicStyling)); Gtk::Button *theme_decide_color = Gtk::manage(new Gtk::Button(_("Theme decides"))); theme_decide_color->set_tooltip_text(_("Theme decide symbolic icon color)")); theme_decide_color->signal_clicked().connect(sigc::mem_fun(*this, &InkscapePreferences::symbolicDefaultColor)); Gtk::Box *icon_buttons = Gtk::manage(new Gtk::Box()); icon_buttons->pack_start(*_symbolic_color_label, true, true, 4); icon_buttons->pack_start(_symbolic_color, true, true, 4); - icon_buttons->pack_start(_symbolic_success_color, true, true, 4); - icon_buttons->pack_start(_symbolic_warning_color, true, true, 4); - icon_buttons->pack_start(_symbolic_error_color, true, true, 4); - icon_buttons->pack_start(*apply_color, true, true, 4); icon_buttons->pack_start(*theme_decide_color, true, true, 4); + _symbolic_color.connectChanged(sigc::mem_fun(this, &InkscapePreferences::changeIconsColor)); _page_theme.add_line(false,"", *icon_buttons, "", _("Color for symbolic icons, theme based or custom. Some icon color changes need reload"), false ); { Glib::ustring sizeLabels[] = { C_("Icon size", "Larger"), C_("Icon size", "Large"), C_("Icon size", "Small"), diff --git a/src/ui/dialog/inkscape-preferences.h b/src/ui/dialog/inkscape-preferences.h index c946eb6bd..3e0134e4d 100644 --- a/src/ui/dialog/inkscape-preferences.h +++ b/src/ui/dialog/inkscape-preferences.h @@ -246,14 +246,10 @@ protected: UI::Widget::PrefCheckButton _dark_theme; UI::Widget::PrefCheckButton _symbolic_icons; UI::Widget::PrefColorPicker _symbolic_color; - UI::Widget::PrefColorPicker _symbolic_warning_color; - UI::Widget::PrefColorPicker _symbolic_error_color; - UI::Widget::PrefColorPicker _symbolic_success_color; UI::Widget::PrefCombo _misc_small_toolbar; UI::Widget::PrefCombo _misc_small_secondary; UI::Widget::PrefCombo _misc_small_tools; UI::Widget::PrefCombo _menu_icons; - Gtk::Button _apply_theme; UI::Widget::PrefRadioButton _win_dockable; UI::Widget::PrefRadioButton _win_floating; @@ -591,6 +587,7 @@ protected: private: void themeChange(); + void changeIconsColor(guint32 /*color*/); void symbolicThemeCheck(); void symbolicStyling(); void symbolicDefaultColor(); diff --git a/src/ui/dialog/selectorsdialog.cpp b/src/ui/dialog/selectorsdialog.cpp index acb8eea6e..4300adacf 100644 --- a/src/ui/dialog/selectorsdialog.cpp +++ b/src/ui/dialog/selectorsdialog.cpp @@ -315,8 +315,16 @@ SelectorsDialog::SelectorsDialog() if ( col ) { col->add_attribute(addRenderer->property_icon(), _mColumns._colType); } - _treeView.append_column("CSS Selector", _mColumns._colSelector); + + Gtk::CellRendererText *label = Gtk::manage(new Gtk::CellRendererText()); + addCol = _treeView.append_column("CSS Selector", *label) - 1; + col = _treeView.get_column(addCol); + if (col) { + col->add_attribute(label->property_text(),_mColumns._colSelector); + col->add_attribute(label->property_weight(), _mColumns._colSelected); + } _treeView.set_expander_column(*(_treeView.get_column(1))); + // Signal handlers _treeView.signal_button_release_event().connect( // Needs to be release, not press. @@ -484,7 +492,6 @@ Inkscape::XML::Node *SelectorsDialog::_getStyleTextNode() return textNode; } - /** * Fill the Gtk::TreeStore from the svg:style element. */ @@ -585,6 +592,7 @@ void SelectorsDialog::_readStyleElement() row[_mColumns._colObj] = objVec; row[_mColumns._colProperties] = properties; row[_mColumns._colVisible] = true; + row[_mColumns._colSelected] = 400; // Add as children, objects that match selector. for (auto &obj : objVec) { Gtk::TreeModel::Row childrow = *(_store->append(row->children())); @@ -595,6 +603,7 @@ void SelectorsDialog::_readStyleElement() childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); childrow[_mColumns._colProperties] = ""; // Unused childrow[_mColumns._colVisible] = true; // Unused + childrow[_mColumns._colSelected] = 400; } } @@ -628,7 +637,6 @@ void SelectorsDialog::_writeStyleElement() } _updating = true; SPDocument *document = SP_ACTIVE_DOCUMENT; - document->setStyleSheet(nullptr); Glib::ustring styleContent; for (auto& row: _store->children()) { Glib::ustring selector = row[_mColumns._colSelector]; @@ -645,10 +653,11 @@ void SelectorsDialog::_writeStyleElement() // harm in keeping it around ... Inkscape::XML::Node *textNode = _getStyleTextNode(); textNode->setContent(styleContent.c_str()); - + INKSCAPE.readStyleSheets(true); DocumentUndo::done(SP_ACTIVE_DOCUMENT, SP_VERB_DIALOG_SELECTORS, _("Edited style element.")); _updating = false; + g_debug("SelectorsDialog::_writeStyleElement(): | %s |", styleContent.c_str()); } @@ -811,6 +820,7 @@ void SelectorsDialog::_addToSelector(Gtk::TreeModel::Row row) childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); childrow[_mColumns._colProperties] = ""; // Unused childrow[_mColumns._colVisible] = true; // Unused + childrow[_mColumns._colSelected] = 400; } objVec = _getObjVec(multiselector); row[_mColumns._colSelector] = multiselector; @@ -835,6 +845,7 @@ void SelectorsDialog::_removeFromSelector(Gtk::TreeModel::Row row) SPObject *obj = nullptr; Glib::ustring objectLabel = row[_mColumns._colSelector]; Gtk::TreeModel::iterator iter = row->parent(); + Inkscape::Selection *selection = getDesktop()->getSelection(); if (iter) { Gtk::TreeModel::Row parent = *iter; Glib::ustring multiselector = parent[_mColumns._colSelector]; @@ -871,10 +882,6 @@ void SelectorsDialog::_removeFromSelector(Gtk::TreeModel::Row row) // Add entry to style element _writeStyleElement(); - if (obj) { - obj->style->readFromObject(obj); - obj->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); - } } } @@ -1025,14 +1032,14 @@ void SelectorsDialog::_removeClass(SPObject *obj, const Glib::ustring &className void SelectorsDialog::_selectObjects(int eventX, int eventY) { g_debug("SelectorsDialog::_selectObjects: %d, %d", eventX, eventY); - getDesktop()->selection->clear(); Gtk::TreeViewColumn *col = _treeView.get_column(1); Gtk::TreeModel::Path path; int x2 = 0; int y2 = 0; // To do: We should be able to do this via passing in row. if (_treeView.get_path_at_pos(eventX, eventY, path, col, x2, y2)) { - if (col == _treeView.get_column(1)) { + if (col == _treeView.get_column(1) && x2 > 25) { + getDesktop()->selection->clear(); Gtk::TreeModel::iterator iter = _store->get_iter(path); if (iter) { Gtk::TreeModel::Row row = *iter; @@ -1159,6 +1166,7 @@ void SelectorsDialog::_addSelector() row[_mColumns._colObj] = objVec; row[_mColumns._colProperties] = ""; row[_mColumns._colVisible] = true; + row[_mColumns._colSelected] = 400; for (auto &obj : objVec) { Gtk::TreeModel::Row childrow = *(_store->append(row->children())); childrow[_mColumns._colSelector] = "#" + Glib::ustring(obj->getId()); @@ -1167,6 +1175,7 @@ void SelectorsDialog::_addSelector() childrow[_mColumns._colObj] = std::vector<SPObject *>(1, obj); childrow[_mColumns._colProperties] = ""; // Unused childrow[_mColumns._colVisible] = true; // Unused + childrow[_mColumns._colSelected] = 400; } // Add entry to style element _writeStyleElement(); @@ -1219,18 +1228,11 @@ bool SelectorsDialog::_handleButtonEvent(GdkEventButton *event) if (_treeView.get_path_at_pos(x, y, path, col, x2, y2)) { if (col == _treeView.get_column(0)) { - bool remove_parent = false; Gtk::TreeModel::iterator iter = _store->get_iter(path); Gtk::TreeModel::Row row = *iter; - Glib::RefPtr<Gtk::TreeSelection> sel = _treeView.get_selection(); - sel->select(row); - // Add or remove objects from a - Gtk::TreeModel::Row row_to_sel; if (!row.parent()) { - row_to_sel = row; _addToSelector(row); } else { - row_to_sel = *row.parent(); _removeFromSelector(row); } } @@ -1377,20 +1379,26 @@ void SelectorsDialog::_selectRow() } else { _style_dialog->setCurrentSelector(""); } - for (auto row : children) { - std::vector<SPObject *> objVec = row[_mColumns._colObj]; - if (obj) { - for (auto & i : objVec) { - if (obj->getId() == i->getId()) { + Gtk::TreeModel::Children subchildren = row->children(); + for (auto subrow : subchildren) { + subrow[_mColumns._colSelected] = 400; + } + } + for (auto obj: selection->items()) { + for (auto row : children) { + Gtk::TreeModel::Children subchildren = row->children(); + for (auto subrow : subchildren) { + std::vector<SPObject *> objVec = subrow[_mColumns._colObj]; + if (obj->getId() == objVec[0]->getId()) { _treeView.get_selection()->select(row); row[_mColumns._colVisible] = true; - break; + subrow[_mColumns._colSelected] = 700; } } - } - if (row[_mColumns._colExpand]) { - _treeView.expand_to_path(Gtk::TreePath(row)); + if (row[_mColumns._colExpand]) { + _treeView.expand_to_path(Gtk::TreePath(row)); + } } } } diff --git a/src/ui/dialog/selectorsdialog.h b/src/ui/dialog/selectorsdialog.h index 109ffaf22..4a0e8dc1b 100644 --- a/src/ui/dialog/selectorsdialog.h +++ b/src/ui/dialog/selectorsdialog.h @@ -80,6 +80,7 @@ class SelectorsDialog : public Widget::Panel { add(_colObj); add(_colProperties); add(_colVisible); + add(_colSelected); } Gtk::TreeModelColumn<Glib::ustring> _colSelector; // Selector or matching object id. Gtk::TreeModelColumn<bool> _colExpand; // Open/Close store row. @@ -87,6 +88,7 @@ class SelectorsDialog : public Widget::Panel { 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. + Gtk::TreeModelColumn<gint> _colSelected; // Make selected. }; ModelColumns _mColumns; diff --git a/src/ui/dialog/styledialog.cpp b/src/ui/dialog/styledialog.cpp index fe9c6ed3b..3cdf5092b 100644 --- a/src/ui/dialog/styledialog.cpp +++ b/src/ui/dialog/styledialog.cpp @@ -130,17 +130,6 @@ class StyleDialog::NodeWatcher : public Inkscape::XML::NodeObserver { 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->name == name) { - obj->style->readFromObject(obj); - obj->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); - _styledialog->_nodeChanged(node); - break; - } - } - } } } @@ -291,11 +280,11 @@ Inkscape::XML::Node *StyleDialog::_getStyleTextNode() styleNode = SP_ACTIVE_DOCUMENT->getReprDoc()->createElement("svg:style"); textNode = SP_ACTIVE_DOCUMENT->getReprDoc()->createTextNode(""); - styleNode->appendChild(textNode); - Inkscape::GC::release(textNode); - root->addChild(styleNode, nullptr); Inkscape::GC::release(styleNode); + + styleNode->appendChild(textNode); + Inkscape::GC::release(textNode); } if (_textNode != textNode) { @@ -307,6 +296,7 @@ Inkscape::XML::Node *StyleDialog::_getStyleTextNode() return textNode; } + Glib::RefPtr<Gtk::TreeModel> StyleDialog::_selectTree(Glib::ustring selector) { Gtk::Label *selectorlabel; @@ -915,7 +905,6 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u // We could test if styleContent is empty and then delete the style node here but there is no // harm in keeping it around ... SPDocument *document = SP_ACTIVE_DOCUMENT; - document->setStyleSheet(nullptr); std::string pos = std::to_string(selectorpos); std::string selectormatch = "("; for (selectorpos; selectorpos > 1; selectorpos--) { @@ -928,6 +917,7 @@ void StyleDialog::_writeStyleElement(Glib::RefPtr<Gtk::TreeStore> store, Glib::u std::string result; std::regex_replace(std::back_inserter(result), content.begin(), content.end(), e, "$1" + styleContent + "$3"); textNode->setContent(result.c_str()); + INKSCAPE.readStyleSheets(true); for (auto iter : document->getObjectsBySelector(selector)) { iter->style->readFromObject(iter); iter->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_STYLE_MODIFIED_FLAG); diff --git a/src/ui/dialog/symbols.cpp b/src/ui/dialog/symbols.cpp index a269ae094..37e522d5d 100644 --- a/src/ui/dialog/symbols.cpp +++ b/src/ui/dialog/symbols.cpp @@ -211,9 +211,9 @@ SymbolsDialog::SymbolsDialog( gchar const* prefsPath ) : // No results overlay_icon = sp_get_icon_image("searching", Gtk::ICON_SIZE_DIALOG); overlay_icon->set_pixel_size(110); - overlay_icon->get_style_context()->add_class("iconsymbolic"); overlay_icon->set_halign(Gtk::ALIGN_CENTER); overlay_icon->set_valign(Gtk::ALIGN_START); + overlay_icon->set_margin_top(45); overlay_title = new Gtk::Label(); diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index f228e3ecc..885cd5ed6 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -920,6 +920,7 @@ sp_desktop_widget_realize (GtkWidget *widget) window->get_style_context()->add_class("regular"); window->get_style_context()->remove_class("symbolic"); } + INKSCAPE.signal_change_theme.emit(); } #ifdef GDK_WINDOWING_QUARTZ |
