2022-03-05 22:41:29 +05:00

161 lines
3.7 KiB
C++

/*
SPDX-FileCopyrightText: 2003-2007 Craig Drummond <craig@kde.org>
SPDX-License-Identifier: GPL-2.0-or-later
*/
#include "FontPreview.h"
#include "CharTip.h"
#include <QMouseEvent>
#include <QPainter>
#include <QWheelEvent>
#include <stdlib.h>
namespace KFI
{
static const int constBorder = 4;
static const int constStepSize = 16;
CFontPreview::CFontPreview(QWidget *parent)
: QWidget(parent)
, m_currentFace(1)
, m_lastWidth(0)
, m_lastHeight(0)
, m_styleInfo(KFI_NO_STYLE_INFO)
, m_tip(nullptr)
{
m_engine = new CFcEngine;
}
CFontPreview::~CFontPreview()
{
delete m_tip;
delete m_engine;
}
void CFontPreview::showFont(const QString &name, unsigned long styleInfo, int face)
{
m_fontName = name;
m_styleInfo = styleInfo;
showFace(face);
}
void CFontPreview::showFace(int face)
{
m_currentFace = face;
showFont();
}
void CFontPreview::showFont()
{
m_lastWidth = width() + constStepSize;
m_lastHeight = height() + constStepSize;
m_image = m_engine->draw(m_fontName,
m_styleInfo,
m_currentFace,
palette().text().color(),
palette().base().color(),
m_lastWidth,
m_lastHeight,
false,
m_range,
&m_chars);
if (!m_image.isNull()) {
m_lastChar = CFcEngine::TChar();
setMouseTracking(m_chars.count() > 0);
update();
Q_EMIT status(true);
Q_EMIT atMax(m_engine->atMax());
Q_EMIT atMin(m_engine->atMin());
} else {
m_lastChar = CFcEngine::TChar();
setMouseTracking(false);
update();
Q_EMIT status(false);
Q_EMIT atMax(true);
Q_EMIT atMin(true);
}
}
void CFontPreview::zoomIn()
{
m_engine->zoomIn();
showFont();
Q_EMIT atMax(m_engine->atMax());
}
void CFontPreview::zoomOut()
{
m_engine->zoomOut();
showFont();
Q_EMIT atMin(m_engine->atMin());
}
void CFontPreview::setUnicodeRange(const QList<CFcEngine::TRange> &r)
{
m_range = r;
showFont();
}
void CFontPreview::paintEvent(QPaintEvent *)
{
QPainter paint(this);
paint.fillRect(rect(), palette().base());
if (!m_image.isNull()) {
if (abs(width() - m_lastWidth) > constStepSize || abs(height() - m_lastHeight) > constStepSize) {
showFont();
} else {
paint.drawImage(
QPointF(constBorder, constBorder),
m_image,
QRectF(0, 0, (width() - (constBorder * 2)) * m_image.devicePixelRatioF(), (height() - (constBorder * 2)) * m_image.devicePixelRatioF()));
}
}
}
void CFontPreview::mouseMoveEvent(QMouseEvent *event)
{
if (!m_chars.isEmpty()) {
QList<CFcEngine::TChar>::ConstIterator end(m_chars.end());
if (m_lastChar.isNull() || !m_lastChar.contains(event->pos())) {
for (QList<CFcEngine::TChar>::ConstIterator it(m_chars.begin()); it != end; ++it) {
if ((*it).contains(event->pos())) {
if (!m_tip) {
m_tip = new CCharTip(this);
}
m_tip->setItem(*it);
m_lastChar = *it;
break;
}
}
}
}
}
void CFontPreview::wheelEvent(QWheelEvent *e)
{
if (e->angleDelta().y() > 0) {
zoomIn();
} else if (e->angleDelta().y() < 0) {
zoomOut();
}
e->accept();
}
QSize CFontPreview::sizeHint() const
{
return QSize(132, 132);
}
QSize CFontPreview::minimumSizeHint() const
{
return QSize(32, 32);
}
}