Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
objects.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2/*
3 * A simple dialog for objects UI.
4 *
5 * Authors:
6 * Theodore Janeczko
7 * Tavmjong Bah
8 *
9 * Copyright (C) Theodore Janeczko 2012 <flutterguy317@gmail.com>
10 * Tavmjong Bah 2017
11 *
12 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
13 */
14
15#ifndef SEEN_OBJECTS_PANEL_H
16#define SEEN_OBJECTS_PANEL_H
17
18#include <gtkmm/treerowreference.h>
19
20#include "object/weakptr.h"
21#include "selection.h"
22#include "style-enums.h"
27
28namespace Glib {
29class ValueBase;
30} // namespace Glib
31
32namespace Gdk {
33class Drag;
34} // namespace Gdk
35
36namespace Gtk {
37class Builder;
38class CheckButton;
39class DragSource;
40class DropTarget;
41class EventControllerKey;
42class EventControllerMotion;
43class GestureClick;
44class Popover;
45class Scale;
46class SearchEntry2;
47class TreeStore;
48} // namespace Gtk
49
50class SPItem;
51class SPObject;
52
53namespace Inkscape::UI {
54
55namespace Widget { class ImageToggler; }
56
57namespace Dialog {
58
59class ObjectsPanel;
60class ObjectWatcher;
61
63
64using SelectionState = int;
66 SELECTED_NOT = 0, // Object is NOT in desktop's selection
67 SELECTED_OBJECT = 1, // Object is in the desktop's selection
68 LAYER_FOCUSED = 2, // This layer is the desktop's focused layer
69 LAYER_FOCUS_CHILD = 4, // This object is a child of the focused layer
70 GROUP_SELECT_CHILD = 8 // This object is a child of the selected object
71};
72
77{
78public:
80 ~ObjectsPanel() override;
81
82 class ModelColumns;
83
84private:
85 void desktopReplaced() override;
86 void documentReplaced() override;
87 void layerChanged(SPObject *obj);
88 void selectionChanged(Selection *selected) override;
90
91 // Accessed by ObjectWatcher directly (friend class)
94 ObjectWatcher *getRootWatcher() const { return root_watcher.get(); };
96
97 Inkscape::XML::Node *getRepr(Gtk::TreeModel::ConstRow const &row) const;
98 SPItem *getItem(Gtk::TreeModel::ConstRow const &row) const;
99 std::optional<Gtk::TreeRow> getRow(SPItem *item) const;
100
101 bool isDummy(Gtk::TreeModel::ConstRow const &row) const { return !getRepr(row); }
102 bool hasDummyChildren(Gtk::TreeModel::ConstRow const &row) const;
103 bool removeDummyChildren(Gtk::TreeModel::Row row);
104 bool cleanDummyChildren (Gtk::TreeModel::Row row);
105
106 Glib::RefPtr<Gtk::TreeStore> _store;
107 std::unique_ptr<ModelColumns> _model;
108
109 void setRootWatcher();
110
111 Glib::RefPtr<Gtk::Builder> _builder;
113 std::unique_ptr<ObjectWatcher> root_watcher;
115 Gtk::TreeModel::Path _initial_path;
116 bool _start_new_range = true;
117 std::vector<SPWeakPtr<SPObject>> _prev_range;
118
119 sigc::scoped_connection layer_changed;
121 Gtk::TreeModel::RowReference _hovered_row_ref;
124
125 //Show icons in the context menu
127
129 bool _scroll_lock = false;
130
131 std::vector<Gtk::Widget*> _watching;
132 std::vector<Gtk::Widget*> _watchingNonTop;
133 std::vector<Gtk::Widget*> _watchingNonBottom;
134
135 class TreeViewWithCssChanged;
136 TreeViewWithCssChanged &_tree;
137 Gtk::CellRendererText *_text_renderer = nullptr;
138 Gtk::TreeView::Column *_name_column = nullptr;
139 Gtk::TreeView::Column *_blend_mode_column = nullptr;
140 Gtk::TreeView::Column *_eye_column = nullptr;
141 Gtk::TreeView::Column *_lock_column = nullptr;
142 Gtk::TreeView::Column *_color_tag_column = nullptr;
143 Gtk::Box _buttonsRow;
146 Gtk::SearchEntry2& _searchBox;
147 Gtk::ScrolledWindow _scroller;
148 Gtk::Box _page;
149 sigc::scoped_connection _tree_style;
150 Gtk::TreeRow _clicked_item_row;
152
153 void _activateAction(const std::string& layerAction, const std::string& selectionAction);
154
155 bool blendModePopup(int x, int y, Gtk::TreeModel::Row row);
156 bool colorTagPopup(int x, int y, Gtk::TreeModel::Row row);
157 bool toggleVisible(Gdk::ModifierType state, Gtk::TreeModel::Row row);
158 bool toggleLocked (Gdk::ModifierType state, Gtk::TreeModel::Row row);
159
161 Gtk::EventSequenceState on_click(Gtk::GestureClick const &gesture,
162 int n_press, double x, double y,
163 EventType type);
164 bool on_tree_key_pressed(Gtk::EventControllerKey const &controller,
165 unsigned keyval, unsigned keycode, Gdk::ModifierType state);
166 bool on_window_key(Gtk::EventControllerKey const &controller,
167 unsigned keyval, unsigned keycode, Gdk::ModifierType state,
168 EventType type);
169 void on_motion_enter(double x, double y);
170 void on_motion_leave();
171 void on_motion_motion(Gtk::EventControllerMotion const *controller, double x, double y);
172
173 void _searchActivated();
174
175 void _handleEdited(const Glib::ustring& path, const Glib::ustring& new_text);
176 void _handleTransparentHover(bool enabled);
178
179 bool select_row( Glib::RefPtr<Gtk::TreeModel> const & model, Gtk::TreeModel::Path const & path, bool b );
180
181 Glib::RefPtr<Gdk::ContentProvider> on_prepare(Gtk::DragSource &controller, double x, double y);
182 void on_drag_begin(Glib::RefPtr<Gdk::Drag> const &drag);
183 void on_drag_end(Glib::RefPtr<Gdk::Drag> const &drag, bool delete_data);
184 Gdk::DragAction on_drag_motion(double x, double y);
185 bool on_drag_drop(Glib::ValueBase const &value, double x, double y);
186
187 void drag_end_impl();
188
189 void selectRange(Gtk::TreeModel::Path start, Gtk::TreeModel::Path end);
190 bool selectCursorItem(Gdk::ModifierType state);
191 SPItem *_getCursorItem(Gtk::TreeViewColumn *column);
192
193 friend class ObjectWatcher;
194
197
199 Gtk::Popover& _settings_menu;
200 Gtk::Popover& _object_menu;
201 std::shared_ptr<Colors::ColorSet> _colors;
203
204 Gtk::Scale& _opacity_slider;
205 std::map<SPBlendMode, Gtk::CheckButton *> _blend_items;
206 std::map<SPBlendMode, Glib::ustring> _blend_mode_names;
208
209 // Special column dragging mode
210 Gtk::TreeViewColumn* _drag_column = nullptr;
211
215
216 bool _selectionChanged();
217 sigc::scoped_connection _idle_connection;
218};
219
220} //namespace Dialog
221
222} //namespace Inkscape::UI
223
224#endif // SEEN_OBJECTS_PANEL_H
225
226/*
227 Local Variables:
228 mode:c++
229 c-file-style:"stroustrup"
230 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
231 indent-tabs-mode:nil
232 fill-column:99
233 End:
234*/
235// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
The set of selected SPObjects for a given document and layer model.
Definition selection.h:80
DialogBase is the base class for the dialog system.
Definition dialog-base.h:40
A panel that displays objects.
Definition objects.h:77
UI::Widget::PopoverBin _popoverbin
Definition objects.h:151
std::vector< Gtk::Widget * > _watching
Definition objects.h:131
Gtk::SearchEntry2 & _searchBox
Definition objects.h:146
void _activateAction(const std::string &layerAction, const std::string &selectionAction)
Special context-aware functions - If nothing is selected or layers-only mode is active,...
Definition objects.cpp:1211
Glib::RefPtr< Gdk::ContentProvider > on_prepare(Gtk::DragSource &controller, double x, double y)
Definition objects.cpp:1948
std::map< SPBlendMode, Glib::ustring > _blend_mode_names
Definition objects.h:206
bool hasDummyChildren(Gtk::TreeModel::ConstRow const &row) const
Return true if this row has dummy children.
Definition objects.cpp:1790
void layerChanged(SPObject *obj)
Happens when the layer selected is changed.
Definition objects.cpp:1192
Glib::RefPtr< Gtk::TreeStore > _store
Definition objects.h:106
Glib::RefPtr< Gtk::Builder > _builder
Definition objects.h:111
bool toggleLocked(Gdk::ModifierType state, Gtk::TreeModel::Row row)
Sets sensitivity of items in the tree.
Definition objects.cpp:1322
Gtk::TreeView::Column * _eye_column
Definition objects.h:140
void selectionChanged(Selection *selected) override
Definition objects.cpp:1138
bool toggleVisible(Gdk::ModifierType state, Gtk::TreeModel::Row row)
Sets visibility of items in the tree.
Definition objects.cpp:1228
std::unique_ptr< ObjectWatcher > root_watcher
Definition objects.h:113
ObjectWatcher * getWatcher(Inkscape::XML::Node *node)
Get the object watcher from the xml node (reverse lookup), it uses a ancesstor recursive pattern to m...
Definition objects.cpp:678
Inkscape::PrefObserver _watch_object_mode
Definition objects.h:112
Gtk::TreeView::Column * _lock_column
Definition objects.h:141
void selectRange(Gtk::TreeModel::Path start, Gtk::TreeModel::Path end)
Definition objects.cpp:2015
void on_drag_end(Glib::RefPtr< Gdk::Drag > const &drag, bool delete_data)
Definition objects.cpp:2010
Gtk::TreeView::Column * _blend_mode_column
Definition objects.h:139
bool selectCursorItem(Gdk::ModifierType state)
Select the object currently under the list-cursor (keyboard or mouse)
Definition objects.cpp:2061
bool on_tree_key_pressed(Gtk::EventControllerKey const &controller, unsigned keyval, unsigned keycode, Gdk::ModifierType state)
Handles keyboard events on the TreeView.
Definition objects.cpp:1357
Gtk::EventSequenceState on_click(Gtk::GestureClick const &gesture, int n_press, double x, double y, EventType type)
Handles mouse button click events.
Definition objects.cpp:1597
std::unique_ptr< ModelColumns > _model
Definition objects.h:107
Inkscape::UI::Widget::ImageToggler * _item_state_toggler
Definition objects.h:207
sigc::scoped_connection layer_changed
Definition objects.h:119
Gtk::CellRendererText * _text_renderer
Definition objects.h:137
bool on_window_key(Gtk::EventControllerKey const &controller, unsigned keyval, unsigned keycode, Gdk::ModifierType state, EventType type)
Definition objects.cpp:1444
Gtk::TreeModel::RowReference _hovered_row_ref
Definition objects.h:121
bool removeDummyChildren(Gtk::TreeModel::Row row)
If the given row has dummy children, remove them.
Definition objects.cpp:1806
UI::Widget::ColorNotebook * _color_selector
Definition objects.h:202
std::shared_ptr< Colors::ColorSet > _colors
Definition objects.h:201
std::vector< SPWeakPtr< SPObject > > _prev_range
Definition objects.h:117
SPItem * _getCursorItem(Gtk::TreeViewColumn *column)
sigc::scoped_connection _idle_connection
Definition objects.h:217
void on_drag_begin(Glib::RefPtr< Gdk::Drag > const &drag)
Definition objects.cpp:1968
bool showChildInTree(SPItem *item)
Apply any ongoing filters to the items.
Definition objects.cpp:1070
bool cleanDummyChildren(Gtk::TreeModel::Row row)
Definition objects.cpp:1826
void desktopReplaced() override
Called when the desktop has certainly changed.
Definition objects.cpp:1034
void _handleTransparentHover(bool enabled)
Definition objects.cpp:1556
bool colorTagPopup(int x, int y, Gtk::TreeModel::Row row)
Definition objects.cpp:1293
Gtk::TreeModel::Path _initial_path
Definition objects.h:115
bool select_row(Glib::RefPtr< Gtk::TreeModel > const &model, Gtk::TreeModel::Path const &path, bool b)
Take over the select row functionality from the TreeView, this is because we have two selections (lay...
Definition objects.cpp:1764
void _searchActivated()
User pressed return in search box, process search query.
Definition objects.cpp:2121
SPObject * getObject(Inkscape::XML::Node *node)
Get the object from the node.
Definition objects.cpp:665
void _handleEdited(const Glib::ustring &path, const Glib::ustring &new_text)
Handle a successful item label edit.
Definition objects.cpp:1742
UI::Widget::PrefCheckButton & _setting_layers
Definition objects.h:212
sigc::scoped_connection _tree_style
Definition objects.h:149
void on_motion_motion(Gtk::EventControllerMotion const *controller, double x, double y)
Definition objects.cpp:1481
ObjectWatcher * unpackToObject(SPObject *item)
This both unpacks the tree, and populates lazy loading.
Definition objects.cpp:1116
bool on_drag_drop(Glib::ValueBase const &value, double x, double y)
Signal handler for "drag-drop".
Definition objects.cpp:1904
bool isDummy(Gtk::TreeModel::ConstRow const &row) const
Definition objects.h:101
Gtk::TreeView::Column * _color_tag_column
Definition objects.h:142
TreeViewWithCssChanged & _tree
Definition objects.h:136
Inkscape::XML::Node * getRepr(Gtk::TreeModel::ConstRow const &row) const
Get the XML node which is associated with a row.
Definition objects.cpp:1772
SPItem * getItem(Gtk::TreeModel::ConstRow const &row) const
Get the item which is associated with a row.
Definition objects.cpp:1781
Gtk::ScrolledWindow _scroller
Definition objects.h:147
ObjectWatcher * getRootWatcher() const
Definition objects.h:94
std::vector< Gtk::Widget * > _watchingNonTop
Definition objects.h:132
std::optional< Gtk::TreeRow > getRow(SPItem *item) const
Gtk::TreeView::Column * _name_column
Definition objects.h:138
UI::Widget::PrefCheckButton & _setting_track
Definition objects.h:213
Gdk::DragAction on_drag_motion(double x, double y)
Signal handler for "drag-motion".
Definition objects.cpp:1843
void on_motion_enter(double x, double y)
Handles mouse movements.
Definition objects.cpp:1468
std::vector< Gtk::Widget * > _watchingNonBottom
Definition objects.h:133
std::map< SPBlendMode, Gtk::CheckButton * > _blend_items
Definition objects.h:205
void _generateTranslucentItems(SPItem *parent)
Gtk::TreeViewColumn * _drag_column
Definition objects.h:210
bool blendModePopup(int x, int y, Gtk::TreeModel::Row row)
Definition objects.cpp:1260
Holds a single child widget while allowing a single popover to be displayed over it.
Definition popover-bin.h:19
Interface for refcounted XML nodes.
Definition node.h:80
Base class for visual SVG elements.
Definition sp-item.h:109
SPObject is an abstract base class of all of the document nodes at the SVG document level.
Definition sp-object.h:160
A notebook with RGB, CMYK, CMS, HSL, and Wheel pages.
A base class for all dialogs.
static char const *const parent
Definition dir-util.cpp:70
SPItem * item
Inkscape::XML::Node * node
Definition desktop.h:50
User interface code.
Definition desktop.h:113
EventType
The type of a CanvasEvent.
Definition enums.h:22
std::unique_ptr< Preferences::PreferencesObserver > PrefObserver
Widgets for Inkscape Preferences dialog.
SPStyle enums: named public enums that correspond to SVG property values.