diff --git a/docs/pics/kfontchooserdialog.png b/docs/pics/kfontchooserdialog.png new file mode 100644 index 0000000000000000000000000000000000000000..1526adfb3043b84476025ea18586f6a3690dd798 GIT binary patch literal 33168 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%0Dbg@ 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 BBijG~ literal 0 Hc$@ + Copyright (c) 1999 Preston Brown + Copyright (c) 1999 Mario Weilguni + + 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. +*/ +#ifndef K_FONT_CHOOSER_DIALOG_H +#define K_FONT_CHOOSER_DIALOG_H + +#include + +#include + +class QFont; +class QStringList; + +class KFontChooserDialogPrivate; + +/** + * @short A font selection dialog. + * + * The KFontChooserDialog provides a dialog for interactive font selection. + * It is basically a thin wrapper around the KFontChooser widget (the latter + * can also be used standalone). In most cases, the simplest use of this + * class is the static method KFontChooserDialog::getFont(), which shows + * the dialog, allows the user to select a font, and returns when the + * dialog is closed. + * + * Features offered by KFontChooserDialog/KFontChooser: + * - The ability to set decimal font sizes (e.g. "12.1") + * - When selecting an initial font, if the styleName property of that font + * isn't set, the dialog will try and select the correct font style from the + * styles list + * - The ability to set multiple fonts at once, for an example of this functionality + * see "Adjust All Fonts" in the Fonts KCM in Systemsettings; and you can change + * the font family, style or size separately + * - Discarding the styleName property when closing the dialog for "Regular" font + * styles, since it doesn't make sense to set that property for such fonts and + * this allows setBold(true) to work correctly for more details see: + * https://bugreports.qt.io/browse/QTBUG-63792 + * https://bugs.kde.org/show_bug.cgi?id=378523 + * + * Example: + * + * \code + * QFont myFont; + * int result = KFontChooserDialog::getFont(myFont); + * if (result == QDialog::Accepted) { + * ... + * } + * \endcode + * + * \image html kfontchooserdialog.png "KDE Font Dialog" + * + * @author Preston Brown , Bernd Wuebben + * + */ +class KWIDGETSADDONS_EXPORT KFontChooserDialog : public QDialog +{ + Q_OBJECT + +public: + /** + * Constructs a font selection dialog. + * + * @param parent The parent widget of the dialog, if any. + * @param flags Defines how the font chooser is displayed. + * @see KFontChooser::DisplayFlags + * @param fontlist a list of fonts to display, in XLFD format. If + * no list is formatted, the internal KDE font list is used. + * If that has not been created, X is queried, and all fonts + * available on the system are displayed. + * + */ + explicit KFontChooserDialog(QWidget *parent = nullptr, + const KFontChooser::DisplayFlags &flags = KFontChooser::NoDisplayFlags, + const QStringList &fontlist = QStringList()); + + ~KFontChooserDialog(); + + /** + * Sets the currently selected font in the dialog. + * + * @param font The font to select + * @param onlyFixed If true, the font list will show only fixed width (monospace) + * fonts, otherwise all available fonts are shown + */ + void setFont(const QFont &font, bool onlyFixed = false); + + /** + * @return The currently selected font in the dialog. + */ + QFont font() const; + + /** + * Creates a modal font dialog, lets the user choose a font, and returns when + * the dialog is closed. + * + * @param theFont a reference to the font to write the chosen font into. + * @param flags Defines how the font chooser is displayed. + * @see KFontChooser::DisplayFlags + * @param parent Parent widget of the dialog; the dialog will be centered in front + * of it. + * @return QDialog::result(). + */ + static int getFont(QFont &theFont, + const KFontChooser::DisplayFlags &flags = KFontChooser::NoDisplayFlags, + QWidget *parent = nullptr); + + /** + * Creates a modal font difference dialog, lets the user choose a selection + * of changes that should be made to a set of fonts, and returns when the + * dialog is closed. Useful for choosing slight adjustments to the font set + * when the user would otherwise have to manually edit a number of fonts. + * + * @param theFont a reference to the font to write the chosen font into. + * @param flags Defines how the font chooser is displayed. + * @see KFontChooser::DisplayFlags + * @param diffFlags a reference to the int into which the chosen + * difference selection bitmask should be written. + * Check the returned bitmask like: + * \code + * if ( diffFlags & KFontChooser::FontDiffFamily ) { + * [...] + * } + * if ( diffFlags & KFontChooser::FontDiffStyle ) { + * [...] + * } + * if ( diffFlags & KFontChooser::FontDiffSize ) { + * [...] + * } + * \endcode + * @param parent Parent widget of the dialog; the dialog will be centered top of it. + * + * @returns QDialog::result(). + */ + static int getFontDiff(QFont &theFont, + KFontChooser::FontDiffFlags &diffFlags, + const KFontChooser::DisplayFlags &flags = KFontChooser::NoDisplayFlags, + QWidget *parent = nullptr); + +Q_SIGNALS: + /** + * Emitted whenever the currently selected font changes. + * Connect to this to monitor the font as it is selected if you are + * not running modal. + */ + void fontSelected(const QFont &font); + +private: + KFontChooserDialogPrivate *const d; + + Q_DISABLE_COPY(KFontChooserDialog) +}; + +#endif diff --git a/src/kfontchooserdialog.cpp b/src/kfontchooserdialog.cpp new file mode 100644 --- /dev/null +++ b/src/kfontchooserdialog.cpp @@ -0,0 +1,127 @@ +/* +Copyright (C) 1996 Bernd Johannes Wuebben +Copyright (c) 1999 Preston Brown +Copyright (c) 1999 Mario Weilguni + +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 "kfontchooserdialog.h" + +#include +#include +#include + +class KFontChooserDialogPrivate +{ +public: + KFontChooserDialogPrivate() + : chooser(nullptr) + { + } + + KFontChooser *chooser; + + void stripRegularStyleName(QFont &font); +}; + +KFontChooserDialog::KFontChooserDialog(QWidget *parent, const KFontChooser::DisplayFlags &flags, const QStringList &fontList) + : QDialog(parent), + d(new KFontChooserDialogPrivate) +{ + setWindowTitle(tr("Select Font")); + d->chooser = new KFontChooser(this, flags, fontList, 8, nullptr); + d->chooser->setObjectName(QStringLiteral("fontChooser")); + + connect(d->chooser, &KFontChooser::fontSelected, this, &KFontChooserDialog::fontSelected); + + QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + QVBoxLayout *mainLayout = new QVBoxLayout; + setLayout(mainLayout); + mainLayout->addWidget(d->chooser); + mainLayout->addWidget(buttonBox); + + connect(buttonBox, &QDialogButtonBox::accepted, this, &QDialog::accept); + connect(buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); +} + +KFontChooserDialog::~KFontChooserDialog() +{ + delete d; +} + +void KFontChooserDialog::setFont(const QFont &font, bool onlyFixed) +{ + d->chooser->setFont(font, onlyFixed); +} + +QFont KFontChooserDialog::font() const +{ + return d->chooser->font(); +} + +// static +int KFontChooserDialog::getFontDiff(QFont &theFont, KFontChooser::FontDiffFlags &diffFlags, + const KFontChooser::DisplayFlags &flags, QWidget *parent) +{ + KFontChooserDialog dlg(parent, flags | KFontChooser::ShowDifferences, QStringList()); + dlg.setModal(true); + dlg.setObjectName(QStringLiteral("Font Selector")); + dlg.setFont(theFont, flags & KFontChooser::FixedFontsOnly); + + int result = dlg.exec(); + if (result == Accepted) { + theFont = dlg.d->chooser->font(); + diffFlags = dlg.d->chooser->fontDiffFlags(); + dlg.d->stripRegularStyleName(theFont); + } + return result; +} + +// static +int KFontChooserDialog::getFont(QFont &theFont, const KFontChooser::DisplayFlags &flags, QWidget *parent) +{ + KFontChooserDialog dlg(parent, flags, QStringList()); + dlg.setModal(true); + dlg.setObjectName(QStringLiteral("Font Selector")); + dlg.setFont(theFont, flags & KFontChooser::FixedFontsOnly); + + int result = dlg.exec(); + if (result == Accepted) { + theFont = dlg.d->chooser->font(); + dlg.d->stripRegularStyleName(theFont); + } + return result; +} + +// If the styleName property is set for a QFont, using setBold(true) would +// lead to Qt using an "emboldended"/synthetic font style instead of using +// the bold style provided by the font itself; the latter looks better than +// the former, also accorgin to upstream, the styleName property is useful +// for fancy font styles, so there is no point in setting it for "Regular" +// fonts. For more details see: +// https://bugreports.qt.io/browse/QTBUG-63792 +// https://bugs.kde.org/show_bug.cgi?id=378523 +void KFontChooserDialogPrivate::stripRegularStyleName(QFont &font) +{ + if (font.weight() == QFont::Normal + && (font.styleName() == QLatin1String("Regular") + || font.styleName() == QLatin1String("Normal") + || font.styleName() == QLatin1String("Book") + || font.styleName() == QLatin1String("Roman"))) { + font.setStyleName(QString()); + } +} diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt --- a/tests/CMakeLists.txt +++ b/tests/CMakeLists.txt @@ -25,6 +25,7 @@ kseparatortest ksqueezedtextlabeltest ktitlewidgettest + kfontchooserdialogtest kfontrequestertest kpassworddialogtest keditlistwidgettest diff --git a/tests/kfontchooserdialogtest.cpp b/tests/kfontchooserdialogtest.cpp new file mode 100644 --- /dev/null +++ b/tests/kfontchooserdialogtest.cpp @@ -0,0 +1,45 @@ +/* + Copyright (C) 1996 Bernd Johannes Wuebben + wuebben@math.cornell.edu + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +*/ + +#include "kfontchooserdialog.h" + +#include +#include + +int main(int argc, char **argv) +{ + QApplication::setApplicationName(QStringLiteral("KFontChooserDialogTest")); + + QApplication app(argc, argv); + + app.setFont(QFont(QStringLiteral("DejaVu Sans"), 12)); + + // QFont font = QFont("Times",18,QFont::Bold); + + QFont font; + int nRet = KFontChooserDialog::getFont(font); + qDebug() << font.toString(); + + KFontChooser::FontDiffFlags diffFlags; + nRet = KFontChooserDialog::getFontDiff(font, diffFlags); + qDebug() << font.toString(); + + return nRet; +}