File 0010-Feature-show-application-status-in-window-title-BUG-.patch of Package apper
From 4a5dae7bb0ae57d93acc4afd57888bd7f6695555 Mon Sep 17 00:00:00 2001
From: Daniel Nicoletti <dantti12@gmail.com>
Date: Wed, 9 Jan 2013 21:18:11 -0200
Subject: [PATCH 10/14] Feature: show application status in window title
BUG:300750
---
Apper/MainUi.cpp | 6 ++--
Apper/main.cpp | 6 ----
ApperKCM/ApperKCM.cpp | 46 +++++++++++++++++-------------
ApperKCM/ApperKCM.h | 1 +
libapper/PkTransactionWidget.cpp | 61 +++++++++++++++++++++++++++++++---------
libapper/PkTransactionWidget.h | 1 +
6 files changed, 79 insertions(+), 42 deletions(-)
diff --git a/Apper/MainUi.cpp b/Apper/MainUi.cpp
index 31c2092..2a91dd4 100644
--- a/Apper/MainUi.cpp
+++ b/Apper/MainUi.cpp
@@ -25,8 +25,8 @@
#include <KConfig>
#include <KCModuleProxy>
-MainUi::MainUi(QWidget *parent)
- : KCMultiDialog(parent),
+MainUi::MainUi(QWidget *parent) :
+ KCMultiDialog(parent),
m_apperModule(0)
{
setCaption(QString());
@@ -45,6 +45,8 @@ MainUi::MainUi(QWidget *parent)
KCModuleProxy *proxy = static_cast<KCModuleProxy*>(page->widget());
if (proxy) {
m_apperModule = proxy->realModule();
+ connect(m_apperModule, SIGNAL(caption(QString)),
+ this, SLOT(setCaption(QString)));
}
} else {
kWarning() << "Could not load kcm_apper.desktop!";
diff --git a/Apper/main.cpp b/Apper/main.cpp
index 580e1c3..c971680 100644
--- a/Apper/main.cpp
+++ b/Apper/main.cpp
@@ -125,12 +125,6 @@ int main(int argc, char **argv)
return invoke("RemovePackageByFiles", args->getOptionList("remove-package-by-file"));
}
- if (!Apper::start())
- {
- qDebug() << "Apper is already running!";
- return 0;
- }
-
Apper app;
return app.exec();
diff --git a/ApperKCM/ApperKCM.cpp b/ApperKCM/ApperKCM.cpp
index 43b3475..339aee3 100644
--- a/ApperKCM/ApperKCM.cpp
+++ b/ApperKCM/ApperKCM.cpp
@@ -392,7 +392,7 @@ void ApperKCM::on_homeView_activated(const QModelIndex &index)
}
// cache the search
- m_searchRole = static_cast<Transaction::Role>(index.data(CategoryModel::SearchRole).toUInt());
+ m_searchRole = static_cast<Transaction::Role>(index.data(CategoryModel::SearchRole).toUInt());
kDebug() << m_searchRole << index.data(CategoryModel::CategoryRole).toString();
if (m_searchRole == Transaction::RoleResolve) {
#ifdef HAVE_APPSTREAM
@@ -413,6 +413,7 @@ void ApperKCM::on_homeView_activated(const QModelIndex &index)
} else {
m_searchGroupCategory.clear();
m_searchGroup = index.data(CategoryModel::GroupRole).value<PackageKit::Transaction::Group>();
+ m_searchString = index.data().toString(); // Store the nice name to change the title
}
} else if (m_searchRole == Transaction::RoleGetUpdates) {
setPage("updates");
@@ -503,6 +504,7 @@ void ApperKCM::setPage(const QString &page)
m_settingsPage->load();
ui->titleL->clear();
ui->backTB->setEnabled(true);
+ emit caption(i18n("Settings"));
}
} else if (page == QLatin1String("updates")) {
if (ui->stackedWidget->currentWidget() != m_updaterPage) {
@@ -529,6 +531,7 @@ void ApperKCM::setPage(const QString &page)
m_updaterPage->load();
ui->stackedWidgetBar->setCurrentIndex(BAR_UPDATE);
ui->backTB->setEnabled(true);
+ emit caption(i18n("Updates"));
}
} else if (page == QLatin1String("home")) {
if (ui->stackedWidget->currentWidget() == m_updaterPage ||
@@ -545,6 +548,7 @@ void ApperKCM::setPage(const QString &page)
ui->backTB->setEnabled(true);
ui->filtersTB->setEnabled(false);
ui->widget->setEnabled(false);
+ emit caption(i18n("History"));
}
}
@@ -589,6 +593,7 @@ void ApperKCM::on_backTB_clicked()
ui->backTB->setEnabled(canGoBack);
// reset the search role
m_searchRole = Transaction::RoleUnknown;
+ emit caption();
}
void ApperKCM::on_changesPB_clicked()
@@ -597,6 +602,7 @@ void ApperKCM::on_changesPB_clicked()
m_changesModel->addSelectedPackagesFromModel(m_browseModel);
ui->stackedWidget->setCurrentWidget(ui->pageChanges);
ui->backTB->setEnabled(true);
+ emit caption(i18n("Pending Changes"));
}
void ApperKCM::disconnectTransaction()
@@ -623,6 +629,9 @@ void ApperKCM::disconnectTransaction()
void ApperKCM::search()
{
ui->browseView->cleanUi();
+ if (ui->stackedWidgetBar->currentIndex() != BAR_SEARCH) {
+ ui->stackedWidgetBar->setCurrentIndex(BAR_SEARCH);
+ }
disconnectTransaction();
@@ -645,18 +654,24 @@ void ApperKCM::search()
switch (m_searchRole) {
case Transaction::RoleSearchName:
m_searchTransaction->searchNames(m_searchString, m_filtersMenu->filters());
+ emit caption(m_searchString);
break;
case Transaction::RoleSearchDetails:
m_searchTransaction->searchDetails(m_searchString, m_filtersMenu->filters());
+ emit caption(m_searchString);
break;
case Transaction::RoleSearchFile:
m_searchTransaction->searchFiles(m_searchString, m_filtersMenu->filters());
+ emit caption(m_searchString);
break;
case Transaction::RoleSearchGroup:
if (m_searchGroupCategory.isEmpty()) {
m_searchTransaction->searchGroup(m_searchGroup, m_filtersMenu->filters());
+ // m_searchString has the group nice name
+ emit caption(m_searchString);
} else {
ui->browseView->setParentCategory(m_searchParentCategory);
+ emit caption(m_searchParentCategory.data().toString());
#ifndef HAVE_APPSTREAM
if (m_searchGroupCategory.startsWith('@') ||
m_searchGroupCategory.startsWith(QLatin1String("repo:"))) {
@@ -672,6 +687,7 @@ void ApperKCM::search()
connect(m_searchTransaction, SIGNAL(finished(PackageKit::Transaction::Exit,uint)),
ui->browseView, SLOT(enableExportInstalledPB()));
m_searchTransaction->getPackages(Transaction::FilterInstalled | m_filtersMenu->filters());
+ emit caption(i18n("Installed Software"));
break;
case Transaction::RoleResolve:
#ifdef HAVE_APPSTREAM
@@ -680,9 +696,11 @@ void ApperKCM::search()
// WARNING the resolve might fail if the backend
// has a low limit MaximumItemsToResolve
m_searchTransaction->resolve(m_searchCategory, m_filtersMenu->filters());
+ emit caption(m_searchParentCategory.data().toString());
} else {
ui->browseView->setParentCategory(m_searchParentCategory);
KMessageBox::sorry(this, i18n("Could not find an application that matched this category"));
+ emit caption();
disconnectTransaction();
m_searchTransaction = 0;
return;
@@ -691,6 +709,7 @@ void ApperKCM::search()
#endif
default:
kWarning() << "Search type not defined yet";
+ emit caption();
disconnectTransaction();
m_searchTransaction = 0;
return;
@@ -726,17 +745,16 @@ void ApperKCM::changed()
void ApperKCM::refreshCache()
{
- QWidget *currentWidget = ui->stackedWidget->currentWidget();
emit changed(false);
PkTransactionWidget *transactionW = new PkTransactionWidget(this);
+ connect(transactionW, SIGNAL(titleChangedProgress(QString)), this, SIGNAL(caption(QString)));
PkTransaction *transaction = new PkTransaction(transactionW);
QWeakPointer<PkTransaction> pointer = transaction;
transactionW->setTransaction(transaction, Transaction::RoleRefreshCache);
ui->stackedWidget->addWidget(transactionW);
ui->stackedWidget->setCurrentWidget(transactionW);
- int oldBar = ui->stackedWidgetBar->currentIndex();
ui->stackedWidgetBar->setCurrentIndex(BAR_TITLE);
ui->backTB->setEnabled(false);
connect(transactionW, SIGNAL(titleChanged(QString)),
@@ -758,18 +776,9 @@ void ApperKCM::refreshCache()
m_forceRefreshCache = transaction->exitStatus() == PkTransaction::Failed;
}
- // Finished setup old stuff
- ui->backTB->setEnabled(true);
- ui->stackedWidget->setCurrentWidget(currentWidget);
- ui->stackedWidgetBar->setCurrentIndex(oldBar);
- transactionW->deleteLater();
- transaction->deleteLater();
- if (currentWidget == m_updaterPage) {
- m_updaterPage->getUpdates();
- } else {
- // install then remove packages
- search();
- }
+ // Go back to the updates page
+ m_updaterPage->getUpdates();
+ setPage("updates");
QTimer::singleShot(0, this, SLOT(checkChanged()));
}
@@ -780,12 +789,12 @@ void ApperKCM::save()
m_settingsPage->save();
} else {
PkTransactionWidget *transactionW = new PkTransactionWidget(this);
+ connect(transactionW, SIGNAL(titleChangedProgress(QString)), this, SIGNAL(caption(QString)));
PkTransaction *transaction = new PkTransaction(transactionW);
QWeakPointer<PkTransaction> pointer = transaction;
ui->stackedWidget->addWidget(transactionW);
ui->stackedWidget->setCurrentWidget(transactionW);
- int oldBar = ui->stackedWidgetBar->currentIndex();
ui->stackedWidgetBar->setCurrentIndex(BAR_TITLE);
ui->backTB->setEnabled(false);
connect(transactionW, SIGNAL(titleChanged(QString)),
@@ -847,13 +856,10 @@ void ApperKCM::save()
}
}
- // Finished setup old stuff
- ui->backTB->setEnabled(true);
- ui->stackedWidget->setCurrentWidget(currentWidget);
- ui->stackedWidgetBar->setCurrentIndex(oldBar);
transaction->deleteLater();
if (currentWidget == m_updaterPage) {
m_updaterPage->getUpdates();
+ setPage("updates");
} else {
// install then remove packages
search();
diff --git a/ApperKCM/ApperKCM.h b/ApperKCM/ApperKCM.h
index 07660ec..dbe9da9 100644
--- a/ApperKCM/ApperKCM.h
+++ b/ApperKCM/ApperKCM.h
@@ -57,6 +57,7 @@ public:
signals:
void changed(bool state);
+ void caption(const QString &title = QString());
public slots:
void load();
diff --git a/libapper/PkTransactionWidget.cpp b/libapper/PkTransactionWidget.cpp
index fb88d74..252699c 100644
--- a/libapper/PkTransactionWidget.cpp
+++ b/libapper/PkTransactionWidget.cpp
@@ -175,23 +175,30 @@ void PkTransactionWidget::updateUi()
}
uint percentage = transaction->percentage();
+ QString percentageString;
if (percentage <= 100) {
- ui->progressBar->setMaximum(100);
- ui->progressBar->setValue(percentage);
+ if (ui->progressBar->value() != static_cast<int>(percentage)) {
+ ui->progressBar->setMaximum(100);
+ ui->progressBar->setValue(percentage);
+ percentageString = QString::number(percentage);
+ }
} else if (ui->progressBar->maximum() != 0) {
ui->progressBar->setMaximum(0);
ui->progressBar->reset();
+ percentageString = QLatin1String("");
}
ui->progressBar->setRemaining(transaction->remainingTime());
// Status & Speed
Transaction::Status status = transaction->status();
+ uint speed = transaction->speed();
+ qulonglong downloadSizeRemaining = transaction->downloadSizeRemaining();
if (m_status != status) {
m_status = status;
ui->currentL->setText(PkStrings::status(status,
- transaction->speed(),
- transaction->downloadSizeRemaining()));
+ speed,
+ downloadSizeRemaining));
KPixmapSequence sequence = KPixmapSequence(PkIcons::statusAnimation(status),
KIconLoader::SizeLarge);
@@ -201,25 +208,51 @@ void PkTransactionWidget::updateUi()
}
} else if (status == Transaction::StatusDownload) {
ui->currentL->setText(PkStrings::status(status,
- transaction->speed(),
- transaction->downloadSizeRemaining()));
+ speed,
+ downloadSizeRemaining));
}
+ QString windowTitle;
+ QString windowTitleProgress;
+ KIcon windowIcon;
Transaction::Role role = transaction->role();
- if (d->role != role) {
- QString windowTitle;
- KIcon windowIcon;
- if (role == Transaction::RoleUnknown) {
- windowTitle = PkStrings::status(Transaction::StatusSetup);
- windowIcon = PkIcons::statusIcon(Transaction::StatusSetup);
+ if (role == Transaction::RoleUnknown) {
+ windowTitle = PkStrings::status(Transaction::StatusSetup);
+ if (percentageString.isEmpty()) {
+ windowTitleProgress = PkStrings::status(status,
+ speed,
+ downloadSizeRemaining);
+ } else {
+ QString statusText = PkStrings::status(status,
+ speed,
+ downloadSizeRemaining);
+ windowTitleProgress = i18n("%1 (%2%)", statusText, percentageString);
+ }
+ windowIcon = PkIcons::statusIcon(Transaction::StatusSetup);
+ } else {
+ windowTitle = PkStrings::action(role);
+ if (percentageString.isEmpty()) {
+ windowTitleProgress = PkStrings::status(status,
+ speed,
+ downloadSizeRemaining);
} else {
- windowTitle = PkStrings::action(role);
- windowIcon = PkIcons::actionIcon(role);
+ QString statusText = PkStrings::status(status,
+ speed,
+ downloadSizeRemaining);
+ windowTitleProgress = i18n("%1 (%2%)", statusText, percentageString);
}
+ windowIcon = PkIcons::actionIcon(role);
+ }
+
+ if (d->role != role) {
d->role = role;
setWindowIcon(PkIcons::actionIcon(role));
setWindowTitle(windowTitle);
+
emit titleChanged(windowTitle);
+ emit titleChangedProgress(windowTitleProgress);
+ } else if (!percentageString.isNull()) {
+ emit titleChangedProgress(windowTitleProgress);
}
// check to see if we can cancel
diff --git a/libapper/PkTransactionWidget.h b/libapper/PkTransactionWidget.h
index 45d0a35..30ea044 100644
--- a/libapper/PkTransactionWidget.h
+++ b/libapper/PkTransactionWidget.h
@@ -54,6 +54,7 @@ public:
signals:
void allowCancel(bool enable);
void titleChanged(const QString &title);
+ void titleChangedProgress(const QString &title);
void dialog(KDialog *widget);
void sorry(const QString &title, const QString &text, const QString &details);
void error(const QString &title, const QString &text, const QString &details);
--
1.8.1