From 779d8213e9fa6de8c43685094de1c69006b99f98 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stephan=20A=C3=9Fmus?= Date: Sun, 15 Sep 2013 17:21:11 +0200 Subject: [PATCH] HaikuDepot: Use PackageInfoRefs instead of PackageInfos Instead of storing PackageInfo objects directly in the PackageLists, store PackageInfoRefs instead. This makes a lot of operations much cheaper, and it also allows making changes to a PackageInfo (which now exists only once) and have those changes reflect everywhere. In particular, it will be easier to populate some information of the PackageInfo lazily, and to listen for changes on a PackageInfo object. --- src/apps/haiku-depot/MainWindow.cpp | 42 ++++++++++++------------ src/apps/haiku-depot/MainWindow.h | 2 +- src/apps/haiku-depot/Model.cpp | 30 +++++++++-------- src/apps/haiku-depot/Model.h | 4 +-- src/apps/haiku-depot/PackageInfo.cpp | 2 +- src/apps/haiku-depot/PackageInfo.h | 9 +++-- src/apps/haiku-depot/PackageListView.cpp | 19 +++++++---- src/apps/haiku-depot/PackageListView.h | 4 +-- 8 files changed, 62 insertions(+), 50 deletions(-) diff --git a/src/apps/haiku-depot/MainWindow.cpp b/src/apps/haiku-depot/MainWindow.cpp index b7b0552c87..92eaa9c338 100644 --- a/src/apps/haiku-depot/MainWindow.cpp +++ b/src/apps/haiku-depot/MainWindow.cpp @@ -160,9 +160,9 @@ MainWindow::_AdoptModel() void -MainWindow::_AdoptPackage(const PackageInfo& package) +MainWindow::_AdoptPackage(const PackageInfoRef& package) { - fPackageInfoView->SetPackage(package); + fPackageInfoView->SetPackage(*package.Get()); } @@ -183,7 +183,7 @@ MainWindow::_InitDummyModel() DepotInfo depot(B_TRANSLATE("Default")); // WonderBrush - PackageInfo wonderbrush( + PackageInfoRef wonderbrush(new(std::nothrow) PackageInfo( BitmapRef(new SharedBitmap(601), true), "WonderBrush", "2.1.2", @@ -196,24 +196,24 @@ MainWindow::_InitDummyModel() "WonderBrush is YellowBites' software for doing graphics design " "on Haiku. It combines many great under-the-hood features with " "powerful tools and an efficient and intuitive interface.", - "2.1.2 - Initial Haiku release."); - wonderbrush.AddUserRating( + "2.1.2 - Initial Haiku release."), true); + wonderbrush->AddUserRating( UserRating(UserInfo("humdinger"), 4.5f, "Awesome!", "en", "2.1.2", 0, 0) ); - wonderbrush.AddUserRating( + wonderbrush->AddUserRating( UserRating(UserInfo("bonefish"), 5.0f, "The best!", "en", "2.1.2", 3, 1) ); - wonderbrush.AddScreenshot( + wonderbrush->AddScreenshot( BitmapRef(new SharedBitmap(603), true)); - wonderbrush.AddCategory(fModel.CategoryGraphics()); - wonderbrush.AddCategory(fModel.CategoryProductivity()); + wonderbrush->AddCategory(fModel.CategoryGraphics()); + wonderbrush->AddCategory(fModel.CategoryProductivity()); depot.AddPackage(wonderbrush); // Paladin - PackageInfo paladin( + PackageInfoRef paladin(new(std::nothrow) PackageInfo( BitmapRef(new SharedBitmap(602), true), "Paladin", "1.2.0", @@ -227,30 +227,30 @@ MainWindow::_InitDummyModel() "The interface is streamlined, it has some features sorely " "missing from BeIDE, like running a project in the Terminal, " "and has a bundled text editor based upon Pe.", - ""); - paladin.AddUserRating( + ""), true); + paladin->AddUserRating( UserRating(UserInfo("stippi"), 3.5f, "Could be more integrated from the sounds of it.", "en", "1.2.0", 0, 1) ); - paladin.AddUserRating( + paladin->AddUserRating( UserRating(UserInfo("mmadia"), 5.0f, "It rocks! Give a try", "en", "1.1.0", 1, 0) ); - paladin.AddUserRating( + paladin->AddUserRating( UserRating(UserInfo("bonefish"), 2.0f, "It just needs to use my jam-rewrite 'ham' and it will be great.", "en", "1.1.0", 3, 1) ); - paladin.AddScreenshot( + paladin->AddScreenshot( BitmapRef(new SharedBitmap(605), true)); - paladin.AddCategory(fModel.CategoryDevelopment()); + paladin->AddCategory(fModel.CategoryDevelopment()); depot.AddPackage(paladin); // Sequitur - PackageInfo sequitur( + PackageInfoRef sequitur(new(std::nothrow) PackageInfo( BitmapRef(new SharedBitmap(604), true), "Sequitur", "2.1.0", @@ -314,8 +314,8 @@ MainWindow::_InitDummyModel() "pressure events. The new tool Broken Down Line uses this " "filter.\n\n" " * ''Note to filter developers:'' The filter API has changed. You " - "will need to recompile your filters."); - sequitur.AddUserRating( + "will need to recompile your filters."), true); + sequitur->AddUserRating( UserRating(UserInfo("pete"), 4.5f, "I can weave a web of sound! And it connects to PatchBay. Check " "it out, I can wholeheartly recommend this app!! This rating " @@ -326,14 +326,14 @@ MainWindow::_InitDummyModel() "please the programmer with the text layouting and scrolling of " "long ratings!", "en", "2.1.0", 4, 1) ); - sequitur.AddUserRating( + sequitur->AddUserRating( UserRating(UserInfo("stippi"), 3.5f, "It seems very capable. Still runs fine on Haiku. The interface " "is composed of many small, hard to click items. But you can " "configure a tool for each mouse button, which is great for the " "work flow.", "en", "2.1.0", 2, 1) ); - sequitur.AddCategory(fModel.CategoryAudio()); + sequitur->AddCategory(fModel.CategoryAudio()); depot.AddPackage(sequitur); diff --git a/src/apps/haiku-depot/MainWindow.h b/src/apps/haiku-depot/MainWindow.h index 694f32dc7b..b848741f9a 100644 --- a/src/apps/haiku-depot/MainWindow.h +++ b/src/apps/haiku-depot/MainWindow.h @@ -35,7 +35,7 @@ private: void _BuildMenu(BMenuBar* menuBar); void _AdoptModel(); - void _AdoptPackage(const PackageInfo& package); + void _AdoptPackage(const PackageInfoRef& package); void _ClearPackage(); void _InitDummyModel(); diff --git a/src/apps/haiku-depot/Model.cpp b/src/apps/haiku-depot/Model.cpp index 6557bd16b6..a6c16f5917 100644 --- a/src/apps/haiku-depot/Model.cpp +++ b/src/apps/haiku-depot/Model.cpp @@ -24,7 +24,7 @@ PackageFilter::~PackageFilter() class AnyFilter : public PackageFilter { public: - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { return true; } @@ -39,7 +39,7 @@ public: { } - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { // TODO: Maybe a PackageInfo ought to know the Depot it came from? // But right now the same package could theoretically be provided @@ -68,9 +68,11 @@ public: { } - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { - const CategoryList& categories = package.Categories(); + 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); if (category.Get() == NULL) @@ -94,7 +96,7 @@ public: { } - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { return fPackageList.Contains(package); } @@ -114,7 +116,7 @@ public: { } - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { return fPackageListA.Contains(package) || fPackageListB.Contains(package); @@ -146,15 +148,17 @@ public: } } - virtual bool AcceptsPackage(const PackageInfo& package) const + virtual bool AcceptsPackage(const PackageInfoRef& package) const { + if (package.Get() == NULL) + return false; // Every search term must be found in one of the package texts for (int32 i = fSearchTerms.CountItems() - 1; i >= 0; i--) { const BString& term = fSearchTerms.ItemAtFast(i); - if (!_TextContains(package.Title(), term) - && !_TextContains(package.Publisher().Name(), term) - && !_TextContains(package.ShortDescription(), term) - && !_TextContains(package.FullDescription(), term)) { + if (!_TextContains(package->Title(), term) + && !_TextContains(package->Publisher().Name(), term) + && !_TextContains(package->ShortDescription(), term) + && !_TextContains(package->FullDescription(), term)) { return false; } } @@ -263,7 +267,7 @@ Model::CreatePackageList() const const PackageList& packages = depot.Packages(); for (int32 j = 0; j < packages.CountItems(); j++) { - const PackageInfo& package = packages.ItemAtFast(j); + const PackageInfoRef& package = packages.ItemAtFast(j); if (fCategoryFilter->AcceptsPackage(package) && fSearchTermsFilter->AcceptsPackage(package)) { resultList.Add(package); @@ -283,7 +287,7 @@ Model::AddDepot(const DepotInfo& depot) void -Model::SetPackageState(const PackageInfo& package, PackageState state) +Model::SetPackageState(const PackageInfoRef& package, PackageState state) { switch (state) { default: diff --git a/src/apps/haiku-depot/Model.h b/src/apps/haiku-depot/Model.h index 87ff560d3e..390c0a6c39 100644 --- a/src/apps/haiku-depot/Model.h +++ b/src/apps/haiku-depot/Model.h @@ -14,7 +14,7 @@ public: virtual ~PackageFilter(); virtual bool AcceptsPackage( - const PackageInfo& package) const = 0; + const PackageInfoRef& package) const = 0; }; typedef BReference PackageFilterRef; @@ -55,7 +55,7 @@ public: { return fProgressCategories; } void SetPackageState( - const PackageInfo& package, + const PackageInfoRef& package, PackageState state); // Configure PackageFilters diff --git a/src/apps/haiku-depot/PackageInfo.cpp b/src/apps/haiku-depot/PackageInfo.cpp index 7172b80929..6b78f98cb0 100644 --- a/src/apps/haiku-depot/PackageInfo.cpp +++ b/src/apps/haiku-depot/PackageInfo.cpp @@ -640,7 +640,7 @@ DepotInfo::operator!=(const DepotInfo& other) const bool -DepotInfo::AddPackage(const PackageInfo& package) +DepotInfo::AddPackage(const PackageInfoRef& package) { return fPackages.Add(package); } diff --git a/src/apps/haiku-depot/PackageInfo.h b/src/apps/haiku-depot/PackageInfo.h index c66aecd4ee..d2bc66a0a8 100644 --- a/src/apps/haiku-depot/PackageInfo.h +++ b/src/apps/haiku-depot/PackageInfo.h @@ -181,7 +181,7 @@ typedef BReference CategoryRef; typedef List CategoryList; -class PackageInfo { +class PackageInfo : public BReferenceable { public: PackageInfo(); PackageInfo(const BitmapRef& icon, @@ -239,7 +239,10 @@ private: }; -typedef List PackageList; +typedef BReference PackageInfoRef; + + +typedef List PackageList; enum PackageState { @@ -266,7 +269,7 @@ public: const PackageList& Packages() const { return fPackages; } - bool AddPackage(const PackageInfo& package); + bool AddPackage(const PackageInfoRef& package); private: BString fName; diff --git a/src/apps/haiku-depot/PackageListView.cpp b/src/apps/haiku-depot/PackageListView.cpp index 332a64bf3f..f21f9f85b1 100644 --- a/src/apps/haiku-depot/PackageListView.cpp +++ b/src/apps/haiku-depot/PackageListView.cpp @@ -80,13 +80,13 @@ private: class PackageRow : public BRow { typedef BRow Inherited; public: - PackageRow(const PackageInfo& package); + PackageRow(const PackageInfoRef& package); - const PackageInfo& Package() const + const PackageInfoRef& Package() const { return fPackage; } private: - PackageInfo fPackage; + PackageInfoRef fPackage; }; @@ -374,11 +374,16 @@ enum { }; -PackageRow::PackageRow(const PackageInfo& package) +PackageRow::PackageRow(const PackageInfoRef& packageRef) : Inherited(ceilf(be_plain_font->Size() * 1.8f)), - fPackage(package) + fPackage(packageRef) { + if (packageRef.Get() == NULL) + return; + + const PackageInfo& package = *packageRef.Get(); + // Package icon and title // NOTE: The icon BBitmap is referenced by the fPackage member. const BBitmap* icon = NULL; @@ -553,7 +558,7 @@ PackageListView::SelectionChanged() void -PackageListView::AddPackage(const PackageInfo& package) +PackageListView::AddPackage(const PackageInfoRef& package) { PackageRow* packageRow = _FindRow(package); @@ -575,7 +580,7 @@ PackageListView::AddPackage(const PackageInfo& package) PackageRow* -PackageListView::_FindRow(const PackageInfo& package, PackageRow* parent) +PackageListView::_FindRow(const PackageInfoRef& package, PackageRow* parent) { for (int32 i = CountRows(parent) - 1; i >= 0; i--) { PackageRow* row = dynamic_cast(RowAt(i, parent)); diff --git a/src/apps/haiku-depot/PackageListView.h b/src/apps/haiku-depot/PackageListView.h index 9ffd5760c1..86fdd714c9 100644 --- a/src/apps/haiku-depot/PackageListView.h +++ b/src/apps/haiku-depot/PackageListView.h @@ -29,10 +29,10 @@ public: virtual void SelectionChanged(); - void AddPackage(const PackageInfo& package); + void AddPackage(const PackageInfoRef& package); private: - PackageRow* _FindRow(const PackageInfo& package, + PackageRow* _FindRow(const PackageInfoRef& package, PackageRow* parent = NULL); private: class ItemCountView;