summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCarlo Vanini <silhusk@gmail.com>2016-07-14 18:12:51 (GMT)
committerCarlo Vanini <silhusk@gmail.com>2016-07-14 18:23:07 (GMT)
commit6dc5c12d31831695aa2e3d6d2b1f8ad4e393c6bc (patch)
treeede56843e745eef704ee7d413ca134314e072bb8
parent108a7bbbe3bc067d0c133110cf3842da11ed1c3a (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.txt1
-rw-r--r--src/ManagerWidget.cpp8
-rw-r--r--src/ManagerWidget.h1
-rw-r--r--src/PackageModel/PackageDelegate.cpp27
-rw-r--r--src/PackageModel/PackageModel.cpp18
-rw-r--r--src/PackageModel/PackageModel.h5
-rw-r--r--src/PackageModel/PackageView.cpp6
-rw-r--r--src/PackageModel/PackageViewHeader.cpp73
-rw-r--r--src/PackageModel/PackageViewHeader.h47
-rw-r--r--src/PackageModel/PackageWidget.cpp15
-rw-r--r--src/PackageModel/PackageWidget.h2
-rw-r--r--src/config/muon.kcfg4
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 &current, 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>