1 // This file is part of Desktop App Toolkit,
2 // a set of libraries for developing nice desktop applications.
3 //
4 // For license and copyright information please follow this link:
5 // https://github.com/desktop-app/legal/blob/master/LEGAL
6 //
7 #pragma once
8 
9 #include "base/basic_types.h"
10 
11 #include <QtGui/QFont>
12 #include <QtGui/QFontMetrics>
13 
14 namespace style {
15 namespace internal {
16 
17 void StartFonts();
18 [[nodiscard]] QString GetFontOverride(int32 flags = 0);
19 [[nodiscard]] QString MonospaceFont();
20 
21 void destroyFonts();
22 int registerFontFamily(const QString &family);
23 
24 class FontData;
25 class Font {
26 public:
27 	Font(Qt::Initialization = Qt::Uninitialized) : ptr(0) {
28 	}
29 	Font(int size, uint32 flags, const QString &family);
30 	Font(int size, uint32 flags, int family);
31 
32 	FontData *operator->() const {
33 		return ptr;
34 	}
v()35 	FontData *v() const {
36 		return ptr;
37 	}
38 
39 	operator bool() const {
40 		return !!ptr;
41 	}
42 
43 	operator const QFont &() const;
44 
45 private:
46 	FontData *ptr;
47 
48 	void init(int size, uint32 flags, int family, Font *modified);
49 	friend void startManager();
50 
Font(FontData * p)51 	Font(FontData *p) : ptr(p) {
52 	}
53 	Font(int size, uint32 flags, int family, Font *modified);
54 	friend class FontData;
55 
56 };
57 
58 enum FontFlags {
59 	FontBold = 0x01,
60 	FontItalic = 0x02,
61 	FontUnderline = 0x04,
62 	FontStrikeOut = 0x08,
63 	FontSemibold = 0x10,
64 	FontMonospace = 0x20,
65 
66 	FontDifferentFlags = 0x40,
67 };
68 
69 class FontData {
70 public:
width(const QString & str)71 	int width(const QString &str) const {
72 		return m.horizontalAdvance(str);
73 	}
width(const QString & str,int32 from,int32 to)74 	int width(const QString &str, int32 from, int32 to) const {
75 		return width(str.mid(from, to));
76 	}
width(QChar ch)77 	int width(QChar ch) const {
78 		return m.horizontalAdvance(ch);
79 	}
80 	QString elided(
81 			const QString &str,
82 			int width,
83 			Qt::TextElideMode mode = Qt::ElideRight) const {
84 		return m.elidedText(str, mode, width);
85 	}
86 
87 	Font bold(bool set = true) const;
88 	Font italic(bool set = true) const;
89 	Font underline(bool set = true) const;
90 	Font strikeout(bool set = true) const;
91 	Font semibold(bool set = true) const;
92 	Font monospace(bool set = true) const;
93 
94 	int size() const;
95 	uint32 flags() const;
96 	int family() const;
97 
98 	QFont f;
99 	QFontMetrics m;
100 	int32 height, ascent, descent, spacew, elidew;
101 
102 private:
103 	mutable Font modified[FontDifferentFlags];
104 
105 	Font otherFlagsFont(uint32 flag, bool set) const;
106 	FontData(int size, uint32 flags, int family, Font *other);
107 
108 	friend class Font;
109 	int _size;
110 	uint32 _flags;
111 	int _family;
112 
113 };
114 
115 inline bool operator==(const Font &a, const Font &b) {
116 	return a.v() == b.v();
117 }
118 inline bool operator!=(const Font &a, const Font &b) {
119 	return a.v() != b.v();
120 }
121 
122 inline Font::operator const QFont &() const {
123 	return ptr->f;
124 }
125 
126 } // namespace internal
127 } // namespace style
128