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
...@@ -79,8 +79,19 @@ private slots: ...@@ -79,8 +79,19 @@ private slots:
void cardUpdateError(QProcess::ProcessError err); void cardUpdateError(QProcess::ProcessError err);
void cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus); void cardUpdateFinished(int exitCode, QProcess::ExitStatus exitStatus);
void refreshShortcuts(); void refreshShortcuts();
void cardDatabaseLoadingFailed();
void cardDatabaseNewSetsFound(int numUnknownSets);
void cardDatabaseAllNewSetsEnabled();
void actOpenCustomFolder();
void actOpenCustomsetsFolder();
void actAddCustomSet();
void actEditSets();
void actEditTokens();
private: private:
static const QString appName; static const QString appName;
static const QStringList fileNameFilters;
void setClientStatusTitle(); void setClientStatusTitle();
void retranslateUi(); void retranslateUi();
void createActions(); void createActions();
...@@ -88,13 +99,15 @@ private: ...@@ -88,13 +99,15 @@ private:
void createTrayIcon(); void createTrayIcon();
void createTrayActions(); void createTrayActions();
int getNextCustomSetPrefix(QDir dataDir);
// TODO: add a preference item to choose updater name for other games // TODO: add a preference item to choose updater name for other games
inline QString getCardUpdaterBinaryName() { return "oracle"; }; inline QString getCardUpdaterBinaryName() { return "oracle"; };
QList<QMenu *> tabMenus; QList<QMenu *> tabMenus;
QMenu *cockatriceMenu, *helpMenu; QMenu *cockatriceMenu, *dbMenu, *helpMenu;
QAction *aConnect, *aDisconnect, *aSinglePlayer, *aWatchReplay, *aDeckEditor, *aFullScreen, *aSettings, *aExit, QAction *aConnect, *aDisconnect, *aSinglePlayer, *aWatchReplay, *aDeckEditor, *aFullScreen, *aSettings, *aExit,
*aAbout, *aCheckCardUpdates, *aRegister, *aUpdate; *aAbout, *aCheckCardUpdates, *aRegister, *aUpdate;
QAction *aEditSets, *aEditTokens, *aOpenCustomFolder, *aOpenCustomsetsFolder, *aAddCustomSet;
TabSupervisor *tabSupervisor; TabSupervisor *tabSupervisor;
QMenu *trayIconMenu; QMenu *trayIconMenu;
......
...@@ -116,7 +116,7 @@ void ZoneViewZone::reorganizeCards() ...@@ -116,7 +116,7 @@ void ZoneViewZone::reorganizeCards()
QString lastCardType; QString lastCardType;
for (int i = 0; i < cardCount; i++) { for (int i = 0; i < cardCount; i++) {
CardItem *c = cardsToDisplay.at(i); CardItem *c = cardsToDisplay.at(i);
QString cardType = c->getInfo()->getMainCardType(); QString cardType = c->getInfo() ? c->getInfo()->getMainCardType() : "";
if (i){ // if not the first card if (i){ // if not the first card
if (cardType == lastCardType) if (cardType == lastCardType)
......
...@@ -2,7 +2,6 @@ ...@@ -2,7 +2,6 @@
# #
# provides the common library # provides the common library
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
add_subdirectory(pb) add_subdirectory(pb)
SET(common_SOURCES SET(common_SOURCES
......
...@@ -2,8 +2,6 @@ ...@@ -2,8 +2,6 @@
# #
# provides the protobuf interfaces # provides the protobuf interfaces
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
SET(PROTO_FILES SET(PROTO_FILES
admin_commands.proto admin_commands.proto
card_attributes.proto card_attributes.proto
......
...@@ -130,8 +130,6 @@ ENDIF() ...@@ -130,8 +130,6 @@ ENDIF()
# Build oracle binary and link it # Build oracle binary and link it
ADD_EXECUTABLE(oracle WIN32 MACOSX_BUNDLE ${oracle_SOURCES} ${oracle_QM} ${oracle_RESOURCES_RCC} ${oracle_MOC_SRCS}) ADD_EXECUTABLE(oracle WIN32 MACOSX_BUNDLE ${oracle_SOURCES} ${oracle_QM} ${oracle_RESOURCES_RCC} ${oracle_MOC_SRCS})
set_property(TARGET oracle PROPERTY CXX_STANDARD 11)
set_property(TARGET oracle PROPERTY CXX_STANDARD_REQUIRED ON)
if(Qt4_FOUND) if(Qt4_FOUND)
if(MSVC) if(MSVC)
......
...@@ -48,19 +48,7 @@ OracleWizard::OracleWizard(QWidget *parent) ...@@ -48,19 +48,7 @@ OracleWizard::OracleWizard(QWidget *parent)
settings = new QSettings(settingsCache->getSettingsPath()+"global.ini",QSettings::IniFormat, this); settings = new QSettings(settingsCache->getSettingsPath()+"global.ini",QSettings::IniFormat, this);
connect(settingsCache, SIGNAL(langChanged()), this, SLOT(updateLanguage())); connect(settingsCache, SIGNAL(langChanged()), this, SLOT(updateLanguage()));
QString dataDir; importer = new OracleImporter(settingsCache->getDataPath(), this);
#ifndef PORTABLE_BUILD
#if QT_VERSION < 0x050000
QDesktopServices::storageLocation(QDesktopServices::DataLocation);
#else
QStandardPaths::standardLocations(QStandardPaths::DataLocation).first();
#endif
#else
dataDir.append("data");
#endif
importer = new OracleImporter(dataDir, this);
addPage(new IntroPage); addPage(new IntroPage);
addPage(new LoadSetsPage); addPage(new LoadSetsPage);
...@@ -521,47 +509,19 @@ void SaveSetsPage::updateTotalProgress(int cardsImported, int /* setIndex */, co ...@@ -521,47 +509,19 @@ void SaveSetsPage::updateTotalProgress(int cardsImported, int /* setIndex */, co
bool SaveSetsPage::validatePage() bool SaveSetsPage::validatePage()
{ {
bool ok = false; bool ok = false;
QString dataDir; QString defaultPath = settingsCache->getCardDatabasePath();
#ifndef PORTABLE_BUILD
#if QT_VERSION < 0x050000
dataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
#else
dataDir = QStandardPaths::standardLocations(QStandardPaths::DataLocation).first();
#endif
#else
dataDir = qApp->applicationDirPath() + "/data";
#endif
#ifdef PORTABLE_BUILD
QSettings* settings = new QSettings("settings/global.ini",QSettings::IniFormat,this);
QString defaultPath = "data/cards.xml";
settings->setValue("paths/carddatabase", defaultPath);
#else
QSettings* settings = new QSettings(settingsCache->getSettingsPath()+"global.ini",QSettings::IniFormat,this);
QString defaultPath = settings->value("paths/carddatabase").toString();
#endif
QString windowName = tr("Save card database"); QString windowName = tr("Save card database");
QString fileType = tr("XML; card database (*.xml)"); QString fileType = tr("XML; card database (*.xml)");
do { do {
QString fileName; QString fileName;
if (defaultPath.isEmpty()) { if (defaultPathCheckBox->isChecked())
if (defaultPathCheckBox->isChecked()) fileName = defaultPath;
fileName = dataDir + "/cards.xml"; else
else fileName = QFileDialog::getSaveFileName(this, windowName, defaultPath, fileType);
fileName = QFileDialog::getSaveFileName(this, windowName, dataDir + "/cards.xml", fileType);
settings->setValue("paths/carddatabase", fileName); if (fileName.isEmpty())
}
else {
if (defaultPathCheckBox->isChecked())
fileName = defaultPath;
else
fileName = QFileDialog::getSaveFileName(this, windowName, defaultPath, fileType);
}
if (fileName.isEmpty()) {
return false; return false;
}
QFileInfo fi(fileName); QFileInfo fi(fileName);
QDir fileDir(fi.path()); QDir fileDir(fi.path());
...@@ -741,55 +701,24 @@ void SaveTokensPage::retranslateUi() ...@@ -741,55 +701,24 @@ void SaveTokensPage::retranslateUi()
"Press \"Save\" to save the imported tokens to the Cockatrice tokens database.")); "Press \"Save\" to save the imported tokens to the Cockatrice tokens database."));
defaultPathCheckBox->setText(tr("Save to the default path (recommended)")); defaultPathCheckBox->setText(tr("Save to the default path (recommended)"));
#ifdef PORTABLE_BUILD
defaultPathCheckBox->setEnabled(false);
#endif
} }
bool SaveTokensPage::validatePage() bool SaveTokensPage::validatePage()
{ {
bool ok = false; bool ok = false;
QString dataDir; QString defaultPath = settingsCache->getTokenDatabasePath();
#ifndef PORTABLE_BUILD
#if QT_VERSION < 0x050000
dataDir = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
#else
dataDir = QStandardPaths::standardLocations(QStandardPaths::DataLocation).first();
#endif
#else
dataDir = qApp->applicationDirPath() + "/data";
#endif
#ifdef PORTABLE_BUILD
QSettings* settings = new QSettings("settings/global.ini",QSettings::IniFormat,this);
QString defaultPath = "data/tokens.xml";
settings->setValue("paths/tokendatabase", defaultPath);
#else
QSettings* settings = new QSettings(settingsCache->getSettingsPath()+"global.ini",QSettings::IniFormat,this);
QString defaultPath = settings->value("paths/tokendatabase").toString();
#endif
QString windowName = tr("Save token database"); QString windowName = tr("Save token database");
QString fileType = tr("XML; token database (*.xml)"); QString fileType = tr("XML; token database (*.xml)");
do { do {
QString fileName; QString fileName;
if (defaultPath.isEmpty()) { if (defaultPathCheckBox->isChecked())
if (defaultPathCheckBox->isChecked()) fileName = defaultPath;
fileName = dataDir + "/tokens.xml"; else
else fileName = QFileDialog::getSaveFileName(this, windowName, defaultPath, fileType);
fileName = QFileDialog::getSaveFileName(this, windowName, dataDir + "/tokens.xml", fileType);
settings->setValue("paths/tokendatabase", fileName); if (fileName.isEmpty())
}
else {
if (defaultPathCheckBox->isChecked())
fileName = defaultPath;
else
fileName = QFileDialog::getSaveFileName(this, windowName, defaultPath, fileType);
}
if (fileName.isEmpty()) {
return false; return false;
}
QFileInfo fi(fileName); QFileInfo fi(fileName);
QDir fileDir(fi.path()); QDir fileDir(fi.path());
......
...@@ -117,8 +117,6 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}) ...@@ -117,8 +117,6 @@ INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
# Build servatrice binary and link it # Build servatrice binary and link it
ADD_EXECUTABLE(servatrice MACOSX_BUNDLE ${servatrice_SOURCES} ${servatrice_RESOURCES_RCC} ${servatrice_MOC_SRCS}) ADD_EXECUTABLE(servatrice MACOSX_BUNDLE ${servatrice_SOURCES} ${servatrice_RESOURCES_RCC} ${servatrice_MOC_SRCS})
set_property(TARGET servatrice PROPERTY CXX_STANDARD 11)
set_property(TARGET servatrice PROPERTY CXX_STANDARD_REQUIRED ON)
if(Qt4_FOUND) if(Qt4_FOUND)
if(MSVC) if(MSVC)
......
...@@ -35,4 +35,6 @@ if(NOT GTEST_FOUND) ...@@ -35,4 +35,6 @@ if(NOT GTEST_FOUND)
endif() endif()
include_directories(${GTEST_INCLUDE_DIRS}) include_directories(${GTEST_INCLUDE_DIRS})
target_link_libraries(dummy_test ${GTEST_BOTH_LIBRARIES}) target_link_libraries(dummy_test ${GTEST_BOTH_LIBRARIES})
\ No newline at end of file
add_subdirectory(carddatabase)
\ No newline at end of file
ADD_DEFINITIONS("-DCARDDB_DATADIR=\"${CMAKE_CURRENT_SOURCE_DIR}/data/\"")
add_executable(carddatabase_test
carddatabase_test.cpp
../../cockatrice/src/carddatabase.cpp
)
if(NOT GTEST_FOUND)
add_dependencies(carddatabase_test gtest)
endif()
target_link_libraries(carddatabase_test ${GTEST_BOTH_LIBRARIES})
add_test(NAME carddatabase_test COMMAND carddatabase_test)
# Qt4 stuff
if(Qt4_FOUND)
SET(QT_USE_QTNETWORK TRUE)
SET(QT_USE_QTMULTIMEDIA TRUE)
# Include directories
INCLUDE(${QT_USE_FILE})
INCLUDE_DIRECTORIES(${QT_INCLUDES})
TARGET_LINK_LIBRARIES(carddatabase_test ${QT_LIBRARIES})
endif()
# qt5 stuff
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)
include_directories(${Qt5Network_INCLUDE_DIRS})
list(APPEND COCKATRICE_LIBS Network)
endif()
qt5_use_modules(carddatabase_test ${COCKATRICE_LIBS})
endif()
\ No newline at end of file
#include "gtest/gtest.h"
#include "carddatabase_test.h"
void CardDatabaseSettings::setSortKey(QString /* shortName */, unsigned int /* sortKey */) { };
void CardDatabaseSettings::setEnabled(QString /* shortName */, bool /* enabled */) { };
void CardDatabaseSettings::setIsKnown(QString /* shortName */, bool /* isknown */) { };
unsigned int CardDatabaseSettings::getSortKey(QString /* shortName */) { return 0; };
bool CardDatabaseSettings::isEnabled(QString /* shortName */) { return true; };
bool CardDatabaseSettings::isKnown(QString /* shortName */) { return true; };
SettingsCache::SettingsCache() { cardDatabaseSettings = new CardDatabaseSettings(); };
SettingsCache::~SettingsCache() { delete cardDatabaseSettings; };
QString SettingsCache::getCustomCardDatabasePath() const { return QString("%1/customsets/").arg(CARDDB_DATADIR); }
QString SettingsCache::getCardDatabasePath() const { return QString("%1/cards.xml").arg(CARDDB_DATADIR); }
QString SettingsCache::getTokenDatabasePath() const { return QString("%1/tokens.xml").arg(CARDDB_DATADIR); }
CardDatabaseSettings& SettingsCache::cardDatabase() const { return *cardDatabaseSettings; }
SettingsCache *settingsCache;
void PictureLoader::clearPixmapCache(CardInfo * /* card */) { }
// include out main header file _after_ the hack is complete
#include "../../cockatrice/src/carddatabase.h"
namespace {
TEST(CardDatabaseTest, LoadXml) {
settingsCache = new SettingsCache;
CardDatabase *db = new CardDatabase;
// ensure the card database is empty at start
ASSERT_EQ(0, db->getCardList().size()) << "Cards not empty at start";
ASSERT_EQ(0, db->getSetList().size()) << "Sets not empty at start";
ASSERT_EQ(0, db->getAllColors().size()) << "Colors not empty at start";
ASSERT_EQ(0, db->getAllMainCardTypes().size()) << "Types not empty at start";
ASSERT_EQ(NotLoaded, db->getLoadStatus()) << "Incorrect status at start";
// load dummy cards and test result
db->loadCardDatabases();
ASSERT_EQ(6, db->getCardList().size()) << "Wrong card count after load";
ASSERT_EQ(3, db->getSetList().size()) << "Wrong sets count after load";
ASSERT_EQ(4, db->getAllColors().size()) << "Wrong colors count after load";
ASSERT_EQ(2, db->getAllMainCardTypes().size()) << "Wrong types count after load";
ASSERT_EQ(Ok, db->getLoadStatus()) << "Wrong status after load";
// ensure the card database is empty after clear()
db->clear();
ASSERT_EQ(0, db->getCardList().size()) << "Cards not empty after clear";
ASSERT_EQ(0, db->getSetList().size()) << "Sets not empty after clear";
ASSERT_EQ(0, db->getAllColors().size()) << "Colors not empty after clear";
ASSERT_EQ(0, db->getAllMainCardTypes().size()) << "Types not empty after clear";
ASSERT_EQ(NotLoaded, db->getLoadStatus()) << "Incorrect status after clear";
}
}
int main(int argc, char **argv) {
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
\ No newline at end of file
/*
* Beware of this preprocessor hack used to redefine the settingCache class
* instead of including it and all of its dependencies.
*/
#include <QObject>
#include <QString>
#define SETTINGSCACHE_H
class CardDatabaseSettings
{
public:
void setSortKey(QString shortName, unsigned int sortKey);
void setEnabled(QString shortName, bool enabled);
void setIsKnown(QString shortName, bool isknown);
unsigned int getSortKey(QString shortName);
bool isEnabled(QString shortName);
bool isKnown(QString shortName);
};
class SettingsCache: public QObject {
Q_OBJECT
private:
CardDatabaseSettings *cardDatabaseSettings;
public:
SettingsCache();
~SettingsCache();
QString getCustomCardDatabasePath() const;
QString getCardDatabasePath() const;
QString getTokenDatabasePath() const;
CardDatabaseSettings& cardDatabase() const;
signals:
void cardDatabasePathChanged();
};
#define PICTURELOADER_H
class CardInfo;
class PictureLoader {
void clearPixmapCache(CardInfo *card);
};
<?xml version="1.0" encoding="UTF-8"?>
<cockatrice_carddatabase version="3">
<cards>
<card>
<name>Cat</name>
<set muId="111">CAT</set>
<color>G</color>
<manacost>2G</manacost>
<cmc>2</cmc>
<type>Creature</type>
<pt>3/3</pt>
<tablerow>0</tablerow>
<text>Meow!</text>
</card>
<card>
<name>Dog</name>
<set muId="222">DOG</set>
<color>R</color>
<manacost>2RR</manacost>
<cmc>4</cmc>
<type>Creature</type>
<pt>4/4</pt>
<tablerow>0</tablerow>
<text>Woof!</text>
</card>
</cards>
</cockatrice_carddatabase>
<?xml version="1.0" encoding="UTF-8"?>
<cockatrice_carddatabase version="3">
<cards>
<card>
<name>Sparrow</name>
<set muId="333">BRD</set>
<color>W</color>
<manacost>W</manacost>
<cmc>1</cmc>
<type>Creature</type>
<pt>1/1</pt>
<tablerow>0</tablerow>
<text></text>
</card>
<card>
<name>Crow</name>
<set muId="334">BRD</set>
<color>B</color>
<manacost>1B</manacost>
<cmc>2</cmc>
<type>Creature</type>
<pt>2/2</pt>
<tablerow>0</tablerow>
<text></text>
</card>
</cards>
</cockatrice_carddatabase>
<?xml version="1.0" encoding="UTF-8"?>
<cockatrice_carddatabase version="3">
<cards>
<card>
<name>Kitten</name>
<set muId="112">CAT</set>
<color>G</color>
<manacost></manacost>
<cmc></cmc>
<type>Token</type>
<pt>1/1</pt>
<tablerow>0</tablerow>
<text></text>
<token>1</token>
</card>
<card>
<name>Puppy</name>
<set muId="223">DOG</set>
<color>R</color>
<manacost></manacost>
<cmc></cmc>
<type>Token</type>
<pt>1/1</pt>
<tablerow>0</tablerow>
<text></text>
<token>1</token>
</card>
</cards>
</cockatrice_carddatabase>
...@@ -11,9 +11,10 @@ if [[ $TRAVIS_OS_NAME == "osx" ]] ; then ...@@ -11,9 +11,10 @@ if [[ $TRAVIS_OS_NAME == "osx" ]] ; then
brew upgrade cmake brew upgrade cmake
else else
# common prerequisites # common prerequisites
sudo add-apt-repository -y ppa:smspillaz/cmake-master
sudo apt-get update -qq sudo apt-get update -qq
sudo apt-get -y purge cmake
sudo apt-get install -y libprotobuf-dev protobuf-compiler cmake bc sudo apt-get install -y libprotobuf-dev protobuf-compiler cmake bc
if (( QT4 )); then if (( QT4 )); then
...@@ -28,15 +29,7 @@ else ...@@ -28,15 +29,7 @@ else
# prerequisites for tests # prerequisites for tests
if [[ $BUILDTYPE == "Debug" ]]; then if [[ $BUILDTYPE == "Debug" ]]; then
if [[ $DIST == "precise" ]]; then sudo apt-get install -y libgtest-dev
sudo add-apt-repository -y ppa:george-edison55/precise-backports
sudo apt-get update -qq
sudo apt-get install -y cmake cmake-data libgtest-dev
else
sudo add-apt-repository -y ppa:george-edison55/cmake-3.x
sudo apt-get update -qq
sudo apt-get install -y cmake cmake-extras libgtest-dev
fi
sudo mkdir /usr/src/gtest/build sudo mkdir /usr/src/gtest/build
cd /usr/src/gtest/build cd /usr/src/gtest/build
......
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