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;