[QtUtils] Adopt shared Qt helpers across the client (#7618)

* [QtUtils] Add parent lookup, layout clearing, scroll area and monospace helpers

* [QtUtils] Adopt shared Qt helpers across the client

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
This commit is contained in:
BruebachL 2026-10-24 08:26:21 +02:00 • committed by GitHub
parent 1e0fc35d94
commit ab13a6748f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
25 changed files with 60 additions and 178 deletions

View file

@ -12,6 +12,7 @@
#include "../card_dimensions.h" #include "../card_dimensions.h"
#include "../z_values.h" #include "../z_values.h"
#include "libcockatrice/utility/macros.h" #include "libcockatrice/utility/macros.h"
#include "libcockatrice/utility/qt_utils.h"
#include "view_zone.h" #include "view_zone.h"
#include <QAction> #include <QAction>
@ -356,12 +357,8 @@ QRectF ZoneViewWidget::closeButtonRect(QWidget *styleWidget) const
QGraphicsView *ZoneViewWidget::findDragView(QWidget *eventWidget) const QGraphicsView *ZoneViewWidget::findDragView(QWidget *eventWidget) const
{ {
QWidget *current = eventWidget; if (auto *view = QtUtils::findParentOfType<QGraphicsView>(eventWidget, true)) {
while (current) { return view;
if (auto *view = qobject_cast<QGraphicsView *>(current)) {
return view;
}
current = current->parentWidget();
} }
if (scene() && !scene()->views().isEmpty()) { if (scene() && !scene()->views().isEmpty()) {

View file

@ -19,6 +19,7 @@
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/game_specific_terms.h> #include <libcockatrice/card/game_specific_terms.h>
#include <libcockatrice/card/relation/card_relation.h> #include <libcockatrice/card/relation/card_relation.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <qobjectdefs.h> #include <qobjectdefs.h>
@ -33,9 +34,7 @@ CardInfoTextWidget::CardInfoTextWidget(QWidget *parent) : QFrame(parent)
textLabel->setReadOnly(true); textLabel->setReadOnly(true);
textLabel->setMinimumSize(35, 35); textLabel->setMinimumSize(35, 35);
propsScroll = new QScrollArea(this); propsScroll = QtUtils::makeScrollArea(this);
propsScroll->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
propsScroll->setWidgetResizable(true);
propsScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop); propsScroll->setAlignment(Qt::AlignLeft | Qt::AlignTop);
propsScroll->setContentsMargins(0, 0, 0, 0); propsScroll->setContentsMargins(0, 0, 0, 0);
propsScroll->setFrameStyle(QFrame::NoFrame); propsScroll->setFrameStyle(QFrame::NoFrame);

View file

@ -29,6 +29,7 @@
#include <QVariant> #include <QVariant>
#include <QtGlobal> #include <QtGlobal>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
class CardSizeWidget; class CardSizeWidget;
@ -179,15 +180,7 @@ void DeckCardZoneDisplayWidget::displayCards()
void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType) void DeckCardZoneDisplayWidget::refreshDisplayType(const DisplayType &_displayType)
{ {
displayType = _displayType; displayType = _displayType;
QLayoutItem *item; QtUtils::clearLayoutRec(cardGroupLayout);
while ((item = cardGroupLayout->takeAt(0)) != nullptr) {
if (item->widget()) {
item->widget()->deleteLater();
} else if (item->layout()) {
item->layout()->deleteLater();
}
delete item;
}
indexToWidgetMap.clear(); indexToWidgetMap.clear();

View file

@ -22,6 +22,7 @@
#include <QWidget> #include <QWidget>
#include <algorithm> #include <algorithm>
#include <libcockatrice/utility/color.h> #include <libcockatrice/utility/color.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <utility> #include <utility>
@ -47,12 +48,7 @@ ManaBaseWidget::ManaBaseWidget(QWidget *parent, DeckListStatisticsAnalyzer *anal
void ManaBaseWidget::updateDisplay() void ManaBaseWidget::updateDisplay()
{ {
// Clear previous widgets // Clear previous widgets
while (QLayoutItem *item = barLayout->takeAt(0)) { QtUtils::clearLayoutRec(barLayout);
if (item->widget()) {
item->widget()->deleteLater();
}
delete item;
}
auto &pipCount = analyzer->getProductionPipCount(); auto &pipCount = analyzer->getProductionPipCount();
auto &cardCount = analyzer->getProductionCardCount(); auto &cardCount = analyzer->getProductionCardCount();

View file

@ -21,6 +21,7 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <algorithm> #include <algorithm>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <utility> #include <utility>
@ -47,12 +48,7 @@ ManaDevotionWidget::ManaDevotionWidget(QWidget *parent, DeckListStatisticsAnalyz
void ManaDevotionWidget::updateDisplay() void ManaDevotionWidget::updateDisplay()
{ {
// Clear previous widgets // Clear previous widgets
while (QLayoutItem *item = barLayout->takeAt(0)) { QtUtils::clearLayoutRec(barLayout);
if (item->widget()) {
item->widget()->deleteLater();
}
delete item;
}
auto &pipCount = analyzer->getDevotionPipCount(); auto &pipCount = analyzer->getDevotionPipCount();
auto &cardCount = analyzer->getDevotionCardCount(); auto &cardCount = analyzer->getDevotionCardCount();

View file

@ -6,8 +6,6 @@
#include "libcockatrice/protocol/pb/serverinfo_report.pb.h" #include "libcockatrice/protocol/pb/serverinfo_report.pb.h"
#include <QAbstractItemView> #include <QAbstractItemView>
#include <QFont>
#include <QFontDatabase>
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QHeaderView> #include <QHeaderView>
@ -26,6 +24,7 @@
#include <libcockatrice/protocol/pb/response_report_details.pb.h> #include <libcockatrice/protocol/pb/response_report_details.pb.h>
#include <libcockatrice/protocol/pb/response_report_my_list.pb.h> #include <libcockatrice/protocol/pb/response_report_my_list.pb.h>
#include <libcockatrice/protocol/pending_command.h> #include <libcockatrice/protocol/pending_command.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <string> #include <string>
@ -70,13 +69,7 @@ DlgMyReports::DlgMyReports(AbstractClient *_client, QWidget *parent)
auto *chatGroup = new QGroupBox(tr("Chat Log Context")); auto *chatGroup = new QGroupBox(tr("Chat Log Context"));
chatLogEdit = new QTextEdit; chatLogEdit = new QTextEdit;
chatLogEdit->setReadOnly(true); chatLogEdit->setReadOnly(true);
QFont monoFont("monospace"); chatLogEdit->setFont(QtUtils::monospaceFont());
monoFont.setStyleHint(QFont::Monospace);
const int systemPointSize = QFontDatabase::systemFont(QFontDatabase::GeneralFont).pointSize();
if (systemPointSize > 0) {
monoFont.setPointSize(systemPointSize);
}
chatLogEdit->setFont(monoFont);
auto *chatLayout = new QVBoxLayout(chatGroup); auto *chatLayout = new QVBoxLayout(chatGroup);
chatLayout->setContentsMargins(4, 4, 4, 4); chatLayout->setContentsMargins(4, 4, 4, 4);
chatLayout->addWidget(chatLogEdit); chatLayout->addWidget(chatLogEdit);

View file

@ -5,8 +5,6 @@
#include <QComboBox> #include <QComboBox>
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QFont>
#include <QFontDatabase>
#include <QGridLayout> #include <QGridLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QLabel> #include <QLabel>
@ -21,6 +19,7 @@
#include <QVariant> #include <QVariant>
#include <libcockatrice/protocol/pb/command_report.pb.h> #include <libcockatrice/protocol/pb/command_report.pb.h>
#include <libcockatrice/protocol/pending_command.h> #include <libcockatrice/protocol/pending_command.h>
#include <libcockatrice/utility/qt_utils.h>
#include <libcockatrice/utility/report_categories.h> #include <libcockatrice/utility/report_categories.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <string> #include <string>
@ -92,13 +91,7 @@ DlgReportUser::DlgReportUser(AbstractClient *_client,
auto *chatLayout = new QVBoxLayout(chatGroup); auto *chatLayout = new QVBoxLayout(chatGroup);
chatLogEdit = new QTextEdit; chatLogEdit = new QTextEdit;
chatLogEdit->setReadOnly(true); chatLogEdit->setReadOnly(true);
QFont monoFont("monospace"); chatLogEdit->setFont(QtUtils::monospaceFont());
monoFont.setStyleHint(QFont::Monospace);
const int systemPointSize = QFontDatabase::systemFont(QFontDatabase::GeneralFont).pointSize();
if (systemPointSize > 0) {
monoFont.setPointSize(systemPointSize);
}
chatLogEdit->setFont(monoFont);
if (!_autoChatLog.isEmpty()) { if (!_autoChatLog.isEmpty()) {
chatLogEdit->setPlainText(_autoChatLog); chatLogEdit->setPlainText(_autoChatLog);
} else { } else {

View file

@ -50,6 +50,7 @@
#include <algorithm> #include <algorithm>
#include <functional> #include <functional>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qalgorithms.h> #include <qalgorithms.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <qobjectdefs.h> #include <qobjectdefs.h>
@ -71,10 +72,7 @@ DlgSelectSetForCards::DlgSelectSetForCards(QWidget *parent, DeckStateManager *de
QSplitter *splitter = new QSplitter(Qt::Vertical, this); QSplitter *splitter = new QSplitter(Qt::Vertical, this);
// Top scroll area // Top scroll area
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setWidgetResizable(true);
listContainer = new QWidget(scrollArea); listContainer = new QWidget(scrollArea);
listLayout = new QVBoxLayout(listContainer); listLayout = new QVBoxLayout(listContainer);
@ -90,10 +88,7 @@ DlgSelectSetForCards::DlgSelectSetForCards(QWidget *parent, DeckStateManager *de
leftLayout->setContentsMargins(0, 0, 0, 0); leftLayout->setContentsMargins(0, 0, 0, 0);
uneditedCardsLabel = new QLabel(this); uneditedCardsLabel = new QLabel(this);
uneditedCardsArea = new QScrollArea(this); uneditedCardsArea = QtUtils::makeScrollArea(this);
uneditedCardsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
uneditedCardsArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
uneditedCardsArea->setWidgetResizable(true);
uneditedCardsFlowWidget = uneditedCardsFlowWidget =
new FlowWidget(uneditedCardsArea, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); new FlowWidget(uneditedCardsArea, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
@ -109,10 +104,7 @@ DlgSelectSetForCards::DlgSelectSetForCards(QWidget *parent, DeckStateManager *de
rightLayout->setContentsMargins(0, 0, 0, 0); rightLayout->setContentsMargins(0, 0, 0, 0);
modifiedCardsLabel = new QLabel(this); modifiedCardsLabel = new QLabel(this);
modifiedCardsArea = new QScrollArea(this); modifiedCardsArea = QtUtils::makeScrollArea(this);
modifiedCardsArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
modifiedCardsArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
modifiedCardsArea->setWidgetResizable(true);
modifiedCardsFlowWidget = modifiedCardsFlowWidget =
new FlowWidget(modifiedCardsArea, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded); new FlowWidget(modifiedCardsArea, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);

View file

@ -60,6 +60,7 @@
#include <QWidget> #include <QWidget>
#include <QtGlobal> #include <QtGlobal>
#include <libcockatrice/settings/personal_settings.h> #include <libcockatrice/settings/personal_settings.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
/** /**
@ -71,10 +72,8 @@ static QScrollArea *makeScrollable(QWidget *widget)
{ {
widget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum); widget->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Maximum);
auto *scrollArea = new QScrollArea; auto *scrollArea = QtUtils::makeScrollArea();
scrollArea->setWidgetResizable(true);
scrollArea->setContentsMargins(0, 0, 0, 0); scrollArea->setContentsMargins(0, 0, 0, 0);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->horizontalScrollBar()->setEnabled(false); scrollArea->horizontalScrollBar()->setEnabled(false);
scrollArea->setWidget(widget); scrollArea->setWidget(widget);
return scrollArea; return scrollArea;
@ -625,13 +624,8 @@ void SettingsView::scrollToAndFlash(QWidget *target)
if (!target) { if (!target) {
return; return;
} }
QWidget *widget = target; if (auto *scrollArea = QtUtils::findParentOfType<QScrollArea>(target, true)) {
while (widget) { scrollArea->ensureWidgetVisible(target);
if (auto *scrollArea = qobject_cast<QScrollArea *>(widget)) {
scrollArea->ensureWidgetVisible(target);
break;
}
widget = widget->parentWidget();
} }
flashWidget(target); flashWidget(target);
} }

View file

@ -19,6 +19,7 @@
#include <QSize> #include <QSize>
#include <QSizePolicy> #include <QSizePolicy>
#include <QWidget> #include <QWidget>
#include <libcockatrice/utility/qt_utils.h>
/** /**
* @brief Constructs a FlowWidget. * @brief Constructs a FlowWidget.
@ -55,13 +56,9 @@ FlowWidget::FlowWidget(QWidget *parent,
// Scroll area (optional) // Scroll area (optional)
if (useScrollArea) { if (useScrollArea) {
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this, verticalPolicy, horizontalPolicy);
scrollArea->setWidgetResizable(true);
scrollArea->setMinimumSize(0, 0); scrollArea->setMinimumSize(0, 0);
scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); scrollArea->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
// Set scrollbar policies
scrollArea->setHorizontalScrollBarPolicy(horizontalPolicy);
scrollArea->setVerticalScrollBarPolicy(verticalPolicy);
} else { } else {
scrollArea = nullptr; scrollArea = nullptr;
} }
@ -136,13 +133,7 @@ void FlowWidget::removeWidget(QWidget *widgetToRemove) const
void FlowWidget::clearLayout() void FlowWidget::clearLayout()
{ {
if (flowLayout) { if (flowLayout) {
QLayoutItem *item; QtUtils::clearLayoutRec(flowLayout);
while ((item = flowLayout->takeAt(0))) {
if (item->widget()) {
item->widget()->deleteLater();
}
delete item;
}
} else { } else {
// Defensive fallback: recreate the layout if it was deleted externally. // Defensive fallback: recreate the layout if it was deleted externally.
flowLayout = new FlowLayout(container, flowDirection); flowLayout = new FlowLayout(container, flowDirection);

View file

@ -4,6 +4,7 @@
#include <QLayoutItem> #include <QLayoutItem>
#include <QWidget> #include <QWidget>
#include <libcockatrice/utility/qt_utils.h>
/** /**
* @class OverlapWidget * @class OverlapWidget
@ -80,11 +81,7 @@ void OverlapWidget::removeWidget(QWidget *widgetToRemove) const
void OverlapWidget::clearLayout() void OverlapWidget::clearLayout()
{ {
if (overlapLayout != nullptr) { if (overlapLayout != nullptr) {
QLayoutItem *item; QtUtils::clearLayoutRec(overlapLayout);
while ((item = overlapLayout->takeAt(0)) != nullptr) {
item->widget()->deleteLater();
delete item;
}
} }
// If layout is null, create a new layout; otherwise, reuse the existing one // If layout is null, create a new layout; otherwise, reuse the existing one

View file

@ -8,6 +8,7 @@
#include <QScrollArea> #include <QScrollArea>
#include <QSize> #include <QSize>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
SettingsPopupWidget::SettingsPopupWidget(QWidget *parent) : QWidget(parent, Qt::Popup | Qt::FramelessWindowHint) SettingsPopupWidget::SettingsPopupWidget(QWidget *parent) : QWidget(parent, Qt::Popup | Qt::FramelessWindowHint)
@ -54,11 +55,8 @@ void SettingsPopupWidget::adjustSizeToFitScreen()
if (contentHeight > maxHeight) { if (contentHeight > maxHeight) {
// Create a scroll area and add the container widget to it if not already created // Create a scroll area and add the container widget to it if not already created
if (!scrollArea) { if (!scrollArea) {
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this, Qt::ScrollBarAlwaysOn);
scrollArea->setWidgetResizable(true);
scrollArea->setFrameShape(QFrame::NoFrame); scrollArea->setFrameShape(QFrame::NoFrame);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); // No horizontal scrollbar
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); // Enable vertical scrollbar when needed
} }
// Set maximum height for the scroll area and show vertical scrollbar // Set maximum height for the scroll area and show vertical scrollbar

View file

@ -31,6 +31,7 @@
#include <functional> #include <functional>
#include <libcockatrice/card/import/card_name_normalizer.h> #include <libcockatrice/card/import/card_name_normalizer.h>
#include <libcockatrice/settings/cards_display_settings.h> #include <libcockatrice/settings/cards_display_settings.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qlogging.h> #include <qlogging.h>
#include <qnamespace.h> #include <qnamespace.h>
@ -66,10 +67,7 @@ ArchidektApiResponseDeckDisplayWidget::ArchidektApiResponseDeckDisplayWidget(QWi
connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::groupCriteriaChanged, this, connect(displayOptionsWidget, &VisualDeckDisplayOptionsWidget::groupCriteriaChanged, this,
&ArchidektApiResponseDeckDisplayWidget::onGroupCriteriaChange); &ArchidektApiResponseDeckDisplayWidget::onGroupCriteriaChange);
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
layout->addWidget(scrollArea); layout->addWidget(scrollArea);

View file

@ -49,6 +49,7 @@
#include <QtGlobal> #include <QtGlobal>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/settings/cards_display_settings.h> #include <libcockatrice/settings/cards_display_settings.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qlogging.h> #include <qlogging.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <version_string.h> #include <version_string.h>
@ -186,10 +187,7 @@ void TabArchidekt::initializeUi()
secondaryToolbarLayout->setSpacing(6); secondaryToolbarLayout->setSpacing(6);
// Scrollable results area // Scrollable results area
scrollArea = new QScrollArea(container); scrollArea = QtUtils::makeScrollArea(container);
scrollArea->setWidgetResizable(true);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
resultsContainer = new QWidget(); resultsContainer = new QWidget();
resultsLayout = new QVBoxLayout(resultsContainer); resultsLayout = new QVBoxLayout(resultsContainer);
@ -599,11 +597,7 @@ void TabArchidekt::processTopDecksResponse(QJsonObject reply)
// New search → clear everything // New search → clear everything
if (currentPage == 1) { if (currentPage == 1) {
QLayoutItem *item; QtUtils::clearLayoutRec(resultsLayout, QtUtils::DeletePolicy::Immediate);
while ((item = resultsLayout->takeAt(0)) != nullptr) {
delete item->widget();
delete item;
}
listingsWidget = new ArchidektApiResponseDeckListingsDisplayWidget(resultsContainer, deckData, cardSizeSlider); listingsWidget = new ArchidektApiResponseDeckListingsDisplayWidget(resultsContainer, deckData, cardSizeSlider);
@ -629,11 +623,7 @@ void TabArchidekt::processDeckResponse(QJsonObject reply)
isListMode = false; isListMode = false;
// Clear existing results for single deck view // Clear existing results for single deck view
QLayoutItem *item; QtUtils::clearLayoutRec(resultsLayout, QtUtils::DeletePolicy::Immediate);
while ((item = resultsLayout->takeAt(0)) != nullptr) {
delete item->widget();
delete item;
}
auto display = new ArchidektApiResponseDeckDisplayWidget(resultsContainer, deckData, cardSizeSlider); auto display = new ArchidektApiResponseDeckDisplayWidget(resultsContainer, deckData, cardSizeSlider);
connect(display, &ArchidektApiResponseDeckDisplayWidget::requestNavigation, this, &TabArchidekt::actNavigatePage); connect(display, &ArchidektApiResponseDeckDisplayWidget::requestNavigation, this, &TabArchidekt::actNavigatePage);

View file

@ -15,6 +15,7 @@
#include <QSlider> #include <QSlider>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
EdhrecApiResponseCardDetailsDisplayWidget::EdhrecApiResponseCardDetailsDisplayWidget( EdhrecApiResponseCardDetailsDisplayWidget::EdhrecApiResponseCardDetailsDisplayWidget(
@ -47,15 +48,7 @@ EdhrecApiResponseCardDetailsDisplayWidget::EdhrecApiResponseCardDetailsDisplayWi
layout->addWidget(backgroundPlateWidget); layout->addWidget(backgroundPlateWidget);
QWidget *currentParent = parentWidget(); auto *parentTab = QtUtils::findParentOfType<TabEdhRecMain>(this);
TabEdhRecMain *parentTab = nullptr;
while (currentParent) {
if ((parentTab = qobject_cast<TabEdhRecMain *>(currentParent))) {
break;
}
currentParent = currentParent->parentWidget();
}
if (parentTab) { if (parentTab) {
cardPictureWidget->setScaleFactor(parentTab->getCardSizeSlider()->getSlider()->value()); cardPictureWidget->setScaleFactor(parentTab->getCardSizeSlider()->getSlider()->value());

View file

@ -14,6 +14,7 @@
#include <QSlider> #include <QSlider>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCommanderDetailsDisplayWidget( EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCommanderDetailsDisplayWidget(
@ -33,15 +34,7 @@ EdhrecCommanderResponseCommanderDetailsDisplayWidget::EdhrecCommanderResponseCom
commanderPicture = new CardInfoPictureWidget(this); commanderPicture = new CardInfoPictureWidget(this);
commanderPicture->setCard(CardDatabaseManager::query()->getCard({commanderDetails.getName()})); commanderPicture->setCard(CardDatabaseManager::query()->getCard({commanderDetails.getName()}));
QWidget *currentParent = parentWidget(); auto *parentTab = QtUtils::findParentOfType<TabEdhRecMain>(this);
TabEdhRecMain *parentTab = nullptr;
while (currentParent) {
if ((parentTab = qobject_cast<TabEdhRecMain *>(currentParent))) {
break;
}
currentParent = currentParent->parentWidget();
}
if (parentTab) { if (parentTab) {
connect(parentTab->getCardSizeSlider()->getSlider(), &QSlider::valueChanged, commanderPicture, connect(parentTab->getCardSizeSlider()->getSlider(), &QSlider::valueChanged, commanderPicture,

View file

@ -21,6 +21,7 @@
#include <QStringList> #include <QStringList>
#include <QStringListModel> #include <QStringListModel>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qlogging.h> #include <qlogging.h>
#include <qnamespace.h> #include <qnamespace.h>
@ -61,10 +62,7 @@ EdhrecCommanderApiResponseDisplayWidget::EdhrecCommanderApiResponseDisplayWidget
} }
// Create a QScrollArea to hold the card display widgets // Create a QScrollArea to hold the card display widgets
scrollArea = new QScrollArea(splitter); scrollArea = QtUtils::makeScrollArea(splitter);
scrollArea->setWidgetResizable(true);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set the cardDisplayLayout inside the scroll area // Set the cardDisplayLayout inside the scroll area
auto scrollWidget = new QWidget(scrollArea); auto scrollWidget = new QWidget(scrollArea);

View file

@ -7,6 +7,7 @@
#include <QGridLayout> #include <QGridLayout>
#include <QObject> #include <QObject>
#include <QPushButton> #include <QPushButton>
#include <libcockatrice/utility/qt_utils.h>
EdhrecCommanderApiResponseNavigationWidget::EdhrecCommanderApiResponseNavigationWidget( EdhrecCommanderApiResponseNavigationWidget::EdhrecCommanderApiResponseNavigationWidget(
QWidget *parent, QWidget *parent,
@ -40,15 +41,7 @@ EdhrecCommanderApiResponseNavigationWidget::EdhrecCommanderApiResponseNavigation
layout->addWidget(bracketNavigationWidget, 1, 0, 1, 2); layout->addWidget(bracketNavigationWidget, 1, 0, 1, 2);
layout->addWidget(budgetNavigationWidget, 2, 0, 1, 2); layout->addWidget(budgetNavigationWidget, 2, 0, 1, 2);
QWidget *currentParent = parentWidget(); auto *parentTab = QtUtils::findParentOfType<TabEdhRecMain>(this);
TabEdhRecMain *parentTab = nullptr;
while (currentParent) {
if ((parentTab = qobject_cast<TabEdhRecMain *>(currentParent))) {
break;
}
currentParent = currentParent->parentWidget();
}
if (parentTab) { if (parentTab) {
connect(comboPushButton, &QPushButton::clicked, this, connect(comboPushButton, &QPushButton::clicked, this,

View file

@ -10,6 +10,7 @@
#include <QResizeEvent> #include <QResizeEvent>
#include <QScrollArea> #include <QScrollArea>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
EdhrecTopCardsApiResponseDisplayWidget::EdhrecTopCardsApiResponseDisplayWidget(QWidget *parent, EdhrecTopCardsApiResponseDisplayWidget::EdhrecTopCardsApiResponseDisplayWidget(QWidget *parent,
@ -29,10 +30,7 @@ EdhrecTopCardsApiResponseDisplayWidget::EdhrecTopCardsApiResponseDisplayWidget(Q
} }
// Create a QScrollArea to hold the card display widgets // Create a QScrollArea to hold the card display widgets
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set the cardDisplayLayout inside the scroll area // Set the cardDisplayLayout inside the scroll area
auto scrollWidget = new QWidget(scrollArea); auto scrollWidget = new QWidget(scrollArea);

View file

@ -12,6 +12,7 @@
#include <QScrollArea> #include <QScrollArea>
#include <QSize> #include <QSize>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qlogging.h> #include <qlogging.h>
#include <qnamespace.h> #include <qnamespace.h>
@ -33,10 +34,7 @@ EdhrecTopCommandersApiResponseDisplayWidget::EdhrecTopCommandersApiResponseDispl
} }
// Create a QScrollArea to hold the card display widgets // Create a QScrollArea to hold the card display widgets
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set the cardDisplayLayout inside the scroll area // Set the cardDisplayLayout inside the scroll area
auto scrollWidget = new QWidget(scrollArea); auto scrollWidget = new QWidget(scrollArea);

View file

@ -10,6 +10,7 @@
#include <QResizeEvent> #include <QResizeEvent>
#include <QScrollArea> #include <QScrollArea>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
EdhrecTopTagsApiResponseDisplayWidget::EdhrecTopTagsApiResponseDisplayWidget(QWidget *parent, EdhrecTopTagsApiResponseDisplayWidget::EdhrecTopTagsApiResponseDisplayWidget(QWidget *parent,
@ -29,10 +30,7 @@ EdhrecTopTagsApiResponseDisplayWidget::EdhrecTopTagsApiResponseDisplayWidget(QWi
} }
// Create a QScrollArea to hold the card display widgets // Create a QScrollArea to hold the card display widgets
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
// Set the cardDisplayLayout inside the scroll area // Set the cardDisplayLayout inside the scroll area
auto scrollWidget = new QWidget(scrollArea); auto scrollWidget = new QWidget(scrollArea);

View file

@ -12,8 +12,6 @@
#include <QComboBox> #include <QComboBox>
#include <QDateTime> #include <QDateTime>
#include <QDebug> #include <QDebug>
#include <QFont>
#include <QFontDatabase>
#include <QGridLayout> #include <QGridLayout>
#include <QGroupBox> #include <QGroupBox>
#include <QHBoxLayout> #include <QHBoxLayout>
@ -52,6 +50,7 @@
#include <libcockatrice/protocol/pb/response_report_user_info.pb.h> #include <libcockatrice/protocol/pb/response_report_user_info.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_report.pb.h> #include <libcockatrice/protocol/pb/serverinfo_report.pb.h>
#include <libcockatrice/protocol/pending_command.h> #include <libcockatrice/protocol/pending_command.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
#include <string> #include <string>
@ -138,13 +137,7 @@ TabReport::TabReport(TabSupervisor *_tabSupervisor, AbstractClient *_client) : T
chatGroup = new QGroupBox; chatGroup = new QGroupBox;
chatLogEdit = new QTextEdit; chatLogEdit = new QTextEdit;
chatLogEdit->setReadOnly(true); chatLogEdit->setReadOnly(true);
QFont monoFont("monospace"); chatLogEdit->setFont(QtUtils::monospaceFont());
monoFont.setStyleHint(QFont::Monospace);
const int systemPointSize = QFontDatabase::systemFont(QFontDatabase::GeneralFont).pointSize();
if (systemPointSize > 0) {
monoFont.setPointSize(systemPointSize);
}
chatLogEdit->setFont(monoFont);
auto *chatLayout = new QVBoxLayout(chatGroup); auto *chatLayout = new QVBoxLayout(chatGroup);
chatLayout->setContentsMargins(4, 4, 4, 4); chatLayout->setContentsMargins(4, 4, 4, 4);
chatLayout->addWidget(chatLogEdit); chatLayout->addWidget(chatLogEdit);

View file

@ -42,6 +42,7 @@
#include <libcockatrice/models/database/card_database_model.h> #include <libcockatrice/models/database/card_database_model.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <libcockatrice/settings/cards_display_settings.h> #include <libcockatrice/settings/cards_display_settings.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent, VisualDeckEditorWidget::VisualDeckEditorWidget(QWidget *parent,
@ -188,14 +189,9 @@ void VisualDeckEditorWidget::initializeDisplayOptionsAndSearchWidget()
void VisualDeckEditorWidget::initializeScrollAreaAndZoneContainer() void VisualDeckEditorWidget::initializeScrollAreaAndZoneContainer()
{ {
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea->setMinimumSize(0, 0); scrollArea->setMinimumSize(0, 0);
// Set scrollbar policies
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
zoneContainer = new QWidget(scrollArea); zoneContainer = new QWidget(scrollArea);
zoneContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); zoneContainer->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
zoneContainer->setObjectName("zoneContainer"); zoneContainer->setObjectName("zoneContainer");

View file

@ -16,6 +16,7 @@
#include <QString> #include <QString>
#include <QStringList> #include <QStringList>
#include <QWidget> #include <QWidget>
#include <libcockatrice/utility/qt_utils.h>
#include <qtmetamacros.h> #include <qtmetamacros.h>
class QFrame; class QFrame;
@ -131,13 +132,9 @@ protected:
// If popup is not open, forward event to parent scroll area // If popup is not open, forward event to parent scroll area
if (!combo->view()->isVisible()) { if (!combo->view()->isVisible()) {
// Try to find a scrollable parent and manually send the event // Try to find a scrollable parent and manually send the event
QWidget *parent = combo->parentWidget(); if (auto *scroll = QtUtils::findParentOfType<QAbstractScrollArea>(combo)) {
while (parent) { QApplication::sendEvent(scroll->viewport(), event);
if (auto *scroll = qobject_cast<QAbstractScrollArea *>(parent)) { return true; // Mark event as handled
QApplication::sendEvent(scroll->viewport(), event);
return true; // Mark event as handled
}
parent = parent->parentWidget();
} }
// If no scrollable parent found, just block // If no scrollable parent found, just block
return true; return true;

View file

@ -33,6 +33,7 @@
#include <libcockatrice/settings/cards_display_settings.h> #include <libcockatrice/settings/cards_display_settings.h>
#include <libcockatrice/settings/paths_settings.h> #include <libcockatrice/settings/paths_settings.h>
#include <libcockatrice/settings/visual_deck_storage_settings.h> #include <libcockatrice/settings/visual_deck_storage_settings.h>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h> #include <qnamespace.h>
VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent) VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(parent)
@ -98,10 +99,7 @@ VisualDeckStorageWidget::VisualDeckStorageWidget(QWidget *parent) : QWidget(pare
&VisualDeckStorageWidget::updateSelectionAnimationEnabled); &VisualDeckStorageWidget::updateSelectionAnimationEnabled);
// deck area // deck area
scrollArea = new QScrollArea(this); scrollArea = QtUtils::makeScrollArea(this);
scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
scrollArea->setWidgetResizable(true);
// putting everything together // putting everything together
layout->addWidget(searchAndSortContainer); layout->addWidget(searchAndSortContainer);