Inkscape
Vector Graphics Editor
Loading...
Searching...
No Matches
canvas-item.h
Go to the documentation of this file.
1// SPDX-License-Identifier: GPL-2.0-or-later
2#ifndef SEEN_CANVAS_ITEM_H
3#define SEEN_CANVAS_ITEM_H
4
9/*
10 * Author:
11 * Tavmjong Bah
12 *
13 * Copyright (C) 2020 Tavmjong Bah
14 *
15 * Rewrite of SPCanvasItem
16 *
17 * Released under GNU GPL v2+, read the file 'COPYING' for more information.
18 *
19 * A note about coordinates:
20 *
21 * 1. Canvas items are constructed using document (SVG) coordinates.
22 * 2. Calculations are made in canvas units, which is equivalent of SVG units multiplied by zoom factor.
23 * This is true for bounds and closest distance calculations.
24 * 3 Drawing is done in screen units which is the same as canvas units but translated.
25 * The document and canvas origins overlap.
26 * The affine contains only scaling and rotating components.
27 */
28
29#include <cstdint>
30#include <boost/intrusive/list.hpp>
31#include <2geom/rect.h>
32#include <sigc++/sigc++.h>
33
34#include <gdkmm/cursor.h>
35
36#include "canvas-item-enums.h"
37#include "canvas-item-buffer.h"
38#include "canvas-item-context.h"
40
41class SPItem;
42
43namespace Inkscape {
44
45inline constexpr uint32_t CANVAS_ITEM_COLORS[] = { 0x0000ff7f, 0xff00007f, 0xffff007f };
46
47namespace UI::Widget { class Canvas; }
48class CanvasItemGroup;
49struct CanvasEvent;
50
52{
53public:
56 CanvasItem(CanvasItem const &) = delete;
57 CanvasItem &operator=(CanvasItem const &) = delete;
58 void unlink();
59
60 // Structure
62 CanvasItemGroup *get_parent() const { return _parent; }
63 bool is_descendant_of(CanvasItem const *ancestor) const;
64
65 // Z Position
66 void set_z_position(int zpos);
67 void raise_to_top(); // Move to top of group (last entry).
68 void lower_to_bottom(); // Move to bottom of group (first entry).
69
70 // Geometry
71 void request_update();
72 void update(bool propagate);
73 virtual void visit_page_rects(std::function<void(Geom::Rect const &)> const &) const {}
74 Geom::OptRect const &get_bounds() const { return _bounds; }
75
76 // Selection
77 virtual bool contains(Geom::Point const &p, double tolerance = 0) { return _bounds && _bounds->interiorContains(p); }
78 void grab(EventMask event_mask, Glib::RefPtr<Gdk::Cursor> const & = {});
79 void ungrab();
80
81 // Display
83 bool is_visible() const { return _visible; }
84 virtual void set_visible(bool visible);
85 void request_redraw(); // queue redraw request
86
87 // Properties
88 virtual void set_fill(uint32_t rgba);
90 void set_fill_pattern(Cairo::RefPtr<Cairo::Pattern> pattern);
91 virtual void set_stroke(uint32_t rgba);
93 void set_stroke_width(double width);
94 void set_outline(uint32_t color);
95 void set_outline_width(double width);
96 double get_effective_outline() const;
97 void set_name(std::string &&name) { _name = std::move(name); }
98 std::string const &get_name() const { return _name; }
99 void update_canvas_item_ctrl_sizes(int size_index);
100
101 // Events
102 void set_pickable(bool pickable) { _pickable = pickable; }
103 bool is_pickable() const { return _pickable; }
104 sigc::connection connect_event(sigc::slot<bool(CanvasEvent const &)> const &slot) {
105 return _event_signal.connect(slot);
106 }
107 virtual bool handle_event(CanvasEvent const &event) {
108 return _event_signal.emit(event); // Default just emits event.
109 }
110
111 // Recursively print CanvasItem tree.
112 void canvas_item_print_tree(int level = 0, int zorder = 0) const;
113
114 // Boost linked list member hook, speeds deletion.
115 boost::intrusive::list_member_hook<> member_hook;
116
117protected:
118 friend class CanvasItemGroup;
119 friend class CanvasItemContext; // access to _invalidate_ctrl_handles
120
121 virtual ~CanvasItem();
122
123 // Structure
126
127 // Geometry
129 bool _need_update = false;
130 Geom::Affine const &affine() const { return _context->affine(); }
131 virtual void _update(bool propagate) = 0;
132 virtual void _mark_net_invisible();
133 virtual void _invalidate_ctrl_handles() {}
134
135 // Display
136 bool _visible = true;
137 bool _net_visible = true;
138 virtual void _render(Inkscape::CanvasItemBuffer &buf) const = 0;
139
140 // Selection
141 bool _pickable = false; // Most items are just for display and are not pickable!
142
143 // Properties
145 Cairo::RefPtr<Cairo::Pattern> _fill_pattern;
147 double _stroke_width = 1.0;
148 uint32_t _outline = 0x0;
149 double _outline_width = 0;
150 std::string _name; // For debugging
151
152 // Events
153 sigc::signal<bool(CanvasEvent const &)> _event_signal;
154
155 // Snapshotting
156 template<typename F>
157 void defer(F &&f) { _context->defer(std::forward<F>(f)); }
158};
159
160} // namespace Inkscape
161
162#endif // SEEN_CANVAS_ITEM_H
163
164/*
165 Local Variables:
166 mode:c++
167 c-file-style:"stroustrup"
168 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
169 indent-tabs-mode:nil
170 fill-column:99
171 End:
172*/
173// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :
The context in which a single CanvasItem tree exists.
Enums for CanvasItems.
Geom::IntRect visible
Definition canvas.cpp:154
3x3 matrix representing an affine transformation.
Definition affine.h:70
Axis-aligned rectangle that can be empty.
Definition rect.h:203
Two-dimensional point that doubles as a vector.
Definition point.h:66
Axis aligned, non-empty rectangle.
Definition rect.h:92
Geom::Affine const & affine() const
UI::Widget::Canvas * canvas() const
virtual bool contains(Geom::Point const &p, double tolerance=0)
Definition canvas-item.h:77
virtual void set_visible(bool visible)
void render(Inkscape::CanvasItemBuffer &buf) const
double get_effective_outline() const
Get the effective outline.
Geom::OptRect const & get_bounds() const
Definition canvas-item.h:74
Cairo::RefPtr< Cairo::Pattern > _fill_pattern
std::string const & get_name() const
Definition canvas-item.h:98
void set_outline(uint32_t color)
Set the outline color.
sigc::signal< bool(CanvasEvent const &)> _event_signal
virtual void _mark_net_invisible()
void set_outline_width(double width)
Set the outline width.
void set_name(std::string &&name)
Definition canvas-item.h:97
void set_z_position(int zpos)
Geom::OptRect _bounds
void grab(EventMask event_mask, Glib::RefPtr< Gdk::Cursor > const &={})
sigc::connection connect_event(sigc::slot< bool(CanvasEvent const &)> const &slot)
void set_fill(CanvasItemColor color)
Definition canvas-item.h:89
CanvasItemGroup * _parent
bool is_visible() const
Definition canvas-item.h:83
void set_fill_pattern(Cairo::RefPtr< Cairo::Pattern > pattern)
CanvasItemGroup * get_parent() const
Definition canvas-item.h:62
CanvasItem & operator=(CanvasItem const &)=delete
Geom::Affine const & affine() const
virtual void set_fill(uint32_t rgba)
CanvasItem(CanvasItem const &)=delete
virtual bool handle_event(CanvasEvent const &event)
bool is_pickable() const
virtual void set_stroke(uint32_t rgba)
void canvas_item_print_tree(int level=0, int zorder=0) const
bool is_descendant_of(CanvasItem const *ancestor) const
virtual void _render(Inkscape::CanvasItemBuffer &buf) const =0
void set_stroke(CanvasItemColor color)
Definition canvas-item.h:92
void set_stroke_width(double width)
Set the stroke width.
virtual void visit_page_rects(std::function< void(Geom::Rect const &)> const &) const
Definition canvas-item.h:73
CanvasItemContext * _context
virtual void _invalidate_ctrl_handles()
virtual void _update(bool propagate)=0
void set_pickable(bool pickable)
boost::intrusive::list_member_hook member_hook
void update(bool propagate)
void update_canvas_item_ctrl_sizes(int size_index)
UI::Widget::Canvas * get_canvas() const
Definition canvas-item.h:61
A mask representing a subset of EventTypes.
Definition enums.h:38
A widget for Inkscape's canvas.
Definition canvas.h:62
Base class for visual SVG elements.
Definition sp-item.h:109
static char const *const parent
Definition dir-util.cpp:70
Helper class to stream background task notifications as a series of messages.
constexpr uint32_t CANVAS_ITEM_COLORS[]
Definition canvas-item.h:45
int buf
Axis-aligned rectangle.
Abstract base class for events.
Class used when rendering canvas items.
double width
Glib::ustring name
Definition toolbars.cpp:55