mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-11-05 09:33:25 -08:00
* [Fonts] Migrate DeckList and InterfaceDefault surfaces to theme roles * [Fonts] Drop unused lambda captures in font-refresh handlers * [Fonts] Fix pixel sizes and game overlay fonts from review - 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. --------- Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
192 lines
6.5 KiB
C++
192 lines
6.5 KiB
C++
#include "dlg_shared_decks_preview.h"
|
|
|
|
#include "../deck_share/shared_deck_preview_widget.h"
|
|
#include "../general/layout_containers/flow_widget.h"
|
|
#include "../interface/theme_manager.h"
|
|
|
|
#include <QAbstractButton>
|
|
#include <QDateTime>
|
|
#include <QDialogButtonBox>
|
|
#include <QFont>
|
|
#include <QLabel>
|
|
#include <QPushButton>
|
|
#include <QStringList>
|
|
#include <QVBoxLayout>
|
|
#include <google/protobuf/repeated_ptr_field.h>
|
|
#include <libcockatrice/protocol/pb/serverinfo_deck_share_item.pb.h>
|
|
#include <libcockatrice/utility/qt_utils.h>
|
|
#include <qnamespace.h>
|
|
|
|
class QWidget;
|
|
|
|
DlgSharedDecksPreview::DlgSharedDecksPreview(QWidget *parent,
|
|
const CardDatabaseQuerier *querier,
|
|
const QString &shareName,
|
|
qint64 expiresAt,
|
|
const QString &serverText,
|
|
const QList<ServerInfo_DeckShareItem> &items)
|
|
: QDialog(parent)
|
|
{
|
|
setWindowTitle(tr("Open shared decks"));
|
|
resize(700, 500);
|
|
|
|
auto *mainLayout = new QVBoxLayout(this);
|
|
|
|
// shareName and serverText come from the share server, so escape them: the
|
|
// QLabels render AutoText and markup would otherwise be shown as rich text.
|
|
auto *titleLabel =
|
|
new QLabel(tr("Share: %1").arg((shareName.isEmpty() ? tr("Untitled") : shareName).toHtmlEscaped()), this);
|
|
// Family comes from the InterfaceDefault theme role; the +2 size and bold stay caller-side.
|
|
auto applyTitleFont = [titleLabel]() {
|
|
QFont titleFont = QtUtils::boldFont(themeManager->appFont(AppFont::InterfaceDefault));
|
|
titleFont.setPointSize(titleFont.pointSize() + 2);
|
|
titleLabel->setFont(titleFont);
|
|
};
|
|
applyTitleFont();
|
|
connect(themeManager, &ThemeManager::fontsChanged, this, applyTitleFont);
|
|
mainLayout->addWidget(titleLabel);
|
|
|
|
if (!serverText.isEmpty()) {
|
|
mainLayout->addWidget(new QLabel(tr("From %1").arg(serverText.toHtmlEscaped()), this));
|
|
}
|
|
|
|
if (expiresAt > 0) {
|
|
const QString expiryText = QDateTime::fromSecsSinceEpoch(expiresAt).toLocalTime().toString(Qt::TextDate);
|
|
mainLayout->addWidget(new QLabel(tr("This share link expires on %1").arg(expiryText), this));
|
|
}
|
|
|
|
downloadStatusLabel = new QLabel(this);
|
|
downloadStatusLabel->setVisible(false);
|
|
mainLayout->addWidget(downloadStatusLabel);
|
|
|
|
flowWidget = new FlowWidget(this, Qt::Horizontal, Qt::ScrollBarAlwaysOff, Qt::ScrollBarAsNeeded);
|
|
mainLayout->addWidget(flowWidget, 1);
|
|
|
|
for (const ServerInfo_DeckShareItem &item : items) {
|
|
QStringList tags;
|
|
for (const auto &tag : item.tags()) {
|
|
tags.append(QString::fromStdString(tag));
|
|
}
|
|
|
|
auto *tile = new SharedDeckPreviewWidget(
|
|
this, querier, QString::fromStdString(item.name()), QString::fromStdString(item.banner_card()),
|
|
QString::fromStdString(item.color_identity()), QString::fromStdString(item.game_format()), tags.join(", "));
|
|
flowWidget->addNavigableWidget(tile);
|
|
tiles.append(tile);
|
|
itemIds.append(item.id());
|
|
}
|
|
|
|
if (tiles.size() == 1) {
|
|
tiles.first()->setSelected(true);
|
|
}
|
|
|
|
auto *buttonBox = new QDialogButtonBox(this);
|
|
openSelectedButton = buttonBox->addButton(tr("Open selected"), QDialogButtonBox::AcceptRole);
|
|
openAllButton = buttonBox->addButton(tr("Open all"), QDialogButtonBox::ActionRole);
|
|
buttonBox->addButton(tr("Cancel"), QDialogButtonBox::RejectRole);
|
|
mainLayout->addWidget(buttonBox);
|
|
|
|
connect(buttonBox, &QDialogButtonBox::rejected, this, [this]() {
|
|
onCancel();
|
|
close();
|
|
});
|
|
|
|
// Esc calls QDialog::reject() directly (which hides the dialog without a
|
|
// close event), so route it through the same guarded cancel as the button.
|
|
connect(this, &QDialog::rejected, this, [this]() {
|
|
onCancel();
|
|
close();
|
|
});
|
|
|
|
connect(openSelectedButton, &QPushButton::clicked, this, &DlgSharedDecksPreview::openSelected);
|
|
connect(buttonBox, &QDialogButtonBox::clicked, this, [this, buttonBox](QAbstractButton *button) {
|
|
if (buttonBox->buttonRole(button) == QDialogButtonBox::ActionRole) {
|
|
openAll();
|
|
}
|
|
});
|
|
|
|
for (SharedDeckPreviewWidget *tile : tiles) {
|
|
connect(tile, &SharedDeckPreviewWidget::selectionToggled, this,
|
|
&DlgSharedDecksPreview::updateOpenSelectedEnabled);
|
|
}
|
|
for (int i = 0; i < tiles.size(); ++i) {
|
|
const int itemId = itemIds.at(i);
|
|
// Double-clicking a tile selects it and opens just that deck.
|
|
connect(tiles.at(i), &SharedDeckPreviewWidget::activated, this, [this, itemId]() {
|
|
resultEmitted = true;
|
|
setDownloading(true);
|
|
emit openRequested(QList<int>{itemId});
|
|
});
|
|
}
|
|
updateOpenSelectedEnabled();
|
|
}
|
|
|
|
QList<int> DlgSharedDecksPreview::selectedItemIds() const
|
|
{
|
|
QList<int> selectedIds;
|
|
for (int i = 0; i < tiles.size(); ++i) {
|
|
if (tiles.at(i)->isSelected()) {
|
|
selectedIds.append(itemIds.at(i));
|
|
}
|
|
}
|
|
return selectedIds;
|
|
}
|
|
|
|
void DlgSharedDecksPreview::openSelected()
|
|
{
|
|
const QList<int> selectedIds = selectedItemIds();
|
|
if (selectedIds.isEmpty()) {
|
|
return;
|
|
}
|
|
resultEmitted = true;
|
|
setDownloading(true);
|
|
emit openRequested(selectedIds);
|
|
}
|
|
|
|
void DlgSharedDecksPreview::openAll()
|
|
{
|
|
resultEmitted = true;
|
|
setDownloading(true);
|
|
emit openRequested(itemIds);
|
|
}
|
|
|
|
void DlgSharedDecksPreview::setDownloading(bool downloading)
|
|
{
|
|
if (downloadInProgress == downloading) {
|
|
return;
|
|
}
|
|
downloadInProgress = downloading;
|
|
downloadStatusLabel->setVisible(downloading);
|
|
for (SharedDeckPreviewWidget *tile : tiles) {
|
|
tile->setEnabled(!downloading);
|
|
}
|
|
openSelectedButton->setEnabled(!downloading);
|
|
openAllButton->setEnabled(!downloading);
|
|
}
|
|
|
|
void DlgSharedDecksPreview::setDownloadProgress(int done, int total, const QString ¤tDeckName)
|
|
{
|
|
if (!downloadInProgress) {
|
|
return;
|
|
}
|
|
downloadStatusLabel->setText(tr("Downloading deck %1 of %2: %3").arg(done).arg(total).arg(currentDeckName));
|
|
}
|
|
|
|
void DlgSharedDecksPreview::updateOpenSelectedEnabled()
|
|
{
|
|
openSelectedButton->setEnabled(!selectedItemIds().isEmpty());
|
|
}
|
|
|
|
void DlgSharedDecksPreview::onCancel()
|
|
{
|
|
if (!resultEmitted || downloadInProgress) {
|
|
resultEmitted = true;
|
|
emit cancelled();
|
|
}
|
|
}
|
|
|
|
void DlgSharedDecksPreview::closeEvent(QCloseEvent *event)
|
|
{
|
|
onCancel();
|
|
QDialog::closeEvent(event);
|
|
}
|