kdelibs/kdeui/fonts/kfontrequester.cpp
Ivailo Monev c43d9e8df7 kdeui: prepare for Katie changes
Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
2022-11-19 05:02:18 +02:00

236 lines
6.2 KiB
C++

/*
Copyright (C) 2003 Nadeem Hasan <nhasan@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#include "kfontrequester.h"
#include "fonthelpers_p.h"
#include <QtGui/QLabel>
#include <QtGui/QPushButton>
#include <QtGui/QLayout>
#include <QtGui/QFontDatabase>
#include <kfontdialog.h>
#include <klocale.h>
#include <cmath>
// Determine if the font with given properties is available on the system,
// otherwise find and return the best fitting combination.
static QFont nearestExistingFont (const QFont &font)
{
QFontDatabase dbase;
// Initialize font data accoring to given font object.
QString family = font.family();
QString style = dbase.styleString(font);
qreal size = font.pointSizeF();
// Check if the family exists.
const QStringList families = dbase.families();
if (!dbase.hasFamily(family)) {
// Chose another family.
family = families.count() ? families[0] : "fixed";
// TODO: Try to find nearest match?
}
// Check if the family has the requested style.
// Easiest by piping it through font selection in the database.
style = dbase.styleString(dbase.font(family, style, 10));
// Check if the family has the requested size.
// Only for bitmap fonts.
if (!dbase.isScalable(family, style)) {
QList<int> sizes = dbase.pointSizes(family, style);
if (!sizes.contains(size)) {
// Find nearest available size.
int mindiff = 1000;
int refsize = size;
foreach (int lsize, sizes) {
int diff = qAbs(refsize - lsize);
if (mindiff > diff) {
mindiff = diff;
size = lsize;
}
}
}
}
// Select the font with confirmed properties.
QFont result = dbase.font(family, style, int(size));
if (dbase.isScalable(family, style) && result.pointSize() == floor(size)) {
result.setPointSizeF(size);
}
return result;
}
class KFontRequester::KFontRequesterPrivate
{
public:
KFontRequesterPrivate(KFontRequester *q): q(q) {}
void displaySampleText();
void setToolTip();
void _k_buttonClicked();
KFontRequester *q;
bool m_onlyFixed;
QString m_sampleText, m_title;
QLabel *m_sampleLabel;
QPushButton *m_button;
QFont m_selFont;
};
KFontRequester::KFontRequester( QWidget *parent, bool onlyFixed )
: QWidget( parent ), d(new KFontRequesterPrivate(this))
{
d->m_onlyFixed = onlyFixed;
QHBoxLayout *layout = new QHBoxLayout( this );
layout->setMargin( 0 );
d->m_sampleLabel = new QLabel( this );
d->m_button = new QPushButton( i18n( "Choose..." ), this );
d->m_sampleLabel->setFrameStyle( QFrame::StyledPanel | QFrame::Sunken );
setFocusProxy( d->m_button );
layout->addWidget( d->m_sampleLabel, 1 );
layout->addWidget( d->m_button );
connect( d->m_button, SIGNAL(clicked()), SLOT(_k_buttonClicked()) );
d->displaySampleText();
d->setToolTip();
}
KFontRequester::~KFontRequester()
{
delete d;
}
QFont KFontRequester::font() const
{
return d->m_selFont;
}
bool KFontRequester::isFixedOnly() const
{
return d->m_onlyFixed;
}
QString KFontRequester::sampleText() const
{
return d->m_sampleText;
}
QString KFontRequester::title() const
{
return d->m_title;
}
QLabel *KFontRequester::label() const
{
return d->m_sampleLabel;
}
QPushButton *KFontRequester::button() const
{
return d->m_button;
}
void KFontRequester::setFont( const QFont &font, bool onlyFixed )
{
d->m_selFont = nearestExistingFont(font);
d->m_onlyFixed = onlyFixed;
d->displaySampleText();
emit fontSelected( d->m_selFont );
}
void KFontRequester::setSampleText( const QString &text )
{
d->m_sampleText = text;
d->displaySampleText();
}
void KFontRequester::setTitle( const QString &title )
{
d->m_title = title;
d->setToolTip();
}
void KFontRequester::KFontRequesterPrivate::_k_buttonClicked()
{
KFontChooser::DisplayFlags flags = KFontChooser::NoDisplayFlags;
if ( m_onlyFixed ) {
flags |= KFontChooser::FixedFontsOnly;
}
int result = KFontDialog::getFont( m_selFont, flags, q->parentWidget() );
if ( result == KDialog::Accepted )
{
displaySampleText();
emit q->fontSelected( m_selFont );
}
}
void KFontRequester::KFontRequesterPrivate::displaySampleText()
{
m_sampleLabel->setFont( m_selFont );
qreal size = m_selFont.pointSizeF();
if(size == -1)
size = m_selFont.pixelSize();
if ( m_sampleText.isEmpty() ) {
QString family = translateFontName(m_selFont.family());
m_sampleLabel->setText( QString( "%1 %2" ).arg( family ).arg( KGlobal::locale()->formatNumber( size, (size == floor(size)) ? 0 : 1 ) ) );
}
else {
m_sampleLabel->setText( m_sampleText );
}
}
void KFontRequester::KFontRequesterPrivate::setToolTip()
{
m_button->setToolTip( i18n( "Click to select a font" ) );
m_sampleLabel->setToolTip( QString() );
m_sampleLabel->setWhatsThis(QString());
if ( m_title.isNull() )
{
m_sampleLabel->setToolTip( i18n( "Preview of the selected font" ) );
m_sampleLabel->setWhatsThis( i18n( "This is a preview of the selected font. You can change it"
" by clicking the \"Choose...\" button." ) );
}
else
{
m_sampleLabel->setToolTip( i18n( "Preview of the \"%1\" font" , m_title ) );
m_sampleLabel->setWhatsThis( i18n( "This is a preview of the \"%1\" font. You can change it"
" by clicking the \"Choose...\" button." , m_title ) );
}
}
#include "moc_kfontrequester.cpp"
/* vim: et sw=2 ts=2
*/