From fec20075b3dfb06deb4abaf0f508d9ab88322708 Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 24 May 2025 00:05:53 +0300 Subject: [PATCH 01/32] made the tab and added the colorpicker widget --- .../actions/object-recolor-art-symbolic.svg | 5 ++ .../actions/object-recolor-art-symbolic.svg | 5 ++ share/ui/recolor-art.glade | 30 ++++++++ src/ui/CMakeLists.txt | 5 +- src/ui/dialog/fill-and-stroke.cpp | 38 ++++++++++ src/ui/dialog/fill-and-stroke.h | 6 ++ src/ui/widget/recolor-art.cpp | 73 +++++++++++++++++++ src/ui/widget/recolor-art.h | 59 +++++++++++++++ 8 files changed, 219 insertions(+), 2 deletions(-) create mode 100644 share/icons/Dash/symbolic/actions/object-recolor-art-symbolic.svg create mode 100644 share/icons/multicolor/symbolic/actions/object-recolor-art-symbolic.svg create mode 100644 share/ui/recolor-art.glade create mode 100644 src/ui/widget/recolor-art.cpp create mode 100644 src/ui/widget/recolor-art.h diff --git a/share/icons/Dash/symbolic/actions/object-recolor-art-symbolic.svg b/share/icons/Dash/symbolic/actions/object-recolor-art-symbolic.svg new file mode 100644 index 0000000000..b078cf421c --- /dev/null +++ b/share/icons/Dash/symbolic/actions/object-recolor-art-symbolic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/share/icons/multicolor/symbolic/actions/object-recolor-art-symbolic.svg b/share/icons/multicolor/symbolic/actions/object-recolor-art-symbolic.svg new file mode 100644 index 0000000000..b078cf421c --- /dev/null +++ b/share/icons/multicolor/symbolic/actions/object-recolor-art-symbolic.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade new file mode 100644 index 0000000000..3129e8df84 --- /dev/null +++ b/share/ui/recolor-art.glade @@ -0,0 +1,30 @@ + + + + + recolor-art + vertical + true + true + + + + + vertical + true + + + + + + + Apply + end + end + 6 + 6 + + + + + \ No newline at end of file diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index df176e0343..5d4f2108ce 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -285,10 +285,10 @@ set(ui_SRC widget/unit-tracker.cpp widget/widget-vfuncs-class-init.cpp widget/xml-treeview.cpp + widget/recolor-art.cpp view/svg-view-widget.cpp - # ------- # Headers builder-utils.h @@ -597,7 +597,8 @@ set(ui_SRC widget/unit-tracker.h widget/widget-vfuncs-class-init.h widget/xml-treeview.h - + widget/recolor-art.h + view/svg-view-widget.h ) diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index a3736bae31..1130f38ca0 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -31,6 +31,7 @@ #include "ui/pack.h" #include "ui/widget/fill-style.h" #include "ui/widget/stroke-style.h" +#include "ui/widget/recolor-art.h" #include "ui/widget/notebook-page.h" namespace Inkscape::UI::Dialog { @@ -40,6 +41,7 @@ FillAndStroke::FillAndStroke() , _page_fill(Gtk::make_managed(1, 1)) , _page_stroke_paint(Gtk::make_managed(1, 1)) , _page_stroke_style(Gtk::make_managed(1, 1)) + , _page_recolor_art(Gtk::make_managed(1, 1)) , _composite_settings(INKSCAPE_ICON("dialog-fill-and-stroke"), "fillstroke", UI::Widget::SimpleFilterModifier::ISOLATION | @@ -48,6 +50,7 @@ FillAndStroke::FillAndStroke() UI::Widget::SimpleFilterModifier::OPACITY) , fillWdgt(nullptr) , strokeWdgt(nullptr) + ,recolorArtWdgt(nullptr) { set_spacing(2); UI::pack_start(*this, _notebook, true, true); @@ -55,6 +58,7 @@ FillAndStroke::FillAndStroke() _notebook.append_page(*_page_fill, _createPageTabLabel(_("_Fill"), INKSCAPE_ICON("object-fill"))); _notebook.append_page(*_page_stroke_paint, _createPageTabLabel(_("Stroke _paint"), INKSCAPE_ICON("object-stroke"))); _notebook.append_page(*_page_stroke_style, _createPageTabLabel(_("Stroke st_yle"), INKSCAPE_ICON("object-stroke-style"))); + _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor Art"), INKSCAPE_ICON("object-recolor-art"))); _notebook.set_vexpand(true); _switch_page_conn = _notebook.signal_switch_page().connect(sigc::mem_fun(*this, &FillAndStroke::_onSwitchPage)); @@ -62,6 +66,7 @@ FillAndStroke::FillAndStroke() _layoutPageFill(); _layoutPageStrokePaint(); _layoutPageStrokeStyle(); + _layoutPageRecolorArt(); UI::pack_end(*this, _composite_settings, UI::PackOptions::shrink); @@ -75,6 +80,7 @@ FillAndStroke::~FillAndStroke() fillWdgt->setDesktop(nullptr); strokeWdgt->setDesktop(nullptr); strokeStyleWdgt->setDesktop(nullptr); + recolorArtWdgt->setDesktop(nullptr); _subject.setDesktop(nullptr); } @@ -84,6 +90,7 @@ void FillAndStroke::selectionChanged(Selection *selection) changed_fill = true; changed_stroke = true; changed_stroke_style = true; + changed_recolor_art = true; } if (fillWdgt && npage == 0) { fillWdgt->performUpdate(); @@ -94,6 +101,9 @@ void FillAndStroke::selectionChanged(Selection *selection) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionChangedCB(); } + if (recolorArtWdgt && npage == 3) { + recolorArtWdgt->performUpdate(); + } } void FillAndStroke::selectionModified(Selection *selection, guint flags) @@ -101,6 +111,7 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) changed_fill = true; changed_stroke = true; changed_stroke_style = true; + changed_recolor_art = true; if (fillWdgt && npage == 0) { fillWdgt->selectionModifiedCB(flags); } @@ -110,6 +121,9 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionModifiedCB(flags); } + if (recolorArtWdgt && npage == 3) { + recolorArtWdgt->performUpdate(); + } } void FillAndStroke::desktopReplaced() @@ -117,6 +131,7 @@ void FillAndStroke::desktopReplaced() changed_fill = true; changed_stroke = true; changed_stroke_style = true; + changed_recolor_art = true; if (fillWdgt) { fillWdgt->setDesktop(getDesktop()); } @@ -125,6 +140,9 @@ void FillAndStroke::desktopReplaced() } if (strokeStyleWdgt) { strokeStyleWdgt->setDesktop(getDesktop()); + } + if (recolorArtWdgt) { + recolorArtWdgt->setDesktop(getDesktop()); } _subject.setDesktop(getDesktop()); } @@ -143,6 +161,9 @@ void FillAndStroke::_onSwitchPage(Gtk::Widget * page, guint pagenum) } else if (npage == 2 && changed_stroke_style) { update = true; changed_stroke_style = false; + }else if (npage == 3 && changed_recolor_art) { + update = true; + changed_recolor_art = false; } if (update) { page_changed = true; @@ -183,6 +204,14 @@ FillAndStroke::_layoutPageStrokeStyle() strokeStyleWdgt->set_halign(Gtk::Align::START); _page_stroke_style->table().attach(*strokeStyleWdgt, 0, 0, 1, 1); } +void +FillAndStroke::_layoutPageRecolorArt() +{ + recolorArtWdgt = Gtk::make_managed(); + recolorArtWdgt->set_hexpand(); + recolorArtWdgt->set_halign(Gtk::Align::FILL); + _page_recolor_art->table().attach(*recolorArtWdgt,0,0,1,1); +} void FillAndStroke::showPageFill() @@ -210,6 +239,15 @@ FillAndStroke::showPageStrokeStyle() } +void +FillAndStroke::showPageRecolorArt() +{ + blink(); + _notebook.set_current_page(3); + _savePagePref(3); + +} + Gtk::Box& FillAndStroke::_createPageTabLabel(const Glib::ustring& label, const char *label_image) { diff --git a/src/ui/dialog/fill-and-stroke.h b/src/ui/dialog/fill-and-stroke.h index 0a918df2f0..24d8c5f6eb 100644 --- a/src/ui/dialog/fill-and-stroke.h +++ b/src/ui/dialog/fill-and-stroke.h @@ -32,6 +32,7 @@ namespace Widget { class FillNStroke; class NotebookPage; class StrokeStyle; +class RecolorArt; } // namespace Widget namespace Dialog { @@ -47,6 +48,7 @@ public: void showPageFill(); void showPageStrokePaint(); void showPageStrokeStyle(); + void showPageRecolorArt(); protected: Gtk::Notebook _notebook; @@ -54,6 +56,7 @@ protected: UI::Widget::NotebookPage *_page_fill = nullptr; UI::Widget::NotebookPage *_page_stroke_paint = nullptr; UI::Widget::NotebookPage *_page_stroke_style = nullptr; + UI::Widget::NotebookPage *_page_recolor_art = nullptr; UI::Widget::StyleSubject::Selection _subject; UI::Widget::ObjectCompositeSettings _composite_settings; @@ -64,6 +67,7 @@ protected: void _layoutPageFill(); void _layoutPageStrokePaint(); void _layoutPageStrokeStyle(); + void _layoutPageRecolorArt(); void _savePagePref(guint page_num); void _onSwitchPage(Gtk::Widget *page, guint pagenum); @@ -75,9 +79,11 @@ private: bool changed_fill = true; bool changed_stroke = true; bool changed_stroke_style = true; + bool changed_recolor_art = true; UI::Widget::FillNStroke *fillWdgt = nullptr; UI::Widget::FillNStroke *strokeWdgt = nullptr; UI::Widget::StrokeStyle *strokeStyleWdgt = nullptr; + UI::Widget::RecolorArt *recolorArtWdgt = nullptr; sigc::scoped_connection _switch_page_conn; }; diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp new file mode 100644 index 0000000000..dd645039bd --- /dev/null +++ b/src/ui/widget/recolor-art.cpp @@ -0,0 +1,73 @@ +#include "recolor-art.h" + +#include +#include + +#include "actions/actions-tools.h" +#include "desktop-style.h" +#include "desktop.h" +#include "document-undo.h" +#include "document.h" +#include "gradient-chemistry.h" +#include "object/sp-defs.h" +#include "object/sp-linear-gradient.h" +#include "object/sp-mesh-gradient.h" +#include "object/sp-object.h" +#include "object/sp-pattern.h" +#include "object/sp-radial-gradient.h" +#include "object/sp-stop.h" +#include "object/sp-text.h" +#include "object/sp-use.h" +#include "pattern-manipulation.h" +#include "selection.h" +#include "style.h" +#include "ui/builder-utils.h" +#include "ui/dialog/dialog-base.h" +#include "ui/icon-names.h" +#include "ui/widget/color-notebook.h" + +namespace Inkscape { +namespace UI { +namespace Widget { + +RecolorArt::RecolorArt() + : Gtk::Box() + , _builder(create_builder("recolor-art.glade")) + , _solid_colors(std::make_shared()) + +{ + set_name("RecolorArt"); + append(get_widget(_builder, "recolor-art")); + _solid_colors->set(Color(0x000000ff)); + _layoutColorPicker(); +} +RecolorArt::~RecolorArt() {} + +void RecolorArt::setDesktop(SPDesktop *desktop) +{ + if (_desktop != desktop) { + _desktop = desktop; + } + g_message("setDesktop\n"); +} +void RecolorArt::_layoutColorPicker() +{ + _colorPickerWdgt = Gtk::make_managed(_solid_colors); + _colorPickerWdgt->set_visible(true); + _colorPickerWdgt->set_label(_("Selected Color")); + + auto container = _builder->get_widget("color-picker"); + if (container) { + container->append(*_colorPickerWdgt); + } else { + g_warning("color picker not found"); + } +} + +void RecolorArt::performUpdate() +{ + g_message("Performing Update\n"); +} +} // namespace Widget +} // namespace UI +} // namespace Inkscape \ No newline at end of file diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h new file mode 100644 index 0000000000..d12c204db3 --- /dev/null +++ b/src/ui/widget/recolor-art.h @@ -0,0 +1,59 @@ + + +#ifndef SEEN_DIALOGS_SP_RECOLOR_ART_H +#define SEEN_DIALOGS_SP_RECOLOR_ART_H + +#include + +#include "ui/widget/paint-selector.h" + +using namespace Inkscape::Colors; + +namespace Inkscape::Colors { +class Color; +class ColorSet; +namespace Space { +class AnySpace; +} +} // namespace Inkscape::Colors + +namespace Gtk { +class Widget; +class Builder; +} // namespace Gtk + +class SPDesktop; + +namespace Inkscape { +namespace UI { +namespace Tools { +class ToolBase; +} + +namespace Widget { +class ColorNotebook; + +class RecolorArt : public Gtk::Box +{ +private: + SPDesktop *_desktop = nullptr; + std::shared_ptr _solid_colors; + Inkscape::UI::Widget::ColorNotebook *_colorPickerWdgt = nullptr; + +protected: + Glib::RefPtr _builder; + void _layoutColorPicker(); + +public: + RecolorArt(); + ~RecolorArt(); + + void performUpdate(); + void setDesktop(SPDesktop *desktop); +}; + +} // namespace Widget +} // namespace UI +} // namespace Inkscape + +#endif // SEEN_DIALOGS_SP_RECOLOR_ART_H -- GitLab From 40695e01bc31f924bb623576b788ac04e437c6bb Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 24 May 2025 13:46:47 +0300 Subject: [PATCH 02/32] added colors list to the glade file --- .../symbolic/actions/arrow-symbolic.svg | 3 + .../actions/reset-colors-symbolic.svg | 4 ++ share/ui/recolor-art.glade | 72 +++++++++++++++++-- 3 files changed, 72 insertions(+), 7 deletions(-) create mode 100644 share/icons/multicolor/symbolic/actions/arrow-symbolic.svg create mode 100644 share/icons/multicolor/symbolic/actions/reset-colors-symbolic.svg diff --git a/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg b/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg new file mode 100644 index 0000000000..f387849bc8 --- /dev/null +++ b/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/share/icons/multicolor/symbolic/actions/reset-colors-symbolic.svg b/share/icons/multicolor/symbolic/actions/reset-colors-symbolic.svg new file mode 100644 index 0000000000..7d47572893 --- /dev/null +++ b/share/icons/multicolor/symbolic/actions/reset-colors-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 3129e8df84..6df02059d3 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -1,20 +1,78 @@ - + recolor-art vertical true true - + + + original-reset-recolor + horizontal + center + center + 80 + + + Original + center + + + + + true + false + false + + + reset-colors + normal + + + + + + + Recolored + center + + + + + + + colors-list + horizontal + center + center + 24 + + + center + + + + + arrow + large + + + + + center + + + + + - vertical - true - + vertical + true - + @@ -24,7 +82,7 @@ 6 6 - + \ No newline at end of file -- GitLab From 0d981e94d3b2fbee0fd7e972abb47495c9231a42 Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 24 May 2025 15:21:58 +0300 Subject: [PATCH 03/32] added colors list and checkbutton to the glade file --- share/ui/recolor-art.glade | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 6df02059d3..7ee45fad33 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -75,12 +75,26 @@ - - Apply - end - end - 6 - 6 + + liveP-apply + horizontal + 300 + + + liveP + Live Preview + end + start + + + + + apply + Apply + end + end + + -- GitLab From e99abaadc955ae30420685bd2c2847f378d5d7eb Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 27 May 2025 01:11:44 +0300 Subject: [PATCH 04/32] collect fills & strokes make the colorList buttons --- share/ui/recolor-art.glade | 12 ++-- src/ui/widget/recolor-art.cpp | 123 +++++++++++++++++++++++++++++++++- src/ui/widget/recolor-art.h | 19 +++++- 3 files changed, 145 insertions(+), 9 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 7ee45fad33..4ebcb7fc25 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -45,26 +45,26 @@ colors-list - horizontal + vertical center center 24 - - + diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index dd645039bd..af3f0c1719 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -1,9 +1,14 @@ #include "recolor-art.h" #include +#include +#include #include +#include +#include #include "actions/actions-tools.h" +#include "canvas.h" #include "desktop-style.h" #include "desktop.h" #include "document-undo.h" @@ -20,6 +25,7 @@ #include "object/sp-use.h" #include "pattern-manipulation.h" #include "selection.h" +#include "style-internal.h" #include "style.h" #include "ui/builder-utils.h" #include "ui/dialog/dialog-base.h" @@ -40,6 +46,7 @@ RecolorArt::RecolorArt() append(get_widget(_builder, "recolor-art")); _solid_colors->set(Color(0x000000ff)); _layoutColorPicker(); + _colorList = _builder->get_widget("colors-list"); } RecolorArt::~RecolorArt() {} @@ -50,6 +57,80 @@ void RecolorArt::setDesktop(SPDesktop *desktop) } g_message("setDesktop\n"); } +void RecolorArt::_collectColors(std::vector items) +{ + _selected_colors.clear(); + for (auto item : items) { + _extractItemColors(item); + } +} +void RecolorArt::_extractItemColors(SPItem *item) +{ + if (item) { + _extractItemStyle(item); + } + if (auto group = dynamic_cast(item)) { + for (SPObject &child : group->children) { + if (auto childItem = dynamic_cast(&child)) { + _extractItemColors(childItem); + } + } + } +} +void RecolorArt::_extractGradientStops(SPGradient *item) {} +void RecolorArt::_populateMap(Color color, SPItem *item, std::string kind) +{ + ColorRef ref = ColorRef(item, kind); + if (_selected_colors.count(color.toString())) { + _selected_colors[color.toString()].first.push_back(ref); + } else { + _selected_colors.emplace(color.toString(), std::make_pair(std::vector{ref}, color)); + } +} +void RecolorArt::_extractItemStyle(SPItem *item) +{ + // check item style + if (!item || !item->style) + return; + + SPStyle *style = item->style; + // get flat fills + if (style->fill.isColor()) { + auto color = style->fill.getColor(); + _populateMap(color, item, "fill"); + } + // get gradient stops strokes + else if (style->fill.isPaintserver()) { + } + + if (style->stroke.isColor()) { + auto color = style->stroke.getColor(); + _populateMap(color, item, "stroke"); + } + // get gradient stops strokes + else if (style->stroke.isPaintserver()) { + } +} +void RecolorArt::_generateVisualList() +{ + if (_colorList) { + for (auto [key, value] : _selected_colors) { + auto box = std::make_unique(Gtk::Orientation::HORIZONTAL, 24); + auto original = std::make_unique(); + original->set_name("original_" + key); + _colorButtons(original.get(), key, "original_" + key); + + auto recolored = std::make_unique(); + auto arrow = std::make_unique(); + arrow->set_from_icon_name("arrow"); + // TODO : set recolored when getting signals from clicked original + box->append(*original); + box->append(*arrow); + box->append(*recolored); + _colorList->append(*box); + } + } +} void RecolorArt::_layoutColorPicker() { _colorPickerWdgt = Gtk::make_managed(_solid_colors); @@ -63,11 +144,49 @@ void RecolorArt::_layoutColorPicker() g_warning("color picker not found"); } } - +void RecolorArt::_colorButtons(Gtk::Button *button, std::string color, std::string id) +{ + if (button) { + auto css_provider = Gtk::CssProvider::create(); + Glib::ustring css = "button { background-color: " + Glib::ustring(color) + "; background-image: none;}"; + css_provider->load_from_data(css); + auto style_context = button->get_style_context(); + style_context->add_provider(css_provider, GTK_STYLE_PROVIDER_PRIORITY_USER); + } else { + g_message("button not found"); + } +} void RecolorArt::performUpdate() { + for (auto child : _colorList->get_children()) { + _colorList->remove(*child); + } + if (auto selection = _desktop->getSelection()) { + std::vector vec(selection->items().begin(), selection->items().end()); + _collectColors(vec); + if (!_selected_colors.empty()) { + _generateVisualList(); + } + } + g_message("Performing Update\n"); } } // namespace Widget } // namespace UI -} // namespace Inkscape \ No newline at end of file +} // namespace Inkscape + +// for (auto [key, value] : _selected_colors) { +// std::cout << key << " : "; +// for (auto item : value.first) { +// std::cout << item.item << " , "; +// if (item.kind == "fill" && key == "#000000") { +// uint32_t rgba = 0xFF00FFFF; +// Color c(rgba, true); +// SPCSSAttr *css = sp_repr_css_attr_new(); +// sp_repr_css_set_property_string(css, "fill", c.toString(false)); +// sp_desktop_apply_css_recursive(item.item, css, true); +// sp_repr_css_attr_unref(css); +// } +// } +// std::cout << std::endl; +// } \ No newline at end of file diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index d12c204db3..44757b58f9 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -5,6 +5,9 @@ #include +#include "canvas.h" +#include "style-internal.h" +#include "style.h" #include "ui/widget/paint-selector.h" using namespace Inkscape::Colors; @@ -33,21 +36,35 @@ class ToolBase; namespace Widget { class ColorNotebook; +struct ColorRef +{ + SPItem *item; + std::string kind; +}; + class RecolorArt : public Gtk::Box { private: SPDesktop *_desktop = nullptr; std::shared_ptr _solid_colors; + std::map, std::optional>> _selected_colors; Inkscape::UI::Widget::ColorNotebook *_colorPickerWdgt = nullptr; + Gtk::Box *_colorList = nullptr; protected: Glib::RefPtr _builder; + void _populateMap(Color color, SPItem *style, std::string kind); + void _collectColors(std::vector items); + void _extractGradientStops(SPGradient *item); + void _extractItemColors(SPItem *item); + void _extractItemStyle(SPItem *item); + void _generateVisualList(); void _layoutColorPicker(); + void _colorButtons(Gtk::Button *button, std::string color, std::string id); public: RecolorArt(); ~RecolorArt(); - void performUpdate(); void setDesktop(SPDesktop *desktop); }; -- GitLab From 7c56d4478253f1a949c04b705989da5603d67793 Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 27 May 2025 01:59:30 +0300 Subject: [PATCH 05/32] added gradient stops to colorsList --- src/ui/widget/recolor-art.cpp | 20 ++++++++++++++++++-- src/ui/widget/recolor-art.h | 2 +- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index af3f0c1719..c9eff21188 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -15,6 +15,7 @@ #include "document.h" #include "gradient-chemistry.h" #include "object/sp-defs.h" +#include "object/sp-gradient.h" #include "object/sp-linear-gradient.h" #include "object/sp-mesh-gradient.h" #include "object/sp-object.h" @@ -77,7 +78,18 @@ void RecolorArt::_extractItemColors(SPItem *item) } } } -void RecolorArt::_extractGradientStops(SPGradient *item) {} +void RecolorArt::_extractGradientStops(SPItem *item, std::string kind, bool isFill) +{ + SPPaintServer *paint_server = isFill ? item->style->getFillPaintServer() : item->style->getStrokePaintServer(); + if (paint_server && dynamic_cast(paint_server)) { + SPGradient *gradient = dynamic_cast(paint_server); + for (auto stop : gradient->getGradientVector().stops) { + if (stop.color.has_value()) { + _populateMap(stop.color.value(), item, kind); + } + } + } +} void RecolorArt::_populateMap(Color color, SPItem *item, std::string kind) { ColorRef ref = ColorRef(item, kind); @@ -101,6 +113,7 @@ void RecolorArt::_extractItemStyle(SPItem *item) } // get gradient stops strokes else if (style->fill.isPaintserver()) { + _extractGradientStops(item, "stop-fill", true); } if (style->stroke.isColor()) { @@ -109,6 +122,7 @@ void RecolorArt::_extractItemStyle(SPItem *item) } // get gradient stops strokes else if (style->stroke.isPaintserver()) { + _extractGradientStops(item, "stop-stoke", false); } } void RecolorArt::_generateVisualList() @@ -116,7 +130,9 @@ void RecolorArt::_generateVisualList() if (_colorList) { for (auto [key, value] : _selected_colors) { auto box = std::make_unique(Gtk::Orientation::HORIZONTAL, 24); - auto original = std::make_unique(); + box->set_halign(Gtk::Align::CENTER); + box->set_valign(Gtk::Align::CENTER); + auto original = std::make_unique(); original->set_name("original_" + key); _colorButtons(original.get(), key, "original_" + key); diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 44757b58f9..a3ddc2ab83 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -55,7 +55,7 @@ protected: Glib::RefPtr _builder; void _populateMap(Color color, SPItem *style, std::string kind); void _collectColors(std::vector items); - void _extractGradientStops(SPGradient *item); + void _extractGradientStops(SPItem *item, std::string kind, bool isFill); void _extractItemColors(SPItem *item); void _extractItemStyle(SPItem *item); void _generateVisualList(); -- GitLab From cbd23b285dccfdd270812a1c9d0f3bfd1df343bb Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 31 May 2025 23:33:53 +0300 Subject: [PATCH 06/32] reflected original color on the colorpicker updated recolorbutton with updated color from colorpicker --- src/ui/widget/recolor-art.cpp | 98 ++++++++++++++++++++++++++++------- src/ui/widget/recolor-art.h | 20 +++++-- 2 files changed, 95 insertions(+), 23 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index c9eff21188..e857fba960 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -9,6 +10,7 @@ #include "actions/actions-tools.h" #include "canvas.h" +#include "color-notebook.h" #include "desktop-style.h" #include "desktop.h" #include "document-undo.h" @@ -31,7 +33,6 @@ #include "ui/builder-utils.h" #include "ui/dialog/dialog-base.h" #include "ui/icon-names.h" -#include "ui/widget/color-notebook.h" namespace Inkscape { namespace UI { @@ -46,8 +47,14 @@ RecolorArt::RecolorArt() set_name("RecolorArt"); append(get_widget(_builder, "recolor-art")); _solid_colors->set(Color(0x000000ff)); + _layoutColorPicker(); - _colorList = _builder->get_widget("colors-list"); + _color_list = _builder->get_widget("colors-list"); + _apply = _builder->get_widget("apply"); + _live_preview = _builder->get_widget("liveP"); + + _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); + _live_preview->signal_toggled().connect(sigc::mem_fun(*this, &RecolorArt::_onLivePreviewToggled)); } RecolorArt::~RecolorArt() {} @@ -127,41 +134,55 @@ void RecolorArt::_extractItemStyle(SPItem *item) } void RecolorArt::_generateVisualList() { - if (_colorList) { + if (_color_list) { for (auto [key, value] : _selected_colors) { - auto box = std::make_unique(Gtk::Orientation::HORIZONTAL, 24); + auto box = Gtk::make_managed(Gtk::Orientation::HORIZONTAL, 24); box->set_halign(Gtk::Align::CENTER); box->set_valign(Gtk::Align::CENTER); - auto original = std::make_unique(); - original->set_name("original_" + key); - _colorButtons(original.get(), key, "original_" + key); - - auto recolored = std::make_unique(); - auto arrow = std::make_unique(); + auto original = Gtk::make_managed(); + original->set_name(key); + _colorButtons(original, key); + original->signal_clicked().connect( + sigc::bind(sigc::mem_fun(*this, &RecolorArt::_onOriginalColorClicked), original->get_name())); + auto recolored = Gtk::make_managed(); + recolored->set_name("recolored_from" + key); + _colorButtons(recolored, Color(0xffffff00).toString()); + buttons[key] = {original, recolored}; + auto arrow = Gtk::make_managed(); arrow->set_from_icon_name("arrow"); // TODO : set recolored when getting signals from clicked original box->append(*original); box->append(*arrow); box->append(*recolored); - _colorList->append(*box); + _color_list->append(*box); } } } -void RecolorArt::_layoutColorPicker() +void RecolorArt::_layoutColorPicker(std::shared_ptr updated_color) { - _colorPickerWdgt = Gtk::make_managed(_solid_colors); - _colorPickerWdgt->set_visible(true); - _colorPickerWdgt->set_label(_("Selected Color")); + if (updated_color) + _solid_colors = updated_color; + _color_picker_wdgt = Gtk::make_managed(_solid_colors); + _color_picker_wdgt->set_visible(true); + _color_picker_wdgt->set_label(_("Selected Color")); + _solid_colors->signal_changed.connect(sigc::mem_fun(*this, &RecolorArt::_onColorPickerChanged)); auto container = _builder->get_widget("color-picker"); if (container) { - container->append(*_colorPickerWdgt); + for (auto child : container->get_children()) + container->remove(*child); + container->append(*_color_picker_wdgt); } else { g_warning("color picker not found"); } } -void RecolorArt::_colorButtons(Gtk::Button *button, std::string color, std::string id) +void RecolorArt::_colorButtons(Gtk::Button *button, std::string color) { + if (color.empty() || color.size() < 7 || color[0] != '#') { + g_warning("Invalid color string: %s", color.c_str()); + return; + } + if (button) { auto css_provider = Gtk::CssProvider::create(); Glib::ustring css = "button { background-color: " + Glib::ustring(color) + "; background-image: none;}"; @@ -172,11 +193,50 @@ void RecolorArt::_colorButtons(Gtk::Button *button, std::string color, std::stri g_message("button not found"); } } + +void RecolorArt::_onOriginalColorClicked(std::string color_id) +{ + _current_color_id = color_id; + auto it = _selected_colors.find(color_id); + if (it != _selected_colors.end() && it->second.second.has_value()) { + Color color = it->second.second.value(); + std::shared_ptr updated_color = std::make_shared(); + updated_color->set(color); + _layoutColorPicker(updated_color); + // g_message("original color selected at color %s", color_id.c_str()); + } +} +void RecolorArt::_onColorPickerChanged() +{ + auto it = buttons.find(_current_color_id); + if (it == buttons.end()) { + g_message("couldn't find the color id %s", _current_color_id.c_str()); + return; + } + Gtk::Button *_current_recolor_button = it->second.second; + std::optional new_color = _solid_colors->get(); + if (!new_color.has_value()) { + g_message("there is no color"); + return; + } + _colorButtons(_current_recolor_button, new_color.value().toString()); + g_message("color picker changed"); +} +void RecolorArt::_onLivePreviewToggled() +{ + g_message("LP toggled"); +} +void RecolorArt::_onApplyButtonClicked() +{ + g_message("apply clicked"); +} void RecolorArt::performUpdate() { - for (auto child : _colorList->get_children()) { - _colorList->remove(*child); + for (auto child : _color_list->get_children()) { + _color_list->remove(*child); } + buttons.clear(); + _current_color_id = ""; if (auto selection = _desktop->getSelection()) { std::vector vec(selection->items().begin(), selection->items().end()); _collectColors(vec); diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index a3ddc2ab83..f95192a4d8 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -4,6 +4,8 @@ #define SEEN_DIALOGS_SP_RECOLOR_ART_H #include +#include +#include #include "canvas.h" #include "style-internal.h" @@ -48,8 +50,12 @@ private: SPDesktop *_desktop = nullptr; std::shared_ptr _solid_colors; std::map, std::optional>> _selected_colors; - Inkscape::UI::Widget::ColorNotebook *_colorPickerWdgt = nullptr; - Gtk::Box *_colorList = nullptr; + Inkscape::UI::Widget::ColorNotebook *_color_picker_wdgt = nullptr; + Gtk::Box *_color_list = nullptr; + Gtk::Button *_apply = nullptr; + Gtk::CheckButton *_live_preview = nullptr; + std::string _current_color_id; + std::map> buttons; // color_id : {original , recolored} protected: Glib::RefPtr _builder; @@ -59,8 +65,14 @@ protected: void _extractItemColors(SPItem *item); void _extractItemStyle(SPItem *item); void _generateVisualList(); - void _layoutColorPicker(); - void _colorButtons(Gtk::Button *button, std::string color, std::string id); + void _layoutColorPicker(std::shared_ptr updated_color = nullptr); + void _colorButtons(Gtk::Button *button, std::string color); + + // signals handelrs + void _onOriginalColorClicked(std::string color_id); + void _onColorPickerChanged(); + void _onLivePreviewToggled(); + void _onApplyButtonClicked(); public: RecolorArt(); -- GitLab From 49589ce57875a178905d52e79790912858554aa2 Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 3 Jun 2025 20:47:12 +0300 Subject: [PATCH 07/32] finished apply button function --- src/ui/widget/recolor-art.cpp | 53 +++++++++++++++++++++++++++-------- src/ui/widget/recolor-art.h | 10 ++++++- 2 files changed, 51 insertions(+), 12 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index e857fba960..446f79ce4b 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -100,10 +100,11 @@ void RecolorArt::_extractGradientStops(SPItem *item, std::string kind, bool isFi void RecolorArt::_populateMap(Color color, SPItem *item, std::string kind) { ColorRef ref = ColorRef(item, kind); + ColorPair pair = ColorPair(color, color); if (_selected_colors.count(color.toString())) { _selected_colors[color.toString()].first.push_back(ref); } else { - _selected_colors.emplace(color.toString(), std::make_pair(std::vector{ref}, color)); + _selected_colors.emplace(color.toString(), std::make_pair(std::vector{ref}, pair)); } } void RecolorArt::_extractItemStyle(SPItem *item) @@ -141,12 +142,15 @@ void RecolorArt::_generateVisualList() box->set_valign(Gtk::Align::CENTER); auto original = Gtk::make_managed(); original->set_name(key); - _colorButtons(original, key); + _colorButtons(original, value.second.value().old_color.toString()); original->signal_clicked().connect( sigc::bind(sigc::mem_fun(*this, &RecolorArt::_onOriginalColorClicked), original->get_name())); auto recolored = Gtk::make_managed(); recolored->set_name("recolored_from" + key); - _colorButtons(recolored, Color(0xffffff00).toString()); + Color new_color = (value.second.value().old_color == value.second.value().new_color) + ? Color(0xffffff00) + : value.second.value().new_color; + _colorButtons(recolored, new_color.toString()); buttons[key] = {original, recolored}; auto arrow = Gtk::make_managed(); arrow->set_from_icon_name("arrow"); @@ -199,7 +203,7 @@ void RecolorArt::_onOriginalColorClicked(std::string color_id) _current_color_id = color_id; auto it = _selected_colors.find(color_id); if (it != _selected_colors.end() && it->second.second.has_value()) { - Color color = it->second.second.value(); + Color color = it->second.second.value().new_color; std::shared_ptr updated_color = std::make_shared(); updated_color->set(color); _layoutColorPicker(updated_color); @@ -210,7 +214,7 @@ void RecolorArt::_onColorPickerChanged() { auto it = buttons.find(_current_color_id); if (it == buttons.end()) { - g_message("couldn't find the color id %s", _current_color_id.c_str()); + g_message("couldn't find the color id \" %s \" ", _current_color_id.c_str()); return; } Gtk::Button *_current_recolor_button = it->second.second; @@ -219,24 +223,51 @@ void RecolorArt::_onColorPickerChanged() g_message("there is no color"); return; } - _colorButtons(_current_recolor_button, new_color.value().toString()); + std::string _color_string = new_color.value().toString(); + _colorButtons(_current_recolor_button, _color_string); + auto _selected = _selected_colors.find(_current_color_id); + if (_selected != _selected_colors.end()) + _selected->second.second.value().new_color = new_color.value(); + // if (_live_preview && _live_preview->property_active()) { + // auto _selected = _selected_colors.find(_current_color_id); + // if (_selected == _selected_colors.end()) { + // g_message("no items found"); + // return; + // } + // _selected->second.second.value().new_color = new_color.value(); + // for (auto &item : _selected->second.first) { + // SPCSSAttr *css = sp_repr_css_attr_new(); + // sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); + // sp_desktop_apply_css_recursive(item.item, css, true); + // sp_repr_css_attr_unref(css); + // } + // } g_message("color picker changed"); } -void RecolorArt::_onLivePreviewToggled() -{ - g_message("LP toggled"); -} void RecolorArt::_onApplyButtonClicked() { + for (auto [key, items] : _selected_colors) { + std::string _color_string = items.second.value().new_color.toString(); + for (auto &item : items.first) { + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); + sp_desktop_apply_css_recursive(item.item, css, true); + sp_repr_css_attr_unref(css); + } + } g_message("apply clicked"); } +void RecolorArt::_onLivePreviewToggled() +{ + g_message("LP toggled"); +} void RecolorArt::performUpdate() { for (auto child : _color_list->get_children()) { _color_list->remove(*child); } buttons.clear(); - _current_color_id = ""; + // _current_color_id = ""; if (auto selection = _desktop->getSelection()) { std::vector vec(selection->items().begin(), selection->items().end()); _collectColors(vec); diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index f95192a4d8..3825769101 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -44,18 +44,26 @@ struct ColorRef std::string kind; }; +struct ColorPair +{ + Color old_color; + Color new_color; +}; + class RecolorArt : public Gtk::Box { private: SPDesktop *_desktop = nullptr; std::shared_ptr _solid_colors; - std::map, std::optional>> _selected_colors; + std::map, std::optional>> _selected_colors; Inkscape::UI::Widget::ColorNotebook *_color_picker_wdgt = nullptr; Gtk::Box *_color_list = nullptr; Gtk::Button *_apply = nullptr; Gtk::CheckButton *_live_preview = nullptr; std::string _current_color_id; std::map> buttons; // color_id : {original , recolored} + bool _is_preview = false; + sigc::connection _color_changed_connection; protected: Glib::RefPtr _builder; -- GitLab From 377af5938605d886bf97111211f3182c52aa3b81 Mon Sep 17 00:00:00 2001 From: ftomara Date: Fri, 20 Jun 2025 05:56:39 +0300 Subject: [PATCH 08/32] finished live_preview feature check button --- src/ui/dialog/fill-and-stroke.cpp | 14 +++++----- src/ui/widget/recolor-art.cpp | 45 +++++++++++-------------------- src/ui/widget/recolor-art.h | 1 + 3 files changed, 25 insertions(+), 35 deletions(-) diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 1130f38ca0..074a55b1af 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -23,8 +23,8 @@ #include #include -#include "desktop.h" #include "desktop-style.h" +#include "desktop.h" #include "preferences.h" #include "ui/icon-loader.h" #include "ui/icon-names.h" @@ -102,7 +102,8 @@ void FillAndStroke::selectionChanged(Selection *selection) strokeStyleWdgt->selectionChangedCB(); } if (recolorArtWdgt && npage == 3) { - recolorArtWdgt->performUpdate(); + if (!recolorArtWdgt->isInPreviewMode()) + recolorArtWdgt->performUpdate(); } } @@ -121,8 +122,9 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionModifiedCB(flags); } - if (recolorArtWdgt && npage == 3) { - recolorArtWdgt->performUpdate(); + if (recolorArtWdgt && npage == 3) { + if (!recolorArtWdgt->isInPreviewMode()) + recolorArtWdgt->performUpdate(); } } @@ -141,13 +143,13 @@ void FillAndStroke::desktopReplaced() if (strokeStyleWdgt) { strokeStyleWdgt->setDesktop(getDesktop()); } - if (recolorArtWdgt) { + if (recolorArtWdgt) { recolorArtWdgt->setDesktop(getDesktop()); } _subject.setDesktop(getDesktop()); } -void FillAndStroke::_onSwitchPage(Gtk::Widget * page, guint pagenum) +void FillAndStroke::_onSwitchPage(Gtk::Widget *page, guint pagenum) { npage = pagenum; if (page->is_visible()) { diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index 446f79ce4b..6e1afbbbf4 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -228,20 +228,20 @@ void RecolorArt::_onColorPickerChanged() auto _selected = _selected_colors.find(_current_color_id); if (_selected != _selected_colors.end()) _selected->second.second.value().new_color = new_color.value(); - // if (_live_preview && _live_preview->property_active()) { - // auto _selected = _selected_colors.find(_current_color_id); - // if (_selected == _selected_colors.end()) { - // g_message("no items found"); - // return; - // } - // _selected->second.second.value().new_color = new_color.value(); - // for (auto &item : _selected->second.first) { - // SPCSSAttr *css = sp_repr_css_attr_new(); - // sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); - // sp_desktop_apply_css_recursive(item.item, css, true); - // sp_repr_css_attr_unref(css); - // } - // } + if (_live_preview && _live_preview->property_active()) { + auto _selected = _selected_colors.find(_current_color_id); + if (_selected == _selected_colors.end()) { + g_message("no items found"); + return; + } + _selected->second.second.value().new_color = new_color.value(); + for (auto &item : _selected->second.first) { + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); + sp_desktop_apply_css_recursive(item.item, css, true); + sp_repr_css_attr_unref(css); + } + } g_message("color picker changed"); } void RecolorArt::_onApplyButtonClicked() @@ -259,6 +259,8 @@ void RecolorArt::_onApplyButtonClicked() } void RecolorArt::_onLivePreviewToggled() { + _is_preview = _live_preview->property_active(); + g_message(_is_preview?"is true":"is false"); g_message("LP toggled"); } void RecolorArt::performUpdate() @@ -282,18 +284,3 @@ void RecolorArt::performUpdate() } // namespace UI } // namespace Inkscape -// for (auto [key, value] : _selected_colors) { -// std::cout << key << " : "; -// for (auto item : value.first) { -// std::cout << item.item << " , "; -// if (item.kind == "fill" && key == "#000000") { -// uint32_t rgba = 0xFF00FFFF; -// Color c(rgba, true); -// SPCSSAttr *css = sp_repr_css_attr_new(); -// sp_repr_css_set_property_string(css, "fill", c.toString(false)); -// sp_desktop_apply_css_recursive(item.item, css, true); -// sp_repr_css_attr_unref(css); -// } -// } -// std::cout << std::endl; -// } \ No newline at end of file diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 3825769101..b57dc60a96 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -86,6 +86,7 @@ public: RecolorArt(); ~RecolorArt(); void performUpdate(); + bool isInPreviewMode() { return _is_preview; } void setDesktop(SPDesktop *desktop); }; -- GitLab From 7c690449936146e571a070daafad9acfd2dcddf6 Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 24 Jun 2025 12:46:22 +0300 Subject: [PATCH 09/32] made live preview defualt to checked removed apply button saved changed colors on selection change --- share/ui/recolor-art.glade | 4 ++-- src/ui/dialog/fill-and-stroke.cpp | 8 ++++--- src/ui/widget/recolor-art.cpp | 35 +++++++++++++++---------------- src/ui/widget/recolor-art.h | 6 +++--- 4 files changed, 27 insertions(+), 26 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 4ebcb7fc25..3075c3f8ea 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -87,14 +87,14 @@ start - + diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 074a55b1af..925476e673 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -33,6 +33,8 @@ #include "ui/widget/stroke-style.h" #include "ui/widget/recolor-art.h" #include "ui/widget/notebook-page.h" +#include "ui/widget/recolor-art.h" +#include "ui/widget/stroke-style.h" namespace Inkscape::UI::Dialog { @@ -102,8 +104,8 @@ void FillAndStroke::selectionChanged(Selection *selection) strokeStyleWdgt->selectionChangedCB(); } if (recolorArtWdgt && npage == 3) { - if (!recolorArtWdgt->isInPreviewMode()) - recolorArtWdgt->performUpdate(); + // if (!recolorArtWdgt->isInPreviewMode()) + recolorArtWdgt->performUpdate(); } } @@ -123,7 +125,7 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) strokeStyleWdgt->selectionModifiedCB(flags); } if (recolorArtWdgt && npage == 3) { - if (!recolorArtWdgt->isInPreviewMode()) + if (!recolorArtWdgt->isInPreviewMode()) { recolorArtWdgt->performUpdate(); } } diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index 6e1afbbbf4..db62b2a747 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -50,11 +50,11 @@ RecolorArt::RecolorArt() _layoutColorPicker(); _color_list = _builder->get_widget("colors-list"); - _apply = _builder->get_widget("apply"); _live_preview = _builder->get_widget("liveP"); - - _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); + // _apply = _builder->get_widget("apply"); + // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); _live_preview->signal_toggled().connect(sigc::mem_fun(*this, &RecolorArt::_onLivePreviewToggled)); + _live_preview->set_active(true); } RecolorArt::~RecolorArt() {} @@ -244,23 +244,23 @@ void RecolorArt::_onColorPickerChanged() } g_message("color picker changed"); } -void RecolorArt::_onApplyButtonClicked() -{ - for (auto [key, items] : _selected_colors) { - std::string _color_string = items.second.value().new_color.toString(); - for (auto &item : items.first) { - SPCSSAttr *css = sp_repr_css_attr_new(); - sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); - sp_desktop_apply_css_recursive(item.item, css, true); - sp_repr_css_attr_unref(css); - } - } - g_message("apply clicked"); -} +// void RecolorArt::_onApplyButtonClicked() +// { +// for (auto [key, items] : _selected_colors) { +// std::string _color_string = items.second.value().new_color.toString(); +// for (auto &item : items.first) { +// SPCSSAttr *css = sp_repr_css_attr_new(); +// sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); +// sp_desktop_apply_css_recursive(item.item, css, true); +// sp_repr_css_attr_unref(css); +// } +// } +// g_message("apply clicked"); +// } void RecolorArt::_onLivePreviewToggled() { _is_preview = _live_preview->property_active(); - g_message(_is_preview?"is true":"is false"); + g_message(_is_preview ? "is true" : "is false"); g_message("LP toggled"); } void RecolorArt::performUpdate() @@ -283,4 +283,3 @@ void RecolorArt::performUpdate() } // namespace Widget } // namespace UI } // namespace Inkscape - diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index b57dc60a96..42cb655d7e 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -58,12 +58,12 @@ private: std::map, std::optional>> _selected_colors; Inkscape::UI::Widget::ColorNotebook *_color_picker_wdgt = nullptr; Gtk::Box *_color_list = nullptr; - Gtk::Button *_apply = nullptr; + // Gtk::Button *_apply = nullptr; Gtk::CheckButton *_live_preview = nullptr; std::string _current_color_id; std::map> buttons; // color_id : {original , recolored} bool _is_preview = false; - sigc::connection _color_changed_connection; + // sigc::connection _color_changed_connection; protected: Glib::RefPtr _builder; @@ -80,7 +80,7 @@ protected: void _onOriginalColorClicked(std::string color_id); void _onColorPickerChanged(); void _onLivePreviewToggled(); - void _onApplyButtonClicked(); + // void _onApplyButtonClicked(); public: RecolorArt(); -- GitLab From 9be706d6f7d0e053f937d6444c944c18b72a175d Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 24 Jun 2025 12:51:06 +0300 Subject: [PATCH 10/32] made live preview defualt to checked removed apply button saved changed colors on selection change --- src/ui/dialog/fill-and-stroke.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 925476e673..9a357e6880 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -129,6 +129,7 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) recolorArtWdgt->performUpdate(); } } +} void FillAndStroke::desktopReplaced() { -- GitLab From c38381e4616ef517c67d2db11b850743f6f2d909 Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 24 Jun 2025 18:43:41 +0300 Subject: [PATCH 11/32] undo functionality done --- src/ui/widget/recolor-art.cpp | 13 +++++++++---- src/ui/widget/recolor-art.h | 1 + 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index db62b2a747..05cce05932 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -229,20 +229,25 @@ void RecolorArt::_onColorPickerChanged() if (_selected != _selected_colors.end()) _selected->second.second.value().new_color = new_color.value(); if (_live_preview && _live_preview->property_active()) { - auto _selected = _selected_colors.find(_current_color_id); + _LpChecked(new_color.value(),_color_string); + } + g_message("color picker changed"); +} +void RecolorArt::_LpChecked(Color new_color,std::string _color_string) +{ + auto _selected = _selected_colors.find(_current_color_id); if (_selected == _selected_colors.end()) { g_message("no items found"); return; } - _selected->second.second.value().new_color = new_color.value(); + _selected->second.second.value().new_color = new_color; for (auto &item : _selected->second.first) { SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); sp_desktop_apply_css_recursive(item.item, css, true); sp_repr_css_attr_unref(css); } - } - g_message("color picker changed"); + DocumentUndo::done(_desktop->getDocument(),_("Recolored items"),INKSCAPE_ICON("object-recolor-art")); } // void RecolorArt::_onApplyButtonClicked() // { diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 42cb655d7e..cabd02b9ae 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -80,6 +80,7 @@ protected: void _onOriginalColorClicked(std::string color_id); void _onColorPickerChanged(); void _onLivePreviewToggled(); + void _LpChecked(Color new_color, std::string _color_string); // void _onApplyButtonClicked(); public: -- GitLab From 614210fb5a01187f3af61e7f14643989c066afa8 Mon Sep 17 00:00:00 2001 From: ftomara Date: Tue, 24 Jun 2025 20:50:33 +0300 Subject: [PATCH 12/32] -renamed tab to recolor instead of recolor art -selected first color as defualt to change -live preview toggling handle revert and convert from original to recolored -added reset and arrow icons to hicolor and dash themes --- .../Dash/symbolic/actions/arrow-symbolic.svg | 3 + .../actions/reset-colors-symbolic.svg | 4 + .../symbolic/actions/arrow-symbolic.svg | 3 + .../actions/reset-colors-symbolic.svg | 4 + src/ui/dialog/fill-and-stroke.cpp | 8 +- src/ui/widget/recolor-art.cpp | 87 ++++++++++++++----- src/ui/widget/recolor-art.h | 4 +- 7 files changed, 84 insertions(+), 29 deletions(-) create mode 100644 share/icons/Dash/symbolic/actions/arrow-symbolic.svg create mode 100644 share/icons/Dash/symbolic/actions/reset-colors-symbolic.svg create mode 100644 share/icons/hicolor/symbolic/actions/arrow-symbolic.svg create mode 100644 share/icons/hicolor/symbolic/actions/reset-colors-symbolic.svg diff --git a/share/icons/Dash/symbolic/actions/arrow-symbolic.svg b/share/icons/Dash/symbolic/actions/arrow-symbolic.svg new file mode 100644 index 0000000000..f387849bc8 --- /dev/null +++ b/share/icons/Dash/symbolic/actions/arrow-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/share/icons/Dash/symbolic/actions/reset-colors-symbolic.svg b/share/icons/Dash/symbolic/actions/reset-colors-symbolic.svg new file mode 100644 index 0000000000..7d47572893 --- /dev/null +++ b/share/icons/Dash/symbolic/actions/reset-colors-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg b/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg new file mode 100644 index 0000000000..f387849bc8 --- /dev/null +++ b/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg @@ -0,0 +1,3 @@ + + + diff --git a/share/icons/hicolor/symbolic/actions/reset-colors-symbolic.svg b/share/icons/hicolor/symbolic/actions/reset-colors-symbolic.svg new file mode 100644 index 0000000000..7d47572893 --- /dev/null +++ b/share/icons/hicolor/symbolic/actions/reset-colors-symbolic.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 9a357e6880..11b72f0c6a 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -60,7 +60,7 @@ FillAndStroke::FillAndStroke() _notebook.append_page(*_page_fill, _createPageTabLabel(_("_Fill"), INKSCAPE_ICON("object-fill"))); _notebook.append_page(*_page_stroke_paint, _createPageTabLabel(_("Stroke _paint"), INKSCAPE_ICON("object-stroke"))); _notebook.append_page(*_page_stroke_style, _createPageTabLabel(_("Stroke st_yle"), INKSCAPE_ICON("object-stroke-style"))); - _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor Art"), INKSCAPE_ICON("object-recolor-art"))); + _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor"), INKSCAPE_ICON("object-recolor-art"))); _notebook.set_vexpand(true); _switch_page_conn = _notebook.signal_switch_page().connect(sigc::mem_fun(*this, &FillAndStroke::_onSwitchPage)); @@ -125,9 +125,9 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) strokeStyleWdgt->selectionModifiedCB(flags); } if (recolorArtWdgt && npage == 3) { - if (!recolorArtWdgt->isInPreviewMode()) { - recolorArtWdgt->performUpdate(); - } + // if (!recolorArtWdgt->isInPreviewMode()) { + // recolorArtWdgt->performUpdate(); + // } } } diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index 05cce05932..be07485476 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -229,42 +229,65 @@ void RecolorArt::_onColorPickerChanged() if (_selected != _selected_colors.end()) _selected->second.second.value().new_color = new_color.value(); if (_live_preview && _live_preview->property_active()) { - _LpChecked(new_color.value(),_color_string); + _lpChecked(); } g_message("color picker changed"); } -void RecolorArt::_LpChecked(Color new_color,std::string _color_string) +void RecolorArt::_lpChecked() { - auto _selected = _selected_colors.find(_current_color_id); - if (_selected == _selected_colors.end()) { - g_message("no items found"); - return; - } - _selected->second.second.value().new_color = new_color; - for (auto &item : _selected->second.first) { + auto _selected = _selected_colors.find(_current_color_id); + std::optional new_color = _solid_colors->get(); + if (!new_color.has_value()) { + g_message("there is no color"); + return; + } + std::string _color_string = new_color.value().toString(); + if (_selected == _selected_colors.end()) { + g_message("no items found"); + return; + } + _selected->second.second.value().new_color = new_color.value(); + for (auto &item : _selected->second.first) { + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); + sp_desktop_apply_css_recursive(item.item, css, true); + sp_repr_css_attr_unref(css); + } + DocumentUndo::done(_desktop->getDocument(), _("Recolored items"), INKSCAPE_ICON("object-recolor-art")); +} +void RecolorArt::_revertToOriginalColors() +{ + for (auto [key, items] : _selected_colors) { + for (auto &item : items.first) { SPCSSAttr *css = sp_repr_css_attr_new(); - sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); + sp_repr_css_set_property_string(css, item.kind.c_str(), key); sp_desktop_apply_css_recursive(item.item, css, true); sp_repr_css_attr_unref(css); } - DocumentUndo::done(_desktop->getDocument(),_("Recolored items"),INKSCAPE_ICON("object-recolor-art")); + } +} +void RecolorArt::_convertToRecoloredColors() +{ + for (auto [key, items] : _selected_colors) { + if (items.second.has_value()) { + std::string new_color = items.second.value().new_color.toString(); + for (auto &item : items.first) { + SPCSSAttr *css = sp_repr_css_attr_new(); + sp_repr_css_set_property_string(css, item.kind.c_str(), new_color); + sp_desktop_apply_css_recursive(item.item, css, true); + sp_repr_css_attr_unref(css); + } + } + } } -// void RecolorArt::_onApplyButtonClicked() -// { -// for (auto [key, items] : _selected_colors) { -// std::string _color_string = items.second.value().new_color.toString(); -// for (auto &item : items.first) { -// SPCSSAttr *css = sp_repr_css_attr_new(); -// sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); -// sp_desktop_apply_css_recursive(item.item, css, true); -// sp_repr_css_attr_unref(css); -// } -// } -// g_message("apply clicked"); -// } void RecolorArt::_onLivePreviewToggled() { _is_preview = _live_preview->property_active(); + if (_is_preview) { + _convertToRecoloredColors(); + } else { + _revertToOriginalColors(); + } g_message(_is_preview ? "is true" : "is false"); g_message("LP toggled"); } @@ -280,6 +303,8 @@ void RecolorArt::performUpdate() _collectColors(vec); if (!_selected_colors.empty()) { _generateVisualList(); + auto first_button_id = buttons.begin()->first; + _onOriginalColorClicked(first_button_id); } } @@ -288,3 +313,17 @@ void RecolorArt::performUpdate() } // namespace Widget } // namespace UI } // namespace Inkscape + +// void RecolorArt::_onApplyButtonClicked() +// { +// for (auto [key, items] : _selected_colors) { +// std::string _color_string = items.second.value().new_color.toString(); +// for (auto &item : items.first) { +// SPCSSAttr *css = sp_repr_css_attr_new(); +// sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); +// sp_desktop_apply_css_recursive(item.item, css, true); +// sp_repr_css_attr_unref(css); +// } +// } +// g_message("apply clicked"); +// } \ No newline at end of file diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index cabd02b9ae..2fbeb0d4d3 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -80,7 +80,9 @@ protected: void _onOriginalColorClicked(std::string color_id); void _onColorPickerChanged(); void _onLivePreviewToggled(); - void _LpChecked(Color new_color, std::string _color_string); + void _lpChecked(); + void _revertToOriginalColors(); + void _convertToRecoloredColors(); // void _onApplyButtonClicked(); public: -- GitLab From 89275275a68757da2213d0d45a776d3fa948e12f Mon Sep 17 00:00:00 2001 From: ftomara Date: Wed, 25 Jun 2025 05:41:50 +0300 Subject: [PATCH 13/32] reset button functionality done --- share/ui/recolor-art.glade | 3 ++- src/ui/widget/recolor-art.cpp | 14 ++++++++++++-- src/ui/widget/recolor-art.h | 2 ++ 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 3075c3f8ea..3a1120fb99 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -21,7 +21,8 @@ - + + reset true false false diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index be07485476..c3f9a5f50c 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -51,10 +51,12 @@ RecolorArt::RecolorArt() _layoutColorPicker(); _color_list = _builder->get_widget("colors-list"); _live_preview = _builder->get_widget("liveP"); - // _apply = _builder->get_widget("apply"); - // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); _live_preview->signal_toggled().connect(sigc::mem_fun(*this, &RecolorArt::_onLivePreviewToggled)); _live_preview->set_active(true); + _reset = _builder->get_widget("reset"); + _reset->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onResetClicked)); + // _apply = _builder->get_widget("apply"); + // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); } RecolorArt::~RecolorArt() {} @@ -255,6 +257,14 @@ void RecolorArt::_lpChecked() } DocumentUndo::done(_desktop->getDocument(), _("Recolored items"), INKSCAPE_ICON("object-recolor-art")); } +void RecolorArt::_onResetClicked() +{ + for (auto [key, btns] : buttons) { + _colorButtons(btns.second, Color(0xffffff00).toString()); + } + _revertToOriginalColors(); + _onOriginalColorClicked(buttons.begin()->first); +} void RecolorArt::_revertToOriginalColors() { for (auto [key, items] : _selected_colors) { diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 2fbeb0d4d3..9500470a16 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -59,6 +59,7 @@ private: Inkscape::UI::Widget::ColorNotebook *_color_picker_wdgt = nullptr; Gtk::Box *_color_list = nullptr; // Gtk::Button *_apply = nullptr; + Gtk::Button *_reset = nullptr; Gtk::CheckButton *_live_preview = nullptr; std::string _current_color_id; std::map> buttons; // color_id : {original , recolored} @@ -78,6 +79,7 @@ protected: // signals handelrs void _onOriginalColorClicked(std::string color_id); + void _onResetClicked(); void _onColorPickerChanged(); void _onLivePreviewToggled(); void _lpChecked(); -- GitLab From 117ff18291b233a87825745f60d5e03c157cfc0f Mon Sep 17 00:00:00 2001 From: ftomara Date: Thu, 26 Jun 2025 08:51:59 +0300 Subject: [PATCH 14/32] added scrolled window to color list ui and grid view for lazy loading --- share/ui/recolor-art.glade | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 3a1120fb99..0ecc7023c2 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -36,21 +36,35 @@ - Recolored + New Color center - - - colors-list - vertical - center - center - 24 - + + -- GitLab From 48c84c34daf87a4d5d87ba6968a9fa908a8562dd Mon Sep 17 00:00:00 2001 From: ftomara Date: Thu, 26 Jun 2025 09:01:45 +0300 Subject: [PATCH 15/32] made orignal color equals new color at the begining instead of making new one transparent --- src/ui/widget/recolor-art.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index c3f9a5f50c..3a2759b547 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -149,10 +149,10 @@ void RecolorArt::_generateVisualList() sigc::bind(sigc::mem_fun(*this, &RecolorArt::_onOriginalColorClicked), original->get_name())); auto recolored = Gtk::make_managed(); recolored->set_name("recolored_from" + key); - Color new_color = (value.second.value().old_color == value.second.value().new_color) - ? Color(0xffffff00) - : value.second.value().new_color; - _colorButtons(recolored, new_color.toString()); + // Color new_color = (value.second.value().old_color == value.second.value().new_color) + // ? Color(0xffffff00) + // : value.second.value().new_color; + _colorButtons(recolored, value.second.value().old_color.toString()); buttons[key] = {original, recolored}; auto arrow = Gtk::make_managed(); arrow->set_from_icon_name("arrow"); @@ -260,7 +260,7 @@ void RecolorArt::_lpChecked() void RecolorArt::_onResetClicked() { for (auto [key, btns] : buttons) { - _colorButtons(btns.second, Color(0xffffff00).toString()); + _colorButtons(btns.second, key); } _revertToOriginalColors(); _onOriginalColorClicked(buttons.begin()->first); -- GitLab From 41c282421b1584c40a76a69271fba0dc746a36bc Mon Sep 17 00:00:00 2001 From: ftomara Date: Thu, 26 Jun 2025 10:01:11 +0300 Subject: [PATCH 16/32] refactored _generateVisualList to use grid view for lazy loading --- share/ui/recolor-art.glade | 5 +- src/ui/widget/recolor-art.cpp | 89 +++++++++++++++++++++++++---------- src/ui/widget/recolor-art.h | 30 +++++++++++- 3 files changed, 93 insertions(+), 31 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 0ecc7023c2..a156b0bc6c 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -57,11 +57,8 @@ center 24 - + True - - - True + + Color Wheel Content Goes Here - + true + + + color-whele-symbolic + normal + + + + + Color Whele + center + center + + + + vertical diff --git a/share/ui/style.css b/share/ui/style.css index cdb2e3de1a..962ad72fc9 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -1578,12 +1578,14 @@ listview row.top-separator { * Recolor Art class * ********************** */ + #original, #recolored { min-width: 180px; min-height: 14px; border-radius: 4px; padding: 0; margin: 0px; + border: 2px solid black; } #original-recolor-box button#original:hover { border-color: white; @@ -1605,6 +1607,7 @@ listview row.top-separator { #original-recolor-box { min-width: 180px; min-height: 14px; + margin-left:36px; } #recolor-art gridview child:selected { @@ -1615,4 +1618,33 @@ listview row.top-separator { { padding: 0px; margin: 0px; + background-color:#2A2A2A ; +} + +#original-recolor-colors-list-box +{ + background-color:#2A2A2A ; +} +#reset +{ + background-color:#474747; + color:white; + border: 2px solid #000 ; + margin-top:6px; +} + +#list-wheel-box +{ + background-color:#2A2A2A; + margin:4px; + border: 2px solid #000 ; + +} + +#list-wheel-box label +{ + font-size: 16px; + color: white; + font-weight: 200; + background-image: none; } \ No newline at end of file -- GitLab From a3bdeb488affead4e60fd8ba0cc68f8fc10f35e1 Mon Sep 17 00:00:00 2001 From: ftomara Date: Fri, 27 Jun 2025 17:55:50 +0300 Subject: [PATCH 21/32] used listview instead of grid view --- share/ui/recolor-art.glade | 7 +++-- share/ui/style.css | 46 ++++++++++++++++++++------- src/ui/widget/recolor-art.cpp | 59 +++++++++++++++++++++++++---------- src/ui/widget/recolor-art.h | 4 +-- 4 files changed, 85 insertions(+), 31 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 4988c8c196..333fe2073e 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -66,8 +66,11 @@ center center - - True + + false + center + true + center diff --git a/share/ui/style.css b/share/ui/style.css index 962ad72fc9..2289b41c9f 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -1581,20 +1581,27 @@ listview row.top-separator { #original, #recolored { min-width: 180px; - min-height: 14px; + min-height: 14px; border-radius: 4px; padding: 0; margin: 0px; border: 2px solid black; } #original-recolor-box button#original:hover { - border-color: white; - border-width: 1px; - border-style: solid; + min-width: 180px; + min-height: 14px; + border-radius: 4px; + padding: 0; + margin: 0px; + border: 2px solid white; } #original-recolor-box button.selected-button { - border: 1px solid white; + min-width: 180px; + min-height: 14px; border-radius: 4px; + padding: 0; + margin: 0px; + border: 2px solid white; } #original-reset-recolor label @@ -1604,17 +1611,27 @@ listview row.top-separator { } +#original-reset-recolor +{ + margin-right: 24px; + margin-bottom: 12px; + +} + #original-recolor-box { - min-width: 180px; - min-height: 14px; - margin-left:36px; + min-width: 180px; + min-height: 14px; + /* margin-left:36px; + margin-right:36px; */ } -#recolor-art gridview child:selected { +#recolor-art listview row:selected { background-color: transparent; + border-radius: 4px; + border: 2px solid #0D57C3; } -#recolor-art gridview +#recolor-art listview { padding: 0px; margin: 0px; @@ -1633,12 +1650,19 @@ listview row.top-separator { margin-top:6px; } +#reset:hover { + background-color: #202020; + color: white; + border: 2px solid #000; + margin-top: 6px; +} + #list-wheel-box { background-color:#2A2A2A; margin:4px; border: 2px solid #000 ; - + } #list-wheel-box label diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index 97c82d1379..d93bf10c2b 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -6,9 +6,11 @@ #include #include #include -#include +#include #include #include +#include +#include #include #include @@ -62,7 +64,7 @@ RecolorArt::RecolorArt() _reset = _builder->get_widget("reset"); _reset->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onResetClicked)); - _grid_view = _builder->get_widget("recolor-art-grid"); + _list_view = _builder->get_widget("recolor-art-list"); _color_model = Gio::ListStore::create(); _selection_model = Gtk::SingleSelection::create(_color_model); _color_factory = Gtk::SignalListItemFactory::create(); @@ -73,6 +75,14 @@ RecolorArt::RecolorArt() auto arrow = Gtk::make_managed(); auto recolored = Gtk::make_managed(); + original->set_hexpand(false); + original->set_vexpand(false); + original->set_valign(Gtk::Align::CENTER); + + recolored->set_hexpand(false); + recolored->set_vexpand(false); + recolored->set_valign(Gtk::Align::CENTER); + arrow->set_use_markup(true); arrow->set_width_chars(3); arrow->set_markup(""); @@ -81,8 +91,10 @@ RecolorArt::RecolorArt() box->set_name("original-recolor-box"); box->set_spacing(14); - box->set_margin_top(2); - box->set_margin_bottom(2); + box->set_margin_top(0); + box->set_margin_bottom(0); + box->set_margin_start(0); + box->set_margin_end(0); box->append(*original); box->append(*arrow); box->append(*recolored); @@ -106,22 +118,37 @@ RecolorArt::RecolorArt() _colorButtons(recolored, item->new_color); original->set_name("original"); - original->set_hexpand(false); recolored->set_name("recolored"); - recolored->set_hexpand(false); - original->signal_clicked().connect( - sigc::bind(sigc::mem_fun(*this, &RecolorArt::_onOriginalColorClicked), item->key)); - + original->signal_clicked().connect([this, item, index = list_item->get_position()] { + // _selection_model->set_selected(index); + _onOriginalColorClicked(item->key); + }); buttons[item->key] = {original, recolored}; } }); - _grid_view->set_model(_selection_model); - _grid_view->set_factory(_color_factory); - _grid_view->set_max_columns(1); - _grid_view->set_min_columns(1); - _grid_view->set_hexpand(false); - _grid_view->set_vexpand(false); + _list_view->set_model(_selection_model); + _list_view->set_factory(_color_factory); + auto lm = _list_view->get_layout_manager(); + if (auto grid_layout = std::dynamic_pointer_cast(lm)) { + grid_layout->set_row_spacing(0); + } + _list_view->set_hexpand(false); + _list_view->set_vexpand(false); + + // _selection_model->signal_selection_changed().connect([this](guint pos, guint n_items) { + // int index = _selection_model->get_selected(); + // if (index < 0) + // return; + + // auto item = _color_model->get_item(index); + // auto color_item = std::dynamic_pointer_cast(item); + // if (!color_item) + // return; + + // _onOriginalColorClicked(color_item->key); + // }); + // _apply = _builder->get_widget("apply"); // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); } @@ -211,7 +238,7 @@ void RecolorArt::_generateVisualList() auto new_color = value.second.value().old_color.toString(); _color_model->append(ColorItem::create(key, old_color, new_color)); } - _color_list->append(*_grid_view); + _color_list->append(*_list_view); } void RecolorArt::_layoutColorPicker(std::shared_ptr updated_color) { diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 84364ab813..668bdde87f 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -9,7 +9,7 @@ #include #include #include -#include +#include #include #include @@ -81,7 +81,7 @@ private: std::map, std::optional>> _selected_colors; Inkscape::UI::Widget::ColorNotebook *_color_picker_wdgt = nullptr; Gtk::Box *_color_list = nullptr; - Gtk::GridView *_grid_view = nullptr; + Gtk::ListView *_list_view = nullptr; Gtk::Button *_reset = nullptr; Gtk::CheckButton *_live_preview = nullptr; std::string _current_color_id; -- GitLab From 7cfe737e5aa0d182355eb569e1a4e9253bed7b33 Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 28 Jun 2025 07:14:29 +0300 Subject: [PATCH 22/32] used themed already exited icons , refactored functions name , made them privte not protected --- .../Dash/symbolic/actions/arrow-symbolic.svg | 3 - .../symbolic/actions/color-whele-symbolic.svg | 3 - .../Dash/symbolic/actions/list-symbolic.svg | 3 - .../Dash/symbolic/actions/reset-symbolic.svg | 5 -- .../symbolic/actions/arrow-symbolic.svg | 3 - .../symbolic/actions/color-whele-symbolic.svg | 3 - .../symbolic/actions/list-symbolic.svg | 3 - .../symbolic/actions/reset-symbolic.svg | 58 ------------ .../symbolic/actions/arrow-symbolic.svg | 3 - .../symbolic/actions/color-whele-symbolic.svg | 3 - .../symbolic/actions/list-symbolic.svg | 3 - .../symbolic/actions/reset-symbolic.svg | 58 ------------ share/ui/recolor-art.glade | 8 +- src/ui/widget/recolor-art.cpp | 90 +++++++++---------- src/ui/widget/recolor-art.h | 34 +++---- 15 files changed, 66 insertions(+), 214 deletions(-) delete mode 100644 share/icons/Dash/symbolic/actions/arrow-symbolic.svg delete mode 100644 share/icons/Dash/symbolic/actions/color-whele-symbolic.svg delete mode 100644 share/icons/Dash/symbolic/actions/list-symbolic.svg delete mode 100644 share/icons/Dash/symbolic/actions/reset-symbolic.svg delete mode 100644 share/icons/hicolor/symbolic/actions/arrow-symbolic.svg delete mode 100644 share/icons/hicolor/symbolic/actions/color-whele-symbolic.svg delete mode 100644 share/icons/hicolor/symbolic/actions/list-symbolic.svg delete mode 100644 share/icons/hicolor/symbolic/actions/reset-symbolic.svg delete mode 100644 share/icons/multicolor/symbolic/actions/arrow-symbolic.svg delete mode 100644 share/icons/multicolor/symbolic/actions/color-whele-symbolic.svg delete mode 100644 share/icons/multicolor/symbolic/actions/list-symbolic.svg delete mode 100644 share/icons/multicolor/symbolic/actions/reset-symbolic.svg diff --git a/share/icons/Dash/symbolic/actions/arrow-symbolic.svg b/share/icons/Dash/symbolic/actions/arrow-symbolic.svg deleted file mode 100644 index f387849bc8..0000000000 --- a/share/icons/Dash/symbolic/actions/arrow-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/Dash/symbolic/actions/color-whele-symbolic.svg b/share/icons/Dash/symbolic/actions/color-whele-symbolic.svg deleted file mode 100644 index 718b77b382..0000000000 --- a/share/icons/Dash/symbolic/actions/color-whele-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/Dash/symbolic/actions/list-symbolic.svg b/share/icons/Dash/symbolic/actions/list-symbolic.svg deleted file mode 100644 index 1ad1a80d41..0000000000 --- a/share/icons/Dash/symbolic/actions/list-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/Dash/symbolic/actions/reset-symbolic.svg b/share/icons/Dash/symbolic/actions/reset-symbolic.svg deleted file mode 100644 index 09c40a1e30..0000000000 --- a/share/icons/Dash/symbolic/actions/reset-symbolic.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg b/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg deleted file mode 100644 index f387849bc8..0000000000 --- a/share/icons/hicolor/symbolic/actions/arrow-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/hicolor/symbolic/actions/color-whele-symbolic.svg b/share/icons/hicolor/symbolic/actions/color-whele-symbolic.svg deleted file mode 100644 index 718b77b382..0000000000 --- a/share/icons/hicolor/symbolic/actions/color-whele-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/hicolor/symbolic/actions/list-symbolic.svg b/share/icons/hicolor/symbolic/actions/list-symbolic.svg deleted file mode 100644 index 1ad1a80d41..0000000000 --- a/share/icons/hicolor/symbolic/actions/list-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/hicolor/symbolic/actions/reset-symbolic.svg b/share/icons/hicolor/symbolic/actions/reset-symbolic.svg deleted file mode 100644 index 7dcef2b3f7..0000000000 --- a/share/icons/hicolor/symbolic/actions/reset-symbolic.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - diff --git a/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg b/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg deleted file mode 100644 index f387849bc8..0000000000 --- a/share/icons/multicolor/symbolic/actions/arrow-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/multicolor/symbolic/actions/color-whele-symbolic.svg b/share/icons/multicolor/symbolic/actions/color-whele-symbolic.svg deleted file mode 100644 index 718b77b382..0000000000 --- a/share/icons/multicolor/symbolic/actions/color-whele-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/multicolor/symbolic/actions/list-symbolic.svg b/share/icons/multicolor/symbolic/actions/list-symbolic.svg deleted file mode 100644 index 1ad1a80d41..0000000000 --- a/share/icons/multicolor/symbolic/actions/list-symbolic.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/share/icons/multicolor/symbolic/actions/reset-symbolic.svg b/share/icons/multicolor/symbolic/actions/reset-symbolic.svg deleted file mode 100644 index 7dcef2b3f7..0000000000 --- a/share/icons/multicolor/symbolic/actions/reset-symbolic.svg +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 333fe2073e..f77e1b4da4 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -38,7 +38,7 @@ false - reset-colors + reset-settings normal @@ -87,7 +87,7 @@ true - list-symbolic + hamburger-menu normal @@ -124,13 +124,13 @@ true - color-whele-symbolic + color-wheel-symbolic normal - Color Whele + Color Wheel center center diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index d93bf10c2b..c86a47e3d8 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -56,13 +56,13 @@ RecolorArt::RecolorArt() append(get_widget(_builder, "recolor-art")); _solid_colors->set(Color(0x000000ff)); - _layoutColorPicker(); + layoutColorPicker(); _color_list = _builder->get_widget("colors-list"); _live_preview = _builder->get_widget("liveP"); - _live_preview->signal_toggled().connect(sigc::mem_fun(*this, &RecolorArt::_onLivePreviewToggled)); + _live_preview->signal_toggled().connect(sigc::mem_fun(*this, &RecolorArt::onLivePreviewToggled)); _live_preview->set_active(true); _reset = _builder->get_widget("reset"); - _reset->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onResetClicked)); + _reset->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::onResetClicked)); _list_view = _builder->get_widget("recolor-art-list"); _color_model = Gio::ListStore::create(); @@ -114,14 +114,14 @@ RecolorArt::RecolorArt() auto recolored = dynamic_cast(box->get_last_child()); if (original && recolored) { - _colorButtons(original, item->old_color); - _colorButtons(recolored, item->new_color); + colorButtons(original, item->old_color); + colorButtons(recolored, item->new_color); original->set_name("original"); recolored->set_name("recolored"); original->signal_clicked().connect([this, item, index = list_item->get_position()] { // _selection_model->set_selected(index); - _onOriginalColorClicked(item->key); + onOriginalColorClicked(item->key); }); buttons[item->key] = {original, recolored}; } @@ -146,7 +146,7 @@ RecolorArt::RecolorArt() // if (!color_item) // return; - // _onOriginalColorClicked(color_item->key); + // onOriginalColorClicked(color_item->key); // }); // _apply = _builder->get_widget("apply"); @@ -161,39 +161,39 @@ void RecolorArt::setDesktop(SPDesktop *desktop) } g_message("setDesktop\n"); } -void RecolorArt::_collectColors(std::vector items) +void RecolorArt::collectColors(std::vector items) { _selected_colors.clear(); for (auto item : items) { - _extractItemColors(item); + extractItemColors(item); } } -void RecolorArt::_extractItemColors(SPItem *item) +void RecolorArt::extractItemColors(SPItem *item) { if (item) { - _extractItemStyle(item); + extractItemStyle(item); } if (auto group = dynamic_cast(item)) { for (SPObject &child : group->children) { if (auto childItem = dynamic_cast(&child)) { - _extractItemColors(childItem); + extractItemColors(childItem); } } } } -void RecolorArt::_extractGradientStops(SPItem *item, std::string kind, bool isFill) +void RecolorArt::extractGradientStops(SPItem *item, std::string kind, bool isFill) { SPPaintServer *paint_server = isFill ? item->style->getFillPaintServer() : item->style->getStrokePaintServer(); if (paint_server && dynamic_cast(paint_server)) { SPGradient *gradient = dynamic_cast(paint_server); for (auto stop : gradient->getGradientVector().stops) { if (stop.color.has_value()) { - _populateMap(stop.color.value(), item, kind); + populateMap(stop.color.value(), item, kind); } } } } -void RecolorArt::_populateMap(Color color, SPItem *item, std::string kind) +void RecolorArt::populateMap(Color color, SPItem *item, std::string kind) { ColorRef ref = ColorRef(item, kind); ColorPair pair = ColorPair(color, color); @@ -203,7 +203,7 @@ void RecolorArt::_populateMap(Color color, SPItem *item, std::string kind) _selected_colors.emplace(color.toString(), std::make_pair(std::vector{ref}, pair)); } } -void RecolorArt::_extractItemStyle(SPItem *item) +void RecolorArt::extractItemStyle(SPItem *item) { // check item style if (!item || !item->style) @@ -213,23 +213,23 @@ void RecolorArt::_extractItemStyle(SPItem *item) // get flat fills if (style->fill.isColor()) { auto color = style->fill.getColor(); - _populateMap(color, item, "fill"); + populateMap(color, item, "fill"); } // get gradient stops strokes else if (style->fill.isPaintserver()) { - _extractGradientStops(item, "stop-fill", true); + extractGradientStops(item, "stop-fill", true); } if (style->stroke.isColor()) { auto color = style->stroke.getColor(); - _populateMap(color, item, "stroke"); + populateMap(color, item, "stroke"); } // get gradient stops strokes else if (style->stroke.isPaintserver()) { - _extractGradientStops(item, "stop-stoke", false); + extractGradientStops(item, "stop-stoke", false); } } -void RecolorArt::_generateVisualList() +void RecolorArt::generateVisualList() { _color_model->remove_all(); buttons.clear(); @@ -240,14 +240,14 @@ void RecolorArt::_generateVisualList() } _color_list->append(*_list_view); } -void RecolorArt::_layoutColorPicker(std::shared_ptr updated_color) +void RecolorArt::layoutColorPicker(std::shared_ptr updated_color) { if (updated_color) _solid_colors = updated_color; _color_picker_wdgt = Gtk::make_managed(_solid_colors); _color_picker_wdgt->set_visible(true); _color_picker_wdgt->set_label(_("Selected Color")); - _solid_colors->signal_changed.connect(sigc::mem_fun(*this, &RecolorArt::_onColorPickerChanged)); + _solid_colors->signal_changed.connect(sigc::mem_fun(*this, &RecolorArt::onColorPickerChanged)); auto container = _builder->get_widget("color-picker"); if (container) { @@ -258,7 +258,7 @@ void RecolorArt::_layoutColorPicker(std::shared_ptr updated_co g_warning("color picker not found"); } } -void RecolorArt::_colorButtons(Gtk::Button *button, std::string color) +void RecolorArt::colorButtons(Gtk::Button *button, std::string color) { if (color.empty() || color.size() < 7 || color[0] != '#') { g_warning("Invalid color string: %s", color.c_str()); @@ -275,7 +275,7 @@ void RecolorArt::_colorButtons(Gtk::Button *button, std::string color) g_message("button not found"); } } -void RecolorArt::_colorBorderOnClick(Gtk::Button *button, bool kind) +void RecolorArt::colorBorderOnClick(Gtk::Button *button, bool kind) { auto &_last_button = kind == 1 ? _last_original_button : _last_recolored_button; if (_last_button && _last_button != button) { @@ -290,7 +290,7 @@ void RecolorArt::_colorBorderOnClick(Gtk::Button *button, bool kind) g_warning("button not found for border coloring"); } } -void RecolorArt::_onOriginalColorClicked(std::string color_id) +void RecolorArt::onOriginalColorClicked(std::string color_id) { _current_color_id = color_id; auto it = _selected_colors.find(color_id); @@ -299,13 +299,13 @@ void RecolorArt::_onOriginalColorClicked(std::string color_id) Color color = it->second.second.value().new_color; std::shared_ptr updated_color = std::make_shared(); updated_color->set(color); - _layoutColorPicker(updated_color); - _colorBorderOnClick(btns->second.first, 1); - _colorBorderOnClick(btns->second.second, 0); + layoutColorPicker(updated_color); + colorBorderOnClick(btns->second.first, 1); + colorBorderOnClick(btns->second.second, 0); // g_message("original color selected at color %s", color_id.c_str()); } } -void RecolorArt::_onColorPickerChanged() +void RecolorArt::onColorPickerChanged() { auto it = buttons.find(_current_color_id); if (it == buttons.end()) { @@ -319,16 +319,16 @@ void RecolorArt::_onColorPickerChanged() return; } std::string _color_string = new_color.value().toString(); - _colorButtons(_current_recolor_button, _color_string); + colorButtons(_current_recolor_button, _color_string); auto _selected = _selected_colors.find(_current_color_id); if (_selected != _selected_colors.end()) _selected->second.second.value().new_color = new_color.value(); if (_live_preview && _live_preview->property_active()) { - _lpChecked(); + lpChecked(); } g_message("color picker changed"); } -void RecolorArt::_lpChecked() +void RecolorArt::lpChecked() { auto _selected = _selected_colors.find(_current_color_id); std::optional new_color = _solid_colors->get(); @@ -350,15 +350,15 @@ void RecolorArt::_lpChecked() } DocumentUndo::done(_desktop->getDocument(), _("Recolored items"), INKSCAPE_ICON("object-recolor-art")); } -void RecolorArt::_onResetClicked() +void RecolorArt::onResetClicked() { for (auto [key, btns] : buttons) { - _colorButtons(btns.second, key); + colorButtons(btns.second, key); } - _revertToOriginalColors(); - _onOriginalColorClicked(buttons.begin()->first); + revertToOriginalColors(); + onOriginalColorClicked(buttons.begin()->first); } -void RecolorArt::_revertToOriginalColors() +void RecolorArt::revertToOriginalColors() { for (auto [key, items] : _selected_colors) { for (auto &item : items.first) { @@ -369,7 +369,7 @@ void RecolorArt::_revertToOriginalColors() } } } -void RecolorArt::_convertToRecoloredColors() +void RecolorArt::convertToRecoloredColors() { for (auto [key, items] : _selected_colors) { if (items.second.has_value()) { @@ -383,13 +383,13 @@ void RecolorArt::_convertToRecoloredColors() } } } -void RecolorArt::_onLivePreviewToggled() +void RecolorArt::onLivePreviewToggled() { _is_preview = _live_preview->property_active(); if (_is_preview) { - _convertToRecoloredColors(); + convertToRecoloredColors(); } else { - _revertToOriginalColors(); + revertToOriginalColors(); } g_message(_is_preview ? "is true" : "is false"); g_message("LP toggled"); @@ -405,11 +405,11 @@ void RecolorArt::performUpdate() // _current_color_id = ""; if (auto selection = _desktop->getSelection()) { std::vector vec(selection->items().begin(), selection->items().end()); - _collectColors(vec); + collectColors(vec); if (!_selected_colors.empty()) { - _generateVisualList(); + generateVisualList(); auto first_button_id = buttons.begin()->first; - _onOriginalColorClicked(first_button_id); + onOriginalColorClicked(first_button_id); } } diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 668bdde87f..53f66aa0eb 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -96,26 +96,26 @@ private: Gtk::Button *_last_recolored_button = nullptr; // Gtk::Button *_apply = nullptr; -protected: + Glib::RefPtr _builder; - void _populateMap(Color color, SPItem *style, std::string kind); - void _collectColors(std::vector items); - void _extractGradientStops(SPItem *item, std::string kind, bool isFill); - void _extractItemColors(SPItem *item); - void _extractItemStyle(SPItem *item); - void _generateVisualList(); - void _layoutColorPicker(std::shared_ptr updated_color = nullptr); - void _colorButtons(Gtk::Button *button, std::string color); - void _colorBorderOnClick(Gtk::Button *button , bool kind); + void populateMap(Color color, SPItem *style, std::string kind); + void collectColors(std::vector items); + void extractGradientStops(SPItem *item, std::string kind, bool isFill); + void extractItemColors(SPItem *item); + void extractItemStyle(SPItem *item); + void generateVisualList(); + void layoutColorPicker(std::shared_ptr updated_color = nullptr); + void colorButtons(Gtk::Button *button, std::string color); + void colorBorderOnClick(Gtk::Button *button , bool kind); // signals handelrs - void _onOriginalColorClicked(std::string color_id); - void _onResetClicked(); - void _onColorPickerChanged(); - void _onLivePreviewToggled(); - void _lpChecked(); - void _revertToOriginalColors(); - void _convertToRecoloredColors(); + void onOriginalColorClicked(std::string color_id); + void onResetClicked(); + void onColorPickerChanged(); + void onLivePreviewToggled(); + void lpChecked(); + void revertToOriginalColors(); + void convertToRecoloredColors(); // void _onApplyButtonClicked(); public: -- GitLab From 4f169c32e70db5e81e91762ff23ae6ca60969c5a Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 28 Jun 2025 07:42:36 +0300 Subject: [PATCH 23/32] rewrite css in inkscape standard themed form --- share/ui/recolor-art.glade | 2 +- share/ui/style.css | 57 ++++++++++---------------------------- 2 files changed, 15 insertions(+), 44 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index f77e1b4da4..5c953c9301 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -23,7 +23,7 @@ horizontal center center - 64 + 85 Original diff --git a/share/ui/style.css b/share/ui/style.css index 2289b41c9f..bfffa3522c 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -1583,25 +1583,25 @@ listview row.top-separator { min-width: 180px; min-height: 14px; border-radius: 4px; - padding: 0; + padding: 0px; margin: 0px; - border: 2px solid black; + border: 2px solid @theme_bg_color; } #original-recolor-box button#original:hover { min-width: 180px; min-height: 14px; border-radius: 4px; - padding: 0; + padding: 0px; margin: 0px; - border: 2px solid white; + border: 2px solid @theme_fq_color; } #original-recolor-box button.selected-button { min-width: 180px; min-height: 14px; border-radius: 4px; - padding: 0; + padding: 0px; margin: 0px; - border: 2px solid white; + border: 2px solid @theme_fq_color; } #original-reset-recolor label @@ -1613,62 +1613,33 @@ listview row.top-separator { #original-reset-recolor { - margin-right: 24px; - margin-bottom: 12px; + + margin-left: 2px; + margin-right: 38px; + margin-bottom: 6px; + margin-top: 6px; } #original-recolor-box { min-width: 180px; min-height: 14px; - /* margin-left:36px; - margin-right:36px; */ } #recolor-art listview row:selected { background-color: transparent; - border-radius: 4px; - border: 2px solid #0D57C3; -} - -#recolor-art listview -{ - padding: 0px; - margin: 0px; - background-color:#2A2A2A ; -} - -#original-recolor-colors-list-box -{ - background-color:#2A2A2A ; -} -#reset -{ - background-color:#474747; - color:white; - border: 2px solid #000 ; - margin-top:6px; -} - -#reset:hover { - background-color: #202020; - color: white; - border: 2px solid #000; - margin-top: 6px; + /* border-radius: 4px; */ + /* border: 2px solid #0D57C3; */ } - #list-wheel-box { - background-color:#2A2A2A; margin:4px; - border: 2px solid #000 ; + border: 2px solid @theme_bg_color ; } #list-wheel-box label { font-size: 16px; - color: white; font-weight: 200; - background-image: none; } \ No newline at end of file -- GitLab From a148a8a53c15baa6a836620a06e4d01144085c1a Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 28 Jun 2025 10:15:22 +0300 Subject: [PATCH 24/32] gradients changing colors --- src/ui/widget/recolor-art.cpp | 52 +++++++++++++++++++++++++++++++++-- src/ui/widget/recolor-art.h | 5 ++++ 2 files changed, 54 insertions(+), 3 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index c86a47e3d8..6cd18fff2b 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -186,13 +186,29 @@ void RecolorArt::extractGradientStops(SPItem *item, std::string kind, bool isFil SPPaintServer *paint_server = isFill ? item->style->getFillPaintServer() : item->style->getStrokePaintServer(); if (paint_server && dynamic_cast(paint_server)) { SPGradient *gradient = dynamic_cast(paint_server); - for (auto stop : gradient->getGradientVector().stops) { + SPGradient *vectorGradient = gradient->getVector(); + if (vectorGradient) { + vectorGradient->ensureVector(); + int stopCount = vectorGradient->getStopCount(); + std::cout << "Stops count : " << stopCount << std::endl; + populateStopsMap(vectorGradient->getFirstStop()); + } + for (auto stop : vectorGradient->getGradientVector().stops) { if (stop.color.has_value()) { populateMap(stop.color.value(), item, kind); } } } } +void RecolorArt::populateStopsMap(SPStop *stop) +{ + g_message("populateStopsMap in"); + while (stop) { + std::string color = stop->getColor().toString(); + _gradient_stops[color].push_back(stop); + stop = stop->getNextStop(); + } +} void RecolorArt::populateMap(Color color, SPItem *item, std::string kind) { ColorRef ref = ColorRef(item, kind); @@ -217,7 +233,7 @@ void RecolorArt::extractItemStyle(SPItem *item) } // get gradient stops strokes else if (style->fill.isPaintserver()) { - extractGradientStops(item, "stop-fill", true); + extractGradientStops(item, "stop", true); } if (style->stroke.isColor()) { @@ -226,7 +242,7 @@ void RecolorArt::extractItemStyle(SPItem *item) } // get gradient stops strokes else if (style->stroke.isPaintserver()) { - extractGradientStops(item, "stop-stoke", false); + extractGradientStops(item, "stop", false); } } void RecolorArt::generateVisualList() @@ -343,11 +359,14 @@ void RecolorArt::lpChecked() } _selected->second.second.value().new_color = new_color.value(); for (auto &item : _selected->second.first) { + if (item.kind == "stop") + continue; SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property_string(css, item.kind.c_str(), _color_string); sp_desktop_apply_css_recursive(item.item, css, true); sp_repr_css_attr_unref(css); } + recolorStops(_selected->first, new_color.value()); DocumentUndo::done(_desktop->getDocument(), _("Recolored items"), INKSCAPE_ICON("object-recolor-art")); } void RecolorArt::onResetClicked() @@ -362,11 +381,14 @@ void RecolorArt::revertToOriginalColors() { for (auto [key, items] : _selected_colors) { for (auto &item : items.first) { + if (item.kind == "stop") + continue; SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property_string(css, item.kind.c_str(), key); sp_desktop_apply_css_recursive(item.item, css, true); sp_repr_css_attr_unref(css); } + recolorStops(key, items.second.value().old_color); } } void RecolorArt::convertToRecoloredColors() @@ -375,11 +397,23 @@ void RecolorArt::convertToRecoloredColors() if (items.second.has_value()) { std::string new_color = items.second.value().new_color.toString(); for (auto &item : items.first) { + if (item.kind == "stop") + continue; SPCSSAttr *css = sp_repr_css_attr_new(); sp_repr_css_set_property_string(css, item.kind.c_str(), new_color); sp_desktop_apply_css_recursive(item.item, css, true); sp_repr_css_attr_unref(css); } + recolorStops(key, items.second.value().new_color); + } + } +} +void RecolorArt::recolorStops(std::string old_color, Color new_color) +{ + auto stops_vector = _gradient_stops.find(old_color); + if (stops_vector != _gradient_stops.end()) { + for (auto stop : stops_vector->second) { + stop->setColor(new_color); } } } @@ -400,6 +434,7 @@ void RecolorArt::performUpdate() _color_list->remove(*child); } buttons.clear(); + _gradient_stops.clear(); _last_original_button = nullptr; _last_recolored_button = nullptr; // _current_color_id = ""; @@ -412,7 +447,18 @@ void RecolorArt::performUpdate() onOriginalColorClicked(first_button_id); } } + if (!_gradient_stops.empty()) { + for (auto [key, value] : _gradient_stops) { + std::cout << key << " : "; + for (auto stop : value) + std::cout << stop << " "; + std::cout << std::endl; + } + g_message("filled stops map"); + } else { + g_message("empty stops map"); + } g_message("Performing Update\n"); } } // namespace Widget diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 53f66aa0eb..92ac72624d 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -95,6 +95,8 @@ private: Gtk::Button *_last_original_button = nullptr; Gtk::Button *_last_recolored_button = nullptr; + std::map>_gradient_stops; + // Gtk::Button *_apply = nullptr; Glib::RefPtr _builder; @@ -118,6 +120,9 @@ private: void convertToRecoloredColors(); // void _onApplyButtonClicked(); + void populateStopsMap(SPStop* stop); + void recolorStops(std::string old_color ,Color new_color); + public: RecolorArt(); ~RecolorArt(); -- GitLab From 50385350a9b6b75660d8281a10df66d29e09f97f Mon Sep 17 00:00:00 2001 From: ftomara Date: Sat, 28 Jun 2025 14:33:57 +0300 Subject: [PATCH 25/32] added mesh gradients color collection and ability to change it --- src/ui/widget/recolor-art.cpp | 54 ++++++++++++++++++++++++----------- src/ui/widget/recolor-art.h | 11 +++---- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index 6cd18fff2b..cc8e565ecb 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -188,10 +188,21 @@ void RecolorArt::extractGradientStops(SPItem *item, std::string kind, bool isFil SPGradient *gradient = dynamic_cast(paint_server); SPGradient *vectorGradient = gradient->getVector(); if (vectorGradient) { - vectorGradient->ensureVector(); - int stopCount = vectorGradient->getStopCount(); - std::cout << "Stops count : " << stopCount << std::endl; - populateStopsMap(vectorGradient->getFirstStop()); + if (vectorGradient->hasPatches()) { + vectorGradient->ensureArray(); + std::unique_ptr nodeArray; + if (auto mesh = dynamic_cast(gradient)) { + nodeArray = std::make_unique(mesh); + extractMeshStops(nodeArray->nodes, item, kind); + } + + } else { + vectorGradient->ensureVector(); + // int stopCount = vectorGradient->getStopCount(); + // std::cout << "Stops count : " << stopCount << std::endl; + // std::cout << "has patches : " << vectorGradient->hasPatches() << std::endl; + populateStopsMap(vectorGradient->getFirstStop()); + } } for (auto stop : vectorGradient->getGradientVector().stops) { if (stop.color.has_value()) { @@ -200,6 +211,17 @@ void RecolorArt::extractGradientStops(SPItem *item, std::string kind, bool isFil } } } +void RecolorArt::extractMeshStops(std::vector> mesh_nodes, SPItem *item, std::string kind) +{ + for (auto nodes : mesh_nodes) { + for (auto node : nodes) { + populateStopsMap(node->stop); + if (node->color.has_value()) { + populateMap(node->color.value(), item, kind); + } + } + } +} void RecolorArt::populateStopsMap(SPStop *stop) { g_message("populateStopsMap in"); @@ -447,18 +469,6 @@ void RecolorArt::performUpdate() onOriginalColorClicked(first_button_id); } } - if (!_gradient_stops.empty()) { - for (auto [key, value] : _gradient_stops) { - std::cout << key << " : "; - for (auto stop : value) - std::cout << stop << " "; - std::cout << std::endl; - } - g_message("filled stops map"); - - } else { - g_message("empty stops map"); - } g_message("Performing Update\n"); } } // namespace Widget @@ -477,4 +487,16 @@ void RecolorArt::performUpdate() // } // } // g_message("apply clicked"); +// } +// if (!_gradient_stops.empty()) { +// for (auto [key, value] : _gradient_stops) { +// std::cout << key << " : "; +// for (auto stop : value) +// std::cout << stop << " "; +// std::cout << std::endl; +// } +// g_message("filled stops map"); + +// } else { +// g_message("empty stops map"); // } \ No newline at end of file diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 92ac72624d..2518d1b043 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -95,20 +95,21 @@ private: Gtk::Button *_last_original_button = nullptr; Gtk::Button *_last_recolored_button = nullptr; - std::map>_gradient_stops; + std::map> _gradient_stops; // Gtk::Button *_apply = nullptr; - + Glib::RefPtr _builder; void populateMap(Color color, SPItem *style, std::string kind); void collectColors(std::vector items); void extractGradientStops(SPItem *item, std::string kind, bool isFill); + void extractMeshStops(std::vector> mesh_nodes, SPItem *item, std::string kind); void extractItemColors(SPItem *item); void extractItemStyle(SPItem *item); void generateVisualList(); void layoutColorPicker(std::shared_ptr updated_color = nullptr); void colorButtons(Gtk::Button *button, std::string color); - void colorBorderOnClick(Gtk::Button *button , bool kind); + void colorBorderOnClick(Gtk::Button *button, bool kind); // signals handelrs void onOriginalColorClicked(std::string color_id); @@ -120,8 +121,8 @@ private: void convertToRecoloredColors(); // void _onApplyButtonClicked(); - void populateStopsMap(SPStop* stop); - void recolorStops(std::string old_color ,Color new_color); + void populateStopsMap(SPStop *stop); + void recolorStops(std::string old_color, Color new_color); public: RecolorArt(); -- GitLab From 4302f8556fb992a55d868a4fb90062576f938a7f Mon Sep 17 00:00:00 2001 From: ftomara Date: Sun, 29 Jun 2025 09:10:25 +0300 Subject: [PATCH 26/32] only shows recolor tab when selection is greater than 1 --- src/ui/dialog/fill-and-stroke.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index 11b72f0c6a..c397394a60 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -25,6 +25,7 @@ #include "desktop-style.h" #include "desktop.h" +#include "selection.h" #include "preferences.h" #include "ui/icon-loader.h" #include "ui/icon-names.h" @@ -88,6 +89,11 @@ FillAndStroke::~FillAndStroke() void FillAndStroke::selectionChanged(Selection *selection) { + if(selection->size()<=1) + _page_recolor_art->hide(); + else + _page_recolor_art->show(); + if (!page_changed) { changed_fill = true; changed_stroke = true; -- GitLab From d5169e5f6df36b60cb1920afdf2a3124f0a035a1 Mon Sep 17 00:00:00 2001 From: ftomara Date: Sun, 29 Jun 2025 10:16:08 +0300 Subject: [PATCH 27/32] removed standard colorpicker on activiated color wheel tab --- src/ui/widget/recolor-art.cpp | 15 +++++++++++++++ src/ui/widget/recolor-art.h | 5 +++++ 2 files changed, 20 insertions(+) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index cc8e565ecb..aa7deccc16 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -15,6 +15,7 @@ #include // #include +#include #include #include "actions/actions-tools.h" @@ -64,6 +65,20 @@ RecolorArt::RecolorArt() _reset = _builder->get_widget("reset"); _reset->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::onResetClicked)); + _notebook = _builder->get_widget("list-wheel-box"); + _color_wheel_page = _builder->get_widget("color-wheel-page"); + _notebook->signal_switch_page().connect([this](Gtk::Widget* page, guint page_num) { + int wheel_index = _notebook->page_num(*_color_wheel_page); + + if (static_cast(page_num) == wheel_index) { + _color_picker_wdgt->set_visible(false); + // std::cout << "Color Wheel tab is active.\n"; + } else { + _color_picker_wdgt->set_visible(true); + // std::cout << "Color Wheel tab is NOT active.\n"; + } + }); + _list_view = _builder->get_widget("recolor-art-list"); _color_model = Gio::ListStore::create(); _selection_model = Gtk::SingleSelection::create(_color_model); diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index 2518d1b043..b50f548d7a 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -10,6 +10,7 @@ #include #include #include +#include #include #include @@ -32,6 +33,7 @@ namespace Gtk { class Widget; class Builder; class ListStore; +class Notebook; } // namespace Gtk class SPDesktop; @@ -97,6 +99,9 @@ private: std::map> _gradient_stops; + Gtk::Notebook *_notebook = nullptr; + Gtk::Box *_color_wheel_page = nullptr; + // Gtk::Button *_apply = nullptr; Glib::RefPtr _builder; -- GitLab From 804beacb929b998975b0d25fda2292b3a35d6c5d Mon Sep 17 00:00:00 2001 From: ftomara Date: Wed, 2 Jul 2025 15:51:52 +0300 Subject: [PATCH 28/32] fixed row and items selection by changing the color model too --- src/ui/widget/recolor-art.cpp | 74 +++++++++++++++++++++-------------- src/ui/widget/recolor-art.h | 2 +- 2 files changed, 46 insertions(+), 30 deletions(-) diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index aa7deccc16..f0abcc1223 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -135,7 +135,12 @@ RecolorArt::RecolorArt() original->set_name("original"); recolored->set_name("recolored"); original->signal_clicked().connect([this, item, index = list_item->get_position()] { - // _selection_model->set_selected(index); + _selection_model->set_selected(index); + onOriginalColorClicked(item->key); + }); + + recolored->signal_clicked().connect([this, item, index = list_item->get_position()] { + _selection_model->set_selected(index); onOriginalColorClicked(item->key); }); buttons[item->key] = {original, recolored}; @@ -151,18 +156,18 @@ RecolorArt::RecolorArt() _list_view->set_hexpand(false); _list_view->set_vexpand(false); - // _selection_model->signal_selection_changed().connect([this](guint pos, guint n_items) { - // int index = _selection_model->get_selected(); - // if (index < 0) - // return; + _selection_model->signal_selection_changed().connect([this](guint pos, guint n_items) { + int index = _selection_model->get_selected(); + if (index < 0) + return; - // auto item = _color_model->get_item(index); - // auto color_item = std::dynamic_pointer_cast(item); - // if (!color_item) - // return; + auto item = _color_model->get_item(index); + auto color_item = std::dynamic_pointer_cast(item); + if (!color_item) + return; - // onOriginalColorClicked(color_item->key); - // }); + onOriginalColorClicked(color_item->key); + }); // _apply = _builder->get_widget("apply"); // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); @@ -288,7 +293,7 @@ void RecolorArt::generateVisualList() buttons.clear(); for (auto &[key, value] : _selected_colors) { auto old_color = value.second.value().old_color.toString(); - auto new_color = value.second.value().old_color.toString(); + auto new_color = value.second.value().new_color.toString(); _color_model->append(ColorItem::create(key, old_color, new_color)); } _color_list->append(*_list_view); @@ -328,21 +333,21 @@ void RecolorArt::colorButtons(Gtk::Button *button, std::string color) g_message("button not found"); } } -void RecolorArt::colorBorderOnClick(Gtk::Button *button, bool kind) -{ - auto &_last_button = kind == 1 ? _last_original_button : _last_recolored_button; - if (_last_button && _last_button != button) { - auto style_context = _last_button->get_style_context(); - style_context->remove_class("selected-button"); - } - if (button) { - auto style_context = button->get_style_context(); - style_context->add_class("selected-button"); - _last_button = button; - } else { - g_warning("button not found for border coloring"); - } -} +// void RecolorArt::colorBorderOnClick(Gtk::Button *button, bool kind) +// { +// auto &_last_button = kind == 1 ? _last_original_button : _last_recolored_button; +// if (_last_button && _last_button != button) { +// auto style_context = _last_button->get_style_context(); +// style_context->remove_class("selected-button"); +// } +// if (button) { +// auto style_context = button->get_style_context(); +// style_context->add_class("selected-button"); +// _last_button = button; +// } else { +// g_warning("button not found for border coloring"); +// } +// } void RecolorArt::onOriginalColorClicked(std::string color_id) { _current_color_id = color_id; @@ -353,8 +358,8 @@ void RecolorArt::onOriginalColorClicked(std::string color_id) std::shared_ptr updated_color = std::make_shared(); updated_color->set(color); layoutColorPicker(updated_color); - colorBorderOnClick(btns->second.first, 1); - colorBorderOnClick(btns->second.second, 0); + // colorBorderOnClick(btns->second.first, 1); + // colorBorderOnClick(btns->second.second, 0); // g_message("original color selected at color %s", color_id.c_str()); } } @@ -379,6 +384,10 @@ void RecolorArt::onColorPickerChanged() if (_live_preview && _live_preview->property_active()) { lpChecked(); } + guint index = _selection_model->get_selected(); + auto item = _color_model->get_item(index); + auto color_item = std::dynamic_pointer_cast(item); + color_item->new_color = _color_string; g_message("color picker changed"); } void RecolorArt::lpChecked() @@ -411,6 +420,13 @@ void RecolorArt::onResetClicked() for (auto [key, btns] : buttons) { colorButtons(btns.second, key); } + + for(auto i =0; i<_color_model->get_n_items();i++) + { + auto item = _color_model->get_item(i); + auto color_item = std::dynamic_pointer_cast(item); + color_item->new_color = color_item->key; + } revertToOriginalColors(); onOriginalColorClicked(buttons.begin()->first); } diff --git a/src/ui/widget/recolor-art.h b/src/ui/widget/recolor-art.h index b50f548d7a..0c9e9eda6a 100644 --- a/src/ui/widget/recolor-art.h +++ b/src/ui/widget/recolor-art.h @@ -114,7 +114,7 @@ private: void generateVisualList(); void layoutColorPicker(std::shared_ptr updated_color = nullptr); void colorButtons(Gtk::Button *button, std::string color); - void colorBorderOnClick(Gtk::Button *button, bool kind); + // void colorBorderOnClick(Gtk::Button *button, bool kind); // signals handelrs void onOriginalColorClicked(std::string color_id); -- GitLab From e4a16c3dbc25ba6ec5cafd6aa3a8a3a55834219f Mon Sep 17 00:00:00 2001 From: ftomara Date: Wed, 2 Jul 2025 16:03:44 +0300 Subject: [PATCH 29/32] made the color button fill available horizontal space , removed unneccessary styles --- share/ui/recolor-art.glade | 20 ++++++------ share/ui/style.css | 61 ++--------------------------------- src/ui/widget/recolor-art.cpp | 15 +++------ 3 files changed, 18 insertions(+), 78 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 5c953c9301..40076633e2 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -27,7 +27,7 @@ Original - center + fill @@ -54,23 +54,25 @@ - True - False - True + true + true + true + centre never - False + false colors-list vertical - center - center + true + fill + fill false - center + fill true - center + fill diff --git a/share/ui/style.css b/share/ui/style.css index bfffa3522c..074f66bf6d 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -1580,66 +1580,11 @@ listview row.top-separator { */ #original, #recolored { - min-width: 180px; - min-height: 14px; + min-height: 6px; border-radius: 4px; - padding: 0px; - margin: 0px; border: 2px solid @theme_bg_color; } -#original-recolor-box button#original:hover { - min-width: 180px; - min-height: 14px; - border-radius: 4px; - padding: 0px; - margin: 0px; - border: 2px solid @theme_fq_color; -} -#original-recolor-box button.selected-button { - min-width: 180px; - min-height: 14px; - border-radius: 4px; - padding: 0px; - margin: 0px; - border: 2px solid @theme_fq_color; -} - -#original-reset-recolor label -{ - font-size: 16px; - font-weight: bold; - -} - -#original-reset-recolor -{ - - margin-left: 2px; - margin-right: 38px; - margin-bottom: 6px; - margin-top: 6px; - -} - -#original-recolor-box { - min-width: 180px; - min-height: 14px; -} - -#recolor-art listview row:selected { - background-color: transparent; - /* border-radius: 4px; */ - /* border: 2px solid #0D57C3; */ -} -#list-wheel-box -{ - margin:4px; - border: 2px solid @theme_bg_color ; +#original-recolor-box button#original:hover,button#recolored:hover { + border: 2px solid @theme_fq_color; } - -#list-wheel-box label -{ - font-size: 16px; - font-weight: 200; -} \ No newline at end of file diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index f0abcc1223..b253df920a 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -90,13 +90,11 @@ RecolorArt::RecolorArt() auto arrow = Gtk::make_managed(); auto recolored = Gtk::make_managed(); - original->set_hexpand(false); - original->set_vexpand(false); - original->set_valign(Gtk::Align::CENTER); + original->set_hexpand(true); + + + recolored->set_hexpand(true); - recolored->set_hexpand(false); - recolored->set_vexpand(false); - recolored->set_valign(Gtk::Align::CENTER); arrow->set_use_markup(true); arrow->set_width_chars(3); @@ -105,11 +103,6 @@ RecolorArt::RecolorArt() arrow->set_valign(Gtk::Align::CENTER); box->set_name("original-recolor-box"); - box->set_spacing(14); - box->set_margin_top(0); - box->set_margin_bottom(0); - box->set_margin_start(0); - box->set_margin_end(0); box->append(*original); box->append(*arrow); box->append(*recolored); -- GitLab From e177d026877b3e17ff4fc9ce0060269973d3fb6c Mon Sep 17 00:00:00 2001 From: ftomara Date: Thu, 3 Jul 2025 17:46:00 +0300 Subject: [PATCH 30/32] style refinements and unreformatted the style.css file --- share/ui/recolor-art.glade | 2 ++ share/ui/style.css | 17 +++++++++++++---- src/ui/widget/recolor-art.cpp | 3 ++- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 40076633e2..1941dcec77 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -36,6 +36,8 @@ true false false + center + 18 reset-settings diff --git a/share/ui/style.css b/share/ui/style.css index 074f66bf6d..e76316ded3 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -1579,12 +1579,21 @@ listview row.top-separator { ********************** */ -#original, #recolored { + +#recolor-art #original, +#recolored { min-height: 6px; border-radius: 4px; - border: 2px solid @theme_bg_color; + border: 2px solid transparent; +} + +#original-recolor-box button#original:hover, +button#recolored:hover { + border-color: @theme_fq_color; } -#original-recolor-box button#original:hover,button#recolored:hover { - border: 2px solid @theme_fq_color; +#recolor-art listview row:selected { + background-color: transparent; + border: 2px solid @theme_selected_bg_color; + border-radius: 4px; } diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index b253df920a..ac9788db23 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -97,10 +97,11 @@ RecolorArt::RecolorArt() arrow->set_use_markup(true); - arrow->set_width_chars(3); + arrow->set_width_chars(6); arrow->set_markup(""); arrow->set_halign(Gtk::Align::CENTER); arrow->set_valign(Gtk::Align::CENTER); + arrow->set_margin_top(3); box->set_name("original-recolor-box"); box->append(*original); -- GitLab From a7fe16c4112c77fd6f025a618304fbf2eb920fca Mon Sep 17 00:00:00 2001 From: ftomara Date: Thu, 3 Jul 2025 18:01:18 +0300 Subject: [PATCH 31/32] made the recolor art as a popover in the end of fill tab --- src/ui/dialog/fill-and-stroke.cpp | 87 +++++++++++++++---------------- src/ui/dialog/fill-and-stroke.h | 3 ++ 2 files changed, 44 insertions(+), 46 deletions(-) diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index c397394a60..e423779dfa 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -25,14 +25,12 @@ #include "desktop-style.h" #include "desktop.h" -#include "selection.h" #include "preferences.h" +#include "selection.h" #include "ui/icon-loader.h" #include "ui/icon-names.h" #include "ui/pack.h" #include "ui/widget/fill-style.h" -#include "ui/widget/stroke-style.h" -#include "ui/widget/recolor-art.h" #include "ui/widget/notebook-page.h" #include "ui/widget/recolor-art.h" #include "ui/widget/stroke-style.h" @@ -45,23 +43,24 @@ FillAndStroke::FillAndStroke() , _page_stroke_paint(Gtk::make_managed(1, 1)) , _page_stroke_style(Gtk::make_managed(1, 1)) , _page_recolor_art(Gtk::make_managed(1, 1)) - , _composite_settings(INKSCAPE_ICON("dialog-fill-and-stroke"), - "fillstroke", - UI::Widget::SimpleFilterModifier::ISOLATION | - UI::Widget::SimpleFilterModifier::BLEND | - UI::Widget::SimpleFilterModifier::BLUR | - UI::Widget::SimpleFilterModifier::OPACITY) + , _composite_settings(INKSCAPE_ICON("dialog-fill-and-stroke"), "fillstroke", + UI::Widget::SimpleFilterModifier::ISOLATION | UI::Widget::SimpleFilterModifier::BLEND | + UI::Widget::SimpleFilterModifier::BLUR | UI::Widget::SimpleFilterModifier::OPACITY) , fillWdgt(nullptr) , strokeWdgt(nullptr) - ,recolorArtWdgt(nullptr) + , recolorArtWdgt(nullptr) + , recolorButtonTriger(Gtk::make_managed()) + , recolorPopOver(Gtk::make_managed()) { set_spacing(2); UI::pack_start(*this, _notebook, true, true); _notebook.append_page(*_page_fill, _createPageTabLabel(_("_Fill"), INKSCAPE_ICON("object-fill"))); _notebook.append_page(*_page_stroke_paint, _createPageTabLabel(_("Stroke _paint"), INKSCAPE_ICON("object-stroke"))); - _notebook.append_page(*_page_stroke_style, _createPageTabLabel(_("Stroke st_yle"), INKSCAPE_ICON("object-stroke-style"))); - _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor"), INKSCAPE_ICON("object-recolor-art"))); + _notebook.append_page(*_page_stroke_style, + _createPageTabLabel(_("Stroke st_yle"), INKSCAPE_ICON("object-stroke-style"))); + // _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor"), + // INKSCAPE_ICON("object-recolor-art"))); _notebook.set_vexpand(true); _switch_page_conn = _notebook.signal_switch_page().connect(sigc::mem_fun(*this, &FillAndStroke::_onSwitchPage)); @@ -71,6 +70,14 @@ FillAndStroke::FillAndStroke() _layoutPageStrokeStyle(); _layoutPageRecolorArt(); + recolorButtonTriger->set_label("Recolor Selection"); + recolorButtonTriger->signal_clicked().connect([this]() { + recolorPopOver->popup(); + recolorArtWdgt->performUpdate(); + }); + recolorPopOver->set_parent(*recolorButtonTriger); + recolorPopOver->set_child(*_page_recolor_art); + UI::pack_end(*this, _composite_settings, UI::PackOptions::shrink); _composite_settings.setSubject(&_subject); @@ -89,10 +96,10 @@ FillAndStroke::~FillAndStroke() void FillAndStroke::selectionChanged(Selection *selection) { - if(selection->size()<=1) - _page_recolor_art->hide(); + if (selection->size() <= 1) + recolorButtonTriger->hide(); else - _page_recolor_art->show(); + recolorButtonTriger->show(); if (!page_changed) { changed_fill = true; @@ -109,10 +116,10 @@ void FillAndStroke::selectionChanged(Selection *selection) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionChangedCB(); } - if (recolorArtWdgt && npage == 3) { - // if (!recolorArtWdgt->isInPreviewMode()) - recolorArtWdgt->performUpdate(); - } + // if (recolorArtWdgt && npage == 3) { + // // if (!recolorArtWdgt->isInPreviewMode()) + // recolorArtWdgt->performUpdate(); + // } } void FillAndStroke::selectionModified(Selection *selection, guint flags) @@ -130,11 +137,11 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionModifiedCB(flags); } - if (recolorArtWdgt && npage == 3) { + // if (recolorArtWdgt && npage == 3) { // if (!recolorArtWdgt->isInPreviewMode()) { // recolorArtWdgt->performUpdate(); // } -} + // } } void FillAndStroke::desktopReplaced() @@ -172,7 +179,7 @@ void FillAndStroke::_onSwitchPage(Gtk::Widget *page, guint pagenum) } else if (npage == 2 && changed_stroke_style) { update = true; changed_stroke_style = false; - }else if (npage == 3 && changed_recolor_art) { + } else if (npage == 3 && changed_recolor_art) { update = true; changed_recolor_art = false; } @@ -185,82 +192,70 @@ void FillAndStroke::_onSwitchPage(Gtk::Widget *page, guint pagenum) _savePagePref(pagenum); } -void -FillAndStroke::_savePagePref(guint page_num) +void FillAndStroke::_savePagePref(guint page_num) { // remember the current page Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setInt("/dialogs/fillstroke/page", page_num); } -void -FillAndStroke::_layoutPageFill() +void FillAndStroke::_layoutPageFill() { fillWdgt = Gtk::make_managed(FILL); _page_fill->table().attach(*fillWdgt, 0, 0, 1, 1); + _page_fill->append(*recolorButtonTriger); } -void -FillAndStroke::_layoutPageStrokePaint() +void FillAndStroke::_layoutPageStrokePaint() { strokeWdgt = Gtk::make_managed(STROKE); _page_stroke_paint->table().attach(*strokeWdgt, 0, 0, 1, 1); } -void -FillAndStroke::_layoutPageStrokeStyle() +void FillAndStroke::_layoutPageStrokeStyle() { strokeStyleWdgt = Gtk::make_managed(); strokeStyleWdgt->set_hexpand(); strokeStyleWdgt->set_halign(Gtk::Align::START); _page_stroke_style->table().attach(*strokeStyleWdgt, 0, 0, 1, 1); } -void -FillAndStroke::_layoutPageRecolorArt() +void FillAndStroke::_layoutPageRecolorArt() { recolorArtWdgt = Gtk::make_managed(); recolorArtWdgt->set_hexpand(); recolorArtWdgt->set_halign(Gtk::Align::FILL); - _page_recolor_art->table().attach(*recolorArtWdgt,0,0,1,1); + _page_recolor_art->table().attach(*recolorArtWdgt, 0, 0, 1, 1); } -void -FillAndStroke::showPageFill() +void FillAndStroke::showPageFill() { blink(); _notebook.set_current_page(0); _savePagePref(0); - } -void -FillAndStroke::showPageStrokePaint() +void FillAndStroke::showPageStrokePaint() { blink(); _notebook.set_current_page(1); _savePagePref(1); } -void -FillAndStroke::showPageStrokeStyle() +void FillAndStroke::showPageStrokeStyle() { blink(); _notebook.set_current_page(2); _savePagePref(2); - } -void -FillAndStroke::showPageRecolorArt() +void FillAndStroke::showPageRecolorArt() { blink(); _notebook.set_current_page(3); _savePagePref(3); - } -Gtk::Box& -FillAndStroke::_createPageTabLabel(const Glib::ustring& label, const char *label_image) +Gtk::Box &FillAndStroke::_createPageTabLabel(Glib::ustring const &label, char const *label_image) { auto const _tab_label_box = Gtk::make_managed(Gtk::Orientation::HORIZONTAL, 4); diff --git a/src/ui/dialog/fill-and-stroke.h b/src/ui/dialog/fill-and-stroke.h index 24d8c5f6eb..85d9630ea4 100644 --- a/src/ui/dialog/fill-and-stroke.h +++ b/src/ui/dialog/fill-and-stroke.h @@ -24,6 +24,7 @@ namespace Gtk { class Box; +class Popover; } // namespace Gtk namespace Inkscape::UI { @@ -84,6 +85,8 @@ private: UI::Widget::FillNStroke *strokeWdgt = nullptr; UI::Widget::StrokeStyle *strokeStyleWdgt = nullptr; UI::Widget::RecolorArt *recolorArtWdgt = nullptr; + Gtk::Button *recolorButtonTriger = nullptr; + Gtk::Popover* recolorPopOver=nullptr; sigc::scoped_connection _switch_page_conn; }; -- GitLab From 5276131958872a814edbaac78e4c31d515ee2b39 Mon Sep 17 00:00:00 2001 From: ftomara Date: Fri, 4 Jul 2025 19:15:49 +0300 Subject: [PATCH 32/32] made the popover on left --- share/ui/recolor-art.glade | 1 + share/ui/style.css | 681 ++++++++++++++++++------------ src/ui/dialog/fill-and-stroke.cpp | 57 +-- src/ui/dialog/fill-and-stroke.h | 8 +- src/ui/widget/paint-selector.cpp | 14 + src/ui/widget/paint-selector.h | 6 + src/ui/widget/recolor-art.cpp | 30 +- 7 files changed, 452 insertions(+), 345 deletions(-) diff --git a/share/ui/recolor-art.glade b/share/ui/recolor-art.glade index 1941dcec77..d1488022ed 100644 --- a/share/ui/recolor-art.glade +++ b/share/ui/recolor-art.glade @@ -75,6 +75,7 @@ fill true fill + 250 diff --git a/share/ui/style.css b/share/ui/style.css index e76316ded3..6500c1e298 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -67,7 +67,7 @@ * "..combobright" Combo bright */ -*{ +* { font-feature-settings: "tnum"; } @@ -75,9 +75,11 @@ .view.image { color: @theme_fg_color; } + .view.image:backdrop { color: @theme_unfocused_fg_color; } + .view.image:disabled { color: @insensitive_fg_color; } @@ -102,7 +104,7 @@ -gtk-icon-style: symbolic; } -.titlebutton > image { +.titlebutton>image { -gtk-icon-style: requested; } @@ -118,32 +120,58 @@ .highlight { color: @theme_fg_color; - background-color: alpha(@theme_selected_bg_color,0.5); - background-image: image(alpha(@theme_selected_bg_color,0.5)); + background-color: alpha(@theme_selected_bg_color, 0.5); + background-image: image(alpha(@theme_selected_bg_color, 0.5)); caret-color: @theme_bg_color; - border-radius:4px; + border-radius: 4px; -gtk-secondary-caret-color: @theme_fg_color; } -.noborder{ - border-width:0; +.noborder { + border-width: 0; } /* blinking animation for dialogs reopen*/ @keyframes blink_border { - 0% { border-color: @theme_selected_fg_color;} - 90% { border-color: @theme_selected_bg_color; } - 100% { border-color: @theme_selected_fg_color; } + 0% { + border-color: @theme_selected_fg_color; + } + + 90% { + border-color: @theme_selected_bg_color; + } + + 100% { + border-color: @theme_selected_fg_color; + } } + @keyframes blink_background { - 0% { background-color: @theme_bg_color; } - 90% { background-color: @theme_selected_bg_color; } - 100% { background-color: @theme_bg_color; } + 0% { + background-color: @theme_bg_color; + } + + 90% { + background-color: @theme_selected_bg_color; + } + + 100% { + background-color: @theme_bg_color; + } } + @keyframes blink_background_img { - 0% { background-image: image(@theme_bg_color); } - 90% { background-image: image(@theme_selected_bg_color); } - 100% { background-image: image(@theme_bg_color); } + 0% { + background-image: image(@theme_bg_color); + } + + 90% { + background-image: image(@theme_selected_bg_color); + } + + 100% { + background-image: image(@theme_bg_color); + } } button.blink { @@ -151,11 +179,11 @@ button.blink { } notebook.blink { - animation: 0.5s blink_border 0.1s ease 1; + animation: 0.5s blink_border 0.1s ease 1; } -notebook.blink > header > tabs > tab:checked { - animation: 0.5s blink_background 0.1s ease 1; +notebook.blink>header>tabs>tab:checked { + animation: 0.5s blink_background 0.1s ease 1; } .inverted :not(menuitem):not(.rawstyle):not(overshoot):not(undershoot):not(selection), @@ -167,17 +195,19 @@ notebook.blink > header > tabs > tab:checked { } .dark .combobright .combo, -.dark .combobright menu{ +.dark .combobright menu { background-color: @theme_text_color; background-image: linear-gradient(to top, @theme_text_color, @theme_fd_color); caret-color: @theme_base_color; -gtk-secondary-caret-color: @theme_base_color; } -.dark .combobright box *{ + +.dark .combobright box * { color: @theme_base_color; } + .dark .combobright .combo *, -.dark .combobright menu *{ +.dark .combobright menu * { color: inherit; } @@ -225,10 +255,10 @@ iconview *:hover { border-color: @theme_bg_color; } -#startscreennotebook iconview *:hover{ - background-color:@theme_selected_bg_color; - border-radius:5px; - border-width:0; +#startscreennotebook iconview *:hover { + background-color: @theme_selected_bg_color; + border-radius: 5px; + border-width: 0; } .inksmall { @@ -255,7 +285,8 @@ iconview *:hover { } #CommandPaletteBase { - background-color: @theme_base_color; /* some themes don't seem to have a background color for list rows defined and would end up transparent otherwise */ + background-color: @theme_base_color; + /* some themes don't seem to have a background color for list rows defined and would end up transparent otherwise */ border: 5px solid @theme_bg_color; border-radius: 5px; } @@ -308,18 +339,18 @@ iconview *:hover { border-width: 0; } -#SelectorsAndStyleDialog #StyleDialog treeview button *{ - font-size:5px; - min-height:1px; - padding:0; - margin:0; +#SelectorsAndStyleDialog #StyleDialog treeview button * { + font-size: 5px; + min-height: 1px; + padding: 0; + margin: 0; } #SelectorsAndStyleDialog #StyleDialog treeview button { - padding:0; - min-height:1px; - border-left-width:4px; - border-color:@success_color; + padding: 0; + min-height: 1px; + border-left-width: 4px; + border-color: @success_color; } /* ink-ruler */ @@ -346,25 +377,28 @@ iconview *:hover { /* Ensure ui/themes.cpp excludes these classes on applying overridebasecolor: */ .bright #InkRuler.shadow { - color: rgba(0,0,0,0.3); + color: rgba(0, 0, 0, 0.3); } + .dark #InkRuler.shadow { - color: rgba(0,0,0,0.5); + color: rgba(0, 0, 0, 0.5); } .bright #InkRuler.page { color: @theme_base_color; } + .dark #InkRuler.page { color: shade(@theme_base_color, 0.666); } .bright #InkRuler.selection.border, -.dark #InkRuler.selection.border { +.dark #InkRuler.selection.border { color: @theme_selected_bg_color; } + .bright #InkRuler.selection.background, -.dark #InkRuler.selection.background { +.dark #InkRuler.selection.background { color: transparent; } @@ -374,7 +408,9 @@ SPCanvas { } /* Those are three buttons in canvas corners; their size dictates how large scrollbars are */ -#QuickActions, #LockGuides, #CMS_Adjust { +#QuickActions, +#LockGuides, +#CMS_Adjust { padding: 0; margin: 0; outline: none; @@ -383,10 +419,14 @@ SPCanvas { min-width: 22px; min-height: 22px; } + /* Don't let images inside those buttons inflate their sizes */ -#QuickActions *, #LockGuides *, #CMS_Adjust * { +#QuickActions *, +#LockGuides *, +#CMS_Adjust * { padding: 0; } + #QuickActions image { margin-top: 1px; } @@ -433,13 +473,15 @@ SPCanvas { #InkSpinScale scale { padding: 0px; - margin:0; + margin: 0; } #InkSpinScale trough { min-height: 25px; - padding: 0; /* remove padding to make inkspinscale the same height as spinbutton */ + padding: 0; + /* remove padding to make inkspinscale the same height as spinbutton */ } + #InkSpinScale trough highlight { margin: 0; } @@ -451,7 +493,7 @@ SPCanvas { #InkSpinScale spinbutton { box-shadow: none; min-height: 10px; - border-left:0; + border-left: 0; border-top-left-radius: 0; border-bottom-left-radius: 0; } @@ -470,10 +512,11 @@ SPCanvas { outline-width: 5px; outline-color: alpha(@theme_fg_color, 0.1); } + #Objects .search { - padding: 2px 4px; - min-height: 16px; - font-size: smaller; + padding: 2px 4px; + min-height: 16px; + font-size: smaller; } #SimpleFilterModifier #InkSpinScale { @@ -484,6 +527,7 @@ SPCanvas { border-top-right-radius: 0; border-bottom-right-radius: 0; } + #CompletionPopup button { border-top-left-radius: 0; border-bottom-left-radius: 0; @@ -509,7 +553,7 @@ treeview.view:drop(active).before { border-radius: 10px; } -button.close-button{ +button.close-button { background-image: none; padding: 0px; min-height: 1px; @@ -519,7 +563,7 @@ button.close-button{ box-shadow: none; } -button.close-button:hover{ +button.close-button:hover { box-shadow: none; opacity: 1; } @@ -528,27 +572,29 @@ button.close-button:hover{ * Inkscape start dialog styles */ -#start-screen-window .titlebar stack { /* banner-stack */ +#start-screen-window .titlebar stack { + /* banner-stack */ padding: 0; /* opaque bg at bottom corners, rather than having gap, which in GTK3 glitches in transition */ background: linear-gradient(to bottom, transparent 0%, transparent 50%, @theme_bg_color); } #start-screen-window .combo { - padding:1px 10px; + padding: 1px 10px; } + #start-screen-window .combo * { - padding:2px; + padding: 2px; } #start-screen-window grid label { - font-size:small; - margin:12px; + font-size: small; + margin: 12px; } #start-screen-window * { - outline:0; + outline: 0; } button.link:hover image { @@ -558,6 +604,7 @@ button.link:hover image { .marker-item-box { padding: 1px; } + .marker-separator { padding: 0; } @@ -592,6 +639,7 @@ stackswitcher button { margin: 0; min-width: 16px; } + .color-palette-main-box flowbox, .color-palette-main-box scrolledwindow { padding: 0; @@ -600,6 +648,7 @@ stackswitcher button { min-width: 1px; min-height: 1px; } + /* remove padding/margins from FlowBoxChild widgets, * so previews can be adjacent to each other */ .color-palette-main-box flowboxchild { @@ -609,6 +658,7 @@ stackswitcher button { min-width: 1px; min-height: 1px; } + /*removes dashed line (scrolling indicator) on color palette for all themes */ .color-palette-main-box scrolledwindow undershoot.top, .color-palette-main-box scrolledwindow undershoot.right, @@ -624,33 +674,36 @@ stackswitcher button { } @keyframes pulse { - 0% { - opacity: 0.3; - } - 50% { - opacity: 0.9; - } - 100% { - opacity: 0.3; - } + 0% { + opacity: 0.3; + } + + 50% { + opacity: 0.9; + } + + 100% { + opacity: 0.3; + } } .backgnd-active { - animation-name: pulse; - background-color: @theme_selected_bg_color; - animation-duration: 1s; - animation-timing-function: ease; - animation-iteration-count: infinite; + animation-name: pulse; + background-color: @theme_selected_bg_color; + animation-duration: 1s; + animation-timing-function: ease; + animation-iteration-count: infinite; } -.nb-highlight > header.top { - background-color: @theme_selected_bg_color; +.nb-highlight>header.top { + background-color: @theme_selected_bg_color; } .tight-flowbox flowboxchild { margin: 0; padding: 0px; } + .tight-flowbox button { margin: 0; padding: 4px; @@ -690,7 +743,8 @@ button.square-button image { } .tag-box label { - min-width: 2em; /* don't let it collapse */ + min-width: 2em; + /* don't let it collapse */ margin-right: 1px; margin-left: 8px; } @@ -701,11 +755,10 @@ button.square-button image { } /* Give layer selector button label a highlight color */ -#LayerSelector label -{ +#LayerSelector label { padding-left: 6px; border-left-style: solid; - border-left-width: 3px ; + border-left-width: 3px; /* Color is set in src/ui/widget/layer-selector.cpp */ } @@ -714,17 +767,18 @@ button.square-button image { padding-right: 3px; } -#DialogNotebook #Swatches #ColorItem.group + label { +#DialogNotebook #Swatches #ColorItem.group+label { font-weight: bold; } -#DialogNotebook #Swatches #ColorItem.paint-none + label { +#DialogNotebook #Swatches #ColorItem.paint-none+label { font-style: italic; } #StyleSwatch { font-size: smaller; } + #StyleSwatch.vertical { line-height: 0.8; /* Extra height for text descenders (?) makes style swatch bounding box too tall enlarging toolbars; @@ -748,17 +802,21 @@ button.square-button image { /* heading label in dialogs */ .heading { font-weight: bold; - font-size: 1.1em; /* make it optically comparable with non-bold */ + font-size: 1.1em; + /* make it optically comparable with non-bold */ margin-top: 0.5em; } + /* topmost heading in dialogs */ .heading.top { margin-top: 0.2em; } + /* slightly smaller (sub)heading label in dialogs */ .heading1 { font-weight: bold; - font-size: 1em; /* make it optically comparable with non-bold */ + font-size: 1em; + /* make it optically comparable with non-bold */ margin-top: 0.5em; } @@ -774,18 +832,22 @@ button.square-button image { .inkscape-toolbar { margin: 4px; } -.inkscape-toolbar > * { + +.inkscape-toolbar>* { margin-right: 2px; margin-left: 2px; } -.inkscape-toolbar > box > image, -.inkscape-toolbar > box > label { + +.inkscape-toolbar>box>image, +.inkscape-toolbar>box>label { margin-right: 2px; } -.inkscape-toolbar popover content > * { + +.inkscape-toolbar popover content>* { margin-right: 2px; margin-left: 2px; } + /* Revise for gtk4: There's no box in popover */ /*.inkscape-toolbar > popover > box {*/ /* margin: 4px 3px;*/ @@ -823,15 +885,18 @@ button.menu-btn-tight { #DesktopStatusBar { margin-right: 1em; } + /* * Inkscape Export Dialog */ -#ExportDialog #export_selection{ +#ExportDialog #export_selection { border-radius: 0px; } + #ExportDialog #export_preview_single { border: 1px solid; } + #ExportDialog #export_preview_batch { border: 1px solid; } @@ -848,29 +913,33 @@ combobox.flat-combobox button { background-image: image(transparent); } -.filter-effects, .effects-params { +.filter-effects, +.effects-params { min-height: 50px; } /* Defeat standard darker background color on views: use popoverʼs background */ popover.background.filter-effects-info textview, -popover.background.filter-effects-info textview > text { +popover.background.filter-effects-info textview>text { background: none; } .dark .symbolsoverlay iconview:not(:selected) { - background-color: #f0f0f0; /* bright background color for typically black symbols */ + background-color: #f0f0f0; + /* bright background color for typically black symbols */ /* background-color: @theme_fg_color; - this doesn't work for some themes (like MonoThemeDark) */ - color:@theme_bg_color; /* symbol text labels */ + color: @theme_bg_color; + /* symbol text labels */ } .dark .symbolsoverlay { - color: @theme_bg_color; /* this is for overlay widget's children */ + color: @theme_bg_color; + /* this is for overlay widget's children */ } /* LPE Dialog add */ #LPEScrolled { - border:none; + border: none; } #LPESelectorFlowBox GtkFlowBoxChild, @@ -934,12 +1003,12 @@ popover.background.filter-effects-info textview > text { margin: 0px 0px 10px 0px; border-radius: 0px; border-width: 0 0 1px 0; - padding:5px; + padding: 5px; } -#LPESelectorFlowBox image{ - background-color:@theme_bg_color; - border-color:transparent; +#LPESelectorFlowBox image { + background-color: @theme_bg_color; + border-color: transparent; } #LPEExperimental image { @@ -953,29 +1022,29 @@ popover.background.filter-effects-info textview > text { } #LPEDialogSelector.LPEPackMore flowboxchild { -margin:5px 1px 0px; -padding:3px 3px 10px 3px; + margin: 5px 1px 0px; + padding: 3px 3px 10px 3px; } #LPEDialogSelector.LPEList .lpename { margin-bottom: 1px; - font-weight:bold; + font-weight: bold; } #LPEDialogSelector.LPEList flowboxchild { - padding:3px 1px 3px 10px; - margin:1px 0px 1px; - border-radius:0; - border-style:dotted; - border-color:@theme_fg_color; + padding: 3px 1px 3px 10px; + margin: 1px 0px 1px; + border-radius: 0; + border-style: dotted; + border-color: @theme_fg_color; border-width: 0 0 1px 0; } #LPEDialogSelector.LPEList flowboxchild:selected { - border-style:none; - margin:-3px 0px 0px; - padding:4px 1px 4px 10px; + border-style: none; + margin: -3px 0px 0px; + padding: 4px 1px 4px 10px; } #LPEDialogSelector.LPEList #LPESelectorFlowBox *:selected #LPESelectorEffectFavTop, @@ -984,132 +1053,139 @@ padding:3px 3px 10px 3px; } #LivePathEffect { - padding-top:5px; + padding-top: 5px; } -#LivePathEffect expander:focus, #LivePathEffect expander > label:focus{ - outline-width:0; +#LivePathEffect expander:focus, +#LivePathEffect expander>label:focus { + outline-width: 0; } -#LivePathEffect list{ - margin:5px 5px 0 5px; +#LivePathEffect list { + margin: 5px 5px 0 5px; } -#LivePathEffect list row{ - margin:0; - padding:0; - border-width:0; - border-style:none; - outline-width:0; +#LivePathEffect list row { + margin: 0; + padding: 0; + border-width: 0; + border-style: none; + outline-width: 0; } -#LivePathEffect list row > box{ - margin:0; - padding:1px; - border-width:1px; - border-radius:4px; - margin-bottom:5px; - border-style:solid; - border-color:@borders; - outline-width:0; + +#LivePathEffect list row>box { + margin: 0; + padding: 1px; + border-width: 1px; + border-radius: 4px; + margin-bottom: 5px; + border-style: solid; + border-color: @borders; + outline-width: 0; } -#LivePathEffect list row:last-child > box{ - margin-bottom:0px; +#LivePathEffect list row:last-child>box { + margin-bottom: 0px; } -#LPEEffectItem{ - border-radius:3px; - padding:2px; - outline:0; +#LPEEffectItem { + border-radius: 3px; + padding: 2px; + outline: 0; } #LPEEffectItem .minbutton { - padding:0; - margin:0; - outline:0; - border-color:@borders; + padding: 0; + margin: 0; + outline: 0; + border-color: @borders; } #LPEEffectItem expander title label { - min-height:26px; + min-height: 26px; } -#LPEEffectItem expander, +#LPEEffectItem expander, #LPEEffectItem expander *, -#LPEEffectItem expander:focus, +#LPEEffectItem expander:focus, #LPEEffectItem expander *:focus { - outline:0; + outline: 0; } -.LPEDrag,.LPEDrag:active,.LPEDrag:focus,.LPEDrag:hover { - margin:0; - padding:0; - border-style:none; - opacity:0.7; - background-color:transparent; - background-image:none; - outline:0; +.LPEDrag, +.LPEDrag:active, +.LPEDrag:focus, +.LPEDrag:hover { + margin: 0; + padding: 0; + border-style: none; + opacity: 0.7; + background-color: transparent; + background-image: none; + outline: 0; } .LPEDrag:hover { - opacity:1; - background-color:transparent; - background-image:none; + opacity: 1; + background-color: transparent; + background-image: none; } -#LivePathEffect list#LPEParentBox row{ - border-style:none; - outline:0; +#LivePathEffect list#LPEParentBox row { + border-style: none; + outline: 0; } -#LivePathEffect list#LPEParentBox row > button { - padding:2px; - margin:0; +#LivePathEffect list#LPEParentBox row>button { + padding: 2px; + margin: 0; } #LPEContainer:drop(active) { - box-shadow:none; + box-shadow: none; } -#LPECurrentItem *{ - color:@theme_fg_color; +#LPECurrentItem * { + color: @theme_fg_color; } -#LPEContainer #LPEListBox{ +#LPEContainer #LPEListBox { border-style: solid none solid none; border-color: @theme_base_color; - border-width:0; - padding:0; + border-width: 0; + padding: 0; } -#LPEListBox row:drop(active){ - box-shadow:none; + +#LPEListBox row:drop(active) { + box-shadow: none; } -#LPEContainer:drop(active).before row:first-child > box, -#LPEListBox row:drop(active).before > box{ - border-width:6px 1px 1px 1px; + +#LPEContainer:drop(active).before row:first-child>box, +#LPEListBox row:drop(active).before>box { + border-width: 6px 1px 1px 1px; border-color: @theme_selected_bg_color @borders @borders @borders; - box-shadow:none; - border-radius:6px 6px 0 0; + box-shadow: none; + border-radius: 6px 6px 0 0; } -#LPEContainer:drop(active).after row:last-child > box, -#LPEListBox row:drop(active).after > box{ - border-width:1px 1px 6px 1px; +#LPEContainer:drop(active).after row:last-child>box, +#LPEListBox row:drop(active).after>box { + border-width: 1px 1px 6px 1px; border-color: @borders @borders @theme_selected_bg_color @borders; - border-radius:0 0 6px 6px; - box-shadow:none; + border-radius: 0 0 6px 6px; + box-shadow: none; } #LPEEffectItem expander title label { - min-height:34px; + min-height: 34px; } #LPEMenu menuitem:not(.menu-category):disabled { - color:alpha(@theme_text_color,0.4); + color: alpha(@theme_text_color, 0.4); } -#LPEListBox row > *:disabled * { - color:@theme_text_color; +#LPEListBox row>*:disabled * { + color: @theme_text_color; } @@ -1121,44 +1197,49 @@ padding:3px 3px 10px 3px; #LivePathEffect list row .drag-icon, #LPEListBox row.activatable .drag-icon:hover { background-color: @theme_base_color; - border-width:1px; - border-radius:0; - margin:0; - padding:5px; - border-style:solid; - border-color:@borders; - outline-width:0; + border-width: 1px; + border-radius: 0; + margin: 0; + padding: 5px; + border-style: solid; + border-color: @borders; + outline-width: 0; } #LivePathEffect list row .drag-icon * { - outline:0; + outline: 0; } -#LPEActionButtons #eventbutton:nth-child(1) button{ - border-radius:3px 0 0 3px; - border-width:1px 0 1px 1px; +#LPEActionButtons #eventbutton:nth-child(1) button { + border-radius: 3px 0 0 3px; + border-width: 1px 0 1px 1px; } -#LPEActionButtons #eventbutton:nth-child(2) button{ - border-radius:0; - border-width:1px 0 1px 1px; +#LPEActionButtons #eventbutton:nth-child(2) button { + border-radius: 0; + border-width: 1px 0 1px 1px; } + #LPECurrentItem * { - border-width:0; - border-style:none; + border-width: 0; + border-style: none; } + #LPECurrentItem { - margin-top:0; + margin-top: 0; } -#LPECurrentItem image{ - margin-right:6px; + +#LPECurrentItem image { + margin-right: 6px; } + #LPECurrentItem { - margin-top:0; + margin-top: 0; } -#LPEParentBox{ - margin:10px 4px; - padding:0; + +#LPEParentBox { + margin: 10px 4px; + padding: 0; } /* min size for an angle slider in gradient editor */ @@ -1168,24 +1249,30 @@ padding:3px 3px 10px 3px; /* Gtk::PopoverMenu and Inkscape::UI::Widget::PopoverMenu */ /* Make it look basically like GtkMenu; see comments @ original merge request */ -popover.menu, /* GTK sets .menu/make_menuized_popover() sets .menuize */ -popover.popover-menu { /* Inkscape::UI::Widget::PopoverMenu */ +popover.menu, +/* GTK sets .menu/make_menuized_popover() sets .menuize */ +popover.popover-menu { + /* Inkscape::UI::Widget::PopoverMenu */ /* Rounded corners can glitch in GTK3 with submenus, and GtkMenu was square anyway = emulate */ border-radius: 0; border-color: @borders; padding: 0; } + popover.popover-menu contents { padding: 1px 0; } + popover.popover-menu menu { background: none; border: none; } + popover.popover-menu .menu-category { min-height: 16px; padding: 2px 10px; } + /* popover.menu modelbutton, */ popover.popover-menu .regular-item { border-radius: 0; @@ -1193,21 +1280,26 @@ popover.popover-menu .regular-item { min-height: 23px; padding: 2px 10px; } + popover.popover-menu menuitem:hover { background-color: @theme_selected_bg_color; color: @theme_selected_fg_color; } + popover.popover-menu menuitem:hover image { background-color: @theme_selected_bg_color; color: @theme_selected_fg_color; } + popover.popover-menu separator { margin: 1px 0; } + /* Defeat defaulting to having more spacing between RadioButtons than GtkMenu */ popover.popover-menu radiobutton { padding: 0; } + /* Emulate GtkMenu theming in absence of ability to change CSS node name, unlike our PopoverMenu */ /* popover.menu modelbutton:focus, popover.menu modelbutton:hover { @@ -1215,18 +1307,22 @@ popover.menu modelbutton:hover { color: @theme_selected_fg_color; } */ /* UGH! GtkMenuSectionBox has Widget:margin = 10px. Counteract to look like popover.popover-menu */ -popover.menu > stack > box { +popover.menu>stack>box { margin: -2px -6px; } + /* Detect submenu headings & replicate GTK .dim-label, looks nicer than leaving normal fg colour */ -popover.menu > stack > box > modelbutton:first-child > * /* Affect children not bgcolour */ -{ +popover.menu>stack>box>modelbutton:first-child>* + +/* Affect children not bgcolour */ + { opacity: 0.55; } /* regular popover that has no arrow and pretends to be a dropdown menu */ popover.popup-menu contents { - margin-top: 1px; /* distance from the bottom of the button above this menu */ + margin-top: 1px; + /* distance from the bottom of the button above this menu */ } /* darker background for extensions gallery due to fixed-color thumbnails (white background + drop shadow) */ @@ -1239,20 +1335,22 @@ popover.popup-menu contents { margin-top: 1px; margin-bottom: 1px; } + #tool-toolbar button { margin-left: 1px; margin-right: 1px; } + #tool-toolbar { - margin: 1px; /* toolbar box itself, so it has some breathing space; other toolbars have much larger margins */ + margin: 1px; + /* toolbar box itself, so it has some breathing space; other toolbars have much larger margins */ } /* used @ ui/themes to get correct foreground color; get_color() can be wrong */ /* Asterisks & stuff in the selectors are just to ensure sufficient priority. */ *.theme_fg_color, *.theme_fg_color:not(:backdrop), -*.theme_fg_color:backdrop -{ +*.theme_fg_color:backdrop { color: @theme_fg_color; } @@ -1261,21 +1359,20 @@ popover.popup-menu contents { Asterisks & stuff in the selectors are just to ensure sufficient priority. */ *.theme_bg_color, *.theme_bg_color:not(:backdrop), -*.theme_bg_color:backdrop -{ +*.theme_bg_color:backdrop { color: @theme_bg_color; } + *.theme_selected_bg_color, *.theme_selected_bg_color:not(:backdrop), -*.theme_selected_bg_color:backdrop -{ +*.theme_selected_bg_color:backdrop { color: @theme_selected_bg_color; } /* ColorSlider */ #ColorSlider { - min-width : 96px; - min-height: 8px; + min-width: 96px; + min-height: 8px; } #ColorPicker { @@ -1283,24 +1380,28 @@ popover.popup-menu contents { min-width: 24px; min-height: 24px; } -#ColorPicker > button { + +#ColorPicker>button { border-width: 0; padding: 0; } -#ColorPicker > .toggle { + +#ColorPicker>.toggle { border-width: 0; padding: 0; } /* ColorPreview */ #ColorPreview { - min-width : 16px; + min-width: 16px; min-height: 16px; } + #ColorPreview.simple { - min-width : 32px; + min-width: 32px; min-height: 12px; } + #ColorPreview:hover:not(.simple) { border-radius: 3px; border: solid @theme_selected_bg_color 1px; @@ -1308,32 +1409,35 @@ popover.popup-menu contents { /* GradientImage */ #GradientImage { - min-width : 54px; + min-width: 54px; min-height: 12px; } /* GradientWithStops */ #GradientEdit { - min-width : 60px; + min-width: 60px; /* widget's height; it should take stop template's height into account * current value is fine-tuned to make stop handles overlap gradient image * just the right amount */ min-height: 33px; } + /* focus outline, emulates style of GTKʼs Adwaita/Default CSS themeʼs outline */ #GradientEdit { - border: 1px dashed transparent; /* reserve space but donʼt draw til focus */ + border: 1px dashed transparent; + /* reserve space but donʼt draw til focus */ border-radius: 3px; padding: 3px; } + #GradientEdit:focus-within { border-color: alpha(@theme_fg_color, 0.3); } /* Canvas */ #InkscapeCanvas { - min-width : 256px; + min-width: 256px; min-height: 256px; } @@ -1346,8 +1450,9 @@ popover.popup-menu contents { frame.icon-preview { border-radius: 0; } + button.icon-preview { - min-width : 0; + min-width: 0; min-height: 0; padding: 5px; } @@ -1358,9 +1463,9 @@ frame.flat { } /*we dont want higlight with tab order only want checked ones */ -#ToolToolbar flowboxchild:selected { - background-color:transparent; - background-image:image(@theme_bg_color); +#ToolToolbar flowboxchild:selected { + background-color: transparent; + background-image: image(@theme_bg_color); } /* Adding some margins for popup dialogs, so the content is not touching the window borders */ @@ -1369,86 +1474,107 @@ frame.flat { } /* Tabs widget */ -#DocumentTab { padding: 3px; } +#DocumentTab { + padding: 3px; +} #DocumentTab:hover { - background-color:shade(@theme_bg_color, 0.97); + background-color: shade(@theme_bg_color, 0.97); } #DocumentTab.tab_active { box-shadow: inset 0 -2px @theme_selected_bg_color; - background-color:@theme_bg_color; + background-color: @theme_bg_color; } -#DocumentTabsWidget { box-shadow: none; } +#DocumentTabsWidget { + box-shadow: none; +} @keyframes pulse-border { - 0% { - box-shadow: inset alpha(@theme_selected_bg_color, 0.4) 0px 0px 2px 1px; - } - 50% { - box-shadow: inset @theme_selected_bg_color 0px 0px 6px 2px; - } - 100% { - box-shadow: inset alpha(@theme_selected_bg_color, 0.4) 0px 0px 2px 1px; - } + 0% { + box-shadow: inset alpha(@theme_selected_bg_color, 0.4) 0px 0px 2px 1px; + } + + 50% { + box-shadow: inset @theme_selected_bg_color 0px 0px 6px 2px; + } + + 100% { + box-shadow: inset alpha(@theme_selected_bg_color, 0.4) 0px 0px 2px 1px; + } } -#DocumentTabsWidget.drop-highlight > #Overlay { - box-shadow: inset @theme_selected_bg_color 0px 0px 5px 1px; - animation-name: pulse-border; - animation-duration: 1s; - animation-timing-function: ease; - animation-iteration-count: infinite; +#DocumentTabsWidget.drop-highlight>#Overlay { + box-shadow: inset @theme_selected_bg_color 0px 0px 5px 1px; + animation-name: pulse-border; + animation-duration: 1s; + animation-timing-function: ease; + animation-iteration-count: infinite; } /*helper info in popover menu*/ -.menu_search{ - background-color:alpha(@theme_fg_color,0.1); - margin:0 0 -8px -8px; +.menu_search { + background-color: alpha(@theme_fg_color, 0.1); + margin: 0 0 -8px -8px; } /* limit height of list view items */ -columnview.list-view-small > listview > row > cell { +columnview.list-view-small>listview>row>cell { padding: 5px; } /* gridview items with smaller margins */ -gridview.grid-view-small > child box.item-box { +gridview.grid-view-small>child box.item-box { padding: 0; margin: 8px; border-spacing: 8px; } /* list view with items based on labels need some extra vertical space */ -listview.list-view-small > row > box.item-box { +listview.list-view-small>row>box.item-box { margin-top: 3px; margin-bottom: 3px; } -listview.list-view-small > row > box.item-box.separator { +listview.list-view-small>row>box.item-box.separator { margin: 1px; } /* About screen slide show transitions >>>>>>>>>>>>>>>>>>>>>>>>> */ @keyframes fade_in_opacity { - 0% { opacity: 0; } - 100% { opacity: 1; } + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } } + @keyframes fade_out_opacity { - 0% { opacity: 1; } - 100% { opacity: 0; } + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } } + .fade-in { animation: 1.2s fade_in_opacity 0s both; } + .fade-out { animation: 1.2s fade_out_opacity 0s both; } + .background-transition { transition-property: background-color; transition-duration: 1.2s; } + /* <<<<<<<<<<<<<<<<<<<<<<<< About screen slide show transitions */ /* Grid definition panel/box in document properties dialog */ @@ -1484,6 +1610,7 @@ separator.faint { #ColorPlate.rectangular { min-height: 160px; } + #ColorPlate.circular { min-height: 300px; } @@ -1497,17 +1624,18 @@ separator.faint { /* Simple decorators for resizing handles giving them borders */ #MultipanedHandle.horizontal { background-image: linear-gradient(to right, - alpha(@theme_fg_color, 0.25) 0%, - @theme_bg_color 10%, - @theme_bg_color 90%, - alpha(@theme_fg_color, 0.25) 100%); + alpha(@theme_fg_color, 0.25) 0%, + @theme_bg_color 10%, + @theme_bg_color 90%, + alpha(@theme_fg_color, 0.25) 100%); } + #MultipanedHandle.vertical { background-image: linear-gradient(to bottom, - alpha(@theme_fg_color, 0.25) 0%, - @theme_bg_color 10%, - @theme_bg_color 90%, - alpha(@theme_fg_color, 0.25) 100%); + alpha(@theme_fg_color, 0.25) 0%, + @theme_bg_color 10%, + @theme_bg_color 90%, + alpha(@theme_fg_color, 0.25) 100%); } /* Adds an exception to StartScreen recent files tab @@ -1544,32 +1672,40 @@ listview row.top-separator { min-height: calc(2em + 4px); padding: 0 4px; } + #SimpleTab { min-width: 4em; min-height: calc(2em + 4px); } + #SimpleTab:hover { box-shadow: inset 0 -3px alpha(@theme_fg_color, 0.15); } + #SimpleTab.tab-active { background-color: @theme_base_color; box-shadow: inset 0 -3px @theme_selected_bg_color, inset -1px 0 alpha(@theme_fg_color, 0.10), - inset 1px 0 alpha(@theme_fg_color, 0.10); + inset 1px 0 alpha(@theme_fg_color, 0.10); } + #SimpleTab.tab-active:hover { /*border-bottom-color: @theme_selected_bg_color;*/ } + #NewTabButton { margin-left: 3px; } + #DialogMenuButton { margin-left: 3px; } /* Some themes add color decoration for active drop targets; we use our own highlight, so disable them */ -#MultipanedDropZone:drop(active), #MultipanedDropZone:drop(active):focus, - #DialogMultipaned:drop(active), #DialogMultipaned:drop(active):focus { +#MultipanedDropZone:drop(active), +#MultipanedDropZone:drop(active):focus, +#DialogMultipaned:drop(active), +#DialogMultipaned:drop(active):focus { box-shadow: none; } @@ -1597,3 +1733,8 @@ button#recolored:hover { border: 2px solid @theme_selected_bg_color; border-radius: 4px; } + +#recolor-art { + min-width: 400px; + min-height: 500px; +} \ No newline at end of file diff --git a/src/ui/dialog/fill-and-stroke.cpp b/src/ui/dialog/fill-and-stroke.cpp index e423779dfa..02de1d41d0 100644 --- a/src/ui/dialog/fill-and-stroke.cpp +++ b/src/ui/dialog/fill-and-stroke.cpp @@ -42,15 +42,11 @@ FillAndStroke::FillAndStroke() , _page_fill(Gtk::make_managed(1, 1)) , _page_stroke_paint(Gtk::make_managed(1, 1)) , _page_stroke_style(Gtk::make_managed(1, 1)) - , _page_recolor_art(Gtk::make_managed(1, 1)) , _composite_settings(INKSCAPE_ICON("dialog-fill-and-stroke"), "fillstroke", UI::Widget::SimpleFilterModifier::ISOLATION | UI::Widget::SimpleFilterModifier::BLEND | UI::Widget::SimpleFilterModifier::BLUR | UI::Widget::SimpleFilterModifier::OPACITY) , fillWdgt(nullptr) , strokeWdgt(nullptr) - , recolorArtWdgt(nullptr) - , recolorButtonTriger(Gtk::make_managed()) - , recolorPopOver(Gtk::make_managed()) { set_spacing(2); UI::pack_start(*this, _notebook, true, true); @@ -59,8 +55,6 @@ FillAndStroke::FillAndStroke() _notebook.append_page(*_page_stroke_paint, _createPageTabLabel(_("Stroke _paint"), INKSCAPE_ICON("object-stroke"))); _notebook.append_page(*_page_stroke_style, _createPageTabLabel(_("Stroke st_yle"), INKSCAPE_ICON("object-stroke-style"))); - // _notebook.append_page(*_page_recolor_art, _createPageTabLabel(_("Recolor"), - // INKSCAPE_ICON("object-recolor-art"))); _notebook.set_vexpand(true); _switch_page_conn = _notebook.signal_switch_page().connect(sigc::mem_fun(*this, &FillAndStroke::_onSwitchPage)); @@ -68,16 +62,6 @@ FillAndStroke::FillAndStroke() _layoutPageFill(); _layoutPageStrokePaint(); _layoutPageStrokeStyle(); - _layoutPageRecolorArt(); - - recolorButtonTriger->set_label("Recolor Selection"); - recolorButtonTriger->signal_clicked().connect([this]() { - recolorPopOver->popup(); - recolorArtWdgt->performUpdate(); - }); - recolorPopOver->set_parent(*recolorButtonTriger); - recolorPopOver->set_child(*_page_recolor_art); - UI::pack_end(*this, _composite_settings, UI::PackOptions::shrink); _composite_settings.setSubject(&_subject); @@ -90,22 +74,16 @@ FillAndStroke::~FillAndStroke() fillWdgt->setDesktop(nullptr); strokeWdgt->setDesktop(nullptr); strokeStyleWdgt->setDesktop(nullptr); - recolorArtWdgt->setDesktop(nullptr); _subject.setDesktop(nullptr); } void FillAndStroke::selectionChanged(Selection *selection) { - if (selection->size() <= 1) - recolorButtonTriger->hide(); - else - recolorButtonTriger->show(); if (!page_changed) { changed_fill = true; changed_stroke = true; changed_stroke_style = true; - changed_recolor_art = true; } if (fillWdgt && npage == 0) { fillWdgt->performUpdate(); @@ -116,10 +94,7 @@ void FillAndStroke::selectionChanged(Selection *selection) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionChangedCB(); } - // if (recolorArtWdgt && npage == 3) { - // // if (!recolorArtWdgt->isInPreviewMode()) - // recolorArtWdgt->performUpdate(); - // } + } void FillAndStroke::selectionModified(Selection *selection, guint flags) @@ -127,7 +102,6 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) changed_fill = true; changed_stroke = true; changed_stroke_style = true; - changed_recolor_art = true; if (fillWdgt && npage == 0) { fillWdgt->selectionModifiedCB(flags); } @@ -137,11 +111,7 @@ void FillAndStroke::selectionModified(Selection *selection, guint flags) if (strokeStyleWdgt && npage == 2) { strokeStyleWdgt->selectionModifiedCB(flags); } - // if (recolorArtWdgt && npage == 3) { - // if (!recolorArtWdgt->isInPreviewMode()) { - // recolorArtWdgt->performUpdate(); - // } - // } + } void FillAndStroke::desktopReplaced() @@ -149,7 +119,6 @@ void FillAndStroke::desktopReplaced() changed_fill = true; changed_stroke = true; changed_stroke_style = true; - changed_recolor_art = true; if (fillWdgt) { fillWdgt->setDesktop(getDesktop()); } @@ -159,9 +128,7 @@ void FillAndStroke::desktopReplaced() if (strokeStyleWdgt) { strokeStyleWdgt->setDesktop(getDesktop()); } - if (recolorArtWdgt) { - recolorArtWdgt->setDesktop(getDesktop()); - } + _subject.setDesktop(getDesktop()); } @@ -179,9 +146,6 @@ void FillAndStroke::_onSwitchPage(Gtk::Widget *page, guint pagenum) } else if (npage == 2 && changed_stroke_style) { update = true; changed_stroke_style = false; - } else if (npage == 3 && changed_recolor_art) { - update = true; - changed_recolor_art = false; } if (update) { page_changed = true; @@ -203,7 +167,6 @@ void FillAndStroke::_layoutPageFill() { fillWdgt = Gtk::make_managed(FILL); _page_fill->table().attach(*fillWdgt, 0, 0, 1, 1); - _page_fill->append(*recolorButtonTriger); } void FillAndStroke::_layoutPageStrokePaint() @@ -219,14 +182,6 @@ void FillAndStroke::_layoutPageStrokeStyle() strokeStyleWdgt->set_halign(Gtk::Align::START); _page_stroke_style->table().attach(*strokeStyleWdgt, 0, 0, 1, 1); } -void FillAndStroke::_layoutPageRecolorArt() -{ - recolorArtWdgt = Gtk::make_managed(); - recolorArtWdgt->set_hexpand(); - recolorArtWdgt->set_halign(Gtk::Align::FILL); - _page_recolor_art->table().attach(*recolorArtWdgt, 0, 0, 1, 1); -} - void FillAndStroke::showPageFill() { blink(); @@ -248,12 +203,6 @@ void FillAndStroke::showPageStrokeStyle() _savePagePref(2); } -void FillAndStroke::showPageRecolorArt() -{ - blink(); - _notebook.set_current_page(3); - _savePagePref(3); -} Gtk::Box &FillAndStroke::_createPageTabLabel(Glib::ustring const &label, char const *label_image) { diff --git a/src/ui/dialog/fill-and-stroke.h b/src/ui/dialog/fill-and-stroke.h index 85d9630ea4..29c3ba92b4 100644 --- a/src/ui/dialog/fill-and-stroke.h +++ b/src/ui/dialog/fill-and-stroke.h @@ -49,7 +49,6 @@ public: void showPageFill(); void showPageStrokePaint(); void showPageStrokeStyle(); - void showPageRecolorArt(); protected: Gtk::Notebook _notebook; @@ -57,7 +56,6 @@ protected: UI::Widget::NotebookPage *_page_fill = nullptr; UI::Widget::NotebookPage *_page_stroke_paint = nullptr; UI::Widget::NotebookPage *_page_stroke_style = nullptr; - UI::Widget::NotebookPage *_page_recolor_art = nullptr; UI::Widget::StyleSubject::Selection _subject; UI::Widget::ObjectCompositeSettings _composite_settings; @@ -68,7 +66,6 @@ protected: void _layoutPageFill(); void _layoutPageStrokePaint(); void _layoutPageStrokeStyle(); - void _layoutPageRecolorArt(); void _savePagePref(guint page_num); void _onSwitchPage(Gtk::Widget *page, guint pagenum); @@ -80,13 +77,10 @@ private: bool changed_fill = true; bool changed_stroke = true; bool changed_stroke_style = true; - bool changed_recolor_art = true; UI::Widget::FillNStroke *fillWdgt = nullptr; UI::Widget::FillNStroke *strokeWdgt = nullptr; UI::Widget::StrokeStyle *strokeStyleWdgt = nullptr; - UI::Widget::RecolorArt *recolorArtWdgt = nullptr; - Gtk::Button *recolorButtonTriger = nullptr; - Gtk::Popover* recolorPopOver=nullptr; + sigc::scoped_connection _switch_page_conn; }; diff --git a/src/ui/widget/paint-selector.cpp b/src/ui/widget/paint-selector.cpp index 5ad356bd70..d3a34ead5b 100644 --- a/src/ui/widget/paint-selector.cpp +++ b/src/ui/widget/paint-selector.cpp @@ -57,6 +57,7 @@ #include "ui/widget/gradient-editor.h" #include "ui/widget/gradient-selector.h" #include "ui/widget/pattern-editor.h" +#include "ui/widget/recolor-art.h" #include "ui/widget/swatch-selector.h" #include "widgets/widget-sizes.h" #include "xml/repr.h" @@ -135,6 +136,9 @@ GradientSelectorInterface *PaintSelector::getGradientFromData() const PaintSelector::PaintSelector(FillOrStroke kind, std::shared_ptr colors) : _selected_colors(std::move(colors)) + ,recolorArtWdgt(Gtk::make_managed()) + ,recolorButtonTriger(Gtk::make_managed()) + , recolorPopOver(Gtk::make_managed()) { set_orientation(Gtk::Orientation::VERTICAL); @@ -205,6 +209,16 @@ PaintSelector::PaintSelector(FillOrStroke kind, std::shared_ptrsignal_released.connect(sigc::mem_fun(*this, &PaintSelector::onSelectedColorReleased)); _selected_colors->signal_changed.connect(sigc::mem_fun(*this, &PaintSelector::onSelectedColorChanged)); + recolorButtonTriger->set_label("Recolor Selection"); + recolorButtonTriger->set_hexpand(false); + recolorButtonTriger->signal_clicked().connect([this]() { + recolorPopOver->popup(); + recolorArtWdgt->performUpdate(); + }); + recolorPopOver->set_parent(*recolorButtonTriger); + recolorPopOver->set_child(*recolorArtWdgt); + recolorPopOver->set_position(Gtk::PositionType::LEFT); + _frame->append(*recolorButtonTriger); // from _new function setMode(PaintSelector::MODE_MULTIPLE); diff --git a/src/ui/widget/paint-selector.h b/src/ui/widget/paint-selector.h index f76eda68f6..41a0e4a674 100644 --- a/src/ui/widget/paint-selector.h +++ b/src/ui/widget/paint-selector.h @@ -42,6 +42,7 @@ class SPStyle; namespace Gtk { class Label; class ToggleButton; +class Popover; } // namespace Gtk namespace Inkscape::UI::Widget { @@ -50,6 +51,7 @@ class FillRuleRadioButton; class GradientEditor; class PatternEditor; class StyleToggleButton; +class RecolorArt; /** * Generic paint selector widget. @@ -103,6 +105,10 @@ class PaintSelector : public Gtk::Box { SwatchSelector *_selector_swatch = nullptr; PatternEditor* _selector_pattern = nullptr; + UI::Widget::RecolorArt *recolorArtWdgt = nullptr; + Gtk::Button *recolorButtonTriger = nullptr; + Gtk::Popover* recolorPopOver=nullptr; + Gtk::Label *_label; GtkWidget *_patternmenu = nullptr; bool _patternmenu_update = false; diff --git a/src/ui/widget/recolor-art.cpp b/src/ui/widget/recolor-art.cpp index ac9788db23..b66164d0b8 100644 --- a/src/ui/widget/recolor-art.cpp +++ b/src/ui/widget/recolor-art.cpp @@ -26,6 +26,7 @@ #include "document-undo.h" #include "document.h" #include "gradient-chemistry.h" +#include "inkscape.h" #include "object/sp-defs.h" #include "object/sp-gradient.h" #include "object/sp-linear-gradient.h" @@ -67,7 +68,7 @@ RecolorArt::RecolorArt() _notebook = _builder->get_widget("list-wheel-box"); _color_wheel_page = _builder->get_widget("color-wheel-page"); - _notebook->signal_switch_page().connect([this](Gtk::Widget* page, guint page_num) { + _notebook->signal_switch_page().connect([this](Gtk::Widget *page, guint page_num) { int wheel_index = _notebook->page_num(*_color_wheel_page); if (static_cast(page_num) == wheel_index) { @@ -91,11 +92,9 @@ RecolorArt::RecolorArt() auto recolored = Gtk::make_managed(); original->set_hexpand(true); - recolored->set_hexpand(true); - arrow->set_use_markup(true); arrow->set_width_chars(6); arrow->set_markup(""); @@ -162,7 +161,7 @@ RecolorArt::RecolorArt() onOriginalColorClicked(color_item->key); }); - + _desktop = SP_ACTIVE_DESKTOP; // _apply = _builder->get_widget("apply"); // _apply->signal_clicked().connect(sigc::mem_fun(*this, &RecolorArt::_onApplyButtonClicked)); } @@ -415,8 +414,7 @@ void RecolorArt::onResetClicked() colorButtons(btns.second, key); } - for(auto i =0; i<_color_model->get_n_items();i++) - { + for (auto i = 0; i < _color_model->get_n_items(); i++) { auto item = _color_model->get_item(i); auto color_item = std::dynamic_pointer_cast(item); color_item->new_color = color_item->key; @@ -485,16 +483,20 @@ void RecolorArt::performUpdate() _last_original_button = nullptr; _last_recolored_button = nullptr; // _current_color_id = ""; - if (auto selection = _desktop->getSelection()) { - std::vector vec(selection->items().begin(), selection->items().end()); - collectColors(vec); - if (!_selected_colors.empty()) { - generateVisualList(); - auto first_button_id = buttons.begin()->first; - onOriginalColorClicked(first_button_id); + if (_desktop) { + if (auto selection = _desktop->getSelection()) { + std::vector vec(selection->items().begin(), selection->items().end()); + collectColors(vec); + if (!_selected_colors.empty()) { + generateVisualList(); + auto first_button_id = buttons.begin()->first; + onOriginalColorClicked(first_button_id); + } } + g_message("Performing Update\n"); } - g_message("Performing Update\n"); + else + g_message("Desktop is NULL in Performupdate in recolor widegt\n"); } } // namespace Widget } // namespace UI -- GitLab