mirror-chatterino2/src/singletons/fontmanager.hpp

145 lines
4 KiB
C++
Raw Normal View History

#pragma once
2017-04-12 17:46:44 +02:00
#include <QFont>
2018-01-17 14:14:31 +01:00
#include <QFontDatabase>
2017-04-12 17:46:44 +02:00
#include <QFontMetrics>
#include <pajlada/settings/setting.hpp>
#include <pajlada/signals/signal.hpp>
2017-04-12 17:46:44 +02:00
2017-04-14 17:52:22 +02:00
namespace chatterino {
2017-12-31 22:58:35 +01:00
namespace singletons {
2017-04-12 17:46:44 +02:00
class FontManager
{
public:
FontManager();
FontManager(const FontManager &) = delete;
FontManager(FontManager &&) = delete;
~FontManager() = delete;
enum Type : uint8_t {
2018-01-17 14:14:31 +01:00
Tiny,
Small,
MediumSmall,
Medium,
MediumBold,
MediumItalic,
Large,
VeryLarge,
};
2017-04-12 17:46:44 +02:00
2018-01-17 14:14:31 +01:00
QFont &getFont(Type type, float scale);
QFontMetrics &getFontMetrics(Type type, float scale);
2017-04-12 17:46:44 +02:00
int getGeneration() const
2017-04-12 17:46:44 +02:00
{
return this->generation;
2017-04-12 17:46:44 +02:00
}
void incGeneration()
{
this->generation++;
2017-04-12 17:46:44 +02:00
}
pajlada::Settings::Setting<std::string> currentFontFamily;
pajlada::Settings::Setting<int> currentFontSize;
2017-04-12 17:46:44 +02:00
pajlada::Signals::NoArgSignal fontChanged;
private:
struct FontData {
FontData(QFont &&_font)
: font(_font)
, metrics(this->font)
{
}
QFont font;
QFontMetrics metrics;
};
struct Font {
Font() = delete;
2018-01-19 14:48:17 +01:00
Font(const char *fontFamilyName, int mediumSize)
2018-01-17 14:14:31 +01:00
: tiny(QFont("Monospace", 8))
, small(QFont(fontFamilyName, mediumSize - 4))
2017-12-31 00:50:07 +01:00
, mediumSmall(QFont(fontFamilyName, mediumSize - 2))
, medium(QFont(fontFamilyName, mediumSize))
2017-12-23 23:48:10 +01:00
, mediumBold(QFont(fontFamilyName, mediumSize, QFont::DemiBold))
, mediumItalic(QFont(fontFamilyName, mediumSize, -1, true))
, large(QFont(fontFamilyName, mediumSize))
, veryLarge(QFont(fontFamilyName, mediumSize))
{
2018-01-17 14:14:31 +01:00
tiny.font.setStyleHint(QFont::TypeWriter);
}
void setFamily(const char *newFamily)
{
this->small.font.setFamily(newFamily);
this->mediumSmall.font.setFamily(newFamily);
this->medium.font.setFamily(newFamily);
this->mediumBold.font.setFamily(newFamily);
this->mediumItalic.font.setFamily(newFamily);
this->large.font.setFamily(newFamily);
this->veryLarge.font.setFamily(newFamily);
this->updateMetrics();
}
void setSize(int newMediumSize)
{
this->small.font.setPointSize(newMediumSize - 4);
this->mediumSmall.font.setPointSize(newMediumSize - 2);
this->medium.font.setPointSize(newMediumSize);
this->mediumBold.font.setPointSize(newMediumSize);
this->mediumItalic.font.setPointSize(newMediumSize);
this->large.font.setPointSize(newMediumSize + 2);
this->veryLarge.font.setPointSize(newMediumSize + 4);
this->updateMetrics();
}
void updateMetrics()
{
this->small.metrics = QFontMetrics(this->small.font);
this->mediumSmall.metrics = QFontMetrics(this->mediumSmall.font);
this->medium.metrics = QFontMetrics(this->medium.font);
this->mediumBold.metrics = QFontMetrics(this->mediumBold.font);
this->mediumItalic.metrics = QFontMetrics(this->mediumItalic.font);
this->large.metrics = QFontMetrics(this->large.font);
this->veryLarge.metrics = QFontMetrics(this->veryLarge.font);
}
FontData &getFontData(Type type);
QFont &getFont(Type type);
QFontMetrics &getFontMetrics(Type type);
2018-01-17 14:14:31 +01:00
FontData tiny;
FontData small;
FontData mediumSmall;
FontData medium;
FontData mediumBold;
FontData mediumItalic;
FontData large;
FontData veryLarge;
};
2018-01-17 14:14:31 +01:00
Font &getCurrentFont(float scale);
// Future plans:
// Could have multiple fonts in here, such as "Menu font", "Application font", "Chat font"
2018-01-17 14:14:31 +01:00
std::list<std::pair<float, Font>> currentFontByScale;
int generation = 0;
2017-04-12 17:46:44 +02:00
};
2018-01-17 14:14:31 +01:00
} // namespace singletons
2017-04-12 17:46:44 +02:00
using FontStyle = singletons::FontManager::Type;
} // namespace chatterino