From 08f8916344780cc289a120794300e8ce9627d6b4 Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Fri, 24 Mar 2017 18:24:59 +0100 Subject: [PATCH] refs #922, refs #911, JSON cut/copy/paste * utility function for CVariant * use CVariant for cut/copy/paste --- src/blackgui/editors/aircrafticaoform.cpp | 6 ++++-- src/blackgui/editors/airlineicaoform.cpp | 6 ++++-- src/blackgui/editors/liveryform.cpp | 6 ++++-- src/blackgui/views/viewbase.cpp | 3 ++- src/blackmisc/variant.cpp | 8 +++++++- src/blackmisc/variant.h | 3 +++ 6 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/blackgui/editors/aircrafticaoform.cpp b/src/blackgui/editors/aircrafticaoform.cpp index 3ca2f9097..f75852598 100644 --- a/src/blackgui/editors/aircrafticaoform.cpp +++ b/src/blackgui/editors/aircrafticaoform.cpp @@ -94,8 +94,10 @@ namespace BlackGui { try { - CAircraftIcaoCodeList icaos; - icaos.convertFromJson(Json::jsonObjectFromString(json)); + CVariant jsonVariant; + jsonVariant.convertFromJson(Json::jsonObjectFromString(json)); + if (!jsonVariant.canConvert()) { return; } + const CAircraftIcaoCodeList icaos = jsonVariant.value(); if (!icaos.isEmpty()) { this->setValue(icaos.front()); diff --git a/src/blackgui/editors/airlineicaoform.cpp b/src/blackgui/editors/airlineicaoform.cpp index f8350636d..54db9ead7 100644 --- a/src/blackgui/editors/airlineicaoform.cpp +++ b/src/blackgui/editors/airlineicaoform.cpp @@ -159,8 +159,10 @@ namespace BlackGui { try { - CAirlineIcaoCodeList icaos; - icaos.convertFromJson(Json::jsonObjectFromString(json)); + CVariant jsonVariant; + jsonVariant.convertFromJson(Json::jsonObjectFromString(json)); + if (!jsonVariant.canConvert()) { return; } + const CAirlineIcaoCodeList icaos = jsonVariant.value(); if (!icaos.isEmpty()) { this->setValue(icaos.front()); diff --git a/src/blackgui/editors/liveryform.cpp b/src/blackgui/editors/liveryform.cpp index dd6f5205a..6963a7f61 100644 --- a/src/blackgui/editors/liveryform.cpp +++ b/src/blackgui/editors/liveryform.cpp @@ -117,8 +117,10 @@ namespace BlackGui { try { - CLiveryList liveries; - liveries.convertFromJson(Json::jsonObjectFromString(json)); + CVariant jsonVariant; + jsonVariant.convertFromJson(Json::jsonObjectFromString(json)); + if (!jsonVariant.canConvert()) { return; } + const CLiveryList liveries = jsonVariant.value(); if (!liveries.isEmpty()) { this->setValue(liveries.front()); diff --git a/src/blackgui/views/viewbase.cpp b/src/blackgui/views/viewbase.cpp index 5dc597a67..ffe66e809 100644 --- a/src/blackgui/views/viewbase.cpp +++ b/src/blackgui/views/viewbase.cpp @@ -1454,7 +1454,8 @@ namespace BlackGui if (!this->hasSelection()) { return; } const ContainerType selection = this->selectedObjects(); if (selection.isEmpty()) { return; } - const QString json = selection.toJsonString(); + const CVariant copyJson = CVariant::from(selection); + const QString json = copyJson.toJsonString(); clipboard->setText(json); } diff --git a/src/blackmisc/variant.cpp b/src/blackmisc/variant.cpp index 4aa9781fc..7c8369cec 100644 --- a/src/blackmisc/variant.cpp +++ b/src/blackmisc/variant.cpp @@ -91,7 +91,7 @@ namespace BlackMisc else { CLogMessage(&a).warning("Comparing two CVariants containing unrelated value objects: %1 (%2) and %3 (%4)") - << a.typeName() << a.userType() << b.typeName() << b.userType(); + << a.typeName() << a.userType() << b.typeName() << b.userType(); return 0; } } @@ -152,6 +152,12 @@ namespace BlackMisc return json; } + QString CVariant::toJsonString(QJsonDocument::JsonFormat format) const + { + QJsonDocument jsonDoc(toJson()); + return jsonDoc.toJson(format); + } + void CVariant::convertFromJson(const QJsonObject &json) { // Remark: Names "type" and "value" are also used for drag and drop diff --git a/src/blackmisc/variant.h b/src/blackmisc/variant.h index 49794988c..da20a7ace 100644 --- a/src/blackmisc/variant.h +++ b/src/blackmisc/variant.h @@ -273,6 +273,9 @@ namespace BlackMisc //! \copydoc BlackMisc::Mixin::JsonByMetaClass::toJson QJsonObject toJson() const; + //! Convenience function JSON as string + QString toJsonString(QJsonDocument::JsonFormat format = QJsonDocument::Indented) const; + //! \copydoc BlackMisc::Mixin::JsonByMetaClass::convertFromJson void convertFromJson(const QJsonObject &json);