From ba63c3a60902d45c175f98e22124db536de5b42c Mon Sep 17 00:00:00 2001 From: qu1ck Date: Sat, 11 May 2024 17:05:04 -0700 Subject: [PATCH] Remember last open server tab Also move opentabs config field into app section Issue #199 --- src/components/app.tsx | 2 +- src/components/servertabs.tsx | 14 +++++++++----- src/config.ts | 32 ++++++++++++++++++++++++-------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/src/components/app.tsx b/src/components/app.tsx index af6c5df..9f17878 100644 --- a/src/components/app.tsx +++ b/src/components/app.tsx @@ -102,7 +102,7 @@ export default function TauriApp() { const tabsRef = useRef(null); const [currentServer, setCurrentServer] = useState( - config.getServer(config.getOpenTabs()[0])); + config.getServer(config.getLastOpenTab())); const [servers, setServers] = useState(config.getServers()); const [showServerConfig, serverConfigHandlers] = useDisclosure(false); diff --git a/src/components/servertabs.tsx b/src/components/servertabs.tsx index e953763..5917819 100644 --- a/src/components/servertabs.tsx +++ b/src/components/servertabs.tsx @@ -43,11 +43,11 @@ export const ServerTabs = React.forwardRef(funct const [tabs, setTabs] = useState({ openTabs: config.getOpenTabs(), - currentTab: config.getOpenTabs().length > 0 ? 0 : -1, + currentTab: config.values.app.lastTab, }); useEffect(() => { - config.setOpenTabs(tabs.openTabs); + config.setOpenTabs(tabs.openTabs, tabs.currentTab); if (tabs.currentTab < 0) { void appWindow.setTitle("Transmission GUI"); } @@ -129,19 +129,23 @@ export const ServerTabs = React.forwardRef(funct const onServersChange = useRef<(s: ServerConfig[]) => void>(); onServersChange.current = useCallback((servers: ServerConfig[]) => { const newOpenTabs: string[] = []; + let newCurrentTab = 0; tabs.openTabs.forEach((serverName) => { props.clientManager.close(serverName); if (servers.find((s) => s.name === serverName) !== undefined) { props.clientManager.open(serverName, config.values.app.toastNotifications, config.values.app.toastNotificationSound); newOpenTabs.push(serverName); + if (serverName === tabs.openTabs[tabs.currentTab]) { + newCurrentTab = newOpenTabs.length - 1; + } } }); setTabs({ openTabs: newOpenTabs, - currentTab: 0, + currentTab: newCurrentTab, }); - setCurrentServer(config.getServer(newOpenTabs[0])); - }, [tabs.openTabs, setCurrentServer, config, props.clientManager]); + setCurrentServer(config.getServer(newOpenTabs[newCurrentTab])); + }, [tabs, setCurrentServer, config, props.clientManager]); useEffect(() => { onServersChange.current?.(props.servers); diff --git a/src/config.ts b/src/config.ts index 455e92f..e5d3980 100644 --- a/src/config.ts +++ b/src/config.ts @@ -123,12 +123,14 @@ export interface StyleOverrides { interface Settings { servers: ServerConfig[], - openTabs: string[], + openTabs?: string[], // moved into app app: { window: { size: [number, number], position: [number, number] | undefined, }, + openTabs: string[], + lastTab: number, deleteAdded: boolean, toastNotifications: boolean, toastNotificationSound: boolean, @@ -216,12 +218,13 @@ const DefaultTrackerList = [ const DefaultSettings: Settings = { servers: [], - openTabs: [], app: { window: { size: [1024, 800], position: undefined, }, + openTabs: [], + lastTab: 0, deleteAdded: false, toastNotifications: true, toastNotificationSound: true, @@ -300,18 +303,26 @@ export class Config { overrides[this.values.interface.theme ?? "light"].backgroundColor = overrides.backgroundColor; overrides.backgroundColor = undefined; } + if (this.values.openTabs !== undefined) { + this.values.app.openTabs = this.values.openTabs; + this.values.openTabs = undefined; + } } catch (e) { console.log(e); } // sanitize data - this.values.openTabs = this.values.openTabs.filter( + this.values.app.openTabs = this.values.app.openTabs.filter( (name) => this.values.servers.find((s) => s.name === name) !== undefined, ); this.values.servers = this.values.servers.map( (s) => ({ ...s, connection: { ...s.connection, password: deobfuscate(s.connection.password) } })); + if (this.values.app.lastTab >= this.values.app.openTabs.length) { + this.values.app.lastTab = -1; + } + return this; } @@ -344,23 +355,28 @@ export class Config { } getOpenServers(): ServerConfig[] { - return this.values.servers.filter((s) => this.values.openTabs.includes(s.name)); + return this.values.servers.filter((s) => this.values.app.openTabs.includes(s.name)); } setServers(servers: ServerConfig[]) { this.values.servers = servers; } - getServer(name: string): ServerConfig | undefined { + getServer(name: string | undefined): ServerConfig | undefined { return this.values.servers.find((s) => s.name === name); } getOpenTabs() { - return this.values.openTabs; + return this.values.app.openTabs; + } + + getLastOpenTab(): string | undefined { + return this.values.app.openTabs[this.values.app.lastTab]; } - setOpenTabs(tabs: string[]) { - this.values.openTabs = tabs; + setOpenTabs(tabs: string[], current: number) { + this.values.app.openTabs = tabs; + this.values.app.lastTab = current; } setTableColumnSizes(table: TableName, sizes: ColumnSizingState) {