From 2c8eb82d429242089c298c6ce3b4c82227183944 Mon Sep 17 00:00:00 2001 From: dymani Date: Sat, 3 Jun 2023 05:54:33 +0800 Subject: [PATCH 1/2] Reopen recently closed tab/split in place --- src/public/app/components/tab_manager.js | 37 ++++++++++++++++--- .../containers/split_note_container.js | 9 +++++ src/public/app/widgets/tab_row.js | 9 +++++ 3 files changed, 50 insertions(+), 5 deletions(-) diff --git a/src/public/app/components/tab_manager.js b/src/public/app/components/tab_manager.js index 53c3ccbbd..e29e642cc 100644 --- a/src/public/app/components/tab_manager.js +++ b/src/public/app/components/tab_manager.js @@ -17,7 +17,7 @@ export default class TabManager extends Component { this.activeNtxId = null; - // elements are arrays of note contexts for each tab (one main context + subcontexts [splits]) + // elements are arrays of {contexts, position}, storing note contexts for each tab (one main context + subcontexts [splits]), and the original position of the tab this.recentlyClosedTabs = []; this.tabsUpdate = new SpacedUpdate(async () => { @@ -418,21 +418,23 @@ export default class TabManager extends Component { removeNoteContexts(noteContextsToRemove) { const ntxIdsToRemove = noteContextsToRemove.map(nc => nc.ntxId); + const position = this.noteContexts.findIndex(nc => ntxIdsToRemove.includes(nc.ntxId)); + this.children = this.children.filter(nc => !ntxIdsToRemove.includes(nc.ntxId)); - this.addToRecentlyClosedTabs(noteContextsToRemove); + this.addToRecentlyClosedTabs(noteContextsToRemove, position); this.triggerEvent('noteContextRemoved', {ntxIds: ntxIdsToRemove}); this.tabsUpdate.scheduleUpdate(); } - addToRecentlyClosedTabs(noteContexts) { + addToRecentlyClosedTabs(noteContexts, position) { if (noteContexts.length === 1 && noteContexts[0].isEmpty()) { return; } - this.recentlyClosedTabs.push(noteContexts); + this.recentlyClosedTabs.push({contexts: noteContexts, position: position}); } tabReorderEvent({ntxIdsInOrder}) { @@ -544,7 +546,8 @@ export default class TabManager extends Component { closeLastEmptyTab = this.noteContexts[0]; } - const noteContexts = this.recentlyClosedTabs.pop(); + const lastClosedTab = this.recentlyClosedTabs.pop(); + const noteContexts = lastClosedTab.contexts; for (const noteContext of noteContexts) { this.child(noteContext); @@ -552,6 +555,30 @@ export default class TabManager extends Component { await this.triggerEvent('newNoteContextCreated', {noteContext}); } + // restore last position of contexts stored in tab manager + const ntxsInOrder = [ + ...this.noteContexts.slice(0, lastClosedTab.position), + ...this.noteContexts.slice(-noteContexts.length), + ...this.noteContexts.slice(lastClosedTab.position, -noteContexts.length), + ] + await this.noteContextReorderEvent({ntxIdsInOrder: ntxsInOrder.map(nc => nc.ntxId)}); + + let mainNtx = noteContexts.find(nc => nc.isMainContext()); + if (mainNtx) { + // reopened a tab, need to reorder new tab widget in tab row + await this.triggerEvent('contextsReopened', { + mainNtxId: mainNtx.ntxId, + tabPosition: ntxsInOrder.filter(nc => nc.isMainContext()).findIndex(nc => nc.ntxId === mainNtx.ntxId) + }); + } else { + // reopened a single split, need to reorder the pane widget in split note container + await this.triggerEvent('contextsReopened', { + ntxId: ntxsInOrder[lastClosedTab.position].ntxId, + // this is safe since lastClosedTab.position can never be 0 in this case + afterNtxId: ntxsInOrder[lastClosedTab.position - 1].ntxId + }); + } + const noteContextToActivate = noteContexts.length === 1 ? noteContexts[0] : noteContexts.find(nc => nc.isMainContext()); diff --git a/src/public/app/widgets/containers/split_note_container.js b/src/public/app/widgets/containers/split_note_container.js index 0188add6d..747f5dfae 100644 --- a/src/public/app/widgets/containers/split_note_container.js +++ b/src/public/app/widgets/containers/split_note_container.js @@ -136,6 +136,15 @@ export default class SplitNoteContainer extends FlexContainer { } } + contextsReopenedEvent({ntxId, afterNtxId}) { + if (ntxId === undefined || afterNtxId === undefined) { + // no single split reopened + return; + } + this.$widget.find(`[data-ntx-id="${ntxId}"]`) + .insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`)); + } + async refresh() { this.toggleExt(true); } diff --git a/src/public/app/widgets/tab_row.js b/src/public/app/widgets/tab_row.js index 9081ed9e1..671a191dc 100644 --- a/src/public/app/widgets/tab_row.js +++ b/src/public/app/widgets/tab_row.js @@ -620,6 +620,15 @@ export default class TabRowWidget extends BasicWidget { this.updateTabById(newMainNtxId); } + contextsReopenedEvent({mainNtxId, tabPosition}) { + if (mainNtxId === undefined || tabPosition === undefined) { + // no tab reopened + return; + } + const tabEl = this.getTabById(mainNtxId)[0]; + tabEl.parentNode.insertBefore(tabEl, this.tabEls[tabPosition]); + } + updateTabById(ntxId) { const $tab = this.getTabById(ntxId); From 50ec17433d852d77e2a190c36aebc285633189ca Mon Sep 17 00:00:00 2001 From: dymani Date: Sat, 3 Jun 2023 05:59:53 +0800 Subject: [PATCH 2/2] Fix move pane button after reopen split --- src/public/app/widgets/buttons/move_pane_button.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/public/app/widgets/buttons/move_pane_button.js b/src/public/app/widgets/buttons/move_pane_button.js index 632651ca5..c7e6bdf60 100644 --- a/src/public/app/widgets/buttons/move_pane_button.js +++ b/src/public/app/widgets/buttons/move_pane_button.js @@ -44,4 +44,8 @@ export default class MovePaneButton extends OnClickButtonWidget { async noteContextReorderEvent() { this.refresh(); } + + async contextsReopenedEvent() { + this.refresh(); + } }