diff --git a/src/apps/installer/InstallerWindow.cpp b/src/apps/installer/InstallerWindow.cpp index ed8d9fdde9..897f4d7f58 100644 --- a/src/apps/installer/InstallerWindow.cpp +++ b/src/apps/installer/InstallerWindow.cpp @@ -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. } diff --git a/src/apps/installer/PackageViews.cpp b/src/apps/installer/PackageViews.cpp index 3987afd4f4..0aa0679133 100644 --- a/src/apps/installer/PackageViews.cpp +++ b/src/apps/installer/PackageViews.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include @@ -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(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)); -} - diff --git a/src/apps/installer/PackageViews.h b/src/apps/installer/PackageViews.h index d676b6b91d..240dff9e40 100644 --- a/src/apps/installer/PackageViews.h +++ b/src/apps/installer/PackageViews.h @@ -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__