QmlDesigner: Add explicit ownership to binding editor

It is much better to desribe the ownership explicitly instead of using
the hard to read parent child mechanism.

Change-Id: I488a6ca1fb08f4bf3b3a540c0bb7d9ffb03895d0
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
Reviewed-by: Qt CI Patch Build Bot <ci_patchbuild_bot@qt.io>
This commit is contained in:
Marco Bubke
2024-02-26 16:18:42 +01:00
parent f6025c4e04
commit 12760b3032
6 changed files with 45 additions and 42 deletions

View File

@@ -49,12 +49,10 @@ void ActionEditor::prepareDialog()
s_lastActionEditor = this; s_lastActionEditor = this;
m_dialog = new ActionEditorDialog(Core::ICore::dialogParent()); m_dialog = Utils::makeUniqueObjectPtr<ActionEditorDialog>(Core::ICore::dialogParent());
QObject::connect(m_dialog, &AbstractEditorDialog::accepted, QObject::connect(m_dialog.get(), &AbstractEditorDialog::accepted, this, &ActionEditor::accepted);
this, &ActionEditor::accepted); QObject::connect(m_dialog.get(), &AbstractEditorDialog::rejected, this, &ActionEditor::rejected);
QObject::connect(m_dialog, &AbstractEditorDialog::rejected,
this, &ActionEditor::rejected);
m_dialog->setAttribute(Qt::WA_DeleteOnClose); m_dialog->setAttribute(Qt::WA_DeleteOnClose);
} }
@@ -327,13 +325,13 @@ void ActionEditor::prepareConnections()
for (const QmlModelState &state : QmlItemNode(m_modelNode.view()->rootModelNode()).states().allStates()) for (const QmlModelState &state : QmlItemNode(m_modelNode.view()->rootModelNode()).states().allStates())
states.append(state.name()); states.append(state.name());
if (!connections.isEmpty() && !m_dialog.isNull()) if (!connections.isEmpty() && m_dialog)
m_dialog->setAllConnections(connections, singletons, states); m_dialog->setAllConnections(connections, singletons, states);
} }
void ActionEditor::updateWindowName(const QString &targetName) void ActionEditor::updateWindowName(const QString &targetName)
{ {
if (!m_dialog.isNull()) { if (m_dialog) {
if (targetName.isEmpty()) if (targetName.isEmpty())
m_dialog->setWindowTitle(m_dialog->defaultTitle()); m_dialog->setWindowTitle(m_dialog->defaultTitle());
else else

View File

@@ -9,6 +9,8 @@
#include <modelnode.h> #include <modelnode.h>
#include <signalhandlerproperty.h> #include <signalhandlerproperty.h>
#include <utils/uniqueobjectptr.h>
#include <QtQml> #include <QtQml>
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
@@ -63,7 +65,7 @@ private:
void prepareDialog(); void prepareDialog();
private: private:
QPointer<ActionEditorDialog> m_dialog; Utils::UniqueObjectPtr<ActionEditorDialog> m_dialog;
QModelIndex m_index; QModelIndex m_index;
QmlDesigner::ModelNode m_modelNode; QmlDesigner::ModelNode m_modelNode;
}; };

View File

@@ -37,12 +37,10 @@ void BindingEditor::prepareDialog()
{ {
QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_BINDINGEDITOR_OPENED); QmlDesignerPlugin::emitUsageStatistics(Constants::EVENT_BINDINGEDITOR_OPENED);
m_dialog = new BindingEditorDialog(Core::ICore::dialogParent()); m_dialog = Utils::makeUniqueObjectPtr<BindingEditorDialog>(Core::ICore::dialogParent());
QObject::connect(m_dialog, &AbstractEditorDialog::accepted, QObject::connect(m_dialog.get(), &AbstractEditorDialog::accepted, this, &BindingEditor::accepted);
this, &BindingEditor::accepted); QObject::connect(m_dialog.get(), &AbstractEditorDialog::rejected, this, &BindingEditor::rejected);
QObject::connect(m_dialog, &AbstractEditorDialog::rejected,
this, &BindingEditor::rejected);
m_dialog->setAttribute(Qt::WA_DeleteOnClose); m_dialog->setAttribute(Qt::WA_DeleteOnClose);
} }
@@ -273,13 +271,13 @@ void BindingEditor::prepareBindings()
} }
} }
if (!bindings.isEmpty() && !m_dialog.isNull()) if (!bindings.isEmpty() && m_dialog)
m_dialog->setAllBindings(bindings, m_backendValueType); m_dialog->setAllBindings(bindings, m_backendValueType);
} }
void BindingEditor::updateWindowName() void BindingEditor::updateWindowName()
{ {
if (!m_dialog.isNull() && m_backendValueType) { if (m_dialog && m_backendValueType) {
QString targetString; QString targetString;
if constexpr (useProjectStorage()) { if constexpr (useProjectStorage()) {
auto exportedTypeNames = m_backendValueType.exportedTypeNamesForSourceId( auto exportedTypeNames = m_backendValueType.exportedTypeNamesForSourceId(

View File

@@ -8,6 +8,8 @@
#include <qmldesignercorelib_global.h> #include <qmldesignercorelib_global.h>
#include <modelnode.h> #include <modelnode.h>
#include <utils/uniqueobjectptr.h>
#include <QtQml> #include <QtQml>
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
@@ -72,7 +74,7 @@ private:
void prepareDialog(); void prepareDialog();
private: private:
QPointer<BindingEditorDialog> m_dialog; Utils::UniqueObjectPtr<BindingEditorDialog> m_dialog;
QVariant m_backendValue; QVariant m_backendValue;
QVariant m_modelNodeBackend; QVariant m_modelNodeBackend;
QVariant m_stateModelNode; QVariant m_stateModelNode;

View File

@@ -54,12 +54,8 @@ bool SignalListFilterModel::filterAcceptsRow(int sourceRow, const QModelIndex &s
|| sourceModel()->data(signalIndex).toString().contains(filterRegularExpression())); || sourceModel()->data(signalIndex).toString().contains(filterRegularExpression()));
} }
SignalList::SignalList(QObject *) SignalList::SignalList(QObject *)
: m_dialog(QPointer<SignalListDialog>()) : m_model(Utils::makeUniqueObjectPtr<SignalListModel>(this))
, m_model(new SignalListModel(this))
, m_modelNode() , m_modelNode()
{ {
} }
@@ -71,9 +67,9 @@ SignalList::~SignalList()
void SignalList::prepareDialog() void SignalList::prepareDialog()
{ {
m_dialog = new SignalListDialog(Core::ICore::dialogParent()); m_dialog = Utils::makeUniqueObjectPtr<SignalListDialog>(Core::ICore::dialogParent());
m_dialog->setAttribute(Qt::WA_DeleteOnClose); m_dialog->setAttribute(Qt::WA_DeleteOnClose);
m_dialog->initialize(m_model); m_dialog->initialize(m_model.get());
m_dialog->setWindowTitle(::QmlDesigner::SignalList::tr("Signal List for %1") m_dialog->setWindowTitle(::QmlDesigner::SignalList::tr("Signal List for %1")
.arg(m_modelNode.validId())); .arg(m_modelNode.validId()));
@@ -98,13 +94,14 @@ void SignalList::hideWidget()
SignalList* SignalList::showWidget(const ModelNode &modelNode) SignalList* SignalList::showWidget(const ModelNode &modelNode)
{ {
auto signalList = new SignalList(); auto signalList = new SignalList;
signalList->setModelNode(modelNode); signalList->setModelNode(modelNode);
signalList->prepareSignals(); signalList->prepareSignals();
signalList->showWidget(); signalList->showWidget();
connect(signalList->m_dialog, &QDialog::destroyed, connect(signalList->m_dialog.get(), &QDialog::destroyed, [signalList]() {
[signalList]() { signalList->deleteLater(); } ); signalList->deleteLater();
});
return signalList; return signalList;
} }
@@ -265,11 +262,13 @@ void SignalList::removeConnection(const QModelIndex &modelIndex)
ModelNode node = targetSignal.parentModelNode(); ModelNode node = targetSignal.parentModelNode();
if (node.isValid()) { if (node.isValid()) {
view->executeInTransaction("ConnectionModel::removeConnection", view->executeInTransaction(
"ConnectionModel::removeConnection",
[this, modelIndex, buttonModelIndex, targetSignal, &node] { [this, modelIndex, buttonModelIndex, targetSignal, &node] {
QList<SignalHandlerProperty> allSignals = node.signalProperties(); const QList<SignalHandlerProperty> allSignals = node.signalProperties();
if (allSignals.size() > 1) { if (allSignals.size() > 1) {
const auto targetSignalWithPrefix = SignalHandlerProperty::prefixAdded(targetSignal.name()); const auto targetSignalWithPrefix = SignalHandlerProperty::prefixAdded(
targetSignal.name());
for (const SignalHandlerProperty &signal : allSignals) for (const SignalHandlerProperty &signal : allSignals)
if (signal.name() == targetSignalWithPrefix) if (signal.name() == targetSignalWithPrefix)
node.removeProperty(targetSignalWithPrefix); node.removeProperty(targetSignalWithPrefix);
@@ -277,7 +276,9 @@ void SignalList::removeConnection(const QModelIndex &modelIndex)
node.destroy(); node.destroy();
} }
m_model->setConnected(modelIndex.row(), false); m_model->setConnected(modelIndex.row(), false);
m_model->setData(buttonModelIndex, QVariant(), SignalListModel::ConnectionsInternalIdRole); m_model->setData(buttonModelIndex,
QVariant(),
SignalListModel::ConnectionsInternalIdRole);
}); });
} }
} }

View File

@@ -8,6 +8,8 @@
#include <modelnode.h> #include <modelnode.h>
#include <qmlconnections.h> #include <qmlconnections.h>
#include <utils/uniqueobjectptr.h>
#include <QtQml> #include <QtQml>
#include <QObject> #include <QObject>
#include <QPointer> #include <QPointer>
@@ -74,8 +76,8 @@ private:
void removeConnection(const QModelIndex &modelIndex); void removeConnection(const QModelIndex &modelIndex);
private: private:
QPointer<SignalListDialog> m_dialog; Utils::UniqueObjectPtr<SignalListDialog> m_dialog;
SignalListModel *m_model; Utils::UniqueObjectPtr<SignalListModel> m_model;
ModelNode m_modelNode; ModelNode m_modelNode;
}; };