Allow overriding fonts by (family,style).
This commit is contained in:
parent
5429c4c53e
commit
05d1ee3796
5 changed files with 151 additions and 52 deletions
|
|
@ -90,6 +90,8 @@ PRIVATE
|
||||||
ui/style/style_core.h
|
ui/style/style_core.h
|
||||||
ui/style/style_core_color.cpp
|
ui/style/style_core_color.cpp
|
||||||
ui/style/style_core_color.h
|
ui/style/style_core_color.h
|
||||||
|
ui/style/style_core_custom_font.cpp
|
||||||
|
ui/style/style_core_custom_font.h
|
||||||
ui/style/style_core_direction.cpp
|
ui/style/style_core_direction.cpp
|
||||||
ui/style/style_core_direction.h
|
ui/style/style_core_direction.h
|
||||||
ui/style/style_core_font.cpp
|
ui/style/style_core_font.cpp
|
||||||
|
|
|
||||||
73
ui/style/style_core_custom_font.cpp
Normal file
73
ui/style/style_core_custom_font.cpp
Normal file
|
|
@ -0,0 +1,73 @@
|
||||||
|
// This file is part of Desktop App Toolkit,
|
||||||
|
// a set of libraries for developing nice desktop applications.
|
||||||
|
//
|
||||||
|
// For license and copyright information please follow this link:
|
||||||
|
// https://github.com/desktop-app/legal/blob/master/LEGAL
|
||||||
|
//
|
||||||
|
#include "ui/style/style_core_custom_font.h"
|
||||||
|
|
||||||
|
#include "ui/style/style_core_font.h"
|
||||||
|
|
||||||
|
#include <QFontDatabase>
|
||||||
|
|
||||||
|
namespace style {
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
using namespace internal;
|
||||||
|
|
||||||
|
auto RegularFont = CustomFont();
|
||||||
|
auto BoldFont = CustomFont();
|
||||||
|
|
||||||
|
} // namespace
|
||||||
|
|
||||||
|
void SetCustomFonts(const CustomFont ®ular, const CustomFont &bold) {
|
||||||
|
RegularFont = regular;
|
||||||
|
BoldFont = bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
QFont ResolveFont(uint32 flags, int size) {
|
||||||
|
static auto Database = QFontDatabase();
|
||||||
|
|
||||||
|
const auto bold = ((flags & FontBold) || (flags & FontSemibold));
|
||||||
|
const auto italic = (flags & FontItalic);
|
||||||
|
const auto &custom = bold ? BoldFont : RegularFont;
|
||||||
|
const auto useCustom = !custom.family.isEmpty();
|
||||||
|
|
||||||
|
auto result = QFont();
|
||||||
|
if (flags & FontMonospace) {
|
||||||
|
result.setFamily(MonospaceFont());
|
||||||
|
} else if (useCustom) {
|
||||||
|
const auto sizes = Database.smoothSizes(custom.family, custom.style);
|
||||||
|
const auto good = sizes.isEmpty()
|
||||||
|
? Database.pointSizes(custom.family, custom.style)
|
||||||
|
: sizes;
|
||||||
|
const auto point = good.isEmpty() ? size : good.front();
|
||||||
|
result = Database.font(custom.family, custom.style, point);
|
||||||
|
} else {
|
||||||
|
result.setFamily(GetFontOverride(flags));
|
||||||
|
if (bold) {
|
||||||
|
#ifdef DESKTOP_APP_USE_PACKAGED_FONTS
|
||||||
|
result.setWeight(QFont::DemiBold);
|
||||||
|
#else // DESKTOP_APP_USE_PACKAGED_FONTS
|
||||||
|
result.setBold(true);
|
||||||
|
#endif // !DESKTOP_APP_USE_PACKAGED_FONTS
|
||||||
|
|
||||||
|
if (flags & FontItalic) {
|
||||||
|
result.setStyleName("Semibold Italic");
|
||||||
|
} else {
|
||||||
|
result.setStyleName("Semibold");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (italic) {
|
||||||
|
result.setItalic(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.setUnderline(flags & FontUnderline);
|
||||||
|
result.setStrikeOut(flags & FontStrikeOut);
|
||||||
|
result.setPixelSize(size);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace style
|
||||||
45
ui/style/style_core_custom_font.h
Normal file
45
ui/style/style_core_custom_font.h
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
// This file is part of Desktop App Toolkit,
|
||||||
|
// a set of libraries for developing nice desktop applications.
|
||||||
|
//
|
||||||
|
// For license and copyright information please follow this link:
|
||||||
|
// https://github.com/desktop-app/legal/blob/master/LEGAL
|
||||||
|
//
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
namespace style {
|
||||||
|
|
||||||
|
struct CustomFont {
|
||||||
|
QString family;
|
||||||
|
QString style;
|
||||||
|
};
|
||||||
|
|
||||||
|
inline bool operator==(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return (a.family == b.family) && (a.style == b.style);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return (a.family < b.family)
|
||||||
|
|| (a.family == b.family && a.style < b.style);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator!=(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return !(a == b);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return (b < a);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator<=(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return !(b < a);
|
||||||
|
}
|
||||||
|
|
||||||
|
inline bool operator>=(const CustomFont &a, const CustomFont &b) {
|
||||||
|
return !(a < b);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SetCustomFonts(const CustomFont ®ular, const CustomFont &bold);
|
||||||
|
|
||||||
|
[[nodiscard]] QFont ResolveFont(uint32 flags, int size);
|
||||||
|
|
||||||
|
} // namespace style
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
//
|
//
|
||||||
#include "ui/style/style_core_font.h"
|
#include "ui/style/style_core_font.h"
|
||||||
|
|
||||||
|
#include "ui/style/style_core_custom_font.h"
|
||||||
#include "ui/ui_log.h"
|
#include "ui/ui_log.h"
|
||||||
#include "base/algorithm.h"
|
#include "base/algorithm.h"
|
||||||
#include "ui/integration.h"
|
#include "ui/integration.h"
|
||||||
|
|
@ -106,26 +107,6 @@ bool LoadCustomFont(const QString &filePath, const QString &familyName, int flag
|
||||||
return QString();
|
return QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
QString MonospaceFont() {
|
|
||||||
static const auto family = [&]() -> QString {
|
|
||||||
const auto manual = ManualMonospaceFont();
|
|
||||||
const auto system = SystemMonospaceFont();
|
|
||||||
|
|
||||||
#if defined Q_OS_WIN || defined Q_OS_MAC
|
|
||||||
// Prefer our monospace font.
|
|
||||||
const auto useSystem = manual.isEmpty();
|
|
||||||
#else // Q_OS_WIN || Q_OS_MAC
|
|
||||||
// Prefer system monospace font.
|
|
||||||
const auto metrics = QFontMetrics(QFont(system));
|
|
||||||
const auto useSystem = manual.isEmpty()
|
|
||||||
|| (metrics.charWidth("i", 0) == metrics.charWidth("W", 0));
|
|
||||||
#endif // Q_OS_WIN || Q_OS_MAC
|
|
||||||
return useSystem ? system : manual;
|
|
||||||
}();
|
|
||||||
|
|
||||||
return family;
|
|
||||||
}
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
FontTypeRegular = 0,
|
FontTypeRegular = 0,
|
||||||
FontTypeRegularItalic,
|
FontTypeRegularItalic,
|
||||||
|
|
@ -277,6 +258,26 @@ QString GetFontOverride(int32 flags) {
|
||||||
return result.isEmpty() ? "Open Sans" : result;
|
return result.isEmpty() ? "Open Sans" : result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QString MonospaceFont() {
|
||||||
|
static const auto family = [&]() -> QString {
|
||||||
|
const auto manual = ManualMonospaceFont();
|
||||||
|
const auto system = SystemMonospaceFont();
|
||||||
|
|
||||||
|
#if defined Q_OS_WIN || defined Q_OS_MAC
|
||||||
|
// Prefer our monospace font.
|
||||||
|
const auto useSystem = manual.isEmpty();
|
||||||
|
#else // Q_OS_WIN || Q_OS_MAC
|
||||||
|
// Prefer system monospace font.
|
||||||
|
const auto metrics = QFontMetrics(QFont(system));
|
||||||
|
const auto useSystem = manual.isEmpty()
|
||||||
|
|| (metrics.charWidth("i", 0) == metrics.charWidth("W", 0));
|
||||||
|
#endif // Q_OS_WIN || Q_OS_MAC
|
||||||
|
return useSystem ? system : manual;
|
||||||
|
}();
|
||||||
|
|
||||||
|
return family;
|
||||||
|
}
|
||||||
|
|
||||||
void destroyFonts() {
|
void destroyFonts() {
|
||||||
for (auto fontData : fontsMap) {
|
for (auto fontData : fontsMap) {
|
||||||
delete fontData;
|
delete fontData;
|
||||||
|
|
@ -295,7 +296,8 @@ int registerFontFamily(const QString &family) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FontData::FontData(int size, uint32 flags, int family, Font *other)
|
FontData::FontData(int size, uint32 flags, int family, Font *other)
|
||||||
: m(f)
|
: f(ResolveFont(flags, size))
|
||||||
|
, m(f)
|
||||||
, _size(size)
|
, _size(size)
|
||||||
, _flags(flags)
|
, _flags(flags)
|
||||||
, _family(family) {
|
, _family(family) {
|
||||||
|
|
@ -306,32 +308,6 @@ FontData::FontData(int size, uint32 flags, int family, Font *other)
|
||||||
}
|
}
|
||||||
modified[_flags] = Font(this);
|
modified[_flags] = Font(this);
|
||||||
|
|
||||||
if (_flags & FontMonospace) {
|
|
||||||
f.setFamily(MonospaceFont());
|
|
||||||
} else {
|
|
||||||
f.setFamily(GetFontOverride(flags));
|
|
||||||
}
|
|
||||||
|
|
||||||
f.setPixelSize(size);
|
|
||||||
f.setItalic(_flags & FontItalic);
|
|
||||||
f.setUnderline(_flags & FontUnderline);
|
|
||||||
f.setStrikeOut(_flags & FontStrikeOut);
|
|
||||||
|
|
||||||
if ((_flags & FontBold) || (_flags & FontSemibold)) {
|
|
||||||
#ifdef DESKTOP_APP_USE_PACKAGED_FONTS
|
|
||||||
f.setWeight(QFont::DemiBold);
|
|
||||||
#else // DESKTOP_APP_USE_PACKAGED_FONTS
|
|
||||||
f.setBold(true);
|
|
||||||
#endif // !DESKTOP_APP_USE_PACKAGED_FONTS
|
|
||||||
|
|
||||||
if (_flags & FontItalic) {
|
|
||||||
f.setStyleName("Semibold Italic");
|
|
||||||
} else {
|
|
||||||
f.setStyleName("Semibold");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
m = QFontMetrics(f);
|
|
||||||
height = m.height();
|
height = m.height();
|
||||||
ascent = m.ascent();
|
ascent = m.ascent();
|
||||||
descent = m.descent();
|
descent = m.descent();
|
||||||
|
|
|
||||||
|
|
@ -16,6 +16,7 @@ namespace internal {
|
||||||
|
|
||||||
void StartFonts();
|
void StartFonts();
|
||||||
[[nodiscard]] QString GetFontOverride(int32 flags = 0);
|
[[nodiscard]] QString GetFontOverride(int32 flags = 0);
|
||||||
|
[[nodiscard]] QString MonospaceFont();
|
||||||
|
|
||||||
void destroyFonts();
|
void destroyFonts();
|
||||||
int registerFontFamily(const QString &family);
|
int registerFontFamily(const QString &family);
|
||||||
|
|
@ -67,17 +68,19 @@ enum FontFlags {
|
||||||
|
|
||||||
class FontData {
|
class FontData {
|
||||||
public:
|
public:
|
||||||
|
int width(const QString &str) const {
|
||||||
int32 width(const QString &str) const {
|
|
||||||
return m.width(str);
|
return m.width(str);
|
||||||
}
|
}
|
||||||
int32 width(const QString &str, int32 from, int32 to) const {
|
int width(const QString &str, int32 from, int32 to) const {
|
||||||
return width(str.mid(from, to));
|
return width(str.mid(from, to));
|
||||||
}
|
}
|
||||||
int32 width(QChar ch) const {
|
int width(QChar ch) const {
|
||||||
return m.width(ch);
|
return m.width(ch);
|
||||||
}
|
}
|
||||||
QString elided(const QString &str, int32 width, Qt::TextElideMode mode = Qt::ElideRight) const {
|
QString elided(
|
||||||
|
const QString &str,
|
||||||
|
int width,
|
||||||
|
Qt::TextElideMode mode = Qt::ElideRight) const {
|
||||||
return m.elidedText(str, mode, width);
|
return m.elidedText(str, mode, width);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue