@setoelkahfi / svara / commits / 2534172

feat: added internal terminal settings

mellbacon committed Feb 3, 2024 at 14:07 UTC 25341721fc7429665fc421894689465a4519639a
4 files changed +63 -12
src-tauri/src/main.rs
+7 -4
@@ -322,11 +322,14 @@ fn load_settings(app: &mut App) {
322 "editor.autosave": false,
323 "nucleus.showKeybinds": false,
324 "nucleus.useExternalTerminal": true,
325 - "terminal.external": {
326 - "profile": "powershell"
327 - },
325 + "terminal.external.profile": "powershell",
326 "terminal.internal": {
329 - "profile": "powershell"
327 + "profile": "powershell",
328 + "fontSize": "14",
329 + "fontFamily": "Cascadia Mono",
330 + "lineHeight": "1.2",
331 + "cursorStyle": "bar",
332 + "fontWeight": "normal",
333 }
334 }
335 );
src/config/config.ts
+6
@@ -8,6 +8,7 @@ import { setEditorFontFamily, setEditorFontSize } from "../lib/Editor.svelte";
8 import { watch } from "tauri-plugin-fs-watch-api";
9 import { info } from "tauri-plugin-log-api";
10 import { setTerminalState } from "../lib/Statusbar.svelte";
11 +import { termOptions, updateTermOptions } from "../lib/Terminal.svelte";
12
13 export const systemfonts = writable([]);
14 export const editorfont = writable("");
@@ -98,7 +99,12 @@ export async function loadDefaultSettings() {
99 appSettings.onKeyChange("nucleus.useExternalTerminal", (value: string) => {
100 setTerminalState(value);
101 })
102 + appSettings.onKeyChange("terminal.internal", (value: any) => {
103 + termOptions.set(value);
104 + updateTermOptions();
105 + })
106 setTerminalState(await appSettings.get("nucleus.useExternalTerminal"))
107 + termOptions.set(await appSettings.get("terminal.internal"));
108 info("Settings initialized", {file: "config.ts", line: 97});
109 }
110
src/lib/Settings.svelte
+40 -6
@@ -14,15 +14,17 @@
14 let nucleusTheme;
15 let editorAutosave;
16 let externalTerminal;
17 + let terminalOptions = {"fontWeight": "", "fontSize": "", "fontFamily": "", "lineHeight": "", "cursorStyle": ""};
18 onMount(async () => {
19 editorFontSize = await appSettings.get("editor.fontSize");
20 editorFontFamily = await appSettings.get("editor.fontFamily");
21 editorAutosave = await appSettings.get("editor.autosave");
22 nucleusTheme = await appSettings.get("nucleus.theme");
23 externalTerminal = await appSettings.get("nucleus.useExternalTerminal");
24 + terminalOptions = await appSettings.get("terminal.internal");
25 })
26
25 - async function handleSelect(e) {
27 + async function handleAutosaveSelect(e) {
28 await appSettings.set("editor.autosave", e.detail.selection);
29 await appSettings.save();
30 }
@@ -30,11 +32,11 @@
32 await appSettings.set("nucleus.theme", e.detail.selection.name);
33 await appSettings.save();
34 }
33 - async function handleInput(e) {
35 + async function handleEditorFontSize(e) {
36 await appSettings.set("editor.fontSize", e.detail.value);
37 await appSettings.save();
38 }
37 - async function handleFamilySelect(e) {
39 + async function handleEditorFontFamily(e) {
40 await appSettings.set("editor.fontFamily", e.detail.value);
41 await appSettings.save();
42 }
@@ -42,6 +44,33 @@
44 await appSettings.set("nucleus.useExternalTerminal", e.detail.selection.name);
45 await appSettings.save();
46 }
47 + async function handleTerminalFontSize(e) {
48 + terminalOptions.fontSize = e.detail.value;
49 + await appSettings.set("terminal.internal", terminalOptions);
50 + await appSettings.save();
51 + }
52 + async function handleTerminalFontFamily(e) {
53 + terminalOptions.fontFamily = e.detail.value;
54 + await appSettings.set("terminal.internal", terminalOptions);
55 + await appSettings.save();
56 + }
57 + async function handleTerminalFontWeight(e) {
58 + terminalOptions.fontWeight = e.detail.value;
59 + await appSettings.set("terminal.internal", terminalOptions);
60 + await appSettings.save();
61 + }
62 + async function handleTerminalLineHeight(e) {
63 + terminalOptions.lineHeight = e.detail.value;
64 + await appSettings.set("terminal.internal", terminalOptions);
65 + await appSettings.save();
66 + }
67 + async function handleTerminalCursorStyle(e) {
68 + terminalOptions.cursorStyle = e.detail.selection.name;
69 + await appSettings.set("terminal.internal", terminalOptions);
70 + await appSettings.save();
71 +
72 + }
73 +
74 </script>
75
76 <div class="settings-container" class:hidden>
@@ -71,15 +100,20 @@
100 <div class="settings-category">
101 <div class="heading">Editor</div>
102 <div class="content">
74 - <Select label="Autosave" items={[{id: 0, name: "false"}, {id: 1, name: "true"}]} selected={editorAutosave} on:select={handleSelect}></Select>
75 - <Input _class="settings-input" placeholder="default: 14" value={editorFontSize} extra_small label="Font Size" on:d_input={handleInput} />
76 - <Input _class="settings-input" placeholder="monospace" value={editorFontFamily} medium label="Font Family" on:d_input={handleFamilySelect} />
103 + <Select label="Autosave" items={[{id: 0, name: "false"}, {id: 1, name: "true"}]} selected={editorAutosave} on:select={handleAutosaveSelect}></Select>
104 + <Input _class="settings-input" placeholder="default: 14" value={editorFontSize} extra_small label="Font Size" on:d_input={handleEditorFontSize} />
105 + <Input _class="settings-input" placeholder="monospace" value={editorFontFamily} medium label="Font Family" on:d_input={handleEditorFontFamily} />
106 </div>
107 </div>
108 <div class="settings-category">
109 <div class="heading">Terminal</div>
110 <div class="content">
111 <Select label="Use External Terminal" items={[{id: 0, name: "false"}, {id: 1, name: "true"}]} selected={externalTerminal} on:select={handleTerminal} />
112 + <Input label="Font Weight" _class="settings-input" placeholder="Cascadia Mono" value={terminalOptions.fontWeight} medium on:d_input={handleTerminalFontWeight} hintText="Values: normal, bold, or 100-900" />
113 + <Input label="Font Size" _class="settings-input" placeholder="default: 14" value={terminalOptions.fontSize} extra_small on:d_input={handleTerminalFontSize} />
114 + <Input label="Font Family" _class="settings-input" placeholder="Cascadia Mono" value={terminalOptions.fontFamily} medium on:d_input={handleTerminalFontFamily} />
115 + <Input label="Line Height" _class="settings-input" placeholder="default: 1.2" value={terminalOptions.lineHeight} medium on:d_input={handleTerminalLineHeight} />
116 + <Select label="Cursor Style" items={[{id: 0, name: "bar"}, {id: 1, name: "block"}, {id: 2, name: "underline"}]} selected={terminalOptions.cursorStyle} on:select={handleTerminalCursorStyle} />
117 </div>
118 </div>
119 </div>
src/lib/Terminal.svelte
+10 -2
@@ -6,7 +6,6 @@
6 import { invoke } from "@tauri-apps/api";
7 import { get, writable } from "svelte/store";
8 import { workingDir } from "./File";
9 - import { getThemeProperty } from "../config/themehandler";
9
10 let terminalElement: HTMLElement;
11
@@ -28,14 +27,22 @@
27 <script lang="ts" context="module">
28
29 export const termTheme = writable();
30 +export const termOptions = writable();
31 let terminalController = new Terminal({
32 fontFamily: "Cascadia Mono",
33 - fontSize: 14
33 + fontSize: 14,
34 });
35
36 export function updateTermTheme() {
37 terminalController.options.theme = get(termTheme);
38 }
39 +export function updateTermOptions() {
40 + const options: any = get(termOptions);
41 + terminalController.options.fontFamily = options.fontFamily;
42 + terminalController.options.fontSize = options.fontSize;
43 + terminalController.options.lineHeight = options.lineHeight;
44 + terminalController.options.cursorStyle = options.cursorStyle;
45 +}
46
47 let termFit = new FitAddon();
48 export function fitTerminal() {
@@ -59,6 +66,7 @@ function writeToPty(data: string) {
66
67 function initShell() {
68 updateTermTheme();
69 + updateTermOptions();
70 invoke("async_create_shell", {path: get(workingDir)}).catch((error) => {
71 // on linux it seem to to "Operation not permitted (os error 1)" but it still works because echo $SHELL give /bin/bash
72 console.error("Error creating shell:", error);