[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
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);
}
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic