335 lines
11 KiB
C++
335 lines
11 KiB
C++
#include <QtGui>
|
|
#include "window_deckeditor.h"
|
|
#include "window_sets.h"
|
|
#include "carddatabase.h"
|
|
#include "carddatabasemodel.h"
|
|
#include "decklistmodel.h"
|
|
#include "cardinfowidget.h"
|
|
|
|
WndDeckEditor::WndDeckEditor(CardDatabase *_db, QWidget *parent)
|
|
: QMainWindow(parent), db(_db)
|
|
{
|
|
QLabel *searchLabel = new QLabel(tr("&Search for:"));
|
|
searchEdit = new QLineEdit;
|
|
searchLabel->setBuddy(searchEdit);
|
|
connect(searchEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateSearch(const QString &)));
|
|
connect(searchEdit, SIGNAL(returnPressed()), this, SLOT(actAddCard()));
|
|
|
|
QHBoxLayout *searchLayout = new QHBoxLayout;
|
|
searchLayout->addWidget(searchLabel);
|
|
searchLayout->addWidget(searchEdit);
|
|
|
|
databaseModel = new CardDatabaseModel(db);
|
|
databaseView = new QTreeView();
|
|
databaseView->setModel(databaseModel);
|
|
databaseView->setUniformRowHeights(true);
|
|
databaseView->setSortingEnabled(true);
|
|
databaseView->resizeColumnToContents(0);
|
|
connect(databaseView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoLeft(const QModelIndex &, const QModelIndex &)));
|
|
connect(databaseView, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(actAddCard()));
|
|
|
|
QVBoxLayout *leftFrame = new QVBoxLayout;
|
|
leftFrame->addLayout(searchLayout);
|
|
leftFrame->addWidget(databaseView);
|
|
|
|
cardInfo = new CardInfoWidget(db);
|
|
cardInfo->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Preferred);
|
|
|
|
QToolBar *verticalToolBar = new QToolBar;
|
|
verticalToolBar->setOrientation(Qt::Vertical);
|
|
QHBoxLayout *verticalToolBarLayout = new QHBoxLayout;
|
|
verticalToolBarLayout->addStretch();
|
|
verticalToolBarLayout->addWidget(verticalToolBar);
|
|
verticalToolBarLayout->addStretch();
|
|
|
|
QVBoxLayout *middleFrame = new QVBoxLayout;
|
|
middleFrame->addWidget(cardInfo);
|
|
middleFrame->addLayout(verticalToolBarLayout);
|
|
middleFrame->addStretch();
|
|
|
|
deckModel = new DeckListModel(db, this);
|
|
deckView = new QTreeView();
|
|
deckView->setModel(deckModel);
|
|
deckView->setUniformRowHeights(true);
|
|
connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &)));
|
|
|
|
QLabel *nameLabel = new QLabel(tr("Deck &name:"));
|
|
nameEdit = new QLineEdit;
|
|
nameLabel->setBuddy(nameEdit);
|
|
connect(nameEdit, SIGNAL(textChanged(const QString &)), this, SLOT(updateName(const QString &)));
|
|
QLabel *commentsLabel = new QLabel(tr("&Comments:"));
|
|
commentsEdit = new QTextEdit;
|
|
commentsEdit->setMaximumHeight(70);
|
|
commentsLabel->setBuddy(commentsEdit);
|
|
connect(commentsEdit, SIGNAL(textChanged()), this, SLOT(updateComments()));
|
|
QGridLayout *grid = new QGridLayout;
|
|
grid->addWidget(nameLabel, 0, 0);
|
|
grid->addWidget(nameEdit, 0, 1);
|
|
grid->addWidget(commentsLabel, 1, 0);
|
|
grid->addWidget(commentsEdit, 1, 1);
|
|
|
|
QVBoxLayout *rightFrame = new QVBoxLayout;
|
|
rightFrame->addLayout(grid);
|
|
rightFrame->addWidget(deckView);
|
|
|
|
QHBoxLayout *mainLayout = new QHBoxLayout;
|
|
mainLayout->addLayout(leftFrame, 10);
|
|
mainLayout->addLayout(middleFrame);
|
|
mainLayout->addLayout(rightFrame, 10);
|
|
|
|
QWidget *centralWidget = new QWidget;
|
|
centralWidget->setLayout(mainLayout);
|
|
setCentralWidget(centralWidget);
|
|
|
|
setWindowTitle(tr("Deck editor [*]"));
|
|
|
|
aNewDeck = new QAction(tr("&New deck"), this);
|
|
aNewDeck->setShortcuts(QKeySequence::New);
|
|
connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck()));
|
|
aLoadDeck = new QAction(tr("&Load deck..."), this);
|
|
aLoadDeck->setShortcuts(QKeySequence::Open);
|
|
connect(aLoadDeck, SIGNAL(triggered()), this, SLOT(actLoadDeck()));
|
|
aSaveDeck = new QAction(tr("&Save deck"), this);
|
|
aSaveDeck->setShortcuts(QKeySequence::Save);
|
|
connect(aSaveDeck, SIGNAL(triggered()), this, SLOT(actSaveDeck()));
|
|
aSaveDeckAs = new QAction(tr("Save deck &as..."), this);
|
|
// aSaveDeckAs->setShortcuts(QKeySequence::SaveAs);
|
|
connect(aSaveDeckAs, SIGNAL(triggered()), this, SLOT(actSaveDeckAs()));
|
|
aPrintDeck = new QAction(tr("&Print deck..."), this);
|
|
aPrintDeck->setShortcuts(QKeySequence::Print);
|
|
connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck()));
|
|
aClose = new QAction(tr("&Close"), this);
|
|
aClose->setShortcut(tr("Ctrl+Q"));
|
|
connect(aClose, SIGNAL(triggered()), this, SLOT(close()));
|
|
|
|
aEditSets = new QAction(tr("&Edit sets..."), this);
|
|
connect(aEditSets, SIGNAL(triggered()), this, SLOT(actEditSets()));
|
|
|
|
deckMenu = menuBar()->addMenu(tr("&Deck"));
|
|
deckMenu->addAction(aNewDeck);
|
|
deckMenu->addAction(aLoadDeck);
|
|
deckMenu->addAction(aSaveDeck);
|
|
deckMenu->addAction(aSaveDeckAs);
|
|
deckMenu->addSeparator();
|
|
deckMenu->addAction(aPrintDeck);
|
|
deckMenu->addSeparator();
|
|
deckMenu->addAction(aClose);
|
|
|
|
setsMenu = menuBar()->addMenu(tr("&Sets"));
|
|
setsMenu->addAction(aEditSets);
|
|
|
|
aAddCard = new QAction(tr("Add card to &maindeck"), this);
|
|
connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard()));
|
|
aAddCard->setShortcut(tr("Ctrl+M"));
|
|
aAddCardToSideboard = new QAction(tr("Add card to &sideboard"), this);
|
|
connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard()));
|
|
aAddCardToSideboard->setShortcut(tr("Ctrl+N"));
|
|
aRemoveCard = new QAction(tr("&Remove row"), this);
|
|
connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard()));
|
|
aRemoveCard->setShortcut(tr("Del"));
|
|
aIncrement = new QAction(tr("&Increment number"), this);
|
|
connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement()));
|
|
aIncrement->setShortcut(tr("+"));
|
|
aDecrement = new QAction(tr("&Decrement number"), this);
|
|
connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement()));
|
|
aDecrement->setShortcut(tr("-"));
|
|
|
|
verticalToolBar->addAction(aAddCard);
|
|
verticalToolBar->addAction(aAddCardToSideboard);
|
|
verticalToolBar->addAction(aRemoveCard);
|
|
verticalToolBar->addAction(aIncrement);
|
|
verticalToolBar->addAction(aDecrement);
|
|
}
|
|
|
|
WndDeckEditor::~WndDeckEditor()
|
|
{
|
|
|
|
}
|
|
|
|
void WndDeckEditor::updateName(const QString &name)
|
|
{
|
|
deckModel->getDeckList()->setName(name);
|
|
setWindowModified(true);
|
|
}
|
|
|
|
void WndDeckEditor::updateComments()
|
|
{
|
|
deckModel->getDeckList()->setComments(commentsEdit->toPlainText());
|
|
setWindowModified(true);
|
|
}
|
|
|
|
void WndDeckEditor::updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &/*previous*/)
|
|
{
|
|
cardInfo->setCard(current.sibling(current.row(), 0).data().toString());
|
|
}
|
|
|
|
void WndDeckEditor::updateCardInfoRight(const QModelIndex ¤t, const QModelIndex &/*previous*/)
|
|
{
|
|
if (!current.isValid())
|
|
return;
|
|
if (!current.model()->hasChildren(current.sibling(current.row(), 0)))
|
|
cardInfo->setCard(current.sibling(current.row(), 1).data().toString());
|
|
}
|
|
|
|
void WndDeckEditor::updateSearch(const QString &search)
|
|
{
|
|
QModelIndexList matches = databaseModel->match(databaseModel->index(0, 0), Qt::DisplayRole, search);
|
|
if (matches.isEmpty())
|
|
return;
|
|
databaseView->selectionModel()->setCurrentIndex(matches[0], QItemSelectionModel::SelectCurrent);
|
|
}
|
|
|
|
bool WndDeckEditor::confirmClose()
|
|
{
|
|
if (isWindowModified()) {
|
|
QMessageBox::StandardButton ret = QMessageBox::warning(this, tr("Are you sure?"),
|
|
tr("The decklist has been modified.\nDo you want to save the changes?"),
|
|
QMessageBox::Save | QMessageBox::Discard | QMessageBox::Cancel);
|
|
if (ret == QMessageBox::Save)
|
|
return actSaveDeck();
|
|
else if (ret == QMessageBox::Cancel)
|
|
return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
void WndDeckEditor::closeEvent(QCloseEvent *event)
|
|
{
|
|
if (confirmClose())
|
|
event->accept();
|
|
else
|
|
event->ignore();
|
|
}
|
|
|
|
void WndDeckEditor::actNewDeck()
|
|
{
|
|
if (!confirmClose())
|
|
return;
|
|
|
|
deckModel->cleanList();
|
|
nameEdit->setText(QString());
|
|
commentsEdit->setText(QString());
|
|
lastFileName = QString();
|
|
}
|
|
|
|
void WndDeckEditor::actLoadDeck()
|
|
{
|
|
if (!confirmClose())
|
|
return;
|
|
|
|
DeckList *l = deckModel->getDeckList();
|
|
if (l->loadDialog(this)) {
|
|
lastFileName = l->getLastFileName();
|
|
lastFileFormat = l->getLastFileFormat();
|
|
nameEdit->setText(l->getName());
|
|
commentsEdit->setText(l->getComments());
|
|
deckModel->sort(1);
|
|
deckView->expandAll();
|
|
deckView->resizeColumnToContents(0);
|
|
setWindowModified(false);
|
|
}
|
|
}
|
|
|
|
bool WndDeckEditor::actSaveDeck()
|
|
{
|
|
if (lastFileName.isEmpty())
|
|
return actSaveDeckAs();
|
|
else if (deckModel->getDeckList()->saveToFile(lastFileName, lastFileFormat)) {
|
|
setWindowModified(false);
|
|
return true;
|
|
} else
|
|
return false;
|
|
}
|
|
|
|
bool WndDeckEditor::actSaveDeckAs()
|
|
{
|
|
DeckList *l = deckModel->getDeckList();
|
|
if (l->saveDialog(this)) {
|
|
lastFileName = l->getLastFileName();
|
|
lastFileFormat = l->getLastFileFormat();
|
|
setWindowModified(false);
|
|
return true;
|
|
} else
|
|
return false;
|
|
}
|
|
|
|
void WndDeckEditor::actPrintDeck()
|
|
{
|
|
QPrintPreviewDialog *dlg = new QPrintPreviewDialog(this);
|
|
connect(dlg, SIGNAL(paintRequested(QPrinter *)), deckModel, SLOT(printDeckList(QPrinter *)));
|
|
dlg->exec();
|
|
}
|
|
|
|
void WndDeckEditor::actEditSets()
|
|
{
|
|
WndSets *w = new WndSets(db, this);
|
|
w->setWindowModality(Qt::WindowModal);
|
|
w->show();
|
|
}
|
|
|
|
void WndDeckEditor::recursiveExpand(const QModelIndex &index)
|
|
{
|
|
if (index.parent().isValid())
|
|
recursiveExpand(index.parent());
|
|
deckView->expand(index);
|
|
}
|
|
|
|
void WndDeckEditor::addCardHelper(const QString &zoneName)
|
|
{
|
|
const QModelIndex currentIndex = databaseView->selectionModel()->currentIndex();
|
|
if (!currentIndex.isValid())
|
|
return;
|
|
const QString cardName = databaseModel->index(currentIndex.row(), 0).data().toString();
|
|
|
|
QModelIndex newCardIndex = deckModel->addCard(cardName, zoneName);
|
|
recursiveExpand(newCardIndex);
|
|
deckView->setCurrentIndex(newCardIndex);
|
|
|
|
setWindowModified(true);
|
|
}
|
|
|
|
void WndDeckEditor::actAddCard()
|
|
{
|
|
addCardHelper("main");
|
|
}
|
|
|
|
void WndDeckEditor::actAddCardToSideboard()
|
|
{
|
|
addCardHelper("side");
|
|
}
|
|
|
|
void WndDeckEditor::actRemoveCard()
|
|
{
|
|
const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex();
|
|
if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex))
|
|
return;
|
|
deckModel->removeRow(currentIndex.row(), currentIndex.parent());
|
|
setWindowModified(true);
|
|
}
|
|
|
|
void WndDeckEditor::actIncrement()
|
|
{
|
|
const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex();
|
|
if (!currentIndex.isValid())
|
|
return;
|
|
const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0);
|
|
const int count = deckModel->data(numberIndex, Qt::EditRole).toInt();
|
|
deckView->setCurrentIndex(numberIndex);
|
|
deckModel->setData(numberIndex, count + 1, Qt::EditRole);
|
|
setWindowModified(true);
|
|
}
|
|
|
|
void WndDeckEditor::actDecrement()
|
|
{
|
|
const QModelIndex ¤tIndex = deckView->selectionModel()->currentIndex();
|
|
if (!currentIndex.isValid())
|
|
return;
|
|
const QModelIndex numberIndex = currentIndex.sibling(currentIndex.row(), 0);
|
|
const int count = deckModel->data(numberIndex, Qt::EditRole).toInt();
|
|
deckView->setCurrentIndex(numberIndex);
|
|
if (count == 1)
|
|
deckModel->removeRow(currentIndex.row(), currentIndex.parent());
|
|
else
|
|
deckModel->setData(numberIndex, count - 1, Qt::EditRole);
|
|
setWindowModified(true);
|
|
}
|