From b74b4a14329502369956bd7df311e479ef0c62db Mon Sep 17 00:00:00 2001 From: KrIr17 Date: Fri, 21 Feb 2025 09:54:22 +0530 Subject: [PATCH 1/4] Add missing "win." to layer actions Objects dialog Post GTK4 migration, InkscapeWindow::activate_action needs "win." prefix to work. These were likely missed because they did not directly call the fucntion. --- src/ui/dialog/objects.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index b98beaa2e0..f0810bf1d0 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -752,13 +752,13 @@ ObjectsPanel::ObjectsPanel() auto& _move_down_button = get_widget(_builder, "move-down"); auto& _object_delete_button = get_widget(_builder, "remove-object"); _move_up_button.signal_clicked().connect([this]() { - _activateAction("layer-raise", "selection-stack-up"); + _activateAction("win.layer-raise", "selection-stack-up"); }); _move_down_button.signal_clicked().connect([this]() { - _activateAction("layer-lower", "selection-stack-down"); + _activateAction("win.layer-lower", "selection-stack-down"); }); _object_delete_button.signal_clicked().connect([this]() { - _activateAction("layer-delete", "delete-selection"); + _activateAction("win.layer-delete", "delete-selection"); }); //Label @@ -1412,34 +1412,34 @@ bool ObjectsPanel::on_tree_key_pressed(Gtk::EventControllerKey const &controller case GDK_KEY_Delete: case GDK_KEY_KP_Delete: case GDK_KEY_BackSpace: - _activateAction("layer-delete", "delete-selection"); + _activateAction("win.layer-delete", "delete-selection"); // NOTE: We could select a sibling object here to make deleting many objects easier. return true; case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up: if (shift) { - _activateAction("layer-top", "selection-top"); + _activateAction("win.layer-top", "selection-top"); return true; } break; case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down: if (shift) { - _activateAction("layer-bottom", "selection-bottom"); + _activateAction("win.layer-bottom", "selection-bottom"); return true; } break; case GDK_KEY_Up: case GDK_KEY_KP_Up: if (shift) { - _activateAction("layer-raise", "selection-stack-up"); + _activateAction("win.layer-raise", "selection-stack-up"); return true; } break; case GDK_KEY_Down: case GDK_KEY_KP_Down: if (shift) { - _activateAction("layer-lower", "selection-stack-down"); + _activateAction("win.layer-lower", "selection-stack-down"); return true; } case GDK_KEY_Return: -- GitLab From 1bcac8563976eb29d687ffcece59295b15dbea5a Mon Sep 17 00:00:00 2001 From: KrIr17 Date: Fri, 21 Feb 2025 18:04:56 +0530 Subject: [PATCH 2/4] Fix pixel shift in Objects dialog on hover The treeview's view attribute affects the entire treeview instead of just the rows in GTK4. This attempts to 'fix' it by manually updating row backgrounds. --- share/ui/style.css | 5 ----- src/ui/dialog/objects.cpp | 15 +++++++++++++++ src/ui/dialog/objects.h | 2 ++ 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/share/ui/style.css b/share/ui/style.css index ce36bed05c..9eeb998ec8 100644 --- a/share/ui/style.css +++ b/share/ui/style.css @@ -470,11 +470,6 @@ SPCanvas { outline-width: 5px; outline-color: alpha(@theme_fg_color, 0.1); } -#ObjectsTreeView.view:hover { - border-color: alpha(@theme_fg_color, 0.1); - border-style: solid; - border-width: 1px 0px; -} #Objects .search { padding: 2px 4px; min-height: 16px; diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index f0810bf1d0..fa4084ea0b 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -93,6 +93,8 @@ static double const SELECTED_ALPHA[16] = { 0.90, //15 1, 2 , 4 and 8 }; +static double const HOVER_ALPHA = 0.10; + namespace Inkscape::UI::Dialog { namespace { @@ -1503,6 +1505,14 @@ void ObjectsPanel::on_motion_motion(Gtk::EventControllerMotion const *controller if (auto row = *_store->get_iter(_hovered_row_ref.get_path())) { row[_model->_colHover] = false; row[_model->_colHoverColor] = false; + // selection etc. might change _colBgColor. Erase hover + // highlight only if it hasn't changed + if (row[_model->_colBgColor] == _hovered_row_color) { + row[_model->_colBgColor] = _hovered_row_old_color; + } + else { // update row's slection color if it has changed + _hovered_row_old_color = row[_model->_colBgColor]; + } } } @@ -1529,6 +1539,11 @@ void ObjectsPanel::on_motion_motion(Gtk::EventControllerMotion const *controller if (auto row = *_store->get_iter(path)) { row[_model->_colHover] = true; _hovered_row_ref = Gtk::TreeModel::RowReference(_store, path); + // update color for hovered row + const Gdk::RGBA color = row[_model->_colBgColor]; // current color + _hovered_row_old_color = color; // store old color + _hovered_row_color = change_alpha(color, color.get_alpha() + HOVER_ALPHA); + row[_model->_colBgColor] = _hovered_row_color; if (col == _color_tag_column) { row[_model->_colHoverColor] = true; diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h index fa5302526f..7b18f8da49 100644 --- a/src/ui/dialog/objects.h +++ b/src/ui/dialog/objects.h @@ -134,6 +134,8 @@ private: sigc::scoped_connection layer_changed; SPObject *_layer; Gtk::TreeModel::RowReference _hovered_row_ref; + Gdk::RGBA _hovered_row_color; + Gdk::RGBA _hovered_row_old_color; //Show icons in the context menu bool _show_contextmenu_icons; -- GitLab From de593829e71776c38e0353f5a904b4069dbc5cbb Mon Sep 17 00:00:00 2001 From: KrIr17 Date: Fri, 21 Feb 2025 20:18:49 +0530 Subject: [PATCH 3/4] Do not select layer on first click Layers should be made active (or set as current) on the first click, not selected. Fixes https://gitlab.com/inkscape/inbox/-/issues/11687 --- src/ui/dialog/objects.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index fa4084ea0b..5e10807093 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -1686,6 +1686,7 @@ Gtk::EventSequenceState ObjectsPanel::on_click(Gtk::GestureClick const &gesture, auto layer = Inkscape::LayerManager::asLayer(item); auto const state = gesture.get_current_event_state(); + // returns true if layer has to be set as active but not selected auto const should_set_current_layer = [&] { if (!layer) { return false; @@ -1731,7 +1732,6 @@ Gtk::EventSequenceState ObjectsPanel::on_click(Gtk::GestureClick const &gesture, UI::popup_at(*menu, _tree, ex, ey); } else if (should_set_current_layer()) { getDesktop()->layerManager().setCurrentLayer(item, true); - selection->set(item); _initial_path = path; } else { selectCursorItem(state); -- GitLab From 7aac4838824f252e98d4723827b5c7e1ed06af3b Mon Sep 17 00:00:00 2001 From: KrIr17 Date: Mon, 24 Feb 2025 07:40:16 +0530 Subject: [PATCH 4/4] Fix tag color selector in objects dialog Add a color picker popup to change tag color, removing old color picker. Also fixes a rendering issue with the tag color. --- src/ui/dialog/objects.cpp | 48 ++++++++++++++++---------- src/ui/dialog/objects.h | 7 ++-- src/ui/widget/objects-dialog-cells.cpp | 6 ++-- 3 files changed, 38 insertions(+), 23 deletions(-) diff --git a/src/ui/dialog/objects.cpp b/src/ui/dialog/objects.cpp index 5e10807093..a2606d6098 100644 --- a/src/ui/dialog/objects.cpp +++ b/src/ui/dialog/objects.cpp @@ -726,10 +726,10 @@ ObjectsPanel::ObjectsPanel() , _layer(nullptr) , _is_editing(false) , _page(Gtk::Orientation::VERTICAL) - , _color_picker(_("Highlight color"), "", Colors::Color(0x000000ff), true) , _builder(create_builder("dialog-objects.glade")) , _settings_menu(get_widget(_builder, "settings-menu")) , _object_menu(get_widget(_builder, "object-menu")) + , _colors(std::make_shared(nullptr, false)) , _searchBox(get_widget(_builder, "search")) , _opacity_slider(get_widget(_builder, "opacity-slider")) , _setting_layers(get_derived_widget(_builder, "setting-layers", "/dialogs/objects/layers_only", false)) @@ -737,7 +737,6 @@ ObjectsPanel::ObjectsPanel() , _tree{*Gtk::make_managed()} { _store = Gtk::TreeStore::create(*_model); - _color_picker.set_visible(false); //Set up the tree _tree.set_model(_store); @@ -931,22 +930,6 @@ ObjectsPanel::ObjectsPanel() tag->set_fixed_width(tag_renderer->get_width()); _color_tag_column = tag; } - tag_renderer->signal_clicked().connect([this](const Glib::ustring& path) { - // object's color indicator clicked - open color picker - _clicked_item_row = *_store->get_iter(path); - if (auto item = getItem(_clicked_item_row)) { - // find object's color - _color_picker.setColor(item->highlight_color()); - _color_picker.open(); - } - }); - - _color_picker.connectChanged([this](Colors::Color const &color) { - if (auto item = getItem(_clicked_item_row)) { - item->setHighlight(color); - DocumentUndo::maybeDone(getDocument(), "highlight-color", _("Set item highlight color"), INKSCAPE_ICON("dialog-object-properties")); - } - }); //Set the expander columns and search columns _tree.set_expander_column(*_name_column); @@ -1331,6 +1314,30 @@ bool ObjectsPanel::blendModePopup(int const x, int const y, Gtk::TreeModel::Row return true; } +bool ObjectsPanel::colorTagPopup(int const x, int const y, Gtk::TreeModel::Row row) +{ + auto const item = getItem(row); + if (item == nullptr) { + return false; + } + _colors->set(item->highlight_color()); + auto color_popup = Gtk::make_managed(); + _color_selector = Gtk::make_managed(_colors); + _color_selector->set_label(_("Highlight Color")); + _color_selector->set_margin(4); + color_popup->set_child(*_color_selector); + _colors->signal_changed.connect([this]() { + if (auto item = getItem(_clicked_item_row)) { + item->setHighlight(_colors->get().value()); + DocumentUndo::maybeDone(getDocument(), "highlight-color", _("Set item highlight color"), INKSCAPE_ICON("dialog-object-properties")); + } + }); + _popoverbin.setPopover(&*color_popup); + UI::popup_at(*color_popup, _tree, x, y); + + return true; +} + /** * Sets sensitivity of items in the tree * @param iter Current item in the tree @@ -1650,6 +1657,11 @@ Gtk::EventSequenceState ObjectsPanel::on_click(Gtk::GestureClick const &gesture, auto const [cx, cy] = get_cell_center(_tree, path, *_blend_mode_column); return blendModePopup(cx, cy, row) ? Gtk::EventSequenceState::CLAIMED : Gtk::EventSequenceState::NONE; + } else if (col == _color_tag_column) { + _clicked_item_row = *_store->get_iter(path); + auto const [cx, cy] = get_cell_center(_tree, path, *_color_tag_column); + return colorTagPopup(cx, cy, row) ? Gtk::EventSequenceState::CLAIMED + : Gtk::EventSequenceState::NONE; } } } diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h index 7b18f8da49..8d569ed3c5 100644 --- a/src/ui/dialog/objects.h +++ b/src/ui/dialog/objects.h @@ -35,7 +35,7 @@ #include "selection.h" #include "style-enums.h" #include "ui/dialog/dialog-base.h" -#include "ui/widget/color-picker.h" +#include "ui/widget/color-notebook.h" #include "ui/widget/popover-bin.h" #include "ui/widget/preferences-widget.h" #include "xml/node-observer.h" @@ -162,13 +162,13 @@ private: Gtk::ScrolledWindow _scroller; Gtk::Box _page; sigc::scoped_connection _tree_style; - Inkscape::UI::Widget::ColorPicker _color_picker; Gtk::TreeRow _clicked_item_row; UI::Widget::PopoverBin _popoverbin; void _activateAction(const std::string& layerAction, const std::string& selectionAction); bool blendModePopup(int x, int y, Gtk::TreeModel::Row row); + bool colorTagPopup(int x, int y, Gtk::TreeModel::Row row); bool toggleVisible(Gdk::ModifierType state, Gtk::TreeModel::Row row); bool toggleLocked (Gdk::ModifierType state, Gtk::TreeModel::Row row); @@ -213,6 +213,9 @@ private: int _msg_id; Gtk::Popover& _settings_menu; Gtk::Popover& _object_menu; + std::shared_ptr _colors; + UI::Widget::ColorNotebook* _color_selector = nullptr; + Gtk::Scale& _opacity_slider; std::map _blend_items; std::map _blend_mode_names; diff --git a/src/ui/widget/objects-dialog-cells.cpp b/src/ui/widget/objects-dialog-cells.cpp index abeb49ec12..6791333bc0 100644 --- a/src/ui/widget/objects-dialog-cells.cpp +++ b/src/ui/widget/objects-dialog-cells.cpp @@ -23,7 +23,7 @@ namespace Inkscape::UI::Widget { * A colored tag cell which indicates which layer an object is in. */ ColorTagRenderer::ColorTagRenderer() : - Glib::ObjectBase(typeid(CellRenderer)), + Glib::ObjectBase(typeid(ColorTagRenderer)), Gtk::CellRenderer(), _property_color(*this, "tagcolor", 0), _property_hover(*this, "taghover", false) @@ -45,8 +45,8 @@ void ColorTagRenderer::snapshot_vfunc(Glib::RefPtr const &snapsho const Gdk::Rectangle &cell_area, Gtk::CellRendererState flags) { - auto const cr = snapshot->append_cairo(cell_area); - cr->rectangle(cell_area.get_x(), cell_area.get_y(), cell_area.get_width(), cell_area.get_height()); + auto const cr = snapshot->append_cairo(background_area); + cr->rectangle(background_area.get_x() + 0.5, background_area.get_y() + 0.5, background_area.get_width() - 1.0, background_area.get_height() -1.0); auto color = Colors::Color(_property_color.get_value()); // RGBA ink_cairo_set_source_color(cr, color); cr->fill(); -- GitLab