nux-1.16.0
|
00001 /* 00002 * Copyright 2010 Inalogic® Inc. 00003 * 00004 * This program is free software: you can redistribute it and/or modify it 00005 * under the terms of the GNU Lesser General Public License, as 00006 * published by the Free Software Foundation; either version 2.1 or 3.0 00007 * of the License. 00008 * 00009 * This program is distributed in the hope that it will be useful, but 00010 * WITHOUT ANY WARRANTY; without even the implied warranties of 00011 * MERCHANTABILITY, SATISFACTORY QUALITY or FITNESS FOR A PARTICULAR 00012 * PURPOSE. See the applicable version of the GNU Lesser General Public 00013 * License for more details. 00014 * 00015 * You should have received a copy of both the GNU Lesser General Public 00016 * License along with this program. If not, see <http://www.gnu.org/licenses/> 00017 * 00018 * Authored by: Jay Taoko <jaytaoko@inalogic.com> 00019 * 00020 */ 00021 00022 00023 #include "Nux.h" 00024 #include "TimerProc.h" 00025 #include "WindowCompositor.h" 00026 #include "EditTextBox.h" 00027 #include "StaticTextBox.h" 00028 #include "Vector3Valuator.h" 00029 #include "HLayout.h" 00030 #include "Vector3ValuatorDouble.h" 00031 00032 namespace nux 00033 { 00034 00035 const Color SPINBOX_BUTTON_COLOR = Color (0xFF4D4D4D); 00036 const Color SPINBOX_BUTTON_MOUSEOVER_COLOR = Color (0xFF222222); 00037 00038 Vector3DoubleValuator::Vector3DoubleValuator (double X, double Y, double Z, double Step, double MinValue, double MaxValue) 00039 : m_DoubleValidator (MinValue, MaxValue) 00040 { 00041 m_Step = Step; 00042 m_X = X; 00043 m_Y = Y; 00044 m_Z = Z; 00045 00046 m_hlayout = new HLayout (NUX_TRACKER_LOCATION); 00047 // m_XEdit = new EditTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00048 // m_YEdit = new EditTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00049 // m_ZEdit = new EditTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00050 00051 m_DoubleValidator.SetDecimals (3); 00052 m_XEdit->SetValidator (&m_DoubleValidator); 00053 m_XEdit->SetSuffix (TEXT ("") ); 00054 m_XEdit->SetPrefix (TEXT ("") ); 00055 m_XEdit->SetText (m_DoubleValidator.ToString (m_X) ); 00056 00057 m_YEdit->SetValidator (&m_DoubleValidator); 00058 m_YEdit->SetSuffix (TEXT ("") ); 00059 m_YEdit->SetPrefix (TEXT ("") ); 00060 m_YEdit->SetText (m_DoubleValidator.ToString (m_Y) ); 00061 00062 m_ZEdit->SetValidator (&m_DoubleValidator); 00063 m_ZEdit->SetSuffix (TEXT ("") ); 00064 m_ZEdit->SetPrefix (TEXT ("") ); 00065 m_ZEdit->SetText (m_DoubleValidator.ToString (m_Z) ); 00066 00067 m_XEdit->SetMinimumSize (DEFAULT_WIDGET_WIDTH - 10, DEFAULT_WIDGET_HEIGHT); 00068 m_XEdit->SetGeometry (Geometry (0, 0, DEFAULT_WIDGET_WIDTH, DEFAULT_WIDGET_HEIGHT) ); 00069 m_YEdit->SetMinimumSize (DEFAULT_WIDGET_WIDTH - 10, DEFAULT_WIDGET_HEIGHT); 00070 m_YEdit->SetGeometry (Geometry (0, 0, DEFAULT_WIDGET_WIDTH, DEFAULT_WIDGET_HEIGHT) ); 00071 m_ZEdit->SetMinimumSize (DEFAULT_WIDGET_WIDTH - 10, DEFAULT_WIDGET_HEIGHT); 00072 m_ZEdit->SetGeometry (Geometry (0, 0, DEFAULT_WIDGET_WIDTH, DEFAULT_WIDGET_HEIGHT) ); 00073 00074 m_MouseControlledButton->SetMinimumSize (16 + 9, 10); 00075 m_MouseControlledButton->SetGeometry (Geometry (0, 0, 15, 10) ); 00076 00077 // Set the minimum size of this widget. 00078 // This is use by TextLineEditPropertyItem::GetItemBestHeight 00079 SetMinimumSize (DEFAULT_WIDGET_WIDTH, PRACTICAL_WIDGET_HEIGHT); 00080 00081 m_XLabel = new StaticTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00082 m_YLabel = new StaticTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00083 m_ZLabel = new StaticTextBox (TEXT (""), NUX_TRACKER_LOCATION); 00084 00085 m_XLabel->SetText (TEXT ("X") ); 00086 m_YLabel->SetText (TEXT ("Y") ); 00087 m_ZLabel->SetText (TEXT ("Z") ); 00088 m_XLabel->SetMinimumWidth (12); 00089 m_YLabel->SetMinimumWidth (12); 00090 m_ZLabel->SetMinimumWidth (12); 00091 m_XLabel->SetTextColor (Color (0xFFCCCCCC) ); 00092 m_YLabel->SetTextColor (Color (0xFFCCCCCC) ); 00093 m_ZLabel->SetTextColor (Color (0xFFCCCCCC) ); 00094 00095 m_XLabel->SetFont (GetSysBoldFont() ); 00096 m_YLabel->SetFont (GetSysBoldFont() ); 00097 m_ZLabel->SetFont (GetSysBoldFont() ); 00098 00099 00100 //SpaceLayout* spacex = new SpaceLayout; 00101 //spacex->SetMinimumWidth(4); 00102 //SpaceLayout* spacey = new SpaceLayout; 00103 //spacey->SetMinimumWidth(4); 00104 00105 SpaceLayout *spacez = new SpaceLayout(); 00106 00107 spacez->SetMinimumWidth (4); 00108 m_hlayout->AddView (m_MouseControlledButton, 0); 00109 m_hlayout->AddView (m_XLabel, 0); 00110 //m_hlayout->AddLayout(spacex, 0); 00111 m_hlayout->AddView (m_XEdit, 1); 00112 m_hlayout->AddView (m_YLabel, 0); 00113 //m_hlayout->AddLayout(spacey, 0); 00114 m_hlayout->AddView (m_YEdit, 1); 00115 m_hlayout->AddView (m_ZLabel, 0); 00116 m_hlayout->AddView (m_ZEdit, 1); 00117 m_hlayout->AddLayout (spacez, 0); 00118 m_hlayout->SetHorizontalInternalMargin (4); 00119 SetCompositionLayout (m_hlayout); 00120 } 00121 00122 Vector3DoubleValuator::~Vector3DoubleValuator() 00123 { 00124 } 00125 00126 long Vector3DoubleValuator::ProcessEvent (IEvent &ievent, long TraverseInfo, long ProcessEventInfo) 00127 { 00128 long ret = TraverseInfo; 00129 ret = m_MouseControlledButton->OnEvent (ievent, ret, ProcessEventInfo); 00130 ret = m_XEdit->ProcessEvent (ievent, ret, ProcessEventInfo); 00131 ret = m_YEdit->ProcessEvent (ievent, ret, ProcessEventInfo); 00132 ret = m_ZEdit->ProcessEvent (ievent, ret, ProcessEventInfo); 00133 ret = PostProcessEvent2 (ievent, ret, ProcessEventInfo); 00134 return ret; 00135 } 00136 00137 void Vector3DoubleValuator::Draw (GraphicsEngine &GfxContext, bool force_draw) 00138 { 00139 Geometry base = GetGeometry(); 00140 GetPainter().PaintBackground (GfxContext, base); 00141 00142 00143 Geometry geo = m_MouseControlledButton->GetGeometry(); 00144 geo.OffsetSize (5, 0); 00145 00146 if (m_XEdit->IsMouseInside() || 00147 m_YEdit->IsMouseInside() || 00148 m_ZEdit->IsMouseInside() || 00149 m_MouseControlledButton->IsMouseOwner() || m_MouseControlledButton->IsMouseInside() ) 00150 { 00151 00152 GetPainter().PushDrawShapeLayer (GfxContext, geo, eSHAPE_CORNER_ROUND4, SPINBOX_BUTTON_MOUSEOVER_COLOR, eCornerTopLeft | eCornerBottomLeft); 00153 } 00154 else 00155 { 00156 GetPainter().PushDrawShapeLayer (GfxContext, geo, eSHAPE_CORNER_ROUND4, SPINBOX_BUTTON_COLOR, 00157 eCornerTopLeft | eCornerBottomLeft); 00158 } 00159 00160 geo = base; 00161 geo.OffsetSize (-m_MouseControlledButton->GetBaseWidth(), 0); 00162 geo.OffsetPosition (+m_MouseControlledButton->GetBaseWidth(), 0); 00163 00164 GetPainter().PushDrawShapeLayer (GfxContext, geo, eSHAPE_CORNER_ROUND4, SPINBOX_BUTTON_COLOR, 00165 eCornerTopLeft | eCornerBottomLeft | eCornerTopRight | eCornerBottomRight); 00166 00167 GeometryPositioning gp (eHACenter, eVACenter); 00168 Geometry GeoPo = ComputeGeometryPositioning (m_MouseControlledButton->GetGeometry(), GetTheme().GetImageGeometry (eVALUATORMOVE), gp); 00169 00170 if (m_Mouse == 1) 00171 { 00172 if (m_MouseControlledButton->IsMouseInside() ) 00173 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORHORIZONTALMOVE); 00174 else 00175 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORHORIZONTALMOVE); 00176 } 00177 else if (m_Mouse == 3) 00178 { 00179 if (m_MouseControlledButton->IsMouseInside() ) 00180 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORVERTICALMOVE); 00181 else 00182 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORVERTICALMOVE); 00183 } 00184 else 00185 { 00186 if (m_MouseControlledButton->IsMouseInside() ) 00187 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORMOVE); 00188 else 00189 GetPainter().PaintShape (GfxContext, GeoPo, Color (0xFFFFFFFF), eVALUATORMOVE); 00190 } 00191 00192 00193 00194 geo = m_XEdit->GetGeometry(); 00195 geo.OffsetPosition (-4, 0); 00196 geo.OffsetSize (+8, 0); 00197 GetPainter().PaintShapeCorner (GfxContext, geo, m_XEdit->GetTextBackgroundColor(), eSHAPE_CORNER_ROUND4, 00198 eCornerTopLeft | eCornerBottomLeft | eCornerTopRight | eCornerBottomRight, false); 00199 00200 geo = m_YEdit->GetGeometry(); 00201 geo.OffsetPosition (-4, 0); 00202 geo.OffsetSize (+8, 0); 00203 GetPainter().PaintShapeCorner (GfxContext, geo, m_YEdit->GetTextBackgroundColor(), eSHAPE_CORNER_ROUND4, 00204 eCornerTopLeft | eCornerBottomLeft | eCornerTopRight | eCornerBottomRight, false); 00205 00206 geo = m_ZEdit->GetGeometry(); 00207 geo.OffsetPosition (-4, 0); 00208 geo.OffsetSize (+8, 0); 00209 GetPainter().PaintShapeCorner (GfxContext, geo, m_ZEdit->GetTextBackgroundColor(), eSHAPE_CORNER_ROUND4, 00210 eCornerTopLeft | eCornerBottomLeft | eCornerTopRight | eCornerBottomRight, false); 00211 00212 // GetPainter().PaintShape(GfxContext, m_XLabel->GetGeometry(), m_XEdit->GetTextBackgroundColor(), eVECTORXLABEL); 00213 // GetPainter().PaintShape(GfxContext, m_YLabel->GetGeometry(), m_YEdit->GetTextBackgroundColor(), eVECTORYLABEL); 00214 // GetPainter().PaintShape(GfxContext, m_ZLabel->GetGeometry(), m_ZEdit->GetTextBackgroundColor(), eVECTORZLABEL); 00215 00216 00217 m_XEdit->QueueDraw(); 00218 m_YEdit->QueueDraw(); 00219 m_ZEdit->QueueDraw(); 00220 m_XLabel->QueueDraw(); 00221 m_YLabel->QueueDraw(); 00222 m_ZLabel->QueueDraw(); 00223 } 00224 00225 void Vector3DoubleValuator::DrawContent (GraphicsEngine &GfxContext, bool force_draw) 00226 { 00227 m_XEdit->ProcessDraw (GfxContext, force_draw); 00228 m_YEdit->ProcessDraw (GfxContext, force_draw); 00229 m_ZEdit->ProcessDraw (GfxContext, force_draw); 00230 m_XLabel->ProcessDraw (GfxContext, force_draw); 00231 m_YLabel->ProcessDraw (GfxContext, force_draw); 00232 m_ZLabel->ProcessDraw (GfxContext, force_draw); 00233 } 00234 00235 void Vector3DoubleValuator::PostDraw (GraphicsEngine &GfxContext, bool force_draw) 00236 { 00237 00238 } 00239 00240 void Vector3DoubleValuator::SetValue (double x, double y, double z) 00241 { 00242 SetVectorX (x); 00243 SetVectorY (y); 00244 SetVectorZ (z); 00245 } 00246 00247 void Vector3DoubleValuator::SetVectorX (double value) 00248 { 00249 m_X = m_DoubleValidator.GetClampedValue (value); 00250 m_XEdit->SetText (NString::Printf ("%.3f", m_X) ); 00251 sigValueChanged.emit (this); 00252 sigValue.emit (m_X, m_Y, m_Z); 00253 QueueDraw(); 00254 } 00255 00256 void Vector3DoubleValuator::SetVectorY (double value) 00257 { 00258 m_Y = m_DoubleValidator.GetClampedValue (value); 00259 m_YEdit->SetText (NString::Printf ("%.3f", m_Y) ); 00260 sigValueChanged.emit (this); 00261 sigValue.emit (m_X, m_Y, m_Z); 00262 QueueDraw(); 00263 } 00264 00265 void Vector3DoubleValuator::SetVectorZ (double value) 00266 { 00267 m_Z = m_DoubleValidator.GetClampedValue (value); 00268 m_ZEdit->SetText (NString::Printf ("%.3f", m_Z) ); 00269 sigValueChanged.emit (this); 00270 sigValue.emit (m_X, m_Y, m_Z); 00271 QueueDraw(); 00272 } 00273 00274 double Vector3DoubleValuator::GetVectorX() const 00275 { 00276 return m_X; 00277 } 00278 00279 double Vector3DoubleValuator::GetVectorY() const 00280 { 00281 return m_Y; 00282 } 00283 00284 double Vector3DoubleValuator::GetVectorZ() const 00285 { 00286 return m_Z; 00287 } 00288 00289 void Vector3DoubleValuator::SetStep (double i) 00290 { 00291 m_Step = i; 00292 00293 if (m_Step <= 0) 00294 m_Step = 1; 00295 00296 QueueDraw(); 00297 } 00298 00299 double Vector3DoubleValuator::GetStep() const 00300 { 00301 return m_Step; 00302 } 00303 00304 double Vector3DoubleValuator::GetMinValue() const 00305 { 00306 return m_DoubleValidator.GetMinimum(); 00307 } 00308 00309 double Vector3DoubleValuator::GetMaxValue() const 00310 { 00311 return m_DoubleValidator.GetMaximum(); 00312 } 00313 00314 void Vector3DoubleValuator::SetRange (double MinValue, double Maxvalue) 00315 { 00316 m_DoubleValidator.SetMinimum (MinValue); 00317 m_DoubleValidator.SetMaximum (Maxvalue); 00318 m_X = m_DoubleValidator.GetClampedValue (m_X); 00319 m_Y = m_DoubleValidator.GetClampedValue (m_Y); 00320 m_Z = m_DoubleValidator.GetClampedValue (m_Z); 00321 sigValueChanged.emit (this); 00322 sigValue.emit (m_X, m_Y, m_Z); 00323 QueueDraw(); 00324 } 00325 00326 void Vector3DoubleValuator::ImplementIncrementX() 00327 { 00328 SetBaseX (m_X + m_Step); 00329 00330 if (m_X < m_DoubleValidator.GetMaximum() ) 00331 { 00332 QueueDraw(); 00333 } 00334 00335 sigValueChanged.emit (this); 00336 sigIncrement.emit (this); 00337 sigValue.emit (m_X, m_Y, m_Z); 00338 } 00339 00340 void Vector3DoubleValuator::ImplementDecrementX() 00341 { 00342 SetBaseX (m_X - m_Step); 00343 00344 if (m_X > m_DoubleValidator.GetMinimum() ) 00345 { 00346 QueueDraw(); 00347 } 00348 00349 sigValueChanged.emit (this); 00350 sigDecrement.emit (this); 00351 sigValue.emit (m_X, m_Y, m_Z); 00352 } 00353 00354 void Vector3DoubleValuator::ImplementIncrementY() 00355 { 00356 SetBaseY (m_Y + m_Step); 00357 00358 if (m_Y < m_DoubleValidator.GetMaximum() ) 00359 { 00360 QueueDraw(); 00361 } 00362 00363 sigValueChanged.emit (this); 00364 sigIncrement.emit (this); 00365 sigValue.emit (m_X, m_Y, m_Z); 00366 } 00367 00368 void Vector3DoubleValuator::ImplementDecrementY() 00369 { 00370 SetVectorY (m_Y - m_Step); 00371 00372 if (m_Y > m_DoubleValidator.GetMinimum() ) 00373 { 00374 QueueDraw(); 00375 } 00376 00377 sigValueChanged.emit (this); 00378 sigDecrement.emit (this); 00379 sigValue.emit (m_X, m_Y, m_Z); 00380 } 00381 00382 void Vector3DoubleValuator::ImplementIncrementZ() 00383 { 00384 SetVectorZ (m_Z + m_Step); 00385 00386 if (m_Z < m_DoubleValidator.GetMaximum() ) 00387 { 00388 QueueDraw(); 00389 } 00390 00391 sigValueChanged.emit (this); 00392 sigIncrement.emit (this); 00393 sigValue.emit (m_X, m_Y, m_Z); 00394 } 00395 00396 void Vector3DoubleValuator::ImplementDecrementZ() 00397 { 00398 SetVectorZ (m_Z - m_Step); 00399 00400 if (m_Z > m_DoubleValidator.GetMinimum() ) 00401 { 00402 QueueDraw(); 00403 } 00404 00405 sigValueChanged.emit (this); 00406 sigDecrement.emit (this); 00407 sigValue.emit (m_X, m_Y, m_Z); 00408 } 00409 00410 void Vector3DoubleValuator::ImplementValidateEntryX() 00411 { 00412 double ret = 0; 00413 ret = CharToDouble (m_XEdit->GetCleanText().GetTCharPtr() ); 00414 { 00415 m_X = m_DoubleValidator.GetClampedValue (ret); 00416 m_XEdit->SetText (NString::Printf ("%.3f", m_X) ); 00417 sigValueChanged.emit (this); 00418 sigValue.emit (m_X, m_Y, m_Z); 00419 } 00420 // else 00421 // { 00422 // m_XEdit->SetText(NString::Printf("%.3f", m_X)); 00423 // sigValueChanged.emit(this); 00424 // sigValue.emit(m_X, m_Y, m_Z); 00425 // } 00426 } 00427 00428 void Vector3DoubleValuator::ImplementValidateEntryY() 00429 { 00430 double ret = 0; 00431 ret = CharToDouble (m_YEdit->GetCleanText().GetTCharPtr() ); 00432 { 00433 m_Y = m_DoubleValidator.GetClampedValue (ret); 00434 m_YEdit->SetText (NString::Printf ("%.3f", m_Y) ); 00435 sigValueChanged.emit (this); 00436 sigValue.emit (m_X, m_Y, m_Z); 00437 } 00438 // else 00439 // { 00440 // m_YEdit->SetText(NString::Printf("%.3f", m_Y)); 00441 // sigValueChanged.emit(this); 00442 // sigValue.emit(m_X, m_Y, m_Z); 00443 // } 00444 } 00445 00446 void Vector3DoubleValuator::ImplementValidateEntryZ() 00447 { 00448 double ret = 0; 00449 ret = CharToDouble (m_ZEdit->GetCleanText().GetTCharPtr() ); 00450 { 00451 m_Z = m_DoubleValidator.GetClampedValue (ret); 00452 m_ZEdit->SetText (NString::Printf ("%.3f", m_Z) ); 00453 sigValueChanged.emit (this); 00454 sigValue.emit (m_X, m_Y, m_Z); 00455 } 00456 // else 00457 // { 00458 // m_ZEdit->SetText(NString::Printf("%.3f", m_Z)); 00459 // sigValueChanged.emit(this); 00460 // sigValue.emit(m_X, m_Y, m_Z); 00461 // } 00462 } 00463 00464 00465 }