QmlDesigner: Remove parent from abstract view

We apply not very often the parent to views. So it can lead to dangling
pointer if the parent is used by other objects and does not handle the
null pointer case. It can lead to double deletion if the parent is
deleted before the object when it is on the stack or handled by smart
pointer.

If you really want to use it there is still setParent.

Change-Id: I1fc6b145a50f037a0e9d415fb36e7970ea7296ed
Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
Marco Bubke
2022-09-15 13:07:45 +02:00
committed by Tim Jenssen
parent 4bb4e07ad8
commit 0be4de69d8
55 changed files with 254 additions and 280 deletions

View File

@@ -269,10 +269,10 @@ void AssetExporter::preprocessQmlFile(const Utils::FilePath &path)
textEdit.setPlainText(QString::fromUtf8(reader.data()));
NotIndentingTextEditModifier *modifier = new NotIndentingTextEditModifier(&textEdit);
modifier->setParent(model.get());
RewriterView *rewriterView = new RewriterView(QmlDesigner::RewriterView::Validate, model.get());
auto rewriterView = std::make_unique<RewriterView>(QmlDesigner::RewriterView::Validate);
rewriterView->setCheckSemanticErrors(false);
rewriterView->setTextModifier(modifier);
model->attachView(rewriterView);
model->attachView(rewriterView.get());
rewriterView->restoreAuxiliaryData();
ModelNode rootNode = rewriterView->rootModelNode();
if (!rootNode.isValid()) {

View File

@@ -23,8 +23,8 @@ const int MinRetry = 2;
namespace QmlDesigner {
AssetExporterView::AssetExporterView(QObject *parent) : AbstractView(parent),
m_timer(this)
AssetExporterView::AssetExporterView()
: m_timer(this)
{
m_timer.setInterval(RetryIntervalMs);
// We periodically check if file is loaded.

View File

@@ -29,7 +29,7 @@ public:
Loaded
};
AssetExporterView(QObject *parent = nullptr);
AssetExporterView();
bool loadQmlFile(const Utils::FilePath &path, uint timeoutSecs = 10);
bool saveQmlFile(QString *error) const;

View File

@@ -43,9 +43,7 @@ public:
SynchronousImageCache synchronousFontImageCache{storage, timeStampProvider, fontCollector};
};
AssetsLibraryView::AssetsLibraryView(QObject *parent)
: AbstractView(parent)
{}
AssetsLibraryView::AssetsLibraryView() {}
AssetsLibraryView::~AssetsLibraryView()
{}

View File

@@ -19,7 +19,7 @@ class AssetsLibraryView : public AbstractView
Q_OBJECT
public:
AssetsLibraryView(QObject* parent = nullptr);
AssetsLibraryView();
~AssetsLibraryView() override;
bool hasWidget() const override;

View File

@@ -12,10 +12,9 @@
namespace QmlDesigner {
DesignerActionManagerView::DesignerActionManagerView()
: AbstractView(nullptr),
m_designerActionManager(this),
m_isInRewriterTransaction(false),
m_setupContextDirty(false)
: m_designerActionManager(this)
, m_isInRewriterTransaction(false)
, m_setupContextDirty(false)
{
}

View File

@@ -581,7 +581,7 @@ static QString toUpper(const QString &signal)
static void addSignal(const QString &typeName, const QString &itemId, const QString &signalName, bool isRootModelNode)
{
auto model = Model::create("Item", 2, 0);
RewriterView rewriterView(RewriterView::Amend, nullptr);
RewriterView rewriterView(RewriterView::Amend);
auto textEdit = qobject_cast<TextEditor::TextEditorWidget*>
(Core::EditorManager::currentEditor()->widget());
@@ -1525,7 +1525,7 @@ void styleMerge(const SelectionContext &selectionContext, const QString &templat
textEditTemplate.setPlainText(imports + qmlTemplateString);
NotIndentingTextEditModifier textModifierTemplate(&textEditTemplate);
QScopedPointer<RewriterView> templateRewriterView(new RewriterView(RewriterView::Amend, nullptr));
QScopedPointer<RewriterView> templateRewriterView(new RewriterView(RewriterView::Amend));
templateRewriterView->setTextModifier(&textModifierTemplate);
templateModel->attachView(templateRewriterView.data());
templateRewriterView->setCheckSemanticErrors(false);
@@ -1544,7 +1544,7 @@ void styleMerge(const SelectionContext &selectionContext, const QString &templat
textEditStyle.setPlainText(parentRewriterView->textModifierContent());
NotIndentingTextEditModifier textModifierStyle(&textEditStyle);
QScopedPointer<RewriterView> styleRewriterView(new RewriterView(RewriterView::Amend, nullptr));
QScopedPointer<RewriterView> styleRewriterView(new RewriterView(RewriterView::Amend));
styleRewriterView->setTextModifier(&textModifierStyle);
styleModel->attachView(styleRewriterView.data());

View File

@@ -24,12 +24,12 @@ namespace QmlDesigner {
namespace Internal {
ConnectionView::ConnectionView(QObject *parent) : AbstractView(parent),
m_connectionViewWidget(new ConnectionViewWidget()),
m_connectionModel(new ConnectionModel(this)),
m_bindingModel(new BindingModel(this)),
m_dynamicPropertiesModel(new DynamicPropertiesModel(false, this)),
m_backendModel(new BackendModel(this))
ConnectionView::ConnectionView()
: m_connectionViewWidget(new ConnectionViewWidget())
, m_connectionModel(new ConnectionModel(this))
, m_bindingModel(new BindingModel(this))
, m_dynamicPropertiesModel(new DynamicPropertiesModel(false, this))
, m_backendModel(new BackendModel(this))
{
connectionViewWidget()->setBindingModel(m_bindingModel);
connectionViewWidget()->setConnectionModel(m_connectionModel);

View File

@@ -28,7 +28,7 @@ class ConnectionView : public AbstractView
Q_OBJECT
public:
ConnectionView(QObject *parent = nullptr);
ConnectionView();
~ConnectionView() override;
// AbstractView

View File

@@ -21,9 +21,8 @@
namespace QmlDesigner {
CurveEditorView::CurveEditorView([[maybe_unused]] QObject *parent)
: AbstractView(parent)
, m_block(false)
CurveEditorView::CurveEditorView()
: m_block(false)
, m_model(new CurveEditorModel())
, m_editor(new CurveEditor(m_model))
{

View File

@@ -16,7 +16,7 @@ class CurveEditorView : public AbstractView
Q_OBJECT
public:
explicit CurveEditorView(QObject *parent = nullptr);
explicit CurveEditorView();
~CurveEditorView() override;
public:

View File

@@ -39,8 +39,8 @@ namespace QmlDesigner {
namespace Internal {
DebugView::DebugView(QObject *parent) : AbstractView(parent),
m_debugViewWidget(new DebugViewWidget)
DebugView::DebugView()
: m_debugViewWidget(new DebugViewWidget)
{
}

View File

@@ -17,7 +17,7 @@ class DebugView : public AbstractView
Q_OBJECT
public:
DebugView(QObject *parent = nullptr);
DebugView();
~DebugView() override;
// AbstractView

View File

@@ -31,8 +31,7 @@
namespace QmlDesigner {
Edit3DView::Edit3DView(QObject *parent)
: AbstractView(parent)
Edit3DView::Edit3DView()
{
m_compressionTimer.setInterval(1000);
m_compressionTimer.setSingleShot(true);

View File

@@ -27,7 +27,7 @@ class QMLDESIGNERCORE_EXPORT Edit3DView : public AbstractView
Q_OBJECT
public:
Edit3DView(QObject *parent = nullptr);
Edit3DView();
~Edit3DView() override;
WidgetInfo widgetInfo() override;

View File

@@ -196,7 +196,7 @@ void EventList::initialize(EventListPluginView *parent)
}
if (!m_eventView) {
m_eventView = std::make_unique<EventListView>(m_model.get());
m_eventView = std::make_unique<EventListView>();
m_model->attachView(m_eventView.get());
}
}

View File

@@ -75,7 +75,8 @@ void EventListDialog::initialize(EventList &events)
Model *model = events.model();
m_modifier->setParent(model);
m_rewriter = new RewriterView(QmlDesigner::RewriterView::Validate, model);
m_rewriter = new RewriterView(QmlDesigner::RewriterView::Validate);
m_rewriter->setParent(model);
m_rewriter->setTextModifier(m_modifier);
m_rewriter->setCheckSemanticErrors(false);
model->attachView(m_rewriter);

View File

@@ -30,9 +30,8 @@ SignalHandlerProperty signalPropertyFromAction(ActionInterface *interface)
return SignalHandlerProperty();
}
EventListPluginView::EventListPluginView(QObject* parent)
: AbstractView(parent)
, m_eventlist()
EventListPluginView::EventListPluginView()
: m_eventlist()
, m_eventListDialog(nullptr)
, m_assigner(nullptr)
, m_signalConnector(nullptr)

View File

@@ -16,7 +16,7 @@ class EventListPluginView : public AbstractView
Q_OBJECT
public:
EventListPluginView(QObject* parent = nullptr);
EventListPluginView();
~EventListPluginView() override = default;
void registerActions();

View File

@@ -50,11 +50,9 @@ QStringList EventListModel::connectEvents(const QStringList &eventIds)
return out;
}
EventListView::EventListView(QObject *parent)
: AbstractView(parent)
, m_eventlist()
, m_model(new EventListModel(this))
EventListView::EventListView()
: m_eventlist()
, m_model(std::make_unique<EventListModel>())
{}
EventListView::~EventListView() {}
@@ -78,7 +76,7 @@ void EventListView::nodeReparented(const ModelNode &node,
EventListModel *EventListView::eventListModel() const
{
return m_model;
return m_model.get();
}
void EventListView::addEvent(const Event &event)

View File

@@ -7,6 +7,8 @@
#include <abstractview.h>
#include <QStandardItemModel>
#include <memory>
namespace QmlDesigner {
struct Event
@@ -49,7 +51,7 @@ class EventListView : public AbstractView
Q_OBJECT
public:
explicit EventListView(QObject *parent = nullptr);
explicit EventListView();
~EventListView() override;
void nodeRemoved(const ModelNode &removedNode,
@@ -73,7 +75,7 @@ private:
void reset();
EventList m_eventlist;
EventListModel *m_model;
std::unique_ptr<EventListModel> m_model;
};
} // namespace QmlDesigner.

View File

@@ -41,11 +41,10 @@ NodeListModel::NodeListModel(QObject *parent)
setSortRole(internalIdRole);
}
NodeListView::NodeListView(AbstractView *parent)
: AbstractView(parent)
, m_itemModel(new NodeListModel(this))
: m_itemModel(new NodeListModel(this))
{
setParent(parent);
parent->model()->attachView(this);
reset();
}

View File

@@ -42,10 +42,7 @@
namespace QmlDesigner {
FormEditorView::FormEditorView(QObject *parent)
: AbstractView(parent)
{
}
FormEditorView::FormEditorView() {}
FormEditorScene* FormEditorView::scene() const
{

View File

@@ -39,7 +39,7 @@ class QMLDESIGNERCORE_EXPORT FormEditorView : public AbstractView
Q_OBJECT
public:
FormEditorView(QObject *parent = nullptr);
FormEditorView();
~FormEditorView() override;
// AbstractView

View File

@@ -15,10 +15,9 @@
namespace QmlDesigner {
ComponentView::ComponentView(QObject *parent)
: AbstractView(parent),
m_standardItemModel(new QStandardItemModel(this)),
m_componentAction(new ComponentAction(this))
ComponentView::ComponentView()
: m_standardItemModel(new QStandardItemModel(this))
, m_componentAction(new ComponentAction(this))
{
}

View File

@@ -27,7 +27,7 @@ public:
ModelNodeRole = Qt::UserRole
};
ComponentView(QObject *parent = nullptr);
ComponentView();
void modelAttached(Model *model) override;
void modelAboutToBeDetached(Model *model) override;

View File

@@ -63,7 +63,7 @@ namespace QmlDesigner {
DesignDocument::DesignDocument(ProjectStorage<Sqlite::Database> &projectStorage)
: m_documentModel(Model::create("QtQuick.Item", 1, 0))
, m_subComponentManager(new SubComponentManager(m_documentModel.get(), this))
, m_rewriterView(new RewriterView(RewriterView::Amend, m_documentModel.get()))
, m_rewriterView(new RewriterView(RewriterView::Amend))
, m_documentLoaded(false)
, m_currentTarget(nullptr)
, m_projectStorage(projectStorage)

View File

@@ -22,8 +22,8 @@
namespace QmlDesigner {
DesignDocumentView::DesignDocumentView(QObject *parent)
: AbstractView(parent), m_modelMerger(new ModelMerger(this))
DesignDocumentView::DesignDocumentView()
: m_modelMerger(new ModelMerger(this))
{
}
@@ -97,7 +97,7 @@ QString DesignDocumentView::toText() const
textEdit.setPlainText(imports + QStringLiteral("Item {\n}\n"));
NotIndentingTextEditModifier modifier(&textEdit);
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr));
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend));
rewriterView->setCheckSemanticErrors(false);
rewriterView->setTextModifier(&modifier);
outputModel->setRewriterView(rewriterView.data());

View File

@@ -15,7 +15,7 @@ class QMLDESIGNERCORE_EXPORT DesignDocumentView : public AbstractView
{
Q_OBJECT
public:
DesignDocumentView(QObject *parent = nullptr);
DesignDocumentView();
~DesignDocumentView() override;
ModelNode insertModel(const ModelNode &modelNode);

View File

@@ -25,9 +25,7 @@
namespace QmlDesigner {
MaterialBrowserView::MaterialBrowserView(QObject *parent)
: AbstractView(parent)
{}
MaterialBrowserView::MaterialBrowserView() {}
MaterialBrowserView::~MaterialBrowserView()
{}

View File

@@ -17,7 +17,7 @@ class MaterialBrowserView : public AbstractView
Q_OBJECT
public:
MaterialBrowserView(QObject *parent = nullptr);
MaterialBrowserView();
~MaterialBrowserView() override;
bool hasWidget() const override;

View File

@@ -48,9 +48,8 @@
namespace QmlDesigner {
MaterialEditorView::MaterialEditorView(QWidget *parent)
: AbstractView(parent)
, m_stackedWidget(new QStackedWidget(parent))
MaterialEditorView::MaterialEditorView()
: m_stackedWidget(new QStackedWidget)
, m_dynamicPropertiesModel(new Internal::DynamicPropertiesModel(true, this))
{
m_updateShortcut = new QShortcut(QKeySequence(Qt::CTRL + Qt::Key_F7), m_stackedWidget);

View File

@@ -31,7 +31,7 @@ class MaterialEditorView : public AbstractView
Q_OBJECT
public:
MaterialEditorView(QWidget *parent = nullptr);
MaterialEditorView();
~MaterialEditorView() override;
bool hasWidget() const override;

View File

@@ -88,9 +88,8 @@ static inline void moveNodesDown(const QList<QmlDesigner::ModelNode> &nodes)
namespace QmlDesigner {
NavigatorView::NavigatorView(QObject* parent) :
AbstractView(parent),
m_blockSelectionChangedSignal(false)
NavigatorView::NavigatorView()
: m_blockSelectionChangedSignal(false)
{
}

View File

@@ -40,7 +40,7 @@ class NavigatorView : public AbstractView
Q_OBJECT
public:
NavigatorView(QObject* parent = nullptr);
NavigatorView();
~NavigatorView() override;
bool hasWidget() const override;

View File

@@ -33,11 +33,10 @@ namespace QmlDesigner {
We always have 'one' current state, where we get updates from (see sceneChanged()). In case
the current state is the base state, we render the base state + all other states.
*/
StatesEditorView::StatesEditorView(QObject *parent) :
AbstractView(parent),
m_statesEditorModel(new StatesEditorModel(this)),
m_lastIndex(-1),
m_editor(nullptr)
StatesEditorView::StatesEditorView()
: m_statesEditorModel(new StatesEditorModel(this))
, m_lastIndex(-1)
, m_editor(nullptr)
{
Q_ASSERT(m_statesEditorModel);
// base state

View File

@@ -17,7 +17,7 @@ class StatesEditorView : public AbstractView {
Q_OBJECT
public:
explicit StatesEditorView(QObject *parent = nullptr);
explicit StatesEditorView();
~StatesEditorView() override;
void renameState(int internalNodeId,const QString &newName);

View File

@@ -57,8 +57,7 @@ namespace Experimental {
We always have 'one' current state, where we get updates from (see sceneChanged()). In case
the current state is the base state, we render the base state + all other states.
*/
StatesEditorView::StatesEditorView(QObject *parent) :
AbstractView(parent),
StatesEditorView::StatesEditorView() :
m_statesEditorModel(new StatesEditorModel(this)),
m_lastIndex(-1),
m_editor(nullptr)

View File

@@ -45,7 +45,7 @@ class StatesEditorView : public AbstractView {
Q_OBJECT
public:
explicit StatesEditorView(QObject *parent = nullptr);
explicit StatesEditorView();
~StatesEditorView() override;
void renameState(int internalNodeId,const QString &newName);

View File

@@ -42,9 +42,8 @@ namespace QmlDesigner {
const char TEXTEDITOR_CONTEXT_ID[] = "QmlDesigner.TextEditorContext";
TextEditorView::TextEditorView(QObject *parent)
: AbstractView(parent)
, m_widget(new TextEditorWidget(this))
TextEditorView::TextEditorView()
: m_widget(new TextEditorWidget(this))
, m_textEditorContext(new Internal::TextEditorContext(m_widget))
{
Core::ICore::addContextObject(m_textEditorContext);

View File

@@ -25,7 +25,7 @@ class QMLDESIGNERCORE_EXPORT TextEditorView : public AbstractView
Q_OBJECT
public:
TextEditorView(QObject *parent = nullptr);
TextEditorView();
~TextEditorView() override;
// AbstractView

View File

@@ -45,9 +45,8 @@
namespace QmlDesigner {
TimelineView::TimelineView(QObject *parent)
: AbstractView(parent)
, m_timelineWidget(nullptr)
TimelineView::TimelineView()
: m_timelineWidget(nullptr)
{
EasingCurve::registerStreamOperators();
setEnabled(false);

View File

@@ -18,7 +18,7 @@ class TimelineView : public AbstractView
Q_OBJECT
public:
explicit TimelineView(QObject *parent = nullptr);
explicit TimelineView();
~TimelineView() override;
//Abstract View
WidgetInfo widgetInfo() override;

View File

@@ -40,9 +40,8 @@
namespace QmlDesigner {
TransitionEditorView::TransitionEditorView(QObject *parent)
: AbstractView(parent)
, m_transitionEditorWidget(nullptr)
TransitionEditorView::TransitionEditorView()
: m_transitionEditorWidget(nullptr)
{
}

View File

@@ -16,7 +16,7 @@ class TransitionEditorView : public AbstractView
Q_OBJECT
public:
explicit TransitionEditorView(QObject *parent = nullptr);
explicit TransitionEditorView();
~TransitionEditorView() override;
//Abstract View
WidgetInfo widgetInfo() override;

View File

@@ -56,7 +56,7 @@ void ImageCacheCollector::start(Utils::SmallStringView name,
CaptureCallback captureCallback,
AbortCallback abortCallback)
{
RewriterView rewriterView{RewriterView::Amend, nullptr};
RewriterView rewriterView{RewriterView::Amend};
NodeInstanceView nodeInstanceView{m_connectionManager};
nodeInstanceView.setCaptureImageMinimumAndMaximumSize(captureImageMinimumSize,
captureImageMaximumSize);

View File

@@ -78,8 +78,7 @@ public:
EmptyPropertiesRemoved = 0x2
};
Q_DECLARE_FLAGS(PropertyChangeFlags, PropertyChangeFlag)
AbstractView(QObject *parent = nullptr)
: QObject(parent) {}
AbstractView() {}
~AbstractView() override;

View File

@@ -53,7 +53,7 @@ public:
};
public:
RewriterView(DifferenceHandling differenceHandling = RewriterView::Amend, QObject *parent = nullptr);
RewriterView(DifferenceHandling differenceHandling = RewriterView::Amend);
~RewriterView() override;
void modelAttached(Model *model) override;

View File

@@ -218,7 +218,7 @@ static QmlObjectNode createQmlObjectNodeFromSource(AbstractView *view,
textEdit.setPlainText(source);
NotIndentingTextEditModifier modifier(&textEdit);
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend, nullptr));
QScopedPointer<RewriterView> rewriterView(new RewriterView(RewriterView::Amend));
rewriterView->setCheckSemanticErrors(false);
rewriterView->setTextModifier(&modifier);
rewriterView->setAllowComponentRoot(true);

View File

@@ -59,12 +59,11 @@ bool debugQmlPuppet()
#endif
}
RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *parent):
AbstractView(parent),
m_differenceHandling(differenceHandling),
m_positionStorage(new ModelNodePositionStorage),
m_modelToTextMerger(new Internal::ModelToTextMerger(this)),
m_textToModelMerger(new Internal::TextToModelMerger(this))
RewriterView::RewriterView(DifferenceHandling differenceHandling)
: m_differenceHandling(differenceHandling)
, m_positionStorage(new ModelNodePositionStorage)
, m_modelToTextMerger(new Internal::ModelToTextMerger(this))
, m_textToModelMerger(new Internal::TextToModelMerger(this))
{
m_amendTimer.setSingleShot(true);

View File

@@ -58,9 +58,8 @@ VariantProperty TestModelToTextMerger::findAddedVariantProperty(const VariantPro
return VariantProperty();
}
TestRewriterView::TestRewriterView(QObject *parent,
DifferenceHandling differenceHandling)
: RewriterView(differenceHandling, parent)
TestRewriterView::TestRewriterView(DifferenceHandling differenceHandling)
: RewriterView(differenceHandling)
{
//Unit tests do not like the semantic errors
setCheckSemanticErrors(false);

View File

@@ -26,8 +26,7 @@ class TestRewriterView : public RewriterView
Q_OBJECT
public:
TestRewriterView(QObject *parent = 0,
DifferenceHandling differenceHandling = RewriterView::Validate);
TestRewriterView(DifferenceHandling differenceHandling = RewriterView::Validate);
Internal::TestModelToTextMerger *modelToTextMerger() const;
Internal::TextToModelMerger *textToModelMerger() const;

File diff suppressed because it is too large Load Diff

View File

@@ -15,16 +15,7 @@
#include <model.h>
#include <nodeinstanceview.h>
TestView::TestView(QmlDesigner::Model *model)
: QmlDesigner::AbstractView(model)
{
/*
QmlDesigner::NodeInstanceView *nodeInstanceView = new QmlDesigner::NodeInstanceView(model, QmlDesigner::NodeInstanceServerInterface::TestModus);
if (model)
model->setNodeInstanceView(nodeInstanceView);
*/
}
TestView::TestView() {}
void TestView::modelAttached(QmlDesigner::Model *model)
{

View File

@@ -29,7 +29,7 @@ public:
QStringList arguments;
};
TestView(QmlDesigner::Model *model);
TestView();
void modelAttached(QmlDesigner::Model *model);
void modelAboutToBeDetached(QmlDesigner::Model *model);