mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-06 01:53:25 -08:00
- Set the sizes the stylesheets carried with setPixelSize() rather than setPointSize(): home buttons (34), banner (24), home group box (20), the placeholder labels (14), the analytics drag handle (10), the EDHREC navigation buttons (24), the user info popup (11/14/11/10/11) and the game overlays (14/16/12). Points at 96 DPI were ~33% larger. - The drag/total counters and tally columns keep the monospace family the stylesheets set, so digit widths stop changing as counts tick and white-space: pre stays aligned. - applyDeckListFont() drops the cached tally rows before re-measuring, so previewing a larger DeckList font no longer leaves the tally clipped. - Tally labels and the constructor/fontsChanged pairs in the shared-deck preview, quick setup, analytics panel, home box and public decks build their font once in a local lambda instead of twice.
126 lines
3.6 KiB
C++
126 lines
3.6 KiB
C++
#include "banner_widget.h"
|
|
|
|
#include "../../../pixel_map_generator.h"
|
|
#include "../../../theme_manager.h"
|
|
|
|
#include <QBrush>
|
|
#include <QColor>
|
|
#include <QFont>
|
|
#include <QHBoxLayout>
|
|
#include <QLinearGradient>
|
|
#include <QPainter>
|
|
#include <QPixmap>
|
|
#include <QPointF>
|
|
#include <QRect>
|
|
#include <QtGlobal>
|
|
|
|
BannerWidget::BannerWidget(QWidget *parent, const QString &text, Qt::Orientation orientation, int transparency_)
|
|
: QWidget(parent), gradientOrientation(orientation), transparency(qBound(0, transparency_, 100))
|
|
{
|
|
auto layout = new QHBoxLayout(this);
|
|
|
|
iconLabel = new QLabel(this);
|
|
iconLabel->setAlignment(Qt::AlignLeft | Qt::AlignVCenter);
|
|
|
|
// Create the banner label and set properties
|
|
bannerLabel = new QLabel(text, this);
|
|
bannerLabel->setAlignment(Qt::AlignCenter);
|
|
|
|
QString textColor;
|
|
if (transparency > 50) {
|
|
textColor = " color: white;";
|
|
}
|
|
bannerLabel->setStyleSheet(textColor);
|
|
applyInterfaceDefaultFont();
|
|
connect(themeManager, &ThemeManager::fontsChanged, this, &BannerWidget::applyInterfaceDefaultFont);
|
|
|
|
layout->addWidget(iconLabel);
|
|
layout->addWidget(bannerLabel);
|
|
layout->addWidget(new QLabel(this)); // add dummy label to force text label to be centered
|
|
setLayout(layout);
|
|
|
|
// Set minimum height for the widget
|
|
setMinimumHeight(50);
|
|
setMaximumHeight(100);
|
|
connect(this, &BannerWidget::buddyVisibilityChanged, this, &BannerWidget::toggleBuddyVisibility);
|
|
|
|
updateDropdownIconState();
|
|
}
|
|
|
|
void BannerWidget::mousePressEvent(QMouseEvent *event)
|
|
{
|
|
QWidget::mousePressEvent(event);
|
|
if (clickable) {
|
|
emit buddyVisibilityChanged();
|
|
}
|
|
}
|
|
|
|
void BannerWidget::setText(const QString &text) const
|
|
{
|
|
bannerLabel->setText(text);
|
|
}
|
|
|
|
void BannerWidget::applyInterfaceDefaultFont()
|
|
{
|
|
// Family comes from the InterfaceDefault theme role; the 24px size and
|
|
// bold weight previously carried by the stylesheet stay caller-side.
|
|
QFont bannerFont = themeManager->appFont(AppFont::InterfaceDefault);
|
|
bannerFont.setPixelSize(24);
|
|
bannerFont.setWeight(QFont::Bold);
|
|
bannerLabel->setFont(bannerFont);
|
|
}
|
|
|
|
void BannerWidget::setClickable(bool _clickable)
|
|
{
|
|
clickable = _clickable;
|
|
updateDropdownIconState();
|
|
}
|
|
|
|
void BannerWidget::setBuddy(QWidget *_buddy)
|
|
{
|
|
buddy = _buddy;
|
|
updateDropdownIconState();
|
|
}
|
|
|
|
void BannerWidget::toggleBuddyVisibility() const
|
|
{
|
|
if (buddy) {
|
|
buddy->setVisible(!buddy->isVisible());
|
|
updateDropdownIconState();
|
|
}
|
|
}
|
|
|
|
void BannerWidget::updateDropdownIconState() const
|
|
{
|
|
if (clickable && buddy) {
|
|
iconLabel->setPixmap(DropdownIconPixmapGenerator::generatePixmap(24, !buddy->isHidden()));
|
|
} else {
|
|
// we cannot directly hide the iconLabel, since it's needed to center the text; set an empty image instead
|
|
iconLabel->setPixmap(QPixmap());
|
|
}
|
|
}
|
|
|
|
void BannerWidget::paintEvent(QPaintEvent *event)
|
|
{
|
|
Q_UNUSED(event);
|
|
|
|
QPainter painter(this);
|
|
|
|
// Calculate alpha based on transparency percentage
|
|
int alpha = (255 * transparency) / 100;
|
|
|
|
// Determine gradient direction
|
|
QLinearGradient gradient;
|
|
if (gradientOrientation == Qt::Vertical) {
|
|
gradient = QLinearGradient(rect().topLeft(), rect().bottomLeft());
|
|
} else {
|
|
gradient = QLinearGradient(rect().topLeft(), rect().topRight());
|
|
}
|
|
|
|
// Set neutral gradient colors with calculated transparency
|
|
gradient.setColorAt(0, QColor(200, 200, 200, alpha)); // Light grey with alpha
|
|
gradient.setColorAt(1, QColor(100, 100, 100, alpha / 1.5)); // Darker grey, slightly more transparent
|
|
|
|
// Fill the widget background with the gradient
|
|
painter.fillRect(rect(), gradient);
|
|
}
|