blob: ab1e8c92fef8cfed725d11b40f2c77a92a05401a [file] [log] [blame]
#include <QElapsedTimer>
#include <QSlider>
#include <QTimer>
#include <QMessageBox>
#include <QDebug>
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
#ifndef WITH_FREETYPE
ui->chBoxDrawFreeType->hide();
#endif
#ifndef WITH_HARFBUZZ
ui->chBoxDrawHarfBuzz->hide();
#endif
if (qApp->arguments().size() == 2) {
QTimer::singleShot(1, this, [this](){
loadFont(qApp->arguments().at(1));
});
}
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::loadFont(const QString &path)
{
try {
m_ttfpFont.open(path);
const auto variations = m_ttfpFont.loadVariations();
if (!variations.isEmpty()) {
ui->widgetVariations->show();
// Clear layout.
while (ui->layVariations->count()) {
delete ui->layVariations->takeAt(0);
}
m_variationSliders.clear();
QVector<Variation> newVariations;
for (const auto &var : variations) {
auto hlay = new QHBoxLayout();
hlay->setContentsMargins(0, 0, 0, 0);
hlay->addWidget(new QLabel(var.name));
auto slider = new QSlider(Qt::Horizontal);
slider->setMinimum(var.min);
slider->setMaximum(var.max);
slider->setValue(var.def);
hlay->addWidget(slider);
ui->layVariations->addLayout(hlay);
m_variationSliders.append({ slider, var.tag });
connect(slider, &QSlider::valueChanged, this, &MainWindow::onVariationChanged);
newVariations.append({ var.tag, var.def });
}
m_ttfpFont.setVariations(newVariations);
} else {
ui->widgetVariations->hide();
}
#ifdef WITH_FREETYPE
m_ftFont.open(path);
#endif
#ifdef WITH_HARFBUZZ
m_hbFont.open(path);
#endif
ui->glyphsView->setFontInfo(m_ttfpFont.fontInfo());
reloadGlyphs();
} catch (const QString &err) {
QMessageBox::warning(this, tr("Error"), err);
}
}
void MainWindow::reloadGlyphs()
{
const auto fi = m_ttfpFont.fontInfo();
for (quint16 i = 0; i < fi.numberOfGlyphs; ++i) {
try {
ui->glyphsView->setGlyph(i, m_ttfpFont.outline(i));
} catch (...) {
}
#ifdef WITH_FREETYPE
try {
ui->glyphsView->setFTGlyph(i, m_ftFont.outline(i));
} catch (...) {
}
#endif
#ifdef WITH_HARFBUZZ
try {
ui->glyphsView->setHBGlyph(i, m_hbFont.outline(i));
} catch (...) {
}
#endif
}
ui->glyphsView->viewport()->update();
}
void MainWindow::onVariationChanged()
{
try {
QVector<Variation> variations;
for (auto var : m_variationSliders) {
variations.append({ var.tag, var.slider->value() });
}
#ifdef WITH_FREETYPE
m_ftFont.setVariations(variations);
#endif
#ifdef WITH_HARFBUZZ
m_hbFont.setVariations(variations);
#endif
m_ttfpFont.setVariations(variations);
reloadGlyphs();
} catch (const QString &err) {
QMessageBox::warning(this, tr("Error"), err);
}
}
void MainWindow::on_chBoxDrawBboxes_stateChanged(int flag)
{
ui->glyphsView->setDrawBboxes(flag);
}
void MainWindow::on_chBoxDrawTtfParser_stateChanged(int flag)
{
ui->glyphsView->setDrawGlyphs(flag);
}
void MainWindow::on_chBoxDrawFreeType_stateChanged(int flag)
{
ui->glyphsView->setDrawFTGlyphs(flag);
}
void MainWindow::on_chBoxDrawHarfBuzz_stateChanged(int flag)
{
ui->glyphsView->setDrawHBGlyphs(flag);
}