diff --git a/src/dialogs/profilesdialog.cpp b/src/dialogs/profilesdialog.cpp
index 6fdb266..7a1769e 100644
--- a/src/dialogs/profilesdialog.cpp
+++ b/src/dialogs/profilesdialog.cpp
@@ -1,281 +1,282 @@
/* Atelier KDE Printer Host for 3D Printing
Copyright (C) <2016>
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 "profilesdialog.h"
#include "ui_profilesdialog.h"
ProfilesDialog::ProfilesDialog(QWidget *parent) :
QDialog(parent)
, ui(new Ui::ProfilesDialog)
, m_modified(false)
{
ui->setupUi(this);
ui->firmwareCB->addItem(QStringLiteral("Auto-Detect"));
ui->firmwareCB->addItems(detectFWPlugins());
ui->baudCB->addItems(SERIAL::BAUDS);
ui->baudCB->setCurrentText(QLatin1String("115200"));
ui->profileCB->setAutoCompletion(true);
connect(ui->profileCB, static_cast(&QComboBox::currentIndexChanged), this, [this] {
askToSave();
loadSettings();
});
updateCBProfiles();
connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &ProfilesDialog::buttonBoxClicked);
connect(ui->heatedBedCK, &QCheckBox::clicked, this, [this](const bool & status) {
ui->bedTempSB->setEnabled(status);
});
connect(ui->cartesianRB, &QRadioButton::clicked, this, [this] {
ui->printerTypeStack->setCurrentIndex(1);
});
connect(ui->deltaRB, &QRadioButton::clicked, this, [this] {
ui->printerTypeStack->setCurrentIndex(0);
});
connect(ui->removeProfilePB, &QPushButton::clicked, this, &ProfilesDialog::removeProfile);
ui->removeProfilePB->setIcon(QIcon::fromTheme(QStringLiteral("edit-delete"), style()->standardIcon(QStyle::SP_TrashIcon)));
//if any control is modified and no load / save has happened contents are not saved.
auto modify = [this] {setModified(true);};
connect(ui->baudCB, &QComboBox::currentTextChanged, modify);
connect(ui->radiusSB, &QSpinBox::editingFinished, modify);
connect(ui->z_delta_dimensionSB, &QSpinBox::editingFinished, modify);
connect(ui->x_dimensionSB, &QSpinBox::editingFinished, modify);
connect(ui->y_dimensionSB, &QSpinBox::editingFinished, modify);
connect(ui->z_dimensionSB, &QSpinBox::editingFinished, modify);
connect(ui->heatedBedCK, &QCheckBox::stateChanged, modify);
connect(ui->bedTempSB, &QSpinBox::editingFinished, modify);
connect(ui->extruderTempSB, &QSpinBox::editingFinished, modify);
connect(ui->postPauseLE, &QLineEdit::editingFinished, modify);
connect(ui->firmwareCB, &QComboBox::currentTextChanged, modify);
}
ProfilesDialog::~ProfilesDialog()
{
delete ui;
}
void ProfilesDialog::buttonBoxClicked(QAbstractButton *btn)
{
switch (ui->buttonBox->buttonRole(btn)) {
case QDialogButtonBox::ResetRole:
askToSave();
loadSettings();
break;
case QDialogButtonBox::RejectRole:
askToSave();
close();
break;
case QDialogButtonBox::AcceptRole:
saveSettings();
break;
default:
break;
}
}
void ProfilesDialog::saveSettings()
{
m_settings.beginGroup(QStringLiteral("Profiles"));
QStringList groups = m_settings.childGroups();
m_settings.endGroup();
if (groups.contains(ui->profileCB->currentText())) {
int ret = QMessageBox::warning(
this
, i18n("Overwrite Profile?")
, i18n("A profile with this name already exists. \n Are you sure you want to overwrite it?")
, QMessageBox::Save
, QMessageBox::Cancel
);
if (ret == QMessageBox::Cancel) {
return;
}
}
save();
}
void ProfilesDialog::save()
{
QString currentProfile = ui->profileCB->currentText();
//Add indent to better view of the data
m_settings.beginGroup(QStringLiteral("Profiles"));
m_settings.beginGroup(currentProfile);
//BED
if (ui->cartesianRB->isChecked()) {
m_settings.setValue(QStringLiteral("isCartesian"), true);
m_settings.setValue(QStringLiteral("dimensionX"), ui->x_dimensionSB->value());
m_settings.setValue(QStringLiteral("dimensionY"), ui->y_dimensionSB->value());
m_settings.setValue(QStringLiteral("dimensionZ"), ui->z_dimensionSB->value());
} else {
m_settings.setValue(QStringLiteral("isCartesian"), false);
m_settings.setValue(QStringLiteral("radius"), ui->radiusSB->value());
m_settings.setValue(QStringLiteral("z_delta_dimension"), ui->z_delta_dimensionSB->value());
}
m_settings.setValue(QStringLiteral("heatedBed"), ui->heatedBedCK->isChecked());
m_settings.setValue(QStringLiteral("maximumTemperatureBed"), ui->bedTempSB->value());
//HOTEND
m_settings.setValue(QStringLiteral("maximumTemperatureExtruder"), ui->extruderTempSB->value());
//Baud
m_settings.setValue(QStringLiteral("bps"), ui->baudCB->currentText());
m_settings.setValue(QStringLiteral("firmware"), ui->firmwareCB->currentText());
m_settings.setValue(QStringLiteral("postPause"), ui->postPauseLE->text());
m_settings.endGroup();
m_settings.endGroup();
//Load new profile
setModified(false);
updateCBProfiles();
loadSettings(currentProfile);
emit updateProfiles();
}
void ProfilesDialog::loadSettings(const QString ¤tProfile)
{
m_settings.beginGroup(QStringLiteral("Profiles"));
const QString profileName = currentProfile.isEmpty() ? ui->profileCB ->currentText() : currentProfile;
ui->profileCB->setCurrentText(profileName);
m_settings.beginGroup(profileName);
//BED
if (m_settings.value(QStringLiteral("isCartesian")).toBool()) {
ui->printerTypeStack->setCurrentIndex(1);
ui->cartesianRB->setChecked(true);
ui->deltaRB->setChecked(false);
ui->x_dimensionSB->setValue(m_settings.value(QStringLiteral("dimensionX"), QStringLiteral("0")).toInt());
ui->y_dimensionSB->setValue(m_settings.value(QStringLiteral("dimensionY"), QStringLiteral("0")).toInt());
ui->z_dimensionSB->setValue(m_settings.value(QStringLiteral("dimensionZ"), QStringLiteral("0")).toInt());
} else {
ui->printerTypeStack->setCurrentIndex(0);
ui->deltaRB->setChecked(true);
ui->cartesianRB->setChecked(false);
ui->radiusSB->setValue(m_settings.value(QStringLiteral("radius"), QStringLiteral("0")).toInt());
ui->z_delta_dimensionSB->setValue(m_settings.value(QStringLiteral("z_delta_dimension"), QStringLiteral("0")).toInt());
}
ui->heatedBedCK->setChecked(m_settings.value(QStringLiteral("heatedBed"), QStringLiteral("true")).toBool());
ui->bedTempSB->setEnabled(ui->heatedBedCK->isChecked());
ui->bedTempSB->setValue(m_settings.value(QStringLiteral("maximumTemperatureBed"), QStringLiteral("0")).toInt());
//HOTEND
ui->extruderTempSB->setValue(m_settings.value(QStringLiteral("maximumTemperatureExtruder"), QStringLiteral("0")).toInt());
//Baud
ui->baudCB->setCurrentText(m_settings.value(QStringLiteral("bps"), QStringLiteral("115200")).toString());
ui->firmwareCB->setCurrentText(m_settings.value(QStringLiteral("firmware"), QStringLiteral("Auto-Detect")).toString());
- ui->postPauseLE->setText(m_settings.value(QStringLiteral("postPause"), QStringLiteral("")).toString());
+ ui->postPauseLE->setText(m_settings.value(QStringLiteral("postPause"), QString()).toString());
m_settings.endGroup();
m_settings.endGroup();
setModified(false);
}
void ProfilesDialog::updateCBProfiles()
{
m_settings.beginGroup(QStringLiteral("Profiles"));
QStringList groups = m_settings.childGroups();
m_settings.endGroup();
if (groups.isEmpty()) {
ui->printerTypeStack->setCurrentIndex(1);
}
ui->profileCB->clear();
ui->profileCB->addItems(groups);
}
void ProfilesDialog::removeProfile()
{
QString currentProfile = ui->profileCB->currentText();
m_settings.beginGroup(QStringLiteral("Profiles"));
m_settings.beginGroup(currentProfile);
m_settings.remove("");
m_settings.endGroup();
m_settings.remove(currentProfile);
m_settings.endGroup();
updateCBProfiles();
}
QStringList ProfilesDialog::detectFWPlugins()
{
QStringList firmwares;
QStringList paths = AtCoreDirectories::pluginDir;
//Add our runtime paths
- paths.prepend(qApp->applicationDirPath() + QStringLiteral("/../Plugins/AtCore"));
- paths.prepend(qApp->applicationDirPath() + QStringLiteral("/AtCore"));
- paths.prepend(qApp->applicationDirPath() + QStringLiteral("/plugins"));
- for (const QString &path : paths) {
+ const QString &path(qApp->applicationDirPath());
+ paths.prepend(path + QStringLiteral("/../Plugins/AtCore"));
+ paths.prepend(path + QStringLiteral("/AtCore"));
+ paths.prepend(path + QStringLiteral("/plugins"));
+ for (const QString &path : qAsConst(paths)) {
firmwares = firmwaresInPath(path);
if (!firmwares.isEmpty()) {
//use path where plugins were detected.
break;
}
}
return firmwares;
}
QStringList ProfilesDialog::firmwaresInPath(const QString &path)
{
QStringList firmwares;
QStringList files = QDir(path).entryList(QDir::Files);
for (const QString &f : files) {
QString file = f;
#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;
}
void ProfilesDialog::setModified(bool modified)
{
m_modified = modified;
}
void ProfilesDialog::askToSave()
{
if (m_modified) {
int ret = QMessageBox::question(
this
, i18n("Save?")
, i18n("This Profile has been modified, Would you like to Save it?")
, QMessageBox::Save
, QMessageBox::No
);
if (ret == QMessageBox::Save) {
save();
}
}
}