From e48a815d258d981e1d9743bbdc37843d3d63fbf7 Mon Sep 17 00:00:00 2001 From: Fabio Bas Date: Sun, 30 Nov 2014 21:37:06 +0100 Subject: [PATCH] Add move buttons, misc improvements --- cockatrice/src/setsmodel.cpp | 57 +++++++++------- cockatrice/src/setsmodel.h | 9 +-- cockatrice/src/window_sets.cpp | 121 +++++++++++++++++++++++++++++---- cockatrice/src/window_sets.h | 15 ++-- 4 files changed, 149 insertions(+), 53 deletions(-) diff --git a/cockatrice/src/setsmodel.cpp b/cockatrice/src/setsmodel.cpp index 206932c4..d39e917d 100644 --- a/cockatrice/src/setsmodel.cpp +++ b/cockatrice/src/setsmodel.cpp @@ -1,4 +1,5 @@ #include "setsmodel.h" +#include SetsModel::SetsModel(CardDatabase *_db, QObject *parent) : QAbstractTableModel(parent), sets(_db->getSetList()) @@ -78,13 +79,22 @@ bool SetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r row = parent.row(); } int oldRow = qobject_cast(data)->getOldRow(); + if (oldRow < row) + row--; + + swapRows(oldRow, row); + + return true; +} + +void SetsModel::swapRows(int oldRow, int newRow) +{ beginRemoveRows(QModelIndex(), oldRow, oldRow); CardSet *temp = sets.takeAt(oldRow); endRemoveRows(); - if (oldRow < row) - row--; - beginInsertRows(QModelIndex(), row, row); - sets.insert(row, temp); + + beginInsertRows(QModelIndex(), newRow, newRow); + sets.insert(newRow, temp); endInsertRows(); for (int i = 0; i < sets.size(); i++) @@ -93,32 +103,27 @@ bool SetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r sets.sortByKey(); emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +} - return true; +void SetsModel::sort(int column, Qt::SortOrder order) +{ + QMap setMap; + int numRows = rowCount(); + int row; + + for(row = 0; row < numRows; ++row) + setMap.insertMulti(index(row, column).data().toString(), sets.at(row)); + + row = (order == Qt::AscendingOrder) ? 0 : numRows - 1; + + foreach(CardSet * set, setMap) + set->setSortKey((order == Qt::AscendingOrder) ? row++ : row--); + + sets.sortByKey(); + emit dataChanged(index(0, 0), index(numRows - 1, columnCount() - 1)); } QStringList SetsModel::mimeTypes() const { return QStringList() << "application/x-cockatricecardset"; } - -SetsProxyModel::SetsProxyModel(QObject *parent) - : QSortFilterProxyModel(parent) -{ - setDynamicSortFilter(true); -} - -void SetsProxyModel::saveOrder() -{ - int numRows = rowCount(); - SetsModel * model = (SetsModel*) sourceModel(); - for(int row = 0; row < numRows; ++row) { - QModelIndex idx = index(row, 0); - int oldRow = data(idx, Qt::DisplayRole).toInt(); - CardSet *temp = model->sets.at(oldRow); - temp->setSortKey(row); - } - model->sets.sortByKey(); - - emit model->dataChanged(model->index(0, 0), model->index(model->rowCount() - 1, model->columnCount() - 1)); -} diff --git a/cockatrice/src/setsmodel.h b/cockatrice/src/setsmodel.h index 69f69343..9ebdaccb 100644 --- a/cockatrice/src/setsmodel.h +++ b/cockatrice/src/setsmodel.h @@ -2,7 +2,6 @@ #define SETSMODEL_H #include -#include #include #include "carddatabase.h" @@ -39,12 +38,8 @@ public: QMimeData *mimeData(const QModelIndexList &indexes) const; bool dropMimeData(const QMimeData *data, Qt::DropAction action, int row, int column, const QModelIndex &parent); QStringList mimeTypes() const; + void swapRows(int oldRow, int newRow); + void sort(int column, Qt::SortOrder order = Qt::AscendingOrder); }; -class SetsProxyModel : public QSortFilterProxyModel { - Q_OBJECT -public: - SetsProxyModel(QObject *parent = 0); - void saveOrder(); -}; #endif diff --git a/cockatrice/src/window_sets.cpp b/cockatrice/src/window_sets.cpp index d37d370a..c73e75e2 100644 --- a/cockatrice/src/window_sets.cpp +++ b/cockatrice/src/window_sets.cpp @@ -5,41 +5,62 @@ #include #include #include +#include WndSets::WndSets(QWidget *parent) : QMainWindow(parent) { model = new SetsModel(db, this); - proxyModel = new SetsProxyModel(this); - proxyModel->setSourceModel(model); - proxyModel->setSortCaseSensitivity(Qt::CaseInsensitive); view = new QTreeView; - view->setModel(proxyModel); + view->setModel(model); + view->sortByColumn(SetsModel::SortKeyCol, Qt::AscendingOrder); + view->setColumnHidden(SetsModel::SortKeyCol, true); + view->setAlternatingRowColors(true); view->setUniformRowHeights(true); view->setAllColumnsShowFocus(true); view->setSortingEnabled(true); - view->sortByColumn(SetsModel::SortKeyCol, Qt::AscendingOrder); + view->setSelectionMode(QAbstractItemView::SingleSelection); + view->setSelectionBehavior(QAbstractItemView::SelectRows); view->setDragEnabled(true); view->setAcceptDrops(true); view->setDropIndicatorShown(true); view->setDragDropMode(QAbstractItemView::InternalMove); + #if QT_VERSION < 0x050000 + view->header()->setResizeMode(QHeaderView::Stretch); view->header()->setResizeMode(SetsModel::LongNameCol, QHeaderView::ResizeToContents); #else + view->header()->setSectionResizeMode(QHeaderView::Stretch); view->header()->setSectionResizeMode(SetsModel::LongNameCol, QHeaderView::ResizeToContents); #endif - saveButton = new QPushButton(tr("Save set ordering")); - connect(saveButton, SIGNAL(clicked()), this, SLOT(actSave())); - restoreButton = new QPushButton(tr("Restore saved set ordering")); - connect(restoreButton, SIGNAL(clicked()), this, SLOT(actRestore())); + upButton = new QPushButton(tr("Move selected set up")); + connect(upButton, SIGNAL(clicked()), this, SLOT(actUp())); + downButton = new QPushButton(tr("Move selected set down")); + connect(downButton, SIGNAL(clicked()), this, SLOT(actDown())); + topButton = new QPushButton(tr("Move selected set to top")); + connect(topButton, SIGNAL(clicked()), this, SLOT(actTop())); + bottomButton = new QPushButton(tr("Move selected set to bottom")); + connect(bottomButton, SIGNAL(clicked()), this, SLOT(actBottom())); + + upButton->setDisabled(true); + downButton->setDisabled(true); + topButton->setDisabled(true); + bottomButton->setDisabled(true); + + connect(view->selectionModel(), SIGNAL(selectionChanged(const QItemSelection &, const QItemSelection &)), + this, SLOT(actToggleButtons(const QItemSelection &, const QItemSelection &))); QGridLayout *mainLayout = new QGridLayout; mainLayout->addWidget(view, 0, 0, 1, 2); - mainLayout->addWidget(saveButton, 1, 0, 1, 1); - mainLayout->addWidget(restoreButton, 1, 1, 1, 1); + + mainLayout->addWidget(upButton, 1, 0, 1, 1); + mainLayout->addWidget(downButton, 2, 0, 1, 1); + + mainLayout->addWidget(topButton, 1, 1, 1, 1); + mainLayout->addWidget(bottomButton, 2, 1, 1, 1); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); @@ -53,12 +74,82 @@ WndSets::~WndSets() { } -void WndSets::actSave() +void WndSets::actToggleButtons(const QItemSelection & selected, const QItemSelection &) { - proxyModel->saveOrder(); + bool disabled = selected.empty(); + upButton->setDisabled(disabled); + downButton->setDisabled(disabled); + topButton->setDisabled(disabled); + bottomButton->setDisabled(disabled); } -void WndSets::actRestore() +void WndSets::selectRow(int row) { - view->sortByColumn(SetsModel::SortKeyCol, Qt::AscendingOrder); + QModelIndex idx = model->index(row, 0); + view->selectionModel()->select(idx, QItemSelectionModel::ClearAndSelect | QItemSelectionModel::Rows); + view->scrollTo(idx, QAbstractItemView::EnsureVisible); +} + +void WndSets::actUp() +{ + QModelIndexList rows = view->selectionModel()->selectedRows(); + if(rows.empty()) + return; + + QModelIndex selectedRow = rows.first(); + int oldRow = selectedRow.row(); + int newRow = oldRow - 1; + if(oldRow <= 0) + return; + + model->swapRows(oldRow, newRow); + selectRow(newRow); +} + +void WndSets::actDown() +{ + QModelIndexList rows = view->selectionModel()->selectedRows(); + if(rows.empty()) + return; + + QModelIndex selectedRow = rows.first(); + int oldRow = selectedRow.row(); + int newRow = oldRow + 1; + if(oldRow >= model->rowCount() - 1) + return; + + model->swapRows(oldRow, newRow); + selectRow(newRow); +} + +void WndSets::actTop() +{ + QModelIndexList rows = view->selectionModel()->selectedRows(); + if(rows.empty()) + return; + + QModelIndex selectedRow = rows.first(); + int oldRow = selectedRow.row(); + int newRow = 0; + if(oldRow <= 0) + return; + + model->swapRows(oldRow, newRow); + selectRow(newRow); +} + +void WndSets::actBottom() +{ + QModelIndexList rows = view->selectionModel()->selectedRows(); + if(rows.empty()) + return; + + QModelIndex selectedRow = rows.first(); + int oldRow = selectedRow.row(); + int newRow = model->rowCount() - 1; + if(oldRow >= newRow) + return; + + model->swapRows(oldRow, newRow); + selectRow(newRow); } diff --git a/cockatrice/src/window_sets.h b/cockatrice/src/window_sets.h index 46570519..d9d96fae 100644 --- a/cockatrice/src/window_sets.h +++ b/cockatrice/src/window_sets.h @@ -5,23 +5,28 @@ class SetsModel; class SetsProxyModel; -class QTreeView; class QPushButton; class CardDatabase; +class QItemSelection; +class QTreeView; class WndSets : public QMainWindow { Q_OBJECT private: SetsModel *model; - SetsProxyModel *proxyModel; QTreeView *view; - QPushButton *saveButton, *restoreButton; + QPushButton *upButton, *downButton, *bottomButton, *topButton; public: WndSets(QWidget *parent = 0); ~WndSets(); +protected: + void selectRow(int row); private slots: - void actSave(); - void actRestore(); + void actUp(); + void actDown(); + void actTop(); + void actBottom(); + void actToggleButtons(const QItemSelection & selected, const QItemSelection & deselected); }; #endif