| 1 | <script lang="ts"> |
| 2 | import { onMount } from "svelte"; |
| 3 | import { appSettings } from "../config/config"; |
| 4 | import Input from "./utility/Input.svelte"; |
| 5 | import Select from "./utility/Select.svelte"; |
| 6 | import FileTreeView from "./FileTree/FileTreeView.svelte"; |
| 7 | import { getThemes } from "../config/themehandler"; |
| 8 | import { addEditorTab } from "./EditorTabList.svelte"; |
| 9 | |
| 10 | export let hidden = true; |
| 11 | |
| 12 | let editorFontSize; |
| 13 | let editorFontFamily; |
| 14 | let editorLineHeight; |
| 15 | let editorTabSize; |
| 16 | let svaraTheme; |
| 17 | let editorAutosave; |
| 18 | let externalTerminal; |
| 19 | let terminalOptions = {"fontWeight": "", "fontSize": "", "fontFamily": "", "lineHeight": "", "cursorStyle": ""}; |
| 20 | onMount(async () => { |
| 21 | editorFontSize = await appSettings.get("editor.fontSize"); |
| 22 | editorFontFamily = await appSettings.get("editor.fontFamily"); |
| 23 | editorLineHeight = await appSettings.get("editor.lineHeight"); |
| 24 | editorTabSize = await appSettings.get("editor.tabSize"); |
| 25 | editorAutosave = await appSettings.get("editor.autosave"); |
| 26 | svaraTheme = await appSettings.get("svara.theme"); |
| 27 | externalTerminal = await appSettings.get("svara.useExternalTerminal"); |
| 28 | terminalOptions = await appSettings.get("terminal.internal"); |
| 29 | }) |
| 30 | |
| 31 | async function handleAutosaveSelect(e) { |
| 32 | await appSettings.set("editor.autosave", e.detail.selection); |
| 33 | await appSettings.save(); |
| 34 | } |
| 35 | async function handleThemeSelect(e) { |
| 36 | await appSettings.set("svara.theme", e.detail.selection.name); |
| 37 | await appSettings.save(); |
| 38 | } |
| 39 | async function handleEditorFontSize(e) { |
| 40 | await appSettings.set("editor.fontSize", e.detail.value); |
| 41 | await appSettings.save(); |
| 42 | } |
| 43 | async function handleEditorFontFamily(e) { |
| 44 | await appSettings.set("editor.fontFamily", e.detail.value); |
| 45 | await appSettings.save(); |
| 46 | } |
| 47 | async function handleEditorLineHeight(e) { |
| 48 | await appSettings.set("editor.lineHeight", e.detail.value); |
| 49 | await appSettings.save(); |
| 50 | } |
| 51 | async function handleEditorTabSize(e) { |
| 52 | await appSettings.set("editor.tabSize", e.detail.value); |
| 53 | await appSettings.save(); |
| 54 | } |
| 55 | async function handleTerminal(e) { |
| 56 | await appSettings.set("svara.useExternalTerminal", e.detail.selection.name); |
| 57 | await appSettings.save(); |
| 58 | } |
| 59 | async function handleTerminalFontSize(e) { |
| 60 | terminalOptions.fontSize = e.detail.value; |
| 61 | await appSettings.set("terminal.internal", terminalOptions); |
| 62 | await appSettings.save(); |
| 63 | } |
| 64 | async function handleTerminalFontFamily(e) { |
| 65 | terminalOptions.fontFamily = e.detail.value; |
| 66 | await appSettings.set("terminal.internal", terminalOptions); |
| 67 | await appSettings.save(); |
| 68 | } |
| 69 | async function handleTerminalFontWeight(e) { |
| 70 | terminalOptions.fontWeight = e.detail.value; |
| 71 | await appSettings.set("terminal.internal", terminalOptions); |
| 72 | await appSettings.save(); |
| 73 | } |
| 74 | async function handleTerminalLineHeight(e) { |
| 75 | terminalOptions.lineHeight = e.detail.value; |
| 76 | await appSettings.set("terminal.internal", terminalOptions); |
| 77 | await appSettings.save(); |
| 78 | } |
| 79 | async function handleTerminalCursorStyle(e) { |
| 80 | terminalOptions.cursorStyle = e.detail.selection.name; |
| 81 | await appSettings.set("terminal.internal", terminalOptions); |
| 82 | await appSettings.save(); |
| 83 | |
| 84 | } |
| 85 | </script> |
| 86 | |
| 87 | <div class="settings-container" class:hidden> |
| 88 | <div class="settings-directory"> |
| 89 | <FileTreeView isExpanded iconsEnabled={false} tree={[ |
| 90 | {id: 0, path: "", name: "General", children: [ |
| 91 | {id: 1, path: "", name: "Theme"}, |
| 92 | {id: 2, path: "", name: "Editor", children: [ |
| 93 | {id: 3, path: "", name: "Autosave"}, |
| 94 | {id: 4, path: "", name: "Font Size"}, |
| 95 | {id: 5, path: "", name: "Font Family"} |
| 96 | ]}, |
| 97 | {id: 6, path: "", name: "Terminal"}, |
| 98 | ]}, |
| 99 | ]}></FileTreeView> |
| 100 | <!-- svelte-ignore a11y-click-events-have-key-events --> |
| 101 | <span id="json" on:click={() => {addEditorTab(appSettings.path, "settings.json")}}>open settings.json</span> |
| 102 | </div> |
| 103 | <div class="settings"> |
| 104 | <div class="settings-list"> |
| 105 | <div class="settings-category"> |
| 106 | <div class="heading">General</div> |
| 107 | <div class="content"> |
| 108 | <Select label="Theme" items={getThemes()} selected={svaraTheme} on:select={handleThemeSelect}></Select> |
| 109 | </div> |
| 110 | </div> |
| 111 | <div class="settings-category"> |
| 112 | <div class="heading">Editor</div> |
| 113 | <div class="content"> |
| 114 | <Select label="Autosave" items={[{id: 0, name: "false"}, {id: 1, name: "true"}]} selected={editorAutosave} on:select={handleAutosaveSelect}></Select> |
| 115 | <Input _class="settings-input" placeholder="default: 14" value={editorFontSize} extra_small label="Font Size" on:d_input={handleEditorFontSize} /> |
| 116 | <Input _class="settings-input" placeholder="monospace" value={editorFontFamily} medium label="Font Family" on:d_input={handleEditorFontFamily} /> |
| 117 | <Input _class="settings-input" placeholder="default: 1.3" value={editorLineHeight} medium label="Line Height" on:d_input={handleEditorLineHeight} /> |
| 118 | <Input _class="settings-input" placeholder="default: 4" value={editorTabSize} medium label="Tab Size" on:d_input={handleEditorTabSize} /> |
| 119 | </div> |
| 120 | </div> |
| 121 | <div class="settings-category"> |
| 122 | <div class="heading">Terminal</div> |
| 123 | <div class="content"> |
| 124 | <Select label="Use External Terminal" items={[{id: 0, name: "false"}, {id: 1, name: "true"}]} selected={externalTerminal} on:select={handleTerminal} /> |
| 125 | <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" /> |
| 126 | <Input label="Font Size" _class="settings-input" placeholder="default: 14" value={terminalOptions.fontSize} extra_small on:d_input={handleTerminalFontSize} /> |
| 127 | <Input label="Font Family" _class="settings-input" placeholder="Cascadia Mono" value={terminalOptions.fontFamily} medium on:d_input={handleTerminalFontFamily} /> |
| 128 | <Input label="Line Height" _class="settings-input" placeholder="default: 1.2" value={terminalOptions.lineHeight} medium on:d_input={handleTerminalLineHeight} /> |
| 129 | <Select label="Cursor Style" items={[{id: 0, name: "bar"}, {id: 1, name: "block"}, {id: 2, name: "underline"}]} selected={terminalOptions.cursorStyle} on:select={handleTerminalCursorStyle} /> |
| 130 | </div> |
| 131 | </div> |
| 132 | </div> |
| 133 | </div> |
| 134 | </div> |
| 135 | |
| 136 | <style lang="scss"> |
| 137 | .hidden { |
| 138 | display: none !important; |
| 139 | } |
| 140 | .settings-container { |
| 141 | height: 100%; |
| 142 | display: flex; |
| 143 | } |
| 144 | .settings { |
| 145 | width: 100%; |
| 146 | height: 100%; |
| 147 | overflow: auto; |
| 148 | display: flex; |
| 149 | flex-direction: column; |
| 150 | justify-content: space-between; |
| 151 | } |
| 152 | .settings-list { |
| 153 | padding: 0 20px; |
| 154 | display: flex; |
| 155 | flex-direction: column; |
| 156 | } |
| 157 | .settings-directory { |
| 158 | min-width: 13rem; |
| 159 | height: 100%; |
| 160 | overflow: auto; |
| 161 | display: flex; |
| 162 | align-items: center; |
| 163 | flex-direction: column; |
| 164 | #json { |
| 165 | font-size: 0.9rem; |
| 166 | color: #939393; |
| 167 | cursor: pointer; |
| 168 | text-decoration: underline; |
| 169 | &:hover { |
| 170 | color: #4d73ad; |
| 171 | } |
| 172 | padding: 10px 0; |
| 173 | } |
| 174 | } |
| 175 | .settings-category { |
| 176 | padding: 10px 0; |
| 177 | } |
| 178 | .heading { |
| 179 | font-weight: 600; |
| 180 | font-size: 20px; |
| 181 | &::after { |
| 182 | height: 0.05rem; |
| 183 | width: 100%; |
| 184 | content: ""; |
| 185 | display: block; |
| 186 | margin-top: 10px; |
| 187 | } |
| 188 | } |
| 189 | :global(.settings-input) { |
| 190 | margin: 10px 0; |
| 191 | } |
| 192 | </style> |