diff options
| author | Carlo Vanini <silhusk@gmail.com> | 2016-07-14 18:12:51 (GMT) |
|---|---|---|
| committer | Carlo Vanini <silhusk@gmail.com> | 2016-07-14 18:23:07 (GMT) |
| commit | 6dc5c12d31831695aa2e3d6d2b1f8ad4e393c6bc (patch) | |
| tree | ede56843e745eef704ee7d413ca134314e072bb8 | |
| parent | 108a7bbbe3bc067d0c133110cf3842da11ed1c3a (diff) | |
add columns for Installed-Size, Version, Available-Version
Add more columns to the list of packages and in the "preview changes"
tab. The additional columns are hidden by default and can be shown
through the context menu by right-clicking on the list header.
Testing Done:
* start muon
* right-click on the list header
* a context menu appears, select/deselect columns to show
REVIEW: 126388
BUG: 332453
| -rw-r--r-- | src/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/ManagerWidget.cpp | 8 | ||||
| -rw-r--r-- | src/ManagerWidget.h | 1 | ||||
| -rw-r--r-- | src/PackageModel/PackageDelegate.cpp | 27 | ||||
| -rw-r--r-- | src/PackageModel/PackageModel.cpp | 18 | ||||
| -rw-r--r-- | src/PackageModel/PackageModel.h | 5 | ||||
| -rw-r--r-- | src/PackageModel/PackageView.cpp | 6 | ||||
| -rw-r--r-- | src/PackageModel/PackageViewHeader.cpp | 73 | ||||
| -rw-r--r-- | src/PackageModel/PackageViewHeader.h | 47 | ||||
| -rw-r--r-- | src/PackageModel/PackageWidget.cpp | 15 | ||||
| -rw-r--r-- | src/PackageModel/PackageWidget.h | 2 | ||||
| -rw-r--r-- | src/config/muon.kcfg | 4 |
12 files changed, 202 insertions, 5 deletions
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 8620506..44de336 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -24,6 +24,7 @@ set(muon_SRCS PackageModel/PackageModel.cpp PackageModel/PackageProxyModel.cpp PackageModel/PackageView.cpp + PackageModel/PackageViewHeader.cpp PackageModel/PackageDelegate.cpp PackageModel/PackageWidget.cpp StatusWidget.cpp diff --git a/src/ManagerWidget.cpp b/src/ManagerWidget.cpp index 05fef2d..260bd80 100644 --- a/src/ManagerWidget.cpp +++ b/src/ManagerWidget.cpp @@ -34,6 +34,7 @@ // Own includes #include "muonapt/MuonStrings.h" +#include "MuonSettings.h" #include "DetailsWidget.h" #include "PackageModel/PackageModel.h" #include "PackageModel/PackageProxyModel.h" @@ -46,9 +47,16 @@ ManagerWidget::ManagerWidget(QWidget *parent) setPackagesType(PackageWidget::AvailablePackages); hideHeaderLabel(); + restoreColumnsState(QByteArray::fromBase64(MuonSettings::self()->managerListColumns().toLatin1())); showSearchEdit(); } +ManagerWidget::~ManagerWidget() +{ + MuonSettings::self()->setManagerListColumns(saveColumnsState().toBase64()); + MuonSettings::self()->save(); +} + void ManagerWidget::reload() { PackageWidget::reload(); diff --git a/src/ManagerWidget.h b/src/ManagerWidget.h index 2daad86..c68bd88 100644 --- a/src/ManagerWidget.h +++ b/src/ManagerWidget.h @@ -36,6 +36,7 @@ class ManagerWidget : public PackageWidget Q_OBJECT public: explicit ManagerWidget(QWidget *parent); + ~ManagerWidget(); public Q_SLOTS: void reload(); diff --git a/src/PackageModel/PackageDelegate.cpp b/src/PackageModel/PackageDelegate.cpp index 79c3dc4..e887fa4 100644 --- a/src/PackageModel/PackageDelegate.cpp +++ b/src/PackageModel/PackageDelegate.cpp @@ -57,6 +57,9 @@ void PackageDelegate::paint(QPainter *painter, const QStyleOptionViewItem &optio break; case 1: // Status case 2: // Action + case 3: // InstalledSize + case 4: // InstalledVersion + case 5: // AvailableVersion paintText(painter, option, index); break; default: @@ -162,6 +165,9 @@ void PackageDelegate::paintText(QPainter *painter, const QStyleOptionViewItem &o QPen pen; KColorScheme color(option.palette.currentColorGroup()); + QColor foregroundColor = (option.state.testFlag(QStyle::State_Selected)) ? + option.palette.color(QPalette::HighlightedText) : option.palette.color(QPalette::Text); + switch (index.column()) { case 1: state = index.data(PackageModel::StatusRole).toInt(); @@ -229,6 +235,18 @@ void PackageDelegate::paintText(QPainter *painter, const QStyleOptionViewItem &o break; } break; + case 3: + text = index.data(PackageModel::InstalledSizeRole).toString(); + pen.setBrush(foregroundColor); + break; + case 4: + text = index.data(PackageModel::InstalledVersionRole).toString(); + pen.setBrush(foregroundColor); + break; + case 5: + text = index.data(PackageModel::AvailableVersionRole).toString(); + pen.setBrush(foregroundColor); + break; } QFont font = option.font; @@ -259,6 +277,15 @@ QSize PackageDelegate::sizeHint(const QStyleOptionViewItem &option, const QModel case 2: size.setWidth(metric.width(index.data(PackageModel::ActionRole).toString())); break; + case 3: + size.setWidth(metric.width(index.data(PackageModel::InstalledSizeRole).toString())); + break; + case 4: + size.setWidth(metric.width(index.data(PackageModel::InstalledVersionRole).toString())); + break; + case 5: + size.setWidth(metric.width(index.data(PackageModel::AvailableVersionRole).toString())); + break; default: break; } diff --git a/src/PackageModel/PackageModel.cpp b/src/PackageModel/PackageModel.cpp index 9bde615..a896afc 100644 --- a/src/PackageModel/PackageModel.cpp +++ b/src/PackageModel/PackageModel.cpp @@ -23,6 +23,7 @@ #include <QStringBuilder> #include <QIcon> #include <KLocalizedString> +#include <KFormat> PackageModel::PackageModel(QObject *parent) : QAbstractListModel(parent) @@ -37,7 +38,7 @@ int PackageModel::rowCount(const QModelIndex & /*parent*/) const int PackageModel::columnCount(const QModelIndex & /*parent*/) const { - return 3; + return 6; } QVariant PackageModel::data(const QModelIndex &index, int role) const @@ -62,6 +63,15 @@ QVariant PackageModel::data(const QModelIndex &index, int role) const return package->state(); case SupportRole: return package->isSupported(); + case InstalledSizeRole: + if (package->isInstalled()) { + return KFormat().formatByteSize(package->currentInstalledSize()); + } + return QVariant(); + case InstalledVersionRole: + return package->installedVersion(); + case AvailableVersionRole: + return package->availableVersion(); case Qt::ToolTipRole: return QVariant(); } @@ -80,6 +90,12 @@ QVariant PackageModel::headerData(int section, Qt::Orientation orientation, int return QVariant(i18n("Status")); case 2: return QVariant(i18n("Requested")); + case 3: + return QVariant(i18n("Installed Size")); + case 4: + return QVariant(i18n("Installed Version")); + case 5: + return QVariant(i18n("Available Version")); } } return QVariant(); diff --git a/src/PackageModel/PackageModel.h b/src/PackageModel/PackageModel.h index 7a89845..7bd83d1 100644 --- a/src/PackageModel/PackageModel.h +++ b/src/PackageModel/PackageModel.h @@ -35,7 +35,10 @@ public: DescriptionRole = Qt::UserRole + 2, ActionRole = Qt::UserRole + 3, StatusRole = Qt::UserRole + 4, - SupportRole = Qt::UserRole + 5 + SupportRole = Qt::UserRole + 5, + InstalledSizeRole = Qt::UserRole + 6, + InstalledVersionRole = Qt::UserRole + 7, + AvailableVersionRole = Qt::UserRole + 8 }; explicit PackageModel(QObject *parent = 0); diff --git a/src/PackageModel/PackageView.cpp b/src/PackageModel/PackageView.cpp index 3b19366..70328a6 100644 --- a/src/PackageModel/PackageView.cpp +++ b/src/PackageModel/PackageView.cpp @@ -20,19 +20,21 @@ #include "PackageView.h" -#include <QtWidgets/QHeaderView> +#include "PackageViewHeader.h" -#define NUM_COLUMNS 3 // If this is changed change PackageWidget.cpp value as well +#define NUM_COLUMNS 6 // If this is changed change PackageWidget.cpp value as well PackageView::PackageView(QWidget *parent) : QTreeView(parent) { + setHeader(new PackageViewHeader()); setAlternatingRowColors(true); setContextMenuPolicy(Qt::CustomContextMenu); setRootIsDecorated(false); setSelectionMode(QAbstractItemView::ExtendedSelection); setUniformRowHeights(true); header()->setStretchLastSection(false); + header()->setDefaultAlignment(Qt::AlignLeft); } void PackageView::currentChanged(const QModelIndex ¤t, const QModelIndex &previous) diff --git a/src/PackageModel/PackageViewHeader.cpp b/src/PackageModel/PackageViewHeader.cpp new file mode 100644 index 0000000..e9557ec --- /dev/null +++ b/src/PackageModel/PackageViewHeader.cpp @@ -0,0 +1,73 @@ +/*************************************************************************** + * Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License or (at your option) version 3 or any later version * + * accepted by the membership of KDE e.V. (or its successor approved * + * by the membership of KDE e.V.), which shall act as a proxy * + * defined in Section 14 of version 3 of the license. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + ***************************************************************************/ + +#include "PackageViewHeader.h" + +#include <QAction> +#include <QMenu> +#include <QContextMenuEvent> + +PackageViewHeader::PackageViewHeader(QWidget *parent) + : QHeaderView(Qt::Horizontal, parent) +{ +} + +void PackageViewHeader::contextMenuEvent(QContextMenuEvent *event) +{ + QMenu menu(this); + createActions(); + foreach (QAction *action, m_columnActions) { + menu.addAction(action); + } + menu.exec(event->globalPos()); + deleteActions(); +} + +void PackageViewHeader::createActions() +{ + QAbstractItemModel *m = model(); + // first 3 columns (0-2) are always shown + for(int i = 3; i < count(); ++i) { + QAction *action = new QAction(m->headerData(i, orientation()).toString(), this); + action->setCheckable(true); + action->setChecked(!isSectionHidden(i)); + action->setData(i); + connect(action, SIGNAL(toggled(bool)), this, SLOT(toggleColumn(bool))); + m_columnActions.append(action); + } +} + +void PackageViewHeader::deleteActions() +{ + while (!m_columnActions.isEmpty()) { + QAction *action = m_columnActions.takeFirst(); + disconnect(action, SIGNAL(toggled(bool)), this, SLOT(toggleColumn(bool))); + delete action; + } +} + +void PackageViewHeader::toggleColumn(bool visible) +{ + QAction *action = qobject_cast<QAction *>(sender()); + if (action) { + int column = action->data().toInt(); + setSectionHidden(column, !visible); + } +} diff --git a/src/PackageModel/PackageViewHeader.h b/src/PackageModel/PackageViewHeader.h new file mode 100644 index 0000000..ada5498 --- /dev/null +++ b/src/PackageModel/PackageViewHeader.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * Copyright © 2010 Jonathan Thomas <echidnaman@kubuntu.org> * + * * + * This program is free software; you can redistribute it and/or * + * modify it under the terms of the GNU General Public License as * + * published by the Free Software Foundation; either version 2 of * + * the License or (at your option) version 3 or any later version * + * accepted by the membership of KDE e.V. (or its successor approved * + * by the membership of KDE e.V.), which shall act as a proxy * + * defined in Section 14 of version 3 of the license. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program. If not, see <http://www.gnu.org/licenses/>. * + ***************************************************************************/ + +#ifndef PACKAGEVIEWHEADER_H +#define PACKAGEVIEWHEADER_H + +#include <QtWidgets/QHeaderView> +#include <QList> + +class PackageViewHeader : public QHeaderView +{ + Q_OBJECT +public: + explicit PackageViewHeader(QWidget *parent = 0); + +protected: + void contextMenuEvent(QContextMenuEvent *event); + +private slots: + void toggleColumn(bool visible); + +private: + void createActions(); + void deleteActions(); + +private: + QList<QAction *> m_columnActions; +}; + +#endif diff --git a/src/PackageModel/PackageWidget.cpp b/src/PackageModel/PackageWidget.cpp index ea4307b..717b70d 100644 --- a/src/PackageModel/PackageWidget.cpp +++ b/src/PackageModel/PackageWidget.cpp @@ -55,7 +55,7 @@ #include "PackageView.h" #include "PackageDelegate.h" -#define NUM_COLUMNS 3 // If this is changed change PackageView.cpp value as well +#define NUM_COLUMNS 6 // If this is changed change PackageView.cpp value as well bool packageNameLessThan(QApt::Package *p1, QApt::Package *p2) { @@ -110,6 +110,9 @@ PackageWidget::PackageWidget(QWidget *parent) m_packageView->setModel(m_proxyModel); m_packageView->setItemDelegate(delegate); m_packageView->header()->setSectionResizeMode(0, QHeaderView::Stretch); + for (int i = 3; i < NUM_COLUMNS; ++i) { + m_packageView->header()->setSectionHidden(i, true); + } topVBox->addWidget(m_packageView); m_detailsWidget = new DetailsWidget; @@ -235,6 +238,16 @@ void PackageWidget::setFocusSearchEdit() m_searchEdit->selectAll(); } +QByteArray PackageWidget::saveColumnsState() const +{ + return m_packageView->header()->saveState(); +} + +bool PackageWidget::restoreColumnsState(const QByteArray& state) +{ + return m_packageView->header()->restoreState(state); +} + void PackageWidget::setBackend(QApt::Backend *backend) { m_backend = backend; diff --git a/src/PackageModel/PackageWidget.h b/src/PackageModel/PackageWidget.h index def2ef8..68d2e05 100644 --- a/src/PackageModel/PackageWidget.h +++ b/src/PackageModel/PackageWidget.h @@ -65,6 +65,8 @@ public: return m_packagesType; } bool isSortingPackages() const; + QByteArray saveColumnsState() const; + bool restoreColumnsState(const QByteArray &state); protected: QApt::Backend *m_backend; diff --git a/src/config/muon.kcfg b/src/config/muon.kcfg index f880169..e4ccd2d 100644 --- a/src/config/muon.kcfg +++ b/src/config/muon.kcfg @@ -28,5 +28,9 @@ <label>Show foreign architecture packages also available natively.</label> <default>false</default> </entry> + <entry name="ManagerListColumns" type="String"> + <label>Visible columns in the manager list of packages.</label> + <default></default> + </entry> </group> </kcfg> |
