diff --git a/src/widgets/thermowidget.cpp b/src/widgets/thermowidget.cpp index acbc8a4..da87033 100644 --- a/src/widgets/thermowidget.cpp +++ b/src/widgets/thermowidget.cpp @@ -1,56 +1,92 @@ #include "thermowidget.h" +#include +#include +#include +#include +#include +#include ThermoWidget::ThermoWidget(QWidget *parent) : QwtDial(parent), m_currentTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow)), m_targetTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow)) { setScaleArc(40, 320); setNeedle(m_currentTemperatureNeedle); + setReadOnly(false); + setFocusPolicy(Qt::StrongFocus); m_currentTemperature = 0; m_targetTemperature = 0; } -void ThermoWidget::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const +void ThermoWidget::keyPressEvent(QKeyEvent* ev) { - Q_UNUSED( dir ); - - qDebug() << "############################"; - qDebug() << "Drawing for" << minScaleArc() << " to " << maxScaleArc() << "and values" << lowerBound() << "and" << upperBound(); - - const double startAngle = minScaleArc(); - const double endAngle = maxScaleArc(); - - - const double minValue = lowerBound(); - const double maxValue = upperBound(); + if (ev->key() >= Qt::Key_0 && ev->key() <= Qt::Key_9) { + auto tmp = m_currentTemperatureTextFromEditor + ev->key(); + if (tmp.toInt() <= upperBound() && tmp.toInt() >= lowerBound()) { + m_currentTemperatureTextFromEditor = tmp; + } + } else if (ev->key() == Qt::Key_Backspace && m_currentTemperatureTextFromEditor.count()) { + m_currentTemperatureTextFromEditor.remove(m_currentTemperatureTextFromEditor.count() - 1, 1); + } else if (ev->key() == Qt::Key_Enter) { + m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); + } else if (ev->key() == Qt::Key_Escape) { + m_currentTemperatureTextFromEditor = '0'; + } else { + QwtDial::keyPressEvent(ev); + return; + } + + m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); + update(); +} - const double relativePercent = maxValue - minValue; +void ThermoWidget::focusOutEvent(QFocusEvent*) +{ + m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); + update(); +} - const double currentTemperaturePercent = (m_currentTemperature - minValue) / relativePercent; - const double targetTemperaturePercent = (m_targetTemperature - minValue) / relativePercent; - qDebug() << "Values" << m_currentTemperature << m_targetTemperature; - qDebug() << "Percentages" << currentTemperaturePercent << targetTemperaturePercent; +void ThermoWidget::paintEvent(QPaintEvent* ev) +{ + QwtDial::paintEvent(ev); + + QFontMetrics fm(font()); + const double width = fm.width(m_currentTemperatureTextFromEditor); + const double height = fm.height(); + const double xpos = (geometry().width() / 2) - (width / 2); + const double ypos = geometry().height() - height * 2 - 2; + + QPainter p(this); + p.setBrush(Qt::white); + p.setPen(Qt::white); + p.drawText(xpos, ypos, m_currentTemperatureTextFromEditor); +} - const double currentTemperatureAngle = (endAngle - startAngle) * currentTemperaturePercent + startAngle; - const double targetTemperatureAngle = (endAngle - startAngle) * targetTemperaturePercent + startAngle; +void ThermoWidget::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const +{ + Q_UNUSED( dir ); - qDebug() << "Angles" << currentTemperatureAngle << targetTemperatureAngle; + const double relativePercent = upperBound() - lowerBound(); + const double currentTemperaturePercent = (m_currentTemperature - lowerBound()) / relativePercent; + const double targetTemperaturePercent = (m_targetTemperature - lowerBound()) / relativePercent; + const double currentTemperatureAngle = (maxScaleArc() - minScaleArc()) * currentTemperaturePercent + minScaleArc(); + const double targetTemperatureAngle = (maxScaleArc() - minScaleArc()) * targetTemperaturePercent + minScaleArc(); m_targetTemperatureNeedle->draw(painter, center, radius, 360 - currentTemperatureAngle - origin(), colorGroup); m_currentTemperatureNeedle->draw(painter, center, radius, 360 - targetTemperatureAngle - origin(), colorGroup); } void ThermoWidget::setCurrentTemperature(double temperature) { m_currentTemperature = temperature; update(); } void ThermoWidget::setTargetTemperature(double temperature) { m_targetTemperature = temperature; update(); } diff --git a/src/widgets/thermowidget.h b/src/widgets/thermowidget.h index 3e596fe..3d9cd4b 100644 --- a/src/widgets/thermowidget.h +++ b/src/widgets/thermowidget.h @@ -1,24 +1,36 @@ #ifndef THERMOWIDGET_H #define THERMOWIDGET_H #include #include +class QKeyEvent; +class QPaintEvent; +class QFocusEvent; + class ThermoWidget : public QwtDial { Q_OBJECT public: ThermoWidget(QWidget *parent); void setTargetTemperature(double temperature); void setCurrentTemperature(double temperature); void drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const; + +protected: + void keyPressEvent (QKeyEvent *); + void paintEvent(QPaintEvent *); + void focusOutEvent(QFocusEvent *); + private: QwtDialSimpleNeedle *m_currentTemperatureNeedle; QwtDialSimpleNeedle *m_targetTemperatureNeedle; double m_currentTemperature; double m_targetTemperature; + + QString m_currentTemperatureTextFromEditor; }; #endif