From 6650f18e57f36f56c53b8632669398dbab365617 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 29 Jun 2016 22:46:53 +0200 Subject: [PATCH] refs #693, GUI dialog when application closes --- .../components/applicationclosedialog.cpp | 65 +++++++++++++ .../components/applicationclosedialog.h | 50 ++++++++++ .../components/applicationclosedialog.ui | 93 +++++++++++++++++++ src/blackgui/guiutility.cpp | 12 +++ src/blackgui/guiutility.h | 4 + 5 files changed, 224 insertions(+) create mode 100644 src/blackgui/components/applicationclosedialog.cpp create mode 100644 src/blackgui/components/applicationclosedialog.h create mode 100644 src/blackgui/components/applicationclosedialog.ui diff --git a/src/blackgui/components/applicationclosedialog.cpp b/src/blackgui/components/applicationclosedialog.cpp new file mode 100644 index 000000000..cf126aa08 --- /dev/null +++ b/src/blackgui/components/applicationclosedialog.cpp @@ -0,0 +1,65 @@ +/* Copyright (C) 2013 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "applicationclosedialog.h" +#include "ui_applicationclosedialog.h" +#include "blackgui/guiapplication.h" +#include "blackgui/guiutility.h" +#include "blackmisc/settingscache.h" +#include "blackmisc/logmessage.h" +#include +#include + +using namespace BlackMisc; +using namespace BlackGui; + +namespace BlackGui +{ + namespace Components + { + CApplicationCloseDialog::CApplicationCloseDialog(QWidget *parent) : + QDialog(parent), + ui(new Ui::CApplicationCloseDialog) + { + ui->setupUi(this); + this->setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint); + this->initSettingsView(); + connect(this, &CApplicationCloseDialog::accepted, this, &CApplicationCloseDialog::ps_onAccepted); + } + + CApplicationCloseDialog::~CApplicationCloseDialog() + { } + + void CApplicationCloseDialog::ps_onAccepted() + { + QModelIndexList indexes = ui->lv_UnsavedSettings->selectionModel()->selectedIndexes(); + if (indexes.isEmpty()) { return; } + const QList rows = CGuiUtility::indexToUniqueRows(indexes); + QStringList saveKeys; + for (int r : rows) + { + const QString key = this->m_settingskeys.at(r); + saveKeys.append(key); + } + CStatusMessage msg = sApp->saveSettingsByKey(saveKeys); + if (msg.isFailure()) { CLogMessage::preformatted(msg); } + } + + void CApplicationCloseDialog::initSettingsView() + { + QStringList settings(CSettingsCache::instance()->getAllUnsavedKeys()); + settings.sort(); + QStringListModel *model = new QStringListModel(settings, this); + ui->lv_UnsavedSettings->setModel(model); + ui->lv_UnsavedSettings->selectAll(); + + this->m_settingskeys = settings; + } + } // ns +} // ns diff --git a/src/blackgui/components/applicationclosedialog.h b/src/blackgui/components/applicationclosedialog.h new file mode 100644 index 000000000..e258a5dc3 --- /dev/null +++ b/src/blackgui/components/applicationclosedialog.h @@ -0,0 +1,50 @@ +/* Copyright (C) 2013 + * swift project Community / Contributors + * + * This file is part of swift Project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKGUI_COMPONENTS_APPLICATIONCLOSEDIALOG_H +#define BLACKGUI_COMPONENTS_APPLICATIONCLOSEDIALOG_H + +#include +#include + +namespace Ui { class CApplicationCloseDialog; } +namespace BlackGui +{ + namespace Components + { + /*! + * Close dialog for application + */ + class CApplicationCloseDialog : public QDialog + { + Q_OBJECT + + public: + //! Constructor + explicit CApplicationCloseDialog(QWidget *parent = nullptr); + + //! Destructor + ~CApplicationCloseDialog(); + + private slots: + //! Accepted + void ps_onAccepted(); + + private: + QScopedPointer ui; + QStringList m_settingskeys; + + //! Init the settings view + void initSettingsView(); + }; + } // ns +} // ns +#endif // guard diff --git a/src/blackgui/components/applicationclosedialog.ui b/src/blackgui/components/applicationclosedialog.ui new file mode 100644 index 000000000..c6acd5fd0 --- /dev/null +++ b/src/blackgui/components/applicationclosedialog.ui @@ -0,0 +1,93 @@ + + + CApplicationCloseDialog + + + + 0 + 0 + 300 + 200 + + + + Dialog + + + + + + QFrame::StyledPanel + + + QFrame::Raised + + + + + + Save the following settings: + + + + + + + QAbstractItemView::MultiSelection + + + QAbstractItemView::SelectRows + + + + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + + + + bb_ApplicationCloseDialog + accepted() + CApplicationCloseDialog + accept() + + + 248 + 254 + + + 157 + 274 + + + + + bb_ApplicationCloseDialog + rejected() + CApplicationCloseDialog + reject() + + + 316 + 260 + + + 286 + 274 + + + + + diff --git a/src/blackgui/guiutility.cpp b/src/blackgui/guiutility.cpp index 4a2a6b894..145371d88 100644 --- a/src/blackgui/guiutility.cpp +++ b/src/blackgui/guiutility.cpp @@ -327,4 +327,16 @@ namespace BlackGui Q_UNUSED(ok); return QMargins(l, t, r, b); } + + QList CGuiUtility::indexToUniqueRows(const QModelIndexList &indexes) + { + QList rows; + for (const QModelIndex i : indexes) + { + const int r = i.row(); + if (rows.contains(r)) { continue; } + rows.append(r); + } + return rows; + } } // ns diff --git a/src/blackgui/guiutility.h b/src/blackgui/guiutility.h index c554953e3..46c1e0a64 100644 --- a/src/blackgui/guiutility.h +++ b/src/blackgui/guiutility.h @@ -19,6 +19,7 @@ #include #include #include +#include class QCheckBox; class QComboBox; @@ -100,6 +101,9 @@ namespace BlackGui //! Convert from string static QMargins stringToMargins(const QString &str); + //! Only the row part and unique (so no rows is twice in the list) + static QList indexToUniqueRows(const QModelIndexList &indexes); + private: //! Constructor, use static methods only CGuiUtility() {}