Add app menu
This commit is contained in:
parent
5290fc6b11
commit
70d8229a32
164
src/main.js
164
src/main.js
|
|
@ -3,8 +3,18 @@ import * as fitCurve from '/fit-curve.js';
|
||||||
import { Bezier } from "/bezier.js";
|
import { Bezier } from "/bezier.js";
|
||||||
import { Quadtree } from './quadtree.js';
|
import { Quadtree } from './quadtree.js';
|
||||||
const { writeTextFile: writeTextFile, readTextFile: readTextFile }= window.__TAURI__.fs;
|
const { writeTextFile: writeTextFile, readTextFile: readTextFile }= window.__TAURI__.fs;
|
||||||
const { open: openFileDialog, save: saveFileDialog, message: messageDialog } = window.__TAURI__.dialog;
|
const {
|
||||||
|
open: openFileDialog,
|
||||||
|
save: saveFileDialog,
|
||||||
|
message: messageDialog,
|
||||||
|
confirm: confirmDialog,
|
||||||
|
} = window.__TAURI__.dialog;
|
||||||
const { documentDir, join } = window.__TAURI__.path;
|
const { documentDir, join } = window.__TAURI__.path;
|
||||||
|
const { Menu, MenuItem, Submenu } = window.__TAURI__.menu ;
|
||||||
|
const { getCurrentWindow } = window.__TAURI__.window;
|
||||||
|
|
||||||
|
|
||||||
|
const macOS = navigator.userAgent.includes('Macintosh')
|
||||||
|
|
||||||
let simplifyPolyline = simplify
|
let simplifyPolyline = simplify
|
||||||
|
|
||||||
|
|
@ -24,9 +34,12 @@ let redoStack = [];
|
||||||
|
|
||||||
let layoutElements = []
|
let layoutElements = []
|
||||||
|
|
||||||
|
let appVersion = "0.6.1-alpha"
|
||||||
let minFileVersion = "1.0"
|
let minFileVersion = "1.0"
|
||||||
let maxFileVersion = "2.0"
|
let maxFileVersion = "2.0"
|
||||||
|
|
||||||
|
let filePath = undefined
|
||||||
|
|
||||||
|
|
||||||
let tools = {
|
let tools = {
|
||||||
select: {
|
select: {
|
||||||
|
|
@ -101,7 +114,9 @@ let config = {
|
||||||
undo: "z",
|
undo: "z",
|
||||||
redo: "Z",
|
redo: "Z",
|
||||||
save: "s",
|
save: "s",
|
||||||
open: "o"
|
saveAs: "S",
|
||||||
|
open: "o",
|
||||||
|
quit: "q",
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1130,12 +1145,39 @@ window.addEventListener("keypress", (e) => {
|
||||||
redo()
|
redo()
|
||||||
} else if (e.key == config.shortcuts.save && e.ctrlKey == true) {
|
} else if (e.key == config.shortcuts.save && e.ctrlKey == true) {
|
||||||
save()
|
save()
|
||||||
|
} else if (e.key == config.shortcuts.saveAs && e.ctrlKey == true) {
|
||||||
|
saveAs()
|
||||||
} else if (e.key == config.shortcuts.open && e.ctrlKey == true) {
|
} else if (e.key == config.shortcuts.open && e.ctrlKey == true) {
|
||||||
open()
|
open()
|
||||||
|
} else if (e.key == config.shortcuts.quit && e.ctrlKey == true) {
|
||||||
|
quit()
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
async function _save(path) {
|
||||||
|
try {
|
||||||
|
const fileData = {
|
||||||
|
version: "1.0",
|
||||||
|
actions: undoStack
|
||||||
|
}
|
||||||
|
const contents = JSON.stringify(fileData );
|
||||||
|
await writeTextFile(path, contents)
|
||||||
|
filePath = path
|
||||||
|
console.log(`${path} saved successfully!`);
|
||||||
|
} catch (error) {
|
||||||
|
console.error("Error saving text file:", error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
async function save() {
|
async function save() {
|
||||||
|
if (filePath) {
|
||||||
|
_save(filePath)
|
||||||
|
} else {
|
||||||
|
saveAs()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function saveAs() {
|
||||||
const path = await saveFileDialog({
|
const path = await saveFileDialog({
|
||||||
filters: [
|
filters: [
|
||||||
{
|
{
|
||||||
|
|
@ -1145,17 +1187,7 @@ async function save() {
|
||||||
],
|
],
|
||||||
defaultPath: await join(await documentDir(), "untitled.beam")
|
defaultPath: await join(await documentDir(), "untitled.beam")
|
||||||
});
|
});
|
||||||
try {
|
if (path != undefined) _save(path);
|
||||||
const fileData = {
|
|
||||||
version: "1.0",
|
|
||||||
actions: undoStack
|
|
||||||
}
|
|
||||||
const contents = JSON.stringify(fileData );
|
|
||||||
await writeTextFile(path, contents)
|
|
||||||
console.log(`${path} saved successfully!`);
|
|
||||||
} catch (error) {
|
|
||||||
console.error("Error saving text file:", error);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
async function open() {
|
async function open() {
|
||||||
|
|
@ -1213,6 +1245,16 @@ async function open() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function quit() {
|
||||||
|
if (undoStack.length) {
|
||||||
|
if (await confirmDialog("Are you sure you want to quit?", {title: 'Really quit?', kind: "warning"})) {
|
||||||
|
getCurrentWindow().close()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
getCurrentWindow().close()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function stage() {
|
function stage() {
|
||||||
let stage = document.createElement("canvas")
|
let stage = document.createElement("canvas")
|
||||||
let scroller = document.createElement("div")
|
let scroller = document.createElement("div")
|
||||||
|
|
@ -1657,6 +1699,102 @@ function infopanel() {
|
||||||
return panel
|
return panel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async function setupMenu() {
|
||||||
|
const fileSubmenu = await Submenu.new({
|
||||||
|
text: 'File',
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
text: 'Save',
|
||||||
|
enabled: true,
|
||||||
|
action: save,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Save As...',
|
||||||
|
enabled: true,
|
||||||
|
action: saveAs,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Open File...',
|
||||||
|
enabled: true,
|
||||||
|
action: open,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: 'Quit',
|
||||||
|
enabled: true,
|
||||||
|
action: quit,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
})
|
||||||
|
|
||||||
|
const editSubmenu = await Submenu.new({
|
||||||
|
text: "Edit",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
text: "Undo",
|
||||||
|
enabled: true,
|
||||||
|
action: undo
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Redo",
|
||||||
|
enabled: true,
|
||||||
|
action: redo
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Cut",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Copy",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Paste",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
const viewSubmenu = await Submenu.new({
|
||||||
|
text: "View",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
text: "Zoom In",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: "Zoom Out",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
});
|
||||||
|
const helpSubmenu = await Submenu.new({
|
||||||
|
text: "Help",
|
||||||
|
items: [
|
||||||
|
{
|
||||||
|
text: "About...",
|
||||||
|
enabled: true,
|
||||||
|
action: () => {
|
||||||
|
messageDialog(`Lightningbeam version ${appVersion}\nDeveloped by Skyler Lehmkuhl`,
|
||||||
|
{title: 'About', kind: "info"}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
});
|
||||||
|
|
||||||
|
const menu = await Menu.new({
|
||||||
|
items: [fileSubmenu, editSubmenu, viewSubmenu, helpSubmenu],
|
||||||
|
})
|
||||||
|
await (macOS ? menu.setAsAppMenu() : menu.setAsWindowMenu())
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initialize the menu when the app starts
|
||||||
|
setupMenu();
|
||||||
|
|
||||||
function createPane(content=undefined) {
|
function createPane(content=undefined) {
|
||||||
let div = document.createElement("div")
|
let div = document.createElement("div")
|
||||||
let header = document.createElement("div")
|
let header = document.createElement("div")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue