feat: allow specifying font family by style

This commit is contained in:
2 * r + 2 * t 2026-04-21 18:45:44 +10:00
parent c4539d6960
commit 23c138e417
4 changed files with 59 additions and 36 deletions

View file

@ -142,6 +142,20 @@ int AppearancePadding::extraExtraLarge() const {
return m_tokens ? static_cast<int>(m_tokens->extraExtraLarge() * m_scale) : 0;
}
// FontConfig
void FontConfig::setDefaults(int size, int weight, const QVariantMap& vaxes) {
m_size = size;
m_weight = weight;
m_vaxes = vaxes;
}
// FontStyleConfig
void FontStyleConfig::setDefaultFamily(const QString& family) {
m_family = family;
}
// AnimDurations
void AnimDurations::bindTokens(AnimDurationTokens* tokens) {

View file

@ -131,7 +131,8 @@ class FontConfig : public ConfigObject {
Q_OBJECT
QML_ANONYMOUS
CONFIG_PROPERTY(QString, family, QStringLiteral("GoogleSansFlex"))
// Empty family inherits from the parent FontStyleConfig.
CONFIG_PROPERTY(QString, family, {})
CONFIG_PROPERTY(int, size, 14)
CONFIG_PROPERTY(int, weight, QFont::Normal)
CONFIG_PROPERTY(bool, italic, false)
@ -141,18 +142,14 @@ public:
explicit FontConfig(QObject* parent = nullptr)
: ConfigObject(parent) {}
void setDefaults(const QString& family, int size, int weight = QFont::Normal, const QVariantMap& vaxes = {}) {
m_family = family;
m_size = size;
m_weight = weight;
m_vaxes = vaxes;
}
void setDefaults(int size, int weight = QFont::Normal, const QVariantMap& vaxes = {});
};
class FontStyleConfig : public ConfigObject {
Q_OBJECT
QML_ANONYMOUS
CONFIG_PROPERTY(QString, family, QStringLiteral("GoogleSansFlex"))
CONFIG_SUBOBJECT(FontConfig, large)
CONFIG_SUBOBJECT(FontConfig, medium)
CONFIG_SUBOBJECT(FontConfig, small)
@ -163,6 +160,8 @@ public:
, m_large(new FontConfig(this))
, m_medium(new FontConfig(this))
, m_small(new FontConfig(this)) {}
void setDefaultFamily(const QString& family);
};
class IconFontStyleConfig : public FontStyleConfig {
@ -202,30 +201,36 @@ public:
const auto mono = QStringLiteral("CaskaydiaCove NF");
const auto icons = QStringLiteral("Material Symbols Rounded");
m_headline->large()->setDefaults(sans, 32, QFont::Normal);
m_headline->medium()->setDefaults(sans, 28, QFont::Normal);
m_headline->small()->setDefaults(sans, 24, QFont::Normal);
m_headline->setDefaultFamily(sans);
m_headline->large()->setDefaults(32, QFont::Normal);
m_headline->medium()->setDefaults(28, QFont::Normal);
m_headline->small()->setDefaults(24, QFont::Normal);
m_title->large()->setDefaults(sans, 22, QFont::Medium);
m_title->medium()->setDefaults(sans, 16, QFont::Medium);
m_title->small()->setDefaults(sans, 14, QFont::Medium);
m_title->setDefaultFamily(sans);
m_title->large()->setDefaults(22, QFont::Medium);
m_title->medium()->setDefaults(16, QFont::Medium);
m_title->small()->setDefaults(14, QFont::Medium);
m_body->large()->setDefaults(sans, 16, QFont::Normal);
m_body->medium()->setDefaults(sans, 14, QFont::Normal);
m_body->small()->setDefaults(sans, 12, QFont::Normal);
m_body->setDefaultFamily(sans);
m_body->large()->setDefaults(16, QFont::Normal);
m_body->medium()->setDefaults(14, QFont::Normal);
m_body->small()->setDefaults(12, QFont::Normal);
m_label->large()->setDefaults(sans, 14, QFont::Medium);
m_label->medium()->setDefaults(sans, 12, QFont::Medium);
m_label->small()->setDefaults(sans, 11, QFont::Medium);
m_label->setDefaultFamily(sans);
m_label->large()->setDefaults(14, QFont::Medium);
m_label->medium()->setDefaults(12, QFont::Medium);
m_label->small()->setDefaults(11, QFont::Medium);
m_mono->large()->setDefaults(mono, 16, QFont::Normal);
m_mono->medium()->setDefaults(mono, 14, QFont::Normal);
m_mono->small()->setDefaults(mono, 12, QFont::Normal);
m_mono->setDefaultFamily(mono);
m_mono->large()->setDefaults(16, QFont::Normal);
m_mono->medium()->setDefaults(14, QFont::Normal);
m_mono->small()->setDefaults(12, QFont::Normal);
m_icon->extraLarge()->setDefaults(icons, static_cast<int>(48 / 1.33), QFont::Normal);
m_icon->large()->setDefaults(icons, static_cast<int>(32 / 1.33), QFont::Normal);
m_icon->medium()->setDefaults(icons, static_cast<int>(24 / 1.33), QFont::Normal);
m_icon->small()->setDefaults(icons, static_cast<int>(20 / 1.33), QFont::Normal);
m_icon->setDefaultFamily(icons);
m_icon->extraLarge()->setDefaults(static_cast<int>(48 / 1.33), QFont::Normal);
m_icon->large()->setDefaults(static_cast<int>(32 / 1.33), QFont::Normal);
m_icon->medium()->setDefaults(static_cast<int>(24 / 1.33), QFont::Normal);
m_icon->small()->setDefaults(static_cast<int>(20 / 1.33), QFont::Normal);
}
};

View file

@ -17,9 +17,9 @@ QFont FontStyleBase::small() const {
return m_small;
}
QFont FontStyleBase::buildFont(const FontConfig* cfg) {
QFont FontStyleBase::buildFont(const FontConfig* cfg, const QString& fallbackFamily) {
QFont font;
font.setFamily(cfg->family());
font.setFamily(cfg->family().isEmpty() ? fallbackFamily : cfg->family());
font.setPointSize(cfg->size());
font.setWeight(QFont::Weight(cfg->weight()));
font.setItalic(cfg->italic());
@ -38,6 +38,7 @@ void FontStyleBase::bind(FontStyleConfig* cfg) {
return;
if (m_cfg) {
disconnect(m_cfg, nullptr, this, nullptr);
disconnect(m_cfg->large(), nullptr, this, nullptr);
disconnect(m_cfg->medium(), nullptr, this, nullptr);
disconnect(m_cfg->small(), nullptr, this, nullptr);
@ -46,6 +47,7 @@ void FontStyleBase::bind(FontStyleConfig* cfg) {
m_cfg = cfg;
if (cfg) {
connect(cfg, &ConfigObject::propertiesChanged, this, &FontStyleBase::rebuild);
connect(cfg->large(), &ConfigObject::propertiesChanged, this, &FontStyleBase::rebuild);
connect(cfg->medium(), &ConfigObject::propertiesChanged, this, &FontStyleBase::rebuild);
connect(cfg->small(), &ConfigObject::propertiesChanged, this, &FontStyleBase::rebuild);
@ -56,9 +58,10 @@ void FontStyleBase::bind(FontStyleConfig* cfg) {
void FontStyleBase::rebuild() {
if (m_cfg) {
m_large = buildFont(m_cfg->large());
m_medium = buildFont(m_cfg->medium());
m_small = buildFont(m_cfg->small());
const auto family = m_cfg->family();
m_large = buildFont(m_cfg->large(), family);
m_medium = buildFont(m_cfg->medium(), family);
m_small = buildFont(m_cfg->small(), family);
} else {
m_large = QFont();
m_medium = QFont();
@ -113,10 +116,11 @@ IconFontBuilders* IconFontStyle::builders() const {
void IconFontStyle::rebuild() {
if (auto* cfg = qobject_cast<IconFontStyleConfig*>(m_cfg)) {
m_large = buildFont(cfg->large());
m_medium = buildFont(cfg->medium());
m_small = buildFont(cfg->small());
m_extraLarge = buildFont(cfg->extraLarge());
const auto family = cfg->family();
m_large = buildFont(cfg->large(), family);
m_medium = buildFont(cfg->medium(), family);
m_small = buildFont(cfg->small(), family);
m_extraLarge = buildFont(cfg->extraLarge(), family);
} else {
m_large = QFont();
m_medium = QFont();

View file

@ -70,7 +70,7 @@ signals:
protected:
virtual void rebuild();
static QFont buildFont(const FontConfig* cfg);
static QFont buildFont(const FontConfig* cfg, const QString& fallbackFamily);
FontStyleConfig* m_cfg = nullptr;
QFont m_large;