summaryrefslogtreecommitdiff
path: root/src/gui/login/LoginView.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/login/LoginView.cpp')
-rw-r--r--src/gui/login/LoginView.cpp148
1 files changed, 148 insertions, 0 deletions
diff --git a/src/gui/login/LoginView.cpp b/src/gui/login/LoginView.cpp
new file mode 100644
index 0000000..8ebbeb5
--- /dev/null
+++ b/src/gui/login/LoginView.cpp
@@ -0,0 +1,148 @@
+#include "LoginView.h"
+
+#include "gui/interface/Button.h"
+#include "gui/interface/Label.h"
+#include "gui/interface/Textbox.h"
+#include "gui/interface/Keys.h"
+#include "gui/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), "Sign Out")),
+ 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);
+ 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::OnTryExit(ExitMethod method)
+{
+ ui::Engine::Ref().CloseWindow();
+}
+
+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;
+}
+