HaikuDepot: Beginnings of supporting filters...
... to reduce the package list. No filters can be defined via the UI, but a DepotFilter is already implemented, although its performance will probably need to improve.
This commit is contained in:
@@ -16,6 +16,8 @@
|
|||||||
#include <PopUpMenu.h>
|
#include <PopUpMenu.h>
|
||||||
#include <TextControl.h>
|
#include <TextControl.h>
|
||||||
|
|
||||||
|
#include "Model.h"
|
||||||
|
|
||||||
|
|
||||||
#undef B_TRANSLATION_CONTEXT
|
#undef B_TRANSLATION_CONTEXT
|
||||||
#define B_TRANSLATION_CONTEXT "FilterView"
|
#define B_TRANSLATION_CONTEXT "FilterView"
|
||||||
@@ -28,7 +30,7 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
FilterView::FilterView()
|
FilterView::FilterView(const Model& model)
|
||||||
:
|
:
|
||||||
BGroupView("filter view")
|
BGroupView("filter view")
|
||||||
{
|
{
|
||||||
@@ -36,21 +38,27 @@ FilterView::FilterView()
|
|||||||
BPopUpMenu* categoryMenu = new BPopUpMenu(B_TRANSLATE("Show"));
|
BPopUpMenu* categoryMenu = new BPopUpMenu(B_TRANSLATE("Show"));
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("All packages"), NULL));
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("All packages"), NULL));
|
||||||
categoryMenu->AddItem(new BSeparatorItem());
|
categoryMenu->AddItem(new BSeparatorItem());
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Audio"), NULL));
|
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Games"), NULL));
|
const CategoryList& categories = model.Categories();
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Graphics"), NULL));
|
for (int i = 0; i < categories.CountItems(); i++) {
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Development"), NULL));
|
const CategoryRef& category = categories.ItemAtFast(i);
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Miscellaneous"), NULL));
|
BMessage* message = new BMessage(MSG_CATEGORY_SELECTED);
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Shell"), NULL));
|
message->AddString("name", category->Name());
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Video"), NULL));
|
BMenuItem* item = new BMenuItem(category->Label(), message);
|
||||||
|
categoryMenu->AddItem(item);
|
||||||
|
}
|
||||||
|
|
||||||
categoryMenu->AddItem(new BSeparatorItem());
|
categoryMenu->AddItem(new BSeparatorItem());
|
||||||
|
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Installed packages"),
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Installed packages"),
|
||||||
NULL));
|
NULL));
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Uninstalled packages"),
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Uninstalled packages"),
|
||||||
NULL));
|
NULL));
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("User selected packages"),
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("User selected packages"),
|
||||||
NULL));
|
NULL));
|
||||||
|
|
||||||
categoryMenu->AddItem(new BSeparatorItem());
|
categoryMenu->AddItem(new BSeparatorItem());
|
||||||
|
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Downloading"), NULL));
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Downloading"), NULL));
|
||||||
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Update available"), NULL));
|
categoryMenu->AddItem(new BMenuItem(B_TRANSLATE("Update available"), NULL));
|
||||||
categoryMenu->ItemAt(0)->SetMarked(true);
|
categoryMenu->ItemAt(0)->SetMarked(true);
|
||||||
|
|||||||
@@ -10,11 +10,12 @@
|
|||||||
|
|
||||||
class BMenuField;
|
class BMenuField;
|
||||||
class BTextControl;
|
class BTextControl;
|
||||||
|
class Model;
|
||||||
|
|
||||||
|
|
||||||
class FilterView : public BGroupView {
|
class FilterView : public BGroupView {
|
||||||
public:
|
public:
|
||||||
FilterView();
|
FilterView(const Model& model);
|
||||||
virtual ~FilterView();
|
virtual ~FilterView();
|
||||||
|
|
||||||
virtual void AttachedToWindow();
|
virtual void AttachedToWindow();
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ MainWindow::MainWindow(BRect frame)
|
|||||||
BMenuBar* menuBar = new BMenuBar(B_TRANSLATE("Main Menu"));
|
BMenuBar* menuBar = new BMenuBar(B_TRANSLATE("Main Menu"));
|
||||||
_BuildMenu(menuBar);
|
_BuildMenu(menuBar);
|
||||||
|
|
||||||
fFilterView = new FilterView();
|
fFilterView = new FilterView(fModel);
|
||||||
fPackageListView = new PackageListView();
|
fPackageListView = new PackageListView();
|
||||||
fPackageInfoView = new PackageInfoView(&fPackageManager);
|
fPackageInfoView = new PackageInfoView(&fPackageManager);
|
||||||
|
|
||||||
|
|||||||
@@ -14,6 +14,55 @@
|
|||||||
#define B_TRANSLATION_CONTEXT "Model"
|
#define B_TRANSLATION_CONTEXT "Model"
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - PackageFilters
|
||||||
|
|
||||||
|
|
||||||
|
PackageFilter::~PackageFilter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class AnyFilter : public PackageFilter {
|
||||||
|
public:
|
||||||
|
virtual bool AcceptsPackage(const PackageInfo& package) const
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
class DepotFilter : public PackageFilter {
|
||||||
|
public:
|
||||||
|
DepotFilter(const DepotInfo& depot)
|
||||||
|
:
|
||||||
|
fDepot(depot)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual bool AcceptsPackage(const PackageInfo& package) const
|
||||||
|
{
|
||||||
|
// TODO: Maybe a PackageInfo ought to know the Depot it came from?
|
||||||
|
// But right now the same package could theoretically be provided
|
||||||
|
// from different depots and the filter would work correctly.
|
||||||
|
// Also the PackageList could actually contain references to packages
|
||||||
|
// instead of the packages as objects. The equal operator is quite
|
||||||
|
// expensive as is.
|
||||||
|
const PackageInfoList& packageList = fDepot.PackageList();
|
||||||
|
for (int i = packageList.CountItems() - 1; i >= 0; i--) {
|
||||||
|
if (packageList.ItemAtFast(i) == package)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
DepotInfo fDepot;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// #pragma mark - Model
|
||||||
|
|
||||||
|
|
||||||
Model::Model()
|
Model::Model()
|
||||||
:
|
:
|
||||||
fSearchTerms(),
|
fSearchTerms(),
|
||||||
@@ -36,7 +85,14 @@ Model::Model()
|
|||||||
B_TRANSLATE("Development"), "development"), true),
|
B_TRANSLATE("Development"), "development"), true),
|
||||||
fCategoryCommandLine(new PackageCategory(
|
fCategoryCommandLine(new PackageCategory(
|
||||||
BitmapRef(),
|
BitmapRef(),
|
||||||
B_TRANSLATE("Command line"), "command-line"), true)
|
B_TRANSLATE("Command line"), "command-line"), true),
|
||||||
|
fCategoryGames(new PackageCategory(
|
||||||
|
BitmapRef(),
|
||||||
|
B_TRANSLATE("Games"), "games"), true),
|
||||||
|
|
||||||
|
fCategoryFilter(PackageFilterRef(new AnyFilter(), true)),
|
||||||
|
fDepotFilter(PackageFilterRef(new AnyFilter(), true)),
|
||||||
|
fSearchTermsFilter(PackageFilterRef(new AnyFilter(), true))
|
||||||
{
|
{
|
||||||
// Don't forget to add new categories to this list:
|
// Don't forget to add new categories to this list:
|
||||||
fCategories.Add(fCategoryAudio);
|
fCategories.Add(fCategoryAudio);
|
||||||
@@ -45,6 +101,7 @@ Model::Model()
|
|||||||
fCategories.Add(fCategoryProductivity);
|
fCategories.Add(fCategoryProductivity);
|
||||||
fCategories.Add(fCategoryDevelopment);
|
fCategories.Add(fCategoryDevelopment);
|
||||||
fCategories.Add(fCategoryCommandLine);
|
fCategories.Add(fCategoryCommandLine);
|
||||||
|
fCategories.Add(fCategoryGames);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -61,7 +118,12 @@ Model::CreatePackageList() const
|
|||||||
= fDepots.ItemAtFast(i).PackageList();
|
= fDepots.ItemAtFast(i).PackageList();
|
||||||
|
|
||||||
for (int32 j = 0; j < packageList.CountItems(); j++) {
|
for (int32 j = 0; j < packageList.CountItems(); j++) {
|
||||||
resultList.Add(packageList.ItemAtFast(j));
|
const PackageInfo& package = packageList.ItemAtFast(j);
|
||||||
|
if (fCategoryFilter->AcceptsPackage(package)
|
||||||
|
&& fDepotFilter->AcceptsPackage(package)
|
||||||
|
&& fSearchTermsFilter->AcceptsPackage(package)) {
|
||||||
|
resultList.Add(package);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,17 @@
|
|||||||
#include "PackageInfo.h"
|
#include "PackageInfo.h"
|
||||||
|
|
||||||
|
|
||||||
|
class PackageFilter : public BReferenceable {
|
||||||
|
public:
|
||||||
|
virtual ~PackageFilter();
|
||||||
|
|
||||||
|
virtual bool AcceptsPackage(
|
||||||
|
const PackageInfo& package) const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef BReference<PackageFilter> PackageFilterRef;
|
||||||
|
|
||||||
|
|
||||||
class Model {
|
class Model {
|
||||||
public:
|
public:
|
||||||
Model();
|
Model();
|
||||||
@@ -31,6 +42,8 @@ public:
|
|||||||
{ return fCategoryDevelopment; }
|
{ return fCategoryDevelopment; }
|
||||||
const CategoryRef& CategoryCommandLine() const
|
const CategoryRef& CategoryCommandLine() const
|
||||||
{ return fCategoryCommandLine; }
|
{ return fCategoryCommandLine; }
|
||||||
|
const CategoryRef& CategoryGames() const
|
||||||
|
{ return fCategoryGames; }
|
||||||
|
|
||||||
const CategoryList& Categories() const
|
const CategoryList& Categories() const
|
||||||
{ return fCategories; }
|
{ return fCategories; }
|
||||||
@@ -46,9 +59,14 @@ private:
|
|||||||
CategoryRef fCategoryProductivity;
|
CategoryRef fCategoryProductivity;
|
||||||
CategoryRef fCategoryDevelopment;
|
CategoryRef fCategoryDevelopment;
|
||||||
CategoryRef fCategoryCommandLine;
|
CategoryRef fCategoryCommandLine;
|
||||||
|
CategoryRef fCategoryGames;
|
||||||
// TODO: More categories
|
// TODO: More categories
|
||||||
|
|
||||||
CategoryList fCategories;
|
CategoryList fCategories;
|
||||||
|
|
||||||
|
PackageFilterRef fCategoryFilter;
|
||||||
|
PackageFilterRef fDepotFilter;
|
||||||
|
PackageFilterRef fSearchTermsFilter;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user