roomslist: reimplement filters
authorsheepluva
Wed, 02 May 2012 14:30:22 +0200
changeset 6995 6b44c0f11476
parent 6994 28805595b9ec
child 6996 a0052cd32508
roomslist: reimplement filters implementation details: YO DAWG, I herd you like QSortFilterProxyModels, so I put a QSortFilterProxyModel in your QSortFilterProxyModel in your QSortFilterProxyModel in your QSortFilterProxyModel so that you can filter while you filter while you filter while you filter!
QTfrontend/model/roomslistmodel.cpp
QTfrontend/ui/page/pageroomslist.cpp
QTfrontend/ui/page/pageroomslist.h
--- a/QTfrontend/model/roomslistmodel.cpp	Wed May 02 07:39:25 2012 -0400
+++ b/QTfrontend/model/roomslistmodel.cpp	Wed May 02 14:30:22 2012 +0200
@@ -119,7 +119,7 @@
     {
         // supply in progress flag as bool
         if (column == 0)
-            return QVariant(!content.isEmpty());
+            return QVariant(QString(!content.isEmpty()));
 
         // display room names
         if (column == 5)
--- a/QTfrontend/ui/page/pageroomslist.cpp	Wed May 02 07:39:25 2012 -0400
+++ b/QTfrontend/ui/page/pageroomslist.cpp	Wed May 02 14:30:22 2012 +0200
@@ -146,11 +146,15 @@
     connect(BtnRefresh, SIGNAL(clicked()), this, SLOT(onRefreshClick()));
     connect(BtnClear, SIGNAL(clicked()), this, SLOT(onClearClick()));
     connect(roomsList, SIGNAL(doubleClicked (const QModelIndex &)), this, SLOT(onJoinClick()));
-    connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onRefreshClick()));
-    connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onRefreshClick()));
+    connect(CBState, SIGNAL(currentIndexChanged (int)), this, SLOT(onFilterChanged()));
+    connect(CBRules, SIGNAL(currentIndexChanged (int)), this, SLOT(onFilterChanged()));
+    connect(CBWeapons, SIGNAL(currentIndexChanged (int)), this, SLOT(onFilterChanged()));
+    connect(searchText, SIGNAL(textChanged (const QString &)), this, SLOT(onFilterChanged()));
     connect(this, SIGNAL(askJoinConfirmation (const QString &)), this, SLOT(onJoinConfirmation(const QString &)), Qt::QueuedConnection);
+
+
+    connect(roomsList->horizontalHeader(), SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
+            this, SLOT(onSortIndicatorChanged(int, Qt::SortOrder)));
 }
 
 
@@ -159,6 +163,11 @@
 {
     m_gameSettings = gameSettings;
 
+    roomsModel = NULL;
+    stateFilteredModel = NULL;
+    schemeFilteredModel = NULL;
+    weaponsFilteredModel = NULL;
+
     initPage();
 
     // not the most elegant solution but it works
@@ -479,14 +488,40 @@
     chatWidget->setUser(nickname);
 }
 
-void PageRoomsList::setModel(RoomsListModel *model)
+void PageRoomsList::setModel(RoomsListModel * model)
 {
-    roomsModel = new QSortFilterProxyModel(this);
+    if (roomsModel == NULL)
+    {
+        roomsModel = new QSortFilterProxyModel(this);
+        roomsModel->setDynamicSortFilter(true);
+        roomsModel->setSortCaseSensitivity(Qt::CaseInsensitive);
+        roomsModel->sort(RoomsListModel::StateColumn, Qt::AscendingOrder);
+
+        stateFilteredModel = new QSortFilterProxyModel(this);
+        schemeFilteredModel = new QSortFilterProxyModel(this);
+        weaponsFilteredModel = new QSortFilterProxyModel(this);
+
+        stateFilteredModel->setDynamicSortFilter(true);
+        schemeFilteredModel->setDynamicSortFilter(true);
+        weaponsFilteredModel->setDynamicSortFilter(true);
+
+        roomsModel->setFilterKeyColumn(-1); // search in all columns
+        stateFilteredModel->setFilterKeyColumn(RoomsListModel::StateColumn);
+        schemeFilteredModel->setFilterKeyColumn(RoomsListModel::SchemeColumn);
+        weaponsFilteredModel->setFilterKeyColumn(RoomsListModel::WeaponsColumn);
+
+        roomsModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+        schemeFilteredModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+        weaponsFilteredModel->setFilterCaseSensitivity(Qt::CaseInsensitive);
+
+        stateFilteredModel->setSourceModel(roomsModel);
+        schemeFilteredModel->setSourceModel(stateFilteredModel);
+        weaponsFilteredModel->setSourceModel(schemeFilteredModel);
+
+        roomsList->setModel(schemeFilteredModel);
+    }
+
     roomsModel->setSourceModel(model);
-    roomsModel->setDynamicSortFilter(true);
-    roomsModel->setSortCaseSensitivity(Qt::CaseInsensitive);
-    roomsModel->sort(RoomsListModel::StateColumn, Qt::AscendingOrder);
-    roomsList->setModel(roomsModel);
 
     roomsList->hideColumn(RoomsListModel::StateColumn);
 
@@ -501,14 +536,14 @@
     h->resizeSection(RoomsListModel::MapColumn, 100);
     h->resizeSection(RoomsListModel::SchemeColumn, 100);
     h->resizeSection(RoomsListModel::WeaponsColumn, 100);
+}
 
-    connect(h, SIGNAL(sortIndicatorChanged(int, Qt::SortOrder)),
-            this, SLOT(onSortIndicatorChanged(int, Qt::SortOrder)));
-
-}
 
 void PageRoomsList::onSortIndicatorChanged(int logicalIndex, Qt::SortOrder order)
 {
+    if (roomsModel == NULL)
+        return;
+
     // three state sorting: asc -> dsc -> default (by room state)
     if ((order == Qt::AscendingOrder) && (logicalIndex == roomsModel->sortColumn()))
         roomsList->horizontalHeader()->setSortIndicator(
@@ -516,3 +551,32 @@
     else
         roomsModel->sort(logicalIndex, order);
 }
+
+
+void PageRoomsList::onFilterChanged()
+{
+    if (roomsModel == NULL)
+        return;
+
+    roomsModel->setFilterWildcard(QString("*%1*").arg(searchText->text()));
+
+    int stateIdx = CBState->currentIndex();
+    // any = 0, in lobby/false = 1, in progress/true = 2
+
+    if (stateIdx == 0)
+        stateFilteredModel->setFilterWildcard("*"); // "any"
+    else
+        stateFilteredModel->setFilterFixedString(QString(stateIdx == 2));
+
+    if (CBRules->currentIndex() == 0)
+        schemeFilteredModel->setFilterWildcard("*"); // "any"
+    else
+        schemeFilteredModel->setFilterWildcard(
+            QString("*%1*").arg(CBRules->currentText()));
+
+    if (CBWeapons->currentIndex() == 0)
+        weaponsFilteredModel->setFilterWildcard("*"); // "any"
+    else
+        weaponsFilteredModel->setFilterWildcard(
+            QString("*%1*").arg(CBWeapons->currentText()));
+}
--- a/QTfrontend/ui/page/pageroomslist.h	Wed May 02 07:39:25 2012 -0400
+++ b/QTfrontend/ui/page/pageroomslist.h	Wed May 02 14:30:22 2012 +0200
@@ -76,10 +76,14 @@
         void onClearClick();
         void onJoinConfirmation(const QString &);
         void onSortIndicatorChanged(int logicalIndex, Qt::SortOrder order);
+        void onFilterChanged();
 
     private:
         QSettings * m_gameSettings;
         QSortFilterProxyModel * roomsModel;
+        QSortFilterProxyModel * stateFilteredModel;
+        QSortFilterProxyModel * schemeFilteredModel;
+        QSortFilterProxyModel * weaponsFilteredModel;
 
         AmmoSchemeModel * ammoSchemeModel;