mirror of
https://github.com/arcan1s/awesome-widgets.git
synced 2025-04-24 23:47:20 +00:00
rewrite formtatter* and customkeys* to share their code
This commit is contained in:
parent
7ce3e8b1cf
commit
9d0a1bd70c
190
sources/awesome-widget/plugin/awabstractpairconfig.cpp
Normal file
190
sources/awesome-widget/plugin/awabstractpairconfig.cpp
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* 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 "awabstractpairconfig.h"
|
||||||
|
#include "ui_awabstractpairconfig.h"
|
||||||
|
|
||||||
|
#include <KI18n/KLocalizedString>
|
||||||
|
|
||||||
|
#include <QPushButton>
|
||||||
|
|
||||||
|
#include "awabstractselector.h"
|
||||||
|
#include "awdebug.h"
|
||||||
|
|
||||||
|
|
||||||
|
AWAbstractPairConfig::AWAbstractPairConfig(QWidget *_parent,
|
||||||
|
const bool _hasEdit,
|
||||||
|
const QStringList &_keys)
|
||||||
|
: QDialog(_parent)
|
||||||
|
, ui(new Ui::AWAbstractPairConfig)
|
||||||
|
, m_hasEdit(_hasEdit)
|
||||||
|
, m_keys(_keys)
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
|
||||||
|
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
||||||
|
|
||||||
|
// edit feature
|
||||||
|
if (m_hasEdit) {
|
||||||
|
m_editButton = ui->buttonBox->addButton(i18n("Edit"),
|
||||||
|
QDialogButtonBox::ActionRole);
|
||||||
|
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(edit()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AWAbstractPairConfig::~AWAbstractPairConfig()
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
|
clearSelectors();
|
||||||
|
|
||||||
|
delete m_helper;
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::showDialog()
|
||||||
|
{
|
||||||
|
// update dialog
|
||||||
|
updateDialog();
|
||||||
|
// exec dialog
|
||||||
|
return execDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::setEditable(const bool _first, const bool _second)
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << "Set editable" << _first << _second;
|
||||||
|
|
||||||
|
m_editable = {_first, _second};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::edit()
|
||||||
|
{
|
||||||
|
m_helper->editPairs();
|
||||||
|
updateDialog();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::updateUi()
|
||||||
|
{
|
||||||
|
QPair<QString, QString> current
|
||||||
|
= static_cast<AWAbstractSelector *>(sender())->current();
|
||||||
|
int index
|
||||||
|
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
|
||||||
|
|
||||||
|
if ((current.first.isEmpty()) && (current.second.isEmpty())) {
|
||||||
|
// remove current selector if it is empty and does not last
|
||||||
|
if (sender() == m_selectors.last())
|
||||||
|
return;
|
||||||
|
AWAbstractSelector *selector = m_selectors.takeAt(index);
|
||||||
|
ui->verticalLayout->removeWidget(selector);
|
||||||
|
selector->deleteLater();
|
||||||
|
} else {
|
||||||
|
// add new selector if something changed
|
||||||
|
if (sender() != m_selectors.last())
|
||||||
|
return;
|
||||||
|
auto keys = initKeys();
|
||||||
|
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::addSelector(const QStringList &_keys,
|
||||||
|
const QStringList &_values,
|
||||||
|
const QPair<QString, QString> &_current)
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
|
||||||
|
<< "and current ones" << _current;
|
||||||
|
|
||||||
|
AWAbstractSelector *selector
|
||||||
|
= new AWAbstractSelector(ui->scrollAreaWidgetContents, m_editable);
|
||||||
|
selector->init(_keys, _values, _current);
|
||||||
|
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
|
||||||
|
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
|
||||||
|
m_selectors.append(selector);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::clearSelectors()
|
||||||
|
{
|
||||||
|
for (auto &selector : m_selectors) {
|
||||||
|
disconnect(selector, SIGNAL(selectionChanged()), this,
|
||||||
|
SLOT(updateUi()));
|
||||||
|
ui->verticalLayout->removeWidget(selector);
|
||||||
|
selector->deleteLater();
|
||||||
|
}
|
||||||
|
m_selectors.clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::execDialog()
|
||||||
|
{
|
||||||
|
int ret = exec();
|
||||||
|
QHash<QString, QString> data;
|
||||||
|
for (auto &selector : m_selectors) {
|
||||||
|
QPair<QString, QString> select = selector->current();
|
||||||
|
if (select.first.isEmpty())
|
||||||
|
continue;
|
||||||
|
data[select.first] = select.second;
|
||||||
|
}
|
||||||
|
|
||||||
|
// save configuration if required
|
||||||
|
switch (ret) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
default:
|
||||||
|
m_helper->writeItems(data);
|
||||||
|
m_helper->removeUnusedKeys(data.keys());
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QPair<QStringList, QStringList> AWAbstractPairConfig::initKeys() const
|
||||||
|
{
|
||||||
|
// we are adding empty string at the start
|
||||||
|
QStringList left = {""};
|
||||||
|
left.append(m_helper->leftKeys().isEmpty() ? m_keys : m_helper->leftKeys());
|
||||||
|
left.sort();
|
||||||
|
QStringList right = {""};
|
||||||
|
right.append(m_helper->rightKeys().isEmpty() ? m_keys
|
||||||
|
: m_helper->rightKeys());
|
||||||
|
right.sort();
|
||||||
|
|
||||||
|
return QPair<QStringList, QStringList>(left, right);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairConfig::updateDialog()
|
||||||
|
{
|
||||||
|
clearSelectors();
|
||||||
|
auto pairs = m_helper->pairs();
|
||||||
|
auto keys = initKeys();
|
||||||
|
|
||||||
|
for (auto &key : m_helper->keys())
|
||||||
|
addSelector(keys.first, keys.second,
|
||||||
|
QPair<QString, QString>(key, m_helper->pairs()[key]));
|
||||||
|
// empty one
|
||||||
|
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
||||||
|
}
|
75
sources/awesome-widget/plugin/awabstractpairconfig.h
Normal file
75
sources/awesome-widget/plugin/awabstractpairconfig.h
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* 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/ *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef AWABSTRACTPAIRCONFIG_H
|
||||||
|
#define AWABSTRACTPAIRCONFIG_H
|
||||||
|
|
||||||
|
#include <QDialog>
|
||||||
|
|
||||||
|
#include "awabstractpairhelper.h"
|
||||||
|
|
||||||
|
|
||||||
|
class AWAbstractSelector;
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class AWAbstractPairConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
class AWAbstractPairConfig : public QDialog
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AWAbstractPairConfig(QWidget *_parent = nullptr,
|
||||||
|
const bool _hasEdit = false,
|
||||||
|
const QStringList &_keys = QStringList());
|
||||||
|
virtual ~AWAbstractPairConfig();
|
||||||
|
template <class T> void initHelper()
|
||||||
|
{
|
||||||
|
if (m_helper)
|
||||||
|
delete m_helper;
|
||||||
|
m_helper = new T(this);
|
||||||
|
}
|
||||||
|
void showDialog();
|
||||||
|
// properties
|
||||||
|
void setEditable(const bool _first, const bool _second);
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void edit();
|
||||||
|
void updateUi();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QPushButton *m_editButton = nullptr;
|
||||||
|
Ui::AWAbstractPairConfig *ui = nullptr;
|
||||||
|
AWAbstractPairHelper *m_helper = nullptr;
|
||||||
|
QList<AWAbstractSelector *> m_selectors;
|
||||||
|
// properties
|
||||||
|
QPair<bool, bool> m_editable = {false, false};
|
||||||
|
bool m_hasEdit = false;
|
||||||
|
QStringList m_keys;
|
||||||
|
// methods
|
||||||
|
void addSelector(const QStringList &_keys, const QStringList &_values,
|
||||||
|
const QPair<QString, QString> &_current);
|
||||||
|
void clearSelectors();
|
||||||
|
void execDialog();
|
||||||
|
QPair<QStringList, QStringList> initKeys() const;
|
||||||
|
void updateDialog();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AWABSTRACTPAIRCONFIG_H */
|
@ -1,7 +1,7 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<ui version="4.0">
|
<ui version="4.0">
|
||||||
<class>AWCustomKeysConfig</class>
|
<class>AWAbstractPairConfig</class>
|
||||||
<widget class="QDialog" name="AWCustomKeysConfig">
|
<widget class="QDialog" name="AWAbstractPairConfig">
|
||||||
<property name="geometry">
|
<property name="geometry">
|
||||||
<rect>
|
<rect>
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
@ -60,7 +60,7 @@
|
|||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>accepted()</signal>
|
<signal>accepted()</signal>
|
||||||
<receiver>AWCustomKeysConfig</receiver>
|
<receiver>AWAbstractPairConfig</receiver>
|
||||||
<slot>accept()</slot>
|
<slot>accept()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
||||||
@ -76,7 +76,7 @@
|
|||||||
<connection>
|
<connection>
|
||||||
<sender>buttonBox</sender>
|
<sender>buttonBox</sender>
|
||||||
<signal>rejected()</signal>
|
<signal>rejected()</signal>
|
||||||
<receiver>AWCustomKeysConfig</receiver>
|
<receiver>AWAbstractPairConfig</receiver>
|
||||||
<slot>reject()</slot>
|
<slot>reject()</slot>
|
||||||
<hints>
|
<hints>
|
||||||
<hint type="sourcelabel">
|
<hint type="sourcelabel">
|
135
sources/awesome-widget/plugin/awabstractpairhelper.cpp
Normal file
135
sources/awesome-widget/plugin/awabstractpairhelper.cpp
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* 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 "awabstractpairhelper.h"
|
||||||
|
|
||||||
|
#include <QSettings>
|
||||||
|
#include <QStandardPaths>
|
||||||
|
|
||||||
|
#include "awdebug.h"
|
||||||
|
|
||||||
|
|
||||||
|
AWAbstractPairHelper::AWAbstractPairHelper(const QString &_filePath,
|
||||||
|
const QString &_section)
|
||||||
|
: m_filePath(_filePath)
|
||||||
|
, m_section(_section)
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
|
initItems();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
AWAbstractPairHelper::~AWAbstractPairHelper()
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QStringList AWAbstractPairHelper::keys() const
|
||||||
|
{
|
||||||
|
return m_pairs.keys();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QHash<QString, QString> AWAbstractPairHelper::pairs() const
|
||||||
|
{
|
||||||
|
return m_pairs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QStringList AWAbstractPairHelper::values() const
|
||||||
|
{
|
||||||
|
return m_pairs.values();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void AWAbstractPairHelper::initItems()
|
||||||
|
{
|
||||||
|
m_pairs.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(m_section);
|
||||||
|
QStringList keys = settings.childKeys();
|
||||||
|
for (auto &key : keys) {
|
||||||
|
QString value = settings.value(key).toString();
|
||||||
|
qCInfo(LOG_AW) << "Found key" << key << "for value" << value << "in"
|
||||||
|
<< settings.fileName();
|
||||||
|
if (value.isEmpty()) {
|
||||||
|
qCInfo(LOG_AW) << "Skip empty value for" << key;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
m_pairs[key] = value;
|
||||||
|
}
|
||||||
|
settings.endGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AWAbstractPairHelper::writeItems(
|
||||||
|
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(m_section);
|
||||||
|
for (auto &key : _configuration.keys())
|
||||||
|
settings.setValue(key, _configuration[key]);
|
||||||
|
settings.endGroup();
|
||||||
|
|
||||||
|
settings.sync();
|
||||||
|
|
||||||
|
return (settings.status() == QSettings::NoError);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool AWAbstractPairHelper::removeUnusedKeys(const QStringList &_keys) const
|
||||||
|
{
|
||||||
|
qCDebug(LOG_AW) << "Remove keys" << _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(m_section);
|
||||||
|
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);
|
||||||
|
}
|
52
sources/awesome-widget/plugin/awabstractpairhelper.h
Normal file
52
sources/awesome-widget/plugin/awabstractpairhelper.h
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
/***************************************************************************
|
||||||
|
* 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/ *
|
||||||
|
***************************************************************************/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef AWABSTRACTPAIRHELPER_H
|
||||||
|
#define AWABSTRACTPAIRHELPER_H
|
||||||
|
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
|
|
||||||
|
class AWAbstractPairHelper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
explicit AWAbstractPairHelper(const QString &_filePath = "",
|
||||||
|
const QString &_section = "");
|
||||||
|
virtual ~AWAbstractPairHelper();
|
||||||
|
QStringList keys() const;
|
||||||
|
QHash<QString, QString> pairs() const;
|
||||||
|
QStringList values() const;
|
||||||
|
// read-write methods
|
||||||
|
virtual void initItems();
|
||||||
|
virtual bool
|
||||||
|
writeItems(const QHash<QString, QString> &_configuration) const;
|
||||||
|
virtual bool removeUnusedKeys(const QStringList &_keys) const;
|
||||||
|
// configuration related
|
||||||
|
virtual void editPairs() = 0;
|
||||||
|
virtual QStringList leftKeys() = 0;
|
||||||
|
virtual QStringList rightKeys() = 0;
|
||||||
|
|
||||||
|
private:
|
||||||
|
// properties
|
||||||
|
QHash<QString, QString> m_pairs;
|
||||||
|
QString m_filePath;
|
||||||
|
QString m_section;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
#endif /* AWABSTRACTPAIRHELPER_H */
|
@ -16,158 +16,23 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "awcustomkeysconfig.h"
|
#include "awcustomkeysconfig.h"
|
||||||
#include "ui_awcustomkeysconfig.h"
|
|
||||||
|
|
||||||
#include <KI18n/KLocalizedString>
|
|
||||||
|
|
||||||
#include <QPushButton>
|
|
||||||
|
|
||||||
#include "awabstractselector.h"
|
|
||||||
#include "awdebug.h"
|
|
||||||
#include "awcustomkeyshelper.h"
|
#include "awcustomkeyshelper.h"
|
||||||
|
#include "awdebug.h"
|
||||||
|
|
||||||
|
|
||||||
AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent, const QStringList &_keys)
|
AWCustomKeysConfig::AWCustomKeysConfig(QWidget *_parent,
|
||||||
: QDialog(_parent)
|
const QStringList &_keys)
|
||||||
, ui(new Ui::AWCustomKeysConfig)
|
: AWAbstractPairConfig(_parent, false, _keys)
|
||||||
, m_keys(_keys)
|
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
ui->setupUi(this);
|
setEditable(true, false);
|
||||||
init();
|
initHelper<AWCustomKeysHelper>();
|
||||||
|
|
||||||
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
|
|
||||||
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AWCustomKeysConfig::~AWCustomKeysConfig()
|
AWCustomKeysConfig::~AWCustomKeysConfig()
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
clearSelectors();
|
|
||||||
|
|
||||||
delete m_helper;
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::showDialog()
|
|
||||||
{
|
|
||||||
// update dialog
|
|
||||||
updateDialog();
|
|
||||||
// exec dialog
|
|
||||||
return execDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::updateUi()
|
|
||||||
{
|
|
||||||
QPair<QString, QString> current
|
|
||||||
= static_cast<AWAbstractSelector *>(sender())->current();
|
|
||||||
int index
|
|
||||||
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
|
|
||||||
|
|
||||||
if ((current.first.isEmpty()) && (current.second.isEmpty())) {
|
|
||||||
// remove current selector if it is empty and does not last
|
|
||||||
if (sender() == m_selectors.last())
|
|
||||||
return;
|
|
||||||
AWAbstractSelector *selector = m_selectors.takeAt(index);
|
|
||||||
ui->verticalLayout->removeWidget(selector);
|
|
||||||
selector->deleteLater();
|
|
||||||
} else {
|
|
||||||
// add new selector if something changed
|
|
||||||
if (sender() != m_selectors.last())
|
|
||||||
return;
|
|
||||||
auto keys = initKeys();
|
|
||||||
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::addSelector(const QStringList &_keys,
|
|
||||||
const QStringList &_values,
|
|
||||||
const QPair<QString, QString> &_current)
|
|
||||||
{
|
|
||||||
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
|
|
||||||
<< "and current ones" << _current;
|
|
||||||
|
|
||||||
AWAbstractSelector *selector
|
|
||||||
= new AWAbstractSelector(ui->scrollAreaWidgetContents, {true, false});
|
|
||||||
selector->init(_keys, _values, _current);
|
|
||||||
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
|
|
||||||
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
|
|
||||||
m_selectors.append(selector);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::clearSelectors()
|
|
||||||
{
|
|
||||||
for (auto &selector : m_selectors) {
|
|
||||||
disconnect(selector, SIGNAL(selectionChanged()), this,
|
|
||||||
SLOT(updateUi()));
|
|
||||||
ui->verticalLayout->removeWidget(selector);
|
|
||||||
selector->deleteLater();
|
|
||||||
}
|
|
||||||
m_selectors.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::execDialog()
|
|
||||||
{
|
|
||||||
int ret = exec();
|
|
||||||
QHash<QString, QString> data;
|
|
||||||
for (auto &selector : m_selectors) {
|
|
||||||
QPair<QString, QString> select = selector->current();
|
|
||||||
if (select.first.isEmpty())
|
|
||||||
continue;
|
|
||||||
data[select.first] = select.second;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save configuration if required
|
|
||||||
switch (ret) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
m_helper->writeItems(data);
|
|
||||||
m_helper->removeUnusedKeys(data.keys());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::init()
|
|
||||||
{
|
|
||||||
delete m_helper;
|
|
||||||
m_helper = new AWCustomKeysHelper(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QPair<QStringList, QStringList> AWCustomKeysConfig::initKeys() const
|
|
||||||
{
|
|
||||||
// we are adding empty string at the start
|
|
||||||
QStringList keys = QStringList() << "";
|
|
||||||
keys.append(m_keys);
|
|
||||||
keys.sort();
|
|
||||||
QStringList userKeys = QStringList() << "";
|
|
||||||
userKeys.append(m_helper->keys());
|
|
||||||
userKeys.sort();
|
|
||||||
|
|
||||||
return QPair<QStringList, QStringList>(userKeys, keys);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysConfig::updateDialog()
|
|
||||||
{
|
|
||||||
clearSelectors();
|
|
||||||
auto userKeys = m_helper->getUserKeys();
|
|
||||||
auto keys = initKeys();
|
|
||||||
|
|
||||||
for (auto &key : userKeys.keys())
|
|
||||||
addSelector(keys.first, keys.second,
|
|
||||||
QPair<QString, QString>(key, userKeys[key]));
|
|
||||||
// empty one
|
|
||||||
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
|
||||||
}
|
}
|
||||||
|
@ -19,17 +19,10 @@
|
|||||||
#ifndef AWCUSTOMKEYSCONFIG_H
|
#ifndef AWCUSTOMKEYSCONFIG_H
|
||||||
#define AWCUSTOMKEYSCONFIG_H
|
#define AWCUSTOMKEYSCONFIG_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include "awabstractpairconfig.h"
|
||||||
|
|
||||||
|
|
||||||
class AWAbstractSelector;
|
class AWCustomKeysConfig : public AWAbstractPairConfig
|
||||||
class AWCustomKeysHelper;
|
|
||||||
namespace Ui
|
|
||||||
{
|
|
||||||
class AWCustomKeysConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AWCustomKeysConfig : public QDialog
|
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -37,25 +30,6 @@ public:
|
|||||||
explicit AWCustomKeysConfig(QWidget *_parent = nullptr,
|
explicit AWCustomKeysConfig(QWidget *_parent = nullptr,
|
||||||
const QStringList &_keys = QStringList());
|
const QStringList &_keys = QStringList());
|
||||||
virtual ~AWCustomKeysConfig();
|
virtual ~AWCustomKeysConfig();
|
||||||
Q_INVOKABLE void showDialog();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void updateUi();
|
|
||||||
|
|
||||||
private:
|
|
||||||
Ui::AWCustomKeysConfig *ui = nullptr;
|
|
||||||
AWCustomKeysHelper *m_helper = nullptr;
|
|
||||||
QList<AWAbstractSelector *> m_selectors;
|
|
||||||
// properties
|
|
||||||
QStringList m_keys;
|
|
||||||
// methods
|
|
||||||
void addSelector(const QStringList &_keys, const QStringList &_values,
|
|
||||||
const QPair<QString, QString> &_current);
|
|
||||||
void clearSelectors();
|
|
||||||
void execDialog();
|
|
||||||
void init();
|
|
||||||
QPair<QStringList, QStringList> initKeys() const;
|
|
||||||
void updateDialog();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -18,19 +18,15 @@
|
|||||||
#include "awcustomkeyshelper.h"
|
#include "awcustomkeyshelper.h"
|
||||||
|
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QSettings>
|
|
||||||
#include <QStandardPaths>
|
|
||||||
|
|
||||||
#include "awdebug.h"
|
#include "awdebug.h"
|
||||||
|
|
||||||
|
|
||||||
AWCustomKeysHelper::AWCustomKeysHelper(QObject *_parent)
|
AWCustomKeysHelper::AWCustomKeysHelper(QObject *_parent)
|
||||||
: QObject(_parent)
|
: QObject(_parent)
|
||||||
|
, AWAbstractPairHelper("awesomewidgets/custom.ini", "Custom")
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
m_filePath = "awesomewidgets/custom.ini";
|
|
||||||
initItems();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -40,120 +36,43 @@ AWCustomKeysHelper::~AWCustomKeysHelper()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void AWCustomKeysHelper::initItems()
|
|
||||||
{
|
|
||||||
m_keys.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("Custom");
|
|
||||||
QStringList keys = settings.childKeys();
|
|
||||||
for (auto &key : keys) {
|
|
||||||
QString source = settings.value(key).toString();
|
|
||||||
qCInfo(LOG_AW) << "Found custom key" << key << "for source"
|
|
||||||
<< source << "in" << settings.fileName();
|
|
||||||
if (source.isEmpty()) {
|
|
||||||
qCInfo(LOG_AW) << "Skip empty source for" << key;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
m_keys[key] = source;
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AWCustomKeysHelper::writeItems(
|
|
||||||
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("Custom");
|
|
||||||
for (auto &key : _configuration.keys())
|
|
||||||
settings.setValue(key, _configuration[key]);
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
settings.sync();
|
|
||||||
|
|
||||||
return (settings.status() == QSettings::NoError);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool AWCustomKeysHelper::removeUnusedKeys(const QStringList &_keys) const
|
|
||||||
{
|
|
||||||
qCDebug(LOG_AW) << "Remove keys" << _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("Custom");
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QHash<QString, QString> AWCustomKeysHelper::getUserKeys() const
|
|
||||||
{
|
|
||||||
return m_keys;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QStringList AWCustomKeysHelper::keys() const
|
|
||||||
{
|
|
||||||
return m_keys.keys();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QString AWCustomKeysHelper::source(const QString &_key) const
|
QString AWCustomKeysHelper::source(const QString &_key) const
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << "Get source by key" << _key;
|
qCDebug(LOG_AW) << "Get source by key" << _key;
|
||||||
|
|
||||||
return m_keys[_key];
|
return pairs()[_key];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QStringList AWCustomKeysHelper::sources() const
|
QStringList AWCustomKeysHelper::sources() const
|
||||||
{
|
{
|
||||||
return QSet<QString>::fromList(m_keys.values()).toList();
|
return QSet<QString>::fromList(values()).toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QStringList AWCustomKeysHelper::refinedSources() const
|
QStringList AWCustomKeysHelper::refinedSources() const
|
||||||
{
|
{
|
||||||
auto allSources = QSet<QString>::fromList(m_keys.values());
|
auto allSources = QSet<QString>::fromList(pairs().values());
|
||||||
QSet<QString> output;
|
QSet<QString> output;
|
||||||
|
|
||||||
while (output != allSources) {
|
while (output != allSources) {
|
||||||
output.clear();
|
output.clear();
|
||||||
for (auto &src : allSources)
|
for (auto &src : allSources)
|
||||||
output.insert(m_keys.contains(src) ? source(src) : src);
|
output.insert(pairs().contains(src) ? source(src) : src);
|
||||||
allSources = output;
|
allSources = output;
|
||||||
}
|
}
|
||||||
|
|
||||||
return output.toList();
|
return output.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QStringList AWCustomKeysHelper::leftKeys()
|
||||||
|
{
|
||||||
|
return keys();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QStringList AWCustomKeysHelper::rightKeys()
|
||||||
|
{
|
||||||
|
return QStringList();
|
||||||
|
}
|
||||||
|
@ -22,29 +22,26 @@
|
|||||||
#include <QHash>
|
#include <QHash>
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
|
|
||||||
|
#include "awabstractpairhelper.h"
|
||||||
|
|
||||||
class AWCustomKeysHelper : public QObject
|
|
||||||
|
class AWCustomKeysHelper : public QObject, public AWAbstractPairHelper
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit AWCustomKeysHelper(QObject *_parent = nullptr);
|
explicit AWCustomKeysHelper(QObject *_parent = nullptr);
|
||||||
virtual ~AWCustomKeysHelper();
|
virtual ~AWCustomKeysHelper();
|
||||||
// read-write methods
|
|
||||||
void initItems();
|
|
||||||
bool writeItems(const QHash<QString, QString> &_configuration) const;
|
|
||||||
bool removeUnusedKeys(const QStringList &_keys) const;
|
|
||||||
// get
|
// get
|
||||||
QHash<QString, QString> getUserKeys() const;
|
|
||||||
QStringList keys() const;
|
|
||||||
QString source(const QString &_key) const;
|
QString source(const QString &_key) const;
|
||||||
QStringList sources() const;
|
QStringList sources() const;
|
||||||
QStringList refinedSources() const;
|
QStringList refinedSources() const;
|
||||||
|
// configuration related
|
||||||
|
virtual void editPairs(){};
|
||||||
|
virtual QStringList leftKeys();
|
||||||
|
virtual QStringList rightKeys();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
// properties
|
|
||||||
QString m_filePath;
|
|
||||||
QHash<QString, QString> m_keys;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -16,168 +16,22 @@
|
|||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
#include "awformatterconfig.h"
|
#include "awformatterconfig.h"
|
||||||
#include "ui_awformatterconfig.h"
|
|
||||||
|
|
||||||
#include <KI18n/KLocalizedString>
|
|
||||||
|
|
||||||
#include <QPushButton>
|
|
||||||
|
|
||||||
#include "awabstractselector.h"
|
|
||||||
#include "awdebug.h"
|
#include "awdebug.h"
|
||||||
#include "awformatterhelper.h"
|
#include "awformatterhelper.h"
|
||||||
|
|
||||||
|
|
||||||
AWFormatterConfig::AWFormatterConfig(QWidget *_parent, const QStringList &_keys)
|
AWFormatterConfig::AWFormatterConfig(QWidget *_parent, const QStringList &_keys)
|
||||||
: QDialog(_parent)
|
: AWAbstractPairConfig(_parent, true, _keys)
|
||||||
, ui(new Ui::AWFormatterConfig)
|
|
||||||
, m_keys(_keys)
|
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
ui->setupUi(this);
|
setEditable(false, false);
|
||||||
m_editButton
|
initHelper<AWFormatterHelper>();
|
||||||
= ui->buttonBox->addButton(i18n("Edit"), QDialogButtonBox::ActionRole);
|
|
||||||
init();
|
|
||||||
|
|
||||||
connect(ui->buttonBox, SIGNAL(accepted()), this, SLOT(accept()));
|
|
||||||
connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject()));
|
|
||||||
connect(m_editButton, SIGNAL(clicked(bool)), this, SLOT(editFormatters()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
AWFormatterConfig::~AWFormatterConfig()
|
AWFormatterConfig::~AWFormatterConfig()
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
clearSelectors();
|
|
||||||
|
|
||||||
delete m_helper;
|
|
||||||
delete ui;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::showDialog()
|
|
||||||
{
|
|
||||||
// update dialog
|
|
||||||
updateDialog();
|
|
||||||
// exec dialog
|
|
||||||
return execDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::editFormatters()
|
|
||||||
{
|
|
||||||
m_helper->editItems();
|
|
||||||
updateDialog();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::updateUi()
|
|
||||||
{
|
|
||||||
QPair<QString, QString> current
|
|
||||||
= static_cast<AWAbstractSelector *>(sender())->current();
|
|
||||||
int index
|
|
||||||
= m_selectors.indexOf(static_cast<AWAbstractSelector *>(sender()));
|
|
||||||
|
|
||||||
if ((current.first.isEmpty()) && (current.second.isEmpty())) {
|
|
||||||
// remove current selector if it is empty and does not last
|
|
||||||
if (sender() == m_selectors.last())
|
|
||||||
return;
|
|
||||||
AWAbstractSelector *selector = m_selectors.takeAt(index);
|
|
||||||
ui->verticalLayout->removeWidget(selector);
|
|
||||||
selector->deleteLater();
|
|
||||||
} else {
|
|
||||||
// add new selector if something changed
|
|
||||||
if (sender() != m_selectors.last())
|
|
||||||
return;
|
|
||||||
auto keys = initKeys();
|
|
||||||
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::addSelector(const QStringList &_keys,
|
|
||||||
const QStringList &_values,
|
|
||||||
const QPair<QString, QString> &_current)
|
|
||||||
{
|
|
||||||
qCDebug(LOG_AW) << "Add selector with keys" << _keys << "values" << _values
|
|
||||||
<< "and current ones" << _current;
|
|
||||||
|
|
||||||
AWAbstractSelector *selector
|
|
||||||
= new AWAbstractSelector(ui->scrollAreaWidgetContents);
|
|
||||||
selector->init(_keys, _values, _current);
|
|
||||||
ui->verticalLayout->insertWidget(ui->verticalLayout->count() - 1, selector);
|
|
||||||
connect(selector, SIGNAL(selectionChanged()), this, SLOT(updateUi()));
|
|
||||||
m_selectors.append(selector);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::clearSelectors()
|
|
||||||
{
|
|
||||||
for (auto &selector : m_selectors) {
|
|
||||||
disconnect(selector, SIGNAL(selectionChanged()), this,
|
|
||||||
SLOT(updateUi()));
|
|
||||||
ui->verticalLayout->removeWidget(selector);
|
|
||||||
selector->deleteLater();
|
|
||||||
}
|
|
||||||
m_selectors.clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::execDialog()
|
|
||||||
{
|
|
||||||
int ret = exec();
|
|
||||||
QHash<QString, QString> data;
|
|
||||||
for (auto &selector : m_selectors) {
|
|
||||||
QPair<QString, QString> select = selector->current();
|
|
||||||
if (select.first.isEmpty())
|
|
||||||
continue;
|
|
||||||
data[select.first] = select.second;
|
|
||||||
}
|
|
||||||
|
|
||||||
// save configuration if required
|
|
||||||
switch (ret) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
default:
|
|
||||||
m_helper->writeItems(data);
|
|
||||||
m_helper->removeUnusedFormatters(data.keys());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::init()
|
|
||||||
{
|
|
||||||
delete m_helper;
|
|
||||||
m_helper = new AWFormatterHelper(this);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QPair<QStringList, QStringList> AWFormatterConfig::initKeys() const
|
|
||||||
{
|
|
||||||
// we are adding empty string at the start
|
|
||||||
QStringList keys = QStringList() << "";
|
|
||||||
keys.append(m_keys);
|
|
||||||
keys.sort();
|
|
||||||
QStringList knownFormatters = QStringList() << "";
|
|
||||||
knownFormatters.append(m_helper->knownFormatters());
|
|
||||||
knownFormatters.sort();
|
|
||||||
|
|
||||||
return QPair<QStringList, QStringList>(keys, knownFormatters);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void AWFormatterConfig::updateDialog()
|
|
||||||
{
|
|
||||||
clearSelectors();
|
|
||||||
QHash<QString, QString> appliedFormatters = m_helper->getFormatters();
|
|
||||||
auto keys = initKeys();
|
|
||||||
|
|
||||||
for (auto &key : appliedFormatters.keys())
|
|
||||||
addSelector(keys.first, keys.second,
|
|
||||||
QPair<QString, QString>(key, appliedFormatters[key]));
|
|
||||||
// empty one
|
|
||||||
addSelector(keys.first, keys.second, QPair<QString, QString>());
|
|
||||||
}
|
}
|
||||||
|
@ -19,17 +19,10 @@
|
|||||||
#ifndef AWFORMATTERCONFIG_H
|
#ifndef AWFORMATTERCONFIG_H
|
||||||
#define AWFORMATTERCONFIG_H
|
#define AWFORMATTERCONFIG_H
|
||||||
|
|
||||||
#include <QDialog>
|
#include "awabstractpairconfig.h"
|
||||||
|
|
||||||
|
|
||||||
class AWAbstractSelector;
|
class AWFormatterConfig : public AWAbstractPairConfig
|
||||||
class AWFormatterHelper;
|
|
||||||
namespace Ui
|
|
||||||
{
|
|
||||||
class AWFormatterConfig;
|
|
||||||
}
|
|
||||||
|
|
||||||
class AWFormatterConfig : public QDialog
|
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -37,27 +30,6 @@ public:
|
|||||||
explicit AWFormatterConfig(QWidget *_parent = nullptr,
|
explicit AWFormatterConfig(QWidget *_parent = nullptr,
|
||||||
const QStringList &_keys = QStringList());
|
const QStringList &_keys = QStringList());
|
||||||
virtual ~AWFormatterConfig();
|
virtual ~AWFormatterConfig();
|
||||||
Q_INVOKABLE void showDialog();
|
|
||||||
|
|
||||||
private slots:
|
|
||||||
void editFormatters();
|
|
||||||
void updateUi();
|
|
||||||
|
|
||||||
private:
|
|
||||||
QPushButton *m_editButton = nullptr;
|
|
||||||
Ui::AWFormatterConfig *ui = nullptr;
|
|
||||||
AWFormatterHelper *m_helper = nullptr;
|
|
||||||
QList<AWAbstractSelector *> m_selectors;
|
|
||||||
// properties
|
|
||||||
QStringList m_keys;
|
|
||||||
// methods
|
|
||||||
void addSelector(const QStringList &_keys, const QStringList &_values,
|
|
||||||
const QPair<QString, QString> &_current);
|
|
||||||
void clearSelectors();
|
|
||||||
void execDialog();
|
|
||||||
void init();
|
|
||||||
QPair<QStringList, QStringList> initKeys() const;
|
|
||||||
void updateDialog();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,93 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<ui version="4.0">
|
|
||||||
<class>AWFormatterConfig</class>
|
|
||||||
<widget class="QDialog" name="AWFormatterConfig">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>400</width>
|
|
||||||
<height>300</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout_2">
|
|
||||||
<item>
|
|
||||||
<widget class="QScrollArea" name="scrollArea">
|
|
||||||
<property name="widgetResizable">
|
|
||||||
<bool>true</bool>
|
|
||||||
</property>
|
|
||||||
<widget class="QWidget" name="scrollAreaWidgetContents">
|
|
||||||
<property name="geometry">
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>0</y>
|
|
||||||
<width>384</width>
|
|
||||||
<height>249</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" name="verticalLayout">
|
|
||||||
<item>
|
|
||||||
<spacer name="verticalSpacer">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Vertical</enum>
|
|
||||||
</property>
|
|
||||||
<property name="sizeHint" stdset="0">
|
|
||||||
<size>
|
|
||||||
<width>20</width>
|
|
||||||
<height>40</height>
|
|
||||||
</size>
|
|
||||||
</property>
|
|
||||||
</spacer>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
<item>
|
|
||||||
<widget class="QDialogButtonBox" name="buttonBox">
|
|
||||||
<property name="orientation">
|
|
||||||
<enum>Qt::Horizontal</enum>
|
|
||||||
</property>
|
|
||||||
<property name="standardButtons">
|
|
||||||
<set>QDialogButtonBox::Close|QDialogButtonBox::Ok</set>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
</item>
|
|
||||||
</layout>
|
|
||||||
</widget>
|
|
||||||
<resources/>
|
|
||||||
<connections>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>accepted()</signal>
|
|
||||||
<receiver>AWFormatterConfig</receiver>
|
|
||||||
<slot>accept()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>248</x>
|
|
||||||
<y>254</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>157</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
<connection>
|
|
||||||
<sender>buttonBox</sender>
|
|
||||||
<signal>rejected()</signal>
|
|
||||||
<receiver>AWFormatterConfig</receiver>
|
|
||||||
<slot>reject()</slot>
|
|
||||||
<hints>
|
|
||||||
<hint type="sourcelabel">
|
|
||||||
<x>316</x>
|
|
||||||
<y>260</y>
|
|
||||||
</hint>
|
|
||||||
<hint type="destinationlabel">
|
|
||||||
<x>286</x>
|
|
||||||
<y>274</y>
|
|
||||||
</hint>
|
|
||||||
</hints>
|
|
||||||
</connection>
|
|
||||||
</connections>
|
|
||||||
</ui>
|
|
@ -17,9 +17,9 @@
|
|||||||
|
|
||||||
#include "awformatterconfigfactory.h"
|
#include "awformatterconfigfactory.h"
|
||||||
|
|
||||||
|
#include "awcustomkeysconfig.h"
|
||||||
#include "awdebug.h"
|
#include "awdebug.h"
|
||||||
#include "awformatterconfig.h"
|
#include "awformatterconfig.h"
|
||||||
#include "awcustomkeysconfig.h"
|
|
||||||
|
|
||||||
|
|
||||||
AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *_parent)
|
AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *_parent)
|
||||||
|
@ -35,10 +35,11 @@
|
|||||||
|
|
||||||
AWFormatterHelper::AWFormatterHelper(QWidget *_parent)
|
AWFormatterHelper::AWFormatterHelper(QWidget *_parent)
|
||||||
: AbstractExtItemAggregator(_parent, "formatters")
|
: AbstractExtItemAggregator(_parent, "formatters")
|
||||||
|
, AWAbstractPairHelper("awesomewidgets/formatters/formatters.ini",
|
||||||
|
"Formatters")
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_AW) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
m_filePath = "awesomewidgets/formatters/formatters.ini";
|
|
||||||
initItems();
|
initItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,32 +55,21 @@ AWFormatterHelper::~AWFormatterHelper()
|
|||||||
|
|
||||||
void AWFormatterHelper::initItems()
|
void AWFormatterHelper::initItems()
|
||||||
{
|
{
|
||||||
installDirectories();
|
|
||||||
initFormatters();
|
initFormatters();
|
||||||
initKeys();
|
AWAbstractPairHelper::initItems();
|
||||||
}
|
|
||||||
|
|
||||||
|
// assign internal storage
|
||||||
|
m_formatters.clear();
|
||||||
|
for (auto &key : pairs().keys()) {
|
||||||
|
auto name = pairs()[key];
|
||||||
|
if (!m_formattersClasses.contains(name)) {
|
||||||
|
qCWarning(LOG_AW)
|
||||||
|
<< "Invalid formatter" << name << "found in" << key;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
bool AWFormatterHelper::writeItems(
|
m_formatters[key] = m_formattersClasses[name];
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -99,16 +89,6 @@ QStringList AWFormatterHelper::definedFormatters() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QHash<QString, QString> AWFormatterHelper::getFormatters() const
|
|
||||||
{
|
|
||||||
QHash<QString, QString> map;
|
|
||||||
for (auto &tag : m_formatters.keys())
|
|
||||||
map[tag] = m_formatters[tag]->name();
|
|
||||||
|
|
||||||
return map;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
QList<AbstractExtItem *> AWFormatterHelper::items() const
|
QList<AbstractExtItem *> AWFormatterHelper::items() const
|
||||||
{
|
{
|
||||||
QList<AbstractExtItem *> converted;
|
QList<AbstractExtItem *> converted;
|
||||||
@ -119,35 +99,21 @@ QList<AbstractExtItem *> AWFormatterHelper::items() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
QStringList AWFormatterHelper::knownFormatters() const
|
void AWFormatterHelper::editPairs()
|
||||||
{
|
{
|
||||||
return m_formattersClasses.keys();
|
return editItems();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool AWFormatterHelper::removeUnusedFormatters(const QStringList &_keys) const
|
QStringList AWFormatterHelper::leftKeys()
|
||||||
{
|
{
|
||||||
qCDebug(LOG_AW) << "Remove formatters" << _keys;
|
return QStringList();
|
||||||
|
}
|
||||||
|
|
||||||
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 AWFormatterHelper::rightKeys()
|
||||||
QStringList foundKeys = settings.childKeys();
|
{
|
||||||
for (auto &key : foundKeys) {
|
return m_formattersClasses.keys();
|
||||||
if (_keys.contains(key))
|
|
||||||
continue;
|
|
||||||
settings.remove(key);
|
|
||||||
}
|
|
||||||
settings.endGroup();
|
|
||||||
|
|
||||||
settings.sync();
|
|
||||||
|
|
||||||
return (settings.status() == QSettings::NoError);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -191,47 +157,52 @@ void AWFormatterHelper::initFormatters()
|
|||||||
{
|
{
|
||||||
m_formattersClasses.clear();
|
m_formattersClasses.clear();
|
||||||
|
|
||||||
for (int i = m_directories.count() - 1; i >= 0; i--) {
|
auto dirs = directories();
|
||||||
QStringList files
|
for (auto &dir : dirs) {
|
||||||
= QDir(m_directories.at(i)).entryList(QDir::Files, QDir::Name);
|
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
|
||||||
for (auto &file : files) {
|
for (auto &file : files) {
|
||||||
|
// check filename
|
||||||
if (!file.endsWith(".desktop"))
|
if (!file.endsWith(".desktop"))
|
||||||
continue;
|
continue;
|
||||||
qCInfo(LOG_AW) << "Found file" << file << "in"
|
qCInfo(LOG_AW) << "Found file" << file << "in" << dir;
|
||||||
<< m_directories.at(i);
|
QString filePath = QString("%1/%2").arg(dir).arg(file);
|
||||||
QString filePath
|
// check if already exists
|
||||||
= QString("%1/%2").arg(m_directories.at(i)).arg(file);
|
auto values = m_formattersClasses.values();
|
||||||
auto metadata = readMetadata(filePath);
|
if (std::any_of(values.cbegin(), values.cend(),
|
||||||
QString name = metadata.first;
|
[&filePath](const AWAbstractFormatter *item) {
|
||||||
if (m_formattersClasses.contains(name))
|
return (item->fileName() == filePath);
|
||||||
|
}))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
auto metadata = readMetadata(filePath);
|
||||||
switch (metadata.second) {
|
switch (metadata.second) {
|
||||||
case AWAbstractFormatter::FormatterClass::DateTime:
|
case AWAbstractFormatter::FormatterClass::DateTime:
|
||||||
m_formattersClasses[name]
|
m_formattersClasses[metadata.first]
|
||||||
= new AWDateTimeFormatter(this, filePath);
|
= new AWDateTimeFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::Float:
|
case AWAbstractFormatter::FormatterClass::Float:
|
||||||
m_formattersClasses[name]
|
m_formattersClasses[metadata.first]
|
||||||
= new AWFloatFormatter(this, filePath);
|
= new AWFloatFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::List:
|
case AWAbstractFormatter::FormatterClass::List:
|
||||||
m_formattersClasses[name] = new AWListFormatter(this, filePath);
|
m_formattersClasses[metadata.first]
|
||||||
|
= new AWListFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::Script:
|
case AWAbstractFormatter::FormatterClass::Script:
|
||||||
m_formattersClasses[name]
|
m_formattersClasses[metadata.first]
|
||||||
= new AWScriptFormatter(this, filePath);
|
= new AWScriptFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::String:
|
case AWAbstractFormatter::FormatterClass::String:
|
||||||
m_formattersClasses[name]
|
m_formattersClasses[metadata.first]
|
||||||
= new AWStringFormatter(this, filePath);
|
= new AWStringFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::Json:
|
case AWAbstractFormatter::FormatterClass::Json:
|
||||||
m_formattersClasses[name] = new AWJsonFormatter(this, filePath);
|
m_formattersClasses[metadata.first]
|
||||||
|
= new AWJsonFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
case AWAbstractFormatter::FormatterClass::NoFormat:
|
case AWAbstractFormatter::FormatterClass::NoFormat:
|
||||||
m_formattersClasses[name] = new AWNoFormatter(this, filePath);
|
m_formattersClasses[metadata.first]
|
||||||
|
= new AWNoFormatter(this, filePath);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -239,55 +210,6 @@ void AWFormatterHelper::initFormatters()
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
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>
|
QPair<QString, AWAbstractFormatter::FormatterClass>
|
||||||
AWFormatterHelper::readMetadata(const QString &_filePath) const
|
AWFormatterHelper::readMetadata(const QString &_filePath) const
|
||||||
{
|
{
|
||||||
@ -306,13 +228,8 @@ AWFormatterHelper::readMetadata(const QString &_filePath) const
|
|||||||
|
|
||||||
void AWFormatterHelper::doCreateItem()
|
void AWFormatterHelper::doCreateItem()
|
||||||
{
|
{
|
||||||
QStringList selection = QStringList() << "NoFormat"
|
QStringList selection
|
||||||
<< "DateTime"
|
= {"NoFormat", "DateTime", "Float", "List", "Script", "String", "Json"};
|
||||||
<< "Float"
|
|
||||||
<< "List"
|
|
||||||
<< "Script"
|
|
||||||
<< "String"
|
|
||||||
<< "Json";
|
|
||||||
bool ok;
|
bool ok;
|
||||||
QString select = QInputDialog::getItem(
|
QString select = QInputDialog::getItem(
|
||||||
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
|
this, i18n("Select type"), i18n("Type:"), selection, 0, false, &ok);
|
||||||
|
@ -20,11 +20,12 @@
|
|||||||
#define AWFORMATTERHELPER_H
|
#define AWFORMATTERHELPER_H
|
||||||
|
|
||||||
#include "abstractextitemaggregator.h"
|
#include "abstractextitemaggregator.h"
|
||||||
|
|
||||||
#include "awabstractformatter.h"
|
#include "awabstractformatter.h"
|
||||||
|
#include "awabstractpairhelper.h"
|
||||||
|
|
||||||
|
|
||||||
class AWFormatterHelper : public AbstractExtItemAggregator
|
class AWFormatterHelper : public AbstractExtItemAggregator,
|
||||||
|
public AWAbstractPairHelper
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
@ -33,14 +34,14 @@ public:
|
|||||||
virtual ~AWFormatterHelper();
|
virtual ~AWFormatterHelper();
|
||||||
// read-write methods
|
// read-write methods
|
||||||
void initItems();
|
void initItems();
|
||||||
bool writeItems(const QHash<QString, QString> &_configuration) const;
|
|
||||||
// methods
|
// methods
|
||||||
QString convert(const QVariant &_value, const QString &_name) const;
|
QString convert(const QVariant &_value, const QString &_name) const;
|
||||||
QStringList definedFormatters() const;
|
QStringList definedFormatters() const;
|
||||||
QHash<QString, QString> getFormatters() const;
|
|
||||||
QList<AbstractExtItem *> items() const;
|
QList<AbstractExtItem *> items() const;
|
||||||
QStringList knownFormatters() const;
|
// configuration related
|
||||||
bool removeUnusedFormatters(const QStringList &_keys) const;
|
virtual void editPairs();
|
||||||
|
virtual QStringList leftKeys();
|
||||||
|
virtual QStringList rightKeys();
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void editItems();
|
void editItems();
|
||||||
@ -50,15 +51,11 @@ private:
|
|||||||
AWAbstractFormatter::FormatterClass
|
AWAbstractFormatter::FormatterClass
|
||||||
defineFormatterClass(const QString &_stringType) const;
|
defineFormatterClass(const QString &_stringType) const;
|
||||||
void initFormatters();
|
void initFormatters();
|
||||||
void initKeys();
|
|
||||||
void installDirectories();
|
|
||||||
QPair<QString, AWAbstractFormatter::FormatterClass>
|
QPair<QString, AWAbstractFormatter::FormatterClass>
|
||||||
readMetadata(const QString &_filePath) const;
|
readMetadata(const QString &_filePath) const;
|
||||||
// parent methods
|
// parent methods
|
||||||
void doCreateItem();
|
void doCreateItem();
|
||||||
// properties
|
// properties
|
||||||
QStringList m_directories;
|
|
||||||
QString m_filePath;
|
|
||||||
QHash<QString, AWAbstractFormatter *> m_formatters;
|
QHash<QString, AWAbstractFormatter *> m_formatters;
|
||||||
QHash<QString, AWAbstractFormatter *> m_formattersClasses;
|
QHash<QString, AWAbstractFormatter *> m_formattersClasses;
|
||||||
};
|
};
|
||||||
|
@ -161,6 +161,9 @@ QStringList AWKeys::dictKeys(const bool _sorted, const QString &_regexp) const
|
|||||||
// check if functions asked
|
// check if functions asked
|
||||||
if (_regexp == "functions")
|
if (_regexp == "functions")
|
||||||
return QString(STATIC_FUNCTIONS).split(',');
|
return QString(STATIC_FUNCTIONS).split(',');
|
||||||
|
// check if user defined keys asked
|
||||||
|
if (_regexp == "userdefined")
|
||||||
|
return m_keyOperator->userKeys();
|
||||||
|
|
||||||
QStringList allKeys = m_keyOperator->dictKeys();
|
QStringList allKeys = m_keyOperator->dictKeys();
|
||||||
// sort if required
|
// sort if required
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
|
|
||||||
#include <KI18n/KLocalizedString>
|
#include <KI18n/KLocalizedString>
|
||||||
|
|
||||||
|
#include <QDir>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include <QInputDialog>
|
#include <QInputDialog>
|
||||||
#include <QPushButton>
|
#include <QPushButton>
|
||||||
@ -33,6 +34,15 @@ AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *_parent,
|
|||||||
{
|
{
|
||||||
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
|
qCDebug(LOG_LIB) << __PRETTY_FUNCTION__;
|
||||||
|
|
||||||
|
// create directory at $HOME
|
||||||
|
QString localDir = QString("%1/awesomewidgets/%2")
|
||||||
|
.arg(QStandardPaths::writableLocation(
|
||||||
|
QStandardPaths::GenericDataLocation))
|
||||||
|
.arg(type());
|
||||||
|
QDir localDirectory;
|
||||||
|
if (localDirectory.mkpath(localDir))
|
||||||
|
qCInfo(LOG_LIB) << "Created directory" << localDir;
|
||||||
|
|
||||||
ui->setupUi(this);
|
ui->setupUi(this);
|
||||||
copyButton
|
copyButton
|
||||||
= ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
|
= ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole);
|
||||||
@ -182,6 +192,17 @@ QVariant AbstractExtItemAggregator::configArgs() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
QStringList AbstractExtItemAggregator::directories() const
|
||||||
|
{
|
||||||
|
auto dirs
|
||||||
|
= QStandardPaths::locateAll(QStandardPaths::GenericDataLocation,
|
||||||
|
QString("awesomewidgets/%1").arg(type()),
|
||||||
|
QStandardPaths::LocateDirectory);
|
||||||
|
|
||||||
|
return dirs;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
QString AbstractExtItemAggregator::type() const
|
QString AbstractExtItemAggregator::type() const
|
||||||
{
|
{
|
||||||
return m_type;
|
return m_type;
|
||||||
|
@ -73,6 +73,7 @@ public:
|
|||||||
int uniqNumber() const;
|
int uniqNumber() const;
|
||||||
// get methods
|
// get methods
|
||||||
QVariant configArgs() const;
|
QVariant configArgs() const;
|
||||||
|
QStringList directories() const;
|
||||||
virtual QList<AbstractExtItem *> items() const = 0;
|
virtual QList<AbstractExtItem *> items() const = 0;
|
||||||
QString type() const;
|
QString type() const;
|
||||||
// set methods
|
// set methods
|
||||||
|
@ -127,29 +127,23 @@ private:
|
|||||||
|
|
||||||
QList<AbstractExtItem *> getItems()
|
QList<AbstractExtItem *> getItems()
|
||||||
{
|
{
|
||||||
// create directory at $HOME
|
|
||||||
QString localDir = QString("%1/awesomewidgets/%2")
|
|
||||||
.arg(QStandardPaths::writableLocation(
|
|
||||||
QStandardPaths::GenericDataLocation))
|
|
||||||
.arg(type());
|
|
||||||
QDir localDirectory;
|
|
||||||
if (localDirectory.mkpath(localDir))
|
|
||||||
qCInfo(LOG_LIB) << "Created directory" << localDir;
|
|
||||||
|
|
||||||
QStringList dirs = QStandardPaths::locateAll(
|
|
||||||
QStandardPaths::GenericDataLocation,
|
|
||||||
QString("awesomewidgets/%1").arg(type()),
|
|
||||||
QStandardPaths::LocateDirectory);
|
|
||||||
QStringList names;
|
|
||||||
QList<AbstractExtItem *> items;
|
QList<AbstractExtItem *> items;
|
||||||
|
|
||||||
|
auto dirs = directories();
|
||||||
for (auto &dir : dirs) {
|
for (auto &dir : dirs) {
|
||||||
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
|
QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name);
|
||||||
for (auto &file : files) {
|
for (auto &file : files) {
|
||||||
if ((!file.endsWith(".desktop")) || (names.contains(file)))
|
// check filename
|
||||||
|
if (!file.endsWith(".desktop"))
|
||||||
continue;
|
continue;
|
||||||
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
|
qCInfo(LOG_LIB) << "Found file" << file << "in" << dir;
|
||||||
names.append(file);
|
|
||||||
QString filePath = QString("%1/%2").arg(dir).arg(file);
|
QString filePath = QString("%1/%2").arg(dir).arg(file);
|
||||||
|
// check if already exists
|
||||||
|
if (std::any_of(items.cbegin(), items.cend(),
|
||||||
|
[&filePath](AbstractExtItem *item) {
|
||||||
|
return (item->fileName() == filePath);
|
||||||
|
}))
|
||||||
|
continue;
|
||||||
items.append(new T(this, filePath));
|
items.append(new T(this, filePath));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -70,6 +70,10 @@ QtObject {
|
|||||||
"label": i18n("Network"),
|
"label": i18n("Network"),
|
||||||
"regexp": "^(netdev|(down|up(?!time)).*)"
|
"regexp": "^(netdev|(down|up(?!time)).*)"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": i18n("Network request"),
|
||||||
|
"regexp": "^response.*"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"label": i18n("Music player"),
|
"label": i18n("Music player"),
|
||||||
"regexp": "(^|d|s)(album|artist|duration|progress|title)"
|
"regexp": "(^|d|s)(album|artist|duration|progress|title)"
|
||||||
@ -97,6 +101,10 @@ QtObject {
|
|||||||
{
|
{
|
||||||
"label": i18n("Functions"),
|
"label": i18n("Functions"),
|
||||||
"regexp": "functions"
|
"regexp": "functions"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"label": i18n("User defined"),
|
||||||
|
"regexp": "userdefined"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
property variant dpTagRegexp: [
|
property variant dpTagRegexp: [
|
||||||
|
@ -42,7 +42,8 @@ foreach (TEST_MODULE ${TEST_MODULES})
|
|||||||
elseif (TEST_MODULE MATCHES "awkeycache")
|
elseif (TEST_MODULE MATCHES "awkeycache")
|
||||||
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeycache.cpp)
|
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeycache.cpp)
|
||||||
elseif (TEST_MODULE MATCHES "awkeys")
|
elseif (TEST_MODULE MATCHES "awkeys")
|
||||||
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awactions.cpp
|
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awabstractpairhelper.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awactions.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awcustomkeyshelper.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awcustomkeyshelper.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataaggregator.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataaggregator.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataengineaggregator.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awdataengineaggregator.cpp
|
||||||
@ -56,7 +57,8 @@ foreach (TEST_MODULE ${TEST_MODULES})
|
|||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awupdatehelper.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awupdatehelper.cpp
|
||||||
${PROJECT_TRDPARTY_DIR}/fontdialog/fontdialog.cpp)
|
${PROJECT_TRDPARTY_DIR}/fontdialog/fontdialog.cpp)
|
||||||
elseif (TEST_MODULE MATCHES "awpatternfunctions")
|
elseif (TEST_MODULE MATCHES "awpatternfunctions")
|
||||||
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awformatterhelper.cpp
|
set(${TEST_MODULE}_SOURCES ${${TEST_MODULE}_SOURCES} ${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awabstractpairhelper.cpp
|
||||||
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awformatterhelper.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeysaggregator.cpp
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awkeysaggregator.cpp
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awpatternfunctions.cpp)
|
${CMAKE_CURRENT_SOURCE_DIR}/../awesome-widget/plugin/awpatternfunctions.cpp)
|
||||||
elseif (TEST_MODULE MATCHES "awtelemetryhandler")
|
elseif (TEST_MODULE MATCHES "awtelemetryhandler")
|
||||||
|
Loading…
Reference in New Issue
Block a user