Installer: fix drawing of optional packages view

Rework the layout of the installer window, do not try to put everything
in a single grid but instead use a mix of grid and groups as
appropriate, which keeps things simpler.

Make the width of the window more font sensitive.

Have the package view properly resize with the window, and the items in
it still draw properly (checkbox and name on the left, size on the
right)

The menu fields for source and destination don't need to extend to the
whole window width, so allow them to be smaller.

Fixes #5785

Change-Id: If0683f610b9e7f3629d51d25c1d8e8b00c101156
Reviewed-on: https://review.haiku-os.org/c/haiku/+/2185
Reviewed-by: Adrien Destugues <[email protected]>
This commit is contained in:
Adrien Destugues
2020-02-10 09:49:51 +00:00
committed by Adrien Destugues
parent 299279610c
commit 3d11fed209
3 changed files with 58 additions and 113 deletions
+23 -23
View File
@@ -179,7 +179,7 @@ InstallerWindow::InstallerWindow()
BSize logoSize = logoView->MinSize();
logoView->SetExplicitMaxSize(logoSize);
fStatusView->SetExplicitMinSize(BSize(fStatusView->StringWidth("W") * 30,
fStatusView->SetExplicitMinSize(BSize(fStatusView->StringWidth("W") * 22,
logoSize.height));
// Explicitly create group view to set the background white in case
@@ -187,8 +187,8 @@ InstallerWindow::InstallerWindow()
fLogoGroup = new BGroupView(B_HORIZONTAL, 10);
fLogoGroup->SetViewColor(255, 255, 255);
fLogoGroup->GroupLayout()->SetInsets(0, 0, 10, 0);
fLogoGroup->GroupLayout()->AddView(logoView);
fLogoGroup->GroupLayout()->AddView(fStatusView);
fLogoGroup->AddChild(logoView);
fLogoGroup->AddChild(fStatusView);
fDestMenu = new BPopUpMenu(B_TRANSLATE("scanning" B_UTF8_ELLIPSIS),
true, false);
@@ -220,9 +220,8 @@ InstallerWindow::InstallerWindow()
= B_TRANSLATE("Additional disk space required: 0.0 KiB");
fSizeView = new BStringView("size_view", requiredDiskSpaceString);
fSizeView->SetAlignment(B_ALIGN_RIGHT);
fSizeView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
fSizeView->SetExplicitAlignment(
BAlignment(B_ALIGN_RIGHT, B_ALIGN_MIDDLE));
BAlignment(B_ALIGN_RIGHT, B_ALIGN_TOP));
fProgressBar = new BStatusBar("progress",
B_TRANSLATE("Install progress: "));
@@ -250,6 +249,12 @@ InstallerWindow::InstallerWindow()
toolsMenu->AddItem(fMakeBootableItem);
mainMenu->AddItem(toolsMenu);
BGroupView* packagesGroup = new BGroupView(B_VERTICAL, B_USE_ITEM_SPACING);
packagesGroup->AddChild(fPackagesSwitch);
packagesGroup->AddChild(packagesScrollView);
packagesGroup->AddChild(fProgressBar);
packagesGroup->AddChild(fSizeView);
BLayoutBuilder::Group<>(this, B_VERTICAL, 0)
.Add(mainMenu)
.Add(fLogoGroup)
@@ -257,23 +262,19 @@ InstallerWindow::InstallerWindow()
.AddGroup(B_VERTICAL, B_USE_ITEM_SPACING)
.SetInsets(B_USE_WINDOW_SPACING)
.AddGrid(new BGridView(B_USE_ITEM_SPACING, B_USE_ITEM_SPACING))
.Add(fSrcMenuField->CreateLabelLayoutItem(), 0, 0)
.Add(fSrcMenuField->CreateMenuBarLayoutItem(), 1, 0)
.Add(fDestMenuField->CreateLabelLayoutItem(), 0, 1)
.Add(fDestMenuField->CreateMenuBarLayoutItem(), 1, 1)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5), 0, 2, 2)
.Add(fPackagesSwitch, 0, 3, 2)
.Add(packagesScrollView, 0, 4, 2)
.Add(fProgressBar, 0, 5, 2)
.Add(fSizeView, 0, 6, 2)
.AddMenuField(fSrcMenuField, 0, 0)
.AddMenuField(fDestMenuField, 0, 1)
.AddGlue(2, 0, 1, 2)
.Add(BSpaceLayoutItem::CreateVerticalStrut(5), 0, 2, 3)
.End()
.Add(packagesGroup)
.AddGroup(B_HORIZONTAL, B_USE_WINDOW_SPACING)
.Add(fLaunchDriveSetupButton)
.AddGlue()
.Add(fBeginButton);
.Add(fBeginButton)
.End()
.End()
.End();
// Make the optional packages and progress bar invisible on start
fPackagesLayoutItem = layout_item_for(packagesScrollView);
@@ -436,6 +437,7 @@ InstallerWindow::MessageReceived(BMessage *msg)
snprintf(string, sizeof(string),
B_TRANSLATE("Additional disk space required: %s"), buffer);
fSizeView->SetText(string);
fSizeView->SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
break;
}
case ENCOURAGE_DRIVESETUP:
@@ -450,10 +452,6 @@ InstallerWindow::MessageReceived(BMessage *msg)
}
case MSG_STATUS_MESSAGE:
{
// TODO: Was this supposed to prevent status messages still arriving
// after the copy engine was shut down?
// if (fInstallStatus != kInstalling)
// break;
float progress;
if (msg->FindFloat("progress", &progress) == B_OK) {
const char* currentItem;
@@ -875,7 +873,9 @@ void
InstallerWindow::_SetStatusMessage(const char *text)
{
fStatusView->SetText(text);
fLogoGroup->GroupLayout()->InvalidateLayout();
fStatusView->InvalidateLayout();
// In case the status message makes the text view higher than the
// logo, then we need to resize te whole window to fit it.
}
+33 -81
View File
@@ -13,6 +13,7 @@
#include <Directory.h>
#include <Entry.h>
#include <fs_attr.h>
#include <GroupLayout.h>
#include <LayoutUtils.h>
#include <Locale.h>
#include <Messenger.h>
@@ -124,11 +125,14 @@ Group::~Group()
}
PackageCheckBox::PackageCheckBox(BRect rect, Package *item)
PackageCheckBox::PackageCheckBox(Package *item)
:
BCheckBox(rect.OffsetBySelf(7, 0), "pack_cb", item->Name(), NULL),
BCheckBox("pack_cb", item->Name(), NULL),
fPackage(item)
{
SetExplicitMaxSize(BSize(B_SIZE_UNLIMITED, B_SIZE_UNSET));
SetFlags(Flags() | B_FULL_UPDATE_ON_RESIZE);
SetIcon(fPackage->Icon());
}
@@ -142,14 +146,15 @@ void
PackageCheckBox::Draw(BRect update)
{
BCheckBox::Draw(update);
// Draw the label
char string[15];
fPackage->GetSizeAsString(string, sizeof(string));
float width = StringWidth(string);
DrawString(string, BPoint(Bounds().right - width - 8, 11));
const BBitmap *icon = fPackage->Icon();
if (icon)
DrawBitmap(icon, BPoint(Bounds().right - 92, 0));
BRect sizeRect = Bounds();
sizeRect.left = sizeRect.right - width;
be_control_look->DrawLabel(this, string, NULL, sizeRect, update,
ui_color(B_DOCUMENT_BACKGROUND_COLOR), be_control_look->Flags(this));
}
@@ -157,7 +162,6 @@ void
PackageCheckBox::MouseMoved(BPoint point, uint32 transit,
const BMessage* dragMessage)
{
printf("%s called\n", __PRETTY_FUNCTION__);
if (transit == B_ENTERED_VIEW) {
BMessage msg(MSG_STATUS_MESSAGE);
msg.AddString("status", fPackage->Description());
@@ -169,9 +173,9 @@ PackageCheckBox::MouseMoved(BPoint point, uint32 transit,
}
GroupView::GroupView(BRect rect, Group *group)
GroupView::GroupView(Group *group)
:
BStringView(rect, "group", group->GroupName()),
BStringView("group", group->GroupName()),
fGroup(group)
{
SetFont(be_bold_font);
@@ -187,17 +191,17 @@ GroupView::~GroupView()
// #pragma mark -
PackagesView::PackagesView(BRect rect, const char* name)
:
BView(rect, name, B_FOLLOW_ALL_SIDES, B_WILL_DRAW | B_FRAME_EVENTS)
{
}
PackagesView::PackagesView(const char* name)
:
BView(name, B_WILL_DRAW | B_FRAME_EVENTS)
BView(name, B_WILL_DRAW)
{
BGroupLayout* layout = new BGroupLayout(B_VERTICAL);
layout->SetSpacing(0);
layout->SetInsets(B_USE_SMALL_SPACING, 0);
SetLayout(layout);
SetViewUIColor(B_DOCUMENT_BACKGROUND_COLOR);
SetExplicitMinSize(BSize(B_SIZE_UNSET, 80));
}
@@ -219,6 +223,10 @@ PackagesView::Clean()
}
}
ScrollTo(0, 0);
BView* parent = Parent();
BRect r = parent->Bounds();
parent->FrameResized(r.Width(), r.Height());
}
@@ -226,34 +234,30 @@ void
PackagesView::AddPackages(BList& packages, BMessage* msg)
{
int32 count = packages.CountItems();
BRect rect = Bounds();
BRect bounds = rect;
rect.left = 1;
rect.bottom = 15;
rect.top = 0;
BString lastGroup = "";
for (int32 i = 0; i < count; i++) {
void* item = packages.ItemAt(i);
Package* package = static_cast<Package*>(item);
if (lastGroup != BString(package->GroupName())) {
rect.OffsetBy(0, 1);
lastGroup = package->GroupName();
Group* group = new Group();
group->SetGroupName(package->GroupName());
GroupView *view = new GroupView(rect, group);
GroupView *view = new GroupView(group);
AddChild(view);
rect.OffsetBy(0, 17);
}
PackageCheckBox* checkBox = new PackageCheckBox(rect, package);
PackageCheckBox* checkBox = new PackageCheckBox(package);
checkBox->SetValue(package->OnByDefault()
? B_CONTROL_ON : B_CONTROL_OFF);
checkBox->SetEnabled(!package->AlwaysOn());
checkBox->SetMessage(new BMessage(*msg));
AddChild(checkBox);
rect.OffsetBy(0, 20);
}
ResizeTo(bounds.Width(), rect.top);
Invalidate();
// Force scrollbars to update
BView* parent = Parent();
BRect r = parent->Bounds();
parent->FrameResized(r.Width(), r.Height());
}
@@ -286,36 +290,6 @@ PackagesView::GetPackagesToInstall(BList* list, int32* size)
}
void
PackagesView::FrameResized(float width, float height)
{
if (CountChildren() == 0)
Invalidate();
BScrollBar* scrollBar = ScrollBar(B_VERTICAL);
if (scrollBar == NULL)
return;
float virtualHeight = 0.0;
int32 count = CountChildren();
if (count > 0) {
BView* child = ChildAt(count - 1);
virtualHeight = child->Frame().bottom;
}
if (height > virtualHeight) {
scrollBar->SetRange(0.0f, 0.0f);
scrollBar->SetValue(0.0f);
} else {
scrollBar->SetRange(0.0f, virtualHeight - height);
scrollBar->SetProportion(height / virtualHeight);
}
scrollBar->SetSteps(15, height);
}
void
PackagesView::Draw(BRect updateRect)
{
@@ -327,25 +301,3 @@ PackagesView::Draw(BRect updateRect)
Bounds(), updateRect, ViewColor(), BControlLook::B_DISABLED,
BAlignment(B_ALIGN_CENTER, B_ALIGN_MIDDLE));
}
void
PackagesView::GetPreferredSize(float* _width, float* _height)
{
// TODO: Something more nice as default? I need to see how this looks
// when there are actually any packages...
if (_width != NULL)
*_width = 400.0;
if (_height != NULL)
*_height = 80.0;
}
BSize
PackagesView::MaxSize()
{
return BLayoutUtils::ComposeSize(ExplicitMaxSize(),
BSize(B_SIZE_UNLIMITED, B_SIZE_UNLIMITED));
}
+2 -9
View File
@@ -79,7 +79,7 @@ private:
class PackageCheckBox : public BCheckBox {
public:
PackageCheckBox(BRect rect, Package* item);
PackageCheckBox(Package* item);
virtual ~PackageCheckBox();
virtual void Draw(BRect updateRect);
@@ -95,7 +95,7 @@ private:
class GroupView : public BStringView {
public:
GroupView(BRect rect, Group* group);
GroupView(Group* group);
virtual ~GroupView();
private:
@@ -105,7 +105,6 @@ private:
class PackagesView : public BView {
public:
PackagesView(BRect rect, const char* name);
PackagesView(const char* name);
virtual ~PackagesView();
@@ -115,13 +114,7 @@ public:
size_t stringSize);
void GetPackagesToInstall(BList* list, int32* size);
virtual void FrameResized(float width, float height);
virtual void Draw(BRect updateRect);
virtual void GetPreferredSize(float* _width, float* _height);
virtual BSize MaxSize();
private:
BList fViews;
};
#endif // __PACKAGEVIEWS_H__