From 634c2c68b22cc5d4b6c9087de8b39fa4415225c8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Wed, 12 Mar 2014 21:44:56 +0100 Subject: [PATCH] HaikuDepot: added "available" filter. * That's the only one I would ever want to see (in most cases). * I must admit that I don't really understand why the lists are created and updated only for filtering, instead of just testing against the package state. * However, I also have no idea, why the NotContainedInFilter does not work. I left it in because someone might see what I didn't, and maybe, if the first confusion is cleared, it might even find some use. --- src/apps/haiku-depot/Model.cpp | 77 ++++++++++++++++++++++++++++++---- 1 file changed, 68 insertions(+), 9 deletions(-) diff --git a/src/apps/haiku-depot/Model.cpp b/src/apps/haiku-depot/Model.cpp index 63263edb2a..8c2e36ad17 100644 --- a/src/apps/haiku-depot/Model.cpp +++ b/src/apps/haiku-depot/Model.cpp @@ -1,10 +1,12 @@ /* * Copyright 2013, Stephan Aßmus . + * Copyright 2014, Axel Dörfler . * All rights reserved. Distributed under the terms of the MIT License. */ #include "Model.h" +#include #include #include @@ -48,12 +50,7 @@ public: // Also the PackageList could actually contain references to packages // instead of the packages as objects. The equal operator is quite // expensive as is. - const PackageList& packages = fDepot.Packages(); - for (int i = packages.CountItems() - 1; i >= 0; i--) { - if (packages.ItemAtFast(i) == package) - return true; - } - return false; + return fDepot.Packages().Contains(package); } private: @@ -73,6 +70,7 @@ public: { if (package.Get() == NULL) return false; + const CategoryList& categories = package->Categories(); for (int i = categories.CountItems() - 1; i >= 0; i--) { const CategoryRef& category = categories.ItemAtFast(i); @@ -129,6 +127,58 @@ private: }; +class NotContainedInFilter : public PackageFilter { +public: + NotContainedInFilter(const PackageList* packageList, ...) + { + va_list args; + va_start(args, packageList); + while (true) { + const PackageList* packageList = va_arg(args, const PackageList*); + if (packageList == NULL) + break; + fPackageLists.Add(packageList); + } + va_end(args); + } + + virtual bool AcceptsPackage(const PackageInfoRef& package) const + { + if (package.Get()==NULL) + return false; +printf("TEST %s\n", package->Title().String()); + for (int32 i = 0; i < fPackageLists.CountItems(); i++) { + if (fPackageLists.ItemAtFast(i)->Contains(package)) { +printf(" contained in %ld\n", i); + return false; + } + } + return true; + } + +private: + List fPackageLists; +}; + + +class StateFilter : public PackageFilter { +public: + StateFilter(PackageState state) + : + fState(state) + { + } + + virtual bool AcceptsPackage(const PackageInfoRef& package) const + { + return package->State() == NONE; + } + +private: + PackageState fState; +}; + + class SearchTermsFilter : public PackageFilter { public: SearchTermsFilter(const BString& searchTerms) @@ -227,7 +277,7 @@ Model::Model() fCategoryFilter(PackageFilterRef(new AnyFilter(), true)), fDepotFilter(""), fSearchTermsFilter(PackageFilterRef(new AnyFilter(), true)), - + fShowSourcePackages(false), fShowDevelopPackages(false) { @@ -245,6 +295,11 @@ Model::Model() BitmapRef(), B_TRANSLATE("Installed packages"), "installed"), true)); + // A category for packages that not yet installed. + fUserCategories.Add(CategoryRef(new PackageCategory( + BitmapRef(), + B_TRANSLATE("Available packages"), "available"), true)); + // A category for packages that the user specifically uninstalled. // For example, a user may have removed packages from a default // Haiku installation @@ -363,7 +418,12 @@ Model::SetCategory(const BString& category) filter = new ContainedInFilter(fInstalledPackages); else if (category == "uninstalled") filter = new ContainedInFilter(fUninstalledPackages); - else if (category == "modified") { + else if (category == "available") { + filter = new StateFilter(NONE); +// filter = new NotContainedInFilter(&fInstalledPackages, +// &fUninstalledPackages, &fDownloadingPackages, &fUpdateablePackages, +// NULL); + } else if (category == "modified") { filter = new ContainedInEitherFilter(fInstalledPackages, fUninstalledPackages); } else if (category == "downloading") @@ -412,7 +472,6 @@ Model::SetShowDevelopPackages(bool show) } - // #pragma mark - information retrival