Skip to content

Commit

Permalink
Merge pull request Cockatrice#471 from ctrlaltca/set_extinfo
Browse files Browse the repository at this point in the history
More sets handling improvements
  • Loading branch information
Daenyth committed Dec 8, 2014
2 parents 745a7f1 + 9cc8d8b commit 8670bc6
Show file tree
Hide file tree
Showing 5 changed files with 191 additions and 51 deletions.
82 changes: 52 additions & 30 deletions cockatrice/src/setsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}
}
Expand All @@ -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();
Expand Down Expand Up @@ -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();
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<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));
}

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";
}
13 changes: 5 additions & 8 deletions cockatrice/src/setsmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
#define SETSMODEL_H

#include <QAbstractTableModel>
#include <QSortFilterProxyModel>
#include <QMimeData>
#include "carddatabase.h"

Expand All @@ -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();
Expand All @@ -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
129 changes: 120 additions & 9 deletions cockatrice/src/window_sets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -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);
}
13 changes: 10 additions & 3 deletions cockatrice/src/window_sets.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 4 additions & 1 deletion oracle/src/oracleimporter.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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())
Expand Down

0 comments on commit 8670bc6

Please sign in to comment.