1 module armos.utils.gui.widgets.togglebutton;
2
3 public import armos.utils.gui.widgets.widget;
4
5 ///
6 class ToggleButton : Widget{
7 public{
8 this(in string name, ref bool v){
9 _v = &v;
10 _name = name;
11
12 import armos.events;
13 import armos.app;
14 import rx;
15
16 currentObservables.mouseReleased.doSubscribe!(event => this.mouseReleased(event));
17 currentObservables.mousePressed.doSubscribe!(event => this.mousePressed(event));
18
19 _height = 32;
20 }
21
22 /++
23 +/
24 override void draw(){
25 import armos.graphics:color,
26 drawRectangle;
27 color(_style.colors["background"]);
28 drawRectangle(0, 0, _style.width, _style.font.height*4);
29
30 _style.font.material.uniform("diffuse", _style.colors["font1"]);
31 _style.font.draw(_name, _style.font.width, 0);
32
33 if(*_v){
34 color(_style.colors["base2"]);
35 }else{
36 color(_style.colors["base1"]);
37 }
38
39 drawRectangle(_style.font.width, _style.font.height, _style.font.width*2, _style.font.height*2);
40 }
41
42 /++
43 +/
44 override void mousePressed(ref armos.events.MousePressedEvent message){
45 _isPressing = isOnMouse(message.x, message.y);
46 }
47
48 /++
49 +/
50 override void mouseReleased(ref armos.events.MouseReleasedEvent message){
51 if(_isPressing){
52 *_v = !(*_v);
53 _isPressing = false;
54 }
55 }
56 }//public
57
58 private{
59 bool* _v;
60 string _name;
61 bool _isPressing = false;
62
63 bool isOnMouse(in int x, in int y){
64 immutable int localX = x-_position[0];
65 immutable int localY = y-_position[1];
66 if(_style.font.width<localX && localX<_style.font.width*3){
67 if(_style.font.height<localY && localY<_style.font.height*3){
68 return true;
69 }
70 }
71 return false;
72 }
73 }//private
74 }//class ToggleButton