Compare commits

...

7 Commits

Author SHA1 Message Date
SiriusXT
0227449c55 fix(tab_manager): correct order when reopening split pane 2025-11-17 22:00:30 +08:00
SiriusXT
f57e90b35c Merge branch 'main' into siriusbcd_close_split 2025-11-17 21:03:54 +08:00
SiriusXT
5a5d242ea0 fix(tab_manager): correct order when reopening split pane 2025-11-17 21:01:21 +08:00
SiriusXT
4afea27fa5 fix(tab_manager): correct order when reopening tabs 2025-11-17 21:00:27 +08:00
SiriusXT
be19d1f5b5 fix(split pane): hide the close button when no split panes exist 2025-11-17 09:24:18 +08:00
SiriusXT
a22687e2d8 Merge branch 'main' into siriusbcd_close_split 2025-11-16 20:15:43 +08:00
SiriusXT
44475853df feat(split): allow closing any split pane 2025-11-16 20:12:56 +08:00
4 changed files with 63 additions and 15 deletions

View File

@@ -647,7 +647,32 @@ export default class TabManager extends Component {
...this.noteContexts.slice(-noteContexts.length), ...this.noteContexts.slice(-noteContexts.length),
...this.noteContexts.slice(lastClosedTab.position, -noteContexts.length) ...this.noteContexts.slice(lastClosedTab.position, -noteContexts.length)
]; ];
this.noteContextReorderEvent({ ntxIdsInOrder: ntxsInOrder.map((nc) => nc.ntxId).filter((id) => id !== null) });
// Update mainNtxId if the restored pane is the main pane in the split pane
const { oldMainNtxId, newMainNtxId } = (() => {
if (noteContexts.length !== 1) {
return { oldMainNtxId: undefined, newMainNtxId: undefined };
}
const mainNtxId = noteContexts[0]?.mainNtxId;
const index = this.noteContexts.findIndex(c => c.ntxId === mainNtxId);
// No need to update if the restored position is after mainNtxId
if (index === -1 || lastClosedTab.position > index) {
return { oldMainNtxId: undefined, newMainNtxId: undefined };
}
return {
oldMainNtxId: this.noteContexts[index].ntxId ?? undefined,
newMainNtxId: noteContexts[0]?.ntxId ?? undefined
};
})();
this.triggerCommand("noteContextReorder", {
ntxIdsInOrder: ntxsInOrder.map((nc) => nc.ntxId).filter((id) => id !== null),
oldMainNtxId,
newMainNtxId
});
let mainNtx = noteContexts.find((nc) => nc.isMainContext()); let mainNtx = noteContexts.find((nc) => nc.isMainContext());
if (mainNtx) { if (mainNtx) {

View File

@@ -1,18 +1,20 @@
import { useEffect, useState } from "preact/hooks"; import { useEffect, useState } from "preact/hooks";
import { t } from "../../services/i18n"; import { t } from "../../services/i18n";
import ActionButton from "../react/ActionButton"; import ActionButton from "../react/ActionButton";
import { useNoteContext, useTriliumEvent } from "../react/hooks"; import { useNoteContext, useTriliumEvents } from "../react/hooks";
import appContext from "../../components/app_context";
export default function ClosePaneButton() { export default function ClosePaneButton() {
const { noteContext, ntxId, parentComponent } = useNoteContext(); const { noteContext, ntxId, parentComponent } = useNoteContext();
const [ isEnabled, setIsEnabled ] = useState(false); const [isEnabled, setIsEnabled] = useState(false);
function refresh() { function refresh() {
setIsEnabled(!!(noteContext && !!noteContext.mainNtxId)); const isMainOfSomeContext = appContext.tabManager.noteContexts.some(c => c.mainNtxId === ntxId);
setIsEnabled(!!(noteContext && (!!noteContext.mainNtxId || isMainOfSomeContext)));
} }
useTriliumEvent("noteContextReorder", refresh); useTriliumEvents(["noteContextRemoved", "noteContextReorder", "newNoteContextCreated"], refresh);
useEffect(refresh, [ ntxId ]); useEffect(refresh, [ntxId]);
return ( return (
<ActionButton <ActionButton

View File

@@ -100,9 +100,23 @@ export default class SplitNoteContainer extends FlexContainer<SplitNoteWidget> {
} }
async closeThisNoteSplitCommand({ ntxId }: CommandListenerData<"closeThisNoteSplit">) { async closeThisNoteSplitCommand({ ntxId }: CommandListenerData<"closeThisNoteSplit">) {
if (ntxId) { if (!ntxId) return;
await appContext.tabManager.removeNoteContext(ntxId); const contexts = appContext.tabManager.noteContexts;
const currentIndex = contexts.findIndex((c) => c.ntxId === ntxId);
if (currentIndex === -1) return;
const isRemoveMainContext = !contexts[currentIndex].mainNtxId;
if (isRemoveMainContext && currentIndex + 1 <= contexts.length) {
const ntxIds = contexts.map((c) => c.ntxId).filter((c) => !!c) as string[];
this.triggerCommand("noteContextReorder", {
ntxIdsInOrder: ntxIds,
oldMainNtxId: ntxId,
newMainNtxId: ntxIds[currentIndex + 1]
});
} }
await appContext.tabManager.removeNoteContext(ntxId);
} }
async moveThisNoteSplitCommand({ ntxId, isMovingLeft }: CommandListenerData<"moveThisNoteSplit">) { async moveThisNoteSplitCommand({ ntxId, isMovingLeft }: CommandListenerData<"moveThisNoteSplit">) {
@@ -167,12 +181,16 @@ export default class SplitNoteContainer extends FlexContainer<SplitNoteWidget> {
splitService.delNoteSplitResizer(ntxIds); splitService.delNoteSplitResizer(ntxIds);
} }
contextsReopenedEvent({ ntxId, afterNtxId }: EventData<"contextsReopened">) { contextsReopenedEvent({ ntxId, mainNtxId, tabPosition, afterNtxId }: EventData<"contextsReopened">) {
if (ntxId === undefined || afterNtxId === undefined) { if (ntxId !== undefined && afterNtxId !== undefined) {
// no single split reopened this.$widget.find(`[data-ntx-id="${ntxId}"]`).insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`));
return; } else if (mainNtxId && tabPosition >= 0) {
const contexts = appContext.tabManager.noteContexts;
const nextIndex = contexts.findIndex(c => c.ntxId === mainNtxId);
const beforeNtxId = (nextIndex !== -1 && nextIndex + 1 < contexts.length) ? contexts[nextIndex + 1].ntxId : null;
this.$widget.find(`[data-ntx-id="${mainNtxId}"]`).insertBefore(this.$widget.find(`[data-ntx-id="${beforeNtxId}"]`));
} }
this.$widget.find(`[data-ntx-id="${ntxId}"]`).insertAfter(this.$widget.find(`[data-ntx-id="${afterNtxId}"]`));
} }
async refresh() { async refresh() {

View File

@@ -820,12 +820,15 @@ export default class TabRowWidget extends BasicWidget {
} }
contextsReopenedEvent({ mainNtxId, tabPosition }: EventData<"contextsReopened">) { contextsReopenedEvent({ mainNtxId, tabPosition }: EventData<"contextsReopened">) {
if (!mainNtxId || !tabPosition) { if (!mainNtxId || tabPosition < 0) {
// no tab reopened // no tab reopened
return; return;
} }
const tabEl = this.getTabById(mainNtxId)[0]; const tabEl = this.getTabById(mainNtxId)[0];
tabEl.parentNode?.insertBefore(tabEl, this.tabEls[tabPosition]);
if ( tabEl && tabEl.parentNode ){
tabEl.parentNode.insertBefore(tabEl, this.tabEls[tabPosition]);
}
} }
updateTabById(ntxId: string | null) { updateTabById(ntxId: string | null) {