From bf78d60f37414771c3a9b0899557145604f47c8b Mon Sep 17 00:00:00 2001 From: Takumi ASAKI Date: Wed, 11 Jan 2012 21:14:02 +0900 Subject: [PATCH] Version: 0.3 * Add 'Remove uninstalled fonts from config' * Fix: ~/.fonts.conf is not modified correctly. --- applicationcontroller.cpp | 18 ++++- applicationcontroller.h | 8 +++ fontconfigmanager.cpp | 109 +++++++++++++++++++++++++++---- fontconfigmanager.h | 4 ++ fontinfo.cpp | 20 +++--- fontinfo.h | 6 +- fontsconfigproperties.cpp | 1 + qml/fontmanager/FontsConfProperties.qml | 6 ++ qml/fontmanager/MainPage.qml | 11 +++- qtc_packaging/debian_harmattan/changelog | 7 ++ qtc_packaging/debian_harmattan/control | 2 +- 11 files changed, 163 insertions(+), 29 deletions(-) diff --git a/applicationcontroller.cpp b/applicationcontroller.cpp index dd1ac23..615269b 100644 --- a/applicationcontroller.cpp +++ b/applicationcontroller.cpp @@ -63,9 +63,11 @@ void ApplicationController::init() mFontConfig->setCurrentLanguage(mLang); connect(mFontConfig, SIGNAL(fcCacheFinished()), mFontConfig, SLOT(readFcList())); + connect(mFontConfig, SIGNAL(familiesChanged()), SIGNAL(fontListChanged())); connect(mFontConfig, SIGNAL(familiesChanged()), SLOT(syncInstalledFonts())); connect(mFontConfig, SIGNAL(warning(QString)), SIGNAL(alertDialog(QString))); connect(mFontConfig, SIGNAL(localFontsConfPathChanged()), SIGNAL(localFontsConfPathChanged())); + connect(mFontConfig, SIGNAL(configHasUninstalledFontsChanged()), SIGNAL(configHasUninstalledFontsChanged())); mFontConfig->setLocalFontsConfPath(QDir::homePath() + QLatin1String("/.fonts.conf")); @@ -130,7 +132,7 @@ QStringList ApplicationController::fontList() const FontInfo *ApplicationController::checkFontInfo(const QUrl &path) { - FontInfo *fInfo = new FontInfo(path.toLocalFile(), this); + FontInfo *fInfo = new FontInfo(path.toLocalFile(), mFontConfig, this); return fInfo; } @@ -158,6 +160,20 @@ QString ApplicationController::localFontsConf() const return mFontConfig->localFontsConf(); } +bool ApplicationController::configHasUninstalledFonts() const +{ + if (!mFontConfig) + return false; + return mFontConfig->configHasUninstalledFonts(); +} + +void ApplicationController::removeUninstalledFontsFromConfig() +{ + if (!mFontConfig) + return; + mFontConfig->removeUninstalledFontsFromConfig(); +} + void ApplicationController::installFont() { // qDebug() << "ApplicationController::installFont()" << mNextJob; diff --git a/applicationcontroller.h b/applicationcontroller.h index b36e820..73380d8 100644 --- a/applicationcontroller.h +++ b/applicationcontroller.h @@ -60,6 +60,9 @@ class ApplicationController : public QObject Q_PROPERTY(QString localFontsConf READ localFontsConf NOTIFY localFontsConfPathChanged) Q_PROPERTY(bool localFontsConfExists READ localFontsConfExists NOTIFY localFontsConfPathChanged) + + Q_PROPERTY(bool configHasUninstalledFonts READ configHasUninstalledFonts NOTIFY configHasUninstalledFontsChanged) + public: explicit ApplicationController(QObject *parent = 0); @@ -86,6 +89,10 @@ public: bool localFontsConfExists() const; QString localFontsConf() const; + bool configHasUninstalledFonts() const; +public slots: + void removeUninstalledFontsFromConfig(); + signals: void alertDialog(const QString &message); @@ -103,6 +110,7 @@ signals: void appendInstalledFont(const QString &family, const QString &fullname); void localFontsConfPathChanged(); + void configHasUninstalledFontsChanged(); public slots: void installFont(); diff --git a/fontconfigmanager.cpp b/fontconfigmanager.cpp index eaf58f3..d03ba9c 100644 --- a/fontconfigmanager.cpp +++ b/fontconfigmanager.cpp @@ -62,6 +62,8 @@ enum FCState { UnknownState }; +static const char *configKeys[] = { "embeddedbitmap:true", "embeddedbitmap:false", "hinting:true", "hinting:false", 0 }; + FontConfigManager::FontConfigManager(QObject *parent) : QObject(parent), mLang("en"), mHasUnknownConfig(false), mFontsConfModified(false) { @@ -162,15 +164,10 @@ void FontConfigManager::appendFontProperty(FontsConfigProperties *prop, const QS { // qDebug() << "appendFontProperty(" << prop->family() << "," << familyList << ")"; - if (!prop->preferFamilies().isEmpty() || - prop->embeddedBitmap() != FontsConfigProperties::Default || - prop->hinting() != FontsConfigProperties::Default) { - mFontsConfModified = true; - } - QStringList preferedFamilies(mPreferFontListMap.keys()); foreach (const QString &family, preferedFamilies) { QStringList preferList(mPreferFontListMap.value(family, QStringList())); + QStringList origList(preferList); if (prop->preferFamilies().contains(family)) { preferList << prop->family(); foreach (const QString &f, familyList) { @@ -183,11 +180,17 @@ void FontConfigManager::appendFontProperty(FontsConfigProperties *prop, const QS preferList.removeOne(f); } } - mPreferFontListMap.insert(family, preferList); + preferList.removeDuplicates(); +// qDebug() << prop->family() << prop->preferFamilies() << origList << preferList; + if (preferList != origList) { + mFontsConfModified = true; + mPreferFontListMap.insert(family, preferList); + } } appendFontPropertyBool("embeddedbitmap", prop->embeddedBitmap(), prop, familyList); appendFontPropertyBool("hinting", prop->embeddedBitmap(), prop, familyList); + emit configHasUninstalledFontsChanged(); } void FontConfigManager::appendFontProperty(InstalledFontInfo *fontInfo) @@ -247,12 +250,85 @@ QString FontConfigManager::localFontsConf() const return buf; } +bool FontConfigManager::configHasUninstalledFonts() const +{ + QStringList localfamilies; + foreach (InstalledFontInfo *info, mFcListInfo) { + localfamilies << info->family(); + } + localfamilies.removeDuplicates(); + QStringList preferedFamilies = mPreferFontListMap.keys(); + foreach (const QString &key, preferedFamilies) { + QStringList families = mPreferFontListMap.value(key); + foreach (const QString &f, families) { + if (!localfamilies.contains(f)) { + return true; + } + } + } + + for (int i = 0; configKeys[i]; i++) { + QStringList families = mMatchFontListMap.value(configKeys[i]); + foreach (const QString &f, families) { + if (!localfamilies.contains(f)) { + return true; + } + } + } + + return false; +} + +void FontConfigManager::removeUninstalledFontsFromConfig() +{ + QStringList localfamilies; + foreach (InstalledFontInfo *info, mFcListInfo) { + localfamilies << info->family(); + } + localfamilies.removeDuplicates(); + bool modified = false; + QStringList preferedFamilies = mPreferFontListMap.keys(); + foreach (const QString &key, preferedFamilies) { + bool m = false; + QStringList families = mPreferFontListMap.value(key); + foreach (const QString &f, families) { + if (!localfamilies.contains(f)) { + families.removeOne(f); + modified = true; + m = true; + } + } + if (m) + mPreferFontListMap.insert(key, families); + } + + for (int i = 0; configKeys[i]; i++) { + bool m = false; + QStringList families = mMatchFontListMap.value(configKeys[i]); + foreach (const QString &f, families) { + if (!localfamilies.contains(f)) { + families.removeOne(f); + modified = true; + m = true; + } + } + if (m) + mMatchFontListMap.insert(configKeys[i], families); + } + + if (modified) { + mFontsConfModified = true; + emit configHasUninstalledFontsChanged(); + } +} + void FontConfigManager::appendFontPropertyBool(const QString &config, FontsConfigProperties::ConfigValue value, FontsConfigProperties *prop, const QStringList &familyList) { static const char *boolValues[] = { "true", "false", 0 }; for (int i = 0; boolValues[i]; i++) { QString key = config + QLatin1String(":") + boolValues[i]; QStringList matchedList(mMatchFontListMap.value(key, QStringList())); + QStringList origList(matchedList); if ((value == FontsConfigProperties::True && i == 0) || (value == FontsConfigProperties::False && i == 1)) { matchedList << prop->family(); foreach (const QString &f, familyList) { @@ -265,7 +341,11 @@ void FontConfigManager::appendFontPropertyBool(const QString &config, FontsConfi matchedList.removeOne(f); } } - mMatchFontListMap.insert(key, matchedList); + matchedList.removeDuplicates(); + if (matchedList != origList) { + mFontsConfModified = true; + mMatchFontListMap.insert(key, matchedList); + } } } @@ -286,6 +366,7 @@ void FontConfigManager::runFcCache() // qDebug("runFcCache()"); QProcess *proc = new QProcess(this); connect(proc, SIGNAL(finished(int)), SIGNAL(fcCacheFinished())); + connect(proc, SIGNAL(finished(int)), proc, SLOT(deleteLater())); proc->start(FCBIN_PATH FCCACHE_COMMAND, QStringList() << FCCACHE_OPTION); } @@ -337,14 +418,11 @@ void FontConfigManager::readFcList() QStringList lf; foreach (InstalledFontInfo *info, mFcListInfo) { QString family(info->localefamily()); - if (!f.contains(family)) - f << family; + f << family; if (info->systemFont()) { - if (!sf.contains(family)) - sf << family; + sf << family; } else { - if (!lf.contains(family)) - lf << family; + lf << family; } } f.sort(); @@ -363,6 +441,8 @@ void FontConfigManager::readFcList() emit localFamiliesChanged(); } + emit configHasUninstalledFontsChanged(); + delete proc; } @@ -532,6 +612,7 @@ void FontConfigManager::readFontsConf() mHasUnknownConfig = hasUnknownConfig; mFontsConfModified = false; + emit configHasUninstalledFontsChanged(); } static void writeBoolConfig(QXmlStreamWriter &xml, const QString &configName, bool configValue, const QStringList &families) diff --git a/fontconfigmanager.h b/fontconfigmanager.h index c06fbb1..89c50b4 100644 --- a/fontconfigmanager.h +++ b/fontconfigmanager.h @@ -86,6 +86,9 @@ public: QString localFontsConf() const; + bool configHasUninstalledFonts() const; + void removeUninstalledFontsFromConfig(); + private: void appendFontPropertyBool(const QString &config, FontsConfigProperties::ConfigValue value, FontsConfigProperties *prop, const QStringList &familyList = QStringList()); bool fontPropertyBoolValue(const QString &config, bool value, const QString &family, const QStringList &familyList) const; @@ -98,6 +101,7 @@ signals: void localFamiliesChanged(); void localFontsConfPathChanged(); + void configHasUninstalledFontsChanged(); void warning(const QString &message); diff --git a/fontinfo.cpp b/fontinfo.cpp index 4e238d0..850782b 100644 --- a/fontinfo.cpp +++ b/fontinfo.cpp @@ -38,20 +38,16 @@ #include "fontinfo.h" +#include "fontconfigmanager.h" #include "fontsconfigproperties.h" #include #include -FontInfo::FontInfo(QObject *parent) : +FontInfo::FontInfo(const QString &path, FontConfigManager *fontConfig, QObject *parent) : QObject(parent), mFontId(-1) { -} - -FontInfo::FontInfo(const QString &path, QObject *parent) : - QObject(parent), mFontId(-1) -{ - setFontPath(path); + setFontPath(path, fontConfig); } FontInfo::~FontInfo() @@ -66,7 +62,7 @@ QString FontInfo::fontPath() const return mFontPath; } -void FontInfo::setFontPath(const QString &fontPath) +void FontInfo::setFontPath(const QString &fontPath, FontConfigManager *fontConfig) { if (mFontPath == fontPath) return; @@ -82,7 +78,13 @@ void FontInfo::setFontPath(const QString &fontPath) mFontId = QFontDatabase::addApplicationFont(mFontPath); mFontFamilies = QFontDatabase::applicationFontFamilies(mFontId); foreach (const QString &family, mFontFamilies) { - mFontProperties << new FontsConfigProperties(family, this); + FontsConfigProperties *prop = 0; + if (fontConfig) { + prop = fontConfig->fontProperty(family); + prop->setParent(this); + } else + prop = new FontsConfigProperties(family, this); + mFontProperties << prop; } } emit fontPathChanged(); diff --git a/fontinfo.h b/fontinfo.h index c7d20b0..a6b1082 100644 --- a/fontinfo.h +++ b/fontinfo.h @@ -43,6 +43,7 @@ #include #include +class FontConfigManager; class FontsConfigProperties; class FontInfo : public QObject @@ -51,12 +52,11 @@ class FontInfo : public QObject Q_PROPERTY(QString fontPath READ fontPath WRITE setFontPath NOTIFY fontPathChanged) Q_PROPERTY(QStringList families READ families NOTIFY fontPathChanged) public: - explicit FontInfo(QObject *parent = 0); - explicit FontInfo(const QString &fontPath, QObject *parent = 0); + explicit FontInfo(const QString &fontPath, FontConfigManager *fontConfig, QObject *parent = 0); ~FontInfo(); QString fontPath() const; - void setFontPath(const QString &fontPath); + void setFontPath(const QString &fontPath, FontConfigManager *fontConfig = 0); QStringList families() const; diff --git a/fontsconfigproperties.cpp b/fontsconfigproperties.cpp index 70654aa..4ae0d85 100644 --- a/fontsconfigproperties.cpp +++ b/fontsconfigproperties.cpp @@ -134,3 +134,4 @@ void FontsConfigProperties::setHinting(FontsConfigProperties::ConfigValue config emit hintingChanged(); } } + diff --git a/qml/fontmanager/FontsConfProperties.qml b/qml/fontmanager/FontsConfProperties.qml index aa5a4c5..0041896 100644 --- a/qml/fontmanager/FontsConfProperties.qml +++ b/qml/fontmanager/FontsConfProperties.qml @@ -74,10 +74,16 @@ Item { return; if (sansSerifCheck.checked) fontconf.addPreferFamily("sans-serif") + else + fontconf.removePreferFamily("sans-serif") if (serifCheck.checked) fontconf.addPreferFamily("serif") + else + fontconf.removePreferFamily("serif") if (monospaceCheck.checked) fontconf.addPreferFamily("monospace") + else + fontconf.removePreferFamily("monospace") fontconf.embeddedBitmap = embeddedBitmapCombo.selectedIndex fontconf.hinting = hintingCombo.selectedIndex } diff --git a/qml/fontmanager/MainPage.qml b/qml/fontmanager/MainPage.qml index 2230ac1..dd8ffb3 100644 --- a/qml/fontmanager/MainPage.qml +++ b/qml/fontmanager/MainPage.qml @@ -134,13 +134,22 @@ Page { visualParent: pageStack MenuLayout { MenuItem { - text: qsTr("View Current Fonts Config"); + text: qsTr("View current fonts config"); enabled: controller.localFontsConfExists onClicked: { mainMenu.close() pageStack.push(fontsConfViewPageComponent, { "text": controller.localFontsConf } ) } } + MenuItem { + text: qsTr("Remove uninstalled fonts from config"); + enabled: controller.configHasUninstalledFonts + onClicked: { + mainMenu.close() + controller.removeUninstalledFontsFromConfig() + controller.saveFontsConf() + } + } } } diff --git a/qtc_packaging/debian_harmattan/changelog b/qtc_packaging/debian_harmattan/changelog index ced1daf..3a2aae8 100644 --- a/qtc_packaging/debian_harmattan/changelog +++ b/qtc_packaging/debian_harmattan/changelog @@ -1,3 +1,10 @@ +fontmanager (0.3) unstable; urgency=low + + * Add 'Remove uninstalled fonts from config' + * Fix: ~/.fonts.conf is not modified correctly. + + -- Takumi Asaki Wed, 11 Jan 2012 21:00:00 +0900 + fontmanager (0.2.1) unstable; urgency=low * Fix: encoding for 'View Current Fonts Config' diff --git a/qtc_packaging/debian_harmattan/control b/qtc_packaging/debian_harmattan/control index a723ad6..7f401f0 100644 --- a/qtc_packaging/debian_harmattan/control +++ b/qtc_packaging/debian_harmattan/control @@ -1,5 +1,5 @@ Source: fontmanager -Section: user/fonts +Section: user/tools Priority: optional Maintainer: Takumi Asaki Build-Depends: debhelper (>= 5), libqt4-dev -- 2.11.0