diff --git a/src/apps/haiku-depot/MainWindow.cpp b/src/apps/haiku-depot/MainWindow.cpp index 953baf0f07..4093307bb9 100644 --- a/src/apps/haiku-depot/MainWindow.cpp +++ b/src/apps/haiku-depot/MainWindow.cpp @@ -53,7 +53,9 @@ enum { MSG_MODEL_WORKER_DONE = 'mmwd', MSG_REFRESH_DEPOTS = 'mrdp', - MSG_PACKAGE_STATE_CHANGED = 'mpsc' + MSG_PACKAGE_STATE_CHANGED = 'mpsc', + MSG_SHOW_SOURCE_PACKAGES = 'ssrc', + MSG_SHOW_DEVELOP_PACKAGES = 'sdvl' }; @@ -117,6 +119,12 @@ MainWindow::MainWindow(BRect frame, const BMessage& settings) if (settings.FindMessage("column settings", &columnSettings) == B_OK) fPackageListView->LoadState(&columnSettings); + bool showOption; + if (settings.FindBool("show develop packages", &showOption) == B_OK) + fModel.SetShowDevelopPackages(showOption); + if (settings.FindBool("show source packages", &showOption) == B_OK) + fModel.SetShowSourcePackages(showOption); + _StartRefreshWorker(); fPendingActionsSem = create_sem(0, "PendingPackageActions"); @@ -175,10 +183,25 @@ MainWindow::MessageReceived(BMessage* message) break; case MSG_REFRESH_DEPOTS: - { _StartRefreshWorker(true); break; - } + + case MSG_SHOW_SOURCE_PACKAGES: + { + BAutolock _(fModel.Lock()); + fModel.SetShowSourcePackages(!fModel.ShowSourcePackages()); + } + _AdoptModel(); + break; + + case MSG_SHOW_DEVELOP_PACKAGES: + { + BAutolock _(fModel.Lock()); + fModel.SetShowDevelopPackages(!fModel.ShowDevelopPackages()); + } + _AdoptModel(); + break; + case MSG_PACKAGE_SELECTED: { BString title; @@ -254,6 +277,9 @@ MainWindow::StoreSettings(BMessage& settings) const fPackageListView->SaveState(&columnSettings); settings.AddMessage("column settings", &columnSettings); + + settings.AddBool("show develop packages", fModel.ShowDevelopPackages()); + settings.AddBool("show source packages", fModel.ShowSourcePackages()); } @@ -295,11 +321,24 @@ MainWindow::GetModel() void MainWindow::_BuildMenu(BMenuBar* menuBar) { - BMenu* menu = new BMenu(B_TRANSLATE("Package")); + BMenu* menu = new BMenu(B_TRANSLATE("Tools")); menu->AddItem(new BMenuItem(B_TRANSLATE("Refresh depots"), new BMessage(MSG_REFRESH_DEPOTS))); menuBar->AddItem(menu); + menu = new BMenu(B_TRANSLATE("Options")); + + fShowDevelopPackagesItem = new BMenuItem( + B_TRANSLATE("Show develop packages"), + new BMessage(MSG_SHOW_DEVELOP_PACKAGES)); + menu->AddItem(fShowDevelopPackagesItem); + + fShowSourcePackagesItem = new BMenuItem( + B_TRANSLATE("Show source packages"), + new BMessage(MSG_SHOW_SOURCE_PACKAGES)); + menu->AddItem(fShowSourcePackagesItem); + + menuBar->AddItem(menu); } @@ -313,6 +352,10 @@ MainWindow::_AdoptModel() BAutolock _(fModel.Lock()); fPackageListView->AddPackage(fVisiblePackages.ItemAtFast(i)); } + + BAutolock _(fModel.Lock()); + fShowSourcePackagesItem->SetMarked(fModel.ShowSourcePackages()); + fShowDevelopPackagesItem->SetMarked(fModel.ShowDevelopPackages()); } diff --git a/src/apps/haiku-depot/MainWindow.h b/src/apps/haiku-depot/MainWindow.h index 46f8816d48..aa12008cf9 100644 --- a/src/apps/haiku-depot/MainWindow.h +++ b/src/apps/haiku-depot/MainWindow.h @@ -75,6 +75,8 @@ private: PackageListView* fPackageListView; PackageInfoView* fPackageInfoView; BSplitView* fSplitView; + BMenuItem* fShowDevelopPackagesItem; + BMenuItem* fShowSourcePackagesItem; Model fModel; PackageList fVisiblePackages; diff --git a/src/apps/haiku-depot/Model.cpp b/src/apps/haiku-depot/Model.cpp index 1ea70a21bc..679837459b 100644 --- a/src/apps/haiku-depot/Model.cpp +++ b/src/apps/haiku-depot/Model.cpp @@ -179,6 +179,22 @@ private: }; +static inline bool +is_source_package(const PackageInfoRef& package) +{ + const BString& packageName = package->Title(); + return packageName.EndsWith("_source"); +} + + +static inline bool +is_develop_package(const PackageInfoRef& package) +{ + const BString& packageName = package->Title(); + return packageName.EndsWith("_devel"); +} + + // #pragma mark - Model @@ -210,7 +226,10 @@ Model::Model() fCategoryFilter(PackageFilterRef(new AnyFilter(), true)), fDepotFilter(""), - fSearchTermsFilter(PackageFilterRef(new AnyFilter(), true)) + fSearchTermsFilter(PackageFilterRef(new AnyFilter(), true)), + + fShowSourcePackages(false), + fShowDevelopPackages(false) { // Don't forget to add new categories to this list: fCategories.Add(fCategoryAudio); @@ -270,7 +289,9 @@ Model::CreatePackageList() const for (int32 j = 0; j < packages.CountItems(); j++) { const PackageInfoRef& package = packages.ItemAtFast(j); if (fCategoryFilter->AcceptsPackage(package) - && fSearchTermsFilter->AcceptsPackage(package)) { + && fSearchTermsFilter->AcceptsPackage(package) + && (fShowSourcePackages || !is_source_package(package)) + && (fShowDevelopPackages || !is_develop_package(package))) { resultList.Add(package); } } @@ -377,6 +398,21 @@ Model::SetSearchTerms(const BString& searchTerms) } +void +Model::SetShowSourcePackages(bool show) +{ + fShowSourcePackages = show; +} + + +void +Model::SetShowDevelopPackages(bool show) +{ + fShowDevelopPackages = show; +} + + + // #pragma mark - information retrival diff --git a/src/apps/haiku-depot/Model.h b/src/apps/haiku-depot/Model.h index 2646cc8b01..c201955185 100644 --- a/src/apps/haiku-depot/Model.h +++ b/src/apps/haiku-depot/Model.h @@ -68,6 +68,12 @@ public: void SetCategory(const BString& category); void SetDepot(const BString& depot); void SetSearchTerms(const BString& searchTerms); + void SetShowSourcePackages(bool show); + bool ShowSourcePackages() const + { return fShowSourcePackages; } + void SetShowDevelopPackages(bool show); + bool ShowDevelopPackages() const + { return fShowDevelopPackages; } // Retrieve package information void PopulatePackage(const PackageInfoRef& package); @@ -100,6 +106,9 @@ private: PackageFilterRef fCategoryFilter; BString fDepotFilter; PackageFilterRef fSearchTermsFilter; + + bool fShowSourcePackages; + bool fShowDevelopPackages; };