JugiMap Framework
jmGuiWidgetsA.h
1 #ifndef JUGIMAP_GUI_WIDGETS_A_H
2 #define JUGIMAP_GUI_WIDGETS_A_H
3 
4 
5 #include <memory>
6 #include "jmSprites.h"
7 #include "jmGuiCommon.h"
8 
9 
10 namespace jugimap {
11 
12 
15 
16 
17 enum class GuiButtonVisualState
18 {
19  NORMAL = 0,
20  NORMAL_CURSOR_OVER = 1,
21  NORMAL_CURSOR_DOWN = 2,
22  CHECKED = 3,
23  CHECKED_CURSOR_OVER = 4,
24  CHECKED_CURSOR_DOWN = 5,
25  NORMAL_HIGHLIGHTED = 6,
26  CHECKED_HIGHLIGHTED = 7,
27  DISABLED = 8,
28 };
29 
30 
31 enum class GuiButtonSpritePropertyKind
32 {
33 
35  SCALE,
36  ROTATION,
37  ALPHA,
38  LABEL_COLOR,
39  COLOR_OVERLAY,
40  VISIBILITY,
41  FRAME
42 
43 };
44 
45 
46 class GuiButtonSpritePropertyController
47 {
48 public:
49 
50  GuiButtonSpritePropertyController(Sprite *_sprite, GuiButtonSpritePropertyKind _controlledProperty) : sprite(_sprite), controlledProperty(_controlledProperty){}
51  virtual ~GuiButtonSpritePropertyController(){}
52  virtual void SetStartingState(GuiButtonVisualState _buttonVisualState) = 0;
53  virtual void Update(GuiButtonVisualState _buttonVisualState) = 0;
54 
55 
56 protected:
57  Sprite *sprite = nullptr;
58  GuiButtonSpritePropertyKind controlledProperty = GuiButtonSpritePropertyKind::NOT_DEFINED;
59  GuiButtonVisualState oldButtonVisualState = GuiButtonVisualState::NORMAL;
60 
61 };
62 
63 
64 struct GuiButtonSpriteFloatPropertyData
65 {
66 
67  float value = 0.0;
68 
69  // values if looping is used
70  float valueMin = 0.0;
71  float valueMax = 0.0;
72  int loopDurationMS = 0;
73 
74  enum class LoopType
75  {
76  REVERT_DIRECTION,
77  RESTART
78  };
79  LoopType loopType = LoopType::REVERT_DIRECTION;
80 
81 
82  //int reverseSign = 1;
83 
84  static GuiButtonSpriteFloatPropertyData ParseFromString(const std::string &text);
85 
86 };
87 
88 
89 class GuiButtonSpriteFloatPropertyController : public GuiButtonSpritePropertyController
90 {
91 public:
92 
93 
94  GuiButtonSpriteFloatPropertyController(Sprite *_sprite, GuiButtonSpritePropertyKind _controlledProperty) : GuiButtonSpritePropertyController(_sprite, _controlledProperty){}
95  void ParseMouseOverTransitionData(const std::string &text);
96 
97  void SetStartingState(GuiButtonVisualState _buttonVisualState) override;
98  void Update(GuiButtonVisualState _buttonVisualState) override;
99 
100  float GetSpritePropertyValue();
101  void ApplyPropertyValueToSprite(float _value);
102 
103 
104  std::vector<GuiButtonSpriteFloatPropertyData>propertyDataForStates = std::vector<GuiButtonSpriteFloatPropertyData>(9); // for every button visual state
105  //std::vector<std::shared_ptr<GuiButtonSpriteFloatPropertyData>>propertyDataForStates = std::vector<std::shared_ptr<GuiButtonSpriteFloatPropertyData>>(7); // for every button visual state
106 
107 
108 private:
109  float currentValue = 0.0;
110  float newValue = 0.0;
111  //float oldValue = 0.0;
112  float targetValue = 0.0;
113 
114  int reverseSign = 1;
115 
116  bool mouseOverTransition = false;
117  float mouseOverTransitionSpeed = 0.0;
118 
119  int timeCurrentMS = 0;
120  int timeStartMS = 0;
121  int timeEndMS = 0;
122 
123 };
124 
125 
126 class GuiButtonSpriteBoolPropertyController : public GuiButtonSpritePropertyController
127 {
128 public:
129 
130  GuiButtonSpriteBoolPropertyController(Sprite *_sprite, GuiButtonSpritePropertyKind _controlledProperty) : GuiButtonSpritePropertyController(_sprite, _controlledProperty){}
131 
132  void SetStartingState(GuiButtonVisualState _buttonVisualState) override;
133  void Update(GuiButtonVisualState _buttonVisualState) override;
134 
135  bool GetSpritePropertyValue();
136  void ApplyPropertyValueToSprite(bool _value);
137 
138 
139  std::vector<bool>propertyDataForStates = std::vector<bool>(9); // for every button visual state
140 
141 private:
142  bool currentValue = false;
143  bool newValue = false;
144  bool oldValue =false;
145 
146 };
147 
148 
149 class GuiButtonSpriteIntPropertyController : public GuiButtonSpritePropertyController
150 {
151 public:
152 
153  GuiButtonSpriteIntPropertyController(Sprite *_sprite, GuiButtonSpritePropertyKind _controlledProperty) : GuiButtonSpritePropertyController(_sprite, _controlledProperty){}
154 
155  void SetStartingState(GuiButtonVisualState _buttonVisualState) override;
156  void Update(GuiButtonVisualState _buttonVisualState) override;
157 
158  int GetSpritePropertyValue();
159  void ApplyPropertyValueToSprite(int _value);
160 
161 
162  std::vector<int>propertyDataForStates = std::vector<int>(9); // for every button visual state
163 
164 private:
165  int currentValue = false;
166  int newValue = false;
167  int oldValue =false;
168 
169 };
170 
171 
172 struct GuiButtonSpriteColorPropertyData
173 {
174 
175  ColorRGBAf value;
176 
177  // values if looping is used
178  ColorRGBAf valueMin;
179  ColorRGBAf valueMax;
180  int loopDurationMS = 0;
181 
182  enum class LoopType
183  {
184  REVERT_DIRECTION,
185  RESTART
186  };
187  LoopType loopType = LoopType::REVERT_DIRECTION;
188 
189 
190  //int reverseSign = 1;
191 
192  static GuiButtonSpriteColorPropertyData ParseFromString(const std::string &text);
193 
194 };
195 
196 
197 class GuiButtonSpriteColorPropertyController : public GuiButtonSpritePropertyController
198 {
199 public:
200 
201 
202  GuiButtonSpriteColorPropertyController(Sprite *_sprite, GuiButtonSpritePropertyKind _controlledProperty) : GuiButtonSpritePropertyController(_sprite, _controlledProperty){}
203  void ParseMouseOverTransitionTime(const std::string &text);
204  void ParseColorOverlayBlend(std::string text);
205 
206  void SetStartingState(GuiButtonVisualState _buttonVisualState) override;
207  void Update(GuiButtonVisualState _buttonVisualState) override;
208 
209  ColorRGBAf GetSpriteOverlayColor();
210  void ApplyOverlayColorToSprite(ColorRGBAf _value);
211 
212 
213  std::vector<GuiButtonSpriteColorPropertyData>propertyDataForStates = std::vector<GuiButtonSpriteColorPropertyData>(9); // for every button visual state
214 
215 
216 private:
217  ColorRGBAf currentValue;
218  ColorRGBAf newValue;
219  ColorRGBAf targetValue;
220 
221  int reverseSign = 1;
222 
223  bool mouseOverTransition = false;
224  float mouseOverTransitionSpeed = 0.0;
225 
226  ColorOverlayBlend blend;
227 
228 
229  bool reachedR = false;
230  bool reachedG = false;
231  bool reachedB = false;
232  bool reachedA = false;
233 
234 
235  void CheckColorReach(float &color, float targetColor, int sign, bool &reached);
236  void CheckColorReach(float &color, float targetColor1, float targetColor2, int sign, bool &reached);
237 };
238 
239 
240 class GuiButtonExclusiveGroup;
241 
242 
244 class GuiButton : public GuiWidget
245 {
246 public:
247 
251  GuiButton(Sprite *_sprite);
252 
253  ~GuiButton() override;
254 
255  void SetToInitialState() override;
256  void Update() override;
257  void SetDisabled(bool _disabled) override;
258  void SetVisible(bool _visible) override;
259 
260 
261 
263  Sprite* GetSprite(){ return rootSprite; }
264 
265 
270  void SetTextLabel(const std::string &_label);
271 
272 
277  bool IsCheckable(){ return checkable; }
278 
279 
284  void SetCheckable(bool _checkable){ checkable = _checkable; }
285 
286 
291  bool IsChecked(){ return checked;}
292 
293 
298  void SetChecked(bool _checked);
299 
300 
301 private:
302  Sprite *rootSprite = nullptr; // LINK
303  TextSprite *labelSprite = nullptr; // LINK
304  GuiButtonVisualState state = GuiButtonVisualState::NORMAL;
305  GuiButtonVisualState initialState = GuiButtonVisualState::NORMAL;
306  bool checkable = false;
307  bool checked = false;
308 
309  std::vector<GuiButtonSpritePropertyController*>spriteControllers; // OWNED
310 
311  GuiButtonExclusiveGroup* exclusiveGroup = nullptr; // LINK
312 
313 
314  void BuildControllersForSprite(Sprite * _sprite);
315  void _AddControllersForSprite(Sprite * _sprite);
316  void _AddFloatPropertyControllerIfNeeded(Sprite *_sprite, std::vector<Parameter>& cp, const std::string &propertyName, GuiButtonSpritePropertyKind propertyKind);
317  void _AddIntPropertyControllerIfNeeded(Sprite *_sprite, std::vector<Parameter>& cp, const std::string &propertyName, GuiButtonSpritePropertyKind propertyKind);
318  void _AddBooleanPropertyControllerIfNeeded(Sprite *_sprite, std::vector<Parameter>& cp, const std::string &propertyName, GuiButtonSpritePropertyKind propertyKind);
319  void _AddColorPropertyControllerIfNeeded(Sprite *_sprite, std::vector<Parameter>& cp, const std::string &propertyName, GuiButtonSpritePropertyKind propertyKind);
320 
321  int _ParseIntPropertyFromParameter(std::vector<Parameter>& cp, const std::string &parameterName, GuiButtonSpritePropertyKind propertyKind);
322 
323 };
324 
325 
326 class GuiButtonExclusiveGroup
327 {
328 public:
329 
330  GuiButtonExclusiveGroup(const std::string &_name) : name(_name){}
331 
332  void AddButton(GuiButton* _button);
333  std::string GetName(){ return name; }
334  std::vector<GuiButton*>& GetButtons(){ return buttons; }
335 
336 
337 private:
338  std::string name;
339  std::vector<GuiButton*> buttons; // LINKS
340 
341 };
342 
343 
344 
345 class GuiButtonExclusiveGroups
346 {
347 public:
348 
349  ~GuiButtonExclusiveGroups();
350  GuiButtonExclusiveGroup* FindGroup(const std::string &_name);
351  void AddGroup(GuiButtonExclusiveGroup *_g){ groups.push_back(_g); }
352 
353 
354 private:
355  std::vector<GuiButtonExclusiveGroup*> groups; // OWNED
356 };
357 
358 
359 extern GuiButtonExclusiveGroups guiButtonExclusiveGroups;
360 
361 
362 //================================================================================================
363 
364 
365 enum class GuiSliderState
366 {
367  IDLE = 0,
368  MOVING = 1,
369  //HIGHLIGHTED = 2,
370  DISABLED = 3
371 };
372 
373 
374 
376 class GuiSlider : public GuiWidget
377 {
378 public:
379 
383  GuiSlider(ComposedSprite * _sprite);
384 
385  ~GuiSlider() override;
386 
387  void SetToInitialState() override;
388  void Update() override;
389  void SetDisabled(bool _disabled) override;
390  void SetVisible(bool _visible) override;
391 
392 
394  bool IsValueChangedViaStepButtons(){ return valueChangedViaStepButtons;}
395 
396 
398  void SetValue(float _value);
399 
400 
402  float GetValue(){ return value; }
403 
404 
406  int GetIntValue(){ return (int) std::roundf(value); }
407 
408 
410  void SetValueMin(float _valueMin);
411 
412 
414  float GetValueMin(){ return valueMin; }
415 
416 
418  void SetValueMax(float _valueMax);
419 
420 
422  float GetValueMax(){ return valueMax; }
423 
424 
426  void SetValueLabelPrecision(int _precision){ valueLabelPrecision = _precision; }
427 
428 
430  void SetValueLabelSuffix(const std::string &_suffix){ valueLabelSuffix = _suffix; }
431 
432 
437  void SetDeltaValue(float _deltaValue, bool _inPercents){ deltaValue = _deltaValue/100.0; deltaValueInPercents = _inPercents; }
438 
439 
444  void SetSnapDivision(int _nSnapDivision);
445 
446 
447 
448 private:
449 
450  // link pointers
451  ComposedSprite *rootSprite = nullptr; // LINK
452  StandardSprite *slidingScaleSprite = nullptr; // LINK
453  TextSprite *valueLabel = nullptr; // LINK
454 
455  // owned data
456  GuiButton *slidingButton = nullptr; // OWNED
457  GuiButton *incrementButton = nullptr; // OWNED
458  GuiButton *decrementButton = nullptr; // OWNED
459 
460 
461  GuiSliderState state = GuiSliderState::IDLE;
462 
463  // status flags
464  bool valueChangedViaStepButtons = false;
465 
466  // data properties
467  float value = 5.0;
468  float valueMin = 0.0;
469  float valueMax = 10.0;
470 
471  float deltaValue = 0.05;
472  bool deltaValueInPercents = true;
473 
474  int nSnapDivision = -1;
475  std::vector<Vec2f>snapPositions;
476 
477  Vec2f slidingPosMin;
478  Vec2f slidingPosMax;
479  Vec2f virtualSlidingPos;
480 
481  Vec2f startMovingOffset;
482 
483  int valueLabelPrecision = 0;
484  std::string valueLabelSuffix;
485 
486 
487  void SetSlidingButtonPositionFromValues();
488  void SetValueFromSlidingButtonPosition();
489  void SetValueLabelText();
490  Vec2f GetSnappedPosition(Vec2f _pos);
491 
492 
493 };
494 
495 
496 
497 //================================================================================================
498 
499 
500 
501 class GuiBarSpriteController
502 {
503 public:
504 
505  GuiBarSpriteController(Sprite *_sprite) : sprite(_sprite){}
506  virtual ~GuiBarSpriteController(){}
507 
508 
509  virtual void Set(float value, float valueMin, float valueMax) = 0;
510  //virtual float GetValue(float valueMin, float valueMax) = 0;
511 
512 protected:
513  Sprite *sprite = nullptr; // LINK
514 
515 };
516 
517 
518 class GuiBarSpriteScaleController : public GuiBarSpriteController
519 {
520 public:
521 
522  struct PositionColor
523  {
524  float pos = 0.0; // relative position in bar 0.0 - 1.0
525  ColorRGBA color;
526  };
527 
528 
529  GuiBarSpriteScaleController(Sprite * _sprite) : GuiBarSpriteController(_sprite){}
530  void ParseFromString(const std::string &_text);
531 
532  void Set(float value, float valueMin, float valueMax) override;
533  //float GetValue(float valueMin, float valueMax) override;
534 
535 
536 private:
537  bool xScale = false;
538  bool yScale = false;
539  std::vector<PositionColor>colors;
540 };
541 
542 
543 class GuiBarSpriteFrameController : public GuiBarSpriteController
544 {
545 public:
546 
547  struct PositionColor
548  {
549  float pos = 0.0; // relative position in bar 0.0 - 1.0
550  ColorRGBA color;
551  };
552 
553 
554  GuiBarSpriteFrameController(Sprite * _sprite) : GuiBarSpriteController(_sprite){}
555  void ParseFromString(const std::string &_text);
556 
557  void Set(float value, float valueMin, float valueMax) override;
558 
559 
560 private:
561  int frameIndexMin = 0;
562  int frameIndexMax = 0;
563 };
564 
565 
566 
570 class GuiBar : public GuiWidget
571 {
572 
573 public:
574 
578  GuiBar(Sprite* _sprite);
579 
580  ~GuiBar();
581 
582 
583  void SetToInitialState() override;
584  void Update() override;
585 
586 
588  void SetValue(float _value);
589 
590 
592  float GetValue(){ return value; }
593 
594 
596  int GetIntValue(){ return (int) std::roundf(value); }
597 
598 
600  void SetValueMin(float _valueMin);
601 
602 
604  float GetValueMin(){ return valueMin; }
605 
606 
608  void SetValueMax(float _valueMax);
609 
610 
612  float GetValueMax(){ return valueMax; }
613 
614 
615 private:
616  Sprite *sprite = nullptr; // LINK
617  TextSprite *valueLabel = nullptr; // LINK
618 
619  float value = 5.0;
620  float valueMin = 0.0;
621  float valueMax = 10.0;
622 
623  GuiBarSpriteController* barSpriteController = nullptr; //OWNED
624 
625  int valueLabelPrecision = 0;
626  std::string valueLabelSuffix;
627 
628 
629  void BuildControllersForSprite(Sprite * _sprite);
630  void _AddControllersForSprite(Sprite * _sprite);
631 
632  void SetValueLabelText();
633 
634 };
635 
636 
638 
639 }
640 
641 
642 
643 #endif
jugimap::FileKind::NOT_DEFINED
The file kind not defined.
jugimap::AnimationTrackKind::ROTATION
Rotation.
jugimap::GuiBar::GuiBar
GuiBar(Sprite *_sprite)
Construct a new gui bar from the given *_sprite*.
Definition: jmGuiWidgetsA.cpp:2325
jugimap::GuiSlider::SetDisabled
void SetDisabled(bool _disabled) override
Set the disabled state of this widget.
Definition: jmGuiWidgetsA.cpp:1822
jugimap::GuiWidget
The GuiWidget class is the base widget class.
Definition: jmGuiCommon.h:65
jugimap::GuiBar::GetValue
float GetValue()
Returns the value of this bar.
Definition: jmGuiWidgetsA.h:592
jugimap::GuiBar
The GuiBar class provides a widget for bars.
Definition: jmGuiWidgetsA.h:570
jugimap::GuiSlider::GetValueMin
float GetValueMin()
Returns the minimum value of this slider.
Definition: jmGuiWidgetsA.h:414
jugimap::GuiSlider::SetSnapDivision
void SetSnapDivision(int _nSnapDivision)
Set the snap division.
Definition: jmGuiWidgetsA.cpp:2131
jugimap::GuiBar::SetValueMax
void SetValueMax(float _valueMax)
Set the maximum value of this bar.
Definition: jmGuiWidgetsA.cpp:2479
jugimap::GuiSlider::GetValue
float GetValue()
Returns the value of this slider.
Definition: jmGuiWidgetsA.h:402
jugimap::GuiSlider::SetValue
void SetValue(float _value)
Set the value of this slider.
Definition: jmGuiWidgetsA.cpp:1852
jugimap::GuiButton::SetVisible
void SetVisible(bool _visible) override
Set the visibility of this widget.
Definition: jmGuiWidgetsA.cpp:1391
jugimap::GuiBar::GetIntValue
int GetIntValue()
Returns the value of this bar rounded to integer.
Definition: jmGuiWidgetsA.h:596
jugimap::ColorOverlayBlend::NORMAL
Normal mode.
jugimap::GuiButton::GuiButton
GuiButton(Sprite *_sprite)
Construct a new gui button from the given *_sprite*.
Definition: jmGuiWidgetsA.cpp:779
jugimap::GuiSlider::SetVisible
void SetVisible(bool _visible) override
Set the visibility of this widget.
Definition: jmGuiWidgetsA.cpp:1836
jugimap::AnimationPlayerState::IDLE
The player is idle and has assigned no animation instance.
jugimap::GuiBar::SetValue
void SetValue(float _value)
Set the value of this bar.
Definition: jmGuiWidgetsA.cpp:2457
jugimap::GuiButton::SetDisabled
void SetDisabled(bool _disabled) override
Set the disabled state of this widget.
Definition: jmGuiWidgetsA.cpp:1360
jugimap::Blend::ALPHA
Alpha blend.
jugimap::GuiButton::SetChecked
void SetChecked(bool _checked)
Set the checked state of this button.
Definition: jmGuiWidgetsA.cpp:1414
jugimap::GuiSlider::GetValueMax
float GetValueMax()
Returns the maximum value of this slider.
Definition: jmGuiWidgetsA.h:422
jugimap::GuiBar::SetValueMin
void SetValueMin(float _valueMin)
Set the minimum value of this bar.
Definition: jmGuiWidgetsA.cpp:2470
jugimap::GuiSlider::SetValueLabelPrecision
void SetValueLabelPrecision(int _precision)
Set the displayed label precision (number of decimal digits) of this slider.
Definition: jmGuiWidgetsA.h:426
jugimap::StandardSprite
The StandardSprite class defines the sprite from JugiMap Editor.
Definition: jmSprites.h:787
jugimap::GuiButton
The GuiButton class provides a widget for buttons.
Definition: jmGuiWidgetsA.h:244
jugimap::GuiSlider::SetValueMax
void SetValueMax(float _valueMax)
Set the maximum value of this slider.
Definition: jmGuiWidgetsA.cpp:1873
jugimap::GuiSlider::GetIntValue
int GetIntValue()
Returns the value of this slider rounded to integer.
Definition: jmGuiWidgetsA.h:406
jugimap::Sprite
The Sprite is the base sprite class.
Definition: jmSprites.h:32
jugimap::GuiSlider::GuiSlider
GuiSlider(ComposedSprite *_sprite)
Construct a new gui slider from the given *_sprite*.
Definition: jmGuiWidgetsA.cpp:1653
jugimap::GuiBar::GetValueMax
float GetValueMax()
Returns the maximum value of this bar.
Definition: jmGuiWidgetsA.h:612
jugimap::GuiSlider::SetValueMin
void SetValueMin(float _valueMin)
Set the minimum value of this slider.
Definition: jmGuiWidgetsA.cpp:1863
jugimap::GuiButton::IsCheckable
bool IsCheckable()
Returns true if this button is checkable; otherwise returns false;.
Definition: jmGuiWidgetsA.h:277
jugimap::GuiButton::SetTextLabel
void SetTextLabel(const std::string &_label)
Set the text label of this button if applicable.
Definition: jmGuiWidgetsA.cpp:1604
jugimap::GuiSlider::IsValueChangedViaStepButtons
bool IsValueChangedViaStepButtons()
Returns true is the value has been changed with increment or decrement button.
Definition: jmGuiWidgetsA.h:394
jugimap::GuiSlider::SetValueLabelSuffix
void SetValueLabelSuffix(const std::string &_suffix)
Set the label suffix of this slider.
Definition: jmGuiWidgetsA.h:430
jugimap::GuiButton::IsChecked
bool IsChecked()
Returns true if this button is checked; otherwise returns false.
Definition: jmGuiWidgetsA.h:291
jugimap::ComposedSprite
The ComposedSprite class defines the composed sprite from JugiMap Editor.
Definition: jmSprites.h:682
jugimap::GuiSlider::SetDeltaValue
void SetDeltaValue(float _deltaValue, bool _inPercents)
Set the delta value step fot the incrementing and decrementing buttons.
Definition: jmGuiWidgetsA.h:437
jugimap::Vec2
2d vector.
Definition: jmCommon.h:23
jugimap::GuiBar::GetValueMin
float GetValueMin()
Returns the minimum value of this bar.
Definition: jmGuiWidgetsA.h:604
jugimap::GuiSlider
The GuiSlider class provides a widget for sliders.
Definition: jmGuiWidgetsA.h:376
jugimap::TextSprite
The TextSprite class defines the text sprite from JugiMap Editor.
Definition: jmSprites.h:889
jugimap::GuiButton::GetSprite
Sprite * GetSprite()
Returns the sprite of this button.
Definition: jmGuiWidgetsA.h:263
jugimap::GuiButton::SetCheckable
void SetCheckable(bool _checkable)
Set checkable status of this button.
Definition: jmGuiWidgetsA.h:284
jugimap::ColorOverlayBlend
ColorOverlayBlend
The blend modes for the shader based pixel blending which simulate photoshop blending modes.
Definition: jmGlobal.h:112