diff --git a/CMakeLists.txt b/CMakeLists.txt index 21d9b91..89cfde6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -32,6 +32,7 @@ if(${QT_VERSION_MAJOR} GREATER_EQUAL 6) dialogs/abstractdialog.h dialogs/abstractdialog.cpp dialogs/newitemdialog.h dialogs/newitemdialog.cpp dialogs/edititemdialog.h dialogs/edititemdialog.cpp + dialogs/settingsdialog.h dialogs/settingsdialog.cpp views/itemdetailmapper.h views/itemdetailmapper.cpp ) # Define target properties for Android with Qt 6 as: diff --git a/dialogs/settingsdialog.cpp b/dialogs/settingsdialog.cpp new file mode 100644 index 0000000..0f92986 --- /dev/null +++ b/dialogs/settingsdialog.cpp @@ -0,0 +1,61 @@ +#include "settingsdialog.h" + +#include +#include +#include +#include +#include + +SettingsDialog::SettingsDialog(QWidget* parent) + : AbstractDialog(QDialogButtonBox::Ok | QDialogButtonBox::Cancel, parent) {} + +void SettingsDialog::createContent() { + if (m_contentContainer) { + delete m_contentContainer; + } + + const QString dialogTitle = tr("Settings - "); + const QString applicationName = QCoreApplication::applicationName(); + + setWindowTitle(dialogTitle + applicationName); + setModal(true); + setGeometry(0, 0, 350, 250); + QGridLayout* serverLayout = new QGridLayout(); + QLabel* urlLabel = new QLabel("Server URL:"); + m_urlEdit = new QLineEdit(); + serverLayout->addWidget(urlLabel, 0, 0); + serverLayout->addWidget(m_urlEdit, 0, 1); + QLabel* emailLabel = new QLabel("Email:"); + m_emailEdit = new QLineEdit(); + serverLayout->addWidget(emailLabel, 1, 0); + serverLayout->addWidget(m_emailEdit, 1, 1); + QLabel* passwordLabel = new QLabel("Password:"); + m_passwordEdit = new QLineEdit(); + m_passwordEdit->setEchoMode(QLineEdit::Password); + serverLayout->addWidget(passwordLabel, 2, 0); + serverLayout->addWidget(m_passwordEdit, 2, 1); + + QWidget* serverTab = new QWidget(); + serverTab->setLayout(serverLayout); + + QTabWidget* widget = new QTabWidget(); + widget->addTab(serverTab, "Server"); + + m_contentContainer = widget; + m_outerLayout->insertWidget(0, m_contentContainer); +} + +void SettingsDialog::fillContent(const QVariantMap& settings) { + m_urlEdit->setText(settings.value("url").toString()); + m_emailEdit->setText(settings.value("email").toString()); + m_passwordEdit->setText(settings.value("password").toString()); +} + +QVariantMap SettingsDialog::getSettings() const { + QVariantMap result; + result.insert("url", m_urlEdit->text()); + result.insert("email", m_emailEdit->text()); + result.insert("password", m_passwordEdit->text()); + + return result; +} diff --git a/dialogs/settingsdialog.h b/dialogs/settingsdialog.h new file mode 100644 index 0000000..ec787cf --- /dev/null +++ b/dialogs/settingsdialog.h @@ -0,0 +1,23 @@ +#ifndef SETTINGSDIALOG_H +#define SETTINGSDIALOG_H + +#include "abstractdialog.h" + +class QLineEdit; + +class SettingsDialog : public AbstractDialog { + Q_OBJECT + public: + SettingsDialog(QWidget* parent = nullptr); + + void createContent() override; + void fillContent(const QVariantMap& settings); + QVariantMap getSettings() const; + + private: + QLineEdit* m_urlEdit = nullptr; + QLineEdit* m_emailEdit = nullptr; + QLineEdit* m_passwordEdit = nullptr; +}; + +#endif // SETTINGSDIALOG_H diff --git a/mainwindow.cpp b/mainwindow.cpp index dbdf28e..2135b6f 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -12,6 +12,7 @@ #include "../../ApplicationConfig.h" #include "dialogs/edititemdialog.h" #include "dialogs/newitemdialog.h" +#include "dialogs/settingsdialog.h" #include "genericcore.h" #include "model/generalsortfiltermodel.h" #include "model/tablemodel.h" @@ -315,12 +316,37 @@ void MainWindow::deleteItem() { emit m_core->deleteItemFromServer(currentId); } +void MainWindow::execSettingsDialog() { + showStatusMessage(tr("Invoked 'Tools|Settings'")); + QVariantMap oldSettings = m_core->getSettings("Server"); + // SettingsDialog* settingsDialog = new SettingsDialog(settingMap, this); + SettingsDialog* settingsDialog = new SettingsDialog(this); + settingsDialog->createContent(); + settingsDialog->fillContent(oldSettings); + + int returnCode = settingsDialog->exec(); + if (returnCode == QDialog::Accepted) { + qDebug() << "Settings dialog accepted, writing settings..."; + const QVariantMap settings = settingsDialog->getSettings(); + + m_core->applySettings(settings, "Server"); + // TODO use signal-slot connection Core::syncServerSetupChanged(bool enabled) -> + // MainWindow::onSyncServerSetupChanged(bool enabled) + + // enableDisableServerActions(); + } else { + qDebug() << "Settings dialog rejected"; + } + delete settingsDialog; +} + void MainWindow::createActions() { // TODO add generic menu actions (file/new, edit/cut, ...) createFileActions(); createUndoActions(); createEditActions(); createServerActions(); + createToolsActions(); } void MainWindow::createFileActions() { @@ -489,6 +515,12 @@ void MainWindow::createServerActions() { ui->menu_Server->addAction(m_deleteItemsAct.get()); } +void MainWindow::createToolsActions() { + QMenu* menu = ui->menu_Tools; + QAction* settingsAct = menu->addAction(tr("&Settings"), this, &MainWindow::execSettingsDialog); + settingsAct->setStatusTip(tr("Opens a dialog to configure applications settings.")); +} + void MainWindow::createHelpMenu() { QMenu* helpMenu = ui->menu_Help; helpMenu->addSeparator(); diff --git a/mainwindow.h b/mainwindow.h index 8a1ee81..512a393 100644 --- a/mainwindow.h +++ b/mainwindow.h @@ -68,6 +68,9 @@ class MainWindow : public QMainWindow { void postItems(); void deleteItem(); + /// 'Tools' slots + void execSettingsDialog(); + private: Ui::MainWindow* ui; @@ -112,6 +115,7 @@ class MainWindow : public QMainWindow { void createUndoActions(); void createEditActions(); void createServerActions(); + void createToolsActions(); void createHelpMenu(); void createGuiDialogs(); }; diff --git a/mainwindow.ui b/mainwindow.ui index 3a28e71..d32d7f5 100644 --- a/mainwindow.ui +++ b/mainwindow.ui @@ -69,10 +69,16 @@ &Server + + + &Tools + + +