Rev Author Line No. Line
1 ovan 1 #include "interface.h"
2 #include "window.h"
3  
4 namespace sleek
5 {
6     namespace gui
7     {
8         window::window(interface *m) noexcept : frame(m)
9         {
10             title_size = 20;
11             isHovored = isMoved = false;
12  
13             close = new button(m);
14             close->box = math::aabbox2di(math::vector2di(0,0),math::vector2di(10,10));
15             close->relative = math::vector2di(box.getSize().x-15, 5);
16             close->parent = getptr();
17             close->UpdateAbsolutePosition();
18             close->setText("Close");
19         }
20  
21         window::~window() noexcept
22         {
23             delete close;
24         }
25  
26         button* window::getCloseButton() const noexcept
27         {
28             return close;
29         }
30  
31         void window::UpdateFontPos() noexcept
32         {
33             textpos = absolute+relative;
34  
35             if(cache)
36             {
37                 textpos.y += cache->size.y+7;
38                 textpos.x += 12;
39             }
40         }
41  
42         void window::setScale(const math::vector2di &i) noexcept
43         {
44             frame::setScale(i);
45             close->relative = math::vector2di(box.getSize().x-15, 5);
46             close->UpdateAbsolutePosition();
47         }
48  
49         void window::move(const math::vector2di &i) noexcept
50         {
51             frame::move(i);
52             close->relative = math::vector2di(box.getSize().x-15, 5);
53             close->UpdateAbsolutePosition();
54         }
55  
56         bool window::manage(device::input *e) noexcept
57         {
58             bool CHovored = isHovored, CMoved = isMoved;
59  
60             if(close->manage(e) && e->gui.code == IET_BUTTON_CLICKED)
61             {
62                 mom->removeFrame(getptr());
63                 return true;
64             }
65  
66             if(e->type == device::EVENT_MOUSSE_DOWN && e->mouse[device::MOUSE_LEFT] &&  box.intersect(e->mouse_pos))
67             {
68                 mom->unActiveElement();
69                 isActive = true;
70             }
71  
72             if(frame::manage(e))
73                 return false;
74  
75             math::aabbox2di til(
76                 box.getUpperLeft(),
77                 math::vector2di(
78                     box.getUpperLeft().x+box.getSize().x,
79                     box.getUpperLeft().y+title_size
80                 )
81             );
82  
83             if(e->type == device::EVENT_MOUSSE_DOWN && e->mouse[device::MOUSE_LEFT] && til.intersect(e->mouse_pos))
84                 isMoved = true;
85             if(e->type == device::EVENT_MOUSSE_DOWN && e->mouse[device::MOUSE_LEFT] && box.intersect(e->mouse_pos))
86                 mom->popFrame(getptr());
87             if(e->type == device::EVENT_MOUSSE_UP)
88                 isMoved = false;
89             if(e->type == device::EVENT_MOUSSE_MOVED)
90             {
91                 if(!isMoved)
92                 {
93                     isHovored = box.intersect(e->mouse_pos);
94                     def = e->mouse_pos-box.getUpperLeft();
95                 }
96                 else
97                 {
98                     relative = math::vector2di();
99                     absolute = e->mouse_pos-def;
100                     UpdateAbsolutePosition();
101                     close->UpdateAbsolutePosition();
102                     UpdateFontPos();
103                 }
104             }
105  
106             if(isMoved)
107             {
108                 e->gui.called = this;
109                 e->gui.code = gui::IET_WINDOW_MOVED;
110                 return true;
111             }
112  
113             if(CHovored != isHovored)
114             {
115                 e->gui.called = this;
116                 e->gui.code = isHovored ?
9 ovan 117                     gui::IET_WINDOW_HOVORED :
118                     gui::IET_WINDOW_FOCUSED;
1 ovan 119                 return true;
120             }
121  
122             return false;
123         }
124  
125         void window::render() noexcept
126         {
127             if(!show) return;
128  
129             if(isMoved)
130             {
131                 mom->getTheme()->drawWindowMainMoved(this);
132                 mom->getTheme()->drawWindowDecorationMoved(this);
133                 mom->getTheme()->drawWindowTitleMoved(this);
134             }
135             else if(isHovored)
136             {
137                 mom->getTheme()->drawWindowMainHovored(this);
138                 mom->getTheme()->drawWindowDecorationHovored(this);
139                 mom->getTheme()->drawWindowTitleHovored(this);
140             }
141             else
142             {
143                 mom->getTheme()->drawWindowMain(this);
144                 mom->getTheme()->drawWindowDecoration(this);
145                 mom->getTheme()->drawWindowTitle(this);
146             }
147  
148             mom->getTheme()->drawFont(this);
149             close->render();
150             renderChild();
151         }
152     }
153 }