diff --git a/toonz/sources/include/toonzqt/treemodel.h b/toonz/sources/include/toonzqt/treemodel.h index 1193124..864747c 100644 --- a/toonz/sources/include/toonzqt/treemodel.h +++ b/toonz/sources/include/toonzqt/treemodel.h @@ -130,6 +130,7 @@ public slots: protected: void setRootItem(Item *rootItem); + void setRootItem_NoFree(Item *rootItem); Item *getRootItem() const { return m_rootItem; } private: diff --git a/toonz/sources/toonzqt/functiontreeviewer.cpp b/toonz/sources/toonzqt/functiontreeviewer.cpp index 58be7a8..0cd2875 100644 --- a/toonz/sources/toonzqt/functiontreeviewer.cpp +++ b/toonz/sources/toonzqt/functiontreeviewer.cpp @@ -1215,7 +1215,10 @@ void FunctionTreeModel::resetAll() { beginResetModel(); #endif m_activeChannels.clear(); - setRootItem(0); + + TreeModel::Item *root_item = getRootItem(); + setRootItem_NoFree(NULL); + m_stageObjects = 0; m_fxs = 0; #if QT_VERSION < 0x050000 @@ -1226,6 +1229,10 @@ void FunctionTreeModel::resetAll() { refreshActiveChannels(); endRefresh(); + // postpone until after refresh, + // since its members are used for reference. + delete root_item; + m_currentChannel = 0; #if QT_VERSION >= 0x050000 diff --git a/toonz/sources/toonzqt/treemodel.cpp b/toonz/sources/toonzqt/treemodel.cpp index 0dea327..49404fc 100644 --- a/toonz/sources/toonzqt/treemodel.cpp +++ b/toonz/sources/toonzqt/treemodel.cpp @@ -310,6 +310,13 @@ void TreeModel::setRootItem(Item *rootItem) { if (m_rootItem) m_rootItem->setModel(this); } +// postpone freeing, so existing items can be referenced while refreshing. +void TreeModel::setRootItem_NoFree(Item *rootItem) { + if (rootItem == m_rootItem) return; + m_rootItem = rootItem; + if (m_rootItem) m_rootItem->setModel(this); +} + //--------------------------------------------------------------------------------------------------------------- void TreeModel::setRowHidden(int row, const QModelIndex &parent, bool hide) {