From 458901c0297777fbd25a8d430962d4d14ec7b99f Mon Sep 17 00:00:00 2001 From: Selim Mustafaev Date: Fri, 13 May 2022 01:55:00 +0300 Subject: [PATCH] fixed crash on text field editing --- gtkpp/Application.cpp | 2 +- gtkpp/Application.h | 1 + gtkpp/Entry.cpp | 13 +++++++++++-- gtkpp/Entry.h | 4 +++- gtkpp/Spinner.cpp | 8 ++++++++ gtkpp/Spinner.h | 2 ++ gui/LoginWindow.cpp | 22 +++++++++++----------- 7 files changed, 37 insertions(+), 15 deletions(-) diff --git a/gtkpp/Application.cpp b/gtkpp/Application.cpp index c25f532..76ec3b5 100644 --- a/gtkpp/Application.cpp +++ b/gtkpp/Application.cpp @@ -22,7 +22,6 @@ namespace gtkpp { } void Application::onActivate(const std::function& callback) { - _signalActivate.connect(callback); } @@ -31,6 +30,7 @@ namespace gtkpp { } void Application::addWindow(const std::shared_ptr& window) { + _window = window; gtk_application_add_window(GTK_APPLICATION(_app), GTK_WINDOW(window->gobj())); } diff --git a/gtkpp/Application.h b/gtkpp/Application.h index adc4f7e..69eae34 100644 --- a/gtkpp/Application.h +++ b/gtkpp/Application.h @@ -17,6 +17,7 @@ namespace gtkpp { class Application { private: AdwApplication* _app; + std::shared_ptr _window; sigc::signal _signalActivate; private: diff --git a/gtkpp/Entry.cpp b/gtkpp/Entry.cpp index 793d1d1..a65143a 100644 --- a/gtkpp/Entry.cpp +++ b/gtkpp/Entry.cpp @@ -3,11 +3,11 @@ // #include "Entry.h" +#include namespace gtkpp { - void changedCallback(GtkEntry* widget, void* data) { - auto entry = reinterpret_cast(data); + void changedCallback(GtkEntry*, Entry* entry) { entry->_signalChanged.emit(); } @@ -32,4 +32,13 @@ namespace gtkpp { _signalChanged.connect(callback); } + int Entry::textLength() const { + return gtk_entry_get_text_length(GTK_ENTRY(_widget)); + } + + std::string Entry::text() const { + auto buffer = gtk_entry_get_buffer(GTK_ENTRY(_widget)); + return gtk_entry_buffer_get_text(buffer); + } + } diff --git a/gtkpp/Entry.h b/gtkpp/Entry.h index c396b71..e55640f 100644 --- a/gtkpp/Entry.h +++ b/gtkpp/Entry.h @@ -16,7 +16,7 @@ namespace gtkpp { sigc::signal _signalChanged; private: - friend void changedCallback(GtkEntry* widget, void* data); + friend void changedCallback(GtkEntry*, Entry* entry); public: Entry(); @@ -24,6 +24,8 @@ namespace gtkpp { void setPurpose(GtkInputPurpose purpose); void setVisibility(bool visibility); void onChanged(const std::function& callback); + int textLength() const; + std::string text() const; }; } diff --git a/gtkpp/Spinner.cpp b/gtkpp/Spinner.cpp index a3eae51..6526d1f 100644 --- a/gtkpp/Spinner.cpp +++ b/gtkpp/Spinner.cpp @@ -10,4 +10,12 @@ namespace gtkpp { _widget = gtk_spinner_new(); } + void Spinner::start() { + gtk_spinner_start(GTK_SPINNER(_widget)); + } + + void Spinner::stop() { + gtk_spinner_stop(GTK_SPINNER(_widget)); + } + } diff --git a/gtkpp/Spinner.h b/gtkpp/Spinner.h index 171308f..e0c126a 100644 --- a/gtkpp/Spinner.h +++ b/gtkpp/Spinner.h @@ -12,6 +12,8 @@ namespace gtkpp { class Spinner: public Widget { public: Spinner(); + void start(); + void stop(); }; } diff --git a/gui/LoginWindow.cpp b/gui/LoginWindow.cpp index 8509bac..eaa634d 100644 --- a/gui/LoginWindow.cpp +++ b/gui/LoginWindow.cpp @@ -48,12 +48,12 @@ LoginWindow::LoginWindow() { } void LoginWindow::loginClicked() { -// auto email = _emailField.get_text(); -// auto password = _passwordField.get_text(); -// -// enableControls(false); -// _spinner.start(); -// + auto email = _loginEntry.text(); + auto password = _passwordEntry.text(); + + enableControls(false); + _spinner.start(); + // try { // User user = co_await Api::login(email, password).scheduleOn(GLibMainContextExecutor::instance()); // auto app = this->get_application(); @@ -70,8 +70,8 @@ void LoginWindow::loginClicked() { } void LoginWindow::validateFields() { -// bool buttonEnabled = _emailField.get_text_length() > 0 && _passwordField.get_text_length() > 0; -// _loginButton.set_sensitive(buttonEnabled); + bool buttonEnabled = _loginEntry.textLength() > 3 && _passwordEntry.textLength() > 3; + _loginButton.setEnabled(buttonEnabled); } void LoginWindow::showError(const std::string& message) { @@ -88,7 +88,7 @@ void LoginWindow::showError(const std::string& message) { } void LoginWindow::enableControls(bool enable) { -// _loginButton.set_sensitive(enable); -// _emailField.set_sensitive(enable); -// _passwordField.set_sensitive(enable); + _loginButton.setEnabled(enable); + _loginEntry.setEnabled(enable); + _passwordEntry.setEnabled(enable); }