From 1bbda92dc72e7b14358c38db78373923ecb806fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Tue, 30 Sep 2014 22:31:11 +0200 Subject: [PATCH] HaikuDepot: Request to login before rating a package * There is now a flow of logging in or creating an account before being able to rate a package and the user is not yet logged in. The UserLoginWindow stores an "on success" BMessenger and BMessage which are send after the alert which confirms successful login or account creation. This is used to make the RatePackageWindow show once logged in successfully. --- src/apps/haikudepot/ui/MainWindow.cpp | 46 ++++++++++++++---- src/apps/haikudepot/ui/MainWindow.h | 4 +- src/apps/haikudepot/ui/UserLoginWindow.cpp | 56 ++++++++++++++-------- src/apps/haikudepot/ui/UserLoginWindow.h | 9 ++++ 4 files changed, 85 insertions(+), 30 deletions(-) diff --git a/src/apps/haikudepot/ui/MainWindow.cpp b/src/apps/haikudepot/ui/MainWindow.cpp index 4c3084a3b0..12c2990fb0 100644 --- a/src/apps/haikudepot/ui/MainWindow.cpp +++ b/src/apps/haikudepot/ui/MainWindow.cpp @@ -240,7 +240,7 @@ MainWindow::MessageReceived(BMessage* message) break; case MSG_LOG_IN: - _OpenLoginWindow(); + _OpenLoginWindow(BMessage()); break; case MSG_LOG_OUT: @@ -368,15 +368,8 @@ MainWindow::MessageReceived(BMessage* message) } case MSG_RATE_PACKAGE: - { - // TODO: Allow only one RatePackageWindow - // TODO: Mechanism for remembering the window frame - RatePackageWindow* window = new RatePackageWindow(this, - BRect(0, 0, 500, 400), fModel); - window->SetPackage(fPackageInfoView->Package()); - window->Show(); + _RatePackage(); break; - } default: BWindow::MessageReceived(message); @@ -896,10 +889,14 @@ MainWindow::_NotifyUser(const char* title, const char* message) void -MainWindow::_OpenLoginWindow() +MainWindow::_OpenLoginWindow(const BMessage& onSuccessMessage) { UserLoginWindow* window = new UserLoginWindow(this, BRect(0, 0, 500, 400), fModel); + + if (onSuccessMessage.what != 0) + window->SetOnSuccessMessage(BMessenger(this), onSuccessMessage); + window->Show(); } @@ -911,3 +908,32 @@ MainWindow::_UpdateAuthorization() fLogOutItem->SetEnabled(username.Length() > 0); fFilterView->SetUsername(username); } + + +void +MainWindow::_RatePackage() +{ + if (fModel.Username().IsEmpty()) { + BAlert* alert = new(std::nothrow) BAlert( + B_TRANSLATE("Not logged in"), + B_TRANSLATE("You need to be logged into an account before you " + "can rate packages."), + B_TRANSLATE("Cancel"), + B_TRANSLATE("Login or Create account")); + + if (alert == NULL) + return; + + int32 choice = alert->Go(); + if (choice == 1) + _OpenLoginWindow(BMessage(MSG_RATE_PACKAGE)); + return; + } + + // TODO: Allow only one RatePackageWindow + // TODO: Mechanism for remembering the window frame + RatePackageWindow* window = new RatePackageWindow(this, + BRect(0, 0, 500, 400), fModel); + window->SetPackage(fPackageInfoView->Package()); + window->Show(); +} diff --git a/src/apps/haikudepot/ui/MainWindow.h b/src/apps/haikudepot/ui/MainWindow.h index 7e1bb1b398..0c133280d6 100644 --- a/src/apps/haikudepot/ui/MainWindow.h +++ b/src/apps/haikudepot/ui/MainWindow.h @@ -71,8 +71,10 @@ private: void _NotifyUser(const char* title, const char* message); - void _OpenLoginWindow(); + void _OpenLoginWindow( + const BMessage& onSuccessMessage); void _UpdateAuthorization(); + void _RatePackage(); private: FilterView* fFilterView; diff --git a/src/apps/haikudepot/ui/UserLoginWindow.cpp b/src/apps/haikudepot/ui/UserLoginWindow.cpp index 7a57a9b544..09fda03346 100644 --- a/src/apps/haikudepot/ui/UserLoginWindow.cpp +++ b/src/apps/haikudepot/ui/UserLoginWindow.cpp @@ -233,6 +233,15 @@ UserLoginWindow::MessageReceived(BMessage* message) } +void +UserLoginWindow::SetOnSuccessMessage( + const BMessenger& messenger, const BMessage& message) +{ + fOnSuccessTarget = messenger; + fOnSuccessMessage = message; +} + + void UserLoginWindow::_SetMode(Mode mode) { @@ -312,6 +321,31 @@ UserLoginWindow::_RequestCaptcha() } +void +UserLoginWindow::_LoginSuccessful(const BString& message) +{ + // Clone these fields before the window goes away. + // (This method is executd from another thread.) + BMessenger onSuccessTarget(fOnSuccessTarget); + BMessage onSuccessMessage(fOnSuccessMessage); + + BMessenger(this).SendMessage(B_QUIT_REQUESTED); + + BAlert* alert = new(std::nothrow) BAlert( + B_TRANSLATE("Success"), + message, + B_TRANSLATE("Close")); + + if (alert != NULL) + alert->Go(); + + // Send the success message after the alert has been closed, + // otherwise more windows will popup alongside the alert. + if (onSuccessTarget.IsValid() && onSuccessMessage.what != 0) + onSuccessTarget.SendMessage(&onSuccessMessage); +} + + void UserLoginWindow::_SetWorkerThread(thread_id thread) { @@ -401,15 +435,7 @@ UserLoginWindow::_AuthenticateThread() _SetWorkerThread(-1); } else { _SetWorkerThread(-1); - BMessenger(this).SendMessage(B_QUIT_REQUESTED); - - BAlert* alert = new(std::nothrow) BAlert( - B_TRANSLATE("Success"), - B_TRANSLATE("The authentication was successful."), - B_TRANSLATE("Close")); - - if (alert != NULL) - alert->Go(); + _LoginSuccessful(B_TRANSLATE("The authentication was successful.")); } } @@ -547,16 +573,8 @@ UserLoginWindow::_CreateAccountThread() fModel.SetAuthorization(nickName, passwordClear, true); _SetWorkerThread(-1); - BMessenger(this).SendMessage(B_QUIT_REQUESTED); - - BAlert* alert = new(std::nothrow) BAlert( - B_TRANSLATE("Success"), - B_TRANSLATE("Account created successfully. " - "You can now rate packages and do other useful things."), - B_TRANSLATE("Close")); - - if (alert != NULL) - alert->Go(); + _LoginSuccessful(B_TRANSLATE("Account created successfully. " + "You can now rate packages and do other useful things.")); } } diff --git a/src/apps/haikudepot/ui/UserLoginWindow.h b/src/apps/haikudepot/ui/UserLoginWindow.h index 66f0e53b19..6d1540ba04 100644 --- a/src/apps/haikudepot/ui/UserLoginWindow.h +++ b/src/apps/haikudepot/ui/UserLoginWindow.h @@ -6,6 +6,7 @@ #define USER_LOGIN_WINDOW_H #include +#include #include #include "PackageInfo.h" @@ -27,6 +28,10 @@ public: virtual void MessageReceived(BMessage* message); + void SetOnSuccessMessage( + const BMessenger& messenger, + const BMessage& message); + private: enum Mode { NONE = 0, @@ -38,6 +43,7 @@ private: void _Login(); void _CreateAccount(); void _RequestCaptcha(); + void _LoginSuccessful(const BString& message); void _SetWorkerThread(thread_id thread); @@ -55,6 +61,9 @@ private: BString& error) const; private: + BMessenger fOnSuccessTarget; + BMessage fOnSuccessMessage; + BTabView* fTabView; BTextControl* fUsernameField;