Modernize client code (#6250)
[oweals/minetest.git] / src / guiPasswordChange.cpp
1 /*
2 Part of Minetest
3 Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2013 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 const int ID_cancel = 261;
37
38 GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env,
39                 gui::IGUIElement* parent, s32 id,
40                 IMenuManager *menumgr,
41                 Client* client
42 ):
43         GUIModalMenu(env, parent, id, menumgr),
44         m_client(client)
45 {
46 }
47
48 GUIPasswordChange::~GUIPasswordChange()
49 {
50         removeChildren();
51 }
52
53 void GUIPasswordChange::removeChildren()
54 {
55         const core::list<gui::IGUIElement *> &children = getChildren();
56         core::list<gui::IGUIElement *> children_copy;
57         for (core::list<gui::IGUIElement *>::ConstIterator i = children.begin();
58                         i != children.end(); i++) {
59                 children_copy.push_back(*i);
60         }
61         for (core::list<gui::IGUIElement *>::Iterator i = children_copy.begin();
62                         i != children_copy.end(); i++) {
63                 (*i)->remove();
64         }
65 }
66 void GUIPasswordChange::regenerateGui(v2u32 screensize)
67 {
68         /*
69                 save current input
70         */
71         acceptInput();
72
73         /*
74                 Remove stuff
75         */
76         removeChildren();
77
78         /*
79                 Calculate new sizes and positions
80         */
81         core::rect<s32> rect(
82                         screensize.X/2 - 580/2,
83                         screensize.Y/2 - 300/2,
84                         screensize.X/2 + 580/2,
85                         screensize.Y/2 + 300/2
86         );
87
88         DesiredRect = rect;
89         recalculateAbsolutePosition(false);
90
91         v2s32 size = rect.getSize();
92         v2s32 topleft_client(40, 0);
93
94         const wchar_t *text;
95
96         /*
97                 Add stuff
98         */
99         s32 ypos = 50;
100         {
101                 core::rect<s32> rect(0, 0, 150, 20);
102                 rect += topleft_client + v2s32(25, ypos + 6);
103                 text = wgettext("Old Password");
104                 Environment->addStaticText(text, rect, false, true, this, -1);
105                 delete[] text;
106         }
107         {
108                 core::rect<s32> rect(0, 0, 230, 30);
109                 rect += topleft_client + v2s32(160, ypos);
110                 gui::IGUIEditBox *e = Environment->addEditBox(
111                                 m_oldpass.c_str(), rect, true, this, ID_oldPassword);
112                 Environment->setFocus(e);
113                 e->setPasswordBox(true);
114         }
115         ypos += 50;
116         {
117                 core::rect<s32> rect(0, 0, 150, 20);
118                 rect += topleft_client + v2s32(25, ypos + 6);
119                 text = wgettext("New Password");
120                 Environment->addStaticText(text, rect, false, true, this, -1);
121                 delete[] text;
122         }
123         {
124                 core::rect<s32> rect(0, 0, 230, 30);
125                 rect += topleft_client + v2s32(160, ypos);
126                 gui::IGUIEditBox *e = Environment->addEditBox(
127                                 m_newpass.c_str(), rect, true, this, ID_newPassword1);
128                 e->setPasswordBox(true);
129         }
130         ypos += 50;
131         {
132                 core::rect<s32> rect(0, 0, 150, 20);
133                 rect += topleft_client + v2s32(25, ypos + 6);
134                 text = wgettext("Confirm Password");
135                 Environment->addStaticText(text, rect, false, true, this, -1);
136                 delete[] text;
137         }
138         {
139                 core::rect<s32> rect(0, 0, 230, 30);
140                 rect += topleft_client + v2s32(160, ypos);
141                 gui::IGUIEditBox *e = Environment->addEditBox(
142                                 m_newpass_confirm.c_str(), rect, true, this, ID_newPassword2);
143                 e->setPasswordBox(true);
144         }
145
146         ypos += 50;
147         {
148                 core::rect<s32> rect(0, 0, 100, 30);
149                 rect = rect + v2s32(size.X / 4 + 56, ypos);
150                 text = wgettext("Change");
151                 Environment->addButton(rect, this, ID_change, text);
152                 delete[] text;
153         }
154         {
155                 core::rect<s32> rect(0, 0, 100, 30);
156                 rect = rect + v2s32(size.X / 4 + 185, ypos);
157                 text = wgettext("Cancel");
158                 Environment->addButton(rect, this, ID_cancel, text);
159                 delete[] text;
160         }
161
162         ypos += 50;
163         {
164                 core::rect<s32> rect(0, 0, 300, 20);
165                 rect += topleft_client + v2s32(35, ypos);
166                 text = wgettext("Passwords do not match!");
167                 IGUIElement *e =
168                         Environment->addStaticText(
169                         text, rect, false, true, this, ID_message);
170                 e->setVisible(false);
171                 delete[] text;
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 void GUIPasswordChange::acceptInput()
189 {
190         gui::IGUIElement *e;
191         e = getElementFromId(ID_oldPassword);
192         if (e != NULL)
193                 m_oldpass = e->getText();
194         e = getElementFromId(ID_newPassword1);
195         if (e != NULL)
196                 m_newpass = e->getText();
197         e = getElementFromId(ID_newPassword2);
198         if (e != NULL)
199                 m_newpass_confirm = e->getText();
200 }
201
202 bool GUIPasswordChange::processInput()
203 {
204         if (m_newpass != m_newpass_confirm) {
205                 gui::IGUIElement *e = getElementFromId(ID_message);
206                 if (e != NULL)
207                         e->setVisible(true);
208                 return false;
209         }
210         m_client->sendChangePassword(wide_to_utf8(m_oldpass), wide_to_utf8(m_newpass));
211         return true;
212 }
213
214 bool GUIPasswordChange::OnEvent(const SEvent &event)
215 {
216         if (event.EventType == EET_KEY_INPUT_EVENT) {
217                 if (event.KeyInput.Key == KEY_ESCAPE && event.KeyInput.PressedDown) {
218                         quitMenu();
219                         return true;
220                 }
221                 if (event.KeyInput.Key == KEY_RETURN && event.KeyInput.PressedDown) {
222                         acceptInput();
223                         if (processInput())
224                                 quitMenu();
225                         return true;
226                 }
227         }
228         if (event.EventType == EET_GUI_EVENT) {
229                 if (event.GUIEvent.EventType == gui::EGET_ELEMENT_FOCUS_LOST &&
230                                 isVisible()) {
231                         if (!canTakeFocus(event.GUIEvent.Element)) {
232                                 dstream << "GUIPasswordChange: Not allowing focus change."
233                                         << std::endl;
234                                 // Returning true disables focus change
235                                 return true;
236                         }
237                 }
238                 if (event.GUIEvent.EventType == gui::EGET_BUTTON_CLICKED) {
239                         switch (event.GUIEvent.Caller->getID()) {
240                         case ID_change:
241                                 acceptInput();
242                                 if (processInput())
243                                         quitMenu();
244                                 return true;
245                         case ID_cancel:
246                                 quitMenu();
247                                 return true;
248                         }
249                 }
250                 if (event.GUIEvent.EventType == gui::EGET_EDITBOX_ENTER) {
251                         switch (event.GUIEvent.Caller->getID()) {
252                         case ID_oldPassword:
253                         case ID_newPassword1:
254                         case ID_newPassword2:
255                                 acceptInput();
256                                 if (processInput())
257                                         quitMenu();
258                                 return true;
259                         }
260                 }
261         }
262
263         return Parent ? Parent->OnEvent(event) : false;
264 }