]> git.lizzy.rs Git - minetest.git/blob - src/guiPasswordChange.cpp
Added the ability to change your password (via pause menu)
[minetest.git] / src / guiPasswordChange.cpp
1 /*
2 Minetest-c55
3 Copyright (C) 2010-11 celeron55, Perttu Ahola <celeron55@gmail.com>
4 Copyright (C) 2011 Ciaran Gultnieks <ciaran@ciarang.com>
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License along
17 with this program; if not, write to the Free Software Foundation, Inc.,
18 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 */
20
21 #include "guiPasswordChange.h"
22 #include "debug.h"
23 #include "serialization.h"
24 #include <string>
25
26 const int ID_oldPassword = 256;
27 const int ID_newPassword1 = 257;
28 const int ID_newPassword2 = 258;
29 const int ID_change = 259;
30 const int ID_message = 260;
31
32 GUIPasswordChange::GUIPasswordChange(gui::IGUIEnvironment* env,
33                 gui::IGUIElement* parent, s32 id,
34                 IMenuManager *menumgr,
35                 Client* client
36 ):
37         GUIModalMenu(env, parent, id, menumgr),
38         m_client(client)
39 {
40 }
41
42 GUIPasswordChange::~GUIPasswordChange()
43 {
44         removeChildren();
45 }
46
47 void GUIPasswordChange::removeChildren()
48 {
49         {
50                 gui::IGUIElement *e = getElementFromId(ID_oldPassword);
51                 if(e != NULL)
52                         e->remove();
53         }
54         {
55                 gui::IGUIElement *e = getElementFromId(ID_newPassword1);
56                 if(e != NULL)
57                         e->remove();
58         }
59         {
60                 gui::IGUIElement *e = getElementFromId(ID_newPassword2);
61                 if(e != NULL)
62                         e->remove();
63         }
64         {
65                 gui::IGUIElement *e = getElementFromId(ID_change);
66                 if(e != NULL)
67                         e->remove();
68         }
69 }
70
71 void GUIPasswordChange::regenerateGui(v2u32 screensize)
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         v2s32 size_client = size - v2s32(40, 0);
94
95         /*
96                 Add stuff
97         */
98         s32 ypos = 50;
99         {
100                 core::rect<s32> rect(0, 0, 110, 20);
101                 rect += topleft_client + v2s32(35, ypos+6);
102                 const wchar_t *text = L"Old Password";
103                 Environment->addStaticText(text, rect, false, true, this, -1);
104         }
105         {
106                 core::rect<s32> rect(0, 0, 230, 30);
107                 rect += topleft_client + v2s32(160, ypos);
108                 gui::IGUIEditBox *e = 
109                 Environment->addEditBox(L"", rect, true, this, ID_oldPassword);
110                 Environment->setFocus(e);
111                 e->setPasswordBox(true);
112         }
113         ypos += 50;
114         {
115                 core::rect<s32> rect(0, 0, 110, 20);
116                 rect += topleft_client + v2s32(35, ypos+6);
117                 const wchar_t *text = L"New Password";
118                 Environment->addStaticText(text, rect, false, true, this, -1);
119         }
120         {
121                 core::rect<s32> rect(0, 0, 230, 30);
122                 rect += topleft_client + v2s32(160, ypos);
123                 gui::IGUIEditBox *e = 
124                 Environment->addEditBox(L"", rect, true, this, ID_newPassword1);
125                 e->setPasswordBox(true);
126         }
127         ypos += 50;
128         {
129                 core::rect<s32> rect(0, 0, 110, 20);
130                 rect += topleft_client + v2s32(35, ypos+6);
131                 const wchar_t *text = L"Confirm Password";
132                 Environment->addStaticText(text, rect, false, true, this, -1);
133         }
134         {
135                 core::rect<s32> rect(0, 0, 230, 30);
136                 rect += topleft_client + v2s32(160, ypos);
137                 gui::IGUIEditBox *e = 
138                 Environment->addEditBox(L"", rect, true, this, ID_newPassword2);
139                 e->setPasswordBox(true);
140         }
141
142         ypos += 50;
143         {
144                 core::rect<s32> rect(0, 0, 140, 30);
145                 rect = rect + v2s32(size.X/2-140/2, ypos);
146                 Environment->addButton(rect, this, ID_change, L"Change");
147         }
148
149         ypos += 50;
150         {
151                 core::rect<s32> rect(0, 0, 300, 20);
152                 rect += topleft_client + v2s32(35, ypos);
153                 const wchar_t *text = L"Passwords do not match!";
154                 IGUIElement *e = 
155                 Environment->addStaticText(text, rect, false, true, this, ID_message);
156                 e->setVisible(false);
157         }
158
159 }
160
161 void GUIPasswordChange::drawMenu()
162 {
163         gui::IGUISkin* skin = Environment->getSkin();
164         if (!skin)
165                 return;
166         video::IVideoDriver* driver = Environment->getVideoDriver();
167         
168         video::SColor bgcolor(140,0,0,0);
169         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
170
171         gui::IGUIElement::draw();
172 }
173
174 bool GUIPasswordChange::acceptInput()
175 {
176                 std::wstring oldpass;
177                 std::wstring newpass;
178                 gui::IGUIElement *e;
179                 e = getElementFromId(ID_oldPassword);
180                 if(e != NULL)
181                         oldpass = e->getText();
182                 e = getElementFromId(ID_newPassword1);
183                 if(e != NULL)
184                         newpass = e->getText();
185                 e = getElementFromId(ID_newPassword2);
186                 if(e != NULL && newpass != e->getText())
187                 {
188                         e = getElementFromId(ID_message);
189                         if(e != NULL)
190                                 e->setVisible(true);
191                         return false;
192                 }
193                 m_client->sendChangePassword(oldpass, newpass);
194                 return true;
195 }
196
197 bool GUIPasswordChange::OnEvent(const SEvent& event)
198 {
199         if(event.EventType==EET_KEY_INPUT_EVENT)
200         {
201                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
202                 {
203                         quitMenu();
204                         return true;
205                 }
206                 if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
207                 {
208                         if(acceptInput())
209                                 quitMenu();
210                         return true;
211                 }
212         }
213         if(event.EventType==EET_GUI_EVENT)
214         {
215                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
216                                 && isVisible())
217                 {
218                         if(!canTakeFocus(event.GUIEvent.Element))
219                         {
220                                 dstream<<"GUIPasswordChange: Not allowing focus change."
221                                                 <<std::endl;
222                                 // Returning true disables focus change
223                                 return true;
224                         }
225                 }
226                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
227                 {
228                         switch(event.GUIEvent.Caller->getID())
229                         {
230                         case ID_change:
231                                 if(acceptInput())
232                                         quitMenu();
233                                 return true;
234                         }
235                 }
236                 if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER)
237                 {
238                         switch(event.GUIEvent.Caller->getID())
239                         {
240                         case ID_oldPassword:
241                         case ID_newPassword1:
242                         case ID_newPassword2:
243                                 if(acceptInput())
244                                         quitMenu();
245                                 return true;
246                         }
247                 }
248         }
249
250         return Parent ? Parent->OnEvent(event) : false;
251 }
252