Freeciv21
Develop your civilization from humble roots to a global empire
fonts.cpp
Go to the documentation of this file.
1 /*
2  Copyright (c) 1996-2022 Freeciv21 and Freeciv contributors. This file is
3  part of Freeciv21. Freeciv21 is free software: you can redistribute it
4  and/or modify it under the terms of the GNU General Public License as
5  published by the Free Software Foundation, either version 3 of the
6  License, or (at your option) any later version. You should have received
7  a copy of the GNU General Public License along with Freeciv21. If not,
8  see https://www.gnu.org/licenses/.
9  */
10 
11 #include "fonts.h"
12 // Qt
13 #include <QDirIterator>
14 #include <QFontDatabase>
15 #include <QGuiApplication>
16 #include <QScreen>
17 
18 // client
19 #include "gui_main.h"
20 #include "options.h"
21 
22 static void configure_font(const QString &font_name, const QStringList &sl,
23  QFont::StyleHint hint, int size,
24  bool bold = false);
25 
30 
35 {
36  if (!m_instance) {
37  m_instance = new fcFont;
38  }
39  return m_instance;
40 }
41 
46 {
47  if (m_instance) {
49  delete m_instance;
50  m_instance = 0;
51  }
52 }
53 
57 QFont fcFont::getFont(const QString &name, double zoom) const
58 {
63  if (font_map.contains(name)) {
64  auto font = font_map.value(name);
66  font.setPointSizeF(font.pointSizeF() * zoom);
67  }
68  return font;
69  } else {
70  return QFont();
71  }
72 }
73 
78 {
86  {
87  if (option_type(poption) == OT_FONT) {
88  auto f = option_font_get(poption);
89  auto s = option_name(poption);
90  setFont(s, f);
91  }
92  }
94 }
95 
99 void fcFont::setSizeAll(int new_size)
100 {
102  {
103  if (option_type(poption) == OT_FONT) {
104  auto font = option_font_get(poption);
105  int old_size = font.pointSize();
106  font.setPointSize(old_size + (new_size * old_size) / 100);
107  option_font_set(poption, font);
108  gui_qt_apply_font(poption);
109  }
110  }
112 }
113 
117 void fcFont::releaseFonts() { font_map.clear(); }
118 
122 void fcFont::setFont(const QString &name, const QFont &qf)
123 {
124  font_map.insert(name, qf);
125 }
126 
130 bool isFontInstalled(const QString &font_name)
131 {
132  QFontDatabase database;
133 
134  return database.families().contains(font_name);
135 }
136 
141 {
142  const auto il =
143  find_files_in_path(get_data_dirs(), QStringLiteral("fonts"), false);
144  if (!il.isEmpty()) {
145  for (const auto &info : qAsConst(il)) {
146  QDirIterator iterator(
147  info.absolutePath(),
148  {QStringLiteral("*.otf"), QStringLiteral("*.ttf")}, QDir::Files,
149  QDirIterator::Subdirectories);
150  while (iterator.hasNext()) {
151  QFontDatabase::addApplicationFont(iterator.next());
152  }
153  }
154  }
155 }
156 
161 {
162  QStringList sl;
163 
164  const int large_size = 16;
165  const int default_size = 12;
166 
167  if (!isFontInstalled(QStringLiteral("Libertinus Sans"))
168  && !isFontInstalled(QStringLiteral("Linux Libertine"))) {
169  load_fonts();
170  }
171 
172  /* Sans Serif List */
173  sl << QStringLiteral("Libertinus Sans")
174  << QStringLiteral("Linux Biolinum O")
175  << QStringLiteral("Linux Biolinum");
176 
177  configure_font(fonts::default_font, sl, QFont::SansSerif, default_size);
178  configure_font(fonts::city_names, sl, QFont::SansSerif, default_size,
179  true);
180  configure_font(fonts::city_productions, sl, QFont::SansSerif,
181  default_size);
182 
183  /* Monospace List */
184  sl.clear();
185  sl << QStringLiteral("Libertinus Mono")
186  << QStringLiteral("Linux Libertine Mono O")
187  << QStringLiteral("Linux Libertine Mono");
188 
189  configure_font(fonts::notify_label, sl, QFont::Monospace, default_size);
190  configure_font(fonts::help_label, sl, QFont::Monospace, default_size);
191  configure_font(fonts::help_text, sl, QFont::Monospace, default_size);
192  configure_font(fonts::chatline, sl, QFont::Monospace, default_size);
193 
194  /* Serif List */
195  sl.clear();
196  sl << QStringLiteral("Libertinus Serif Display")
197  << QStringLiteral("Linux Libertine Display O")
198  << QStringLiteral("Linux Libertine Display");
199 
200  configure_font(fonts::reqtree_text, sl, QFont::Serif, large_size);
201 }
202 
206 void configure_font(const QString &font_name, const QStringList &sl,
207  QFont::StyleHint hint, int size, bool bold)
208 {
209  auto opt = optset_option_by_name(client_optset, qUtf8Printable(font_name));
210  fc_assert_ret(opt);
211 
212  // FIXME Qt 6: Use QFont(QStringList...)
213  QFontDatabase database;
214  QFont font;
215 
216  for (auto const &str : sl) {
217  if (database.families().contains(str)) {
218  font = QFont(str, size, bold ? QFont::Bold : QFont::Normal);
219  font.setStyleHint(hint);
220  option_font_set_default(opt, font);
221  fcFont::instance()->setFont(font_name, font);
222  return;
223  }
224  }
225 
226  font = QFont();
227  font.setStyleHint(hint);
228  option_font_set_default(opt, font);
229  fcFont::instance()->setFont(font_name, font);
230 }
Definition: fonts.h:28
void initFonts()
Initiazlizes fonts from client options.
Definition: fonts.cpp:77
QMap< QString, QFont > font_map
Definition: fonts.h:32
void setSizeAll(int)
Increases/decreases all fonts sizes.
Definition: fonts.cpp:99
void releaseFonts()
Deletes all fonts.
Definition: fonts.cpp:117
fcFont()
Font provider constructor.
Definition: fonts.cpp:29
QFont getFont(const QString &name, double zoom=1.0) const
Returns desired font.
Definition: fonts.cpp:57
static fcFont * m_instance
Definition: fonts.h:33
static void drop()
Deletes fc_icons instance.
Definition: fonts.cpp:45
static fcFont * instance()
Returns instance of fc_font.
Definition: fonts.cpp:34
void setFont(const QString &name, const QFont &qf)
Adds new font or overwrite old one.
Definition: fonts.cpp:122
void load_fonts()
Loads the fonts into the font database.
Definition: fonts.cpp:140
static void configure_font(const QString &font_name, const QStringList &sl, QFont::StyleHint hint, int size, bool bold=false)
Returns long font name, sets given for for use.
Definition: fonts.cpp:206
bool isFontInstalled(const QString &font_name)
Returns if a font is installed.
Definition: fonts.cpp:130
void configure_fonts()
Tries to choose good fonts for Freeciv21.
Definition: fonts.cpp:160
void gui_qt_apply_font(struct option *poption)
Change the given font.
Definition: gui_main.cpp:195
const char * name
Definition: inputfile.cpp:118
#define fc_assert_ret(condition)
Definition: log.h:112
const char *const city_productions
Definition: fonts.h:24
const char *const chatline
Definition: fonts.h:22
const char *const default_font
Definition: fonts.h:18
const char *const notify_label
Definition: fonts.h:19
const char *const help_label
Definition: fonts.h:20
const char *const city_names
Definition: fonts.h:23
const char *const help_text
Definition: fonts.h:21
const char *const reqtree_text
Definition: fonts.h:25
const char * option_name(const struct option *poption)
Returns the name of the option.
Definition: options.cpp:300
client_options * gui_options
Definition: options.cpp:74
const struct option_set * client_optset
Definition: options.cpp:860
bool option_font_set(struct option *poption, const QFont &font)
Sets the value of this font option.
Definition: options.cpp:793
struct option * optset_option_by_name(const struct option_set *poptset, const char *name)
Returns the option corresponding of the name in this option set.
Definition: options.cpp:110
enum option_type option_type(const struct option *poption)
Returns the type of the option.
Definition: options.cpp:330
void option_font_set_default(const struct option *poption, const QFont &font)
Returns the default value of this font option.
Definition: options.cpp:771
QFont option_font_get(const struct option *poption)
Returns the current value of this font option.
Definition: options.cpp:749
#define options_iterate(poptset, poption)
Definition: options.h:292
#define options_iterate_end
Definition: options.h:297
const QStringList & get_data_dirs()
Returns a list of data directory paths, in the order in which they should be searched.
Definition: shared.cpp:533
QFileInfoList find_files_in_path(const QStringList &path, const QString &pattern, bool nodups)
Search for file names matching the pattern in the provided list of directories.
Definition: shared.cpp:681
size_t size
Definition: specvec.h:64
bool zoom_scale_fonts
Definition: options.h:143
void(* next)(struct iterator *it)
Definition: iterator.h:21
QString bold(const QString &text)
'text' is assumed to have already been HTML-escaped if necessary
Definition: tooltips.cpp:76