[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-release-team
Subject:    branches/KDE/4.4/kdebase/workspace/plasma/desktop/applets/kickoff
From:       Aaron J. Seigo <aseigo () kde ! org>
Date:       2010-02-08 17:15:25
Message-ID: 1265649325.417728.28207.nullmailer () svn ! kde ! org
[Download RAW message or body]

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:release-team@kde.org


 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
release-team@kde.org
https://mail.kde.org/mailman/listinfo/release-team


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic