iPlug2 - C++ Audio Plug-in Framework
Loading...
Searching...
No Matches
IVNumberBoxControl.h
Go to the documentation of this file.
1/*
2 ==============================================================================
3
4 This file is part of the iPlug 2 library. Copyright (C) the iPlug 2 developers.
5
6 See LICENSE.txt for more info.
7
8 ==============================================================================
9*/
10
11#pragma once
12
18#include "IControl.h"
19
20BEGIN_IPLUG_NAMESPACE
21BEGIN_IGRAPHICS_NAMESPACE
22
27 , public IVectorBase
28{
29public:
30 IVNumberBoxControl(const IRECT& bounds, int paramIdx = kNoParameter, IActionFunction actionFunc = nullptr, const char* label = "", const IVStyle& style = DEFAULT_STYLE, bool buttons = false, double defaultValue = 50.f, double minValue = 1.f, double maxValue = 100.f, const char* fmtStr = "%0.0f", bool drawTriangle = true)
31 : IContainerBase(bounds, paramIdx, actionFunc)
32 , IVectorBase(style.WithDrawShadows(false)
33 .WithDrawFrame(true)
34 .WithValueText(style.valueText.WithVAlign(EVAlign::Middle))
35 .WithLabelText(style.labelText.WithVAlign(EVAlign::Middle)))
36 , mFmtStr(fmtStr)
37 , mButtons(buttons)
38 , mMinValue(minValue)
39 , mMaxValue(maxValue)
40 , mRealValue(defaultValue)
41 , mDrawTriangle(drawTriangle)
42 {
43 assert(defaultValue >= minValue && defaultValue <= maxValue);
44
45 AttachIControl(this, label);
46 }
47
48 void OnInit() override
49 {
50 if (GetParam())
51 {
52 mMinValue = GetParam()->GetMin();
53 mMaxValue = GetParam()->GetMax();
54 mRealValue = GetParam()->GetDefault();
55 }
56 }
57
58 void Draw(IGraphics& g) override
59 {
60 DrawLabel(g);
61
62 if (mMouseIsOver)
63 g.FillRect(GetColor(kHL), mTextReadout->GetRECT());
64
65 if (mMouseIsDown)
66 g.FillRect(GetColor(kFG), mTextReadout->GetRECT());
67
68 if (mDrawTriangle)
69 {
70 auto triangleRect = mTextReadout->GetRECT().GetPadded(-2.0f);
71
72 g.FillTriangle(GetColor(mMouseIsOver ? kX1 : kSH), triangleRect.L, triangleRect.T, triangleRect.L + triangleRect.H(), triangleRect.MH(), triangleRect.L, triangleRect.B);
73 }
74 }
75
76 void OnResize() override
77 {
78 MakeRects(mRECT, false);
79
80 IRECT sections = mWidgetBounds;
81 sections.Pad(-1.f);
82
83 if (mTextReadout)
84 {
85 mTextReadout->SetTargetAndDrawRECTs(sections.ReduceFromLeft(sections.W() * (mButtons ? 0.75f : 1.f)));
86
87 if (mButtons)
88 {
89 mIncButton->SetTargetAndDrawRECTs(sections.FracRectVertical(0.5f, true).GetPadded(-2.f, 0.f, 0.f, -1.f));
90 mDecButton->SetTargetAndDrawRECTs(sections.FracRectVertical(0.5f, false).GetPadded(-2.f, -1.f, 0.f, 0.f));
91 }
92
93 SetTargetRECT(mTextReadout->GetRECT());
94 }
95 }
96
97 void OnAttached() override
98 {
99 IRECT sections = mWidgetBounds;
100 sections.Pad(-1.f);
101
102 AddChildControl(mTextReadout = new IVLabelControl(sections.ReduceFromLeft(sections.W() * (mButtons ? 0.75f : 1.f)), "0", mStyle.WithDrawFrame(true)));
103
104 mTextReadout->SetStrFmt(32, mFmtStr.Get(), mRealValue);
105
106 if (mButtons)
107 {
108 AddChildControl(mIncButton = new IVButtonControl(sections.FracRectVertical(0.5f, true).GetPadded(-2.f, 0.f, 0.f, -1.f), SplashClickActionFunc, "+", mStyle))->SetAnimationEndActionFunction(mIncrementFunc);
109 AddChildControl(mDecButton = new IVButtonControl(sections.FracRectVertical(0.5f, false).GetPadded(-2.f, -1.f, 0.f, 0.f), SplashClickActionFunc, "-", mStyle))->SetAnimationEndActionFunction(mDecrementFunc);
110 }
111 }
112
113 void OnMouseDown(float x, float y, const IMouseMod &mod) override
114 {
115 if (mHideCursorOnDrag)
116 GetUI()->HideMouseCursor(true, true);
117
118 if (GetParam())
120
121 mMouseIsDown = true;
122 }
123
124 void OnMouseUp(float x, float y, const IMouseMod &mod) override
125 {
126 if (mHideCursorOnDrag)
127 GetUI()->HideMouseCursor(false);
128
129 if (GetParam())
131
132 mMouseIsDown = false;
133
134 SetDirty(true);
135 }
136
137 void OnMouseDrag(float x, float y, float dX, float dY, const IMouseMod &mod) override
138 {
139 double gearing = IsFineControl(mod, true) ? mSmallIncrement : mLargeIncrement;
140 mRealValue -= (double(dY) * gearing);
141 OnValueChanged();
142 }
143
144 void OnMouseDblClick(float x, float y, const IMouseMod &mod) override
145 {
146 if (!IsDisabled() && mTextReadout->GetRECT().Contains(x, y))
147 GetUI()->CreateTextEntry(*this, mText, mTextReadout->GetRECT(), mTextReadout->GetStr());
148 }
149
150 void OnTextEntryCompletion(const char* str, int valIdx) override
151 {
152 mRealValue = atof(str);
153 OnValueChanged();
154 }
155
156 void OnMouseWheel(float x, float y, const IMouseMod& mod, float d) override
157 {
158 double gearing = IsFineControl(mod, true) ? mSmallIncrement : mLargeIncrement;
159 double inc = (d > 0.f ? 1. : -1.) * gearing;
160 mRealValue += inc;
161 OnValueChanged();
162 }
163
164 void SetValueFromDelegate(double value, int valIdx = 0) override
165 {
166 if (GetParam())
167 {
168 mRealValue = GetParam()->FromNormalized(value);
169 OnValueChanged(true);
170 }
171
172 IControl::SetValueFromDelegate(value, valIdx);
173 }
174
175 void SetValueFromUserInput(double value, int valIdx = 0) override
176 {
177 if (GetParam())
178 {
179 mRealValue = GetParam()->FromNormalized(value);
180 OnValueChanged(true);
181 }
182
183 IControl::SetValueFromUserInput(value, valIdx);
184 }
185
186 void SetStyle(const IVStyle& style) override
187 {
189 mTextReadout->SetStyle(style);
190
191 if (mButtons)
192 {
193 mIncButton->SetStyle(style);
194 mDecButton->SetStyle(style);
195 }
196 }
197
198 bool IsFineControl(const IMouseMod& mod, bool wheel) const
199 {
200 #ifdef PROTOOLS
201 #ifdef OS_WIN
202 return mod.C;
203 #else
204 return wheel ? mod.C : mod.R;
205 #endif
206 #else
207 return (mod.C || mod.S);
208 #endif
209 }
210
211 void OnValueChanged(bool preventAction = false)
212 {
213 mRealValue = Clip(mRealValue, mMinValue, mMaxValue);
214
215 mTextReadout->SetStrFmt(32, mFmtStr.Get(), mRealValue);
216
217 if (!preventAction && GetParam())
218 SetValue(GetParam()->ToNormalized(mRealValue));
219
220 SetDirty(!preventAction);
221 }
222
223 double GetRealValue() const { return mRealValue; }
224
225 void SetDrawTriangle(bool draw) { mDrawTriangle = draw; SetDirty(false); }
226
227protected:
228
229 IActionFunction mIncrementFunc = [this](IControl* pCaller) { mRealValue += mLargeIncrement; OnValueChanged(); };
230 IActionFunction mDecrementFunc = [this](IControl* pCaller) { mRealValue -= mLargeIncrement; OnValueChanged(); };
231 IVLabelControl* mTextReadout = nullptr;
232 IVButtonControl* mIncButton = nullptr;
233 IVButtonControl* mDecButton = nullptr;
234 WDL_String mFmtStr;
235 double mLargeIncrement = 1.f;
236 double mSmallIncrement = 0.1f;
237 double mMinValue;
238 double mMaxValue;
239 double mRealValue = 0.f;
240 bool mHideCursorOnDrag = true;
241 bool mButtons = false;
242 bool mDrawTriangle = true;
243 bool mMouseIsDown = false;
244};
245
246END_IGRAPHICS_NAMESPACE
247END_IPLUG_NAMESPACE
This file contains the base IControl implementation, along with some base classes for specific types ...
IContainerBase allows a control to nest sub controls and it clips the drawing of those subcontrols In...
Definition: IControl.h:606
The lowest level base class of an IGraphics control.
Definition: IControl.h:49
IGraphics * GetUI()
Definition: IControl.h:467
bool mMouseIsOver
if mGraphics::mHandleMouseOver = true, this will be true when the mouse is over control.
Definition: IControl.h:560
virtual void SetValueFromDelegate(double value, int valIdx=0)
Set the control's value from the delegate This method is called from the class implementing the IEdit...
Definition: IControl.cpp:159
bool IsDisabled() const
Definition: IControl.h:362
virtual void SetValueFromUserInput(double value, int valIdx=0)
Set the control's value after user input.
Definition: IControl.cpp:174
int GetParamIdx(int valIdx=0) const
Get the index of a parameter that the control is linked to Normaly controls are either linked to a si...
Definition: IControl.cpp:109
const IRECT & GetRECT() const
Get the rectangular draw area for this control, within the graphics context.
Definition: IControl.h:311
void SetTargetRECT(const IRECT &bounds)
Set the rectangular mouse tracking target area, within the graphics context for this control.
Definition: IControl.h:323
IGEditorDelegate * GetDelegate()
Gets a pointer to the class implementing the IEditorDelegate interface that handles parameter changes...
Definition: IControl.h:449
IControl * SetAnimationEndActionFunction(IActionFunction actionFunc)
Set an Action Function to be called at the end of an animation.
Definition: IControl.h:211
const IParam * GetParam(int valIdx=0) const
Get a const pointer to the IParam object (owned by the editor delegate class), associated with this c...
Definition: IControl.cpp:122
virtual void SetValue(double value, int valIdx=0)
Set one of the control's values.
Definition: IControl.cpp:147
void SetTargetAndDrawRECTs(const IRECT &bounds)
Set BOTH the draw rect and the target area, within the graphics context for this control.
Definition: IControl.h:327
virtual void SetDirty(bool triggerAction=true, int valIdx=kNoValIdx)
Mark the control as dirty, i.e.
Definition: IControl.cpp:198
virtual void BeginInformHostOfParamChangeFromUI(int paramIdx)=0
Called by the UI at the beginning of a parameter change gesture, in order to notify the host (via a c...
virtual void EndInformHostOfParamChangeFromUI(int paramIdx)=0
Called by the user interface at the end of a parameter change gesture, in order to notify the host (v...
The lowest level base class of an IGraphics context.
Definition: IGraphics.h:86
void CreateTextEntry(IControl &control, const IText &text, const IRECT &bounds, const char *str="", int valIdx=0)
Create a text entry box.
Definition: IGraphics.cpp:1923
virtual void FillRect(const IColor &color, const IRECT &bounds, const IBlend *pBlend=0)
Fill a rectangular region of the graphics context with a color.
Definition: IGraphics.cpp:2569
virtual void FillTriangle(const IColor &color, float x1, float y1, float x2, float y2, float x3, float y3, const IBlend *pBlend=0)
Fill a triangle with a color.
Definition: IGraphics.cpp:2562
virtual void HideMouseCursor(bool hide=true, bool lock=true)=0
Call to hide/show the mouse cursor.
double GetDefault(bool normalized=false) const
Returns the parameter's default value.
double GetMin() const
Returns the parameter's minimum value.
double FromNormalized(double normalizedValue) const
Convert a normalized value to real value for this parameter.
double GetMax() const
Returns the parameter's maximum value.
virtual void SetStrFmt(int maxlen, const char *fmt,...)
Set the text to display, using a printf-like format string.
Definition: IControl.cpp:469
const char * GetStr() const
Definition: IControl.h:2171
A vector button/momentary switch control.
Definition: IControls.h:53
A vector label control that can display text with a shadow.
Definition: IControls.h:44
A "meta control" for a number box with an Inc/Dec button It adds several child buttons if buttons = t...
void OnMouseUp(float x, float y, const IMouseMod &mod) override
Implement this method to respond to a mouse up event on this control.
void SetValueFromDelegate(double value, int valIdx=0) override
Set the control's value from the delegate This method is called from the class implementing the IEdit...
void OnResize() override
Called when IControl is constructed or resized using SetRect().
void OnInit() override
Called just prior to when the control is attached, after its delegate and graphics member variable se...
void SetValueFromUserInput(double value, int valIdx=0) override
Set the control's value after user input.
void OnMouseWheel(float x, float y, const IMouseMod &mod, float d) override
Implement this method to respond to a mouse wheel event on this control.
void Draw(IGraphics &g) override
Draw the control to the graphics context.
void OnMouseDrag(float x, float y, float dX, float dY, const IMouseMod &mod) override
Implement this method to respond to a mouse drag event on this control.
void OnMouseDown(float x, float y, const IMouseMod &mod) override
Implement this method to respond to a mouse down event on this control.
void SetStyle(const IVStyle &style) override
Set the Style of this IVControl.
void OnAttached() override
Called after the control has been attached, and its delegate and graphics member variable set.
void OnTextEntryCompletion(const char *str, int valIdx) override
Implement this method to handle text input after IGraphics::CreateTextEntry/IControlPromptUserInput.
void OnMouseDblClick(float x, float y, const IMouseMod &mod) override
Implement this method to respond to a mouse double click event on this control.
A base interface to be combined with IControl for vectorial controls "IVControls",...
Definition: IControl.h:757
IRECT MakeRects(const IRECT &parent, bool hasHandle=false)
Calculate the rectangles for the various areas, depending on the style.
Definition: IControl.h:1158
virtual void SetStyle(const IVStyle &style)
Set the Style of this IVControl.
Definition: IControl.h:825
void AttachIControl(IControl *pControl, const char *label)
Call in the constructor of your IVControl to link the IVectorBase and IControl.
Definition: IControl.h:775
virtual void DrawLabel(IGraphics &g)
Draw the IVControl label text.
Definition: IControl.h:889
const IColor & GetColor(EVColor color) const
Get value of a specific EVColor in the IVControl.
Definition: IControl.h:801
void SplashClickActionFunc(IControl *pCaller)
The splash click action function is used by IVControls to start SplashAnimationFunc.
Definition: IControl.cpp:47
BEGIN_IPLUG_NAMESPACE T Clip(T x, T lo, T hi)
Clips the value x between lo and hi.
Used to manage mouse modifiers i.e.
Used to manage a rectangular area, independent of draw class/platform.
IRECT ReduceFromLeft(float amount)
Reduce in width from the left edge by 'amount' and return the removed region.
void Pad(float padding)
Pad this IRECT N.B.
IRECT FracRectVertical(float frac, bool fromTop=false) const
Returns a new IRECT with a height that is multiplied by frac.
float W() const
bool Contains(const IRECT &rhs) const
Returns true if this IRECT completely contains rhs.
IRECT GetPadded(float padding) const
Get a copy of this IRECT with each value padded by padding N.B.
A struct encapsulating a set of properties used to configure IVControls.