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

  • From: superstippi@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 25 Jan 2015 22:12:06 +0100 (CET)

hrev48721 adds 1 changeset to branch 'master'
old head: 29fb42ba5501b9246751180de934fc1ea41dab0e
new head: 7b2c59b9b848f467d2229dedf91ca19899b8ed13
overview: 
http://cgit.haiku-os.org/haiku/log/?qt=range&q=7b2c59b9b848+%5E29fb42ba5501

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

7b2c59b9b848: HaikuDepot: Implemented light-weight package manager update
  
  No, not updating packages via HaikuDepot, but a light-weight synchronization
  between the system package manager list and the HaikuDepot model. After
  installing or removing a package, HaikuDepot performed a very costly update
  of all information by basically throwing everything away and reloading it.
  Implements #11786.

                                      [ Stephan Aßmus <superstippi@xxxxxx> ]

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

Revision:    hrev48721
Commit:      7b2c59b9b848f467d2229dedf91ca19899b8ed13
URL:         http://cgit.haiku-os.org/haiku/commit/?id=7b2c59b9b848
Author:      Stephan Aßmus <superstippi@xxxxxx>
Date:        Sun Jan 25 21:06:20 2015 UTC

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

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

6 files changed, 85 insertions(+), 7 deletions(-)
src/apps/haikudepot/model/Model.cpp       | 27 +++++++++++++++++++
src/apps/haikudepot/model/Model.h         |  2 ++
src/apps/haikudepot/model/PackageInfo.cpp | 39 +++++++++++++++++++++++++++
src/apps/haikudepot/model/PackageInfo.h   |  2 ++
src/apps/haikudepot/ui/MainWindow.cpp     | 20 +++++++++-----
src/apps/haikudepot/ui/MainWindow.h       |  2 +-

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

diff --git a/src/apps/haikudepot/model/Model.cpp 
b/src/apps/haikudepot/model/Model.cpp
index d03fa05..8336cd0 100644
--- a/src/apps/haikudepot/model/Model.cpp
+++ b/src/apps/haikudepot/model/Model.cpp
@@ -460,6 +460,33 @@ Model::AddDepot(const DepotInfo& depot)
 }
 
 
+bool
+Model::HasDepot(const BString& name) const
+{
+       for (int32 i = fDepots.CountItems() - 1; i >= 0; i--) {
+               if (fDepots.ItemAtFast(i).Name() == name)
+                       return true;
+       }
+       return false;
+}
+
+
+bool
+Model::SyncDepot(const DepotInfo& depot)
+{
+       for (int32 i = fDepots.CountItems() - 1; i >= 0; i--) {
+               const DepotInfo& existingDepot = fDepots.ItemAtFast(i);
+               if (existingDepot.Name() == depot.Name()) {
+                       DepotInfo mergedDepot(existingDepot);
+                       mergedDepot.SyncPackages(depot.Packages());
+                       fDepots.Replace(i, mergedDepot);
+                       return true;
+               }
+       }
+       return false;
+}
+
+
 void
 Model::Clear()
 {
diff --git a/src/apps/haikudepot/model/Model.h 
b/src/apps/haikudepot/model/Model.h
index 6033aaf..36454a9 100644
--- a/src/apps/haikudepot/model/Model.h
+++ b/src/apps/haikudepot/model/Model.h
@@ -53,8 +53,10 @@ public:
                        PackageList                     CreatePackageList() 
const;
 
                        bool                            AddDepot(const 
DepotInfo& depot);
+                       bool                            HasDepot(const BString& 
name) const;
                        const DepotList&        Depots() const
                                                                        { 
return fDepots; }
+                       bool                            SyncDepot(const 
DepotInfo& depot);
 
                        void                            Clear();
 
diff --git a/src/apps/haikudepot/model/PackageInfo.cpp 
b/src/apps/haikudepot/model/PackageInfo.cpp
index 8eb496a..cbb258b 100644
--- a/src/apps/haikudepot/model/PackageInfo.cpp
+++ b/src/apps/haikudepot/model/PackageInfo.cpp
@@ -991,3 +991,42 @@ DepotInfo::AddPackage(const PackageInfoRef& package)
 {
        return fPackages.Add(package);
 }
+
+
+void
+DepotInfo::SyncPackages(const PackageList& otherPackages)
+{
+       PackageList packages(fPackages);
+       
+       for (int32 i = otherPackages.CountItems() - 1; i >= 0; i--) {
+               const PackageInfoRef& otherPackage = 
otherPackages.ItemAtFast(i);
+               bool found = false;
+               for (int32 j = packages.CountItems() - 1; j >= 0; j--) {
+                       const PackageInfoRef& package = packages.ItemAtFast(j);
+                       if (package->Title() == otherPackage->Title()) {
+//                             printf("%s: found package: '%s'\n", 
fName.String(),
+//                                     package->Title().String());
+                               package->SetState(otherPackage->State());
+                               
package->SetLocalFilePath(otherPackage->LocalFilePath());
+                               package->SetSystemDependency(
+                                       otherPackage->IsSystemDependency());
+                               found = true;
+                               packages.Remove(j);
+                               break;
+                       }
+               }
+               if (!found) {
+                       printf("%s: new package: '%s'\n", fName.String(),
+                               otherPackage->Title().String());
+                       fPackages.Add(otherPackage);
+               }
+       }
+
+       for (int32 i = packages.CountItems() - 1; i >= 0; i--) {
+               const PackageInfoRef& package = packages.ItemAtFast(i);
+               printf("%s: removing package: '%s'\n", fName.String(),
+                       package->Title().String());
+               fPackages.Remove(package);
+       }
+}
+
diff --git a/src/apps/haikudepot/model/PackageInfo.h 
b/src/apps/haikudepot/model/PackageInfo.h
index dba6288..3026061 100644
--- a/src/apps/haikudepot/model/PackageInfo.h
+++ b/src/apps/haikudepot/model/PackageInfo.h
@@ -397,6 +397,8 @@ public:
 
                        bool                            AddPackage(const 
PackageInfoRef& package);
 
+                       void                            SyncPackages(const 
PackageList& packages);
+
 private:
                        BString                         fName;
                        PackageList                     fPackages;
diff --git a/src/apps/haikudepot/ui/MainWindow.cpp 
b/src/apps/haikudepot/ui/MainWindow.cpp
index 5c292c0..c0e64d5 100644
--- a/src/apps/haikudepot/ui/MainWindow.cpp
+++ b/src/apps/haikudepot/ui/MainWindow.cpp
@@ -770,7 +770,7 @@ MainWindow::_RefreshRepositories(bool force)
 
 
 void
-MainWindow::_RefreshPackageList()
+MainWindow::_RefreshPackageList(bool force)
 {
        if (fSinglePackageMode)
                return;
@@ -885,10 +885,14 @@ MainWindow::_RefreshPackageList()
                        systemFlaggedPackages.Add(repoPackageInfo.FileName());
        }
 
-       fModel.StopPopulatingAllPackages();
+       bool wasEmpty = fModel.Depots().IsEmpty();
+       if (force || wasEmpty)
+               fModel.StopPopulatingAllPackages();
 
        BAutolock lock(fModel.Lock());
-       fModel.Clear();
+       
+       if (force)
+               fModel.Clear();
 
        // filter remote packages from the found list
        // any packages remaining will be locally installed packages
@@ -909,11 +913,15 @@ MainWindow::_RefreshPackageList()
        }
 
        for (DepotInfoMap::iterator it = depots.begin(); it != depots.end(); 
it++) {
-               fModel.AddDepot(it->second);
+               if (fModel.HasDepot(it->second.Name()))
+                       fModel.SyncDepot(it->second);
+               else
+                       fModel.AddDepot(it->second);
        }
 
        // start retrieving package icons and average ratings
-       fModel.PopulateAllPackages();
+       if (force || wasEmpty)
+               fModel.PopulateAllPackages();
 
        // compute the OS package dependencies
        try {
@@ -1034,7 +1042,7 @@ MainWindow::_RefreshModelThreadWorker(void* arg)
        if (mainWindow->fTerminating)
                return B_OK;
 
-       mainWindow->_RefreshPackageList();
+       mainWindow->_RefreshPackageList(parameters->forceRefresh);
 
        messenger.SendMessage(MSG_MODEL_WORKER_DONE);
 
diff --git a/src/apps/haikudepot/ui/MainWindow.h 
b/src/apps/haikudepot/ui/MainWindow.h
index 11e5fb2..3cae3e2 100644
--- a/src/apps/haikudepot/ui/MainWindow.h
+++ b/src/apps/haikudepot/ui/MainWindow.h
@@ -70,7 +70,7 @@ private:
                        void                            _ClearPackage();
 
                        void                            
_RefreshRepositories(bool force);
-                       void                            _RefreshPackageList();
+                       void                            
_RefreshPackageList(bool force);
 
                        void                            
_StartRefreshWorker(bool force = false);
        static  status_t                        _RefreshModelThreadWorker(void* 
arg);


Other related posts:

  • » [haiku-commits] haiku: hrev48721 - in src/apps/haikudepot: model ui - superstippi