From da6511046d7247e18adb9302a97c15713b91d217 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 2 Nov 2014 00:44:02 +0100 Subject: [PATCH] HaikuDepot: Properly add featured packages. * Rework existing package listener mechanism to report any interesting changes. Listen for prominence changes in addition to package state. * Add featured packages to the FeaturedPackagesView when their prominence is retrived, and also in _AdoptModel(). * In _AdoptModel(), show the featured packages view when no search filters are active and installed packages are not shown either. Otherwise show the list of all packages matching the current filtering. --- src/apps/haikudepot/ui/MainWindow.cpp | 47 ++++++++++++++++++++++----- src/apps/haikudepot/ui/MainWindow.h | 2 ++ 2 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/apps/haikudepot/ui/MainWindow.cpp b/src/apps/haikudepot/ui/MainWindow.cpp index 35fe32b321..fd17ca5c2a 100644 --- a/src/apps/haikudepot/ui/MainWindow.cpp +++ b/src/apps/haikudepot/ui/MainWindow.cpp @@ -61,7 +61,7 @@ enum { MSG_LOG_IN = 'lgin', MSG_LOG_OUT = 'lgot', MSG_AUTHORIZATION_CHANGED = 'athc', - MSG_PACKAGE_STATE_CHANGED = 'mpsc', + MSG_PACKAGE_CHANGED = 'pchd', MSG_SHOW_AVAILABLE_PACKAGES = 'savl', MSG_SHOW_INSTALLED_PACKAGES = 'sins', @@ -147,7 +147,7 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings) listArea->AddChild(fFeaturedPackagesView); listArea->AddChild(fPackageListView); - fListLayout->SetVisibleItem((int32)1); + fListLayout->SetVisibleItem((int32)0); BLayoutBuilder::Group<>(this, B_VERTICAL, 0.0f) .AddGroup(B_HORIZONTAL, 0.0f) @@ -398,13 +398,23 @@ MainWindow::MessageReceived(BMessage* message) break; } - case MSG_PACKAGE_STATE_CHANGED: + case MSG_PACKAGE_CHANGED: { PackageInfo* info; if (message->FindPointer("package", (void**)&info) == B_OK) { PackageInfoRef ref(info, true); - BAutolock locker(fModel.Lock()); - fModel.SetPackageState(ref, ref->State()); + uint32 changes; + if (message->FindUInt32("changes", &changes) != B_OK) + changes = 0; + if ((changes & PKG_CHANGED_STATE) != 0) { + BAutolock locker(fModel.Lock()); + fModel.SetPackageState(ref, ref->State()); + } + if ((changes & PKG_CHANGED_PROMINENCE) != 0) { + BAutolock locker(fModel.Lock()); + if (_IsProminentPackage(ref)) + fFeaturedPackagesView->AddPackage(ref); + } } break; } @@ -444,10 +454,12 @@ MainWindow::StoreSettings(BMessage& settings) const void MainWindow::PackageChanged(const PackageInfoEvent& event) { - if ((event.Changes() & PKG_CHANGED_STATE) != 0) { + uint32 whatchedChanges = PKG_CHANGED_STATE | PKG_CHANGED_PROMINENCE; + if ((event.Changes() & whatchedChanges) != 0) { PackageInfoRef ref(event.Package()); - BMessage message(MSG_PACKAGE_STATE_CHANGED); + BMessage message(MSG_PACKAGE_CHANGED); message.AddPointer("package", ref.Get()); + message.AddUInt32("changes", event.Changes()); ref.Detach(); // reference needs to be released by MessageReceived(); PostMessage(&message); @@ -563,8 +575,8 @@ MainWindow::_AdoptModel() const PackageInfoRef& package = fVisiblePackages.ItemAtFast(i); fPackageListView->AddPackage(package); - - if (package->Title() == "beam" || package->Title() == "caya") + + if (_IsProminentPackage(package)) fFeaturedPackagesView->AddPackage(package); } @@ -573,6 +585,23 @@ MainWindow::_AdoptModel() fShowInstalledPackagesItem->SetMarked(fModel.ShowInstalledPackages()); fShowSourcePackagesItem->SetMarked(fModel.ShowSourcePackages()); fShowDevelopPackagesItem->SetMarked(fModel.ShowDevelopPackages()); + + if (fModel.Category() != "" + || fModel.Depot() != "" + || fModel.SearchTerms() != "" + || fModel.ShowInstalledPackages()) { + fListLayout->SetVisibleItem((int32)1); + } else { + fListLayout->SetVisibleItem((int32)0); + } +} + + +bool +MainWindow::_IsProminentPackage(const PackageInfoRef& package) const +{ + return package->HasProminence() && package->Prominence() <= 100 + && package->State() != ACTIVATED; } diff --git a/src/apps/haikudepot/ui/MainWindow.h b/src/apps/haikudepot/ui/MainWindow.h index f65be77c60..95e18a9580 100644 --- a/src/apps/haikudepot/ui/MainWindow.h +++ b/src/apps/haikudepot/ui/MainWindow.h @@ -63,6 +63,8 @@ private: void _InitWorkerThreads(); void _AdoptModel(); + bool _IsProminentPackage( + const PackageInfoRef& package) const; void _AdoptPackage(const PackageInfoRef& package); void _ClearPackage();