diff --git a/src/apps/haiku-depot/MainWindow.cpp b/src/apps/haiku-depot/MainWindow.cpp index 692c67ce15..6c2ca93481 100644 --- a/src/apps/haiku-depot/MainWindow.cpp +++ b/src/apps/haiku-depot/MainWindow.cpp @@ -278,6 +278,13 @@ MainWindow::SchedulePackageActions(PackageActionList& list) } +Model* +MainWindow::GetModel() +{ + return &fModel; +} + + void MainWindow::_BuildMenu(BMenuBar* menuBar) { diff --git a/src/apps/haiku-depot/MainWindow.h b/src/apps/haiku-depot/MainWindow.h index a72ff1ca4c..46f8816d48 100644 --- a/src/apps/haiku-depot/MainWindow.h +++ b/src/apps/haiku-depot/MainWindow.h @@ -48,6 +48,7 @@ private: // PackageActionHandler virtual status_t SchedulePackageActions( PackageActionList& list); + virtual Model* GetModel(); private: void _BuildMenu(BMenuBar* menuBar); diff --git a/src/apps/haiku-depot/PackageAction.cpp b/src/apps/haiku-depot/PackageAction.cpp index e4697aa90c..913dc0d4e2 100644 --- a/src/apps/haiku-depot/PackageAction.cpp +++ b/src/apps/haiku-depot/PackageAction.cpp @@ -16,10 +16,11 @@ using namespace BPackageKit; // #pragma mark - PackageAction -PackageAction::PackageAction(int32 type, PackageInfoRef package) +PackageAction::PackageAction(int32 type, PackageInfoRef package, Model* model) : fPackage(package), - fType(type) + fType(type), + fModel(model) { // TODO: allow configuring the installation location fPackageManager = new(std::nothrow) PackageManager( diff --git a/src/apps/haiku-depot/PackageAction.h b/src/apps/haiku-depot/PackageAction.h index 7f9ed8d045..3808947912 100644 --- a/src/apps/haiku-depot/PackageAction.h +++ b/src/apps/haiku-depot/PackageAction.h @@ -21,15 +21,21 @@ enum { }; +class Model; + + class PackageAction : public BReferenceable { public: PackageAction(int32 type, - PackageInfoRef package); + PackageInfoRef package, Model* model); virtual ~PackageAction(); int32 Type() const { return fType; } + Model* GetModel() const + { return fModel; } + virtual const char* Label() const = 0; virtual status_t Perform() = 0; @@ -43,6 +49,7 @@ protected: private: PackageInfoRef fPackage; int32 fType; + Model* fModel; }; diff --git a/src/apps/haiku-depot/PackageActionHandler.h b/src/apps/haiku-depot/PackageActionHandler.h index f98b4a15f6..c413014c7c 100644 --- a/src/apps/haiku-depot/PackageActionHandler.h +++ b/src/apps/haiku-depot/PackageActionHandler.h @@ -12,12 +12,17 @@ #include "PackageAction.h" +class Model; + + class PackageActionHandler { public: virtual ~PackageActionHandler(); virtual status_t SchedulePackageActions( PackageActionList& list) = 0; + + virtual Model* GetModel() = 0; }; #endif // PACKAGE_ACTION_HANDLER_H diff --git a/src/apps/haiku-depot/PackageInfoView.cpp b/src/apps/haiku-depot/PackageInfoView.cpp index bcb573a542..a5741026c6 100644 --- a/src/apps/haiku-depot/PackageInfoView.cpp +++ b/src/apps/haiku-depot/PackageInfoView.cpp @@ -446,10 +446,10 @@ public: BString avgRating; avgRating.SetToFormat("%.1f", ratingSummary.averageRating); fAvgRating->SetText(avgRating); - + BString votes; votes.SetToFormat("%d", ratingSummary.ratingCount); - + BString voteInfo(B_TRANSLATE("(%Votes%)")); voteInfo.ReplaceAll("%Votes%", votes); @@ -545,7 +545,8 @@ public: BPackageKit::B_PACKAGE_INSTALLATION_LOCATION_HOME); PackageActionList actions = manager.GetPackageActions( - const_cast(&package)); + const_cast(&package), + fPackageActionHandler->GetModel()); bool clearNeeded = false; if (actions.CountItems() != fPackageActions.CountItems()) diff --git a/src/apps/haiku-depot/PackageManager.cpp b/src/apps/haiku-depot/PackageManager.cpp index eb1740398e..f4250ce960 100644 --- a/src/apps/haiku-depot/PackageManager.cpp +++ b/src/apps/haiku-depot/PackageManager.cpp @@ -5,7 +5,7 @@ * Authors: * Ingo Weinhold * Stephan Aßmus - * Rene Gollent, reneGollent.com. + * Rene Gollent */ @@ -24,6 +24,7 @@ #include "AutoDeleter.h" #include "AutoLocker.h" +#include "Model.h" #include "PackageInfo.h" #include "ProblemWindow.h" #include "ResultWindow.h" @@ -57,9 +58,9 @@ DownloadProgressListener::~DownloadProgressListener() class InstallPackageAction : public PackageAction, private DownloadProgressListener { public: - InstallPackageAction(PackageInfoRef package) + InstallPackageAction(PackageInfoRef package, Model* model) : - PackageAction(PACKAGE_ACTION_INSTALL, package), + PackageAction(PACKAGE_ACTION_INSTALL, package, model), fLastDownloadUpdate(0) { } @@ -102,16 +103,42 @@ public: } // DownloadProgressListener - virtual void DownloadProgressChanged(float progress) + virtual void DownloadProgressChanged(const char* packageName, + float progress) { bigtime_t now = system_time(); if (now - fLastDownloadUpdate > 250000) { - PackageInfoRef ref(Package()); - ref->SetDownloadProgress(progress); - fLastDownloadUpdate = now; + BString tempName(packageName); + tempName.Truncate(tempName.FindFirst('-')); + // strip version suffix off package filename + PackageInfoRef ref(_FindPackageByName(tempName)); + if (ref.Get() != NULL) { + ref->SetDownloadProgress(progress); + fLastDownloadUpdate = now; + } } } + +private: + PackageInfoRef _FindPackageByName(const BString& name) + { + Model* model = GetModel(); + const DepotList& depots = model->Depots(); + // TODO: optimize! + for (int32 i = 0; i < depots.CountItems(); i++) { + const DepotInfo& depot = depots.ItemAtFast(i); + const PackageList& packages = depot.Packages(); + for (int32 j = 0; j < packages.CountItems(); j++) { + PackageInfoRef info = packages.ItemAtFast(j); + if (info->Title() == name) + return info; + } + } + + return PackageInfoRef(); + } + private: bigtime_t fLastDownloadUpdate; }; @@ -122,9 +149,9 @@ private: class UninstallPackageAction : public PackageAction { public: - UninstallPackageAction(PackageInfoRef package) + UninstallPackageAction(PackageInfoRef package, Model* model) : - PackageAction(PACKAGE_ACTION_UNINSTALL, package) + PackageAction(PACKAGE_ACTION_UNINSTALL, package, model) { } @@ -198,7 +225,7 @@ PackageManager::GetPackageState(const PackageInfo& package) PackageActionList -PackageManager::GetPackageActions(PackageInfoRef package) +PackageManager::GetPackageActions(PackageInfoRef package, Model* model) { Init(B_ADD_INSTALLED_REPOSITORIES | B_ADD_REMOTE_REPOSITORIES); PackageActionList actionList; @@ -225,11 +252,11 @@ PackageManager::GetPackageActions(PackageInfoRef package) if (installed) { if (!systemPackage) { actionList.Add(PackageActionRef(new UninstallPackageAction( - package), true)); + package, model), true)); } } else { - actionList.Add(PackageActionRef(new InstallPackageAction(package), - true)); + actionList.Add(PackageActionRef(new InstallPackageAction(package, + model), true)); } // TODO: activation status @@ -369,7 +396,7 @@ PackageManager::ProgressPackageDownloadActive(const char* packageName, { for (int32 i = 0; i < fDownloadProgressListeners.CountItems(); i++) { fDownloadProgressListeners.ItemAt(i)->DownloadProgressChanged( - completionPercentage); + packageName, completionPercentage); } } diff --git a/src/apps/haiku-depot/PackageManager.h b/src/apps/haiku-depot/PackageManager.h index 2d2bb810ab..ea162bbd46 100644 --- a/src/apps/haiku-depot/PackageManager.h +++ b/src/apps/haiku-depot/PackageManager.h @@ -23,7 +23,7 @@ namespace BPackageKit { class BSolverPackage; } - +class Model; class PackageManager; class ProblemWindow; class ResultWindow; @@ -40,7 +40,9 @@ class DownloadProgressListener { public: virtual ~DownloadProgressListener(); - virtual void DownloadProgressChanged(float progress) = 0; + virtual void DownloadProgressChanged( + const char* packageName, + float progress) = 0; }; @@ -55,7 +57,8 @@ public: virtual ~PackageManager(); virtual PackageState GetPackageState(const PackageInfo& package); - virtual PackageActionList GetPackageActions(PackageInfoRef package); + virtual PackageActionList GetPackageActions(PackageInfoRef package, + Model* model); void SetCurrentActionPackage( PackageInfoRef package,