move dataengine control to plugin part (ref to #66)

This commit is contained in:
arcan1s 2015-10-05 00:00:38 +03:00
parent 228d6500d3
commit c4612d84ed
8 changed files with 297 additions and 199 deletions

View File

@ -118,16 +118,6 @@ Item {
QtControls.ComboBox {
id: hdd
width: parent.width * 3 / 5
model: awKeys.getHddDevices(true)
Component.onCompleted: {
if (debug) console.debug()
for (var i=0; i<model.length; i++) {
if (model[i] == cfg_dataengine["HDDDEV"]) {
if (debug) console.info("Found", model[i], "on", i)
hdd.currentIndex = i;
}
}
}
}
}
@ -345,7 +335,16 @@ Item {
if (debug) console.debug()
// init submodule
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.queueLimit)
awKeys.updateCache()
// update hdd model
hdd.model = awKeys.getHddDevices()
for (var i=0; i<model.length; i++) {
if (model[i] == cfg_dataengine["HDDDEV"]) {
if (debug) console.info("Found", model[i], "on", i)
hdd.currentIndex = i;
}
}
}
Component.onDestruction: {

View File

@ -63,9 +63,6 @@ Item {
"notify": plasmoid.configuration.notify
}
signal connectPlugin
signal disconnectPlugin
signal dropSource(string sourceName)
signal needTextUpdate(string newText)
signal needToolTipUpdate(string newText)
signal sizeUpdate
@ -83,32 +80,6 @@ Item {
Plasmoid.backgroundHints: plasmoid.configuration.background ? "DefaultBackground" : "NoBackground"
Plasmoid.associatedApplication: "ksysguard"
PlasmaCore.DataSource {
id: systemmonitorDE
engine: "systemmonitor"
connectedSources: systemmonitorDE.sources
interval: plasmoid.configuration.interval
onSourceAdded: {
if (debug) console.debug("Source", source)
awKeys.addDevice(source)
}
}
PlasmaCore.DataSource {
id: extsysmonDE
engine: "extsysmon"
connectedSources: extsysmonDE.sources
interval: plasmoid.configuration.interval
}
PlasmaCore.DataSource {
id: timeDE
engine: "time"
connectedSources: ["Local"]
interval: 1000
}
// ui
Text {
@ -160,12 +131,6 @@ Item {
}
}
Timer {
id: timer
interval: 5 * plasmoid.configuration.interval
onTriggered: connectPlugin()
}
Component.onCompleted: {
if (debug) console.debug()
@ -177,42 +142,12 @@ Item {
// init submodule
Plasmoid.userConfiguringChanged(false)
// connect data
awKeys.disconnectPlugin.connect(disconnectPlugin)
awKeys.dropSourceFromDataengine.connect(dropSource)
awKeys.needTextToBeUpdated.connect(needTextUpdate)
awKeys.needToolTipToBeUpdated.connect(needToolTipUpdate)
connectPlugin()
// check updates if required
if (plasmoid.configuration.checkUpdates) return awActions.checkUpdates(false)
}
onConnectPlugin: {
if (debug) console.debug()
systemmonitorDE.newData.connect(awKeys.dataUpdateReceived)
extsysmonDE.newData.connect(awKeys.dataUpdateReceived)
timeDE.newData.connect(awKeys.dataUpdateReceived)
return awKeys.unlock()
}
onDisconnectPlugin: {
if (debug) console.debug()
systemmonitorDE.newData.disconnect(awKeys.dataUpdateReceived)
extsysmonDE.newData.disconnect(awKeys.dataUpdateReceived)
timeDE.newData.disconnect(awKeys.dataUpdateReceived)
return timer.start()
}
onDropSource: {
if (debug) console.debug()
if (debug) console.debug("Source", sourceName)
systemmonitorDE.disconnectSource(sourceName)
}
onNeedTextUpdate: {
if (debug) console.debug()
@ -252,7 +187,8 @@ Item {
if (debug) console.debug()
// init submodule
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.queueLimit)
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
plasmoid.configuration.queueLimit)
awKeys.initDataAggregator(tooltipSettings)
awKeys.setWrapNewLines(plasmoid.configuration.wrapNewLines)
// configure aggregator

View File

@ -18,7 +18,6 @@
import QtQuick 2.0
import QtQuick.Controls 1.3 as QtControls
import QtQuick.Dialogs 1.2 as QtDialogs
import org.kde.plasma.core 2.0 as PlasmaCore
import org.kde.plasma.private.awesomewidget 1.0
@ -41,8 +40,8 @@ Item {
property bool debug: awActions.isDebugEnabled()
property alias cfg_text: textPattern.text
property bool lock: true
signal dropSource(string sourceName)
signal needTextUpdate(string newText)
@ -320,7 +319,9 @@ Item {
width: parent.width * 2 / 5
text: i18n("Preview")
onClicked: {
awKeys.initKeys(textPattern.text, plasmoid.configuration.queueLimit)
lock = false
awKeys.initKeys(textPattern.text, plasmoid.configuration.interval,
plasmoid.configuration.queueLimit)
awKeys.needToBeUpdated()
}
}
@ -342,67 +343,27 @@ Item {
}
// we need to initializate DataEngines here too
// because we need to get keys and values
PlasmaCore.DataSource {
id: systemmonitorDE
engine: "systemmonitor"
connectedSources: systemmonitorDE.sources
interval: 5000
onNewData: awKeys.dataUpdateReceived(sourceName, data)
}
PlasmaCore.DataSource {
id: extsysmonDE
engine: "extsysmon"
connectedSources: extsysmonDE.sources
interval: 5000
onNewData: {
// even after a disconnect it is possible that we'll receive an update
if (sourceName == "update") return
awKeys.dataUpdateReceived(sourceName, data)
}
}
PlasmaCore.DataSource {
id: timeDE
engine: "time"
connectedSources: ["Local"]
interval: 5000
onNewData: awKeys.dataUpdateReceived(sourceName, data)
}
Component.onCompleted: {
if (debug) console.debug()
// drop "update" source which does not required by this page
extsysmonDE.disconnectSource("update")
awKeys.dropSourceFromDataengine.connect(dropSource)
awKeys.needTextToBeUpdated.connect(needTextUpdate)
// init submodule
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.queueLimit)
awKeys.initKeys(plasmoid.configuration.text, plasmoid.configuration.interval,
plasmoid.configuration.queueLimit)
awKeys.setAggregatorProperty("acOffline", plasmoid.configuration.acOffline)
awKeys.setAggregatorProperty("acOnline", plasmoid.configuration.acOnline)
awKeys.setAggregatorProperty("customTime", plasmoid.configuration.customTime)
awKeys.setAggregatorProperty("customUptime", plasmoid.configuration.customUptime)
awKeys.setAggregatorProperty("tempUnits", plasmoid.configuration.tempUnits)
awKeys.setAggregatorProperty("translate", plasmoid.configuration.translateStrings)
awKeys.unlock()
}
onDropSource: {
if (debug) console.debug()
if (debug) console.debug("Source", sourceName)
systemmonitorDE.disconnectSource(sourceName)
}
onNeedTextUpdate: {
if (lock) return
if (debug) console.debug()
compiledText.text = newText.replace(/&nbsp;/g, " ")
compiledText.open()
lock = true;
}
}

View File

@ -13,11 +13,9 @@ 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)
qt5_wrap_ui(SUBPROJECT_UI_HEADER ${SUBPROJECT_UI})
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE} ${SUBPROJECT_UI_HEADER})
add_library(${PLUGIN_NAME} SHARED ${SUBPROJECT_SOURCE})
target_link_libraries(${PLUGIN_NAME} ${PROJECT_LIBRARY} ${Qt_LIBRARIES} ${Kf5_LIBRARIES})
install(TARGETS ${PLUGIN_NAME} DESTINATION ${QML_INSTALL_DIR}/org/kde/plasma/private/awesomewidget)

View File

@ -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 "awdataengineaggregator.h"
#include <Plasma/DataEngineConsumer>
#include <QTimer>
#include "awdebug.h"
#include "awkeys.h"
AWDataEngineAggregator::AWDataEngineAggregator(QObject *parent, const int interval)
: QObject(parent)
{
qCDebug(LOG_AW);
setInterval(interval);
initDataEngines();
connectVisualization();
}
AWDataEngineAggregator::~AWDataEngineAggregator()
{
qCDebug(LOG_AW);
m_dataEngines.clear();
}
void AWDataEngineAggregator::setInterval(const int _interval)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Interval" << _interval;
m_interval = _interval;
}
void AWDataEngineAggregator::connectVisualization()
{
qCDebug(LOG_AW);
connect(this, SIGNAL(updateData(QString, QVariantHash)),
parent(), SLOT(dataUpdated(QString, QVariantHash)));
return static_cast<AWKeys *>(parent())->unlock();
}
void AWDataEngineAggregator::disconnectVisualization()
{
qCDebug(LOG_AW);
disconnect(this, SIGNAL(updateData(QString, QVariantHash)),
parent(), SLOT(dataUpdated(QString, QVariantHash)));
return QTimer::singleShot(5 * m_interval, this, SLOT(connectVisualization()));
}
void AWDataEngineAggregator::dropSource(const QString source)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << source;
// this method is only used for systemmonitor dataengine
m_dataEngines[QString("systemmonitor")]->disconnectSource(source, this);
}
void AWDataEngineAggregator::reconnectSources()
{
qCDebug(LOG_AW);
m_dataEngines[QString("systemmonitor")]->connectAllSources(this, m_interval);
m_dataEngines[QString("extsysmon")]->connectAllSources(this, m_interval);
m_dataEngines[QString("time")]->connectSource(QString("Local"), this, 1000);
}
void AWDataEngineAggregator::dataUpdated(const QString sourceName, const Plasma::DataEngine::Data data)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << sourceName;
qCDebug(LOG_AW) << "Data" << data;
return emit(updateData(QString(sourceName), qvariant_cast<QVariantHash>(data)));
}
void AWDataEngineAggregator::initDataEngines()
{
qCDebug(LOG_AW);
Plasma::DataEngineConsumer *deConsumer = new Plasma::DataEngineConsumer();
m_dataEngines[QString("systemmonitor")] = deConsumer->dataEngine(QString("systemmonitor"));
m_dataEngines[QString("extsysmon")] = deConsumer->dataEngine(QString("extsysmon"));
m_dataEngines[QString("time")] = deConsumer->dataEngine(QString("time"));
// additional method required by systemmonitor structure
connect(m_dataEngines[QString("systemmonitor")], &Plasma::DataEngine::sourceAdded,
[this](const QString source) {
static_cast<AWKeys *>(parent())->addDevice(source);
m_dataEngines[QString("systemmonitor")]->connectSource(source, this, m_interval);
});
}

View File

@ -0,0 +1,58 @@
/***************************************************************************
* 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 AWDATAENGINEAGGREGATOR_H
#define AWDATAENGINEAGGREGATOR_H
#include <Plasma/DataEngine>
#include <QObject>
class AWDataEngineAggregator : public QObject
{
Q_OBJECT
Q_PROPERTY(int interval MEMBER m_interval WRITE setInterval);
public:
explicit AWDataEngineAggregator(QObject *parent = nullptr, const int interval = 1000);
virtual ~AWDataEngineAggregator();
// properties
void setInterval(const int _interval);
signals:
void updateData(const QString sourceName, const QVariantHash sdata);
public slots:
// additional methods to control this and visualization
void connectVisualization();
void disconnectVisualization();
void dropSource(const QString source);
void reconnectSources();
// data engines operations
void dataUpdated(const QString sourceName, const Plasma::DataEngine::Data data);
// dummy method required by DataEngine connections
void modelChanged(QString, QAbstractItemModel *) {};
private:
void initDataEngines();
QHash<QString, Plasma::DataEngine *> m_dataEngines;
int m_interval;
};
#endif /* AWDATAENGINEAGGREGATOR_H */

View File

@ -27,9 +27,10 @@
#include <QStandardPaths>
#include <QThread>
#include "awdataaggregator.h"
#include "awdataengineaggregator.h"
#include "awdebug.h"
#include "awkeysaggregator.h"
#include "awdataaggregator.h"
#include "extquotes.h"
#include "extscript.h"
#include "extupgrade.h"
@ -57,7 +58,7 @@ AWKeys::AWKeys(QObject *parent)
// transfer signal from AWDataAggregator object to QML ui
connect(dataAggregator, SIGNAL(toolTipPainted(const QString)),
this, SIGNAL(needToolTipToBeUpdated(const QString)));
connect(this, SIGNAL(needToBeUpdated()), this, SLOT(dataUpdate()));
connect(this, SIGNAL(needToBeUpdated()), this, SLOT(updateTextData()));
}
@ -73,12 +74,21 @@ AWKeys::~AWKeys()
if (extWeather != nullptr) delete extWeather;
// core
if (dataEngineAggregator != nullptr) delete dataEngineAggregator;
if (threadPool != nullptr) delete threadPool;
delete aggregator;
delete dataAggregator;
}
void AWKeys::unlock()
{
qCDebug(LOG_AW);
lock = false;
}
void AWKeys::initDataAggregator(const QVariantMap tooltipParams)
{
qCDebug(LOG_AW);
@ -88,13 +98,21 @@ void AWKeys::initDataAggregator(const QVariantMap tooltipParams)
}
void AWKeys::initKeys(const QString currentPattern, const int limit)
void AWKeys::initKeys(const QString currentPattern, const int interval, const int limit)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Pattern" << currentPattern;
qCDebug(LOG_AW) << "Interval" << interval;
qCDebug(LOG_AW) << "Queue limit" << limit;
// init
m_pattern = currentPattern;
if (dataEngineAggregator == nullptr) {
dataEngineAggregator = new AWDataEngineAggregator(this, interval);
connect(this, SIGNAL(dropSourceFromDataengine(QString)),
dataEngineAggregator, SLOT(dropSource(QString)));
} else
dataEngineAggregator->setInterval(interval);
#ifdef BUILD_FUTURE
// queue limit. It may be configured by using QUEUE_LIMIT cmake limit flag.
// In other hand since I'm using global thread pool, it makes sense to limit
@ -102,9 +120,9 @@ void AWKeys::initKeys(const QString currentPattern, const int limit)
queueLimit = limit == 0 ? QThread::idealThreadCount() : limit;
threadPool->setMaxThreadCount(queueLimit);
#endif /* BUILD_FUTURE */
// update network and hdd list
addKeyToCache(QString("hdd"));
addKeyToCache(QString("net"));
updateCache();
return dataEngineAggregator->reconnectSources();
}
@ -125,33 +143,13 @@ void AWKeys::setWrapNewLines(const bool wrap)
}
void AWKeys::unlock()
void AWKeys::updateCache()
{
qCDebug(LOG_AW);
lock = false;
}
void AWKeys::addDevice(const QString source)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << source;
QRegExp diskRegexp = QRegExp(QString("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)"));
QRegExp mountRegexp = QRegExp(QString("partitions/.*/filllevel"));
if (source.contains(diskRegexp)) {
QString device = source;
device.remove(QString("/Rate/rblk"));
addKeyToCache(QString("disk"), device);
} else if (source.contains(mountRegexp)) {
QString device = source;
device.remove(QString("partitions")).remove(QString("/filllevel"));
addKeyToCache(QString("mount"), device);
} else if (source.startsWith(QString("lmsensors"))) {
addKeyToCache(QString("temp"), source);
}
// update network and hdd list
addKeyToCache(QString("hdd"));
addKeyToCache(QString("net"));
}
@ -325,26 +323,6 @@ QStringList AWKeys::getHddDevices() const
}
void AWKeys::dataUpdateReceived(const QString sourceName, const QVariantMap data)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << sourceName;
qCDebug(LOG_AW) << "Data" << data;
if (lock) return;
if (sourceName == QString("update")) return emit(needToBeUpdated());
#ifdef BUILD_FUTURE
// run concurrent data update
QtConcurrent::run(threadPool, [this, sourceName, data]() {
return setDataBySource(sourceName, data);
});
#else /* BUILD_FUTURE */
return setDataBySource(sourceName, data);
#endif /* BUILD_FUTURE */
}
QString AWKeys::infoByKey(QString key) const
{
qCDebug(LOG_AW);
@ -404,21 +382,45 @@ void AWKeys::editItem(const QString type)
}
void AWKeys::dataUpdate()
void AWKeys::addDevice(const QString source)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << source;
QRegExp diskRegexp = QRegExp(QString("disk/(?:md|sd|hd)[a-z|0-9]_.*/Rate/(?:rblk)"));
QRegExp mountRegexp = QRegExp(QString("partitions/.*/filllevel"));
if (source.contains(diskRegexp)) {
QString device = source;
device.remove(QString("/Rate/rblk"));
addKeyToCache(QString("disk"), device);
} else if (source.contains(mountRegexp)) {
QString device = source;
device.remove(QString("partitions")).remove(QString("/filllevel"));
addKeyToCache(QString("mount"), device);
} else if (source.startsWith(QString("lmsensors"))) {
addKeyToCache(QString("temp"), source);
}
}
void AWKeys::dataUpdated(const QString sourceName, const QVariantHash data)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << sourceName;
qCDebug(LOG_AW) << "Data" << data;
if (lock) return;
if (sourceName == QString("update")) return emit(needToBeUpdated());
#ifdef BUILD_FUTURE
QFuture<QString> text = QtConcurrent::run(threadPool, [this]() {
calculateValues();
return parsePattern(m_pattern);
// run concurrent data update
QtConcurrent::run(threadPool, [this, sourceName, data]() {
return setDataBySource(sourceName, data);
});
#else /* BUILD_FUTURE */
calculateValues();
QString text = parsePattern(m_pattern);
return setDataBySource(sourceName, data);
#endif /* BUILD_FUTURE */
emit(needTextToBeUpdated(text));
emit(dataAggregator->updateData(values));
}
@ -464,7 +466,7 @@ void AWKeys::reinitKeys()
// init
QStringList allKeys = dictKeys();
#ifdef BUILD_TEST
#ifdef BUILD_TESTING
// not documented feature - place all available tags
m_pattern = m_pattern.replace(QString("$ALL"), [allKeys]() {
QStringList strings;
@ -472,7 +474,7 @@ void AWKeys::reinitKeys()
strings.append(QString("%1: $%1").arg(tag));
return strings.join(QString(" | "));
}());
#endif /* BUILD_TEST */
#endif /* BUILD_TESTING */
// append lists
// bars
@ -528,6 +530,24 @@ void AWKeys::reinitKeys()
}
void AWKeys::updateTextData()
{
qCDebug(LOG_AW);
#ifdef BUILD_FUTURE
QFuture<QString> text = QtConcurrent::run(threadPool, [this]() {
calculateValues();
return parsePattern(m_pattern);
});
#else /* BUILD_FUTURE */
calculateValues();
QString text = parsePattern(m_pattern);
#endif /* BUILD_FUTURE */
emit(needTextToBeUpdated(text));
emit(dataAggregator->updateData(values));
}
void AWKeys::addKeyToCache(const QString type, const QString key)
{
qCDebug(LOG_AW);
@ -679,7 +699,7 @@ QString AWKeys::parsePattern(QString pattern) const
}
void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data)
void AWKeys::setDataBySource(const QString sourceName, const QVariantHash data)
{
qCDebug(LOG_AW);
qCDebug(LOG_AW) << "Source" << sourceName;
@ -690,8 +710,7 @@ void AWKeys::setDataBySource(const QString sourceName, const QVariantMap data)
if (++queue > queueLimit) {
qCWarning(LOG_AW) << "Messages queue" << queue-- << "more than limits" << queueLimit;
lock = true;
emit(disconnectPlugin());
return;
return dataEngineAggregator->disconnectVisualization();
}
#endif /* BUILD_FUTURE */

View File

@ -25,6 +25,7 @@
class AWDataAggregator;
class AWDataEngineAggregator;
class AWKeysAggregator;
class ExtQuotes;
class ExtScript;
@ -40,45 +41,48 @@ class AWKeys : public QObject
public:
explicit AWKeys(QObject *parent = nullptr);
virtual ~AWKeys();
Q_INVOKABLE void initDataAggregator(const QVariantMap tooltipParams);
Q_INVOKABLE void initKeys(const QString currentPattern, const int limit);
Q_INVOKABLE void initKeys(const QString currentPattern, const int interval,
const int limit);
Q_INVOKABLE void setAggregatorProperty(const QString key, const QVariant value);
Q_INVOKABLE void setWrapNewLines(const bool wrap = false);
Q_INVOKABLE void unlock();
Q_INVOKABLE void updateCache();
// keys
Q_INVOKABLE void addDevice(const QString source);
Q_INVOKABLE QStringList dictKeys(const bool sorted = false,
const QString regexp = QString()) const;
Q_INVOKABLE QStringList getHddDevices() const;
Q_INVOKABLE void dataUpdateReceived(const QString sourceName, const QVariantMap data);
// values
Q_INVOKABLE QString infoByKey(QString key) const;
Q_INVOKABLE QString valueByKey(QString key) const;
// configuration
Q_INVOKABLE void editItem(const QString type);
public slots:
void addDevice(const QString source);
void dataUpdated(const QString sourceName, const QVariantHash data);
signals:
void disconnectPlugin() const;
void dropSourceFromDataengine(const QString source);
void needTextToBeUpdated(const QString newText) const;
void needToolTipToBeUpdated(const QString newText) const;
void needToBeUpdated();
private slots:
void dataUpdate();
void loadKeysFromCache();
void reinitKeys();
void updateTextData();
private:
// methods
void addKeyToCache(const QString type, const QString key = QString(""));
void calculateValues();
QString parsePattern(QString pattern) const;
void setDataBySource(const QString sourceName, const QVariantMap data);
void setDataBySource(const QString sourceName, const QVariantHash data);
// objects
AWKeysAggregator *aggregator = nullptr;
AWDataAggregator *dataAggregator = nullptr;
AWDataEngineAggregator *dataEngineAggregator = nullptr;
AWKeysAggregator *aggregator = nullptr;
ExtItemAggregator<GraphicalItem> *graphicalItems = nullptr;
ExtItemAggregator<ExtQuotes> *extQuotes = nullptr;
ExtItemAggregator<ExtScript> *extScripts = nullptr;
@ -92,8 +96,8 @@ private:
bool m_wrapNewLines = false;
// queue and stream lock properties
QThreadPool *threadPool = nullptr;
bool lock = true;
int queueLimit, queue = 0;
bool lock = true;
};