From 505c1bea185642db43947fa38d11b16644b8003c Mon Sep 17 00:00:00 2001 From: Ilya Fedin Date: Wed, 28 Apr 2021 13:43:41 +0400 Subject: [PATCH] Get font settings via Ui Integration --- ui/integration.cpp | 5 ++++ ui/integration.h | 6 ++++ ui/style/style_core_custom_font.cpp | 10 ++++--- ui/style/style_core_custom_font.h | 9 ++++++ ui/style/style_core_font.cpp | 44 ++++++++++++++--------------- ui/style/style_core_font.h | 7 ----- ui/widgets/input_fields.cpp | 7 +++-- 7 files changed, 52 insertions(+), 36 deletions(-) diff --git a/ui/integration.cpp b/ui/integration.cpp index ae25fc0..5a1ff48 100644 --- a/ui/integration.cpp +++ b/ui/integration.cpp @@ -6,6 +6,7 @@ // #include "ui/integration.h" +#include "ui/style/style_core_custom_font.h" #include "ui/text/text_entity.h" #include "ui/basic_click_handlers.h" @@ -36,6 +37,10 @@ void Integration::textActionsUpdated() { void Integration::activationFromTopPanel() { } +style::CustomFontSettings Integration::fontSettings() { + return {}; +} + bool Integration::screenIsLocked() { return false; } diff --git a/ui/integration.h b/ui/integration.h index c51f774..a1bda01 100644 --- a/ui/integration.h +++ b/ui/integration.h @@ -20,6 +20,10 @@ struct TextParseOptions; class ClickHandler; struct EntityLinkData; +namespace style { +struct CustomFontSettings; +} // namespace style + namespace Ui { namespace Emoji { class One; @@ -40,6 +44,8 @@ public: virtual void textActionsUpdated(); virtual void activationFromTopPanel(); + virtual style::CustomFontSettings fontSettings(); + [[nodiscard]] virtual bool screenIsLocked(); [[nodiscard]] virtual QString timeFormat(); diff --git a/ui/style/style_core_custom_font.cpp b/ui/style/style_core_custom_font.cpp index da9a8b4..8808320 100644 --- a/ui/style/style_core_custom_font.cpp +++ b/ui/style/style_core_custom_font.cpp @@ -7,6 +7,7 @@ #include "ui/style/style_core_custom_font.h" #include "ui/style/style_core_font.h" +#include "ui/integration.h" #include @@ -46,24 +47,25 @@ QFont ResolveFont(uint32 flags, int size) { const auto point = good.isEmpty() ? size : good.front(); result = Database.font(custom.family, custom.style, point); } else { - if (!UseSystemFont || !overrideIsEmpty) { + const auto fontSettings = Ui::Integration::Instance().fontSettings(); + if (!fontSettings.useSystemFont || !overrideIsEmpty) { result.setFamily(GetFontOverride(flags)); } if (bold) { - if (CustomSemiboldIsBold) { + if (fontSettings.semiboldIsBold) { result.setBold(true); #ifdef DESKTOP_APP_USE_PACKAGED_FONTS } else { result.setWeight(QFont::DemiBold); #else // DESKTOP_APP_USE_PACKAGED_FONTS - } else if (UseSystemFont) { + } else if (fontSettings.useSystemFont) { result.setWeight(QFont::DemiBold); } else { result.setBold(true); #endif // !DESKTOP_APP_USE_PACKAGED_FONTS } - if (!CustomSemiboldIsBold) { + if (!fontSettings.semiboldIsBold) { if (flags & FontItalic) { result.setStyleName("Semibold Italic"); } else { diff --git a/ui/style/style_core_custom_font.h b/ui/style/style_core_custom_font.h index 14ee48b..8446ab4 100644 --- a/ui/style/style_core_custom_font.h +++ b/ui/style/style_core_custom_font.h @@ -13,6 +13,15 @@ struct CustomFont { QString style; }; +struct CustomFontSettings { + QString mainFont; + QString semiboldFont; + QString monospaceFont; + bool semiboldIsBold = false; + bool useSystemFont = false; + bool useOriginalMetrics = false; +}; + inline bool operator==(const CustomFont &a, const CustomFont &b) { return (a.family == b.family) && (a.style == b.style); } diff --git a/ui/style/style_core_font.cpp b/ui/style/style_core_font.cpp index 648c3b2..44b1b2a 100644 --- a/ui/style/style_core_font.cpp +++ b/ui/style/style_core_font.cpp @@ -179,13 +179,6 @@ QString Overrides[FontTypesCount]; } // namespace -QString CustomMainFont; -QString CustomSemiboldFont; -QString CustomMonospaceFont; -bool CustomSemiboldIsBold = false; -bool UseSystemFont = false; -bool UseOriginalMetrics = false; - void StartFonts() { if (Started) { return; @@ -194,8 +187,10 @@ void StartFonts() { style_InitFontsResource(); + const auto fontSettings = Ui::Integration::Instance().fontSettings(); + #ifndef DESKTOP_APP_USE_PACKAGED_FONTS - if (!UseSystemFont) { + if (!fontSettings.useSystemFont) { bool areGood[FontTypesCount] = { false }; for (auto i = 0; i != FontTypesCount; ++i) { const auto file = FontTypeFiles[i]; @@ -242,18 +237,18 @@ void StartFonts() { } #endif // !DESKTOP_APP_USE_PACKAGED_FONTS - if (!CustomMainFont.isEmpty() && ValidateFont(CustomMainFont)) { - Overrides[FontTypeRegular] = CustomMainFont; - Overrides[FontTypeRegularItalic] = CustomMainFont; - Overrides[FontTypeBold] = CustomMainFont; - Overrides[FontTypeBoldItalic] = CustomMainFont; + if (!fontSettings.mainFont.isEmpty() && ValidateFont(fontSettings.mainFont)) { + Overrides[FontTypeRegular] = fontSettings.mainFont; + Overrides[FontTypeRegularItalic] = fontSettings.mainFont; + Overrides[FontTypeBold] = fontSettings.mainFont; + Overrides[FontTypeBoldItalic] = fontSettings.mainFont; } - if (!CustomSemiboldFont.isEmpty() && ValidateFont(CustomSemiboldFont)) { - Overrides[FontTypeSemibold] = CustomSemiboldFont; - Overrides[FontTypeSemiboldItalic] = CustomSemiboldFont; - } else if (!CustomMainFont.isEmpty() && ValidateFont(CustomMainFont)) { - Overrides[FontTypeSemibold] = CustomMainFont; - Overrides[FontTypeSemiboldItalic] = CustomMainFont; + if (!fontSettings.semiboldFont.isEmpty() && ValidateFont(fontSettings.semiboldFont)) { + Overrides[FontTypeSemibold] = fontSettings.semiboldFont; + Overrides[FontTypeSemiboldItalic] = fontSettings.semiboldFont; + } else if (fontSettings.mainFont.isEmpty() && ValidateFont(fontSettings.mainFont)) { + Overrides[FontTypeSemibold] = fontSettings.mainFont; + Overrides[FontTypeSemiboldItalic] = fontSettings.mainFont; } auto appFont = QApplication::font(); @@ -288,8 +283,10 @@ QString GetFontOverride(int32 flags) { QString MonospaceFont() { static const auto family = [&]() -> QString { - if (TryFont(CustomMonospaceFont)) { - return CustomMonospaceFont; + const auto fontSettings = Ui::Integration::Instance().fontSettings(); + + if (TryFont(fontSettings.monospaceFont)) { + return fontSettings.monospaceFont; } const auto manual = ManualMonospaceFont(); @@ -304,7 +301,7 @@ QString MonospaceFont() { const auto useSystem = manual.isEmpty() || (metrics.horizontalAdvance(QChar('i')) == metrics.horizontalAdvance(QChar('W'))); #endif // Q_OS_WIN || Q_OS_MAC - return (useSystem || UseSystemFont) ? system : manual; + return (useSystem || fontSettings.useSystemFont) ? system : manual; }(); return family; @@ -340,7 +337,8 @@ FontData::FontData(int size, uint32 flags, int family, Font *other) } modified[_flags] = Font(this); - if (UseOriginalMetrics && !(_flags & FontMonospace)) { + const auto fontSettings = Ui::Integration::Instance().fontSettings(); + if (fontSettings.useOriginalMetrics && !(_flags & FontMonospace)) { const auto mOrig = GetFontMetrics(size); height = mOrig.height(); diff --git a/ui/style/style_core_font.h b/ui/style/style_core_font.h index 11e6eba..0642610 100644 --- a/ui/style/style_core_font.h +++ b/ui/style/style_core_font.h @@ -14,13 +14,6 @@ namespace style { namespace internal { -extern QString CustomMainFont; -extern QString CustomSemiboldFont; -extern QString CustomMonospaceFont; -extern bool CustomSemiboldIsBold; -extern bool UseSystemFont; -extern bool UseOriginalMetrics; - void StartFonts(); [[nodiscard]] QString GetPossibleEmptyOverride(int32 flags = 0); [[nodiscard]] QString GetFontOverride(int32 flags = 0); diff --git a/ui/widgets/input_fields.cpp b/ui/widgets/input_fields.cpp index 04c2ee1..96abb34 100644 --- a/ui/widgets/input_fields.cpp +++ b/ui/widgets/input_fields.cpp @@ -10,6 +10,7 @@ #include "ui/text/text.h" #include "ui/emoji_config.h" #include "ui/ui_utility.h" +#include "ui/style/style_core_custom_font.h" #include "base/openssl_help.h" #include "base/platform/base_platform_info.h" #include "emoji_suggestions_helper.h" @@ -1306,7 +1307,8 @@ InputField::InputField( _inner->viewport()->setAutoFillBackground(false); _inner->setContentsMargins(0, 0, 0, 0); - if (style::internal::UseOriginalMetrics) { + const auto fontSettings = Integration::Instance().fontSettings(); + if (fontSettings.useOriginalMetrics) { const auto heightDelta = (_st.font->height - _st.font->m.height()); const auto topMargin = (_st.font->ascent - _st.font->m.ascent()) + (heightDelta ? heightDelta / 2 : 0); @@ -1721,7 +1723,8 @@ void InputField::paintEvent(QPaintEvent *e) { auto r = rect().marginsRemoved(_st.textMargins + _st.placeholderMargins); r.moveLeft(r.left() + placeholderLeft); if (style::RightToLeft()) r.moveLeft(width() - r.left() - r.width()); - if (style::internal::UseOriginalMetrics) { + const auto fontSettings = Integration::Instance().fontSettings(); + if (fontSettings.useOriginalMetrics) { if (_mode == Mode::SingleLine) { const auto heightDelta = (_st.placeholderFont->height - _st.placeholderFont->m.height()); const auto topMargin = (_st.placeholderFont->ascent - _st.placeholderFont->m.ascent())