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

List:       kde-commits
Subject:    [muon] muon: Add an architecture filter, available as one of the filters in the sidebar.
From:       Jonathan Thomas <echidnaman () kubuntu ! org>
Date:       2012-02-23 3:04:33
Message-ID: 20120223030433.ECBC2A60A6 () git ! kde ! org
[Download RAW message or body]

Git commit 6cbb9b8126e5b1310c1637d139288c910fcf733e by Jonathan Thomas.
Committed on 23/02/2012 at 04:03.
Pushed by jmthomas into branch 'master'.

Add an architecture filter, available as one of the filters in the sidebar.

FEATURE:290437
FIXED-IN:1.4.0

M  +1    -0    muon/CMakeLists.txt
C  +35   -36   muon/FilterWidget/ArchitectureFilter.cpp [from: \
muon/PackageModel/PackageProxyModel.h - 055% similarity] C  +13   -18   \
muon/FilterWidget/ArchitectureFilter.h [from: muon/ManagerWidget.h - 073% similarity] \
M  +31   -0    muon/FilterWidget/FilterWidget.cpp M  +3    -0    \
muon/FilterWidget/FilterWidget.h M  +2    -0    muon/MainWindow.cpp
M  +5    -0    muon/ManagerWidget.cpp
M  +1    -0    muon/ManagerWidget.h
M  +12   -0    muon/PackageModel/PackageProxyModel.cpp
M  +2    -0    muon/PackageModel/PackageProxyModel.h

http://commits.kde.org/muon/6cbb9b8126e5b1310c1637d139288c910fcf733e

diff --git a/muon/CMakeLists.txt b/muon/CMakeLists.txt
index 6579038..5b427b0 100644
--- a/muon/CMakeLists.txt
+++ b/muon/CMakeLists.txt
@@ -17,6 +17,7 @@ set(muon_SRCS
     DownloadModel/DownloadModel.cpp
     DownloadModel/DownloadDelegate.cpp
     DownloadWidget.cpp
+    FilterWidget/ArchitectureFilter.cpp
     FilterWidget/CategoryFilter.cpp
     FilterWidget/FilterModel.cpp
     FilterWidget/FilterWidget.cpp
diff --git a/muon/PackageModel/PackageProxyModel.h \
b/muon/FilterWidget/ArchitectureFilter.cpp similarity index 55%
copy from muon/PackageModel/PackageProxyModel.h
copy to muon/FilterWidget/ArchitectureFilter.cpp
index fd34a95..0fabf41 100644
--- a/muon/PackageModel/PackageProxyModel.h
+++ b/muon/FilterWidget/ArchitectureFilter.cpp
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright  © 2010 Jonathan Thomas <echidnaman@kubuntu.org>             *
+ *   Copyright  © 2012 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        *
@@ -18,48 +18,47 @@
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
-#ifndef PACKAGEPROXYMODEL_H
-#define PACKAGEPROXYMODEL_H
+#include "ArchitectureFilter.h"
 
-#include <QtGui/QSortFilterProxyModel>
-#include <QtCore/QString>
+// KDE includes
+#include <KIcon>
+#include <KLocale>
 
-#include <LibQApt/Package>
+// LibQApt includes
+#include <LibQApt/Backend>
 
-namespace QApt {
-    class Backend;
+ArchitectureFilter::ArchitectureFilter(QObject *parent, QApt::Backend *backend)
+    : FilterModel(parent)
+    , m_backend(backend)
+    , m_shouldShow(true)
+{
 }
 
-class PackageProxyModel : public QSortFilterProxyModel
+bool ArchitectureFilter::shouldShow() const
 {
-    Q_OBJECT
-public:
-    PackageProxyModel(QObject *parent);
-    ~PackageProxyModel();
-
-    void setBackend(QApt::Backend *backend);
-    void search(const QString &searchText);
-    void setGroupFilter(const QString &filterText);
-    void setStateFilter(QApt::Package::State state);
-    void setOriginFilter(const QString &origin);
-
-    bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
-    QApt::Package *packageAt(const QModelIndex &index) const;
-    void reset();
-
-protected:
-    bool lessThan(const QModelIndex &left, const QModelIndex &right) const;
+    return m_shouldShow;
+}
 
-private:
-    QApt::Backend *m_backend;
-    QApt::PackageList m_packages;
+void ArchitectureFilter::populate()
+{
+    QStringList archList = m_backend->architectures();
 
-    QString m_searchText;
-    QString m_groupFilter;
-    QApt::Package::State m_stateFilter;
-    QString m_originFilter;
+    if (archList.size() < 0) {
+        m_shouldShow = false;
+        return;
+    }
 
-    bool m_sortByRelevancy;
-};
+    QStandardItem *defaultItem = new QStandardItem;
+    defaultItem->setEditable(false);
+    defaultItem->setIcon(KIcon("bookmark-new-list"));
+    defaultItem->setText(i18nc("@item:inlistbox Item that resets the filter to \
\"all\"", "All")); +    appendRow(defaultItem);
 
-#endif
+    for (const QString &arch : archList) {
+        QStandardItem *archItem = new QStandardItem;
+        archItem->setEditable(false);
+        archItem->setText(arch);
+        archItem->setData(arch, Qt::UserRole+1);
+        appendRow(archItem);
+    }
+}
diff --git a/muon/ManagerWidget.h b/muon/FilterWidget/ArchitectureFilter.h
similarity index 73%
copy from muon/ManagerWidget.h
copy to muon/FilterWidget/ArchitectureFilter.h
index c82b053..f40331d 100644
--- a/muon/ManagerWidget.h
+++ b/muon/FilterWidget/ArchitectureFilter.h
@@ -1,5 +1,5 @@
 /***************************************************************************
- *   Copyright  © 2010 Jonathan Thomas <echidnaman@kubuntu.org>             *
+ *   Copyright  © 2012 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        *
@@ -18,31 +18,26 @@
  *   along with this program.  If not, see <http://www.gnu.org/licenses/>. *
  ***************************************************************************/
 
-#ifndef MANAGERWIDGET_H
-#define MANAGERWIDGET_H
+#ifndef ARCHITECTUREFILTER_H
+#define ARCHITECTUREFILTER_H
 
-#include <QModelIndex>
-
-#include <LibQApt/Package>
-
-#include "PackageModel/PackageWidget.h"
+#include "FilterModel.h"
 
 namespace QApt {
     class Backend;
 }
 
-class ManagerWidget : public PackageWidget
+class ArchitectureFilter : public FilterModel
 {
-    Q_OBJECT
 public:
-    explicit ManagerWidget(QWidget *parent);
-    ~ManagerWidget();
+    ArchitectureFilter(QObject *parent, QApt::Backend *backend);
+
+    bool shouldShow() const;
+    void populate();
 
-public Q_SLOTS:
-    void reload();
-    void filterByGroup(const QString &groupName);
-    void filterByStatus(const QApt::Package::State state);
-    void filterByOrigin(const QString &originName);
+private:
+    QApt::Backend *m_backend;
+    bool m_shouldShow;
 };
 
-#endif
+#endif // ARCHITECTUREFILTER_H
diff --git a/muon/FilterWidget/FilterWidget.cpp b/muon/FilterWidget/FilterWidget.cpp
index 662ee15..47d069c 100644
--- a/muon/FilterWidget/FilterWidget.cpp
+++ b/muon/FilterWidget/FilterWidget.cpp
@@ -34,6 +34,7 @@
 #include <LibQApt/Backend>
 
 // Own includes
+#include "ArchitectureFilter.h"
 #include "CategoryFilter.h"
 #include "OriginFilter.h"
 #include "StatusFilter.h"
@@ -66,6 +67,12 @@ FilterWidget::FilterWidget(QWidget *parent)
     m_listViews.append(m_originList);
     m_filterBox->addItem(m_originList, KIcon(), i18nc("@title:tab", "By Origin"));
 
+    m_archList = new QListView(this);
+    m_archList->hide();
+    connect(m_archList, SIGNAL(clicked(QModelIndex)),
+            this, SLOT(architectureActivated(QModelIndex)));
+    m_listViews.append(m_archList);
+
     for (QListView *view : m_listViews) {
         view->setAlternatingRowColors(true);
     }
@@ -111,11 +118,29 @@ void FilterWidget::populateFilters()
     m_filterModels.append(originFilter);
     m_originList->setModel(originFilter);
 
+    ArchitectureFilter *archFilter = new ArchitectureFilter(this, m_backend);
+    m_filterModels.append(archFilter);
+    m_archList->setModel(archFilter);
+
     // Populate filter lists
     for (FilterModel *filterModel : m_filterModels) {
         filterModel->populate();
     }
 
+    // Special-case showing the architecture list, it won't show on single-arch \
systems +    if (archFilter->shouldShow()) {
+        m_filterBox->addItem(m_archList, KIcon(), i18nc("@title:tab", "By \
Architecture")); +        m_archList->show();
+    } else {
+        m_filterBox->removeItem(m_filterBox->indexOf(m_archList));
+        m_filterModels.remove(m_filterModels.indexOf(archFilter));
+        delete archFilter;
+
+        m_listViews.remove(m_listViews.indexOf(m_archList));
+        delete m_archList;
+        m_archList = 0;
+    }
+
     // Set the selected item of each filter list to "All"
     for (QListView *view : m_listViews) {
         selectFirstRow(view);
@@ -140,6 +165,12 @@ void FilterWidget::originActivated(const QModelIndex &index)
     emit filterByOrigin(originName);
 }
 
+void FilterWidget::architectureActivated(const QModelIndex &index)
+{
+    QString arch = index.data(Qt::UserRole+1).toString();
+    emit filterByArchitecture(arch);
+}
+
 void FilterWidget::selectFirstRow(const QAbstractItemView *itemView)
 {
     QModelIndex firstRow = itemView->model()->index(0, 0);
diff --git a/muon/FilterWidget/FilterWidget.h b/muon/FilterWidget/FilterWidget.h
index 01f0edc..693d311 100644
--- a/muon/FilterWidget/FilterWidget.h
+++ b/muon/FilterWidget/FilterWidget.h
@@ -55,6 +55,7 @@ private:
     QListView *m_categoriesList;
     QListView *m_statusList;
     QListView *m_originList;
+    QListView *m_archList;
 
     QVector<QListView *> m_listViews;
     QVector<FilterModel *> m_filterModels;
@@ -71,11 +72,13 @@ private Q_SLOTS:
     void categoryActivated(const QModelIndex &index);
     void statusActivated(const QModelIndex &index);
     void originActivated(const QModelIndex &index);
+    void architectureActivated(const QModelIndex &index);
 
 signals:
     void filterByGroup(const QString &groupName);
     void filterByStatus(const QApt::Package::State state);
     void filterByOrigin(const QString &originName);
+    void filterByArchitecture(const QString &architecture);
 };
 
 #endif
diff --git a/muon/MainWindow.cpp b/muon/MainWindow.cpp
index 4865847..0bc4a57 100644
--- a/muon/MainWindow.cpp
+++ b/muon/MainWindow.cpp
@@ -103,6 +103,8 @@ void MainWindow::initGUI()
             m_managerWidget, SLOT(filterByStatus(QApt::Package::State)));
     connect(m_filterBox, SIGNAL(filterByOrigin(QString)),
             m_managerWidget, SLOT(filterByOrigin(QString)));
+    connect(m_filterBox, SIGNAL(filterByArchitecture(QString)),
+            m_managerWidget, SLOT(filterByArchitecture(QString)));
 
     m_mainWidget->addWidget(m_filterBox);
     m_mainWidget->addWidget(m_managerWidget);
diff --git a/muon/ManagerWidget.cpp b/muon/ManagerWidget.cpp
index 78b0cd5..f5ee252 100644
--- a/muon/ManagerWidget.cpp
+++ b/muon/ManagerWidget.cpp
@@ -82,4 +82,9 @@ void ManagerWidget::filterByOrigin(const QString &originName)
     m_proxyModel->setOriginFilter(origin);
 }
 
+void ManagerWidget::filterByArchitecture(const QString &arch)
+{
+    m_proxyModel->setArchFilter(arch);
+}
+
 #include "ManagerWidget.moc"
diff --git a/muon/ManagerWidget.h b/muon/ManagerWidget.h
index c82b053..52e21bf 100644
--- a/muon/ManagerWidget.h
+++ b/muon/ManagerWidget.h
@@ -43,6 +43,7 @@ public Q_SLOTS:
     void filterByGroup(const QString &groupName);
     void filterByStatus(const QApt::Package::State state);
     void filterByOrigin(const QString &originName);
+    void filterByArchitecture(const QString &arch);
 };
 
 #endif
diff --git a/muon/PackageModel/PackageProxyModel.cpp \
b/muon/PackageModel/PackageProxyModel.cpp index cea8189..5b3f97d 100644
--- a/muon/PackageModel/PackageProxyModel.cpp
+++ b/muon/PackageModel/PackageProxyModel.cpp
@@ -99,6 +99,12 @@ void PackageProxyModel::setOriginFilter(const QString &origin)
     invalidate();
 }
 
+void PackageProxyModel::setArchFilter(const QString &arch)
+{
+    m_archFilter = arch;
+    invalidate();
+}
+
 bool PackageProxyModel::filterAcceptsRow(int sourceRow, const QModelIndex \
&sourceParent) const  {
     //Our "main"-method
@@ -126,6 +132,12 @@ bool PackageProxyModel::filterAcceptsRow(int sourceRow, const \
QModelIndex &sourc  }
     }
 
+    if (!m_archFilter.isEmpty()) {
+        if (!(package->architecture() == m_archFilter)) {
+            return false;
+        }
+    }
+
     if (m_sortByRelevancy) {
         return m_packages.contains(package);
     }
diff --git a/muon/PackageModel/PackageProxyModel.h \
b/muon/PackageModel/PackageProxyModel.h index fd34a95..7b5ccd5 100644
--- a/muon/PackageModel/PackageProxyModel.h
+++ b/muon/PackageModel/PackageProxyModel.h
@@ -42,6 +42,7 @@ public:
     void setGroupFilter(const QString &filterText);
     void setStateFilter(QApt::Package::State state);
     void setOriginFilter(const QString &origin);
+    void setArchFilter(const QString &arch);
 
     bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
     QApt::Package *packageAt(const QModelIndex &index) const;
@@ -58,6 +59,7 @@ private:
     QString m_groupFilter;
     QApt::Package::State m_stateFilter;
     QString m_originFilter;
+    QString m_archFilter;
 
     bool m_sortByRelevancy;
 };


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

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