[haiku-commits] haiku: hrev54925 - in src/apps/haikudepot: model ui util

  • From: Andrew Lindesay <apl@xxxxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Thu, 28 Jan 2021 07:20:07 +0000 (UTC)

hrev54925 adds 1 changeset to branch 'master'
old head: 0fbba5d7214682fdf4339c52d7e41f2f398eca1b
new head: 9984ca59f6fb840ef91a3d385bc0f710a5bd9c83
overview: 
https://git.haiku-os.org/haiku/log/?qt=range&q=9984ca59f6fb+%5E0fbba5d72146

----------------------------------------------------------------------------

9984ca59f6fb: HaikuDepot: Remove Custom List
  
  Further removal of the use of custom list class.
  
  Relates To #15534
  
  Change-Id: I1d84b562b334e5e52ed4772bad3a6aea7b715562
  Reviewed-on: https://review.haiku-os.org/c/haiku/+/3657
  Reviewed-by: Adrien Destugues <pulkomandy@xxxxxxxxx>

                                    [ Andrew Lindesay <apl@xxxxxxxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev54925
Commit:      9984ca59f6fb840ef91a3d385bc0f710a5bd9c83
URL:         https://git.haiku-os.org/haiku/commit/?id=9984ca59f6fb
Author:      Andrew Lindesay <apl@xxxxxxxxxxxxxx>
Date:        Thu Jan  7 09:00:25 2021 UTC

Ticket:      https://dev.haiku-os.org/ticket/15534

----------------------------------------------------------------------------

11 files changed, 328 insertions(+), 233 deletions(-)
src/apps/haikudepot/model/Model.cpp              |  73 ++++-------
src/apps/haikudepot/model/Model.h                |  10 +-
src/apps/haikudepot/model/PackageInfo.cpp        |  73 +++++++----
src/apps/haikudepot/model/PackageInfo.h          |  33 ++---
src/apps/haikudepot/model/PackageManager.cpp     | 120 +++++++++++-------
src/apps/haikudepot/model/PackageManager.h       |   9 +-
.../server/ServerPkgDataUpdateProcess.cpp        |   4 +-
src/apps/haikudepot/ui/PackageInfoView.cpp       | 124 ++++++++++---------
src/apps/haikudepot/ui/ScreenshotWindow.cpp      |  76 +++++++-----
src/apps/haikudepot/ui/ScreenshotWindow.h        |   2 +
src/apps/haikudepot/util/Collector.h             |  37 ++++++

----------------------------------------------------------------------------

diff --git a/src/apps/haikudepot/model/Model.cpp 
b/src/apps/haikudepot/model/Model.cpp
index c45eff3364..6fd1803c07 100644
--- a/src/apps/haikudepot/model/Model.cpp
+++ b/src/apps/haikudepot/model/Model.cpp
@@ -1,7 +1,7 @@
 /*
  * Copyright 2013-2014, Stephan Aßmus <superstippi@xxxxxx>.
  * Copyright 2014, Axel Dörfler <axeld@xxxxxxxxxxxxxxxx>.
- * Copyright 2016-2020, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
+ * Copyright 2016-2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 
@@ -167,38 +167,6 @@ 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;
-
-               for (int32 i = 0; i < fPackageLists.CountItems(); i++) {
-                       if (fPackageLists.ItemAtFast(i)->Contains(package))
-                               return false;
-               }
-               return true;
-       }
-
-private:
-       List<const PackageList*, true>  fPackageLists;
-};
-
-
 class StateFilter : public PackageFilter {
 public:
        StateFilter(PackageState state)
@@ -348,10 +316,10 @@ Model::InitPackageIconRepository()
 }
 
 
-bool
+void
 Model::AddListener(const ModelListenerRef& listener)
 {
-       return fListeners.Add(listener);
+       fListeners.push_back(listener);
 }
 
 
@@ -725,9 +693,10 @@ Model::PopulatePackage(const PackageInfoRef& package, 
uint32 flags)
                                        item.FindDouble("createTimestamp", 
&createTimestamp);
 
                                        // Add the rating to the PackageInfo
-                                       UserRating userRating = 
UserRating(UserInfo(user), rating,
+                                       UserRatingRef userRating(new UserRating(
+                                               UserInfo(user), rating,
                                                comment, languageCode, 
versionString,
-                                               (uint64) createTimestamp);
+                                               (uint64) createTimestamp), 
true);
                                        package->AddUserRating(userRating);
                                        HDDEBUG("rating [%s] retrieved from 
server", code.String());
                                }
@@ -741,14 +710,16 @@ Model::PopulatePackage(const PackageInfoRef& package, 
uint32 flags)
        }
 
        if ((flags & POPULATE_SCREEN_SHOTS) != 0) {
-               ScreenshotInfoList screenshotInfos;
+               std::vector<ScreenshotInfoRef> screenshotInfos;
                {
                        BAutolock locker(&fLock);
-                       screenshotInfos = package->ScreenshotInfos();
+                       for (int32 i = 0; i < package->CountScreenshotInfos(); 
i++)
+                               
screenshotInfos.push_back(package->ScreenshotInfoAtIndex(i));
                        package->ClearScreenshots();
                }
-               for (int i = 0; i < screenshotInfos.CountItems(); i++) {
-                       const ScreenshotInfo& info = 
screenshotInfos.ItemAtFast(i);
+               std::vector<ScreenshotInfoRef>::iterator it;
+               for (it = screenshotInfos.begin(); it != screenshotInfos.end(); 
it++) {
+                       const ScreenshotInfoRef& info = *it;
                        _PopulatePackageScreenshot(package, info, 320, false);
                }
        }
@@ -942,7 +913,7 @@ Model::DumpExportPkgDataPath(BPath& path,
 
 void
 Model::_PopulatePackageScreenshot(const PackageInfoRef& package,
-       const ScreenshotInfo& info, int32 scaledWidth, bool fromCacheOnly)
+       const ScreenshotInfoRef& info, int32 scaledWidth, bool fromCacheOnly)
 {
        // See if there is a cached screenshot
        BFile screenshotFile;
@@ -957,7 +928,7 @@ Model::_PopulatePackageScreenshot(const PackageInfoRef& 
package,
        }
 
        bool fileExists = false;
-       BString screenshotName(info.Code());
+       BString screenshotName(info->Code());
        screenshotName << "@" << scaledWidth;
        screenshotName << ".png";
        time_t modifiedTime;
@@ -989,9 +960,9 @@ Model::_PopulatePackageScreenshot(const PackageInfoRef& 
package,
        // Retrieve screenshot from web-app
        BMallocIO buffer;
 
-       int32 scaledHeight = scaledWidth * info.Height() / info.Width();
+       int32 scaledHeight = scaledWidth * info->Height() / info->Width();
 
-       status_t status = fWebAppInterface.RetrieveScreenshot(info.Code(),
+       status_t status = fWebAppInterface.RetrieveScreenshot(info->Code(),
                scaledWidth, scaledHeight, &buffer);
        if (status == B_OK) {
                BitmapRef bitmapRef(new(std::nothrow)SharedBitmap(buffer), 
true);
@@ -1004,7 +975,7 @@ Model::_PopulatePackageScreenshot(const PackageInfoRef& 
package,
                }
        } else {
                HDERROR("Failed to retrieve screenshot for code '%s' "
-                       "at %" B_PRIi32 "x%" B_PRIi32 ".", info.Code().String(),
+                       "at %" B_PRIi32 "x%" B_PRIi32 ".", 
info->Code().String(),
                        scaledWidth, scaledHeight);
        }
 }
@@ -1016,8 +987,9 @@ Model::_PopulatePackageScreenshot(const PackageInfoRef& 
package,
 void
 Model::_NotifyAuthorizationChanged()
 {
-       for (int32 i = fListeners.CountItems() - 1; i >= 0; i--) {
-               const ModelListenerRef& listener = fListeners.ItemAtFast(i);
+       std::vector<ModelListenerRef>::const_iterator it;
+       for (it = fListeners.begin(); it != fListeners.end(); it++) {
+               const ModelListenerRef& listener = *it;
                if (listener.Get() != NULL)
                        listener->AuthorizationChanged();
        }
@@ -1027,8 +999,9 @@ Model::_NotifyAuthorizationChanged()
 void
 Model::_NotifyCategoryListChanged()
 {
-       for (int32 i = fListeners.CountItems() - 1; i >= 0; i--) {
-               const ModelListenerRef& listener = fListeners.ItemAtFast(i);
+       std::vector<ModelListenerRef>::const_iterator it;
+       for (it = fListeners.begin(); it != fListeners.end(); it++) {
+               const ModelListenerRef& listener = *it;
                if (listener.Get() != NULL)
                        listener->CategoryListChanged();
        }
diff --git a/src/apps/haikudepot/model/Model.h 
b/src/apps/haikudepot/model/Model.h
index 4e16686410..47bdae8c2e 100644
--- a/src/apps/haikudepot/model/Model.h
+++ b/src/apps/haikudepot/model/Model.h
@@ -1,6 +1,6 @@
 /*
  * Copyright 2013-2014, Stephan Aßmus <superstippi@xxxxxx>.
- * Copyright 2016-2020, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
+ * Copyright 2016-2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 #ifndef MODEL_H
@@ -58,7 +58,6 @@ public:
 
 
 typedef BReference<ModelListener> ModelListenerRef;
-typedef List<ModelListenerRef, false> ModelListenerList;
 
 
 class Model {
@@ -74,7 +73,7 @@ public:
                        BLocker*                        Lock()
                                                                        { 
return &fLock; }
 
-                       bool                            AddListener(const 
ModelListenerRef& listener);
+                       void                            AddListener(const 
ModelListenerRef& listener);
 
                        PackageInfoRef          PackageForName(const BString& 
name);
                        bool                            MatchesFilter(
@@ -176,7 +175,7 @@ private:
 
                        void                            
_PopulatePackageScreenshot(
                                                                        const 
PackageInfoRef& package,
-                                                                       const 
ScreenshotInfo& info,
+                                                                       const 
ScreenshotInfoRef& info,
                                                                        int32 
scaledWidth, bool fromCacheOnly);
 
                        void                            
_NotifyAuthorizationChanged();
@@ -215,7 +214,8 @@ private:
                                                                
fPackageIconRepository;
                        WebAppInterface         fWebAppInterface;
 
-                       ModelListenerList       fListeners;
+                       std::vector<ModelListenerRef>
+                                                               fListeners;
 };
 
 
diff --git a/src/apps/haikudepot/model/PackageInfo.cpp 
b/src/apps/haikudepot/model/PackageInfo.cpp
index 8846780f24..acdacc3fb1 100644
--- a/src/apps/haikudepot/model/PackageInfo.cpp
+++ b/src/apps/haikudepot/model/PackageInfo.cpp
@@ -1,7 +1,7 @@
 /*
  * Copyright 2013-2014, Stephan Aßmus <superstippi@xxxxxx>.
  * Copyright 2013, Rene Gollent <rene@xxxxxxxxxxx>.
- * Copyright 2016-2020, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
+ * Copyright 2016-2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 
@@ -792,22 +792,32 @@ PackageInfo::IsLocalFile() const
 void
 PackageInfo::ClearUserRatings()
 {
-       if (!fUserRatings.IsEmpty()) {
-               fUserRatings.Clear();
+       if (!fUserRatings.empty()) {
+               fUserRatings.clear();
                _NotifyListeners(PKG_CHANGED_RATINGS);
        }
 }
 
 
-bool
-PackageInfo::AddUserRating(const UserRating& rating)
+int32
+PackageInfo::CountUserRatings() const
 {
-       if (!fUserRatings.Add(rating))
-               return false;
+       return fUserRatings.size();
+}
 
-       _NotifyListeners(PKG_CHANGED_RATINGS);
 
-       return true;
+UserRatingRef
+PackageInfo::UserRatingAtIndex(int32 index) const
+{
+       return fUserRatings[index];
+}
+
+
+void
+PackageInfo::AddUserRating(const UserRatingRef& rating)
+{
+       fUserRatings.push_back(rating);
+       _NotifyListeners(PKG_CHANGED_RATINGS);
 }
 
 
@@ -826,11 +836,11 @@ PackageInfo::SetRatingSummary(const RatingSummary& 
summary)
 RatingSummary
 PackageInfo::CalculateRatingSummary() const
 {
-       if (fUserRatings.CountItems() == 0)
+       if (fUserRatings.empty())
                return fCachedRatingSummary;
 
        RatingSummary summary;
-       summary.ratingCount = fUserRatings.CountItems();
+       summary.ratingCount = fUserRatings.size();
        summary.averageRating = 0.0f;
        int starRatingCount = sizeof(summary.ratingCountByStar) / sizeof(int);
        for (int i = 0; i < starRatingCount; i++)
@@ -843,7 +853,7 @@ PackageInfo::CalculateRatingSummary() const
 
        int ratingsSpecified = summary.ratingCount;
        for (int i = 0; i < summary.ratingCount; i++) {
-               float rating = fUserRatings.ItemAtFast(i).Rating();
+               float rating = fUserRatings[i]->Rating();
 
                if (rating < 0.0f)
                        rating = -1.0f;
@@ -897,14 +907,28 @@ PackageInfo::IsProminent() const
 void
 PackageInfo::ClearScreenshotInfos()
 {
-       fScreenshotInfos.Clear();
+       fScreenshotInfos.clear();
 }
 
 
-bool
-PackageInfo::AddScreenshotInfo(const ScreenshotInfo& info)
+int32
+PackageInfo::CountScreenshotInfos() const
 {
-       return fScreenshotInfos.Add(info);
+       return fScreenshotInfos.size();
+}
+
+
+ScreenshotInfoRef
+PackageInfo::ScreenshotInfoAtIndex(int32 index) const
+{
+       return fScreenshotInfos[index];
+}
+
+
+void
+PackageInfo::AddScreenshotInfo(const ScreenshotInfoRef& info)
+{
+       fScreenshotInfos.push_back(info);
 }
 
 
@@ -977,14 +1001,15 @@ PackageInfo::SetDepotName(const BString& depotName)
 bool
 PackageInfo::AddListener(const PackageInfoListenerRef& listener)
 {
-       return fListeners.Add(listener);
+       fListeners.push_back(listener);
+       return true;
 }
 
 
 void
 PackageInfo::RemoveListener(const PackageInfoListenerRef& listener)
 {
-       fListeners.Remove(listener);
+       std::remove(fListeners.begin(), fListeners.end(), listener);
 }
 
 
@@ -1026,21 +1051,23 @@ PackageInfo::_NotifyListeners(uint32 changes)
 void
 PackageInfo::_NotifyListenersImmediate(uint32 changes)
 {
-       int count = fListeners.CountItems();
+       int count = fListeners.size();
        if (count == 0)
                return;
 
        // Clone list to avoid listeners detaching themselves in notifications
        // to screw up the list while iterating it.
-       PackageListenerList listeners(fListeners);
+       std::vector<PackageInfoListenerRef> listeners(fListeners);
+
        // Check if it worked:
-       if (listeners.CountItems() != count)
+       if (listeners.size() != count)
                return;
 
        PackageInfoEvent event(PackageInfoRef(this), changes);
 
-       for (int i = 0; i < count; i++) {
-               const PackageInfoListenerRef& listener = 
listeners.ItemAtFast(i);
+       std::vector<PackageInfoListenerRef>::iterator it;
+       for (it = listeners.begin(); it != listeners.end(); it++) {
+               const PackageInfoListenerRef listener = *it;
                if (listener.Get() != NULL)
                        listener->PackageChanged(event);
        }
diff --git a/src/apps/haikudepot/model/PackageInfo.h 
b/src/apps/haikudepot/model/PackageInfo.h
index df59c11964..77945c964d 100644
--- a/src/apps/haikudepot/model/PackageInfo.h
+++ b/src/apps/haikudepot/model/PackageInfo.h
@@ -1,6 +1,6 @@
 /*
  * Copyright 2013-2014, Stephan Aßmus <superstippi@xxxxxx>.
- * Copyright 2016-2020, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
+ * Copyright 2016-2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 #ifndef PACKAGE_INFO_H
@@ -64,7 +64,7 @@ private:
 };
 
 
-class UserRating {
+class UserRating : public BReferenceable {
 public:
                                                                UserRating();
                                                                
UserRating(const UserInfo& userInfo,
@@ -102,7 +102,7 @@ private:
 };
 
 
-typedef List<UserRating, false> UserRatingList;
+typedef BReference<UserRating> UserRatingRef;
 
 
 class RatingSummary {
@@ -183,7 +183,7 @@ extern bool IsPackageCategoryBefore(const CategoryRef& c1,
        const CategoryRef& c2);
 
 
-class ScreenshotInfo {
+class ScreenshotInfo : public BReferenceable {
 public:
                                                                
ScreenshotInfo();
                                                                
ScreenshotInfo(const BString& code,
@@ -211,10 +211,9 @@ private:
 };
 
 
-typedef List<ScreenshotInfo, false, 2> ScreenshotInfoList;
+typedef BReference<ScreenshotInfo> ScreenshotInfoRef;
 
 
-typedef List<PackageInfoListenerRef, false, 2> PackageListenerList;
 typedef std::set<int32> PackageInstallationLocationSet;
 
 
@@ -309,9 +308,9 @@ public:
                        CategoryRef                     CategoryAtIndex(int32 
index) const;
 
                        void                            ClearUserRatings();
-                       bool                            AddUserRating(const 
UserRating& rating);
-                       const UserRatingList& UserRatings() const
-                                                                       { 
return fUserRatings; }
+                       void                            AddUserRating(const 
UserRatingRef& rating);
+                       int32                           CountUserRatings() 
const;
+                       UserRatingRef           UserRatingAtIndex(int32 index) 
const;
                        void                            SetRatingSummary(const 
RatingSummary& summary);
                        RatingSummary           CalculateRatingSummary() const;
 
@@ -323,9 +322,10 @@ public:
                        bool                            IsProminent() const;
 
                        void                            ClearScreenshotInfos();
-                       bool                            AddScreenshotInfo(const 
ScreenshotInfo& info);
-                       const ScreenshotInfoList& ScreenshotInfos() const
-                                                                       { 
return fScreenshotInfos; }
+                       void                            AddScreenshotInfo(
+                                                                       const 
ScreenshotInfoRef& info);
+                       int32                           CountScreenshotInfos() 
const;
+                       ScreenshotInfoRef       ScreenshotInfoAtIndex(int32 
index) const;
 
                        void                            ClearScreenshots();
                        bool                            AddScreenshot(const 
BitmapRef& screenshot);
@@ -366,17 +366,20 @@ private:
                        BString                         fChangelog;
                        std::vector<CategoryRef>
                                                                fCategories;
-                       UserRatingList          fUserRatings;
+                       std::vector<UserRatingRef>
+                                                               fUserRatings;
                        RatingSummary           fCachedRatingSummary;
                        int64                           fProminence;
-                       ScreenshotInfoList      fScreenshotInfos;
+                       std::vector<ScreenshotInfoRef>
+                                                               
fScreenshotInfos;
                        std::vector<BitmapRef>
                                                                fScreenshots;
                        PackageState            fState;
                        PackageInstallationLocationSet
                                                                
fInstallationLocations;
                        float                           fDownloadProgress;
-                       PackageListenerList     fListeners;
+                       std::vector<PackageInfoListenerRef>
+                                                               fListeners;
                        int32                           fFlags;
                        bool                            fSystemDependency;
                        BString                         fArchitecture;
diff --git a/src/apps/haikudepot/model/PackageManager.cpp 
b/src/apps/haikudepot/model/PackageManager.cpp
index b7855286c5..9b2d21e818 100644
--- a/src/apps/haikudepot/model/PackageManager.cpp
+++ b/src/apps/haikudepot/model/PackageManager.cpp
@@ -331,22 +331,23 @@ private:
 // #pragma mark - OpenPackageAction
 
 
-struct DeskbarLink {
+class DeskbarLink {
+public:
        DeskbarLink()
        {
        }
 
        DeskbarLink(const BString& path, const BString& link)
                :
-               path(path),
-               link(link)
+               fPath(path),
+               fLink(link)
        {
        }
 
        DeskbarLink(const DeskbarLink& other)
                :
-               path(other.path),
-               link(other.link)
+               fPath(other.fPath),
+               fLink(other.fLink)
        {
        }
 
@@ -354,14 +355,24 @@ struct DeskbarLink {
        {
                if (this == &other)
                        return *this;
-               path = other.path;
-               link = other.link;
+               fPath = other.Path();
+               fLink = other.Link();
                return *this;
        }
 
+       const BString Path() const
+       {
+               return fPath;
+       }
+
+       const BString Link() const
+       {
+               return fLink;
+       }
+
        bool operator==(const DeskbarLink& other)
        {
-               return path == other.path && link == other.link;
+               return fPath == other.fPath && fLink == other.fLink;
        }
 
        bool operator!=(const DeskbarLink& other)
@@ -369,17 +380,18 @@ struct DeskbarLink {
                return !(*this == other);
        }
 
-       BString path;
-       BString link;
+private:
+                       BString                         fPath;
+                       BString                         fLink;
 };
 
 
-typedef List<DeskbarLink, false> DeskbarLinkList;
+typedef BReference<DeskbarLink> DeskbarLinkRef;
 
 
 class DeskbarLinkFinder : public BPackageContentHandler {
 public:
-       DeskbarLinkFinder(DeskbarLinkList& foundLinks)
+       DeskbarLinkFinder(std::vector<DeskbarLink>& foundLinks)
                :
                fDeskbarLinks(foundLinks)
        {
@@ -392,7 +404,7 @@ public:
                                && entry->SymlinkPath() != NULL) {
                        HDINFO("found deskbar entry: %s -> %s",
                                path.String(), entry->SymlinkPath());
-                       fDeskbarLinks.Add(DeskbarLink(path, 
entry->SymlinkPath()));
+                       fDeskbarLinks.push_back(DeskbarLink(path, 
entry->SymlinkPath()));
                }
                return B_OK;
        }
@@ -431,7 +443,7 @@ public:
        }
 
 private:
-       DeskbarLinkList&        fDeskbarLinks;
+       std::vector<DeskbarLink>        fDeskbarLinks;
 };
 
 
@@ -444,7 +456,7 @@ public:
                fDeskbarLink(link),
                fLabel(B_TRANSLATE("Open %DeskbarLink%"))
        {
-               BString target = fDeskbarLink.link;
+               BString target = fDeskbarLink.Link();
                int32 lastPathSeparator = target.FindLast('/');
                if (lastPathSeparator > 0 && lastPathSeparator + 1 < 
target.Length())
                        target.Remove(0, lastPathSeparator + 1);
@@ -461,8 +473,8 @@ public:
        {
                status_t status;
                BPath path;
-               if (fDeskbarLink.link.FindFirst('/') == 0) {
-                       status = path.SetTo(fDeskbarLink.link);
+               if (fDeskbarLink.Link().FindFirst('/') == 0) {
+                       status = path.SetTo(fDeskbarLink.Link());
                        HDINFO("trying to launch (absolute link): %s", 
path.Path());
                } else {
                        int32 location = InstallLocation();
@@ -478,11 +490,11 @@ public:
                                return B_ERROR;
                        }
 
-                       status = path.Append(fDeskbarLink.path);
+                       status = path.Append(fDeskbarLink.Path());
                        if (status == B_OK)
                                status = path.GetParent(&path);
                        if (status == B_OK) {
-                               status = path.Append(fDeskbarLink.link, true);
+                               status = path.Append(fDeskbarLink.Link(), true);
                                HDINFO("trying to launch: %s", path.Path());
                        }
                }
@@ -498,7 +510,7 @@ public:
        }
 
        static bool FindAppToLaunch(const PackageInfoRef& package,
-               DeskbarLinkList& foundLinks)
+               std::vector<DeskbarLink>& foundLinks)
        {
                if (package.Get() == NULL)
                        return false;
@@ -545,7 +557,7 @@ public:
                        return false;
                }
 
-               return foundLinks.CountItems() > 0;
+               return !foundLinks.empty();
        }
 
 private:
@@ -585,36 +597,50 @@ PackageManager::GetPackageState(const PackageInfo& 
package)
 }
 
 
-PackageActionList
-PackageManager::GetPackageActions(PackageInfoRef package, Model* model)
+void
+PackageManager::GetPackageActions(PackageInfoRef package, Model* model,
+               Collector<PackageActionRef>& actionList)
 {
-       PackageActionList actionList;
        if (package->IsSystemPackage() || package->IsSystemDependency())
-               return actionList;
-
-       int32 state = package->State();
-       if (state == ACTIVATED || state == INSTALLED) {
-               actionList.Add(PackageActionRef(new UninstallPackageAction(
-                       package, model), true));
-
-               // Add OpenPackageActions for each deskbar link found in the
-               // package
-               DeskbarLinkList foundLinks;
-               if (OpenPackageAction::FindAppToLaunch(package, foundLinks)
-                       && foundLinks.CountItems() < 4) {
-                       for (int32 i = 0; i < foundLinks.CountItems(); i++) {
-                               const DeskbarLink& link = 
foundLinks.ItemAtFast(i);
-                               actionList.Add(PackageActionRef(new 
OpenPackageAction(
-                                       package, model, link), true));
-                       }
-               }
-       } else if (state == NONE || state == UNINSTALLED) {
-               actionList.Add(PackageActionRef(new 
InstallPackageAction(package,
-                               model), true));
+               return;
+
+       switch (package->State()) {
+               case ACTIVATED:
+               case INSTALLED:
+                       _GatherPackageActionsForActivatedOrInstalled(
+                               package, model, actionList);
+                       break;
+               case NONE:
+               case UNINSTALLED:
+                       actionList.Add(PackageActionRef(
+                               new InstallPackageAction(package, model), 
true));
+                       break;
+               default:
+                       break;
        }
-       // TODO: activation status
+}
+
 
-       return actionList;
+void
+PackageManager::_GatherPackageActionsForActivatedOrInstalled(
+               PackageInfoRef package, Model* model,
+               Collector<PackageActionRef>& actionList)
+{
+       actionList.Add(PackageActionRef(new UninstallPackageAction(
+               package, model), true));
+
+       // Add OpenPackageActions for each deskbar link found in the
+       // package
+       std::vector<DeskbarLink> foundLinks;
+       if (OpenPackageAction::FindAppToLaunch(package, foundLinks)
+               && foundLinks.size() < 4) {
+               std::vector<DeskbarLink>::const_iterator it;
+               for (it = foundLinks.begin(); it != foundLinks.end(); it++) {
+                       const DeskbarLink& aLink = *it;
+                       actionList.Add(PackageActionRef(new OpenPackageAction(
+                               package, model, aLink), true));
+               }
+       }
 }
 
 
diff --git a/src/apps/haikudepot/model/PackageManager.h 
b/src/apps/haikudepot/model/PackageManager.h
index 5fb63e19bd..699e314db0 100644
--- a/src/apps/haikudepot/model/PackageManager.h
+++ b/src/apps/haikudepot/model/PackageManager.h
@@ -14,6 +14,7 @@
 #include <package/DaemonClient.h>
 #include <package/manager/PackageManager.h>
 
+#include "Collector.h"
 #include "DecisionProvider.h"
 #include "JobStateListener.h"
 #include "PackageAction.h"
@@ -72,8 +73,9 @@ public:
        virtual                                         ~PackageManager();
 
        virtual PackageState            GetPackageState(const PackageInfo& 
package);
-       virtual PackageActionList       GetPackageActions(PackageInfoRef 
package,
-                                                                       Model* 
model);
+       virtual void                            
GetPackageActions(PackageInfoRef package,
+                                                                       Model* 
model,
+                                                                       
Collector<PackageActionRef>& actionList);
 
                        void                            SetCurrentActionPackage(
                                                                        
PackageInfoRef package,
@@ -120,6 +122,9 @@ private:
                                                                        
InstalledRepository& repository);
 
 private:
+                       void                            
_GatherPackageActionsForActivatedOrInstalled(
+                                                                       
PackageInfoRef package, Model* model,
+                                                                       
Collector<PackageActionRef>& actionList);
                        bool                            _AddResults(
                                                                        
BPackageManager::InstalledRepository&
                                                                                
repository,
diff --git a/src/apps/haikudepot/server/ServerPkgDataUpdateProcess.cpp 
b/src/apps/haikudepot/server/ServerPkgDataUpdateProcess.cpp
index 9418f8c491..771b8a4ba0 100644
--- a/src/apps/haikudepot/server/ServerPkgDataUpdateProcess.cpp
+++ b/src/apps/haikudepot/server/ServerPkgDataUpdateProcess.cpp
@@ -143,12 +143,12 @@ PackageFillingPkgListener::ConsumePackage(const 
PackageInfoRef& package,
 
        for (i = 0; i < countPkgScreenshots; i++) {
                DumpExportPkgScreenshot* screenshot = 
pkg->PkgScreenshotsItemAt(i);
-               package->AddScreenshotInfo(ScreenshotInfo(
+               package->AddScreenshotInfo(ScreenshotInfoRef(new ScreenshotInfo(
                        *(screenshot->Code()),
                        static_cast<int32>(screenshot->Width()),
                        static_cast<int32>(screenshot->Height()),
                        static_cast<int32>(screenshot->Length())
-               ));
+               ), true));
        }
 
        HDDEBUG("did populate data for [%s] (%s)", pkg->Name()->String(),
diff --git a/src/apps/haikudepot/ui/PackageInfoView.cpp 
b/src/apps/haikudepot/ui/PackageInfoView.cpp
index 925d191e74..76f098d17e 100644
--- a/src/apps/haikudepot/ui/PackageInfoView.cpp
+++ b/src/apps/haikudepot/ui/PackageInfoView.cpp
@@ -525,50 +525,20 @@ public:
                // TODO: if the given package is either a system package
                // or a system dependency, show a message indicating that status
                // so the user knows why no actions are presented
-               PackageActionList actions = manager.GetPackageActions(
+               std::vector<PackageActionRef> actions;
+               VectorCollector<PackageActionRef> actionsCollector(actions);
+               manager.GetPackageActions(
                        const_cast<PackageInfo*>(&package),
-                       fPackageActionHandler->GetModel());
-
-               bool clearNeeded = fStatusBar != NULL;
-               if (!clearNeeded) {
-                       if (actions.CountItems() != 
fPackageActions.CountItems())
-                               clearNeeded = true;
-                       else {
-                               for (int32 i = 0; i < actions.CountItems(); 
i++) {
-                                       if (actions.ItemAtFast(i)->Type()
-                                                       != 
fPackageActions.ItemAtFast(i)->Type()) {
-                                               clearNeeded = true;
-                                               break;
-                                       }
-                               }
-                       }
-               }
+                       fPackageActionHandler->GetModel(), actionsCollector);
 
+               bool clearNeeded = _IsClearNeededToAdoptActions(actions);
                fPackageActions = actions;
-               if (!clearNeeded && fButtons.CountItems() == 
actions.CountItems()) {
-                       int32 index = 0;
-                       for (int32 i = fPackageActions.CountItems() - 1; i >= 
0; i--) {
-                               const PackageActionRef& action = 
fPackageActions.ItemAtFast(i);
-                               BButton* button = 
(BButton*)fButtons.ItemAtFast(index++);
-                               button->SetLabel(action->Label());
-                       }
-                       return;
-               }
-
-               Clear();
-
-               // Add Buttons in reverse action order
-               for (int32 i = fPackageActions.CountItems() - 1; i >= 0; i--) {
-                       const PackageActionRef& action = 
fPackageActions.ItemAtFast(i);
-
-                       BMessage* message = new BMessage(MSG_PACKAGE_ACTION);
-                       message->AddInt32("index", i);
-
-                       BButton* button = new BButton(action->Label(), message);
-                       fLayout->AddView(button);
-                       button->SetTarget(this);
 
-                       fButtons.AddItem(button);
+               if (clearNeeded) {
+                       Clear();
+                       _CreateAllNewButtonsForAdoptActions();
+               } else {
+                       _UpdateExistingButtonsForAdoptActions();
                }
        }
 
@@ -615,13 +585,56 @@ public:
        }
 
 private:
+       bool _IsClearNeededToAdoptActions(std::vector<PackageActionRef> actions)
+       {
+               if (fStatusBar != NULL)
+                       return true;
+               if (actions.size() != fPackageActions.size())
+                       return true;
+               if (fButtons.CountItems() != actions.size())
+                       return true;
+               for (int i = 0; (i < actions.size()); i++) {
+                       if (actions[i]->Type() != fPackageActions[i]->Type())
+                               return true;
+               }
+               return false;
+       }
+
+       void _UpdateExistingButtonsForAdoptActions()
+       {
+               // note that by this point, the actions will have been set to 
the
+               // member variable.
+               int32 index = 0;
+               for (int32 i = fPackageActions.size() - 1; i >= 0; i--) {
+                       const PackageActionRef& action = fPackageActions[i];
+                       BButton* button = 
(BButton*)fButtons.ItemAtFast(index++);
+                       button->SetLabel(action->Label());
+               }
+       }
+
+       void _CreateAllNewButtonsForAdoptActions()
+       {
+               for (int32 i = fPackageActions.size() - 1; i >= 0; i--) {
+                       const PackageActionRef& action = fPackageActions[i];
+
+                       BMessage* message = new BMessage(MSG_PACKAGE_ACTION);
+                       message->AddInt32("index", i);
+
+                       BButton* button = new BButton(action->Label(), message);
+                       fLayout->AddView(button);
+                       button->SetTarget(this);
+
+                       fButtons.AddItem(button);
+               }
+       }
+
        void _RunPackageAction(BMessage* message)
        {
                int32 index;
                if (message->FindInt32("index", &index) != B_OK)
                        return;
 
-               const PackageActionRef& action = fPackageActions.ItemAt(index);
+               const PackageActionRef& action = fPackageActions[index];
                if (action.Get() == NULL)
                        return;
 
@@ -670,8 +683,10 @@ private:
 
 private:
        BGroupLayout*           fLayout;
-       PackageActionList       fPackageActions;
-       PackageActionHandler* fPackageActionHandler;
+       std::vector<PackageActionRef>
+                                               fPackageActions;
+       PackageActionHandler*
+                                               fPackageActionHandler;
        BList                           fButtons;
 
        BStringView*            fStatusLabel;
@@ -889,7 +904,7 @@ private:
 
 class RatingItemView : public BGroupView {
 public:
-       RatingItemView(const UserRating& rating)
+       RatingItemView(const UserRatingRef rating)
                :
                BGroupView(B_HORIZONTAL, 0.0f)
        {
@@ -900,7 +915,7 @@ public:
 
                {
                        BStringView* userNicknameView = new 
BStringView("user-nickname",
-                               rating.User().NickName());
+                               rating->User().NickName());
                        userNicknameView->SetFont(be_bold_font);
                        verticalGroup->AddView(userNicknameView);
                }
@@ -909,23 +924,23 @@ public:
                        new BGroupLayout(B_HORIZONTAL, B_USE_DEFAULT_SPACING);
                verticalGroup->AddItem(ratingGroup);
 
-               if (rating.Rating() >= 0) {
+               if (rating->Rating() >= 0) {
                        RatingView* ratingView = new RatingView("package rating 
view");
-                       ratingView->SetRating(rating.Rating());
+                       ratingView->SetRating(rating->Rating());
                        ratingGroup->AddView(ratingView);
                }
 
                {
                        BString createTimestampPresentation =
                                LocaleUtils::TimestampToDateTimeString(
-                                       rating.CreateTimestamp());
+                                       rating->CreateTimestamp());
 
                        BString ratingContextDescription(
                                B_TRANSLATE("%hd.timestamp% (version 
%hd.version%)"));
                        ratingContextDescription.ReplaceAll("%hd.timestamp%",
                                createTimestampPresentation);
                        ratingContextDescription.ReplaceAll("%hd.version%",
-                               rating.PackageVersion());
+                               rating->PackageVersion());
 
                        BStringView* ratingContextView = new 
BStringView("rating-context",
                                ratingContextDescription);
@@ -936,12 +951,12 @@ public:
 
                ratingGroup->AddItem(BSpaceLayoutItem::CreateGlue());
 
-               if (rating.Comment() > 0) {
+               if (rating->Comment() > 0) {
                        TextView* textView = new TextView("rating-text");
                        ParagraphStyle 
paragraphStyle(textView->ParagraphStyle());
                        paragraphStyle.SetJustify(true);
                        textView->SetParagraphStyle(paragraphStyle);
-                       textView->SetText(rating.Comment());
+                       textView->SetText(rating->Comment());
                        
verticalGroup->AddItem(BSpaceLayoutItem::CreateVerticalStrut(8.0f));
                        verticalGroup->AddView(textView);
                        
verticalGroup->AddItem(BSpaceLayoutItem::CreateVerticalStrut(8.0f));
@@ -1078,9 +1093,7 @@ public:
                // TODO: Re-use rating summary already used for TitleView...
                
fRatingSummaryView->SetToSummary(package.CalculateRatingSummary());
 
-               const UserRatingList& userRatings = package.UserRatings();
-
-               int count = userRatings.CountItems();
+               int count = package.CountUserRatings();
                if (count == 0) {
                        BStringView* noRatingsView = new BStringView("no 
ratings",
                                B_TRANSLATE("No user ratings available."));
@@ -1094,9 +1107,8 @@ public:
                        return;
                }
 
-               // TODO: Sort by age or usefullness rating
                for (int i = count - 1; i >= 0; i--) {
-                       const UserRating& rating = userRatings.ItemAtFast(i);
+                       UserRatingRef rating = package.UserRatingAtIndex(i);
                                // was previously filtering comments just for 
the current
                                // user's language, but as there are not so 
many comments at
                                // the moment, just show all of them for now.
diff --git a/src/apps/haikudepot/ui/ScreenshotWindow.cpp 
b/src/apps/haikudepot/ui/ScreenshotWindow.cpp
index ae5fe67713..111a13533a 100644
--- a/src/apps/haikudepot/ui/ScreenshotWindow.cpp
+++ b/src/apps/haikudepot/ui/ScreenshotWindow.cpp
@@ -1,7 +1,7 @@
 /*
  * Copyright 2014, Stephan Aßmus <superstippi@xxxxxx>.
  * Copyright 2017, Julian Harnath <julian.harnath@xxxxxxxxxxxxxx>.
- * Copyright 2020, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
+ * Copyright 2020-2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 
@@ -254,6 +254,8 @@ ScreenshotWindow::_DownloadThreadEntry(void* data)
 void
 ScreenshotWindow::_DownloadThread()
 {
+       ScreenshotInfoRef info;
+
        if (!Lock()) {
                HDERROR("failed to lock screenshot window");
                return;
@@ -261,23 +263,24 @@ ScreenshotWindow::_DownloadThread()
 
        fScreenshotView->UnsetBitmap();
 
-       ScreenshotInfoList screenshotInfos;
-       if (fPackage.Get() != NULL)
-               screenshotInfos = fPackage->ScreenshotInfos();
+       if (fPackage.Get() == NULL)
+               HDINFO("package not set");
+       else {
+               if (fPackage->CountScreenshotInfos() == 0)
+               HDINFO("package has no screenshots");
+       else {
+               int32 index = atomic_get(&fCurrentScreenshotIndex);
+               info = fPackage->ScreenshotInfoAtIndex(index);
+       }
+       }
 
        Unlock();
 
-       if (screenshotInfos.CountItems() == 0) {
-               HDINFO("package has no screenshots");
+       if (info.Get() == NULL) {
+               HDINFO("screenshot not set");
                return;
        }
 
-       // Obtain the correct code for the screenshot to display
-       // TODO: Once navigation buttons are added, we could use the
-       // ScreenshotInfo at the "current" index.
-       const ScreenshotInfo& info = screenshotInfos.ItemAtFast(
-               atomic_get(&fCurrentScreenshotIndex));
-
        BMallocIO buffer;
        WebAppInterface interface;
 
@@ -288,8 +291,8 @@ ScreenshotWindow::_DownloadThread()
                kProgressIndicatorDelay, 1);
 
        // Retrieve screenshot from web-app
-       status_t status = interface.RetrieveScreenshot(info.Code(),
-               info.Width(), info.Height(), &buffer);
+       status_t status = interface.RetrieveScreenshot(info->Code(),
+               info->Width(), info->Height(), &buffer);
 
        delayedMessenger.SetCount(0);
        messenger.SendMessage(MSG_DOWNLOAD_STOP);
@@ -305,28 +308,35 @@ ScreenshotWindow::_DownloadThread()
 }
 
 
-void
-ScreenshotWindow::_ResizeToFitAndCenter()
+BSize
+ScreenshotWindow::_MaxWidthAndHeightOfAllScreenshots()
 {
+       BSize size(0, 0);
+
        // Find out dimensions of the largest screenshot of this package
-       ScreenshotInfoList screenshotInfos;
-       if (fPackage.Get() != NULL)
-               screenshotInfos = fPackage->ScreenshotInfos();
-
-       int32 largestScreenshotWidth = 0;
-       int32 largestScreenshotHeight = 0;
-
-       const uint32 numScreenshots = fPackage->ScreenshotInfos().CountItems();
-       for (uint32 i = 0; i < numScreenshots; i++) {
-               const ScreenshotInfo& info = screenshotInfos.ItemAtFast(i);
-               if (info.Width() > largestScreenshotWidth)
-                       largestScreenshotWidth = info.Width();
-               if (info.Height() > largestScreenshotHeight)
-                       largestScreenshotHeight = info.Height();
+       if (fPackage.Get() != NULL) {
+               int count = fPackage->CountScreenshotInfos();
+               for(int32 i = 0; i < count; i++) {
+                       const ScreenshotInfoRef& info = 
fPackage->ScreenshotInfoAtIndex(i);
+                       if (info.Get() != NULL) {
+                               float w = (float) info->Width();
+                               float h = (float) info->Height();
+                               if (w > size.Width())
+                                       size.SetWidth(w);
+                               if (h > size.Height())
+                                       size.SetHeight(h);
+                       }
+               }
        }
 
-       fScreenshotView->SetExplicitMinSize(
-               BSize(largestScreenshotWidth, largestScreenshotHeight));
+       return size;
+}
+
+
+void
+ScreenshotWindow::_ResizeToFitAndCenter()
+{
+       
fScreenshotView->SetExplicitMinSize(_MaxWidthAndHeightOfAllScreenshots());
        Layout(false);
 
        // TODO: Limit window size to screen size (with a little margin),
@@ -343,7 +353,7 @@ ScreenshotWindow::_ResizeToFitAndCenter()
 void
 ScreenshotWindow::_UpdateToolBar()
 {
-       const int32 numScreenshots = fPackage->ScreenshotInfos().CountItems();
+       const int32 numScreenshots = fPackage->CountScreenshotInfos();
        const int32 currentIndex = atomic_get(&fCurrentScreenshotIndex);
 
        fToolBar->SetActionEnabled(MSG_PREVIOUS_SCREENSHOT,
diff --git a/src/apps/haikudepot/ui/ScreenshotWindow.h 
b/src/apps/haikudepot/ui/ScreenshotWindow.h
index e96ca02f04..ee73cdf962 100644
--- a/src/apps/haikudepot/ui/ScreenshotWindow.h
+++ b/src/apps/haikudepot/ui/ScreenshotWindow.h
@@ -1,5 +1,6 @@
 /*
  * Copyright 2014, Stephan Aßmus <superstippi@xxxxxx>.
+ * Copyright 2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>.
  * All rights reserved. Distributed under the terms of the MIT License.
  */
 #ifndef SCREENSHOT_WINDOW_H
@@ -51,6 +52,7 @@ private:
        static  int32                           _DownloadThreadEntry(void* 
data);
                        void                            _DownloadThread();
 
+                       BSize                           
_MaxWidthAndHeightOfAllScreenshots();
                        void                            _ResizeToFitAndCenter();
                        void                            _UpdateToolBar();
 
diff --git a/src/apps/haikudepot/util/Collector.h 
b/src/apps/haikudepot/util/Collector.h
new file mode 100644
index 0000000000..cbc3542098
--- /dev/null
+++ b/src/apps/haikudepot/util/Collector.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2021, Andrew Lindesay <apl@xxxxxxxxxxxxxx>
+ * All rights reserved. Distributed under the terms of the MIT License.
+ */
+#ifndef COLLECTOR_H
+#define COLLECTOR_H
+
+
+#include <vector>
+
+
+template <typename T>
+class Collector {
+public:
+       virtual void Add(T value) = 0;
+};
+
+
+template <typename T>
+class VectorCollector : public Collector<T> {
+public:
+       VectorCollector(std::vector<T>& target)
+               :
+               fTarget(target)
+       {
+       }
+
+       virtual void Add(T value) {
+               fTarget.push_back(value);
+       }
+
+private:
+       std::vector<T>& fTarget;
+};
+
+
+#endif // COLLECTOR_H


Other related posts:

  • » [haiku-commits] haiku: hrev54925 - in src/apps/haikudepot: model ui util - Andrew Lindesay