diff --git a/cockatrice/src/setsmodel.cpp b/cockatrice/src/setsmodel.cpp index 206932c4d0..bd6dc00693 100644 --- a/cockatrice/src/setsmodel.cpp +++ b/cockatrice/src/setsmodel.cpp @@ -25,11 +25,11 @@ QVariant SetsModel::data(const QModelIndex &index, int role) const CardSet *set = sets[index.row()]; switch (index.column()) { - case SortKeyCol: return set->getSortKey(); + case SortKeyCol: return QString("%1").arg(set->getSortKey(), 4, 10, QChar('0')); case SetTypeCol: return set->getSetType(); case ShortNameCol: return set->getShortName(); case LongNameCol: return set->getLongName(); - case ReleaseDateCol: return set->getReleaseDate(); + case ReleaseDateCol: return set->getReleaseDate().toString(Qt::ISODate); default: return QVariant(); } } @@ -41,7 +41,7 @@ QVariant SetsModel::headerData(int section, Qt::Orientation orientation, int rol switch (section) { case SortKeyCol: return tr("Key"); case SetTypeCol: return tr("Set type"); - case ShortNameCol: return tr("Short name"); + case ShortNameCol: return tr("Set code"); case LongNameCol: return tr("Long name"); case ReleaseDateCol: return tr("Release date"); default: return QVariant(); @@ -78,47 +78,69 @@ bool SetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, int r row = parent.row(); } int oldRow = qobject_cast(data)->getOldRow(); - beginRemoveRows(QModelIndex(), oldRow, oldRow); - CardSet *temp = sets.takeAt(oldRow); - endRemoveRows(); if (oldRow < row) row--; - beginInsertRows(QModelIndex(), row, row); - sets.insert(row, temp); - endInsertRows(); - for (int i = 0; i < sets.size(); i++) - sets[i]->setSortKey(i); + swapRows(oldRow, row); - sets.sortByKey(); + return true; +} - emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +void SetsModel::swapRows(int oldRow, int newRow) +{ + beginRemoveRows(QModelIndex(), oldRow, oldRow); + CardSet *temp = sets.takeAt(oldRow); + endRemoveRows(); - return true; + beginInsertRows(QModelIndex(), newRow, newRow); + sets.insert(newRow, temp); + endInsertRows(); + + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); } -QStringList SetsModel::mimeTypes() const +void SetsModel::sort(int column, Qt::SortOrder order) { - return QStringList() << "application/x-cockatricecardset"; + QMap setMap; + int numRows = rowCount(); + int row; + + for(row = 0; row < numRows; ++row) + setMap.insertMulti(index(row, column).data().toString(), sets.at(row)); + + QList tmp = setMap.values(); + sets.clear(); + if(order == Qt::AscendingOrder) + { + for(row = 0; row < tmp.size(); row++) { + sets.append(tmp.at(row)); + } + } else { + for(row = tmp.size() - 1; row >= 0; row--) { + sets.append(tmp.at(row)); + } + } + + emit dataChanged(index(0, 0), index(numRows - 1, columnCount() - 1)); } -SetsProxyModel::SetsProxyModel(QObject *parent) - : QSortFilterProxyModel(parent) +void SetsModel::save() { - setDynamicSortFilter(true); + for (int i = 0; i < sets.size(); i++) + sets[i]->setSortKey(i); + + sets.sortByKey(); } -void SetsProxyModel::saveOrder() +void SetsModel::restore(CardDatabase *db) { - 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(); + sets = db->getSetList(); + sets.sortByKey(); - emit model->dataChanged(model->index(0, 0), model->index(model->rowCount() - 1, model->columnCount() - 1)); + emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1)); +} + +QStringList SetsModel::mimeTypes() const +{ + return QStringList() << "application/x-cockatricecardset"; } diff --git a/cockatrice/src/setsmodel.h b/cockatrice/src/setsmodel.h index 69f6934352..17911db183 100644 --- a/cockatrice/src/setsmodel.h +++ b/cockatrice/src/setsmodel.h @@ -2,7 +2,6 @@ #define SETSMODEL_H #include -#include #include #include "carddatabase.h" @@ -25,7 +24,7 @@ class SetsModel : public QAbstractTableModel { static const int NUM_COLS = 5; SetList sets; public: - enum SetsColumns { SortKeyCol, SetTypeCol, ShortNameCol, LongNameCol, ReleaseDateCol }; + enum SetsColumns { SortKeyCol, LongNameCol, ShortNameCol, SetTypeCol, ReleaseDateCol }; SetsModel(CardDatabase *_db, QObject *parent = 0); ~SetsModel(); @@ -39,12 +38,10 @@ class SetsModel : public QAbstractTableModel { 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); + void save(); + void restore(CardDatabase *db); }; -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 d37d370a29..5fef67a63d 100644 --- a/cockatrice/src/window_sets.cpp +++ b/cockatrice/src/window_sets.cpp @@ -5,41 +5,71 @@ #include #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->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 + view->sortByColumn(SetsModel::SortKeyCol, Qt::AscendingOrder); + view->setColumnHidden(SetsModel::SortKeyCol, true); + 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); + + mainLayout->addWidget(saveButton, 3, 0, 1, 1); + mainLayout->addWidget(restoreButton, 3, 1, 1, 1); QWidget *centralWidget = new QWidget; centralWidget->setLayout(mainLayout); @@ -55,10 +85,91 @@ WndSets::~WndSets() void WndSets::actSave() { - proxyModel->saveOrder(); + model->save(); + QMessageBox::information(this, tr("Success"), tr("The sets database has been saved successfully.")); } void WndSets::actRestore() { - view->sortByColumn(SetsModel::SortKeyCol, Qt::AscendingOrder); + model->restore(db); +} + +void WndSets::actToggleButtons(const QItemSelection & selected, const QItemSelection &) +{ + bool disabled = selected.empty(); + upButton->setDisabled(disabled); + downButton->setDisabled(disabled); + topButton->setDisabled(disabled); + bottomButton->setDisabled(disabled); +} + +void WndSets::selectRow(int row) +{ + 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 4657051914..d2c528232b 100644 --- a/cockatrice/src/window_sets.h +++ b/cockatrice/src/window_sets.h @@ -5,23 +5,30 @@ 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 *saveButton, *restoreButton, *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 diff --git a/oracle/src/oracleimporter.cpp b/oracle/src/oracleimporter.cpp index 273203c7cd..54ff9958b2 100644 --- a/oracle/src/oracleimporter.cpp +++ b/oracle/src/oracleimporter.cpp @@ -40,6 +40,9 @@ bool OracleImporter::readSetsFromByteArray(const QByteArray &data) editionLong = map.value("name").toString(); editionCards = map.value("cards"); setType = map.value("type").toString(); + // capitalize set type + if(setType.length() > 0) + setType[0] = setType[0].toUpper(); releaseDate = map.value("releaseDate").toDate(); // core and expansion sets are marked to be imported by default @@ -236,7 +239,7 @@ int OracleImporter::startImport() const SetToDownload * curSet; // add an empty set for tokens - CardSet *tokenSet = new CardSet(TOKENS_SETNAME, tr("Dummy set containing tokens"), "tokens"); + CardSet *tokenSet = new CardSet(TOKENS_SETNAME, tr("Dummy set containing tokens"), "Tokens"); sets.insert(TOKENS_SETNAME, tokenSet); while (it.hasNext())