#include "../include/LoginWindow.hpp" #include #include #include #include #include #include #include #include namespace dchat { LoginWindow::LoginWindow() : loginButton("Login"), loginHandlerUser(nullptr), registerButton("Register"), registerHandlerUser(nullptr), passwordMismatchHandler(nullptr) { setupLogin(); setupRegister(); set_halign(Gtk::ALIGN_CENTER); set_valign(Gtk::ALIGN_CENTER); set_border_width(0); attach(loginLayout, 0, 0, 1, 1); attach(registerLayout, 0, 0, 1, 1); loginLayout.show_all(); } void LoginWindow::setLoginHandler(LoginHandler loginHandler) { loginHandlerUser = loginHandler; } void LoginWindow::setRegisterHandler(RegisterHandler registerHandler) { registerHandlerUser = registerHandler; } void LoginWindow::setRegisterPasswordMismatch(RegisterPasswordMismatchHandler passwordMismatchHandler) { this->passwordMismatchHandler = passwordMismatchHandler; } void LoginWindow::setupLogin() { loginHandler = [this] { if(loginHandlerUser) loginHandlerUser(loginUsernameInput.get_text(), loginPasswordInput.get_text()); }; Gtk::Label *username = Gtk::manage(new Gtk::Label("Username")); username->set_halign(Gtk::ALIGN_START); loginLayout.attach(*username, 0, 0, 1, 1); loginUsernameInput.set_size_request(200); loginUsernameInput.signal_activate().connect(loginHandler); loginLayout.attach_next_to(loginUsernameInput, *username, Gtk::POS_BOTTOM, 3, 1); Gtk::Alignment *usernamePasswordSpacer = Gtk::manage(new Gtk::Alignment()); usernamePasswordSpacer->set_size_request(-1, 35); loginLayout.attach_next_to(*usernamePasswordSpacer, loginUsernameInput, Gtk::POS_BOTTOM, 1, 1); Gtk::Label *password = Gtk::manage(new Gtk::Label("Password")); password->set_halign(Gtk::ALIGN_START); loginLayout.attach_next_to(*password, *usernamePasswordSpacer, Gtk::POS_BOTTOM, 1, 1); loginPasswordInput.set_visibility(false); loginPasswordInput.set_size_request(200); loginPasswordInput.signal_activate().connect(loginHandler); loginLayout.attach_next_to(loginPasswordInput, *password, Gtk::POS_BOTTOM, 3, 1); Gtk::Alignment *loginButtonSpacerTop = Gtk::manage(new Gtk::Alignment()); loginButtonSpacerTop->set_size_request(-1, 20); loginLayout.attach_next_to(*loginButtonSpacerTop, loginPasswordInput, Gtk::POS_BOTTOM, 1, 1); Gtk::Alignment *loginButtonSpacer = Gtk::manage(new Gtk::Alignment()); loginLayout.attach_next_to(*loginButtonSpacer, *loginButtonSpacerTop, Gtk::POS_BOTTOM, 2, 1); loginButton.set_halign(Gtk::ALIGN_END); loginButton.signal_clicked().connect(loginHandler); loginButton.get_style_context()->add_class("confirm-button"); loginLayout.attach_next_to(loginButton, *loginButtonSpacer, Gtk::POS_RIGHT, 1, 1); Gtk::Separator *separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); separator->get_style_context()->add_class("separator-horizontal-margin"); loginLayout.attach_next_to(*separator, *loginButtonSpacer, Gtk::POS_BOTTOM, 3, 1); Gtk::Label *registerText = Gtk::manage(new Gtk::Label("Don't have an account? ")); loginLayout.attach_next_to(*registerText, *separator, Gtk::POS_BOTTOM, 1, 1); Gtk::Label *registerTextClickable = Gtk::manage(new Gtk::Label()); registerTextClickable->set_markup("Register a new one"); Gtk::EventBox *eventBox = Gtk::manage(new Gtk::EventBox()); eventBox->add(*registerTextClickable); auto pointerCursor = Gdk::Cursor::create(Gdk::Display::get_default(), "pointer"); //eventBox->get_window()->set_cursor(pointerCursor); eventBox->signal_button_release_event().connect([this](GdkEventButton *event) { loginLayout.hide(); registerLayout.show_all(); get_window()->invalidate(true); return true; }); loginLayout.attach_next_to(*eventBox, *registerText, Gtk::POS_RIGHT, 1, 1); loginLayout.get_style_context()->add_class("login-window"); } void LoginWindow::setupRegister() { registerHandler = [this] { if(registerPasswordInput.get_text() != registerPasswordRepeatInput.get_text()) { if(passwordMismatchHandler) passwordMismatchHandler(); return; } if(registerHandlerUser) registerHandlerUser(registerUsernameInput.get_text(), registerPasswordInput.get_text()); }; Gtk::Label *username = Gtk::manage(new Gtk::Label("Username")); username->set_halign(Gtk::ALIGN_START); registerLayout.attach(*username, 0, 0, 1, 1); registerUsernameInput.set_size_request(200); registerUsernameInput.signal_activate().connect(registerHandler); registerLayout.attach_next_to(registerUsernameInput, *username, Gtk::POS_BOTTOM, 3, 1); Gtk::Alignment *usernamePasswordSpacer = Gtk::manage(new Gtk::Alignment()); usernamePasswordSpacer->set_size_request(-1, 35); registerLayout.attach_next_to(*usernamePasswordSpacer, registerUsernameInput, Gtk::POS_BOTTOM, 1, 1); Gtk::Label *password = Gtk::manage(new Gtk::Label("Password")); password->set_halign(Gtk::ALIGN_START); registerLayout.attach_next_to(*password, *usernamePasswordSpacer, Gtk::POS_BOTTOM, 1, 1); registerPasswordInput.set_visibility(false); registerPasswordInput.set_size_request(200); registerPasswordInput.signal_activate().connect(registerHandler); registerLayout.attach_next_to(registerPasswordInput, *password, Gtk::POS_BOTTOM, 3, 1); Gtk::Label *repeatPassword = Gtk::manage(new Gtk::Label("Repeat password")); repeatPassword->set_halign(Gtk::ALIGN_START); registerLayout.attach_next_to(*repeatPassword, registerPasswordInput, Gtk::POS_BOTTOM, 1, 1); registerPasswordRepeatInput.set_visibility(false); registerPasswordRepeatInput.set_size_request(200); registerPasswordRepeatInput.signal_activate().connect(registerHandler); registerLayout.attach_next_to(registerPasswordRepeatInput, *repeatPassword, Gtk::POS_BOTTOM, 3, 1); Gtk::Alignment *registerButtonSpacerTop = Gtk::manage(new Gtk::Alignment()); registerButtonSpacerTop->set_size_request(-1, 20); registerLayout.attach_next_to(*registerButtonSpacerTop, registerPasswordRepeatInput, Gtk::POS_BOTTOM, 1, 1); Gtk::Alignment *registerButtonSpacer = Gtk::manage(new Gtk::Alignment()); registerLayout.attach_next_to(*registerButtonSpacer, *registerButtonSpacerTop, Gtk::POS_BOTTOM, 2, 1); registerButton.set_halign(Gtk::ALIGN_END); registerButton.signal_clicked().connect(registerHandler); registerButton.get_style_context()->add_class("confirm-button"); registerLayout.attach_next_to(registerButton, *registerButtonSpacer, Gtk::POS_RIGHT, 1, 1); Gtk::Separator *separator = Gtk::manage(new Gtk::Separator(Gtk::ORIENTATION_HORIZONTAL)); separator->get_style_context()->add_class("separator-horizontal-margin"); registerLayout.attach_next_to(*separator, *registerButtonSpacer, Gtk::POS_BOTTOM, 3, 1); Gtk::Label *loginText = Gtk::manage(new Gtk::Label("Already have an account? ")); registerLayout.attach_next_to(*loginText, *separator, Gtk::POS_BOTTOM, 1, 1); Gtk::Label *loginTextClickable = Gtk::manage(new Gtk::Label()); loginTextClickable->set_markup("Login to an existing account"); Gtk::EventBox *eventBox = Gtk::manage(new Gtk::EventBox()); eventBox->add(*loginTextClickable); auto pointerCursor = Gdk::Cursor::create(Gdk::Display::get_default(), "pointer"); //eventBox->get_window()->set_cursor(pointerCursor); eventBox->signal_button_release_event().connect([this](GdkEventButton *event) { registerLayout.hide(); loginLayout.show_all(); get_window()->invalidate(true); return true; }); registerLayout.attach_next_to(*eventBox, *loginText, Gtk::POS_RIGHT, 1, 1); registerLayout.get_style_context()->add_class("login-window"); } }