@@ -110,7 +110,42 @@ UICodeEditorSplitter::UICodeEditorSplitter( UICodeEditorSplitter::Client* client
110110 }
111111}
112112
113- UICodeEditorSplitter::~UICodeEditorSplitter () {}
113+ UICodeEditorSplitter::~UICodeEditorSplitter () {
114+ std::vector<UITabWidget*> tabWidgets;
115+ {
116+ Lock l ( mTabWidgetMutex );
117+ tabWidgets = mTabWidgets ;
118+ mTabWidgets .clear ();
119+ }
120+
121+ for ( UITabWidget* tabWidget : tabWidgets ) {
122+ if ( nullptr == tabWidget )
123+ continue ;
124+
125+ tabWidget->setTabTryCloseCallback ( nullptr );
126+ tabWidget->setSplitFunction ( nullptr , mVisualSplitEdgePercent );
127+ auto tabWidgetCbsIt = mEventCbs .find ( tabWidget );
128+ if ( tabWidgetCbsIt != mEventCbs .end () )
129+ tabWidget->removeEventListener ( tabWidgetCbsIt->second );
130+
131+ for ( size_t i = 0 ; i < tabWidget->getTabCount (); ++i ) {
132+ UITab* tab = tabWidget->getTab ( i );
133+ if ( nullptr == tab || nullptr == tab->getOwnedWidget () ||
134+ !tab->getOwnedWidget ()->isWidget () )
135+ continue ;
136+
137+ UIWidget* widget = tab->getOwnedWidget ()->asType <UIWidget>();
138+ auto widgetCbsIt = mEventCbs .find ( widget );
139+ if ( widgetCbsIt != mEventCbs .end () )
140+ widget->removeEventListener ( widgetCbsIt->second );
141+ }
142+ }
143+
144+ mEventCbs .clear ();
145+ mCurEditor = nullptr ;
146+ mCurWidget = nullptr ;
147+ mClient = nullptr ;
148+ }
114149
115150UITabWidget* UICodeEditorSplitter::tabWidgetFromEditor ( UICodeEditor* editor ) const {
116151 if ( editor && editor->getData () != 0 )
@@ -256,7 +291,7 @@ UICodeEditor* UICodeEditorSplitter::createCodeEditor() {
256291 registerSplitterCommands ( doc );
257292 /* Splitter commands */
258293
259- editor->on ( Event::OnFocus, [this ]( const Event* event ) {
294+ mEventCbs [editor]. push_back ( editor->on ( Event::OnFocus, [this ]( const Event* event ) {
260295 UICodeEditor* editor = event->getNode ()->asType <UICodeEditor>();
261296 UICodeEditor* prevEditor = mCurEditor ;
262297 if ( mRestoreEditorSelectionOnFocus && prevEditor && prevEditor != editor &&
@@ -265,29 +300,32 @@ UICodeEditor* UICodeEditorSplitter::createCodeEditor() {
265300 setCurrentWidget ( editor );
266301 if ( mRestoreEditorSelectionOnFocus && prevEditor && prevEditor != editor )
267302 restoreEditorSelection ( editor );
268- } );
269- editor->on ( Event::OnFocusLoss, [this ]( const Event* event ) {
303+ } ) ) ;
304+ mEventCbs [editor]. push_back ( editor->on ( Event::OnFocusLoss, [this ]( const Event* event ) {
270305 if ( mRestoreEditorSelectionOnFocus )
271306 saveEditorSelection ( event->getNode ()->asType <UICodeEditor>() );
272- } );
273- editor->on ( Event::OnTextChanged, [this ]( const Event* event ) {
307+ } ) ) ;
308+ mEventCbs [editor]. push_back ( editor->on ( Event::OnTextChanged, [this ]( const Event* event ) {
274309 mClient ->onDocumentModified ( event->getNode ()->asType <UICodeEditor>(),
275310 event->getNode ()->asType <UICodeEditor>()->getDocument () );
276- } );
277- editor->on ( Event::OnSelectionChanged, [this ]( const Event* event ) {
278- mClient ->onDocumentSelectionChange (
279- event->getNode ()->asType <UICodeEditor>(),
280- event->getNode ()->asType <UICodeEditor>()->getDocument () );
281- } );
282- editor->on ( Event::OnCursorPosChange, [this ]( const Event* event ) {
283- mClient ->onDocumentCursorPosChange (
284- event->getNode ()->asType <UICodeEditor>(),
285- event->getNode ()->asType <UICodeEditor>()->getDocument () );
286- } );
287- editor->on ( Event::OnDocumentUndoRedo, [this ]( const Event* event ) {
288- mClient ->onDocumentUndoRedo ( event->getNode ()->asType <UICodeEditor>(),
289- event->getNode ()->asType <UICodeEditor>()->getDocument () );
290- } );
311+ } ) );
312+ mEventCbs [editor].push_back (
313+ editor->on ( Event::OnSelectionChanged, [this ]( const Event* event ) {
314+ mClient ->onDocumentSelectionChange (
315+ event->getNode ()->asType <UICodeEditor>(),
316+ event->getNode ()->asType <UICodeEditor>()->getDocument () );
317+ } ) );
318+ mEventCbs [editor].push_back (
319+ editor->on ( Event::OnCursorPosChange, [this ]( const Event* event ) {
320+ mClient ->onDocumentCursorPosChange (
321+ event->getNode ()->asType <UICodeEditor>(),
322+ event->getNode ()->asType <UICodeEditor>()->getDocument () );
323+ } ) );
324+ mEventCbs [editor].push_back (
325+ editor->on ( Event::OnDocumentUndoRedo, [this ]( const Event* event ) {
326+ mClient ->onDocumentUndoRedo ( event->getNode ()->asType <UICodeEditor>(),
327+ event->getNode ()->asType <UICodeEditor>()->getDocument () );
328+ } ) );
291329 editor->addKeyBinds ( getLocalDefaultKeybindings () );
292330 editor->addUnlockedCommands ( getUnlockedCommands () );
293331
@@ -569,11 +607,12 @@ UICodeEditorSplitter::createCodeEditorInTabWidget( UITabWidget* tabWidget ) {
569607 return std::make_pair ( (UITab*)nullptr , (UICodeEditor*)nullptr );
570608 UICodeEditor* editor = createCodeEditor ();
571609 mAboutToAddEditor = editor;
572- editor->on ( Event::OnDocumentChanged, [this ]( const Event* event ) {
573- UICodeEditor* editor = event->getNode ()->asType <UICodeEditor>();
574- mEditorSelections .erase ( editor );
575- mClient ->onDocumentStateChanged ( editor, editor->getDocument () );
576- } );
610+ mEventCbs [editor].push_back (
611+ editor->on ( Event::OnDocumentChanged, [this ]( const Event* event ) {
612+ UICodeEditor* editor = event->getNode ()->asType <UICodeEditor>();
613+ mEditorSelections .erase ( editor );
614+ mClient ->onDocumentStateChanged ( editor, editor->getDocument () );
615+ } ) );
577616 UITab* tab = tabWidget->add ( editor->getDocument ().getFilename (), editor );
578617 editor->setData ( (UintPtr)tab );
579618 DocEvent docEvent ( editor, &editor->getDocument (), Event::OnEditorTabReady );
@@ -616,21 +655,21 @@ UICodeEditorSplitter::createWidgetInTabWidget( UITabWidget* tabWidget, UIWidget*
616655 widget->setData ( (UintPtr)tab );
617656 // We use both events because there was an strange behavior that sometimes OnFocusWithin was not
618657 // enough, so this is just in case.
619- widget->on ( Event::OnFocus, [this ]( const Event* event ) {
658+ mEventCbs [widget]. push_back ( widget->on ( Event::OnFocus, [this ]( const Event* event ) {
620659 setCurrentWidget ( event->getNode ()->asType <UIWidget>() );
621- } );
622- widget->on ( Event::OnFocusWithin, [this ]( const Event* event ) {
660+ } ) ) ;
661+ mEventCbs [widget]. push_back ( widget->on ( Event::OnFocusWithin, [this ]( const Event* event ) {
623662 setCurrentWidget ( event->getNode ()->asType <UIWidget>() );
624- } );
625- widget->on ( Event::OnTitleChange, [this ]( const Event* event ) {
663+ } ) ) ;
664+ mEventCbs [widget]. push_back ( widget->on ( Event::OnTitleChange, [this ]( const Event* event ) {
626665 const TextEvent* tevent = static_cast <const TextEvent*>( event );
627666 UIWidget* widget = event->getNode ()->asType <UIWidget>();
628667 UITabWidget* tabWidget = tabWidgetFromWidget ( widget );
629668 UITab* tab = tabWidget->getTabFromOwnedWidget ( widget );
630669 if ( !tab )
631670 return ;
632671 tab->setText ( tevent->getText () );
633- } );
672+ } ) ) ;
634673 if ( focus )
635674 tabWidget->setTabSelected ( tab );
636675 mClient ->onTabCreated ( tab, widget );
@@ -713,7 +752,8 @@ UITabWidget* UICodeEditorSplitter::createTabWidget( Node* parent ) {
713752 },
714753 mVisualSplitEdgePercent );
715754 }
716- tabWidget->on ( Event::OnTabSelected, [this ]( const Event* event ) {
755+ mEventCbs [tabWidget].push_back ( tabWidget->on ( Event::OnTabSelected, [this ](
756+ const Event* event ) {
717757 UITabWidget* tabWidget = event->getNode ()->asType <UITabWidget>();
718758 eeASSERT ( nullptr != tabWidget && nullptr != tabWidget->getTabSelected () &&
719759 nullptr != tabWidget->getTabSelected ()->getOwnedWidget () );
@@ -727,7 +767,7 @@ UITabWidget* UICodeEditorSplitter::createTabWidget( Node* parent ) {
727767 } else {
728768 setCurrentWidget ( tabWidget->getTabSelected ()->getOwnedWidget ()->asType <UIWidget>() );
729769 }
730- } );
770+ } ) ) ;
731771 tabWidget->setTabTryCloseCallback (
732772 [this ]( UITab* tab, UITabWidget::FocusTabBehavior focusTabBehavior ) -> bool {
733773 if ( tab->getOwnedWidget () &&
@@ -737,9 +777,10 @@ UITabWidget* UICodeEditorSplitter::createTabWidget( Node* parent ) {
737777 }
738778 return false ;
739779 } );
740- tabWidget->on ( Event::OnTabClosed, [this ]( const Event* event ) {
741- onTabClosed ( static_cast <const TabEvent*>( event ) );
742- } );
780+ mEventCbs [tabWidget].push_back (
781+ tabWidget->on ( Event::OnTabClosed, [this ]( const Event* event ) {
782+ onTabClosed ( static_cast <const TabEvent*>( event ) );
783+ } ) );
743784 if ( mOnTabWidgetCreateCb )
744785 mOnTabWidgetCreateCb ( tabWidget );
745786 Lock l ( mTabWidgetMutex );
@@ -1842,12 +1883,22 @@ void UICodeEditorSplitter::closeSplitter( UISplitter* splitter ) {
18421883void UICodeEditorSplitter::onTabClosed ( const TabEvent* tabEvent ) {
18431884 UIWidget* widget = tabEvent->getTab ()->getOwnedWidget ()->asType <UIWidget>();
18441885 UITabWidget* tabWidget = tabEvent->getTab ()->getTabWidget ();
1886+ auto widgetCbsIt = mEventCbs .find ( widget );
1887+ if ( widgetCbsIt != mEventCbs .end () ) {
1888+ widget->removeEventListener ( widgetCbsIt->second );
1889+ mEventCbs .erase ( widgetCbsIt );
1890+ }
18451891 if ( widget && widget->isType ( UI_TYPE_CODEEDITOR ) )
18461892 mEditorSelections .erase ( widget->asType <UICodeEditor>() );
18471893 if ( tabWidget->getTabCount () == 0 ) {
18481894 UISplitter* splitter = splitterFromWidget ( widget );
18491895 if ( splitter ) {
18501896 if ( splitter->isFull () ) {
1897+ auto tabWidgetCbsIt = mEventCbs .find ( tabWidget );
1898+ if ( tabWidgetCbsIt != mEventCbs .end () ) {
1899+ tabWidget->removeEventListener ( tabWidgetCbsIt->second );
1900+ mEventCbs .erase ( tabWidgetCbsIt );
1901+ }
18511902 tabWidget->close ();
18521903 auto itWidget = std::find ( mTabWidgets .begin (), mTabWidgets .end (), tabWidget );
18531904 if ( itWidget != mTabWidgets .end () ) {
0 commit comments