AutoCatGnome/gui/LoginWindow.cpp
2022-02-23 15:14:13 +03:00

88 lines
2.7 KiB
C++

//
// Created by selim on 03.01.2022.
//
#include "LoginWindow.h"
#include "MainWindow.h"
#include "../services/Api.h"
#include <gtkmm/application.h>
#include <gtkmm/box.h>
#include <iostream>
LoginWindow::LoginWindow() {
set_title("Login");
set_default_size(640, 480);
_emailField.set_placeholder_text("Email");
_passwordField.set_placeholder_text("Password");
_passwordField.set_input_purpose(Gtk::InputPurpose::PASSWORD);
_passwordField.set_visibility(false);
_emailField.signal_changed().connect(sigc::mem_fun(*this, &LoginWindow::validateFields));
_passwordField.signal_changed().connect(sigc::mem_fun(*this, &LoginWindow::validateFields));
_loginButton.set_margin_top(8);
_loginButton.set_margin_bottom(8);
_loginButton.set_label("Log in");
_loginButton.signal_clicked().connect(sigc::mem_fun(*this, &LoginWindow::loginClicked));
_loginButton.set_sensitive(false);
Gtk::Box box(Gtk::Orientation::VERTICAL, 8);
box.set_margin(48);
box.set_valign(Gtk::Align::CENTER);
box.append(_emailField);
box.append(_passwordField);
box.append(_loginButton);
box.append(_spinner);
set_child(box);
}
void LoginWindow::loginClicked() {
auto email = _emailField.get_text();
auto password = _passwordField.get_text();
enableControls(false);
_spinner.start();
try {
auto user = co_await Api::login(email, password);
auto app = this->get_application();
auto mainWindow = new MainWindow();
mainWindow->show();
hide();
app->add_window(*mainWindow);
app->remove_window(*this);
} catch (std::exception& ex) {
enableControls(true);
_spinner.stop();
showError(ex.what());
}
}
void LoginWindow::validateFields() {
bool buttonEnabled = _emailField.get_text_length() > 0 && _passwordField.get_text_length() > 0;
_loginButton.set_sensitive(buttonEnabled);
}
void LoginWindow::showError(const std::string& message) {
_dialog = std::make_unique<Gtk::MessageDialog>("Error",
false,
Gtk::MessageType::ERROR,
Gtk::ButtonsType::OK,
true);
_dialog->set_secondary_text(message);
_dialog->set_transient_for(*this);
_dialog->set_hide_on_close(true);
_dialog->signal_response().connect(sigc::hide(sigc::mem_fun(*_dialog, &Gtk::Widget::hide)));
_dialog->show();
}
void LoginWindow::enableControls(bool enable) {
_loginButton.set_sensitive(enable);
_emailField.set_sensitive(enable);
_passwordField.set_sensitive(enable);
}