summaryrefslogtreecommitdiff
path: root/src/login
diff options
context:
space:
mode:
authorSimon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:44:09 (GMT)
committer Simon Robertshaw <simon@hardwired.org.uk>2012-11-17 19:44:09 (GMT)
commit058a2edd75debbd0297f92572316daa704bd379f (patch)
treead303f091f9a08b209b91eb34a9fcad996a3de69 /src/login
parente3594aba9e05c6865d396418c028049cda92c2f3 (diff)
parent7a21ae192fe19868539956f3fe28e62b2c7c4429 (diff)
downloadpowder-058a2edd75debbd0297f92572316daa704bd379f.zip
powder-058a2edd75debbd0297f92572316daa704bd379f.tar.gz
Merge branch 'master' of github.com:FacialTurd/PowderToypp
Diffstat (limited to 'src/login')
-rw-r--r--src/login/LoginController.cpp59
-rw-r--r--src/login/LoginController.h35
-rw-r--r--src/login/LoginModel.cpp67
-rw-r--r--src/login/LoginModel.h35
-rw-r--r--src/login/LoginView.cpp151
-rw-r--r--src/login/LoginView.h45
6 files changed, 392 insertions, 0 deletions
diff --git a/src/login/LoginController.cpp b/src/login/LoginController.cpp
new file mode 100644
index 0000000..f27ad59
--- /dev/null
+++ b/src/login/LoginController.cpp
@@ -0,0 +1,59 @@
+/*
+ * LoginController.cpp
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#include "LoginController.h"
+#include "client/User.h"
+#include "client/Client.h"
+
+LoginController::LoginController(ControllerCallback * callback):
+ HasExited(false)
+{
+ // TODO Auto-generated constructor stub
+ loginView = new LoginView();
+ loginModel = new LoginModel();
+
+ loginView->AttachController(this);
+ loginModel->AddObserver(loginView);
+
+ this->callback = callback;
+
+}
+
+void LoginController::Login(string username, string password)
+{
+ loginModel->Login(username, password);
+}
+
+User LoginController::GetUser()
+{
+ return loginModel->GetUser();
+}
+
+void LoginController::Exit()
+{
+ if(ui::Engine::Ref().GetWindow() == loginView)
+ {
+ ui::Engine::Ref().CloseWindow();
+ }
+ if(callback)
+ callback->ControllerExit();
+ else
+ {
+ Client::Ref().SetAuthUser(loginModel->GetUser());
+ }
+ HasExited = true;
+}
+
+LoginController::~LoginController() {
+ if(ui::Engine::Ref().GetWindow() == loginView)
+ {
+ ui::Engine::Ref().CloseWindow();
+ }
+ delete loginModel;
+ delete loginView;
+}
+
diff --git a/src/login/LoginController.h b/src/login/LoginController.h
new file mode 100644
index 0000000..b20e187
--- /dev/null
+++ b/src/login/LoginController.h
@@ -0,0 +1,35 @@
+/*
+ * LoginController.h
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#ifndef LOGINCONTROLLER_H_
+#define LOGINCONTROLLER_H_
+
+#include <string>
+#include "LoginView.h"
+#include "LoginModel.h"
+#include "Controller.h"
+#include "client/User.h"
+
+using namespace std;
+
+class LoginView;
+class LoginModel;
+class LoginController {
+ LoginView * loginView;
+ LoginModel * loginModel;
+ ControllerCallback * callback;
+public:
+ bool HasExited;
+ LoginController(ControllerCallback * callback = NULL);
+ void Login(string username, string password);
+ void Exit();
+ LoginView * GetView() { return loginView; }
+ User GetUser();
+ virtual ~LoginController();
+};
+
+#endif /* LOGINCONTROLLER_H_ */
diff --git a/src/login/LoginModel.cpp b/src/login/LoginModel.cpp
new file mode 100644
index 0000000..3015613
--- /dev/null
+++ b/src/login/LoginModel.cpp
@@ -0,0 +1,67 @@
+/*
+ * LoginModel.cpp
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#include "LoginModel.h"
+
+LoginModel::LoginModel():
+ currentUser(0, "")
+{
+ // TODO Auto-generated constructor stub
+
+}
+
+void LoginModel::Login(string username, string password)
+{
+ statusText = "Logging in...";
+ loginStatus = false;
+ notifyStatusChanged();
+ LoginStatus status = Client::Ref().Login(username, password, currentUser);
+ switch(status)
+ {
+ case LoginOkay:
+ statusText = "Logged in";
+ loginStatus = true;
+ break;
+ case LoginError:
+ statusText = "Error: " + Client::Ref().GetLastError();
+ break;
+ }
+ notifyStatusChanged();
+}
+
+void LoginModel::AddObserver(LoginView * observer)
+{
+ observers.push_back(observer);
+}
+
+string LoginModel::GetStatusText()
+{
+ return statusText;
+}
+
+User LoginModel::GetUser()
+{
+ return currentUser;
+}
+
+bool LoginModel::GetStatus()
+{
+ return loginStatus;
+}
+
+void LoginModel::notifyStatusChanged()
+{
+ for(int i = 0; i < observers.size(); i++)
+ {
+ observers[i]->NotifyStatusChanged(this);
+ }
+}
+
+LoginModel::~LoginModel() {
+ // TODO Auto-generated destructor stub
+}
+
diff --git a/src/login/LoginModel.h b/src/login/LoginModel.h
new file mode 100644
index 0000000..121d78e
--- /dev/null
+++ b/src/login/LoginModel.h
@@ -0,0 +1,35 @@
+/*
+ * LoginModel.h
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#ifndef LOGINMODEL_H_
+#define LOGINMODEL_H_
+
+#include <vector>
+#include <string>
+#include "LoginView.h"
+#include "client/Client.h"
+
+using namespace std;
+
+class LoginView;
+class LoginModel {
+ vector<LoginView*> observers;
+ string statusText;
+ bool loginStatus;
+ void notifyStatusChanged();
+ User currentUser;
+public:
+ LoginModel();
+ void Login(string username, string password);
+ void AddObserver(LoginView * observer);
+ string GetStatusText();
+ bool GetStatus();
+ User GetUser();
+ virtual ~LoginModel();
+};
+
+#endif /* LOGINMODEL_H_ */
diff --git a/src/login/LoginView.cpp b/src/login/LoginView.cpp
new file mode 100644
index 0000000..8cbdcfb
--- /dev/null
+++ b/src/login/LoginView.cpp
@@ -0,0 +1,151 @@
+/*
+ * LoginView.cpp
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#include "LoginView.h"
+
+#include "interface/Button.h"
+#include "interface/Label.h"
+#include "interface/Textbox.h"
+#include "interface/Keys.h"
+#include "Style.h"
+
+class LoginView::LoginAction : public ui::ButtonAction
+{
+ LoginView * v;
+public:
+ LoginAction(LoginView * _v) { v = _v; }
+ void ActionCallback(ui::Button * sender)
+ {
+ v->c->Login(v->usernameField->GetText(), v->passwordField->GetText());
+ }
+};
+
+class LoginView::CancelAction : public ui::ButtonAction
+{
+ LoginView * v;
+public:
+ CancelAction(LoginView * _v) { v = _v; }
+ void ActionCallback(ui::Button * sender)
+ {
+ v->c->Exit();
+ }
+};
+
+LoginView::LoginView():
+ ui::Window(ui::Point(-1, -1), ui::Point(200, 87)),
+ loginButton(new ui::Button(ui::Point(200-100, 87-17), ui::Point(100, 17), "Sign in")),
+ cancelButton(new ui::Button(ui::Point(0, 87-17), ui::Point(101, 17), "Cancel")),
+ titleLabel(new ui::Label(ui::Point(4, 5), ui::Point(200-16, 16), "Server login")),
+ usernameField(new ui::Textbox(ui::Point(8, 25), ui::Point(200-16, 17), Client::Ref().GetAuthUser().Username, "[username]")),
+ passwordField(new ui::Textbox(ui::Point(8, 46), ui::Point(200-16, 17), "", "[password]")),
+ infoLabel(new ui::Label(ui::Point(8, 67), ui::Point(200-16, 16), "")),
+ targetSize(0, 0)
+{
+ targetSize = Size;
+ FocusComponent(usernameField);
+
+ infoLabel->Appearance.HorizontalAlign = ui::Appearance::AlignCentre; infoLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ infoLabel->Visible = false;
+ AddComponent(infoLabel);
+
+ AddComponent(loginButton);
+ SetOkayButton(loginButton);
+ loginButton->Appearance.HorizontalAlign = ui::Appearance::AlignRight;
+ loginButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ loginButton->Appearance.TextInactive = style::Colour::ConfirmButton;
+ loginButton->SetActionCallback(new LoginAction(this));
+ AddComponent(cancelButton);
+ SetCancelButton(cancelButton);
+ cancelButton->Appearance.HorizontalAlign = ui::Appearance::AlignLeft;
+ cancelButton->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ cancelButton->SetActionCallback(new CancelAction(this));
+ AddComponent(titleLabel);
+ titleLabel->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; titleLabel->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+
+ AddComponent(usernameField);
+ usernameField->Appearance.icon = IconUsername;
+ usernameField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; usernameField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ AddComponent(passwordField);
+ passwordField->Appearance.icon = IconPassword;
+ passwordField->Appearance.HorizontalAlign = ui::Appearance::AlignLeft; passwordField->Appearance.VerticalAlign = ui::Appearance::AlignMiddle;
+ passwordField->SetHidden(true);
+}
+
+void LoginView::OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt)
+{
+ switch(key)
+ {
+ case KEY_TAB:
+ if(IsFocused(usernameField))
+ FocusComponent(passwordField);
+ else
+ FocusComponent(usernameField);
+ break;
+ }
+}
+
+void LoginView::NotifyStatusChanged(LoginModel * sender)
+{
+ if(!infoLabel->GetText().length() && sender->GetStatusText().length())
+ {
+ targetSize = Size+ui::Point(0, 18);
+ infoLabel->Visible = true;
+ }
+ infoLabel->SetText(sender->GetStatusText());
+ if(sender->GetStatus())
+ {
+ c->Exit();
+ }
+}
+
+void LoginView::OnTick(float dt)
+{
+ //if(targetSize != Size)
+ {
+ ui::Point difference = targetSize-Size;
+ if(difference.X!=0)
+ {
+ int xdiff = difference.X/5;
+ if(xdiff == 0)
+ xdiff = 1*isign(difference.X);
+ Size.X += xdiff;
+ }
+ if(difference.Y!=0)
+ {
+ int ydiff = difference.Y/5;
+ if(ydiff == 0)
+ ydiff = 1*isign(difference.Y);
+ Size.Y += ydiff;
+ }
+
+ loginButton->Position.Y = Size.Y-17;
+ cancelButton->Position.Y = Size.Y-17;
+ }
+}
+
+void LoginView::OnDraw()
+{
+ Graphics * g = ui::Engine::Ref().g;
+ g->clearrect(Position.X-2, Position.Y-2, Size.X+3, Size.Y+3);
+ g->drawrect(Position.X, Position.Y, Size.X, Size.Y, 255, 255, 255, 255);
+}
+
+LoginView::~LoginView() {
+ RemoveComponent(titleLabel);
+ RemoveComponent(loginButton);
+ RemoveComponent(cancelButton);
+ RemoveComponent(usernameField);
+ RemoveComponent(passwordField);
+ RemoveComponent(infoLabel);
+ delete cancelButton;
+ delete loginButton;
+ delete titleLabel;
+ delete usernameField;
+ delete passwordField;
+ delete infoLabel;
+}
+
diff --git a/src/login/LoginView.h b/src/login/LoginView.h
new file mode 100644
index 0000000..fe87a3f
--- /dev/null
+++ b/src/login/LoginView.h
@@ -0,0 +1,45 @@
+/*
+ * LoginView.h
+ *
+ * Created on: Jan 24, 2012
+ * Author: Simon
+ */
+
+#ifndef LOGINVIEW_H_
+#define LOGINVIEW_H_
+
+#include "interface/Window.h"
+#include "LoginController.h"
+#include "LoginModel.h"
+
+namespace ui
+{
+ class Textbox;
+ class Button;
+ class Label;
+}
+
+class LoginController;
+class LoginMode;
+class LoginView: public ui::Window {
+ LoginController * c;
+ ui::Point targetSize;
+ ui::Button * loginButton;
+ ui::Button * cancelButton;
+ ui::Label * titleLabel;
+ ui::Label * infoLabel;
+ ui::Textbox * usernameField;
+ ui::Textbox * passwordField;
+public:
+ class LoginAction;
+ class CancelAction;
+ LoginView();
+ virtual void OnKeyPress(int key, Uint16 character, bool shift, bool ctrl, bool alt);
+ void AttachController(LoginController * c_) { c = c_; }
+ void NotifyStatusChanged(LoginModel * sender);
+ virtual void OnDraw();
+ virtual void OnTick(float dt);
+ virtual ~LoginView();
+};
+
+#endif /* LOGINVIEW_H_ */