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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -8,6 +8,7 @@
#include <QScrollArea>
#include <QSize>
#include <QVBoxLayout>
#include <libcockatrice/utility/qt_utils.h>
#include <qnamespace.h>
SettingsPopupWidget::SettingsPopupWidget(QWidget *parent) : QWidget(parent, Qt::Popup | Qt::FramelessWindowHint)
@ -54,11 +55,8 @@ void SettingsPopupWidget::adjustSizeToFitScreen()
if (contentHeight > maxHeight) {
// Create a scroll area and add the container widget to it if not already created
if (!scrollArea) {
scrollArea = new QScrollArea(this);
scrollArea->setWidgetResizable(true);
scrollArea = QtUtils::makeScrollArea(this, Qt::ScrollBarAlwaysOn);
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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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