diff --git a/kcms/fonts/fonts.cpp b/kcms/fonts/fonts.cpp index 1192567b3..4dfe9da66 100644 --- a/kcms/fonts/fonts.cpp +++ b/kcms/fonts/fonts.cpp @@ -1,693 +1,735 @@ /* Copyright 1997 Mark Donohoe Copyright 1999 Lars Knoll Copyright 2000 Rik Hemsley Copyright 2015 Antonis Tsiapaliokas Copyright 2017 Marco Martin Ported to kcontrol2 by Geert Jansen. 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 "fonts.h" #include #include #include #include #include #include #include +#include #include #include #include #include #include #include #include #include #include #include #include "../krdb/krdb.h" /**** DLL Interface ****/ K_PLUGIN_FACTORY_WITH_JSON(KFontsFactory, "kcm_fonts.json", registerPlugin();) +//from KFontRequester +// 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 (!families.contains(family)) { + // Chose another family. + family = QFontInfo(font).family(); // the nearest match + if (!families.contains(family)) { + family = families.count() ? families.at(0) : QStringLiteral("fixed"); + } + } + + // Check if the family has the requested style. + // Easiest by piping it through font selection in the database. + QString retStyle = dbase.styleString(dbase.font(family, style, 10)); + style = retStyle; + + // Check if the family has the requested size. + // Only for bitmap fonts. + if (!dbase.isSmoothlyScalable(family, style)) { + QList sizes = dbase.smoothSizes(family, style); + if (!sizes.contains(size)) { + // Find nearest available size. + int mindiff = 1000; + int refsize = size; + Q_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.isSmoothlyScalable(family, style) && result.pointSize() == floor(size)) { + result.setPointSizeF(size); + } + return result; +} + /**** FontAASettings ****/ #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) FontAASettings::FontAASettings(QObject *parent) : QObject(parent) , m_subPixelOptionsModel(new QStandardItemModel(this)) , m_hintingOptionsModel(new QStandardItemModel(this)) , m_subPixel(QString("System default")) , m_hinting(QString("System default")) { for (int t = KXftConfig::SubPixel::NotSet; t <= KXftConfig::SubPixel::Vbgr; ++t) { QStandardItem *item = new QStandardItem(i18n(KXftConfig::description((KXftConfig::SubPixel::Type)t).toUtf8())); m_subPixelOptionsModel->appendRow(item); } for (int s = KXftConfig::Hint::NotSet; s <= KXftConfig::Hint::Full; ++s) { QStandardItem * item = new QStandardItem(i18n(KXftConfig::description((KXftConfig::Hint::Style)s).toUtf8())); m_hintingOptionsModel->appendRow(item); } } void FontAASettings::load() { double from, to; KXftConfig xft; if (xft.getExcludeRange(from, to)) { m_excludeFrom = from; m_excludeTo = to; m_exclude = true; } else { m_excludeFrom = 8; m_excludeTo = 15; m_exclude = false; } excludeToChanged(); excludeFromChanged(); KXftConfig::SubPixel::Type spType; xft.getSubPixelType(spType); m_subPixel = KXftConfig::description(spType); KXftConfig::Hint::Style hStyle; if (!xft.getHintStyle(hStyle) || KXftConfig::Hint::NotSet == hStyle) { KConfig kglobals("kdeglobals", KConfig::NoGlobals); hStyle = KXftConfig::Hint::NotSet; xft.setHintStyle(hStyle); KConfigGroup(&kglobals, "General").writeEntry("XftHintStyle", KXftConfig::toStr(hStyle)); kglobals.sync(); runRdb(KRdbExportXftSettings | KRdbExportGtkTheme); } else { m_hinting = KXftConfig::description(hStyle); } KConfig _cfgfonts("kcmfonts"); KConfigGroup cfgfonts(&_cfgfonts, "General"); int dpicfg; if (KWindowSystem::isPlatformWayland()) { dpicfg = cfgfonts.readEntry("forceFontDPIWayland", 0); } else { dpicfg = cfgfonts.readEntry("forceFontDPI", 0); } if (dpicfg <= 0) { m_dpiOriginal = 0; } else { m_dpiOriginal = dpicfg; }; setDpi(dpicfg); if (cfgfonts.readEntry("dontChangeAASettings", true)) { setAntiAliasing(1); //AASystem } else if (xft.aliasingEnabled()) { setAntiAliasing(0); //AAEnabled } else { setAntiAliasing(2); //AADisabled } m_antiAliasingOriginal = m_antiAliasing; } bool FontAASettings::save(KXftConfig::AntiAliasing::State aaState) { KXftConfig xft; KConfig kglobals("kdeglobals", KConfig::NoGlobals); KConfigGroup grp(&kglobals, "General"); xft.setAntiAliasing(aaState); if (m_exclude) { xft.setExcludeRange(m_excludeFrom, m_excludeTo); } else { xft.setExcludeRange(0, 0); } KXftConfig::SubPixel::Type spType(getSubPixelType()); xft.setSubPixelType(spType); grp.writeEntry("XftSubPixel", KXftConfig::toStr(spType)); if (KXftConfig::AntiAliasing::NotSet == aaState) { grp.revertToDefault("XftAntialias"); } else { grp.writeEntry("XftAntialias", aaState == KXftConfig::AntiAliasing::Enabled); } bool mod = false; KXftConfig::Hint::Style hStyle(getHintStyle()); xft.setHintStyle(hStyle); QString hs(KXftConfig::toStr(hStyle)); if (hs != grp.readEntry("XftHintStyle")) { if (KXftConfig::Hint::NotSet == hStyle) { grp.revertToDefault("XftHintStyle"); } else { grp.writeEntry("XftHintStyle", hs); } } mod = true; kglobals.sync(); if (!mod) { mod = xft.changed(); } xft.apply(); KConfig _cfgfonts("kcmfonts"); KConfigGroup cfgfonts(&_cfgfonts, "General"); if (KWindowSystem::isPlatformWayland()) { cfgfonts.writeEntry("forceFontDPIWayland", m_dpi); } else { cfgfonts.writeEntry("forceFontDPI", m_dpi); } cfgfonts.sync(); #if HAVE_X11 // if the setting is reset in the module, remove the dpi value, // otherwise don't explicitly remove it and leave any possible system-wide value if (m_dpi == 0 && m_dpiOriginal != 0 && !KWindowSystem::isPlatformWayland()) { QProcess proc; proc.setProcessChannelMode(QProcess::ForwardedChannels); proc.start("xrdb", QStringList() << "-quiet" << "-remove" << "-nocpp"); if (proc.waitForStarted()) { proc.write(QByteArray("Xft.dpi\n")); proc.closeWriteChannel(); proc.waitForFinished(); } } #endif QApplication::processEvents(); // Process font change ourselves // Don't overwrite global settings unless explicitly asked for - e.g. the system // fontconfig setup may be much more complex than this module can provide. // TODO: With AASystem the changes already made by this module should be reverted somehow. #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) if (mod || (m_antiAliasing != m_antiAliasingOriginal) || m_dpi != m_dpiOriginal) { KMessageBox::information(0, i18n( "

Some changes such as anti-aliasing or DPI will only affect newly started applications.

" ), i18n("Font Settings Changed"), "FontSettingsChanged"); m_antiAliasingOriginal = m_antiAliasing; m_dpiOriginal = m_dpi; } #else #if HAVE_X11 if (m_dpi != m_dpiOriginal) { KMessageBox::information(0, i18n( "

Some changes such as DPI will only affect newly started applications.

" ), i18n("Font Settings Changed"), "FontSettingsChanged"); m_dpiOriginal = m_dpi; } #endif #endif return mod; } void FontAASettings::defaults() { setExcludeTo(15); setExcludeFrom(8); setAntiAliasing(1); m_antiAliasingOriginal = m_antiAliasing; setDpi(96); setSubPixel(KXftConfig::description(KXftConfig::SubPixel::NotSet)); setHinting(KXftConfig::description(KXftConfig::Hint::NotSet)); } int FontAASettings::getIndexSubPixel(KXftConfig::SubPixel::Type spType) const { int pos = -1; int index; for (index = 0; index < m_subPixelOptionsModel->rowCount(); ++index) { QStandardItem *item = m_subPixelOptionsModel->item(index); if (item->text() == i18n(KXftConfig::description(spType).toUtf8())) { pos = index; break; } } return pos; } KXftConfig::SubPixel::Type FontAASettings::getSubPixelType() { int t; for (t = KXftConfig::SubPixel::NotSet; t <= KXftConfig::SubPixel::Vbgr; ++t){ if (m_subPixel == i18n(KXftConfig::description((KXftConfig::SubPixel::Type)t).toUtf8())) { return (KXftConfig::SubPixel::Type)t; } } return KXftConfig::SubPixel::NotSet; } int FontAASettings::getIndexHint(KXftConfig::Hint::Style hStyle) const { int pos = -1; int index; for (index = 0; index < m_hintingOptionsModel->rowCount(); ++index) { QStandardItem *item = m_hintingOptionsModel->item(index); if (item->text() == i18n(KXftConfig::description(hStyle).toUtf8())) { pos = index; break; } } return pos; } KXftConfig::Hint::Style FontAASettings::getHintStyle() { int s; for (s = KXftConfig::Hint::NotSet; s <= KXftConfig::Hint::Full; ++s){ if (m_hinting == i18n(KXftConfig::description((KXftConfig::Hint::Style)s).toUtf8())) { return (KXftConfig::Hint::Style)s; } } return KXftConfig::Hint::Medium; } #endif void FontAASettings::setSubPixel(const QString &subPixel) { if (m_subPixel == subPixel) { return; } m_subPixel = subPixel; emit subPixelChanged(); } QString FontAASettings::subPixel() const { return m_subPixel; } void FontAASettings::setHinting(const QString &hinting) { if (m_hinting == hinting) { return; } m_hinting = hinting; emit hintingChanged(); } QString FontAASettings::hinting() const { return m_hinting; } void FontAASettings::setExclude(bool exclude) { if (exclude == m_exclude) { return; } m_exclude = exclude; emit excludeChanged(); } bool FontAASettings::exclude() const { return m_exclude; } void FontAASettings::setExcludeTo(const int &excludeTo) { if (m_excludeTo == excludeTo) { return; } m_excludeTo = excludeTo; emit excludeToChanged(); } int FontAASettings::excludeTo() const { return m_excludeTo; } void FontAASettings::setExcludeFrom(const int &excludeTo) { if (m_excludeFrom == excludeTo) { return; } m_excludeFrom = excludeTo; emit excludeToChanged(); } int FontAASettings::excludeFrom() const { return m_excludeFrom; } void FontAASettings::setAntiAliasing(const int &antiAliasing) { if (m_antiAliasing == antiAliasing) { return; } m_antiAliasing = antiAliasing; emit aliasingChanged(); } int FontAASettings::antiAliasing() const { return m_antiAliasing; } void FontAASettings::setDpi(const int &dpi) { if (m_dpi == dpi) { return; } m_dpi = dpi; emit dpiChanged(); } int FontAASettings::dpi() const { return m_dpi; } int FontAASettings::subPixelCurrentIndex() { return getSubPixelType(); } int FontAASettings::hintingCurrentIndex() { return getHintStyle(); } /**** KFonts ****/ KFonts::KFonts(QObject *parent, const QVariantList &args) : KQuickAddons::ConfigModule(parent, args) , m_fontAASettings(new FontAASettings(this)) { qApp->setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); KAboutData* about = new KAboutData("kcm_fonts", i18n("Configure Fonts"), "0.1", QString(), KAboutLicense::LGPL); about->addAuthor(i18n("Antonis Tsiapaliokas"), QString(), "antonis.tsiapaliokas@kde.org"); setAboutData(about); qmlRegisterType(); setButtons(Apply | Default); auto updateState = [this]() { setNeedsSave(true); }; connect(m_fontAASettings, &FontAASettings::subPixelChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::hintingChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::excludeToChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::antiAliasingChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::aliasingChanged, this, updateState); connect(m_fontAASettings, &FontAASettings::dpiChanged, this, updateState); } KFonts::~KFonts() { } void KFonts::defaults() { #ifdef Q_OS_MAC setGeneralFont(QFont("Lucida Grande", 13)); setMenuFont(QFont("Lucida Grande", 13)); setFixedWidthFont(QFont("Monaco", 10)); setToolbarFont(QFont("Lucida Grande", 11)); setSmallFont(QFont("Lucida Grande", 9)); setWindowTitleFont(QFont("Lucida Grande", 14)); #else setGeneralFont(QFont("Noto Sans", 10)); setMenuFont(QFont("Noto Sans", 10)); setFixedWidthFont(QFont("Hack", 9)); setToolbarFont(QFont("Noto Sans", 10)); setSmallFont(QFont("Noto Sans", 8)); setWindowTitleFont(QFont("Noto Sans", 10)); #endif m_fontAASettings->defaults(); } void KFonts::load() { KSharedConfig::Ptr config = KSharedConfig::openConfig("kdeglobals"); KConfigGroup cg(config, "General"); QFont font; - font.fromString(cg.readEntry("font")); + font = nearestExistingFont(cg.readEntry("font", m_defaultFont)); setGeneralFont(font); - font.fromString(cg.readEntry("fixed")); + + font = nearestExistingFont(cg.readEntry("fixed", m_defaultFont)); setFixedWidthFont(font); - font.fromString(cg.readEntry("smallestReadableFont")); + font = nearestExistingFont(cg.readEntry("smallestReadableFont", m_defaultFont)); setSmallFont(font); - font.fromString(cg.readEntry("toolBarFont")); + font = nearestExistingFont(cg.readEntry("toolBarFont", m_defaultFont)); setToolbarFont(font); - font.fromString(cg.readEntry("menuFont")); + font = nearestExistingFont(cg.readEntry("menuFont", m_defaultFont)); setMenuFont(font); cg = KConfigGroup(config, "WM"); - font.fromString(cg.readEntry("activeFont")); + font = nearestExistingFont(cg.readEntry("activeFont", m_defaultFont)); setWindowTitleFont(font); m_fontAASettings->load(); setNeedsSave(false); } void KFonts::save() { KSharedConfig::Ptr config = KSharedConfig::openConfig("kdeglobals"); KConfigGroup cg(config, "General"); cg.writeEntry("font", m_generalFont.toString()); cg.writeEntry("fixed", m_fixedWidthFont.toString()); cg.writeEntry("smallestReadableFont", m_smallFont.toString()); cg.writeEntry("toolBarFont", m_toolbarFont.toString()); cg.writeEntry("menuFont", m_menuFont.toString()); cg.sync(); cg = KConfigGroup(config, "WM"); cg.writeEntry("activeFont", m_windowTitleFont.toString()); cg.sync(); KConfig _cfgfonts("kcmfonts"); KConfigGroup cfgfonts(&_cfgfonts, "General"); FontAASettings::AASetting aaSetting = (FontAASettings::AASetting)m_fontAASettings->antiAliasing(); cfgfonts.writeEntry("dontChangeAASettings", aaSetting == FontAASettings::AASystem); if (aaSetting == FontAASettings::AAEnabled) { m_fontAASettings->save(KXftConfig::AntiAliasing::Enabled); } else if (aaSetting == FontAASettings::AADisabled) { m_fontAASettings->save(KXftConfig::AntiAliasing::Disabled); } else { m_fontAASettings->save(KXftConfig::AntiAliasing::NotSet); } KGlobalSettings::self()->emitChange(KGlobalSettings::FontChanged); runRdb(KRdbExportXftSettings | KRdbExportGtkTheme); emit fontsHaveChanged(); setNeedsSave(false); } void KFonts::setGeneralFont(const QFont &font) { if (m_generalFont == font) { return; } m_generalFont = font; emit generalFontChanged(); setNeedsSave(true); } QFont KFonts::generalFont() const { return m_generalFont; } void KFonts::setFixedWidthFont(const QFont &font) { if (m_fixedWidthFont == font) { return; } m_fixedWidthFont = font; emit fixedWidthFontChanged(); setNeedsSave(true); } QFont KFonts::fixedWidthFont() const { return m_fixedWidthFont; } void KFonts::setSmallFont(const QFont &font) { if (m_smallFont == font) { return; } m_smallFont = font; emit smallFontChanged(); setNeedsSave(true); } QFont KFonts::smallFont() const { return m_smallFont; } void KFonts::setToolbarFont(const QFont &font) { if (m_toolbarFont == font) { return; } m_toolbarFont = font; emit toolbarFontChanged(); setNeedsSave(true); } QFont KFonts::toolbarFont() const { return m_toolbarFont; } void KFonts::setMenuFont(const QFont &font) { if (m_menuFont == font) { return; } m_menuFont = font; emit menuFontChanged(); setNeedsSave(true); } QFont KFonts::menuFont() const { return m_menuFont; } void KFonts::setWindowTitleFont(const QFont &font) { if (m_windowTitleFont == font) { return; } m_windowTitleFont = font; emit windowTitleFontChanged(); setNeedsSave(true); } QFont KFonts::windowTitleFont() const { return m_windowTitleFont; } void KFonts::adjustAllFonts() { QFont font = m_generalFont; KFontChooser::FontDiffFlags fontDiffFlags = 0; int ret = KFontDialog::getFontDiff(font, fontDiffFlags, KFontChooser::NoDisplayFlags); if (ret == KDialog::Accepted && fontDiffFlags) { setGeneralFont(applyFontDiff(m_generalFont, font, fontDiffFlags)); setMenuFont(applyFontDiff(m_menuFont, font, fontDiffFlags)); { const QFont adjustedFont = applyFontDiff(m_fixedWidthFont, font, fontDiffFlags); if (QFontInfo(adjustedFont).fixedPitch()) { setFixedWidthFont(adjustedFont); } } setToolbarFont(applyFontDiff(m_toolbarFont, font, fontDiffFlags)); setSmallFont(applyFontDiff(m_smallFont, font, fontDiffFlags)); setWindowTitleFont(applyFontDiff(m_windowTitleFont, font, fontDiffFlags)); } } -QFont KFonts::chooseFont(const QFont &font) -{ - QFontDialog d(font); - bool ok = false; - QFont ret = QFontDialog::getFont(&ok, font, 0, QString()); - - if (ok) { - return ret; - } else { - return font; - } -} - QFont KFonts::applyFontDiff(const QFont &fnt, const QFont &newFont, int fontDiffFlags) { QFont font(fnt); if (fontDiffFlags & KFontChooser::FontDiffSize) { font.setPointSizeF(newFont.pointSizeF()); } if ((fontDiffFlags & KFontChooser::FontDiffFamily)) { font.setFamily(newFont.family()); } if (fontDiffFlags & KFontChooser::FontDiffStyle) { font.setWeight(newFont.weight()); font.setStyle(newFont.style()); font.setUnderline(newFont.underline()); font.setStyleName(newFont.styleName()); } return font; } #include "fonts.moc" diff --git a/kcms/fonts/fonts.h b/kcms/fonts/fonts.h index 9d4d8f422..79c90bb30 100644 --- a/kcms/fonts/fonts.h +++ b/kcms/fonts/fonts.h @@ -1,189 +1,188 @@ /* Copyright 1997 Mark Donohoe Copyright 1999 Lars Knoll Copyright 2000 Rik Hemsley Copyright 2015 Antonis Tsiapaliokas Copyright 2017 Marco Martin Ported to kcontrol2 by Geert Jansen. 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 FONTS_H #define FONTS_H #include #include #include #include #include "kxftconfig.h" class FontAASettings : public QObject { Q_OBJECT Q_PROPERTY(QAbstractItemModel *subPixelOptionsModel READ subPixelOptionsModel CONSTANT) Q_PROPERTY(QAbstractItemModel *hintingOptionsModel READ hintingOptionsModel CONSTANT) Q_PROPERTY(QString subPixel READ subPixel WRITE setSubPixel NOTIFY subPixelChanged) Q_PROPERTY(QString hinting READ hinting WRITE setHinting NOTIFY hintingChanged) Q_PROPERTY(bool exclude READ exclude WRITE setExclude NOTIFY excludeChanged) Q_PROPERTY(int excludeTo READ excludeTo WRITE setExcludeTo NOTIFY excludeToChanged) Q_PROPERTY(int excludeFrom READ excludeFrom WRITE setExcludeFrom NOTIFY excludeFromChanged) Q_PROPERTY(int antiAliasing READ antiAliasing WRITE setAntiAliasing NOTIFY aliasingChanged) Q_PROPERTY(int dpi READ dpi WRITE setDpi NOTIFY dpiChanged) public: enum AASetting { AAEnabled, AASystem, AADisabled }; #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) FontAASettings(QObject *parent); bool save(KXftConfig::AntiAliasing::State aaState); void load(); void defaults(); int getIndexSubPixel(KXftConfig::SubPixel::Type spType) const; KXftConfig::SubPixel::Type getSubPixelType(); int getIndexHint(KXftConfig::Hint::Style hStyle) const; KXftConfig::Hint::Style getHintStyle(); void setAntiAliasingState(KXftConfig::AntiAliasing::State aaState); QAbstractItemModel* subPixelOptionsModel() { return m_subPixelOptionsModel; } QAbstractItemModel* hintingOptionsModel() { return m_hintingOptionsModel; } void setSubPixel(const QString &subPixel); QString subPixel() const; void setHinting(const QString &hinting); QString hinting() const; void setExclude(bool exclude); bool exclude() const; void setExcludeTo(const int &excludeTo); int excludeTo() const; void setExcludeFrom(const int &excludeTo); int excludeFrom() const; void setAntiAliasing(const int& antiAliasing); int antiAliasing() const; void setDpi(const int &dpi); int dpi() const; Q_INVOKABLE int subPixelCurrentIndex(); Q_INVOKABLE int hintingCurrentIndex(); #endif Q_SIGNALS: void subPixelChanged(); void hintingChanged(); void excludeChanged(); void excludeToChanged(); void excludeFromChanged(); void antiAliasingChanged(); void aliasingChanged(); void dpiChanged(); #if defined(HAVE_FONTCONFIG) && defined (HAVE_X11) private: QString m_subPixel; QString m_hinting; int m_excludeTo; int m_excludeFrom; int m_antiAliasing; int m_antiAliasingOriginal; int m_dpi; int m_dpiOriginal; QStandardItemModel *m_subPixelOptionsModel; QStandardItemModel *m_hintingOptionsModel; bool m_exclude = false; #endif }; /** * The Desktop/fonts tab in kcontrol. */ class KFonts : public KQuickAddons::ConfigModule { Q_OBJECT Q_PROPERTY(QFont generalFont READ generalFont WRITE setGeneralFont NOTIFY generalFontChanged) Q_PROPERTY(QFont fixedWidthFont READ fixedWidthFont WRITE setFixedWidthFont NOTIFY fixedWidthFontChanged) Q_PROPERTY(QFont smallFont READ smallFont WRITE setSmallFont NOTIFY smallFontChanged) Q_PROPERTY(QFont toolbarFont READ toolbarFont WRITE setToolbarFont NOTIFY toolbarFontChanged) Q_PROPERTY(QFont menuFont READ menuFont WRITE setMenuFont NOTIFY menuFontChanged) Q_PROPERTY(QFont windowTitleFont READ windowTitleFont WRITE setWindowTitleFont NOTIFY windowTitleFontChanged) Q_PROPERTY(QObject *fontAASettings READ fontAASettings CONSTANT) public: KFonts(QObject *parent, const QVariantList &); ~KFonts(); void setGeneralFont(const QFont &font); QFont generalFont() const; void setFixedWidthFont(const QFont &font); QFont fixedWidthFont() const; void setSmallFont(const QFont &font); QFont smallFont() const; void setToolbarFont(const QFont &font); QFont toolbarFont() const; void setMenuFont(const QFont &font); QFont menuFont() const; void setWindowTitleFont(const QFont &font); QFont windowTitleFont() const; QObject* fontAASettings() { return m_fontAASettings; } public Q_SLOTS: void load(); void save(); void defaults(); Q_INVOKABLE void adjustAllFonts(); - //TODO: replace this with the new labs platform dialogs? - Q_INVOKABLE QFont chooseFont(const QFont &font); Q_SIGNALS: void fontsHaveChanged(); void generalFontChanged(); void fixedWidthFontChanged(); void smallFontChanged(); void toolbarFontChanged(); void menuFontChanged(); void windowTitleFontChanged(); private: QFont applyFontDiff(const QFont &fnt, const QFont &newFont, int fontDiffFlags); + QFont m_defaultFont; QFont m_generalFont; QFont m_fixedWidthFont; QFont m_smallFont; QFont m_toolbarFont; QFont m_menuFont; QFont m_windowTitleFont; FontAASettings *m_fontAASettings; }; #endif diff --git a/kcms/fonts/package/contents/ui/FontWidget.qml b/kcms/fonts/package/contents/ui/FontWidget.qml index d79f0324f..423ed65de 100644 --- a/kcms/fonts/package/contents/ui/FontWidget.qml +++ b/kcms/fonts/package/contents/ui/FontWidget.qml @@ -1,56 +1,54 @@ /* Copyright (c) 2015 Antonis Tsiapaliokas Copyright (c) 2017 Marco Martin This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License version 2 as published by the Free Software Foundation. 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. */ import QtQuick 2.1 import QtQuick.Layouts 1.1 import QtQuick.Controls 2.0 as QtControls import QtQuick.Dialogs 1.2 as QtDialogs import org.kde.kirigami 2.3 as Kirigami import org.kde.kcm 1.0 RowLayout { id: root property string label property string category property font font Kirigami.FormData.label: root.label QtControls.TextField { enabled: false text: root.font.family + " " + root.font.pointSize font: root.font Layout.fillHeight: true } QtControls.Button { text: i18n("Choose...") Layout.fillHeight: true onClicked: { - kcm.chooseFont(root.font) - return; fontDialog.adjustAllFonts = false; fontDialog.currentCategory = root.category fontDialog.font = root.font; fontDialog.currentFont = root.font; fontDialog.open() } } }