diff --git a/src/widgets/atcoreinstancewidget.cpp b/src/widgets/atcoreinstancewidget.cpp index d245853..63ef0a1 100644 --- a/src/widgets/atcoreinstancewidget.cpp +++ b/src/widgets/atcoreinstancewidget.cpp @@ -1,547 +1,550 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2017> Author: Lays Rodrigues - lays.rodrigues@kde.org Chris Rizzitello - rizzitello@kde.org 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 "atcoreinstancewidget.h" AtCoreInstanceWidget::AtCoreInstanceWidget(QWidget *parent): QWidget(parent) , m_fileCount(0) , m_printAction(nullptr) , m_stopAction(nullptr) , m_toolBar(nullptr) { m_theme = palette().text().color().value() >= QColor(Qt::lightGray).value() ? QString("dark") : QString("light") ; QHBoxLayout *HLayout = new QHBoxLayout; m_bedExtWidget = new BedExtruderWidget; HLayout->addWidget(m_bedExtWidget); m_movementWidget = new MovementWidget(false); m_movementWidget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Minimum); HLayout->addWidget(m_movementWidget); QVBoxLayout *VLayout = new QVBoxLayout; VLayout->addLayout(HLayout); m_plotWidget = new PlotWidget(); VLayout->addWidget(m_plotWidget, 80); QWidget *controlTab = new QWidget(); controlTab->setLayout(VLayout); //AdvancedTab VLayout = new QVBoxLayout; m_printWidget = new PrintWidget(false); VLayout->addWidget(m_printWidget); m_commandWidget = new CommandWidget; VLayout->addWidget(m_commandWidget); m_logWidget = new LogWidget(new QTemporaryFile(QDir::tempPath() + QStringLiteral("/Atelier_"))); VLayout->addWidget(m_logWidget); m_advancedTab = new QWidget; m_advancedTab->setLayout(VLayout); m_sdWidget = new SdWidget; VLayout = new QVBoxLayout(); buildToolbar(); buildConnectionToolbar(); HLayout = new QHBoxLayout; HLayout->addWidget(m_toolBar); HLayout->addWidget(m_connectToolBar); HLayout->addWidget(m_connectButton); VLayout->addLayout(HLayout); m_toolBar->setHidden(true); m_tabWidget = new QTabWidget; m_tabWidget->addTab(controlTab, i18n("Controls")); m_tabWidget->addTab(m_advancedTab, i18n("Advanced")); m_tabWidget->addTab(m_sdWidget, i18n("Sd Card")); VLayout->addWidget(m_tabWidget); m_statusWidget = new StatusWidget(false); m_statusWidget->showPrintArea(false); VLayout->addWidget(m_statusWidget); setLayout(VLayout); enableControls(false); updateProfileData(); initConnectsToAtCore(); } AtCoreInstanceWidget::~AtCoreInstanceWidget() { m_core.closeConnection(); } void AtCoreInstanceWidget::buildToolbar() { m_toolBar = new QToolBar(); m_toolBar->setToolButtonStyle(Qt::ToolButtonTextBesideIcon); auto lb = new QLabel; QIcon icon = QIcon::fromTheme("go-home", QIcon(QString(":/%1/home").arg(m_theme))); lb->setPixmap(icon.pixmap(fontMetrics().height())); m_toolBar->addWidget(lb); lb = new QLabel(i18n("Home:")); m_toolBar->addWidget(lb); auto homeAll = new QAction(i18n("All")); connect(homeAll, &QAction::triggered, [this] { m_core.home(); }); m_toolBar->addAction(homeAll); for (auto homes : std::map {{"X", AtCore::X}, {"Y", AtCore::Y}, {"Z", AtCore::Z}}) { auto home = new QAction(homes.first); connect(home, &QAction::triggered, [this, homes] { m_core.home(homes.second); }); m_toolBar->addAction(home); } m_toolBar->addSeparator(); m_printAction = new QAction(QIcon::fromTheme("media-playback-start", style()->standardIcon(QStyle::SP_MediaPlay)), i18n("Print")); connect(m_printAction, &QAction::triggered, [this] { if (m_core.state() == AtCore::BUSY) { m_logWidget->appendLog(i18n("Pause Print")); pausePrint(); return; } if (m_core.state() == AtCore::IDLE) { print(); } else if (m_core.state() == AtCore::PAUSE) { m_logWidget->appendLog(i18n("Resume Print")); m_core.resume(); } }); m_toolBar->addAction(m_printAction); m_stopAction = new QAction(QIcon::fromTheme("media-playback-stop", QIcon(QString(":/%1/stop").arg(m_theme))), i18n("Stop")); connect(m_stopAction, &QAction::triggered, this, &AtCoreInstanceWidget::stopPrint); connect(m_stopAction, &QAction::triggered, [this] { m_printAction->setText(i18n("Print")); m_printAction->setIcon(QIcon::fromTheme("media-playback-start", QIcon(QString(":/%1/start").arg(m_theme)))); }); m_toolBar->addAction(m_stopAction); auto disableMotorsAction = new QAction(style()->standardIcon(QStyle::SP_MediaStop), i18n("Disable Motors")); connect(disableMotorsAction, &QAction::triggered, this, &AtCoreInstanceWidget::disableMotors); m_toolBar->addAction(disableMotorsAction); togglePrintButtons(m_fileCount); } void AtCoreInstanceWidget::buildConnectionToolbar() { m_connectToolBar = new QToolBar(); m_comboPort = new QComboBox; m_comboPort->setEditable(true); QLabel *deviceLabel = new QLabel(i18n("Device")); QHBoxLayout *deviceLayout = new QHBoxLayout; deviceLayout->addWidget(deviceLabel); deviceLayout->addWidget(m_comboPort, 100); m_comboProfile = new QComboBox; m_comboProfile->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); QHBoxLayout *profileLayout = new QHBoxLayout; QLabel *profileLabel = new QLabel(i18n("Profile")); profileLayout->addWidget(profileLabel); profileLayout->addWidget(m_comboProfile, 100); QHBoxLayout *connectLayout = new QHBoxLayout; connectLayout->addLayout(deviceLayout, 50); connectLayout->addLayout(profileLayout, 50); m_connectWidget = new QWidget(); m_connectWidget->setLayout(connectLayout); m_connectToolBar->addWidget(m_connectWidget); m_connectButton = new QPushButton(QIcon::fromTheme("network-connect", QIcon(QString(":/%1/connect").arg(m_theme))), i18n("Connect")); m_connectButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); connect(this, &AtCoreInstanceWidget::disableDisconnect, m_connectButton, &QPushButton::setDisabled); connect(m_connectButton, &QPushButton::clicked, this, &AtCoreInstanceWidget::connectButtonClicked); } void AtCoreInstanceWidget::connectButtonClicked() { if (m_core.state() == AtCore::DISCONNECTED) { if (m_comboProfile->currentText().isEmpty()) { QMessageBox::information( this , i18n("No Profiles!") , i18n("Connecting Requires creating a profile for your printer. Create a profile in the next dialog then try again.") ); emit(requestProfileDialog()); return; } if (m_comboPort->currentText().isEmpty()) { QMessageBox::critical( this , i18n("Error") , i18n("Please, connect a serial device to continue!") ); return; } //Get profile data before connecting. QString profile = m_comboProfile->currentText(); m_settings.beginGroup("Profiles"); m_settings.beginGroup(profile); QMap data; data["bps"] = m_settings.value(QStringLiteral("bps"), QStringLiteral("115200")); data["bedTemp"] = m_settings.value(QStringLiteral("maximumTemperatureBed"), QStringLiteral("0")); data["hotendTemp"] = m_settings.value(QStringLiteral("maximumTemperatureExtruder"), QStringLiteral("0")); data["firmware"] = m_settings.value(QStringLiteral("firmware"), QStringLiteral("Auto-Detect")); data["postPause"] = m_settings.value(QStringLiteral("postPause"), QStringLiteral("")); + data["heatedBed"] = m_settings.value(QStringLiteral("heatedBed"), true); data["name"] = profile; m_settings.endGroup(); m_settings.endGroup(); //then connect if (m_core.initSerial(m_comboPort->currentText(), data["bps"].toInt())) { - profileData = data; - QString fw = profileData["firmware"].toString(); + m_profileData = data; + QString fw = m_profileData["firmware"].toString(); m_logWidget->appendLog(i18n("Firmware: %1", fw)); if (fw != QString("Auto-Detect")) { m_core.loadFirmwarePlugin(fw); } - emit(connectionChanged(profileData["name"].toString())); - m_bedExtWidget->setBedMaxTemperature(profileData["bedTemp"].toInt()); - m_bedExtWidget->setExtruderMaxTemperature(profileData["hotendTemp"].toInt()); + emit(connectionChanged(m_profileData["name"].toString())); + m_profileData["heatedBed"].toBool() ? m_bedExtWidget->setBedMaxTemperature(m_profileData["bedTemp"].toInt()) : + m_bedExtWidget->setBedThermoHidden(true); + + m_bedExtWidget->setExtruderMaxTemperature(m_profileData["hotendTemp"].toInt()); //AddFan Support to profile m_printWidget->updateFanCount(2); } } else { m_core.closeConnection(); emit(connectionChanged(i18n("Connect a Printer"))); } } void AtCoreInstanceWidget::initConnectsToAtCore() { //connect log to atcoreMessages connect(&m_core, &AtCore::atcoreMessage, m_logWidget, &LogWidget::appendLog); m_core.setSerialTimerInterval(100); // Handle device changes connect(&m_core, &AtCore::portsChanged, this, &AtCoreInstanceWidget::updateSerialPort); // Handle AtCore status change connect(&m_core, &AtCore::stateChanged, this, &AtCoreInstanceWidget::handlePrinterStatusChanged); // If the number of extruders from the printer change, we need to update the radiobuttons on the widget connect(this, &AtCoreInstanceWidget::extruderCountChanged, m_bedExtWidget, &BedExtruderWidget::setExtruderCount); // Bed and Extruder temperatures management connect(m_bedExtWidget, &BedExtruderWidget::bedTemperatureChanged, &m_core, &AtCore::setBedTemp); connect(m_bedExtWidget, &BedExtruderWidget::extTemperatureChanged, &m_core, &AtCore::setExtruderTemp); // Connect AtCore temperatures changes on Atelier Plot connect(&m_core.temperature(), &Temperature::bedTemperatureChanged, [this](const float & temp) { checkTemperature(0x00, 0, temp); m_plotWidget->appendPoint(i18n("Actual Bed"), temp); m_plotWidget->update(); m_bedExtWidget->updateBedTemp(temp); }); connect(&m_core.temperature(), &Temperature::bedTargetTemperatureChanged, [this](const float & temp) { checkTemperature(0x01, 0, temp); m_plotWidget->appendPoint(i18n("Target Bed"), temp); m_plotWidget->update(); m_bedExtWidget->updateBedTargetTemp(temp); }); connect(&m_core.temperature(), &Temperature::extruderTemperatureChanged, [this](const float & temp) { checkTemperature(0x02, 0, temp); m_plotWidget->appendPoint(i18n("Actual Ext.1"), temp); m_plotWidget->update(); m_bedExtWidget->updateExtTemp(temp); }); connect(&m_core.temperature(), &Temperature::extruderTargetTemperatureChanged, [this](const float & temp) { checkTemperature(0x03, 0, temp); m_plotWidget->appendPoint(i18n("Target Ext.1"), temp); m_plotWidget->update(); m_bedExtWidget->updateExtTargetTemp(temp); }); //command Widget connect(m_commandWidget, &CommandWidget::commandPressed, [this](const QString & command) { m_logWidget->appendLog(i18n("Push: %1", command)); m_core.pushCommand(command); }); connect(m_commandWidget, &CommandWidget::messagePressed, [this](const QString & message) { m_logWidget->appendLog(i18n("Display: %1", message)); m_core.showMessage(message); }); // Fan, Flow and Speed management connect(m_printWidget, &PrintWidget::fanSpeedChanged, &m_core, &AtCore::setFanSpeed); connect(m_printWidget, &PrintWidget::flowRateChanged, &m_core, &AtCore::setFlowRate); connect(m_printWidget, &PrintWidget::printSpeedChanged, &m_core, &AtCore::setPrinterSpeed); //Movement Widget connect(m_movementWidget, &MovementWidget::absoluteMove, [this](const QLatin1Char & axis, const double value) { m_logWidget->appendLog(GCode::description(GCode::G1)); m_core.move(axis, value); }); connect(m_movementWidget, &MovementWidget::relativeMove, [this](const QLatin1Char & axis, const double value) { m_logWidget->appendLog(i18n("Relative Move: %1, %2", axis, QString::number(value))); m_core.setRelativePosition(); m_core.move(axis, value); m_core.setAbsolutePosition(); }); //Sd Card Stuff connect(&m_core, &AtCore::sdCardFileListChanged, m_sdWidget, &SdWidget::updateFilelist); connect(m_sdWidget, &SdWidget::requestSdList, &m_core, &AtCore::sdFileList); connect(&m_core, &AtCore::sdMountChanged, m_statusWidget, &StatusWidget::setSD); connect(m_sdWidget, &SdWidget::printSdFile, [this](const QString & fileName) { if (fileName.isEmpty()) { QMessageBox::information( this , i18n("Print Error") , i18n("You must Select a file from the list") ); } else { m_core.print(fileName, true); togglePrintButtons(true); } }); connect(m_sdWidget, &SdWidget::deleteSdFile, [this](const QString & fileName) { if (fileName.isEmpty()) { QMessageBox::information( this , i18n("Delete Error") , i18n("You must Select a file from the list") ); } else { m_core.sdDelete(fileName); } }); } void AtCoreInstanceWidget::printFile(const QUrl &fileName) { if (!fileName.isEmpty() && (m_core.state() == AtCore::IDLE)) { m_logWidget->appendLog(i18n("Printing:%1", fileName.toLocalFile())); m_core.print(fileName.toLocalFile()); } } void AtCoreInstanceWidget::print() { emit(requestFileChooser()); } void AtCoreInstanceWidget::pausePrint() { if (m_core.state() == AtCore::BUSY) { - m_core.pause(profileData["postPause"].toString()); + m_core.pause(m_profileData["postPause"].toString()); } else if (m_core.state() == AtCore::PAUSE) { m_core.resume(); } } void AtCoreInstanceWidget::stopPrint() { m_core.stop(); } void AtCoreInstanceWidget::disableMotors() { m_core.disableMotors(0); } void AtCoreInstanceWidget::handlePrinterStatusChanged(AtCore::STATES newState) { static QString stateString; switch (newState) { case AtCore::CONNECTING: { m_core.setSerialTimerInterval(0); m_connectButton->setText(i18n("Disconnect")); m_connectButton->setIcon(QIcon::fromTheme("network-disconnect", QIcon(QString(":/%1/disconnect").arg(m_theme)))); m_connectToolBar->setHidden(true); m_toolBar->setHidden(false); stateString = i18n("Connecting..."); m_logWidget->appendLog(i18n("Attempting to Connect")); connect(&m_core, &AtCore::receivedMessage, m_logWidget, &LogWidget::appendRLog); connect(m_core.serial(), &SerialLayer::pushedCommand, m_logWidget, &LogWidget::appendSLog); } break; case AtCore::IDLE: { stateString = i18n("Connected to %1", m_core.serial()->portName()); emit extruderCountChanged(m_core.extruderCount()); m_logWidget->appendLog(stateString); emit disableDisconnect(false); enableControls(true); } break; case AtCore::DISCONNECTED: { stateString = i18n("Not Connected"); disconnect(&m_core, &AtCore::receivedMessage, m_logWidget, &LogWidget::appendRLog); disconnect(m_core.serial(), &SerialLayer::pushedCommand, m_logWidget, &LogWidget::appendSLog); m_logWidget->appendLog(i18n("Serial disconnected")); m_core.setSerialTimerInterval(100); m_connectButton->setText(i18n("Connect")); m_connectButton->setIcon(QIcon::fromTheme("network-connect", QIcon(QString(":/%1/connect").arg(m_theme)))); m_connectToolBar->setHidden(false); m_toolBar->setHidden(true); enableControls(false); } break; case AtCore::STARTPRINT: { stateString = i18n("Starting Print"); m_statusWidget->showPrintArea(true); connect(&m_core, &AtCore::printProgressChanged, m_statusWidget, &StatusWidget::updatePrintProgress); } break; case AtCore::FINISHEDPRINT: { stateString = i18n("Finished Print"); m_statusWidget->showPrintArea(false); disconnect(&m_core, &AtCore::printProgressChanged, m_statusWidget, &StatusWidget::updatePrintProgress); m_printAction->setText(i18n("Print")); m_printAction->setIcon(QIcon::fromTheme("media-playback-start", QIcon(QString(":/%1/start").arg(m_theme)))); m_logWidget->appendLog(i18n("Finished Print Job")); } break; case AtCore::BUSY: { stateString = i18n("Printing"); emit disableDisconnect(true); m_printAction->setText(i18n("Pause")); m_printAction->setIcon(QIcon::fromTheme("media-playback-pause", QIcon(QString(":/%1/pause").arg(m_theme)))); } break; case AtCore::PAUSE: { stateString = i18n("Paused"); m_printAction->setText(i18n("Resume")); m_printAction->setIcon(QIcon::fromTheme("media-playback-start", QIcon(QString(":/%1/start").arg(m_theme)))); } break; case AtCore::STOP: { stateString = i18n("Stoping Print"); m_logWidget->appendLog(stateString); } break; case AtCore::ERRORSTATE: { stateString = i18n("Error"); } break; default: m_logWidget->appendLog(i18n("Unknown AtCore State, %1", newState)); qWarning("AtCore State not Recognized."); break; } m_statusWidget->setState(stateString); } void AtCoreInstanceWidget::checkTemperature(uint sensorType, uint number, uint temp) { static QString msg; switch (sensorType) { case 0x00: // bed msg = QString::fromLatin1("Bed Temperature "); break; case 0x01: // bed target msg = QString::fromLatin1("Bed Target Temperature "); break; case 0x02: // extruder msg = QString::fromLatin1("Extruder Temperature "); break; case 0x03: // extruder target msg = QString::fromLatin1("Extruder Target Temperature "); break; case 0x04: // enclosure msg = QString::fromLatin1("Enclosure Temperature "); break; case 0x05: // enclosure target msg = QString::fromLatin1("Enclosure Target Temperature "); break; } msg.append(QString::fromLatin1("[%1] : %2")); msg = msg.arg(QString::number(number)) .arg(QString::number(temp)); m_logWidget->appendLog(msg); } void AtCoreInstanceWidget::enableControls(bool b) { if (b) { layout()->removeWidget(m_logWidget); layout()->removeWidget(m_statusWidget); layout()->addWidget(m_statusWidget); m_advancedTab->layout()->addWidget(m_logWidget); } else { m_advancedTab->layout()->removeWidget(m_logWidget); layout()->addWidget(m_logWidget); layout()->removeWidget(m_statusWidget); layout()->addWidget(m_statusWidget); } m_tabWidget->setHidden(!b); m_toolBar->setEnabled(b); } bool AtCoreInstanceWidget::connected() { return (m_core.state() != AtCore::DISCONNECTED); } void AtCoreInstanceWidget::setFileCount(int count) { m_fileCount = count; togglePrintButtons(m_fileCount); } void AtCoreInstanceWidget::updateSerialPort(QStringList ports) { m_comboPort->clear(); //Remove any strings that match ttyS## from the port list. ports = ports.filter(QRegularExpression("^((?!ttyS\\d+).)*$")); if (!ports.isEmpty()) { m_comboPort->addItems(ports); m_logWidget->appendLog(i18n("Found %1 Ports", QString::number(ports.count()))); } else { QString portError(i18n("No available ports! Please connect a serial device to continue!")); if (!m_logWidget->endsWith(portError)) { m_logWidget->appendLog(portError); } } } void AtCoreInstanceWidget::updateProfileData() { m_settings.beginGroup("Profiles"); QStringList profiles = m_settings.childGroups(); m_settings.endGroup(); m_comboProfile->clear(); m_comboProfile->addItems(profiles); } void AtCoreInstanceWidget::togglePrintButtons(bool shown) { m_printAction->setVisible(shown); m_stopAction->setVisible(shown); } bool AtCoreInstanceWidget::isPrinting() { return (m_core.state() == AtCore::BUSY); } diff --git a/src/widgets/atcoreinstancewidget.h b/src/widgets/atcoreinstancewidget.h index 22bed0a..6e08c5f 100644 --- a/src/widgets/atcoreinstancewidget.h +++ b/src/widgets/atcoreinstancewidget.h @@ -1,101 +1,101 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2017> Author: Lays Rodrigues - lays.rodrigues@kde.org Chris Rizzitello - rizzitello@kde.org 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include "bedextruderwidget.h" /** * @todo write docs */ class AtCoreInstanceWidget : public QWidget { Q_OBJECT public: AtCoreInstanceWidget(QWidget *parent = nullptr); ~AtCoreInstanceWidget(); bool connected(); void setFileCount(int count); void startConnection(const QString &serialPort, const QMap &profile); public slots: bool isPrinting(); void printFile(const QUrl &fileName); void updateProfileData(); private: AtCore m_core; BedExtruderWidget *m_bedExtWidget; CommandWidget *m_commandWidget; int m_fileCount; LogWidget *m_logWidget; MovementWidget *m_movementWidget; PlotWidget *m_plotWidget; PrintWidget *m_printWidget; SdWidget *m_sdWidget; StatusWidget *m_statusWidget; QAction *m_printAction; QAction *m_stopAction; QComboBox *m_comboPort; QComboBox *m_comboProfile; - QMap profileData; + QMap m_profileData; QPushButton *m_connectButton; QSettings m_settings; QString m_theme; QTabWidget *m_tabWidget; QToolBar *m_connectToolBar; QToolBar *m_toolBar; QWidget *m_advancedTab; QWidget *m_connectWidget; void buildConnectionToolbar(); void buildToolbar(); void checkTemperature(uint sensorType, uint number, uint temp); void connectButtonClicked(); void disableMotors(); void enableControls(bool b); void handlePrinterStatusChanged(AtCore::STATES newState); void initConnectsToAtCore(); void stopPrint(); void pausePrint(); void print(); void updateSerialPort(QStringList ports); void togglePrintButtons(bool shown); signals: void connectionChanged(QString name); void disableDisconnect(bool b); void extruderCountChanged(int count); void requestProfileDialog(); void requestFileChooser(); }; diff --git a/src/widgets/bedextruderwidget.cpp b/src/widgets/bedextruderwidget.cpp index ce6ff54..058f009 100644 --- a/src/widgets/bedextruderwidget.cpp +++ b/src/widgets/bedextruderwidget.cpp @@ -1,125 +1,130 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2016> Author: Lays Rodrigues - lays.rodrigues@kde.org Tomaz Canabraza - tcanabrava@kde.org Chris Rizzitello - rizzitello@kde.org 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 "bedextruderwidget.h" #include "thermowidget.h" BedExtruderWidget::BedExtruderWidget(QWidget *parent) : QWidget(parent) , m_bedThermo(new ThermoWidget(this, QString(i18n("Bed")))) , m_extruderThermo(new ThermoWidget(this, QString(i18n("HotEnd")))) , m_extrudersLayout(new QHBoxLayout) , m_extruderBox(new QWidget(this)) { m_bedThermo->setScale(0, 150); m_extruderThermo->setScale(0, 250); m_extruderBox->setLayout(m_extrudersLayout); auto *label = new QLabel(i18n("Active Extruder:")); m_extrudersLayout->addWidget(label); - auto *layout = new QGridLayout; - layout->addWidget(m_extruderBox, 0, 0, 1, -1); - layout->addWidget(m_bedThermo, 1, 0); - layout->addWidget(m_extruderThermo, 1, 1); + auto *layout = new QHBoxLayout; + layout->addWidget(m_extruderBox); + layout->addWidget(m_bedThermo); + layout->addWidget(m_extruderThermo); 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); }); } 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; } void BedExtruderWidget::setBedMaxTemperature(int value) { m_bedThermo->setScale(0, value); } void BedExtruderWidget::setExtruderMaxTemperature(int value) { m_extruderThermo->setScale(0, value); } + +void BedExtruderWidget::setBedThermoHidden(bool hidden) +{ + m_bedThermo->setHidden(hidden); +} diff --git a/src/widgets/bedextruderwidget.h b/src/widgets/bedextruderwidget.h index c748286..08b5425 100644 --- a/src/widgets/bedextruderwidget.h +++ b/src/widgets/bedextruderwidget.h @@ -1,55 +1,56 @@ /* Atelier KDE Printer Host for 3D Printing Copyright (C) <2016> Author: Lays Rodrigues - lays.rodrigues@kde.org Tomaz Canabraza - tcanabrava@kde.org Chris Rizzitello - rizzitello@kde.org 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 #include #include class ThermoWidget; class BedExtruderWidget : public QWidget { Q_OBJECT public: explicit BedExtruderWidget(QWidget *parent = nullptr); void setExtruderCount(int value); void setBedMaxTemperature(int value); void setExtruderMaxTemperature(int value); void updateBedTemp(const float temp); void updateExtTemp(const float temp); void updateBedTargetTemp(const float temp); void updateExtTargetTemp(const float temp); + void setBedThermoHidden(bool hidden); private: int m_extruderCount = 0; ThermoWidget *m_bedThermo = nullptr; ThermoWidget *m_extruderThermo = nullptr; QMap extruderMap; QHBoxLayout *m_extrudersLayout = nullptr; QWidget *m_extruderBox = nullptr; int currentExtruder(); signals: void bedTemperatureChanged(int tmp, bool andWait); void extTemperatureChanged(int tmp, int currExt, bool andWait); };