Finish implementing C++ bar widget

This commit is contained in:
Alex Spataru 2021-09-26 18:18:48 -05:00
parent 7fcaf5683d
commit c747f6e53e
6 changed files with 104 additions and 46 deletions

View File

@ -72,6 +72,26 @@ CONFIG += c++11
CONFIG += silent
CONFIG += strict_c++
sanitize {
CONFIG += sanitizer
CONFIG += sanitize_address
CONFIG *= sanitize_undefined
}
QMAKE_CXXFLAGS *= -fno-math-errno
QMAKE_CXXFLAGS *= -funsafe-math-optimizations
#-----------------------------------------------------------------------------------------
# Serial Studio compile-time settings
#-----------------------------------------------------------------------------------------
#DEFINES += DISABLE_QSU # If enabled, QSimpleUpdater shall not be used by the app.
# This is the default behaviour for MinGW.
DEFINES += LAZY_WIDGETS # Compile-time option to reduce the CPU usage of the widgets.
# If disabled, widgets shall update title, units, value, etc.
# If enabled, widgets shall only update their value.
#-----------------------------------------------------------------------------------------
# Libraries
#-----------------------------------------------------------------------------------------

View File

@ -151,7 +151,6 @@ Widgets.Window {
visible: widget.currentIndex == 1 || widget.currentIndex == 2
onTextChanged: Cpp_JSON_Editor.setDatasetWidgetMin(group, dataset, text)
validator: DoubleValidator {
bottom: 0
top: parseFloat(max.text)
}
}

View File

@ -165,6 +165,9 @@ void ModuleManager::initializeQmlInterface()
auto ioNetwork = IO::DataSources::Network::getInstance();
auto miscThemeManager = Misc::ThemeManager::getInstance();
// Start common event timers
miscTimerEvents->startTimers();
// Retranslate the QML interface automagically
connect(miscTranslator, SIGNAL(languageChanged()), engine(), SLOT(retranslate()));
@ -202,9 +205,6 @@ void ModuleManager::initializeQmlInterface()
engine()->load(QUrl(QStringLiteral("qrc:/qml/main.qml")));
// Warning! Do not call setSplashScreenMessage() after loading QML user interface
// Start common event timers
QTimer::singleShot(500, miscTimerEvents, SLOT(startTimers()));
}
/**

View File

@ -42,18 +42,6 @@ Bar::Bar(const int index)
if (m_index < 0 || m_index >= dash->barCount())
return;
// Get thermo color
QString color;
auto barcl = theme->barWidgetColors();
if (barcl.count() > m_index)
color = barcl.at(m_index);
else
color = barcl.at(barcl.count() % m_index);
// Configure thermo style
m_thermo.setPipeWidth(64);
m_thermo.setFillBrush(QBrush(QColor(color)));
// Configure label style
QFont font = dash->monoFont();
font.setPixelSize(24);
@ -69,18 +57,55 @@ Bar::Bar(const int index)
m_layout.setContentsMargins(24, 24, 24, 24);
setLayout(&m_layout);
// Generate stylesheets
// Set stylesheets
// clang-format off
auto labelQss = QSS("color:%1; border:1px solid %2;",
theme->datasetValue(),
theme->datasetWindowBorder());
auto windowQss = QSS("background-color:%1",
theme->datasetWindowBackground());
auto valueQSS = QSS("background-color:%1; color:%2; border:1px solid %3;",
theme->widgetAlternativeBackground(),
theme->widgetForegroundPrimary(),
theme->widgetIndicator1());
m_label.setStyleSheet(valueQSS);
// clang-format on
// Set stylesheets
setStyleSheet(windowQss);
m_label.setStyleSheet(labelQss);
// Set window palette
QPalette windowPalette;
windowPalette.setColor(QPalette::Base, theme->datasetWindowBackground());
windowPalette.setColor(QPalette::Window, theme->datasetWindowBackground());
setPalette(windowPalette);
// Set thermo palette
QPalette thermoPalette;
thermoPalette.setColor(QPalette::Highlight, QColor("#f00"));
thermoPalette.setColor(QPalette::Text, theme->widgetIndicator1());
thermoPalette.setColor(QPalette::Dark, theme->widgetIndicator1());
thermoPalette.setColor(QPalette::Light, theme->widgetIndicator1());
thermoPalette.setColor(QPalette::ButtonText, theme->widgetIndicator1());
thermoPalette.setColor(QPalette::WindowText, theme->widgetIndicator1());
thermoPalette.setColor(QPalette::Base, theme->widgetAlternativeBackground());
m_thermo.setPalette(thermoPalette);
// Get thermo color
QString color;
auto barcl = theme->barWidgetColors();
if (barcl.count() > m_index)
color = barcl.at(m_index);
else
color = barcl.at(barcl.count() % m_index);
// Configure thermo style
m_thermo.setPipeWidth(64);
m_thermo.setBorderWidth(1);
m_thermo.setFillBrush(QBrush(QColor(color)));
// Lazy widgets, get initial properties from dataset
#ifdef LAZY_WIDGETS
auto dataset = UI::Dashboard::getInstance()->getBar(m_index);
if (dataset)
{
m_thermo.setAlarmLevel(dataset->alarm());
m_thermo.setAlarmEnabled(m_thermo.alarmLevel() > 0);
m_thermo.setScale(dataset->min(), dataset->max());
}
#endif
// React to dashboard events
connect(dash, SIGNAL(updated()), this, SLOT(update()));
@ -99,9 +124,11 @@ void Bar::update()
auto dataset = UI::Dashboard::getInstance()->getBar(m_index);
if (dataset)
{
#ifndef LAZY_WIDGETS
m_thermo.setAlarmLevel(dataset->alarm());
m_thermo.setAlarmEnabled(m_thermo.alarmLevel() > 0);
m_thermo.setScale(dataset->min(), dataset->max());
#endif
m_thermo.setValue(dataset->value().toDouble());
m_label.setText(QString("%1 %2").arg(dataset->value(), dataset->units()));
}
@ -117,5 +144,6 @@ void Bar::resizeEvent(QResizeEvent *event)
QFont font = m_label.font();
font.setPixelSize(width / 16);
m_label.setFont(font);
m_label.setMaximumHeight(event->size().height() * 0.4);
event->accept();
}

View File

@ -48,13 +48,16 @@ DataGroup::DataGroup(const int index)
return;
// Generate widget stylesheets
auto font = dash->monoFont();
font.setBold(true);
auto valueQSS = QSS("color:%1", theme->datasetValue());
auto titleQSS = QSS("color:%1", theme->datasetTextPrimary());
auto unitsQSS = QSS("color:%1", theme->datasetTextSecondary());
auto iconsQSS = QSS("color:%1; font-weight:600;", theme->datasetTextSecondary());
auto windwQSS = QSS("background-color:%1", theme->datasetWindowBackground());
// Set window palette
QPalette windowPalette;
windowPalette.setColor(QPalette::Base, theme->datasetWindowBackground());
windowPalette.setColor(QPalette::Window, theme->datasetWindowBackground());
setPalette(windowPalette);
// Configure scroll area container
m_dataContainer = new QWidget(this);
@ -92,12 +95,16 @@ DataGroup::DataGroup(const int index)
// Configure elide modes
// Set label data
// Lazy widgets, set label initial data
#ifdef LAZY_WIDGETS
auto set = group->getDataset(dataset);
title->setText(set->title());
value->setText(set->value());
if (!set->units().isEmpty())
units->setText(QString("[%1]").arg(set->units()));
if (set)
{
title->setText(set->title());
if (!set->units().isEmpty())
units->setText(QString("[%1]").arg(set->units()));
}
#endif
// Set icon text
dicon->setText("");
@ -130,9 +137,6 @@ DataGroup::DataGroup(const int index)
m_mainLayout->setContentsMargins(0, 0, 0, 0);
setLayout(m_mainLayout);
// Set background color
m_dataContainer->setStyleSheet(windwQSS);
// React to dashboard events
connect(dash, SIGNAL(updated()), this, SLOT(update()));
}
@ -176,10 +180,15 @@ void DataGroup::update()
for (int i = 0; i < group->datasetCount(); ++i)
{
set = group->getDataset(i);
m_titles.at(i)->setText(set->title());
m_values.at(i)->setText(set->value());
if (!set->units().isEmpty())
m_units.at(i)->setText(QString("[%1]").arg(set->units()));
if (set)
{
#ifndef LAZY_WIDGETS
m_titles.at(i)->setText(set->title());
if (!set->units().isEmpty())
m_units.at(i)->setText(QString("[%1]").arg(set->units()));
#endif
m_values.at(i)->setText(set->value());
}
}
}

View File

@ -56,13 +56,12 @@ WidgetLoader::WidgetLoader(QQuickItem *parent)
m_window.setMinimumWidth(640);
m_window.setMinimumHeight(480);
// Configure window style sheet
// clang-format off
// Set window palette
QPalette windowPalette;
auto theme = Misc::ThemeManager::getInstance();
auto qss = QString("background-color: %1;").arg(
theme->datasetWindowBackground().name());
m_window.setStyleSheet(qss);
// clang-format on
windowPalette.setColor(QPalette::Base, theme->datasetWindowBackground());
windowPalette.setColor(QPalette::Window, theme->datasetWindowBackground());
m_window.setPalette(windowPalette);
// Resize widget to fit QML item size
connect(this, &QQuickPaintedItem::widthChanged, this,
@ -367,6 +366,8 @@ void WidgetLoader::processMouseEvents(QMouseEvent *event)
default:
break;
}
update();
}
/**
@ -384,4 +385,5 @@ void WidgetLoader::processWheelEvents(QWheelEvent *event)
};
static_cast<Hack *>(m_widget)->wheelEvent(event);
update();
}