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