Commit 55f3e931 authored by ctrlaltca's avatar ctrlaltca
Browse files

Merge pull request #1859 from ctrlaltca/carddb

Rework some parts of the card database
parents 830a4c2f e94f59d7
......@@ -5,7 +5,8 @@
# This file sets all the variables shared between the projects
# like the installation path, compilation flags etc..
cmake_minimum_required(VERSION 2.6)
# Cmake 3.1 is required to enable C++11 support correctly
cmake_minimum_required(VERSION 3.1)
if(POLICY CMP0020)
cmake_policy(SET CMP0020 OLD)
......@@ -36,6 +37,9 @@ ENDIF()
# A project name is needed for CPack
PROJECT("${PROJECT_NAME}")
# Use c++11 for all targets
set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ ISO Standard")
set(CMAKE_CXX_STANDARD_REQUIRED True)
# Set conventional loops
set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true)
......@@ -171,7 +175,7 @@ IF(WIN32)
ENDIF()
# Package builder
set(CPACK_PACKAGE_CONTACT "Daenyth+github@gmail.com")
set(CPACK_PACKAGE_CONTACT "Gavin Bisesi <Daenyth+github@gmail.com>")
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_NAME})
set(CPACK_PACKAGE_VENDOR "Cockatrice Development Team")
set(CPACK_PACKAGE_DESCRIPTION_FILE "${PROJECT_SOURCE_DIR}/README.md")
......
......@@ -16,9 +16,8 @@ InstallDir "$PROGRAMFILES\Cockatrice"
!define MUI_HEADERIMAGE_BITMAP "${NSIS_SOURCE_PATH}\cmake\headerimage.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "${NSIS_SOURCE_PATH}\cmake\headerimage.bmp"
!define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of Cockatrice.$\r$\n$\r$\nClick Next to continue."
!define MUI_FINISHPAGE_RUN "$INSTDIR/oracle.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Run 'Oracle' now to update your card database"
!define MUI_FINISHPAGE_RUN_PARAMETERS "-dlsets"
!define MUI_FINISHPAGE_RUN "$INSTDIR/cockatrice.exe"
!define MUI_FINISHPAGE_RUN_TEXT "Run 'Cockatrice' now"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_LICENSE "${NSIS_SOURCE_PATH}\COPYING"
......@@ -68,22 +67,20 @@ Section "Start menu item" SecStartMenu
createShortCut "$SMPROGRAMS\Cockatrice\Cockatrice.lnk" "$INSTDIR\cockatrice.exe"
createShortCut "$SMPROGRAMS\Cockatrice\Oracle.lnk" "$INSTDIR\oracle.exe"
createShortCut "$SMPROGRAMS\Cockatrice\Servatrice.lnk" "$INSTDIR\servatrice.exe"
createShortCut "$SMPROGRAMS\Cockatrice\Usermanual.lnk" "$INSTDIR\Usermanual.pdf"
SectionEnd
Section "un.Application" UnSecApplication
SetShellVarContext all
RMDir /r "$INSTDIR\zonebg"
RMDir /r "$INSTDIR\plugins"
RMDir /r "$INSTDIR\sounds"
RMDir /r "$INSTDIR\themes"
RMDir /r "$INSTDIR\translations"
Delete "$INSTDIR\uninstall.exe"
Delete "$INSTDIR\cockatrice.exe"
Delete "$INSTDIR\oracle.exe"
Delete "$INSTDIR\servatrice.exe"
Delete "$INSTDIR\Usermanual.pdf"
Delete "$INSTDIR\libprotobuf.lib"
Delete "$INSTDIR\Qt*.dll"
Delete "$INSTDIR\libmysql.dll"
Delete "$INSTDIR\icu*.dll"
Delete "$INSTDIR\libeay32.dll"
Delete "$INSTDIR\ssleay32.dll"
......@@ -91,7 +88,7 @@ Section "un.Application" UnSecApplication
Delete "$INSTDIR\qdebug.txt"
Delete "$INSTDIR\servatrice.sql"
Delete "$INSTDIR\servatrice.ini.example"
Delete "$INSTDIR\zlib1.dll"
Delete "$INSTDIR\zlib*.dll"
RMDir "$INSTDIR"
RMDir "$SMPROGRAMS\Cockatrice"
......
......@@ -7,7 +7,6 @@ PROJECT(cockatrice)
SET(cockatrice_SOURCES
src/abstractcounter.cpp
src/counter_general.cpp
src/dlg_add_set_result.cpp
src/dlg_creategame.cpp
src/dlg_filter_games.cpp
src/dlg_connect.cpp
......@@ -175,6 +174,13 @@ if(Qt5Widgets_FOUND)
include_directories(${Qt5Widgets_INCLUDE_DIRS})
list(APPEND COCKATRICE_LIBS Widgets)
# QtConcurrent
find_package(Qt5Concurrent)
if(Qt5Concurrent_FOUND)
include_directories(${Qt5Concurrent_INCLUDE_DIRS})
list(APPEND ORACLE_LIBS Concurrent)
endif()
# QtNetwork
find_package(Qt5Network)
if(Qt5Network_FOUND)
......@@ -238,8 +244,6 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
# Build cockatrice binary and link it
ADD_EXECUTABLE(cockatrice WIN32 MACOSX_BUNDLE ${cockatrice_SOURCES} ${cockatrice_QM} ${cockatrice_RESOURCES_RCC} ${cockatrice_MOC_SRCS})
set_property(TARGET cockatrice PROPERTY CXX_STANDARD 11)
set_property(TARGET cockatrice PROPERTY CXX_STANDARD_REQUIRED ON)
if(Qt4_FOUND)
if(MSVC)
......
......@@ -7,22 +7,19 @@
#include "round.h"
#endif /* _WIN32 */
#include "carddatabase.h"
#include "cardinfowidget.h"
#include "abstractcarditem.h"
#include "pictureloader.h"
#include "settingscache.h"
#include "main.h"
#include "gamescene.h"
#include <QDebug>
AbstractCardItem::AbstractCardItem(const QString &_name, Player *_owner, int _id, QGraphicsItem *parent)
: ArrowTarget(_owner, parent), infoWidget(0), id(_id), name(_name), tapped(false), facedown(false), tapAngle(0), isHovered(false), realZValue(0)
: ArrowTarget(_owner, parent), id(_id), name(_name), tapped(false), facedown(false), tapAngle(0), bgColor(Qt::transparent), isHovered(false), realZValue(0)
{
setCursor(Qt::OpenHandCursor);
setFlag(ItemIsSelectable);
setCacheMode(DeviceCoordinateCache);
connect(db, SIGNAL(cardListChanged()), this, SLOT(cardInfoUpdated()));
connect(settingsCache, SIGNAL(displayCardNamesChanged()), this, SLOT(callUpdate()));
cardInfoUpdated();
}
......@@ -46,7 +43,11 @@ void AbstractCardItem::pixmapUpdated()
void AbstractCardItem::cardInfoUpdated()
{
info = db->getCard(name);
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated()));
if(info)
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated()));
cacheBgColor();
update();
}
void AbstractCardItem::setRealZValue(qreal _zValue)
......@@ -89,45 +90,35 @@ void AbstractCardItem::transformPainter(QPainter *painter, const QSizeF &transla
void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedSize, int angle)
{
qreal scaleFactor = translatedSize.width() / boundingRect().width();
CardInfo *imageSource = facedown ? db->getCard() : info;
QPixmap translatedPixmap;
// don't even spend time trying to load the picture if our size is too small
if(translatedSize.width() > 10)
PictureLoader::getPixmap(translatedPixmap, imageSource, translatedSize.toSize());
bool paintImage = true;
painter->save();
QColor bgColor = Qt::transparent;
if (translatedPixmap.isNull()) {
QString colorStr;
if (!color.isEmpty())
colorStr = color;
else if (info->getColors().size() > 1)
colorStr = "m";
else if (!info->getColors().isEmpty())
colorStr = info->getColors().first().toLower();
if (colorStr == "b")
bgColor = QColor(0, 0, 0);
else if (colorStr == "u")
bgColor = QColor(0, 140, 180);
else if (colorStr == "w")
bgColor = QColor(255, 250, 140);
else if (colorStr == "r")
bgColor = QColor(230, 0, 0);
else if (colorStr == "g")
bgColor = QColor(0, 160, 0);
else if (colorStr == "m")
bgColor = QColor(250, 190, 30);
else
bgColor = QColor(230, 230, 230);
if(facedown)
{
// never reveal card color, always paint the card back
PictureLoader::getPixmap(translatedPixmap, nullptr, translatedSize.toSize());
} else {
// don't even spend time trying to load the picture if our size is too small
if(translatedSize.width() > 10)
{
PictureLoader::getPixmap(translatedPixmap, info, translatedSize.toSize());
if(translatedPixmap.isNull())
paintImage = false;
} else {
paintImage = false;
}
}
painter->save();
if (paintImage) {
painter->save();
transformPainter(painter, translatedSize, angle);
painter->drawPixmap(QPointF(1, 1), translatedPixmap);
painter->restore();
} else {
painter->setBrush(bgColor);
}
painter->setBrush(bgColor);
QPen pen(Qt::black);
pen.setJoinStyle(Qt::MiterJoin);
......@@ -192,11 +183,11 @@ void AbstractCardItem::setName(const QString &_name)
return;
emit deleteCardInfoPopup(name);
disconnect(info, 0, this, 0);
if(info)
disconnect(info, nullptr, this, nullptr);
name = _name;
info = db->getCard(name);
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(pixmapUpdated()));
update();
cardInfoUpdated();
}
void AbstractCardItem::setHovered(bool _hovered)
......@@ -216,9 +207,47 @@ void AbstractCardItem::setHovered(bool _hovered)
void AbstractCardItem::setColor(const QString &_color)
{
color = _color;
cacheBgColor();
update();
}
void AbstractCardItem::cacheBgColor()
{
QChar colorChar;
if (color.isEmpty())
{
if(info)
colorChar = info->getColorChar();
} else {
colorChar = color.at(0);
}
switch(colorChar.toLower().toLatin1())
{
case 'b':
bgColor = QColor(0, 0, 0);
break;
case 'u':
bgColor = QColor(0, 140, 180);
break;
case 'w':
bgColor = QColor(255, 250, 140);
break;
case 'r':
bgColor = QColor(230, 0, 0);
break;
case 'g':
bgColor = QColor(0, 160, 0);
break;
case 'm':
bgColor = QColor(250, 190, 30);
break;
default:
bgColor = QColor(230, 230, 230);
break;
}
}
void AbstractCardItem::setTapped(bool _tapped, bool canAnimate)
{
if (tapped == _tapped)
......
......@@ -4,9 +4,7 @@
#include "arrowtarget.h"
class CardInfo;
class CardInfoWidget;
class Player;
class QTimer;
const int CARD_WIDTH = 72;
const int CARD_HEIGHT = 102;
......@@ -15,13 +13,13 @@ class AbstractCardItem : public ArrowTarget {
Q_OBJECT
protected:
CardInfo *info;
CardInfoWidget *infoWidget;
int id;
QString name;
bool tapped;
bool facedown;
int tapAngle;
QString color;
QColor bgColor;
private:
bool isHovered;
qreal realZValue;
......@@ -65,6 +63,7 @@ protected:
void mousePressEvent(QGraphicsSceneMouseEvent *event);
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value);
void cacheBgColor();
};
#endif
......@@ -227,9 +227,9 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
if (startZone->getName().compare("hand") == 0) {
startCard->playCard(false);
CardInfo *ci = startCard->getInfo();
if (((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) ||
if (ci && (((!settingsCache->getPlayToStack() && ci->getTableRow() == 3) ||
((settingsCache->getPlayToStack() && ci->getTableRow() != 0) &&
startCard->getZone()->getName().toStdString() != "stack")))
startCard->getZone()->getName().toStdString() != "stack"))))
cmd.set_start_zone("stack");
else
cmd.set_start_zone(settingsCache->getPlayToStack() ? "stack" :"table");
......
#include "carddatabase.h"
#include "pictureloader.h"
#include "settingscache.h"
#include "thememanager.h"
#include <QCryptographicHash>
#include <QDebug>
......@@ -287,6 +286,22 @@ QString CardInfo::simplifyName(const QString &name) {
return simpleName;
}
const QChar CardInfo::getColorChar() const
{
switch(colors.size())
{
case 0:
return QChar();
break;
case 1:
return colors.first().isEmpty() ? QChar() : colors.first().at(0);
break;
default:
return QChar('m');
break;
}
}
static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info)
{
xml.writeStartElement("card");
......@@ -341,39 +356,37 @@ static QXmlStreamWriter &operator<<(QXmlStreamWriter &xml, const CardInfo *info)
}
CardDatabase::CardDatabase(QObject *parent)
: QObject(parent), noCard(0), loadStatus(NotLoaded)
: QObject(parent), loadStatus(NotLoaded)
{
connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabase()));
connect(settingsCache, SIGNAL(tokenDatabasePathChanged()), this, SLOT(loadTokenDatabase()));
noCard = new CardInfo();
connect(settingsCache, SIGNAL(cardDatabasePathChanged()), this, SLOT(loadCardDatabases()));
}
CardDatabase::~CardDatabase()
{
clear();
delete noCard;
}
void CardDatabase::clear()
{
QHashIterator<QString, CardInfo *> i(cards);
while (i.hasNext()) {
i.next();
removeCard(i.value());
i.value()->deleteLater();
}
// The pointers themselves were already deleted, so we don't delete them again.
cards.clear();
simpleNameCards.clear();
QHashIterator<QString, CardSet *> setIt(sets);
while (setIt.hasNext()) {
setIt.next();
delete setIt.value();
}
sets.clear();
QHashIterator<QString, CardInfo *> i(cards);
while (i.hasNext()) {
i.next();
delete i.value();
}
cards.clear();
// The pointers themselves were already deleted, so we don't delete them
// again.
simpleNameCards.clear();
loadStatus = NotLoaded;
}
void CardDatabase::addCard(CardInfo *card)
......@@ -390,22 +403,23 @@ void CardDatabase::removeCard(CardInfo *card)
emit cardRemoved(card);
}
CardInfo *CardDatabase::getCard(const QString &cardName, bool createIfNotFound) {
return getCardFromMap(cards, cardName, createIfNotFound);
CardInfo *CardDatabase::getCard(const QString &cardName) const
{
return getCardFromMap(cards, cardName);
}
QList<CardInfo *> CardDatabase::getCards(const QStringList &cardNames)
QList<CardInfo *> CardDatabase::getCards(const QStringList &cardNames) const
{
QList<CardInfo *> cardInfos;
foreach(QString cardName, cardNames)
cardInfos.append(getCardFromMap(cards, cardName, false));
cardInfos.append(getCardFromMap(cards, cardName));
return cardInfos;
}
CardInfo *CardDatabase::getCardBySimpleName(const QString &cardName, bool createIfNotFound) {
QString simpleName = CardInfo::simplifyName(cardName);
return getCardFromMap(simpleNameCards, simpleName, createIfNotFound);
CardInfo *CardDatabase::getCardBySimpleName(const QString &cardName) const
{
return getCardFromMap(simpleNameCards, CardInfo::simplifyName(cardName));
}
CardSet *CardDatabase::getSet(const QString &setName)
......@@ -459,7 +473,7 @@ void CardDatabase::loadSetsFromXml(QXmlStreamReader &xml)
}
}
void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml, bool tokens)
void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml)
{
while (!xml.atEnd()) {
if (xml.readNext() == QXmlStreamReader::EndElement)
......@@ -518,28 +532,20 @@ void CardDatabase::loadCardsFromXml(QXmlStreamReader &xml, bool tokens)
isToken = xml.readElementText().toInt();
}
if (isToken == tokens) {
addCard(new CardInfo(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards, reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs, muids));
}
addCard(new CardInfo(name, isToken, manacost, cmc, type, pt, text, colors, relatedCards, reverseRelatedCards, upsideDown, loyalty, cipt, tableRow, sets, customPicURLs, muids));
}
}
}
CardInfo *CardDatabase::getCardFromMap(CardNameMap &cardMap, const QString &cardName, bool createIfNotFound) {
CardInfo *CardDatabase::getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const
{
if (cardMap.contains(cardName))
return cardMap.value(cardName);
if (createIfNotFound) {
CardInfo *newCard = new CardInfo(cardName, true);
newCard->addToSet(getSet(CardDatabase::TOKENS_SETNAME));
cardMap.insert(cardName, newCard);
return newCard;
}
return noCard;
return nullptr;
}
LoadStatus CardDatabase::loadFromFile(const QString &fileName, bool tokens)
LoadStatus CardDatabase::loadFromFile(const QString &fileName)
{
QFile file(fileName);
file.open(QIODevice::ReadOnly);
......@@ -562,11 +568,10 @@ LoadStatus CardDatabase::loadFromFile(const QString &fileName, bool tokens)
if (xml.name() == "sets")
loadSetsFromXml(xml);
else if (xml.name() == "cards")
loadCardsFromXml(xml, tokens);
loadCardsFromXml(xml);
}
}
}
qDebug() << cards.size() << "cards in" << sets.size() << "sets loaded";
if (cards.isEmpty()) return NoCards;
......@@ -609,57 +614,59 @@ bool CardDatabase::saveToFile(const QString &fileName, bool tokens)
return true;
}
void CardDatabase::emitCardListChanged()
{
emit cardListChanged();
}
LoadStatus CardDatabase::loadCardDatabase(const QString &path, bool tokens)
LoadStatus CardDatabase::loadCardDatabase(const QString &path)
{
LoadStatus tempLoadStatus = NotLoaded;
if (!path.isEmpty())
tempLoadStatus = loadFromFile(path, tokens);
if (tempLoadStatus == Ok) {
SetList allSets;
QHashIterator<QString, CardSet *> setsIterator(sets);
while (setsIterator.hasNext())
allSets.append(setsIterator.next().value());
allSets.sortByKey();
if(!tokens)
checkUnknownSets();
emit cardListChanged();
}
if (!tokens)
loadStatus = tempLoadStatus;
tempLoadStatus = loadFromFile(path);
qDebug() << "loadCardDatabase(): Path =" << path << "Tokens =" << tokens << "Status =" << loadStatus;
qDebug() << "[CardDatabase] loadCardDatabase(): Path =" << path << "Status =" << tempLoadStatus << "Cards =" << cards.size() << "Sets=" << sets.size();
return tempLoadStatus;
}
LoadStatus CardDatabase::loadCardDatabase()
LoadStatus CardDatabase::loadCardDatabases()
{
return loadCardDatabase(settingsCache->getCardDatabasePath(), false);
}
qDebug() << "CardDatabase::loadCardDatabases start";
// clean old db
clear();
// load main card database
loadStatus = loadCardDatabase(settingsCache->getCardDatabasePath());
// laod tokens database
loadCardDatabase(settingsCache->getTokenDatabasePath());
// load custom card databases
QDir dir(settingsCache->getCustomCardDatabasePath());
foreach(QString fileName, dir.entryList(QStringList("*.xml"), QDir::Files | QDir::Readable, QDir::Name | QDir::IgnoreCase))
{
loadCardDatabase(dir.absoluteFilePath(fileName));
}
LoadStatus CardDatabase::loadTokenDatabase()
{
return loadCardDatabase(settingsCache->getTokenDatabasePath(), true);
}
// AFTER all the cards have been loaded
void CardDatabase::loadCustomCardDatabases(const QString &path)
{
QDir dir(path);
if(!dir.exists())
return;
// reorder sets (TODO: refactor, this smells)
SetList allSets;
QHashIterator<QString, CardSet *> setsIterator(sets);
while (setsIterator.hasNext())
allSets.append(setsIterator.next().value());
allSets.sortByKey();
foreach(QString fileName, dir.entryList(QStringList("*.xml"), QDir::Files | QDir::Readable, QDir::Name | QDir::IgnoreCase))
// resolve the reverse-related tags
refreshCachedReverseRelatedCards();
if(loadStatus == Ok)
{
loadCardDatabase(dir.absoluteFilePath(fileName), false);
// check for unknown sets
checkUnknownSets();
// update deck editors, etc
qDebug() << "CardDatabase::loadCardDatabases success";
} else {
// bring up thr settings dialog
qDebug() << "CardDatabase::loadCardDatabases failed";
emit cardDatabaseLoadingFailed();
}
// return the loadstatus of the main card database.
return loadStatus;
}
void CardDatabase::refreshCachedReverseRelatedCards()
......@@ -716,48 +723,70 @@ void CardDatabase::checkUnknownSets()
{
SetList sets = getSetList();
// no set is enabled. Probably this is the first time running trice
if(!sets.getEnabledSetsNum())
if(sets.getEnabledSetsNum())
{
// if some sets are first found on thus run, ask the user
int numUnknownSets = sets.getUnknownSetsNum();
if(numUnknownSets > 0)
emit cardDatabaseNewSetsFound(numUnknownSets);
} else {
// No set enabled. Probably this is the first time running trice
sets.guessSortKeys();
sets.sortByKey();
sets.enableAll();
notifyEnabledSetsChanged();
detectedFirstRun = true;
return;
emit cardDatabaseAllNewSetsEnabled();
}
}
detectedFirstRun = false;
int numUnknownSets = sets.getUnknownSetsNum();
// no unkown sets.
if(!numUnknownSets)
return;
void CardDatabase::enableAllUnknownSets()
{
SetList sets = getSetList();
sets.enableAllUnknown();
}
QMessageBox msgbox(QMessageBox::Question, tr("New sets found"), tr("%1 new set(s) have been found in the card database. Do you want to enable them?").arg(numUnknownSets), QMessageBox::Yes | QMessageBox::No | QMessageBox::Cancel);
void CardDatabase::markAllSetsAsKnown()
{
SetList sets = getSetList();
sets.markAllAsKnown();
}
switch(msgbox.exec())
{
case QMessageBox::No:
sets.markAllAsKnown();
break;
case QMessageBox::Yes:
sets.enableAllUnknown();
break;
default:
break;
}
void CardDatabase::notifyEnabledSetsChanged()
{
// refresh the list of cached set names
foreach(CardInfo * card, cards)
card->refreshCachedSetNames();
return;
// inform the carddatabasemodels that they need to re-check their list of cards
emit cardDatabaseEnabledSetsChanged();
}
bool CardDatabase::hasDetectedFirstRun()
bool CardDatabase::saveCustomTokensToFile()
{
if(detectedFirstRun)
{
detectedFirstRun=false;
return true;
CardSet * customTokensSet = getSet(CardDatabase::TOKENS_SETNAME);
QString fileName = settingsCache->getCustomCardDatabasePath() + "/" + CardDatabase::TOKENS_SETNAME + ".xml";
QFile file(fileName);
if (!file.open(QIODevice::WriteOnly))
return false;
QXmlStreamWriter xml(&file);
xml.setAutoFormatting(true);
xml.writeStartDocument();
xml.writeStartElement("cockatrice_carddatabase");
xml.writeAttribute("version", QString::number(versionNeeded));
xml.writeStartElement("cards");
QHashIterator<QString, CardInfo *> cardIterator(cards);
while (cardIterator.hasNext()) {
CardInfo *card = cardIterator.next().value();
if(card->getSets().contains(customTokensSet))
xml << card;
}
xml.writeEndElement(); // cards
return false;
}
xml.writeEndElement(); // cockatrice_carddatabase
xml.writeEndDocument();
return true;
}
\ No newline at end of file
......@@ -90,8 +90,6 @@ private:
bool cipt;
int tableRow;
QString pixmapCacheKey;
void refreshCachedSetNames();
public:
CardInfo(const QString &_name = QString(),
bool _isToken = false,
......@@ -131,6 +129,7 @@ public:
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 QChar getColorChar() const;
const QStringList &getColors() const { return colors; }
const QStringList &getRelatedCards() const { return relatedCards; }
const QStringList &getReverseRelatedCards() const { return reverseRelatedCards; }
......@@ -149,6 +148,7 @@ public:
void setMuId(const QString &_set, const int &_muId) { muIds.insert(_set, _muId); }
void addToSet(CardSet *set);
void emitPixmapUpdated() { emit pixmapUpdated(); }
void refreshCachedSetNames();
/**
* Simplify a name to have no punctuation and lowercase all letters, for
......@@ -183,20 +183,15 @@ protected:
*/
SetNameMap sets;
/*
* A dummy card returned by getCard() ad a fallback
*/
CardInfo *noCard;
LoadStatus loadStatus;
bool detectedFirstRun;
private:
static const int versionNeeded;
void loadCardsFromXml(QXmlStreamReader &xml, bool tokens);
void loadCardsFromXml(QXmlStreamReader &xml);
void loadSetsFromXml(QXmlStreamReader &xml);
CardInfo *getCardFromMap(CardNameMap &cardMap, const QString &cardName, bool createIfNotFound);
CardInfo *getCardFromMap(const CardNameMap &cardMap, const QString &cardName) const;
void checkUnknownSets();
void refreshCachedReverseRelatedCards();
public:
static const char* TOKENS_SETNAME;
......@@ -205,38 +200,37 @@ public:
void clear();
void addCard(CardInfo *card);
void removeCard(CardInfo *card);
/*
* Get card object by name. Ensured to return a valid CardInfo * object; check noCard
*/
CardInfo *getCard(const QString &cardName = QString(), bool createIfNotFound = false);
QList <CardInfo *> getCards(const QStringList &cardNames);
CardInfo *getCard(const QString &cardName) const;
QList <CardInfo *> getCards(const QStringList &cardNames) const;
/*
* Get a card by its simple name. The name will be simplified in this
* function, so you don't need to simplify it beforehand.
*/
CardInfo *getCardBySimpleName(const QString &cardName = QString(), bool createIfNotFound = false);
CardInfo *getCardBySimpleName(const QString &cardName) const;
CardSet *getSet(const QString &setName);
QList<CardInfo *> getCardList() const { return cards.values(); }
SetList getSetList() const;
LoadStatus loadFromFile(const QString &fileName, bool tokens = false);
LoadStatus loadFromFile(const QString &fileName);
bool saveToFile(const QString &fileName, bool tokens = false);
bool saveCustomTokensToFile();
QStringList getAllColors() const;
QStringList getAllMainCardTypes() const;
LoadStatus getLoadStatus() const { return loadStatus; }
bool getLoadSuccess() const { return loadStatus == Ok; }
bool hasDetectedFirstRun();
void refreshCachedReverseRelatedCards();
void enableAllUnknownSets();
void markAllSetsAsKnown();
void notifyEnabledSetsChanged();
public slots:
LoadStatus loadCardDatabase();
LoadStatus loadTokenDatabase();
void loadCustomCardDatabases(const QString &path);
void emitCardListChanged();
LoadStatus loadCardDatabases();
private slots:
LoadStatus loadCardDatabase(const QString &path, bool tokens = false);
LoadStatus loadCardDatabase(const QString &path);
signals:
void cardListChanged();
void cardDatabaseLoadingFailed();
void cardDatabaseNewSetsFound(int numUnknownSets);
void cardDatabaseAllNewSetsEnabled();
void cardDatabaseEnabledSetsChanged();
void cardAdded(CardInfo *card);
void cardRemoved(CardInfo *card);
};
......
......@@ -6,10 +6,11 @@
CardDatabaseModel::CardDatabaseModel(CardDatabase *_db, QObject *parent)
: QAbstractListModel(parent), db(_db)
{
connect(db, SIGNAL(cardListChanged()), this, SLOT(updateCardList()));
connect(db, SIGNAL(cardAdded(CardInfo *)), this, SLOT(cardAdded(CardInfo *)));
connect(db, SIGNAL(cardRemoved(CardInfo *)), this, SLOT(cardRemoved(CardInfo *)));
updateCardList();
connect(db, SIGNAL(cardDatabaseEnabledSetsChanged()), this, SLOT(cardDatabaseEnabledSetsChanged()));
cardDatabaseEnabledSetsChanged();
}
CardDatabaseModel::~CardDatabaseModel()
......@@ -63,52 +64,53 @@ QVariant CardDatabaseModel::headerData(int section, Qt::Orientation orientation,
}
}
void CardDatabaseModel::updateCardList()
void CardDatabaseModel::cardInfoChanged(CardInfo *card)
{
beginResetModel();
for (int i = 0; i < cardList.size(); ++i)
disconnect(cardList[i], 0, this, 0);
const int row = cardList.indexOf(card);
if (row == -1)
return;
cardList.clear();
emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1));
}
foreach(CardInfo * card, db->getCardList())
bool CardDatabaseModel::checkCardHasAtLeastOneEnabledSet(CardInfo *card)
{
foreach(CardSet * set, card->getSets())
{
bool hasSet = false;
foreach(CardSet * set, card->getSets())
{
if(set->getEnabled())
{
hasSet = true;
break;
}
}
if(hasSet)
{
cardList.append(card);
connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *)));
}
if(set->getEnabled())
return true;
}
endResetModel();
return false;
}
void CardDatabaseModel::cardInfoChanged(CardInfo *card)
void CardDatabaseModel::cardDatabaseEnabledSetsChanged()
{
const int row = cardList.indexOf(card);
if (row == -1)
return;
emit dataChanged(index(row, 0), index(row, CARDDBMODEL_COLUMNS - 1));
// remove all the cards no more present in at least one enabled set
foreach(CardInfo * card, cardList)
{
if(!checkCardHasAtLeastOneEnabledSet(card))
cardRemoved(card);
}
// re-check all the card currently not shown, maybe their part of a newly-enabled set
foreach(CardInfo * card, db->getCardList())
{
if(!cardList.contains(card))
cardAdded(card);
}
}
void CardDatabaseModel::cardAdded(CardInfo *card)
{
beginInsertRows(QModelIndex(), cardList.size(), cardList.size());
cardList.append(card);
connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *)));
endInsertRows();
if(checkCardHasAtLeastOneEnabledSet(card))
{
// add the card if it's present in at least one enabled set
beginInsertRows(QModelIndex(), cardList.size(), cardList.size());
cardList.append(card);
connect(card, SIGNAL(cardInfoChanged(CardInfo *)), this, SLOT(cardInfoChanged(CardInfo *)));
endInsertRows();
}
}
void CardDatabaseModel::cardRemoved(CardInfo *card)
......@@ -118,6 +120,7 @@ void CardDatabaseModel::cardRemoved(CardInfo *card)
return;
beginRemoveRows(QModelIndex(), row, row);
disconnect(card, 0, this, 0);
cardList.removeAt(row);
endRemoveRows();
}
......@@ -220,3 +223,16 @@ void CardDatabaseDisplayModel::filterTreeChanged()
{
invalidate();
}
TokenDisplayModel::TokenDisplayModel(QObject *parent)
: CardDatabaseDisplayModel(parent)
{
}
bool TokenDisplayModel::filterAcceptsRow(int sourceRow, const QModelIndex & /*sourceParent*/) const
{
CardInfo const *info = static_cast<CardDatabaseModel *>(sourceModel())->getCard(sourceRow);
return info->getIsToken();
}
......@@ -25,11 +25,13 @@ public:
private:
QList<CardInfo *> cardList;
CardDatabase *db;
inline bool checkCardHasAtLeastOneEnabledSet(CardInfo *card);
private slots:
void updateCardList();
void cardAdded(CardInfo *card);
void cardRemoved(CardInfo *card);
void cardInfoChanged(CardInfo *card);
void cardDatabaseEnabledSetsChanged();
};
class CardDatabaseDisplayModel : public QSortFilterProxyModel {
......@@ -66,4 +68,12 @@ private slots:
void filterTreeChanged();
};
class TokenDisplayModel : public CardDatabaseDisplayModel {
Q_OBJECT
public:
TokenDisplayModel(QObject *parent = 0);
protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const;
};
#endif
......@@ -11,7 +11,7 @@
#include <QVBoxLayout>
CardFrame::CardFrame(const QString &cardName, QWidget *parent)
: QTabWidget(parent), info(0), cardTextOnly(false)
: QTabWidget(parent), info(nullptr), cardTextOnly(false)
{
setContentsMargins(3, 3, 3, 3);
pic = new CardInfoPicture();
......@@ -91,9 +91,11 @@ void CardFrame::setViewMode(int mode)
void CardFrame::setCard(CardInfo *card)
{
if (info)
disconnect(info, 0, this, 0);
disconnect(info, nullptr, this, nullptr);
info = card;
connect(info, SIGNAL(destroyed()), this, SLOT(clear()));
if(info)
connect(info, SIGNAL(destroyed()), this, SLOT(clear()));
text->setCard(info);
pic->setCard(info);
}
......@@ -110,5 +112,5 @@ void CardFrame::setCard(AbstractCardItem *card)
void CardFrame::clear()
{
setCard(db->getCard());
setCard((CardInfo*) nullptr);
}
......@@ -11,7 +11,7 @@
CardInfoPicture::CardInfoPicture(QWidget *parent)
: QWidget(parent),
info(0),
info(nullptr),
pixmapDirty(true)
{
setMinimumHeight(100);
......@@ -20,9 +20,10 @@ CardInfoPicture::CardInfoPicture(QWidget *parent)
void CardInfoPicture::setCard(CardInfo *card)
{
if (info)
disconnect(info, 0, this, 0);
disconnect(info, nullptr, this, nullptr);
info = card;
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
if(info)
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
updatePixmap();
}
......@@ -40,14 +41,7 @@ void CardInfoPicture::updatePixmap()
void CardInfoPicture::loadPixmap()
{
if(info)
PictureLoader::getPixmap(resizedPixmap, info, size());
else
resizedPixmap = QPixmap();
if (resizedPixmap.isNull())
PictureLoader::getPixmap(resizedPixmap, db->getCard(), size());
PictureLoader::getPixmap(resizedPixmap, info, size());
}
void CardInfoPicture::paintEvent(QPaintEvent *)
......
......@@ -8,7 +8,7 @@
#include "main.h"
CardInfoText::CardInfoText(QWidget *parent)
: QFrame(parent), info(0)
: QFrame(parent), info(nullptr)
{
nameLabel1 = new QLabel;
nameLabel2 = new QLabel;
......@@ -53,13 +53,24 @@ CardInfoText::CardInfoText(QWidget *parent)
void CardInfoText::setCard(CardInfo *card)
{
nameLabel2->setText(card->getName());
manacostLabel2->setText(card->getManaCost());
colorLabel2->setText(card->getColors().join(""));
cardtypeLabel2->setText(card->getCardType());
powtoughLabel2->setText(card->getPowTough());
loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString());
textLabel->setText(card->getText());
if(card)
{
nameLabel2->setText(card->getName());
manacostLabel2->setText(card->getManaCost());
colorLabel2->setText(card->getColors().join(""));
cardtypeLabel2->setText(card->getCardType());
powtoughLabel2->setText(card->getPowTough());
loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString());
textLabel->setText(card->getText());
} else {
nameLabel2->setText("");
manacostLabel2->setText("");
colorLabel2->setText("");
cardtypeLabel2->setText("");
powtoughLabel2->setText("");
loyaltyLabel2->setText("");
textLabel->setText("");
}
}
void CardInfoText::retranslateUi()
......
#include <QGridLayout>
#include <QLabel>
#include <QTextEdit>
#include <QPushButton>
#include <QStyle>
#include <QMouseEvent>
#include <QVBoxLayout>
#include <QDesktopWidget>
#include "cardinfowidget.h"
#include "carditem.h"
#include "carddatabase.h"
#include "pictureloader.h"
#include "cardinfopicture.h"
#include "cardinfotext.h"
#include "main.h"
#include "settingscache.h"
CardInfoWidget::CardInfoWidget(ResizeMode _mode, const QString &cardName, QWidget *parent, Qt::WindowFlags flags)
CardInfoWidget::CardInfoWidget(const QString &cardName, QWidget *parent, Qt::WindowFlags flags)
: QFrame(parent, flags)
, pixmapWidth(0)
, aspectRatio((qreal) CARD_HEIGHT / (qreal) CARD_WIDTH)
, minimized(settingsCache->getCardInfoMinimized()) // Initialize the cardinfo view status from cache.
, mode(_mode)
, info(0)
, info(nullptr)
{
if (mode == ModeGameTab) {
// Create indexed list of status views for card.
const QStringList cardInfoStatus = QStringList() << tr("Show card only") << tr("Show text only") << tr("Show full info");
// Create droplist for cardinfo view selection, and set right current index.
dropList = new QComboBox();
dropList->addItems(cardInfoStatus);
dropList->setCurrentIndex(minimized);
connect(dropList, SIGNAL(currentIndexChanged(int)), this, SLOT(minimizeClicked(int)));
}
setContentsMargins(3, 3, 3, 3);
pic = new CardInfoPicture();
pic->setObjectName("pic");
text = new CardInfoText();
text->setObjectName("text");
QVBoxLayout * layout = new QVBoxLayout();
layout->setObjectName("layout");
layout->setContentsMargins(0, 0, 0, 0);
layout->setSpacing(0);
layout->addWidget(pic, 0, Qt::AlignCenter);
layout->addWidget(text, 0, Qt::AlignCenter);
setLayout(layout);
cardPicture = new QLabel;
cardPicture->setAlignment(Qt::AlignCenter);
nameLabel1 = new QLabel;
nameLabel2 = new QLabel;
nameLabel2->setWordWrap(true);
manacostLabel1 = new QLabel;
manacostLabel2 = new QLabel;
manacostLabel2->setWordWrap(true);
colorLabel1 = new QLabel;
colorLabel2 = new QLabel;
colorLabel2->setWordWrap(true);
cardtypeLabel1 = new QLabel;
cardtypeLabel2 = new QLabel;
cardtypeLabel2->setWordWrap(true);
powtoughLabel1 = new QLabel;
powtoughLabel2 = new QLabel;
loyaltyLabel1 = new QLabel;
loyaltyLabel2 = new QLabel;
textLabel = new QTextEdit();
textLabel->setReadOnly(true);
QGridLayout *grid = new QGridLayout(this);
int row = 0;
if (mode == ModeGameTab)
grid->addWidget(dropList, row++, 1, 1, 1, Qt::AlignRight);
grid->addWidget(cardPicture, row++, 0, 1, 2);
grid->addWidget(nameLabel1, row, 0);
grid->addWidget(nameLabel2, row++, 1);
grid->addWidget(manacostLabel1, row, 0);
grid->addWidget(manacostLabel2, row++, 1);
grid->addWidget(colorLabel1, row, 0);
grid->addWidget(colorLabel2, row++, 1);
grid->addWidget(cardtypeLabel1, row, 0);
grid->addWidget(cardtypeLabel2, row++, 1);
grid->addWidget(powtoughLabel1, row, 0);
grid->addWidget(powtoughLabel2, row++, 1);
grid->addWidget(loyaltyLabel1, row, 0);
grid->addWidget(loyaltyLabel2, row++, 1);
grid->addWidget(textLabel, row, 0, -1, 2);
grid->setRowStretch(row, 1);
grid->setColumnStretch(1, 1);
retranslateUi();
setFrameStyle(QFrame::Panel | QFrame::Raised);
if (mode == ModeGameTab) {
textLabel->setMinimumHeight(100);
setFixedWidth(sizeHint().width());
} else if (mode == ModePopUp) {
QDesktopWidget desktopWidget;
pixmapWidth = desktopWidget.screenGeometry().height() / 3 / aspectRatio;
setFixedWidth(pixmapWidth + 150);
} else
setFixedWidth(250);
setCard(getCard(cardName));
setMinimized(settingsCache->getCardInfoMinimized());
}
void CardInfoWidget::minimizeClicked(int newMinimized)
{
// Set new status, and store it in the settings cache.
setMinimized(newMinimized);
settingsCache->setCardInfoMinimized(newMinimized);
}
bool CardInfoWidget::shouldShowPowTough()
{
return !info->getPowTough().isEmpty();
}
bool CardInfoWidget::shouldShowLoyalty()
{
return (info->getLoyalty() > 0);
}
void CardInfoWidget::setMinimized(int _minimized)
{
minimized = _minimized;
// Toggle oracle fields according to selected view.
bool showAll = ((minimized == 1) || (minimized == 2));
bool showPowTough = info ? (showAll && shouldShowPowTough()) : true;
bool showLoyalty = info ? (showAll && shouldShowLoyalty()) : true;
if (mode == ModeGameTab) {
nameLabel1->setVisible(showAll);
nameLabel2->setVisible(showAll);
manacostLabel1->setVisible(showAll);
manacostLabel2->setVisible(showAll);
colorLabel1->setVisible(showAll);
colorLabel2->setVisible(showAll);
cardtypeLabel1->setVisible(showAll);
cardtypeLabel2->setVisible(showAll);
powtoughLabel1->setVisible(showPowTough);
powtoughLabel2->setVisible(showPowTough);
loyaltyLabel1->setVisible(showLoyalty);
loyaltyLabel2->setVisible(showLoyalty);
textLabel->setVisible(showAll);
}
cardPicture->hide();
cardHeightOffset = minimumSizeHint().height() + 10;
QDesktopWidget desktopWidget;
int pixmapHeight = desktopWidget.screenGeometry().height() / 3;
int pixmapWidth = pixmapHeight / aspectRatio;
pic->setFixedWidth(pixmapWidth);
pic->setFixedHeight(pixmapHeight);
setFixedWidth(pixmapWidth + 150);
// Set the picture to be shown only at "card only" (0) and "full info" (2)
if (mode == ModeGameTab) {
cardPicture->setVisible((minimized == 0) || (minimized == 2));
if (minimized == 0)
setMaximumHeight(cardHeightOffset + width() * aspectRatio);
else
setMaximumHeight(1000000);
} else
cardPicture->show();
resize(width(), sizeHint().height());
setCard(cardName);
}
void CardInfoWidget::setCard(CardInfo *card)
{
if (info)
disconnect(info, 0, this, 0);
disconnect(info, nullptr, this, nullptr);
info = card;
connect(info, SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
connect(info, SIGNAL(destroyed()), this, SLOT(clear()));
updatePixmap();
nameLabel2->setText(card->getName());
manacostLabel2->setText(card->getManaCost());
colorLabel2->setText(card->getColors().join(""));
cardtypeLabel2->setText(card->getCardType());
powtoughLabel2->setText(card->getPowTough());
loyaltyLabel2->setText(card->getLoyalty() > 0 ? QString::number(card->getLoyalty()) : QString());
textLabel->setText(card->getText());
if(info)
connect(info, SIGNAL(destroyed()), this, SLOT(clear()));
powtoughLabel1->setVisible(shouldShowPowTough());
powtoughLabel2->setVisible(shouldShowPowTough());
loyaltyLabel1->setVisible(shouldShowLoyalty());
loyaltyLabel2->setVisible(shouldShowLoyalty());
text->setCard(info);
pic->setCard(info);
}
void CardInfoWidget::setCard(const QString &cardName)
{
setCard(getCard(cardName));
setCard(db->getCard(cardName));
}
void CardInfoWidget::setCard(AbstractCardItem *card)
......@@ -183,51 +61,5 @@ void CardInfoWidget::setCard(AbstractCardItem *card)
void CardInfoWidget::clear()
{
setCard(getCard());
}
CardInfo *CardInfoWidget::getCard(const QString &cardName) {
return db->getCardBySimpleName(cardName);
}
void CardInfoWidget::updatePixmap()
{
if (pixmapWidth == 0)
return;
QPixmap resizedPixmap;
PictureLoader::getPixmap(resizedPixmap, info, QSize(pixmapWidth, pixmapWidth * aspectRatio));
if (resizedPixmap.isNull())
PictureLoader::getPixmap(resizedPixmap, getCard(), QSize(pixmapWidth, pixmapWidth * aspectRatio));
cardPicture->setPixmap(resizedPixmap);
}
void CardInfoWidget::retranslateUi()
{
nameLabel1->setText(tr("Name:"));
manacostLabel1->setText(tr("Mana cost:"));
colorLabel1->setText(tr("Color(s):"));
cardtypeLabel1->setText(tr("Card type:"));
powtoughLabel1->setText(tr("P / T:"));
loyaltyLabel1->setText(tr("Loyalty:"));
}
void CardInfoWidget::resizeEvent(QResizeEvent * /*event*/)
{
if (mode == ModePopUp)
return;
if ((minimized == 1) && (mode == ModeGameTab)) {
pixmapWidth = 0;
return;
}
qreal newPixmapWidth = qMax((qreal) 100.0, qMin((qreal) cardPicture->width(), (qreal) ((height() - cardHeightOffset) / aspectRatio)));
if (newPixmapWidth != pixmapWidth) {
pixmapWidth = newPixmapWidth;
updatePixmap();
}
}
QString CardInfoWidget::getCardName() const
{
return nameLabel2->text();
setCard((CardInfo *) nullptr);
}
......@@ -5,53 +5,21 @@
#include <QStringList>
#include <QComboBox>
class QLabel;
class QTextEdit;
class QPushButton;
class AbstractCardItem;
class CardInfo;
class QResizeEvent;
class QMouseEvent;
class CardInfoPicture;
class CardInfoText;
class AbstractCardItem;
class CardInfoWidget : public QFrame {
Q_OBJECT
public:
enum ResizeMode { ModeDeckEditor, ModeGameTab, ModePopUp };
private:
int pixmapWidth;
qreal cardHeightOffset;
qreal aspectRatio;
// XXX: Why isn't this an eunm?
int minimized; // 0 - card, 1 - oracle only, 2 - full
ResizeMode mode;
QComboBox *dropList;
QLabel *cardPicture;
QLabel *nameLabel1, *nameLabel2;
QLabel *manacostLabel1, *manacostLabel2;
QLabel *colorLabel1, *colorLabel2;
QLabel *cardtypeLabel1, *cardtypeLabel2;
QLabel *powtoughLabel1, *powtoughLabel2;
QLabel *loyaltyLabel1, *loyaltyLabel2;
QTextEdit *textLabel;
bool shouldShowPowTough();
bool shouldShowLoyalty();
CardInfo *info;
void setMinimized(int _minimized);
/*
* Wrapper around db->getCardBySimpleName.
*/
CardInfo *getCard(const QString &cardName = QString());
CardInfoPicture *pic;
CardInfoText *text;
public:
CardInfoWidget(ResizeMode _mode, const QString &cardName = QString(), QWidget *parent = 0, Qt::WindowFlags f = 0);
void retranslateUi();
QString getCardName() const;
CardInfoWidget(const QString &cardName, QWidget *parent = 0, Qt::WindowFlags f = 0);
public slots:
void setCard(CardInfo *card);
......@@ -60,11 +28,6 @@ public slots:
private slots:
void clear();
void updatePixmap();
void minimizeClicked(int newMinimized);
protected:
void resizeEvent(QResizeEvent *event);
};
#endif
......@@ -107,13 +107,18 @@ void CardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
painter->save();
transformPainter(painter, translatedSize, tapAngle);
QStringList ptDbSplit = db->getCard(name)->getPowTough().split("/");
QStringList ptSplit = pt.split("/");
if(info)
{
QStringList ptSplit = pt.split("/");
QStringList ptDbSplit = info->getPowTough().split("/");
if (getFaceDown() || ptDbSplit.at(0) != ptSplit.at(0) || ptDbSplit.at(1) != ptSplit.at(1))
painter->setPen(QColor(255, 150, 0));
else
if (getFaceDown() || ptDbSplit.at(0) != ptSplit.at(0) || ptDbSplit.at(1) != ptSplit.at(1))
painter->setPen(QColor(255, 150, 0));
else
painter->setPen(Qt::white);
} else {
painter->setPen(Qt::white);
}
painter->setBackground(Qt::black);
painter->setBackgroundMode(Qt::OpaqueMode);
......@@ -329,7 +334,7 @@ void CardItem::playCard(bool faceDown)
if (tz)
tz->toggleTapped();
else
zone->getPlayer()->playCard(this, faceDown, info->getCipt());
zone->getPlayer()->playCard(this, faceDown, info ? info->getCipt() : false);
}
void CardItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
......
......@@ -42,8 +42,8 @@ public:
inline bool operator()(CardItem *a, CardItem *b) const
{
if (flags & SortByType) {
QString t1 = a->getInfo()->getMainCardType();
QString t2 = b->getInfo()->getMainCardType();
QString t1 = a->getInfo() ? a->getInfo()->getMainCardType() : QString();
QString t2 = b->getInfo() ? b->getInfo()->getMainCardType() : QString();
if ((t1 == t2) && (flags & SortByName))
return a->getName() < b->getName();
return t1 < t2;
......
......@@ -44,11 +44,7 @@ void DeckListModel::rebuildTree()
continue;
CardInfo *info = db->getCard(currentCard->getName());
QString cardType;
if (!info)
cardType = "unknown";
else
cardType = info->getMainCardType();
QString cardType = info ? info->getMainCardType() : "unknown";
InnerDecklistNode *cardTypeNode = dynamic_cast<InnerDecklistNode *>(node->findChild(cardType));
if (!cardTypeNode)
cardTypeNode = new InnerDecklistNode(cardType, node);
......@@ -280,6 +276,9 @@ QModelIndex DeckListModel::addCard(const QString &cardName, const QString &zoneN
InnerDecklistNode *zoneNode = createNodeIfNeeded(zoneName, root);
CardInfo *info = db->getCard(cardName);
if(!info)
return QModelIndex();
QString cardType = info->getMainCardType();
InnerDecklistNode *cardTypeNode = createNodeIfNeeded(cardType, zoneNode);
......
......@@ -89,7 +89,8 @@ struct CopyIfNotAToken {
const InnerDecklistNode *node,
const DecklistCardNode *card
) const {
if (!cardDatabase.getCard(card->getName())->getIsToken()) {
CardInfo * dbCard = cardDatabase.getCard(card->getName());
if (dbCard && !dbCard->getIsToken()) {
DecklistCardNode *addedCard = destination.addCard(
card->getName(),
node->getName()
......
......@@ -176,13 +176,13 @@ void DeckViewCardContainer::paint(QPainter *painter, const QStyleOptionGraphicsI
void DeckViewCardContainer::addCard(DeckViewCard *card)
{
cards.append(card);
cardsByType.insert(card->getInfo()->getMainCardType(), card);
cardsByType.insert(card->getInfo() ? card->getInfo()->getMainCardType() : "", card);
}
void DeckViewCardContainer::removeCard(DeckViewCard *card)
{
cards.removeAt(cards.indexOf(card));
cardsByType.remove(card->getInfo()->getMainCardType(), card);
cardsByType.remove(card->getInfo() ? card->getInfo()->getMainCardType(): "", card);
}
QList<QPair<int, int> > DeckViewCardContainer::getRowsAndCols() const
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment