diff --git a/cockatrice/CMakeLists.txt b/cockatrice/CMakeLists.txt index f04e714a..84450e85 100644 --- a/cockatrice/CMakeLists.txt +++ b/cockatrice/CMakeLists.txt @@ -9,6 +9,7 @@ SET(cockatrice_SOURCES src/dlg_filter_games.cpp src/dlg_connect.cpp src/dlg_create_token.cpp + src/dlg_edit_tokens.cpp src/abstractclient.cpp src/remoteclient.cpp src/main.cpp @@ -85,6 +86,7 @@ SET(cockatrice_HEADERS src/dlg_filter_games.h src/dlg_connect.h src/dlg_create_token.h + src/dlg_edit_tokens.h src/gamesmodel.h src/abstractclient.h src/remoteclient.h diff --git a/cockatrice/src/carddatabase.cpp b/cockatrice/src/carddatabase.cpp index 115256ba..8a0280a9 100644 --- a/cockatrice/src/carddatabase.cpp +++ b/cockatrice/src/carddatabase.cpp @@ -440,9 +440,11 @@ CardDatabase::CardDatabase(QObject *parent) { connect(settingsCache, SIGNAL(picsPathChanged()), this, SLOT(picsPathChanged())); connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabase())); + connect(settingsCache, SIGNAL(tokenDatabasePathChanged()), this, SLOT(loadTokenDatabase())); connect(settingsCache, SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); loadCardDatabase(); + loadTokenDatabase(); pictureLoaderThread = new QThread; pictureLoader = new PictureLoader(settingsCache->getPicsPath(), settingsCache->getPicDownload()); @@ -482,18 +484,31 @@ void CardDatabase::clear() cardHash.clear(); } -CardInfo *CardDatabase::getCard(const QString &cardName) +void CardDatabase::addCard(CardInfo *card) +{ + cardHash.insert(card->getName(), card); + emit cardAdded(card); +} + +void CardDatabase::removeCard(CardInfo *card) +{ + cardHash.remove(card->getName()); + emit cardRemoved(card); +} + +CardInfo *CardDatabase::getCard(const QString &cardName, bool createIfNotFound) { if (cardName.isEmpty()) return noCard; else if (cardHash.contains(cardName)) return cardHash.value(cardName); - else { + else if (createIfNotFound) { CardInfo *newCard = new CardInfo(this, cardName, true); newCard->addToSet(getSet("TK")); cardHash.insert(cardName, newCard); return newCard; - } + } else + return 0; } CardSet *CardDatabase::getSet(const QString &setName) @@ -601,14 +616,42 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml) } } -bool CardDatabase::loadFromFile(const QString &fileName) +bool CardDatabase::loadFromFile(const QString &fileName, bool tokens) { QFile file(fileName); file.open(QIODevice::ReadOnly); if (!file.isOpen()) return false; + + if (tokens) { + QMutableHashIterator i(cardHash); + while (i.hasNext()) { + i.next(); + if (i.value()->getIsToken()) { + delete i.value(); + i.remove(); + } + } + } else { + QHashIterator setIt(setHash); + while (setIt.hasNext()) { + setIt.next(); + delete setIt.value(); + } + setHash.clear(); + + QMutableHashIterator i(cardHash); + while (i.hasNext()) { + i.next(); + if (!i.value()->getIsToken()) { + delete i.value(); + i.remove(); + } + } + cardHash.clear(); + } + QXmlStreamReader xml(&file); - clear(); while (!xml.atEnd()) { if (xml.readNext() == QXmlStreamReader::StartElement) { if (xml.name() != "cockatrice_carddatabase") @@ -629,7 +672,7 @@ bool CardDatabase::loadFromFile(const QString &fileName) return !cardHash.isEmpty(); } -bool CardDatabase::saveToFile(const QString &fileName) +bool CardDatabase::saveToFile(const QString &fileName, bool tokens) { QFile file(fileName); if (!file.open(QIODevice::WriteOnly)) @@ -641,16 +684,21 @@ bool CardDatabase::saveToFile(const QString &fileName) xml.writeStartElement("cockatrice_carddatabase"); xml.writeAttribute("version", QString::number(versionNeeded)); - xml.writeStartElement("sets"); - QHashIterator setIterator(setHash); - while (setIterator.hasNext()) - xml << setIterator.next().value(); - xml.writeEndElement(); // sets + if (!tokens) { + xml.writeStartElement("sets"); + QHashIterator setIterator(setHash); + while (setIterator.hasNext()) + xml << setIterator.next().value(); + xml.writeEndElement(); // sets + } xml.writeStartElement("cards"); QHashIterator cardIterator(cardHash); - while (cardIterator.hasNext()) - xml << cardIterator.next().value(); + while (cardIterator.hasNext()) { + CardInfo *card = cardIterator.next().value(); + if (card->getIsToken() == tokens) + xml << card; + } xml.writeEndElement(); // cards xml.writeEndElement(); // cockatrice_carddatabase @@ -669,13 +717,13 @@ void CardDatabase::picDownloadChanged() } } -bool CardDatabase::loadCardDatabase(const QString &path) +bool CardDatabase::loadCardDatabase(const QString &path, bool tokens) { + bool tempLoadSuccess = false; if (!path.isEmpty()) - loadSuccess = loadFromFile(path); - else loadSuccess = false; + tempLoadSuccess = loadFromFile(path, tokens); - if (loadSuccess) { + if (tempLoadSuccess) { SetList allSets; QHashIterator setsIterator(setHash); while (setsIterator.hasNext()) @@ -687,12 +735,20 @@ bool CardDatabase::loadCardDatabase(const QString &path) emit cardListChanged(); } - return loadSuccess; + if (!tokens) + loadSuccess = tempLoadSuccess; + + return tempLoadSuccess; } -bool CardDatabase::loadCardDatabase() +void CardDatabase::loadCardDatabase() { - return loadCardDatabase(settingsCache->getCardDatabasePath()); + loadCardDatabase(settingsCache->getCardDatabasePath(), false); +} + +void CardDatabase::loadTokenDatabase() +{ + loadCardDatabase(settingsCache->getTokenDatabasePath(), true); } QStringList CardDatabase::getAllColors() const diff --git a/cockatrice/src/carddatabase.h b/cockatrice/src/carddatabase.h index 373d1981..1f87d276 100644 --- a/cockatrice/src/carddatabase.h +++ b/cockatrice/src/carddatabase.h @@ -130,7 +130,11 @@ public: const QString &getText() const { return text; } const int &getLoyalty() const { return loyalty; } bool getCipt() const { return cipt; } - void setText(const QString &_text) { text = _text; } + void setManaCost(const QString &_manaCost) { manacost = _manaCost; emit cardInfoChanged(this); } + void setCardType(const QString &_cardType) { cardtype = _cardType; emit cardInfoChanged(this); } + void setPowTough(const QString &_powTough) { powtough = _powTough; emit cardInfoChanged(this); } + void setText(const QString &_text) { text = _text; emit cardInfoChanged(this); } + void setColors(const QStringList &_colors) { colors = _colors; emit cardInfoChanged(this); } const QStringList &getColors() const { return colors; } QString getPicURL(const QString &set) const { return picURLs.value(set); } QString getPicURLHq(const QString &set) const { return picURLsHq.value(set); } @@ -141,7 +145,7 @@ public: QString getCorrectedName() const; int getTableRow() const { return tableRow; } void setTableRow(int _tableRow) { tableRow = _tableRow; } - void setLoyalty(int _loyalty) { loyalty = _loyalty; } + void setLoyalty(int _loyalty) { loyalty = _loyalty; emit cardInfoChanged(this); } void setPicURL(const QString &_set, const QString &_picURL) { picURLs.insert(_set, _picURL); } void setPicURLHq(const QString &_set, const QString &_picURL) { picURLsHq.insert(_set, _picURL); } void setPicURLSt(const QString &_set, const QString &_picURL) { picURLsSt.insert(_set, _picURL); } @@ -155,6 +159,7 @@ public slots: void updatePixmapCache(); signals: void pixmapUpdated(); + void cardInfoChanged(CardInfo *card); }; class CardDatabase : public QObject { @@ -175,12 +180,14 @@ public: CardDatabase(QObject *parent = 0); ~CardDatabase(); void clear(); - CardInfo *getCard(const QString &cardName = QString()); + void addCard(CardInfo *card); + void removeCard(CardInfo *card); + CardInfo *getCard(const QString &cardName = QString(), bool createIfNotFound = true); CardSet *getSet(const QString &setName); QList getCardList() const { return cardHash.values(); } SetList getSetList() const; - bool loadFromFile(const QString &fileName); - bool saveToFile(const QString &fileName); + bool loadFromFile(const QString &fileName, bool tokens = false); + bool saveToFile(const QString &fileName, bool tokens = false); QStringList getAllColors() const; QStringList getAllMainCardTypes() const; bool getLoadSuccess() const { return loadSuccess; } @@ -188,14 +195,18 @@ public: void loadImage(CardInfo *card); public slots: void clearPixmapCache(); - bool loadCardDatabase(const QString &path); - bool loadCardDatabase(); + bool loadCardDatabase(const QString &path, bool tokens = false); private slots: void imageLoaded(CardInfo *card, QImage image); void picDownloadChanged(); void picsPathChanged(); + + void loadCardDatabase(); + void loadTokenDatabase(); signals: void cardListChanged(); + void cardAdded(CardInfo *card); + void cardRemoved(CardInfo *card); }; #endif diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index eeca8bf3..67b8404e 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -4,12 +4,13 @@ CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, QObject *parent) : QAbstractListModel(parent), db(_db) { connect(db, SIGNAL(cardListChanged()), this, SLOT(updateCardList())); - cardList = db->getCardList(); + connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *))); + connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *))); + updateCardList(); } CardDatabaseModel::~CardDatabaseModel() { - } int CardDatabaseModel::rowCount(const QModelIndex &/*parent*/) const @@ -66,10 +67,44 @@ QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation, void CardDatabaseModel::updateCardList() { + for (int i = 0; i < cardList.size(); ++i) + disconnect(cardList[i], 0, this, 0); + cardList = db->getCardList(); + for (int i = 0; i < cardList.size(); ++i) + connect(cardList[i], SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); + reset(); } +void CardDatabaseModel::cardInfoChanged(CardInfo *card) +{ + const int row = cardList.indexOf(card); + if (row == -1) + return; + + emit dataChanged(index(row, 0), index(row, 4)); +} + +void CardDatabaseModel::cardAdded(CardInfo *card) +{ + beginInsertRows(QModelIndex(), cardList.size(), cardList.size()); + cardList.append(card); + connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *))); + endInsertRows(); +} + +void CardDatabaseModel::cardRemoved(CardInfo *card) +{ + const int row = cardList.indexOf(card); + if (row == -1) + return; + + beginRemoveRows(QModelIndex(), row, row); + cardList.removeAt(row); + endRemoveRows(); +} + CardDatabaseDisplayModel::CardDatabaseDisplayModel(QObject *parent) : QSortFilterProxyModel(parent), isToken(ShowAll) diff --git a/cockatrice/src/carddatabasemodel.h b/cockatrice/src/carddatabasemodel.h index 79475f4d..fdac3f29 100644 --- a/cockatrice/src/carddatabasemodel.h +++ b/cockatrice/src/carddatabasemodel.h @@ -16,12 +16,15 @@ public: int columnCount(const QModelIndex &parent = QModelIndex()) const; QVariant data(const QModelIndex &index, int role) const; QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const; - CardInfo const *getCard(int index) const { return cardList[index]; } + CardInfo *getCard(int index) const { return cardList[index]; } private: QList cardList; CardDatabase *db; private slots: void updateCardList(); + void cardAdded(CardInfo *card); + void cardRemoved(CardInfo *card); + void cardInfoChanged(CardInfo *card); }; class CardDatabaseDisplayModel : public QSortFilterProxyModel { diff --git a/cockatrice/src/dlg_create_token.cpp b/cockatrice/src/dlg_create_token.cpp index 62ec4076..21d2eeac 100644 --- a/cockatrice/src/dlg_create_token.cpp +++ b/cockatrice/src/dlg_create_token.cpp @@ -123,7 +123,7 @@ DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *pa void DlgCreateToken::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex & /*previous*/) { const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); - const CardInfo *cardInfo = cardDatabaseModel->getCard(realIndex.row()); + const CardInfo *cardInfo = current.row() >= 0 ? cardDatabaseModel->getCard(realIndex.row()) : db->getCard(); nameEdit->setText(cardInfo->getName()); const QString cardColor = cardInfo->getColors().isEmpty() ? QString() : (cardInfo->getColors().size() > 1 ? QString("m") : cardInfo->getColors().first()); diff --git a/cockatrice/src/dlg_edit_tokens.cpp b/cockatrice/src/dlg_edit_tokens.cpp new file mode 100644 index 00000000..a276460f --- /dev/null +++ b/cockatrice/src/dlg_edit_tokens.cpp @@ -0,0 +1,176 @@ +#include "dlg_edit_tokens.h" +#include "carddatabasemodel.h" +#include "main.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +DlgEditTokens::DlgEditTokens(QWidget *parent) + : QDialog(parent), currentCard(0) +{ + nameLabel = new QLabel(tr("&Name:")); + nameEdit = new QLineEdit; + nameEdit->setEnabled(false); + nameLabel->setBuddy(nameEdit); + + colorLabel = new QLabel(tr("C&olor:")); + colorEdit = new QComboBox; + colorEdit->addItem(tr("white"), "w"); + colorEdit->addItem(tr("blue"), "u"); + colorEdit->addItem(tr("black"), "b"); + colorEdit->addItem(tr("red"), "r"); + colorEdit->addItem(tr("green"), "g"); + colorEdit->addItem(tr("multicolor"), "m"); + colorEdit->addItem(tr("colorless"), QString()); + colorLabel->setBuddy(colorEdit); + connect(colorEdit, SIGNAL(currentIndexChanged(int)), this, SLOT(colorChanged(int))); + + ptLabel = new QLabel(tr("&P/T:")); + ptEdit = new QLineEdit; + ptLabel->setBuddy(ptEdit); + connect(ptEdit, SIGNAL(textChanged(QString)), this, SLOT(ptChanged(QString))); + + annotationLabel = new QLabel(tr("&Annotation:")); + annotationEdit = new QLineEdit; + annotationLabel->setBuddy(annotationEdit); + connect(annotationEdit, SIGNAL(textChanged(QString)), this, SLOT(annotationChanged(QString))); + + QGridLayout *grid = new QGridLayout; + grid->addWidget(nameLabel, 0, 0); + grid->addWidget(nameEdit, 0, 1); + grid->addWidget(colorLabel, 1, 0); + grid->addWidget(colorEdit, 1, 1); + grid->addWidget(ptLabel, 2, 0); + grid->addWidget(ptEdit, 2, 1); + grid->addWidget(annotationLabel, 3, 0); + grid->addWidget(annotationEdit, 3, 1); + + QGroupBox *tokenDataGroupBox = new QGroupBox(tr("Token data")); + tokenDataGroupBox->setLayout(grid); + + cardDatabaseModel = new CardDatabaseModel(db, this); + cardDatabaseDisplayModel = new CardDatabaseDisplayModel(this); + cardDatabaseDisplayModel->setSourceModel(cardDatabaseModel); + cardDatabaseDisplayModel->setIsToken(CardDatabaseDisplayModel::ShowTrue); + + chooseTokenView = new QTreeView; + chooseTokenView->setModel(cardDatabaseDisplayModel); + chooseTokenView->setUniformRowHeights(true); + chooseTokenView->setRootIsDecorated(false); + chooseTokenView->setAlternatingRowColors(true); + chooseTokenView->setSortingEnabled(true); + chooseTokenView->sortByColumn(0, Qt::AscendingOrder); + chooseTokenView->resizeColumnToContents(0); + chooseTokenView->header()->setStretchLastSection(false); + chooseTokenView->header()->hideSection(1); + chooseTokenView->header()->hideSection(2); + chooseTokenView->header()->setResizeMode(3, QHeaderView::ResizeToContents); + chooseTokenView->header()->setResizeMode(4, QHeaderView::ResizeToContents); + connect(chooseTokenView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SLOT(tokenSelectionChanged(QModelIndex, QModelIndex))); + + QAction *aAddToken = new QAction(tr("Add token"), this); + aAddToken->setIcon(QIcon(":/resources/increment.svg")); + connect(aAddToken, SIGNAL(triggered()), this, SLOT(actAddToken())); + QAction *aRemoveToken = new QAction(tr("Remove token"), this); + aRemoveToken->setIcon(QIcon(":/resources/decrement.svg")); + connect(aRemoveToken, SIGNAL(triggered()), this, SLOT(actRemoveToken())); + + QToolBar *databaseToolBar = new QToolBar; + databaseToolBar->addAction(aAddToken); + databaseToolBar->addAction(aRemoveToken); + + QVBoxLayout *leftVBox = new QVBoxLayout; + leftVBox->addWidget(chooseTokenView); + leftVBox->addWidget(databaseToolBar); + + QHBoxLayout *hbox = new QHBoxLayout; + hbox->addLayout(leftVBox); + hbox->addWidget(tokenDataGroupBox); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Close); + connect(buttonBox, SIGNAL(accepted()), this, SLOT(accept())); + connect(buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + + QVBoxLayout *mainLayout = new QVBoxLayout; + mainLayout->addLayout(hbox); + mainLayout->addWidget(buttonBox); + + setLayout(mainLayout); + setWindowTitle(tr("Edit tokens")); +} + +void DlgEditTokens::tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous) +{ + const QModelIndex realIndex = cardDatabaseDisplayModel->mapToSource(current); + CardInfo *cardInfo = current.row() >= 0 ? cardDatabaseModel->getCard(realIndex.row()) : db->getCard(); + if (!cardInfo->getName().isEmpty()) + currentCard = cardInfo; + else + currentCard = 0; + + nameEdit->setText(cardInfo->getName()); + const QString cardColor = cardInfo->getColors().isEmpty() ? QString() : (cardInfo->getColors().size() > 1 ? QString("m") : cardInfo->getColors().first()); + colorEdit->setCurrentIndex(colorEdit->findData(cardColor, Qt::UserRole, Qt::MatchFixedString)); + ptEdit->setText(cardInfo->getPowTough()); + annotationEdit->setText(cardInfo->getText()); +} + +void DlgEditTokens::actAddToken() +{ + QString name; + bool askAgain; + do { + name = QInputDialog::getText(this, tr("Add token"), tr("Please enter the name of the token:")); + if (!name.isEmpty() && db->getCard(name, false)) { + QMessageBox::critical(this, tr("Error"), tr("The chosen name conflicts with an existing card or token.")); + askAgain = true; + } else + askAgain = false; + } while (askAgain); + + if (name.isEmpty()) + return; + + CardInfo *card = new CardInfo(db, name, true); + card->addToSet(db->getSet("TK")); + card->setCardType("Token"); + db->addCard(card); +} + +void DlgEditTokens::actRemoveToken() +{ + if (currentCard) { + db->removeCard(currentCard); + delete currentCard; + currentCard = 0; + } +} + +void DlgEditTokens::colorChanged(int colorIndex) +{ + if (currentCard) + currentCard->setColors(QStringList() << colorEdit->itemData(colorIndex).toString()); +} + +void DlgEditTokens::ptChanged(const QString &_pt) +{ + if (currentCard) + currentCard->setPowTough(_pt); +} + +void DlgEditTokens::annotationChanged(const QString &_annotation) +{ + if (currentCard) + currentCard->setText(_annotation); +} diff --git a/cockatrice/src/dlg_edit_tokens.h b/cockatrice/src/dlg_edit_tokens.h new file mode 100644 index 00000000..28aa6b2d --- /dev/null +++ b/cockatrice/src/dlg_edit_tokens.h @@ -0,0 +1,38 @@ +#ifndef DLG_EDIT_TOKENS_H +#define DLG_EDIT_TOKENS_H + +#include + +class QModelIndex; +class CardDatabaseModel; +class CardDatabaseDisplayModel; +class QLabel; +class QComboBox; +class QLineEdit; +class QTreeView; +class CardInfo; + +class DlgEditTokens : public QDialog { + Q_OBJECT +private slots: + void tokenSelectionChanged(const QModelIndex ¤t, const QModelIndex &previous); + void colorChanged(int _colorIndex); + void ptChanged(const QString &_pt); + void annotationChanged(const QString &_annotation); + + void actAddToken(); + void actRemoveToken(); +private: + CardInfo *currentCard; + CardDatabaseModel *cardDatabaseModel; + CardDatabaseDisplayModel *cardDatabaseDisplayModel; + QStringList predefinedTokens; + QLabel *nameLabel, *colorLabel, *ptLabel, *annotationLabel; + QComboBox *colorEdit; + QLineEdit *nameEdit, *ptEdit, *annotationEdit; + QTreeView *chooseTokenView; +public: + DlgEditTokens(QWidget *parent = 0); +}; + +#endif diff --git a/cockatrice/src/dlg_settings.cpp b/cockatrice/src/dlg_settings.cpp index ab9b6fe7..3406ac14 100644 --- a/cockatrice/src/dlg_settings.cpp +++ b/cockatrice/src/dlg_settings.cpp @@ -27,8 +27,6 @@ GeneralSettingsPage::GeneralSettingsPage() { languageLabel = new QLabel; languageBox = new QComboBox; - customTranslationButton = new QPushButton("..."); - customTranslationButton->setMaximumWidth(50); QString setLanguage = settingsCache->getLang(); QStringList qmFiles = findQmFiles(); @@ -43,14 +41,12 @@ GeneralSettingsPage::GeneralSettingsPage() picDownloadCheckBox->setChecked(settingsCache->getPicDownload()); connect(languageBox, SIGNAL(currentIndexChanged(int)), this, SLOT(languageBoxChanged(int))); - connect(customTranslationButton, SIGNAL(clicked()), this, SLOT(customTranslationButtonClicked())); connect(picDownloadCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setPicDownload(int))); QGridLayout *personalGrid = new QGridLayout; personalGrid->addWidget(languageLabel, 0, 0); personalGrid->addWidget(languageBox, 0, 1); - personalGrid->addWidget(customTranslationButton, 0, 2); - personalGrid->addWidget(picDownloadCheckBox, 1, 0, 1, 3); + personalGrid->addWidget(picDownloadCheckBox, 1, 0, 1, 2); personalGroupBox = new QGroupBox; personalGroupBox->setLayout(personalGrid); @@ -79,6 +75,12 @@ GeneralSettingsPage::GeneralSettingsPage() QPushButton *cardDatabasePathButton = new QPushButton("..."); connect(cardDatabasePathButton, SIGNAL(clicked()), this, SLOT(cardDatabasePathButtonClicked())); + tokenDatabasePathLabel = new QLabel; + tokenDatabasePathEdit = new QLineEdit(settingsCache->getTokenDatabasePath()); + tokenDatabasePathEdit->setReadOnly(true); + QPushButton *tokenDatabasePathButton = new QPushButton("..."); + connect(tokenDatabasePathButton, SIGNAL(clicked()), this, SLOT(tokenDatabasePathButtonClicked())); + QGridLayout *pathsGrid = new QGridLayout; pathsGrid->addWidget(deckPathLabel, 0, 0); pathsGrid->addWidget(deckPathEdit, 0, 1); @@ -92,6 +94,9 @@ GeneralSettingsPage::GeneralSettingsPage() pathsGrid->addWidget(cardDatabasePathLabel, 3, 0); pathsGrid->addWidget(cardDatabasePathEdit, 3, 1); pathsGrid->addWidget(cardDatabasePathButton, 3, 2); + pathsGrid->addWidget(tokenDatabasePathLabel, 4, 0); + pathsGrid->addWidget(tokenDatabasePathEdit, 4, 1); + pathsGrid->addWidget(tokenDatabasePathButton, 4, 2); pathsGroupBox = new QGroupBox; pathsGroupBox->setLayout(pathsGrid); @@ -158,19 +163,19 @@ void GeneralSettingsPage::cardDatabasePathButtonClicked() settingsCache->setCardDatabasePath(path); } -void GeneralSettingsPage::languageBoxChanged(int index) -{ - settingsCache->setCustomTranslationFile(QString()); - settingsCache->setLang(languageBox->itemData(index).toString()); -} - -void GeneralSettingsPage::customTranslationButtonClicked() +void GeneralSettingsPage::tokenDatabasePathButtonClicked() { QString path = QFileDialog::getOpenFileName(this, tr("Choose path")); if (path.isEmpty()) return; - settingsCache->setCustomTranslationFile(path); + tokenDatabasePathEdit->setText(path); + settingsCache->setTokenDatabasePath(path); +} + +void GeneralSettingsPage::languageBoxChanged(int index) +{ + settingsCache->setLang(languageBox->itemData(index).toString()); } void GeneralSettingsPage::retranslateUi() @@ -183,6 +188,7 @@ void GeneralSettingsPage::retranslateUi() replaysPathLabel->setText(tr("Replays directory:")); picsPathLabel->setText(tr("Pictures directory:")); cardDatabasePathLabel->setText(tr("Path to card database:")); + tokenDatabasePathLabel->setText(tr("Path to token database:")); } AppearanceSettingsPage::AppearanceSettingsPage() @@ -590,7 +596,6 @@ DlgSettings::DlgSettings(QWidget *parent) : QDialog(parent) { connect(settingsCache, SIGNAL(langChanged()), this, SLOT(updateLanguage())); - connect(settingsCache, SIGNAL(customTranslationFileChanged()), this, SLOT(updateLanguage())); contentsWidget = new QListWidget; contentsWidget->setViewMode(QListView::IconMode); diff --git a/cockatrice/src/dlg_settings.h b/cockatrice/src/dlg_settings.h index c3b9f0a7..b00f7ce1 100644 --- a/cockatrice/src/dlg_settings.h +++ b/cockatrice/src/dlg_settings.h @@ -27,21 +27,20 @@ public: GeneralSettingsPage(); void retranslateUi(); private slots: - void customTranslationButtonClicked(); void deckPathButtonClicked(); void replaysPathButtonClicked(); void picsPathButtonClicked(); void cardDatabasePathButtonClicked(); + void tokenDatabasePathButtonClicked(); void languageBoxChanged(int index); private: QStringList findQmFiles(); QString languageName(const QString &qmFile); - QPushButton *customTranslationButton; - QLineEdit *deckPathEdit, *replaysPathEdit, *picsPathEdit, *cardDatabasePathEdit; + QLineEdit *deckPathEdit, *replaysPathEdit, *picsPathEdit, *cardDatabasePathEdit, *tokenDatabasePathEdit; QGroupBox *personalGroupBox, *pathsGroupBox; QComboBox *languageBox; QCheckBox *picDownloadCheckBox; - QLabel *languageLabel, *deckPathLabel, *replaysPathLabel, *picsPathLabel, *cardDatabasePathLabel; + QLabel *languageLabel, *deckPathLabel, *replaysPathLabel, *picsPathLabel, *cardDatabasePathLabel, *tokenDatabasePathLabel; }; class AppearanceSettingsPage : public AbstractSettingsPage { diff --git a/cockatrice/src/main.cpp b/cockatrice/src/main.cpp index 69bc521e..6efaf5db 100644 --- a/cockatrice/src/main.cpp +++ b/cockatrice/src/main.cpp @@ -71,10 +71,7 @@ void installNewTranslator() qApp->installTranslator(qtTranslator); if (!translationPath.startsWith("/")) translationPath.prepend(qApp->applicationDirPath() + "/"); - if (!settingsCache->getCustomTranslationFile().isEmpty()) - translator->load(settingsCache->getCustomTranslationFile()); - else - translator->load(translationPrefix + "_" + lang, translationPath); + translator->load(translationPrefix + "_" + lang, translationPath); qApp->installTranslator(translator); } @@ -117,6 +114,8 @@ int main(int argc, char *argv[]) if (!db->getLoadSuccess()) if (db->loadCardDatabase(dataDir + "/cards.xml")) settingsCache->setCardDatabasePath(dataDir + "/cards.xml"); + if (settingsCache->getTokenDatabasePath().isEmpty()) + settingsCache->setTokenDatabasePath(dataDir + "/tokens.xml"); if (!QDir(settingsCache->getDeckPath()).exists() || settingsCache->getDeckPath().isEmpty()) { QDir().mkpath(dataDir + "/decks"); settingsCache->setDeckPath(dataDir + "/decks"); diff --git a/cockatrice/src/settingscache.cpp b/cockatrice/src/settingscache.cpp index 57e15b5f..2337e11d 100644 --- a/cockatrice/src/settingscache.cpp +++ b/cockatrice/src/settingscache.cpp @@ -5,13 +5,13 @@ SettingsCache::SettingsCache() { settings = new QSettings(this); - customTranslationFile = settings->value("personal/custom_translation").toString(); lang = settings->value("personal/lang").toString(); deckPath = settings->value("paths/decks").toString(); replaysPath = settings->value("paths/replays").toString(); picsPath = settings->value("paths/pics").toString(); cardDatabasePath = settings->value("paths/carddatabase").toString(); + tokenDatabasePath = settings->value("paths/tokendatabase").toString(); handBgPath = settings->value("zonebg/hand").toString(); stackBgPath = settings->value("zonebg/stack").toString(); @@ -41,13 +41,6 @@ SettingsCache::SettingsCache() ignoreUnregisteredUsers = settings->value("chat/ignore_unregistered", false).toBool(); } -void SettingsCache::setCustomTranslationFile(const QString &_customTranslationFile) -{ - customTranslationFile = _customTranslationFile; - settings->setValue("personal/custom_translation", customTranslationFile); - emit customTranslationFileChanged(); -} - void SettingsCache::setLang(const QString &_lang) { lang = _lang; @@ -81,6 +74,13 @@ void SettingsCache::setCardDatabasePath(const QString &_cardDatabasePath) emit cardDatabasePathChanged(); } +void SettingsCache::setTokenDatabasePath(const QString &_tokenDatabasePath) +{ + tokenDatabasePath = _tokenDatabasePath; + settings->setValue("paths/tokendatabase", tokenDatabasePath); + emit tokenDatabasePathChanged(); +} + void SettingsCache::setHandBgPath(const QString &_handBgPath) { handBgPath = _handBgPath; diff --git a/cockatrice/src/settingscache.h b/cockatrice/src/settingscache.h index c4c764aa..f07ca94b 100644 --- a/cockatrice/src/settingscache.h +++ b/cockatrice/src/settingscache.h @@ -8,10 +8,10 @@ class QSettings; class SettingsCache : public QObject { Q_OBJECT signals: - void customTranslationFileChanged(); void langChanged(); void picsPathChanged(); void cardDatabasePathChanged(); + void tokenDatabasePathChanged(); void handBgPathChanged(); void stackBgPathChanged(); void tableBgPathChanged(); @@ -29,8 +29,8 @@ private: QSettings *settings; QByteArray mainWindowGeometry; - QString customTranslationFile, lang; - QString deckPath, replaysPath, picsPath, cardDatabasePath; + QString lang; + QString deckPath, replaysPath, picsPath, cardDatabasePath, tokenDatabasePath; QString handBgPath, stackBgPath, tableBgPath, playerBgPath, cardBackPicturePath; bool picDownload; bool doubleClickToPlay; @@ -49,12 +49,12 @@ private: public: SettingsCache(); const QByteArray &getMainWindowGeometry() const { return mainWindowGeometry; } - QString getCustomTranslationFile() const { return customTranslationFile; } QString getLang() const { return lang; } QString getDeckPath() const { return deckPath; } QString getReplaysPath() const { return replaysPath; } QString getPicsPath() const { return picsPath; } QString getCardDatabasePath() const { return cardDatabasePath; } + QString getTokenDatabasePath() const { return tokenDatabasePath; } QString getHandBgPath() const { return handBgPath; } QString getStackBgPath() const { return stackBgPath; } QString getTableBgPath() const { return tableBgPath; } @@ -77,12 +77,12 @@ public: bool getIgnoreUnregisteredUsers() const { return ignoreUnregisteredUsers; } public slots: void setMainWindowGeometry(const QByteArray &_mainWindowGeometry); - void setCustomTranslationFile(const QString &_customTranslationFile); void setLang(const QString &_lang); void setDeckPath(const QString &_deckPath); void setReplaysPath(const QString &_replaysPath); void setPicsPath(const QString &_picsPath); void setCardDatabasePath(const QString &_cardDatabasePath); + void setTokenDatabasePath(const QString &_tokenDatabasePath); void setHandBgPath(const QString &_handBgPath); void setStackBgPath(const QString &_stackBgPath); void setTableBgPath(const QString &_tableBgPath); diff --git a/cockatrice/src/tab_deck_editor.cpp b/cockatrice/src/tab_deck_editor.cpp index 42fc6f74..f7abd9a9 100644 --- a/cockatrice/src/tab_deck_editor.cpp +++ b/cockatrice/src/tab_deck_editor.cpp @@ -24,6 +24,7 @@ #include "cardinfowidget.h" #include "dlg_cardsearch.h" #include "dlg_load_deck_from_clipboard.h" +#include "dlg_edit_tokens.h" #include "main.h" #include "settingscache.h" #include "priceupdater.h" @@ -41,7 +42,7 @@ void SearchLineEdit::keyPressEvent(QKeyEvent *event) } TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) - : Tab(_tabSupervisor, parent) + : Tab(_tabSupervisor, parent), modified(false) { aSearch = new QAction(QString(), this); aSearch->setIcon(QIcon(":/resources/icon_search.svg")); @@ -161,8 +162,6 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) mainLayout->addLayout(rightFrame, 10); setLayout(mainLayout); - setWindowTitle(tr("Deck editor [*]")); - aNewDeck = new QAction(QString(), this); aNewDeck->setShortcuts(QKeySequence::New); connect(aNewDeck, SIGNAL(triggered()), this, SLOT(actNewDeck())); @@ -181,15 +180,16 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) aSaveDeckToClipboard = new QAction(QString(), this); connect(aSaveDeckToClipboard, SIGNAL(triggered()), this, SLOT(actSaveDeckToClipboard())); aSaveDeckToClipboard->setShortcuts(QKeySequence::Copy); - aPrintDeck = new QAction(tr("&Print deck..."), this); + aPrintDeck = new QAction(QString(), this); aPrintDeck->setShortcuts(QKeySequence::Print); connect(aPrintDeck, SIGNAL(triggered()), this, SLOT(actPrintDeck())); - aClose = new QAction(tr("&Close"), this); - aClose->setShortcut(tr("Ctrl+Q")); + aClose = new QAction(QString(), this); connect(aClose, SIGNAL(triggered()), this, SLOT(closeRequest())); - aEditSets = new QAction(tr("&Edit sets..."), this); + aEditSets = new QAction(QString(), this); connect(aEditSets, SIGNAL(triggered()), this, SLOT(actEditSets())); + aEditTokens = new QAction(QString(), this); + connect(aEditTokens, SIGNAL(triggered()), this, SLOT(actEditTokens())); deckMenu = new QMenu(this); deckMenu->addAction(aNewDeck); @@ -207,6 +207,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent) dbMenu = new QMenu(this); dbMenu->addAction(aEditSets); + dbMenu->addAction(aEditTokens); dbMenu->addSeparator(); dbMenu->addAction(aSearch); dbMenu->addAction(aClearSearch); @@ -266,6 +267,9 @@ void TabDeckEditor::retranslateUi() aSaveDeckAs->setText(tr("Save deck &as...")); aLoadDeckFromClipboard->setText(tr("Load deck from cl&ipboard...")); aSaveDeckToClipboard->setText(tr("Save deck to clip&board")); + aPrintDeck->setText(tr("&Print deck...")); + aClose->setText(tr("&Close")); + aClose->setShortcut(tr("Ctrl+Q")); aAddCard->setText(tr("Add card to &maindeck")); aAddCard->setShortcuts(QList() << QKeySequence(tr("Return")) << QKeySequence(tr("Enter"))); @@ -280,12 +284,15 @@ void TabDeckEditor::retranslateUi() deckMenu->setTitle(tr("&Deck editor")); dbMenu->setTitle(tr("C&ard database")); + + aEditSets->setText(tr("&Edit sets...")); + aEditTokens->setText(tr("Edit &tokens...")); } QString TabDeckEditor::getTabText() const { QString result = tr("Deck: %1").arg(nameEdit->text()); - if (isWindowModified()) + if (modified) result.prepend("* "); return result; } @@ -293,13 +300,13 @@ QString TabDeckEditor::getTabText() const void TabDeckEditor::updateName(const QString &name) { deckModel->getDeckList()->setName(name); - setWindowModified(true); + setModified(true); } void TabDeckEditor::updateComments() { deckModel->getDeckList()->setComments(commentsEdit->toPlainText()); - setWindowModified(true); + setModified(true); } void TabDeckEditor::updateCardInfoLeft(const QModelIndex ¤t, const QModelIndex &/*previous*/) @@ -330,7 +337,7 @@ void TabDeckEditor::updateHash() bool TabDeckEditor::confirmClose() { - if (isWindowModified()) { + if (modified) { 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); @@ -357,7 +364,7 @@ void TabDeckEditor::actNewDeck() nameEdit->setText(QString()); commentsEdit->setText(QString()); hashLabel->setText(QString()); - setWindowModified(false); + setModified(false); } void TabDeckEditor::actLoadDeck() @@ -386,7 +393,7 @@ void TabDeckEditor::saveDeckRemoteFinished(const Response &response) if (response.response_code() != Response::RespOk) QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.")); else - setWindowModified(false); + setModified(false); } bool TabDeckEditor::actSaveDeck() @@ -405,7 +412,7 @@ bool TabDeckEditor::actSaveDeck() } else if (deck->getLastFileName().isEmpty()) return actSaveDeckAs(); else if (deck->saveToFile(deck->getLastFileName(), deck->getLastFileFormat())) { - setWindowModified(false); + setModified(false); return true; } QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); @@ -431,7 +438,7 @@ bool TabDeckEditor::actSaveDeckAs() QMessageBox::critical(this, tr("Error"), tr("The deck could not be saved.\nPlease check that the directory is writable and try again.")); return false; } - setWindowModified(false); + setModified(false); return true; } @@ -445,7 +452,7 @@ void TabDeckEditor::actLoadDeckFromClipboard() return; setDeck(dlg.getDeckList()); - setWindowModified(true); + setModified(true); } void TabDeckEditor::actSaveDeckToClipboard() @@ -471,6 +478,13 @@ void TabDeckEditor::actEditSets() w->show(); } +void TabDeckEditor::actEditTokens() +{ + DlgEditTokens dlg; + dlg.exec(); + db->saveToFile(settingsCache->getTokenDatabasePath(), true); +} + void TabDeckEditor::actSearch() { if (dlgCardSearch->exec()) { @@ -509,7 +523,7 @@ void TabDeckEditor::addCardHelper(QString zoneName) recursiveExpand(newCardIndex); deckView->setCurrentIndex(newCardIndex); - setWindowModified(true); + setModified(true); } void TabDeckEditor::actAddCard() @@ -528,7 +542,7 @@ void TabDeckEditor::actRemoveCard() if (!currentIndex.isValid() || deckModel->hasChildren(currentIndex)) return; deckModel->removeRow(currentIndex.row(), currentIndex.parent()); - setWindowModified(true); + setModified(true); } void TabDeckEditor::actIncrement() @@ -540,7 +554,7 @@ void TabDeckEditor::actIncrement() const int count = deckModel->data(numberIndex, Qt::EditRole).toInt(); deckView->setCurrentIndex(numberIndex); deckModel->setData(numberIndex, count + 1, Qt::EditRole); - setWindowModified(true); + setModified(true); } void TabDeckEditor::actDecrement() @@ -555,7 +569,7 @@ void TabDeckEditor::actDecrement() deckModel->removeRow(currentIndex.row(), currentIndex.parent()); else deckModel->setData(numberIndex, count - 1, Qt::EditRole); - setWindowModified(true); + setModified(true); } void TabDeckEditor::actUpdatePrices() @@ -569,7 +583,7 @@ void TabDeckEditor::actUpdatePrices() void TabDeckEditor::finishedUpdatingPrices() { deckModel->pricesUpdated(); - setWindowModified(true); + setModified(true); aUpdatePrices->setDisabled(false); } @@ -582,15 +596,15 @@ void TabDeckEditor::setDeck(DeckLoader *_deck) updateHash(); deckModel->sort(1); deckView->expandAll(); - setWindowModified(false); + setModified(false); db->cacheCardPixmaps(deckModel->getDeckList()->getCardList()); deckView->expandAll(); - setWindowModified(false); + setModified(false); } -void TabDeckEditor::setWindowModified(bool _windowModified) +void TabDeckEditor::setModified(bool _modified) { - Tab::setWindowModified(_windowModified); + modified = _modified; emit tabTextChanged(this, getTabText()); } diff --git a/cockatrice/src/tab_deck_editor.h b/cockatrice/src/tab_deck_editor.h index f4fba405..826825d3 100644 --- a/cockatrice/src/tab_deck_editor.h +++ b/cockatrice/src/tab_deck_editor.h @@ -46,6 +46,7 @@ private slots: void actPrintDeck(); void actEditSets(); + void actEditTokens(); void actSearch(); void actClearSearch(); @@ -82,15 +83,17 @@ private: QMenu *deckMenu, *dbMenu; QAction *aNewDeck, *aLoadDeck, *aSaveDeck, *aSaveDeckAs, *aLoadDeckFromClipboard, *aSaveDeckToClipboard, *aPrintDeck, *aClose; - QAction *aEditSets, *aSearch, *aClearSearch; + QAction *aEditSets, *aEditTokens, *aSearch, *aClearSearch; QAction *aAddCard, *aAddCardToSideboard, *aRemoveCard, *aIncrement, *aDecrement, *aUpdatePrices; + + bool modified; public: TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent = 0); ~TabDeckEditor(); void retranslateUi(); QString getTabText() const; void setDeck(DeckLoader *_deckLoader); - void setWindowModified(bool _windowModified); + void setModified(bool _windowModified); public slots: void closeRequest(); signals: