diff --git a/docs/docs/config.mdx b/docs/docs/config.mdx index 05389e99ef..15302ff001 100644 --- a/docs/docs/config.mdx +++ b/docs/docs/config.mdx @@ -84,6 +84,7 @@ wsh editconfig | editor:inlinediff | bool | set to true to show diffs inline instead of side-by-side, false for side-by-side (defaults to undefined which uses Monaco's responsive behavior) | | preview:showhiddenfiles | bool | set to false to disable showing hidden files in the directory preview (defaults to true) | | preview:defaultsort | string | sets the default sort column for directory preview. `"name"` (default) sorts alphabetically by name ascending; `"modtime"` sorts by last modified time descending (newest first) | +| preview:openfileinnewblock | bool | set to true to open files in a new preview block when double-clicking or pressing Enter in the directory preview, instead of replacing the current block (defaults to false; directories still navigate in place) | | markdown:fontsize | float64 | font size for the normal text when rendering markdown in preview. headers are scaled up from this size, (default 14px) | | markdown:fixedfontsize | float64 | font size for the code blocks when rendering markdown in preview (default is 12px) | | web:openlinksinternally | bool | set to false to open web links in external browser | diff --git a/frontend/app/view/preview/preview-directory.tsx b/frontend/app/view/preview/preview-directory.tsx index 0940ba43b3..559fbd72ae 100644 --- a/frontend/app/view/preview/preview-directory.tsx +++ b/frontend/app/view/preview/preview-directory.tsx @@ -2,6 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import { ContextMenuModel } from "@/app/store/contextmenu"; +import { createBlock } from "@/app/store/global"; import { globalStore } from "@/app/store/jotaiStore"; import { TabRpcClient } from "@/app/store/wshrpcutil"; import { useWaveEnv } from "@/app/waveenv/waveenv"; @@ -501,6 +502,7 @@ type TableRowProps = { function TableRow({ model, row, focusIndex, setFocusIndex, setSearch, idx, handleFileContextMenu }: TableRowProps) { const dirPath = useAtomValue(model.statFilePath); const connection = useAtomValue(model.connection); + const openFileInNewBlock = useAtomValue(model.env.getSettingsKeyAtom("preview:openfileinnewblock")) ?? false; const dragItem: DraggedFile = { relName: row.getValue("name") as string, @@ -530,7 +532,15 @@ function TableRow({ model, row, focusIndex, setFocusIndex, setSearch, idx, handl data-rowindex={idx} onDoubleClick={() => { const newFileName = row.getValue("path") as string; - model.goHistory(newFileName); + if (openFileInNewBlock && !row.original.isdir) { + fireAndForget(() => + createBlock({ + meta: { view: "preview", file: newFileName, connection }, + }) + ); + } else { + model.goHistory(newFileName); + } setSearch(""); globalStore.set(model.directorySearchActive, false); }} @@ -569,6 +579,7 @@ function DirectoryPreview({ model }: DirectoryPreviewProps) { const [selectedPath, setSelectedPath] = useState(""); const [refreshVersion, setRefreshVersion] = useAtom(model.refreshVersion); const conn = useAtomValue(model.connection); + const openFileInNewBlock = useAtomValue(env.getSettingsKeyAtom("preview:openfileinnewblock")) ?? false; const blockData = useAtomValue(model.blockAtom); const finfo = useAtomValue(model.statFile); const dirPath = finfo?.path; @@ -662,7 +673,16 @@ function DirectoryPreview({ model }: DirectoryPreviewProps) { if (filteredData.length == 0) { return; } - model.goHistory(selectedPath); + const selectedFinfo = filteredData.find((f) => f.path == selectedPath); + if (openFileInNewBlock && selectedFinfo != null && !selectedFinfo.isdir) { + fireAndForget(() => + createBlock({ + meta: { view: "preview", file: selectedFinfo.path, connection: conn }, + }) + ); + } else { + model.goHistory(selectedPath); + } setSearchText(""); globalStore.set(model.directorySearchActive, false); return true; @@ -692,7 +712,7 @@ function DirectoryPreview({ model }: DirectoryPreviewProps) { return () => { model.directoryKeyDownHandler = null; }; - }, [filteredData, selectedPath, searchText]); + }, [filteredData, selectedPath, searchText, conn, openFileInNewBlock]); useEffect(() => { if (filteredData.length != 0 && focusIndex > filteredData.length - 1) { diff --git a/frontend/app/view/preview/previewenv.ts b/frontend/app/view/preview/previewenv.ts index 30607b8459..0d4e07e9aa 100644 --- a/frontend/app/view/preview/previewenv.ts +++ b/frontend/app/view/preview/previewenv.ts @@ -30,6 +30,8 @@ export type PreviewEnv = WaveEnvSubset<{ object: WaveEnv["services"]["object"]; }; wos: WaveEnv["wos"]; - getSettingsKeyAtom: SettingsKeyAtomFnType<"preview:showhiddenfiles" | "editor:fontsize" | "preview:defaultsort">; + getSettingsKeyAtom: SettingsKeyAtomFnType< + "preview:showhiddenfiles" | "editor:fontsize" | "preview:defaultsort" | "preview:openfileinnewblock" + >; getConnStatusAtom: WaveEnv["getConnStatusAtom"]; }>; diff --git a/frontend/types/gotypes.d.ts b/frontend/types/gotypes.d.ts index c5b870d7ed..fcdcb4c1da 100644 --- a/frontend/types/gotypes.d.ts +++ b/frontend/types/gotypes.d.ts @@ -1444,6 +1444,7 @@ declare global { "markdown:fixedfontsize"?: number; "preview:showhiddenfiles"?: boolean; "preview:defaultsort"?: string; + "preview:openfileinnewblock"?: boolean; "tab:preset"?: string; "tab:confirmclose"?: boolean; "tab:background"?: string; @@ -1589,6 +1590,7 @@ declare global { "debug:panictype"?: string; "block:view"?: string; "block:controller"?: string; + "block:subblock"?: boolean; "ai:backendtype"?: string; "ai:local"?: boolean; "wsh:cmd"?: string; diff --git a/pkg/wconfig/metaconsts.go b/pkg/wconfig/metaconsts.go index 7d5bba5d9d..4c6562d6fc 100644 --- a/pkg/wconfig/metaconsts.go +++ b/pkg/wconfig/metaconsts.go @@ -84,6 +84,7 @@ const ( ConfigKey_PreviewShowHiddenFiles = "preview:showhiddenfiles" ConfigKey_PreviewDefaultSort = "preview:defaultsort" + ConfigKey_PreviewOpenFileInNewBlock = "preview:openfileinnewblock" ConfigKey_TabPreset = "tab:preset" ConfigKey_TabConfirmClose = "tab:confirmclose" diff --git a/pkg/wconfig/settingsconfig.go b/pkg/wconfig/settingsconfig.go index 67118b1670..aff8109238 100644 --- a/pkg/wconfig/settingsconfig.go +++ b/pkg/wconfig/settingsconfig.go @@ -133,8 +133,9 @@ type SettingsType struct { MarkdownFontSize float64 `json:"markdown:fontsize,omitempty"` MarkdownFixedFontSize float64 `json:"markdown:fixedfontsize,omitempty"` - PreviewShowHiddenFiles *bool `json:"preview:showhiddenfiles,omitempty"` - PreviewDefaultSort string `json:"preview:defaultsort,omitempty" jsonschema:"enum=name,enum=modtime"` + PreviewShowHiddenFiles *bool `json:"preview:showhiddenfiles,omitempty"` + PreviewDefaultSort string `json:"preview:defaultsort,omitempty" jsonschema:"enum=name,enum=modtime"` + PreviewOpenFileInNewBlock bool `json:"preview:openfileinnewblock,omitempty"` TabPreset string `json:"tab:preset,omitempty"` TabConfirmClose bool `json:"tab:confirmclose,omitempty"` diff --git a/schema/settings.json b/schema/settings.json index f341a0f365..ce9a7c802b 100644 --- a/schema/settings.json +++ b/schema/settings.json @@ -232,6 +232,9 @@ "modtime" ] }, + "preview:openfileinnewblock": { + "type": "boolean" + }, "tab:preset": { "type": "string" },