From eea5f8004378a92e5b6640f2c476995c028a5692 Mon Sep 17 00:00:00 2001 From: Wen-Wei Kao Date: Sun, 2 Nov 2025 03:56:06 +0800 Subject: [PATCH] Add canvas color options to preferences --- src/ui/dialog/inkscape-preferences.cpp | 51 ++++++++++++++++++++++++++ src/ui/dialog/inkscape-preferences.h | 25 +++++++++++++ src/ui/widget/preferences-widget.cpp | 9 ++++- src/ui/widget/preferences-widget.h | 3 +- 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/src/ui/dialog/inkscape-preferences.cpp b/src/ui/dialog/inkscape-preferences.cpp index 6ebb4de37d..1a446610ca 100644 --- a/src/ui/dialog/inkscape-preferences.cpp +++ b/src/ui/dialog/inkscape-preferences.cpp @@ -1189,6 +1189,18 @@ void InkscapePreferences::initPageTools() #endif // WITH_LPETOOL } +void InkscapePreferences::toggleCanvasCustomColors() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + if (prefs->getBool("/theme/useCanvasCustomColors", false)) { + _canvas_preset_colors.set_visible(false); + _canvas_custom_colors.set_visible(true); + } else { + _canvas_preset_colors.set_visible(true); + _canvas_custom_colors.set_visible(false); + } +} + void InkscapePreferences::get_highlight_colors(guint32 &colorsetbase, guint32 &colorsetsuccess, guint32 &colorsetwarning, guint32 &colorseterror) { @@ -1331,6 +1343,13 @@ void InkscapePreferences::resetIconsColors(bool themechange) void InkscapePreferences::resetIconsColorsWrapper() { resetIconsColors(false); } +void InkscapePreferences::changeCanvasColors() +{ + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); + prefs->setDouble("/template/base/pageopacity", _canvas_page_color.get_current_color().getOpacity()); + prefs->setDouble("/template/base/borderopacity", _canvas_border_color.get_current_color().getOpacity()); +} + void InkscapePreferences::changeIconsColors() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -1817,6 +1836,38 @@ void InkscapePreferences::initPageUI() _dark_theme.signal_toggled().connect(sigc::mem_fun(*this, &InkscapePreferences::preferDarkThemeChange)); + // Canvas + _page_theme.add_group_header(_("Canvas")); + + // initialize canvas colors + _canvas_use_custom_colors.init(_("Set custom canvas colors"), "/theme/useCanvasCustomColors", false); + _canvas_use_custom_colors.signal_toggled().connect(sigc::mem_fun(*this, &InkscapePreferences::toggleCanvasCustomColors)); + _page_theme.add_line(false, "", _canvas_use_custom_colors, "", _("Whether to set custom canvas colors instead of using preset colors")); + + _canvas_page_color.init(_("Canvas page color"), "/template/base/pagecolor", "#ffffff00", true); + _canvas_border_color.init(_("Canvas border color"), "/template/base/bordercolor", "#999999ff", true); + _canvas_desk_color.init(_("Canvas desk color"), "/template/base/deskcolor", "#d1d1d1ff", true); + _canvas_checkerboard.init(_("Checkerboard"), "/template/base/pagecheckerboard", false); + auto const changeCanvasColor = sigc::hide(sigc::mem_fun(*this, &InkscapePreferences::changeCanvasColors)); + _canvas_page_color.connectChanged(changeCanvasColor); + _canvas_border_color.connectChanged(changeCanvasColor); + auto const label_page = Gtk::make_managed(_("Page")); + auto const label_border = Gtk::make_managed(_("Border")); + auto const label_desk = Gtk::make_managed(_("Desk")); + UI::pack_start(_canvas_custom_colors, _canvas_page_color, true, true, 4); + UI::pack_start(_canvas_custom_colors, *label_page, true, true, 4); + UI::pack_start(_canvas_custom_colors, _canvas_border_color, true, true, 4); + UI::pack_start(_canvas_custom_colors, *label_border, true, true, 4); + UI::pack_start(_canvas_custom_colors, _canvas_desk_color, true, true, 4); + UI::pack_start(_canvas_custom_colors, *label_desk, true, true, 4); + UI::pack_start(_canvas_custom_colors, _canvas_checkerboard, true, true, 4); + _canvas_colors.append(_canvas_preset_colors); + _canvas_colors.append(_canvas_custom_colors); + _canvas_colors.set_orientation(Gtk::Orientation::VERTICAL); + toggleCanvasCustomColors(); + changeCanvasColors(); + _page_theme.add_line(false, _("Default colors:"), _canvas_colors, "", _("Default canvas colors"), false, reset_icon()); + // Icons _page_theme.add_group_header(_("Icons")); { diff --git a/src/ui/dialog/inkscape-preferences.h b/src/ui/dialog/inkscape-preferences.h index 2dcce2619f..4a205ea444 100644 --- a/src/ui/dialog/inkscape-preferences.h +++ b/src/ui/dialog/inkscape-preferences.h @@ -266,9 +266,32 @@ protected: UI::Widget::PrefCheckButton _cp_show_full_action_name; UI::Widget::PrefCheckButton _cp_show_untranslated_name; + /** + * Gio::ListStore for canvas options + */ + // struct CanvasColorChoice : Glib::Object { + // Glib::ustring name; + // Glib::ustring label; + // Glib::ustring preview; + // Gdk::RGBA pagecolor; + // bool checkered; + // Gdk::RGBA bordercolor; + // bool shadow; + // Gdk::RGBA deskcolor; + // }; + // Gio::ListStore _canvas_preset_color_list; + UI::Widget::PrefCombo _gtk_theme; UI::Widget::PrefOpenFolder _sys_user_themes_dir_copy; UI::Widget::PrefOpenFolder _sys_user_icons_dir_copy; + UI::Widget::PrefCheckButton _canvas_use_custom_colors; + Gtk::Box _canvas_colors; + UI::Widget::PrefCombo _canvas_preset_colors; + Gtk::Box _canvas_custom_colors; + UI::Widget::PrefColorPicker _canvas_page_color; + UI::Widget::PrefColorPicker _canvas_border_color; + UI::Widget::PrefColorPicker _canvas_desk_color; + UI::Widget::PrefCheckButton _canvas_checkerboard; UI::Widget::PrefCombo _icon_theme; UI::Widget::PrefCheckButton _dark_theme; UI::Widget::PrefSlider _contrast_theme; @@ -696,8 +719,10 @@ private: void comboThemeChange(); void contrastThemeChange(); void preferDarkThemeChange(); + void toggleCanvasCustomColors(); void symbolicThemeCheck(); void toggleSymbolic(); + void changeCanvasColors(); void changeIconsColors(); void resetIconsColors(bool themechange = false); void resetIconsColorsWrapper(); diff --git a/src/ui/widget/preferences-widget.cpp b/src/ui/widget/preferences-widget.cpp index 16c73f91cf..deaa314b31 100644 --- a/src/ui/widget/preferences-widget.cpp +++ b/src/ui/widget/preferences-widget.cpp @@ -1084,9 +1084,10 @@ void PrefMultiEntry::on_changed() } void PrefColorPicker::init(Glib::ustring const &label, Glib::ustring const &prefs_path, - std::string const &default_color) + std::string const &default_color, bool is_string) { _prefs_path = prefs_path; + if (is_string) {_is_string = is_string;} setTitle(label); Inkscape::Preferences *prefs = Inkscape::Preferences::get(); setColor(prefs->getColor(_prefs_path, default_color)); @@ -1096,7 +1097,11 @@ void PrefColorPicker::on_changed(Inkscape::Colors::Color const &color) { if (this->get_visible()) { //only take action if the user toggled it Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - prefs->setColor(_prefs_path, color); + if (_is_string) { + prefs->setString(_prefs_path, color.toString()); + } else { + prefs->setColor(_prefs_path, color); + } } } diff --git a/src/ui/widget/preferences-widget.h b/src/ui/widget/preferences-widget.h index 443beac31b..515a18254b 100644 --- a/src/ui/widget/preferences-widget.h +++ b/src/ui/widget/preferences-widget.h @@ -320,10 +320,11 @@ public: ~PrefColorPicker() override = default;; void init(Glib::ustring const &abel, Glib::ustring const &prefs_path, - std::string const &default_color); + std::string const &default_color, bool is_string = false); private: Glib::ustring _prefs_path; + bool _is_string; void on_changed(Inkscape::Colors::Color const &color) override; }; -- GitLab