Jamba C++ API 8.0.0
Loading...
Searching...
No Matches
ScrollbarView.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2018-2026 pongasoft
3 *
4 * Licensed under the Apache License, Version 2.0 or the MIT license,
5 * at your option. You may not use this file except in compliance with
6 * one of these licenses. You may obtain copies of the licenses at:
7 *
8 * https://www.apache.org/licenses/LICENSE-2.0
9 * https://opensource.org/licenses/MIT
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14 * License for the specific language governing permissions and limitations under
15 * the License.
16 *
17 * @author Yan Pujante
18 */
19#pragma once
20
21#include "CustomView.h"
24
26
27using namespace VSTGUI;
28
56{
57public:
59
60public:
61 // Constructor
62 explicit ScrollbarView(const CRect &iSize) : CustomView(iSize) {}
63
64 // draw
65 void draw(CDrawContext *iContext) override;
66
69 void setOrientation(EOrientation iOrientation);
70
72 ParamID getOffsetPercentTag() const { return fOffsetPercentTag; }
73 void setOffsetPercentTag(ParamID offsetPercentTag);
74
76 ParamID getZoomPercentTag() const { return fZoomPercentTag; }
77 void setZoomPercentTag(ParamID zoomPercentTag);
78
80 Margin const &getMargin() const { return fMargin; }
81 void setMargin(Margin const &iMargin) { fMargin = iMargin; needsRecomputing();}
82
84 const CColor &getScrollbarColor() const { return fScrollbarColor; }
85 void setScrollbarColor(const CColor &iColor) { fScrollbarColor = iColor; needsRecomputing(); }
86
88 CCoord getScrollbarMinSize() const { return fScrollbarMinSize; }
89 void setScrollbarMinSize(CCoord iScrollbarMinSize) { fScrollbarMinSize = iScrollbarMinSize; needsRecomputing();}
90
93 void setScrollbarGutterSpacing(CCoord iScrollbarGutterSpacing) { fScrollbarGutterSpacing = iScrollbarGutterSpacing; needsRecomputing();}
94
95 // showHandles
96 bool showHandles() const { return fZoomHandlesSize != 0; }
97
99 const CColor &getZoomHandlesColor() const { return fZoomHandlesColor; }
100 void setZoomHandlesColor(const CColor &iColor) { fZoomHandlesColor = iColor; needsRecomputing(); }
101
103 CCoord getZoomHandlesSize() const { return fZoomHandlesSize; }
104 void setZoomHandlesSize(CCoord iSize) { fZoomHandlesSize = iSize; needsRecomputing(); }
105
113 Range const &getShiftDragFactor() const { return fShiftDragFactor; }
114
116 void setShiftDragFactor(Range const &iShiftDragFactor) { fShiftDragFactor = iShiftDragFactor; }
117
120 void setEnableZoomDoubleClick(bool iEnableZoomDoubleClick) { fEnableZoomDoubleClick = iEnableZoomDoubleClick; }
121
122 // offsetPercent accessor
123 double getOffsetPercent() const;
124 void setOffsetPercent(double iOffsetPercent);
125
126 // zoomPercent accessor
127 double getZoomPercent() const;
128 void setZoomPercent(double iZoomPercent);
129
130 CLASS_METHODS_NOCOPY(ScrollbarView, CustomView)
131
132protected:
133 // setViewSize
134 void setViewSize(const CRect &rect, bool invalid = true) override;
135
136 // registerParameters
137 void registerParameters() override;
138
139 // onParameterChange
140 void onParameterChange(ParamID iParamID) override;
141
142 // onMouseDown
143 CMouseEventResult onMouseDown(CPoint &where, const CButtonState &buttons) override;
144
145 // onMouseMoved
146 CMouseEventResult onMouseMoved(CPoint &where, const CButtonState &buttons) override;
147
148 // onMouseUp
149 CMouseEventResult onMouseUp(CPoint &where, const CButtonState &buttons) override;
150
151 // onMouseCancel
152 CMouseEventResult onMouseCancel() override;
153
154 // isVertical
156
157protected:
159
163 struct ZoomBox
164 {
165 // When comparing coordinates to be equal, we cannot really use `==` for double as it leads to errors due to
166 // floating point precision. In this case, 2 decimal places if far enough.
167 static constexpr auto kEqualCoord = [](double a, double b) { return std::abs(a - b) < 0.01; };
168
174 CCoord fMinSize;
175 CCoord fMaxSize;
176 CCoord fHalfSize;
178
179 // when the box is full it cannot be moved anymore
180 bool isFull() const { return kEqualCoord(fMinCenter, fMaxCenter); }
181
182 // start position
185 bool isMinStart() const { return kEqualCoord(fCenter, fMinCenter); }
186
187 // end position
188 RelativeCoord getEnd() const { return fCenter + fHalfSize; }
190 bool isMaxEnd() const { return kEqualCoord(fCenter, fMaxCenter); }
191
192 // the short dimension of the box
193 CCoord getShortDimension() const { return fVertical ? fViewSize.getWidth() : fViewSize.getHeight(); }
194
195 // the long dimension of the box
196 CCoord getLongDimension() const { return fHalfSize * 2.0; }
197
198 // the relative view containing the box (which is the original view minus the margin)
200
201 // compute position from offsetPercent
202 RelativeCoord computeCenter(double iOffsetPercent) const
203 {
204 return Utils::mapValueDP(iOffsetPercent, 0.0, 1.0, fMinCenter, fMaxCenter);
205 }
206
207 // compute the offsetPercent from the position
208 double computeOffsetPercent() const
209 {
210 if(isMinStart()) return 0.0;
211 if(isMaxEnd()) return 1.0;
213 }
214
215 // compute size from zoomPercent
216 CCoord computeLongDimension(double iZoomPercent) const
217 {
218 return Utils::mapValueDP(iZoomPercent, 1.0, 0.0, fMinSize, fMaxSize);
219 }
220
221 // compute zoomPercent from size
222 double computeZoomPercent() const
223 {
224 auto longDimension = getLongDimension();
225 if(kEqualCoord(longDimension, fMinSize)) return 1.0;
226 if(kEqualCoord(longDimension, fMaxSize)) return 0.0;
227 return Utils::mapValueDP(longDimension, fMinSize, fMaxSize, 1.0, 0.0);
228 }
229
230 // move the box by iDelta (can be positive or negative)
231 void move(CCoord iDelta)
232 {
234 }
235
236 // move the box to a specific location
237 void moveTo(RelativeCoord const &iNewCenter)
238 {
240 }
241
247 bool stretch(CCoord iDelta, DragType iDragType);
248
249 // zoom to max and move to specific location
250 void maxZoom(RelativeCoord const &iNewCenter);
251
252 // zoom to minimum (since the box is full, there is no specific location)
253 void minZoom();
254 };
255
256protected:
257 // drawStartHandle - can be overridden to draw something different but should fit in fStartHandleRect
258 virtual void drawStartHandle(CDrawContext *iContext);
259
260 // drawEndHandle - can be overridden to draw something different but should fit in fEndHandleRect
261 virtual void drawEndHandle(CDrawContext *iContext);
262
263 // drawScrollbar - can be overridden to draw something different but should fit in fScrollbarRect
264 virtual void drawScrollbar(CDrawContext *iContext);
265
266 // needsRecomputing when something changes that requires recomputing the 3 AbsoluteRect
268
269 // recompute the 3 AbsoluteRect
270 void recompute();
271
272 // computeZoomBox
273 ZoomBox computeZoomBox() const;
274
275 // returns the size of just the scrollbar (excluding handles and gutter)
276 CCoord getScrollbarSize() const;
277
278 // compute the mouse position relative to the scrollbar
279 RelativeCoord computeMousePosition(CPoint const &where) const;
280
281protected:
282 // set to true when the 3 AbsoluteRect need to be recomputed
285
286 // the 3 Rect representing the position and size of the 3 pieces of the rendering
290
291 // look and feel
294 CColor fScrollbarColor{kWhiteCColor};
295 CCoord fScrollbarMinSize{-1}; // -1 means it will be computed
297
298 CColor fZoomHandlesColor{kWhiteCColor};
299 CCoord fZoomHandlesSize{-1}; // -1 means it will be computed, 0 means no show
300
301 // how much to slow down (if less than 1) or accelerate (if more than 1) when shift is held when dragging
304
305 // offsetPercent tag/param/value + editor and editor value ("value" is used when no param)
309
310 // zoomPercent tag/param/value + editor and editor value ("value" is used when no param)
314
315 // used when dragging
318
319public:
320 class Creator : public CustomViewCreator<ScrollbarView, CustomView>
321 {
322 public:
323 explicit Creator(char const *iViewName = nullptr, char const *iDisplayName = nullptr) :
324 CustomViewCreator(iViewName, iDisplayName)
325 {
327 {
328 { "vertical", EOrientation::kVertical },
329 { "horizontal", EOrientation::kHorizontal }
330 });
341 }
342 };
343};
344
345}
Represents an optional parameter (Jmb, Vst or no param at all).
Definition GUIOptionalParam.h:48
Definition DrawContext.h:67
CustomViewCreator(char const *iViewName=nullptr, char const *iDisplayName=nullptr, char const *iBaseViewName=VSTGUI::UIViewCreator::kCView)
Definition CustomViewCreator.h:1330
Class you should inherit from if you want to write a custom view.
Definition CustomView.h:61
CustomView(const CRect &iSize)
Definition CustomView.cpp:30
void markDirty()
Marks this view dirty which will (at the appropriate time in the rendering lifecycle) trigger a call ...
Definition CustomView.h:177
Creator(char const *iViewName=nullptr, char const *iDisplayName=nullptr)
Definition ScrollbarView.h:323
Generic scrollbar which handles scrolling and (optional) zooming via handles.
Definition ScrollbarView.h:56
bool fEnableZoomDoubleClick
Definition ScrollbarView.h:303
Margin fMargin
Definition ScrollbarView.h:293
const CColor & getZoomHandlesColor() const
Zoom handles color.
Definition ScrollbarView.h:99
void setOrientation(EOrientation iOrientation)
Definition ScrollbarView.cpp:48
ParamID getZoomPercentTag() const
id for the parameter tied to zoom percent
Definition ScrollbarView.h:76
ParamID fOffsetPercentTag
Definition ScrollbarView.h:306
void registerParameters() override
Subclasses should override this method to register each parameter.
Definition ScrollbarView.cpp:376
void setZoomPercent(double iZoomPercent)
Definition ScrollbarView.cpp:363
void onParameterChange(ParamID iParamID) override
Callback when a parameter changes.
Definition ScrollbarView.cpp:402
CMouseEventResult onMouseUp(CPoint &where, const CButtonState &buttons) override
Definition ScrollbarView.cpp:533
void setScrollbarMinSize(CCoord iScrollbarMinSize)
Definition ScrollbarView.h:89
void setOffsetPercent(double iOffsetPercent)
Definition ScrollbarView.cpp:342
bool fNeedsRecomputing
Definition ScrollbarView.h:283
void recompute()
Definition ScrollbarView.cpp:252
GUIOptionalParamEditor< ParamValue > fOffsetPercentEditor
Definition ScrollbarView.h:308
void setOffsetPercentTag(ParamID offsetPercentTag)
Definition ScrollbarView.cpp:385
virtual void drawScrollbar(CDrawContext *iContext)
Definition ScrollbarView.cpp:97
CCoord getZoomHandlesSize() const
Zoom handles size. If -1 it will be auto-computed. Set to 0 to disable handles entirely.
Definition ScrollbarView.h:103
AbsoluteRect fStartHandleRect
Definition ScrollbarView.h:287
void setShiftDragFactor(Range const &iShiftDragFactor)
Attribute shift-drag-factor.
Definition ScrollbarView.h:116
CMouseEventResult onMouseDown(CPoint &where, const CButtonState &buttons) override
Definition ScrollbarView.cpp:411
void draw(CDrawContext *iContext) override
Definition ScrollbarView.cpp:28
Range const & getShiftDragFactor() const
Defines how much to slow down (if less than 1) or accelerate (if more than 1) when shift is held when...
Definition ScrollbarView.h:113
CCoord fZoomHandlesSize
Definition ScrollbarView.h:299
RelativeCoord computeMousePosition(CPoint const &where) const
Definition ScrollbarView.cpp:315
EOrientation fOrientation
Definition ScrollbarView.h:292
EOrientation getOrientation() const
Is the scrollbar vertical or horizontal.
Definition ScrollbarView.h:68
CCoord getScrollbarSize() const
Definition ScrollbarView.cpp:298
bool getEnableZoomDoubleClick() const
true to allow zooming on double click on the scrollbar
Definition ScrollbarView.h:119
ScrollbarView(const CRect &iSize)
Definition ScrollbarView.h:62
CMouseEventResult onMouseCancel() override
Definition ScrollbarView.cpp:558
double getOffsetPercent() const
Definition ScrollbarView.cpp:334
ZoomBox fZoomBox
Definition ScrollbarView.h:284
void setZoomPercentTag(ParamID zoomPercentTag)
Definition ScrollbarView.cpp:394
const CColor & getScrollbarColor() const
the color of the scrollbar itself (the rectangle)
Definition ScrollbarView.h:84
GUIOptionalParam< ParamValue > fOffsetPercentParam
Definition ScrollbarView.h:307
AbsoluteRect fEndHandleRect
Definition ScrollbarView.h:288
bool showHandles() const
Definition ScrollbarView.h:96
ZoomBox computeZoomBox() const
Definition ScrollbarView.cpp:106
CCoord getScrollbarMinSize() const
Minimum size for the scrollbar (in pixels). If -1 it will be auto-computed.
Definition ScrollbarView.h:88
void setScrollbarGutterSpacing(CCoord iScrollbarGutterSpacing)
Definition ScrollbarView.h:93
void setZoomHandlesSize(CCoord iSize)
Definition ScrollbarView.h:104
Margin const & getMargin() const
Amount of space (in pixels) to draw around the full scrollbar (includes handles).
Definition ScrollbarView.h:80
CCoord fScrollbarMinSize
Definition ScrollbarView.h:295
RelativeCoord fDragGesture
Definition ScrollbarView.h:316
CCoord getScrollbarGutterSpacing() const
Spacing (in pixels) between the scrollbar and zoom handles (only drawn when zoom handles).
Definition ScrollbarView.h:92
DragType fDragType
Definition ScrollbarView.h:317
bool isVertical() const
Definition ScrollbarView.h:155
void setMargin(Margin const &iMargin)
Definition ScrollbarView.h:81
void setScrollbarColor(const CColor &iColor)
Definition ScrollbarView.h:85
double getZoomPercent() const
Definition ScrollbarView.cpp:355
void needsRecomputing()
Definition ScrollbarView.h:267
void setZoomHandlesColor(const CColor &iColor)
Definition ScrollbarView.h:100
CCoord fScrollbarGutterSpacing
Definition ScrollbarView.h:296
ParamID getOffsetPercentTag() const
id for the parameter tied to offset percent
Definition ScrollbarView.h:72
virtual void drawStartHandle(CDrawContext *iContext)
Definition ScrollbarView.cpp:71
CColor fZoomHandlesColor
Definition ScrollbarView.h:298
virtual void drawEndHandle(CDrawContext *iContext)
Definition ScrollbarView.cpp:84
Range fShiftDragFactor
Definition ScrollbarView.h:302
AbsoluteRect fScrollbarRect
Definition ScrollbarView.h:289
CMouseEventResult onMouseMoved(CPoint &where, const CButtonState &buttons) override
Definition ScrollbarView.cpp:495
CColor fScrollbarColor
Definition ScrollbarView.h:294
void setEnableZoomDoubleClick(bool iEnableZoomDoubleClick)
Definition ScrollbarView.h:120
EOrientation
Definition ScrollbarView.h:58
void setViewSize(const CRect &rect, bool invalid=true) override
Definition ScrollbarView.cpp:325
ParamID fZoomPercentTag
Definition ScrollbarView.h:311
GUIOptionalParam< ParamValue > fZoomPercentParam
Definition ScrollbarView.h:312
GUIOptionalParamEditor< ParamValue > fZoomPercentEditor
Definition ScrollbarView.h:313
DragType
Definition ScrollbarView.h:158
@ kStretchStart
Definition ScrollbarView.h:158
@ kZoomStart
Definition ScrollbarView.h:158
@ kStretchEnd
Definition ScrollbarView.h:158
void registerBooleanAttribute(std::string const &iName, BooleanAttribute::Getter iGetter, BooleanAttribute::Setter iSetter)
Definition CustomViewCreator.h:1114
void registerMarginAttribute(std::string const &iName, MarginAttribute::Getter iGetter, MarginAttribute::Setter iSetter)
Definition CustomViewCreator.h:1006
void registerColorAttribute(std::string const &iName, ColorAttribute::Getter iGetter, ColorAttribute::Setter iSetter)
Definition CustomViewCreator.h:966
void registerDoubleAttribute(std::string const &iName, FloatAttribute< double >::Getter iGetter, FloatAttribute< double >::Setter iSetter)
Definition CustomViewCreator.h:1104
void registerRangeAttribute(std::string const &iName, RangeAttribute::Getter iGetter, RangeAttribute::Setter iSetter)
Definition CustomViewCreator.h:1016
void registerTagAttribute(std::string const &iName, TagAttribute::Getter iGetter, TagAttribute::Setter iSetter)
Definition CustomViewCreator.h:1063
void registerListAttribute(std::string const &iName, ListAttribute< T >::Getter iGetter, ListAttribute< T >::Setter iSetter, AttrValInitList< T > const &iAttributeValues)
Definition CustomViewCreator.h:1052
static constexpr T clamp(const U &iValue, const T &iLower, const T &iUpper)
Make sure that the value remains within its bounds.
Definition Misc.h:34
static constexpr double mapValueDP(double iValue, double iFromLow, double iFromHigh, double iToLow, double iToHigh, bool iClamp=true)
Convenient shortcut for single precision.
Definition Lerp.h:230
std::unique_ptr< typename GUIOptionalParam< T >::EditorType > GUIOptionalParamEditor
Definition GUIOptionalParam.h:174
Definition CustomController.h:26
CRect AbsoluteRect
Definition DrawContext.h:64
CCoord RelativeCoord
Definition DrawContext.h:59
Utils::Range< CCoord > Range
Defines a Range.
Definition Types.h:62
constexpr ParamID UNDEFINED_PARAM_ID
Constant used throughout the code to test whether the ParamID represents a valid id or an undefined o...
Definition Types.h:48
Margin is a similar concept to css: used to create space around elements, outside of any defined bord...
Definition LookAndFeel.h:34
Represents the box (dimension and position point of view) containing the zoom handles and scrollbar.
Definition ScrollbarView.h:164
bool fVertical
Definition ScrollbarView.h:170
RelativeView getRelativeView() const
Definition ScrollbarView.h:199
bool isMinStart() const
Definition ScrollbarView.h:185
double computeZoomPercent() const
Definition ScrollbarView.h:222
RelativeCoord getMinStart() const
Definition ScrollbarView.h:184
void maxZoom(RelativeCoord const &iNewCenter)
Definition ScrollbarView.cpp:226
void moveTo(RelativeCoord const &iNewCenter)
Definition ScrollbarView.h:237
CCoord fMaxSize
Definition ScrollbarView.h:175
void minZoom()
Definition ScrollbarView.cpp:239
bool stretch(CCoord iDelta, DragType iDragType)
stretch the box by iDelta (applied to the start or end)
Definition ScrollbarView.cpp:148
RelativeCoord fCenter
Definition ScrollbarView.h:173
CRect fViewSize
Definition ScrollbarView.h:169
CCoord fHalfSize
Definition ScrollbarView.h:176
CCoord fZoomHandlesSize
Definition ScrollbarView.h:177
bool isMaxEnd() const
Definition ScrollbarView.h:190
RelativeCoord getEnd() const
Definition ScrollbarView.h:188
RelativeCoord fMinCenter
Definition ScrollbarView.h:171
void move(CCoord iDelta)
Definition ScrollbarView.h:231
CCoord computeLongDimension(double iZoomPercent) const
Definition ScrollbarView.h:216
static constexpr auto kEqualCoord
Definition ScrollbarView.h:167
CCoord getShortDimension() const
Definition ScrollbarView.h:193
CCoord getLongDimension() const
Definition ScrollbarView.h:196
RelativeCoord computeCenter(double iOffsetPercent) const
Definition ScrollbarView.h:202
bool isFull() const
Definition ScrollbarView.h:180
RelativeCoord getMaxEnd() const
Definition ScrollbarView.h:189
RelativeCoord fMaxCenter
Definition ScrollbarView.h:172
CCoord fMinSize
Definition ScrollbarView.h:174
RelativeCoord getStart() const
Definition ScrollbarView.h:183
double computeOffsetPercent() const
Definition ScrollbarView.h:208