mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-06-13 01:24:46 -07:00
Refactor Card Info Widgets (#5176)
* Refactor CardInfo Widgets to reside in their appropriate folder and to have a clearer naming structure. * Add optional HoverToZoom functionality to CardInfoPictureWidget (default: disabled) and utility class to display text over a CardInfoPictureWidget. * Patch CardInfoWidgets to use the new CardDatabaseManager. * Add HoverToZoom to CardInfoPictureWithTextOverlayWidget * Refactors and new signals for CardInfoPictureWidgets. * Address pull request comments (nullptr checks and additional comments, mostly.) * Reformat code so the linter will stop yelling at me. * Linting. * Fix the build. * Fix warnings. * Formatting, const qualifiers. * Sensibly call the base class's (QWidget) paint event. * Address PR comments (card picture). * QT Version check because enterEvent signature changed. * Linting. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
parent
c2fe3cda35
commit
c8336df49d
24 changed files with 785 additions and 177 deletions
|
|
@ -20,10 +20,10 @@ set(cockatrice_SOURCES
|
||||||
src/game/cards/card_database_parser/cockatrice_xml_4.cpp
|
src/game/cards/card_database_parser/cockatrice_xml_4.cpp
|
||||||
src/game/cards/card_drag_item.cpp
|
src/game/cards/card_drag_item.cpp
|
||||||
src/game/filters/filter_card.cpp
|
src/game/filters/filter_card.cpp
|
||||||
src/game/cards/card_frame.cpp
|
src/client/ui/widgets/cards/card_info_frame_widget.cpp
|
||||||
src/game/cards/card_info_picture.cpp
|
src/client/ui/widgets/cards/card_info_picture_widget.cpp
|
||||||
src/game/cards/card_info_text.cpp
|
src/client/ui/widgets/cards/card_info_text_widget.cpp
|
||||||
src/game/cards/card_info_widget.cpp
|
src/client/ui/widgets/cards/card_info_display_widget.cpp
|
||||||
src/game/cards/card_item.cpp
|
src/game/cards/card_item.cpp
|
||||||
src/game/cards/card_list.cpp
|
src/game/cards/card_list.cpp
|
||||||
src/game/zones/card_zone.cpp
|
src/game/zones/card_zone.cpp
|
||||||
|
|
@ -72,6 +72,8 @@ set(cockatrice_SOURCES
|
||||||
src/server/local_server.cpp
|
src/server/local_server.cpp
|
||||||
src/server/local_server_interface.cpp
|
src/server/local_server_interface.cpp
|
||||||
src/utility/logger.cpp
|
src/utility/logger.cpp
|
||||||
|
src/client/ui/widgets/cards/card_info_picture_enlarged_widget.cpp
|
||||||
|
src/client/ui/widgets/cards/card_info_picture_with_text_overlay_widget.cpp
|
||||||
src/main.cpp
|
src/main.cpp
|
||||||
src/server/message_log_widget.cpp
|
src/server/message_log_widget.cpp
|
||||||
src/server/pending_command.cpp
|
src/server/pending_command.cpp
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
#include "tab.h"
|
#include "tab.h"
|
||||||
|
|
||||||
#include "../../game/cards/card_info_widget.h"
|
#include "../ui/widgets/cards/card_info_display_widget.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QDebug>
|
#include <QDebug>
|
||||||
|
|
@ -18,7 +18,7 @@ void Tab::showCardInfoPopup(const QPoint &pos, const QString &cardName)
|
||||||
infoPopup->deleteLater();
|
infoPopup->deleteLater();
|
||||||
}
|
}
|
||||||
currentCardName = cardName;
|
currentCardName = cardName;
|
||||||
infoPopup = new CardInfoWidget(
|
infoPopup = new CardInfoDisplayWidget(
|
||||||
cardName, 0, Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
|
cardName, 0, Qt::Widget | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint | Qt::WindowStaysOnTopHint);
|
||||||
infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents);
|
infoPopup->setAttribute(Qt::WA_TransparentForMouseEvents);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -5,7 +5,7 @@
|
||||||
|
|
||||||
class QMenu;
|
class QMenu;
|
||||||
class TabSupervisor;
|
class TabSupervisor;
|
||||||
class CardInfoWidget;
|
class CardInfoDisplayWidget;
|
||||||
|
|
||||||
class Tab : public QMainWindow
|
class Tab : public QMainWindow
|
||||||
{
|
{
|
||||||
|
|
@ -27,7 +27,7 @@ protected slots:
|
||||||
private:
|
private:
|
||||||
QString currentCardName;
|
QString currentCardName;
|
||||||
bool contentsChanged;
|
bool contentsChanged;
|
||||||
CardInfoWidget *infoPopup;
|
CardInfoDisplayWidget *infoPopup;
|
||||||
QList<QMenu *> tabMenus;
|
QList<QMenu *> tabMenus;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
||||||
|
|
@ -2,12 +2,12 @@
|
||||||
|
|
||||||
#include "../../client/game_logic/abstract_client.h"
|
#include "../../client/game_logic/abstract_client.h"
|
||||||
#include "../../client/tapped_out_interface.h"
|
#include "../../client/tapped_out_interface.h"
|
||||||
|
#include "../../client/ui/widgets/cards/card_info_frame_widget.h"
|
||||||
#include "../../deck/deck_list_model.h"
|
#include "../../deck/deck_list_model.h"
|
||||||
#include "../../deck/deck_stats_interface.h"
|
#include "../../deck/deck_stats_interface.h"
|
||||||
#include "../../dialogs/dlg_load_deck_from_clipboard.h"
|
#include "../../dialogs/dlg_load_deck_from_clipboard.h"
|
||||||
#include "../../game/cards/card_database_manager.h"
|
#include "../../game/cards/card_database_manager.h"
|
||||||
#include "../../game/cards/card_database_model.h"
|
#include "../../game/cards/card_database_model.h"
|
||||||
#include "../../game/cards/card_frame.h"
|
|
||||||
#include "../../game/filters/filter_builder.h"
|
#include "../../game/filters/filter_builder.h"
|
||||||
#include "../../game/filters/filter_tree_model.h"
|
#include "../../game/filters/filter_tree_model.h"
|
||||||
#include "../../main.h"
|
#include "../../main.h"
|
||||||
|
|
@ -187,7 +187,7 @@ void TabDeckEditor::createDeckDock()
|
||||||
|
|
||||||
void TabDeckEditor::createCardInfoDock()
|
void TabDeckEditor::createCardInfoDock()
|
||||||
{
|
{
|
||||||
cardInfo = new CardFrame();
|
cardInfo = new CardInfoFrameWidget();
|
||||||
cardInfo->setObjectName("cardInfo");
|
cardInfo->setObjectName("cardInfo");
|
||||||
auto *cardInfoFrame = new QVBoxLayout;
|
auto *cardInfoFrame = new QVBoxLayout;
|
||||||
cardInfoFrame->setObjectName("cardInfoFrame");
|
cardInfoFrame->setObjectName("cardInfoFrame");
|
||||||
|
|
|
||||||
|
|
@ -14,7 +14,7 @@ class CardDatabaseDisplayModel;
|
||||||
class DeckListModel;
|
class DeckListModel;
|
||||||
class QTreeView;
|
class QTreeView;
|
||||||
|
|
||||||
class CardFrame;
|
class CardInfoFrameWidget;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class DeckLoader;
|
class DeckLoader;
|
||||||
|
|
@ -113,7 +113,7 @@ private:
|
||||||
|
|
||||||
QTreeView *deckView;
|
QTreeView *deckView;
|
||||||
KeySignals deckViewKeySignals;
|
KeySignals deckViewKeySignals;
|
||||||
CardFrame *cardInfo;
|
CardInfoFrameWidget *cardInfo;
|
||||||
SearchLineEdit *searchEdit;
|
SearchLineEdit *searchEdit;
|
||||||
KeySignals searchKeySignals;
|
KeySignals searchKeySignals;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "tab_game.h"
|
#include "tab_game.h"
|
||||||
|
|
||||||
|
#include "../../client/ui/widgets/cards/card_info_frame_widget.h"
|
||||||
#include "../../deck/deck_loader.h"
|
#include "../../deck/deck_loader.h"
|
||||||
#include "../../deck/deck_view.h"
|
#include "../../deck/deck_view.h"
|
||||||
#include "../../dialogs/dlg_create_game.h"
|
#include "../../dialogs/dlg_create_game.h"
|
||||||
|
|
@ -8,7 +9,6 @@
|
||||||
#include "../../game/board/arrow_item.h"
|
#include "../../game/board/arrow_item.h"
|
||||||
#include "../../game/cards/card_database.h"
|
#include "../../game/cards/card_database.h"
|
||||||
#include "../../game/cards/card_database_manager.h"
|
#include "../../game/cards/card_database_manager.h"
|
||||||
#include "../../game/cards/card_frame.h"
|
|
||||||
#include "../../game/cards/card_item.h"
|
#include "../../game/cards/card_item.h"
|
||||||
#include "../../game/game_scene.h"
|
#include "../../game/game_scene.h"
|
||||||
#include "../../game/game_view.h"
|
#include "../../game/game_view.h"
|
||||||
|
|
@ -597,7 +597,7 @@ void TabGame::retranslateUi()
|
||||||
|
|
||||||
aResetLayout->setText(tr("Reset layout"));
|
aResetLayout->setText(tr("Reset layout"));
|
||||||
|
|
||||||
cardInfo->retranslateUi();
|
cardInfoFrameWidget->retranslateUi();
|
||||||
|
|
||||||
QMapIterator<int, Player *> i(players);
|
QMapIterator<int, Player *> i(players);
|
||||||
while (i.hasNext())
|
while (i.hasNext())
|
||||||
|
|
@ -1380,7 +1380,7 @@ void TabGame::eventSetActivePhase(const Event_SetActivePhase &event,
|
||||||
|
|
||||||
void TabGame::newCardAdded(AbstractCardItem *card)
|
void TabGame::newCardAdded(AbstractCardItem *card)
|
||||||
{
|
{
|
||||||
connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfo, SLOT(setCard(AbstractCardItem *)));
|
connect(card, SIGNAL(hovered(AbstractCardItem *)), cardInfoFrameWidget, SLOT(setCard(AbstractCardItem *)));
|
||||||
connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString)));
|
connect(card, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString)));
|
||||||
connect(card, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
connect(card, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
||||||
connect(card, SIGNAL(cardShiftClicked(QString)), this, SLOT(linkCardToChat(QString)));
|
connect(card, SIGNAL(cardShiftClicked(QString)), this, SLOT(linkCardToChat(QString)));
|
||||||
|
|
@ -1809,18 +1809,18 @@ void TabGame::createDeckViewContainerWidget(bool bReplay)
|
||||||
|
|
||||||
void TabGame::viewCardInfo(const QString &cardName)
|
void TabGame::viewCardInfo(const QString &cardName)
|
||||||
{
|
{
|
||||||
cardInfo->setCard(cardName);
|
cardInfoFrameWidget->setCard(cardName);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TabGame::createCardInfoDock(bool bReplay)
|
void TabGame::createCardInfoDock(bool bReplay)
|
||||||
{
|
{
|
||||||
Q_UNUSED(bReplay);
|
Q_UNUSED(bReplay);
|
||||||
|
|
||||||
cardInfo = new CardFrame();
|
cardInfoFrameWidget = new CardInfoFrameWidget();
|
||||||
cardHInfoLayout = new QHBoxLayout;
|
cardHInfoLayout = new QHBoxLayout;
|
||||||
cardVInfoLayout = new QVBoxLayout;
|
cardVInfoLayout = new QVBoxLayout;
|
||||||
cardVInfoLayout->setContentsMargins(0, 0, 0, 0);
|
cardVInfoLayout->setContentsMargins(0, 0, 0, 0);
|
||||||
cardVInfoLayout->addWidget(cardInfo);
|
cardVInfoLayout->addWidget(cardInfoFrameWidget);
|
||||||
cardVInfoLayout->addLayout(cardHInfoLayout);
|
cardVInfoLayout->addLayout(cardHInfoLayout);
|
||||||
|
|
||||||
cardBoxLayoutWidget = new QWidget;
|
cardBoxLayoutWidget = new QWidget;
|
||||||
|
|
@ -1862,7 +1862,7 @@ void TabGame::createPlayerListDock(bool bReplay)
|
||||||
void TabGame::createMessageDock(bool bReplay)
|
void TabGame::createMessageDock(bool bReplay)
|
||||||
{
|
{
|
||||||
messageLog = new MessageLogWidget(tabSupervisor, tabSupervisor, this);
|
messageLog = new MessageLogWidget(tabSupervisor, tabSupervisor, this);
|
||||||
connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfo, SLOT(setCard(QString)));
|
connect(messageLog, SIGNAL(cardNameHovered(QString)), cardInfoFrameWidget, SLOT(setCard(QString)));
|
||||||
connect(messageLog, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString)));
|
connect(messageLog, SIGNAL(showCardInfoPopup(QPoint, QString)), this, SLOT(showCardInfoPopup(QPoint, QString)));
|
||||||
connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
connect(messageLog, SIGNAL(deleteCardInfoPopup(QString)), this, SLOT(deleteCardInfoPopup(QString)));
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,7 @@ class CardDatabase;
|
||||||
class GameView;
|
class GameView;
|
||||||
class DeckView;
|
class DeckView;
|
||||||
class GameScene;
|
class GameScene;
|
||||||
class CardFrame;
|
class CardInfoFrameWidget;
|
||||||
class MessageLogWidget;
|
class MessageLogWidget;
|
||||||
class QTimer;
|
class QTimer;
|
||||||
class QSplitter;
|
class QSplitter;
|
||||||
|
|
@ -149,7 +149,7 @@ private:
|
||||||
QToolButton *replayPlayButton, *replayFastForwardButton;
|
QToolButton *replayPlayButton, *replayFastForwardButton;
|
||||||
QAction *aReplaySkipForward, *aReplaySkipBackward, *aReplaySkipForwardBig, *aReplaySkipBackwardBig;
|
QAction *aReplaySkipForward, *aReplaySkipBackward, *aReplaySkipForwardBig, *aReplaySkipBackwardBig;
|
||||||
|
|
||||||
CardFrame *cardInfo;
|
CardInfoFrameWidget *cardInfoFrameWidget;
|
||||||
PlayerListWidget *playerListWidget;
|
PlayerListWidget *playerListWidget;
|
||||||
QLabel *timeElapsedLabel;
|
QLabel *timeElapsedLabel;
|
||||||
MessageLogWidget *messageLog;
|
MessageLogWidget *messageLog;
|
||||||
|
|
|
||||||
|
|
@ -1,23 +1,23 @@
|
||||||
#include "card_info_widget.h"
|
#include "card_info_display_widget.h"
|
||||||
|
|
||||||
#include "../../main.h"
|
#include "../../../../game/cards/card_database_manager.h"
|
||||||
#include "card_database_manager.h"
|
#include "../../../../game/cards/card_item.h"
|
||||||
#include "card_info_picture.h"
|
#include "../../../../main.h"
|
||||||
#include "card_info_text.h"
|
#include "card_info_picture_widget.h"
|
||||||
#include "card_item.h"
|
#include "card_info_text_widget.h"
|
||||||
|
|
||||||
#include <QApplication>
|
#include <QApplication>
|
||||||
#include <QScreen>
|
#include <QScreen>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
CardInfoWidget::CardInfoWidget(const QString &cardName, QWidget *parent, Qt::WindowFlags flags)
|
CardInfoDisplayWidget::CardInfoDisplayWidget(const QString &cardName, QWidget *parent, Qt::WindowFlags flags)
|
||||||
: QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH), info(nullptr)
|
: QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH), info(nullptr)
|
||||||
{
|
{
|
||||||
setContentsMargins(3, 3, 3, 3);
|
setContentsMargins(3, 3, 3, 3);
|
||||||
pic = new CardInfoPicture();
|
pic = new CardInfoPictureWidget();
|
||||||
pic->setObjectName("pic");
|
pic->setObjectName("pic");
|
||||||
text = new CardInfoText();
|
text = new CardInfoTextWidget();
|
||||||
text->setObjectName("text");
|
text->setObjectName("text");
|
||||||
connect(text, SIGNAL(linkActivated(const QString &)), this, SLOT(setCard(const QString &)));
|
connect(text, SIGNAL(linkActivated(const QString &)), this, SLOT(setCard(const QString &)));
|
||||||
|
|
||||||
|
|
@ -43,7 +43,7 @@ CardInfoWidget::CardInfoWidget(const QString &cardName, QWidget *parent, Qt::Win
|
||||||
resize(width(), sizeHint().height());
|
resize(width(), sizeHint().height());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoWidget::setCard(CardInfoPtr card)
|
void CardInfoDisplayWidget::setCard(CardInfoPtr card)
|
||||||
{
|
{
|
||||||
if (info)
|
if (info)
|
||||||
disconnect(info.data(), nullptr, this, nullptr);
|
disconnect(info.data(), nullptr, this, nullptr);
|
||||||
|
|
@ -55,7 +55,7 @@ void CardInfoWidget::setCard(CardInfoPtr card)
|
||||||
pic->setCard(info);
|
pic->setCard(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoWidget::setCard(const QString &cardName)
|
void CardInfoDisplayWidget::setCard(const QString &cardName)
|
||||||
{
|
{
|
||||||
setCard(CardDatabaseManager::getInstance()->guessCard(cardName));
|
setCard(CardDatabaseManager::getInstance()->guessCard(cardName));
|
||||||
if (info == nullptr) {
|
if (info == nullptr) {
|
||||||
|
|
@ -63,12 +63,12 @@ void CardInfoWidget::setCard(const QString &cardName)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoWidget::setCard(AbstractCardItem *card)
|
void CardInfoDisplayWidget::setCard(AbstractCardItem *card)
|
||||||
{
|
{
|
||||||
setCard(card->getInfo());
|
setCard(card->getInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoWidget::clear()
|
void CardInfoDisplayWidget::clear()
|
||||||
{
|
{
|
||||||
setCard((CardInfoPtr) nullptr);
|
setCard((CardInfoPtr) nullptr);
|
||||||
}
|
}
|
||||||
|
|
@ -1,28 +1,28 @@
|
||||||
#ifndef CARDINFOWIDGET_H
|
#ifndef CARDINFOWIDGET_H
|
||||||
#define CARDINFOWIDGET_H
|
#define CARDINFOWIDGET_H
|
||||||
|
|
||||||
#include "card_database.h"
|
#include "../../../../game/cards/card_database.h"
|
||||||
|
|
||||||
#include <QComboBox>
|
#include <QComboBox>
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
|
||||||
class CardInfoPicture;
|
class CardInfoPictureWidget;
|
||||||
class CardInfoText;
|
class CardInfoTextWidget;
|
||||||
class AbstractCardItem;
|
class AbstractCardItem;
|
||||||
|
|
||||||
class CardInfoWidget : public QFrame
|
class CardInfoDisplayWidget : public QFrame
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
private:
|
private:
|
||||||
qreal aspectRatio;
|
qreal aspectRatio;
|
||||||
CardInfoPtr info;
|
CardInfoPtr info;
|
||||||
CardInfoPicture *pic;
|
CardInfoPictureWidget *pic;
|
||||||
CardInfoText *text;
|
CardInfoTextWidget *text;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CardInfoWidget(const QString &cardName, QWidget *parent = nullptr, Qt::WindowFlags f = {});
|
explicit CardInfoDisplayWidget(const QString &cardName, QWidget *parent = nullptr, Qt::WindowFlags f = {});
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void setCard(CardInfoPtr card);
|
void setCard(CardInfoPtr card);
|
||||||
|
|
@ -1,22 +1,22 @@
|
||||||
#include "card_frame.h"
|
#include "card_info_frame_widget.h"
|
||||||
|
|
||||||
#include "../../main.h"
|
#include "../../../../game/cards/card_database_manager.h"
|
||||||
#include "../../settings/cache_settings.h"
|
#include "../../../../game/cards/card_item.h"
|
||||||
#include "card_database_manager.h"
|
#include "../../../../settings/cache_settings.h"
|
||||||
#include "card_info_picture.h"
|
#include "card_info_picture_widget.h"
|
||||||
#include "card_info_text.h"
|
#include "card_info_text_widget.h"
|
||||||
#include "card_item.h"
|
|
||||||
|
|
||||||
#include <QSplitter>
|
#include <QSplitter>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
CardFrame::CardFrame(const QString &cardName, QWidget *parent) : QTabWidget(parent), info(nullptr), cardTextOnly(false)
|
CardInfoFrameWidget::CardInfoFrameWidget(const QString &cardName, QWidget *parent)
|
||||||
|
: QTabWidget(parent), info(nullptr), cardTextOnly(false)
|
||||||
{
|
{
|
||||||
setContentsMargins(3, 3, 3, 3);
|
setContentsMargins(3, 3, 3, 3);
|
||||||
pic = new CardInfoPicture();
|
pic = new CardInfoPictureWidget();
|
||||||
pic->setObjectName("pic");
|
pic->setObjectName("pic");
|
||||||
text = new CardInfoText();
|
text = new CardInfoTextWidget();
|
||||||
text->setObjectName("text");
|
text->setObjectName("text");
|
||||||
connect(text, SIGNAL(linkActivated(const QString &)), this, SLOT(setCard(const QString &)));
|
connect(text, SIGNAL(linkActivated(const QString &)), this, SLOT(setCard(const QString &)));
|
||||||
|
|
||||||
|
|
@ -61,14 +61,14 @@ CardFrame::CardFrame(const QString &cardName, QWidget *parent) : QTabWidget(pare
|
||||||
setCard(CardDatabaseManager::getInstance()->getCard(cardName));
|
setCard(CardDatabaseManager::getInstance()->getCard(cardName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::retranslateUi()
|
void CardInfoFrameWidget::retranslateUi()
|
||||||
{
|
{
|
||||||
setTabText(ImageOnlyView, tr("Image"));
|
setTabText(ImageOnlyView, tr("Image"));
|
||||||
setTabText(TextOnlyView, tr("Description"));
|
setTabText(TextOnlyView, tr("Description"));
|
||||||
setTabText(ImageAndTextView, tr("Both"));
|
setTabText(ImageAndTextView, tr("Both"));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::setViewMode(int mode)
|
void CardInfoFrameWidget::setViewMode(int mode)
|
||||||
{
|
{
|
||||||
if (currentIndex() != mode)
|
if (currentIndex() != mode)
|
||||||
setCurrentIndex(mode);
|
setCurrentIndex(mode);
|
||||||
|
|
@ -90,7 +90,7 @@ void CardFrame::setViewMode(int mode)
|
||||||
SettingsCache::instance().setCardInfoViewMode(mode);
|
SettingsCache::instance().setCardInfoViewMode(mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::setCard(CardInfoPtr card)
|
void CardInfoFrameWidget::setCard(CardInfoPtr card)
|
||||||
{
|
{
|
||||||
if (info) {
|
if (info) {
|
||||||
disconnect(info.data(), nullptr, this, nullptr);
|
disconnect(info.data(), nullptr, this, nullptr);
|
||||||
|
|
@ -106,19 +106,19 @@ void CardFrame::setCard(CardInfoPtr card)
|
||||||
pic->setCard(info);
|
pic->setCard(info);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::setCard(const QString &cardName)
|
void CardInfoFrameWidget::setCard(const QString &cardName)
|
||||||
{
|
{
|
||||||
setCard(CardDatabaseManager::getInstance()->guessCard(cardName));
|
setCard(CardDatabaseManager::getInstance()->guessCard(cardName));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::setCard(AbstractCardItem *card)
|
void CardInfoFrameWidget::setCard(AbstractCardItem *card)
|
||||||
{
|
{
|
||||||
if (card) {
|
if (card) {
|
||||||
setCard(card->getInfo());
|
setCard(card->getInfo());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardFrame::clearCard()
|
void CardInfoFrameWidget::clearCard()
|
||||||
{
|
{
|
||||||
setCard((CardInfoPtr) nullptr);
|
setCard((CardInfoPtr) nullptr);
|
||||||
}
|
}
|
||||||
|
|
@ -1,23 +1,23 @@
|
||||||
#ifndef CARDFRAME_H
|
#ifndef CARDFRAME_H
|
||||||
#define CARDFRAME_H
|
#define CARDFRAME_H
|
||||||
|
|
||||||
#include "card_database.h"
|
#include "../../../../game/cards/card_database.h"
|
||||||
|
|
||||||
#include <QTabWidget>
|
#include <QTabWidget>
|
||||||
|
|
||||||
class AbstractCardItem;
|
class AbstractCardItem;
|
||||||
class CardInfoPicture;
|
class CardInfoPictureWidget;
|
||||||
class CardInfoText;
|
class CardInfoTextWidget;
|
||||||
class QVBoxLayout;
|
class QVBoxLayout;
|
||||||
class QSplitter;
|
class QSplitter;
|
||||||
|
|
||||||
class CardFrame : public QTabWidget
|
class CardInfoFrameWidget : public QTabWidget
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
private:
|
private:
|
||||||
CardInfoPtr info;
|
CardInfoPtr info;
|
||||||
CardInfoPicture *pic;
|
CardInfoPictureWidget *pic;
|
||||||
CardInfoText *text;
|
CardInfoTextWidget *text;
|
||||||
bool cardTextOnly;
|
bool cardTextOnly;
|
||||||
QWidget *tab1, *tab2, *tab3;
|
QWidget *tab1, *tab2, *tab3;
|
||||||
QVBoxLayout *tab1Layout, *tab2Layout, *tab3Layout;
|
QVBoxLayout *tab1Layout, *tab2Layout, *tab3Layout;
|
||||||
|
|
@ -30,7 +30,7 @@ public:
|
||||||
TextOnlyView,
|
TextOnlyView,
|
||||||
ImageAndTextView
|
ImageAndTextView
|
||||||
};
|
};
|
||||||
explicit CardFrame(const QString &cardName = QString(), QWidget *parent = nullptr);
|
explicit CardInfoFrameWidget(const QString &cardName = QString(), QWidget *parent = nullptr);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
|
@ -0,0 +1,95 @@
|
||||||
|
#include "card_info_picture_enlarged_widget.h"
|
||||||
|
|
||||||
|
#include "../../picture_loader.h"
|
||||||
|
|
||||||
|
#include <QPainterPath>
|
||||||
|
#include <QStylePainter>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructs a CardPictureEnlargedWidget.
|
||||||
|
* @param parent The parent widget.
|
||||||
|
*
|
||||||
|
* Sets the widget's window flags to keep it displayed as a tooltip overlay.
|
||||||
|
*/
|
||||||
|
CardInfoPictureEnlargedWidget::CardInfoPictureEnlargedWidget(QWidget *parent)
|
||||||
|
: QWidget(parent), pixmapDirty(true), info(nullptr)
|
||||||
|
{
|
||||||
|
setWindowFlags(Qt::ToolTip); // Keeps this widget on top of everything
|
||||||
|
setAttribute(Qt::WA_TranslucentBackground);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the pixmap based on the given size and card information.
|
||||||
|
* @param size The desired size for the loaded pixmap.
|
||||||
|
*
|
||||||
|
* If card information is available, it loads the card's specific pixmap. Otherwise, it loads a default card back
|
||||||
|
* pixmap.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureEnlargedWidget::loadPixmap(const QSize &size)
|
||||||
|
{
|
||||||
|
if (info) {
|
||||||
|
PictureLoader::getPixmap(enlargedPixmap, info, size);
|
||||||
|
} else {
|
||||||
|
PictureLoader::getCardBackPixmap(enlargedPixmap, size);
|
||||||
|
}
|
||||||
|
pixmapDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the pixmap for the widget based on a provided card.
|
||||||
|
* @param card The card information to load.
|
||||||
|
* @param size The desired size for the pixmap.
|
||||||
|
*
|
||||||
|
* Sets the widget's pixmap to the card image and resizes the widget to match the specified size. Triggers a repaint.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureEnlargedWidget::setCardPixmap(CardInfoPtr card, const QSize size)
|
||||||
|
{
|
||||||
|
info = std::move(card);
|
||||||
|
loadPixmap(size);
|
||||||
|
|
||||||
|
setFixedSize(size); // Set the widget size to the enlarged size
|
||||||
|
|
||||||
|
update(); // Trigger a repaint
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Custom paint event that draws the enlarged card image with rounded corners.
|
||||||
|
* @param event The paint event (unused).
|
||||||
|
*
|
||||||
|
* Checks if the pixmap is valid. Then, calculates the size and position for centering the
|
||||||
|
* scaled pixmap within the widget, applies rounded corners, and draws the pixmap.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureEnlargedWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
Q_UNUSED(event);
|
||||||
|
|
||||||
|
if (width() == 0 || height() == 0 || enlargedPixmap.isNull()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixmapDirty) {
|
||||||
|
loadPixmap(size());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scale the size of the pixmap to fit the widget while maintaining the aspect ratio
|
||||||
|
QSize scaledSize = enlargedPixmap.size().scaled(size().width(), size().height(), Qt::KeepAspectRatio);
|
||||||
|
|
||||||
|
// Calculate the position to center the scaled pixmap
|
||||||
|
QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
|
||||||
|
|
||||||
|
// Define the radius for rounded corners
|
||||||
|
qreal radius = 0.05 * scaledSize.width(); // Adjust the radius as needed for rounded corners
|
||||||
|
|
||||||
|
QStylePainter painter(this);
|
||||||
|
// Fill the background with transparent color to ensure rounded corners are rendered properly
|
||||||
|
painter.fillRect(rect(), Qt::transparent); // Use the transparent background
|
||||||
|
|
||||||
|
QPainterPath shape;
|
||||||
|
shape.addRoundedRect(QRect(topLeft, scaledSize), radius, radius);
|
||||||
|
painter.setClipPath(shape); // Set the clipping path
|
||||||
|
|
||||||
|
// Draw the pixmap scaled to the calculated size
|
||||||
|
painter.drawItemPixmap(QRect(topLeft, scaledSize), Qt::AlignCenter,
|
||||||
|
enlargedPixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,38 @@
|
||||||
|
#ifndef CARD_PICTURE_ENLARGED_WIDGET_H
|
||||||
|
#define CARD_PICTURE_ENLARGED_WIDGET_H
|
||||||
|
|
||||||
|
#include "../../../../game/cards/card_database.h"
|
||||||
|
|
||||||
|
#include <QPixmap>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class CardInfoPictureEnlargedWidget final : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
// Constructor
|
||||||
|
explicit CardInfoPictureEnlargedWidget(QWidget *parent = nullptr);
|
||||||
|
|
||||||
|
// Sets the card pixmap to display
|
||||||
|
void setCardPixmap(CardInfoPtr card, QSize size);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
// Handles the painting event for the enlarged card
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// Cached pixmap for the enlarged card
|
||||||
|
QPixmap enlargedPixmap;
|
||||||
|
|
||||||
|
// Tracks if the pixmap needs to be refreshed/redrawn
|
||||||
|
bool pixmapDirty;
|
||||||
|
|
||||||
|
// Card information (card data pointer)
|
||||||
|
CardInfoPtr info;
|
||||||
|
|
||||||
|
// Loads the enlarged card pixmap
|
||||||
|
void loadPixmap(const QSize &size);
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CARD_PICTURE_ENLARGED_WIDGET_H
|
||||||
|
|
@ -0,0 +1,238 @@
|
||||||
|
#include "card_info_picture_widget.h"
|
||||||
|
|
||||||
|
#include "../../../../game/cards/card_item.h"
|
||||||
|
#include "../../picture_loader.h"
|
||||||
|
|
||||||
|
#include <QMouseEvent>
|
||||||
|
#include <QStylePainter>
|
||||||
|
#include <QWidget>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @class CardInfoPictureWidget
|
||||||
|
* @brief Widget that displays an enlarged image of a card, loading the image based on the card's info or showing a
|
||||||
|
* default image.
|
||||||
|
*
|
||||||
|
* This widget can optionally display a larger version of the card's image when hovered over,
|
||||||
|
* depending on the `hoverToZoomEnabled` parameter.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructs a CardInfoPictureWidget.
|
||||||
|
* @param parent The parent widget, if any.
|
||||||
|
* @param hoverToZoomEnabled If this widget will spawn a larger widget when hovered over.
|
||||||
|
*
|
||||||
|
* Initializes the widget with a minimum height and sets the pixmap to a dirty state for initial loading.
|
||||||
|
*/
|
||||||
|
CardInfoPictureWidget::CardInfoPictureWidget(QWidget *parent, const bool hoverToZoomEnabled)
|
||||||
|
: QWidget(parent), info(nullptr), pixmapDirty(true), hoverToZoomEnabled(hoverToZoomEnabled)
|
||||||
|
{
|
||||||
|
setMinimumHeight(baseHeight);
|
||||||
|
if (hoverToZoomEnabled) {
|
||||||
|
setMouseTracking(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
enlargedPixmapWidget = new CardInfoPictureEnlargedWidget(this);
|
||||||
|
enlargedPixmapWidget->hide();
|
||||||
|
|
||||||
|
hoverTimer = new QTimer(this);
|
||||||
|
hoverTimer->setSingleShot(true);
|
||||||
|
connect(hoverTimer, &QTimer::timeout, this, &CardInfoPictureWidget::showEnlargedPixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the card to be displayed and updates the pixmap.
|
||||||
|
* @param card A shared pointer to the card information (CardInfoPtr).
|
||||||
|
*
|
||||||
|
* Disconnects any existing signal connections from the previous card info and connects to the `pixmapUpdated`
|
||||||
|
* signal of the new card to automatically update the pixmap when the card image changes.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::setCard(CardInfoPtr card)
|
||||||
|
{
|
||||||
|
if (info) {
|
||||||
|
disconnect(info.data(), nullptr, this, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
info = std::move(card);
|
||||||
|
|
||||||
|
if (info) {
|
||||||
|
connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
|
||||||
|
}
|
||||||
|
|
||||||
|
updatePixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the hover to zoom feature.
|
||||||
|
* @param enabled If true, enables the hover-to-zoom functionality; otherwise, disables it.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::setHoverToZoomEnabled(const bool enabled)
|
||||||
|
{
|
||||||
|
hoverToZoomEnabled = enabled;
|
||||||
|
setMouseTracking(enabled);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Handles widget resizing by updating the pixmap size.
|
||||||
|
* @param event The resize event (unused).
|
||||||
|
*
|
||||||
|
* Calls `updatePixmap()` to ensure the image scales appropriately when the widget is resized.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
updatePixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the scale factor for the widget.
|
||||||
|
* @param scale The scale factor to apply.
|
||||||
|
*
|
||||||
|
* Adjusts the widget's size according to the scale factor and updates the pixmap.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::setScaleFactor(const int scale)
|
||||||
|
{
|
||||||
|
const int newWidth = baseWidth + scale * 20;
|
||||||
|
const int newHeight = static_cast<int>(newWidth * aspectRatio);
|
||||||
|
|
||||||
|
scaleFactor = scale;
|
||||||
|
|
||||||
|
setFixedSize(newWidth, newHeight);
|
||||||
|
updatePixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Marks the pixmap as dirty and triggers a widget repaint.
|
||||||
|
*
|
||||||
|
* Sets `pixmapDirty` to true, indicating that the pixmap needs to be reloaded before the next display.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::updatePixmap()
|
||||||
|
{
|
||||||
|
pixmapDirty = true;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Loads the appropriate pixmap based on the current card info.
|
||||||
|
*
|
||||||
|
* If `info` is valid, loads the card's image. Otherwise, loads a default card back image.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::loadPixmap()
|
||||||
|
{
|
||||||
|
if (info) {
|
||||||
|
PictureLoader::getPixmap(resizedPixmap, info, size());
|
||||||
|
} else {
|
||||||
|
PictureLoader::getCardBackPixmap(resizedPixmap, size());
|
||||||
|
}
|
||||||
|
|
||||||
|
pixmapDirty = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Custom paint event that draws the card image with rounded corners.
|
||||||
|
* @param event The paint event (unused).
|
||||||
|
*
|
||||||
|
* Checks if the pixmap needs to be reloaded. Then, calculates the size and position for centering the
|
||||||
|
* scaled pixmap within the widget, applies rounded corners, and draws the pixmap.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::paintEvent(event);
|
||||||
|
if (width() == 0 || height() == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pixmapDirty) {
|
||||||
|
loadPixmap();
|
||||||
|
}
|
||||||
|
|
||||||
|
const QSize scaledSize = resizedPixmap.size().scaled(size(), Qt::KeepAspectRatio);
|
||||||
|
const QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
|
||||||
|
const qreal radius = 0.05 * scaledSize.width();
|
||||||
|
|
||||||
|
QStylePainter painter(this);
|
||||||
|
QPainterPath shape;
|
||||||
|
shape.addRoundedRect(QRect(topLeft, scaledSize), radius, radius);
|
||||||
|
painter.setClipPath(shape);
|
||||||
|
painter.drawItemPixmap(QRect(topLeft, scaledSize), Qt::AlignCenter, resizedPixmap);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides the recommended size for the widget based on the scale factor.
|
||||||
|
* @return The recommended widget size.
|
||||||
|
*/
|
||||||
|
QSize CardInfoPictureWidget::sizeHint() const
|
||||||
|
{
|
||||||
|
return {static_cast<int>(baseWidth * scaleFactor), static_cast<int>(baseHeight * scaleFactor)};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Starts the hover timer to show the enlarged pixmap on hover.
|
||||||
|
* @param event The enter event.
|
||||||
|
*/
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
void CardInfoPictureWidget::enterEvent(QEnterEvent *event)
|
||||||
|
#else
|
||||||
|
void CardInfoPictureWidget::enterEvent(QEvent *event)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
QWidget::enterEvent(event); // Call the base class implementation
|
||||||
|
|
||||||
|
// If hover-to-zoom is enabled, start the hover timer
|
||||||
|
if (hoverToZoomEnabled) {
|
||||||
|
hoverTimer->start(hoverActivateThresholdInMs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Emit signal indicating a card is being hovered on
|
||||||
|
emit hoveredOnCard(info);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Stops the hover timer and hides the enlarged pixmap when the mouse leaves.
|
||||||
|
* @param event The leave event.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::leaveEvent(QEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::leaveEvent(event);
|
||||||
|
if (hoverToZoomEnabled) {
|
||||||
|
hoverTimer->stop();
|
||||||
|
enlargedPixmapWidget->hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Moves the enlarged pixmap widget to follow the mouse cursor.
|
||||||
|
* @param event The mouse move event.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::mouseMoveEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
QWidget::mouseMoveEvent(event);
|
||||||
|
if (hoverToZoomEnabled && enlargedPixmapWidget->isVisible()) {
|
||||||
|
const QPointF cursorPos = QCursor::pos();
|
||||||
|
enlargedPixmapWidget->move(QPoint(static_cast<int>(cursorPos.x()) + enlargedPixmapOffset,
|
||||||
|
static_cast<int>(cursorPos.y()) + enlargedPixmapOffset));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Displays the enlarged version of the card's pixmap near the cursor.
|
||||||
|
*
|
||||||
|
* If card information is available, the enlarged pixmap is loaded, positioned near the cursor,
|
||||||
|
* and displayed.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWidget::showEnlargedPixmap() const
|
||||||
|
{
|
||||||
|
if (!info) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const QSize enlargedSize(static_cast<int>(size().width() * scaleFactor),
|
||||||
|
static_cast<int>(size().width() * aspectRatio * scaleFactor));
|
||||||
|
enlargedPixmapWidget->setCardPixmap(info, enlargedSize);
|
||||||
|
|
||||||
|
const QPointF cursorPos = QCursor::pos();
|
||||||
|
enlargedPixmapWidget->move(static_cast<int>(cursorPos.x()) + enlargedPixmapOffset,
|
||||||
|
static_cast<int>(cursorPos.y()) + enlargedPixmapOffset);
|
||||||
|
|
||||||
|
enlargedPixmapWidget->show();
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,67 @@
|
||||||
|
#ifndef CARD_INFO_PICTURE_H
|
||||||
|
#define CARD_INFO_PICTURE_H
|
||||||
|
|
||||||
|
#include "../../../../game/cards/card_database.h"
|
||||||
|
#include "card_info_picture_enlarged_widget.h"
|
||||||
|
|
||||||
|
#include <QTimer>
|
||||||
|
#include <QWidget>
|
||||||
|
|
||||||
|
class AbstractCardItem;
|
||||||
|
|
||||||
|
class CardInfoPictureWidget : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CardInfoPictureWidget(QWidget *parent = nullptr, bool hoverToZoomEnabled = false);
|
||||||
|
CardInfoPtr getInfo()
|
||||||
|
{
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
[[nodiscard]] QSize sizeHint() const override;
|
||||||
|
void setHoverToZoomEnabled(bool enabled);
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void setCard(CardInfoPtr card);
|
||||||
|
void setScaleFactor(int scale); // New slot for scaling
|
||||||
|
void updatePixmap();
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void hoveredOnCard(CardInfoPtr hoveredCard);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void resizeEvent(QResizeEvent *event) override;
|
||||||
|
void paintEvent(QPaintEvent *) override;
|
||||||
|
#if QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)
|
||||||
|
void enterEvent(QEnterEvent *event) override; // Qt6 signature
|
||||||
|
#else
|
||||||
|
void enterEvent(QEvent *event) override; // Qt5 signature
|
||||||
|
#endif
|
||||||
|
void leaveEvent(QEvent *event) override;
|
||||||
|
void mouseMoveEvent(QMouseEvent *event) override;
|
||||||
|
void loadPixmap();
|
||||||
|
[[nodiscard]] const QPixmap &getResizedPixmap() const
|
||||||
|
{
|
||||||
|
return resizedPixmap;
|
||||||
|
}
|
||||||
|
void showEnlargedPixmap() const;
|
||||||
|
|
||||||
|
private:
|
||||||
|
CardInfoPtr info;
|
||||||
|
qreal magicTheGatheringCardAspectRatio = 1.396;
|
||||||
|
qreal yuGiOhCardAspectRatio = 1.457;
|
||||||
|
qreal aspectRatio = magicTheGatheringCardAspectRatio;
|
||||||
|
int baseWidth = 200;
|
||||||
|
int baseHeight = 200;
|
||||||
|
double scaleFactor = 1.5;
|
||||||
|
QPixmap resizedPixmap;
|
||||||
|
bool pixmapDirty;
|
||||||
|
bool hoverToZoomEnabled;
|
||||||
|
int hoverActivateThresholdInMs = 500;
|
||||||
|
CardInfoPictureEnlargedWidget *enlargedPixmapWidget;
|
||||||
|
int enlargedPixmapOffset = 10;
|
||||||
|
QTimer *hoverTimer;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
@ -0,0 +1,216 @@
|
||||||
|
#include "card_info_picture_with_text_overlay_widget.h"
|
||||||
|
|
||||||
|
#include <QFontMetrics>
|
||||||
|
#include <QPainterPath>
|
||||||
|
#include <QStylePainter>
|
||||||
|
#include <QTextOption>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Constructs a CardPictureWithTextOverlay widget.
|
||||||
|
* @param parent The parent widget.
|
||||||
|
* @param hoverToZoomEnabled If this widget will spawn a larger widget when hovered over.
|
||||||
|
* @param textColor The color of the overlay text.
|
||||||
|
* @param outlineColor The color of the outline around the text.
|
||||||
|
* @param fontSize The font size of the overlay text.
|
||||||
|
* @param alignment The alignment of the text within the overlay.
|
||||||
|
*
|
||||||
|
* Sets the widget's size policy and default border style.
|
||||||
|
*/
|
||||||
|
CardInfoPictureWithTextOverlayWidget::CardInfoPictureWithTextOverlayWidget(QWidget *parent,
|
||||||
|
const bool hoverToZoomEnabled,
|
||||||
|
const QColor &textColor,
|
||||||
|
const QColor &outlineColor,
|
||||||
|
const int fontSize,
|
||||||
|
const Qt::Alignment alignment)
|
||||||
|
: CardInfoPictureWidget(parent, hoverToZoomEnabled), textColor(textColor), outlineColor(outlineColor),
|
||||||
|
fontSize(fontSize), textAlignment(alignment)
|
||||||
|
{
|
||||||
|
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the overlay text to be displayed on the card.
|
||||||
|
* @param text The text to overlay.
|
||||||
|
*
|
||||||
|
* Updates the widget to display the new overlay text.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::setOverlayText(const QString &text)
|
||||||
|
{
|
||||||
|
overlayText = text;
|
||||||
|
update(); // Trigger a redraw to display the updated text
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the color of the overlay text.
|
||||||
|
* @param color The new text color.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::setTextColor(const QColor &color)
|
||||||
|
{
|
||||||
|
textColor = color;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the outline color around the overlay text.
|
||||||
|
* @param color The new outline color.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::setOutlineColor(const QColor &color)
|
||||||
|
{
|
||||||
|
outlineColor = color;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the font size for the overlay text.
|
||||||
|
* @param size The new font size.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::setFontSize(const int size)
|
||||||
|
{
|
||||||
|
fontSize = size;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Sets the alignment of the overlay text within the widget.
|
||||||
|
* @param alignment The new text alignment.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::setTextAlignment(const Qt::Alignment alignment)
|
||||||
|
{
|
||||||
|
textAlignment = alignment;
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::mousePressEvent(QMouseEvent *event)
|
||||||
|
{
|
||||||
|
emit imageClicked(event, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Paints the widget, including both the card image and the text overlay.
|
||||||
|
* @param event The paint event.
|
||||||
|
*
|
||||||
|
* Draws the card image first, then overlays text on top. The text is wrapped and centered within the image.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::paintEvent(QPaintEvent *event)
|
||||||
|
{
|
||||||
|
// Call the base class's paintEvent to draw the card image
|
||||||
|
CardInfoPictureWidget::paintEvent(event);
|
||||||
|
|
||||||
|
// Now add the custom text overlay on top of the image
|
||||||
|
if (overlayText.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QStylePainter painter(this);
|
||||||
|
|
||||||
|
// Set text properties
|
||||||
|
QFont font = painter.font();
|
||||||
|
font.setPointSize(fontSize);
|
||||||
|
painter.setFont(font);
|
||||||
|
|
||||||
|
// Get the pixmap from the base class using the getter
|
||||||
|
const QPixmap &pixmap = getResizedPixmap();
|
||||||
|
if (!pixmap.isNull()) {
|
||||||
|
// Calculate size and position for drawing
|
||||||
|
const QSize scaledSize = pixmap.size().scaled(size(), Qt::KeepAspectRatio);
|
||||||
|
const QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
|
||||||
|
const QRect pixmapRect(topLeft, scaledSize);
|
||||||
|
|
||||||
|
// Prepare text wrapping
|
||||||
|
const QFontMetrics fontMetrics(font);
|
||||||
|
const int lineHeight = fontMetrics.height();
|
||||||
|
const int textWidth = pixmapRect.width();
|
||||||
|
QString wrappedText;
|
||||||
|
|
||||||
|
// Break the text into multiple lines to fit within the pixmap width
|
||||||
|
QString currentLine;
|
||||||
|
QStringList words = overlayText.split(' ');
|
||||||
|
for (const QString &word : words) {
|
||||||
|
if (fontMetrics.horizontalAdvance(currentLine + " " + word) > textWidth) {
|
||||||
|
wrappedText += currentLine + '\n';
|
||||||
|
currentLine = word;
|
||||||
|
} else {
|
||||||
|
if (!currentLine.isEmpty()) {
|
||||||
|
currentLine += " ";
|
||||||
|
}
|
||||||
|
currentLine += word;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
wrappedText += currentLine;
|
||||||
|
|
||||||
|
// Calculate total text block height
|
||||||
|
const int totalTextHeight = static_cast<int>(wrappedText.count('\n')) * lineHeight + lineHeight;
|
||||||
|
|
||||||
|
// Set up the text layout options
|
||||||
|
QTextOption textOption;
|
||||||
|
textOption.setAlignment(textAlignment);
|
||||||
|
|
||||||
|
// Create a text rectangle centered within the pixmap rect
|
||||||
|
auto textRect = QRect(pixmapRect.left(), pixmapRect.top(), pixmapRect.width(), totalTextHeight);
|
||||||
|
textRect.moveTop((pixmapRect.height() - totalTextHeight) / 2 + pixmapRect.top());
|
||||||
|
|
||||||
|
// Draw the outlined text
|
||||||
|
drawOutlinedText(painter, textRect, wrappedText, textOption);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Draws text with an outline for visibility.
|
||||||
|
* @param painter The painter to draw the text.
|
||||||
|
* @param textRect The rectangle area to draw the text in.
|
||||||
|
* @param text The text to display.
|
||||||
|
* @param textOption The text layout options, such as alignment.
|
||||||
|
*
|
||||||
|
* Draws an outline around the text to enhance readability before drawing the main text.
|
||||||
|
*/
|
||||||
|
void CardInfoPictureWithTextOverlayWidget::drawOutlinedText(QPainter &painter,
|
||||||
|
const QRect &textRect,
|
||||||
|
const QString &text,
|
||||||
|
const QTextOption &textOption) const
|
||||||
|
{
|
||||||
|
// Draw the black outline (outlineColor)
|
||||||
|
painter.setPen(outlineColor);
|
||||||
|
for (int dx = -1; dx <= 1; ++dx) {
|
||||||
|
for (int dy = -1; dy <= 1; ++dy) {
|
||||||
|
if (dx != 0 || dy != 0) {
|
||||||
|
QRect shiftedTextRect = textRect.translated(dx, dy);
|
||||||
|
painter.drawText(shiftedTextRect, text, textOption);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Draw the main text (textColor)
|
||||||
|
painter.setPen(textColor);
|
||||||
|
painter.drawText(textRect, text, textOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides the recommended size for this widget.
|
||||||
|
* @return The suggested widget size.
|
||||||
|
*/
|
||||||
|
QSize CardInfoPictureWithTextOverlayWidget::sizeHint() const
|
||||||
|
{
|
||||||
|
return CardInfoPictureWidget::sizeHint();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Provides the minimum recommended size for this widget.
|
||||||
|
* @return The minimum widget size.
|
||||||
|
*/
|
||||||
|
QSize CardInfoPictureWithTextOverlayWidget::minimumSizeHint() const
|
||||||
|
{
|
||||||
|
// Same as sizeHint, but ensure that there is at least some space for the pixmap
|
||||||
|
const QPixmap &pixmap = getResizedPixmap();
|
||||||
|
const QSize pixmapSize = pixmap.isNull() ? QSize(0, 0) : pixmap.size();
|
||||||
|
|
||||||
|
// Get the font metrics for the overlay text
|
||||||
|
QFont font;
|
||||||
|
font.setPointSize(fontSize);
|
||||||
|
const QFontMetrics fontMetrics(font);
|
||||||
|
|
||||||
|
// Calculate the height required for the text
|
||||||
|
const QStringList lines = overlayText.split('\n');
|
||||||
|
const int totalTextHeight = static_cast<int>(lines.size()) * fontMetrics.height();
|
||||||
|
|
||||||
|
// Return the maximum width and combined height
|
||||||
|
return {pixmapSize.width(), pixmapSize.height() + totalTextHeight};
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,50 @@
|
||||||
|
#ifndef CARD_PICTURE_WITH_TEXT_OVERLAY_H
|
||||||
|
#define CARD_PICTURE_WITH_TEXT_OVERLAY_H
|
||||||
|
|
||||||
|
#include "card_info_picture_widget.h"
|
||||||
|
|
||||||
|
#include <QColor>
|
||||||
|
#include <QSize>
|
||||||
|
#include <QTextOption>
|
||||||
|
|
||||||
|
class CardInfoPictureWithTextOverlayWidget final : public CardInfoPictureWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit CardInfoPictureWithTextOverlayWidget(QWidget *parent = nullptr,
|
||||||
|
bool hoverToZoomEnabled = false,
|
||||||
|
const QColor &textColor = Qt::white,
|
||||||
|
const QColor &outlineColor = Qt::black,
|
||||||
|
int fontSize = 12,
|
||||||
|
Qt::Alignment alignment = Qt::AlignCenter);
|
||||||
|
|
||||||
|
void setOverlayText(const QString &text);
|
||||||
|
void setTextColor(const QColor &color);
|
||||||
|
void setOutlineColor(const QColor &color);
|
||||||
|
void setFontSize(int size);
|
||||||
|
void setTextAlignment(Qt::Alignment alignment);
|
||||||
|
|
||||||
|
[[nodiscard]] QSize sizeHint() const override;
|
||||||
|
signals:
|
||||||
|
void imageClicked(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *instance);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void paintEvent(QPaintEvent *event) override;
|
||||||
|
void mousePressEvent(QMouseEvent *event) override;
|
||||||
|
[[nodiscard]] QSize minimumSizeHint() const override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
void drawOutlinedText(QPainter &painter,
|
||||||
|
const QRect &textRect,
|
||||||
|
const QString &text,
|
||||||
|
const QTextOption &textOption) const;
|
||||||
|
|
||||||
|
QString overlayText;
|
||||||
|
QColor textColor;
|
||||||
|
QColor outlineColor;
|
||||||
|
int fontSize;
|
||||||
|
Qt::Alignment textAlignment;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // CARD_PICTURE_WITH_TEXT_OVERLAY_H
|
||||||
|
|
@ -1,14 +1,13 @@
|
||||||
#include "card_info_text.h"
|
#include "card_info_text_widget.h"
|
||||||
|
|
||||||
#include "../../game/game_specific_terms.h"
|
#include "../../../../game/cards/card_item.h"
|
||||||
#include "../../main.h"
|
#include "../../../../game/game_specific_terms.h"
|
||||||
#include "card_item.h"
|
|
||||||
|
|
||||||
#include <QGridLayout>
|
#include <QGridLayout>
|
||||||
#include <QLabel>
|
#include <QLabel>
|
||||||
#include <QTextEdit>
|
#include <QTextEdit>
|
||||||
|
|
||||||
CardInfoText::CardInfoText(QWidget *parent) : QFrame(parent), info(nullptr)
|
CardInfoTextWidget::CardInfoTextWidget(QWidget *parent) : QFrame(parent), info(nullptr)
|
||||||
{
|
{
|
||||||
nameLabel = new QLabel;
|
nameLabel = new QLabel;
|
||||||
nameLabel->setOpenExternalLinks(false);
|
nameLabel->setOpenExternalLinks(false);
|
||||||
|
|
@ -27,7 +26,7 @@ CardInfoText::CardInfoText(QWidget *parent) : QFrame(parent), info(nullptr)
|
||||||
retranslateUi();
|
retranslateUi();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoText::setCard(CardInfoPtr card)
|
void CardInfoTextWidget::setCard(CardInfoPtr card)
|
||||||
{
|
{
|
||||||
if (card == nullptr) {
|
if (card == nullptr) {
|
||||||
nameLabel->setText("");
|
nameLabel->setText("");
|
||||||
|
|
@ -65,13 +64,13 @@ void CardInfoText::setCard(CardInfoPtr card)
|
||||||
textLabel->setText(card->getText());
|
textLabel->setText(card->getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoText::setInvalidCardName(const QString &cardName)
|
void CardInfoTextWidget::setInvalidCardName(const QString &cardName)
|
||||||
{
|
{
|
||||||
nameLabel->setText(tr("Unknown card:") + " " + cardName);
|
nameLabel->setText(tr("Unknown card:") + " " + cardName);
|
||||||
textLabel->setText("");
|
textLabel->setText("");
|
||||||
}
|
}
|
||||||
|
|
||||||
void CardInfoText::retranslateUi()
|
void CardInfoTextWidget::retranslateUi()
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* There's no way we can really translate the text currently being rendered.
|
* There's no way we can really translate the text currently being rendered.
|
||||||
|
|
@ -1,13 +1,13 @@
|
||||||
#ifndef CARDINFOTEXT_H
|
#ifndef CARDINFOTEXT_H
|
||||||
#define CARDINFOTEXT_H
|
#define CARDINFOTEXT_H
|
||||||
|
|
||||||
#include "card_database.h"
|
#include "../../../../game/cards/card_database.h"
|
||||||
|
|
||||||
#include <QFrame>
|
#include <QFrame>
|
||||||
class QLabel;
|
class QLabel;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
|
|
||||||
class CardInfoText : public QFrame
|
class CardInfoTextWidget : public QFrame
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
|
|
@ -17,7 +17,7 @@ private:
|
||||||
CardInfoPtr info;
|
CardInfoPtr info;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit CardInfoText(QWidget *parent = nullptr);
|
explicit CardInfoTextWidget(QWidget *parent = nullptr);
|
||||||
void retranslateUi();
|
void retranslateUi();
|
||||||
void setInvalidCardName(const QString &cardName);
|
void setInvalidCardName(const QString &cardName);
|
||||||
|
|
||||||
|
|
@ -1,8 +1,8 @@
|
||||||
#include "dlg_create_token.h"
|
#include "dlg_create_token.h"
|
||||||
|
|
||||||
|
#include "../client/ui/widgets/cards/card_info_picture_widget.h"
|
||||||
#include "../game/cards/card_database_manager.h"
|
#include "../game/cards/card_database_manager.h"
|
||||||
#include "../game/cards/card_database_model.h"
|
#include "../game/cards/card_database_model.h"
|
||||||
#include "../game/cards/card_info_picture.h"
|
|
||||||
#include "../main.h"
|
#include "../main.h"
|
||||||
#include "../settings/cache_settings.h"
|
#include "../settings/cache_settings.h"
|
||||||
#include "decklist.h"
|
#include "decklist.h"
|
||||||
|
|
@ -25,7 +25,7 @@
|
||||||
DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *parent)
|
DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *parent)
|
||||||
: QDialog(parent), predefinedTokens(_predefinedTokens)
|
: QDialog(parent), predefinedTokens(_predefinedTokens)
|
||||||
{
|
{
|
||||||
pic = new CardInfoPicture();
|
pic = new CardInfoPictureWidget();
|
||||||
pic->setObjectName("pic");
|
pic->setObjectName("pic");
|
||||||
|
|
||||||
nameLabel = new QLabel(tr("&Name:"));
|
nameLabel = new QLabel(tr("&Name:"));
|
||||||
|
|
|
||||||
|
|
@ -15,7 +15,7 @@ class QTreeView;
|
||||||
class DeckList;
|
class DeckList;
|
||||||
class CardDatabaseModel;
|
class CardDatabaseModel;
|
||||||
class TokenDisplayModel;
|
class TokenDisplayModel;
|
||||||
class CardInfoPicture;
|
class CardInfoPictureWidget;
|
||||||
|
|
||||||
class DlgCreateToken : public QDialog
|
class DlgCreateToken : public QDialog
|
||||||
{
|
{
|
||||||
|
|
@ -47,7 +47,7 @@ private:
|
||||||
QLineEdit *nameEdit, *ptEdit, *annotationEdit;
|
QLineEdit *nameEdit, *ptEdit, *annotationEdit;
|
||||||
QCheckBox *destroyCheckBox;
|
QCheckBox *destroyCheckBox;
|
||||||
QRadioButton *chooseTokenFromAllRadioButton, *chooseTokenFromDeckRadioButton;
|
QRadioButton *chooseTokenFromAllRadioButton, *chooseTokenFromDeckRadioButton;
|
||||||
CardInfoPicture *pic;
|
CardInfoPictureWidget *pic;
|
||||||
QTreeView *chooseTokenView;
|
QTreeView *chooseTokenView;
|
||||||
|
|
||||||
void updateSearchFieldWithoutUpdatingFilter(const QString &newValue) const;
|
void updateSearchFieldWithoutUpdatingFilter(const QString &newValue) const;
|
||||||
|
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
#include "card_info_picture.h"
|
|
||||||
|
|
||||||
#include "../../client/ui/picture_loader.h"
|
|
||||||
#include "../../main.h"
|
|
||||||
#include "card_item.h"
|
|
||||||
|
|
||||||
#include <QStylePainter>
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
CardInfoPicture::CardInfoPicture(QWidget *parent) : QWidget(parent), info(nullptr), pixmapDirty(true)
|
|
||||||
{
|
|
||||||
setMinimumHeight(100);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardInfoPicture::setCard(CardInfoPtr card)
|
|
||||||
{
|
|
||||||
if (info) {
|
|
||||||
disconnect(info.data(), nullptr, this, nullptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
info = card;
|
|
||||||
|
|
||||||
if (info) {
|
|
||||||
connect(info.data(), SIGNAL(pixmapUpdated()), this, SLOT(updatePixmap()));
|
|
||||||
}
|
|
||||||
|
|
||||||
updatePixmap();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardInfoPicture::resizeEvent(QResizeEvent *)
|
|
||||||
{
|
|
||||||
updatePixmap();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardInfoPicture::updatePixmap()
|
|
||||||
{
|
|
||||||
pixmapDirty = true;
|
|
||||||
update();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardInfoPicture::loadPixmap()
|
|
||||||
{
|
|
||||||
if (info)
|
|
||||||
PictureLoader::getPixmap(resizedPixmap, info, size());
|
|
||||||
else
|
|
||||||
PictureLoader::getCardBackPixmap(resizedPixmap, size());
|
|
||||||
}
|
|
||||||
|
|
||||||
void CardInfoPicture::paintEvent(QPaintEvent *)
|
|
||||||
{
|
|
||||||
if (width() == 0 || height() == 0)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (pixmapDirty)
|
|
||||||
loadPixmap();
|
|
||||||
|
|
||||||
QSize scaledSize = resizedPixmap.size().scaled(size(), Qt::KeepAspectRatio);
|
|
||||||
QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
|
|
||||||
qreal radius = 0.05 * scaledSize.width();
|
|
||||||
|
|
||||||
QStylePainter painter(this);
|
|
||||||
QPainterPath shape;
|
|
||||||
shape.addRoundedRect(QRect(topLeft, scaledSize), radius, radius);
|
|
||||||
painter.setClipPath(shape);
|
|
||||||
painter.drawItemPixmap(QRect(topLeft, scaledSize), Qt::AlignCenter, resizedPixmap);
|
|
||||||
}
|
|
||||||
|
|
@ -1,31 +0,0 @@
|
||||||
#ifndef CARDINFOPICTURE_H
|
|
||||||
#define CARDINFOPICTURE_H
|
|
||||||
|
|
||||||
#include "card_database.h"
|
|
||||||
|
|
||||||
#include <QWidget>
|
|
||||||
|
|
||||||
class AbstractCardItem;
|
|
||||||
|
|
||||||
class CardInfoPicture : public QWidget
|
|
||||||
{
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
private:
|
|
||||||
CardInfoPtr info;
|
|
||||||
QPixmap resizedPixmap;
|
|
||||||
bool pixmapDirty;
|
|
||||||
|
|
||||||
public:
|
|
||||||
CardInfoPicture(QWidget *parent = nullptr);
|
|
||||||
|
|
||||||
protected:
|
|
||||||
void resizeEvent(QResizeEvent *event);
|
|
||||||
void paintEvent(QPaintEvent *);
|
|
||||||
void loadPixmap();
|
|
||||||
public slots:
|
|
||||||
void setCard(CardInfoPtr card);
|
|
||||||
void updatePixmap();
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
|
||||||
2
vcpkg
2
vcpkg
|
|
@ -1 +1 @@
|
||||||
Subproject commit 8ec31e98fb07e3f9c2e5b6aed0737a76a693fc72
|
Subproject commit bb1ca2757bca8f8e372a4deb35943828e3b0d155
|
||||||
Loading…
Add table
Add a link
Reference in a new issue