Skip to content
Snippets Groups Projects
Commit d2c555c3 authored by Vitaly Fanaskov's avatar Vitaly Fanaskov
Browse files

Implemented widget for editing telemetry settings

parent 01a58211
No related branches found
No related tags found
No related merge requests found
......@@ -26,6 +26,8 @@
****************************************************************************/
#include "usagestatisticpage.h"
#include <KUserFeedback/AbstractDataSource>
#include "usagestatisticwidget.h"
#include "usagestatisticconstants.h"
......@@ -42,17 +44,32 @@ UsageStatisticPage::~UsageStatisticPage() = default;
QWidget *UsageStatisticPage::widget()
{
if (!m_feedbackWidget)
m_feedbackWidget = std::make_unique<UsageStatisticWidget>();
// TODO: apply data from provider
if (!m_feedbackWidget) {
m_feedbackWidget = std::make_unique<UsageStatisticWidget>(m_provider);
m_feedbackWidget->updateSettings();
}
return m_feedbackWidget.get();
}
static void applyDataSourcesActiveStatuses(const QHash<QString, bool> &statuses,
const KUserFeedback::Provider &provider)
{
for (auto &&ds : provider.dataSources()) {
if (ds)
if (auto it = statuses.find(ds->id()); it != std::end(statuses))
ds->setActive(*it);
}
}
void UsageStatisticPage::apply()
{
// TODO: implement
auto settings = m_feedbackWidget->settings();
m_provider->setTelemetryMode(settings.telemetryMode);
applyDataSourcesActiveStatuses(settings.activeStatusesById, *m_provider);
emit settingsChanged();
}
void UsageStatisticPage::finish()
......
......@@ -32,10 +32,7 @@
#include <coreplugin/dialogs/ioptionspage.h>
namespace KUserFeedback {
class FeedbackConfigWidget;
class Provider;
}
namespace KUserFeedback { class Provider; }
namespace UsageStatistic {
namespace Internal {
......
......@@ -27,14 +27,159 @@
#include "usagestatisticwidget.h"
#include "ui_usagestatisticwidget.h"
#include <QtCore/QJsonObject>
#include <QtCore/QJsonArray>
#include <QtCore/QJsonDocument>
#include <KUserFeedback/FeedbackConfigUiController>
#include <KUserFeedback/AbstractDataSource>
namespace UsageStatistic {
namespace Internal {
UsageStatisticWidget::UsageStatisticWidget(QWidget *parent) :
QWidget(parent),
ui(std::make_unique<Ui::UsageStatisticWidget>())
using namespace KUserFeedback;
UsageStatisticWidget::UsageStatisticWidget(std::shared_ptr<KUserFeedback::Provider> provider)
: ui(std::make_unique<Ui::UsageStatisticWidget>())
, m_provider(std::move(provider))
, m_controller(std::make_unique<FeedbackConfigUiController>())
{
ui->setupUi(this);
configure();
}
void UsageStatisticWidget::updateSettings()
{
setupActiveStatuses();
setupTelemetryModeUi();
}
UsageStatisticWidget::Settings UsageStatisticWidget::settings() const
{
return {m_controller->telemetryIndexToMode(ui->cbMode->currentIndex()), m_activeStatusesById};
}
static constexpr int dataSourceIDRole = Qt::UserRole + 1;
void UsageStatisticWidget::configure()
{
m_controller->setFeedbackProvider(m_provider.get());
connect(ui->cbMode, qOverload<int>(&QComboBox::currentIndexChanged),
this, &UsageStatisticWidget::updateTelemetryModeDescription);
connect(ui->cbMode, qOverload<int>(&QComboBox::currentIndexChanged),
[this](int index) { preserveCurrentActiveStatuses(); updateDataSources(index); });
connect(ui->lvDataSources, &QListWidget::currentItemChanged,
this, &UsageStatisticWidget::updateDataSource);
connect(ui->lvDataSources, &QListWidget::itemChanged,
this, &UsageStatisticWidget::updateActiveStatus);
}
void UsageStatisticWidget::setupTelemetryModeUi()
{
ui->cbMode->clear();
for (int i = 0; i < m_controller->telemetryModeCount(); ++i) {
ui->cbMode->addItem(QString("%1 - %2").arg(i).arg(m_controller->telemetryModeName(i)));
}
ui->cbMode->setCurrentIndex(m_controller->telemetryModeToIndex(m_provider->telemetryMode()));
}
void UsageStatisticWidget::updateTelemetryModeDescription(int modeIndex)
{
ui->pteTelemetryLvlDescription->setPlainText(m_controller->telemetryModeDescription(modeIndex));
}
static auto dataSourceToItem(const AbstractDataSource &ds,
const UsageStatisticWidget::ActiveStatusesById &activeStatusesById)
{
auto item = std::make_unique<QListWidgetItem>(ds.name());
item->setFlags(item->flags() | Qt::ItemIsUserCheckable);
if (auto it = activeStatusesById.find(ds.id()); it != std::end(activeStatusesById)) {
item->setCheckState(*it ? Qt::Checked : Qt::Unchecked);
} else {
item->setCheckState(Qt::Checked);
}
item->setData(dataSourceIDRole, ds.id());
return item;
}
void UsageStatisticWidget::updateDataSources(int modeIndex)
{
ui->lvDataSources->clear();
for (auto &&ds : m_provider->dataSources()) {
if (ds && ds->telemetryMode() <= m_controller->telemetryIndexToMode(modeIndex)) {
auto item = dataSourceToItem(*ds, m_activeStatusesById).release();
ui->lvDataSources->addItem(item);
if (m_currentItemId == ds->id())
ui->lvDataSources->setCurrentItem(item);
}
}
}
static QString collectedData(AbstractDataSource &ds)
{
QByteArray result;
auto variantData = ds.data();
if (variantData.canConvert<QVariantMap>())
result = QJsonDocument(QJsonObject::fromVariantMap(variantData.toMap())).toJson();
if (variantData.canConvert<QVariantList>())
result = QJsonDocument(QJsonArray::fromVariantList(variantData.value<QVariantList>())).toJson();
return QString::fromUtf8(result);
}
void UsageStatisticWidget::updateDataSource(QListWidgetItem *item)
{
if (item) {
m_currentItemId = item->data(dataSourceIDRole).toString();
if (auto ds = m_provider->findSource(m_currentItemId)) {
ui->pteDataSourceDescription->setPlainText(ds->description());
ui->pteCollectedData->setPlainText(collectedData(*ds));
}
} else {
ui->pteDataSourceDescription->clear();
ui->pteCollectedData->clear();
}
}
void UsageStatisticWidget::updateActiveStatus(QListWidgetItem *item)
{
if (item) {
auto id = item->data(dataSourceIDRole).toString();
m_activeStatusesById[id] = item->checkState() == Qt::Checked;
}
}
void UsageStatisticWidget::preserveCurrentActiveStatuses()
{
for (int row = 0; row < ui->lvDataSources->count(); ++row) {
if (auto item = ui->lvDataSources->item(row)) {
auto id = item->data(dataSourceIDRole).toString();
m_activeStatusesById[id] = item->checkState() == Qt::Checked;
}
}
}
void UsageStatisticWidget::setupActiveStatuses()
{
m_activeStatusesById.clear();
for (auto &&ds : m_provider->dataSources()) {
if (ds) {
m_activeStatusesById[ds->id()] = ds->isActive();
}
}
}
UsageStatisticWidget::~UsageStatisticWidget() = default;
......
......@@ -28,27 +28,66 @@
#include <memory>
#include <QWidget>
#include <QtWidgets/QWidget>
#include <QtCore/QHash>
#include <KUserFeedback/Provider>
namespace KUserFeedback { class FeedbackConfigUiController; }
QT_BEGIN_NAMESPACE
class QListWidgetItem;
QT_END_NAMESPACE
namespace UsageStatistic {
namespace Internal {
namespace Ui {
class UsageStatisticWidget;
}
namespace Ui { class UsageStatisticWidget; }
class UsageStatisticWidget : public QWidget
{
Q_OBJECT
public: // Types
using ActiveStatusesById = QHash<QString, bool>;
struct Settings
{
KUserFeedback::Provider::TelemetryMode telemetryMode;
ActiveStatusesById activeStatusesById;
};
public:
explicit UsageStatisticWidget(QWidget *parent = nullptr);
explicit UsageStatisticWidget(std::shared_ptr<KUserFeedback::Provider> provider);
~UsageStatisticWidget() override;
private:
void updateSettings();
Settings settings() const;
private: // Methods
void configure();
void setupTelemetryModeUi();
void updateTelemetryModeDescription(int modeIndex);
void updateDataSources(int modeIndex);
void updateDataSource(QListWidgetItem *item);
void updateActiveStatus(QListWidgetItem *item);
void preserveCurrentActiveStatuses();
void setupActiveStatuses();
private: // Data
std::unique_ptr<Ui::UsageStatisticWidget> ui;
};
std::shared_ptr<KUserFeedback::Provider> m_provider;
std::unique_ptr<KUserFeedback::FeedbackConfigUiController> m_controller;
QString m_currentItemId;
ActiveStatusesById m_activeStatusesById;
};
} // namespace Internal
} // namespace UsageStatistic
......@@ -15,28 +15,32 @@
</property>
<layout class="QVBoxLayout" name="verticalLayout_5" stretch="1,9">
<item>
<widget class="QGroupBox" name="gbGeneral">
<widget class="QGroupBox" name="gbTelemetryMode">
<property name="title">
<string>&amp;General</string>
<string>&amp;Telemetry mode</string>
</property>
<property name="flat">
<bool>true</bool>
</property>
<layout class="QHBoxLayout" name="horizontalLayout_2" stretch="2,8">
<layout class="QVBoxLayout" name="verticalLayout_4">
<item>
<layout class="QVBoxLayout" name="verticalLayout_4">
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QComboBox" name="cbLvl"/>
<widget class="QComboBox" name="cbMode">
<property name="sizeAdjustPolicy">
<enum>QComboBox::AdjustToContents</enum>
</property>
</widget>
</item>
<item>
<spacer name="verticalSpacer">
<spacer name="horizontalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
<enum>Qt::Horizontal</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
<width>40</width>
<height>20</height>
</size>
</property>
</spacer>
......@@ -61,9 +65,9 @@
<property name="title">
<string>Data &amp;sources</string>
</property>
<layout class="QHBoxLayout" name="horizontalLayout" stretch="2,8">
<layout class="QHBoxLayout" name="horizontalLayout" stretch="3,7">
<item>
<widget class="QListWidget" name="lwDataSources"/>
<widget class="QListWidget" name="lvDataSources"/>
</item>
<item>
<layout class="QVBoxLayout" name="verticalLayout_3" stretch="2,8">
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment