From 39f0f26f2877168632bdb8a665423af9f17638cf Mon Sep 17 00:00:00 2001 From: zadam Date: Fri, 21 May 2021 22:34:40 +0200 Subject: [PATCH] split window WIP --- src/public/app/services/tab_manager.js | 23 ++-- .../app/widgets/containers/pane_container.js | 105 ++++++++++++------ src/public/app/widgets/tab_caching_widget.js | 2 +- src/public/app/widgets/type_widgets/empty.js | 1 - 4 files changed, 82 insertions(+), 49 deletions(-) diff --git a/src/public/app/services/tab_manager.js b/src/public/app/services/tab_manager.js index c95d6b323..a5d41d2ab 100644 --- a/src/public/app/services/tab_manager.js +++ b/src/public/app/services/tab_manager.js @@ -100,6 +100,8 @@ export default class TabManager extends Component { filteredTabs[0].active = true; } + console.log("filteredTabs", filteredTabs); + await this.tabsUpdate.allowUpdateWithoutChange(async () => { for (const tab of filteredTabs) { await this.openTabWithNote(tab.notePath, tab.active, tab.tabId, tab.hoistedNoteId, tab.parentTabId); @@ -201,8 +203,15 @@ export default class TabManager extends Component { await tabContext.setEmpty(); } - async openEmptyTab(tabId, hoistedNoteId, parentTabId = null) { + async openEmptyTab(tabId, hoistedNoteId = 'root', parentTabId = null) { const tabContext = new TabContext(tabId, hoistedNoteId, parentTabId); + + const existingTabContext = this.children.find(tc => tc.tabId === tabContext.tabId); + + if (existingTabContext) { + return existingTabContext; + } + this.child(tabContext); await this.triggerEvent('newTabOpened', {tabContext}); @@ -228,7 +237,7 @@ export default class TabManager extends Component { return this.openTabWithNote(notePath, false, null, hoistedNoteId); } - async openTabWithNote(notePath, activate, tabId, hoistedNoteId, parentTabId = null) { + async openTabWithNote(notePath, activate, tabId, hoistedNoteId = 'root', parentTabId = null) { const tabContext = await this.openEmptyTab(tabId, hoistedNoteId, parentTabId); if (notePath) { @@ -280,15 +289,7 @@ export default class TabManager extends Component { } async removeTab(tabId) { - let mainTabContextToRemove = this.getTabContextById(tabId); - - if (!mainTabContextToRemove) { - return; - } - - if (mainTabContextToRemove.parentTabId) { - mainTabContextToRemove = this.getTabContextById(mainTabContextToRemove.parentTabId); - } + const mainTabContextToRemove = this.getTabContextById(tabId).getMainTabContext(); // close dangling autocompletes after closing the tab $(".aa-input").autocomplete("close"); diff --git a/src/public/app/widgets/containers/pane_container.js b/src/public/app/widgets/containers/pane_container.js index ea2828e1e..7b5fb51a4 100644 --- a/src/public/app/widgets/containers/pane_container.js +++ b/src/public/app/widgets/containers/pane_container.js @@ -14,51 +14,55 @@ export default class PaneContainer extends FlexContainer { this.css('flex-grow', '1'); } - setTabContextEvent({tabContext}) { - /** @var {TabContext} */ - this.tabContext = tabContext; - } - async newTabOpenedEvent({tabContext}) { const widget = this.widgetFactory(); const $renderedWidget = widget.render(); - $renderedWidget.on('click', () => { - appContext.tabManager.activateTab(tabContext.tabId); - }); + $renderedWidget.attr("data-main-tab-id", tabContext.tabId); - let $parent; + $renderedWidget.on('click', () => appContext.tabManager.activateTab(tabContext.tabId)); - if (!tabContext.parentTabId) { - $parent = $("
") - .attr("data-main-tab-id", tabContext.tabId) - .css("display", "flex") - .css("flex-grow", "1"); - - this.$widget.append($parent); - } - else { - $parent = this.$widget.find(`[data-main-tab-id="${tabContext.parentTabId}"]`); - } - - $parent.append($renderedWidget); + this.$widget.append($renderedWidget); this.widgets[tabContext.tabId] = widget; await widget.handleEvent('setTabContext', { tabContext }); this.child(widget); + + this.refresh(); } async openNewPaneCommand() { - const tabContext = await appContext.tabManager.openEmptyTab(null, null, appContext.tabManager.getActiveTabContext().tabId); + const tabContext = await appContext.tabManager.openEmptyTab(null, 'root', appContext.tabManager.getActiveTabContext().tabId); await appContext.tabManager.activateTab(tabContext.tabId); await tabContext.setEmpty(); } + async refresh() { + this.toggleExt(true); + } + + toggleInt(show) {} // not needed + + toggleExt(show) { + const activeTabId = appContext.tabManager.getActiveTabContext().getMainTabContext().tabId; + + for (const tabId in this.widgets) { + const tabContext = appContext.tabManager.getTabContextById(tabId); + + const widget = this.widgets[tabId]; + widget.toggleExt(show && activeTabId && [tabContext.tabId, tabContext.parentTabId].includes(activeTabId)); + + if (!widget.hasBeenAlreadyShown) { + widget.handleEvent('activeTabChanged', {tabContext}); + } + } + } + /** * widget.hasBeenAlreadyShown is intended for lazy loading of cached tabs - initial note switches of new tabs * are not executed, we're waiting for the first tab activation and then we update the tab. After this initial @@ -69,27 +73,56 @@ export default class PaneContainer extends FlexContainer { // this event is propagated only to the widgets of a particular tab const widget = this.widgets[data.tabContext.tabId]; - if (widget && (widget.hasBeenAlreadyShown || name === 'tabNoteSwitchedAndActivated')) { - widget.hasBeenAlreadyShown = true; - - return widget.handleEvent('tabNoteSwitched', data); - } - else { + if (!widget) { return Promise.resolve(); } + + const promises = []; + + for (const subTabContext of data.tabContext.getMainTabContext().getAllSubTabContexts()) { + const subWidget = this.widgets[subTabContext.tabId]; + + if (!subWidget) { + continue; + } + + if (subTabContext !== data.tabContext && !subWidget.hasBeenAlreadyShown) { + promises.push(widget.handleEvent('activeTabChanged', {tabContext: subTabContext})); + continue; + } + + if (subTabContext === data.tabContext && (subWidget.hasBeenAlreadyShown || name === 'tabNoteSwitchedAndActivated')) { + subWidget.hasBeenAlreadyShown = true; + + promises.push(widget.handleEvent('tabNoteSwitched', data)); + } + } + + if (name === 'tabNoteSwitchedAndActivated') { + this.toggleExt(true); + } + + return Promise.all(promises); } if (name === 'activeTabChanged') { - const widget = this.widgets[data.tabContext.tabId]; + const promises = []; - if (widget.hasBeenAlreadyShown) { - return Promise.resolve(); - } - else { - widget.hasBeenAlreadyShown = true; + for (const subTabContext of data.tabContext.getMainTabContext().getAllSubTabContexts()) { + console.log("subTabContext", subTabContext); - return widget.handleEvent(name, data); + const widget = this.widgets[subTabContext.tabId]; + + if (!widget.hasBeenAlreadyShown) { + widget.hasBeenAlreadyShown = true; + + promises.push(widget.handleEvent(name, {tabContext: subTabContext})); + } } + + this.toggleExt(true); + + return Promise.all(promises); } else { return super.handleEventInChildren(name, data); } diff --git a/src/public/app/widgets/tab_caching_widget.js b/src/public/app/widgets/tab_caching_widget.js index 5438dd8a3..2072b5405 100644 --- a/src/public/app/widgets/tab_caching_widget.js +++ b/src/public/app/widgets/tab_caching_widget.js @@ -55,7 +55,7 @@ export default class TabCachingWidget extends TabAwareWidget { toggleExt(show) { for (const tabId in this.widgets) { - this.widgets[tabId].toggleExt(show && this.isTabOrParent(tabId)); + this.widgets[tabId].toggleExt(show && this.isTab(tabId)); } } diff --git a/src/public/app/widgets/type_widgets/empty.js b/src/public/app/widgets/type_widgets/empty.js index 960b4c8a4..3c9a32440 100644 --- a/src/public/app/widgets/type_widgets/empty.js +++ b/src/public/app/widgets/type_widgets/empty.js @@ -2,7 +2,6 @@ import noteAutocompleteService from '../../services/note_autocomplete.js'; import TypeWidget from "./type_widget.js"; import appContext from "../../services/app_context.js"; import searchService from "../../services/search.js"; -import linkService from "../../services/link.js"; const TPL = `