19 #include "indicatorsmanager.h"
27 class IndicatorsManager::IndicatorData
30 IndicatorData(
const QString& name,
const QFileInfo& fileInfo)
32 , m_fileInfo(fileInfo)
41 Indicator::Ptr m_indicator;
44 IndicatorsManager::IndicatorsManager(QObject* parent)
51 IndicatorsManager::~IndicatorsManager()
57 void IndicatorsManager::load(
const QString& profile)
62 QStringList xdgLocations = shellDataDirs();
64 m_fsWatcher.reset(
new QFileSystemWatcher(
this));
66 Q_FOREACH(
const QString& xdgLocation, xdgLocations)
68 QString indicator_path = QDir::cleanPath(xdgLocation +
"/unity/indicators");
69 QDir indicator_dir(indicator_path);
70 if (indicator_dir.exists())
73 m_fsWatcher->addPath(indicator_path);
75 loadDir(indicator_dir);
79 QObject::connect(m_fsWatcher.data(), SIGNAL(directoryChanged(
const QString&)),
this, SLOT(onDirectoryChanged(
const QString&)));
80 QObject::connect(m_fsWatcher.data(), SIGNAL(fileChanged(
const QString&)),
this, SLOT(onFileChanged(
const QString&)));
84 void IndicatorsManager::onDirectoryChanged(
const QString& directory)
86 loadDir(QDir(directory));
89 void IndicatorsManager::onFileChanged(
const QString& file)
91 QFileInfo file_info(file);
92 if (!file_info.exists())
94 unloadFile(file_info);
99 loadFile(QFileInfo(file));
103 void IndicatorsManager::loadDir(
const QDir& dir)
105 startVerify(dir.canonicalPath());
107 QFileInfoList indicator_files = dir.entryInfoList(QStringList(), QDir::Files|QDir::NoDotAndDotDot);
108 Q_FOREACH(
const QFileInfo& indicator_file, indicator_files)
110 loadFile(indicator_file);
113 endVerify(dir.canonicalPath());
116 void IndicatorsManager::loadFile(
const QFileInfo& file_info)
118 QSettings indicator_settings(file_info.absoluteFilePath(), QSettings::IniFormat,
this);
119 QString name = indicator_settings.value(
"Indicator Service/Name").toString();
121 auto iter = m_indicatorsData.find(name);
122 if (iter != m_indicatorsData.end())
124 QString newFileInfoDir = QDir::cleanPath(file_info.canonicalPath());
125 IndicatorData* currentData = (*iter);
126 currentData->m_verified =
true;
128 int file_info_location = -1;
129 int current_data_location = -1;
131 QString currentDataDir = QDir::cleanPath(currentData->m_fileInfo.canonicalPath());
135 QStringList xdgLocations = shellDataDirs();
136 for (
int i = 0; i < xdgLocations.size(); i++)
138 QString indicatorDir = QDir::cleanPath(xdgLocations[i] +
"/unity/indicators");
140 if (newFileInfoDir == indicatorDir)
142 file_info_location = i;
144 if (currentDataDir == indicatorDir)
146 current_data_location = i;
149 if (file_info_location != -1 && current_data_location != -1)
156 if (file_info_location <= current_data_location &&
157 file_info != currentData->m_fileInfo)
159 currentData->m_fileInfo = file_info;
160 Q_EMIT indicatorLoaded(name);
165 IndicatorData* data =
new IndicatorData(name, file_info);
166 data->m_verified =
true;
167 m_indicatorsData[name]= data;
168 Q_EMIT indicatorLoaded(name);
172 void IndicatorsManager::unload()
174 QHashIterator<QString, IndicatorData*> iter(m_indicatorsData);
175 while(iter.hasNext())
178 Q_EMIT indicatorAboutToBeUnloaded(iter.key());
181 qDeleteAll(m_indicatorsData);
182 m_indicatorsData.clear();
187 void IndicatorsManager::unloadFile(
const QFileInfo& file)
189 QMutableHashIterator<QString, IndicatorData*> iter(m_indicatorsData);
190 while(iter.hasNext())
193 IndicatorData* data = iter.value();
194 if (data->m_fileInfo.absoluteFilePath() == file.absoluteFilePath())
196 if (!data->m_verified)
198 QString name = data->m_name;
199 Q_EMIT indicatorAboutToBeUnloaded(name);
207 setLoaded(m_indicatorsData.size() > 0);
210 void IndicatorsManager::setLoaded(
bool loaded)
212 if (loaded != m_loaded)
215 Q_EMIT loadedChanged(m_loaded);
219 void IndicatorsManager::startVerify(
const QString& path)
221 QHashIterator<QString, IndicatorData*> iter(m_indicatorsData);
222 while(iter.hasNext())
225 IndicatorData* data = iter.value();
226 if (data->m_fileInfo.canonicalPath() == path)
228 data->m_verified =
false;
233 void IndicatorsManager::endVerify(
const QString& path)
235 QMutableHashIterator<QString, IndicatorData*> iter(m_indicatorsData);
236 while(iter.hasNext())
239 IndicatorData* data = iter.value();
240 if (data->m_fileInfo.canonicalPath() == path)
242 if (!data->m_verified)
244 QString name = data->m_name;
245 Q_EMIT indicatorAboutToBeUnloaded(name);
254 Indicator::Ptr IndicatorsManager::indicator(
const QString& indicator_name)
256 if (!m_indicatorsData.contains(indicator_name))
258 qWarning() << Q_FUNC_INFO <<
"Invalid indicator name: " << indicator_name;
259 return Indicator::Ptr();
262 IndicatorData *data = m_indicatorsData[indicator_name];
263 if (data->m_indicator)
265 return data->m_indicator;
268 Indicator::Ptr new_indicator(
new Indicator(
this));
269 data->m_indicator = new_indicator;
270 QSettings settings(data->m_fileInfo.absoluteFilePath(), QSettings::IniFormat,
this);
271 new_indicator->init(m_profile, data->m_fileInfo.fileName(), settings);
272 return new_indicator;
275 QList<Indicator::Ptr> IndicatorsManager::indicators()
277 QList<Indicator::Ptr> list;
278 Q_FOREACH(IndicatorData* data, m_indicatorsData)
280 Indicator::Ptr ret = indicator(data->m_name);
287 bool IndicatorsManager::isLoaded()
const