mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-04-27 07:48:01 -07:00
Merge pull request #471 from ctrlaltca/set_extinfo
More sets handling improvements
This commit is contained in:
commit
8670bc674f
5 changed files with 191 additions and 51 deletions
|
|
@ -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<const SetsMimeData *>(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();
|
||||
|
||||
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
|
||||
}
|
||||
|
||||
void SetsModel::sort(int column, Qt::SortOrder order)
|
||||
{
|
||||
QMap<QString, CardSet *> setMap;
|
||||
int numRows = rowCount();
|
||||
int row;
|
||||
|
||||
for(row = 0; row < numRows; ++row)
|
||||
setMap.insertMulti(index(row, column).data().toString(), sets.at(row));
|
||||
|
||||
QList<CardSet *> 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));
|
||||
}
|
||||
|
||||
void SetsModel::save()
|
||||
{
|
||||
for (int i = 0; i < sets.size(); i++)
|
||||
sets[i]->setSortKey(i);
|
||||
|
||||
sets.sortByKey();
|
||||
}
|
||||
|
||||
void SetsModel::restore(CardDatabase *db)
|
||||
{
|
||||
sets = db->getSetList();
|
||||
sets.sortByKey();
|
||||
|
||||
emit dataChanged(index(0, 0), index(rowCount() - 1, columnCount() - 1));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
#define SETSMODEL_H
|
||||
|
||||
#include <QAbstractTableModel>
|
||||
#include <QSortFilterProxyModel>
|
||||
#include <QMimeData>
|
||||
#include "carddatabase.h"
|
||||
|
||||
|
|
@ -25,7 +24,7 @@ private:
|
|||
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 @@ 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);
|
||||
void save();
|
||||
void restore(CardDatabase *db);
|
||||
};
|
||||
|
||||
class SetsProxyModel : public QSortFilterProxyModel {
|
||||
Q_OBJECT
|
||||
public:
|
||||
SetsProxyModel(QObject *parent = 0);
|
||||
void saveOrder();
|
||||
};
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -5,41 +5,71 @@
|
|||
#include <QGridLayout>
|
||||
#include <QHeaderView>
|
||||
#include <QPushButton>
|
||||
#include <QItemSelection>
|
||||
#include <QMessageBox>
|
||||
|
||||
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);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue