OSDN Git Service

Version: 0.1
[fontmanager/fontmanager.git] / applicationcontroller.cpp
1 #include "applicationcontroller.h"
2
3 #include "fontconfigmanager.h"
4 #include "installedfontinfo.h"
5
6 #include <QtCore>
7
8 ApplicationController::ApplicationController(QObject *parent) :
9     QObject(parent), mFontDirExists(false), mShowSystemFont(false), mNextJob(Nothing), forceOverwrite(false),
10     mFontConfig(0)
11 {
12
13 }
14
15 void ApplicationController::init()
16 {
17     mFontConfig = new FontConfigManager(this);
18     setFontDir(QDir::homePath() + QLatin1String("/.fonts"));
19
20     QLocale curLocale;
21     mLang = curLocale.name();
22     int idx = mLang.indexOf(QLatin1Char('_'));
23     if (idx > 0)
24         mLang = mLang.left(idx);
25     mFontConfig->setCurrentLanguage(mLang);
26
27     connect(mFontConfig, SIGNAL(fcCacheFinished()), mFontConfig, SLOT(readFcList()));
28     connect(mFontConfig, SIGNAL(familiesChanged()), SLOT(syncInstalledFonts()));
29     connect(mFontConfig, SIGNAL(warning(QString)), SIGNAL(alertDialog(QString)));
30
31     mFontConfig->setLocalFontsConfPath(QDir::homePath() + QLatin1String("/.fonts.conf"));
32
33     mFontConfig->readFontsConf();
34     mFontConfig->readFcList();
35 }
36
37 QString ApplicationController::currentLanguage() const
38 {
39     return mLang;
40 }
41
42 QString ApplicationController::fontDir() const
43 {
44     return mFontDirPath;
45 }
46
47 void ApplicationController::setFontDir(const QString &dirpath)
48 {
49     if (mFontDirPath != dirpath) {
50         mFontDirPath = dirpath;
51         emit fontDirChanged(mFontDirPath);
52         QDir fontDir(dirpath);
53         //        if (mFontDirExists != fontDir.exists())
54         //            emit fontDirExistsChanged();
55         mFontDirExists = fontDir.exists();
56 #if 0
57         if (!mFontDirExists) {
58             emit alertDialog(tr("Font Dir: %1 is not found!").arg(mFontDirPath));
59         }
60 #endif
61         if (mFontConfig)
62             mFontConfig->setLocalFontPath(dirpath);
63     }
64 }
65
66 bool ApplicationController::fontDirExists() const
67 {
68     return mFontDirExists;
69 }
70
71 bool ApplicationController::showSystemFont() const
72 {
73     return mShowSystemFont;
74 }
75
76 void ApplicationController::setShowSystemFont(bool show)
77 {
78     if (mShowSystemFont != show) {
79         mShowSystemFont = show;
80         emit showSystemFontChanged();
81         emit fontListChanged();
82     }
83 }
84
85 QStringList ApplicationController::fontList() const
86 {
87     if (mShowSystemFont)
88         return mFontConfig->families();
89     return mFontConfig->localFamilies();
90 }
91
92 FontInfo *ApplicationController::checkFontInfo(const QUrl &path)
93 {
94     FontInfo *fInfo = new FontInfo(path.toLocalFile(), this);
95     return fInfo;
96 }
97
98 InstalledFontInfo *ApplicationController::fontInfo(const QString &family) const
99 {
100     return mFontConfig->fontInfo(family);
101 }
102
103 QStringList ApplicationController::fontCount(const QString &fontpath) const
104 {
105     return mFontConfig->fontCount(fontpath);
106 }
107
108 void ApplicationController::installFont()
109 {
110     qDebug() << "ApplicationController::installFont()" << mNextJob;
111
112     FontInfo *info = qobject_cast<FontInfo *>(mJobOption.value<QObject*>());
113     if (!info)
114         return;
115
116     if (mNextJob == Nothing) {
117         if (info->fontPath().isEmpty())
118             return;
119         mNextJob = StartInstall;
120     }
121
122     QFileInfo srcfont(info->fontPath());
123     if (!srcfont.exists()) {
124         emit alertDialog(tr("Font '%1' does not exists anymore."));
125         return;
126     }
127
128     if (mNextJob == StartInstall) {
129         if (!mFontDirExists) {
130             mNextJob = CreateFontsDir;
131             emit confirmDialog(tr("Create it?"), tr("Local fonts dir '%1' does not exists!\nCreate it now?").arg(mFontDirPath));
132             return;
133         } else
134             mNextJob = CheckDstFont;
135     }
136
137     if (mNextJob == CreateFontsDir) {
138         QDir fontsDir(mFontDirPath);
139         fontsDir.mkpath(mFontDirPath);
140         mNextJob = CheckDstFont;
141     }
142
143     QFileInfo dstfont(mFontDirPath + QLatin1String("/") + srcfont.fileName());
144     if (mNextJob == CheckDstFont) {
145         mNextJob = InstallFont;
146         if (dstfont.exists()) {
147             emit confirmDialog(tr("Overwrite it?"), tr("Local font '%1' already exists!\nOverwrite it?").arg(dstfont.absoluteFilePath()));
148             return;
149         }
150     }
151
152     if (mNextJob == InstallFont) {
153         QFile::copy(srcfont.absoluteFilePath(), dstfont.absoluteFilePath());
154         mNextJob = Nothing;
155         mJobOption.clear();
156
157         foreach (const QString &family, info->families()) {
158             FontsConfigProperties *prop = info->fontProperty(family);
159             mFontConfig->appendFontProperty(prop);
160         }
161
162         emit installFinished(srcfont.fileName());
163         mFontConfig->runFcCache();
164     }
165 }
166
167 void ApplicationController::installFont(FontInfo *fontinfo)
168 {
169     qDebug() << "ApplicationController::installFont(" << fontinfo->families() << ")";
170
171     mNextJob = Nothing;
172     mJobOption = QVariant::fromValue<QObject *>(fontinfo);
173
174     installFont();
175 }
176
177 void ApplicationController::postInstall()
178 {
179     saveFontsConf();
180 }
181
182 void ApplicationController::updateFontsConf(InstalledFontInfo *fontInfo)
183 {
184     mFontConfig->appendFontProperty(fontInfo);
185 }
186
187 void ApplicationController::uninstallFont(const QString &fontpath)
188 {
189     qDebug() << "ApplicationController::uninstallFont(" << fontpath << ")";
190     bool check = QFile::remove(fontpath);
191     if (check) {
192         emit uninstallFinished(fontpath);
193         mFontConfig->runFcCache();
194     } else
195         emit alertDialog(tr("Could not remove Font '%1'").arg(fontpath));
196 }
197
198 void ApplicationController::confirm(bool ok)
199 {
200     qDebug() << "ApplicationController::confirm(" << ok << ")";
201     if (!ok) {
202         mNextJob = Nothing;
203         mJobOption.clear();
204         forceOverwrite = false;
205         return;
206     }
207
208     if (forceOverwrite) {
209         saveFontsConf();
210     } else
211         installFont();
212 }
213
214 void ApplicationController::syncInstalledFonts()
215 {
216     if (!mFontConfig)
217         return;
218     emit clearInstalledFontList();
219     for (int i = 0; i < mFontConfig->count(); i++) {
220         InstalledFontInfo *info = mFontConfig->fontInfo(i);
221         if (mShowSystemFont || !info->systemFont())
222             emit appendInstalledFont(info->localefamily(), info->localefullname());
223     }
224 }
225
226 void ApplicationController::saveFontsConf()
227 {
228     if (!mFontConfig->fontsConfModified())
229         return;
230     if (mFontConfig->hasUnknownConfig() && !forceOverwrite) {
231         forceOverwrite = true;
232         emit confirmDialog(tr("Overwrite it?"), tr("Current Config file %1 has unsupported configs(s).  It will be overwritten.  Overwrite it now?").arg(mFontConfig->localFontsConfPath()));
233         return;
234     }
235     mFontConfig->saveFontsConf();
236     forceOverwrite = false;
237 }