diff --git a/src/widgets/profilemanager.cpp b/src/widgets/profilemanager.cpp index 65371a5..1ce7d17 100644 --- a/src/widgets/profilemanager.cpp +++ b/src/widgets/profilemanager.cpp @@ -1,336 +1,339 @@ /* AtCore - Widgets Copyright (C) <2019> Author: 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 "profilemanager.h" #include "atcore_default_folders.h" #include "machineinfo.h" +#include +#include #include #include -#include -#include #include -#include +#include +#include ProfileManager::ProfileManager(QWidget *parent) : QWidget(parent) { auto newLabel = new QLabel(tr("Profile:")); cbProfile = new QComboBox(); cbProfile->setEditable(true); - cbProfile->setAutoCompletion(true); cbProfile->addItems(MachineInfo::instance()->profileNames()); + cbProfile->setCompleter(new QCompleter(MachineInfo::instance()->profileNames())); connect(MachineInfo::instance(), &MachineInfo::profilesChanged, this, [this] { int index = cbProfile->currentIndex(); cbProfile->clear(); + cbProfile->completer()->deleteLater(); cbProfile->addItems(MachineInfo::instance()->profileNames()); + cbProfile->setCompleter(new QCompleter(MachineInfo::instance()->profileNames())); cbProfile->setCurrentIndex(std::min(index, cbProfile->count() - 1)); }); connect(cbProfile, QOverload::of(&QComboBox::currentIndexChanged), this, [this] { if (MachineInfo::instance()->profileNames().contains(cbProfile->currentText())) { loadProfile(cbProfile->currentText()); } }); connect(cbProfile->lineEdit(), &QLineEdit::editingFinished, this, &ProfileManager::onCbProfileEditingFinished); auto newHLayout = new QHBoxLayout(); newHLayout->addWidget(newLabel); newHLayout->addWidget(cbProfile, 75); auto newButton = new QToolButton(); newButton->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete"), style()->standardIcon(QStyle::SP_DialogDiscardButton))); newButton->setToolTip(tr("Delete Current Profile")); newButton->setIconSize(QSize(fontMetrics().height(), fontMetrics().height())); connect(newButton, &QToolButton::clicked, this, [this] { if (!cbProfile->currentText().isEmpty()) { MachineInfo::instance()->removeProfile(cbProfile->currentText()); } }); auto mainLayout = new QVBoxLayout(); newHLayout->addWidget(newButton); mainLayout->addLayout(newHLayout); auto profileLayout = new QVBoxLayout(); auto boxLayout = new QVBoxLayout(); newLabel = new QLabel(tr("Name")); lineName = new QLineEdit(); connect(lineName, &QLineEdit::editingFinished, this, [this] { QString itemName = lineName->text(); if (MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::NAME, itemName)) { loadProfile(itemName); } }); newHLayout = new QHBoxLayout; newHLayout->addWidget(newLabel); newHLayout->addWidget(lineName); profileLayout->addLayout(newHLayout); newLabel = new QLabel(tr("Printer Type:")); radioDelta = new QRadioButton(tr("Delta")); radioCartesian = new QRadioButton(tr("Cartesian")); radioCartesian->setChecked(true); connect(radioCartesian, &QRadioButton::toggled, this, &ProfileManager::onRadioCartesianToggled); newHLayout = new QHBoxLayout; newHLayout->addWidget(newLabel); newHLayout->addWidget(radioCartesian); newHLayout->addWidget(radioDelta); boxLayout->addLayout(newHLayout); lblX = new QLabel(tr("Maximum X")); sbMaxX = new QSpinBox(); sbMaxX->setMaximum(std::numeric_limits::max()); sbMaxX->setSuffix(QStringLiteral("mm")); connect(sbMaxX, QOverload::of(&QSpinBox::valueChanged), this, [this](int value) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::XMAX, value); }); newHLayout = new QHBoxLayout; newHLayout->addWidget(lblX); newHLayout->addWidget(sbMaxX); boxLayout->addLayout(newHLayout); newLabel = new QLabel(tr("Maximum Y")); sbMaxY = new QSpinBox(); sbMaxY->setMaximum(std::numeric_limits::max()); sbMaxY->setSuffix(QStringLiteral("mm")); connect(sbMaxY, QOverload::of(&QSpinBox::valueChanged), this, [this](int value) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::YMAX, value); }); newHLayout = new QHBoxLayout; newHLayout->setContentsMargins(0, 0, 0, 0); newHLayout->addWidget(newLabel); newHLayout->addWidget(sbMaxY); axisY = new QWidget(this); axisY->setLayout(newHLayout); boxLayout->addWidget(axisY); lblZ = new QLabel(tr("Maximum Z")); sbMaxZ = new QSpinBox(); sbMaxZ->setMaximum(std::numeric_limits::max()); sbMaxZ->setSuffix(QStringLiteral("mm")); connect(sbMaxZ, QOverload::of(&QSpinBox::valueChanged), this, [this](int value) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::ZMAX, value); }); newHLayout = new QHBoxLayout; newHLayout->addWidget(lblZ); newHLayout->addWidget(sbMaxZ); boxLayout->addLayout(newHLayout); auto groupBox = new QGroupBox(tr("Mechanics")); groupBox->setLayout(boxLayout); profileLayout->addWidget(groupBox); boxLayout = new QVBoxLayout; newLabel = new QLabel(tr("Bed Maximum")); sbMaxBedTemp = new QSpinBox(); sbMaxBedTemp->setMaximum(999); sbMaxBedTemp->setSuffix(QStringLiteral(" ºC")); connect(sbMaxBedTemp, QOverload::of(&QSpinBox::valueChanged), this, [this](int value) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::MAXBEDTEMP, value); }); newHLayout = new QHBoxLayout; newHLayout->addWidget(newLabel); newHLayout->addWidget(sbMaxBedTemp); boxLayout->addLayout(newHLayout); sbMaxExtTemp = new QSpinBox(); sbMaxExtTemp->setMaximum(999); newLabel = new QLabel(tr("Extruder Maximum")); sbMaxExtTemp->setSuffix(QStringLiteral(" ºC")); connect(sbMaxExtTemp, QOverload::of(&QSpinBox::valueChanged), this, [this](int value) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::MAXEXTTEMP, value); }); newHLayout = new QHBoxLayout(); newHLayout->addWidget(newLabel); newHLayout->addWidget(sbMaxExtTemp); boxLayout->addLayout(newHLayout); checkAutoTempReport = new QCheckBox(tr("Auto Temperature Report")); checkAutoTempReport->setLayoutDirection(Qt::RightToLeft); connect(checkAutoTempReport, &QCheckBox::toggled, this, [this](bool checked) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::AUTOTEMPREPORT, checked); }); boxLayout->addWidget(checkAutoTempReport, 0, Qt::AlignRight); groupBox = new QGroupBox(tr("Temperature")); groupBox->setLayout(boxLayout); profileLayout->addWidget(groupBox); boxLayout = new QVBoxLayout(); cbBaud = new QComboBox(); cbBaud->addItems(SERIAL::BAUDS); cbBaud->setCurrentText(QStringLiteral("115200")); connect(cbBaud, &QComboBox::currentTextChanged, this, [this](const QString & newText) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::BAUDRATE, newText); }); newLabel = new QLabel(tr("Bit Rate")); newHLayout = new QHBoxLayout(); newHLayout->addWidget(newLabel); newHLayout->addWidget(cbBaud); boxLayout->addLayout(newHLayout); newLabel = new QLabel(tr("Firmware")); cbFirmware = new QComboBox(); cbFirmware->addItem(QStringLiteral("Auto-Detect")); cbFirmware->addItems(detectFWPlugins()); connect(cbFirmware, &QComboBox::currentTextChanged, this, [this](const QString & newText) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::FIRMWARE, newText); }); newHLayout = new QHBoxLayout(); newHLayout->addWidget(newLabel); newHLayout->addWidget(cbFirmware); boxLayout->addLayout(newHLayout); linePostPause = new QLineEdit(); connect(linePostPause, &QLineEdit::editingFinished, this, [this] { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::POSTPAUSE, linePostPause->text()); }); newLabel = new QLabel(tr("PostPause")); newHLayout = new QHBoxLayout(); newHLayout->addWidget(newLabel); newHLayout->addWidget(linePostPause); boxLayout->addLayout(newHLayout); groupBox = new QGroupBox(tr("Advanced")); groupBox->setLayout(boxLayout); profileLayout->addWidget(groupBox); groupBox = new QGroupBox(tr("Profile")); groupBox->setLayout(profileLayout); mainLayout->addWidget(groupBox); setLayout(mainLayout); loadProfile(cbProfile->currentText()); } void ProfileManager::onCbProfileEditingFinished() { if (MachineInfo::instance()->profileNames().contains(cbProfile->currentText())) { loadProfile(cbProfile->currentText()); return; } QMap newProfile = { {MachineInfo::KEY::NAME, cbProfile->currentText()}, {MachineInfo::KEY::FIRMWARE, cbFirmware->currentText()}, {MachineInfo::KEY::BAUDRATE, cbBaud->currentText()}, {MachineInfo::KEY::POSTPAUSE, linePostPause->text()}, {MachineInfo::KEY::ISCARTESIAN, radioCartesian->isChecked()}, {MachineInfo::KEY::XMAX, sbMaxX->value()}, {MachineInfo::KEY::YMAX, sbMaxY->value()}, {MachineInfo::KEY::ZMAX, sbMaxZ->value()}, {MachineInfo::KEY::AUTOTEMPREPORT, checkAutoTempReport->isChecked()}, {MachineInfo::KEY::MAXBEDTEMP, sbMaxBedTemp->value()}, {MachineInfo::KEY::MAXEXTTEMP, sbMaxExtTemp->value()} }; MachineInfo::instance()->storeProfile(newProfile); loadProfile(newProfile[MachineInfo::KEY::NAME].toString()); } void ProfileManager::onRadioCartesianToggled(bool checked) { axisY->setVisible(checked); if (checked) { lblX->setText(tr("Maximum X")); lblZ->setText(tr("Maximum Z")); } else { lblX->setText(tr("Radius")); lblZ->setText(tr("Height")); } if (MachineInfo::instance()->profileNames().contains(cbProfile->currentText())) { MachineInfo::instance()->storeKey(cbProfile->currentText(), MachineInfo::KEY::ISCARTESIAN, checked); } } void ProfileManager::loadProfile(const QString &profileName) { if (profileName.isEmpty()) { return; } blockSignals(true); lineName->setText(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::NAME).toString()); radioCartesian->setChecked(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::ISCARTESIAN).toBool()); radioDelta->setChecked(!MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::ISCARTESIAN).toBool()); sbMaxX->setValue(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::XMAX).toInt()); sbMaxY->setValue(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::YMAX).toInt()); sbMaxZ->setValue(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::ZMAX).toInt()); checkAutoTempReport->setChecked(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::AUTOTEMPREPORT).toBool()); sbMaxBedTemp->setValue(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::MAXBEDTEMP).toInt()); sbMaxExtTemp->setValue(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::MAXEXTTEMP).toInt()); cbFirmware->setCurrentText(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::FIRMWARE).toString()); cbBaud->setCurrentText(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::BAUDRATE).toString()); linePostPause->setText(MachineInfo::instance()->readKey(profileName, MachineInfo::KEY::POSTPAUSE).toString()); cbProfile->setCurrentText(profileName); cbProfile->setCurrentIndex(MachineInfo::instance()->profileNames().indexOf(profileName)); blockSignals(false); } QStringList ProfileManager::detectFWPlugins() { QStringList firmwares; QStringList paths = AtCoreDirectories::pluginDir; //Add our runtime paths const QString &p(qApp->applicationDirPath()); paths.prepend(p + QStringLiteral("/../Plugins/AtCore")); paths.prepend(p + QStringLiteral("/AtCore")); paths.prepend(p + QStringLiteral("/plugins")); for (const QString &path : qAsConst(paths)) { firmwares = firmwaresInPath(path); if (!firmwares.isEmpty()) { //use path where plugins were detected. break; } } return firmwares; } QStringList ProfileManager::firmwaresInPath(const QString &path) { QStringList firmwares; QStringList files = QDir(path).entryList(QDir::Files); for (QString file : files) { #if defined(Q_OS_WIN) if (file.endsWith(QStringLiteral(".dll"))) #elif defined(Q_OS_MAC) if (file.endsWith(QStringLiteral(".dylib"))) #else if (file.endsWith(QStringLiteral(".so"))) #endif file = file.split(QChar::fromLatin1('.')).at(0); else { continue; } if (file.startsWith(QStringLiteral("lib"))) { file = file.remove(QStringLiteral("lib")); } file = file.toLower().simplified(); firmwares.append(file); } return firmwares; }