HaikuDepot: Centralized user account features in the UI
There is now a right-aligned second menu bar for the account management. The menu label is what was previously shown underneath the search terms field. The menu items have moved from the Tools menu into the new user menu. This means the login/logout functionality is directly available where the login info is shown in the UI when you click it.
This commit is contained in:
@@ -15,10 +15,10 @@
|
|||||||
#include <MenuItem.h>
|
#include <MenuItem.h>
|
||||||
#include <Messenger.h>
|
#include <Messenger.h>
|
||||||
#include <PopUpMenu.h>
|
#include <PopUpMenu.h>
|
||||||
#include <StringView.h>
|
|
||||||
#include <TextControl.h>
|
#include <TextControl.h>
|
||||||
|
|
||||||
#include "Model.h"
|
#include "Model.h"
|
||||||
|
#include "support.h"
|
||||||
|
|
||||||
|
|
||||||
#undef B_TRANSLATION_CONTEXT
|
#undef B_TRANSLATION_CONTEXT
|
||||||
@@ -38,16 +38,6 @@ add_categories_to_menu(const CategoryList& categories, BMenu* menu)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
|
||||||
set_small_font(BView* view)
|
|
||||||
{
|
|
||||||
BFont font;
|
|
||||||
view->GetFont(&font);
|
|
||||||
font.SetSize(ceilf(font.Size() * 0.8));
|
|
||||||
view->SetFont(&font);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
static BCheckBox*
|
static BCheckBox*
|
||||||
create_check_box(const char* label, const char* name)
|
create_check_box(const char* label, const char* name)
|
||||||
{
|
{
|
||||||
@@ -98,11 +88,6 @@ FilterView::FilterView()
|
|||||||
fSourceCodeCheckBox = create_check_box(
|
fSourceCodeCheckBox = create_check_box(
|
||||||
B_TRANSLATE("Source code"), "source code");
|
B_TRANSLATE("Source code"), "source code");
|
||||||
|
|
||||||
// Logged in user label
|
|
||||||
fUsername = new BStringView("logged in user", "");
|
|
||||||
set_small_font(fUsername);
|
|
||||||
fUsername->SetHighColor(80, 80, 80);
|
|
||||||
|
|
||||||
// Build layout
|
// Build layout
|
||||||
BLayoutBuilder::Group<>(this)
|
BLayoutBuilder::Group<>(this)
|
||||||
.AddGroup(B_HORIZONTAL)
|
.AddGroup(B_HORIZONTAL)
|
||||||
@@ -119,8 +104,7 @@ FilterView::FilterView()
|
|||||||
.Add(fInstalledCheckBox)
|
.Add(fInstalledCheckBox)
|
||||||
.Add(fDevelopmentCheckBox)
|
.Add(fDevelopmentCheckBox)
|
||||||
.Add(fSourceCodeCheckBox)
|
.Add(fSourceCodeCheckBox)
|
||||||
.AddGlue(0.5f)
|
.AddGlue()
|
||||||
.Add(fUsername)
|
|
||||||
.End()
|
.End()
|
||||||
|
|
||||||
.SetInsets(B_USE_DEFAULT_SPACING)
|
.SetInsets(B_USE_DEFAULT_SPACING)
|
||||||
@@ -214,17 +198,3 @@ FilterView::AdoptCheckmarks(const Model& model)
|
|||||||
fSourceCodeCheckBox->SetValue(model.ShowSourcePackages());
|
fSourceCodeCheckBox->SetValue(model.ShowSourcePackages());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
|
||||||
FilterView::SetUsername(const BString& username)
|
|
||||||
{
|
|
||||||
BString label;
|
|
||||||
if (username.Length() == 0) {
|
|
||||||
label = B_TRANSLATE("Not logged in");
|
|
||||||
} else {
|
|
||||||
label = B_TRANSLATE("Logged in as %User%");
|
|
||||||
label.ReplaceAll("%User%", username);
|
|
||||||
}
|
|
||||||
fUsername->SetText(label);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|||||||
@@ -10,7 +10,6 @@
|
|||||||
|
|
||||||
class BCheckBox;
|
class BCheckBox;
|
||||||
class BMenuField;
|
class BMenuField;
|
||||||
class BStringView;
|
|
||||||
class BTextControl;
|
class BTextControl;
|
||||||
class Model;
|
class Model;
|
||||||
|
|
||||||
@@ -34,8 +33,6 @@ public:
|
|||||||
void AdoptModel(const Model& model);
|
void AdoptModel(const Model& model);
|
||||||
void AdoptCheckmarks(const Model& model);
|
void AdoptCheckmarks(const Model& model);
|
||||||
|
|
||||||
void SetUsername(const BString& username);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
BMenuField* fShowField;
|
BMenuField* fShowField;
|
||||||
BMenuField* fRepositoryField;
|
BMenuField* fRepositoryField;
|
||||||
@@ -45,8 +42,6 @@ private:
|
|||||||
BCheckBox* fInstalledCheckBox;
|
BCheckBox* fInstalledCheckBox;
|
||||||
BCheckBox* fDevelopmentCheckBox;
|
BCheckBox* fDevelopmentCheckBox;
|
||||||
BCheckBox* fSourceCodeCheckBox;
|
BCheckBox* fSourceCodeCheckBox;
|
||||||
|
|
||||||
BStringView* fUsername;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // FILTER_VIEW_H
|
#endif // FILTER_VIEW_H
|
||||||
|
|||||||
@@ -45,6 +45,7 @@
|
|||||||
#include "PackageListView.h"
|
#include "PackageListView.h"
|
||||||
#include "PackageManager.h"
|
#include "PackageManager.h"
|
||||||
#include "RatePackageWindow.h"
|
#include "RatePackageWindow.h"
|
||||||
|
#include "support.h"
|
||||||
#include "UserLoginWindow.h"
|
#include "UserLoginWindow.h"
|
||||||
|
|
||||||
|
|
||||||
@@ -109,6 +110,9 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings)
|
|||||||
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
||||||
B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
||||||
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
|
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
|
||||||
|
fUserMenu(NULL),
|
||||||
|
fLogInItem(NULL),
|
||||||
|
fLogOutItem(NULL),
|
||||||
fModelListener(new MessageModelListener(BMessenger(this)), true),
|
fModelListener(new MessageModelListener(BMessenger(this)), true),
|
||||||
fTerminating(false),
|
fTerminating(false),
|
||||||
fSinglePackageMode(false),
|
fSinglePackageMode(false),
|
||||||
@@ -117,6 +121,12 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings)
|
|||||||
BMenuBar* menuBar = new BMenuBar(B_TRANSLATE("Main Menu"));
|
BMenuBar* menuBar = new BMenuBar(B_TRANSLATE("Main Menu"));
|
||||||
_BuildMenu(menuBar);
|
_BuildMenu(menuBar);
|
||||||
|
|
||||||
|
BMenuBar* userMenuBar = new BMenuBar(B_TRANSLATE("User Menu"));
|
||||||
|
_BuildUserMenu(userMenuBar);
|
||||||
|
set_small_font(userMenuBar);
|
||||||
|
userMenuBar->SetExplicitMaxSize(BSize(B_SIZE_UNSET,
|
||||||
|
menuBar->MaxSize().height));
|
||||||
|
|
||||||
fFilterView = new FilterView();
|
fFilterView = new FilterView();
|
||||||
fPackageListView = new PackageListView(fModel.Lock());
|
fPackageListView = new PackageListView(fModel.Lock());
|
||||||
fPackageInfoView = new PackageInfoView(fModel.Lock(), this);
|
fPackageInfoView = new PackageInfoView(fModel.Lock(), this);
|
||||||
@@ -124,7 +134,10 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings)
|
|||||||
fSplitView = new BSplitView(B_VERTICAL, 5.0f);
|
fSplitView = new BSplitView(B_VERTICAL, 5.0f);
|
||||||
|
|
||||||
BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f)
|
BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f)
|
||||||
.Add(menuBar)
|
.AddGroup(B_HORIZONTAL, 0.0f)
|
||||||
|
.Add(menuBar, 1.0f)
|
||||||
|
.Add(userMenuBar, 0.0f)
|
||||||
|
.End()
|
||||||
.Add(fFilterView)
|
.Add(fFilterView)
|
||||||
.AddSplit(fSplitView)
|
.AddSplit(fSplitView)
|
||||||
.AddGroup(B_VERTICAL)
|
.AddGroup(B_VERTICAL)
|
||||||
@@ -175,6 +188,8 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings,
|
|||||||
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
BWindow(frame, B_TRANSLATE_SYSTEM_NAME("HaikuDepot"),
|
||||||
B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
B_DOCUMENT_WINDOW_LOOK, B_NORMAL_WINDOW_FEEL,
|
||||||
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
|
B_ASYNCHRONOUS_CONTROLS | B_AUTO_UPDATE_SIZE_LIMITS),
|
||||||
|
fUserMenu(NULL),
|
||||||
|
fLogInItem(NULL),
|
||||||
fLogOutItem(NULL),
|
fLogOutItem(NULL),
|
||||||
fModelListener(new MessageModelListener(BMessenger(this)), true),
|
fModelListener(new MessageModelListener(BMessenger(this)), true),
|
||||||
fTerminating(false),
|
fTerminating(false),
|
||||||
@@ -463,11 +478,7 @@ MainWindow::_BuildMenu(BMenuBar* menuBar)
|
|||||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Refresh depots"),
|
menu->AddItem(new BMenuItem(B_TRANSLATE("Refresh depots"),
|
||||||
new BMessage(MSG_REFRESH_DEPOTS)));
|
new BMessage(MSG_REFRESH_DEPOTS)));
|
||||||
menu->AddSeparatorItem();
|
menu->AddSeparatorItem();
|
||||||
menu->AddItem(new BMenuItem(B_TRANSLATE("Log in" B_UTF8_ELLIPSIS),
|
|
||||||
new BMessage(MSG_LOG_IN)));
|
|
||||||
fLogOutItem = new BMenuItem(B_TRANSLATE("Log out"),
|
|
||||||
new BMessage(MSG_LOG_OUT));
|
|
||||||
menu->AddItem(fLogOutItem);
|
|
||||||
menuBar->AddItem(menu);
|
menuBar->AddItem(menu);
|
||||||
|
|
||||||
// menu = new BMenu(B_TRANSLATE("Options"));
|
// menu = new BMenu(B_TRANSLATE("Options"));
|
||||||
@@ -485,6 +496,23 @@ MainWindow::_BuildMenu(BMenuBar* menuBar)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
MainWindow::_BuildUserMenu(BMenuBar* menuBar)
|
||||||
|
{
|
||||||
|
fUserMenu = new BMenu(B_TRANSLATE("Not logged in"));
|
||||||
|
|
||||||
|
fLogInItem = new BMenuItem(B_TRANSLATE("Log in" B_UTF8_ELLIPSIS),
|
||||||
|
new BMessage(MSG_LOG_IN));
|
||||||
|
fUserMenu->AddItem(fLogInItem);
|
||||||
|
|
||||||
|
fLogOutItem = new BMenuItem(B_TRANSLATE("Log out"),
|
||||||
|
new BMessage(MSG_LOG_OUT));
|
||||||
|
fUserMenu->AddItem(fLogOutItem);
|
||||||
|
|
||||||
|
menuBar->AddItem(fUserMenu);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
MainWindow::_InitWorkerThreads()
|
MainWindow::_InitWorkerThreads()
|
||||||
{
|
{
|
||||||
@@ -939,9 +967,27 @@ void
|
|||||||
MainWindow::_UpdateAuthorization()
|
MainWindow::_UpdateAuthorization()
|
||||||
{
|
{
|
||||||
BString username(fModel.Username());
|
BString username(fModel.Username());
|
||||||
|
bool hasUser = !username.IsEmpty();
|
||||||
|
|
||||||
if (fLogOutItem != NULL)
|
if (fLogOutItem != NULL)
|
||||||
fLogOutItem->SetEnabled(username.Length() > 0);
|
fLogOutItem->SetEnabled(hasUser);
|
||||||
fFilterView->SetUsername(username);
|
if (fLogInItem != NULL) {
|
||||||
|
if (hasUser)
|
||||||
|
fLogInItem->SetLabel(B_TRANSLATE("Switch account" B_UTF8_ELLIPSIS));
|
||||||
|
else
|
||||||
|
fLogInItem->SetLabel(B_TRANSLATE("Log in" B_UTF8_ELLIPSIS));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (fUserMenu != NULL) {
|
||||||
|
BString label;
|
||||||
|
if (username.Length() == 0) {
|
||||||
|
label = B_TRANSLATE("Not logged in");
|
||||||
|
} else {
|
||||||
|
label = B_TRANSLATE("Logged in as %User%");
|
||||||
|
label.ReplaceAll("%User%", username);
|
||||||
|
}
|
||||||
|
fUserMenu->Superitem()->SetLabel(label);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,8 @@
|
|||||||
#include "PackageInfoListener.h"
|
#include "PackageInfoListener.h"
|
||||||
|
|
||||||
|
|
||||||
|
class BMenu;
|
||||||
|
class BMenuItem;
|
||||||
class BSplitView;
|
class BSplitView;
|
||||||
class FilterView;
|
class FilterView;
|
||||||
class PackageActionsView;
|
class PackageActionsView;
|
||||||
@@ -55,6 +57,8 @@ private:
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
void _BuildMenu(BMenuBar* menuBar);
|
void _BuildMenu(BMenuBar* menuBar);
|
||||||
|
void _BuildUserMenu(BMenuBar* menuBar);
|
||||||
|
|
||||||
void _InitWorkerThreads();
|
void _InitWorkerThreads();
|
||||||
void _AdoptModel();
|
void _AdoptModel();
|
||||||
|
|
||||||
@@ -65,11 +69,8 @@ private:
|
|||||||
void _RefreshPackageList();
|
void _RefreshPackageList();
|
||||||
|
|
||||||
void _StartRefreshWorker(bool force = false);
|
void _StartRefreshWorker(bool force = false);
|
||||||
|
|
||||||
static status_t _RefreshModelThreadWorker(void* arg);
|
static status_t _RefreshModelThreadWorker(void* arg);
|
||||||
|
|
||||||
static status_t _PackageActionWorker(void* arg);
|
static status_t _PackageActionWorker(void* arg);
|
||||||
|
|
||||||
static status_t _PopulatePackageWorker(void* arg);
|
static status_t _PopulatePackageWorker(void* arg);
|
||||||
|
|
||||||
void _NotifyUser(const char* title,
|
void _NotifyUser(const char* title,
|
||||||
@@ -85,7 +86,13 @@ private:
|
|||||||
PackageListView* fPackageListView;
|
PackageListView* fPackageListView;
|
||||||
PackageInfoView* fPackageInfoView;
|
PackageInfoView* fPackageInfoView;
|
||||||
BSplitView* fSplitView;
|
BSplitView* fSplitView;
|
||||||
|
|
||||||
|
BMenu* fUserMenu;
|
||||||
|
BMenuItem* fLogInItem;
|
||||||
BMenuItem* fLogOutItem;
|
BMenuItem* fLogOutItem;
|
||||||
|
|
||||||
|
BMenuItem* fShowAvailablePackagesItem;
|
||||||
|
BMenuItem* fShowInstalledPackagesItem;
|
||||||
BMenuItem* fShowDevelopPackagesItem;
|
BMenuItem* fShowDevelopPackagesItem;
|
||||||
BMenuItem* fShowSourcePackagesItem;
|
BMenuItem* fShowSourcePackagesItem;
|
||||||
|
|
||||||
|
|||||||
@@ -13,10 +13,12 @@
|
|||||||
#include <Directory.h>
|
#include <Directory.h>
|
||||||
#include <File.h>
|
#include <File.h>
|
||||||
#include <FindDirectory.h>
|
#include <FindDirectory.h>
|
||||||
|
#include <Font.h>
|
||||||
#include <Path.h>
|
#include <Path.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
#include <Roster.h>
|
#include <Roster.h>
|
||||||
#include <Screen.h>
|
#include <Screen.h>
|
||||||
|
#include <View.h>
|
||||||
|
|
||||||
|
|
||||||
status_t
|
status_t
|
||||||
@@ -145,3 +147,16 @@ get_app_resources(BResources& resources)
|
|||||||
return resources.SetTo(&info.ref);
|
return resources.SetTo(&info.ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
set_small_font(BView* view)
|
||||||
|
{
|
||||||
|
BFont font;
|
||||||
|
view->GetFont(&font);
|
||||||
|
font.SetSize(ceilf(font.Size() * 0.8));
|
||||||
|
view->SetFont(&font);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
class BMessage;
|
class BMessage;
|
||||||
class BResources;
|
class BResources;
|
||||||
|
class BView;
|
||||||
class BWindow;
|
class BWindow;
|
||||||
|
|
||||||
|
|
||||||
@@ -25,5 +26,6 @@ bool make_sure_frame_is_on_screen(BRect& frame, float borderWidth = 5.0f,
|
|||||||
|
|
||||||
status_t get_app_resources(BResources& resources);
|
status_t get_app_resources(BResources& resources);
|
||||||
|
|
||||||
|
void set_small_font(BView* view);
|
||||||
|
|
||||||
#endif // SUPPORT_H
|
#endif // SUPPORT_H
|
||||||
|
|||||||
Reference in New Issue
Block a user