Jamba C++ API 7.5.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 {
170 CCoord fMinSize;
171 CCoord fMaxSize;
172 CCoord fHalfSize;
174
175 // when the box is full it cannot be moved anymore
176 bool isFull() const { return fMinCenter == fMaxCenter; }
177
178 // start position
181 bool isMinStart() const { return fCenter == fMinCenter; }
182
183 // end position
184 RelativeCoord getEnd() const { return fCenter + fHalfSize; }
186 bool isMaxEnd() const { return fCenter == fMaxCenter; }
187
188 // the short dimension of the box
189 CCoord getShortDimension() const { return fVertical ? fViewSize.getWidth() : fViewSize.getHeight(); }
190
191 // the long dimension of the box
192 CCoord getLongDimension() const { return fHalfSize * 2.0; }
193
194 // the relative view containing the box (which is the original view minus the margin)
196
197 // compute position from offsetPercent
198 RelativeCoord computeCenter(double iOffsetPercent) const
199 {
200 return Utils::mapValueDP(iOffsetPercent, 0.0, 1.0, fMinCenter, fMaxCenter);
201 }
202
203 // compute the offsetPercent from the position
204 double computeOffsetPercent() const
205 {
207 }
208
209 // compute size from zoomPercent
210 CCoord computeLongDimension(double iZoomPercent) const
211 {
212 return Utils::mapValueDP(iZoomPercent, 1.0, 0.0, fMinSize, fMaxSize);
213 }
214
215 // compute zoomPercent from size
216 double computeZoomPercent() const
217 {
219 }
220
221 // move the box by iDelta (can be positive or negative)
222 void move(CCoord iDelta)
223 {
225 }
226
227 // move the box to a specific location
228 void moveTo(RelativeCoord const &iNewCenter)
229 {
231 }
232
238 bool stretch(CCoord iDelta, DragType iDragType);
239
240 // zoom to max and move to specific location
241 void maxZoom(RelativeCoord const &iNewCenter);
242
243 // zoom to minimum (since the box is full, there is no specific location)
244 void minZoom();
245 };
246
247protected:
248 // drawStartHandle - can be overridden to draw something different but should fit in fStartHandleRect
249 virtual void drawStartHandle(CDrawContext *iContext);
250
251 // drawEndHandle - can be overridden to draw something different but should fit in fEndHandleRect
252 virtual void drawEndHandle(CDrawContext *iContext);
253
254 // drawScrollbar - can be overridden to draw something different but should fit in fScrollbarRect
255 virtual void drawScrollbar(CDrawContext *iContext);
256
257 // needsRecomputing when something changes that requires recomputing the 3 AbsoluteRect
259
260 // recompute the 3 AbsoluteRect
261 void recompute();
262
263 // computeZoomBox
264 ZoomBox computeZoomBox() const;
265
266 // returns the size of just the scrollbar (excluding handles and gutter)
267 CCoord getScrollbarSize() const;
268
269 // compute the mouse position relative to the scrollbar
270 RelativeCoord computeMousePosition(CPoint const &where) const;
271
272protected:
273 // set to true when the 3 AbsoluteRect need to be recomputed
276
277 // the 3 Rect representing the position and size of the 3 pieces of the rendering
281
282 // look and feel
285 CColor fScrollbarColor{kWhiteCColor};
286 CCoord fScrollbarMinSize{-1}; // -1 means it will be computed
288
289 CColor fZoomHandlesColor{kWhiteCColor};
290 CCoord fZoomHandlesSize{-1}; // -1 means it will be computed, 0 means no show
291
292 // how much to slow down (if less than 1) or accelerate (if more than 1) when shift is held when dragging
295
296 // offsetPercent tag/param/value + editor and editor value ("value" is used when no param)
300
301 // zoomPercent tag/param/value + editor and editor value ("value" is used when no param)
305
306 // used when dragging
309
310public:
311 class Creator : public CustomViewCreator<ScrollbarView, CustomView>
312 {
313 public:
314 explicit Creator(char const *iViewName = nullptr, char const *iDisplayName = nullptr) :
315 CustomViewCreator(iViewName, iDisplayName)
316 {
318 {
319 { "vertical", EOrientation::kVertical },
320 { "horizontal", EOrientation::kHorizontal }
321 });
332 }
333 };
334};
335
336}
Represents an optional parameter (Jmb, Vst or no param at all).
Definition GUIOptionalParam.h:50
Definition DrawContext.h:81
CustomViewCreator(char const *iViewName=nullptr, char const *iDisplayName=nullptr, char const *iBaseViewName=VSTGUI::UIViewCreator::kCView)
Definition CustomViewCreator.h:1318
Class you should inherit from if you want to write a custom view.
Definition CustomView.h:62
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:178
Creator(char const *iViewName=nullptr, char const *iDisplayName=nullptr)
Definition ScrollbarView.h:314
Generic scrollbar which handles scrolling and (optional) zooming via handles.
Definition ScrollbarView.h:56
bool fEnableZoomDoubleClick
Definition ScrollbarView.h:294
Margin fMargin
Definition ScrollbarView.h:284
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:297
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:274
void recompute()
Definition ScrollbarView.cpp:252
GUIOptionalParamEditor< ParamValue > fOffsetPercentEditor
Definition ScrollbarView.h:299
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:278
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:290
RelativeCoord computeMousePosition(CPoint const &where) const
Definition ScrollbarView.cpp:315
EOrientation fOrientation
Definition ScrollbarView.h:283
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:275
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:298
AbsoluteRect fEndHandleRect
Definition ScrollbarView.h:279
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:286
RelativeCoord fDragGesture
Definition ScrollbarView.h:307
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:308
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:258
void setZoomHandlesColor(const CColor &iColor)
Definition ScrollbarView.h:100
CCoord fScrollbarGutterSpacing
Definition ScrollbarView.h:287
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:289
virtual void drawEndHandle(CDrawContext *iContext)
Definition ScrollbarView.cpp:84
Range fShiftDragFactor
Definition ScrollbarView.h:293
AbsoluteRect fScrollbarRect
Definition ScrollbarView.h:280
CMouseEventResult onMouseMoved(CPoint &where, const CButtonState &buttons) override
Definition ScrollbarView.cpp:495
CColor fScrollbarColor
Definition ScrollbarView.h:285
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:302
GUIOptionalParam< ParamValue > fZoomPercentParam
Definition ScrollbarView.h:303
GUIOptionalParamEditor< ParamValue > fZoomPercentEditor
Definition ScrollbarView.h:304
DragType
Definition ScrollbarView.h:158
@ kStretchStart
Definition ScrollbarView.h:158
@ kZoomStart
Definition ScrollbarView.h:158
@ kStretchEnd
Definition ScrollbarView.h:158
void registerColorAttribute(std::string const &iName, typename ColorAttribute::Getter iGetter, typename ColorAttribute::Setter iSetter)
Definition CustomViewCreator.h:952
void registerRangeAttribute(std::string const &iName, typename RangeAttribute::Getter iGetter, typename RangeAttribute::Setter iSetter)
Definition CustomViewCreator.h:1002
void registerBooleanAttribute(std::string const &iName, typename BooleanAttribute::Getter iGetter, typename BooleanAttribute::Setter iSetter)
Definition CustomViewCreator.h:1100
void registerTagAttribute(std::string const &iName, typename TagAttribute::Getter iGetter, typename TagAttribute::Setter iSetter)
Definition CustomViewCreator.h:1049
void registerListAttribute(std::string const &iName, typename ListAttribute< T >::Getter iGetter, typename ListAttribute< T >::Setter iSetter, AttrValInitList< T > const &iAttributeValues)
Definition CustomViewCreator.h:1038
void registerDoubleAttribute(std::string const &iName, typename FloatAttribute< double >::Getter iGetter, typename FloatAttribute< double >::Setter iSetter)
Definition CustomViewCreator.h:1090
void registerMarginAttribute(std::string const &iName, typename MarginAttribute::Getter iGetter, typename MarginAttribute::Setter iSetter)
Definition CustomViewCreator.h:992
static double mapValueDP(double iValue, double iFromLow, double iFromHigh, double iToLow, double iToHigh, bool iClamp=true)
Convenient shortcut for single precision.
Definition Lerp.h:221
static T clamp(const U &iValue, const T &iLower, const T &iUpper)
Make sure that the value remains within its bounds.
Definition Misc.h:34
std::unique_ptr< typename GUIOptionalParam< T >::EditorType > GUIOptionalParamEditor
Definition GUIOptionalParam.h:188
Definition CustomController.h:25
CRect AbsoluteRect
Definition DrawContext.h:78
CCoord RelativeCoord
Definition DrawContext.h:73
Utils::Range< CCoord > Range
Defines a Range.
Definition Types.h:64
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:166
RelativeView getRelativeView() const
Definition ScrollbarView.h:195
bool isMinStart() const
Definition ScrollbarView.h:181
double computeZoomPercent() const
Definition ScrollbarView.h:216
RelativeCoord getMinStart() const
Definition ScrollbarView.h:180
void maxZoom(RelativeCoord const &iNewCenter)
Definition ScrollbarView.cpp:226
void moveTo(RelativeCoord const &iNewCenter)
Definition ScrollbarView.h:228
CCoord fMaxSize
Definition ScrollbarView.h:171
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:169
CRect fViewSize
Definition ScrollbarView.h:165
CCoord fHalfSize
Definition ScrollbarView.h:172
CCoord fZoomHandlesSize
Definition ScrollbarView.h:173
bool isMaxEnd() const
Definition ScrollbarView.h:186
RelativeCoord getEnd() const
Definition ScrollbarView.h:184
RelativeCoord fMinCenter
Definition ScrollbarView.h:167
void move(CCoord iDelta)
Definition ScrollbarView.h:222
CCoord computeLongDimension(double iZoomPercent) const
Definition ScrollbarView.h:210
CCoord getShortDimension() const
Definition ScrollbarView.h:189
CCoord getLongDimension() const
Definition ScrollbarView.h:192
RelativeCoord computeCenter(double iOffsetPercent) const
Definition ScrollbarView.h:198
bool isFull() const
Definition ScrollbarView.h:176
RelativeCoord getMaxEnd() const
Definition ScrollbarView.h:185
RelativeCoord fMaxCenter
Definition ScrollbarView.h:168
CCoord fMinSize
Definition ScrollbarView.h:170
RelativeCoord getStart() const
Definition ScrollbarView.h:179
double computeOffsetPercent() const
Definition ScrollbarView.h:204