Fixed/extended/modified ban stuff to be good for inclusion
[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
24 #include "gettext.h"
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         changeCtype("");
100         {
101                 core::rect<s32> rect(0, 0, 110, 20);
102                 rect += topleft_client + v2s32(35, ypos+6);
103                 Environment->addStaticText(wgettext("Old Password"),
104                         rect, false, true, this, -1);
105         }
106         changeCtype("C");
107         {
108                 core::rect<s32> rect(0, 0, 230, 30);
109                 rect += topleft_client + v2s32(160, ypos);
110                 gui::IGUIEditBox *e = 
111                 Environment->addEditBox(L"", rect, true, this, ID_oldPassword);
112                 Environment->setFocus(e);
113                 e->setPasswordBox(true);
114         }
115         ypos += 50;
116         changeCtype("");
117         {
118                 core::rect<s32> rect(0, 0, 110, 20);
119                 rect += topleft_client + v2s32(35, ypos+6);
120                 Environment->addStaticText(wgettext("New Password"),
121                         rect, false, true, this, -1);
122         }
123         changeCtype("C");
124         {
125                 core::rect<s32> rect(0, 0, 230, 30);
126                 rect += topleft_client + v2s32(160, ypos);
127                 gui::IGUIEditBox *e = 
128                 Environment->addEditBox(L"", rect, true, this, ID_newPassword1);
129                 e->setPasswordBox(true);
130         }
131         ypos += 50;
132         changeCtype("");
133         {
134                 core::rect<s32> rect(0, 0, 110, 20);
135                 rect += topleft_client + v2s32(35, ypos+6);
136                 Environment->addStaticText(wgettext("Confirm Password"),
137                         rect, false, true, this, -1);
138         }
139         changeCtype("C");
140         {
141                 core::rect<s32> rect(0, 0, 230, 30);
142                 rect += topleft_client + v2s32(160, ypos);
143                 gui::IGUIEditBox *e = 
144                 Environment->addEditBox(L"", rect, true, this, ID_newPassword2);
145                 e->setPasswordBox(true);
146         }
147
148         ypos += 50;
149         changeCtype("");
150         {
151                 core::rect<s32> rect(0, 0, 140, 30);
152                 rect = rect + v2s32(size.X/2-140/2, ypos);
153                 Environment->addButton(rect, this, ID_change, wgettext("Change"));
154         }
155
156         ypos += 50;
157         {
158                 core::rect<s32> rect(0, 0, 300, 20);
159                 rect += topleft_client + v2s32(35, ypos);
160                 IGUIElement *e = 
161                 Environment->addStaticText(
162                         wgettext("Passwords do not match!"),
163                         rect, false, true, this, ID_message);
164                 e->setVisible(false);
165         }
166         changeCtype("C");
167
168 }
169
170 void GUIPasswordChange::drawMenu()
171 {
172         gui::IGUISkin* skin = Environment->getSkin();
173         if (!skin)
174                 return;
175         video::IVideoDriver* driver = Environment->getVideoDriver();
176         
177         video::SColor bgcolor(140,0,0,0);
178         driver->draw2DRectangle(bgcolor, AbsoluteRect, &AbsoluteClippingRect);
179
180         gui::IGUIElement::draw();
181 }
182
183 bool GUIPasswordChange::acceptInput()
184 {
185                 std::wstring oldpass;
186                 std::wstring newpass;
187                 gui::IGUIElement *e;
188                 e = getElementFromId(ID_oldPassword);
189                 if(e != NULL)
190                         oldpass = e->getText();
191                 e = getElementFromId(ID_newPassword1);
192                 if(e != NULL)
193                         newpass = e->getText();
194                 e = getElementFromId(ID_newPassword2);
195                 if(e != NULL && newpass != e->getText())
196                 {
197                         e = getElementFromId(ID_message);
198                         if(e != NULL)
199                                 e->setVisible(true);
200                         return false;
201                 }
202                 m_client->sendChangePassword(oldpass, newpass);
203                 return true;
204 }
205
206 bool GUIPasswordChange::OnEvent(const SEvent& event)
207 {
208         if(event.EventType==EET_KEY_INPUT_EVENT)
209         {
210                 if(event.KeyInput.Key==KEY_ESCAPE && event.KeyInput.PressedDown)
211                 {
212                         quitMenu();
213                         return true;
214                 }
215                 if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
216                 {
217                         if(acceptInput())
218                                 quitMenu();
219                         return true;
220                 }
221         }
222         if(event.EventType==EET_GUI_EVENT)
223         {
224                 if(event.GUIEvent.EventType==gui::EGET_ELEMENT_FOCUS_LOST
225                                 && isVisible())
226                 {
227                         if(!canTakeFocus(event.GUIEvent.Element))
228                         {
229                                 dstream<<"GUIPasswordChange: Not allowing focus change."
230                                                 <<std::endl;
231                                 // Returning true disables focus change
232                                 return true;
233                         }
234                 }
235                 if(event.GUIEvent.EventType==gui::EGET_BUTTON_CLICKED)
236                 {
237                         switch(event.GUIEvent.Caller->getID())
238                         {
239                         case ID_change:
240                                 if(acceptInput())
241                                         quitMenu();
242                                 return true;
243                         }
244                 }
245                 if(event.GUIEvent.EventType==gui::EGET_EDITBOX_ENTER)
246                 {
247                         switch(event.GUIEvent.Caller->getID())
248                         {
249                         case ID_oldPassword:
250                         case ID_newPassword1:
251                         case ID_newPassword2:
252                                 if(acceptInput())
253                                         quitMenu();
254                                 return true;
255                         }
256                 }
257         }
258
259         return Parent ? Parent->OnEvent(event) : false;
260 }
261