diff --git a/src/dialogs/profilesdialog.h b/src/dialogs/profilesdialog.h --- a/src/dialogs/profilesdialog.h +++ b/src/dialogs/profilesdialog.h @@ -1,7 +1,7 @@ /* 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 @@ -16,7 +16,7 @@ along with this program. If not, see . */ #pragma once - +#include #include #include @@ -36,12 +36,17 @@ private: Ui::ProfilesDialog *ui; QSettings m_settings; - QStringList detectFWPlugins() const; - void accept(); + void askToSave(); + void buttonBoxClicked(QAbstractButton *btn); + QStringList detectFWPlugins(); + QStringList firmwaresInPath(const QString &path); void loadSettings(const QString ¤tProfile = QString()); void removeProfile(); + void save(); void saveSettings(); void updateCBProfiles(); + void setModified(bool modified); + bool m_modified; signals: void updateProfiles(); diff --git a/src/dialogs/profilesdialog.cpp b/src/dialogs/profilesdialog.cpp --- a/src/dialogs/profilesdialog.cpp +++ b/src/dialogs/profilesdialog.cpp @@ -16,47 +16,31 @@ 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" -//Do not include for windows/mac os -#ifndef Q_OS_WIN -#ifndef Q_OS_MAC -#include -#endif -#endif - 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] { + askToSave(); loadSettings(); }); updateCBProfiles(); - connect(ui->buttonBox, &QDialogButtonBox::clicked, [this](QAbstractButton * btn) { - switch (ui->buttonBox->buttonRole(btn)) { - case QDialogButtonBox::ResetRole: - loadSettings(); - break; - case QDialogButtonBox::RejectRole: - close(); - break; - default: - break; - } - }); - + connect(ui->buttonBox, &QDialogButtonBox::clicked, this, &ProfilesDialog::buttonBoxClicked); connect(ui->heatedBedCK, &QCheckBox::clicked, [this](const bool & status) { ui->bedTempSB->setEnabled(status); }); @@ -77,23 +61,54 @@ #else ui->removeProfilePB->setIcon(style()->standardIcon(QStyle::SP_TrashIcon)); #endif +//if any control is modifed and no load / save has happend 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(); - QString currentProfile = ui->profileCB->currentText(); - if (groups.contains(currentProfile)) { - int ret = QMessageBox::information( + if (groups.contains(ui->profileCB->currentText())) { + int ret = QMessageBox::warning( this - , i18n("Save?") + , i18n("Overwrite Profile?") , i18n("A profile with this name already exists. \n Are you sure you want to overwrite it?") , QMessageBox::Save , QMessageBox::Cancel @@ -103,6 +118,12 @@ 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); @@ -130,6 +151,7 @@ m_settings.endGroup(); //Load new profile + setModified(false); updateCBProfiles(); loadSettings(currentProfile); emit updateProfiles(); @@ -172,6 +194,7 @@ ui->postPauseLE->setText(m_settings.value(QStringLiteral("postPause"), QStringLiteral("")).toString()); m_settings.endGroup(); m_settings.endGroup(); + setModified(false); } @@ -187,11 +210,6 @@ ui->profileCB->addItems(groups); } -void ProfilesDialog::accept() -{ - saveSettings(); -} - void ProfilesDialog::removeProfile() { QString currentProfile = ui->profileCB->currentText(); @@ -204,41 +222,64 @@ updateCBProfiles(); } -QStringList ProfilesDialog::detectFWPlugins() const +QStringList ProfilesDialog::detectFWPlugins() { - //Path used if for windows/ mac os only. - QDir pluginDir(qApp->applicationDirPath() + QStringLiteral("/plugins")); - -#if defined(Q_OS_WIN) - pluginDir.setNameFilters(QStringList() << "*.dll"); - -#elif defined(Q_OS_MAC) - pluginDir.setNameFilters(QStringList() << "*.dylib"); - -#else //Not Windows || Not MAC - QStringList pathList = AtCoreDirectories::pluginDir; - pathList.append(QLibraryInfo::location(QLibraryInfo::PluginsPath) + QStringLiteral("/AtCore")); - - for (const auto &path : pathList) { - if (QDir(path).exists()) { + QStringList firmwares; + QStringList paths = AtCoreDirectories::pluginDir; + paths.prepend(qApp->applicationDirPath() + QStringLiteral("/plugins")); + for (const QString &path : paths) { + firmwares = firmwaresInPath(path); + if (!firmwares.isEmpty()) { //use path where plugins were detected. - pluginDir = QDir(path); break; } } - pluginDir.setNameFilters(QStringList() << "*.so"); -#endif + return firmwares; +} +QStringList ProfilesDialog::firmwaresInPath(const QString &path) +{ QStringList firmwares; - QStringList files = pluginDir.entryList(QDir::Files); - foreach (const QString &f, files) { + QStringList files = QDir(path).entryList(QDir::Files); + for (const QString &f : files) { QString file = f; - file = file.split(QChar::fromLatin1('.')).at(0); +#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(); + } + } +} diff --git a/src/dialogs/profilesdialog.ui b/src/dialogs/profilesdialog.ui --- a/src/dialogs/profilesdialog.ui +++ b/src/dialogs/profilesdialog.ui @@ -374,38 +374,4 @@ buttonBox - - - buttonBox - accepted() - ProfilesDialog - accept() - - - 248 - 254 - - - 157 - 274 - - - - - buttonBox - rejected() - ProfilesDialog - reject() - - - 316 - 260 - - - 286 - 274 - - - -