SVN commit 1087230 by aseigo:

backport r1073143:

* make the reading of disk usage actually async (e.g. we return between each 
device check)
* don't check every 10s (wtf?!), but only when requested; this moves it into 
the hands of the visualization

what this means is that plasma sleeps more, disks are accessed less, far fewer 
data members in the SystemModel class and far more readable code. probably too 
late for 4.4.0, which is unfortunate but my fault since it fell off my "to 
backport" list before it was actually backported. if there is movement in the 
tag in kdebase for other reasons, it would be nice if this was captured as 
well. distributions may also want to grab it for their 4.4 packages until 4.4.1 
is out.

CCBUG:200184
CCMAIL:[email protected]


 M  +46 -87    core/systemmodel.cpp  
 M  +3 -4      core/systemmodel.h  
 M  +5 -2      ui/launcher.cpp  


--- 
branches/KDE/4.4/kdebase/workspace/plasma/desktop/applets/kickoff/core/systemmodel.cpp
 #1087229:1087230
@@ -52,21 +52,22 @@
 
 struct UsageInfo {
     UsageInfo()
-            : used(0),
-            available(0),
-            dirty(true) {}
+        : used(0),
+          available(0)
+     {}
 
     quint64 used;
     quint64 available;
-    bool dirty;
 };
 
 class SystemModel::Private
 {
 public:
     Private(SystemModel *parent)
-            : q(parent)
-            , placesModel(new KFilePlacesModel(parent)) {
+            : q(parent),
+              placesModel(new KFilePlacesModel(parent)),
+              currentPlacesModelUsageIndex(0)
+    {
         q->setSourceModel(placesModel);
 
         connect(placesModel, SIGNAL(dataChanged(QModelIndex, QModelIndex)),
@@ -84,44 +85,15 @@
         << i18n("Places")
         << i18n("Removable Storage")
         << i18n("Storage");
-        loadApplications();
-        connect(&refreshTimer, SIGNAL(timeout()),
-                q, SLOT(startRefreshingUsageInfo()));
-        refreshTimer.start(10000);
-        QTimer::singleShot(0, q, SLOT(startRefreshingUsageInfo()));
         connect(KSycoca::self(), SIGNAL(databaseChanged(const QStringList&)), 
q, SLOT(reloadApplications()));
     }
 
-    void queryFreeSpace(const QString& mountPoint) {
-        KDiskFreeSpaceInfo freeSpace = 
KDiskFreeSpaceInfo::freeSpaceInfo(mountPoint);
-        if (freeSpace.isValid())
-            q->freeSpaceInfoAvailable(freeSpace.mountPoint(), freeSpace.size() 
/ 1024,
-                                      freeSpace.used() / 1024, 
freeSpace.available() / 1024);
-    }
-
-    void loadApplications() {
-        const QStringList apps = Kickoff::systemApplicationList();
-        appsList.clear();
-
-        foreach(const QString &app, apps) {
-            KService::Ptr service = KService::serviceByStorageId(app);
-
-            if (!service) {
-                continue;
-            }
-
-            appsList << service;
-        }
-        //kDebug() << "*************" << appsList;
-    }
-
     SystemModel * const q;
     KFilePlacesModel *placesModel;
     QStringList topLevelSections;
     KService::List appsList;
-    QList<QString> mountPointsQueue;
     QMap<QString, UsageInfo> usageByMountpoint;
-    QTimer refreshTimer;
+    int currentPlacesModelUsageIndex;
 };
 
 SystemModel::SystemModel(QObject *parent)
@@ -137,7 +109,9 @@
 
 QModelIndex SystemModel::mapFromSource(const QModelIndex &sourceIndex) const
 {
-    if (!sourceIndex.isValid()) return QModelIndex();
+    if (!sourceIndex.isValid()) {
+        return QModelIndex();
+    }
 
     QModelIndex parent;
 
@@ -356,75 +330,60 @@
     }
 }
 
-void SystemModel::startRefreshingUsageInfo()
+void SystemModel::refreshUsageInfo()
 {
-    if (!d->mountPointsQueue.isEmpty()) {
-        return;
-    }
-
-    int rowCount = d->placesModel->rowCount();
-    for (int i = 0; i < rowCount; ++i) {
-        QModelIndex index = d->placesModel->index(i, 0);
-        if (d->placesModel->isDevice(index)) {
-            Solid::Device dev = d->placesModel->deviceForIndex(index);
-            Solid::StorageAccess *access = dev.as<Solid::StorageAccess>();
-
-            if (access && !access->filePath().isEmpty()) {
-                d->mountPointsQueue << access->filePath();
-            }
-        }
-    }
-
-    if (!d->mountPointsQueue.isEmpty()) {
-        d->queryFreeSpace(d->mountPointsQueue.takeFirst());
-    }
+    d->currentPlacesModelUsageIndex = 0;
+    QTimer::singleShot(100, this, SLOT(refreshNextUsageInfo()));
 }
 
-void SystemModel::reloadApplications()
+void SystemModel::stopRefreshingUsageInfo()
 {
-    d->loadApplications();
+    d->currentPlacesModelUsageIndex = d->placesModel->rowCount();
 }
 
-void SystemModel::freeSpaceInfoAvailable(const QString& mountPoint, quint64,
-        quint64 kbUsed, quint64 kbAvailable)
+void SystemModel::refreshNextUsageInfo()
 {
-    UsageInfo info;
-    info.used = kbUsed;
-    info.available = kbAvailable;
-
-    d->usageByMountpoint[mountPoint] = info;
-
-    // More to process
-    if (!d->mountPointsQueue.isEmpty()) {
-        d->queryFreeSpace(d->mountPointsQueue.takeFirst());
+    if (d->currentPlacesModelUsageIndex >= d->placesModel->rowCount()) {
         return;
     }
 
-    // We're done, let's emit the changes
-    int rowCount = d->placesModel->rowCount();
-    for (int i = 0; i < rowCount; ++i) {
-        QModelIndex sourceIndex = d->placesModel->index(i, 0);
-        if (d->placesModel->isDevice(sourceIndex)) {
-            Solid::Device dev = d->placesModel->deviceForIndex(sourceIndex);
-            Solid::StorageAccess *access = dev.as<Solid::StorageAccess>();
+    QModelIndex sourceIndex = 
d->placesModel->index(d->currentPlacesModelUsageIndex, 0);
+    if (d->placesModel->isDevice(sourceIndex)) {
+        Solid::Device dev = d->placesModel->deviceForIndex(sourceIndex);
+        Solid::StorageAccess *access = dev.as<Solid::StorageAccess>();
 
-            if (access && d->usageByMountpoint.contains(access->filePath())) {
-                info = d->usageByMountpoint[access->filePath()];
+        if (access && !access->filePath().isEmpty()) {
+            KDiskFreeSpaceInfo freeSpace = 
KDiskFreeSpaceInfo::freeSpaceInfo(access->filePath());
+            if (freeSpace.isValid()) {
+                UsageInfo info;
+                info.used = freeSpace.used() / 1024;
+                info.available = freeSpace.available() / 1024;
 
-                if (info.dirty) {
-                    info.dirty = false;
-                    d->usageByMountpoint[access->filePath()] = info;
-                } else {
-                    d->usageByMountpoint.remove(access->filePath());
-                }
-
+                d->usageByMountpoint[freeSpace.mountPoint()] = info;
                 QModelIndex index = mapFromSource(sourceIndex);
                 emit dataChanged(index, index);
             }
         }
     }
+
+    ++d->currentPlacesModelUsageIndex;
+    QTimer::singleShot(0, this, SLOT(refreshNextUsageInfo()));
 }
 
+void SystemModel::reloadApplications()
+{
+    const QStringList apps = Kickoff::systemApplicationList();
+    d->appsList.clear();
+
+    foreach (const QString &app, apps) {
+        KService::Ptr service = KService::serviceByStorageId(app);
+
+        if (service) {
+            d->appsList << service;
+        }
+    }
+}
+
 void Kickoff::SystemModel::sourceDataChanged(const QModelIndex &start, const 
QModelIndex &end)
 {
     if (start.parent().isValid()) return;
--- 
branches/KDE/4.4/kdebase/workspace/plasma/desktop/applets/kickoff/core/systemmodel.h
 #1087229:1087230
@@ -48,13 +48,12 @@
     virtual int columnCount(const QModelIndex &parent = QModelIndex()) const;
     virtual QVariant data(const QModelIndex &index, int role = 
Qt::DisplayRole) const;
     virtual QVariant headerData(int section, Qt::Orientation orientation, int 
role = Qt::DisplayRole) const;
+    void refreshUsageInfo();
+    void stopRefreshingUsageInfo();
 
 private Q_SLOTS:
-    void startRefreshingUsageInfo();
+    void refreshNextUsageInfo();
     void reloadApplications();
-    void freeSpaceInfoAvailable(const QString& mountPoint, quint64 kbSize,
-                                quint64 kbUsed, quint64 kbAvailable);
-
     void sourceDataChanged(const QModelIndex &start, const QModelIndex &end);
     void sourceRowsAboutToBeInserted(const QModelIndex &parent, int start, int 
end);
     void sourceRowsInserted(const QModelIndex &parent, int start, int end);
--- 
branches/KDE/4.4/kdebase/workspace/plasma/desktop/applets/kickoff/ui/launcher.cpp
 #1087229:1087230
@@ -228,7 +228,7 @@
 
     void setupSystemView()
     {
-        SystemModel *model = new SystemModel(q);
+        systemModel = new SystemModel(q);
         UrlItemView *view = new UrlItemView();
         ItemDelegate *delegate = new ItemDelegate(q);
         delegate->setRoleMapping(Plasma::Delegate::SubTitleRole, SubTitleRole);
@@ -236,7 +236,7 @@
         view->setItemDelegate(delegate);
         view->setItemStateProvider(delegate);
 
-        addView(i18n("Computer"), systemIcon(), model, view);
+        addView(i18n("Computer"), systemIcon(), systemModel, view);
     }
 
     void setupSearchView()
@@ -448,6 +448,7 @@
     ApplicationModel  *applicationModel;
     RecentlyUsedModel *recentlyUsedModel;
     KRunnerModel *searchModel;
+    SystemModel *systemModel;
     LeaveModel *leaveModel;
     SearchBar *searchBar;
     QWidget *footer;
@@ -807,6 +808,7 @@
 {
     Q_UNUSED(event)
     reset();
+    d->systemModel->stopRefreshingUsageInfo();
 }
 
 void Launcher::keyPressEvent(QKeyEvent *event)
@@ -828,6 +830,7 @@
 void Launcher::showEvent(QShowEvent *e)
 {
     d->searchBar->setFocus();
+    d->systemModel->refreshUsageInfo();
 
     QWidget::showEvent(e);
 }
_______________________________________________
release-team mailing list
[email protected]
https://mail.kde.org/mailman/listinfo/release-team

Reply via email to