From 0902fa7629e0badbed2105b0a7cc0792228f7bce Mon Sep 17 00:00:00 2001 From: David Capello Date: Tue, 21 May 2019 15:14:06 -0300 Subject: [PATCH] Fix crash closing the program when the Data Recovery tab open --- src/app/ui/home_view.cpp | 12 ++++++++++-- src/app/ui/home_view.h | 2 ++ src/app/ui/workspace.cpp | 5 ++++- src/app/ui/workspace_view.h | 3 +++ 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/src/app/ui/home_view.cpp b/src/app/ui/home_view.cpp index 7aa23d13c..ce1a85bc3 100644 --- a/src/app/ui/home_view.cpp +++ b/src/app/ui/home_view.cpp @@ -1,4 +1,5 @@ // Aseprite +// Copyright (C) 2019 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -75,8 +76,7 @@ HomeView::~HomeView() { #ifdef ENABLE_DATA_RECOVERY if (m_dataRecoveryView) { - if (m_dataRecoveryView->parent()) - App::instance()->workspace()->removeView(m_dataRecoveryView); + ASSERT(!m_dataRecoveryView->parent()); delete m_dataRecoveryView; } #endif @@ -106,6 +106,14 @@ bool HomeView::onCloseView(Workspace* workspace, bool quitting) return true; } +void HomeView::onAfterRemoveView(Workspace* workspace) +{ + if (m_dataRecoveryView && + m_dataRecoveryView->parent()) { + workspace->removeView(m_dataRecoveryView); + } +} + void HomeView::onTabPopup(Workspace* workspace) { Menu* menu = AppMenus::instance()->getTabPopupMenu(); diff --git a/src/app/ui/home_view.h b/src/app/ui/home_view.h index 8b225aafe..b65f8e150 100644 --- a/src/app/ui/home_view.h +++ b/src/app/ui/home_view.h @@ -1,4 +1,5 @@ // Aseprite +// Copyright (C) 2019 Igara Studio S.A. // Copyright (C) 2001-2016 David Capello // // This program is distributed under the terms of @@ -50,6 +51,7 @@ namespace app { // WorkspaceView implementation ui::Widget* getContentWidget() override { return this; } bool onCloseView(Workspace* workspace, bool quitting) override; + void onAfterRemoveView(Workspace* workspace) override; void onTabPopup(Workspace* workspace) override; void onWorkspaceViewSelected() override; diff --git a/src/app/ui/workspace.cpp b/src/app/ui/workspace.cpp index c75fc0daa..70161200c 100644 --- a/src/app/ui/workspace.cpp +++ b/src/app/ui/workspace.cpp @@ -1,5 +1,5 @@ // Aseprite -// Copyright (C) 2018 Igara Studio S.A. +// Copyright (C) 2018-2019 Igara Studio S.A. // Copyright (C) 2001-2018 David Capello // // This program is distributed under the terms of @@ -72,12 +72,15 @@ void Workspace::addView(WorkspaceView* view, int pos) void Workspace::removeView(WorkspaceView* view) { + ASSERT(view); base::remove_from_container(m_views, view); WorkspacePanel* panel = getViewPanel(view); ASSERT(panel); if (panel) panel->removeView(view); + + view->onAfterRemoveView(this); } bool Workspace::closeView(WorkspaceView* view, bool quitting) diff --git a/src/app/ui/workspace_view.h b/src/app/ui/workspace_view.h index e2259a868..214c65844 100644 --- a/src/app/ui/workspace_view.h +++ b/src/app/ui/workspace_view.h @@ -1,4 +1,5 @@ // Aseprite +// Copyright (C) 2019 Igara Studio S.A. // Copyright (C) 2001-2016 David Capello // // This program is distributed under the terms of @@ -38,6 +39,8 @@ namespace app { // the user cancels the operation. virtual bool onCloseView(Workspace* workspace, bool quitting) = 0; + virtual void onAfterRemoveView(Workspace* workspace) { } + virtual void onTabPopup(Workspace* workspace) = 0; virtual InputChainElement* onGetInputChainElement() { return nullptr; }