From 547c8b09cfc031887774448e13f280d681cb31da Mon Sep 17 00:00:00 2001 From: Richard Guay Date: Mon, 6 Feb 2023 15:49:16 +0700 Subject: [PATCH] Massive update: removed most all store subscriptions and use the new method of getting stores in the JavaScript code. Many other fixes allong the way as well. --- .notes/build.md | 4 +- README.md | 11 +- appicon.png | Bin 73759 -> 0 bytes frontend/src/components/CommandPrompt.svelte | 2 +- .../src/components/DirectoryListing.svelte | 39 +-- frontend/src/components/Entry.svelte | 9 +- frontend/src/components/Env.svelte | 19 +- frontend/src/components/ExtensionPrefs.svelte | 122 ++++----- frontend/src/components/ExtraPanel.svelte | 48 ++-- frontend/src/components/GeneralPrefs.svelte | 120 ++++----- frontend/src/components/GitHub.svelte | 68 +++-- frontend/src/components/MessageBox.svelte | 10 +- frontend/src/components/Pane.svelte | 232 +++++++++--------- frontend/src/components/QuickSearch.svelte | 22 +- frontend/src/components/ResizeBorder.svelte | 10 +- frontend/src/components/StatusLine.svelte | 52 ++-- frontend/src/components/ThemePrefs.svelte | 99 ++++---- 17 files changed, 365 insertions(+), 502 deletions(-) delete mode 100644 appicon.png diff --git a/.notes/build.md b/.notes/build.md index e49935e..15aa505 100644 --- a/.notes/build.md +++ b/.notes/build.md @@ -2,6 +2,8 @@ To build the project, run: wails build --platform="darwin/universal" -or +to build a universal binary for macOS. Or mask build + +to build a binary for the current system only. diff --git a/README.md b/README.md index 782705f..711eebc 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,11 @@ I started my programming career with Emacs as my main text editor on a main fram With Spacemacs and Doom-emacs, I learned that the Vim style keyboard was much more efficient. But, I kept going back to the Emacs key memory. I finally decided to really give Vim a run with neovim on my MacBook Air. I even installed Spacevim and really liked it. Now, I'm fully comfortable in the Vim style keyboard (but far from mastering it completely) and have adapted it to many other programs along the way. My current editor of choice is [OniVim2](https://github.com/onivim/oni2) which is the fastest programming editor I've ever used. It is great! -But, I've never been happy with the file managers I've used. [fman](https://fman.io/) is great, but not actively being maintained and expanded upon. I also don't really like python, it's API language. So, I decided to jump in and make one to suit me better. This is how Modal File Manager was started. I wanted something that was as configurable as TkDesk was, but with a modal keyboard model for hotkeys. To take it even further, new modes and keymaps can be added with extensions. +But, I've never been happy with the file managers I've used. [fman](https://fman.io/) is great, but not actively being maintained and expanded upon. It is very slow in large directories and I also don't really like python: it's API language. So, I decided to jump in and make one to suit me better. This is how Modal File Manager was started. I wanted something that was as configurable as TkDesk was (if anyone remembers it), but with a modal keyboard model for hotkeys. To take it even further, new modes and keymaps can be added with extensions. -Modal File Manager is also somewhat minimal in the UI. Many graphical file managers have buttons, shelves, etc. all over the place with information everywhere. I decided to make the main interface as low keyed as possible with all other information in the status line or extras panel. Extra file information is on the status line for the current cursor location. More information is displayed in extras panel as well. +Modal File Manager is also somewhat minimal in the UI. Many graphical file managers have buttons, shelves, etc. all over the place with information everywhere. I decided to make the main interface as low keyed as possible with all other information in the status line or extras panel. Extra file information is on the status line for the current cursor location. More information is displayed in the extras panel as well (the side opposite the current pointer shows extra information instead of the other file pane. When turned off, it automatically goes back to the file pane that was showing before switching.). -Since there are so many dual pane file managers available, I knew this would never be a marketable product (and I did not want the hassle of endless customer complaint over a feature not working the way they want it). Therefore, I'm making this an open source project to hopefully get some help from other to really making this thing shine. +Since there are so many dual pane file managers available, I knew this would never be a marketable product (and I did not want the hassle of endless customer complaint over a feature not working the way they want it). Therefore, I'm making this an open source project to hopefully get some help from others to help really make this thing shine. Therefore, I hope you enjoy this little program as much as I have. Feel free to sponsor the project, help code some of it (just send in the pull requests), or just give me some tips along the way. Any help is appreciated. @@ -75,7 +75,7 @@ I've created multiple open source resources (I have around 80 GitHub repositorie - Watches for changes in the current directory and updates accordingly. - Changing directories in the Directory Bar (normal mode `q`) shows a list of matching entries from history and then below the current directory. - File editor is configurable by the `~/.myeditorchoice` file (see `Editing Files` below). Otherwise, the system editor for the file type will be used. -- Integrated with ScriptPad - another project of mine coming soon! +- Integrated with [EmailIt](https://github.com/raguay/EmailIt). - Quick Search - a input to type text so that any entry at that level is removed that doesn't have that text in it. Just refresh the pane to get back to normal. I think of it as a quick filter more than a quick search. - Toggle System files/folders visibility - Optionally deletes to the OS's trashcan (external program has to be installed) @@ -105,6 +105,7 @@ All Dracula based themes are here with permission from the author. Please suppor Because this is a web technologies application, there are certain things that it just can't do and I'm not sure if they can be done at this level. Therefore, this will not completely remove your dependency on using the Finder application. But, these instances are not everyday items for which we use a file manager. As I see it, these items are not doable, but I would love for someone to prove me wrong: - Install applications that the macOS Gatekeeper will allow. +- Drad and drop with other programs. ## Installation @@ -468,7 +469,7 @@ This list of tutorials are with the latest version of Modal File Manager: I finally made my first attempt at an icon for Modal File Manager. The files are in the `frontend/icons` directory. Any constructive criticizm is welcome. -![Icon](https://github.com/raguay/ModalFileManager/blob/main/appicon.png) +![Icon](https://github.com/raguay/ModalFileManager/blob/main/build/appicon.png) ## Sponsor this project diff --git a/appicon.png b/appicon.png deleted file mode 100644 index d8ba4c6008a95e9b49a76f18fcdf5351ff30d302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 73759 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 z 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

|{ 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 m)ugNMgOM2YpX^E)VrNfrkIYXS$f0Xta7Rs! { width = window.innerWidth - 30; - keyProcess.set(false); + $keyProcess = false; if (commands != null) filtered = commands.commandList; }); diff --git a/frontend/src/components/DirectoryListing.svelte b/frontend/src/components/DirectoryListing.svelte index fa56cbc..3086a61 100644 --- a/frontend/src/components/DirectoryListing.svelte +++ b/frontend/src/components/DirectoryListing.svelte @@ -17,12 +17,10 @@ let newPath; let inputPath; let dirlist = []; - let localTheme = {}; let dirListDOM; let tryagain = false; let pending = false; let dirIndex = 0; - let localDirListeners = []; let lastDir = ""; let rightSet = false; let leftSet = false; @@ -31,15 +29,6 @@ $: setEditFlag(edit); onMount(() => { - const unsubscribeTheme = theme.subscribe((value) => { - localTheme = value; - }); - const unsubscribeDirectoryListeners = directoryListeners.subscribe( - (value) => { - localDirListeners = value; - } - ); - localTheme = get(theme); newPath = shortenPath(path); if (side === "left") { window.runtime.EventsOn("leftDirChange", () => { @@ -56,10 +45,7 @@ }); }); } - return () => { - unsubscribeTheme(); - unsubscribeDirectoryListeners(); - }; + return () => {}; }); afterUpdate(async () => { @@ -94,7 +80,7 @@ if (typeof pth !== "undefined") { if (lastDir !== pth) { lastDir = pth; - localDirListeners.map((value) => { + $directoryListeners.map((value) => { value(pth, ""); }); } @@ -107,7 +93,7 @@ } } - function setEdit(e) { + function setEdit() { show = false; inputPath = path.path; dirIndex = 0; @@ -118,14 +104,14 @@ if (inputPath[inputPath.length - 1] !== sep) { inputPath = inputPath + sep; } - keyProcess.set(false); + $keyProcess = false; } async function editOff() { if (await path.fileSystem.dirExists(inputPath)) { show = true; dirlist = []; - keyProcess.set(true); + $keyProcess = true; dispatch("dirChange", { path: inputPath, cursor: true, @@ -137,7 +123,7 @@ inputPath = dirlist[dirIndex]; show = true; dirlist = []; - keyProcess.set(true); + $keyProcess = true; if (await path.fileSystem.dirExists(inputPath)) { dispatch("dirChange", { path: inputPath, @@ -169,9 +155,7 @@ // // Add to the history. // - var hist = get(dirHistory); - hist.addHistory(result); - dirHistory.set(hist); + $dirHistory.addHistory(result); // // Fixing the path. @@ -252,8 +236,7 @@ // // Get matches from history. // - var hist = get(dirHistory); - dirlist = hist.searchHistory(inputPath); + dirlist = $dirHistory.searchHistory(inputPath); if (dirlist === null) dirlist = []; numleft -= dirlist.length; if (numleft > 0) { @@ -317,7 +300,7 @@ {#if dirlist.length > 0 && dirListDOM !== null && dirInputDOM !== null}

    @@ -325,8 +308,8 @@ {#if item !== ""}
  • { processListItem(key); }} diff --git a/frontend/src/components/Entry.svelte b/frontend/src/components/Entry.svelte index 3982145..196ebcc 100644 --- a/frontend/src/components/Entry.svelte +++ b/frontend/src/components/Entry.svelte @@ -126,8 +126,8 @@ } async function dragStart(e) { - const lconfig = get(config); - var flist = lconfig.extensions.getExtCommand("getSelectedFiles").command(); + const $config = get(config); + var flist = $config.extensions.getExtCommand("getSelectedFiles").command(); var included = false; var data = []; flist.map(async (item) => { @@ -175,7 +175,6 @@ // Create the entries from the drop. // const dataTransArray = e.dataTransfer.getData("text/plain").split("\n"); - const lconfig = get(config); var fromEntries = []; for (var i = 0; i < dataTransArray.length; i++) { var parts = dataTransArray[i].split("|"); @@ -201,11 +200,11 @@ }); } if (shiftKey) { - await lconfig.extensions + await $config.extensions .getExtCommand("moveEntriesCommand") .command(fromEntries, toEntry); } else { - await lconfig.extensions + await $config.extensions .getExtCommand("copyEntriesCommand") .command(fromEntries, toEntry); } diff --git a/frontend/src/components/Env.svelte b/frontend/src/components/Env.svelte index b872b7e..c6b1b6d 100644 --- a/frontend/src/components/Env.svelte +++ b/frontend/src/components/Env.svelte @@ -1,4 +1,4 @@ -{#if ((localConfig !== null) && (typeof localConfig.configuration.env !== 'undefined'))} +{#if (($config !== null) && (typeof $config.configuration.env !== 'undefined'))} @@ -15,7 +15,7 @@ - {#each Object.entries(localConfig.configuration.env) as kv} + {#each Object.entries($config.configuration.env) as kv} { - const unsubConfig = config.subscribe(value => { - localConfig = value; - }); - return(() => { - unsubConfig(); }); }); function deleteCell(kv) { - delete localConfig.configuration.env[kv[0]]; - config.set(localConfig); + delete $config.configuration.env[kv[0]]; } function saveCell(kv, e) { - localConfig.configuration.env[kv[0]] = e.detail.value; - config.set(localConfig); + $config.configuration.env[kv[0]] = e.detail.value; } function addKV(e) { - localConfig.configuration.env[KVname] = KVvalue; + $config.configuration.env[KVname] = KVvalue; addNew = false; - config.set(localConfig); KVname = ''; KVvalue = ''; } diff --git a/frontend/src/components/ExtensionPrefs.svelte b/frontend/src/components/ExtensionPrefs.svelte index 05a7494..3a82d77 100644 --- a/frontend/src/components/ExtensionPrefs.svelte +++ b/frontend/src/components/ExtensionPrefs.svelte @@ -9,7 +9,6 @@ const dispatch = createEventDispatcher(); - let localConfig = null; let showMsgBox = false; let msgText = ""; let msgTitle = ""; @@ -29,21 +28,13 @@ return({{extName}}); let scrollDOM = null; let first = true; - onMount(() => { - const unsubConfig = config.subscribe(async (value) => { - localConfig = value; - if (typeof localConfig.OS !== "undefined") { - var edir = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - extensionList = await localConfig.OS.getDirList(edir); - } - }); + onMount(async () => { + if (typeof $config.OS !== "undefined") { + var edir = await $config.OS.appendPath($config.configDir, "extensions"); + extensionList = await $config.OS.getDirList(edir); + } - return () => { - unsubConfig(); - }; + return () => {}; }); afterUpdate(() => { @@ -56,24 +47,18 @@ return({{extName}}); }); async function reloadExtensions() { - const efile = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - extensionList = await localConfig.OS.getDirList(efile); + const efile = await $config.OS.appendPath($config.configDir, "extensions"); + extensionList = await $config.OS.getDirList(efile); } async function editExtension(ext) { // // Get the extensions file. // - var extDir = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - extDir = await localConfig.OS.appendPath(extDir, ext.name); - const pfile = await localConfig.OS.appendPath(extDir, "package.json"); - var pkgConfig = await localConfig.OS.readFile(pfile); + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + extDir = await $config.OS.appendPath(extDir, ext.name); + const pfile = await $config.OS.appendPath(extDir, "package.json"); + var pkgConfig = await $config.OS.readFile(pfile); pkgConfig = JSON.parse(pkgConfig); if (typeof pkgConfig.mfmextension !== "undefined") { var extFile = pkgConfig.mfmextension.main; @@ -81,35 +66,34 @@ return({{extName}}); // // Put the unused pane with the extension's directory // - var curcursor = get(currentCursor); - curcursor.entry.dir = extDir; - curcursor.entry.name = extFile; - if (curcursor.pane === "left") { - rightDir.set({ + $currentCursor.entry.dir = extDir; + $currentCursor.entry.name = extFile; + if ($currentCursor.pane === "left") { + $rightDir = { path: extDir, - fileSystem: localConfig.OS, + fileSystem: $config.OS, fileSystemType: "local", - }); - curcursor.pane = "right"; + }; + $currentCursor.pane = "right"; } else { - leftDir.set({ + $leftDir = { path: extDir, - fileSystem: localConfig.OS, + fileSystem: $config.OS, fileSystemType: "local", - }); - curcursor.pane = "left"; + }; + $currentCursor.pane = "left"; } - currentCursor.set(curcursor); + $currentCursor = $currentCursor; - if (await localConfig.OS.fileExists(localConfig.userEditor)) { + if (await $config.OS.fileExists($config.userEditor)) { // // There is an editor defined by the user. Use it. // - var file = await localConfig.OS.appendPath(extDir, extFile); - var editor = await localConfig.OS.readFile(localConfig.userEditor); + var file = await $config.OS.appendPath(extDir, extFile); + var editor = await $config.OS.readFile($config.userEditor); editor = editor.toString().trim(); if (editor.endsWith(".app")) { - await localConfig.OS.openFileWithProgram(editor, file); + await $config.OS.openFileWithProgram(editor, file); } else { // // It is a command line editor. Open specially. @@ -118,7 +102,7 @@ return({{extName}}); // // Open emacs. // - await localConfig.OS.runCommandLine( + await $config.OS.runCommandLine( 'emacsclient -n -q "' + file + '"', [], (err, result) => {}, @@ -128,14 +112,14 @@ return({{extName}}); // // Open in a terminal program. // - await localConfig.OS.openInTerminal(editor, file); + await $config.OS.openInTerminal(editor, file); } } } else { // // Open with the system default editor. // - await localConfig.OS.runCommandLine( + await $config.OS.runCommandLine( 'open "' + file + '"', [], (err, result) => {}, @@ -162,14 +146,11 @@ return({{extName}}); } async function createExtension() { - var extDir = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - extDir = await localConfig.OS.appendPath(extDir, extensionName); - if (!(await localConfig.OS.dirExists(extDir))) { - await localConfig.OS.createDir(extDir); - await localConfig.OS.runCommandLine( + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + extDir = await $config.OS.appendPath(extDir, extensionName); + if (!(await $config.OS.dirExists(extDir))) { + await $config.OS.createDir(extDir); + await $config.OS.runCommandLine( 'cd "' + extDir + '"; npm init -y;', [], (err, stdout) => { @@ -204,17 +185,14 @@ return({{extName}}); // Svelte compiler will not pull from the local closure for some reason. Therefore, // I have to create this variable. // - var extDir = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - extDir = await localConfig.OS.appendPath(extDir, extensionName); + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + extDir = await $config.OS.appendPath(extDir, extensionName); // // Add the needed fields to the package.json file for Modal File Manager. // - var fileName = await localConfig.OS.appendPath(extDir, "package.json"); - var pkgConfig = await localConfig.OS.readFile(fileName); + var fileName = await $config.OS.appendPath(extDir, "package.json"); + var pkgConfig = await $config.OS.readFile(fileName); pkgConfig = JSON.parse(pkgConfig); // @@ -232,18 +210,15 @@ return({{extName}}); github: "", main: extensionName + ".js", }; - const pfile = await localConfig.OS.appendPath(extDir, "package.json"); - await localConfig.OS.writeFile(pfile, JSON.stringify(pkgConfig)); + const pfile = await $config.OS.appendPath(extDir, "package.json"); + await $config.OS.writeFile(pfile, JSON.stringify(pkgConfig)); // // Create the actual extension file. // - var extFile = await localConfig.OS.appendPath( - extDir, - extensionName + ".js" - ); + var extFile = await $config.OS.appendPath(extDir, extensionName + ".js"); var newExt = extTemplate.replaceAll("{{extName}}", extensionName); - await localConfig.OS.writeFile(extFile, newExt); + await $config.OS.writeFile(extFile, newExt); // // Edit the extension. @@ -255,15 +230,12 @@ return({{extName}}); } async function deleteExtension(ext) { - var extDir = await localConfig.OS.appendPath( - localConfig.configDir, - "extensions" - ); - await localConfig.OS.deleteEntries( + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + await $config.OS.deleteEntries( { dir: extDir, name: ext.name, - fileSystem: localConfig.OS, + fileSystem: $config.OS, }, (err, stdout) => { if (!err) { diff --git a/frontend/src/components/ExtraPanel.svelte b/frontend/src/components/ExtraPanel.svelte index 6e26d63..484213e 100644 --- a/frontend/src/components/ExtraPanel.svelte +++ b/frontend/src/components/ExtraPanel.svelte @@ -29,7 +29,7 @@

    {/if}
    -

    Date: {localCurrentCursor.entry.datetime}

    +

    Date: {$currentCursor.entry.datetime}

    Size: {size}

    @@ -69,11 +69,6 @@ export let side = ''; let extraPDOM = null; - let localCurrentCursor = { - pane: 'left', - entry: {} - }; - let localExtraPanel = []; let fullPath = ''; let extension = ''; let size = ''; @@ -84,43 +79,28 @@ onMount(async () => { // - // Subscribe to the current cursor in order to get the file information. + // Get the file information needed. // - var unsubscribeCurrentCursor = currentCursor.subscribe(async (value) => { - // - // Get the file information needed. - // - localCurrentCursor = value; - fullPath = await localCurrentCursor.entry.fileSystem.appendPath(localCurrentCursor.entry.dir, localCurrentCursor.entry.name); - extension = localCurrentCursor.entry.ext; - size = util.readableSize(localCurrentCursor.entry.size); + fullPath = await $currentCursor.entry.fileSystem.appendPath($currentCursor.entry.dir, $currentCursor.entry.name); + extension = $currentCursor.entry.ext; + size = util.readableSize($currentCursor.entry.size); - // - // Check the new cursor for extra panel items. - // - isExtra = checkExtraPanel(); - }); - - // - // See if the exta panel has information. // - var unsubscribeExtraPanel = extraPanel.subscribe(value => { - localExtraPanel = value; - }); + // Check the new cursor for extra panel items. + // + isExtra = checkExtraPanel(); // - // Return the function to unsubscribe to the stores. + // Return the function // return(() => { - unsubscribeCurrentCursor(); - unsubscribeExtraPanel(); }) }); afterUpdate(async () => { if(isMovie()) { await tick(); - var file = new File(localCurrentCursor.entry.dir, localCurrentCursor.entry.name); + var file = new File($currentCursor.entry.dir, $currentCursor.entry.name); var fileURL = window.URL.createObjectURL(file); var videoNode = window.document.getElementById('videoItem'); if(videoNode !== null) { @@ -129,7 +109,7 @@ getDimensions(fullPath); } if(isExtra) { - localExtraPanel.forEach(item => { + $extraPanel.forEach(item => { item.after(); }); } @@ -137,8 +117,8 @@ function checkExtraPanel() { extraHTML = ''; - localExtraPanel.forEach(async item => { - isExtra = await item.check(localCurrentCursor.entry.dir, localCurrentCursor.entry.name, localCurrentCursor.fileSystem, side); + $extraPanel.forEach(async item => { + isExtra = await item.check($currentCursor.entry.dir, $currentCursor.entry.name, $currentCursor.fileSystem, side); if(isExtra) { var newContent = await item.createHTML(); extraHTML = extraHTML.concat('\n',newContent); @@ -161,7 +141,7 @@ function getDimensions(fileName) { var com = 'ffprobe -v error -of flat=s=_ -select_streams v:0 -show_entries stream=height,width "' + fileName + '"'; - localCurrentCursor.entry.fileSystem.runCommandLine(com, [], (err, stdout) => { + $currentCursor.entry.fileSystem.runCommandLine(com, [], (err, stdout) => { if(err) { console.log(err); } else { diff --git a/frontend/src/components/GeneralPrefs.svelte b/frontend/src/components/GeneralPrefs.svelte index d2be040..9a92b70 100644 --- a/frontend/src/components/GeneralPrefs.svelte +++ b/frontend/src/components/GeneralPrefs.svelte @@ -1,33 +1,60 @@ -
    - {#if localConfig !== null} + + +
    + {#if $config !== null}

    Environment for Launching Programs

    Other Configuration Items

    -
    - - {#if localConfig.configuration.useTrash} - + + {#if $config.configuration.useTrash} + {:else} - + {/if}
    {/if} @@ -45,7 +72,7 @@ #trashcanans { margin: auto 0px auto 10px; } - + h3 { margin-left: 10px; } @@ -56,50 +83,3 @@ margin: 10px; } - - diff --git a/frontend/src/components/GitHub.svelte b/frontend/src/components/GitHub.svelte index a9e9aca..90c1411 100644 --- a/frontend/src/components/GitHub.svelte +++ b/frontend/src/components/GitHub.svelte @@ -9,7 +9,6 @@ const dispatch = createEventDispatcher(); - let octok; let repos = null; let themes = null; let width = null; @@ -21,7 +20,7 @@ let loading = true; onMount(async () => { - keyProcess.set(false); + $keyProcess = false; width = window.innerWidth - 30; timeOut = setTimeout(focusInput, 1000); await loadRepoInfo(); @@ -36,7 +35,7 @@ }); function focusInput() { - if (once) keyProcess.set(false); + if (once) $keyProcess = false; once = false; clearTimeout(timeOut); if (typeof hiddenInput !== "undefined" && hiddenInput !== null) @@ -67,19 +66,18 @@ } function exitGitHub() { - keyProcess.set(true); + $keyProcess = true; inputHidden = null; dispatch("closeGitHub", {}); } async function installTheme(thm) { - var confg = get(config); - var thmDir = await confg.OS.appendPath(confg.configDir, "themes"); - thmDir = await confg.OS.appendPath(thmDir, thm.name); - if (!(await confg.OS.dirExists(thmDir))) { - await confg.OS.createDir(thmDir); + var thmDir = await $config.OS.appendPath($config.configDir, "themes"); + thmDir = await $config.OS.appendPath(thmDir, thm.name); + if (!(await $config.OS.dirExists(thmDir))) { + await $config.OS.createDir(thmDir); } - await confg.OS.runCommandLine( + await $config.OS.runCommandLine( "git clone '" + thm.url + "' '" + thmDir + "';", [], (err, stdin, stdout) => { @@ -94,15 +92,14 @@ } async function loadTheme(thm) { - var confg = get(config); - var thmDir = await confg.OS.appendPath(confg.configDir, "themes"); - thmDir = await confg.OS.appendPath(thmDir, thm.name); - const pfile = await confg.OS.appendPath(thmDir, "package.json"); - if (await confg.OS.fileExists(pfile)) { - var manifest = await confg.OS.readFile(pfile); + var thmDir = await $config.OS.appendPath($config.configDir, "themes"); + thmDir = await $config.OS.appendPath(thmDir, thm.name); + const pfile = await $config.OS.appendPath(thmDir, "package.json"); + if (await $config.OS.fileExists(pfile)) { + var manifest = await $config.OS.readFile(pfile); manifest = JSON.parse(manifest); - const mfile = await confg.OS.appendPath(thmDir, manifest.mfmtheme.main); - var newTheme = await confg.OS.readFile(mfile); + const mfile = await $config.OS.appendPath(thmDir, manifest.mfmtheme.main); + var newTheme = await $config.OS.readFile(mfile); newTheme = JSON.parse(newTheme); theme.set(newTheme); addMsg(thm, "This theme is now being used."); @@ -112,17 +109,15 @@ } async function themeExists(thm) { - var confg = get(config); - var thmDir = await confg.OS.appendPath(confg.configDir, "themes"); - thmDir = await confg.OS.appendPath(thmDir, thm.name); - var result = await confg.OS.dirExists(thmDir); + var thmDir = await $config.OS.appendPath($config.configDir, "themes"); + thmDir = await $config.OS.appendPath(thmDir, thm.name); + var result = await $config.OS.dirExists(thmDir); return result; } async function deleteTheme(thm) { - var confg = get(config); - var thmDir = await confg.OS.appendPath(confg.configDir, "themes"); - await confg.OS.deleteEntries( + var thmDir = await $config.OS.appendPath($config.configDir, "themes"); + await $config.OS.deleteEntries( { name: thm.name, dir: thmDir, @@ -139,13 +134,12 @@ } async function installExtension(ext) { - var confg = get(config); - var extDir = await confg.OS.appendPath(confg.configDir, "extensions"); - extDir = await confg.OS.appendPath(extDir, ext.name); - if (!(await confg.OS.dirExists(extDir))) { - await confg.OS.createDir(extDir); + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + extDir = await $config.OS.appendPath(extDir, ext.name); + if (!(await $config.OS.dirExists(extDir))) { + await $config.OS.createDir(extDir); } - await confg.OS.runCommandLine( + await $config.OS.runCommandLine( "git clone '" + ext.url + "' '" + extDir + "';", [], (err, stdin, stdout) => { @@ -157,17 +151,15 @@ } async function extExists(ext) { - var confg = get(config); - var extDir = await confg.OS.appendPath(confg.configDir, "extensions"); - extDir = await confg.OS.appendPath(extDir, ext.name); - var flag = await confg.OS.dirExists(extDir); + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + extDir = await $config.OS.appendPath(extDir, ext.name); + var flag = await $config.OS.dirExists(extDir); return flag; } async function deleteExtension(ext) { - var confg = get(config); - var extDir = await confg.OS.appendPath(confg.configDir, "extensions"); - await confg.OS.deleteEntries( + var extDir = await $config.OS.appendPath($config.configDir, "extensions"); + await $config.OS.deleteEntries( { name: ext.name, dir: extDir, diff --git a/frontend/src/components/MessageBox.svelte b/frontend/src/components/MessageBox.svelte index 58a5af7..2f192d3 100644 --- a/frontend/src/components/MessageBox.svelte +++ b/frontend/src/components/MessageBox.svelte @@ -26,14 +26,14 @@ // // Turn off key processing. // - keyProcess.set(false); + $keyProcess = false; // // Return a function to be called when this component no longer // is being shown. // return () => { - keyProcess.set(true); + $keyProcess = true; }; }); @@ -75,7 +75,7 @@ function returnPickerValue(skip) { if (typeof skip === "undefined") skip = false; - keyProcess.set(true); + $keyProcess = true; var retItem = {}; if (pickerItems.length > 0) { retItem.value = pickerItems[pickerNum].value; @@ -108,7 +108,7 @@ function cancel() { var skip = false; - keyProcess.set(true); + $keyProcess = true; dispatch("closeMsgBox", { skip: skip, }); @@ -192,7 +192,7 @@ // // Enter key. Take the highlighted value and return. // - keyProcess.set(true); + $keyProcess = true; dispatch("msgReturn", { ans: { type: "picker", diff --git a/frontend/src/components/Pane.svelte b/frontend/src/components/Pane.svelte index e1393f2..91129ae 100644 --- a/frontend/src/components/Pane.svelte +++ b/frontend/src/components/Pane.svelte @@ -1,56 +1,15 @@ -
    - {#each entries as entry,index} - - {/each} -
    {cursorToPane()}} - on:drop|preventDefault={(e) => { dropFiles(e, 'drop'); }} - on:dragover|preventDefault={(e) => { dropFiles(e,'dragover'); }} - > -
    -
    - - - + +
    + {#each entries as entry, index} + + {/each} +
    { + cursorToPane(); + }} + on:drop|preventDefault={(e) => { + dropFiles(e, "drop"); + }} + on:dragover|preventDefault={(e) => { + dropFiles(e, "dragover"); + }} + /> +
    + + diff --git a/frontend/src/components/QuickSearch.svelte b/frontend/src/components/QuickSearch.svelte index bc40cc7..0da9cb6 100644 --- a/frontend/src/components/QuickSearch.svelte +++ b/frontend/src/components/QuickSearch.svelte @@ -20,13 +20,11 @@ let qsInput = ""; let qsInputDOM = null; - let cursor = null; - let localTheme = null; let position = null; let origEntries = null; beforeUpdate(() => { - if (cursor === null) { + if ($currentCursor === null) { getDefaults(); } }); @@ -38,7 +36,7 @@ }); onMount(() => { - if (cursor.pane === "left") { + if ($currentCursor.pane === "left") { position = leftDOM.clientWidth - 110; } else { position = rightDOM.clientWidth + leftDOM.clientWidth - 95; @@ -46,14 +44,12 @@ }); function getDefaults() { - cursor = get(currentCursor); - localTheme = get(theme); - keyProcess.set(false); + $keyProcess = false; origEntries = usingEntry(leftEntries, rightEntries); } function usingEntry(leftE, rightE) { - if (cursor.pane === "left") { + if ($currentCursor.pane === "left") { return leftE; } else { return rightE; @@ -62,7 +58,7 @@ function exitQS(skip) { if (typeof skip === "undefined") skip = false; - cursor = null; + $currentCursor = null; dispatch("closeQuickSearch", { skip: skip, }); @@ -84,7 +80,7 @@ } function processInput() { - if (cursor === null) { + if ($currentCursor === null) { getDefaults(); } @@ -103,7 +99,7 @@ // if (entries.length > 0) { dispatch("changeEntries", { - pane: cursor.pane, + pane: $currentCursor.pane, entries: entries, }); } @@ -120,8 +116,8 @@ on:blur={(e) => { exitQS(); }} - style="background-color: {localTheme.textColor}; - text-color: {localTheme.backgroundColor};" + style="background-color: {$theme.textColor}; + text-color: {$theme.backgroundColor};" />
    diff --git a/frontend/src/components/ResizeBorder.svelte b/frontend/src/components/ResizeBorder.svelte index f2130d7..6386163 100644 --- a/frontend/src/components/ResizeBorder.svelte +++ b/frontend/src/components/ResizeBorder.svelte @@ -4,8 +4,8 @@ width: 10px; max-width: 10px; min-width: 10px; - border-left: 3px solid {localTheme.borderColor}; - border-right: 3px solid {localTheme.borderColor};" + border-left: 3px solid {$theme.borderColor}; + border-right: 3px solid {$theme.borderColor};" on:mousedown={e => { dispatch('mouseDown', true); }} @@ -30,14 +30,8 @@ const dispatch = createEventDispatcher(); - let localTheme = {}; - onMount(() => { - var unsubscribeTheme = theme.subscribe(value => { - localTheme = value; - }); return(() => { - unsubscribeTheme(); }) }); diff --git a/frontend/src/components/StatusLine.svelte b/frontend/src/components/StatusLine.svelte index 00c2cbe..11e5b39 100644 --- a/frontend/src/components/StatusLine.svelte +++ b/frontend/src/components/StatusLine.svelte @@ -7,17 +7,6 @@ import util from "../modules/util.js"; - let localInputState = "normal"; - let localCurrentCursor = { - entry: { - name: "test.txt", - size: "", - datetime: "", - }, - pane: "", - }; - let localStateMapColors = []; - let stateColor = "#6fb1e9"; let size = 0; let DT; @@ -26,41 +15,29 @@ // Here, we are subscribing to the different stores and setting their // default values; // - var unSubscribeInputState = inputState.subscribe((value) => { - localInputState = value; - stateColor = localStateMapColors[localInputState]; - }); - var unSubscribeCurrentCursor = currentCursor.subscribe((value) => { - localCurrentCursor = value; + let unsubscribeCurrentCursor = currentCursor.subscribe((value) => { if (typeof value.entry === "undefined") { - localCurrentCursor = { + $currentCursor = { entry: { name: "", size: "", datetime: "", }, - pane: localCurrentCursor.pane, + pane: value.pane, }; size = ""; } else { - size = util.readableSize(localCurrentCursor.entry.size); - + size = util.readableSize(value.entry.size); // // Setup a locale dependent way to show date and time. // #TODO: make more programmable? // - DT = new Date(localCurrentCursor.entry.datetime).toLocaleString(); + DT = new Date(value.entry.datetime).toLocaleString(); if (DT === "Invalid Date") DT = ""; } }); - var unSubscribeStateMapColors = stateMapColors.subscribe((value) => { - localStateMapColors = value; - stateColor = localStateMapColors[localInputState]; - }); return () => { - unSubscribeCurrentCursor(); - unSubscribeInputState(); - unSubscribeStateMapColors(); + unsubscribeCurrentCursor(); }; }); @@ -73,21 +50,24 @@ font-size: {$theme.fontSize}; border-top: 3px solid {$theme.borderColor};" > - - {localInputState} + + {$inputState} - {localCurrentCursor.pane} + {$currentCursor.pane} - {localCurrentCursor.entry.name} + {$currentCursor.entry.name} {size} diff --git a/frontend/src/components/ThemePrefs.svelte b/frontend/src/components/ThemePrefs.svelte index 367f77a..01ef072 100644 --- a/frontend/src/components/ThemePrefs.svelte +++ b/frontend/src/components/ThemePrefs.svelte @@ -6,8 +6,6 @@ const dispatch = createEventDispatcher(); - let localTheme = null; - let localConfig = null; let themeName = ""; let showMsgBox = false; let msgText = ""; @@ -17,20 +15,12 @@ let first = true; onMount(async () => { - const unsubTheme = theme.subscribe((value) => { - localTheme = value; - }); - - const unsubConfig = config.subscribe(async (value) => { - localConfig = value; - if (typeof localConfig.OS !== "undefined") { - await loadThemeList(); - } - }); + $config = value; + if (typeof $config.OS !== "undefined") { + await loadThemeList(); + } return () => { - unsubTheme(); - unsubConfig(); }; }); @@ -44,11 +34,11 @@ }); async function loadThemeList() { - var themedir = await localConfig.OS.appendPath( - localConfig.configDir, + var themedir = await $config.OS.appendPath( + $config.configDir, "themes" ); - themeList = await localConfig.OS.getDirList(themedir); + themeList = await $config.OS.getDirList(themedir); themeName = ""; } @@ -59,19 +49,19 @@ } function changeValue(kv, e) { - localTheme[kv[0]] = e.detail.value; - theme.set(localTheme); + $theme[kv[0]] = e.detail.value; + $theme = $theme; } async function createTheme() { - var thmDir = await localConfig.OS.appendPath( - localConfig.configDir, + var thmDir = await $config.OS.appendPath( + $config.configDir, "themes" ); - thmDir = await localConfig.OS.appendPath(thmDir, themeName); - if (!(await localConfig.OS.dirExists(thmDir))) { - await localConfig.OS.createDir(thmDir); - await localConfig.OS.runCommandLine( + thmDir = await $config.OS.appendPath(thmDir, themeName); + if (!(await $config.OS.dirExists(thmDir))) { + await $config.OS.createDir(thmDir); + await $config.OS.runCommandLine( 'cd "' + thmDir + '"; npm init -y;', [], async (err, stdout) => { @@ -85,11 +75,11 @@ // // Add the needed fields to the package.json file for Modal File Manager. // - const pfile = await localConfig.OS.appendPath( + const pfile = await $config.OS.appendPath( thmDir, "package.json" ); - var pkgConfig = JSON.parse(await localConfig.OS.readFile(pfile)); + var pkgConfig = JSON.parse(await $config.OS.readFile(pfile)); pkgConfig.mfmtheme = { name: themeName, description: "", @@ -97,16 +87,16 @@ github: "", main: themeName + ".json", }; - await localConfig.OS.writeFile(pfile, JSON.stringify(pkgConfig)); + await $config.OS.writeFile(pfile, JSON.stringify(pkgConfig)); } // // Create the actual theme file. // - var thmFile = await localConfig.OS.appendPath( + var thmFile = await $config.OS.appendPath( thmDir, themeName + ".json" ); - await localConfig.OS.writeFile(thmFile, JSON.stringify(localTheme)); + await $config.OS.writeFile(thmFile, JSON.stringify($theme)); loadThemeList(); }, "." @@ -125,39 +115,39 @@ } async function updateTheme(thm) { - var thmDir = await localConfig.OS.appendPath( - localConfig.configDir, + var thmDir = await $config.OS.appendPath( + $config.configDir, "themes" ); - thmDir = await localConfig.OS.appendPath(thmDir, thm.name); - const pfile = await localConfig.OS.appendPath(thmDir, "package.json"); - var pkgConfig = await localConfig.OS.readFile(pfile); + thmDir = await $config.OS.appendPath(thmDir, thm.name); + const pfile = await $config.OS.appendPath(thmDir, "package.json"); + var pkgConfig = await $config.OS.readFile(pfile); pkgConfig = JSON.parse(pkgConfig); - var thmFile = await localConfig.OS.appendPath( + var thmFile = await $config.OS.appendPath( thmDir, pkgConfig.mfmtheme.main ); - await localConfig.OS.writeFile(thmFile, JSON.stringify(localTheme)); + await $config.OS.writeFile(thmFile, JSON.stringify($theme)); } async function deleteTheme(thm) { - var thmDir = await localConfig.OS.appendPath( - localConfig.configDir, + var thmDir = await $config.OS.appendPath( + $config.configDir, "themes" ); - await localConfig.OS.deleteEntries( + await $config.OS.deleteEntries( { dir: thmDir, name: thm.name, - fileSystem: localConfig.OS, + fileSystem: $config.OS, }, async (err, stdout) => { if (!err) { - var themedir = await localConfig.OS.appendPath( - localConfig.configDir, + var themedir = await $config.OS.appendPath( + $config.configDir, "themes" ); - themeList = await localConfig.OS.getDirList(themedir); + themeList = await $config.OS.getDirList(themedir); } else { msgText = "The theme, " + thm.name + ", can't be deleted."; msgTitle = "Theme Preferences"; @@ -169,27 +159,26 @@ } async function setTheme(thm) { - var thmDir = await localConfig.OS.appendPath( - localConfig.configDir, + var thmDir = await $config.OS.appendPath( + $config.configDir, "themes" ); - thmDir = await localConfig.OS.appendPath(thmDir, thm.name); - const pfile = await localConfig.OS.appendPath(thmDir, "package.json"); - var pkgConfig = await localConfig.OS.readFile(pfile); + thmDir = await $config.OS.appendPath(thmDir, thm.name); + const pfile = await $config.OS.appendPath(thmDir, "package.json"); + var pkgConfig = await $config.OS.readFile(pfile); pkgConfig = JSON.parse(pkgConfig); - var thmFile = await localConfig.OS.appendPath( + var thmFile = await $config.OS.appendPath( thmDir, pkgConfig.mfmtheme.main ); - localTheme = await localConfig.OS.readFile(thmFile); - localTheme = JSON.parse(localTheme); - theme.set(localTheme); + $theme = await $config.OS.readFile(thmFile); + $theme = JSON.parse($theme); }

    Current Theme Values

    - {#if localTheme !== null} + {#if $theme !== null}
    @@ -198,7 +187,7 @@ - {#each Object.entries(localTheme) as kv} + {#each Object.entries($theme) as kv}