From 53c8a79171ed985cca3ec007da135855489a2967 Mon Sep 17 00:00:00 2001 From: Michael Ochmann Date: Wed, 5 Oct 2022 11:43:07 +0200 Subject: [PATCH] added the ability to close a file --- contextAPI.js | 12 +++++++++--- src/Ation.js | 19 +++++++++++++++---- src/MainMenu.js | 7 +++++++ src/ui/src/components/Ation.js | 7 ++++++- src/ui/src/components/Toolbar.js | 5 +++-- src/ui/src/shared/SlideContext.js | 11 ++++++----- 6 files changed, 46 insertions(+), 15 deletions(-) diff --git a/contextAPI.js b/contextAPI.js index 839f707..aa05524 100644 --- a/contextAPI.js +++ b/contextAPI.js @@ -2,7 +2,8 @@ const {contextBridge, ipcRenderer, webFrame} = require("electron"); -let fileOpenListener = null; +let fileOpenListener = null; +let closeFileListener = null; contextBridge.exposeInMainWorld("api", { openFileDialog : () => ipcRenderer.send("WindowManager::openFileDialog"), @@ -12,9 +13,14 @@ contextBridge.exposeInMainWorld("api", { fileOpenListener = (_, presentation) => callback(presentation); ipcRenderer.on("Ation::openFile", fileOpenListener); }, + onFileClose : callback => { + if (closeFileListener) + ipcRenderer.off("Ation::closeFile", closeFileListener); + closeFileListener = () => callback(); + ipcRenderer.on("Ation::closeFile", closeFileListener); + }, openFile : filePath => ipcRenderer.send("WindowManager::openFile", filePath), - - removeOnFileOpenListener : callback => ipcRenderer.off("Ation::openFile", callback), + closeFile : () => ipcRenderer.send("Ation::closeFile"), clearCache : () => webFrame.clearCache(), appVersion : async () => await ipcRenderer.invoke("Ation::appVersion") diff --git a/src/Ation.js b/src/Ation.js index abdffc5..246c44e 100644 --- a/src/Ation.js +++ b/src/Ation.js @@ -1,8 +1,8 @@ "use strict"; -const {app, protocol, dialog, ipcMain} = require("electron"); -const path = require("path"); -const fs = require("fs/promises"); -const fsn = require("fs"); +const {app, protocol, dialog, ipcMain, Menu} = require("electron"); +const path = require("path"); +const fs = require("fs/promises"); +const fsn = require("fs"); const AppInfo = require("../package.json"); const WindowManager = require("./WindowManager"); @@ -30,6 +30,7 @@ class Ation { }); ipcMain.handle("Ation::appVersion", () => AppInfo.version); + ipcMain.on("Ation::closeFile", () => this.closeFile()); app.whenReady().then(async () => { if (this.fileToOpen) @@ -79,12 +80,22 @@ class Ation { else this.openFile(this.currentFile, true); }); + Menu.getApplicationMenu().getMenuItemById("close-file").enabled = this.currentFile !== ""; this.windowManager.mainWindow.send("Ation::openFile", [basePath, data]); } catch (error) { console.log(error); return; } } + + closeFile() { + this.currentFile = ""; + if (this.watcher) + this.watcher.close(); + this.watcher = null; + this.windowManager.mainWindow.send("Ation::closeFile"); + Menu.getApplicationMenu().getMenuItemById("close-file").enabled = this.currentFile !== ""; + } } Ation.Instances = 0; diff --git a/src/MainMenu.js b/src/MainMenu.js index 86ddf79..e1beed8 100644 --- a/src/MainMenu.js +++ b/src/MainMenu.js @@ -22,6 +22,13 @@ class MainMenu { label : "Open", accelerator : "CommandOrControl+O", click : () => this.app.openFile() + }, + { + id : "close-file", + label : "Close", + accelerator : "CommandOrControl+W", + click : () => this.app.closeFile(), + enabled : this.app.currentFile !== "" } ] }, diff --git a/src/ui/src/components/Ation.js b/src/ui/src/components/Ation.js index fd928c0..b5bb7d7 100644 --- a/src/ui/src/components/Ation.js +++ b/src/ui/src/components/Ation.js @@ -30,6 +30,11 @@ const Ation = () => { setBasePath(newBasePath); setDeck(slideDeck); }); + window.api.onFileClose(() => { + setBasePath(""); + setSlide(0); + setDeck([]); + }); (async set => set(await window.api.appVersion()))(setVersion); }, [basePath, slide]); @@ -42,7 +47,7 @@ const Ation = () => { {deck.length < 1 ? : ( - +
diff --git a/src/ui/src/components/Toolbar.js b/src/ui/src/components/Toolbar.js index 3f32638..ce9e2cc 100644 --- a/src/ui/src/components/Toolbar.js +++ b/src/ui/src/components/Toolbar.js @@ -1,6 +1,6 @@ import React, {useContext} from "react"; -import {Folder2Open, Cast, InfoCircle} from "react-bootstrap-icons"; +import {Folder2Open, Cast, InfoCircle, XSquare} from "react-bootstrap-icons"; import SlideContext from "../shared/SlideContext"; import Mode from "../models/Mode"; @@ -8,7 +8,7 @@ import Mode from "../models/Mode"; import {ReactComponent as Logo} from "../assets/images/logo_ation.svg"; const Toolbar = ({openFile, setShowTips, version}) => { - const {setMode, setSlide} = useContext(SlideContext); + const {setMode, setSlide, slideCount} = useContext(SlideContext); const present = () => { setMode(Mode.PRESENT); @@ -21,6 +21,7 @@ const Toolbar = ({openFile, setShowTips, version}) => { + v{version} diff --git a/src/ui/src/shared/SlideContext.js b/src/ui/src/shared/SlideContext.js index c3c034a..76f9fa3 100644 --- a/src/ui/src/shared/SlideContext.js +++ b/src/ui/src/shared/SlideContext.js @@ -3,11 +3,12 @@ import {createContext} from "react"; import Mode from "../models/Mode"; const SlideContext = createContext({ - slide : 0, - mode : Mode.NORMAL, - basePath : "", - setMode : () => {}, - setSlide : () => {} + slide : 0, + slideCount : 0, + mode : Mode.NORMAL, + basePath : "", + setMode : () => {}, + setSlide : () => {} }); export default SlideContext; \ No newline at end of file