mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-04-24 15:37:23 +00:00
344 lines
11 KiB
C++
344 lines
11 KiB
C++
/***************************************************************************
|
|
* This file is part of awesome-widgets *
|
|
* *
|
|
* awesome-widgets 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 3 of the *
|
|
* License, or (at your option) any later version. *
|
|
* *
|
|
* awesome-widgets 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 awesome-widgets. If not, see http://www.gnu.org/licenses/ *
|
|
***************************************************************************/
|
|
|
|
#include "awformatterhelper.h"
|
|
|
|
#include <KI18n/KLocalizedString>
|
|
|
|
#include <QDir>
|
|
#include <QInputDialog>
|
|
#include <QSettings>
|
|
|
|
#include "awdatetimeformatter.h"
|
|
#include "awdebug.h"
|
|
#include "awfloatformatter.h"
|
|
#include "awjsonformatter.h"
|
|
#include "awlistformatter.h"
|
|
#include "awnoformatter.h"
|
|
#include "awscriptformatter.h"
|
|
#include "awstringformatter.h"
|
|
|
|
|
|
AWFormatterHelper::AWFormatterHelper(QWidget *_parent)
|
|
: AbstractExtItemAggregator(_parent, "formatters")
|
|
{
|
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
|
|
|
m_filePath = "awesomewidgets/formatters/formatters.ini";
|
|
initItems();
|
|
}
|
|
|
|
|
|
AWFormatterHelper::~AWFormatterHelper()
|
|
{
|
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
|
|
|
m_formatters.clear();
|
|
m_formattersClasses.clear();
|
|
}
|
|
|
|
|
|
QString AWFormatterHelper::convert(const QVariant &_value,
|
|
const QString &_name) const
|
|
{
|
|
qCDebug(LOG_AW) << "Convert value" << _value << "for" << _name;
|
|
|
|
return m_formatters.contains(_name) ? m_formatters[_name]->convert(_value)
|
|
: _value.toString();
|
|
}
|
|
|
|
|
|
QStringList AWFormatterHelper::definedFormatters() const
|
|
{
|
|
return m_formatters.keys();
|
|
}
|
|
|
|
|
|
QHash<QString, QString> AWFormatterHelper::getFormatters() const
|
|
{
|
|
QHash<QString, QString> map;
|
|
for (auto &tag : m_formatters.keys())
|
|
map[tag] = m_formatters[tag]->name();
|
|
|
|
return map;
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::initItems()
|
|
{
|
|
installDirectories();
|
|
initFormatters();
|
|
initKeys();
|
|
}
|
|
|
|
|
|
QList<AbstractExtItem *> AWFormatterHelper::items() const
|
|
{
|
|
QList<AbstractExtItem *> converted;
|
|
for (auto &item : m_formattersClasses.values())
|
|
converted.append(item);
|
|
|
|
return converted;
|
|
}
|
|
|
|
|
|
QStringList AWFormatterHelper::knownFormatters() const
|
|
{
|
|
return m_formattersClasses.keys();
|
|
}
|
|
|
|
|
|
bool AWFormatterHelper::removeUnusedFormatters(const QStringList &_keys) const
|
|
{
|
|
qCDebug(LOG_AW) << "Remove formatters" << _keys;
|
|
|
|
QString fileName = QString("%1/%2")
|
|
.arg(QStandardPaths::writableLocation(
|
|
QStandardPaths::GenericDataLocation))
|
|
.arg(m_filePath);
|
|
QSettings settings(fileName, QSettings::IniFormat);
|
|
qCInfo(LOG_AW) << "Configuration file" << fileName;
|
|
|
|
settings.beginGroup("Formatters");
|
|
QStringList foundKeys = settings.childKeys();
|
|
for (auto &key : foundKeys) {
|
|
if (_keys.contains(key))
|
|
continue;
|
|
settings.remove(key);
|
|
}
|
|
settings.endGroup();
|
|
|
|
settings.sync();
|
|
|
|
return (settings.status() == QSettings::NoError);
|
|
}
|
|
|
|
|
|
bool AWFormatterHelper::writeFormatters(
|
|
const QHash<QString, QString> &_configuration) const
|
|
{
|
|
qCDebug(LOG_AW) << "Write configuration" << _configuration;
|
|
|
|
QString fileName = QString("%1/%2")
|
|
.arg(QStandardPaths::writableLocation(
|
|
QStandardPaths::GenericDataLocation))
|
|
.arg(m_filePath);
|
|
QSettings settings(fileName, QSettings::IniFormat);
|
|
qCInfo(LOG_AW) << "Configuration file" << fileName;
|
|
|
|
settings.beginGroup("Formatters");
|
|
for (auto &key : _configuration.keys())
|
|
settings.setValue(key, _configuration[key]);
|
|
settings.endGroup();
|
|
|
|
settings.sync();
|
|
|
|
return (settings.status() == QSettings::NoError);
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::editItems()
|
|
{
|
|
repaintList();
|
|
int ret = exec();
|
|
qCInfo(LOG_AW) << "Dialog returns" << ret;
|
|
}
|
|
|
|
|
|
AWAbstractFormatter::FormatterClass
|
|
AWFormatterHelper::defineFormatterClass(const QString &_stringType) const
|
|
{
|
|
qCDebug(LOG_AW) << "Define formatter class for" << _stringType;
|
|
|
|
AWAbstractFormatter::FormatterClass formatter
|
|
= AWAbstractFormatter::FormatterClass::NoFormat;
|
|
if (_stringType == "DateTime")
|
|
formatter = AWAbstractFormatter::FormatterClass::DateTime;
|
|
else if (_stringType == "Float")
|
|
formatter = AWAbstractFormatter::FormatterClass::Float;
|
|
else if (_stringType == "List")
|
|
formatter = AWAbstractFormatter::FormatterClass::List;
|
|
else if (_stringType == "NoFormat")
|
|
;
|
|
else if (_stringType == "Script")
|
|
formatter = AWAbstractFormatter::FormatterClass::Script;
|
|
else if (_stringType == "String")
|
|
formatter = AWAbstractFormatter::FormatterClass::String;
|
|
else if (_stringType == "Json")
|
|
formatter = AWAbstractFormatter::FormatterClass::Json;
|
|
else
|
|
qCWarning(LOG_AW) << "Unknown formatter" << _stringType;
|
|
|
|
return formatter;
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::initFormatters()
|
|
{
|
|
m_formattersClasses.clear();
|
|
|
|
for (int i = m_directories.count() - 1; i >= 0; i--) {
|
|
QStringList files
|
|
= QDir(m_directories.at(i)).entryList(QDir::Files, QDir::Name);
|
|
for (auto &file : files) {
|
|
if (!file.endsWith(".desktop"))
|
|
continue;
|
|
qCInfo(LOG_AW) << "Found file" << file << "in"
|
|
<< m_directories.at(i);
|
|
QString filePath
|
|
= QString("%1/%2").arg(m_directories.at(i)).arg(file);
|
|
auto metadata = readMetadata(filePath);
|
|
QString name = metadata.first;
|
|
if (m_formattersClasses.contains(name))
|
|
continue;
|
|
|
|
|
|
switch (metadata.second) {
|
|
case AWAbstractFormatter::FormatterClass::DateTime:
|
|
m_formattersClasses[name]
|
|
= new AWDateTimeFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::Float:
|
|
m_formattersClasses[name]
|
|
= new AWFloatFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::List:
|
|
m_formattersClasses[name] = new AWListFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::Script:
|
|
m_formattersClasses[name]
|
|
= new AWScriptFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::String:
|
|
m_formattersClasses[name]
|
|
= new AWStringFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::Json:
|
|
m_formattersClasses[name] = new AWJsonFormatter(this, filePath);
|
|
break;
|
|
case AWAbstractFormatter::FormatterClass::NoFormat:
|
|
m_formattersClasses[name] = new AWNoFormatter(this, filePath);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::initKeys()
|
|
{
|
|
m_formatters.clear();
|
|
|
|
QStringList configs = QStandardPaths::locateAll(
|
|
QStandardPaths::GenericDataLocation, m_filePath);
|
|
|
|
for (auto &fileName : configs) {
|
|
QSettings settings(fileName, QSettings::IniFormat);
|
|
qCInfo(LOG_AW) << "Configuration file" << settings.fileName();
|
|
|
|
settings.beginGroup("Formatters");
|
|
QStringList keys = settings.childKeys();
|
|
for (auto &key : keys) {
|
|
QString name = settings.value(key).toString();
|
|
qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key
|
|
<< "in" << settings.fileName();
|
|
if (name.isEmpty()) {
|
|
qCInfo(LOG_AW) << "Skip empty formatter for" << key;
|
|
continue;
|
|
}
|
|
if (!m_formattersClasses.contains(name)) {
|
|
qCWarning(LOG_AW)
|
|
<< "Invalid formatter" << name << "found in" << key;
|
|
continue;
|
|
}
|
|
m_formatters[key] = m_formattersClasses[name];
|
|
}
|
|
settings.endGroup();
|
|
}
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::installDirectories()
|
|
{
|
|
// create directory at $HOME
|
|
QString localDir = QString("%1/awesomewidgets/formatters")
|
|
.arg(QStandardPaths::writableLocation(
|
|
QStandardPaths::GenericDataLocation));
|
|
QDir localDirectory;
|
|
if (localDirectory.mkpath(localDir))
|
|
qCInfo(LOG_AW) << "Created directory" << localDir;
|
|
|
|
m_directories = QStandardPaths::locateAll(
|
|
QStandardPaths::GenericDataLocation, "awesomewidgets/formatters",
|
|
QStandardPaths::LocateDirectory);
|
|
}
|
|
|
|
|
|
QPair<QString, AWAbstractFormatter::FormatterClass>
|
|
AWFormatterHelper::readMetadata(const QString &_filePath) const
|
|
{
|
|
qCDebug(LOG_AW) << "Read initial parameters from" << _filePath;
|
|
|
|
QSettings settings(_filePath, QSettings::IniFormat);
|
|
settings.beginGroup("Desktop Entry");
|
|
QString name = settings.value("Name", _filePath).toString();
|
|
QString type = settings.value("X-AW-Type", "NoFormat").toString();
|
|
AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type);
|
|
settings.endGroup();
|
|
|
|
return QPair<QString, AWAbstractFormatter::FormatterClass>(name, formatter);
|
|
}
|
|
|
|
|
|
void AWFormatterHelper::doCreateItem()
|
|
{
|
|
QStringList selection = QStringList() << "NoFormat"
|
|
<< "DateTime"
|
|
<< "Float"
|
|
<< "List"
|
|
<< "Script"
|
|
<< "String"
|
|
<< "Json";
|
|
bool ok;
|
|
QString select = QInputDialog::getItem(
|
|
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
|
|
if (!ok) {
|
|
qCWarning(LOG_AW) << "No type selected";
|
|
return;
|
|
}
|
|
|
|
qCInfo(LOG_AW) << "Selected type" << select;
|
|
AWAbstractFormatter::FormatterClass formatter
|
|
= defineFormatterClass(select);
|
|
switch (formatter) {
|
|
case AWAbstractFormatter::FormatterClass::DateTime:
|
|
return createItem<AWDateTimeFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::Float:
|
|
return createItem<AWFloatFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::List:
|
|
return createItem<AWListFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::Script:
|
|
return createItem<AWScriptFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::String:
|
|
return createItem<AWStringFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::Json:
|
|
return createItem<AWJsonFormatter>();
|
|
case AWAbstractFormatter::FormatterClass::NoFormat:
|
|
return createItem<AWNoFormatter>();
|
|
}
|
|
}
|