Remove MovingPixelsState as an Editor observer when the editor is destroyed

This commit is contained in:
David Capello 2015-07-29 16:48:34 -03:00
parent 7cfdf76b0e
commit 46fa7e18cf
2 changed files with 22 additions and 1 deletions

View File

@ -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

View File

@ -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).