* initial implementation of configuration export and import feature (#68)

* drop mediators in data transition
This commit is contained in:
arcan1s
2015-10-16 07:22:03 +03:00
parent 2db2de4c27
commit 0e1b101703
14 changed files with 734 additions and 46 deletions

View File

@ -20,8 +20,10 @@
#include <KI18n/KLocalizedString>
#include <KNotifications/KNotification>
#include <QCheckBox>
#include <QDesktopServices>
#include <QDir>
#include <QFileDialog>
#include <QJsonDocument>
#include <QJsonParseError>
#include <QMessageBox>
@ -30,8 +32,10 @@
#include <QNetworkReply>
#include <QProcess>
#include <QProcessEnvironment>
#include <QQmlPropertyMap>
#include <QSettings>
#include <QStandardPaths>
#include <QVBoxLayout>
#include <fontdialog/fontdialog.h>
@ -109,6 +113,78 @@ void AWActions::showReadme() const
}
void AWActions::exportConfiguration(QObject *nativeConfig) const
{
qCDebug(LOG_AW);
// get file path and init settings object
QString fileName = QFileDialog::getSaveFileName(nullptr, i18n("Export"));
if (fileName.isEmpty())
return;
qCInfo(LOG_AW) << "Selected filename" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
// additional parameters
QString baseDir = QString("%1/awesomewidgets").
arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
QStringList dirs = QStringList() << QString("desktops") << QString("quotes")
<< QString("scripts") << QString("upgrade") << QString("weather");
// plasmoid configuration
QQmlPropertyMap *configuration = static_cast<QQmlPropertyMap *>(nativeConfig);
settings.beginGroup(QString("plasmoid"));
foreach(QString key, configuration->keys()) {
QVariant value = configuration->value(key);
if (!value.isValid())
continue;
settings.setValue(key, value);
}
settings.endGroup();
// extenstions
foreach(QString item, dirs) {
QStringList items = QDir(QString("%1/%2").arg(baseDir).arg(item)).entryList(
QStringList() << QString("*.desktop"), QDir::Files);
settings.beginGroup(item);
foreach(QString it, items) {
qCInfo(LOG_AW) << "Processing file" << it;
settings.beginGroup(it);
QSettings itemSettings(QString("%1/%2/%3").arg(baseDir).arg(item).arg(it), QSettings::IniFormat);
itemSettings.beginGroup(QString("Desktop Entry"));
foreach(QString key, itemSettings.childKeys())
settings.setValue(key, itemSettings.value(key));
itemSettings.endGroup();
settings.endGroup();
}
settings.endGroup();
}
// additional files
settings.beginGroup(QString("json"));
// script filters
QFile filterFile(QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(baseDir));
if (filterFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString filterText = filterFile.readAll();
filterFile.close();
settings.setValue(QString("filters"), filterText);
} else {
qCWarning(LOG_LIB) << "Could not open" << filterFile.fileName();
}
// weather icon settings
QFile weatherIdFile(QString("%1/weather/awesomewidgets-extweather-ids.json").arg(baseDir));
if (weatherIdFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
QString weatherIdText = weatherIdFile.readAll();
weatherIdFile.close();
settings.setValue(QString("weathers"), weatherIdText);
} else {
qCWarning(LOG_LIB) << "Could not open" << weatherIdFile.fileName();
}
settings.endGroup();
// sync settings
settings.sync();
}
// HACK: this method uses variables from version.h
QString AWActions::getAboutText(const QString type) const
{
@ -171,6 +247,114 @@ QVariantMap AWActions::getFont(const QVariantMap defaultFont) const
}
QQmlPropertyMap* AWActions::importConfiguration() const
{
qCDebug(LOG_AW);
QQmlPropertyMap *configuration = new QQmlPropertyMap();
// get file path and init settings object
QString fileName = QFileDialog::getOpenFileName(nullptr, i18n("Import"));
if (fileName.isEmpty())
return configuration;
qCInfo(LOG_AW) << "Selected filename" << fileName;
QSettings settings(fileName, QSettings::IniFormat);
// additional parameters
QString baseDir = QString("%1/awesomewidgets").
arg(QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation));
QStringList dirs = QStringList() << QString("desktops") << QString("quotes")
<< QString("scripts") << QString("upgrade") << QString("weather");
// check what should be exported
QDialog *dialog = new QDialog(nullptr);
QCheckBox *importPlasmoidSettings = new QCheckBox(i18n("Import plasmoid settings"), dialog);
QCheckBox *importExtensionsSettings = new QCheckBox(i18n("Import extenstions"), dialog);
QCheckBox *importAddsSettings = new QCheckBox(i18n("Import additional files"), dialog);
QDialogButtonBox *dialogButtons = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel,
Qt::Horizontal, dialog);
QVBoxLayout *layout = new QVBoxLayout(dialog);
layout->addWidget(importPlasmoidSettings);
layout->addWidget(importExtensionsSettings);
layout->addWidget(importAddsSettings);
layout->addWidget(dialogButtons);
connect(dialogButtons, SIGNAL(accepted()), dialog, SLOT(accept()));
connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject()));
// get parameters
bool importPlasmoid = false;
bool importExtensions = false;
bool importAdds = false;
switch(int ret = dialog->exec()) {
case QDialog::Accepted:
importPlasmoid = importPlasmoidSettings->isChecked();
importExtensions = importExtensionsSettings->isChecked();
importAdds = importAddsSettings->isChecked();
break;
case QDialog::Rejected:
default:
break;
}
dialog->deleteLater();
// extenstions
if (importExtensions) {
foreach(QString item, dirs) {
settings.beginGroup(item);
qDebug() << settings.childGroups();
foreach(QString it, settings.childGroups()) {
qCInfo(LOG_AW) << "Processing file" << it;
settings.beginGroup(it);
QSettings itemSettings(QString("%1/%2/%3").arg(baseDir).arg(item).arg(it), QSettings::IniFormat);
itemSettings.beginGroup(QString("Desktop Entry"));
foreach(QString key, settings.childKeys())
itemSettings.setValue(key, settings.value(key));
itemSettings.endGroup();
itemSettings.sync();
settings.endGroup();
}
settings.endGroup();
}
}
// additional files
if (importAdds) {
settings.beginGroup(QString("json"));
// script filters
if (settings.contains(QString("filters"))) {
QFile filterFile(QString("%1/scripts/awesomewidgets-extscripts-filters.json").arg(baseDir));
if (filterFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
QDataStream out(&filterFile);
out << settings.value(QString("filters")).toString();
filterFile.close();
} else {
qCWarning(LOG_LIB) << "Could not open" << filterFile.fileName();
}
}
// weather icon settings
if (settings.contains(QString("weathers"))) {
QFile weatherIdFile(QString("%1/weather/awesomewidgets-extweather-ids.json").arg(baseDir));
if (weatherIdFile.open(QIODevice::WriteOnly | QIODevice::Text)) {
QDataStream out(&weatherIdFile);
out << settings.value(QString("weathers")).toString();
weatherIdFile.close();
} else {
qCWarning(LOG_LIB) << "Could not open" << weatherIdFile.fileName();
}
}
settings.endGroup();
}
// plasmoid configuration
if (importPlasmoid) {
settings.beginGroup(QString("plasmoid"));
foreach(QString key, settings.childKeys())
configuration->insert(key, settings.value(key));
configuration->insert(QString("valid"), true);
settings.endGroup();
}
return configuration;
}
QVariantMap AWActions::readDataEngineConfiguration() const
{
qCDebug(LOG_AW);