diff --git a/src/widgets/thermowidget.cpp b/src/widgets/thermowidget.cpp index 8afeec3..8d052b6 100644 --- a/src/widgets/thermowidget.cpp +++ b/src/widgets/thermowidget.cpp @@ -1,232 +1,280 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2018> Author: Tomaz Canabrava - tcanabrava@kde.org Chris Rizzitello - rizzitello@kde.org Lays Rodrigues - laysrodriguessilva@gmail.com This program 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. This program 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 this program. If not, see . */ #include #include #include #include #include #include #include #include #include "thermowidget.h" ThermoWidget::ThermoWidget(QWidget *parent, QString name) : QwtDial(parent), m_targetTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, Qt::red, Qt::darkRed)), m_name(name), m_currentTemperature(0), m_targetTemperature(0) { setScaleArc(40, 320); //make our current temperature needle here so we can set it to match text color. m_currentTemperatureNeedle = new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, true, palette().text().color()); setNeedle(m_currentTemperatureNeedle); setReadOnly(false); setFocusPolicy(Qt::StrongFocus); m_cursorTimer = new QTimer(); connect (m_cursorTimer, &QTimer::timeout, [&] { m_paintCursor = !m_paintCursor; update(); }); } void ThermoWidget::keyPressEvent(QKeyEvent* event) { + //set our target text length. + int slen = m_currentTemperatureTextFromEditor.length() -1; + // be sure our cursor posistion is valid. + if(slen < 0) { + m_currentTemperatureTextFromEditor = '-'; + m_cursorPos = 0; + } else if(slen > 2) { + m_cursorPos = 2; + } + //parse the key events. if (event->key() >= Qt::Key_0 && event->key() <= Qt::Key_9) { - auto tmp = m_currentTemperatureTextFromEditor + event->key(); + auto tmp = m_currentTemperatureTextFromEditor; + + if(m_cursorPos == slen) { + tmp.append(event->key()); + } else { + tmp.insert(m_cursorPos,event->key()); + } + + if(tmp.startsWith('0')) { + tmp.remove(0,1); + } + + if(tmp.contains('-')) { + tmp.remove('-'); + //push the cursor back to negate advancement; + m_cursorPos--; + } if (tmp.toInt() <= upperBound() && tmp.toInt() >= lowerBound()) { m_currentTemperatureTextFromEditor = tmp; + if (m_cursorPos <= slen) { + m_cursorPos++; + } + } + } else if ( event->key() == Qt::Key_Delete && m_currentTemperatureTextFromEditor.count()) { + m_currentTemperatureTextFromEditor.remove(m_cursorPos, 1); + if(m_cursorPos < slen) { + m_cursorPos = slen; + } + m_cursorPos--; + } else if ( event->key() == Qt::Key_Backspace && m_currentTemperatureTextFromEditor.count()) { + if(m_cursorPos <= slen) { + m_cursorPos--; + m_currentTemperatureTextFromEditor.remove(m_cursorPos, 1); } - } else if ( (event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete) && m_currentTemperatureTextFromEditor.count()) { - m_currentTemperatureTextFromEditor.remove(m_currentTemperatureTextFromEditor.length()-1, 1); } else if (event->key() == Qt::Key_Enter) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); } else if (event->key() == Qt::Key_Escape) { m_currentTemperatureTextFromEditor = '0'; - } else if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Right || event->key() == Qt::Key_Plus) { + } else if (event->key() == Qt::Key_Up || event->key() == Qt::Key_Plus) { if (m_targetTemperature != upperBound()) { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 1); } - } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Left || event->key() == Qt::Key_Minus) { + } else if (event->key() == Qt::Key_Down || event->key() == Qt::Key_Minus) { if (m_targetTemperature != lowerBound()) { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature - 1); } } else if (event->key() == Qt::Key_PageUp) { if (m_targetTemperature + 10 > upperBound()) { m_currentTemperatureTextFromEditor = QString::number(upperBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 10); } } else if (event->key() == Qt::Key_PageDown) { if (m_targetTemperature - 10 < lowerBound()) { m_currentTemperatureTextFromEditor = QString::number(lowerBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature - 10); } } + else if (event->key() == Qt::Key_Right) { + if(m_cursorPos < slen) { + m_cursorPos++; + } + } else if (event->key() == Qt::Key_Left) { + if(m_cursorPos > 0) { + m_cursorPos--; + } + } else { QwtDial::keyPressEvent(event); return; } if (m_targetTemperature != m_currentTemperatureTextFromEditor.toInt()) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); emit targetTemperatureChanged(m_targetTemperature); update(); event->accept(); } } void ThermoWidget::wheelEvent(QWheelEvent* event) { if (event->angleDelta().y() > 0) { if (m_targetTemperature + 10 > upperBound()) { m_currentTemperatureTextFromEditor = QString::number(upperBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 10); } } else if (event->angleDelta().y() < 0) { if (m_targetTemperature - 10 < lowerBound()) { m_currentTemperatureTextFromEditor = QString::number(lowerBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature - 10); } } if (m_targetTemperature != m_currentTemperatureTextFromEditor.toInt()) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); emit targetTemperatureChanged(m_targetTemperature); update(); } event->accept(); } void ThermoWidget::focusOutEvent(QFocusEvent* event) { if (m_targetTemperature != m_currentTemperatureTextFromEditor.toInt()) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); emit targetTemperatureChanged(m_targetTemperature); event->accept(); } m_cursorTimer->stop(); m_paintCursor = false; update(); } void ThermoWidget::focusInEvent(QFocusEvent* event) { m_cursorTimer->start(1000); event->accept(); } void ThermoWidget::paintEvent(QPaintEvent* event) { QwtDial::paintEvent(event); const QString currentText = QString::number(m_currentTemperature); QFontMetrics fm(font()); const double targetWidth = fm.width(m_currentTemperatureTextFromEditor); const double currentWidth = fm.width(currentText); const double nameWidth = fm.width(m_name); const double wWidth = fm.width('W'); + const double cursorWidth = fm.width('0'); const double height = fm.height(); const double halfWidth = geometry().width() / 2; const double xposTarget = halfWidth - (targetWidth / 2); const double xposCurrent = halfWidth - (currentWidth / 2); - const double xposCursor = halfWidth + fm.width('_') + 2; const double xposName = halfWidth - (nameWidth / 2); + const double xposCursor = xposTarget + (cursorWidth * m_cursorPos); double ypos = geometry().height() / 2 + height * 2; QPainter p(this); QColor color = palette().color(QPalette::Text); //draw a box to put our target into as a user hint. p.fillRect(QRect(halfWidth - wWidth , ypos - (height * 0.66), wWidth * 2, (height * 0.9)),palette().color(QPalette::AlternateBase)); if(m_paintCursor) { p.setPen(palette().color(QPalette::Text)); - p.drawText(xposCursor, ypos, QChar('|')); + p.drawText(xposCursor , ypos, QChar('_')); } + p.setPen(Qt::red); p.drawText(xposTarget, ypos, m_currentTemperatureTextFromEditor); ypos += height + 2; p.setPen(color); - p.drawText(xposCurrent, ypos, QString::number(m_currentTemperature)); - ypos += height + 2; p.setPen(color); p.drawText(xposName, ypos, m_name); } void ThermoWidget::drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const { Q_UNUSED( dir ); 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(); // Qt coordinates and Qwt coordinates differ. // the "begin" of our coordinates in Qt: -130 // the "span" of our coordinates in Qt: -180 // Negative values means clockwise in Qt dialect. const double qtBeginAngle = -130; const double coolZone = - (targetTemperatureAngle - minScaleArc()); int yPos = geometry().height() / 2 - radius; int xPos = geometry().width() / 2 - radius; QRadialGradient grad(center,radius); grad.setColorAt(0.75,QColor(0,0,0,0)); grad.setColorAt(0.85,QColor(255,0,0,196)); grad.setColorAt(0.95,QColor(255,110,60,196)); painter->setBrush(grad); painter->drawPie(xPos,yPos, radius * 2, radius * 2, qtBeginAngle * 16, coolZone* 16); m_targetTemperatureNeedle->draw(painter, center, radius * 1.3, 360 - targetTemperatureAngle - origin(), colorGroup); m_currentTemperatureNeedle->draw(painter, center, radius, 360 - currentTemperatureAngle - origin(), colorGroup); } void ThermoWidget::setCurrentTemperature(double temperature) { if (m_currentTemperature != temperature) { m_currentTemperature = temperature; update(); } } void ThermoWidget::setTargetTemperature(double temperature) { if (m_targetTemperature != temperature) { m_currentTemperatureTextFromEditor = QString::number(temperature); m_targetTemperature = temperature; emit targetTemperatureChanged(m_targetTemperature); update(); } + } diff --git a/src/widgets/thermowidget.h b/src/widgets/thermowidget.h index 8b4f50c..fa688f3 100644 --- a/src/widgets/thermowidget.h +++ b/src/widgets/thermowidget.h @@ -1,63 +1,64 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2018> Author: Tomaz Canabrava - tcanabrava@kde.org Chris Rizzitello - rizzitello@kde.org Lays Rodrigues - laysrodriguessilva@gmail.com This program 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. This program 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 this program. If not, see . */ #pragma once #include #include class QKeyEvent; class QPaintEvent; class QFocusEvent; class QWheelEvent; class ThermoWidget : public QwtDial { Q_OBJECT public: ThermoWidget(QWidget *parent, QString name); void drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const; void setCurrentTemperature(double temperature); void setTargetTemperature(double temperature); signals: void targetTemperatureChanged(double targetTemperature); protected: void focusInEvent(QFocusEvent *event); void focusOutEvent(QFocusEvent *event); void keyPressEvent (QKeyEvent *event); void paintEvent(QPaintEvent *event); void wheelEvent(QWheelEvent *event); private: QwtDialSimpleNeedle *m_currentTemperatureNeedle; QwtDialSimpleNeedle *m_targetTemperatureNeedle; - QString m_currentTemperatureTextFromEditor; + QString m_currentTemperatureTextFromEditor = QString("-"); QString m_name; QTimer *m_cursorTimer = nullptr; bool m_paintCursor = false; + int m_cursorPos = 0; double m_currentTemperature; double m_targetTemperature; };