diff --git a/share/ui/style.css b/share/ui/style.css index ce36bed05c024dbe593646c25b19d4b173d761b7..9eeb998ec84aa5c763c06bab553ec6481f858267 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 b98beaa2e0fe191aa59f4e2170a2ce97baabc600..a2606d6098d32b7059a5cf0f45a768cc4f8a1f04 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 { @@ -724,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)) @@ -735,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); @@ -752,13 +753,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 @@ -929,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); @@ -1329,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 @@ -1412,34 +1421,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: @@ -1503,6 +1512,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 +1546,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; @@ -1635,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; } } } @@ -1671,6 +1698,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; @@ -1716,7 +1744,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); diff --git a/src/ui/dialog/objects.h b/src/ui/dialog/objects.h index fa5302526f0797961cc25dc0fd322666f7141e04..8d569ed3c5d8b4506d2d63207bfd5503a399d5b7 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" @@ -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; @@ -160,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); @@ -211,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 abeb49ec12a2f56a2088c51403f8a1ac661dfbbc..6791333bc0c0a434a3903ba72e4be602129e1499 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();