utility.h: Change Buffer's interface to be more compatible with SharedBuffer's interf...
[oweals/minetest.git] / src / guiPasswordChange.cpp
1 /*
2 Part of Minetest-c55
3 Copyright (C) 2011 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
5
6 Permission to use, copy, modify, and distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18
19 #include "guiPasswordChange.h"
20 #include "debug.h"
21 #include "serialization.h"
22 #include <string>
23 #include <IGUICheckBox.h>
24 #include <IGUIEditBox.h>
25 #include <IGUIButton.h>
26 #include <IGUIStaticText.h>
27 #include <IGUIFont.h>
28
29 #include "gettext.h"
30
31 const int ID_oldPassword = 256;
32 const int ID_newPassword1 = 257;
33 const int ID_newPassword2 = 258;
34 const int ID_change = 259;
35 const int ID_message = 260;
36
37 GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env,
38                 gui::IGUIElement* parent, s32 id,
39                 IMenuManager *menumgr,
40                 Client* client
41 ):
42         GUIModalMenu(env, parent, id, menumgr),
43         m_client(client)
44 {
45 }
46
47 GUIPasswordChange::~GUIPasswordChange()
48 {
49         removeChildren();
50 }
51
52 void GUIPasswordChange::removeChildren()
53 {
54         {
55                 gui::IGUIElement *e = getElementFromId(ID_oldPassword);
56                 if(e != NULL)
57                         e->remove();
58         }
59         {
60                 gui::IGUIElement *e = getElementFromId(ID_newPassword1);
61                 if(e != NULL)
62                         e->remove();
63         }
64         {
65                 gui::IGUIElement *e = getElementFromId(ID_newPassword2);
66                 if(e != NULL)
67                         e->remove();
68         }
69         {
70                 gui::IGUIElement *e = getElementFromId(ID_change);
71                 if(e != NULL)
72                         e->remove();
73         }
74 }
75
76 void GUIPasswordChange::regenerateGui(v2u32 screensize)
77 {
78         /*
79                 Remove stuff
80         */
81         removeChildren();
82         
83         /*
84                 Calculate new sizes and positions
85         */
86         core::rect<s32> rect(
87                         screensize.X/2 - 580/2,
88                         screensize.Y/2 - 300/2,
89                         screensize.X/2 + 580/2,
90                         screensize.Y/2 + 300/2
91         );
92         
93         DesiredRect = rect;
94         recalculateAbsolutePosition(false);
95
96         v2s32 size = rect.getSize();
97         v2s32 topleft_client(40, 0);
98         v2s32 size_client = size - v2s32(40, 0);
99
100         /*
101                 Add stuff
102         */
103         s32 ypos = 50;
104         changeCtype("");
105         {
106                 core::rect<s32> rect(0, 0, 110, 20);
107                 rect += topleft_client + v2s32(35, ypos+6);
108                 Environment->addStaticText(wgettext("Old Password"),
109                         rect, false, true, this, -1);
110         }
111         changeCtype("C");
112         {
113                 core::rect<s32> rect(0, 0, 230, 30);
114                 rect += topleft_client + v2s32(160, ypos);
115                 gui::IGUIEditBox *e = 
116                 Environment->addEditBox(L"", rect, true, this, ID_oldPassword);
117                 Environment->setFocus(e);
118                 e->setPasswordBox(true);
119         }
120         ypos += 50;
121         changeCtype("");
122         {
123                 core::rect<s32> rect(0, 0, 110, 20);
124                 rect += topleft_client + v2s32(35, ypos+6);
125                 Environment->addStaticText(wgettext("New Password"),
126                         rect, false, true, this, -1);
127         }
128         changeCtype("C");
129         {
130                 core::rect<s32> rect(0, 0, 230, 30);
131                 rect += topleft_client + v2s32(160, ypos);
132                 gui::IGUIEditBox *e = 
133                 Environment->addEditBox(L"", rect, true, this, ID_newPassword1);
134                 e->setPasswordBox(true);
135         }
136         ypos += 50;
137         changeCtype("");
138         {
139                 core::rect<s32> rect(0, 0, 110, 20);
140                 rect += topleft_client + v2s32(35, ypos+6);
141                 Environment->addStaticText(wgettext("Confirm Password"),
142                         rect, false, true, this, -1);
143         }
144         changeCtype("C");
145         {
146                 core::rect<s32> rect(0, 0, 230, 30);
147                 rect += topleft_client + v2s32(160, ypos);
148                 gui::IGUIEditBox *e = 
149                 Environment->addEditBox(L"", rect, true, this, ID_newPassword2);
150                 e->setPasswordBox(true);
151         }
152
153         ypos += 50;
154         changeCtype("");
155         {
156                 core::rect<s32> rect(0, 0, 140, 30);
157                 rect = rect + v2s32(size.X/2-140/2, ypos);
158                 Environment->addButton(rect, this, ID_change, wgettext("Change"));
159         }
160
161         ypos += 50;
162         {
163                 core::rect<s32> rect(0, 0, 300, 20);
164                 rect += topleft_client + v2s32(35, ypos);
165                 IGUIElement *e = 
166                 Environment->addStaticText(
167                         wgettext("Passwords do not match!"),
168                         rect, false, true, this, ID_message);
169                 e->setVisible(false);
170         }
171         changeCtype("C");
172
173 }
174
175 void GUIPasswordChange::drawMenu()
176 {
177         gui::IGUISkin* skin = Environment->getSkin();
178         if (!skin)
179                 return;
180         video::IVideoDriver* driver = Environment->getVideoDriver();
181         
182         video::SColor bgcolor(140,0,0,0);
183         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
184
185         gui::IGUIElement::draw();
186 }
187
188 bool GUIPasswordChange::acceptInput()
189 {
190                 std::wstring oldpass;
191                 std::wstring newpass;
192                 gui::IGUIElement *e;
193                 e = getElementFromId(ID_oldPassword);
194                 if(e != NULL)
195                         oldpass = e->getText();
196                 e = getElementFromId(ID_newPassword1);
197                 if(e != NULL)
198                         newpass = e->getText();
199                 e = getElementFromId(ID_newPassword2);
200                 if(e != NULL && newpass != e->getText())
201                 {
202                         e = getElementFromId(ID_message);
203                         if(e != NULL)
204                                 e->setVisible(true);
205                         return false;
206                 }
207                 m_client->sendChangePassword(oldpass, newpass);
208                 return true;
209 }
210
211 bool GUIPasswordChange::OnEvent(const SEvent& event)
212 {
213         if(event.EventType==EET_KEY_INPUT_EVENT)
214         {
215                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
216                 {
217                         quitMenu();
218                         return true;
219                 }
220                 if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
221                 {
222                         if(acceptInput())
223                                 quitMenu();
224                         return true;
225                 }
226         }
227         if(event.EventType==EET_GUI_EVENT)
228         {
229                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
230                                 && isVisible())
231                 {
232                         if(!canTakeFocus(event.GUIEvent.Element))
233                         {
234                                 dstream<<"GUIPasswordChange: Not allowing focus change."
235                                                 <<std::endl;
236                                 // Returning true disables focus change
237                                 return true;
238                         }
239                 }
240                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
241                 {
242                         switch(event.GUIEvent.Caller->getID())
243                         {
244                         case ID_change:
245                                 if(acceptInput())
246                                         quitMenu();
247                                 return true;
248                         }
249                 }
250                 if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER)
251                 {
252                         switch(event.GUIEvent.Caller->getID())
253                         {
254                         case ID_oldPassword:
255                         case ID_newPassword1:
256                         case ID_newPassword2:
257                                 if(acceptInput())
258                                         quitMenu();
259                                 return true;
260                         }
261                 }
262         }
263
264         return Parent ? Parent->OnEvent(event) : false;
265 }
266