2
* Copyright 2010 Inalogic Inc.
4
* This program is free software: you can redistribute it and/or modify it
5
* under the terms of the GNU Lesser General Public License version 3, as
6
* published by the Free Software Foundation.
8
* This program is distributed in the hope that it will be useful, but
9
* WITHOUT ANY WARRANTY; without even the implied warranties of
10
* MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR
11
* PURPOSE. See the applicable version of the GNU Lesser General Public
12
* License for more details.
14
* You should have received a copy of both the GNU Lesser General Public
15
* License version 3 along with this program. If not, see
16
* <http://www.gnu.org/licenses/>
18
* Authored by: Jay Taoko <jay.taoko_AT_gmail_DOT_com>
23
#include "TimerProc.h"
26
#include "IntegerValidator.h"
32
const Color SPINBOX_BUTTON_COLOR = Color (0xFF4D4D4D);
33
const Color SPINBOX_BUTTON_MOUSEOVER_COLOR = Color (0xFF222222);
35
SpinBox::SpinBox (int Value, int Step, int MinValue, int MaxValue)
36
: m_IntValidator (MinValue, MaxValue)
49
void SpinBox::InitializeWidgets()
51
m_EditLine->SetValidator (&m_IntValidator);
52
m_EditLine->SetSuffix (TEXT ("") );
53
m_EditLine->SetPrefix (TEXT ("") );
54
m_EditLine->SetText (inlPrintf (TEXT ("%d"), m_IntValidator.GetMinimum() ) );
56
m_EditLine->SetMinimumSize (1.5 * DEFAULT_WIDGET_WIDTH, DEFAULT_WIDGET_HEIGHT);
57
m_EditLine->SetGeometry (Geometry (0, 0, DEFAULT_WIDGET_WIDTH, DEFAULT_WIDGET_HEIGHT) );
59
m_SpinnerUpBtn->SetMinimumSize (15, 10);
60
m_SpinnerUpBtn->SetGeometry (Geometry (0, 0, 15, 10) );
61
m_SpinnerDownBtn->SetMinimumSize (15, 10);
62
m_SpinnerDownBtn->SetGeometry (Geometry (0, 0, 15, 10) );
64
m_UpTimerCallback = new TimerFunctor;
65
m_UpTimerCallback->OnTimerExpired.connect (sigc::mem_fun (this, &SpinBox_Logic::TimerSpinUpBtn) );
66
m_DownTimerCallback = new TimerFunctor;
67
m_DownTimerCallback->OnTimerExpired.connect (sigc::mem_fun (this, &SpinBox_Logic::TimerSpinDownBtn) );
69
// Set the minimum size of this widget.
70
// This is use by TextLineEditPropertyItem::GetItemBestHeight
71
SetMinimumSize (DEFAULT_WIDGET_WIDTH, PRACTICAL_WIDGET_HEIGHT);
73
hlayout->AddView (m_EditLine, 1);
75
vlayout->AddView (m_SpinnerUpBtn, 1);
76
vlayout->AddView (m_SpinnerDownBtn, 1);
77
hlayout->AddLayout (vlayout, 0);
79
SetCompositionLayout (hlayout);
82
void SpinBox::InitializeLayout()
84
hlayout = new HLayout (NUX_TRACKER_LOCATION);
85
vlayout = new VLayout (NUX_TRACKER_LOCATION);
88
void SpinBox::DestroyLayout()
92
long SpinBox::ProcessEvent (IEvent &ievent, long TraverseInfo, long ProcessEventInfo)
94
long ret = TraverseInfo;
95
ret = m_SpinnerUpBtn->OnEvent (ievent, ret, ProcessEventInfo);
96
ret = m_SpinnerDownBtn->OnEvent (ievent, ret, ProcessEventInfo);
97
ret = m_EditLine->ProcessEvent (ievent, ret, ProcessEventInfo);
98
ret = PostProcessEvent2 (ievent, ret, ProcessEventInfo);
102
void SpinBox::Draw (GraphicsEngine &GfxContext, bool force_draw)
104
Geometry base = GetGeometry();
105
GetPainter().PaintBackground (GfxContext, base);
107
if (m_EditLine->IsMouseInside() || m_SpinnerUpBtn->IsMouseInside() || m_SpinnerDownBtn->IsMouseInside() )
110
GetPainter().PaintShapeCorner (GfxContext, m_SpinnerUpBtn->GetGeometry(), SPINBOX_BUTTON_MOUSEOVER_COLOR, eSHAPE_CORNER_ROUND4,
111
eCornerTopRight, false);
112
GetPainter().PaintShapeCorner (GfxContext, m_SpinnerDownBtn->GetGeometry(), SPINBOX_BUTTON_MOUSEOVER_COLOR, eSHAPE_CORNER_ROUND4,
113
eCornerBottomRight, false);
117
GetPainter().PaintShapeCorner (GfxContext, m_SpinnerUpBtn->GetGeometry(), SPINBOX_BUTTON_COLOR, eSHAPE_CORNER_ROUND4,
118
eCornerTopRight, false);
119
GetPainter().PaintShapeCorner (GfxContext, m_SpinnerDownBtn->GetGeometry(), SPINBOX_BUTTON_COLOR, eSHAPE_CORNER_ROUND4,
120
eCornerBottomRight, false);
123
GeometryPositioning gp (eHACenter, eVACenter);
124
Geometry GeoPo = ComputeGeometryPositioning (m_SpinnerUpBtn->GetGeometry(), GetTheme().GetImageGeometry (eSPINER_UP), gp);
126
if (m_SpinnerUpBtn->IsMouseInside() )
127
GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eSPINER_UP);
129
GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eSPINER_UP);
132
gp.SetAlignment (eHACenter, eVACenter);
133
GeoPo = ComputeGeometryPositioning (m_SpinnerDownBtn->GetGeometry(), GetTheme().GetImageGeometry (eSPINER_DOWN), gp);
135
if (m_SpinnerDownBtn->IsMouseInside() )
136
GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eSPINER_DOWN);
138
GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eSPINER_DOWN);
140
m_EditLine->NeedRedraw();
143
void SpinBox::DrawContent (GraphicsEngine &GfxContext, bool force_draw)
145
m_EditLine->ProcessDraw (GfxContext, force_draw);
148
void SpinBox::PostDraw (GraphicsEngine &GfxContext, bool force_draw)
153
void SpinBox::SetValue (int value)
155
m_iValue = m_IntValidator.Validate (value);
156
m_EditLine->SetText (inlPrintf ("%d", m_iValue) );
157
sigValueChanged.emit (this);
158
sigValue.emit (m_iValue);
162
int SpinBox::GetValue() const
167
void SpinBox::SetStep (int i)
177
int SpinBox::GetStep() const
182
int SpinBox::GetMinValue() const
184
return m_IntValidator.GetMinimum();
187
int SpinBox::GetMaxValue() const
189
return m_IntValidator.GetMaximum();
192
void SpinBox::SetRange (int MinValue, int Maxvalue)
194
m_IntValidator.SetMinimum (MinValue);
195
m_IntValidator.SetMaximum (Maxvalue);
196
m_iValue = m_IntValidator.Validate (m_iValue);
197
sigValueChanged.emit (this);
198
sigValue.emit (m_iValue);
202
void SpinBox::ImplementIncrementBtn()
204
SetValue (m_iValue + m_Step);
206
if (m_iValue < m_IntValidator.GetMaximum() )
208
if (m_UpTimerHandler.IsValid() )
209
m_UpTimerHandler = GetTimer().AddTimerHandler (100, m_UpTimerCallback, 0);
211
m_UpTimerHandler = GetTimer().AddTimerHandler (800, m_UpTimerCallback, 0);
216
sigValueChanged.emit (this);
217
sigIncrement.emit (this);
218
sigValue.emit (m_iValue);
221
void SpinBox::ImplementDecrementBtn()
223
SetValue (m_iValue - m_Step);
225
if (m_iValue > m_IntValidator.GetMinimum() )
227
if (m_DownTimerHandler.IsValid() )
228
m_DownTimerHandler = GetTimer().AddTimerHandler (100, m_DownTimerCallback, 0);
230
m_DownTimerHandler = GetTimer().AddTimerHandler (800, m_DownTimerCallback, 0);
235
sigValueChanged.emit (this);
236
sigDecrement.emit (this);
237
sigValue.emit (m_iValue);
240
void SpinBox::ImplementValidateEntry()
243
ret = CharToDouble (m_EditLine->GetCleanText().GetTCharPtr() );
245
m_iValue = m_IntValidator.Validate (ret);
246
m_EditLine->SetText (inlPrintf ("%d", m_iValue) );
247
sigValueChanged.emit (this);
248
sigValue.emit (m_iValue);
250
// if(m_iValue < m_IntValidator.GetMinimum())
252
// m_iValue = m_IntValidator.GetMinimum();
253
// m_EditLine->SetText(inlPrintf("%d", m_iValue));
255
// if(m_iValue > m_IntValidator.GetMaximum())
257
// m_iValue = m_IntValidator.GetMaximum();
258
// m_EditLine->SetText(inlPrintf("%d", m_iValue));
263
// m_EditLine->SetText(inlPrintf("%d", m_iValue));
264
// sigValueChanged.emit(this);
265
// sigValue.emit(m_iValue);