support importing indicators from compressed files

pull/5/head
Michail Vourlakos 6 years ago
parent fd74397bae
commit 81204e3519

@ -25,9 +25,16 @@
// Qt
#include <QDebug>
#include <QDir>
#include <QTemporaryDir>
// KDE
#include <KLocalizedString>
#include <KNotification>
#include <KPluginMetaData>
#include <KArchive/KTar>
#include <KArchive/KZip>
#include <KArchive/KArchiveEntry>
#include <KArchive/KArchiveDirectory>
namespace Latte {
namespace Indicator {
@ -86,13 +93,12 @@ void Factory::reload()
foreach (auto pluginDir, pluginDirs) {
if (pluginDir != "." && pluginDir != "..") {
QString metadataFile = standard.absolutePath() + "/" + pluginDir + "/metadata.desktop";
KPluginMetaData metadata = KPluginMetaData::fromDesktopFile(metadataFile);
if (QFileInfo(metadataFile).exists()) {
KPluginMetaData metadata = KPluginMetaData::fromDesktopFile(metadataFile);
if (metadataAreValid(metadata)) {
QString uiFile = standard.absolutePath() + "/" + pluginDir + "/package/" + metadata.value("X-Latte-MainScript");
if (metadata.isValid() && QFileInfo(uiFile).exists() && !m_plugins.contains(metadata.pluginId())) {
if (QFileInfo(uiFile).exists() && !m_plugins.contains(metadata.pluginId())) {
m_plugins[metadata.pluginId()] = metadata;
if ((metadata.pluginId() != "org.kde.latte.default")
@ -118,5 +124,84 @@ void Factory::reload()
emit customPluginsChanged();
}
bool Factory::metadataAreValid(KPluginMetaData &metadata)
{
return metadata.isValid()
&& metadata.category() == "Latte Indicator"
&& !metadata.value("X-Latte-MainScript").isEmpty();
}
bool Factory::metadataAreValid(QString &file)
{
if (QFileInfo(file).exists()) {
KPluginMetaData metadata = KPluginMetaData::fromDesktopFile(file);
return metadataAreValid(metadata);
}
return false;
}
Latte::Types::ImportExportState Factory::importIndicatorFile(QString compressedFile)
{
auto showNotificationError = []() {
auto notification = new KNotification("import-fail", KNotification::CloseOnTimeout);
notification->setText(i18n("Failed to import indicator"));
notification->sendEvent();
};
auto showNotificationSucceed = [](QString name, bool updated) {
auto notification = new KNotification("import-done", KNotification::CloseOnTimeout);
notification->setText(updated ? i18nc("indicator_name, imported updated","%0 indicator updated successfully").arg(name) :
i18nc("indicator_name, imported success","%0 indicator installed successfully").arg(name));
notification->sendEvent();
};
KArchive *archive;
KZip *zipArchive = new KZip(compressedFile);
zipArchive->open(QIODevice::ReadOnly);
//! if the file isnt a zip archive
if (!zipArchive->isOpen()) {
delete zipArchive;
KTar *tarArchive = new KTar(compressedFile, QStringLiteral("application/x-tar"));
tarArchive->open(QIODevice::ReadOnly);
if (!tarArchive->isOpen()) {
delete tarArchive;
showNotificationError();
return Latte::Types::Failed;
} else {
archive = tarArchive;
}
} else {
archive = zipArchive;
}
QTemporaryDir archiveTempDir;
archive->directory()->copyTo(archiveTempDir.path());
//metadata file
QString metadataFile = archiveTempDir.path() + "/metadata.desktop";
KPluginMetaData metadata = KPluginMetaData::fromDesktopFile(metadataFile);
if (metadataAreValid(metadata)) {
QStringList standardPaths = Latte::Importer::standardPaths();
QString installPath = standardPaths[0] + "/latte/indicators/" + metadata.pluginId();
bool updated{QDir(installPath).exists()};
archive->directory()->copyTo(installPath);
showNotificationSucceed(metadata.name(), updated);
return Latte::Types::Installed;
}
showNotificationError();
return Latte::Types::Failed;
}
}
}

@ -20,6 +20,9 @@
#ifndef INDICATORFACTORY_H
#define INDICATORFACTORY_H
// local
#include "../../liblatte2/types.h"
// Qt
#include <QHash>
#include <QObject>
@ -45,6 +48,13 @@ public:
KPluginMetaData metadata(QString pluginId);
//! metadata record
static bool metadataAreValid(KPluginMetaData &metadata);
//! metadata file
static bool metadataAreValid(QString &file);
//! imports an indicator compressed file
static Latte::Types::ImportExportState importIndicatorFile(QString compressedFile);
signals:
void customPluginsChanged();

@ -52,7 +52,7 @@ Comment[zh_TW]=Latte Dock
IconName=latte-dock
[Event/import-done]
Name=Configuration imported successfully
Name=Imported successfully
Name[ar]=استوردتُ الضّّبط بنجاح
Name[ca]=La configuració s'ha importat amb èxit
Name[ca@valencia]=La configuració s'ha importat amb èxit
@ -80,7 +80,7 @@ Name[zh_TW]=設定匯入成功
Action=Popup
[Event/import-fail]
Name=Failed to import configuration
Name=Failed to import
Name[ar]=فشل استيراد الضّبط
Name[ca]=Ha fallat en importar la configuració
Name[ca@valencia]=Ha fallat en importar la configuració
@ -108,7 +108,7 @@ Name[zh_TW]=匯入設定失敗
Action=Popup
[Event/export-done]
Name=Configuration exported successfully
Name=Exported successfully
Name[ar]=صدّرتُ الضّبط بنجاح
Name[ca]=La configuració s'ha exportat amb èxit
Name[ca@valencia]=La configuració s'ha exportat amb èxit
@ -136,7 +136,7 @@ Name[zh_TW]=設定匯出成功
Action=Popup
[Event/export-fail]
Name=Failed to export configuration
Name=Failed to export
Name[ar]=فشل تصدير الضّبط
Name[ca]=Ha fallat en exportar la configuració
Name[ca@valencia]=Ha fallat en exportar la configuració

@ -23,6 +23,7 @@
#include "view.h"
#include "../lattecorona.h"
#include "../indicator/factory.h"
#include "../../liblatte2/types.h"
// Qt
#include <QFileDialog>
@ -380,7 +381,10 @@ void Indicator::addIndicator()
connect(fileDialog, &QFileDialog::finished, fileDialog, &QFileDialog::deleteLater);
connect(fileDialog, &QFileDialog::fileSelected, this, [&](const QString & file) {
qDebug() << " indicator file ::: " << file;
qDebug() << "Trying to import indicator file ::: " << file;
if (m_corona->indicatorFactory()->importIndicatorFile(file) != Latte::Types::Failed) {
m_corona->indicatorFactory()->reload();
}
});
fileDialog->open();

@ -206,6 +206,14 @@ public:
ExpertSettings = 4
};
Q_ENUM(SettingsComplexity);
enum ImportExportState
{
Failed = 0,
Updated = 2,
Installed = 4
};
Q_ENUM(ImportExportState);
};
}//end of namespace

@ -50,7 +50,10 @@ LatteComponents.ComboBoxButton{
Connections{
target: latteView.indicator
onCustomPluginsCountChanged: custom.updateButtonInformation()
onCustomPluginsCountChanged: {
custom.reloadModel();
custom.updateButtonInformation()
}
}
Connections{
@ -60,6 +63,7 @@ LatteComponents.ComboBoxButton{
var item = actionsModel.get(index);
if (item.pluginId === "add:") {
latteView.indicator.addIndicator();
custom.updateButtonInformation();
}
}
}
@ -76,7 +80,7 @@ LatteComponents.ComboBoxButton{
}
function reloadModel() {
var actions = [];
actionsModel.clear();
if (latteView.indicator.customPluginsCount > 0) {
var pluginIds = latteView.indicator.customPluginIds;

Loading…
Cancel
Save