Theme manager

This is the first implementation of a theme manager. It’s a rebased and
revisited version of #792.
This commit is contained in:
Fabio Bas 2015-05-17 23:30:14 +02:00
parent 48c3e64ef5
commit 6b8ebe54e9
64 changed files with 360 additions and 388 deletions

View file

@ -221,7 +221,7 @@ option(WITH_CLIENT "build cockatrice" ON)
if(WITH_CLIENT) if(WITH_CLIENT)
add_subdirectory(cockatrice) add_subdirectory(cockatrice)
add_subdirectory(sounds) add_subdirectory(sounds)
add_subdirectory(zonebg) add_subdirectory(themes)
SET(CPACK_INSTALL_CMAKE_PROJECTS "cockatrice;cockatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS}) SET(CPACK_INSTALL_CMAKE_PROJECTS "cockatrice;cockatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})
endif() endif()

View file

@ -84,6 +84,7 @@ SET(cockatrice_SOURCES
src/playerlistwidget.cpp src/playerlistwidget.cpp
src/pixmapgenerator.cpp src/pixmapgenerator.cpp
src/settingscache.cpp src/settingscache.cpp
src/thememanager.cpp
src/localserver.cpp src/localserver.cpp
src/localserverinterface.cpp src/localserverinterface.cpp
src/localclient.cpp src/localclient.cpp

View file

@ -1,6 +1,6 @@
<RCC> <RCC>
<qresource prefix="/" > <qresource prefix="/" >
<file alias="back.svg" >resources/back.svg</file> <file>resources/back.svg</file>
<file>resources/lock.svg</file> <file>resources/lock.svg</file>
<file>resources/icon_delete.svg</file> <file>resources/icon_delete.svg</file>
<file>resources/icon_tab_changed.svg</file> <file>resources/icon_tab_changed.svg</file>

View file

@ -1,5 +1,6 @@
#include "carddatabase.h" #include "carddatabase.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include <QDir> #include <QDir>
#include <QDirIterator> #include <QDirIterator>
#include <QFile> #include <QFile>
@ -570,7 +571,7 @@ void CardInfo::loadPixmap(QPixmap &pixmap)
pixmap = QPixmap(); pixmap = QPixmap();
if (getName().isEmpty()) { if (getName().isEmpty()) {
pixmap.load(settingsCache->getCardBackPicturePath()); pixmap = themeManager->getCardBackPixmap();
return; return;
} }
@ -594,15 +595,15 @@ void CardInfo::getPixmap(QSize size, QPixmap &pixmap)
QPixmap bigPixmap; QPixmap bigPixmap;
loadPixmap(bigPixmap); loadPixmap(bigPixmap);
if (bigPixmap.isNull()) { if (bigPixmap.isNull()) {
if (!getName().isEmpty()) { if (getName().isEmpty()) {
pixmap = QPixmap(); // null QSvgRenderer svg(QString("theme:back.svg"));
return;
} else {
QSvgRenderer svg(QString(":/back.svg"));
bigPixmap = QPixmap(svg.defaultSize()); bigPixmap = QPixmap(svg.defaultSize());
bigPixmap.fill(Qt::transparent); bigPixmap.fill(Qt::transparent);
QPainter painter(&bigPixmap); QPainter painter(&bigPixmap);
svg.render(&painter); svg.render(&painter);
} else {
pixmap = QPixmap(); // null
return;
} }
} }
@ -724,7 +725,7 @@ CardDatabase::CardDatabase(QObject *parent)
noCard = new CardInfo(this); noCard = new CardInfo(this);
QPixmap tmp; QPixmap tmp;
noCard->loadPixmap(tmp); // cache pixmap for card back noCard->loadPixmap(tmp); // cache pixmap for card back
connect(settingsCache, SIGNAL(cardBackPicturePathChanged()), noCard, SLOT(updatePixmapCache())); connect(themeManager, SIGNAL(themeChanged()), noCard, SLOT(updatePixmapCache()));
} }
CardDatabase::~CardDatabase() CardDatabase::~CardDatabase()

View file

@ -463,7 +463,7 @@ void DeckListModel::printDeckList(QPrinter *printer)
cursor.insertBlock(headerBlockFormat, headerCharFormat); cursor.insertBlock(headerBlockFormat, headerCharFormat);
for (int i = 0; i < root->size(); i++) { for (int i = 0; i < root->size(); i++) {
cursor.insertHtml("<br><img src=:/resources/hr.jpg>"); cursor.insertHtml("<br><img src=theme:hr.jpg>");
//cursor.insertHtml("<hr>"); //cursor.insertHtml("<hr>");
cursor.insertBlock(headerBlockFormat, headerCharFormat); cursor.insertBlock(headerBlockFormat, headerCharFormat);

View file

@ -5,6 +5,7 @@
#include "decklist.h" #include "decklist.h"
#include "carddatabase.h" #include "carddatabase.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "main.h" #include "main.h"
DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item, const QPointF &_hotSpot, AbstractCardDragItem *parentDrag) DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item, const QPointF &_hotSpot, AbstractCardDragItem *parentDrag)
@ -128,10 +129,6 @@ void DeckViewCard::hoverEnterEvent(QGraphicsSceneHoverEvent *event)
DeckViewCardContainer::DeckViewCardContainer(const QString &_name) DeckViewCardContainer::DeckViewCardContainer(const QString &_name)
: QGraphicsItem(), name(_name), width(0), height(0) : QGraphicsItem(), name(_name), width(0), height(0)
{ {
QString bgPath = settingsCache->getTableBgPath();
if (!bgPath.isEmpty())
bgPixmap.load(bgPath);
setCacheMode(DeviceCoordinateCache); setCacheMode(DeviceCoordinateCache);
} }
@ -144,17 +141,7 @@ void DeckViewCardContainer::paint(QPainter *painter, const QStyleOptionGraphicsI
{ {
qreal totalTextWidth = getCardTypeTextWidth(); qreal totalTextWidth = getCardTypeTextWidth();
if (bgPixmap.isNull()) { painter->fillRect(boundingRect(), themeManager->getTableBgBrush());
QLinearGradient grad1(0, 0, 1, 0);
grad1.setCoordinateMode(QGradient::ObjectBoundingMode);
grad1.setColorAt(0, QColor(30, 30, 30));
grad1.setColorAt(1, QColor(80, 80, 80));
painter->fillRect(QRectF(0, 0, width, height), QBrush(grad1));
painter->fillRect(boundingRect(), QColor(0, 0, 0, 80));
}
else
painter->fillRect(boundingRect(), QBrush(bgPixmap));
painter->setPen(QColor(255, 255, 255, 100)); painter->setPen(QColor(255, 255, 255, 100));
painter->drawLine(QPointF(0, separatorY), QPointF(width, separatorY)); painter->drawLine(QPointF(0, separatorY), QPointF(width, separatorY));

View file

@ -52,7 +52,6 @@ private:
QMultiMap<QString, DeckViewCard *> cardsByType; QMultiMap<QString, DeckViewCard *> cardsByType;
QList<QPair<int, int> > currentRowsAndCols; QList<QPair<int, int> > currentRowsAndCols;
qreal width, height; qreal width, height;
QPixmap bgPixmap;
int getCardTypeTextWidth() const; int getCardTypeTextWidth() const;
public: public:
enum { Type = typeDeckViewCardContainer }; enum { Type = typeDeckViewCardContainer };

View file

@ -83,10 +83,10 @@ DlgEditTokens::DlgEditTokens(CardDatabaseModel *_cardDatabaseModel, QWidget *par
connect(chooseTokenView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SLOT(tokenSelectionChanged(QModelIndex, QModelIndex))); connect(chooseTokenView->selectionModel(), SIGNAL(currentRowChanged(QModelIndex, QModelIndex)), this, SLOT(tokenSelectionChanged(QModelIndex, QModelIndex)));
QAction *aAddToken = new QAction(tr("Add token"), this); QAction *aAddToken = new QAction(tr("Add token"), this);
aAddToken->setIcon(QIcon(":/resources/increment.svg")); aAddToken->setIcon(QIcon("theme:increment.svg"));
connect(aAddToken, SIGNAL(triggered()), this, SLOT(actAddToken())); connect(aAddToken, SIGNAL(triggered()), this, SLOT(actAddToken()));
QAction *aRemoveToken = new QAction(tr("Remove token"), this); QAction *aRemoveToken = new QAction(tr("Remove token"), this);
aRemoveToken->setIcon(QIcon(":/resources/decrement.svg")); aRemoveToken->setIcon(QIcon("theme:decrement.svg"));
connect(aRemoveToken, SIGNAL(triggered()), this, SLOT(actRemoveToken())); connect(aRemoveToken, SIGNAL(triggered()), this, SLOT(actRemoveToken()));
QToolBar *databaseToolBar = new QToolBar; QToolBar *databaseToolBar = new QToolBar;

View file

@ -26,6 +26,7 @@
#include "dlg_settings.h" #include "dlg_settings.h"
#include "main.h" #include "main.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "priceupdater.h" #include "priceupdater.h"
#include "soundengine.h" #include "soundengine.h"
@ -234,67 +235,23 @@ void GeneralSettingsPage::retranslateUi()
AppearanceSettingsPage::AppearanceSettingsPage() AppearanceSettingsPage::AppearanceSettingsPage()
{ {
QIcon deleteIcon(":/resources/icon_delete.svg"); QString themeName = settingsCache->getThemeName();
handBgEdit = new QLineEdit(settingsCache->getHandBgPath());
handBgEdit->setReadOnly(true);
QPushButton *handBgClearButton = new QPushButton(deleteIcon, QString());
connect(handBgClearButton, SIGNAL(clicked()), this, SLOT(handBgClearButtonClicked()));
QPushButton *handBgButton = new QPushButton("...");
connect(handBgButton, SIGNAL(clicked()), this, SLOT(handBgButtonClicked()));
stackBgEdit = new QLineEdit(settingsCache->getStackBgPath());
stackBgEdit->setReadOnly(true);
QPushButton *stackBgClearButton = new QPushButton(deleteIcon, QString());
connect(stackBgClearButton, SIGNAL(clicked()), this, SLOT(stackBgClearButtonClicked()));
QPushButton *stackBgButton = new QPushButton("...");
connect(stackBgButton, SIGNAL(clicked()), this, SLOT(stackBgButtonClicked()));
tableBgEdit = new QLineEdit(settingsCache->getTableBgPath()); QStringList themeDirs = themeManager->getAvailableThemes().keys();
tableBgEdit->setReadOnly(true); for (int i = 0; i < themeDirs.size(); i++) {
QPushButton *tableBgClearButton = new QPushButton(deleteIcon, QString()); themeBox.addItem(themeDirs[i]);
connect(tableBgClearButton, SIGNAL(clicked()), this, SLOT(tableBgClearButtonClicked())); if (themeDirs[i] == themeName)
QPushButton *tableBgButton = new QPushButton("..."); themeBox.setCurrentIndex(i);
connect(tableBgButton, SIGNAL(clicked()), this, SLOT(tableBgButtonClicked())); }
playerAreaBgEdit = new QLineEdit(settingsCache->getPlayerBgPath());
playerAreaBgEdit->setReadOnly(true);
QPushButton *playerAreaBgClearButton = new QPushButton(deleteIcon, QString());
connect(playerAreaBgClearButton, SIGNAL(clicked()), this, SLOT(playerAreaBgClearButtonClicked()));
QPushButton *playerAreaBgButton = new QPushButton("...");
connect(playerAreaBgButton, SIGNAL(clicked()), this, SLOT(playerAreaBgButtonClicked()));
cardBackPicturePathEdit = new QLineEdit(settingsCache->getCardBackPicturePath());
cardBackPicturePathEdit->setReadOnly(true);
QPushButton *cardBackPicturePathClearButton = new QPushButton(deleteIcon, QString());
connect(cardBackPicturePathClearButton, SIGNAL(clicked()), this, SLOT(cardBackPicturePathClearButtonClicked()));
QPushButton *cardBackPicturePathButton = new QPushButton("...");
connect(cardBackPicturePathButton, SIGNAL(clicked()), this, SLOT(cardBackPicturePathButtonClicked()));
QGridLayout *zoneBgGrid = new QGridLayout;
zoneBgGrid->addWidget(&handBgLabel, 0, 0);
zoneBgGrid->addWidget(handBgEdit, 0, 1);
zoneBgGrid->addWidget(handBgClearButton, 0, 2);
zoneBgGrid->addWidget(handBgButton, 0, 3);
zoneBgGrid->addWidget(&stackBgLabel, 1, 0);
zoneBgGrid->addWidget(stackBgEdit, 1, 1);
zoneBgGrid->addWidget(stackBgClearButton, 1, 2);
zoneBgGrid->addWidget(stackBgButton, 1, 3);
zoneBgGrid->addWidget(&tableBgLabel, 2, 0);
zoneBgGrid->addWidget(tableBgEdit, 2, 1);
zoneBgGrid->addWidget(tableBgClearButton, 2, 2);
zoneBgGrid->addWidget(tableBgButton, 2, 3);
zoneBgGrid->addWidget(&playerAreaBgLabel, 3, 0);
zoneBgGrid->addWidget(playerAreaBgEdit, 3, 1);
zoneBgGrid->addWidget(playerAreaBgClearButton, 3, 2);
zoneBgGrid->addWidget(playerAreaBgButton, 3, 3);
zoneBgGrid->addWidget(&cardBackPicturePathLabel, 4, 0);
zoneBgGrid->addWidget(cardBackPicturePathEdit, 4, 1);
zoneBgGrid->addWidget(cardBackPicturePathClearButton, 4, 2);
zoneBgGrid->addWidget(cardBackPicturePathButton, 4, 3);
zoneBgGroupBox = new QGroupBox; connect(&themeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(themeBoxChanged(int)));
zoneBgGroupBox->setLayout(zoneBgGrid);
QGridLayout *themeGrid = new QGridLayout;
themeGrid->addWidget(&themeLabel, 0, 0);
themeGrid->addWidget(&themeBox, 0, 1);
themeGroupBox = new QGroupBox;
themeGroupBox->setLayout(themeGrid);
displayCardNamesCheckBox.setChecked(settingsCache->getDisplayCardNames()); displayCardNamesCheckBox.setChecked(settingsCache->getDisplayCardNames());
connect(&displayCardNamesCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setDisplayCardNames(int))); connect(&displayCardNamesCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setDisplayCardNames(int)));
@ -339,7 +296,7 @@ AppearanceSettingsPage::AppearanceSettingsPage()
tableGroupBox->setLayout(tableGrid); tableGroupBox->setLayout(tableGrid);
QVBoxLayout *mainLayout = new QVBoxLayout; QVBoxLayout *mainLayout = new QVBoxLayout;
mainLayout->addWidget(zoneBgGroupBox); mainLayout->addWidget(themeGroupBox);
mainLayout->addWidget(cardsGroupBox); mainLayout->addWidget(cardsGroupBox);
mainLayout->addWidget(handGroupBox); mainLayout->addWidget(handGroupBox);
mainLayout->addWidget(tableGroupBox); mainLayout->addWidget(tableGroupBox);
@ -347,14 +304,17 @@ AppearanceSettingsPage::AppearanceSettingsPage()
setLayout(mainLayout); setLayout(mainLayout);
} }
void AppearanceSettingsPage::themeBoxChanged(int index)
{
QStringList themeDirs = themeManager->getAvailableThemes().keys();
if(index >= 0 && index < themeDirs.count())
settingsCache->setThemeName(themeDirs.at(index));
}
void AppearanceSettingsPage::retranslateUi() void AppearanceSettingsPage::retranslateUi()
{ {
zoneBgGroupBox->setTitle(tr("Zone background pictures")); themeGroupBox->setTitle(tr("Theme settings"));
handBgLabel.setText(tr("Hand background:")); themeLabel.setText(tr("Current theme:"));
stackBgLabel.setText(tr("Stack background:"));
tableBgLabel.setText(tr("Table background:"));
playerAreaBgLabel.setText(tr("Player info background:"));
cardBackPicturePathLabel.setText(tr("Card back:"));
cardsGroupBox->setTitle(tr("Card rendering")); cardsGroupBox->setTitle(tr("Card rendering"));
displayCardNamesCheckBox.setText(tr("Display card names on cards having a picture")); displayCardNamesCheckBox.setText(tr("Display card names on cards having a picture"));
@ -369,86 +329,6 @@ void AppearanceSettingsPage::retranslateUi()
minPlayersForMultiColumnLayoutLabel.setText(tr("Minimum player count for multi-column layout:")); minPlayersForMultiColumnLayoutLabel.setText(tr("Minimum player count for multi-column layout:"));
} }
void AppearanceSettingsPage::handBgClearButtonClicked()
{
handBgEdit->setText(QString());
settingsCache->setHandBgPath(QString());
}
void AppearanceSettingsPage::handBgButtonClicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Choose path"));
if (path.isEmpty())
return;
handBgEdit->setText(path);
settingsCache->setHandBgPath(path);
}
void AppearanceSettingsPage::stackBgClearButtonClicked()
{
stackBgEdit->setText(QString());
settingsCache->setStackBgPath(QString());
}
void AppearanceSettingsPage::stackBgButtonClicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Choose path"));
if (path.isEmpty())
return;
stackBgEdit->setText(path);
settingsCache->setStackBgPath(path);
}
void AppearanceSettingsPage::tableBgClearButtonClicked()
{
tableBgEdit->setText(QString());
settingsCache->setTableBgPath(QString());
}
void AppearanceSettingsPage::tableBgButtonClicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Choose path"));
if (path.isEmpty())
return;
tableBgEdit->setText(path);
settingsCache->setTableBgPath(path);
}
void AppearanceSettingsPage::playerAreaBgClearButtonClicked()
{
playerAreaBgEdit->setText(QString());
settingsCache->setPlayerBgPath(QString());
}
void AppearanceSettingsPage::playerAreaBgButtonClicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Choose path"));
if (path.isEmpty())
return;
playerAreaBgEdit->setText(path);
settingsCache->setPlayerBgPath(path);
}
void AppearanceSettingsPage::cardBackPicturePathClearButtonClicked()
{
cardBackPicturePathEdit->setText(QString());
settingsCache->setCardBackPicturePath(QString());
}
void AppearanceSettingsPage::cardBackPicturePathButtonClicked()
{
QString path = QFileDialog::getOpenFileName(this, tr("Choose path"));
if (path.isEmpty())
return;
cardBackPicturePathEdit->setText(path);
settingsCache->setCardBackPicturePath(path);
}
UserInterfaceSettingsPage::UserInterfaceSettingsPage() UserInterfaceSettingsPage::UserInterfaceSettingsPage()
{ {
notificationsEnabledCheckBox.setChecked(settingsCache->getNotificationsEnabled()); notificationsEnabledCheckBox.setChecked(settingsCache->getNotificationsEnabled());
@ -588,10 +468,10 @@ MessagesSettingsPage::MessagesSettingsPage()
messageList->addItem(settings.value(QString("msg%1").arg(i)).toString()); messageList->addItem(settings.value(QString("msg%1").arg(i)).toString());
aAdd = new QAction(this); aAdd = new QAction(this);
aAdd->setIcon(QIcon(":/resources/increment.svg")); aAdd->setIcon(QIcon("theme:increment.svg"));
connect(aAdd, SIGNAL(triggered()), this, SLOT(actAdd())); connect(aAdd, SIGNAL(triggered()), this, SLOT(actAdd()));
aRemove = new QAction(this); aRemove = new QAction(this);
aRemove->setIcon(QIcon(":/resources/decrement.svg")); aRemove->setIcon(QIcon("theme:decrement.svg"));
connect(aRemove, SIGNAL(triggered()), this, SLOT(actRemove())); connect(aRemove, SIGNAL(triggered()), this, SLOT(actRemove()));
QToolBar *messageToolBar = new QToolBar; QToolBar *messageToolBar = new QToolBar;
@ -679,7 +559,7 @@ void MessagesSettingsPage::retranslateUi()
SoundSettingsPage::SoundSettingsPage() SoundSettingsPage::SoundSettingsPage()
{ {
QIcon deleteIcon(":/resources/icon_delete.svg"); QIcon deleteIcon("theme:icon_delete.svg");
soundEnabledCheckBox.setChecked(settingsCache->getSoundEnabled()); soundEnabledCheckBox.setChecked(settingsCache->getSoundEnabled());
connect(&soundEnabledCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setSoundEnabled(int))); connect(&soundEnabledCheckBox, SIGNAL(stateChanged(int)), settingsCache, SLOT(setSoundEnabled(int)));
@ -815,32 +695,32 @@ void DlgSettings::createIcons()
generalButton = new QListWidgetItem(contentsWidget); generalButton = new QListWidgetItem(contentsWidget);
generalButton->setTextAlignment(Qt::AlignHCenter); generalButton->setTextAlignment(Qt::AlignHCenter);
generalButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); generalButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
generalButton->setIcon(QIcon(":/resources/icon_config_general.svg")); generalButton->setIcon(QIcon("theme:icon_config_general.svg"));
appearanceButton = new QListWidgetItem(contentsWidget); appearanceButton = new QListWidgetItem(contentsWidget);
appearanceButton->setTextAlignment(Qt::AlignHCenter); appearanceButton->setTextAlignment(Qt::AlignHCenter);
appearanceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); appearanceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
appearanceButton->setIcon(QIcon(":/resources/icon_config_appearance.svg")); appearanceButton->setIcon(QIcon("theme:icon_config_appearance.svg"));
userInterfaceButton = new QListWidgetItem(contentsWidget); userInterfaceButton = new QListWidgetItem(contentsWidget);
userInterfaceButton->setTextAlignment(Qt::AlignHCenter); userInterfaceButton->setTextAlignment(Qt::AlignHCenter);
userInterfaceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); userInterfaceButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
userInterfaceButton->setIcon(QIcon(":/resources/icon_config_interface.svg")); userInterfaceButton->setIcon(QIcon("theme:icon_config_interface.svg"));
deckEditorButton = new QListWidgetItem(contentsWidget); deckEditorButton = new QListWidgetItem(contentsWidget);
deckEditorButton->setTextAlignment(Qt::AlignHCenter); deckEditorButton->setTextAlignment(Qt::AlignHCenter);
deckEditorButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); deckEditorButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
deckEditorButton->setIcon(QIcon(":/resources/icon_config_deckeditor.svg")); deckEditorButton->setIcon(QIcon("theme:icon_config_deckeditor.svg"));
messagesButton = new QListWidgetItem(contentsWidget); messagesButton = new QListWidgetItem(contentsWidget);
messagesButton->setTextAlignment(Qt::AlignHCenter); messagesButton->setTextAlignment(Qt::AlignHCenter);
messagesButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); messagesButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
messagesButton->setIcon(QIcon(":/resources/icon_config_messages.svg")); messagesButton->setIcon(QIcon("theme:icon_config_messages.svg"));
soundButton = new QListWidgetItem(contentsWidget); soundButton = new QListWidgetItem(contentsWidget);
soundButton->setTextAlignment(Qt::AlignHCenter); soundButton->setTextAlignment(Qt::AlignHCenter);
soundButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); soundButton->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled);
soundButton->setIcon(QIcon(":/resources/icon_config_sound.svg")); soundButton->setIcon(QIcon("theme:icon_config_sound.svg"));
connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(changePage(QListWidgetItem *, QListWidgetItem *))); connect(contentsWidget, SIGNAL(currentItemChanged(QListWidgetItem *, QListWidgetItem *)), this, SLOT(changePage(QListWidgetItem *, QListWidgetItem *)));
} }

View file

@ -71,40 +71,17 @@ private:
class AppearanceSettingsPage : public AbstractSettingsPage { class AppearanceSettingsPage : public AbstractSettingsPage {
Q_OBJECT Q_OBJECT
private slots: private slots:
void handBgClearButtonClicked(); void themeBoxChanged(int index);
void handBgButtonClicked();
void stackBgClearButtonClicked();
void stackBgButtonClicked();
void tableBgClearButtonClicked();
void tableBgButtonClicked();
void playerAreaBgClearButtonClicked();
void playerAreaBgButtonClicked();
void cardBackPicturePathClearButtonClicked();
void cardBackPicturePathButtonClicked();
signals:
void handBgChanged(const QString &path);
void stackBgChanged(const QString &path);
void tableBgChanged(const QString &path);
void playerAreaBgChanged(const QString &path);
void cardBackPicturePathChanged(const QString &path);
private: private:
QLabel handBgLabel; QLabel themeLabel;
QLabel stackBgLabel; QComboBox themeBox;
QLabel tableBgLabel;
QLabel playerAreaBgLabel;
QLabel cardBackPicturePathLabel;
QLabel minPlayersForMultiColumnLayoutLabel; QLabel minPlayersForMultiColumnLayoutLabel;
QLineEdit *handBgEdit;
QLineEdit *stackBgEdit;
QLineEdit *tableBgEdit;
QLineEdit *playerAreaBgEdit;
QLineEdit *cardBackPicturePathEdit;
QCheckBox displayCardNamesCheckBox; QCheckBox displayCardNamesCheckBox;
QCheckBox cardScalingCheckBox; QCheckBox cardScalingCheckBox;
QCheckBox horizontalHandCheckBox; QCheckBox horizontalHandCheckBox;
QCheckBox leftJustifiedHandCheckBox; QCheckBox leftJustifiedHandCheckBox;
QCheckBox invertVerticalCoordinateCheckBox; QCheckBox invertVerticalCoordinateCheckBox;
QGroupBox *zoneBgGroupBox; QGroupBox *themeGroupBox;
QGroupBox *cardsGroupBox; QGroupBox *cardsGroupBox;
QGroupBox *handGroupBox; QGroupBox *handGroupBox;
QGroupBox *tableGroupBox; QGroupBox *tableGroupBox;

View file

@ -60,10 +60,10 @@ GameSelector::GameSelector(AbstractClient *_client, const TabSupervisor *_tabSup
gameListView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents); gameListView->header()->setSectionResizeMode(0, QHeaderView::ResizeToContents);
#endif #endif
filterButton = new QPushButton; filterButton = new QPushButton;
filterButton->setIcon(QIcon(":/resources/icon_search_black.svg")); filterButton->setIcon(QIcon("theme:icon_search_black.svg"));
connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter())); connect(filterButton, SIGNAL(clicked()), this, SLOT(actSetFilter()));
clearFilterButton = new QPushButton; clearFilterButton = new QPushButton;
clearFilterButton->setIcon(QIcon(":/resources/icon_clearsearch.svg")); clearFilterButton->setIcon(QIcon("theme:icon_clearsearch.svg"));
clearFilterButton->setEnabled(true); clearFilterButton->setEnabled(true);
connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter())); connect(clearFilterButton, SIGNAL(clicked()), this, SLOT(actClearFilter()));

View file

@ -36,7 +36,7 @@ void HandCounter::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*op
#else #else
if (!QPixmapCache::find("handCounter" + QString::number(translatedSize.width()), cachedPixmap)) { if (!QPixmapCache::find("handCounter" + QString::number(translatedSize.width()), cachedPixmap)) {
#endif #endif
QSvgRenderer svg(QString(":/resources/hand.svg")); QSvgRenderer svg(QString("theme:hand.svg"));
cachedPixmap = QPixmap(translatedSize); cachedPixmap = QPixmap(translatedSize);
cachedPixmap.fill(Qt::transparent); cachedPixmap.fill(Qt::transparent);
QPainter painter(&cachedPixmap); QPainter painter(&cachedPixmap);

View file

@ -1,6 +1,7 @@
#include <QPainter> #include <QPainter>
#include "handzone.h" #include "handzone.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "player.h" #include "player.h"
#include "carddragitem.h" #include "carddragitem.h"
#include "carditem.h" #include "carditem.h"
@ -10,16 +11,13 @@
HandZone::HandZone(Player *_p, bool _contentsKnown, int _zoneHeight, QGraphicsItem *parent) HandZone::HandZone(Player *_p, bool _contentsKnown, int _zoneHeight, QGraphicsItem *parent)
: SelectZone(_p, "hand", false, false, _contentsKnown, parent), zoneHeight(_zoneHeight) : SelectZone(_p, "hand", false, false, _contentsKnown, parent), zoneHeight(_zoneHeight)
{ {
connect(settingsCache, SIGNAL(handBgPathChanged()), this, SLOT(updateBgPixmap())); connect(themeManager, SIGNAL(themeChanged()), this, SLOT(updateBg()));
updateBgPixmap(); updateBg();
setCacheMode(DeviceCoordinateCache); setCacheMode(DeviceCoordinateCache);
} }
void HandZone::updateBgPixmap() void HandZone::updateBg()
{ {
QString bgPath = settingsCache->getHandBgPath();
if (!bgPath.isEmpty())
bgPixmap.load(bgPath);
update(); update();
} }
@ -77,10 +75,7 @@ QRectF HandZone::boundingRect() const
void HandZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) void HandZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{ {
if (bgPixmap.isNull()) painter->fillRect(boundingRect(), themeManager->getHandBgBrush());
painter->fillRect(boundingRect(), QColor(30, 30, 30));
else
painter->fillRect(boundingRect(), QBrush(bgPixmap));
} }
void HandZone::reorganizeCards() void HandZone::reorganizeCards()

View file

@ -7,9 +7,8 @@ class HandZone : public SelectZone {
Q_OBJECT Q_OBJECT
private: private:
qreal width, zoneHeight; qreal width, zoneHeight;
QPixmap bgPixmap;
private slots: private slots:
void updateBgPixmap(); void updateBg();
public slots: public slots:
void updateOrientation(); void updateOrientation();
public: public:

View file

@ -38,6 +38,7 @@
#include "dlg_settings.h" #include "dlg_settings.h"
#include "carddatabase.h" #include "carddatabase.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "pixmapgenerator.h" #include "pixmapgenerator.h"
#include "rng_sfmt.h" #include "rng_sfmt.h"
#include "soundengine.h" #include "soundengine.h"
@ -50,7 +51,7 @@ SettingsCache *settingsCache;
RNG_Abstract *rng; RNG_Abstract *rng;
SoundEngine *soundEngine; SoundEngine *soundEngine;
QSystemTrayIcon *trayIcon; QSystemTrayIcon *trayIcon;
ThemeManager *themeManager;
const QString translationPrefix = "cockatrice"; const QString translationPrefix = "cockatrice";
#ifdef TRANSLATION_PATH #ifdef TRANSLATION_PATH
@ -132,6 +133,7 @@ int main(int argc, char *argv[])
rng = new RNG_SFMT; rng = new RNG_SFMT;
settingsCache = new SettingsCache; settingsCache = new SettingsCache;
themeManager = new ThemeManager;
db = new CardDatabase; db = new CardDatabase;
qtTranslator = new QTranslator; qtTranslator = new QTranslator;
@ -195,13 +197,14 @@ int main(int argc, char *argv[])
if (settingsValid()) { if (settingsValid()) {
qDebug("main(): starting main program"); qDebug("main(): starting main program");
soundEngine = new SoundEngine; soundEngine = new SoundEngine;
qDebug("main(): SoundEngine constructor finished"); qDebug("main(): SoundEngine constructor finished");
MainWindow ui; MainWindow ui;
qDebug("main(): MainWindow constructor finished"); qDebug("main(): MainWindow constructor finished");
QIcon icon(":/resources/appicon.svg"); QIcon icon("theme:appicon.svg");
ui.setWindowIcon(icon); ui.setWindowIcon(icon);
ui.show(); ui.show();

View file

@ -16,7 +16,7 @@ QPixmap PhasePixmapGenerator::generatePixmap(int height, QString name)
if (pmCache.contains(key)) if (pmCache.contains(key))
return pmCache.value(key); return pmCache.value(key);
QSvgRenderer svg(QString(":/resources/phases/icon_phase_" + name + ".svg")); QSvgRenderer svg(QString("theme:phases/icon_phase_" + name + ".svg"));
QPixmap pixmap(height, height); QPixmap pixmap(height, height);
pixmap.fill(Qt::transparent); pixmap.fill(Qt::transparent);
@ -36,13 +36,13 @@ QPixmap CounterPixmapGenerator::generatePixmap(int height, QString name, bool hi
if (pmCache.contains(key)) if (pmCache.contains(key))
return pmCache.value(key); return pmCache.value(key);
QSvgRenderer svg(QString(":/resources/counters/" + name + ".svg")); QSvgRenderer svg(QString("theme:counters/" + name + ".svg"));
if (!svg.isValid()) { if (!svg.isValid()) {
name = "general"; name = "general";
if (highlight) if (highlight)
name.append("_highlight"); name.append("_highlight");
svg.load(QString(":/resources/counters/" + name + ".svg")); svg.load(QString("theme:counters/" + name + ".svg"));
} }
int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height()); int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
@ -98,7 +98,7 @@ QPixmap GenderPixmapGenerator::generatePixmap(int height, int _gender)
default: genderStr = "unknown"; default: genderStr = "unknown";
}; };
QSvgRenderer svg(QString(":/resources/genders/" + genderStr + ".svg")); QSvgRenderer svg(QString("theme:genders/" + genderStr + ".svg"));
int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height()); int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
QPixmap pixmap(width, height); QPixmap pixmap(width, height);
pixmap.fill(Qt::transparent); pixmap.fill(Qt::transparent);
@ -119,7 +119,7 @@ QPixmap CountryPixmapGenerator::generatePixmap(int height, const QString &countr
if (pmCache.contains(key)) if (pmCache.contains(key))
return pmCache.value(key); return pmCache.value(key);
QSvgRenderer svg(QString(":/resources/countries/" + countryCode + ".svg")); QSvgRenderer svg(QString("theme:countries/" + countryCode + ".svg"));
int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height()); int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
QPixmap pixmap(width, height); QPixmap pixmap(width, height);
pixmap.fill(Qt::transparent); pixmap.fill(Qt::transparent);
@ -154,7 +154,7 @@ QPixmap UserLevelPixmapGenerator::generatePixmap(int height, UserLevelFlags user
if (isBuddy) if (isBuddy)
levelString.append("_buddy"); levelString.append("_buddy");
QSvgRenderer svg(QString(":/resources/userlevels/" + levelString + ".svg")); QSvgRenderer svg(QString("theme:userlevels/" + levelString + ".svg"));
int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height()); int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
QPixmap pixmap(width, height); QPixmap pixmap(width, height);
pixmap.fill(Qt::transparent); pixmap.fill(Qt::transparent);
@ -175,7 +175,7 @@ QPixmap LockPixmapGenerator::generatePixmap(int height)
if (pmCache.contains(key)) if (pmCache.contains(key))
return pmCache.value(key); return pmCache.value(key);
QSvgRenderer svg(QString(":/resources/lock.svg")); QSvgRenderer svg(QString("theme:lock.svg"));
int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height()); int width = (int) round(height * (double) svg.defaultSize().width() / (double) svg.defaultSize().height());
QPixmap pixmap(width, height); QPixmap pixmap(width, height);
pixmap.fill(Qt::transparent); pixmap.fill(Qt::transparent);

View file

@ -15,6 +15,7 @@
#include "tab_game.h" #include "tab_game.h"
#include "gamescene.h" #include "gamescene.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "dlg_create_token.h" #include "dlg_create_token.h"
#include "carddatabase.h" #include "carddatabase.h"
#include "color.h" #include "color.h"
@ -69,25 +70,18 @@ PlayerArea::PlayerArea(QGraphicsItem *parentItem)
: QObject(), QGraphicsItem(parentItem) : QObject(), QGraphicsItem(parentItem)
{ {
setCacheMode(DeviceCoordinateCache); setCacheMode(DeviceCoordinateCache);
connect(settingsCache, SIGNAL(playerBgPathChanged()), this, SLOT(updateBgPixmap())); connect(themeManager, SIGNAL(themeChanged()), this, SLOT(updateBg()));
updateBgPixmap(); updateBg();
} }
void PlayerArea::updateBgPixmap() void PlayerArea::updateBg()
{ {
QString bgPath = settingsCache->getPlayerBgPath();
if (bgPath.isEmpty())
bgPixmapBrush = QBrush(QColor(200, 200, 200));
else {
qDebug() << "loading" << bgPath;
bgPixmapBrush = QBrush(QPixmap(bgPath));
}
update(); update();
} }
void PlayerArea::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) void PlayerArea::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{ {
painter->fillRect(bRect, bgPixmapBrush); painter->fillRect(bRect, themeManager->getPlayerBgBrush());
} }
void PlayerArea::setSize(qreal width, qreal height) void PlayerArea::setSize(qreal width, qreal height)

View file

@ -60,10 +60,9 @@ class PlayerArea : public QObject, public QGraphicsItem {
Q_OBJECT Q_OBJECT
Q_INTERFACES(QGraphicsItem) Q_INTERFACES(QGraphicsItem)
private: private:
QBrush bgPixmapBrush;
QRectF bRect; QRectF bRect;
private slots: private slots:
void updateBgPixmap(); void updateBg();
public: public:
enum { Type = typeOther }; enum { Type = typeOther };
int type() const { return Type; } int type() const { return Type; }

View file

@ -51,12 +51,12 @@ bool PlayerListTWI::operator<(const QTreeWidgetItem &other) const
PlayerListWidget::PlayerListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, TabGame *_game, QWidget *parent) PlayerListWidget::PlayerListWidget(TabSupervisor *_tabSupervisor, AbstractClient *_client, TabGame *_game, QWidget *parent)
: QTreeWidget(parent), tabSupervisor(_tabSupervisor), client(_client), game(_game), gameStarted(false) : QTreeWidget(parent), tabSupervisor(_tabSupervisor), client(_client), game(_game), gameStarted(false)
{ {
readyIcon = QIcon(":/resources/icon_ready_start.svg"); readyIcon = QIcon("theme:icon_ready_start.svg");
notReadyIcon = QIcon(":/resources/icon_not_ready_start.svg"); notReadyIcon = QIcon("theme:icon_not_ready_start.svg");
concededIcon = QIcon(":/resources/icon_conceded.svg"); concededIcon = QIcon("theme:icon_conceded.svg");
playerIcon = QIcon(":/resources/icon_player.svg"); playerIcon = QIcon("theme:icon_player.svg");
spectatorIcon = QIcon(":/resources/icon_spectator.svg"); spectatorIcon = QIcon("theme:icon_spectator.svg");
lockIcon = QIcon(":/resources/lock.svg"); lockIcon = QIcon("theme:lock.svg");
if (tabSupervisor) { if (tabSupervisor) {
itemDelegate = new PlayerListItemDelegate(this); itemDelegate = new PlayerListItemDelegate(this);

View file

@ -35,7 +35,7 @@ RemoteReplayList_TreeModel::RemoteReplayList_TreeModel(AbstractClient *_client,
QFileIconProvider fip; QFileIconProvider fip;
dirIcon = fip.icon(QFileIconProvider::Folder); dirIcon = fip.icon(QFileIconProvider::Folder);
fileIcon = fip.icon(QFileIconProvider::File); fileIcon = fip.icon(QFileIconProvider::File);
lockIcon = QIcon(":/resources/lock.svg"); lockIcon = QIcon("theme:lock.svg");
refreshTree(); refreshTree();
} }

View file

@ -13,11 +13,7 @@ SettingsCache::SettingsCache()
cardDatabasePath = settings->value("paths/carddatabase").toString(); cardDatabasePath = settings->value("paths/carddatabase").toString();
tokenDatabasePath = settings->value("paths/tokendatabase").toString(); tokenDatabasePath = settings->value("paths/tokendatabase").toString();
handBgPath = settings->value("zonebg/hand").toString(); themeName = settings->value("theme/name").toString();
stackBgPath = settings->value("zonebg/stack").toString();
tableBgPath = settings->value("zonebg/table").toString();
playerBgPath = settings->value("zonebg/playerarea").toString();
cardBackPicturePath = settings->value("paths/cardbackpicture").toString();
// we only want to reset the cache once, then its up to the user // we only want to reset the cache once, then its up to the user
bool updateCache = settings->value("revert/pixmapCacheSize", false).toBool(); bool updateCache = settings->value("revert/pixmapCacheSize", false).toBool();
@ -155,39 +151,11 @@ void SettingsCache::setTokenDatabasePath(const QString &_tokenDatabasePath)
emit tokenDatabasePathChanged(); emit tokenDatabasePathChanged();
} }
void SettingsCache::setHandBgPath(const QString &_handBgPath) void SettingsCache::setThemeName(const QString &_themeName)
{ {
handBgPath = _handBgPath; themeName = _themeName;
settings->setValue("zonebg/hand", handBgPath); settings->setValue("theme/name", themeName);
emit handBgPathChanged(); emit themeChanged();
}
void SettingsCache::setStackBgPath(const QString &_stackBgPath)
{
stackBgPath = _stackBgPath;
settings->setValue("zonebg/stack", stackBgPath);
emit stackBgPathChanged();
}
void SettingsCache::setTableBgPath(const QString &_tableBgPath)
{
tableBgPath = _tableBgPath;
settings->setValue("zonebg/table", tableBgPath);
emit tableBgPathChanged();
}
void SettingsCache::setPlayerBgPath(const QString &_playerBgPath)
{
playerBgPath = _playerBgPath;
settings->setValue("zonebg/playerarea", playerBgPath);
emit playerBgPathChanged();
}
void SettingsCache::setCardBackPicturePath(const QString &_cardBackPicturePath)
{
cardBackPicturePath = _cardBackPicturePath;
settings->setValue("paths/cardbackpicture", cardBackPicturePath);
emit cardBackPicturePathChanged();
} }
void SettingsCache::setPicDownload(int _picDownload) void SettingsCache::setPicDownload(int _picDownload)

View file

@ -21,11 +21,7 @@ signals:
void picsPathChanged(); void picsPathChanged();
void cardDatabasePathChanged(); void cardDatabasePathChanged();
void tokenDatabasePathChanged(); void tokenDatabasePathChanged();
void handBgPathChanged(); void themeChanged();
void stackBgPathChanged();
void tableBgPathChanged();
void playerBgPathChanged();
void cardBackPicturePathChanged();
void picDownloadChanged(); void picDownloadChanged();
void picDownloadHqChanged(); void picDownloadHqChanged();
void displayCardNamesChanged(); void displayCardNamesChanged();
@ -45,8 +41,7 @@ private:
QByteArray mainWindowGeometry; QByteArray mainWindowGeometry;
QString lang; QString lang;
QString deckPath, replaysPath, picsPath, cardDatabasePath, tokenDatabasePath; QString deckPath, replaysPath, picsPath, cardDatabasePath, tokenDatabasePath, themeName;
QString handBgPath, stackBgPath, tableBgPath, playerBgPath, cardBackPicturePath;
bool picDownload; bool picDownload;
bool picDownloadHq; bool picDownloadHq;
bool notificationsEnabled; bool notificationsEnabled;
@ -91,11 +86,7 @@ public:
QString getPicsPath() const { return picsPath; } QString getPicsPath() const { return picsPath; }
QString getCardDatabasePath() const { return cardDatabasePath; } QString getCardDatabasePath() const { return cardDatabasePath; }
QString getTokenDatabasePath() const { return tokenDatabasePath; } QString getTokenDatabasePath() const { return tokenDatabasePath; }
QString getHandBgPath() const { return handBgPath; } QString getThemeName() const { return themeName; }
QString getStackBgPath() const { return stackBgPath; }
QString getTableBgPath() const { return tableBgPath; }
QString getPlayerBgPath() const { return playerBgPath; }
QString getCardBackPicturePath() const { return cardBackPicturePath; }
QString getChatMentionColor() const { return chatMentionColor; } QString getChatMentionColor() const { return chatMentionColor; }
bool getPicDownload() const { return picDownload; } bool getPicDownload() const { return picDownload; }
bool getPicDownloadHq() const { return picDownloadHq; } bool getPicDownloadHq() const { return picDownloadHq; }
@ -146,11 +137,7 @@ public slots:
void setPicsPath(const QString &_picsPath); void setPicsPath(const QString &_picsPath);
void setCardDatabasePath(const QString &_cardDatabasePath); void setCardDatabasePath(const QString &_cardDatabasePath);
void setTokenDatabasePath(const QString &_tokenDatabasePath); void setTokenDatabasePath(const QString &_tokenDatabasePath);
void setHandBgPath(const QString &_handBgPath); void setThemeName(const QString &_themeName);
void setStackBgPath(const QString &_stackBgPath);
void setTableBgPath(const QString &_tableBgPath);
void setPlayerBgPath(const QString &_playerBgPath);
void setCardBackPicturePath(const QString &_cardBackPicturePath);
void setChatMentionColor(const QString &_chatMentionColor); void setChatMentionColor(const QString &_chatMentionColor);
void setPicDownload(int _picDownload); void setPicDownload(int _picDownload);
void setPicDownloadHq(int _picDownloadHq); void setPicDownloadHq(int _picDownloadHq);

View file

@ -3,6 +3,7 @@
#include "arrowitem.h" #include "arrowitem.h"
#include "stackzone.h" #include "stackzone.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "player.h" #include "player.h"
#include "carddragitem.h" #include "carddragitem.h"
#include "carditem.h" #include "carditem.h"
@ -12,16 +13,13 @@
StackZone::StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent) StackZone::StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent)
: SelectZone(_p, "stack", false, false, true, parent), zoneHeight(_zoneHeight) : SelectZone(_p, "stack", false, false, true, parent), zoneHeight(_zoneHeight)
{ {
connect(settingsCache, SIGNAL(stackBgPathChanged()), this, SLOT(updateBgPixmap())); connect(themeManager, SIGNAL(themeChanged()), this, SLOT(updateBg()));
updateBgPixmap(); updateBg();
setCacheMode(DeviceCoordinateCache); setCacheMode(DeviceCoordinateCache);
} }
void StackZone::updateBgPixmap() void StackZone::updateBg()
{ {
QString bgPath = settingsCache->getStackBgPath();
if (!bgPath.isEmpty())
bgPixmap.load(bgPath);
update(); update();
} }
@ -48,10 +46,7 @@ QRectF StackZone::boundingRect() const
void StackZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) void StackZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{ {
if (bgPixmap.isNull()) painter->fillRect(boundingRect(), themeManager->getStackBgBrush());
painter->fillRect(boundingRect(), QColor(113, 43, 43));
else
painter->fillRect(boundingRect(), QBrush(bgPixmap));
} }
void StackZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/) void StackZone::handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &/*dropPoint*/)

View file

@ -7,9 +7,8 @@ class StackZone : public SelectZone {
Q_OBJECT Q_OBJECT
private: private:
qreal zoneHeight; qreal zoneHeight;
QPixmap bgPixmap;
private slots: private slots:
void updateBgPixmap(); void updateBg();
public: public:
StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent = 0); StackZone(Player *_p, int _zoneHeight, QGraphicsItem *parent = 0);
void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint); void handleDropEvent(const QList<CardDragItem *> &dragItems, CardZone *startZone, const QPoint &dropPoint);

View file

@ -51,16 +51,16 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent)
: Tab(_tabSupervisor, parent), modified(false) : Tab(_tabSupervisor, parent), modified(false)
{ {
aClearFilterAll = new QAction(QString(), this); aClearFilterAll = new QAction(QString(), this);
aClearFilterAll->setIcon(QIcon(":/resources/icon_clearsearch.svg")); aClearFilterAll->setIcon(QIcon("theme:icon_clearsearch.svg"));
connect(aClearFilterAll, SIGNAL(triggered()), this, SLOT(actClearFilterAll())); connect(aClearFilterAll, SIGNAL(triggered()), this, SLOT(actClearFilterAll()));
aClearFilterOne = new QAction(QString(), this); aClearFilterOne = new QAction(QString(), this);
aClearFilterOne->setIcon(QIcon(":/resources/decrement.svg")); aClearFilterOne->setIcon(QIcon("theme:decrement.svg"));
connect(aClearFilterOne, SIGNAL(triggered()), this, SLOT(actClearFilterOne())); connect(aClearFilterOne, SIGNAL(triggered()), this, SLOT(actClearFilterOne()));
searchEdit = new SearchLineEdit; searchEdit = new SearchLineEdit;
#if QT_VERSION >= 0x050300 #if QT_VERSION >= 0x050300
searchEdit->addAction(QIcon(":/resources/icon_search_black.svg"), QLineEdit::LeadingPosition); searchEdit->addAction(QIcon("theme:icon_search_black.svg"), QLineEdit::LeadingPosition);
#endif #endif
searchEdit->setObjectName("searchEdit"); searchEdit->setObjectName("searchEdit");
@ -193,7 +193,7 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent)
/* Update price /* Update price
aUpdatePrices = new QAction(QString(), this); aUpdatePrices = new QAction(QString(), this);
aUpdatePrices->setIcon(QIcon(":/resources/icon_update.png")); aUpdatePrices->setIcon(QIcon("theme:icon_update.png"));
connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices())); connect(aUpdatePrices, SIGNAL(triggered()), this, SLOT(actUpdatePrices()));
if (!settingsCache->getPriceTagFeature()) if (!settingsCache->getPriceTagFeature())
aUpdatePrices->setVisible(false); aUpdatePrices->setVisible(false);
@ -282,19 +282,19 @@ TabDeckEditor::TabDeckEditor(TabSupervisor *_tabSupervisor, QWidget *parent)
addTabMenu(dbMenu); addTabMenu(dbMenu);
aAddCard = new QAction(QString(), this); aAddCard = new QAction(QString(), this);
aAddCard->setIcon(QIcon(":/resources/arrow_right_green.svg")); aAddCard->setIcon(QIcon("theme:arrow_right_green.svg"));
connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard())); connect(aAddCard, SIGNAL(triggered()), this, SLOT(actAddCard()));
aAddCardToSideboard = new QAction(QString(), this); aAddCardToSideboard = new QAction(QString(), this);
aAddCardToSideboard->setIcon(QIcon(":/resources/add_to_sideboard.svg")); aAddCardToSideboard->setIcon(QIcon("theme:add_to_sideboard.svg"));
connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard())); connect(aAddCardToSideboard, SIGNAL(triggered()), this, SLOT(actAddCardToSideboard()));
aRemoveCard = new QAction(QString(), this); aRemoveCard = new QAction(QString(), this);
aRemoveCard->setIcon(QIcon(":/resources/remove_row.svg")); aRemoveCard->setIcon(QIcon("theme:remove_row.svg"));
connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard())); connect(aRemoveCard, SIGNAL(triggered()), this, SLOT(actRemoveCard()));
aIncrement = new QAction(QString(), this); aIncrement = new QAction(QString(), this);
aIncrement->setIcon(QIcon(":/resources/increment.svg")); aIncrement->setIcon(QIcon("theme:increment.svg"));
connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement())); connect(aIncrement, SIGNAL(triggered()), this, SLOT(actIncrement()));
aDecrement = new QAction(QString(), this); aDecrement = new QAction(QString(), this);
aDecrement->setIcon(QIcon(":/resources/decrement.svg")); aDecrement->setIcon(QIcon("theme:decrement.svg"));
connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement())); connect(aDecrement, SIGNAL(triggered()), this, SLOT(actDecrement()));
deckEditToolBar->addAction(aAddCard); deckEditToolBar->addAction(aAddCard);

View file

@ -80,25 +80,25 @@ TabDeckStorage::TabDeckStorage(TabSupervisor *_tabSupervisor, AbstractClient *_c
hbox->addWidget(rightGroupBox); hbox->addWidget(rightGroupBox);
aOpenLocalDeck = new QAction(this); aOpenLocalDeck = new QAction(this);
aOpenLocalDeck->setIcon(QIcon(":/resources/pencil.svg")); aOpenLocalDeck->setIcon(QIcon("theme:pencil.svg"));
connect(aOpenLocalDeck, SIGNAL(triggered()), this, SLOT(actOpenLocalDeck())); connect(aOpenLocalDeck, SIGNAL(triggered()), this, SLOT(actOpenLocalDeck()));
aUpload = new QAction(this); aUpload = new QAction(this);
aUpload->setIcon(QIcon(":/resources/arrow_right_green.svg")); aUpload->setIcon(QIcon("theme:arrow_right_green.svg"));
connect(aUpload, SIGNAL(triggered()), this, SLOT(actUpload())); connect(aUpload, SIGNAL(triggered()), this, SLOT(actUpload()));
aDeleteLocalDeck = new QAction(this); aDeleteLocalDeck = new QAction(this);
aDeleteLocalDeck->setIcon(QIcon(":/resources/remove_row.svg")); aDeleteLocalDeck->setIcon(QIcon("theme:remove_row.svg"));
connect(aDeleteLocalDeck, SIGNAL(triggered()), this, SLOT(actDeleteLocalDeck())); connect(aDeleteLocalDeck, SIGNAL(triggered()), this, SLOT(actDeleteLocalDeck()));
aOpenRemoteDeck = new QAction(this); aOpenRemoteDeck = new QAction(this);
aOpenRemoteDeck->setIcon(QIcon(":/resources/pencil.svg")); aOpenRemoteDeck->setIcon(QIcon("theme:pencil.svg"));
connect(aOpenRemoteDeck, SIGNAL(triggered()), this, SLOT(actOpenRemoteDeck())); connect(aOpenRemoteDeck, SIGNAL(triggered()), this, SLOT(actOpenRemoteDeck()));
aDownload = new QAction(this); aDownload = new QAction(this);
aDownload->setIcon(QIcon(":/resources/arrow_left_green.svg")); aDownload->setIcon(QIcon("theme:arrow_left_green.svg"));
connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload())); connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload()));
aNewFolder = new QAction(this); aNewFolder = new QAction(this);
aNewFolder->setIcon(qApp->style()->standardIcon(QStyle::SP_FileDialogNewFolder)); aNewFolder->setIcon(qApp->style()->standardIcon(QStyle::SP_FileDialogNewFolder));
connect(aNewFolder, SIGNAL(triggered()), this, SLOT(actNewFolder())); connect(aNewFolder, SIGNAL(triggered()), this, SLOT(actNewFolder()));
aDeleteRemoteDeck = new QAction(this); aDeleteRemoteDeck = new QAction(this);
aDeleteRemoteDeck->setIcon(QIcon(":/resources/remove_row.svg")); aDeleteRemoteDeck->setIcon(QIcon("theme:remove_row.svg"));
connect(aDeleteRemoteDeck, SIGNAL(triggered()), this, SLOT(actDeleteRemoteDeck())); connect(aDeleteRemoteDeck, SIGNAL(triggered()), this, SLOT(actDeleteRemoteDeck()));
leftToolBar->addAction(aOpenLocalDeck); leftToolBar->addAction(aOpenLocalDeck);

View file

@ -305,17 +305,17 @@ TabGame::TabGame(TabSupervisor *_tabSupervisor, GameReplay *_replay)
replayStartButton = new QToolButton; replayStartButton = new QToolButton;
replayStartButton->setIconSize(QSize(32, 32)); replayStartButton->setIconSize(QSize(32, 32));
replayStartButton->setIcon(QIcon(":/resources/replay_start.svg")); replayStartButton->setIcon(QIcon("theme:replay_start.svg"));
connect(replayStartButton, SIGNAL(clicked()), this, SLOT(replayStartButtonClicked())); connect(replayStartButton, SIGNAL(clicked()), this, SLOT(replayStartButtonClicked()));
replayPauseButton = new QToolButton; replayPauseButton = new QToolButton;
replayPauseButton->setIconSize(QSize(32, 32)); replayPauseButton->setIconSize(QSize(32, 32));
replayPauseButton->setEnabled(false); replayPauseButton->setEnabled(false);
replayPauseButton->setIcon(QIcon(":/resources/replay_pause.svg")); replayPauseButton->setIcon(QIcon("theme:replay_pause.svg"));
connect(replayPauseButton, SIGNAL(clicked()), this, SLOT(replayPauseButtonClicked())); connect(replayPauseButton, SIGNAL(clicked()), this, SLOT(replayPauseButtonClicked()));
replayFastForwardButton = new QToolButton; replayFastForwardButton = new QToolButton;
replayFastForwardButton->setIconSize(QSize(32, 32)); replayFastForwardButton->setIconSize(QSize(32, 32));
replayFastForwardButton->setEnabled(false); replayFastForwardButton->setEnabled(false);
replayFastForwardButton->setIcon(QIcon(":/resources/replay_fastforward.svg")); replayFastForwardButton->setIcon(QIcon("theme:replay_fastforward.svg"));
replayFastForwardButton->setCheckable(true); replayFastForwardButton->setCheckable(true);
connect(replayFastForwardButton, SIGNAL(toggled(bool)), this, SLOT(replayFastForwardButtonToggled(bool))); connect(replayFastForwardButton, SIGNAL(toggled(bool)), this, SLOT(replayFastForwardButtonToggled(bool)));

View file

@ -78,22 +78,22 @@ TabReplays::TabReplays(TabSupervisor *_tabSupervisor, AbstractClient *_client)
hbox->addWidget(rightGroupBox); hbox->addWidget(rightGroupBox);
aOpenLocalReplay = new QAction(this); aOpenLocalReplay = new QAction(this);
aOpenLocalReplay->setIcon(QIcon(":/resources/icon_view.svg")); aOpenLocalReplay->setIcon(QIcon("theme:icon_view.svg"));
connect(aOpenLocalReplay, SIGNAL(triggered()), this, SLOT(actOpenLocalReplay())); connect(aOpenLocalReplay, SIGNAL(triggered()), this, SLOT(actOpenLocalReplay()));
aDeleteLocalReplay = new QAction(this); aDeleteLocalReplay = new QAction(this);
aDeleteLocalReplay->setIcon(QIcon(":/resources/remove_row.svg")); aDeleteLocalReplay->setIcon(QIcon("theme:remove_row.svg"));
connect(aDeleteLocalReplay, SIGNAL(triggered()), this, SLOT(actDeleteLocalReplay())); connect(aDeleteLocalReplay, SIGNAL(triggered()), this, SLOT(actDeleteLocalReplay()));
aOpenRemoteReplay = new QAction(this); aOpenRemoteReplay = new QAction(this);
aOpenRemoteReplay->setIcon(QIcon(":/resources/icon_view.svg")); aOpenRemoteReplay->setIcon(QIcon("theme:icon_view.svg"));
connect(aOpenRemoteReplay, SIGNAL(triggered()), this, SLOT(actOpenRemoteReplay())); connect(aOpenRemoteReplay, SIGNAL(triggered()), this, SLOT(actOpenRemoteReplay()));
aDownload = new QAction(this); aDownload = new QAction(this);
aDownload->setIcon(QIcon(":/resources/arrow_left_green.svg")); aDownload->setIcon(QIcon("theme:arrow_left_green.svg"));
connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload())); connect(aDownload, SIGNAL(triggered()), this, SLOT(actDownload()));
aKeep = new QAction(this); aKeep = new QAction(this);
aKeep->setIcon(QIcon(":/resources/lock.svg")); aKeep->setIcon(QIcon("theme:lock.svg"));
connect(aKeep, SIGNAL(triggered()), this, SLOT(actKeepRemoteReplay())); connect(aKeep, SIGNAL(triggered()), this, SLOT(actKeepRemoteReplay()));
aDeleteRemoteReplay = new QAction(this); aDeleteRemoteReplay = new QAction(this);
aDeleteRemoteReplay->setIcon(QIcon(":/resources/remove_row.svg")); aDeleteRemoteReplay->setIcon(QIcon("theme:remove_row.svg"));
connect(aDeleteRemoteReplay, SIGNAL(triggered()), this, SLOT(actDeleteRemoteReplay())); connect(aDeleteRemoteReplay, SIGNAL(triggered()), this, SLOT(actDeleteRemoteReplay()));
leftToolBar->addAction(aOpenLocalReplay); leftToolBar->addAction(aOpenLocalReplay);

View file

@ -68,7 +68,7 @@ TabRoom::TabRoom(TabSupervisor *_tabSupervisor, AbstractClient *_client, ServerI
connect(aOpenChatSettings, SIGNAL(triggered()), this, SLOT(actOpenChatSettings())); connect(aOpenChatSettings, SIGNAL(triggered()), this, SLOT(actOpenChatSettings()));
QToolButton *chatSettingsButton = new QToolButton; QToolButton *chatSettingsButton = new QToolButton;
chatSettingsButton->setIcon(QIcon(":/resources/icon_settings.svg")); chatSettingsButton->setIcon(QIcon("theme:icon_settings.svg"));
chatSettingsButton->setMenu(chatSettingsMenu); chatSettingsButton->setMenu(chatSettingsMenu);
chatSettingsButton->setPopupMode(QToolButton::InstantPopup); chatSettingsButton->setPopupMode(QToolButton::InstantPopup);

View file

@ -79,7 +79,7 @@ void CloseButton::paintEvent(QPaintEvent * /*event*/)
TabSupervisor::TabSupervisor(AbstractClient *_client, QWidget *parent) TabSupervisor::TabSupervisor(AbstractClient *_client, QWidget *parent)
: QTabWidget(parent), userInfo(0), client(_client), tabServer(0), tabUserLists(0), tabDeckStorage(0), tabReplays(0), tabAdmin(0) : QTabWidget(parent), userInfo(0), client(_client), tabServer(0), tabUserLists(0), tabDeckStorage(0), tabReplays(0), tabAdmin(0)
{ {
tabChangedIcon = new QIcon(":/resources/icon_tab_changed.svg"); tabChangedIcon = new QIcon("theme:icon_tab_changed.svg");
setElideMode(Qt::ElideRight); setElideMode(Qt::ElideRight);
setMovable(true); setMovable(true);
setIconSize(QSize(15, 15)); setIconSize(QSize(15, 15));

View file

@ -8,6 +8,7 @@
#include "tablezone.h" #include "tablezone.h"
#include "player.h" #include "player.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
#include "arrowitem.h" #include "arrowitem.h"
#include "carddragitem.h" #include "carddragitem.h"
#include "carddatabase.h" #include "carddatabase.h"
@ -16,20 +17,18 @@
#include "pb/command_move_card.pb.h" #include "pb/command_move_card.pb.h"
#include "pb/command_set_card_attr.pb.h" #include "pb/command_set_card_attr.pb.h"
const QColor TableZone::BACKGROUND_COLOR = QColor(100, 100, 100); const QColor TableZone::BACKGROUND_COLOR = QColor(100, 100, 100);
const QColor TableZone::FADE_MASK = QColor(0, 0, 0, 80); const QColor TableZone::FADE_MASK = QColor(0, 0, 0, 80);
const QColor TableZone::GRADIENT_COLOR = QColor(255, 255, 255, 150); const QColor TableZone::GRADIENT_COLOR = QColor(255, 255, 255, 150);
const QColor TableZone::GRADIENT_COLORLESS = QColor(255, 255, 255, 0); const QColor TableZone::GRADIENT_COLORLESS = QColor(255, 255, 255, 0);
TableZone::TableZone(Player *_p, QGraphicsItem *parent) TableZone::TableZone(Player *_p, QGraphicsItem *parent)
: SelectZone(_p, "table", true, false, true, parent), active(false) : SelectZone(_p, "table", true, false, true, parent), active(false)
{ {
connect(settingsCache, SIGNAL(tableBgPathChanged()), this, SLOT(updateBgPixmap())); connect(themeManager, SIGNAL(themeChanged()), this, SLOT(updateBg()));
connect(settingsCache, SIGNAL(invertVerticalCoordinateChanged()), this, SLOT(reorganizeCards())); connect(settingsCache, SIGNAL(invertVerticalCoordinateChanged()), this, SLOT(reorganizeCards()));
updateBgPixmap(); updateBg();
height = 2 * BOX_LINE_WIDTH + 3 * (CARD_HEIGHT + 20) + 2 * PADDING_Y; height = 2 * BOX_LINE_WIDTH + 3 * (CARD_HEIGHT + 20) + 2 * PADDING_Y;
width = MIN_WIDTH + 2 * MARGIN_X + 2 * BOX_LINE_WIDTH; width = MIN_WIDTH + 2 * MARGIN_X + 2 * BOX_LINE_WIDTH;
@ -44,11 +43,8 @@ TableZone::TableZone(Player *_p, QGraphicsItem *parent)
} }
void TableZone::updateBgPixmap() void TableZone::updateBg()
{ {
QString bgPath = settingsCache->getTableBgPath();
if (!bgPath.isEmpty())
backgroundPixelMap.load(bgPath);
update(); update();
} }
@ -67,11 +63,7 @@ bool TableZone::isInverted() const
void TableZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/) void TableZone::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{ {
// if no custom background is provided then use the default color painter->fillRect(boundingRect(), themeManager->getTableBgBrush());
if (backgroundPixelMap.isNull())
painter->fillRect(boundingRect(), BACKGROUND_COLOR);
else
painter->fillRect(boundingRect(), QBrush(backgroundPixelMap));
if (active) { if (active) {
paintZoneOutline(painter); paintZoneOutline(painter);

View file

@ -27,7 +27,7 @@ private:
static const int MIN_WIDTH = 15 * CARD_WIDTH / 2; static const int MIN_WIDTH = 15 * CARD_WIDTH / 2;
/* /*
Default background color, inactive mask and boarder gradient Default inactive mask and border gradient
*/ */
static const QColor BACKGROUND_COLOR; static const QColor BACKGROUND_COLOR;
static const QColor FADE_MASK; static const QColor FADE_MASK;
@ -42,11 +42,6 @@ private:
int height; int height;
int currentMinimumWidth; int currentMinimumWidth;
/*
Holds any custom background image for the TableZone
*/
QPixmap backgroundPixelMap;
/* /*
If this TableZone is currently active If this TableZone is currently active
*/ */
@ -58,7 +53,7 @@ private slots:
/** /**
Loads in any found custom background and updates Loads in any found custom background and updates
*/ */
void updateBgPixmap(); void updateBg();
public slots: public slots:
/** /**

View file

@ -0,0 +1,144 @@
#include "thememanager.h"
#include "settingscache.h"
#include <QApplication>
#include <QDebug>
#include <QColor>
#include <QLibraryInfo>
#if QT_VERSION < 0x050000
#include <QDesktopServices>
#else
#include <QStandardPaths>
#endif
#define DEFAULT_THEME_NAME "Default"
#define STYLE_CSS_NAME "style.css"
#define HANDZONE_BG_NAME "handzone"
#define PLAYERZONE_BG_NAME "playerzone"
#define STACKZONE_BG_NAME "stackzone"
#define TABLEZONE_BG_NAME "tablezone"
#define CARD_BACK_NAME "cardback"
ThemeManager::ThemeManager(QObject *parent)
:QObject(parent)
{
ensureThemeDirectoryExists();
connect(settingsCache, SIGNAL(themeChanged()), this, SLOT(themeChangedSlot()));
themeChangedSlot();
}
void ThemeManager::ensureThemeDirectoryExists()
{
if(settingsCache->getThemeName().isEmpty() ||
!getAvailableThemes().contains(settingsCache->getThemeName()))
{
qDebug() << "Theme name not set, setting default value";
settingsCache->setThemeName(DEFAULT_THEME_NAME);
}
}
QStringMap & ThemeManager::getAvailableThemes()
{
QDir dir;
availableThemes.clear();
// load themes from user profile dir
dir =
#if QT_VERSION < 0x050000
QDesktopServices::storageLocation(QDesktopServices::DataLocation) +
#else
QStandardPaths::standardLocations(QStandardPaths::DataLocation).first() +
#endif
"/themes";
foreach(QString themeName, dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name))
{
if(!availableThemes.contains(themeName))
availableThemes.insert(themeName, dir.absoluteFilePath(themeName));
}
// load themes from cockatrice system dir
#ifdef Q_OS_MAC
dir = qApp->applicationDirPath() + "/../Resources/themes";
#elif defined(Q_OS_WIN)
dir = qApp->applicationDirPath() + "/themes";
#else // linux
dir = qApp->applicationDirPath() + "/../share/cockatrice/themes";
#endif
foreach(QString themeName, dir.entryList(QDir::AllDirs | QDir::NoDotAndDotDot, QDir::Name))
{
if(!availableThemes.contains(themeName))
availableThemes.insert(themeName, dir.absoluteFilePath(themeName));
}
return availableThemes;
}
QBrush ThemeManager::loadBrush(QDir dir, QString fileName, QColor fallbackColor)
{
QBrush brush;
QPixmap tmp;
QStringList exts;
exts << ".png" << ".jpg" << ".jpeg" << ".gif" << ".bmp";
brush.setColor(fallbackColor);
brush.setStyle(Qt::SolidPattern);
foreach (const QString &ext, exts) {
if (dir.exists(fileName + ext)) {
tmp.load(dir.absoluteFilePath(fileName + ext));
if(!tmp.isNull())
brush.setTexture(tmp);
break;
}
}
return brush;
}
QPixmap ThemeManager::loadPixmap(QDir dir, QString fileName)
{
QPixmap pix;
QStringList exts;
exts << ".png" << ".jpg" << ".jpeg" << ".gif" << ".bmp";
foreach (const QString &ext, exts) {
if (dir.exists(fileName + ext)) {
pix.load(dir.absoluteFilePath(fileName + ext));
break;
}
}
return pix;
}
void ThemeManager::themeChangedSlot()
{
QString themeName = settingsCache->getThemeName();
qDebug() << "Theme changed:" << themeName;
QDir dir = getAvailableThemes().value(themeName);
// css
if(dir.exists(STYLE_CSS_NAME))
qApp->setStyleSheet("file:///" + dir.absoluteFilePath(STYLE_CSS_NAME));
else
qApp->setStyleSheet("");
// card background
cardBackPixmap = loadPixmap(dir, CARD_BACK_NAME);
// zones bg
dir.cd("zones");
handBgBrush = loadBrush(dir, HANDZONE_BG_NAME, QColor(80, 100, 50));
tableBgBrush = loadBrush(dir, TABLEZONE_BG_NAME, QColor(70, 50, 100));
playerBgBrush = loadBrush(dir, PLAYERZONE_BG_NAME, QColor(200, 200, 200));
stackBgBrush = loadBrush(dir, STACKZONE_BG_NAME, QColor(113, 43, 43));
// resources
QStringList resources;
resources << dir.absolutePath() << ":/resources";
QDir::setSearchPaths("theme", resources);
emit themeChanged();
}

View file

@ -0,0 +1,42 @@
#ifndef THEMEMANAGER_H
#define THEMEMANAGER_H
#include <QObject>
#include <QBrush>
#include <QPixmap>
#include <QMap>
#include <QDir>
#include <QString>
typedef QMap<QString, QString> QStringMap;
class QApplication;
class ThemeManager : public QObject {
Q_OBJECT
public:
ThemeManager(QObject *parent = 0);
private:
QBrush handBgBrush, stackBgBrush, tableBgBrush, playerBgBrush;
QPixmap cardBackPixmap;
QStringMap availableThemes;
protected:
void ensureThemeDirectoryExists();
QBrush loadBrush(QDir dir, QString fileName, QColor fallbackColor);
QPixmap loadPixmap(QDir dir, QString fileName);
public:
QBrush &getHandBgBrush() { return handBgBrush; }
QBrush &getStackBgBrush() { return stackBgBrush; }
QBrush &getTableBgBrush() { return tableBgBrush; }
QBrush &getPlayerBgBrush() { return playerBgBrush; }
QPixmap &getCardBackPixmap() { return cardBackPixmap; }
QStringMap &getAvailableThemes();
protected slots:
void themeChangedSlot();
signals:
void themeChanged();
};
extern ThemeManager * themeManager;
#endif

View file

@ -561,7 +561,7 @@ void MainWindow::createTrayIcon() {
trayIcon = new QSystemTrayIcon(this); trayIcon = new QSystemTrayIcon(this);
trayIcon->setContextMenu(trayIconMenu); trayIcon->setContextMenu(trayIconMenu);
trayIcon->setIcon(QIcon(":/resources/appicon.svg")); trayIcon->setIcon(QIcon("theme:appicon.svg"));
trayIcon->show(); trayIcon->show();
connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this, connect(trayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,

View file

@ -24,28 +24,28 @@ WndSets::WndSets(QWidget *parent)
setsEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum); setsEditToolBar->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Minimum);
aTop = new QAction(QString(), this); aTop = new QAction(QString(), this);
aTop->setIcon(QIcon(":/resources/arrow_top_green.svg")); aTop->setIcon(QIcon("theme:arrow_top_green.svg"));
aTop->setToolTip(tr("Move selected set to the top")); aTop->setToolTip(tr("Move selected set to the top"));
aTop->setEnabled(false); aTop->setEnabled(false);
connect(aTop, SIGNAL(triggered()), this, SLOT(actTop())); connect(aTop, SIGNAL(triggered()), this, SLOT(actTop()));
setsEditToolBar->addAction(aTop); setsEditToolBar->addAction(aTop);
aUp = new QAction(QString(), this); aUp = new QAction(QString(), this);
aUp->setIcon(QIcon(":/resources/arrow_up_green.svg")); aUp->setIcon(QIcon("theme:arrow_up_green.svg"));
aUp->setToolTip(tr("Move selected set up")); aUp->setToolTip(tr("Move selected set up"));
aUp->setEnabled(false); aUp->setEnabled(false);
connect(aUp, SIGNAL(triggered()), this, SLOT(actUp())); connect(aUp, SIGNAL(triggered()), this, SLOT(actUp()));
setsEditToolBar->addAction(aUp); setsEditToolBar->addAction(aUp);
aDown = new QAction(QString(), this); aDown = new QAction(QString(), this);
aDown->setIcon(QIcon(":/resources/arrow_down_green.svg")); aDown->setIcon(QIcon("theme:arrow_down_green.svg"));
aDown->setToolTip(tr("Move selected set down")); aDown->setToolTip(tr("Move selected set down"));
aDown->setEnabled(false); aDown->setEnabled(false);
connect(aDown, SIGNAL(triggered()), this, SLOT(actDown())); connect(aDown, SIGNAL(triggered()), this, SLOT(actDown()));
setsEditToolBar->addAction(aDown); setsEditToolBar->addAction(aDown);
aBottom = new QAction(QString(), this); aBottom = new QAction(QString(), this);
aBottom->setIcon(QIcon(":/resources/arrow_bottom_green.svg")); aBottom->setIcon(QIcon("theme:arrow_bottom_green.svg"));
aBottom->setToolTip(tr("Move selected set to the bottom")); aBottom->setToolTip(tr("Move selected set to the bottom"));
aBottom->setEnabled(false); aBottom->setEnabled(false);
connect(aBottom, SIGNAL(triggered()), this, SLOT(actBottom())); connect(aBottom, SIGNAL(triggered()), this, SLOT(actBottom()));

View file

@ -250,5 +250,5 @@ void ZoneViewWidget::zoneDeleted()
void ZoneViewWidget::initStyleOption(QStyleOption *option) const { void ZoneViewWidget::initStyleOption(QStyleOption *option) const {
QStyleOptionTitleBar *titleBar = qstyleoption_cast<QStyleOptionTitleBar *>(option); QStyleOptionTitleBar *titleBar = qstyleoption_cast<QStyleOptionTitleBar *>(option);
if (titleBar) if (titleBar)
titleBar->icon = QIcon(":/resources/appicon.svg"); titleBar->icon = QIcon("theme:appicon.svg");
} }

View file

@ -13,6 +13,7 @@ SET(oracle_SOURCES
src/oracleimporter.cpp src/oracleimporter.cpp
../cockatrice/src/carddatabase.cpp ../cockatrice/src/carddatabase.cpp
../cockatrice/src/settingscache.cpp ../cockatrice/src/settingscache.cpp
../cockatrice/src/thememanager.cpp
../cockatrice/src/qt-json/json.cpp ../cockatrice/src/qt-json/json.cpp
) )

View file

@ -7,9 +7,11 @@
#include "main.h" #include "main.h"
#include "oraclewizard.h" #include "oraclewizard.h"
#include "settingscache.h" #include "settingscache.h"
#include "thememanager.h"
QTranslator *translator, *qtTranslator; QTranslator *translator, *qtTranslator;
SettingsCache *settingsCache; SettingsCache *settingsCache;
ThemeManager *themeManager;
const QString translationPrefix = "oracle"; const QString translationPrefix = "oracle";
#ifdef TRANSLATION_PATH #ifdef TRANSLATION_PATH
@ -51,6 +53,7 @@ int main(int argc, char *argv[])
} }
settingsCache = new SettingsCache; settingsCache = new SettingsCache;
themeManager = new ThemeManager;
qtTranslator = new QTranslator; qtTranslator = new QTranslator;
translator = new QTranslator; translator = new QTranslator;

22
themes/CMakeLists.txt Normal file
View file

@ -0,0 +1,22 @@
# CMakeLists for themes directory
#
# add themes subfolders
SET(defthemes
Default
Fabric
Leather
Plasma
VelvetMarble
)
if(UNIX)
if(APPLE)
INSTALL(DIRECTORY ${defthemes} DESTINATION cockatrice.app/Contents/Resources/themes/)
else()
# Assume linux
INSTALL(DIRECTORY ${defthemes} DESTINATION share/cockatrice/themes/)
endif()
elseif(WIN32)
INSTALL(DIRECTORY ${defthemes} DESTINATION themes/)
endif()

View file

@ -0,0 +1 @@
0

View file

@ -0,0 +1 @@
0

View file

Before

Width:  |  Height:  |  Size: 313 KiB

After

Width:  |  Height:  |  Size: 313 KiB

View file

Before

Width:  |  Height:  |  Size: 147 KiB

After

Width:  |  Height:  |  Size: 147 KiB

View file

Before

Width:  |  Height:  |  Size: 154 KiB

After

Width:  |  Height:  |  Size: 154 KiB

View file

Before

Width:  |  Height:  |  Size: 257 KiB

After

Width:  |  Height:  |  Size: 257 KiB

View file

@ -0,0 +1 @@
0

View file

Before

Width:  |  Height:  |  Size: 151 KiB

After

Width:  |  Height:  |  Size: 151 KiB

View file

Before

Width:  |  Height:  |  Size: 160 KiB

After

Width:  |  Height:  |  Size: 160 KiB

View file

Before

Width:  |  Height:  |  Size: 165 KiB

After

Width:  |  Height:  |  Size: 165 KiB

View file

Before

Width:  |  Height:  |  Size: 174 KiB

After

Width:  |  Height:  |  Size: 174 KiB

View file

@ -0,0 +1 @@
0

View file

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View file

Before

Width:  |  Height:  |  Size: 90 KiB

After

Width:  |  Height:  |  Size: 90 KiB

View file

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 54 KiB

View file

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 50 KiB

View file

@ -0,0 +1 @@
0

View file

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View file

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

View file

Before

Width:  |  Height:  |  Size: 32 KiB

After

Width:  |  Height:  |  Size: 32 KiB

View file

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 41 KiB

View file

@ -1,16 +0,0 @@
# CMakeLists for zonebg/ directory
#
# Installs default "zone background" files
FILE(GLOB zonebg "${CMAKE_CURRENT_SOURCE_DIR}/*.png" "${CMAKE_CURRENT_SOURCE_DIR}/*.jpg")
if(UNIX)
if(APPLE)
INSTALL(FILES ${zonebg} DESTINATION cockatrice.app/Contents/Resources/zonebg/)
else()
# Assume linux
INSTALL(FILES ${zonebg} DESTINATION share/cockatrice/zonebg/)
endif()
elseif(WIN32)
INSTALL(FILES ${zonebg} DESTINATION zonebg/)
endif()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 37 KiB