comparison DPF-Prymula-audioplugins/dpf/dgl/src/SubWidget.cpp @ 3:84e66ea83026

DPF-Prymula-audioplugins-0.231015-2
author prymula <prymula76@outlook.com>
date Mon, 16 Oct 2023 21:53:34 +0200
parents
children
comparison
equal deleted inserted replaced
2:cf2cb71d31dd 3:84e66ea83026
1 /*
2 * DISTRHO Plugin Framework (DPF)
3 * Copyright (C) 2012-2021 Filipe Coelho <falktx@falktx.com>
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any purpose with
6 * or without fee is hereby granted, provided that the above copyright notice and this
7 * permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD
10 * TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN
11 * NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
12 * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER
13 * IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17 #include "SubWidgetPrivateData.hpp"
18 #include "WidgetPrivateData.hpp"
19 #include "../TopLevelWidget.hpp"
20
21 START_NAMESPACE_DGL
22
23 // --------------------------------------------------------------------------------------------------------------------
24
25 SubWidget::SubWidget(Widget* const parentWidget)
26 : Widget(parentWidget),
27 pData(new PrivateData(this, parentWidget)) {}
28
29 SubWidget::~SubWidget()
30 {
31 delete pData;
32 }
33
34 template<typename T>
35 bool SubWidget::contains(const T x, const T y) const noexcept
36 {
37 return Rectangle<double>(0, 0,
38 static_cast<double>(getWidth()),
39 static_cast<double>(getHeight())).contains(x, y);
40 }
41
42 template<typename T>
43 bool SubWidget::contains(const Point<T>& pos) const noexcept
44 {
45 return contains(pos.getX(), pos.getY());
46 }
47
48 int SubWidget::getAbsoluteX() const noexcept
49 {
50 return pData->absolutePos.getX();
51 }
52
53 int SubWidget::getAbsoluteY() const noexcept
54 {
55 return pData->absolutePos.getY();
56 }
57
58 Point<int> SubWidget::getAbsolutePos() const noexcept
59 {
60 return pData->absolutePos;
61 }
62
63 Rectangle<int> SubWidget::getAbsoluteArea() const noexcept
64 {
65 return Rectangle<int>(getAbsolutePos(), getSize().toInt());
66 }
67
68 Rectangle<uint> SubWidget::getConstrainedAbsoluteArea() const noexcept
69 {
70 const int x = getAbsoluteX();
71 const int y = getAbsoluteY();
72
73 if (x >= 0 && y >= 0)
74 return Rectangle<uint>(x, y, getSize());
75
76 const int xOffset = std::min(0, x);
77 const int yOffset = std::min(0, y);
78 const int width = std::max(0, static_cast<int>(getWidth()) + xOffset);
79 const int height = std::max(0, static_cast<int>(getHeight()) + yOffset);
80
81 return Rectangle<uint>(0, 0, static_cast<uint>(width), static_cast<uint>(height));
82 }
83
84 void SubWidget::setAbsoluteX(const int x) noexcept
85 {
86 setAbsolutePos(Point<int>(x, getAbsoluteY()));
87 }
88
89 void SubWidget::setAbsoluteY(const int y) noexcept
90 {
91 setAbsolutePos(Point<int>(getAbsoluteX(), y));
92 }
93
94 void SubWidget::setAbsolutePos(const int x, const int y) noexcept
95 {
96 setAbsolutePos(Point<int>(x, y));
97 }
98
99 void SubWidget::setAbsolutePos(const Point<int>& pos) noexcept
100 {
101 if (pData->absolutePos == pos)
102 return;
103
104 PositionChangedEvent ev;
105 ev.oldPos = pData->absolutePos;
106 ev.pos = pos;
107
108 pData->absolutePos = pos;
109 onPositionChanged(ev);
110
111 repaint();
112 }
113
114 Point<int> SubWidget::getMargin() const noexcept
115 {
116 return pData->margin;
117 }
118
119 void SubWidget::setMargin(const int x, const int y) noexcept
120 {
121 pData->margin = Point<int>(x, y);
122 }
123
124 void SubWidget::setMargin(const Point<int>& offset) noexcept
125 {
126 pData->margin = offset;
127 }
128
129 Widget* SubWidget::getParentWidget() const noexcept
130 {
131 return pData->parentWidget;
132 }
133
134 void SubWidget::repaint() noexcept
135 {
136 if (! isVisible())
137 return;
138
139 if (TopLevelWidget* const topw = getTopLevelWidget())
140 {
141 if (pData->needsFullViewportForDrawing)
142 // repaint is virtual and we want precisely the top-level specific implementation, not any higher level
143 topw->TopLevelWidget::repaint();
144 else
145 topw->repaint(getConstrainedAbsoluteArea());
146 }
147 }
148
149 void SubWidget::toBottom()
150 {
151 std::list<SubWidget*>& subwidgets(pData->parentWidget->pData->subWidgets);
152
153 subwidgets.remove(this);
154 subwidgets.insert(subwidgets.begin(), this);
155 }
156
157 void SubWidget::toFront()
158 {
159 std::list<SubWidget*>& subwidgets(pData->parentWidget->pData->subWidgets);
160
161 subwidgets.remove(this);
162 subwidgets.push_back(this);
163 }
164
165 void SubWidget::setNeedsFullViewportDrawing(const bool needsFullViewportForDrawing)
166 {
167 pData->needsFullViewportForDrawing = needsFullViewportForDrawing;
168 }
169
170 void SubWidget::setNeedsViewportScaling(const bool needsViewportScaling, const double autoScaleFactor)
171 {
172 pData->needsViewportScaling = needsViewportScaling;
173 pData->viewportScaleFactor = autoScaleFactor;
174 }
175
176 void SubWidget::setSkipDrawing(const bool skipDrawing)
177 {
178 pData->skipDrawing = skipDrawing;
179 }
180
181 void SubWidget::onPositionChanged(const PositionChangedEvent&)
182 {
183 }
184
185 // --------------------------------------------------------------------------------------------------------------------
186 // Possible template data types
187
188 template<>
189 bool SubWidget::contains(const Point<double>& pos) const noexcept
190 {
191 return contains(pos.getX(), pos.getY());
192 }
193
194 // float, int, uint, short, ushort
195
196 // --------------------------------------------------------------------------------------------------------------------
197
198 END_NAMESPACE_DGL