diff --git a/src/widgets/bedextruderwidget.cpp b/src/widgets/bedextruderwidget.cpp index 098027a..5167dd0 100644 --- a/src/widgets/bedextruderwidget.cpp +++ b/src/widgets/bedextruderwidget.cpp @@ -1,119 +1,119 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2016> Author: 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 "bedextruderwidget.h" #include #include #include "thermowidget.h" BedExtruderWidget::BedExtruderWidget(QWidget *parent) : QWidget(parent), - m_bedThermo(new ThermoWidget(this)), - m_extruderThermo(new ThermoWidget(this)), + m_bedThermo(new ThermoWidget(this, QString(i18n("Bed")))), + m_extruderThermo(new ThermoWidget(this, QString(i18n("HotEnd")))), m_extruderBox(new QWidget(this)), m_extrudersLayout(new QHBoxLayout) { m_bedThermo->setScale(0, 150); m_extruderThermo->setScale(0, 250); m_extruderBox->setLayout(m_extrudersLayout); auto *layout = new QGridLayout; auto *label = new QLabel(i18n("Active Extruder:")); m_extrudersLayout->addWidget(label); layout->addWidget(m_extruderBox, 0, 0, 1, -1); layout->addWidget(m_bedThermo, 1, 0); layout->addWidget(m_extruderThermo, 1, 1); setLayout(layout); //Add Default Extruder setExtruderCount(1); connect(m_bedThermo, &ThermoWidget::targetTemperatureChanged, [this](double v) { qDebug() << "Receiving the temperature change for bed"; emit bedTemperatureChanged((int)v, false); }); connect(m_extruderThermo, &ThermoWidget::targetTemperatureChanged, [this](double v) { qDebug() << "Receiving the temperature changed for thermo"; emit extTemperatureChanged((int)v, currentExtruder(), false); }); } BedExtruderWidget::~BedExtruderWidget() { } void BedExtruderWidget::setExtruderCount(int value) { value > 1 ? m_extruderBox->setVisible(true) : m_extruderBox->setVisible(false); if (value == m_extruderCount) { return; } else if (m_extruderCount < value) { //loop for the new buttons for (int i = m_extruderCount; i < value; i++) { auto *rb = new QRadioButton(QString::number(i + 1)); m_extrudersLayout->addWidget(rb); extruderMap.insert(i, rb); } } else { //remove buttons - need to test it! for (int i = m_extruderCount; i >= value; i--) { auto *rb = extruderMap.value(i); m_extrudersLayout->removeWidget(rb); extruderMap.remove(i); delete (rb); } } m_extruderCount = value; } void BedExtruderWidget::updateBedTemp(const float temp) { m_bedThermo->setCurrentTemperature(temp); } void BedExtruderWidget::updateExtTemp(const float temp) { m_extruderThermo->setCurrentTemperature(temp); } void BedExtruderWidget::updateBedTargetTemp(const float temp) { m_bedThermo->setTargetTemperature(temp); } void BedExtruderWidget::updateExtTargetTemp(const float temp) { m_extruderThermo->setTargetTemperature(temp); } int BedExtruderWidget::currentExtruder() { int currExt = 0; for (int i = 0; i < extruderMap.size(); i++) { if (extruderMap.value(i)->isChecked()) { currExt = i; break; } } return currExt; } diff --git a/src/widgets/thermowidget.cpp b/src/widgets/thermowidget.cpp index 657c469..54ac4c1 100644 --- a/src/widgets/thermowidget.cpp +++ b/src/widgets/thermowidget.cpp @@ -1,180 +1,188 @@ #include "thermowidget.h" #include #include #include #include #include #include #include -ThermoWidget::ThermoWidget(QWidget *parent) : QwtDial(parent), +ThermoWidget::ThermoWidget(QWidget *parent, QString name) : QwtDial(parent), m_currentTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow)), - m_targetTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, Qt::red, Qt::darkRed)) + m_targetTemperatureNeedle(new QwtDialSimpleNeedle(QwtDialSimpleNeedle::Arrow, Qt::red, Qt::darkRed)), + m_name(name) { setScaleArc(40, 320); setNeedle(m_currentTemperatureNeedle); setReadOnly(false); setFocusPolicy(Qt::StrongFocus); m_currentTemperature = 0; m_targetTemperature = 0; } void ThermoWidget::keyPressEvent(QKeyEvent* ev) { 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 if (ev->key() == Qt::Key_Up || ev->key() == Qt::Key_Right) { if (m_targetTemperature != upperBound()) { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 1); } } else if (ev->key() == Qt::Key_Down || ev->key() == Qt::Key_Left) { if (m_targetTemperature != lowerBound()) { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature - 1); } } else if (ev->key() == Qt::Key_PageUp) { if (m_targetTemperature + 10 > upperBound()) { m_currentTemperatureTextFromEditor = QString::number(upperBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 10); } } else if (ev->key() == Qt::Key_PageDown) { if (m_targetTemperature - 10 < lowerBound()) { m_currentTemperatureTextFromEditor = QString::number(lowerBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature - 10); } } else { QwtDial::keyPressEvent(ev); return; } if (m_targetTemperature != m_currentTemperatureTextFromEditor.toInt()) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); emit targetTemperatureChanged(m_targetTemperature); update(); ev->accept(); } } void ThermoWidget::focusOutEvent(QFocusEvent* ev) { if (m_targetTemperature != m_currentTemperatureTextFromEditor.toInt()) { m_targetTemperature = m_currentTemperatureTextFromEditor.toInt(); emit targetTemperatureChanged(m_targetTemperature); update(); ev->accept(); } } void ThermoWidget::paintEvent(QPaintEvent* ev) { QwtDial::paintEvent(ev); 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 height = fm.height(); const double halfWidth = geometry().width() / 2; const double xposTarget = halfWidth - (targetWidth / 2); const double xposCurrent = halfWidth - (currentWidth / 2); + const double xposName = halfWidth - (nameWidth / 2); const double ypos = geometry().height() - height * 2 - 2; QPainter p(this); + QColor color = palette().color(QPalette::Text); + p.setPen(Qt::red); - p.drawText(xposTarget, ypos - height, m_currentTemperatureTextFromEditor); + p.drawText(xposTarget, ypos - 2 * height, m_currentTemperatureTextFromEditor); + + p.setPen(color); + p.drawText(xposCurrent, ypos - height, QString::number(m_currentTemperature)); - p.setPen(Qt::white); - p.drawText(xposCurrent, ypos, QString::number(m_currentTemperature)); + p.setPen(color); + p.drawText(xposName, ypos, m_name); } void ThermoWidget::wheelEvent(QWheelEvent* ev) { if (ev->angleDelta().y() > 0) { if (m_targetTemperature + 10 > upperBound()) { m_currentTemperatureTextFromEditor = QString::number(upperBound()); } else { m_currentTemperatureTextFromEditor = QString::number(m_targetTemperature + 10); } } else if (ev->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(); } ev->accept(); } 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 963d174..01469db 100644 --- a/src/widgets/thermowidget.h +++ b/src/widgets/thermowidget.h @@ -1,42 +1,43 @@ #ifndef THERMOWIDGET_H #define THERMOWIDGET_H #include #include class QKeyEvent; class QPaintEvent; class QFocusEvent; class QWheelEvent; class ThermoWidget : public QwtDial { Q_OBJECT public: - ThermoWidget(QWidget *parent); + ThermoWidget(QWidget *parent, QString name); void setTargetTemperature(double temperature); void setCurrentTemperature(double temperature); void drawNeedle( QPainter *painter, const QPointF ¢er, double radius, double dir, QPalette::ColorGroup colorGroup ) const; signals: void targetTemperatureChanged(double targetTemperature); protected: void keyPressEvent (QKeyEvent *); void paintEvent(QPaintEvent *); void focusOutEvent(QFocusEvent *); void wheelEvent(QWheelEvent *event); private: QwtDialSimpleNeedle *m_currentTemperatureNeedle; QwtDialSimpleNeedle *m_targetTemperatureNeedle; double m_currentTemperature; double m_targetTemperature; QString m_currentTemperatureTextFromEditor; + QString m_name; }; #endif