From f4822b69dd8eb85554b0c6d3ef20eee21d64c209 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Wed, 17 Oct 2018 19:38:07 +0200 Subject: [PATCH] Allow to save "selected objects" only as JSON --- src/blackgui/models/listmodelbase.cpp | 14 +++++++--- src/blackgui/models/listmodelbase.h | 10 +++---- src/blackgui/views/viewbase.cpp | 39 ++++++++++++++++++++------- src/blackgui/views/viewbase.h | 13 +++++---- 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/src/blackgui/models/listmodelbase.cpp b/src/blackgui/models/listmodelbase.cpp index 611652514..9ec507640 100644 --- a/src/blackgui/models/listmodelbase.cpp +++ b/src/blackgui/models/listmodelbase.cpp @@ -740,16 +740,22 @@ namespace BlackGui } template - QJsonObject CListModelBase::toJson() const + QJsonObject CListModelBase::toJson(bool selectedOnly) const { - const CVariant variant = CVariant::fromValue(container()); + const CVariant variant = CVariant::fromValue( + selectedOnly && m_selectionModel ? + m_selectionModel->selectedObjects() : + container()); return variant.toJson(); } template - QString CListModelBase::toJsonString(QJsonDocument::JsonFormat format) const + QString CListModelBase::toJsonString(QJsonDocument::JsonFormat format, bool selectedOnly) const { - const CVariant variant = CVariant::fromValue(container()); + const CVariant variant = CVariant::fromValue( + selectedOnly && m_selectionModel ? + m_selectionModel->selectedObjects() : + container()); return variant.toJsonString(format); } diff --git a/src/blackgui/models/listmodelbase.h b/src/blackgui/models/listmodelbase.h index 14b30385f..4b7407175 100644 --- a/src/blackgui/models/listmodelbase.h +++ b/src/blackgui/models/listmodelbase.h @@ -54,7 +54,7 @@ namespace BlackGui static constexpr int asyncThreshold = 50; //! Destructor - virtual ~CListModelBaseNonTemplate() {} + virtual ~CListModelBaseNonTemplate() override {} //! \name Functions from QStandardItemModel //! @{ @@ -125,10 +125,10 @@ namespace BlackGui void emitDataChanged(int startRowIndex, int endRowIndex); //! Convert to JSON - virtual QJsonObject toJson() const = 0; + virtual QJsonObject toJson(bool selectedOnly = false) const = 0; //! Convert to JSON string - virtual QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const = 0; + virtual QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool selectedOnly = false) const = 0; signals: //! Asynchronous update finished @@ -194,8 +194,8 @@ namespace BlackGui //! \name Functions from CListModelBaseNonTemplate //! @{ - virtual QJsonObject toJson() const override; - virtual QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const override; + virtual QJsonObject toJson(bool selectedOnly = false) const override; + virtual QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool selectedOnly = false) const override; virtual bool isOrderable() const override; //! @} diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 50f72beb1..372b72c22 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -211,9 +211,9 @@ namespace BlackGui return this->ps_loadJson(directory); } - CStatusMessage CViewBaseNonTemplate::showFileSaveDialog(const QString &directory) + CStatusMessage CViewBaseNonTemplate::showFileSaveDialog(bool selectedOnly, const QString &directory) { - return this->ps_saveJson(directory); + return this->ps_saveJson(selectedOnly, directory); } IMenuDelegate *CViewBaseNonTemplate::setCustomMenu(IMenuDelegate *menu, bool nestPreviousMenu) @@ -277,7 +277,15 @@ namespace BlackGui } case MenuMaterializeFilter: { ma.addAction(CIcons::tableRelationship16(), "Materialize filtered data", CMenuAction::pathViewFilter(), { this, &CViewBaseNonTemplate::materializeFilter }); break; } case MenuLoad: { ma.addAction(CIcons::disk16(), "Load from file ", CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::loadJsonAction }); break; } - case MenuSave: { ma.addAction(CIcons::disk16(), "Save data in file " + CShortcut::toParenthesisString(CShortcut::keySaveViews()), CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::saveJsonAction }, CShortcut::keySaveViews()); break; } + case MenuSave: + { + ma.addAction(CIcons::disk16(), "Save data in file " + CShortcut::toParenthesisString(CShortcut::keySaveViews()), CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::saveJsonAction }, CShortcut::keySaveViews()); + if (this->hasSelection()) + { + ma.addAction(CIcons::disk16(), "Save selected data in file", CMenuAction::pathViewLoadSave(), { this, &CViewBaseNonTemplate::saveSelectedJsonAction }); break; + } + break; + } case MenuCut: { if (!QApplication::clipboard()) break; @@ -620,7 +628,18 @@ namespace BlackGui { if (this->isEmpty()) { return; } if (!m_menus.testFlag(MenuSave)) { return; } - const CStatusMessage m = this->ps_saveJson(); + const CStatusMessage m = this->ps_saveJson(false); + if (!m.isEmpty()) + { + CLogMessage::preformatted(m); + } + } + + void CViewBaseNonTemplate::saveSelectedJsonAction() + { + if (this->isEmpty()) { return; } + if (!m_menus.testFlag(MenuSave)) { return; } + const CStatusMessage m = this->ps_saveJson(true); if (!m.isEmpty()) { CLogMessage::preformatted(m); @@ -1315,17 +1334,17 @@ namespace BlackGui } template - QJsonObject CViewBase::toJson() const + QJsonObject CViewBase::toJson(bool selectedOnly) const { Q_ASSERT(m_model); - return m_model->toJson(); + return m_model->toJson(selectedOnly); } template - QString CViewBase::toJsonString(QJsonDocument::JsonFormat format) const + QString CViewBase::toJsonString(QJsonDocument::JsonFormat format, bool selectedOnly) const { Q_ASSERT(m_model); - return m_model->toJsonString(format); + return m_model->toJsonString(format, selectedOnly); } template @@ -1609,14 +1628,14 @@ namespace BlackGui } template - CStatusMessage CViewBase::ps_saveJson(const QString &directory) + CStatusMessage CViewBase::ps_saveJson(bool selectedOnly, const QString &directory) { const QString fileName = QFileDialog::getSaveFileName(nullptr, tr("Save data file"), directory.isEmpty() ? this->getFileDialogFileName(false) : directory, tr("swift (*.json *.txt)")); if (fileName.isEmpty()) { return CStatusMessage(this, CStatusMessage::SeverityDebug, "Save canceled", true); } - const QString json(this->toJsonString()); // save as CVariant JSON + const QString json(this->toJsonString(QJsonDocument::Indented, selectedOnly)); // save as CVariant JSON // save file const bool ok = CFileUtils::writeStringToFileInBackground(json, fileName); diff --git a/src/blackgui/views/viewbase.h b/src/blackgui/views/viewbase.h index 253781aef..9af7db45b 100644 --- a/src/blackgui/views/viewbase.h +++ b/src/blackgui/views/viewbase.h @@ -276,7 +276,7 @@ namespace BlackGui BlackMisc::CStatusMessage showFileLoadDialog(const QString &directory = {}); //! Show file save dialog - BlackMisc::CStatusMessage showFileSaveDialog(const QString &directory = {}); + BlackMisc::CStatusMessage showFileSaveDialog(bool selectedOnly, const QString &directory = {}); //! Save file name (optional) void setSaveFileName(const QString &saveName) { m_saveFileName = saveName; } @@ -448,6 +448,9 @@ namespace BlackGui //! Save JSON for action/menu, void return signatur void saveJsonAction(); + //! Save JSON for action/menu, void return signatur + void saveSelectedJsonAction(); + //! Load JSON for action/menu, void return signatur void loadJsonAction(); @@ -532,7 +535,7 @@ namespace BlackGui virtual BlackMisc::CStatusMessage ps_loadJson(const QString &directory = {}) = 0; //! Save JSON - virtual BlackMisc::CStatusMessage ps_saveJson(const QString &directory = {}) = 0; + virtual BlackMisc::CStatusMessage ps_saveJson(bool selectedOnly = false, const QString &directory = {}) = 0; //! Trigger reload from backend by signal requestUpdate(); void ps_triggerReload(); @@ -683,10 +686,10 @@ namespace BlackGui int columnCount() const; //! Convert to JSON - QJsonObject toJson() const; + QJsonObject toJson(bool selectedOnly = false) const; //! Convert to JSON string - QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const; + QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented, bool selectedOnly = false) const; //! Set own name and the model's name virtual void setObjectName(const QString &name); @@ -764,7 +767,7 @@ namespace BlackGui virtual void ps_doubleClicked(const QModelIndex &index) override; virtual void ps_rowSelected(const QModelIndex &index) override; virtual BlackMisc::CStatusMessage ps_loadJson(const QString &directory = {}) override; - virtual BlackMisc::CStatusMessage ps_saveJson(const QString &directory = {}) override; + virtual BlackMisc::CStatusMessage ps_saveJson(bool selectedOnly = false, const QString &directory = {}) override; //! @} }; } // namespace