diff --git a/patches/fix-dbus-calls.patch b/patches/fix-dbus-calls.patch new file mode 100644 index 0000000..8ffe473 --- /dev/null +++ b/patches/fix-dbus-calls.patch @@ -0,0 +1,89 @@ +diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp +index 69934c4..a48b8e7 100644 +--- a/sources/extsysmon/extsysmon.cpp ++++ b/sources/extsysmon/extsysmon.cpp +@@ -74,7 +74,10 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source) + qCDebug(LOG_ESM) << "Source" << source; + + if (aggregator->hasSource(source)) { +- setData(source, QString("value"), aggregator->data(source)); ++ QVariant data = aggregator->data(source); ++ if (data.isNull()) ++ return false; ++ setData(source, QString("value"), data); + } else { + qCWarning(LOG_ESM) << "Unknown source" << source; + return false; +diff --git a/sources/extsysmon/sources/playersource.cpp b/sources/extsysmon/sources/playersource.cpp +index 769ed9d..c51511c 100644 +--- a/sources/extsysmon/sources/playersource.cpp ++++ b/sources/extsysmon/sources/playersource.cpp +@@ -164,12 +164,16 @@ void PlayerSource::run() + QHash data = getPlayerMpdInfo(m_mpdAddress); + for (auto key : data.keys()) + m_values[key] = data[key]; + } else if (m_player == QString("mpris")) { + // players which supports mpris +- QString mpris = m_mpris == QString("auto") ? getAutoMpris() : m_mpris; +- QHash data = getPlayerMprisInfo(mpris); +- for (auto key : data.keys()) +- m_values[key] = data[key]; ++ if (m_dbusMutex.tryLock()) { ++ QString mpris ++ = m_mpris == QString("auto") ? getAutoMpris() : m_mpris; ++ QHash data = getPlayerMprisInfo(mpris); ++ for (auto key : data.keys()) ++ m_values[key] = data[key]; ++ m_dbusMutex.unlock(); ++ } + } + + // dymanic properties +@@ -258,7 +262,7 @@ QVariantHash PlayerSource::defaultInfo() const + QString PlayerSource::getAutoMpris() const + { + QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call( +- QDBus::BlockWithGui, QString("ListNames")); ++ QDBus::BlockWithGui, QString("ListNames"), DBUS_CALL_TIMEOUT); + if (listServices.arguments().isEmpty()) + return QString(); + QStringList arguments = listServices.arguments().first().toStringList(); +@@ -315,7 +319,8 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const + QString("org.mpris.MediaPlayer2.%1").arg(mpris), + QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get")); + request.setArguments(args); +- QDBusMessage response = bus.call(request, QDBus::BlockWithGui); ++ QDBusMessage response ++ = bus.call(request, QDBus::BlockWithGui, DBUS_CALL_TIMEOUT); + if ((response.type() != QDBusMessage::ReplyMessage) + || (response.arguments().isEmpty())) { + qCWarning(LOG_ESS) << "Error message" << response.errorMessage(); +diff --git a/sources/extsysmon/sources/playersource.h b/sources/extsysmon/sources/playersource.h +index 0d8bbfc..2164354 100644 +--- a/sources/extsysmon/sources/playersource.h ++++ b/sources/extsysmon/sources/playersource.h +@@ -18,11 +18,16 @@ + #ifndef PLAYERSOURCE_H + #define PLAYERSOURCE_H + ++#include + #include + + #include "abstractextsysmonsource.h" + + ++#ifndef DBUS_CALL_TIMEOUT ++#define DBUS_CALL_TIMEOUT 3000 ++#endif /* DBUS_CALL_TIMEOUT */ ++ + class QProcess; + + class PlayerSource : public AbstractExtSysMonSource +@@ -52,6 +57,7 @@ private: + QVariantHash m_mpdCached; + QProcess *m_mpdProcess = nullptr; + QString m_mpris; ++ QMutex m_dbusMutex; + QString m_player; + int m_symbols; + QStringList m_metadata = QStringList() << QString("album") diff --git a/patches/fix-race-condition.patch b/patches/fix-race-condition.patch new file mode 100644 index 0000000..14d79ea --- /dev/null +++ b/patches/fix-race-condition.patch @@ -0,0 +1,15 @@ +diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp +index 1744fb7..f483209 100644 +--- a/sources/awesome-widget/plugin/awkeys.cpp ++++ b/sources/awesome-widget/plugin/awkeys.cpp +@@ -234,8 +234,10 @@ void AWKeys::reinitKeys(const QStringList currentKeys) + void AWKeys::updateTextData() + { + // do not do it in parallel to avoid race condition ++ m_mutex.lock(); + calculateValues(); + QString text = parsePattern(keyOperator->pattern()); ++ m_mutex.unlock(); + + emit(needTextToBeUpdated(text)); + emit(dataAggregator->updateData(values)); diff --git a/patches/fix-vertical-alignment.patch b/patches/fix-vertical-alignment.patch new file mode 100644 index 0000000..136087c --- /dev/null +++ b/patches/fix-vertical-alignment.patch @@ -0,0 +1,26 @@ +diff --git a/sources/awesome-widget/package/contents/ui/main.qml b/sources/awesome-widget/package/contents/ui/main.qml +index 79c6ddf..0e20bc9 100644 +--- a/sources/awesome-widget/package/contents/ui/main.qml ++++ b/sources/awesome-widget/package/contents/ui/main.qml +@@ -84,7 +84,7 @@ Item { + // ui + Text { + id: text +- anchors.fill: Plasmoid.Layout ++ anchors.fill: parent + renderType: Text.NativeRendering + textFormat: Text.RichText + wrapMode: plasmoid.configuration.wrapText ? Text.WordWrap : Text.NoWrap +diff --git a/sources/desktop-panel/package/contents/ui/main.qml b/sources/desktop-panel/package/contents/ui/main.qml +index 5a1e9b6..20f8732 100644 +--- a/sources/desktop-panel/package/contents/ui/main.qml ++++ b/sources/desktop-panel/package/contents/ui/main.qml +@@ -57,7 +57,7 @@ Item { + + // ui + GridLayout { +- anchors.fill: Plasmoid.Layout ++ anchors.fill: parent + columns: plasmoid.configuration.verticalLayout ? 1 : dpAdds.numberOfDesktops() + rows: plasmoid.configuration.verticalLayout ? dpAdds.numberOfDesktops() : 1 + diff --git a/sources/CMakeLists.txt b/sources/CMakeLists.txt index 0d23497..fa0dc2c 100644 --- a/sources/CMakeLists.txt +++ b/sources/CMakeLists.txt @@ -66,6 +66,7 @@ endif () set(PROJECT_TRDPARTY_DIR ${CMAKE_CURRENT_SOURCE_DIR}/3rdparty) set(PROJECT_LIBRARY awesomewidgets) +set(PROJECT_MONITORSOURCES extsysmonsources) include(libraries.cmake) include(clang-format.cmake) include(cppcheck.cmake) @@ -74,11 +75,16 @@ include(coverity.cmake) get_directory_property(CMAKE_DEFINITIONS COMPILE_DEFINITIONS) configure_file(${CMAKE_SOURCE_DIR}/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/version.h) add_subdirectory(awesomewidgets) +add_subdirectory(extsysmonsources) add_subdirectory(extsysmon) if (BUILD_PLASMOIDS) add_subdirectory(awesome-widget) add_subdirectory(desktop-panel) add_subdirectory(translations) endif () +if (BUILD_TESTING) + enable_testing() + add_subdirectory(test) +endif () include(packages-recipe.cmake) diff --git a/sources/awdebug.cpp b/sources/awdebug.cpp index 2b9ccc7..6397383 100644 --- a/sources/awdebug.cpp +++ b/sources/awdebug.cpp @@ -24,6 +24,8 @@ Q_LOGGING_CATEGORY(LOG_AW, "org.kde.plasma.awesomewidget", Q_LOGGING_CATEGORY(LOG_DP, "org.kde.plasma.desktoppanel", QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_ESM, "org.kde.plasma.extsysmon", QtMsgType::QtWarningMsg) +Q_LOGGING_CATEGORY(LOG_ESS, "org.kde.plasma.extsysmonsources", + QtMsgType::QtWarningMsg) Q_LOGGING_CATEGORY(LOG_LIB, "org.kde.plasma.awesomewidgets", QtMsgType::QtWarningMsg) @@ -44,6 +46,7 @@ const QStringList getBuildData() metadata.append(QString(" AWESAPI: %1").arg(AWESAPI)); metadata.append(QString(" AWEUAPI: %1").arg(AWEUAPI)); metadata.append(QString(" AWEWAPI: %1").arg(AWEWAPI)); + metadata.append(QString(" AWEFAPI: %1").arg(AWEFAPI)); metadata.append(QString(" TIME_KEYS: %1").arg(TIME_KEYS)); metadata.append(QString(" STATIC_KEYS: %1").arg(STATIC_KEYS)); // cmake properties @@ -68,7 +71,6 @@ const QStringList getBuildData() .arg(CMAKE_SHARED_LINKER_FLAGS)); // components metadata.append(QString("Components data:")); - metadata.append(QString(" BUILD_COVERAGE: %1").arg(BUILD_COVERAGE)); metadata.append(QString(" BUILD_PLASMOIDS: %1").arg(BUILD_PLASMOIDS)); metadata.append( QString(" BUILD_DEB_PACKAGE: %1").arg(BUILD_DEB_PACKAGE)); diff --git a/sources/awdebug.h b/sources/awdebug.h index 6a3b2dd..bae3ba4 100644 --- a/sources/awdebug.h +++ b/sources/awdebug.h @@ -34,6 +34,7 @@ Q_DECLARE_LOGGING_CATEGORY(LOG_AW) Q_DECLARE_LOGGING_CATEGORY(LOG_DP) Q_DECLARE_LOGGING_CATEGORY(LOG_ESM) +Q_DECLARE_LOGGING_CATEGORY(LOG_ESS) Q_DECLARE_LOGGING_CATEGORY(LOG_LIB) const QStringList getBuildData(); diff --git a/sources/awesome-widget/package/contents/ui/main.qml b/sources/awesome-widget/package/contents/ui/main.qml index 79c6ddf..0e20bc9 100644 --- a/sources/awesome-widget/package/contents/ui/main.qml +++ b/sources/awesome-widget/package/contents/ui/main.qml @@ -84,7 +84,7 @@ Item { // ui Text { id: text - anchors.fill: Plasmoid.Layout + anchors.fill: parent renderType: Text.NativeRendering textFormat: Text.RichText wrapMode: plasmoid.configuration.wrapText ? Text.WordWrap : Text.NoWrap diff --git a/sources/awesome-widget/package/contents/ui/widget.qml b/sources/awesome-widget/package/contents/ui/widget.qml index 86da37c..62c4900 100644 --- a/sources/awesome-widget/package/contents/ui/widget.qml +++ b/sources/awesome-widget/package/contents/ui/widget.qml @@ -31,6 +31,9 @@ Item { AWActions { id: awActions } + AWFormatterConfigFactory { + id: awFormatter + } width: childrenRect.width height: childrenRect.height @@ -320,10 +323,15 @@ Item { height: implicitHeight width: parent.width QtControls.Button { - width: parent.width * 3 / 5 + width: parent.width * 3 / 10 text: i18n("Edit bars") onClicked: awKeys.editItem("graphicalitem") } + QtControls.Button { + width: parent.width * 3 / 10 + text: i18n("Formatters") + onClicked: awFormatter.showDialog(awKeys.dictKeys(true)) + } QtControls.Button { width: parent.width * 2 / 5 text: i18n("Preview") diff --git a/sources/awesome-widget/plugin/CMakeLists.txt b/sources/awesome-widget/plugin/CMakeLists.txt index 381937f..4d90d57 100644 --- a/sources/awesome-widget/plugin/CMakeLists.txt +++ b/sources/awesome-widget/plugin/CMakeLists.txt @@ -11,9 +11,11 @@ include_directories( ) file(GLOB SUBPROJECT_SOURCE *.cpp ${PROJECT_TRDPARTY_DIR}/fontdialog/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) +file(GLOB SUBPROJECT_UI *.ui) file(GLOB SUBPROJECT_NOTIFY *.notifyrc) -add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE}) +qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI}) +add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER}) target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget) diff --git a/sources/awesome-widget/plugin/awabstractselector.cpp b/sources/awesome-widget/plugin/awabstractselector.cpp new file mode 100644 index 0000000..46215ac --- /dev/null +++ b/sources/awesome-widget/plugin/awabstractselector.cpp @@ -0,0 +1,76 @@ +/*************************************************************************** + * 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 "awabstractselector.h" +#include "ui_awabstractselector.h" + +#include "awdebug.h" + + +AWAbstractSelector::AWAbstractSelector(QWidget *parent) + : QWidget(parent) + , ui(new Ui::AWAbstractSelector) +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; + + ui->setupUi(this); + + connect(ui->comboBox_key, SIGNAL(currentIndexChanged(int)), this, + SIGNAL(selectionChanged())); + connect(ui->comboBox_value, SIGNAL(currentIndexChanged(int)), this, + SIGNAL(selectionChanged())); +} + + +AWAbstractSelector::~AWAbstractSelector() +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; + + delete ui; +} + + +QPair AWAbstractSelector::current() const +{ + QString key = ui->comboBox_key->currentText(); + QString value = ui->comboBox_value->currentText(); + + return QPair(key, value); +} + + +void AWAbstractSelector::init(const QStringList keys, const QStringList values, + const QPair current) +{ + if ((!keys.contains(current.first)) || (!values.contains(current.second))) { + qCWarning(LOG_AW) << "Invalid current value" << current + << "not found in default ones"; + return; + } + qCDebug(LOG_AW) << "Init selector with keys" << keys << "and values" + << values << "and current ones are" << current; + + // set data + ui->comboBox_key->clear(); + ui->comboBox_key->addItems(keys); + ui->comboBox_value->clear(); + ui->comboBox_value->addItems(values); + + // set current values + ui->comboBox_key->setCurrentText(current.first); + ui->comboBox_value->setCurrentText(current.second); +} diff --git a/sources/awesome-widget/plugin/awabstractselector.h b/sources/awesome-widget/plugin/awabstractselector.h new file mode 100644 index 0000000..2dbc926 --- /dev/null +++ b/sources/awesome-widget/plugin/awabstractselector.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * 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 AWABSTRACTSELECTOR_H +#define AWABSTRACTSELECTOR_H + +#include + + +namespace Ui +{ +class AWAbstractSelector; +} + +class AWAbstractSelector : public QWidget +{ + Q_OBJECT + +public: + explicit AWAbstractSelector(QWidget *parent = nullptr); + virtual ~AWAbstractSelector(); + QPair current() const; + void init(const QStringList keys, const QStringList values, + const QPair current); + +signals: + void selectionChanged(); + +private: + Ui::AWAbstractSelector *ui = nullptr; +}; + + +#endif /* AWABSTRACTSELECTOR_H */ diff --git a/sources/awesome-widget/plugin/awabstractselector.ui b/sources/awesome-widget/plugin/awabstractselector.ui new file mode 100644 index 0000000..a871fa1 --- /dev/null +++ b/sources/awesome-widget/plugin/awabstractselector.ui @@ -0,0 +1,36 @@ + + + AWAbstractSelector + + + + 0 + 0 + 400 + 25 + + + + + 0 + + + 0 + + + 0 + + + 0 + + + + + + + + + + + + diff --git a/sources/awesome-widget/plugin/awconfighelper.cpp b/sources/awesome-widget/plugin/awconfighelper.cpp index a7b26be..4bb06c7 100644 --- a/sources/awesome-widget/plugin/awconfighelper.cpp +++ b/sources/awesome-widget/plugin/awconfighelper.cpp @@ -201,7 +201,7 @@ QVariantMap AWConfigHelper::readDataEngineConfiguration() const } -void AWConfigHelper::writeDataEngineConfiguration( +bool AWConfigHelper::writeDataEngineConfiguration( const QVariantMap configuration) const { qCDebug(LOG_AW) << "Configuration" << configuration; @@ -228,6 +228,8 @@ void AWConfigHelper::writeDataEngineConfiguration( settings.endGroup(); settings.sync(); + + return (settings.status() == QSettings::NoError); } @@ -295,7 +297,7 @@ void AWConfigHelper::readFile(QSettings &settings, const QString key, file.close(); settings.setValue(key, text); } else { - qCWarning(LOG_LIB) << "Could not open" << file.fileName(); + qCWarning(LOG_AW) << "Could not open" << file.fileName(); } } @@ -316,6 +318,6 @@ void AWConfigHelper::writeFile(QSettings &settings, const QString key, out.flush(); file.close(); } else { - qCWarning(LOG_LIB) << "Could not open" << file.fileName(); + qCWarning(LOG_AW) << "Could not open" << file.fileName(); } } diff --git a/sources/awesome-widget/plugin/awconfighelper.h b/sources/awesome-widget/plugin/awconfighelper.h index d16e297..fdca421 100644 --- a/sources/awesome-widget/plugin/awconfighelper.h +++ b/sources/awesome-widget/plugin/awconfighelper.h @@ -42,7 +42,7 @@ public: const bool importAdds) const; // dataengine Q_INVOKABLE QVariantMap readDataEngineConfiguration() const; - Q_INVOKABLE void + Q_INVOKABLE bool writeDataEngineConfiguration(const QVariantMap configuration) const; private: diff --git a/sources/awesome-widget/plugin/awdataaggregator.cpp b/sources/awesome-widget/plugin/awdataaggregator.cpp index 7f26fe4..4b22862 100644 --- a/sources/awesome-widget/plugin/awdataaggregator.cpp +++ b/sources/awesome-widget/plugin/awdataaggregator.cpp @@ -19,11 +19,11 @@ #include -#include #include #include #include #include +#include #include diff --git a/sources/awesome-widget/plugin/awdatetimeformatter.cpp b/sources/awesome-widget/plugin/awdatetimeformatter.cpp deleted file mode 100644 index 515dd42..0000000 --- a/sources/awesome-widget/plugin/awdatetimeformatter.cpp +++ /dev/null @@ -1,84 +0,0 @@ -/*************************************************************************** - * 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 "awdatetimeformatter.h" - -#include -#include - -#include "awdebug.h" - - -AWDateTimeFormatter::AWDateTimeFormatter(QObject *parent, - const QString filename, - const QString section) - : AWAbstractFormatter(parent, filename, section) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - init(filename, section); -} - - -AWDateTimeFormatter::AWDateTimeFormatter(QObject *parent, const QString format) - : AWAbstractFormatter(parent) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - setFormat(format); -} - - -AWDateTimeFormatter::~AWDateTimeFormatter() -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; -} - - -QString AWDateTimeFormatter::convert(const QVariant &value) const -{ - qCDebug(LOG_AW) << "Convert value" << value; - - return value.toDateTime().toString(m_format); -} - - -QString AWDateTimeFormatter::format() const -{ - return m_format; -} - - -void AWDateTimeFormatter::setFormat(const QString _format) -{ - qCDebug(LOG_AW) << "Set format" << _format; - - m_format = _format; -} - - -void AWDateTimeFormatter::init(const QString filename, const QString section) -{ - qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename; - - QSettings settings(filename, QSettings::IniFormat); - - settings.beginGroup(section); - setFormat(settings.value(QString("Format"), QString()).toString()); - settings.endGroup(); -} diff --git a/sources/awesome-widget/plugin/awesomewidget.cpp b/sources/awesome-widget/plugin/awesomewidget.cpp index 6d6233b..e327c47 100644 --- a/sources/awesome-widget/plugin/awesomewidget.cpp +++ b/sources/awesome-widget/plugin/awesomewidget.cpp @@ -21,7 +21,7 @@ #include "awactions.h" #include "awconfighelper.h" -#include "awdataengineaggregator.h" +#include "awformatterconfigfactory.h" #include "awkeys.h" @@ -31,5 +31,7 @@ void AWPlugin::registerTypes(const char *uri) qmlRegisterType(uri, 1, 0, "AWActions"); qmlRegisterType(uri, 1, 0, "AWConfigHelper"); + qmlRegisterType(uri, 1, 0, + "AWFormatterConfigFactory"); qmlRegisterType(uri, 1, 0, "AWKeys"); } diff --git a/sources/awesome-widget/plugin/awfloatformatter.cpp b/sources/awesome-widget/plugin/awfloatformatter.cpp deleted file mode 100644 index 7a6fe2c..0000000 --- a/sources/awesome-widget/plugin/awfloatformatter.cpp +++ /dev/null @@ -1,176 +0,0 @@ -/*************************************************************************** - * 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 "awfloatformatter.h" - -#include - -#include "awdebug.h" - - -AWFloatFormatter::AWFloatFormatter(QObject *parent, const QString filename, - const QString section) - : AWAbstractFormatter(parent, filename, section) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - init(filename, section); -} - - -AWFloatFormatter::AWFloatFormatter(QObject *parent, const QChar fillChar, - const char format, const double multiplier, - const int precision, const double summand, - const int width) - : AWAbstractFormatter(parent) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - setFillChar(fillChar); - setFormat(format); - setMultiplier(multiplier); - setPrecision(precision); - setSummand(summand); - setWidth(width); -} - - -AWFloatFormatter::~AWFloatFormatter() -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; -} - - -QString AWFloatFormatter::convert(const QVariant &value) const -{ - qCDebug(LOG_AW) << "Convert value" << value; - - return QString("%1").arg(value.toDouble() * m_multiplier + m_summand, - m_width, m_format, m_precision, m_fillChar); -} - - -QChar AWFloatFormatter::fillChar() const -{ - return m_fillChar; -} - - -char AWFloatFormatter::format() const -{ - return m_format; -} - - -double AWFloatFormatter::multiplier() const -{ - return m_multiplier; -} - - -int AWFloatFormatter::precision() const -{ - return m_precision; -} - - -double AWFloatFormatter::summand() const -{ - return m_summand; -} - - -int AWFloatFormatter::width() const -{ - return m_width; -} - - -void AWFloatFormatter::setFillChar(const QChar _fillChar) -{ - qCDebug(LOG_AW) << "Set char" << _fillChar; - - m_fillChar = _fillChar; -} - - -void AWFloatFormatter::setFormat(char _format) -{ - qCDebug(LOG_AW) << "Set format" << _format; - // http://doc.qt.io/qt-5/qstring.html#argument-formats - if ((_format != 'e') && (_format != 'E') && (_format != 'f') - && (_format != 'g') && (_format != 'G')) { - qCWarning(LOG_AW) << "Invalid format" << _format; - _format = 'f'; - } - - m_format = _format; -} - - -void AWFloatFormatter::setMultiplier(const double _multiplier) -{ - qCDebug(LOG_AW) << "Set multiplier" << _multiplier; - - m_multiplier = _multiplier; -} - - -void AWFloatFormatter::setPrecision(const int _precision) -{ - qCDebug(LOG_AW) << "Set precision" << _precision; - - m_precision = _precision; -} - - -void AWFloatFormatter::setSummand(const double _summand) -{ - qCDebug(LOG_AW) << "Set summand" << _summand; - - m_summand = _summand; -} - - -void AWFloatFormatter::setWidth(const int _width) -{ - qCDebug(LOG_AW) << "Set width" << _width; - - m_width = _width; -} - - -void AWFloatFormatter::init(const QString filename, const QString section) -{ - qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename; - - QSettings settings(filename, QSettings::IniFormat); - - settings.beginGroup(section); - setFillChar( - settings.value(QString("FillChar"), QString()).toString().at(0)); - setFormat(settings.value(QString("Format"), QString("f")) - .toString() - .at(0) - .toLatin1()); - setMultiplier(settings.value(QString("Multiplier"), 1.0).toDouble()); - setPrecision(settings.value(QString("Precision"), -1).toInt()); - setSummand(settings.value(QString("Summand"), 0.0).toDouble()); - setWidth(settings.value(QString("Width"), 0).toInt()); - settings.endGroup(); -} diff --git a/sources/awesome-widget/plugin/awformatterconfig.cpp b/sources/awesome-widget/plugin/awformatterconfig.cpp new file mode 100644 index 0000000..e1f3d54 --- /dev/null +++ b/sources/awesome-widget/plugin/awformatterconfig.cpp @@ -0,0 +1,181 @@ +/*************************************************************************** + * 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 "awformatterconfig.h" +#include "ui_awformatterconfig.h" + +#include + +#include + +#include "awabstractselector.h" +#include "awdebug.h" +#include "awformatterhelper.h" + + +AWFormatterConfig::AWFormatterConfig(QWidget *parent, const QStringList keys) + : QDialog(parent) + , ui(new Ui::AWFormatterConfig) + , m_keys(keys) +{ + qCDebug(LOG_AW) << __PRETTY_FUNCTION__; + + ui->setupUi(this); + editButton + = 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(editButton, SIGNAL(clicked(bool)), this, SLOT(editFormatters())); +} + + +AWFormatterConfig::~AWFormatterConfig() +{ + 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 current + = static_cast(sender())->current(); + int index + = m_selectors.indexOf(static_cast(sender())); + + if ((current.first.isEmpty()) && (current.second.isEmpty())) { + if (sender() == m_selectors.last()) + return; + AWAbstractSelector *selector = m_selectors.takeAt(index); + ui->verticalLayout->removeWidget(selector); + selector->deleteLater(); + } else { + if (sender() != m_selectors.last()) + return; + auto keys = initKeys(); + addSelector(keys.first, keys.second, QPair()); + } +} + + +void AWFormatterConfig::addSelector(const QStringList &keys, + const QStringList &values, + const QPair ¤t) +{ + 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 data; + for (auto selector : m_selectors) { + QPair 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->writeFormatters(data); + m_helper->writeFormatters(data.keys()); + break; + } +} + + +void AWFormatterConfig::init() +{ + delete m_helper; + m_helper = new AWFormatterHelper(this); +} + + +QPair AWFormatterConfig::initKeys() const +{ + // we are adding empty string at the start + QStringList keys = QStringList() << QString(""); + keys.append(m_keys); + keys.sort(); + QStringList knownFormatters = QStringList() << QString(""); + knownFormatters.append(m_helper->knownFormatters()); + knownFormatters.sort(); + + return QPair(keys, knownFormatters); +} + + +void AWFormatterConfig::updateDialog() +{ + clearSelectors(); + QHash appliedFormatters = m_helper->getFormatters(); + auto keys = initKeys(); + + for (auto key : appliedFormatters.keys()) + addSelector(keys.first, keys.second, + QPair(key, appliedFormatters[key])); + // empty one + addSelector(keys.first, keys.second, QPair()); +} diff --git a/sources/awesome-widget/plugin/awformatterconfig.h b/sources/awesome-widget/plugin/awformatterconfig.h new file mode 100644 index 0000000..65a6382 --- /dev/null +++ b/sources/awesome-widget/plugin/awformatterconfig.h @@ -0,0 +1,64 @@ +/*************************************************************************** + * 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 AWFORMATTERCONFIG_H +#define AWFORMATTERCONFIG_H + +#include + + +class AWAbstractSelector; +class AWFormatterHelper; +namespace Ui +{ +class AWFormatterConfig; +} + +class AWFormatterConfig : public QDialog +{ + Q_OBJECT + +public: + explicit AWFormatterConfig(QWidget *parent = nullptr, + const QStringList keys = QStringList()); + virtual ~AWFormatterConfig(); + Q_INVOKABLE void showDialog(); + +private slots: + void editFormatters(); + void updateUi(); + +private: + QPushButton *editButton = nullptr; + Ui::AWFormatterConfig *ui = nullptr; + AWFormatterHelper *m_helper = nullptr; + QList m_selectors; + // properties + QStringList m_keys; + // methods + void addSelector(const QStringList &keys, const QStringList &values, + const QPair ¤t); + void clearSelectors(); + void execDialog(); + void init(); + QPair initKeys() const; + void updateDialog(); +}; + + +#endif /* AWFORMATTERCONFIG_H */ diff --git a/sources/awesome-widget/plugin/awformatterconfig.ui b/sources/awesome-widget/plugin/awformatterconfig.ui new file mode 100644 index 0000000..4f0fff2 --- /dev/null +++ b/sources/awesome-widget/plugin/awformatterconfig.ui @@ -0,0 +1,93 @@ + + + AWFormatterConfig + + + + 0 + 0 + 400 + 300 + + + + + + + true + + + + + 0 + 0 + 384 + 249 + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Close|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + AWFormatterConfig + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AWFormatterConfig + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesome-widget/plugin/awnoformatter.cpp b/sources/awesome-widget/plugin/awformatterconfigfactory.cpp similarity index 65% rename from sources/awesome-widget/plugin/awnoformatter.cpp rename to sources/awesome-widget/plugin/awformatterconfigfactory.cpp index f36a2b5..d7da52d 100644 --- a/sources/awesome-widget/plugin/awnoformatter.cpp +++ b/sources/awesome-widget/plugin/awformatterconfigfactory.cpp @@ -15,45 +15,28 @@ * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ - -#include "awnoformatter.h" +#include "awformatterconfigfactory.h" #include "awdebug.h" +#include "awformatterconfig.h" -AWNoFormatter::AWNoFormatter(QObject *parent, const QString filename, - const QString section) - : AWAbstractFormatter(parent, filename, section) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - init(filename, section); -} - - -AWNoFormatter::AWNoFormatter(QObject *parent) - : AWAbstractFormatter(parent) +AWFormatterConfigFactory::AWFormatterConfigFactory(QObject *parent) + : QObject(parent) { qCDebug(LOG_AW) << __PRETTY_FUNCTION__; } -AWNoFormatter::~AWNoFormatter() +AWFormatterConfigFactory::~AWFormatterConfigFactory() { qCDebug(LOG_AW) << __PRETTY_FUNCTION__; } -QString AWNoFormatter::convert(const QVariant &value) const +void AWFormatterConfigFactory::showDialog(const QStringList keys) { - qCDebug(LOG_AW) << "Convert value" << value; - - return value.toString(); -} - - -void AWNoFormatter::init(const QString filename, const QString section) -{ - qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename; - // dummy method for future references + AWFormatterConfig *config = new AWFormatterConfig(nullptr, keys); + config->showDialog(); + config->deleteLater(); } diff --git a/sources/awesome-widget/plugin/awabstractformatter.h b/sources/awesome-widget/plugin/awformatterconfigfactory.h similarity index 74% rename from sources/awesome-widget/plugin/awabstractformatter.h rename to sources/awesome-widget/plugin/awformatterconfigfactory.h index d873ef5..edfd49f 100644 --- a/sources/awesome-widget/plugin/awabstractformatter.h +++ b/sources/awesome-widget/plugin/awformatterconfigfactory.h @@ -15,23 +15,24 @@ * along with awesome-widgets. If not, see http://www.gnu.org/licenses/ * ***************************************************************************/ -#ifndef AWABSTRACTFORMATTER_H -#define AWABSTRACTFORMATTER_H + +#ifndef AWFORMATTERCONFIGFACTORY_H +#define AWFORMATTERCONFIGFACTORY_H #include -#include -class AWAbstractFormatter : public QObject +class AWFormatterConfigFactory : public QObject { + Q_OBJECT + public: - explicit AWAbstractFormatter(QObject *parent, const QString, const QString) - : QObject(parent){}; - explicit AWAbstractFormatter(QObject *parent) - : QObject(parent){}; - virtual ~AWAbstractFormatter(){}; - virtual QString convert(const QVariant &value) const = 0; + explicit AWFormatterConfigFactory(QObject *parent = nullptr); + virtual ~AWFormatterConfigFactory(); + Q_INVOKABLE void showDialog(const QStringList keys); + +private: }; -#endif /* AWABSTRACTFORMATTER_H */ +#endif /* AWFORMATTERCONFIGFACTORY_H */ diff --git a/sources/awesome-widget/plugin/awformatterhelper.cpp b/sources/awesome-widget/plugin/awformatterhelper.cpp index aa6cd4f..2dc9598 100644 --- a/sources/awesome-widget/plugin/awformatterhelper.cpp +++ b/sources/awesome-widget/plugin/awformatterhelper.cpp @@ -17,27 +17,25 @@ #include "awformatterhelper.h" -#include -#include +#include + +#include +#include +#include -#include "awdebug.h" #include "awdatetimeformatter.h" +#include "awdebug.h" #include "awfloatformatter.h" #include "awnoformatter.h" #include "awscriptformatter.h" -AWFormatterHelper::AWFormatterHelper(QObject *parent) - : QObject(parent) +AWFormatterHelper::AWFormatterHelper(QWidget *parent) + : AbstractExtItemAggregator(parent, QString("formatters")) { qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - m_genericConfig = QString("%1/awesomewidgets/general.ini") - .arg(QStandardPaths::writableLocation( - QStandardPaths::GenericDataLocation)); -#ifdef BUILD_FUTURE - init(); -#endif /* BUILD_FUTURE */ + initItems(); } @@ -46,11 +44,12 @@ AWFormatterHelper::~AWFormatterHelper() qCDebug(LOG_AW) << __PRETTY_FUNCTION__; m_formatters.clear(); + m_formattersClasses.clear(); } QString AWFormatterHelper::convert(const QVariant &value, - const QString name) const + const QString &name) const { qCDebug(LOG_AW) << "Convert value" << value << "for" << name; @@ -65,25 +64,102 @@ QStringList AWFormatterHelper::definedFormatters() const } -AWFormatterHelper::FormatterClass -AWFormatterHelper::defineFormatterClass(const QString name) const +QHash AWFormatterHelper::getFormatters() const { - qCDebug(LOG_AW) << "Define formatter class for" << name; + QHash map; + for (auto tag : m_formatters.keys()) + map[tag] = m_formatters[tag]->name(); - QSettings settings(m_genericConfig, QSettings::IniFormat); + return map; +} - settings.beginGroup(name); - QString stringType - = settings.value(QString("Type"), QString("NoFormat")).toString(); + +QList AWFormatterHelper::items() const +{ + QList converted; + for (auto item : m_formattersClasses.values()) + converted.append(item); + + return converted; +} + + +QStringList AWFormatterHelper::knownFormatters() const +{ + return m_formattersClasses.keys(); +} + + +bool AWFormatterHelper::writeFormatters(const QStringList keys) const +{ + qCDebug(LOG_AW) << "Remove formatters" << keys; + + QString fileName = QString("%1/awesomewidgets/formatters/formatters.ini") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + QSettings settings(fileName, QSettings::IniFormat); + qCInfo(LOG_AW) << "Configuration file" << fileName; + + settings.beginGroup(QString("Formatters")); + QStringList foundKeys = settings.childKeys(); + for (auto key : foundKeys) { + if (keys.contains(key)) + continue; + settings.remove(key); + } settings.endGroup(); - FormatterClass formatter = FormatterClass::NoFormat; + settings.sync(); + + return (settings.status() == QSettings::NoError); +} + + +bool AWFormatterHelper::writeFormatters( + const QHash configuration) const +{ + qCDebug(LOG_AW) << "Write configuration" << configuration; + + QString fileName = QString("%1/awesomewidgets/formatters/formatters.ini") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + QSettings settings(fileName, QSettings::IniFormat); + qCInfo(LOG_AW) << "Configuration file" << fileName; + + settings.beginGroup(QString("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 == QString("DateTime")) - formatter = FormatterClass::DateTime; + formatter = AWAbstractFormatter::FormatterClass::DateTime; else if (stringType == QString("Float")) - formatter = FormatterClass::Float; + formatter = AWAbstractFormatter::FormatterClass::Float; + else if (stringType == QString("NoFormat")) + ; else if (stringType == QString("Script")) - formatter = FormatterClass::Script; + formatter = AWAbstractFormatter::FormatterClass::Script; else qCWarning(LOG_AW) << "Unknown formatter" << stringType; @@ -91,35 +167,147 @@ AWFormatterHelper::defineFormatterClass(const QString name) const } -void AWFormatterHelper::init() +void AWFormatterHelper::initFormatters() { - QSettings settings(m_genericConfig, QSettings::IniFormat); + m_formattersClasses.clear(); - settings.beginGroup(QString("Formatters")); - QStringList keys = settings.childKeys(); - for (auto key : keys) { - QString name = settings.value(key).toString(); - FormatterClass formatter = defineFormatterClass(name); - qCInfo(LOG_AW) << "Found formatter" << name << "for key" << key - << "defined as" << static_cast(formatter); + 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(QString(".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 (formatter) { - case FormatterClass::DateTime: - m_formatters[key] - = new AWDateTimeFormatter(this, m_genericConfig, name); - break; - case FormatterClass::Float: - m_formatters[key] - = new AWFloatFormatter(this, m_genericConfig, name); - break; - case FormatterClass::Script: - m_formatters[key] - = new AWScriptFormatter(this, m_genericConfig, name); - break; - case FormatterClass::NoFormat: - m_formatters[key] = new AWNoFormatter(this, m_genericConfig, name); - break; + + 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::Script: + m_formattersClasses[name] + = new AWScriptFormatter(this, filePath); + break; + case AWAbstractFormatter::FormatterClass::NoFormat: + m_formattersClasses[name] = new AWNoFormatter(this, filePath); + break; + } } } - settings.endGroup(); +} + + +void AWFormatterHelper::initKeys() +{ + m_formatters.clear(); + + QStringList configs = QStandardPaths::locateAll( + QStandardPaths::GenericDataLocation, + QString("awesomewidgets/formatters/formatters.ini")); + + for (auto fileName : configs) { + QSettings settings(fileName, QSettings::IniFormat); + qCInfo(LOG_AW) << "Configuration file" << settings.fileName(); + + settings.beginGroup(QString("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, + QString("awesomewidgets/formatters"), QStandardPaths::LocateDirectory); +} + + +QPair +AWFormatterHelper::readMetadata(const QString filePath) const +{ + qCDebug(LOG_AW) << "Read initial parameters from" << filePath; + + QSettings settings(filePath, QSettings::IniFormat); + settings.beginGroup(QString("Desktop Entry")); + QString name = settings.value(QString("Name"), filePath).toString(); + QString type + = settings.value(QString("X-AW-Type"), QString("NoFormat")).toString(); + AWAbstractFormatter::FormatterClass formatter = defineFormatterClass(type); + settings.endGroup(); + + return QPair(name, formatter); +} + + +void AWFormatterHelper::doCreateItem() +{ + QStringList selection = QStringList() + << QString("NoFormat") << QString("DateTime") + << QString("Float") << QString("Script"); + 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(); + case AWAbstractFormatter::FormatterClass::Float: + return createItem(); + case AWAbstractFormatter::FormatterClass::Script: + return createItem(); + case AWAbstractFormatter::FormatterClass::NoFormat: + return createItem(); + } +} + + +void AWFormatterHelper::initItems() +{ + installDirectories(); + initFormatters(); + initKeys(); } diff --git a/sources/awesome-widget/plugin/awformatterhelper.h b/sources/awesome-widget/plugin/awformatterhelper.h index 784f5f9..5ba16d6 100644 --- a/sources/awesome-widget/plugin/awformatterhelper.h +++ b/sources/awesome-widget/plugin/awformatterhelper.h @@ -19,30 +19,47 @@ #ifndef AWFORMATTERHELPER_H #define AWFORMATTERHELPER_H -#include +#include "abstractextitemaggregator.h" #include "awabstractformatter.h" -class AWFormatterHelper : public QObject +class AWAbstractFormatter; + +class AWFormatterHelper : public AbstractExtItemAggregator { Q_OBJECT public: - enum class FormatterClass { DateTime, Float, Script, NoFormat }; - - explicit AWFormatterHelper(QObject *parent = nullptr); + explicit AWFormatterHelper(QWidget *parent = nullptr); virtual ~AWFormatterHelper(); - QString convert(const QVariant &value, const QString name) const; + QString convert(const QVariant &value, const QString &name) const; QStringList definedFormatters() const; + QHash getFormatters() const; + QList items() const; + QStringList knownFormatters() const; + bool writeFormatters(const QStringList keys) const; + bool writeFormatters(const QHash configuration) const; + +public slots: + void editItems(); private: - AWFormatterHelper::FormatterClass - defineFormatterClass(const QString name) const; - void init(); + // methods + AWAbstractFormatter::FormatterClass + defineFormatterClass(const QString stringType) const; + void initFormatters(); + void initKeys(); + void installDirectories(); + QPair + readMetadata(const QString filePath) const; + // parent methods + void doCreateItem(); + void initItems(); // properties - QString m_genericConfig; + QStringList m_directories; QHash m_formatters; + QHash m_formattersClasses; }; diff --git a/sources/awesome-widget/plugin/awkeyoperations.cpp b/sources/awesome-widget/plugin/awkeyoperations.cpp index abab46c..1e23e18 100644 --- a/sources/awesome-widget/plugin/awkeyoperations.cpp +++ b/sources/awesome-widget/plugin/awkeyoperations.cpp @@ -194,12 +194,14 @@ QString AWKeyOperations::infoByKey(QString key) const else if (key.startsWith(QString("custom"))) return extScripts->itemByTag(key, QString("custom"))->uniq(); else if (key.contains(QRegExp(QString("^hdd[rw]")))) - return QString("%1").arg(m_devices[QString( - "disk")][key.remove(QRegExp(QString("hdd[rw]"))).toInt()]); + return QString("%1").arg( + m_devices[QString("disk")] + [key.remove(QRegExp(QString("hdd[rw]"))).toInt()]); else if (key.contains(QRegExp( QString("^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)")))) - return QString("%1").arg(m_devices[QString( - "mount")][key + return QString("%1").arg( + m_devices[QString("mount")] + [key .remove(QRegExp(QString( "^hdd([0-9]|mb|gb|freemb|freegb|totmb|totgb)"))) .toInt()]); @@ -207,8 +209,9 @@ QString AWKeyOperations::infoByKey(QString key) const return QString("%1").arg( m_devices[QString("hdd")][key.remove(QString("hddtemp")).toInt()]); else if (key.contains(QRegExp(QString("^(down|up)[0-9]")))) - return QString("%1").arg(m_devices[QString( - "net")][key.remove(QRegExp(QString("^(down|up)"))).toInt()]); + return QString("%1").arg( + m_devices[QString("net")] + [key.remove(QRegExp(QString("^(down|up)"))).toInt()]); else if (key.startsWith(QString("pkgcount"))) return extUpgrade->itemByTag(key, QString("pkgcount"))->uniq(); else if (key.contains(QRegExp(QString("(^|perc)(ask|bid|price)(chg|)")))) diff --git a/sources/awesome-widget/plugin/awkeys.cpp b/sources/awesome-widget/plugin/awkeys.cpp index fd1c829..f483209 100644 --- a/sources/awesome-widget/plugin/awkeys.cpp +++ b/sources/awesome-widget/plugin/awkeys.cpp @@ -17,11 +17,11 @@ #include "awkeys.h" -#include #include #include #include #include +#include #include "awdataaggregator.h" #include "awdataengineaggregator.h" @@ -234,8 +234,10 @@ void AWKeys::reinitKeys(const QStringList currentKeys) void AWKeys::updateTextData() { // do not do it in parallel to avoid race condition + m_mutex.lock(); calculateValues(); QString text = parsePattern(keyOperator->pattern()); + m_mutex.unlock(); emit(needTextToBeUpdated(text)); emit(dataAggregator->updateData(values)); diff --git a/sources/awesome-widget/plugin/awkeysaggregator.cpp b/sources/awesome-widget/plugin/awkeysaggregator.cpp index 0f5f0c0..735f716 100644 --- a/sources/awesome-widget/plugin/awkeysaggregator.cpp +++ b/sources/awesome-widget/plugin/awkeysaggregator.cpp @@ -49,7 +49,7 @@ AWKeysAggregator::AWKeysAggregator(QObject *parent) m_formatter[QString("swaptotmb")] = FormatterType::MemMBFormat; m_formatter[QString("swaptotgb")] = FormatterType::MemGBFormat; - m_customFormatters = new AWFormatterHelper(this); + m_customFormatters = new AWFormatterHelper(nullptr); } diff --git a/sources/awesome-widget/plugin/awscriptformatter.cpp b/sources/awesome-widget/plugin/awscriptformatter.cpp deleted file mode 100644 index 0f056d2..0000000 --- a/sources/awesome-widget/plugin/awscriptformatter.cpp +++ /dev/null @@ -1,151 +0,0 @@ -/*************************************************************************** - * 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 "awscriptformatter.h" - -#include -#include - -#include "awdebug.h" - - -AWScriptFormatter::AWScriptFormatter(QObject *parent, const QString filename, - const QString section) - : AWAbstractFormatter(parent, filename, section) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - init(filename, section); - initProgram(); -} - - -AWScriptFormatter::AWScriptFormatter(QObject *parent, const bool appendCode, - const QString code, const bool hasReturn) - : AWAbstractFormatter(parent) -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; - - setAppendCode(appendCode); - setCode(code); - setHasReturn(hasReturn); - initProgram(); -} - - -AWScriptFormatter::~AWScriptFormatter() -{ - qCDebug(LOG_AW) << __PRETTY_FUNCTION__; -} - - -QString AWScriptFormatter::convert(const QVariant &value) const -{ - qCDebug(LOG_AW) << "Convert value" << value; - - // init engine - QJSEngine engine; - QJSValue fn = engine.evaluate(m_program); - QJSValueList args = QJSValueList() << value.toString(); - QJSValue result = fn.call(args); - - if (result.isError()) { - qCWarning(LOG_AW) << "Uncaught exception at line" - << result.property("lineNumber").toInt() << ":" - << result.toString(); - return QString(); - } else { - return result.toString(); - } -} - - -bool AWScriptFormatter::appendCode() const -{ - return m_appendCode; -} - - -QString AWScriptFormatter::code() const -{ - return m_code; -} - - -bool AWScriptFormatter::hasReturn() const -{ - return m_hasReturn; -} - - -QString AWScriptFormatter::program() const -{ - return m_program; -} - - -void AWScriptFormatter::setAppendCode(const bool _appendCode) -{ - qCDebug(LOG_AW) << "Set append code" << _appendCode; - - m_appendCode = _appendCode; -} - - -void AWScriptFormatter::setCode(const QString _code) -{ - qCDebug(LOG_AW) << "Set code" << _code; - - m_code = _code; -} - - -void AWScriptFormatter::setHasReturn(const bool _hasReturn) -{ - qCDebug(LOG_AW) << "Set has return" << _hasReturn; - - m_hasReturn = _hasReturn; -} - - -void AWScriptFormatter::init(const QString filename, const QString section) -{ - qCDebug(LOG_AW) << "Looking for section" << section << "in" << filename; - - QSettings settings(filename, QSettings::IniFormat); - - settings.beginGroup(section); - setAppendCode(settings.value(QString("AppendCode"), true).toBool()); - setCode(settings.value(QString("Code"), QString()).toString()); - setHasReturn(settings.value(QString("HasReturn"), false).toBool()); - settings.endGroup(); -} - - -void AWScriptFormatter::initProgram() -{ - if (m_appendCode) - m_program - = QString("(function(value) { %1%2 })") - .arg(m_code) - .arg(m_hasReturn ? QString("") : QString("; return output;")); - else - m_program = m_code; - - qCInfo(LOG_AW) << "Create JS engine with code" << m_program; -} diff --git a/sources/awesome-widget/plugin/awupdatehelper.cpp b/sources/awesome-widget/plugin/awupdatehelper.cpp index 9ccd636..bd9c59a 100644 --- a/sources/awesome-widget/plugin/awupdatehelper.cpp +++ b/sources/awesome-widget/plugin/awupdatehelper.cpp @@ -19,14 +19,14 @@ #include -#include #include #include #include #include -#include #include +#include #include +#include #include "awdebug.h" diff --git a/sources/awesomewidgets/abstractextitem.cpp b/sources/awesomewidgets/abstractextitem.cpp index fc6abde..cfed6cb 100644 --- a/sources/awesomewidgets/abstractextitem.cpp +++ b/sources/awesomewidgets/abstractextitem.cpp @@ -22,20 +22,17 @@ #include #include -#include "awdebug.h" #include "abstractextitemaggregator.h" +#include "awdebug.h" -AbstractExtItem::AbstractExtItem(QWidget *parent, const QString desktopName, - const QStringList directories) +AbstractExtItem::AbstractExtItem(QWidget *parent, const QString filePath) : QDialog(parent) - , m_fileName(desktopName) - , m_dirs(directories) + , m_fileName(filePath) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - qCDebug(LOG_LIB) << "Desktop name" << desktopName << "directories" - << directories; + qCDebug(LOG_LIB) << "Desktop name" << filePath; m_name = m_fileName; } @@ -47,6 +44,20 @@ AbstractExtItem::~AbstractExtItem() } +void AbstractExtItem::bumpApi(const int _newVer) +{ + qCDebug(LOG_LIB) << "Bump API using new version" << _newVer; + + // update for current API + if ((apiVersion() > 0) && (apiVersion() < _newVer)) { + qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" + << _newVer; + setApiVersion(_newVer); + writeConfiguration(); + } +} + + void AbstractExtItem::copyDefaults(AbstractExtItem *_other) const { _other->setActive(m_active); @@ -57,6 +68,21 @@ void AbstractExtItem::copyDefaults(AbstractExtItem *_other) const } +QString AbstractExtItem::writtableConfig() const +{ + QString path = m_fileName; + QString name = QFileInfo(path).fileName(); + path.remove(path.count() - name.count() - 1, name.count() + 1); + QString dir = QFileInfo(path).fileName(); + + return QString("%1/awesomewidgets/%2/%3") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)) + .arg(dir) + .arg(name); +} + + int AbstractExtItem::apiVersion() const { return m_apiVersion; @@ -69,12 +95,6 @@ QString AbstractExtItem::comment() const } -QStringList AbstractExtItem::directories() const -{ - return m_dirs; -} - - QString AbstractExtItem::fileName() const { return m_fileName; @@ -158,7 +178,8 @@ void AbstractExtItem::setName(const QString _name) void AbstractExtItem::setNumber(int _number) { qCDebug(LOG_LIB) << "Number" << _number; - if (_number == -1) + bool generateNumber = (_number == -1); + if (generateNumber) { _number = []() { qCWarning(LOG_LIB) << "Number is empty, generate new one"; qsrand(QTime::currentTime().msec()); @@ -166,55 +187,44 @@ void AbstractExtItem::setNumber(int _number) qCInfo(LOG_LIB) << "Generated number is" << n; return n; }(); + } m_number = _number; + if (generateNumber) + writeConfiguration(); } void AbstractExtItem::readConfiguration() { - for (int i = m_dirs.count() - 1; i >= 0; i--) { - if (!QDir(m_dirs.at(i)).entryList(QDir::Files).contains(m_fileName)) - continue; - QSettings settings(QString("%1/%2").arg(m_dirs.at(i)).arg(m_fileName), - QSettings::IniFormat); + QSettings settings(m_fileName, QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setName(settings.value(QString("Name"), m_name).toString()); - setComment(settings.value(QString("Comment"), m_comment).toString()); - setApiVersion( - settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt()); - setActive(settings.value(QString("X-AW-Active"), QVariant(m_active)) - .toString() - == QString("true")); - setInterval( - settings.value(QString("X-AW-Interval"), m_interval).toInt()); - setNumber(settings.value(QString("X-AW-Number"), m_number).toInt()); - settings.endGroup(); - } + settings.beginGroup(QString("Desktop Entry")); + setName(settings.value(QString("Name"), m_name).toString()); + setComment(settings.value(QString("Comment"), m_comment).toString()); + setApiVersion( + settings.value(QString("X-AW-ApiVersion"), m_apiVersion).toInt()); + setActive( + settings.value(QString("X-AW-Active"), QVariant(m_active)).toString() + == QString("true")); + setInterval(settings.value(QString("X-AW-Interval"), m_interval).toInt()); + setNumber(settings.value(QString("X-AW-Number"), m_number).toInt()); + settings.endGroup(); } bool AbstractExtItem::tryDelete() const { - for (auto dir : m_dirs) { - bool status = QFile::remove(QString("%1/%2").arg(dir).arg(m_fileName)); - qCInfo(LOG_LIB) << "Remove file" - << QString("%1/%2").arg(dir).arg(m_fileName) << status; - } + bool status = QFile::remove(m_fileName); + qCInfo(LOG_LIB) << "Remove file" << m_fileName << status; - // check if exists - for (auto dir : m_dirs) - if (QFile::exists(QString("%1/%2").arg(dir).arg(m_fileName))) - return false; - return true; + return status; } void AbstractExtItem::writeConfiguration() const { - QSettings settings(QString("%1/%2").arg(m_dirs.first()).arg(m_fileName), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); diff --git a/sources/awesomewidgets/abstractextitem.h b/sources/awesomewidgets/abstractextitem.h index e2ec0b8..7bdb3a1 100644 --- a/sources/awesomewidgets/abstractextitem.h +++ b/sources/awesomewidgets/abstractextitem.h @@ -28,7 +28,6 @@ class AbstractExtItem : public QDialog Q_PROPERTY(bool active READ isActive WRITE setActive) Q_PROPERTY(int apiVersion READ apiVersion WRITE setApiVersion) Q_PROPERTY(QString comment READ comment WRITE setComment) - Q_PROPERTY(QStringList directories READ directories) Q_PROPERTY(QString fileName READ fileName) Q_PROPERTY(int interval READ interval WRITE setInterval) Q_PROPERTY(QString name READ name WRITE setName) @@ -36,17 +35,17 @@ class AbstractExtItem : public QDialog Q_PROPERTY(QString uniq READ uniq) public: - explicit AbstractExtItem(QWidget *parent = nullptr, - const QString desktopName = QString(), - const QStringList directories = QStringList()); + explicit AbstractExtItem(QWidget *parent, + const QString filePath = QString()); virtual ~AbstractExtItem(); + virtual void bumpApi(const int _newVer); virtual AbstractExtItem *copy(const QString _fileName, const int _number) = 0; - void copyDefaults(AbstractExtItem *_other) const; + virtual void copyDefaults(AbstractExtItem *_other) const; + QString writtableConfig() const; // get methods int apiVersion() const; QString comment() const; - QStringList directories() const; QString fileName() const; int interval() const; bool isActive() const; @@ -62,6 +61,9 @@ public: void setName(const QString _name = QString("none")); void setNumber(int _number = -1); +signals: + void dataReceived(const QVariantHash &data); + public slots: virtual void readConfiguration(); virtual QVariantHash run() = 0; @@ -70,8 +72,7 @@ public slots: virtual void writeConfiguration() const; private: - QString m_fileName; - QStringList m_dirs; + QString m_fileName = QString("/dev/null"); virtual void translate() = 0; // properties int m_apiVersion = 0; diff --git a/sources/awesomewidgets/abstractextitemaggregator.cpp b/sources/awesomewidgets/abstractextitemaggregator.cpp index 69113c7..90704cf 100644 --- a/sources/awesomewidgets/abstractextitemaggregator.cpp +++ b/sources/awesomewidgets/abstractextitemaggregator.cpp @@ -16,40 +16,35 @@ ***************************************************************************/ #include "abstractextitemaggregator.h" +#include "ui_abstractextitemaggregator.h" #include -#include +#include #include -#include - -#include "awdebug.h" +#include -AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent) - : QWidget(parent) +AbstractExtItemAggregator::AbstractExtItemAggregator(QWidget *parent, + const QString type) + : QDialog(parent) + , ui(new Ui::AbstractExtItemAggregator) + , m_type(type) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - dialog = new QDialog(this); - widgetDialog = new QListWidget(dialog); - dialogButtons = new QDialogButtonBox( - QDialogButtonBox::Open | QDialogButtonBox::Close, Qt::Vertical, dialog); + ui->setupUi(this); copyButton - = dialogButtons->addButton(i18n("Copy"), QDialogButtonBox::ActionRole); - createButton = dialogButtons->addButton(i18n("Create"), + = ui->buttonBox->addButton(i18n("Copy"), QDialogButtonBox::ActionRole); + createButton = ui->buttonBox->addButton(i18n("Create"), QDialogButtonBox::ActionRole); - deleteButton = dialogButtons->addButton(i18n("Remove"), + deleteButton = ui->buttonBox->addButton(i18n("Remove"), QDialogButtonBox::ActionRole); - QHBoxLayout *layout = new QHBoxLayout(dialog); - layout->addWidget(widgetDialog); - layout->addWidget(dialogButtons); - dialog->setLayout(layout); - connect(dialogButtons, SIGNAL(clicked(QAbstractButton *)), this, + connect(ui->buttonBox, SIGNAL(clicked(QAbstractButton *)), this, SLOT(editItemButtonPressed(QAbstractButton *))); - connect(dialogButtons, SIGNAL(rejected()), dialog, SLOT(reject())); - connect(widgetDialog, SIGNAL(itemActivated(QListWidgetItem *)), this, + connect(ui->buttonBox, SIGNAL(rejected()), this, SLOT(reject())); + connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem *)), this, SLOT(editItemActivated(QListWidgetItem *))); } @@ -58,7 +53,60 @@ AbstractExtItemAggregator::~AbstractExtItemAggregator() { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - delete dialog; + delete ui; +} + + +void AbstractExtItemAggregator::copyItem() +{ + AbstractExtItem *source = itemFromWidget(); + QString fileName = getName(); + int number = uniqNumber(); + QString dir = QString("%1/awesomewidgets/%2") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)) + .arg(m_type); + if ((source == nullptr) || (fileName.isEmpty())) { + qCWarning(LOG_LIB) << "Nothing to copy"; + return; + } + QString filePath = QString("%1/%2").arg(dir).arg(fileName); + + AbstractExtItem *newItem = source->copy(filePath, number); + if (newItem->showConfiguration(configArgs()) == 1) { + initItems(); + repaintList(); + } +} + + +void AbstractExtItemAggregator::deleteItem() +{ + AbstractExtItem *source = itemFromWidget(); + if (source == nullptr) { + qCWarning(LOG_LIB) << "Nothing to delete"; + return; + }; + + if (source->tryDelete()) { + initItems(); + repaintList(); + } +} + + +void AbstractExtItemAggregator::editItem() +{ + AbstractExtItem *source = itemFromWidget(); + if (source == nullptr) { + qCWarning(LOG_LIB) << "Nothing to edit"; + return; + }; + + if (source->showConfiguration(configArgs()) == 1) { + initItems(); + repaintList(); + } } @@ -77,12 +125,69 @@ QString AbstractExtItemAggregator::getName() } +AbstractExtItem *AbstractExtItemAggregator::itemFromWidget() +{ + QListWidgetItem *widgetItem = ui->listWidget->currentItem(); + if (widgetItem == nullptr) + return nullptr; + + AbstractExtItem *found = nullptr; + for (auto item : items()) { + QString fileName = QFileInfo(item->fileName()).fileName(); + if (fileName != widgetItem->text()) + continue; + found = item; + break; + } + if (found == nullptr) + qCWarning(LOG_LIB) << "Could not find item by name" + << widgetItem->text(); + + return found; +} + + +void AbstractExtItemAggregator::repaintList() +{ + ui->listWidget->clear(); + for (auto _item : items()) { + QString fileName = QFileInfo(_item->fileName()).fileName(); + QListWidgetItem *item = new QListWidgetItem(fileName, ui->listWidget); + QStringList tooltip; + tooltip.append(i18n("Name: %1", _item->name())); + tooltip.append(i18n("Comment: %1", _item->comment())); + tooltip.append(i18n("Identity: %1", _item->uniq())); + item->setToolTip(tooltip.join(QChar('\n'))); + ui->listWidget->addItem(item); + } +} + + +int AbstractExtItemAggregator::uniqNumber() const +{ + QList tagList; + for (auto item : items()) + tagList.append(item->number()); + int number = 0; + while (tagList.contains(number)) + number++; + + return number; +} + + QVariant AbstractExtItemAggregator::configArgs() const { return m_configArgs; } +QString AbstractExtItemAggregator::type() const +{ + return m_type; +} + + void AbstractExtItemAggregator::setConfigArgs(const QVariant _configArgs) { qCDebug(LOG_LIB) << "Configuration arguments" << _configArgs; @@ -102,9 +207,9 @@ void AbstractExtItemAggregator::editItemButtonPressed(QAbstractButton *button) if (static_cast(button) == copyButton) return copyItem(); else if (static_cast(button) == createButton) - return createItem(); + return doCreateItem(); else if (static_cast(button) == deleteButton) return deleteItem(); - else if (dialogButtons->buttonRole(button) == QDialogButtonBox::AcceptRole) + else if (ui->buttonBox->buttonRole(button) == QDialogButtonBox::AcceptRole) return editItem(); } diff --git a/sources/awesomewidgets/abstractextitemaggregator.h b/sources/awesomewidgets/abstractextitemaggregator.h index 54724a2..cb1cb52 100644 --- a/sources/awesomewidgets/abstractextitemaggregator.h +++ b/sources/awesomewidgets/abstractextitemaggregator.h @@ -19,31 +19,61 @@ #define ABSTRACTEXTITEMAGGREGATOR_H #include -#include -#include -#include -#include +#include + +#include "abstractextitem.h" +#include "awdebug.h" -// additional class since QObject macro does not allow class templates -class AbstractExtItemAggregator : public QWidget +class QAbstractButton; +class QListWidgetItem; +namespace Ui +{ +class AbstractExtItemAggregator; +} + +class AbstractExtItemAggregator : public QDialog { Q_OBJECT Q_PROPERTY(QVariant configArgs READ configArgs WRITE setConfigArgs) + Q_PROPERTY(QVariant type READ type) public: - explicit AbstractExtItemAggregator(QWidget *parent = nullptr); + explicit AbstractExtItemAggregator(QWidget *parent, const QString type); virtual ~AbstractExtItemAggregator(); + // methods + void copyItem(); + template void createItem() + { + QString fileName = getName(); + int number = uniqNumber(); + QString dir = QString("%1/awesomewidgets/%2") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)) + .arg(m_type); + if (fileName.isEmpty()) { + qCWarning(LOG_LIB) << "Nothing to create"; + return; + }; + QString filePath = QString("%1/%2").arg(dir).arg(fileName); + + T *newItem = new T(this, filePath); + newItem->setNumber(number); + if (newItem->showConfiguration(configArgs()) == 1) { + initItems(); + repaintList(); + }; + }; + void deleteItem(); + void editItem(); QString getName(); - // ui - QDialog *dialog = nullptr; - QListWidget *widgetDialog = nullptr; - QDialogButtonBox *dialogButtons = nullptr; - QPushButton *copyButton = nullptr; - QPushButton *createButton = nullptr; - QPushButton *deleteButton = nullptr; + AbstractExtItem *itemFromWidget(); + void repaintList(); + int uniqNumber() const; // get methods QVariant configArgs() const; + virtual QList items() const = 0; + QString type() const; // set methods void setConfigArgs(const QVariant _configArgs); @@ -52,12 +82,17 @@ private slots: void editItemButtonPressed(QAbstractButton *button); private: + // ui + Ui::AbstractExtItemAggregator *ui = nullptr; + QPushButton *copyButton = nullptr; + QPushButton *createButton = nullptr; + QPushButton *deleteButton = nullptr; + // properties QVariant m_configArgs; - // methods - virtual void copyItem() = 0; - virtual void createItem() = 0; - virtual void deleteItem() = 0; - virtual void editItem() = 0; + QString m_type; + // ui methods + virtual void doCreateItem() = 0; + virtual void initItems() = 0; }; diff --git a/sources/awesomewidgets/abstractextitemaggregator.ui b/sources/awesomewidgets/abstractextitemaggregator.ui new file mode 100644 index 0000000..f0c541d --- /dev/null +++ b/sources/awesomewidgets/abstractextitemaggregator.ui @@ -0,0 +1,64 @@ + + + AbstractExtItemAggregator + + + + 0 + 0 + 400 + 300 + + + + + + + + + + Qt::Vertical + + + QDialogButtonBox::Close|QDialogButtonBox::Open + + + + + + + + + buttonBox + accepted() + AbstractExtItemAggregator + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AbstractExtItemAggregator + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesomewidgets/abstractweatherprovider.h b/sources/awesomewidgets/abstractweatherprovider.h new file mode 100644 index 0000000..9582cac --- /dev/null +++ b/sources/awesomewidgets/abstractweatherprovider.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 ABSTRACTWEATHERPROVIDER_H +#define ABSTRACTWEATHERPROVIDER_H + +#include +#include + + +class AbstractWeatherProvider : public QObject +{ + Q_OBJECT + Q_PROPERTY(int number READ number) + +public: + explicit AbstractWeatherProvider(QObject *parent, const int number) + : QObject(parent) + , m_number(number){}; + virtual ~AbstractWeatherProvider(){}; + virtual void initUrl(const QString city, const QString country, + const int ts) + = 0; + virtual QVariantHash parse(const QVariantMap &json) const = 0; + virtual QUrl url() const = 0; + int number() const { return m_number; }; + +private: + int m_number; +}; + + +#endif /* ABSTRACTWEATHERPROVIDER_H */ diff --git a/sources/awesomewidgets/awabstractformatter.cpp b/sources/awesomewidgets/awabstractformatter.cpp new file mode 100644 index 0000000..123a245 --- /dev/null +++ b/sources/awesomewidgets/awabstractformatter.cpp @@ -0,0 +1,129 @@ +/*************************************************************************** + * 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 "awabstractformatter.h" + +#include + +#include "awdebug.h" + + +AWAbstractFormatter::AWAbstractFormatter(QWidget *parent, + const QString filePath) + : AbstractExtItem(parent, filePath) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +AWAbstractFormatter::~AWAbstractFormatter() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +void AWAbstractFormatter::copyDefaults(AbstractExtItem *_other) const +{ + AbstractExtItem::copyDefaults(_other); + + static_cast(_other)->setType(m_type); +} + + +QString AWAbstractFormatter::uniq() const +{ + return QString("%1(%2)").arg(name()).arg(strType()); +} + + +QString AWAbstractFormatter::strType() const +{ + QString value; + switch (m_type) { + case FormatterClass::DateTime: + value = QString("DateTime"); + break; + case FormatterClass::Float: + value = QString("Float"); + break; + case FormatterClass::Script: + value = QString("Script"); + break; + case FormatterClass::NoFormat: + value = QString("NoFormat"); + break; + } + + return value; +} + + +AWAbstractFormatter::FormatterClass AWAbstractFormatter::type() const +{ + return m_type; +} + + +void AWAbstractFormatter::setStrType(const QString _type) +{ + qCDebug(LOG_LIB) << "Type" << _type; + + if (_type == QString("DateTime")) + m_type = FormatterClass::DateTime; + else if (_type == QString("Float")) + m_type = FormatterClass::Float; + else if (_type == QString("Script")) + m_type = FormatterClass::Script; + else + m_type = FormatterClass::NoFormat; +} + + +void AWAbstractFormatter::setType( + const AWAbstractFormatter::FormatterClass _type) +{ + qCDebug(LOG_LIB) << "Type" << static_cast(_type); + + m_type = _type; +} + + +void AWAbstractFormatter::readConfiguration() +{ + AbstractExtItem::readConfiguration(); + + QSettings settings(fileName(), QSettings::IniFormat); + + settings.beginGroup(QString("Desktop Entry")); + setStrType(settings.value(QString("X-AW-Type"), strType()).toString()); + settings.endGroup(); +} + + +void AWAbstractFormatter::writeConfiguration() const +{ + AbstractExtItem::writeConfiguration(); + + QSettings settings(writtableConfig(), QSettings::IniFormat); + qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); + + settings.beginGroup(QString("Desktop Entry")); + settings.setValue(QString("X-AW-Type"), strType()); + settings.endGroup(); + + settings.sync(); +} diff --git a/sources/awesomewidgets/awabstractformatter.h b/sources/awesomewidgets/awabstractformatter.h new file mode 100644 index 0000000..9bb5315 --- /dev/null +++ b/sources/awesomewidgets/awabstractformatter.h @@ -0,0 +1,56 @@ +/*************************************************************************** + * 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 AWABSTRACTFORMATTER_H +#define AWABSTRACTFORMATTER_H + +#include "abstractextitem.h" + + +class AWAbstractFormatter : public AbstractExtItem +{ + Q_OBJECT + Q_PROPERTY(FormatterClass type READ type WRITE setType) + Q_PROPERTY(QString strType READ strType WRITE setStrType) + +public: + enum class FormatterClass { DateTime, Float, Script, NoFormat }; + + explicit AWAbstractFormatter(QWidget *parent, + const QString filePath = QString()); + virtual ~AWAbstractFormatter(); + virtual QString convert(const QVariant &_value) const = 0; + void copyDefaults(AbstractExtItem *_other) const; + QString uniq() const; + // properties + QString strType() const; + FormatterClass type() const; + void setStrType(const QString type); + void setType(const FormatterClass _type = FormatterClass::NoFormat); + +public slots: + virtual void readConfiguration(); + QVariantHash run() { return QVariantHash(); }; + virtual void writeConfiguration() const; + +private: + // properties + FormatterClass m_type = FormatterClass::NoFormat; +}; + + +#endif /* AWABSTRACTFORMATTER_H */ diff --git a/sources/awesomewidgets/awdatetimeformatter.cpp b/sources/awesomewidgets/awdatetimeformatter.cpp new file mode 100644 index 0000000..dfaa437 --- /dev/null +++ b/sources/awesomewidgets/awdatetimeformatter.cpp @@ -0,0 +1,147 @@ +/*************************************************************************** + * 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 "awdatetimeformatter.h" +#include "ui_awdatetimeformatter.h" + +#include + +#include +#include +#include + +#include "awdebug.h" + + +AWDateTimeFormatter::AWDateTimeFormatter(QWidget *parent, + const QString filePath) + : AWAbstractFormatter(parent, filePath) + , ui(new Ui::AWDateTimeFormatter) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + if (!filePath.isEmpty()) + readConfiguration(); + ui->setupUi(this); + translate(); +} + + +AWDateTimeFormatter::~AWDateTimeFormatter() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + delete ui; +} + + +QString AWDateTimeFormatter::convert(const QVariant &_value) const +{ + qCDebug(LOG_LIB) << "Convert value" << _value; + + return _value.toDateTime().toString(m_format); +} + + +AWDateTimeFormatter *AWDateTimeFormatter::copy(const QString _fileName, + const int _number) +{ + qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; + + AWDateTimeFormatter *item + = new AWDateTimeFormatter(static_cast(parent()), _fileName); + AWAbstractFormatter::copyDefaults(item); + item->setFormat(format()); + item->setNumber(_number); + + return item; +} + + +QString AWDateTimeFormatter::format() const +{ + return m_format; +} + + +void AWDateTimeFormatter::setFormat(const QString _format) +{ + qCDebug(LOG_LIB) << "Set format" << _format; + + m_format = _format; +} + + +void AWDateTimeFormatter::readConfiguration() +{ + AWAbstractFormatter::readConfiguration(); + + QSettings settings(fileName(), QSettings::IniFormat); + + settings.beginGroup(QString("Desktop Entry")); + setFormat(settings.value(QString("X-AW-Format"), m_format).toString()); + settings.endGroup(); + + bumpApi(AWEFAPI); +} + + +int AWDateTimeFormatter::showConfiguration(const QVariant args) +{ + Q_UNUSED(args) + + ui->lineEdit_name->setText(name()); + ui->lineEdit_comment->setText(comment()); + ui->label_typeValue->setText(QString("DateTime")); + ui->lineEdit_format->setText(m_format); + + int ret = exec(); + if (ret != 1) + return ret; + setName(ui->lineEdit_name->text()); + setComment(ui->lineEdit_comment->text()); + setStrType(ui->label_typeValue->text()); + setFormat(ui->lineEdit_format->text()); + + writeConfiguration(); + return ret; +} + + +void AWDateTimeFormatter::writeConfiguration() const +{ + AWAbstractFormatter::writeConfiguration(); + + QSettings settings(writtableConfig(), QSettings::IniFormat); + qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); + + settings.beginGroup(QString("Desktop Entry")); + settings.setValue(QString("X-AW-Format"), m_format); + settings.endGroup(); + + settings.sync(); +} + + +void AWDateTimeFormatter::translate() +{ + ui->label_name->setText(i18n("Name")); + ui->label_comment->setText(i18n("Comment")); + ui->label_type->setText(i18n("Type")); + ui->label_format->setText(i18n("Format")); +} diff --git a/sources/awesome-widget/plugin/awdatetimeformatter.h b/sources/awesomewidgets/awdatetimeformatter.h similarity index 75% rename from sources/awesome-widget/plugin/awdatetimeformatter.h rename to sources/awesomewidgets/awdatetimeformatter.h index df8e9d7..30f328b 100644 --- a/sources/awesome-widget/plugin/awdatetimeformatter.h +++ b/sources/awesomewidgets/awdatetimeformatter.h @@ -21,25 +21,36 @@ #include "awabstractformatter.h" +namespace Ui +{ +class AWDateTimeFormatter; +} + class AWDateTimeFormatter : public AWAbstractFormatter { Q_OBJECT Q_PROPERTY(QString format READ format WRITE setFormat) public: - explicit AWDateTimeFormatter(QObject *parent, const QString filename, - const QString section); - explicit AWDateTimeFormatter(QObject *parent, const QString format); + explicit AWDateTimeFormatter(QWidget *parent, + const QString filePath = QString()); virtual ~AWDateTimeFormatter(); - QString convert(const QVariant &value) const; + QString convert(const QVariant &_value) const; + AWDateTimeFormatter *copy(const QString _fileName, const int _number); // properties QString format() const; void setFormat(const QString _format); +public slots: + void readConfiguration(); + int showConfiguration(const QVariant args = QVariant()); + void writeConfiguration() const; + private: - void init(const QString filename, const QString section); + Ui::AWDateTimeFormatter *ui = nullptr; + void translate(); // properties - QString m_format; + QString m_format = QString(); }; diff --git a/sources/awesomewidgets/awdatetimeformatter.ui b/sources/awesomewidgets/awdatetimeformatter.ui new file mode 100644 index 0000000..f0f80dc --- /dev/null +++ b/sources/awesomewidgets/awdatetimeformatter.ui @@ -0,0 +1,167 @@ + + + AWDateTimeFormatter + + + + 0 + 0 + 420 + 157 + + + + Configuration + + + + + + + + + 0 + 0 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Comment + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + + 0 + 0 + + + + Format + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + AWDateTimeFormatter + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AWDateTimeFormatter + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesomewidgets/awesomewidgets-extweather-ids.json b/sources/awesomewidgets/awesomewidgets-extweather-ids.json index 69f9085..e8ec649 100644 --- a/sources/awesomewidgets/awesomewidgets-extweather-ids.json +++ b/sources/awesomewidgets/awesomewidgets-extweather-ids.json @@ -1,11 +1,75 @@ { - "__url": "https://developer.yahoo.com/weather/documentation.html", + "__url-yahoo": "https://developer.yahoo.com/weather/documentation.html", + "__url-owm": "http://openweathermap.org/weather-conditions", "image": { "__comment": "should be described as html image with full path inside", "default": "", + "800": "", + + "801": "", + + "802": "", + "803": "", + + "804": "", + + "300": "", + "301": "", + "302": "", + "310": "", + "311": "", + "312": "", + "313": "", + "314": "", + "321": "", + "520": "", + "521": "", + "522": "", + "531": "", + + "500": "", + "501": "", + "502": "", + "503": "", + "504": "", + + "200": "", + "201": "", + "202": "", + "210": "", + "211": "", + "212": "", + "221": "", + "230": "", + "231": "", + "232": "", + + "511": "", + "600": "", + "601": "", + "602": "", + "611": "", + "612": "", + "615": "", + "616": "", + "620": "", + "621": "", + "622": "", + + "701": "", + "711": "", + "721": "", + "731": "", + "741": "", + "751": "", + "761": "", + "762": "", + "771": "", + "781": "", + "0": "", "1": "", "2": "", @@ -59,8 +123,71 @@ "text": { "default": "\u2604", - "3200": "\u2604", + "800": "\u2600", + + "801": "\u26C5", + + "802": "\u2601", + "803": "\u2601", + + "804": "\u2601", + + "300": "\u2602", + "301": "\u2602", + "302": "\u2602", + "310": "\u2602", + "311": "\u2602", + "312": "\u2602", + "313": "\u2602", + "314": "\u2602", + "321": "\u2602", + "520": "\u2602", + "521": "\u2602", + "522": "\u2602", + "531": "\u2602", + + "500": "\u2614", + "501": "\u2614", + "502": "\u2614", + "503": "\u2614", + "504": "\u2614", + + "200": "\u2608", + "201": "\u2608", + "202": "\u2608", + "210": "\u2608", + "211": "\u2608", + "212": "\u2608", + "221": "\u2608", + "230": "\u2608", + "231": "\u2608", + "232": "\u2608", + + "511": "\u2603", + "600": "\u2603", + "601": "\u2603", + "602": "\u2603", + "611": "\u2603", + "612": "\u2603", + "615": "\u2603", + "616": "\u2603", + "620": "\u2603", + "621": "\u2603", + "622": "\u2603", + + "701": "\u26C5", + "711": "\u26C5", + "721": "\u26C5", + "731": "\u26C5", + "741": "\u26C5", + "751": "\u26C5", + "761": "\u26C5", + "762": "\u26C5", + "771": "\u26C5", + "781": "\u26C5", + + "3200": "\u2604", "0": "\u2604", "1": "\u2604", "2": "\u2604", diff --git a/sources/awesomewidgets/awfloatformatter.cpp b/sources/awesomewidgets/awfloatformatter.cpp new file mode 100644 index 0000000..53a0f5a --- /dev/null +++ b/sources/awesomewidgets/awfloatformatter.cpp @@ -0,0 +1,259 @@ +/*************************************************************************** + * 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 "awfloatformatter.h" +#include "ui_awfloatformatter.h" + +#include + +#include +#include + +#include "awdebug.h" + + +AWFloatFormatter::AWFloatFormatter(QWidget *parent, const QString filePath) + : AWAbstractFormatter(parent, filePath) + , ui(new Ui::AWFloatFormatter) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + if (!filePath.isEmpty()) + readConfiguration(); + ui->setupUi(this); + translate(); +} + + +AWFloatFormatter::~AWFloatFormatter() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + delete ui; +} + + +QString AWFloatFormatter::convert(const QVariant &_value) const +{ + qCDebug(LOG_LIB) << "Convert value" << _value; + + return QString("%1").arg(_value.toDouble() * m_multiplier + m_summand, + m_count, m_format, m_precision, m_fillChar); +} + + +AWFloatFormatter *AWFloatFormatter::copy(const QString _fileName, + const int _number) +{ + qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; + + AWFloatFormatter *item + = new AWFloatFormatter(static_cast(parent()), _fileName); + AWAbstractFormatter::copyDefaults(item); + item->setCount(count()); + item->setFormat(format()); + item->setFillChar(fillChar()); + item->setMultiplier(multiplier()); + item->setNumber(_number); + item->setPrecision(precision()); + item->setSummand(summand()); + + return item; +} + + +int AWFloatFormatter::count() const +{ + return m_count; +} + + +QChar AWFloatFormatter::fillChar() const +{ + return m_fillChar; +} + + +char AWFloatFormatter::format() const +{ + return m_format; +} + + +double AWFloatFormatter::multiplier() const +{ + return m_multiplier; +} + + +int AWFloatFormatter::precision() const +{ + return m_precision; +} + + +double AWFloatFormatter::summand() const +{ + return m_summand; +} + + +void AWFloatFormatter::setCount(const int _count) +{ + qCDebug(LOG_LIB) << "Set width" << _count; + + m_count = _count; +} + + +void AWFloatFormatter::setFillChar(const QChar _fillChar) +{ + qCDebug(LOG_LIB) << "Set char" << _fillChar; + + m_fillChar = _fillChar; +} + + +void AWFloatFormatter::setFormat(char _format) +{ + qCDebug(LOG_LIB) << "Set format" << _format; + // http://doc.qt.io/qt-5/qstring.html#argument-formats + if ((_format != 'e') && (_format != 'E') && (_format != 'f') + && (_format != 'g') && (_format != 'G')) { + qCWarning(LOG_LIB) << "Invalid format" << _format; + _format = 'f'; + } + + m_format = _format; +} + + +void AWFloatFormatter::setMultiplier(const double _multiplier) +{ + qCDebug(LOG_LIB) << "Set multiplier" << _multiplier; + + m_multiplier = _multiplier; +} + + +void AWFloatFormatter::setPrecision(const int _precision) +{ + qCDebug(LOG_LIB) << "Set precision" << _precision; + + m_precision = _precision; +} + + +void AWFloatFormatter::setSummand(const double _summand) +{ + qCDebug(LOG_LIB) << "Set summand" << _summand; + + m_summand = _summand; +} + + +void AWFloatFormatter::readConfiguration() +{ + AWAbstractFormatter::readConfiguration(); + + QSettings settings(fileName(), QSettings::IniFormat); + + settings.beginGroup(QString("Desktop Entry")); + setCount(settings.value(QString("X-AW-Width"), m_count).toInt()); + setFillChar( + settings.value(QString("X-AW-FillChar"), m_fillChar).toString().at(0)); + setFormat(settings.value(QString("X-AW-Format"), QString(m_format)) + .toString() + .at(0) + .toLatin1()); + setMultiplier( + settings.value(QString("X-AW-Multiplier"), m_multiplier).toDouble()); + setPrecision( + settings.value(QString("X-AW-Precision"), m_precision).toInt()); + setSummand(settings.value(QString("X-AW-Summand"), m_summand).toDouble()); + settings.endGroup(); + + bumpApi(AWEFAPI); +} + + +int AWFloatFormatter::showConfiguration(const QVariant args) +{ + Q_UNUSED(args) + + ui->lineEdit_name->setText(name()); + ui->lineEdit_comment->setText(comment()); + ui->label_typeValue->setText(QString("Float")); + ui->comboBox_format->setCurrentIndex( + ui->comboBox_format->findText(QString(m_format))); + ui->spinBox_precision->setValue(m_precision); + ui->spinBox_width->setValue(m_count); + ui->lineEdit_fill->setText(QString(m_fillChar)); + ui->doubleSpinBox_multiplier->setValue(m_multiplier); + ui->doubleSpinBox_summand->setValue(m_summand); + + int ret = exec(); + if (ret != 1) + return ret; + setName(ui->lineEdit_name->text()); + setComment(ui->lineEdit_comment->text()); + setStrType(ui->label_typeValue->text()); + setFormat(ui->comboBox_format->currentText().at(0).toLatin1()); + setPrecision(ui->spinBox_precision->value()); + setCount(ui->spinBox_width->value()); + setFillChar(ui->lineEdit_fill->text().at(0)); + setMultiplier(ui->doubleSpinBox_multiplier->value()); + setSummand(ui->doubleSpinBox_summand->value()); + + writeConfiguration(); + return ret; +} + + +void AWFloatFormatter::writeConfiguration() const +{ + AWAbstractFormatter::writeConfiguration(); + + QSettings settings(writtableConfig(), QSettings::IniFormat); + qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); + + settings.beginGroup(QString("Desktop Entry")); + settings.setValue(QString("X-AW-Width"), m_count); + settings.setValue(QString("X-AW-FillChar"), m_fillChar); + settings.setValue(QString("X-AW-Format"), m_format); + settings.setValue(QString("X-AW-Multiplier"), m_multiplier); + settings.setValue(QString("X-AW-Precision"), m_precision); + settings.setValue(QString("X-AW-Summand"), m_summand); + settings.endGroup(); + + settings.sync(); +} + + +void AWFloatFormatter::translate() +{ + ui->label_name->setText(i18n("Name")); + ui->label_comment->setText(i18n("Comment")); + ui->label_type->setText(i18n("Type")); + ui->label_format->setText(i18n("Format")); + ui->label_precision->setText(i18n("Precision")); + ui->label_width->setText(i18n("Width")); + ui->label_fill->setText(i18n("Fill char")); + ui->label_multiplier->setText(i18n("Multiplier")); + ui->label_summand->setText(i18n("Summand")); +} diff --git a/sources/awesome-widget/plugin/awfloatformatter.h b/sources/awesomewidgets/awfloatformatter.h similarity index 74% rename from sources/awesome-widget/plugin/awfloatformatter.h rename to sources/awesomewidgets/awfloatformatter.h index 2ee36c8..7fcb6ef 100644 --- a/sources/awesome-widget/plugin/awfloatformatter.h +++ b/sources/awesomewidgets/awfloatformatter.h @@ -21,48 +21,56 @@ #include "awabstractformatter.h" +namespace Ui +{ +class AWFloatFormatter; +} + class AWFloatFormatter : public AWAbstractFormatter { Q_OBJECT + Q_PROPERTY(int count READ count WRITE setCount) Q_PROPERTY(QChar fillChar READ fillChar WRITE setFillChar) Q_PROPERTY(char format READ format WRITE setFormat) Q_PROPERTY(double multiplier READ multiplier WRITE setMultiplier) Q_PROPERTY(int precision READ precision WRITE setPrecision) Q_PROPERTY(double summand READ summand WRITE setSummand) - Q_PROPERTY(int width READ width WRITE setWidth) public: - explicit AWFloatFormatter(QObject *parent, const QString filename, - const QString section); - explicit AWFloatFormatter(QObject *parent, const QChar fillChar, - const char format, const double multiplier, - const int precision, const double summand, - const int width); + explicit AWFloatFormatter(QWidget *parent, + const QString filePath = QString()); virtual ~AWFloatFormatter(); - QString convert(const QVariant &value) const; + QString convert(const QVariant &_value) const; + AWFloatFormatter *copy(const QString _fileName, const int _number); // properties + int count() const; QChar fillChar() const; char format() const; double multiplier() const; int precision() const; double summand() const; - int width() const; + void setCount(const int _count); void setFillChar(const QChar _fillChar); void setFormat(char _format); void setMultiplier(const double _multiplier); void setPrecision(const int _precision); void setSummand(const double _summand); - void setWidth(const int _width); + +public slots: + void readConfiguration(); + int showConfiguration(const QVariant args = QVariant()); + void writeConfiguration() const; private: - void init(const QString filename, const QString section); + Ui::AWFloatFormatter *ui = nullptr; + void translate(); // properties - QChar m_fillChar; - char m_format; - double m_multiplier; - int m_precision; - double m_summand; - int m_width; + int m_count = 0; + QChar m_fillChar = QChar(); + char m_format = 'f'; + double m_multiplier = 1.0; + int m_precision = -1; + double m_summand = 0.0; }; diff --git a/sources/awesomewidgets/awfloatformatter.ui b/sources/awesomewidgets/awfloatformatter.ui new file mode 100644 index 0000000..8d6a1e6 --- /dev/null +++ b/sources/awesomewidgets/awfloatformatter.ui @@ -0,0 +1,317 @@ + + + AWFloatFormatter + + + + 0 + 0 + 420 + 315 + + + + Configuration + + + + + + + + + 0 + 0 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Comment + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + Format + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + e + + + + + E + + + + + f + + + + + g + + + + + G + + + + + + + + + + + + Precision + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -1 + + + 10000 + + + + + + + + + + + Width + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -10000 + + + 10000 + + + + + + + + + + + + 0 + 0 + + + + Fill char + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + 1 + + + + + + + + + Qt::Horizontal + + + + + + + + + Multiplier + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -1000000000.000000000000000 + + + 1000000000.000000000000000 + + + + + + + + + + + Summand + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + -1000000000.000000000000000 + + + 1000000000.000000000000000 + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + AWFloatFormatter + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AWFloatFormatter + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesomewidgets/awnoformatter.cpp b/sources/awesomewidgets/awnoformatter.cpp new file mode 100644 index 0000000..e1e3ddb --- /dev/null +++ b/sources/awesomewidgets/awnoformatter.cpp @@ -0,0 +1,94 @@ +/*************************************************************************** + * 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 "awnoformatter.h" +#include "ui_awnoformatter.h" + +#include + +#include "awdebug.h" + + +AWNoFormatter::AWNoFormatter(QWidget *parent, const QString filePath) + : AWAbstractFormatter(parent, filePath) + , ui(new Ui::AWNoFormatter) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + if (!filePath.isEmpty()) + readConfiguration(); + ui->setupUi(this); + translate(); +} + + +AWNoFormatter::~AWNoFormatter() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + delete ui; +} + + +QString AWNoFormatter::convert(const QVariant &_value) const +{ + qCDebug(LOG_LIB) << "Convert value" << _value; + + return _value.toString(); +} + + +AWNoFormatter *AWNoFormatter::copy(const QString _fileName, const int _number) +{ + qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; + + AWNoFormatter *item + = new AWNoFormatter(static_cast(parent()), _fileName); + AWAbstractFormatter::copyDefaults(item); + item->setNumber(_number); + + return item; +} + + +int AWNoFormatter::showConfiguration(const QVariant args) +{ + Q_UNUSED(args) + + ui->lineEdit_name->setText(name()); + ui->lineEdit_comment->setText(comment()); + ui->label_typeValue->setText(QString("NoFormat")); + + int ret = exec(); + if (ret != 1) + return ret; + setName(ui->lineEdit_name->text()); + setComment(ui->lineEdit_comment->text()); + setStrType(ui->label_typeValue->text()); + + writeConfiguration(); + return ret; +} + + +void AWNoFormatter::translate() +{ + ui->label_name->setText(i18n("Name")); + ui->label_comment->setText(i18n("Comment")); + ui->label_type->setText(i18n("Type")); +} diff --git a/sources/awesome-widget/plugin/awnoformatter.h b/sources/awesomewidgets/awnoformatter.h similarity index 79% rename from sources/awesome-widget/plugin/awnoformatter.h rename to sources/awesomewidgets/awnoformatter.h index 0251b50..de79817 100644 --- a/sources/awesome-widget/plugin/awnoformatter.h +++ b/sources/awesomewidgets/awnoformatter.h @@ -21,19 +21,27 @@ #include "awabstractformatter.h" +namespace Ui +{ +class AWNoFormatter; +} + class AWNoFormatter : public AWAbstractFormatter { Q_OBJECT public: - explicit AWNoFormatter(QObject *parent, const QString filename, - const QString section); - explicit AWNoFormatter(QObject *parent); + explicit AWNoFormatter(QWidget *parent, const QString filePath = QString()); virtual ~AWNoFormatter(); - QString convert(const QVariant &value) const; + QString convert(const QVariant &_value) const; + AWNoFormatter *copy(const QString _fileName, const int _number); + +public slots: + int showConfiguration(const QVariant args = QVariant()); private: - void init(const QString filename, const QString section); + Ui::AWNoFormatter *ui = nullptr; + void translate(); // properties }; diff --git a/sources/awesomewidgets/awnoformatter.ui b/sources/awesomewidgets/awnoformatter.ui new file mode 100644 index 0000000..8112539 --- /dev/null +++ b/sources/awesomewidgets/awnoformatter.ui @@ -0,0 +1,144 @@ + + + AWNoFormatter + + + + 0 + 0 + 420 + 128 + + + + Configuration + + + + + + + + + 0 + 0 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Comment + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + Qt::Vertical + + + + 20 + 40 + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + AWNoFormatter + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AWNoFormatter + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesomewidgets/awscriptformatter.cpp b/sources/awesomewidgets/awscriptformatter.cpp new file mode 100644 index 0000000..e06ef23 --- /dev/null +++ b/sources/awesomewidgets/awscriptformatter.cpp @@ -0,0 +1,228 @@ +/*************************************************************************** + * 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 "awscriptformatter.h" +#include "ui_awscriptformatter.h" + +#include + +#include +#include +#include + +#include "awdebug.h" + + +AWScriptFormatter::AWScriptFormatter(QWidget *parent, const QString filePath) + : AWAbstractFormatter(parent, filePath) + , ui(new Ui::AWScriptFormatter) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + if (!filePath.isEmpty()) + readConfiguration(); + ui->setupUi(this); + translate(); +} + + +AWScriptFormatter::~AWScriptFormatter() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; + + delete ui; +} + + +QString AWScriptFormatter::convert(const QVariant &_value) const +{ + qCDebug(LOG_LIB) << "Convert value" << _value; + + // init engine + QJSEngine engine; + QJSValue fn = engine.evaluate(m_program); + QJSValueList args = QJSValueList() << _value.toString(); + QJSValue result = fn.call(args); + + if (result.isError()) { + qCWarning(LOG_LIB) << "Uncaught exception at line" + << result.property("lineNumber").toInt() << ":" + << result.toString(); + return QString(); + } else { + return result.toString(); + } +} + + +AWScriptFormatter *AWScriptFormatter::copy(const QString _fileName, + const int _number) +{ + qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; + + AWScriptFormatter *item + = new AWScriptFormatter(static_cast(parent()), _fileName); + AWAbstractFormatter::copyDefaults(item); + item->setAppendCode(appendCode()); + item->setCode(code()); + item->setHasReturn(hasReturn()); + item->setNumber(_number); + + return item; +} + + +bool AWScriptFormatter::appendCode() const +{ + return m_appendCode; +} + + +QString AWScriptFormatter::code() const +{ + return m_code; +} + + +bool AWScriptFormatter::hasReturn() const +{ + return m_hasReturn; +} + + +QString AWScriptFormatter::program() const +{ + return m_program; +} + + +void AWScriptFormatter::setAppendCode(const bool _appendCode) +{ + qCDebug(LOG_LIB) << "Set append code" << _appendCode; + + m_appendCode = _appendCode; + initProgram(); +} + + +void AWScriptFormatter::setCode(const QString _code) +{ + qCDebug(LOG_LIB) << "Set code" << _code; + + m_code = _code; + initProgram(); +} + + +void AWScriptFormatter::setHasReturn(const bool _hasReturn) +{ + qCDebug(LOG_LIB) << "Set has return" << _hasReturn; + + m_hasReturn = _hasReturn; + initProgram(); +} + + +void AWScriptFormatter::readConfiguration() +{ + AWAbstractFormatter::readConfiguration(); + + QSettings settings(fileName(), QSettings::IniFormat); + + settings.beginGroup(QString("Desktop Entry")); + setAppendCode( + settings.value(QString("X-AW-AppendCode"), m_appendCode).toBool()); + setCode(settings.value(QString("X-AW-Code"), m_code).toString()); + setHasReturn( + settings.value(QString("X-AW-HasReturn"), m_hasReturn).toBool()); + settings.endGroup(); + + bumpApi(AWEFAPI); +} + + +int AWScriptFormatter::showConfiguration(const QVariant args) +{ + Q_UNUSED(args) + + ui->lineEdit_name->setText(name()); + ui->lineEdit_comment->setText(comment()); + ui->label_typeValue->setText(QString("Script")); + ui->checkBox_appendCode->setCheckState(m_appendCode ? Qt::Checked + : Qt::Unchecked); + ui->checkBox_hasReturn->setCheckState(m_hasReturn ? Qt::Checked + : Qt::Unchecked); + ui->textEdit_code->setPlainText(m_code); + + int ret = exec(); + if (ret != 1) + return ret; + setName(ui->lineEdit_name->text()); + setComment(ui->lineEdit_comment->text()); + setStrType(ui->label_typeValue->text()); + setAppendCode(ui->checkBox_appendCode->checkState() == Qt::Checked); + setHasReturn(ui->checkBox_hasReturn->checkState() == Qt::Checked); + setCode(ui->textEdit_code->toPlainText()); + initProgram(); + + writeConfiguration(); + return ret; +} + + +void AWScriptFormatter::writeConfiguration() const +{ + AWAbstractFormatter::writeConfiguration(); + + QSettings settings(writtableConfig(), QSettings::IniFormat); + qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); + + settings.beginGroup(QString("Desktop Entry")); + settings.setValue(QString("X-AW-AppendCode"), m_appendCode); + settings.setValue(QString("X-AW-Code"), m_code); + settings.setValue(QString("X-AW-HasReturn"), m_hasReturn); + settings.endGroup(); + + settings.sync(); +} + + +void AWScriptFormatter::initProgram() +{ + // init JS code + if (m_appendCode) + m_program + = QString("(function(value) { %1%2 })") + .arg(m_code) + .arg(m_hasReturn ? QString("") : QString("; return output;")); + else + m_program = m_code; + + qCInfo(LOG_LIB) << "Create JS engine with code" << m_program; +} + + +void AWScriptFormatter::translate() +{ + ui->label_name->setText(i18n("Name")); + ui->label_comment->setText(i18n("Comment")); + ui->label_type->setText(i18n("Type")); + ui->checkBox_appendCode->setText(i18n("Append code")); + ui->checkBox_hasReturn->setText(i18n("Has return")); + ui->label_code->setText(i18n("Code")); +} diff --git a/sources/awesome-widget/plugin/awscriptformatter.h b/sources/awesomewidgets/awscriptformatter.h similarity index 77% rename from sources/awesome-widget/plugin/awscriptformatter.h rename to sources/awesomewidgets/awscriptformatter.h index 1749e90..ec9fdbf 100644 --- a/sources/awesome-widget/plugin/awscriptformatter.h +++ b/sources/awesomewidgets/awscriptformatter.h @@ -21,6 +21,11 @@ #include "awabstractformatter.h" +namespace Ui +{ +class AWScriptFormatter; +} + class AWScriptFormatter : public AWAbstractFormatter { Q_OBJECT @@ -30,12 +35,11 @@ class AWScriptFormatter : public AWAbstractFormatter Q_PROPERTY(QString program READ program) public: - explicit AWScriptFormatter(QObject *parent, const QString filename, - const QString section); - explicit AWScriptFormatter(QObject *parent, const bool appendCode, - const QString code, const bool hasReturn); + explicit AWScriptFormatter(QWidget *parent, + const QString filePath = QString()); virtual ~AWScriptFormatter(); - QString convert(const QVariant &value) const; + QString convert(const QVariant &_value) const; + AWScriptFormatter *copy(const QString _fileName, const int _number); // properties bool appendCode() const; QString code() const; @@ -45,13 +49,19 @@ public: void setCode(const QString _code); void setHasReturn(const bool _hasReturn); +public slots: + void readConfiguration(); + int showConfiguration(const QVariant args = QVariant()); + void writeConfiguration() const; + private: - void init(const QString filename, const QString section); + Ui::AWScriptFormatter *ui = nullptr; void initProgram(); + void translate(); // properties - bool m_appendCode; - QString m_code; - bool m_hasReturn; + bool m_appendCode = true; + QString m_code = QString(); + bool m_hasReturn = false; QString m_program; }; diff --git a/sources/awesomewidgets/awscriptformatter.ui b/sources/awesomewidgets/awscriptformatter.ui new file mode 100644 index 0000000..a752a0d --- /dev/null +++ b/sources/awesomewidgets/awscriptformatter.ui @@ -0,0 +1,212 @@ + + + AWScriptFormatter + + + + 0 + 0 + 420 + 315 + + + + Configuration + + + + + + + + + 0 + 0 + + + + Name + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + 0 + 0 + + + + Comment + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + Type + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Append code + + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + 0 + 0 + + + + Has return + + + + + + + + + Qt::Horizontal + + + + + + + + + Code + + + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + buttonBox + accepted() + AWScriptFormatter + accept() + + + 248 + 254 + + + 157 + 274 + + + + + buttonBox + rejected() + AWScriptFormatter + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/sources/awesomewidgets/extitemaggregator.h b/sources/awesomewidgets/extitemaggregator.h index df92a16..7549383 100644 --- a/sources/awesomewidgets/extitemaggregator.h +++ b/sources/awesomewidgets/extitemaggregator.h @@ -32,8 +32,7 @@ template class ExtItemAggregator : public AbstractExtItemAggregator { public: explicit ExtItemAggregator(QWidget *parent, const QString type) - : AbstractExtItemAggregator(parent) - , m_type(type) + : AbstractExtItemAggregator(parent, type) { qSetMessagePattern(LOG_FORMAT); qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; @@ -57,8 +56,8 @@ public: void editItems() { - repaint(); - int ret = dialog->exec(); + repaintList(); + int ret = exec(); qCInfo(LOG_LIB) << "Dialog returns" << ret; }; @@ -70,7 +69,7 @@ public: for (auto item : m_items) { if (item->tag(_type) != _tag) continue; - found = item; + found = static_cast(item); break; } if (found == nullptr) @@ -87,7 +86,7 @@ public: for (auto item : m_items) { if (item->number() != _number) continue; - found = item; + found = static_cast(item); break; } if (found == nullptr) @@ -96,63 +95,31 @@ public: return found; }; - T *itemFromWidget() const - { - QListWidgetItem *widgetItem = widgetDialog->currentItem(); - if (widgetItem == nullptr) - return nullptr; - - T *found = nullptr; - for (auto item : m_items) { - if (item->fileName() != widgetItem->text()) - continue; - found = item; - break; - } - if (found == nullptr) - qCWarning(LOG_LIB) << "Could not find item by name" - << widgetItem->text(); - - return found; - }; - - QList items() const { return m_items; }; - - int uniqNumber() const - { - QList tagList; - for (auto item : m_items) - tagList.append(item->number()); - int number = 0; - while (tagList.contains(number)) - number++; - - return number; - }; + QList items() const { return m_items; }; private: - QList m_items; + QList m_items; QList m_activeItems; - QString m_type; - // init method - QList getItems() + void doCreateItem() { return createItem(); } + + QList getItems() { // create directory at $HOME QString localDir = QString("%1/awesomewidgets/%2") .arg(QStandardPaths::writableLocation( QStandardPaths::GenericDataLocation)) - .arg(m_type); + .arg(type()); QDir localDirectory; if (localDirectory.mkpath(localDir)) qCInfo(LOG_LIB) << "Created directory" << localDir; QStringList dirs = QStandardPaths::locateAll( QStandardPaths::GenericDataLocation, - QString("awesomewidgets/%1").arg(m_type), + QString("awesomewidgets/%1").arg(type()), QStandardPaths::LocateDirectory); QStringList names; - QList items; + QList items; for (auto dir : dirs) { QStringList files = QDir(dir).entryList(QDir::Files, QDir::Name); for (auto file : files) { @@ -161,14 +128,16 @@ private: continue; qCInfo(LOG_LIB) << "Found file" << file << "in" << dir; names.append(file); - items.append(new T(this, file, dirs)); + QString filePath = QString("%1/%2").arg(dir).arg(file); + items.append(new T(this, filePath)); } } // sort items - std::sort(items.begin(), items.end(), [](const T *lhs, const T *rhs) { - return lhs->number() < rhs->number(); - }); + std::sort(items.begin(), items.end(), + [](const AbstractExtItem *lhs, const AbstractExtItem *rhs) { + return lhs->number() < rhs->number(); + }); return items; }; @@ -181,89 +150,7 @@ private: for (auto item : m_items) { if (!item->isActive()) continue; - m_activeItems.append(item); - } - }; - - void repaint() - { - widgetDialog->clear(); - for (auto _item : m_items) { - QListWidgetItem *item - = new QListWidgetItem(_item->fileName(), widgetDialog); - QStringList tooltip; - tooltip.append(i18n("Name: %1", _item->name())); - tooltip.append(i18n("Comment: %1", _item->comment())); - tooltip.append(i18n("Identity: %1", _item->uniq())); - item->setToolTip(tooltip.join(QChar('\n'))); - widgetDialog->addItem(item); - } - }; - - // methods - void copyItem() - { - T *source = itemFromWidget(); - QString fileName = getName(); - int number = uniqNumber(); - if ((source == nullptr) || (fileName.isEmpty())) { - qCWarning(LOG_LIB) << "Nothing to copy"; - return; - } - - T *newItem = static_cast(source->copy(fileName, number)); - if (newItem->showConfiguration(configArgs()) == 1) { - initItems(); - repaint(); - } - }; - - void createItem() - { - QString fileName = getName(); - int number = uniqNumber(); - QStringList dirs = QStandardPaths::locateAll( - QStandardPaths::GenericDataLocation, - QString("awesomewidgets/%1").arg(m_type), - QStandardPaths::LocateDirectory); - if (fileName.isEmpty()) { - qCWarning(LOG_LIB) << "Nothing to create"; - return; - }; - - T *newItem = new T(this, fileName, dirs); - newItem->setNumber(number); - if (newItem->showConfiguration(configArgs()) == 1) { - initItems(); - repaint(); - } - }; - - void deleteItem() - { - T *source = itemFromWidget(); - if (source == nullptr) { - qCWarning(LOG_LIB) << "Nothing to delete"; - return; - }; - - if (source->tryDelete()) { - initItems(); - repaint(); - } - }; - - void editItem() - { - T *source = itemFromWidget(); - if (source == nullptr) { - qCWarning(LOG_LIB) << "Nothing to edit"; - return; - }; - - if (source->showConfiguration(configArgs()) == 1) { - initItems(); - repaint(); + m_activeItems.append(static_cast(item)); } }; }; diff --git a/sources/awesomewidgets/extquotes.cpp b/sources/awesomewidgets/extquotes.cpp index 473b2a1..525d45c 100644 --- a/sources/awesomewidgets/extquotes.cpp +++ b/sources/awesomewidgets/extquotes.cpp @@ -33,14 +33,14 @@ #include "awdebug.h" -ExtQuotes::ExtQuotes(QWidget *parent, const QString quotesName, - const QStringList directories) - : AbstractExtItem(parent, quotesName, directories) +ExtQuotes::ExtQuotes(QWidget *parent, const QString filePath) + : AbstractExtItem(parent, filePath) , ui(new Ui::ExtQuotes) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - readConfiguration(); + if (!filePath.isEmpty()) + readConfiguration(); ui->setupUi(this); translate(); @@ -76,11 +76,10 @@ ExtQuotes::~ExtQuotes() ExtQuotes *ExtQuotes::copy(const QString _fileName, const int _number) { - qCDebug(LOG_LIB) << "File" << _fileName; - qCDebug(LOG_LIB) << "Number" << _number; + qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; - ExtQuotes *item = new ExtQuotes(static_cast(parent()), _fileName, - directories()); + ExtQuotes *item + = new ExtQuotes(static_cast(parent()), _fileName); copyDefaults(item); item->setNumber(_number); item->setTicker(ticker()); @@ -106,6 +105,7 @@ void ExtQuotes::setTicker(const QString _ticker) qCDebug(LOG_LIB) << "Ticker" << _ticker; m_ticker = _ticker; + initUrl(); } @@ -113,19 +113,11 @@ void ExtQuotes::readConfiguration() { AbstractExtItem::readConfiguration(); - for (int i = directories().count() - 1; i >= 0; i--) { - if (!QDir(directories().at(i)) - .entryList(QDir::Files) - .contains(fileName())) - continue; - QSettings settings( - QString("%1/%2").arg(directories().at(i)).arg(fileName()), - QSettings::IniFormat); + QSettings settings(fileName(), QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setTicker(settings.value(QString("X-AW-Ticker"), m_ticker).toString()); - settings.endGroup(); - } + settings.beginGroup(QString("Desktop Entry")); + setTicker(settings.value(QString("X-AW-Ticker"), m_ticker).toString()); + settings.endGroup(); // update for current API if ((apiVersion() > 0) && (apiVersion() < AWEQAPI)) { @@ -135,15 +127,7 @@ void ExtQuotes::readConfiguration() writeConfiguration(); } - // init query - m_url = QUrl(YAHOO_QUOTES_URL); - QUrlQuery params; - params.addQueryItem(QString("format"), QString("json")); - params.addQueryItem(QString("env"), - QString("store://datatables.org/alltableswithkeys")); - params.addQueryItem(QString("q"), - QString(YAHOO_QUOTES_QUERY).arg(m_ticker)); - m_url.setQuery(params); + bumpApi(AWEQAPI); } @@ -200,9 +184,7 @@ void ExtQuotes::writeConfiguration() const { AbstractExtItem::writeConfiguration(); - QSettings settings( - QString("%1/%2").arg(directories().first()).arg(fileName()), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); @@ -235,35 +217,51 @@ void ExtQuotes::quotesReplyReceived(QNetworkReply *reply) // ask value = jsonQuotes[QString("Ask")].toString().toDouble(); values[tag(QString("askchg"))] - = values[QString("ask")].toDouble() == 0.0 + = values[tag(QString("ask"))].toDouble() == 0.0 ? 0.0 - : value - values[QString("ask")].toDouble(); - values[tag(QString("percaskchg"))] = 100.0 - * values[QString("askchg")].toDouble() - / values[QString("ask")].toDouble(); + : value - values[tag(QString("ask"))].toDouble(); + values[tag(QString("percaskchg"))] + = 100.0 * values[tag(QString("askchg"))].toDouble() + / values[tag(QString("ask"))].toDouble(); values[tag(QString("ask"))] = value; // bid value = jsonQuotes[QString("Bid")].toString().toDouble(); values[tag(QString("bidchg"))] - = values[QString("bid")].toDouble() == 0.0 + = values[tag(QString("bid"))].toDouble() == 0.0 ? 0.0 - : value - values[QString("bid")].toDouble(); - values[tag(QString("percbidchg"))] = 100.0 - * values[QString("bidchg")].toDouble() - / values[QString("bid")].toDouble(); + : value - values[tag(QString("bid"))].toDouble(); + values[tag(QString("percbidchg"))] + = 100.0 * values[tag(QString("bidchg"))].toDouble() + / values[tag(QString("bid"))].toDouble(); values[tag(QString("bid"))] = value; // last trade value = jsonQuotes[QString("LastTradePriceOnly")].toString().toDouble(); values[tag(QString("pricechg"))] - = values[QString("price")].toDouble() == 0.0 + = values[tag(QString("price"))].toDouble() == 0.0 ? 0.0 - : value - values[QString("price")].toDouble(); + : value - values[tag(QString("price"))].toDouble(); values[tag(QString("percpricechg"))] - = 100.0 * values[QString("pricechg")].toDouble() - / values[QString("price")].toDouble(); + = 100.0 * values[tag(QString("pricechg"))].toDouble() + / values[tag(QString("price"))].toDouble(); values[tag(QString("price"))] = value; + + emit(dataReceived(values)); +} + + +void ExtQuotes::initUrl() +{ + // init query + m_url = QUrl(YAHOO_QUOTES_URL); + QUrlQuery params; + params.addQueryItem(QString("format"), QString("json")); + params.addQueryItem(QString("env"), + QString("store://datatables.org/alltableswithkeys")); + params.addQueryItem(QString("q"), + QString(YAHOO_QUOTES_QUERY).arg(m_ticker)); + m_url.setQuery(params); } diff --git a/sources/awesomewidgets/extquotes.h b/sources/awesomewidgets/extquotes.h index 4ec2757..d5e2256 100644 --- a/sources/awesomewidgets/extquotes.h +++ b/sources/awesomewidgets/extquotes.h @@ -38,9 +38,7 @@ class ExtQuotes : public AbstractExtItem Q_PROPERTY(QString ticker READ ticker WRITE setTicker) public: - explicit ExtQuotes(QWidget *parent = nullptr, - const QString quotesName = QString(), - const QStringList directories = QStringList()); + explicit ExtQuotes(QWidget *parent, const QString filePath = QString()); virtual ~ExtQuotes(); ExtQuotes *copy(const QString _fileName, const int _number); // get methods @@ -59,10 +57,11 @@ private slots: void quotesReplyReceived(QNetworkReply *reply); private: - QNetworkAccessManager *m_manager; + QNetworkAccessManager *m_manager = nullptr; QUrl m_url; bool isRunning = false; - Ui::ExtQuotes *ui; + Ui::ExtQuotes *ui = nullptr; + void initUrl(); void translate(); // properties QString m_ticker = QString("EURUSD=X"); diff --git a/sources/awesomewidgets/extscript.cpp b/sources/awesomewidgets/extscript.cpp index a674ff3..fd5179a 100644 --- a/sources/awesomewidgets/extscript.cpp +++ b/sources/awesomewidgets/extscript.cpp @@ -30,14 +30,14 @@ #include "awdebug.h" -ExtScript::ExtScript(QWidget *parent, const QString scriptName, - const QStringList directories) - : AbstractExtItem(parent, scriptName, directories) +ExtScript::ExtScript(QWidget *parent, const QString filePath) + : AbstractExtItem(parent, filePath) , ui(new Ui::ExtScript) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - readConfiguration(); + if (!filePath.isEmpty()) + readConfiguration(); readJsonFilters(); ui->setupUi(this); translate(); @@ -65,13 +65,14 @@ ExtScript *ExtScript::copy(const QString _fileName, const int _number) { qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; - ExtScript *item = new ExtScript(static_cast(parent()), _fileName, - directories()); + ExtScript *item + = new ExtScript(static_cast(parent()), _fileName); copyDefaults(item); item->setExecutable(executable()); item->setNumber(_number); item->setPrefix(prefix()); item->setRedirect(redirect()); + item->setFilters(filters()); return item; } @@ -167,13 +168,13 @@ void ExtScript::setStrRedirect(const QString _redirect) qCDebug(LOG_LIB) << "Redirect" << _redirect; if (_redirect == QString("stdout2sdterr")) - m_redirect = Redirect::stdout2stderr; + setRedirect(Redirect::stdout2stderr); else if (_redirect == QString("stderr2sdtout")) - m_redirect = Redirect::stderr2stdout; + setRedirect(Redirect::stderr2stdout); else if (_redirect == QString("swap")) - m_redirect = Redirect::swap; + setRedirect(Redirect::swap); else - m_redirect = Redirect::nothing; + setRedirect(Redirect::nothing); } @@ -215,34 +216,20 @@ void ExtScript::readConfiguration() { AbstractExtItem::readConfiguration(); - for (int i = directories().count() - 1; i >= 0; i--) { - if (!QDir(directories().at(i)) - .entryList(QDir::Files) - .contains(fileName())) - continue; - QSettings settings( - QString("%1/%2").arg(directories().at(i)).arg(fileName()), - QSettings::IniFormat); + QSettings settings(fileName(), QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setExecutable(settings.value(QString("Exec"), m_executable).toString()); - setPrefix(settings.value(QString("X-AW-Prefix"), m_prefix).toString()); - setStrRedirect( - settings.value(QString("X-AW-Redirect"), strRedirect()).toString()); - // api == 3 - setFilters(settings.value(QString("X-AW-Filters"), m_filters) - .toString() - .split(QChar(','), QString::SkipEmptyParts)); - settings.endGroup(); - } + settings.beginGroup(QString("Desktop Entry")); + setExecutable(settings.value(QString("Exec"), m_executable).toString()); + setPrefix(settings.value(QString("X-AW-Prefix"), m_prefix).toString()); + setStrRedirect( + settings.value(QString("X-AW-Redirect"), strRedirect()).toString()); + // api == 3 + setFilters(settings.value(QString("X-AW-Filters"), m_filters) + .toString() + .split(QChar(','), QString::SkipEmptyParts)); + settings.endGroup(); - // update for current API - if ((apiVersion() > 0) && (apiVersion() < AWESAPI)) { - qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" - << AWESAPI; - setApiVersion(AWESAPI); - writeConfiguration(); - } + bumpApi(AWESAPI); } @@ -277,6 +264,9 @@ QVariantHash ExtScript::run() { if (!isActive()) return value; + if (process->state() != QProcess::NotRunning) + qCWarning(LOG_LIB) << "Another process is already running" + << process->state(); if ((times == 1) && (process->state() == QProcess::NotRunning)) { QStringList cmdList; @@ -285,9 +275,11 @@ QVariantHash ExtScript::run() cmdList.append(m_executable); qCInfo(LOG_LIB) << "Run cmd" << cmdList.join(QChar(' ')); process->start(cmdList.join(QChar(' '))); - } else if (times >= interval()) { - times = 0; } + + // update value + if (times >= interval()) + times = 0; times++; return value; @@ -325,7 +317,7 @@ int ExtScript::showConfiguration(const QVariant args) setExecutable(ui->lineEdit_command->text()); setPrefix(ui->lineEdit_prefix->text()); setActive(ui->checkBox_active->checkState() == Qt::Checked); - setStrRedirect(ui->comboBox_redirect->currentText()); + setRedirect(static_cast(ui->comboBox_redirect->currentIndex())); setInterval(ui->spinBox_interval->value()); // filters updateFilter(QString("color"), @@ -344,9 +336,7 @@ void ExtScript::writeConfiguration() const { AbstractExtItem::writeConfiguration(); - QSettings settings( - QString("%1/%2").arg(directories().first()).arg(fileName()), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); @@ -389,6 +379,7 @@ void ExtScript::updateValue() // filters value[tag(QString("custom"))] = applyFilters(strValue); + emit(dataReceived(value)); } diff --git a/sources/awesomewidgets/extscript.h b/sources/awesomewidgets/extscript.h index 8d1e9b1..5189a63 100644 --- a/sources/awesomewidgets/extscript.h +++ b/sources/awesomewidgets/extscript.h @@ -37,11 +37,14 @@ class ExtScript : public AbstractExtItem Q_PROPERTY(Redirect redirect READ redirect WRITE setRedirect) public: - enum class Redirect { stdout2stderr, nothing, stderr2stdout, swap }; + enum class Redirect { + stdout2stderr = 0, + nothing = 1, + stderr2stdout = 2, + swap = 3 + }; - explicit ExtScript(QWidget *parent = nullptr, - const QString scriptName = QString(), - const QStringList directories = QStringList()); + explicit ExtScript(QWidget *parent, const QString filePath = QString()); virtual ~ExtScript(); ExtScript *copy(const QString _fileName, const int _number); // get methods @@ -74,7 +77,7 @@ private slots: private: QProcess *process = nullptr; - Ui::ExtScript *ui; + Ui::ExtScript *ui = nullptr; void translate(); // properties QString m_executable = QString("/usr/bin/true"); diff --git a/sources/awesomewidgets/extupgrade.cpp b/sources/awesomewidgets/extupgrade.cpp index 9c23963..951d4d1 100644 --- a/sources/awesomewidgets/extupgrade.cpp +++ b/sources/awesomewidgets/extupgrade.cpp @@ -28,14 +28,14 @@ #include "awdebug.h" -ExtUpgrade::ExtUpgrade(QWidget *parent, const QString upgradeName, - const QStringList directories) - : AbstractExtItem(parent, upgradeName, directories) +ExtUpgrade::ExtUpgrade(QWidget *parent, const QString filePath) + : AbstractExtItem(parent, filePath) , ui(new Ui::ExtUpgrade) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - readConfiguration(); + if (!filePath.isEmpty()) + readConfiguration(); ui->setupUi(this); translate(); @@ -61,8 +61,8 @@ ExtUpgrade *ExtUpgrade::copy(const QString _fileName, const int _number) { qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; - ExtUpgrade *item = new ExtUpgrade(static_cast(parent()), - _fileName, directories()); + ExtUpgrade *item + = new ExtUpgrade(static_cast(parent()), _fileName); copyDefaults(item); item->setExecutable(executable()); item->setFilter(filter()); @@ -127,30 +127,16 @@ void ExtUpgrade::readConfiguration() { AbstractExtItem::readConfiguration(); - for (int i = directories().count() - 1; i >= 0; i--) { - if (!QDir(directories().at(i)) - .entryList(QDir::Files) - .contains(fileName())) - continue; - QSettings settings( - QString("%1/%2").arg(directories().at(i)).arg(fileName()), - QSettings::IniFormat); + QSettings settings(fileName(), QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setExecutable(settings.value(QString("Exec"), m_executable).toString()); - setNull(settings.value(QString("X-AW-Null"), m_null).toInt()); - // api == 3 - setFilter(settings.value(QString("X-AW-Filter"), m_filter).toString()); - settings.endGroup(); - } + settings.beginGroup(QString("Desktop Entry")); + setExecutable(settings.value(QString("Exec"), m_executable).toString()); + setNull(settings.value(QString("X-AW-Null"), m_null).toInt()); + // api == 3 + setFilter(settings.value(QString("X-AW-Filter"), m_filter).toString()); + settings.endGroup(); - // update for current API - if ((apiVersion() > 0) && (apiVersion() < AWEUAPI)) { - qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" - << AWEUAPI; - setApiVersion(AWEUAPI); - writeConfiguration(); - } + bumpApi(AWEUAPI); } @@ -163,9 +149,11 @@ QVariantHash ExtUpgrade::run() QString cmd = QString("sh -c \"%1\"").arg(m_executable); qCInfo(LOG_LIB) << "Run cmd" << cmd; process->start(cmd); - } else if (times >= interval()) { - times = 0; } + + // update value + if (times >= interval()) + times = 0; times++; return value; @@ -208,9 +196,7 @@ void ExtUpgrade::writeConfiguration() const { AbstractExtItem::writeConfiguration(); - QSettings settings( - QString("%1/%2").arg(directories().first()).arg(fileName()), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); @@ -239,6 +225,8 @@ void ExtUpgrade::updateValue() .filter(QRegExp(m_filter)) .count(); }(qoutput); + + emit(dataReceived(value)); } diff --git a/sources/awesomewidgets/extupgrade.h b/sources/awesomewidgets/extupgrade.h index c5a3b8a..0c94b45 100644 --- a/sources/awesomewidgets/extupgrade.h +++ b/sources/awesomewidgets/extupgrade.h @@ -36,9 +36,7 @@ class ExtUpgrade : public AbstractExtItem Q_PROPERTY(int null READ null WRITE setNull) public: - explicit ExtUpgrade(QWidget *parent = nullptr, - const QString upgradeName = QString(), - const QStringList directories = QStringList()); + explicit ExtUpgrade(QWidget *parent, const QString filePath = QString()); virtual ~ExtUpgrade(); ExtUpgrade *copy(const QString _fileName, const int _number); // get methods @@ -62,7 +60,7 @@ private slots: private: QProcess *process = nullptr; - Ui::ExtUpgrade *ui; + Ui::ExtUpgrade *ui = nullptr; void translate(); // properties QString m_executable = QString("/usr/bin/true"); diff --git a/sources/awesomewidgets/extweather.cpp b/sources/awesomewidgets/extweather.cpp index 63f8c18..456d893 100644 --- a/sources/awesomewidgets/extweather.cpp +++ b/sources/awesomewidgets/extweather.cpp @@ -27,21 +27,22 @@ #include #include #include -#include #include #include "awdebug.h" +#include "owmweatherprovider.h" +#include "yahooweatherprovider.h" -ExtWeather::ExtWeather(QWidget *parent, const QString weatherName, - const QStringList directories) - : AbstractExtItem(parent, weatherName, directories) +ExtWeather::ExtWeather(QWidget *parent, const QString filePath) + : AbstractExtItem(parent, filePath) , ui(new Ui::ExtWeather) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - readConfiguration(); + if (!filePath.isEmpty()) + readConfiguration(); readJsonMap(); ui->setupUi(this); translate(); @@ -68,6 +69,7 @@ ExtWeather::~ExtWeather() SLOT(weatherReplyReceived(QNetworkReply *))); m_manager->deleteLater(); + delete m_providerObject; delete ui; } @@ -76,13 +78,14 @@ ExtWeather *ExtWeather::copy(const QString _fileName, const int _number) { qCDebug(LOG_LIB) << "File" << _fileName << "number" << _number; - ExtWeather *item = new ExtWeather(static_cast(parent()), - _fileName, directories()); + ExtWeather *item + = new ExtWeather(static_cast(parent()), _fileName); copyDefaults(item); item->setCity(city()); item->setCountry(country()); item->setImage(image()); item->setNumber(_number); + item->setProvider(provider()); item->setTs(ts()); return item; @@ -117,6 +120,28 @@ bool ExtWeather::image() const } +ExtWeather::Provider ExtWeather::provider() const +{ + return m_provider; +} + + +QString ExtWeather::strProvider() const +{ + QString value; + switch (m_provider) { + case Provider::OWM: + value = QString("OWM"); + break; + case Provider::Yahoo: + value = QString("Yahoo"); + break; + } + + return value; +} + + int ExtWeather::ts() const { return m_ts; @@ -134,6 +159,7 @@ void ExtWeather::setCity(const QString _city) qCDebug(LOG_LIB) << "City" << _city; m_city = _city; + initProvider(); } @@ -142,6 +168,7 @@ void ExtWeather::setCountry(const QString _country) qCDebug(LOG_LIB) << "Country" << _country; m_country = _country; + initProvider(); } @@ -153,11 +180,32 @@ void ExtWeather::setImage(const bool _image) } +void ExtWeather::setProvider(const Provider _provider) +{ + qCDebug(LOG_LIB) << "Provider" << static_cast(_provider); + + m_provider = _provider; + initProvider(); +} + + +void ExtWeather::setStrProvider(const QString _provider) +{ + qCDebug(LOG_LIB) << "Provider" << _provider; + + if (_provider == QString("Yahoo")) + setProvider(Provider::Yahoo); + else + setProvider(Provider::OWM); +} + + void ExtWeather::setTs(const int _ts) { qCDebug(LOG_LIB) << "Timestamp" << _ts; m_ts = _ts; + initProvider(); } @@ -165,44 +213,21 @@ void ExtWeather::readConfiguration() { AbstractExtItem::readConfiguration(); - for (int i = directories().count() - 1; i >= 0; i--) { - if (!QDir(directories().at(i)) - .entryList(QDir::Files) - .contains(fileName())) - continue; - QSettings settings( - QString("%1/%2").arg(directories().at(i)).arg(fileName()), - QSettings::IniFormat); + QSettings settings(fileName(), QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setCity(settings.value(QString("X-AW-City"), m_city).toString()); - setCountry( - settings.value(QString("X-AW-Country"), m_country).toString()); - setTs(settings.value(QString("X-AW-TS"), m_ts).toInt()); - // api == 2 - setImage( - settings.value(QString("X-AW-Image"), QVariant(m_image)).toString() - == QString("true")); - settings.endGroup(); - } + settings.beginGroup(QString("Desktop Entry")); + setCity(settings.value(QString("X-AW-City"), m_city).toString()); + setCountry(settings.value(QString("X-AW-Country"), m_country).toString()); + setTs(settings.value(QString("X-AW-TS"), m_ts).toInt()); + // api == 2 + setImage(settings.value(QString("X-AW-Image"), QVariant(m_image)).toString() + == QString("true")); + // api == 3 + setStrProvider( + settings.value(QString("X-AW-Provider"), strProvider()).toString()); + settings.endGroup(); - // update for current API - if ((apiVersion() > 0) && (apiVersion() < AWEWAPI)) { - qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" - << AWEWAPI; - setApiVersion(AWEWAPI); - writeConfiguration(); - } - - // init query - m_url = QUrl(YAHOO_WEATHER_URL); - QUrlQuery params; - params.addQueryItem(QString("format"), QString("json")); - params.addQueryItem(QString("env"), - QString("store://datatables.org/alltableswithkeys")); - params.addQueryItem(QString("q"), - QString(YAHOO_WEATHER_QUERY).arg(m_city, m_country)); - m_url.setQuery(params); + bumpApi(AWEWAPI); } @@ -240,7 +265,8 @@ QVariantHash ExtWeather::run() if (times == 1) { qCInfo(LOG_LIB) << "Send request"; isRunning = true; - QNetworkReply *reply = m_manager->get(QNetworkRequest(m_url)); + QNetworkReply *reply + = m_manager->get(QNetworkRequest(m_providerObject->url())); new QReplyTimeout(reply, REQUEST_TIMEOUT); } @@ -260,6 +286,7 @@ int ExtWeather::showConfiguration(const QVariant args) ui->lineEdit_name->setText(name()); ui->lineEdit_comment->setText(comment()); ui->label_numberValue->setText(QString("%1").arg(number())); + ui->comboBox_provider->setCurrentIndex(static_cast(m_provider)); ui->lineEdit_city->setText(m_city); ui->lineEdit_country->setText(m_country); ui->spinBox_timestamp->setValue(m_ts); @@ -277,6 +304,7 @@ int ExtWeather::showConfiguration(const QVariant args) setApiVersion(AWEWAPI); setCity(ui->lineEdit_city->text()); setCountry(ui->lineEdit_country->text()); + setProvider(static_cast(ui->comboBox_provider->currentIndex())); setTs(ui->spinBox_timestamp->value()); setImage(ui->checkBox_image->checkState() == Qt::Checked); setActive(ui->checkBox_active->checkState() == Qt::Checked); @@ -291,15 +319,14 @@ void ExtWeather::writeConfiguration() const { AbstractExtItem::writeConfiguration(); - QSettings settings( - QString("%1/%2").arg(directories().first()).arg(fileName()), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); settings.setValue(QString("X-AW-City"), m_city); settings.setValue(QString("X-AW-Country"), m_country); settings.setValue(QString("X-AW-Image"), m_image); + settings.setValue(QString("X-AW-Provider"), strProvider()); settings.setValue(QString("X-AW-TS"), m_ts); settings.endGroup(); @@ -322,53 +349,31 @@ void ExtWeather::weatherReplyReceived(QNetworkReply *reply) return; } - // convert to map - QVariantMap json = jsonDoc.toVariant().toMap()[QString("query")].toMap(); - if (json[QString("count")].toInt() != 1) { - qCWarning(LOG_LIB) << "Found data count" - << json[QString("count")].toInt() << "is not 1"; + QVariantHash data = m_providerObject->parse(jsonDoc.toVariant().toMap()); + if (data.isEmpty()) return; - } - QVariantMap results - = json[QString("results")].toMap()[QString("channel")].toMap(); - QVariantMap item = results[QString("item")].toMap(); + values = data; + values[tag(QString("weather"))] + = weatherFromInt(values[tag(QString("weatherId"))].toInt()); - if (m_ts == 0) { - // current weather - int id = item[QString("condition")].toMap()[QString("code")].toInt(); - values[tag(QString("weatherId"))] = id; - values[tag(QString("weather"))] = weatherFromInt(id); - values[tag(QString("temperature"))] - = item[QString("condition")].toMap()[QString("temp")].toInt(); - values[tag(QString("timestamp"))] - = item[QString("condition")].toMap()[QString("date")].toString(); - values[tag(QString("humidity"))] = results[QString("atmosphere")] - .toMap()[QString("humidity")] - .toInt(); - values[tag(QString("pressure"))] - = static_cast(results[QString("atmosphere")] - .toMap()[QString("pressure")] - .toFloat()); - } else { - // forecast weather - QVariantList weatherList = item[QString("forecast")].toList(); - QVariantMap weatherMap = weatherList.count() < m_ts - ? weatherList.last().toMap() - : weatherList.at(m_ts).toMap(); - int id = weatherMap[QString("code")].toInt(); - values[tag(QString("weatherId"))] = id; - values[tag(QString("weather"))] = weatherFromInt(id); - values[tag(QString("timestamp"))] - = weatherMap[QString("date")].toString(); - // yahoo provides high and low temperatures. Lets calculate average one - values[tag(QString("temperature"))] - = (weatherMap[QString("high")].toFloat() - + weatherMap[QString("low")].toFloat()) - / 2.0; - // ... and no forecast data for humidity and pressure - values[tag(QString("humidity"))] = 0; - values[tag(QString("pressure"))] = 0.0; + emit(dataReceived(values)); +} + + +void ExtWeather::initProvider() +{ + delete m_providerObject; + + switch (m_provider) { + case Provider::OWM: + m_providerObject = new OWMWeatherProvider(this, number()); + break; + case Provider::Yahoo: + m_providerObject = new YahooWeatherProvider(this, number()); + break; } + + return m_providerObject->initUrl(m_city, m_country, m_ts); } @@ -377,6 +382,7 @@ void ExtWeather::translate() ui->label_name->setText(i18n("Name")); ui->label_comment->setText(i18n("Comment")); ui->label_number->setText(i18n("Tag")); + ui->label_provider->setText(i18n("Provider")); ui->label_city->setText(i18n("City")); ui->label_country->setText(i18n("Country")); ui->label_timestamp->setText(i18n("Timestamp")); diff --git a/sources/awesomewidgets/extweather.h b/sources/awesomewidgets/extweather.h index 1320a22..8ee174c 100644 --- a/sources/awesomewidgets/extweather.h +++ b/sources/awesomewidgets/extweather.h @@ -22,12 +22,8 @@ #include "abstractextitem.h" -#define YAHOO_WEATHER_URL "https://query.yahooapis.com/v1/public/yql" -#define YAHOO_WEATHER_QUERY \ - "select * from weather.forecast where u='c' and woeid in (select woeid " \ - "from geo.places(1) where text='%1, %2')" - +class AbstractWeatherProvider; namespace Ui { class ExtWeather; @@ -39,12 +35,14 @@ class ExtWeather : public AbstractExtItem Q_PROPERTY(QString city READ city WRITE setCity) Q_PROPERTY(QString country READ country WRITE setCountry) Q_PROPERTY(bool image READ image WRITE setImage) + Q_PROPERTY(Provider povider READ provider WRITE setProvider) + Q_PROPERTY(QString strPovider READ strProvider WRITE setStrProvider) Q_PROPERTY(int ts READ ts WRITE setTs) public: - explicit ExtWeather(QWidget *parent = nullptr, - const QString weatherName = QString(), - const QStringList directories = QStringList()); + enum class Provider { OWM = 0, Yahoo = 1 }; + + explicit ExtWeather(QWidget *parent, const QString filePath = QString()); virtual ~ExtWeather(); ExtWeather *copy(const QString _fileName, const int _number); QString weatherFromInt(const int _id) const; @@ -52,12 +50,16 @@ public: QString city() const; QString country() const; bool image() const; + Provider provider() const; + QString strProvider() const; int ts() const; QString uniq() const; // set methods void setCity(const QString _city = QString("London")); void setCountry(const QString _country = QString("uk")); void setImage(const bool _image = false); + void setProvider(const Provider _provider = Provider::OWM); + void setStrProvider(const QString _provider = QString("OWM")); void setTs(const int _ts = 0); public slots: @@ -71,15 +73,17 @@ private slots: void weatherReplyReceived(QNetworkReply *reply); private: - QNetworkAccessManager *m_manager; - QUrl m_url; + QNetworkAccessManager *m_manager = nullptr; + AbstractWeatherProvider *m_providerObject = nullptr; bool isRunning = false; - Ui::ExtWeather *ui; + Ui::ExtWeather *ui = nullptr; + void initProvider(); void translate(); // properties QString m_city = QString("London"); QString m_country = QString("uk"); bool m_image = false; + Provider m_provider = Provider::OWM; int m_ts = 0; QVariantMap m_jsonMap = QVariantMap(); // values diff --git a/sources/awesomewidgets/extweather.ui b/sources/awesomewidgets/extweather.ui index 5015643..0b5bb43 100644 --- a/sources/awesomewidgets/extweather.ui +++ b/sources/awesomewidgets/extweather.ui @@ -7,7 +7,7 @@ 0 0 420 - 301 + 333 @@ -81,6 +81,46 @@ + + + + + + + 0 + 0 + + + + Provider + + + Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter + + + + + + + + 0 + 0 + + + + + OWM + + + + + Yahoo + + + + + + diff --git a/sources/awesomewidgets/graphicalitem.cpp b/sources/awesomewidgets/graphicalitem.cpp index 4579a06..d236cdc 100644 --- a/sources/awesomewidgets/graphicalitem.cpp +++ b/sources/awesomewidgets/graphicalitem.cpp @@ -32,19 +32,17 @@ #include "graphicalitemhelper.h" -GraphicalItem::GraphicalItem(QWidget *parent, const QString desktopName, - const QStringList directories) - : AbstractExtItem(parent, desktopName, directories) +GraphicalItem::GraphicalItem(QWidget *parent, const QString filePath) + : AbstractExtItem(parent, filePath) , ui(new Ui::GraphicalItem) { qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; - readConfiguration(); + if (!filePath.isEmpty()) + readConfiguration(); ui->setupUi(this); translate(); - initScene(); - connect(ui->checkBox_custom, SIGNAL(stateChanged(int)), this, SLOT(changeValue(int))); connect(ui->comboBox_type, SIGNAL(currentIndexChanged(int)), this, @@ -70,21 +68,21 @@ GraphicalItem *GraphicalItem::copy(const QString _fileName, const int _number) { qCDebug(LOG_LIB) << "File" << _fileName << "with number" << _number; - GraphicalItem *item = new GraphicalItem(static_cast(parent()), - _fileName, directories()); + GraphicalItem *item + = new GraphicalItem(static_cast(parent()), _fileName); copyDefaults(item); item->setActiveColor(m_activeColor); item->setBar(m_bar); item->setCount(m_count); item->setCustom(m_custom); item->setDirection(m_direction); - item->setHeight(m_height); + item->setItemHeight(m_height); item->setInactiveColor(m_inactiveColor); item->setMaxValue(m_maxValue); item->setMinValue(m_minValue); item->setNumber(_number); item->setType(m_type); - item->setWidth(m_width); + item->setItemWidth(m_width); return item; } @@ -141,6 +139,31 @@ QString GraphicalItem::image(const QVariant &value) } +void GraphicalItem::initScene() +{ + // cleanup + delete m_helper; + delete m_scene; + + // init scene + m_scene = new QGraphicsScene(); + m_scene->setBackgroundBrush(QBrush(Qt::NoBrush)); + // init view + m_view = new QGraphicsView(m_scene); + m_view->setStyleSheet(QString("background: transparent")); + m_view->setContentsMargins(0, 0, 0, 0); + m_view->setFrameShape(QFrame::NoFrame); + m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + m_view->resize(m_width + 5, m_height + 5); + + // init helper + m_helper = new GraphicalItemHelper(this, m_scene); + m_helper->setParameters(m_activeColor, m_inactiveColor, m_width, m_height, + m_count); +} + + QString GraphicalItem::bar() const { return m_bar; @@ -153,24 +176,36 @@ QString GraphicalItem::activeColor() const } -QString GraphicalItem::inactiveColor() const -{ - return m_inactiveColor; -} - - int GraphicalItem::count() const { return m_count; } +QString GraphicalItem::inactiveColor() const +{ + return m_inactiveColor; +} + + bool GraphicalItem::isCustom() const { return m_custom; } +int GraphicalItem::itemHeight() const +{ + return m_height; +} + + +int GraphicalItem::itemWidth() const +{ + return m_width; +} + + float GraphicalItem::maxValue() const { return m_maxValue; @@ -236,24 +271,12 @@ QString GraphicalItem::strDirection() const } -int GraphicalItem::height() const -{ - return m_height; -} - - QStringList GraphicalItem::usedKeys() const { return m_usedKeys; } -int GraphicalItem::width() const -{ - return m_width; -} - - QString GraphicalItem::uniq() const { return m_bar; @@ -302,6 +325,26 @@ void GraphicalItem::setInactiveColor(const QString _color) } +void GraphicalItem::setItemHeight(const int _height) +{ + qCDebug(LOG_LIB) << "Height" << _height; + if (_height <= 0) + return; + + m_height = _height; +} + + +void GraphicalItem::setItemWidth(const int _width) +{ + qCDebug(LOG_LIB) << "Width" << _width; + if (_width <= 0) + return; + + m_width = _width; +} + + void GraphicalItem::setMaxValue(const float _value) { qCDebug(LOG_LIB) << "Max value" << _value; @@ -362,16 +405,6 @@ void GraphicalItem::setStrDirection(const QString _direction) } -void GraphicalItem::setHeight(const int _height) -{ - qCDebug(LOG_LIB) << "Height" << _height; - if (_height <= 0) - return; - - m_height = _height; -} - - void GraphicalItem::setUsedKeys(const QStringList _usedKeys) { qCDebug(LOG_LIB) << "Used keys" << _usedKeys; @@ -387,69 +420,43 @@ void GraphicalItem::setUsedKeys(const QStringList _usedKeys) } -void GraphicalItem::setWidth(const int _width) -{ - qCDebug(LOG_LIB) << "Width" << _width; - if (_width <= 0) - return; - - m_width = _width; -} - - void GraphicalItem::readConfiguration() { AbstractExtItem::readConfiguration(); - for (int i = directories().count() - 1; i >= 0; i--) { - if (!QDir(directories().at(i)) - .entryList(QDir::Files) - .contains(fileName())) - continue; - QSettings settings( - QString("%1/%2").arg(directories().at(i)).arg(fileName()), - QSettings::IniFormat); + QSettings settings(fileName(), QSettings::IniFormat); - settings.beginGroup(QString("Desktop Entry")); - setCount(settings.value(QString("X-AW-Count"), m_count).toInt()); - setCustom(settings.value(QString("X-AW-Custom"), m_custom).toBool()); - setBar(settings.value(QString("X-AW-Value"), m_bar).toString()); - setMaxValue(settings.value(QString("X-AW-Max"), m_maxValue).toFloat()); - setMinValue(settings.value(QString("X-AW-Min"), m_minValue).toFloat()); - setActiveColor( - settings.value(QString("X-AW-ActiveColor"), m_activeColor) - .toString()); - setInactiveColor( - settings.value(QString("X-AW-InactiveColor"), m_inactiveColor) - .toString()); - setStrType(settings.value(QString("X-AW-Type"), strType()).toString()); - setStrDirection( - settings.value(QString("X-AW-Direction"), strDirection()) - .toString()); - setHeight(settings.value(QString("X-AW-Height"), m_height).toInt()); - setWidth(settings.value(QString("X-AW-Width"), m_width).toInt()); - // api == 5 - if (apiVersion() < 5) { - QString prefix; - prefix = m_activeColor.startsWith(QString("/")) - ? QString("file://%1") - : QString("color://%1"); - m_activeColor = prefix.arg(m_activeColor); - prefix = m_inactiveColor.startsWith(QString("/")) - ? QString("file://%1") - : QString("color://%1"); - m_inactiveColor = prefix.arg(m_inactiveColor); - } - settings.endGroup(); + settings.beginGroup(QString("Desktop Entry")); + setCount(settings.value(QString("X-AW-Count"), m_count).toInt()); + setCustom(settings.value(QString("X-AW-Custom"), m_custom).toBool()); + setBar(settings.value(QString("X-AW-Value"), m_bar).toString()); + setMaxValue(settings.value(QString("X-AW-Max"), m_maxValue).toFloat()); + setMinValue(settings.value(QString("X-AW-Min"), m_minValue).toFloat()); + setActiveColor( + settings.value(QString("X-AW-ActiveColor"), m_activeColor).toString()); + setInactiveColor( + settings.value(QString("X-AW-InactiveColor"), m_inactiveColor) + .toString()); + setStrType(settings.value(QString("X-AW-Type"), strType()).toString()); + setStrDirection( + settings.value(QString("X-AW-Direction"), strDirection()).toString()); + setItemHeight(settings.value(QString("X-AW-Height"), m_height).toInt()); + setItemWidth(settings.value(QString("X-AW-Width"), m_width).toInt()); + // api == 5 + if (apiVersion() < 5) { + QString prefix; + prefix = m_activeColor.startsWith(QString("/")) ? QString("file://%1") + : QString("color://%1"); + m_activeColor = prefix.arg(m_activeColor); + prefix = m_inactiveColor.startsWith(QString("/")) + ? QString("file://%1") + : QString("color://%1"); + m_inactiveColor = prefix.arg(m_inactiveColor); } + settings.endGroup(); - // update for current API - if ((apiVersion() > 0) && (apiVersion() < AWGIAPI)) { - qCWarning(LOG_LIB) << "Bump API version from" << apiVersion() << "to" - << AWGIAPI; - setApiVersion(AWGIAPI); - writeConfiguration(); - } + bumpApi(AWGIAPI); + initScene(); } @@ -506,10 +513,11 @@ int GraphicalItem::showConfiguration(const QVariant args) setMinValue(ui->doubleSpinBox_min->value()); setActiveColor(ui->lineEdit_activeColor->text()); setInactiveColor(ui->lineEdit_inactiveColor->text()); - setStrType(ui->comboBox_type->currentText()); - setStrDirection(ui->comboBox_direction->currentText()); - setHeight(ui->spinBox_height->value()); - setWidth(ui->spinBox_width->value()); + setType(static_cast(ui->comboBox_type->currentIndex())); + setDirection( + static_cast(ui->comboBox_direction->currentIndex())); + setItemHeight(ui->spinBox_height->value()); + setItemWidth(ui->spinBox_width->value()); writeConfiguration(); return ret; @@ -520,9 +528,7 @@ void GraphicalItem::writeConfiguration() const { AbstractExtItem::writeConfiguration(); - QSettings settings( - QString("%1/%2").arg(directories().first()).arg(fileName()), - QSettings::IniFormat); + QSettings settings(writtableConfig(), QSettings::IniFormat); qCInfo(LOG_LIB) << "Configuration file" << settings.fileName(); settings.beginGroup(QString("Desktop Entry")); @@ -609,27 +615,6 @@ void GraphicalItem::changeValue(const int state) } -void GraphicalItem::initScene() -{ - // init scene - m_scene = new QGraphicsScene(); - m_scene->setBackgroundBrush(QBrush(Qt::NoBrush)); - // init view - m_view = new QGraphicsView(m_scene); - m_view->setStyleSheet(QString("background: transparent")); - m_view->setContentsMargins(0, 0, 0, 0); - m_view->setFrameShape(QFrame::NoFrame); - m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view->resize(m_width + 5, m_height + 5); - - // init helper - m_helper = new GraphicalItemHelper(this, m_scene); - m_helper->setParameters(m_activeColor, m_inactiveColor, m_width, m_height, - m_count); -} - - void GraphicalItem::translate() { ui->label_name->setText(i18n("Name")); diff --git a/sources/awesomewidgets/graphicalitem.h b/sources/awesomewidgets/graphicalitem.h index 24af844..cbfe3a2 100644 --- a/sources/awesomewidgets/graphicalitem.h +++ b/sources/awesomewidgets/graphicalitem.h @@ -40,39 +40,44 @@ class GraphicalItem : public AbstractExtItem Q_PROPERTY(int count READ count WRITE setCount) Q_PROPERTY(bool custom READ isCustom WRITE setCustom) Q_PROPERTY(QString inactiveColor READ inactiveColor WRITE setInactiveColor) + Q_PROPERTY(int itemHeight READ itemHeight WRITE setItemHeight) + Q_PROPERTY(int itemWidth READ itemWidth WRITE setItemWidth) Q_PROPERTY(Type type READ type WRITE setType) Q_PROPERTY(Direction direction READ direction WRITE setDirection) - Q_PROPERTY(int height READ height WRITE setHeight) Q_PROPERTY(float maxValue READ maxValue WRITE setMaxValue) Q_PROPERTY(float minValue READ minValue WRITE setMinValue) Q_PROPERTY(QStringList usedKeys READ usedKeys WRITE setUsedKeys) - Q_PROPERTY(int width READ width WRITE setWidth) public: enum class Direction { LeftToRight = 0, RightToLeft = 1 }; - enum class Type { Horizontal, Vertical, Circle, Graph, Bars }; + enum class Type { + Horizontal = 0, + Vertical = 1, + Circle = 2, + Graph = 3, + Bars = 4 + }; - explicit GraphicalItem(QWidget *parent = nullptr, - const QString desktopName = QString(), - const QStringList directories = QStringList()); + explicit GraphicalItem(QWidget *parent, const QString filePath = QString()); virtual ~GraphicalItem(); GraphicalItem *copy(const QString _fileName, const int _number); QString image(const QVariant &value); + void initScene(); // get methods QString bar() const; QString activeColor() const; - QString inactiveColor() const; int count() const; + QString inactiveColor() const; bool isCustom() const; + int itemHeight() const; + int itemWidth() const; float minValue() const; float maxValue() const; Type type() const; QString strType() const; Direction direction() const; QString strDirection() const; - int height() const; QStringList usedKeys() const; - int width() const; QString uniq() const; // set methods void setBar(const QString _bar = QString("cpu")); @@ -81,15 +86,15 @@ public: void setCustom(const bool _custom = false); void setInactiveColor(const QString _color = QString("color://255,255,255,130")); + void setItemHeight(const int _height = 100); + void setItemWidth(const int _width = 100); void setMinValue(const float _value = 0.0); void setMaxValue(const float _value = 100.0); void setType(const Type _type = Type::Horizontal); void setStrType(const QString _type = QString("Horizontal")); void setDirection(const Direction _direction = Direction::LeftToRight); void setStrDirection(const QString _direction = QString("LeftToRight")); - void setHeight(const int _height = 100); void setUsedKeys(const QStringList _usedKeys = QStringList()); - void setWidth(const int _width = 100); public slots: void readConfiguration(); @@ -106,8 +111,7 @@ private: GraphicalItemHelper *m_helper = nullptr; QGraphicsScene *m_scene = nullptr; QGraphicsView *m_view = nullptr; - Ui::GraphicalItem *ui; - void initScene(); + Ui::GraphicalItem *ui = nullptr; void translate(); // properties QString m_bar = QString("cpu"); diff --git a/sources/awesomewidgets/owmweatherprovider.cpp b/sources/awesomewidgets/owmweatherprovider.cpp new file mode 100644 index 0000000..f3057b9 --- /dev/null +++ b/sources/awesomewidgets/owmweatherprovider.cpp @@ -0,0 +1,112 @@ +/*************************************************************************** + * 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 "owmweatherprovider.h" + +#include +#include + +#include "awdebug.h" + + +OWMWeatherProvider::OWMWeatherProvider(QObject *parent, const int number) + : AbstractWeatherProvider(parent, number) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +OWMWeatherProvider::~OWMWeatherProvider() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +void OWMWeatherProvider::initUrl(const QString city, const QString country, + const int ts) +{ + qCDebug(LOG_LIB) << "Init query for" << city << country << "with ts" << ts; + + m_ts = ts; + + if (m_ts == 0) + m_url = QUrl(OWM_WEATHER_URL); + else + m_url = QUrl(OWM_FORECAST_URL); + QUrlQuery params; + params.addQueryItem(QString("q"), QString("%1,%2").arg(city, country)); + params.addQueryItem(QString("units"), QString("metric")); + m_url.setQuery(params); +} + + +QVariantHash OWMWeatherProvider::parse(const QVariantMap &json) const +{ + qCDebug(LOG_LIB) << "Parse json" << json; + + if (json[QString("cod")].toInt() != 200) { + qCWarning(LOG_LIB) << "Invalid OpenWeatherMap return code" + << json[QString("cod")].toInt(); + return QVariantHash(); + } + + if (m_ts == 0) { + return parseSingleJson(json); + } else { + QVariantList list = json[QString("list")].toList(); + return parseSingleJson(list.count() <= m_ts ? list.at(m_ts - 1).toMap() + : list.last().toMap()); + } +} + + +QUrl OWMWeatherProvider::url() const +{ + return m_url; +} + + +QVariantHash OWMWeatherProvider::parseSingleJson(const QVariantMap &json) const +{ + qCDebug(LOG_LIB) << "Single json data" << json; + + QVariantHash output; + + // weather status + QVariantList weather = json[QString("weather")].toList(); + if (!weather.isEmpty()) { + int id = weather.first().toMap()[QString("id")].toInt(); + output[QString("weatherId%1").arg(number())] = id; + } + + // main data + QVariantMap mainWeather = json[QString("main")].toMap(); + if (!weather.isEmpty()) { + output[QString("humidity%1").arg(number())] + = mainWeather[QString("humidity")].toFloat(); + output[QString("pressure%1").arg(number())] + = mainWeather[QString("pressure")].toFloat(); + output[QString("temperature%1").arg(number())] + = mainWeather[QString("temp")].toFloat(); + } + + // timestamp + output[QString("timestamp%1").arg(number())] + = QDateTime::fromTime_t(json[QString("dt")].toUInt()).toUTC(); + + return output; +} diff --git a/sources/awesomewidgets/owmweatherprovider.h b/sources/awesomewidgets/owmweatherprovider.h new file mode 100644 index 0000000..6f8b639 --- /dev/null +++ b/sources/awesomewidgets/owmweatherprovider.h @@ -0,0 +1,43 @@ +/*************************************************************************** + * 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 OWMWEATHERPROVIDER_H +#define OWMWEATHERPROVIDER_H + +#include "abstractweatherprovider.h" + +#define OWM_WEATHER_URL "http://arcanis.me/weather" +#define OWM_FORECAST_URL "http://arcanis.me/forecast" + + +class OWMWeatherProvider : public AbstractWeatherProvider +{ +public: + explicit OWMWeatherProvider(QObject *parent, const int number); + virtual ~OWMWeatherProvider(); + void initUrl(const QString city, const QString country, const int); + QVariantHash parse(const QVariantMap &json) const; + QUrl url() const; + +private: + QVariantHash parseSingleJson(const QVariantMap &json) const; + int m_ts = 0; + QUrl m_url; +}; + + +#endif /* OWMWEATHERPROVIDER_H */ diff --git a/sources/awesomewidgets/weather/01d.png b/sources/awesomewidgets/weather/01d.png new file mode 100644 index 0000000..7d2f792 Binary files /dev/null and b/sources/awesomewidgets/weather/01d.png differ diff --git a/sources/awesomewidgets/weather/02d.png b/sources/awesomewidgets/weather/02d.png new file mode 100644 index 0000000..d86a99c Binary files /dev/null and b/sources/awesomewidgets/weather/02d.png differ diff --git a/sources/awesomewidgets/weather/03d.png b/sources/awesomewidgets/weather/03d.png new file mode 100644 index 0000000..8a4a8e9 Binary files /dev/null and b/sources/awesomewidgets/weather/03d.png differ diff --git a/sources/awesomewidgets/weather/04d.png b/sources/awesomewidgets/weather/04d.png new file mode 100644 index 0000000..4677b85 Binary files /dev/null and b/sources/awesomewidgets/weather/04d.png differ diff --git a/sources/awesomewidgets/weather/09d.png b/sources/awesomewidgets/weather/09d.png new file mode 100644 index 0000000..b7cb53b Binary files /dev/null and b/sources/awesomewidgets/weather/09d.png differ diff --git a/sources/awesomewidgets/weather/10d.png b/sources/awesomewidgets/weather/10d.png new file mode 100644 index 0000000..b1e1f83 Binary files /dev/null and b/sources/awesomewidgets/weather/10d.png differ diff --git a/sources/awesomewidgets/weather/11d.png b/sources/awesomewidgets/weather/11d.png new file mode 100644 index 0000000..f3ce654 Binary files /dev/null and b/sources/awesomewidgets/weather/11d.png differ diff --git a/sources/awesomewidgets/weather/13d.png b/sources/awesomewidgets/weather/13d.png new file mode 100644 index 0000000..7b64a6c Binary files /dev/null and b/sources/awesomewidgets/weather/13d.png differ diff --git a/sources/awesomewidgets/weather/50d.png b/sources/awesomewidgets/weather/50d.png new file mode 100644 index 0000000..18afb34 Binary files /dev/null and b/sources/awesomewidgets/weather/50d.png differ diff --git a/sources/awesomewidgets/weather/london.desktop b/sources/awesomewidgets/weather/london.desktop index c89d790..cddbedc 100644 --- a/sources/awesomewidgets/weather/london.desktop +++ b/sources/awesomewidgets/weather/london.desktop @@ -3,10 +3,11 @@ Comment=London current weather Encoding=UTF-8 Name=London current X-AW-Active=false -X-AW-ApiVersion=2 +X-AW-ApiVersion=3 X-AW-City=London X-AW-Country=uk X-AW-Image=false X-AW-Interval=3600 X-AW-Number=0 +X-AW-Provider=OWM X-AW-TS=0 diff --git a/sources/awesomewidgets/yahooweatherprovider.cpp b/sources/awesomewidgets/yahooweatherprovider.cpp new file mode 100644 index 0000000..569a269 --- /dev/null +++ b/sources/awesomewidgets/yahooweatherprovider.cpp @@ -0,0 +1,126 @@ +/*************************************************************************** + * 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 "yahooweatherprovider.h" + +#include + +#include "awdebug.h" + + +YahooWeatherProvider::YahooWeatherProvider(QObject *parent, const int number) + : AbstractWeatherProvider(parent, number) +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +YahooWeatherProvider::~YahooWeatherProvider() +{ + qCDebug(LOG_LIB) << __PRETTY_FUNCTION__; +} + + +void YahooWeatherProvider::initUrl(const QString city, const QString country, + const int ts) +{ + qCDebug(LOG_LIB) << "Init query for" << city << country << "with ts" << ts; + + m_ts = ts; + + m_url = QUrl(YAHOO_WEATHER_URL); + QUrlQuery params; + params.addQueryItem(QString("format"), QString("json")); + params.addQueryItem(QString("env"), + QString("store://datatables.org/alltableswithkeys")); + params.addQueryItem(QString("q"), + QString(YAHOO_WEATHER_QUERY).arg(city, country)); + m_url.setQuery(params); +} + + +QVariantHash YahooWeatherProvider::parse(const QVariantMap &json) const +{ + qCDebug(LOG_LIB) << "Parse json" << json; + + QVariantMap jsonMap = json[QString("query")].toMap(); + if (jsonMap[QString("count")].toInt() != 1) { + qCWarning(LOG_LIB) << "Found data count" + << json[QString("count")].toInt() << "is not 1"; + return QVariantHash(); + } + QVariantMap results + = jsonMap[QString("results")].toMap()[QString("channel")].toMap(); + QVariantMap item = results[QString("item")].toMap(); + QVariantMap atmosphere = results[QString("atmosphere")].toMap(); + + return m_ts == 0 ? parseCurrent(item, atmosphere) : parseForecast(item); +} + + +QUrl YahooWeatherProvider::url() const +{ + return m_url; +} + + +QVariantHash +YahooWeatherProvider::parseCurrent(const QVariantMap &json, + const QVariantMap &atmosphere) const +{ + qCDebug(LOG_LIB) << "Parse current weather from" << json; + + QVariantHash values; + int id = json[QString("condition")].toMap()[QString("code")].toInt(); + values[QString("weatherId%1").arg(number())] = id; + values[QString("temperature%1").arg(number())] + = json[QString("condition")].toMap()[QString("temp")].toInt(); + values[QString("timestamp%1").arg(number())] + = json[QString("condition")].toMap()[QString("date")].toString(); + values[QString("humidity%1").arg(number())] + = atmosphere[QString("humidity")].toInt(); + values[QString("pressure%1").arg(number())] + = static_cast(atmosphere[QString("pressure")].toFloat()); + + return values; +} + + +QVariantHash YahooWeatherProvider::parseForecast(const QVariantMap &json) const +{ + qCDebug(LOG_LIB) << "Parse forecast from" << json; + + QVariantHash values; + QVariantList weatherList = json[QString("forecast")].toList(); + QVariantMap weatherMap = weatherList.count() < m_ts + ? weatherList.last().toMap() + : weatherList.at(m_ts).toMap(); + int id = weatherMap[QString("code")].toInt(); + values[QString("weatherId%1").arg(number())] = id; + values[QString("timestamp%1").arg(number())] + = weatherMap[QString("date")].toString(); + // yahoo provides high and low temperatures. Lets calculate average one + values[QString("temperature%1").arg(number())] + = (weatherMap[QString("high")].toFloat() + + weatherMap[QString("low")].toFloat()) + / 2.0; + // ... and no forecast data for humidity and pressure + values[QString("humidity%1").arg(number())] = 0; + values[QString("pressure%1").arg(number())] = 0.0; + + return values; +} diff --git a/sources/awesomewidgets/yahooweatherprovider.h b/sources/awesomewidgets/yahooweatherprovider.h new file mode 100644 index 0000000..d5c997f --- /dev/null +++ b/sources/awesomewidgets/yahooweatherprovider.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 YAHOOWEATHERPROVIDER_H +#define YAHOOWEATHERPROVIDER_H + +#include "abstractweatherprovider.h" + +#define YAHOO_WEATHER_URL "https://query.yahooapis.com/v1/public/yql" +#define YAHOO_WEATHER_QUERY \ + "select * from weather.forecast where u='c' and woeid in (select woeid " \ + "from geo.places(1) where text='%1, %2')" + + +class YahooWeatherProvider : public AbstractWeatherProvider +{ +public: + explicit YahooWeatherProvider(QObject *parent, const int number); + virtual ~YahooWeatherProvider(); + void initUrl(const QString city, const QString country, const int); + QVariantHash parse(const QVariantMap &json) const; + QUrl url() const; + +private: + QVariantHash parseCurrent(const QVariantMap &json, + const QVariantMap &atmosphere) const; + QVariantHash parseForecast(const QVariantMap &json) const; + int m_ts = 0; + QUrl m_url; +}; + + +#endif /* YAHOOWEATHERPROVIDER_H */ diff --git a/sources/desktop-panel/package/contents/ui/main.qml b/sources/desktop-panel/package/contents/ui/main.qml index 5a1e9b6..20f8732 100644 --- a/sources/desktop-panel/package/contents/ui/main.qml +++ b/sources/desktop-panel/package/contents/ui/main.qml @@ -57,7 +57,7 @@ Item { // ui GridLayout { - anchors.fill: Plasmoid.Layout + anchors.fill: parent columns: plasmoid.configuration.verticalLayout ? 1 : dpAdds.numberOfDesktops() rows: plasmoid.configuration.verticalLayout ? dpAdds.numberOfDesktops() : 1 diff --git a/sources/desktop-panel/plugin/dpadds.cpp b/sources/desktop-panel/plugin/dpadds.cpp index 21a551c..ee25dae 100644 --- a/sources/desktop-panel/plugin/dpadds.cpp +++ b/sources/desktop-panel/plugin/dpadds.cpp @@ -156,22 +156,22 @@ QString DPAdds::toolTipImage(const int desktop) const std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(), [&toolTipScene, &screen](WindowData data) { QPixmap desktop = screen->grabWindow(data.id); - toolTipScene->addPixmap(desktop) - ->setOffset(data.rect.left(), data.rect.top()); + toolTipScene->addPixmap(desktop)->setOffset( + data.rect.left(), data.rect.top()); }); } else if (m_tooltipType == QString("windows")) { QScreen *screen = QGuiApplication::primaryScreen(); std::for_each(info.desktopsData.cbegin(), info.desktopsData.cend(), [&toolTipScene, &screen](WindowData data) { QPixmap desktop = screen->grabWindow(data.id); - toolTipScene->addPixmap(desktop) - ->setOffset(data.rect.left(), data.rect.top()); + toolTipScene->addPixmap(desktop)->setOffset( + data.rect.left(), data.rect.top()); }); std::for_each(info.windowsData.cbegin(), info.windowsData.cend(), [&toolTipScene, &screen](WindowData data) { QPixmap window = screen->grabWindow(data.id); - toolTipScene->addPixmap(window) - ->setOffset(data.rect.left(), data.rect.top()); + toolTipScene->addPixmap(window)->setOffset( + data.rect.left(), data.rect.top()); }); } @@ -232,8 +232,8 @@ QString DPAdds::valueByKey(const QString key, int desktop) const .arg(currentMark, m_mark.count(), QLatin1Char(' ')) .replace(QString(" "), QString(" ")); else if (key == QString("name")) - return KWindowSystem::desktopName(desktop) - .replace(QString(" "), QString(" ")); + return KWindowSystem::desktopName(desktop).replace(QString(" "), + QString(" ")); else if (key == QString("number")) return QString::number(desktop); else if (key == QString("total")) diff --git a/sources/extsysmon/CMakeLists.txt b/sources/extsysmon/CMakeLists.txt index 7e9857a..f078f0b 100644 --- a/sources/extsysmon/CMakeLists.txt +++ b/sources/extsysmon/CMakeLists.txt @@ -6,6 +6,7 @@ include_directories( ${CMAKE_SOURCE_DIR} ${CMAKE_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/ + ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_MONITORSOURCES}/ ${PROJECT_TRDPARTY_DIR} ${Qt_INCLUDE} ${Kf5_INCLUDE} @@ -13,15 +14,18 @@ include_directories( file(GLOB SUBPROJECT_DESKTOP_IN *.desktop) file(RELATIVE_PATH SUBPROJECT_DESKTOP ${CMAKE_SOURCE_DIR} ${SUBPROJECT_DESKTOP_IN}) -file(GLOB SUBPROJECT_SOURCE *.cpp sources/*.cpp ${CMAKE_SOURCE_DIR}/*.cpp) +file(GLOB SUBPROJECT_SOURCE *.cpp ${CMAKE_SOURCE_DIR}/*.cpp) +file(GLOB SUBPROJECT_HEADER *.h) file(GLOB SUBPROJECT_CONF *.conf) # prepare configure_file(${SUBPROJECT_DESKTOP_IN} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP}) # make -add_library(${SUBPROJECT} MODULE ${SUBPROJECT_SOURCE}) -target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) +add_library(${SUBPROJECT} MODULE ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER}) +target_link_libraries(${SUBPROJECT} + ${PROJECT_LIBRARY} ${PROJECT_MONITORSOURCES} + ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) kcoreaddons_desktop_to_json(${SUBPROJECT} ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT_DESKTOP} SERVICE_TYPES plasma-dataengine.desktop) diff --git a/sources/extsysmon/extsysmon.cpp b/sources/extsysmon/extsysmon.cpp index 8727df8..a48b8e7 100644 --- a/sources/extsysmon/extsysmon.cpp +++ b/sources/extsysmon/extsysmon.cpp @@ -17,7 +17,6 @@ #include "extsysmon.h" -#include #include #include #include @@ -25,6 +24,8 @@ #include "awdebug.h" #include "extsysmonaggregator.h" +#include "gputempsource.h" +#include "hddtempsource.h" ExtendedSysMon::ExtendedSysMon(QObject *parent, const QVariantList &args) @@ -73,7 +74,10 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source) qCDebug(LOG_ESM) << "Source" << source; if (aggregator->hasSource(source)) { - setData(source, QString("value"), aggregator->data(source)); + QVariant data = aggregator->data(source); + if (data.isNull()) + return false; + setData(source, QString("value"), data); } else { qCWarning(LOG_ESM) << "Unknown source" << source; return false; @@ -83,37 +87,6 @@ bool ExtendedSysMon::updateSourceEvent(const QString &source) } -QStringList ExtendedSysMon::getAllHdd() const -{ - QStringList allDevices - = QDir(QString("/dev")).entryList(QDir::System, QDir::Name); - QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); - for (int i = 0; i < devices.count(); i++) - devices[i] = QString("/dev/%1").arg(devices.at(i)); - - qCInfo(LOG_ESM) << "Device list" << devices; - return devices; -} - - -QString ExtendedSysMon::getAutoGpu() const -{ - QString gpu = QString("disable"); - QFile moduleFile(QString("/proc/modules")); - if (!moduleFile.open(QIODevice::ReadOnly)) - return gpu; - - QString output = moduleFile.readAll(); - if (output.contains(QString("fglrx"))) - gpu = QString("ati"); - else if (output.contains(QString("nvidia"))) - gpu = QString("nvidia"); - - qCInfo(LOG_ESM) << "Device" << gpu; - return gpu; -} - - void ExtendedSysMon::readConfiguration() { QString fileName @@ -125,8 +98,8 @@ void ExtendedSysMon::readConfiguration() settings.beginGroup(QString("Configuration")); rawConfig[QString("ACPIPATH")] - = settings.value(QString("ACPIPATH"), - QString("/sys/class/power_supply/")) + = settings + .value(QString("ACPIPATH"), QString("/sys/class/power_supply/")) .toString(); rawConfig[QString("GPUDEV")] = settings.value(QString("GPUDEV"), QString("auto")).toString(); @@ -161,12 +134,12 @@ ExtendedSysMon::updateConfiguration(QHash rawConfig) const if (rawConfig[QString("GPUDEV")] == QString("disable")) rawConfig[QString("GPUDEV")] = QString("disable"); else if (rawConfig[QString("GPUDEV")] == QString("auto")) - rawConfig[QString("GPUDEV")] = getAutoGpu(); + rawConfig[QString("GPUDEV")] = GPUTemperatureSource::autoGpu(); else if ((rawConfig[QString("GPUDEV")] != QString("ati")) && (rawConfig[QString("GPUDEV")] != QString("nvidia"))) - rawConfig[QString("GPUDEV")] = getAutoGpu(); + rawConfig[QString("GPUDEV")] = GPUTemperatureSource::autoGpu(); // hdddev - QStringList allHddDevices = getAllHdd(); + QStringList allHddDevices = HDDTemperatureSource::allHdd(); if (rawConfig[QString("HDDDEV")] == QString("all")) { rawConfig[QString("HDDDEV")] = allHddDevices.join(QChar(',')); } else if (rawConfig[QString("HDDDEV")] == QString("disable")) { diff --git a/sources/extsysmon/extsysmon.h b/sources/extsysmon/extsysmon.h index 72dc025..7ec57df 100644 --- a/sources/extsysmon/extsysmon.h +++ b/sources/extsysmon/extsysmon.h @@ -41,8 +41,6 @@ private: ExtSysMonAggregator *aggregator = nullptr; QHash configuration; // methods - QStringList getAllHdd() const; - QString getAutoGpu() const; void readConfiguration(); QHash updateConfiguration(QHash rawConfig) const; diff --git a/sources/extsysmon/extsysmonaggregator.cpp b/sources/extsysmon/extsysmonaggregator.cpp index e137548..18a7130 100644 --- a/sources/extsysmon/extsysmonaggregator.cpp +++ b/sources/extsysmon/extsysmonaggregator.cpp @@ -18,19 +18,19 @@ #include "extsysmonaggregator.h" #include "awdebug.h" -#include "sources/batterysource.h" -#include "sources/customsource.h" -#include "sources/desktopsource.h" -#include "sources/gpuloadsource.h" -#include "sources/gputempsource.h" -#include "sources/hddtempsource.h" -#include "sources/loadsource.h" -#include "sources/networksource.h" -#include "sources/playersource.h" -#include "sources/processessource.h" -#include "sources/quotessource.h" -#include "sources/upgradesource.h" -#include "sources/weathersource.h" +#include "batterysource.h" +#include "customsource.h" +#include "desktopsource.h" +#include "gpuloadsource.h" +#include "gputempsource.h" +#include "hddtempsource.h" +#include "loadsource.h" +#include "networksource.h" +#include "playersource.h" +#include "processessource.h" +#include "quotessource.h" +#include "upgradesource.h" +#include "weathersource.h" ExtSysMonAggregator::ExtSysMonAggregator(QObject *parent, diff --git a/sources/extsysmon/extsysmonaggregator.h b/sources/extsysmon/extsysmonaggregator.h index 6918a24..ff7cad9 100644 --- a/sources/extsysmon/extsysmonaggregator.h +++ b/sources/extsysmon/extsysmonaggregator.h @@ -20,7 +20,7 @@ #include -#include "sources/abstractextsysmonsource.h" +#include "abstractextsysmonsource.h" class ExtSysMonAggregator : public QObject diff --git a/sources/extsysmonsources/CMakeLists.txt b/sources/extsysmonsources/CMakeLists.txt new file mode 100644 index 0000000..b5940f7 --- /dev/null +++ b/sources/extsysmonsources/CMakeLists.txt @@ -0,0 +1,18 @@ +set(SUBPROJECT ${PROJECT_MONITORSOURCES}) +message(STATUS "Subproject ${SUBPROJECT}") +add_definitions(-DTRANSLATION_DOMAIN=\"plasma_applet_org.kde.plasma.awesomewidget\") + +include_directories( + ${CMAKE_SOURCE_DIR} + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/ + ${PROJECT_TRDPARTY_DIR} + ${Qt_INCLUDE} + ${Kf5_INCLUDE} +) + +file(GLOB SUBPROJECT_SOURCE *.cpp) +file(GLOB SUBPROJECT_HEADER *.h) + +add_library(${SUBPROJECT} STATIC ${SUBPROJECT_SOURCE} ${SUBPROJECT_HEADER}) +target_link_libraries(${SUBPROJECT} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES}) diff --git a/sources/extsysmon/sources/abstractextsysmonsource.h b/sources/extsysmonsources/abstractextsysmonsource.h similarity index 96% rename from sources/extsysmon/sources/abstractextsysmonsource.h rename to sources/extsysmonsources/abstractextsysmonsource.h index 23526cf..00d82fb 100644 --- a/sources/extsysmon/sources/abstractextsysmonsource.h +++ b/sources/extsysmonsources/abstractextsysmonsource.h @@ -25,6 +25,8 @@ class AbstractExtSysMonSource : public QObject { + Q_OBJECT + public: explicit AbstractExtSysMonSource(QObject *parent, const QStringList) : QObject(parent){}; @@ -40,6 +42,9 @@ public: rx.indexIn(source); return rx.cap().toInt(); } + +signals: + void dataReceived(const QVariantHash &); }; diff --git a/sources/extsysmon/sources/batterysource.cpp b/sources/extsysmonsources/batterysource.cpp similarity index 93% rename from sources/extsysmon/sources/batterysource.cpp rename to sources/extsysmonsources/batterysource.cpp index 96dfae2..1f2e337 100644 --- a/sources/extsysmon/sources/batterysource.cpp +++ b/sources/extsysmonsources/batterysource.cpp @@ -27,7 +27,7 @@ BatterySource::BatterySource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 1); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_acpiPath = args.at(0); m_sources = getSources(); @@ -36,13 +36,32 @@ BatterySource::BatterySource(QObject *parent, const QStringList args) BatterySource::~BatterySource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; +} + + +QStringList BatterySource::getSources() +{ + QStringList sources; + sources.append(QString("battery/ac")); + sources.append(QString("battery/bat")); + m_batteriesCount + = QDir(m_acpiPath) + .entryList(QStringList() << QString("BAT*"), + QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name) + .count(); + qCInfo(LOG_ESS) << "Init batteries count as" << m_batteriesCount; + for (int i = 0; i < m_batteriesCount; i++) + sources.append(QString("battery/bat%1").arg(i)); + + qCInfo(LOG_ESS) << "Sources list" << sources; + return sources; } QVariant BatterySource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (!m_values.contains(source)) run(); @@ -53,7 +72,7 @@ QVariant BatterySource::data(QString source) QVariantMap BatterySource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("battery/ac")) { @@ -120,22 +139,3 @@ QStringList BatterySource::sources() const { return m_sources; } - - -QStringList BatterySource::getSources() -{ - QStringList sources; - sources.append(QString("battery/ac")); - sources.append(QString("battery/bat")); - m_batteriesCount - = QDir(m_acpiPath) - .entryList(QStringList() << QString("BAT*"), - QDir::Dirs | QDir::NoDotAndDotDot, QDir::Name) - .count(); - qCInfo(LOG_ESM) << "Init batteries count as" << m_batteriesCount; - for (int i = 0; i < m_batteriesCount; i++) - sources.append(QString("battery/bat%1").arg(i)); - - qCInfo(LOG_ESM) << "Sources list" << sources; - return sources; -} diff --git a/sources/extsysmon/sources/batterysource.h b/sources/extsysmonsources/batterysource.h similarity index 100% rename from sources/extsysmon/sources/batterysource.h rename to sources/extsysmonsources/batterysource.h index 09403c7..4779641 100644 --- a/sources/extsysmon/sources/batterysource.h +++ b/sources/extsysmonsources/batterysource.h @@ -28,13 +28,13 @@ class BatterySource : public AbstractExtSysMonSource public: explicit BatterySource(QObject *parent, const QStringList args); virtual ~BatterySource(); + QStringList getSources(); QVariant data(QString source); QVariantMap initialData(QString source) const; void run(); QStringList sources() const; private: - QStringList getSources(); // configuration and values int m_batteriesCount = 0; QString m_acpiPath; diff --git a/sources/extsysmon/sources/customsource.cpp b/sources/extsysmonsources/customsource.cpp similarity index 93% rename from sources/extsysmon/sources/customsource.cpp rename to sources/extsysmonsources/customsource.cpp index 26ad6e8..54763f1 100644 --- a/sources/extsysmon/sources/customsource.cpp +++ b/sources/extsysmonsources/customsource.cpp @@ -26,7 +26,7 @@ CustomSource::CustomSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; extScripts = new ExtItemAggregator(nullptr, QString("scripts")); m_sources = getSources(); @@ -35,7 +35,7 @@ CustomSource::CustomSource(QObject *parent, const QStringList args) CustomSource::~CustomSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; delete extScripts; } @@ -43,7 +43,7 @@ CustomSource::~CustomSource() QVariant CustomSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; // there are only one value return extScripts->itemByTagNumber(index(source))->run().values().first(); @@ -52,7 +52,7 @@ QVariant CustomSource::data(QString source) QVariantMap CustomSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; data[QString("min")] = QString(""); diff --git a/sources/extsysmon/sources/customsource.h b/sources/extsysmonsources/customsource.h similarity index 97% rename from sources/extsysmon/sources/customsource.h rename to sources/extsysmonsources/customsource.h index 91ee081..3230de2 100644 --- a/sources/extsysmon/sources/customsource.h +++ b/sources/extsysmonsources/customsource.h @@ -39,7 +39,7 @@ public: private: QStringList getSources(); // configuration and values - ExtItemAggregator *extScripts; + ExtItemAggregator *extScripts = nullptr; QStringList m_sources; }; diff --git a/sources/extsysmon/sources/desktopsource.cpp b/sources/extsysmonsources/desktopsource.cpp similarity index 95% rename from sources/extsysmon/sources/desktopsource.cpp rename to sources/extsysmonsources/desktopsource.cpp index 3c3ec1d..5723557 100644 --- a/sources/extsysmon/sources/desktopsource.cpp +++ b/sources/extsysmonsources/desktopsource.cpp @@ -27,19 +27,19 @@ DesktopSource::DesktopSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } DesktopSource::~DesktopSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } QVariant DesktopSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; int current = KWindowSystem::currentDesktop(); int total = KWindowSystem::numberOfDesktops(); @@ -63,7 +63,7 @@ QVariant DesktopSource::data(QString source) QVariantMap DesktopSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("desktop/current/name")) { diff --git a/sources/extsysmon/sources/desktopsource.h b/sources/extsysmonsources/desktopsource.h similarity index 100% rename from sources/extsysmon/sources/desktopsource.h rename to sources/extsysmonsources/desktopsource.h diff --git a/sources/extsysmon/sources/gpuloadsource.cpp b/sources/extsysmonsources/gpuloadsource.cpp similarity index 79% rename from sources/extsysmon/sources/gpuloadsource.cpp rename to sources/extsysmonsources/gpuloadsource.cpp index c7d1396..482c468 100644 --- a/sources/extsysmon/sources/gpuloadsource.cpp +++ b/sources/extsysmonsources/gpuloadsource.cpp @@ -18,6 +18,7 @@ #include "gpuloadsource.h" +#include #include #include @@ -28,7 +29,7 @@ GPULoadSource::GPULoadSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 1); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_device = args.at(0); @@ -44,27 +45,45 @@ GPULoadSource::GPULoadSource(QObject *parent, const QStringList args) GPULoadSource::~GPULoadSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_process->kill(); m_process->deleteLater(); } +QString GPULoadSource::autoGpu() +{ + QString gpu = QString("disable"); + QFile moduleFile(QString("/proc/modules")); + if (!moduleFile.open(QIODevice::ReadOnly)) + return gpu; + + QString output = moduleFile.readAll(); + if (output.contains(QString("fglrx"))) + gpu = QString("ati"); + else if (output.contains(QString("nvidia"))) + gpu = QString("nvidia"); + + qCInfo(LOG_ESM) << "Device" << gpu; + return gpu; +} + + QVariant GPULoadSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (source == QString("gpu/load")) run(); - return m_value; + return m_values[source]; } QVariantMap GPULoadSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("gpu/load")) { @@ -87,7 +106,7 @@ void GPULoadSource::run() QString cmd = m_device == QString("nvidia") ? QString("nvidia-smi -q -x") : QString("aticonfig --od-getclocks"); - qCInfo(LOG_ESM) << "cmd" << cmd; + qCInfo(LOG_ESS) << "cmd" << cmd; m_process->start(cmd); } @@ -104,15 +123,15 @@ QStringList GPULoadSource::sources() const void GPULoadSource::updateValue() { - qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); + qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode(); QString qdebug = QTextCodec::codecForMib(106) ->toUnicode(m_process->readAllStandardError()) .trimmed(); - qCInfo(LOG_LIB) << "Error" << qdebug; + qCInfo(LOG_ESS) << "Error" << qdebug; QString qoutput = QTextCodec::codecForMib(106) ->toUnicode(m_process->readAllStandardOutput()) .trimmed(); - qCInfo(LOG_LIB) << "Output" << qoutput; + qCInfo(LOG_ESS) << "Output" << qoutput; if (m_device == QString("nvidia")) { for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) { @@ -121,7 +140,7 @@ void GPULoadSource::updateValue() QString load = str.remove(QString("")) .remove(QString("")) .remove(QChar('%')); - m_value = load.toFloat(); + m_values[QString("gpu/load")] = load.toFloat(); break; } } else if (m_device == QString("ati")) { @@ -131,8 +150,10 @@ void GPULoadSource::updateValue() QString load = str.split(QChar(' '), QString::SkipEmptyParts)[3].remove( QChar('%')); - m_value = load.toFloat(); + m_values[QString("gpu/load")] = load.toFloat(); break; } } + + emit(dataReceived(m_values)); } diff --git a/sources/extsysmon/sources/gpuloadsource.h b/sources/extsysmonsources/gpuloadsource.h similarity index 96% rename from sources/extsysmon/sources/gpuloadsource.h rename to sources/extsysmonsources/gpuloadsource.h index 38e611b..4caa8fa 100644 --- a/sources/extsysmon/sources/gpuloadsource.h +++ b/sources/extsysmonsources/gpuloadsource.h @@ -30,6 +30,7 @@ class GPULoadSource : public AbstractExtSysMonSource public: explicit GPULoadSource(QObject *parent, const QStringList args); virtual ~GPULoadSource(); + static QString autoGpu(); QVariant data(QString source); QVariantMap initialData(QString source) const; void run(); @@ -42,7 +43,7 @@ private: // configuration and values QString m_device; QProcess *m_process = nullptr; - QVariant m_value; + QVariantHash m_values; }; diff --git a/sources/extsysmon/sources/gputempsource.cpp b/sources/extsysmonsources/gputempsource.cpp similarity index 79% rename from sources/extsysmon/sources/gputempsource.cpp rename to sources/extsysmonsources/gputempsource.cpp index 45cdc4b..437c143 100644 --- a/sources/extsysmon/sources/gputempsource.cpp +++ b/sources/extsysmonsources/gputempsource.cpp @@ -18,6 +18,7 @@ #include "gputempsource.h" +#include #include #include @@ -29,7 +30,7 @@ GPUTemperatureSource::GPUTemperatureSource(QObject *parent, : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 1); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_device = args.at(0); @@ -45,27 +46,45 @@ GPUTemperatureSource::GPUTemperatureSource(QObject *parent, GPUTemperatureSource::~GPUTemperatureSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_process->kill(); m_process->deleteLater(); } +QString GPUTemperatureSource::autoGpu() +{ + QString gpu = QString("disable"); + QFile moduleFile(QString("/proc/modules")); + if (!moduleFile.open(QIODevice::ReadOnly)) + return gpu; + + QString output = moduleFile.readAll(); + if (output.contains(QString("fglrx"))) + gpu = QString("ati"); + else if (output.contains(QString("nvidia"))) + gpu = QString("nvidia"); + + qCInfo(LOG_ESM) << "Device" << gpu; + return gpu; +} + + QVariant GPUTemperatureSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (source == QString("gpu/temperature")) run(); - return m_value; + return m_values[source]; } QVariantMap GPUTemperatureSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("gpu/temperature")) { @@ -88,7 +107,7 @@ void GPUTemperatureSource::run() QString cmd = m_device == QString("nvidia") ? QString("nvidia-smi -q -x") : QString("aticonfig --od-gettemperature"); - qCInfo(LOG_ESM) << "cmd" << cmd; + qCInfo(LOG_ESS) << "cmd" << cmd; m_process->start(cmd); } @@ -105,15 +124,15 @@ QStringList GPUTemperatureSource::sources() const void GPUTemperatureSource::updateValue() { - qCInfo(LOG_LIB) << "Cmd returns" << m_process->exitCode(); + qCInfo(LOG_ESS) << "Cmd returns" << m_process->exitCode(); QString qdebug = QTextCodec::codecForMib(106) ->toUnicode(m_process->readAllStandardError()) .trimmed(); - qCInfo(LOG_LIB) << "Error" << qdebug; + qCInfo(LOG_ESS) << "Error" << qdebug; QString qoutput = QTextCodec::codecForMib(106) ->toUnicode(m_process->readAllStandardOutput()) .trimmed(); - qCInfo(LOG_LIB) << "Output" << qoutput; + qCInfo(LOG_ESS) << "Output" << qoutput; if (m_device == QString("nvidia")) { for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) { @@ -121,7 +140,7 @@ void GPUTemperatureSource::updateValue() continue; QString temp = str.remove(QString("")) .remove(QString("C")); - m_value = temp.toFloat(); + m_values[QString("gpu/temperature")] = temp.toFloat(); break; } } else if (m_device == QString("ati")) { @@ -129,8 +148,10 @@ void GPUTemperatureSource::updateValue() if (!str.contains(QString("Temperature"))) continue; QString temp = str.split(QChar(' '), QString::SkipEmptyParts).at(4); - m_value = temp.toFloat(); + m_values[QString("gpu/temperature")] = temp.toFloat(); break; } } + + emit(dataReceived(m_values)); } diff --git a/sources/extsysmon/sources/gputempsource.h b/sources/extsysmonsources/gputempsource.h similarity index 97% rename from sources/extsysmon/sources/gputempsource.h rename to sources/extsysmonsources/gputempsource.h index fc2d7a0..0ebfc62 100644 --- a/sources/extsysmon/sources/gputempsource.h +++ b/sources/extsysmonsources/gputempsource.h @@ -30,6 +30,7 @@ class GPUTemperatureSource : public AbstractExtSysMonSource public: explicit GPUTemperatureSource(QObject *parent, const QStringList args); virtual ~GPUTemperatureSource(); + static QString autoGpu(); QVariant data(QString source); QVariantMap initialData(QString source) const; void run(); @@ -42,7 +43,7 @@ private: // configuration and values QString m_device; QProcess *m_process = nullptr; - QVariant m_value; + QVariantHash m_values; }; diff --git a/sources/extsysmon/sources/hddtempsource.cpp b/sources/extsysmonsources/hddtempsource.cpp similarity index 78% rename from sources/extsysmon/sources/hddtempsource.cpp rename to sources/extsysmonsources/hddtempsource.cpp index b0774e1..3fffff2 100644 --- a/sources/extsysmon/sources/hddtempsource.cpp +++ b/sources/extsysmonsources/hddtempsource.cpp @@ -18,6 +18,7 @@ #include "hddtempsource.h" +#include #include #include @@ -29,13 +30,13 @@ HDDTemperatureSource::HDDTemperatureSource(QObject *parent, : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 2); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_devices = args.at(0).split(QChar(','), QString::SkipEmptyParts); m_cmd = args.at(1); m_smartctl = m_cmd.contains(QString("smartctl")); - qCInfo(LOG_ESM) << "Parse as smartctl" << m_smartctl; + qCInfo(LOG_ESS) << "Parse as smartctl" << m_smartctl; for (auto device : m_devices) { m_processes[device] = new QProcess(nullptr); @@ -53,7 +54,7 @@ HDDTemperatureSource::HDDTemperatureSource(QObject *parent, HDDTemperatureSource::~HDDTemperatureSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; for (auto device : m_devices) { m_processes[device]->kill(); @@ -62,9 +63,22 @@ HDDTemperatureSource::~HDDTemperatureSource() } +QStringList HDDTemperatureSource::allHdd() +{ + QStringList allDevices + = QDir(QString("/dev")).entryList(QDir::System, QDir::Name); + QStringList devices = allDevices.filter(QRegExp(QString("^[hms]d[a-z]$"))); + for (int i = 0; i < devices.count(); i++) + devices[i] = QString("/dev/%1").arg(devices.at(i)); + + qCInfo(LOG_ESS) << "Device list" << devices; + return devices; +} + + QVariant HDDTemperatureSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QString device = source.remove(QString("hdd/temperature")); // run cmd @@ -77,7 +91,7 @@ QVariant HDDTemperatureSource::data(QString source) QVariantMap HDDTemperatureSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QString device = source.remove(QString("hdd/temperature")); QVariantMap data; @@ -103,23 +117,24 @@ QStringList HDDTemperatureSource::sources() const void HDDTemperatureSource::updateValue(const QString &device) { - qCDebug(LOG_LIB) << "Called with device" << device; + qCDebug(LOG_ESS) << "Called with device" << device; - qCInfo(LOG_LIB) << "Cmd returns" << m_processes[device]->exitCode(); + qCInfo(LOG_ESS) << "Cmd returns" << m_processes[device]->exitCode(); QString qdebug = QTextCodec::codecForMib(106) ->toUnicode(m_processes[device]->readAllStandardError()) .trimmed(); - qCInfo(LOG_LIB) << "Error" << qdebug; + qCInfo(LOG_ESS) << "Error" << qdebug; QString qoutput = QTextCodec::codecForMib(106) ->toUnicode(m_processes[device]->readAllStandardOutput()) .trimmed(); - qCInfo(LOG_LIB) << "Output" << qoutput; + qCInfo(LOG_ESS) << "Output" << qoutput; // parse if (m_smartctl) { - for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) { + QStringList lines = qoutput.split(QChar('\n'), QString::SkipEmptyParts); + for (auto str : lines) { if (!str.startsWith(QString("194"))) continue; if (str.split(QChar(' '), QString::SkipEmptyParts).count() < 9) @@ -130,11 +145,13 @@ void HDDTemperatureSource::updateValue(const QString &device) break; } } else { - if (qoutput.split(QChar(':'), QString::SkipEmptyParts).count() >= 3) { - QString temp - = qoutput.split(QChar(':'), QString::SkipEmptyParts).at(2); + QStringList lines = qoutput.split(QChar(':'), QString::SkipEmptyParts); + if (lines.count() >= 3) { + QString temp = lines.at(2); temp.remove(QChar(0260)).remove(QChar('C')); m_values[device] = temp.toFloat(); } } + + emit(dataReceived(m_values)); } diff --git a/sources/extsysmon/sources/hddtempsource.h b/sources/extsysmonsources/hddtempsource.h similarity index 98% rename from sources/extsysmon/sources/hddtempsource.h rename to sources/extsysmonsources/hddtempsource.h index ffc37b4..2daf711 100644 --- a/sources/extsysmon/sources/hddtempsource.h +++ b/sources/extsysmonsources/hddtempsource.h @@ -30,6 +30,7 @@ class HDDTemperatureSource : public AbstractExtSysMonSource public: explicit HDDTemperatureSource(QObject *parent, const QStringList args); virtual ~HDDTemperatureSource(); + static QStringList allHdd(); QVariant data(QString source); QVariantMap initialData(QString source) const; void run(){}; diff --git a/sources/extsysmon/sources/loadsource.cpp b/sources/extsysmonsources/loadsource.cpp similarity index 92% rename from sources/extsysmon/sources/loadsource.cpp rename to sources/extsysmonsources/loadsource.cpp index e5eff33..7b9d008 100644 --- a/sources/extsysmon/sources/loadsource.cpp +++ b/sources/extsysmonsources/loadsource.cpp @@ -25,19 +25,19 @@ LoadSource::LoadSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } LoadSource::~LoadSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } QVariant LoadSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; source.remove(QString("load/load")); return source.toInt(); @@ -46,7 +46,7 @@ QVariant LoadSource::data(QString source) QVariantMap LoadSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source.startsWith(QString("load/load"))) { diff --git a/sources/extsysmon/sources/loadsource.h b/sources/extsysmonsources/loadsource.h similarity index 100% rename from sources/extsysmon/sources/loadsource.h rename to sources/extsysmonsources/loadsource.h diff --git a/sources/extsysmon/sources/networksource.cpp b/sources/extsysmonsources/networksource.cpp similarity index 92% rename from sources/extsysmon/sources/networksource.cpp rename to sources/extsysmonsources/networksource.cpp index 45a27ef..249601d 100644 --- a/sources/extsysmon/sources/networksource.cpp +++ b/sources/extsysmonsources/networksource.cpp @@ -27,25 +27,25 @@ NetworkSource::NetworkSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } NetworkSource::~NetworkSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } QVariant NetworkSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (source == QString("network/current/name")) { QString device = QString("lo"); QList rawInterfaceList = QNetworkInterface::allInterfaces(); - qCInfo(LOG_ESM) << "Devices" << rawInterfaceList; + qCInfo(LOG_ESS) << "Devices" << rawInterfaceList; for (auto interface : rawInterfaceList) { if ((interface.flags().testFlag(QNetworkInterface::IsLoopBack)) || (interface.flags().testFlag( @@ -65,7 +65,7 @@ QVariant NetworkSource::data(QString source) QVariantMap NetworkSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("network/current/name")) { diff --git a/sources/extsysmon/sources/networksource.h b/sources/extsysmonsources/networksource.h similarity index 100% rename from sources/extsysmon/sources/networksource.h rename to sources/extsysmonsources/networksource.h diff --git a/sources/extsysmon/sources/playersource.cpp b/sources/extsysmonsources/playersource.cpp similarity index 91% rename from sources/extsysmon/sources/playersource.cpp rename to sources/extsysmonsources/playersource.cpp index df832e1..c51511c 100644 --- a/sources/extsysmon/sources/playersource.cpp +++ b/sources/extsysmonsources/playersource.cpp @@ -32,7 +32,7 @@ PlayerSource::PlayerSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 5); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_player = args.at(0); m_mpdAddress = QString("%1:%2").arg(args.at(1)).arg(args.at(2)); @@ -52,7 +52,7 @@ PlayerSource::PlayerSource(QObject *parent, const QStringList args) PlayerSource::~PlayerSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; m_mpdProcess->kill(); m_mpdProcess->deleteLater(); @@ -61,7 +61,7 @@ PlayerSource::~PlayerSource() QVariant PlayerSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (!m_values.contains(source)) run(); @@ -72,7 +72,7 @@ QVariant PlayerSource::data(QString source) QVariantMap PlayerSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("player/album")) { @@ -161,15 +161,15 @@ void PlayerSource::run() // initial data if (m_player == QString("mpd")) { // mpd - QHash data = getPlayerMpdInfo(m_mpdAddress); - for (auto key : data.keys()) - m_values[key] = data[key]; + m_values = getPlayerMpdInfo(m_mpdAddress); } else if (m_player == QString("mpris")) { // players which supports mpris - QString mpris = m_mpris == QString("auto") ? getAutoMpris() : m_mpris; - QHash data = getPlayerMprisInfo(mpris); - for (auto key : data.keys()) - m_values[key] = data[key]; + if (m_dbusMutex.tryLock()) { + QString mpris + = m_mpris == QString("auto") ? getAutoMpris() : m_mpris; + m_values = getPlayerMprisInfo(mpris); + m_dbusMutex.unlock(); + } } // dymanic properties @@ -214,15 +214,15 @@ QStringList PlayerSource::sources() const void PlayerSource::updateValue() { - qCInfo(LOG_LIB) << "Cmd returns" << m_mpdProcess->exitCode(); + qCInfo(LOG_ESS) << "Cmd returns" << m_mpdProcess->exitCode(); QString qdebug = QTextCodec::codecForMib(106) ->toUnicode(m_mpdProcess->readAllStandardError()) .trimmed(); - qCInfo(LOG_LIB) << "Error" << qdebug; + qCInfo(LOG_ESS) << "Error" << qdebug; QString qoutput = QTextCodec::codecForMib(106) ->toUnicode(m_mpdProcess->readAllStandardOutput()) .trimmed(); - qCInfo(LOG_LIB) << "Output" << qoutput; + qCInfo(LOG_ESS) << "Output" << qoutput; for (auto str : qoutput.split(QChar('\n'), QString::SkipEmptyParts)) { if (str.split(QString(": "), QString::SkipEmptyParts).count() == 2) { @@ -262,7 +262,7 @@ QVariantHash PlayerSource::defaultInfo() const QString PlayerSource::getAutoMpris() const { QDBusMessage listServices = QDBusConnection::sessionBus().interface()->call( - QDBus::BlockWithGui, QString("ListNames")); + QDBus::BlockWithGui, QString("ListNames"), DBUS_CALL_TIMEOUT); if (listServices.arguments().isEmpty()) return QString(); QStringList arguments = listServices.arguments().first().toStringList(); @@ -270,7 +270,7 @@ QString PlayerSource::getAutoMpris() const for (auto arg : arguments) { if (!arg.startsWith(QString("org.mpris.MediaPlayer2."))) continue; - qCInfo(LOG_ESM) << "Service found" << arg; + qCInfo(LOG_ESS) << "Service found" << arg; QString service = arg; service.remove(QString("org.mpris.MediaPlayer2.")); return service; @@ -282,13 +282,13 @@ QString PlayerSource::getAutoMpris() const QVariantHash PlayerSource::getPlayerMpdInfo(const QString mpdAddress) const { - qCDebug(LOG_ESM) << "MPD" << mpdAddress; + qCDebug(LOG_ESS) << "MPD" << mpdAddress; // build cmd QString cmd = QString("bash -c \"echo 'currentsong\nstatus\nclose' | curl " "--connect-timeout 1 -fsm 3 telnet://%1\"") .arg(mpdAddress); - qCInfo(LOG_ESM) << "cmd" << cmd; + qCInfo(LOG_ESS) << "cmd" << cmd; m_mpdProcess->start(cmd); return m_mpdCached; @@ -297,7 +297,7 @@ QVariantHash PlayerSource::getPlayerMpdInfo(const QString mpdAddress) const QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const { - qCDebug(LOG_ESM) << "MPRIS" << mpris; + qCDebug(LOG_ESS) << "MPRIS" << mpris; QVariantHash info = defaultInfo(); if (mpris.isEmpty()) @@ -319,10 +319,11 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const QString("org.mpris.MediaPlayer2.%1").arg(mpris), QString("/org/mpris/MediaPlayer2"), QString(""), QString("Get")); request.setArguments(args); - QDBusMessage response = bus.call(request, QDBus::BlockWithGui); + QDBusMessage response + = bus.call(request, QDBus::BlockWithGui, DBUS_CALL_TIMEOUT); if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) { - qCWarning(LOG_ESM) << "Error message" << response.errorMessage(); + qCWarning(LOG_ESS) << "Error message" << response.errorMessage(); } else { // another portion of dirty magic QVariantHash map @@ -348,7 +349,7 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const response = bus.call(request, QDBus::BlockWithGui); if ((response.type() != QDBusMessage::ReplyMessage) || (response.arguments().isEmpty())) { - qCWarning(LOG_ESM) << "Error message" << response.errorMessage(); + qCWarning(LOG_ESS) << "Error message" << response.errorMessage(); } else { // this cast is simpler than the previous one ;) info[QString("player/progress")] = response.arguments() @@ -366,7 +367,7 @@ QVariantHash PlayerSource::getPlayerMprisInfo(const QString mpris) const QString PlayerSource::buildString(const QString current, const QString value, const int s) const { - qCDebug(LOG_ESM) << "Current value" << current << "received" << value + qCDebug(LOG_ESS) << "Current value" << current << "received" << value << "will be stripped after" << s; int index = value.indexOf(current); @@ -379,7 +380,7 @@ QString PlayerSource::buildString(const QString current, const QString value, QString PlayerSource::stripString(const QString value, const int s) const { - qCDebug(LOG_ESM) << "New value" << value << "will be stripped after" << s; + qCDebug(LOG_ESS) << "New value" << value << "will be stripped after" << s; return value.count() > s ? QString("%1\u2026").arg(value.left(s - 1)) : value.leftJustified(s, QLatin1Char(' ')); diff --git a/sources/extsysmon/sources/playersource.h b/sources/extsysmonsources/playersource.h similarity index 95% rename from sources/extsysmon/sources/playersource.h rename to sources/extsysmonsources/playersource.h index 0d8bbfc..baf93fb 100644 --- a/sources/extsysmon/sources/playersource.h +++ b/sources/extsysmonsources/playersource.h @@ -18,11 +18,16 @@ #ifndef PLAYERSOURCE_H #define PLAYERSOURCE_H +#include #include #include "abstractextsysmonsource.h" +#ifndef DBUS_CALL_TIMEOUT +#define DBUS_CALL_TIMEOUT 3000 +#endif /* DBUS_CALL_TIMEOUT */ + class QProcess; class PlayerSource : public AbstractExtSysMonSource @@ -52,6 +57,7 @@ private: QVariantHash m_mpdCached; QProcess *m_mpdProcess = nullptr; QString m_mpris; + QMutex m_dbusMutex; QString m_player; int m_symbols; QStringList m_metadata = QStringList() << QString("album") diff --git a/sources/extsysmon/sources/processessource.cpp b/sources/extsysmonsources/processessource.cpp similarity index 95% rename from sources/extsysmon/sources/processessource.cpp rename to sources/extsysmonsources/processessource.cpp index 6054909..7cdcdf3 100644 --- a/sources/extsysmon/sources/processessource.cpp +++ b/sources/extsysmonsources/processessource.cpp @@ -27,19 +27,19 @@ ProcessesSource::ProcessesSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } ProcessesSource::~ProcessesSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; } QVariant ProcessesSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; if (!m_values.contains(source)) run(); @@ -50,7 +50,7 @@ QVariant ProcessesSource::data(QString source) QVariantMap ProcessesSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; if (source == QString("ps/running/count")) { diff --git a/sources/extsysmon/sources/processessource.h b/sources/extsysmonsources/processessource.h similarity index 100% rename from sources/extsysmon/sources/processessource.h rename to sources/extsysmonsources/processessource.h diff --git a/sources/extsysmon/sources/quotessource.cpp b/sources/extsysmonsources/quotessource.cpp similarity index 97% rename from sources/extsysmon/sources/quotessource.cpp rename to sources/extsysmonsources/quotessource.cpp index 4a44b09..238136f 100644 --- a/sources/extsysmon/sources/quotessource.cpp +++ b/sources/extsysmonsources/quotessource.cpp @@ -26,7 +26,7 @@ QuotesSource::QuotesSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; extQuotes = new ExtItemAggregator(nullptr, QString("quotes")); m_sources = getSources(); @@ -35,7 +35,7 @@ QuotesSource::QuotesSource(QObject *parent, const QStringList args) QuotesSource::~QuotesSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; delete extQuotes; } @@ -43,7 +43,7 @@ QuotesSource::~QuotesSource() QVariant QuotesSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; int ind = index(source); source.remove(QString("quotes/")); @@ -59,7 +59,7 @@ QVariant QuotesSource::data(QString source) QVariantMap QuotesSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; int ind = index(source); QVariantMap data; diff --git a/sources/extsysmon/sources/quotessource.h b/sources/extsysmonsources/quotessource.h similarity index 97% rename from sources/extsysmon/sources/quotessource.h rename to sources/extsysmonsources/quotessource.h index ae09f0b..edb3490 100644 --- a/sources/extsysmon/sources/quotessource.h +++ b/sources/extsysmonsources/quotessource.h @@ -39,7 +39,7 @@ public: private: QStringList getSources(); // configuration and values - ExtItemAggregator *extQuotes; + ExtItemAggregator *extQuotes = nullptr; QStringList m_sources; QVariantHash m_values; }; diff --git a/sources/extsysmon/sources/upgradesource.cpp b/sources/extsysmonsources/upgradesource.cpp similarity index 93% rename from sources/extsysmon/sources/upgradesource.cpp rename to sources/extsysmonsources/upgradesource.cpp index 243c0bd..0103da8 100644 --- a/sources/extsysmon/sources/upgradesource.cpp +++ b/sources/extsysmonsources/upgradesource.cpp @@ -26,7 +26,7 @@ UpgradeSource::UpgradeSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; extUpgrade = new ExtItemAggregator(nullptr, QString("upgrade")); m_sources = getSources(); @@ -35,7 +35,7 @@ UpgradeSource::UpgradeSource(QObject *parent, const QStringList args) UpgradeSource::~UpgradeSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; delete extUpgrade; } @@ -43,7 +43,7 @@ UpgradeSource::~UpgradeSource() QVariant UpgradeSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; // there are only one value return extUpgrade->itemByTagNumber(index(source))->run().values().first(); @@ -52,7 +52,7 @@ QVariant UpgradeSource::data(QString source) QVariantMap UpgradeSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; QVariantMap data; data[QString("min")] = QString(""); diff --git a/sources/extsysmon/sources/upgradesource.h b/sources/extsysmonsources/upgradesource.h similarity index 96% rename from sources/extsysmon/sources/upgradesource.h rename to sources/extsysmonsources/upgradesource.h index d020151..8bf6a81 100644 --- a/sources/extsysmon/sources/upgradesource.h +++ b/sources/extsysmonsources/upgradesource.h @@ -39,7 +39,7 @@ public: private: QStringList getSources(); // configuration and values - ExtItemAggregator *extUpgrade; + ExtItemAggregator *extUpgrade = nullptr; QStringList m_sources; }; diff --git a/sources/extsysmon/sources/weathersource.cpp b/sources/extsysmonsources/weathersource.cpp similarity index 96% rename from sources/extsysmon/sources/weathersource.cpp rename to sources/extsysmonsources/weathersource.cpp index 910ad31..1f95a90 100644 --- a/sources/extsysmon/sources/weathersource.cpp +++ b/sources/extsysmonsources/weathersource.cpp @@ -26,7 +26,7 @@ WeatherSource::WeatherSource(QObject *parent, const QStringList args) : AbstractExtSysMonSource(parent, args) { Q_ASSERT(args.count() == 0); - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; extWeather = new ExtItemAggregator(nullptr, QString("weather")); m_sources = getSources(); @@ -35,7 +35,7 @@ WeatherSource::WeatherSource(QObject *parent, const QStringList args) WeatherSource::~WeatherSource() { - qCDebug(LOG_ESM) << __PRETTY_FUNCTION__; + qCDebug(LOG_ESS) << __PRETTY_FUNCTION__; delete extWeather; } @@ -43,7 +43,7 @@ WeatherSource::~WeatherSource() QVariant WeatherSource::data(QString source) { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; int ind = index(source); source.remove(QString("weather/")); @@ -59,7 +59,7 @@ QVariant WeatherSource::data(QString source) QVariantMap WeatherSource::initialData(QString source) const { - qCDebug(LOG_ESM) << "Source" << source; + qCDebug(LOG_ESS) << "Source" << source; int ind = index(source); QVariantMap data; diff --git a/sources/extsysmon/sources/weathersource.h b/sources/extsysmonsources/weathersource.h similarity index 97% rename from sources/extsysmon/sources/weathersource.h rename to sources/extsysmonsources/weathersource.h index 50b9f83..88520f6 100644 --- a/sources/extsysmon/sources/weathersource.h +++ b/sources/extsysmonsources/weathersource.h @@ -39,7 +39,7 @@ public: private: QStringList getSources(); // configuration and values - ExtItemAggregator *extWeather; + ExtItemAggregator *extWeather = nullptr; QStringList m_sources; QVariantHash m_values; }; diff --git a/sources/libraries.cmake b/sources/libraries.cmake index 339bb58..6f171a6 100644 --- a/sources/libraries.cmake +++ b/sources/libraries.cmake @@ -2,7 +2,7 @@ find_package(Gettext REQUIRED) # main qt libraries -find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Widgets) +find_package(Qt5 5.6.0 REQUIRED COMPONENTS Core DBus Network Qml Test Widgets) add_definitions( ${Qt5Core_DEFINITIONS} ${Qt5DBus_DEFINITIONS} ${Qt5Network_DEFINITIONS} ${Qt5Qml_DEFINITIONS} ${Qt5Widgets_DEFINITIONS} diff --git a/sources/test/CMakeLists.txt b/sources/test/CMakeLists.txt new file mode 100644 index 0000000..d7aabaa --- /dev/null +++ b/sources/test/CMakeLists.txt @@ -0,0 +1,36 @@ +set(SUBPROJECT awesomewidgets-test) +message(STATUS "Subproject ${SUBPROJECT}") + +# find qt test package +add_definitions(${Qt5Test_DEFINITIONS}) +include_directories( + ${CMAKE_SOURCE_DIR} + ${CMAKE_BINARY_DIR} + ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_LIBRARY}/ + ${CMAKE_CURRENT_SOURCE_DIR}/../${PROJECT_MONITORSOURCES}/ + ${PROJECT_TRDPARTY_DIR} + ${Qt_INCLUDE} + ${Qt5Test_INCLUDE_DIRS} + ${Kf5_INCLUDE} +) + +## library +set(AWTESTLIBRARY_HEADERS awtestlibrary.h) +set(AWTESTLIBRARY_SOURCES awtestlibrary.cpp) +add_library(${SUBPROJECT}-awtest STATIC ${AWTESTLIBRARY_SOURCES} ${AWTESTLIBRARY_HEADERS}) +target_link_libraries(${SUBPROJECT}-awtest ${Qt_LIBRARIES} ${Qt5Test_LIBRARIES}) +set(LIBRARY_TEST_SET ${SUBPROJECT}-awtest ${PROJECT_LIBRARY} ${PROJECT_MONITORSOURCES} ${Qt_LIBRARIES} ${Qt5Test_LIBRARIES}) + +## modules +set(TEST_MODULES + abstractextitem extquotes extscript extupgrade extweather + abstractformatter datetimeformatter floatformatter noformatter scriptformatter + extitemaggregator + batterysource desktopsource gpuloadsource gputempsource hddtempsource networksource processessource) +foreach (TEST_MODULE ${TEST_MODULES}) + set(${TEST_MODULE}_HEADERS test${TEST_MODULE}.h) + set(${TEST_MODULE}_SOURCES test${TEST_MODULE}.cpp) + add_executable(${SUBPROJECT}-${TEST_MODULE} ${${TEST_MODULE}_HEADERS} ${${TEST_MODULE}_SOURCES}) + target_link_libraries(${SUBPROJECT}-${TEST_MODULE} ${LIBRARY_TEST_SET}) + add_test(NAME ${TEST_MODULE} COMMAND ${CMAKE_CURRENT_BINARY_DIR}/${SUBPROJECT}-${TEST_MODULE}) +endforeach (TEST_MODULE) diff --git a/sources/test/awtestlibrary.cpp b/sources/test/awtestlibrary.cpp new file mode 100644 index 0000000..a36c589 --- /dev/null +++ b/sources/test/awtestlibrary.cpp @@ -0,0 +1,94 @@ +/*************************************************************************** + * 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 "awtestlibrary.h" + +#include +#include + + +char AWTestLibrary::randomChar() +{ + return 'A' + (rand() % static_cast('Z' - 'A')); +} + + +double AWTestLibrary::randomDouble() +{ + return static_cast(rand()) / static_cast(RAND_MAX); +} + + +QPair AWTestLibrary::randomFilenames() +{ + QString fileName = QString("%1/").arg( + QStandardPaths::writableLocation(QStandardPaths::TempLocation)); + QString writeFileName = QString("%1/awesomewidgets/tmp/") + .arg(QStandardPaths::writableLocation( + QStandardPaths::GenericDataLocation)); + + QString name = randomString(20); + fileName += name; + writeFileName += name; + + return QPair(fileName, writeFileName); +} + + +int AWTestLibrary::randomInt(const int max) +{ + return rand() % max; +} + + +QString AWTestLibrary::randomString(const int max) +{ + QString output; + + int count = 1 + randomInt(max); + for (int i = 0; i < count; i++) + output += QChar(randomChar()); + + return output; +} + + +QStringList AWTestLibrary::randomStringList(const int max) +{ + QStringList output; + + int count = 1 + randomInt(max); + for (int i = 0; i < count; i++) + output.append(randomString()); + + return output; +} + + +QStringList AWTestLibrary::randomSelect(const QStringList available) +{ + QSet output; + + int count = 1 + randomInt(available.count()); + for (int i = 0; i < count; i++) { + int index = randomInt(available.count()); + output << available.at(index); + } + + return output.toList(); +} diff --git a/sources/test/awtestlibrary.h b/sources/test/awtestlibrary.h new file mode 100644 index 0000000..44d4dc0 --- /dev/null +++ b/sources/test/awtestlibrary.h @@ -0,0 +1,37 @@ +/*************************************************************************** + * 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 AWTESTLIBRARY_H +#define AWTESTLIBRARY_H + +#include + + +namespace AWTestLibrary +{ +char randomChar(); +double randomDouble(); +QPair randomFilenames(); +int randomInt(const int max = 100); +QString randomString(const int max = 100); +QStringList randomStringList(const int max = 100); +QStringList randomSelect(const QStringList available); +}; + + +#endif /* AWTESTLIBRARY_H */ diff --git a/sources/test/testabstractextitem.cpp b/sources/test/testabstractextitem.cpp new file mode 100644 index 0000000..379b186 --- /dev/null +++ b/sources/test/testabstractextitem.cpp @@ -0,0 +1,113 @@ +/*************************************************************************** + * 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 "testabstractextitem.h" + +#include + +#include "awtestlibrary.h" +#include "extupgrade.h" + + +void TestAbstractExtItem::initTestCase() +{ + auto names = AWTestLibrary::randomFilenames(); + fileName = names.first; + writeFileName = names.second; + + extItem = new ExtUpgrade(nullptr, fileName); + extItem->setActive(false); + extItem->setApiVersion(1); + extItem->setComment(comment); + extItem->setName(name); + extItem->setNumber(-1); +} + + +void TestAbstractExtItem::cleanupTestCase() +{ + QFile::remove(fileName); + delete extItem; +} + + +void TestAbstractExtItem::test_values() +{ + QCOMPARE(extItem->isActive(), false); + QCOMPARE(extItem->apiVersion(), 1); + QCOMPARE(extItem->comment(), comment); + QCOMPARE(extItem->fileName(), fileName); + QCOMPARE(extItem->name(), name); + QVERIFY((extItem->number() > 0) && (extItem->number() < 1000)); +} + + +void TestAbstractExtItem::test_writtableFile() +{ + QCOMPARE(extItem->writtableConfig(), writeFileName); +} + + +void TestAbstractExtItem::test_configuration() +{ + extItem->writeConfiguration(); + + ExtUpgrade *newExtItem = new ExtUpgrade(nullptr, writeFileName); + QCOMPARE(newExtItem->isActive(), extItem->isActive()); + QCOMPARE(newExtItem->comment(), extItem->comment()); + QCOMPARE(newExtItem->fileName(), writeFileName); + QCOMPARE(newExtItem->name(), extItem->name()); + QCOMPARE(newExtItem->number(), extItem->number()); + + delete newExtItem; +} + + +void TestAbstractExtItem::test_bumpApi() +{ + extItem->bumpApi(100500); + + QCOMPARE(extItem->apiVersion(), 100500); +} + + +void TestAbstractExtItem::test_delete() +{ + ExtUpgrade *newExtItem = new ExtUpgrade(nullptr, writeFileName); + + QVERIFY(newExtItem->tryDelete()); + QVERIFY(!QFile::exists(writeFileName)); + + delete newExtItem; +} + + +void TestAbstractExtItem::test_copy() +{ + ExtUpgrade *newExtItem = extItem->copy(QString("/dev/null"), 1); + + QCOMPARE(newExtItem->isActive(), extItem->isActive()); + QCOMPARE(newExtItem->apiVersion(), extItem->apiVersion()); + QCOMPARE(newExtItem->comment(), extItem->comment()); + QCOMPARE(newExtItem->name(), extItem->name()); + + delete newExtItem; +} + + +QTEST_MAIN(TestAbstractExtItem); diff --git a/sources/test/testabstractextitem.h b/sources/test/testabstractextitem.h new file mode 100644 index 0000000..43f1ea0 --- /dev/null +++ b/sources/test/testabstractextitem.h @@ -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 TESTABSTRACTEXTITEM_H +#define TESTABSTRACTEXTITEM_H + +#include + + +class ExtUpgrade; + +class TestAbstractExtItem : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_writtableFile(); + void test_configuration(); + void test_bumpApi(); + void test_delete(); + void test_copy(); + +private: + ExtUpgrade *extItem = nullptr; + QString comment = QString("A comment"); + QString name = QString("A name"); + QString fileName; + QString writeFileName; +}; + + +#endif /* TESTABSTRACTEXTITEM_H */ diff --git a/sources/test/testabstractformatter.cpp b/sources/test/testabstractformatter.cpp new file mode 100644 index 0000000..a8c6905 --- /dev/null +++ b/sources/test/testabstractformatter.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + * 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 "testabstractformatter.h" + +#include + +#include "awnoformatter.h" +#include "awtestlibrary.h" + + +void TestAbstractFormatter::initTestCase() +{ + formatter = new AWNoFormatter(nullptr); +} + + +void TestAbstractFormatter::cleanupTestCase() +{ + delete formatter; +} + + +void TestAbstractFormatter::test_values() +{ +} + + +void TestAbstractFormatter::test_type() +{ + QString type = AWTestLibrary::randomString(); + QEXPECT_FAIL("", "Will fail because of invalid format", Continue); + formatter->setStrType(type); + QCOMPARE(formatter->strType(), type); + + formatter->setStrType(QString("NoFormat")); + QCOMPARE(formatter->strType(), QString("NoFormat")); +} + + +void TestAbstractFormatter::test_copy() +{ + AWNoFormatter *newFormatter = formatter->copy(QString("/dev/null"), 1); + + QCOMPARE(newFormatter->type(), formatter->type()); + QCOMPARE(newFormatter->name(), formatter->name()); + + delete newFormatter; +} + + +QTEST_MAIN(TestAbstractFormatter); diff --git a/sources/test/testabstractformatter.h b/sources/test/testabstractformatter.h new file mode 100644 index 0000000..ec94f93 --- /dev/null +++ b/sources/test/testabstractformatter.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * 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 TESTABSTRACTFORMATTER_H +#define TESTABSTRACTFORMATTER_H + +#include + + +class AWNoFormatter; + +class TestAbstractFormatter : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_type(); + void test_copy(); + +private: + AWNoFormatter *formatter = nullptr; +}; + + +#endif /* TESTABSTRACTFORMATTER_H */ diff --git a/sources/test/testbatterysource.cpp b/sources/test/testbatterysource.cpp new file mode 100644 index 0000000..74f1f9f --- /dev/null +++ b/sources/test/testbatterysource.cpp @@ -0,0 +1,63 @@ +/*************************************************************************** + * 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 "testbatterysource.h" + +#include + +#include "awtestlibrary.h" +#include "batterysource.h" + + +void TestBatterySource::initTestCase() +{ + source = new BatterySource(this, QStringList() << acpiPath); +} + + +void TestBatterySource::cleanupTestCase() +{ + delete source; +} + + +void TestBatterySource::test_sources() +{ + QVERIFY(source->sources().count() >= 2); +} + + +void TestBatterySource::test_battery() +{ + if (source->sources().count() == 2) + QSKIP("No battery found, test will be skipped"); + + QStringList batteries = source->sources(); + std::for_each(batteries.begin(), batteries.end(), + [this](const QString bat) { + QVariant value = source->data(bat); + if (bat == QString("battery/ac")) + QCOMPARE(value.type(), QVariant::Bool); + else + QVERIFY((value.toFloat() >= battery.first) + && (value.toFloat() <= battery.second)); + }); +} + + +QTEST_MAIN(TestBatterySource); diff --git a/sources/test/testbatterysource.h b/sources/test/testbatterysource.h new file mode 100644 index 0000000..c51dfc9 --- /dev/null +++ b/sources/test/testbatterysource.h @@ -0,0 +1,46 @@ +/*************************************************************************** + * 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 TESTBATTERYSOURCE_H +#define TESTBATTERYSOURCE_H + +#include + + +class BatterySource; + +class TestBatterySource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_battery(); + +private: + BatterySource *source = nullptr; + QString acpiPath = QString("/sys/class/power_supply/"); + QPair battery = QPair(0, 100); +}; + + +#endif /* TESTBATTERYSOURCE_H */ diff --git a/sources/test/testdatetimeformatter.cpp b/sources/test/testdatetimeformatter.cpp new file mode 100644 index 0000000..41a1554 --- /dev/null +++ b/sources/test/testdatetimeformatter.cpp @@ -0,0 +1,69 @@ +/*************************************************************************** + * 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 "testdatetimeformatter.h" + +#include + +#include "awdatetimeformatter.h" +#include "awtestlibrary.h" +#include "version.h" + + +void TestAWDateTimeFormatter::initTestCase() +{ + format = AWTestLibrary::randomSelect(QString(TIME_KEYS).split(QChar(','))) + .join(QChar(' ')); + + formatter = new AWDateTimeFormatter(nullptr); + formatter->setFormat(format); +} + + +void TestAWDateTimeFormatter::cleanupTestCase() +{ + delete formatter; +} + + +void TestAWDateTimeFormatter::test_values() +{ + QCOMPARE(formatter->format(), format); +} + + +void TestAWDateTimeFormatter::test_conversion() +{ + QDateTime now = QDateTime::currentDateTime(); + QCOMPARE(formatter->convert(now), now.toString(format)); +} + + +void TestAWDateTimeFormatter::test_copy() +{ + AWDateTimeFormatter *newFormatter + = formatter->copy(QString("/dev/null"), 1); + + QCOMPARE(newFormatter->format(), formatter->format()); + QCOMPARE(newFormatter->number(), 1); + + delete newFormatter; +} + + +QTEST_MAIN(TestAWDateTimeFormatter); diff --git a/sources/test/testdatetimeformatter.h b/sources/test/testdatetimeformatter.h new file mode 100644 index 0000000..6386458 --- /dev/null +++ b/sources/test/testdatetimeformatter.h @@ -0,0 +1,46 @@ +/*************************************************************************** + * 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 TESTDATETIMEFORMATTER_H +#define TESTDATETIMEFORMATTER_H + +#include + + +class AWDateTimeFormatter; + +class TestAWDateTimeFormatter : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_conversion(); + void test_copy(); + +private: + AWDateTimeFormatter *formatter = nullptr; + QString format; +}; + + +#endif /* TESTDATETIMEFORMATTER_H */ diff --git a/sources/test/testdesktopsource.cpp b/sources/test/testdesktopsource.cpp new file mode 100644 index 0000000..602efd8 --- /dev/null +++ b/sources/test/testdesktopsource.cpp @@ -0,0 +1,60 @@ +/*************************************************************************** + * 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 "testdesktopsource.h" + +#include + +#include "awtestlibrary.h" +#include "desktopsource.h" + + +void TestDesktopSource::initTestCase() +{ + source = new DesktopSource(this, QStringList()); +} + + +void TestDesktopSource::cleanupTestCase() +{ + delete source; +} + + +void TestDesktopSource::test_sources() +{ + QCOMPARE(source->sources().count(), 4); + // FIXME there is segfault here sometimes o_0 +// QVERIFY(std::all_of( +// source->sources().cbegin(), source->sources().cend(), +// [](const QString &src) { return src.startsWith(QString("desktop/")); })); +} + + +void TestDesktopSource::test_values() +{ + QVERIFY(source->data(QString("desktop/current/name")).toString().count() + > 0); + QVERIFY(source->data(QString("desktop/current/number")).toInt() >= 0); + QVERIFY(source->data(QString("desktop/total/name")).toStringList().count() + > 0); + QVERIFY(source->data(QString("desktop/total/number")).toInt() > 0); +} + + +QTEST_MAIN(TestDesktopSource); diff --git a/sources/test/testdesktopsource.h b/sources/test/testdesktopsource.h new file mode 100644 index 0000000..7fd0a60 --- /dev/null +++ b/sources/test/testdesktopsource.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * 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 TESTDESKTOPSOURCE_H +#define TESTDESKTOPSOURCE_H + +#include + + +class DesktopSource; + +class TestDesktopSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_values(); + +private: + DesktopSource *source = nullptr; +}; + + +#endif /* TESTDESKTOPSOURCE_H */ diff --git a/sources/test/testextitemaggregator.cpp b/sources/test/testextitemaggregator.cpp new file mode 100644 index 0000000..ddd681f --- /dev/null +++ b/sources/test/testextitemaggregator.cpp @@ -0,0 +1,48 @@ +/*************************************************************************** + * 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 "testextitemaggregator.h" + +#include + +#include "awnoformatter.h" +#include "awtestlibrary.h" +#include "extitemaggregator.h" + + +void TestExtItemAggregator::initTestCase() +{ + aggregator = new ExtItemAggregator(nullptr, type); +} + + +void TestExtItemAggregator::cleanupTestCase() +{ + delete aggregator; +} + + +void TestExtItemAggregator::test_values() +{ + QCOMPARE(aggregator->type(), type); + QCOMPARE(aggregator->uniqNumber(), 0); + QCOMPARE(aggregator->items().count(), 0); +} + + +QTEST_MAIN(TestExtItemAggregator); diff --git a/sources/test/testextitemaggregator.h b/sources/test/testextitemaggregator.h new file mode 100644 index 0000000..022e501 --- /dev/null +++ b/sources/test/testextitemaggregator.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * 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 TESTEXTITEMAGGREGATOR_H +#define TESTEXTITEMAGGREGATOR_H + +#include + + +class AWNoFormatter; +template class ExtItemAggregator; + +class TestExtItemAggregator : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + +private: + ExtItemAggregator *aggregator = nullptr; + QString type = QString("tmp"); +}; + + +#endif /* TESTEXTITEMAGGREGATOR_H */ diff --git a/sources/test/testextquotes.cpp b/sources/test/testextquotes.cpp new file mode 100644 index 0000000..095f5d4 --- /dev/null +++ b/sources/test/testextquotes.cpp @@ -0,0 +1,123 @@ +/*************************************************************************** + * 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 "testextquotes.h" + +#include + +#include "extquotes.h" + + +void TestExtQuotes::initTestCase() +{ + extQuotes = new ExtQuotes(nullptr); + extQuotes->setInterval(1); + extQuotes->setTicker(ticker); + extQuotes->setNumber(0); + + extQuotes->run(); +} + + +void TestExtQuotes::cleanupTestCase() +{ + delete extQuotes; +} + + +void TestExtQuotes::test_values() +{ + QCOMPARE(extQuotes->interval(), 1); + QCOMPARE(extQuotes->number(), 0); + QCOMPARE(extQuotes->ticker(), ticker); +} + + +void TestExtQuotes::test_run() +{ + // init spy + QSignalSpy spy(extQuotes, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extQuotes->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + cache[QString("ask")] + = arguments.at(0).toHash()[extQuotes->tag(QString("ask"))]; + cache[QString("bid")] + = arguments.at(0).toHash()[extQuotes->tag(QString("bid"))]; + cache[QString("price")] + = arguments.at(0).toHash()[extQuotes->tag(QString("price"))]; + + QCOMPARE(firstValue[extQuotes->tag(QString("ask"))].toDouble(), 0.0); + QCOMPARE(firstValue[extQuotes->tag(QString("bid"))].toDouble(), 0.0); + QCOMPARE(firstValue[extQuotes->tag(QString("price"))].toDouble(), 0.0); + for (auto type : types) { + qDebug() << "Test type" << type; + QVERIFY((cache[type].toDouble() > price.first) + && (cache[type].toDouble() < price.second)); + } +} + + +void TestExtQuotes::test_derivatives() +{ + // init spy + QSignalSpy spy(extQuotes, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extQuotes->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + QVariantHash values; + values[QString("ask")] + = arguments.at(0).toHash()[extQuotes->tag(QString("ask"))]; + values[QString("bid")] + = arguments.at(0).toHash()[extQuotes->tag(QString("bid"))]; + values[QString("price")] + = arguments.at(0).toHash()[extQuotes->tag(QString("price"))]; + + for (auto type : types) { + qDebug() << "Test type" << type; + QCOMPARE(arguments.at(0) + .toHash()[extQuotes->tag(QString("%1chg").arg(type))] + .toDouble(), + (values[type].toDouble() - cache[type].toDouble())); + QWARN("Possible round error"); + QCOMPARE(arguments.at(0) + .toHash()[extQuotes->tag(QString("perc%1chg").arg(type))] + .toDouble(), + 100.0 * (values[type].toDouble() - cache[type].toDouble()) + / values[type].toDouble()); + } +} + + +void TestExtQuotes::test_copy() +{ + ExtQuotes *newExtQuotes = extQuotes->copy(QString("/dev/null"), 1); + + QCOMPARE(newExtQuotes->interval(), extQuotes->interval()); + QCOMPARE(newExtQuotes->ticker(), extQuotes->ticker()); + QCOMPARE(newExtQuotes->number(), 1); + + delete newExtQuotes; +} + + +QTEST_MAIN(TestExtQuotes); diff --git a/sources/test/testextquotes.h b/sources/test/testextquotes.h new file mode 100644 index 0000000..1b07163 --- /dev/null +++ b/sources/test/testextquotes.h @@ -0,0 +1,53 @@ +/*************************************************************************** + * 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 TESTEXTQUOTES_H +#define TESTEXTQUOTES_H + +#include +#include + + +class ExtQuotes; + +class TestExtQuotes : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_run(); + void test_derivatives(); + void test_copy(); + +private: + ExtQuotes *extQuotes = nullptr; + QVariantHash cache; + QString ticker = QString("EURUSD=X"); + QStringList types = QStringList() << QString("ask") << QString("bid") + << QString("price"); + // we assume that price will not be differ more than in 2 times + QPair price = QPair(0.5, 2.0); +}; + + +#endif /* TESTEXTQUOTES_H */ diff --git a/sources/test/testextscript.cpp b/sources/test/testextscript.cpp new file mode 100644 index 0000000..959593f --- /dev/null +++ b/sources/test/testextscript.cpp @@ -0,0 +1,107 @@ +/*************************************************************************** + * 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 "testextscript.h" + +#include + +#include "awtestlibrary.h" +#include "extscript.h" + + +void TestExtScript::initTestCase() +{ + randomString = AWTestLibrary::randomString(); + + extScript = new ExtScript(nullptr); + extScript->setInterval(1); + extScript->setExecutable(randomString); + extScript->setNumber(0); + extScript->setRedirect(ExtScript::Redirect::stderr2stdout); + extScript->setPrefix(QString("echo")); + + extScript->run(); +} + + +void TestExtScript::cleanupTestCase() +{ + delete extScript; +} + + +void TestExtScript::test_values() +{ + QCOMPARE(extScript->interval(), 1); + QCOMPARE(extScript->number(), 0); + QCOMPARE(extScript->executable(), randomString); + QCOMPARE(extScript->strRedirect(), QString("stderr2stdout")); + QCOMPARE(extScript->prefix(), QString("echo")); +} + + +void TestExtScript::test_run() +{ + // init spy + QSignalSpy spy(extScript, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extScript->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + + QCOMPARE(firstValue[extScript->tag(QString("custom"))].toString(), + QString("")); + QCOMPARE( + arguments.at(0).toHash()[extScript->tag(QString("custom"))].toString(), + QString("\n%1").arg(randomString)); +} + + +void TestExtScript::test_filters() +{ + extScript->setFilters(QStringList() << QString("newline")); + // init spy + QSignalSpy spy(extScript, SIGNAL(dataReceived(const QVariantHash &))); + extScript->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + QCOMPARE( + arguments.at(0).toHash()[extScript->tag(QString("custom"))].toString(), + QString("
%1").arg(randomString)); +} + + +void TestExtScript::test_copy() +{ + ExtScript *newExtScript = extScript->copy(QString("/dev/null"), 1); + + QCOMPARE(newExtScript->interval(), extScript->interval()); + QCOMPARE(newExtScript->executable(), extScript->executable()); + QCOMPARE(newExtScript->strRedirect(), extScript->strRedirect()); + QCOMPARE(newExtScript->prefix(), extScript->prefix()); + QCOMPARE(newExtScript->filters(), extScript->filters()); + QCOMPARE(newExtScript->number(), 1); + + delete newExtScript; +} + + +QTEST_MAIN(TestExtScript); diff --git a/sources/test/testextscript.h b/sources/test/testextscript.h new file mode 100644 index 0000000..4c1d195 --- /dev/null +++ b/sources/test/testextscript.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 TESTEXTSCRIPT_H +#define TESTEXTSCRIPT_H + +#include + + +class ExtScript; + +class TestExtScript : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_run(); + void test_filters(); + void test_copy(); + +private: + ExtScript *extScript = nullptr; + QString randomString; +}; + + +#endif /* TESTEXTSCRIPT_H */ diff --git a/sources/test/testextupgrade.cpp b/sources/test/testextupgrade.cpp new file mode 100644 index 0000000..fb0e0d3 --- /dev/null +++ b/sources/test/testextupgrade.cpp @@ -0,0 +1,119 @@ +/*************************************************************************** + * 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 "testextupgrade.h" + +#include + +#include "awtestlibrary.h" +#include "extupgrade.h" + + +void TestExtUpgrade::initTestCase() +{ + randomStrings = AWTestLibrary::randomStringList(); + cmd = QString("echo -e '%1'").arg(randomStrings.join(QString("\n"))); + + extUpgrade = new ExtUpgrade(nullptr); + extUpgrade->setInterval(1); + extUpgrade->setExecutable(cmd); + extUpgrade->setNumber(0); + + extUpgrade->run(); +} + + +void TestExtUpgrade::cleanupTestCase() +{ + delete extUpgrade; +} + + +void TestExtUpgrade::test_values() +{ + QCOMPARE(extUpgrade->interval(), 1); + QCOMPARE(extUpgrade->number(), 0); + QCOMPARE(extUpgrade->executable(), cmd); +} + + +void TestExtUpgrade::test_run() +{ + // init spy + QSignalSpy spy(extUpgrade, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extUpgrade->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + + QCOMPARE(firstValue[extUpgrade->tag(QString("pkgcount"))].toInt(), 0); + QCOMPARE( + arguments.at(0).toHash()[extUpgrade->tag(QString("pkgcount"))].toInt(), + randomStrings.count()); +} + + +void TestExtUpgrade::test_null() +{ + int null = AWTestLibrary::randomInt(randomStrings.count()); + extUpgrade->setNull(null); + QSignalSpy spy(extUpgrade, SIGNAL(dataReceived(const QVariantHash &))); + extUpgrade->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + QCOMPARE( + arguments.at(0).toHash()[extUpgrade->tag(QString("pkgcount"))].toInt(), + randomStrings.count() - null); +} + + +void TestExtUpgrade::test_filter() +{ + QStringList filters = AWTestLibrary::randomSelect(randomStrings); + extUpgrade->setFilter(QString("(^%1$)").arg(filters.join(QString("$|^")))); + // init spy + QSignalSpy spy(extUpgrade, SIGNAL(dataReceived(const QVariantHash &))); + extUpgrade->run(); + + // check values + QVERIFY(spy.wait(5000)); + QList arguments = spy.takeFirst(); + QCOMPARE( + arguments.at(0).toHash()[extUpgrade->tag(QString("pkgcount"))].toInt(), + filters.count()); +} + + +void TestExtUpgrade::test_copy() +{ + ExtUpgrade *newExtUpgrade = extUpgrade->copy(QString("/dev/null"), 1); + + QCOMPARE(newExtUpgrade->interval(), extUpgrade->interval()); + QCOMPARE(newExtUpgrade->executable(), extUpgrade->executable()); + QCOMPARE(newExtUpgrade->filter(), extUpgrade->filter()); + QCOMPARE(newExtUpgrade->null(), extUpgrade->null()); + QCOMPARE(newExtUpgrade->number(), 1); + + delete newExtUpgrade; +} + + +QTEST_MAIN(TestExtUpgrade); diff --git a/sources/test/testextupgrade.h b/sources/test/testextupgrade.h new file mode 100644 index 0000000..7db8bcb --- /dev/null +++ b/sources/test/testextupgrade.h @@ -0,0 +1,49 @@ +/*************************************************************************** + * 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 TESTEXTUPGRADE_H +#define TESTEXTUPGRADE_H + +#include + + +class ExtUpgrade; + +class TestExtUpgrade : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_run(); + void test_null(); + void test_filter(); + void test_copy(); + +private: + ExtUpgrade *extUpgrade = nullptr; + QString cmd; + QStringList randomStrings; +}; + + +#endif /* TESTEXTUPGRADE_H */ diff --git a/sources/test/testextweather.cpp b/sources/test/testextweather.cpp new file mode 100644 index 0000000..825ee26 --- /dev/null +++ b/sources/test/testextweather.cpp @@ -0,0 +1,140 @@ +/*************************************************************************** + * 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 "testextweather.h" + +#include + +#include "extweather.h" + + +void TestExtWeather::initTestCase() +{ + extWeather = new ExtWeather(nullptr); + extWeather->setInterval(1); + extWeather->setCity(city); + extWeather->setCountry(country); + extWeather->setNumber(0); + extWeather->setProvider(ExtWeather::Provider::OWM); + + extWeather->run(); +} + + +void TestExtWeather::cleanupTestCase() +{ + delete extWeather; +} + + +void TestExtWeather::test_values() +{ + QCOMPARE(extWeather->interval(), 1); + QCOMPARE(extWeather->number(), 0); + QCOMPARE(extWeather->city(), city); + QCOMPARE(extWeather->country(), country); + QCOMPARE(extWeather->provider(), ExtWeather::Provider::OWM); +} + + +void TestExtWeather::test_runOWM() +{ + run(); +} + + +void TestExtWeather::test_runYahoo() +{ + extWeather->setProvider(ExtWeather::Provider::Yahoo); + run(); + extWeather->setProvider(ExtWeather::Provider::OWM); +} + + +void TestExtWeather::test_ts() +{ + extWeather->setTs(1); + run(); +} + + +void TestExtWeather::test_image() +{ + extWeather->setImage(true); + // init spy + QSignalSpy spy(extWeather, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extWeather->run(); + + // check values + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + QVERIFY( + arguments[extWeather->tag(QString("weather"))].toString().startsWith( + QString("copy(QString("/dev/null"), 1); + + QCOMPARE(newExtWeather->interval(), extWeather->interval()); + QCOMPARE(newExtWeather->city(), extWeather->city()); + QCOMPARE(newExtWeather->country(), extWeather->country()); + QCOMPARE(newExtWeather->ts(), extWeather->ts()); + QCOMPARE(newExtWeather->image(), extWeather->image()); + QCOMPARE(newExtWeather->provider(), extWeather->provider()); + QCOMPARE(newExtWeather->number(), 1); + + delete newExtWeather; +} + + +void TestExtWeather::run() +{ + // init spy + QSignalSpy spy(extWeather, SIGNAL(dataReceived(const QVariantHash &))); + QVariantHash firstValue = extWeather->run(); + + // check values + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + QEXPECT_FAIL("", "WeatherID should not be 0", Continue); + QCOMPARE(arguments[extWeather->tag(QString("weatherId"))].toInt(), 0); + QVERIFY((arguments[extWeather->tag(QString("humidity"))].toInt() + >= humidity.first) + && (arguments[extWeather->tag(QString("humidity"))].toInt() + <= humidity.second)); + QWARN("May fail here for Yahoo! Weather, see " + "https://yahoo.uservoice.com/forums/207813-us-weather/suggestions/" + "14209233-invalid-pressure-calculation"); + QVERIFY((arguments[extWeather->tag(QString("pressure"))].toInt() + > pressure.first) + && (arguments[extWeather->tag(QString("pressure"))].toInt() + < pressure.second)); + QVERIFY((arguments[extWeather->tag(QString("temperature"))].toFloat() + > temp.first) + && (arguments[extWeather->tag(QString("temperature"))].toFloat() + < temp.second)); + // image should be only one symbol here + QCOMPARE(arguments[extWeather->tag(QString("weather"))].toString().count(), + 1); +} + + +QTEST_MAIN(TestExtWeather); diff --git a/sources/test/testextweather.h b/sources/test/testextweather.h new file mode 100644 index 0000000..e06cae2 --- /dev/null +++ b/sources/test/testextweather.h @@ -0,0 +1,57 @@ +/*************************************************************************** + * 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 TESTEXTWEATHER_H +#define TESTEXTWEATHER_H + +#include + + +class ExtWeather; + +class TestExtWeather : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_runOWM(); + void test_runYahoo(); + void test_ts(); + void test_image(); + void test_copy(); + +private: + void run(); + ExtWeather *extWeather = nullptr; + QString city = QString("London"); + QString country = QString("uk"); + // humidity is in percents + QPair humidity = QPair(0, 100); + // pressure should be about 1 atm + QPair pressure = QPair(500.0f, 1500.0f); + // dont know about temperature, but I suppose it will be between -40 and 40 + QPair temp = QPair(-40.0f, 40.0f); +}; + + +#endif /* TESTEXTWEATHER_H */ diff --git a/sources/test/testfloatformatter.cpp b/sources/test/testfloatformatter.cpp new file mode 100644 index 0000000..46ef23e --- /dev/null +++ b/sources/test/testfloatformatter.cpp @@ -0,0 +1,181 @@ +/*************************************************************************** + * 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 "testfloatformatter.h" + +#include + +#include "awfloatformatter.h" +#include "awtestlibrary.h" + + +void TestAWFloatFormatter::initTestCase() +{ + formatter = new AWFloatFormatter(nullptr); +} + + +void TestAWFloatFormatter::cleanupTestCase() +{ + delete formatter; +} + + +void TestAWFloatFormatter::test_values() +{ +} + + +void TestAWFloatFormatter::test_count() +{ + // assign + int count = 10 + AWTestLibrary::randomInt(); + formatter->setCount(count); + QCOMPARE(formatter->count(), count); + + // test + double value = AWTestLibrary::randomDouble(); + QString output = formatter->convert(value); + QCOMPARE(output.count(), count); + + // reset + formatter->setCount(0); +} + + +void TestAWFloatFormatter::test_fillChar() +{ + // assign + char c = AWTestLibrary::randomChar(); + formatter->setFillChar(QChar(c)); + QCOMPARE(formatter->fillChar(), QChar(c)); + formatter->setCount(101); + + // test + int value = AWTestLibrary::randomInt(); + QString output = formatter->convert(value); + QVERIFY(output.startsWith(QChar(c))); + + // reset + formatter->setFillChar(QChar()); + formatter->setCount(0); +} + + +void TestAWFloatFormatter::test_format() +{ + // assign + QWARN("Lets assing 'z' formatter, it should cause a warning"); + formatter->setFormat('z'); + QCOMPARE(formatter->format(), 'f'); + formatter->setFormat('e'); + QCOMPARE(formatter->format(), 'e'); + + // test + double value = AWTestLibrary::randomDouble(); + QString output = formatter->convert(value); + QVERIFY(output.contains('e')); + + // reset + formatter->setFormat('f'); +} + + +void TestAWFloatFormatter::test_precision() +{ + // assign + int precision = 1 + AWTestLibrary::randomInt(5); + formatter->setPrecision(precision); + QCOMPARE(formatter->precision(), precision); + + // test + double value = AWTestLibrary::randomDouble(); + QString output = formatter->convert(value); + output.remove(QString("0.")); + QCOMPARE(output.count(), precision); + + // reset + formatter->setPrecision(-1); +} + + +void TestAWFloatFormatter::test_multiplier() +{ + formatter->setPrecision(6); + + // assign + double multiplier = AWTestLibrary::randomDouble(); + formatter->setMultiplier(multiplier); + QCOMPARE(formatter->multiplier(), multiplier); + + // test + double value = AWTestLibrary::randomDouble(); + QCOMPARE(formatter->convert(value), + QString::number(value * multiplier, 'f', 6)); + + // reset + formatter->setMultiplier(1.0); +} + + +void TestAWFloatFormatter::test_summand() +{ + // assign + double summand = AWTestLibrary::randomDouble(); + formatter->setSummand(summand); + QCOMPARE(formatter->summand(), summand); + + // test + double value = AWTestLibrary::randomDouble(); + QCOMPARE(formatter->convert(value), + QString::number(value + summand, 'f', 6)); + + // reset + formatter->setSummand(1.0); +} + + +void TestAWFloatFormatter::test_copy() +{ + doRandom(); + AWFloatFormatter *newFormatter = formatter->copy(QString("/dev/null"), 1); + + QCOMPARE(newFormatter->count(), formatter->count()); + QCOMPARE(newFormatter->fillChar(), formatter->fillChar()); + QCOMPARE(newFormatter->format(), formatter->format()); + QCOMPARE(newFormatter->multiplier(), formatter->multiplier()); + QCOMPARE(newFormatter->precision(), formatter->precision()); + QCOMPARE(newFormatter->summand(), formatter->summand()); + QCOMPARE(newFormatter->number(), 1); + + delete newFormatter; +} + + +void TestAWFloatFormatter::doRandom() +{ + formatter->setCount(AWTestLibrary::randomInt()); + formatter->setFillChar(QChar(AWTestLibrary::randomChar())); + formatter->setFormat(AWTestLibrary::randomChar()); + formatter->setMultiplier(AWTestLibrary::randomDouble()); + formatter->setPrecision(AWTestLibrary::randomInt()); + formatter->setSummand(AWTestLibrary::randomDouble()); +} + + +QTEST_MAIN(TestAWFloatFormatter); diff --git a/sources/test/testfloatformatter.h b/sources/test/testfloatformatter.h new file mode 100644 index 0000000..77746c9 --- /dev/null +++ b/sources/test/testfloatformatter.h @@ -0,0 +1,51 @@ +/*************************************************************************** + * 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 TESTFLOATFORMATTER_H +#define TESTFLOATFORMATTER_H + +#include + + +class AWFloatFormatter; + +class TestAWFloatFormatter : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_count(); + void test_fillChar(); + void test_format(); + void test_precision(); + void test_multiplier(); + void test_summand(); + void test_copy(); + +private: + void doRandom(); + AWFloatFormatter *formatter = nullptr; +}; + + +#endif /* TESTFLOATFORMATTER_H */ diff --git a/sources/test/testgpuloadsource.cpp b/sources/test/testgpuloadsource.cpp new file mode 100644 index 0000000..0bdc1ec --- /dev/null +++ b/sources/test/testgpuloadsource.cpp @@ -0,0 +1,65 @@ +/*************************************************************************** + * 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 "testgpuloadsource.h" + +#include + +#include "awtestlibrary.h" +#include "gpuloadsource.h" + + +void TestGPULoadSource::initTestCase() +{ + device = GPULoadSource::autoGpu(); + QVERIFY(!device.isEmpty()); + + source = new GPULoadSource(this, QStringList() << device); +} + + +void TestGPULoadSource::cleanupTestCase() +{ + delete source; +} + + +void TestGPULoadSource::test_sources() +{ + QCOMPARE(source->sources(), QStringList() << src); +} + + +void TestGPULoadSource::test_gpuload() +{ + if (device == QString("disable")) + QSKIP("Not supported device, test will be skipped"); + + QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &))); + float firstValue = source->data(src).toFloat(); + + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + float secondValue = arguments[src].toFloat(); + + QCOMPARE(firstValue, 0.0f); + QVERIFY((secondValue >= load.first) && (secondValue <= load.second)); +} + + +QTEST_MAIN(TestGPULoadSource); diff --git a/sources/test/testgpuloadsource.h b/sources/test/testgpuloadsource.h new file mode 100644 index 0000000..5e32433 --- /dev/null +++ b/sources/test/testgpuloadsource.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 TESTGPULOADSOURCE_H +#define TESTGPULOADSOURCE_H + +#include + + +class GPULoadSource; + +class TestGPULoadSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_gpuload(); + +private: + GPULoadSource *source = nullptr; + QString device; + QString src = QString("gpu/load"); + QPair load = QPair(0.0f, 100.0f); +}; + + +#endif /* TESTGPULOADSOURCE_H */ diff --git a/sources/test/testgputempsource.cpp b/sources/test/testgputempsource.cpp new file mode 100644 index 0000000..a73546c --- /dev/null +++ b/sources/test/testgputempsource.cpp @@ -0,0 +1,65 @@ +/*************************************************************************** + * 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 "testgputempsource.h" + +#include + +#include "awtestlibrary.h" +#include "gputempsource.h" + + +void TestGPUTemperatureSource::initTestCase() +{ + device = GPUTemperatureSource::autoGpu(); + QVERIFY(!device.isEmpty()); + + source = new GPUTemperatureSource(this, QStringList() << device); +} + + +void TestGPUTemperatureSource::cleanupTestCase() +{ + delete source; +} + + +void TestGPUTemperatureSource::test_sources() +{ + QCOMPARE(source->sources(), QStringList() << src); +} + + +void TestGPUTemperatureSource::test_gputemp() +{ + if (device == QString("disable")) + QSKIP("Not supported device, test will be skipped"); + + QSignalSpy spy(source, SIGNAL(dataReceived(const QVariantHash &))); + float firstValue = source->data(src).toFloat(); + + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + float secondValue = arguments[src].toFloat(); + + QCOMPARE(firstValue, 0.0f); + QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); +} + + +QTEST_MAIN(TestGPUTemperatureSource); diff --git a/sources/test/testgputempsource.h b/sources/test/testgputempsource.h new file mode 100644 index 0000000..74458e0 --- /dev/null +++ b/sources/test/testgputempsource.h @@ -0,0 +1,47 @@ +/*************************************************************************** + * 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 TESTGPUTEMPSOURCE_H +#define TESTGPUTEMPSOURCE_H + +#include + + +class GPUTemperatureSource; + +class TestGPUTemperatureSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_gputemp(); + +private: + GPUTemperatureSource *source = nullptr; + QString device; + QString src = QString("gpu/temperature"); + QPair temp = QPair(0.0f, 120.0f); +}; + + +#endif /* TESTGPUTEMPSOURCE_H */ diff --git a/sources/test/testhddtempsource.cpp b/sources/test/testhddtempsource.cpp new file mode 100644 index 0000000..bccd587 --- /dev/null +++ b/sources/test/testhddtempsource.cpp @@ -0,0 +1,93 @@ +/*************************************************************************** + * 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 "testhddtempsource.h" + +#include + +#include "awtestlibrary.h" +#include "hddtempsource.h" + + +void TestHDDTemperatureSource::initTestCase() +{ + devices = HDDTemperatureSource::allHdd(); + QVERIFY(devices.count() > 0); + + hddtempSource = new HDDTemperatureSource( + this, QStringList() << devices.join(QChar(',')) << hddtempCmd); + smartctlSource = new HDDTemperatureSource( + this, QStringList() << devices.join(QChar(',')) << smartctlCmd); +} + + +void TestHDDTemperatureSource::cleanupTestCase() +{ + delete hddtempSource; + delete smartctlSource; +} + + +void TestHDDTemperatureSource::test_sources() +{ + std::for_each(devices.begin(), devices.end(), [](QString &device) { + device.prepend(QString("hdd/temperature")); + }); + + QCOMPARE(hddtempSource->sources(), devices); + QCOMPARE(smartctlSource->sources(), devices); +} + + +void TestHDDTemperatureSource::test_hddtemp() +{ + std::for_each(devices.begin(), devices.end(), [this](QString device) { + QSignalSpy spy(hddtempSource, + SIGNAL(dataReceived(const QVariantHash &))); + float firstValue = hddtempSource->data(device).toFloat(); + + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + device.remove(QString("hdd/temperature")); + float secondValue = arguments[device].toFloat(); + + QCOMPARE(firstValue, 0.0f); + QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); + }); +} + + +void TestHDDTemperatureSource::test_smartctl() +{ + std::for_each(devices.begin(), devices.end(), [this](QString &device) { + QSignalSpy spy(smartctlSource, + SIGNAL(dataReceived(const QVariantHash &))); + float firstValue = smartctlSource->data(device).toFloat(); + + QVERIFY(spy.wait(5000)); + QVariantHash arguments = spy.takeFirst().at(0).toHash(); + device.remove(QString("hdd/temperature")); + float secondValue = arguments[device].toFloat(); + + QCOMPARE(firstValue, 0.0f); + QVERIFY((secondValue >= temp.first) && (secondValue <= temp.second)); + }); +} + + +QTEST_MAIN(TestHDDTemperatureSource); diff --git a/sources/test/testhddtempsource.h b/sources/test/testhddtempsource.h new file mode 100644 index 0000000..b790938 --- /dev/null +++ b/sources/test/testhddtempsource.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * 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 TESTHDDTEMPSOURCE_H +#define TESTHDDTEMPSOURCE_H + +#include + + +class HDDTemperatureSource; + +class TestHDDTemperatureSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_hddtemp(); + void test_smartctl(); + +private: + HDDTemperatureSource *hddtempSource = nullptr; + HDDTemperatureSource *smartctlSource = nullptr; + QStringList devices; + QString hddtempCmd = QString("sudo hddtemp"); + QString smartctlCmd = QString("sudo smartctl -a"); + QPair temp = QPair(0.0f, 120.0f); +}; + + +#endif /* TESTHDDTEMPSOURCE_H */ diff --git a/sources/test/testnetworksource.cpp b/sources/test/testnetworksource.cpp new file mode 100644 index 0000000..9f2994b --- /dev/null +++ b/sources/test/testnetworksource.cpp @@ -0,0 +1,51 @@ +/*************************************************************************** + * 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 "testnetworksource.h" + +#include + +#include "awtestlibrary.h" +#include "networksource.h" + + +void TestNetworkSource::initTestCase() +{ + source = new NetworkSource(this, QStringList()); +} + + +void TestNetworkSource::cleanupTestCase() +{ + delete source; +} + + +void TestNetworkSource::test_sources() +{ + QCOMPARE(source->sources(), QStringList() << src); +} + + +void TestNetworkSource::test_values() +{ + QVERIFY(source->data(src).toString().count() > 0); +} + + +QTEST_MAIN(TestNetworkSource); diff --git a/sources/test/testnetworksource.h b/sources/test/testnetworksource.h new file mode 100644 index 0000000..e69334c --- /dev/null +++ b/sources/test/testnetworksource.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * 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 TESTNETWORKSOURCE_H +#define TESTNETWORKSOURCE_H + +#include + + +class NetworkSource; + +class TestNetworkSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_values(); + +private: + NetworkSource *source = nullptr; + QString src = QString("network/current/name"); +}; + + +#endif /* TESTNETWORKSOURCE_H */ diff --git a/sources/test/testnoformatter.cpp b/sources/test/testnoformatter.cpp new file mode 100644 index 0000000..a1ed6ce --- /dev/null +++ b/sources/test/testnoformatter.cpp @@ -0,0 +1,67 @@ +/*************************************************************************** + * 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 "testnoformatter.h" + +#include + +#include "awnoformatter.h" +#include "awtestlibrary.h" + + +void TestAWNoFormatter::initTestCase() +{ + formatter = new AWNoFormatter(nullptr); +} + + +void TestAWNoFormatter::cleanupTestCase() +{ + delete formatter; +} + + +void TestAWNoFormatter::test_values() +{ +} + + +void TestAWNoFormatter::test_conversion() +{ + // integer + int randomInt = AWTestLibrary::randomInt(); + QCOMPARE(formatter->convert(randomInt), QString::number(randomInt)); + // float + QWARN("Float conversion isn't tested here due to possible rounding errors"); + // string + QString randomString = AWTestLibrary::randomString(); + QCOMPARE(formatter->convert(randomString), randomString); +} + + +void TestAWNoFormatter::test_copy() +{ + AWNoFormatter *newFormatter = formatter->copy(QString("/dev/null"), 1); + + QCOMPARE(newFormatter->number(), 1); + + delete newFormatter; +} + + +QTEST_MAIN(TestAWNoFormatter); diff --git a/sources/test/testnoformatter.h b/sources/test/testnoformatter.h new file mode 100644 index 0000000..b9cf531 --- /dev/null +++ b/sources/test/testnoformatter.h @@ -0,0 +1,45 @@ +/*************************************************************************** + * 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 TESTNOFORMATTER_H +#define TESTNOFORMATTER_H + +#include + + +class AWNoFormatter; + +class TestAWNoFormatter : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_conversion(); + void test_copy(); + +private: + AWNoFormatter *formatter = nullptr; +}; + + +#endif /* TESTNOFORMATTER_H */ diff --git a/sources/test/testprocessessource.cpp b/sources/test/testprocessessource.cpp new file mode 100644 index 0000000..11280b5 --- /dev/null +++ b/sources/test/testprocessessource.cpp @@ -0,0 +1,57 @@ +/*************************************************************************** + * 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 "testprocessessource.h" + +#include + +#include "awtestlibrary.h" +#include "processessource.h" + + +void TestProcessesSource::initTestCase() +{ + source = new ProcessesSource(this, QStringList()); +} + + +void TestProcessesSource::cleanupTestCase() +{ + delete source; +} + + +void TestProcessesSource::test_sources() +{ + QCOMPARE(source->sources().count(), 3); + // FIXME there is segfault here sometimes o_0 +// QVERIFY(std::all_of( +// source->sources().cbegin(), source->sources().cend(), +// [](const QString &src) { return src.startsWith(QString("ps/")); })); +} + + +void TestProcessesSource::test_values() +{ + QVERIFY(source->data(QString("ps/running/count")).toInt() > 0); + QVERIFY(source->data(QString("ps/running/list")).toStringList().count() > 0); + QVERIFY(source->data(QString("ps/total/count")).toInt() > 0); +} + + +QTEST_MAIN(TestProcessesSource); diff --git a/sources/test/testprocessessource.h b/sources/test/testprocessessource.h new file mode 100644 index 0000000..c81b871 --- /dev/null +++ b/sources/test/testprocessessource.h @@ -0,0 +1,44 @@ +/*************************************************************************** + * 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 TESTPROCESSESSOURCE_H +#define TESTPROCESSESSOURCE_H + +#include + + +class ProcessesSource; + +class TestProcessesSource : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_sources(); + void test_values(); + +private: + ProcessesSource *source = nullptr; +}; + + +#endif /* TESTPROCESSESSOURCE_H */ diff --git a/sources/test/testscriptformatter.cpp b/sources/test/testscriptformatter.cpp new file mode 100644 index 0000000..d2e0adc --- /dev/null +++ b/sources/test/testscriptformatter.cpp @@ -0,0 +1,107 @@ +/*************************************************************************** + * 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 "testscriptformatter.h" + +#include + +#include "awscriptformatter.h" +#include "awtestlibrary.h" + + +void TestAWScriptFormatter::initTestCase() +{ + formatter = new AWScriptFormatter(nullptr); + formatter->setCode(fullCode); + formatter->setAppendCode(false); + formatter->setHasReturn(true); +} + + +void TestAWScriptFormatter::cleanupTestCase() +{ + delete formatter; +} + + +void TestAWScriptFormatter::test_values() +{ + QCOMPARE(formatter->code(), fullCode); + QCOMPARE(formatter->appendCode(), false); + QCOMPARE(formatter->hasReturn(), true); + + QCOMPARE(formatter->program(), fullCode); +} + + +void TestAWScriptFormatter::test_conversion() +{ + QString string = AWTestLibrary::randomString(); + QCOMPARE(formatter->convert(string), string); +} + + +void TestAWScriptFormatter::test_appendCode() +{ + // set + formatter->setAppendCode(true); + QCOMPARE(formatter->appendCode(), true); + formatter->setCode(codeWithReturn); + + // test + QCOMPARE(formatter->program(), fullCode); + test_conversion(); + + // reset + formatter->setAppendCode(false); +} + + +void TestAWScriptFormatter::test_hasReturn() +{ + // set + formatter->setHasReturn(false); + QCOMPARE(formatter->hasReturn(), false); + formatter->setCode(code); + + // test 1 + QEXPECT_FAIL("", "Should fail because appendCode set to false", Continue); + QCOMPARE(formatter->program(), fullCode); + + // test 2 + formatter->setAppendCode(true); + QCOMPARE(formatter->program(), fullCode); + test_conversion(); +} + + +void TestAWScriptFormatter::test_copy() +{ + AWScriptFormatter *newFormatter = formatter->copy(QString("/dev/null"), 1); + + QCOMPARE(newFormatter->appendCode(), formatter->appendCode()); + QCOMPARE(newFormatter->code(), formatter->code()); + QCOMPARE(newFormatter->hasReturn(), formatter->hasReturn()); + QCOMPARE(newFormatter->program(), formatter->program()); + QCOMPARE(newFormatter->number(), 1); + + delete newFormatter; +} + + +QTEST_MAIN(TestAWScriptFormatter); diff --git a/sources/test/testscriptformatter.h b/sources/test/testscriptformatter.h new file mode 100644 index 0000000..ed81823 --- /dev/null +++ b/sources/test/testscriptformatter.h @@ -0,0 +1,50 @@ +/*************************************************************************** + * 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 TESTSCRIPTFORMATTER_H +#define TESTSCRIPTFORMATTER_H + +#include + + +class AWScriptFormatter; + +class TestAWScriptFormatter : public QObject +{ + Q_OBJECT + +private slots: + // initialization + void initTestCase(); + void cleanupTestCase(); + // test + void test_values(); + void test_conversion(); + void test_appendCode(); + void test_hasReturn(); + void test_copy(); + +private: + AWScriptFormatter *formatter = nullptr; + QString code = QString("output = value"); + QString codeWithReturn = QString("%1; return output;").arg(code); + QString fullCode = QString("(function(value) { %1 })").arg(codeWithReturn); +}; + + +#endif /* TESTNOFORMATTER_H */ diff --git a/sources/translations/awesome-widgets.pot b/sources/translations/awesome-widgets.pot index fb8cc48..ca0a5dc 100644 --- a/sources/translations/awesome-widgets.pot +++ b/sources/translations/awesome-widgets.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -369,6 +369,9 @@ msgstr "" msgid "Edit bars" msgstr "" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "" @@ -438,6 +441,15 @@ msgstr "" msgid "Network device has been changed to %1" msgstr "" +msgid "Edit" +msgstr "" + +msgid "Select type" +msgstr "" + +msgid "Type:" +msgstr "" + msgid "MB/s" msgstr "" @@ -495,6 +507,36 @@ msgstr "" msgid "Comment" msgstr "" +msgid "Type" +msgstr "" + +msgid "Format" +msgstr "" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +msgid "Summand" +msgstr "" + +msgid "Append code" +msgstr "" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "" @@ -568,9 +610,6 @@ msgstr "" msgid "Inctive filling type" msgstr "" -msgid "Type" -msgstr "" - msgid "Points count" msgstr "" @@ -580,9 +619,6 @@ msgstr "" msgid "Height" msgstr "" -msgid "Width" -msgstr "" - msgid "color" msgstr "" diff --git a/sources/translations/en.po b/sources/translations/en.po index 6b43fff..82b3a59 100644 --- a/sources/translations/en.po +++ b/sources/translations/en.po @@ -6,16 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" -"PO-Revision-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" +"PO-Revision-Date: 2016-05-16 14:14+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: English \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<" -"=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 2.0\n" msgid "Widget" @@ -374,6 +374,9 @@ msgstr "Show value" msgid "Edit bars" msgstr "Edit bars" +msgid "Formatters" +msgstr "Formatters" + msgid "Preview" msgstr "Preview" @@ -443,6 +446,15 @@ msgstr "High GPU load" msgid "Network device has been changed to %1" msgstr "Network device has been changed to %1" +msgid "Edit" +msgstr "Edit" + +msgid "Select type" +msgstr "Select type" + +msgid "Type:" +msgstr "Type:" + msgid "MB/s" msgstr "MB/s" @@ -500,6 +512,36 @@ msgstr "Name" msgid "Comment" msgstr "Comment" +msgid "Type" +msgstr "Type" + +msgid "Format" +msgstr "Format" + +msgid "Precision" +msgstr "Precision" + +msgid "Width" +msgstr "Width" + +msgid "Fill char" +msgstr "Fill char" + +msgid "Multiplier" +msgstr "Multiplier" + +msgid "Summand" +msgstr "Summand" + +msgid "Append code" +msgstr "Append code" + +msgid "Has return" +msgstr "Has return" + +msgid "Code" +msgstr "Code" + msgid "Tag" msgstr "Tag" @@ -577,9 +619,6 @@ msgstr "Active filling type" msgid "Inctive filling type" msgstr "Inctive filling type" -msgid "Type" -msgstr "Type" - msgid "Points count" msgstr "Points count" @@ -589,9 +628,6 @@ msgstr "Direction" msgid "Height" msgstr "Height" -msgid "Width" -msgstr "Width" - msgid "color" msgstr "color" @@ -657,9 +693,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Free space on %1 less than 10%" #~ msgstr "Free space on %1 less than 10%" -#~ msgid "Has output" -#~ msgstr "Has output" - #~ msgid "Top Edge" #~ msgstr "Top Edge" @@ -693,9 +726,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Check for updates" #~ msgstr "Check for updates" -#~ msgid "Edit" -#~ msgstr "Edit" - #~ msgid "Enable popup on mouse click" #~ msgstr "Enable popup on mouse click" @@ -828,9 +858,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Widget configuration" #~ msgstr "Widget configuration" -#~ msgid "Form" -#~ msgstr "Form" - #~ msgid "Network directory" #~ msgstr "Network directory" diff --git a/sources/translations/es.po b/sources/translations/es.po index c0686ff..af5d59b 100644 --- a/sources/translations/es.po +++ b/sources/translations/es.po @@ -1,7 +1,7 @@ # SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. -# +# # Translators: # Ernesto Avilés Vázquez , 2014-2016 # Evgeniy Alekseev , 2014-2015 @@ -9,14 +9,15 @@ msgid "" msgstr "" "Project-Id-Version: Awesome widgets\n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2016-05-03 06:47+0000\n" "Last-Translator: Ernesto Avilés Vázquez \n" -"Language-Team: Spanish (http://www.transifex.com/arcanis/awesome-widgets/language/es/)\n" +"Language-Team: Spanish (http://www.transifex.com/arcanis/awesome-widgets/" +"language/es/)\n" +"Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Language: es\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" msgid "Widget" @@ -274,7 +275,10 @@ msgstr "Comprobar actualizaciones" msgid "" "CPU, CPU clock, memory, swap and network labels support graphical tooltip. " "To enable them just make needed checkbox checked." -msgstr "Las etiquetas para CPU, reloj de CPU, memoria, swap y red soportan ventanas emergentes. Para habilitarlas, simplemente marca las casillas correspondientes." +msgstr "" +"Las etiquetas para CPU, reloj de CPU, memoria, swap y red soportan ventanas " +"emergentes. Para habilitarlas, simplemente marca las casillas " +"correspondientes." msgid "Number of values for tooltips" msgstr "Número de valores para las ventanas emergentes" @@ -328,9 +332,11 @@ msgid "Battery inactive color" msgstr "Color de la batería inactiva" msgid "" -"Detailed information may be found on project homepage" -msgstr "Puedes encontrar información detallada en el sitio del proyecto" +"Detailed information may be found on project homepage" +msgstr "" +"Puedes encontrar información detallada en el sitio del proyecto" msgid "Bgcolor" msgstr "Color de fondo" @@ -371,6 +377,9 @@ msgstr "Mostrar valor" msgid "Edit bars" msgstr "Editar barras" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "Vista previa" @@ -440,6 +449,18 @@ msgstr "Carga alta de GPU" msgid "Network device has been changed to %1" msgstr "El dispositivo de red ha sido cambiado a %1" +#, fuzzy +msgid "Edit" +msgstr "Editar barras" + +#, fuzzy +msgid "Select type" +msgstr "Elegir etiqueta" + +#, fuzzy +msgid "Type:" +msgstr "Tipo" + msgid "MB/s" msgstr "MB/s" @@ -497,15 +518,52 @@ msgstr "Nombre" msgid "Comment" msgstr "Comentario" +msgid "Type" +msgstr "Tipo" + +#, fuzzy +msgid "Format" +msgstr "normal" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "Ancho" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Orden" + +#, fuzzy +msgid "Append code" +msgstr "Apariencia" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Etiqueta" msgid "" "

Use YAHOO! finance ticker to get quotes for the " "instrument. Refer to http://finance.yahoo.com/

" -msgstr "

Usa el tablero electrónico de YAHOO! para obtener la cotización del medio. Dirígete a http://finance.yahoo.com/

" +"text-decoration: underline; color:#0057ae;\">http://finance.yahoo.com/

" +msgstr "" +"

Usa el tablero electrónico de YAHOO! para obtener la " +"cotización del medio. Dirígete a http://finance.yahoo." +"com/

" msgid "Ticker" msgstr "Tablero" @@ -570,9 +628,6 @@ msgstr "Activar tipo de relleno" msgid "Inctive filling type" msgstr "Inhabilitar tipo de relleno" -msgid "Type" -msgstr "Tipo" - msgid "Points count" msgstr "Conteo de puntos" @@ -582,9 +637,6 @@ msgstr "Dirección" msgid "Height" msgstr "Alto" -msgid "Width" -msgstr "Ancho" - msgid "color" msgstr "color" diff --git a/sources/translations/fr.po b/sources/translations/fr.po index 4652220..7635fce 100644 --- a/sources/translations/fr.po +++ b/sources/translations/fr.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2015-07-31 22:16+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: French \n" @@ -390,6 +390,9 @@ msgstr "Afficher la valeur" msgid "Edit bars" msgstr "Modifier les barres" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "" @@ -459,6 +462,17 @@ msgstr "Haute charge GPU" msgid "Network device has been changed to %1" msgstr "L'interface réseau à été changée en %1" +#, fuzzy +msgid "Edit" +msgstr "Modifiable" + +#, fuzzy +msgid "Select type" +msgstr "Sélectionner l'étiquette" + +msgid "Type:" +msgstr "" + msgid "MB/s" msgstr "" @@ -522,6 +536,39 @@ msgstr "Nom: %1" msgid "Comment" msgstr "Commentaire: %1" +msgid "Type" +msgstr "" + +#, fuzzy +msgid "Format" +msgstr "Entrées" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Commande personnalisée" + +#, fuzzy +msgid "Append code" +msgstr "Apparence" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Étiquette" @@ -607,9 +654,6 @@ msgstr "Batterie" msgid "Inctive filling type" msgstr "Bureau inactif" -msgid "Type" -msgstr "" - msgid "Points count" msgstr "" @@ -620,9 +664,6 @@ msgstr "" msgid "Height" msgstr "léger" -msgid "Width" -msgstr "" - #, fuzzy msgid "color" msgstr "Couleur processeur" @@ -709,10 +750,6 @@ msgstr "esalexeev@gmail.com mermouy@gmail.com" #~ msgid "Update text" #~ msgstr "Mettre à jour le texte" -#, fuzzy -#~ msgid "Edit" -#~ msgstr "Modifiable" - #~ msgid "Enable popup on mouse click" #~ msgstr "Popup lors d'un click souris" @@ -834,9 +871,6 @@ msgstr "esalexeev@gmail.com mermouy@gmail.com" #~ msgid "Add stretch to right/bottom of the layout" #~ msgstr "Étirer le positionnement vers bas/droite" -#~ msgid "Form" -#~ msgstr "Entrées" - #~ msgid "Network directory" #~ msgstr "Voisinage réseau" diff --git a/sources/translations/nl_NL.po b/sources/translations/nl_NL.po index 60e8781..ca5f9ec 100644 --- a/sources/translations/nl_NL.po +++ b/sources/translations/nl_NL.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: Awesome widgets\n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2015-08-20 22:52+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: Dutch \n" @@ -392,6 +392,9 @@ msgstr "Waarde weergeven" msgid "Edit bars" msgstr "Balken bewerken" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "" @@ -465,6 +468,17 @@ msgstr "Hoog CPU-verbruik" msgid "Network device has been changed to %1" msgstr "Het netwerkapparaat is gewijzigd naar %1" +msgid "Edit" +msgstr "Bewerken" + +#, fuzzy +msgid "Select type" +msgstr "Sleutelwoord selecteren" + +#, fuzzy +msgid "Type:" +msgstr "Type" + msgid "MB/s" msgstr "" @@ -524,6 +538,39 @@ msgstr "Naam" msgid "Comment" msgstr "Commentaar" +msgid "Type" +msgstr "Type" + +#, fuzzy +msgid "Format" +msgstr "normaal" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "Breedte" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Commentaar" + +#, fuzzy +msgid "Append code" +msgstr "Uiterlijk" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Sleutelwoord" @@ -606,9 +653,6 @@ msgstr "Actieve kleur" msgid "Inctive filling type" msgstr "Inactieve kleur" -msgid "Type" -msgstr "Type" - msgid "Points count" msgstr "" @@ -618,9 +662,6 @@ msgstr "Richting" msgid "Height" msgstr "Hoogte" -msgid "Width" -msgstr "Breedte" - #, fuzzy msgid "color" msgstr "CPU-kleur" @@ -708,9 +749,6 @@ msgstr "vistausss@outlook.com" #~ msgid "Exec: %1" #~ msgstr "Uitvoeren: %1" -#~ msgid "Edit" -#~ msgstr "Bewerken" - #~ msgid "Select color" #~ msgstr "Kleur selecteren" diff --git a/sources/translations/pl.po b/sources/translations/pl.po index 8562705..8e17d6c 100644 --- a/sources/translations/pl.po +++ b/sources/translations/pl.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -375,6 +375,9 @@ msgstr "Pokaż wartość" msgid "Edit bars" msgstr "Edytuj paski postępu" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "Przegląd" @@ -444,6 +447,18 @@ msgstr "Wysokie obciążenie procesora graficznego" msgid "Network device has been changed to %1" msgstr "Urządznie sieciowe zamienione na %1" +#, fuzzy +msgid "Edit" +msgstr "Edytuj paski postępu" + +#, fuzzy +msgid "Select type" +msgstr "Wybierz znacznik" + +#, fuzzy +msgid "Type:" +msgstr "Typ" + msgid "MB/s" msgstr "MB/s" @@ -501,6 +516,39 @@ msgstr "Nazwa" msgid "Comment" msgstr "Komentarz" +msgid "Type" +msgstr "Typ" + +#, fuzzy +msgid "Format" +msgstr "normalna" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "Szerokość" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Polecenie" + +#, fuzzy +msgid "Append code" +msgstr "Wygląd" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Znacznik" @@ -582,9 +630,6 @@ msgstr "Aktywny" msgid "Inctive filling type" msgstr "Nie aktywny pulpit" -msgid "Type" -msgstr "Typ" - msgid "Points count" msgstr "" @@ -594,9 +639,6 @@ msgstr "Kierunek" msgid "Height" msgstr "Wysokość" -msgid "Width" -msgstr "Szerokość" - #, fuzzy msgid "color" msgstr "Kolor procesora" diff --git a/sources/translations/pt_BR.po b/sources/translations/pt_BR.po index 61fb011..e22880f 100644 --- a/sources/translations/pt_BR.po +++ b/sources/translations/pt_BR.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2015-07-31 22:21+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: Russian \n" @@ -391,6 +391,9 @@ msgstr "Mostrar valor" msgid "Edit bars" msgstr "Editar barras" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "" @@ -460,6 +463,17 @@ msgstr "Alta carga da GPU" msgid "Network device has been changed to %1" msgstr "O dispositivo de rede mudou para %1" +msgid "Edit" +msgstr "Editar" + +#, fuzzy +msgid "Select type" +msgstr "Selecionar tag" + +#, fuzzy +msgid "Type:" +msgstr "Tipo" + msgid "MB/s" msgstr "" @@ -518,6 +532,39 @@ msgstr "NOme" msgid "Comment" msgstr "Comentário" +msgid "Type" +msgstr "Tipo" + +#, fuzzy +msgid "Format" +msgstr "Forma" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "Largura" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Comentário" + +#, fuzzy +msgid "Append code" +msgstr "Aparência" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Tag" @@ -597,9 +644,6 @@ msgstr "Cor ativa" msgid "Inctive filling type" msgstr "Desktop inativo" -msgid "Type" -msgstr "Tipo" - msgid "Points count" msgstr "" @@ -609,9 +653,6 @@ msgstr "Direção" msgid "Height" msgstr "Altura" -msgid "Width" -msgstr "Largura" - #, fuzzy msgid "color" msgstr "Cor da CPU" @@ -699,9 +740,6 @@ msgstr "under@insicuri.net" #~ msgid "Check for updates" #~ msgstr "Checar por atualizações" -#~ msgid "Edit" -#~ msgstr "Editar" - #~ msgid "Enable popup on mouse click" #~ msgstr "Ativar popup no clique do mouse" @@ -822,9 +860,6 @@ msgstr "under@insicuri.net" #~ msgid "Add stretch to right/bottom of the layout" #~ msgstr "Adicionar esticamento à direita/inferior do layout" -#~ msgid "Form" -#~ msgstr "Forma" - #~ msgid "Network directory" #~ msgstr "Diretório de rede" diff --git a/sources/translations/ru.po b/sources/translations/ru.po index d762281..bf6c14c 100644 --- a/sources/translations/ru.po +++ b/sources/translations/ru.po @@ -6,16 +6,16 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" -"PO-Revision-Date: 2016-04-29 12:22+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" +"PO-Revision-Date: 2016-05-16 14:15+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: Russian \n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<" -"=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" +"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" "X-Generator: Lokalize 2.0\n" msgid "Widget" @@ -374,6 +374,9 @@ msgstr "Показать значение" msgid "Edit bars" msgstr "Редактировать бары" +msgid "Formatters" +msgstr "Форматеры" + msgid "Preview" msgstr "Предварительный просмотр" @@ -443,6 +446,15 @@ msgstr "Высокая загрузка GPU" msgid "Network device has been changed to %1" msgstr "Сетевое устройство было изменено на %1" +msgid "Edit" +msgstr "Править" + +msgid "Select type" +msgstr "Выберете тип" + +msgid "Type:" +msgstr "Тип:" + msgid "MB/s" msgstr "МБ/с" @@ -500,6 +512,36 @@ msgstr "Имя" msgid "Comment" msgstr "Комментарий" +msgid "Type" +msgstr "Тип" + +msgid "Format" +msgstr "Формат" + +msgid "Precision" +msgstr "Точность" + +msgid "Width" +msgstr "Ширина" + +msgid "Fill char" +msgstr "Заполнение" + +msgid "Multiplier" +msgstr "Множитель" + +msgid "Summand" +msgstr "Слагаемое" + +msgid "Append code" +msgstr "Дополнить код" + +msgid "Has return" +msgstr "Имеет return" + +msgid "Code" +msgstr "Код" + msgid "Tag" msgstr "Тег" @@ -577,9 +619,6 @@ msgstr "Тип активного наполнения" msgid "Inctive filling type" msgstr "Тип неактивного наполнения" -msgid "Type" -msgstr "Тип" - msgid "Points count" msgstr "Количество точек" @@ -589,9 +628,6 @@ msgstr "Направление" msgid "Height" msgstr "Высота" -msgid "Width" -msgstr "Ширина" - msgid "color" msgstr "цвет" @@ -657,9 +693,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Free space on %1 less than 10%" #~ msgstr "Свободное место на диске %1 меньше 10%" -#~ msgid "Has output" -#~ msgstr "Имеет сообщения" - #~ msgid "Top Edge" #~ msgstr "Верхняя грань" @@ -693,9 +726,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Check for updates" #~ msgstr "Проверить обновления" -#~ msgid "Edit" -#~ msgstr "Править" - #~ msgid "Enable popup on mouse click" #~ msgstr "Включить сообщения по клику мыши" @@ -828,9 +858,6 @@ msgstr "esalexeev@gmail.com" #~ msgid "Widget configuration" #~ msgstr "Настройка виджета" -#~ msgid "Form" -#~ msgstr "Form" - #~ msgid "Network directory" #~ msgstr "Путь к интерфейсам" diff --git a/sources/translations/uk.po b/sources/translations/uk.po index ce87bfe..be53776 100644 --- a/sources/translations/uk.po +++ b/sources/translations/uk.po @@ -6,7 +6,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2016-05-05 17:18+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: Ukrainian \n" @@ -375,6 +375,9 @@ msgstr "Показати значення" msgid "Edit bars" msgstr "Редагувати бари" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "Попередній перегляд" @@ -444,6 +447,18 @@ msgstr "Високе завантаження GPU" msgid "Network device has been changed to %1" msgstr "Мережевий пристрій було змінено на %1" +#, fuzzy +msgid "Edit" +msgstr "Редагувати" + +#, fuzzy +msgid "Select type" +msgstr "Оберіть тег" + +#, fuzzy +msgid "Type:" +msgstr "Тип" + msgid "MB/s" msgstr "МБ/с" @@ -501,6 +516,39 @@ msgstr "Ім’я" msgid "Comment" msgstr "Коментар" +msgid "Type" +msgstr "Тип" + +#, fuzzy +msgid "Format" +msgstr "Form" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "Ширина" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "Команда" + +#, fuzzy +msgid "Append code" +msgstr "Зовнішній вигляд" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "Тег" @@ -578,9 +626,6 @@ msgstr "Тип активного заповнення" msgid "Inctive filling type" msgstr "Тип неактивного заповнення" -msgid "Type" -msgstr "Тип" - msgid "Points count" msgstr "Кількість точок" @@ -590,9 +635,6 @@ msgstr "Напрямок" msgid "Height" msgstr "Висота" -msgid "Width" -msgstr "Ширина" - msgid "color" msgstr "колір" @@ -688,10 +730,6 @@ msgstr "sarumyan@i.ua" #~ msgid "Check for updates" #~ msgstr "Шукати оновлення" -#, fuzzy -#~ msgid "Edit" -#~ msgstr "Редагувати" - #~ msgid "Enable popup on mouse click" #~ msgstr "Включити спливаючі підказки при натисканні клавіші миші" @@ -814,9 +852,6 @@ msgstr "sarumyan@i.ua" #~ msgid "Add stretch to right/bottom of the layout" #~ msgstr "Додати порожнє місце праворуч/внизу віджету" -#~ msgid "Form" -#~ msgstr "Form" - #~ msgid "Network directory" #~ msgstr "Шлях до інтерфейсів" diff --git a/sources/translations/zh.po b/sources/translations/zh.po index 5d0e961..894fec4 100644 --- a/sources/translations/zh.po +++ b/sources/translations/zh.po @@ -7,7 +7,7 @@ msgid "" msgstr "" "Project-Id-Version: \n" "Report-Msgid-Bugs-To: https://github.com/arcan1s/awesome-widgets/issues\n" -"POT-Creation-Date: 2016-04-29 12:21+0300\n" +"POT-Creation-Date: 2016-05-16 19:35+0300\n" "PO-Revision-Date: 2015-07-31 22:24+0300\n" "Last-Translator: Evgeniy Alekseev \n" "Language-Team: Russian \n" @@ -376,6 +376,9 @@ msgstr "显示值" msgid "Edit bars" msgstr "编辑工具栏" +msgid "Formatters" +msgstr "" + msgid "Preview" msgstr "预览" @@ -445,6 +448,18 @@ msgstr "高 GPU 使用" msgid "Network device has been changed to %1" msgstr "网络设备变更为 %1" +#, fuzzy +msgid "Edit" +msgstr "可编辑的" + +#, fuzzy +msgid "Select type" +msgstr "选择标签" + +#, fuzzy +msgid "Type:" +msgstr "类型" + msgid "MB/s" msgstr "MB/s" @@ -502,6 +517,39 @@ msgstr "命名" msgid "Comment" msgstr "评论" +msgid "Type" +msgstr "类型" + +#, fuzzy +msgid "Format" +msgstr "正常" + +msgid "Precision" +msgstr "" + +msgid "Width" +msgstr "宽度" + +msgid "Fill char" +msgstr "" + +msgid "Multiplier" +msgstr "" + +#, fuzzy +msgid "Summand" +msgstr "命令" + +#, fuzzy +msgid "Append code" +msgstr "外观" + +msgid "Has return" +msgstr "" + +msgid "Code" +msgstr "" + msgid "Tag" msgstr "标签" @@ -584,9 +632,6 @@ msgstr "使用" msgid "Inctive filling type" msgstr "未激活桌面" -msgid "Type" -msgstr "类型" - msgid "Points count" msgstr "" @@ -596,9 +641,6 @@ msgstr "方向" msgid "Height" msgstr "高度" -msgid "Width" -msgstr "宽度" - #, fuzzy msgid "color" msgstr "CPU 颜色" @@ -684,10 +726,6 @@ msgstr "用户邮箱" #~ msgid "Update text" #~ msgstr "刷新文本" -#, fuzzy -#~ msgid "Edit" -#~ msgstr "可编辑的" - #~ msgid "Enable popup on mouse click" #~ msgstr "鼠标点击时弹出对话框" diff --git a/sources/version.h.in b/sources/version.h.in index eed78e8..4c89f7b 100644 --- a/sources/version.h.in +++ b/sources/version.h.in @@ -19,7 +19,8 @@ "qnetworkreply-network-reply-timeout-helper" #define SPECIAL_THANKS \ "Yahoo! Finance,https://finance.yahoo.com/;Yahoo! " \ - "Weather,https://weather.yahoo.com/;JetBrains,https://www.jetbrains.com/" + "Weather,https://weather.yahoo.com/;JetBrains,https://www.jetbrains.com/" \ + ";OpenWeatherMap,http://openweathermap.org/" #define CHANGELOG "@PROJECT_CHANGELOG@" // configuraion @@ -32,7 +33,9 @@ // extupgrade api version #define AWEUAPI 3 // extweather api version -#define AWEWAPI 2 +#define AWEWAPI 3 +// formatter api version +#define AWEFAPI 1 // network requests timeout, ms #define REQUEST_TIMEOUT 5000 // available time keys