From 46fa7e18cf212af34eb7434b82c46d0349112396 Mon Sep 17 00:00:00 2001 From: David Capello Date: Wed, 29 Jul 2015 16:48:34 -0300 Subject: [PATCH] Remove MovingPixelsState as an Editor observer when the editor is destroyed --- src/app/ui/editor/moving_pixels_state.cpp | 19 ++++++++++++++++++- src/app/ui/editor/moving_pixels_state.h | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/app/ui/editor/moving_pixels_state.cpp b/src/app/ui/editor/moving_pixels_state.cpp index cbdae7e6b..85840ab90 100644 --- a/src/app/ui/editor/moving_pixels_state.cpp +++ b/src/app/ui/editor/moving_pixels_state.cpp @@ -53,6 +53,7 @@ using namespace ui; MovingPixelsState::MovingPixelsState(Editor* editor, MouseMessage* msg, PixelsMovementPtr pixelsMovement, HandleType handle) : m_editor(editor) + , m_observingEditor(false) , m_discarded(false) { // MovingPixelsState needs a selection tool to avoid problems @@ -97,6 +98,7 @@ MovingPixelsState::MovingPixelsState(Editor* editor, MouseMessage* msg, PixelsMo m_editor->getManager()->addMessageFilter(kKeyDownMessage, m_editor); m_editor->getManager()->addMessageFilter(kKeyUpMessage, m_editor); m_editor->addObserver(this); + m_observingEditor = true; ContextBar* contextBar = App::instance()->getMainWindow()->getContextBar(); contextBar->updateForMovingPixels(); @@ -111,7 +113,7 @@ MovingPixelsState::~MovingPixelsState() m_pixelsMovement.reset(NULL); - m_editor->removeObserver(this); + removeAsEditorObserver(); m_editor->getManager()->removeMessageFilter(kKeyDownMessage, m_editor); m_editor->getManager()->removeMessageFilter(kKeyUpMessage, m_editor); @@ -486,6 +488,13 @@ void MovingPixelsState::onBeforeCommandExecution(Command* command) dropPixels(); } +void MovingPixelsState::onDestroyEditor(Editor* editor) +{ + // TODO we should call ~MovingPixelsState(), we should delete the + // whole "m_statesHistory" when an editor is deleted. + removeAsEditorObserver(); +} + void MovingPixelsState::onBeforeFrameChanged(Editor* editor) { if (!isActiveDocument()) @@ -570,4 +579,12 @@ bool MovingPixelsState::isActiveEditor() const return (targetEditor == m_editor); } +void MovingPixelsState::removeAsEditorObserver() +{ + if (m_observingEditor) { + m_observingEditor = false; + m_editor->removeObserver(this); + } +} + } // namespace app diff --git a/src/app/ui/editor/moving_pixels_state.h b/src/app/ui/editor/moving_pixels_state.h index 5307e8080..1cb52e882 100644 --- a/src/app/ui/editor/moving_pixels_state.h +++ b/src/app/ui/editor/moving_pixels_state.h @@ -50,6 +50,7 @@ namespace app { virtual bool requireBrushPreview() override { return false; } // EditorObserver + virtual void onDestroyEditor(Editor* editor) override; virtual void onBeforeFrameChanged(Editor* editor) override; virtual void onBeforeLayerChanged(Editor* editor) override; @@ -70,9 +71,12 @@ namespace app { bool isActiveDocument() const; bool isActiveEditor() const; + void removeAsEditorObserver(); + // Helper member to move/translate selection and pixels. PixelsMovementPtr m_pixelsMovement; Editor* m_editor; + bool m_observingEditor; // True if the image was discarded (e.g. when a "Cut" command was // used to remove the dragged image).