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"
},