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.
This commit is contained in:
Stephan Aßmus 2014-09-30 22:31:11 +02:00
parent fb303f1987
commit 1bbda92dc7
4 changed files with 85 additions and 30 deletions

View File

@ -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();
}

View File

@ -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;

View File

@ -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."));
}
}

View File

@ -6,6 +6,7 @@
#define USER_LOGIN_WINDOW_H
#include <Locker.h>
#include <Messenger.h>
#include <Window.h>
#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;