jspaint/src/menus.js

517 lines
12 KiB
JavaScript

var menus = {
"&File": [
{
item: "&New",
shortcut: "Ctrl+N",
action: ()=> { file_new(); },
description: "Creates a new document.",
},
{
item: "&Open",
shortcut: "Ctrl+O",
action: ()=> { file_open(); },
description: "Opens an existing document.",
},
{
item: "&Save",
shortcut: "Ctrl+S",
action: ()=> { file_save(); },
description: "Saves the active document.",
},
{
item: "Save &As",
shortcut: "Ctrl+Shift+S",
// in mspaint, no shortcut is listed, but it supports F12; it doesn't support Ctrl+Shift+S
action: ()=> { file_save_as(); },
description: "Saves the active document with a new name.",
},
$MenuBar.DIVIDER,
{
item: "&Load From URL",
// shortcut: "Ctrl+L",
action: ()=> { file_load_from_url(); },
description: "Opens an image from the web.",
},
{
item: "&Upload To Imgur",
action: ()=> {
// include the selection in the saved image
deselect();
canvas.toBlob((blob)=> {
sanity_check_blob(blob, ()=> {
show_imgur_uploader(blob);
});
});
},
description: "Uploads the active document to Imgur",
},
$MenuBar.DIVIDER,
{
item: "Manage Storage",
action: ()=> { manage_storage(); },
description: "Manages storage of previously created or opened pictures.",
},
$MenuBar.DIVIDER,
{
item: "Print Pre&view",
action: ()=> {
print();
},
description: "Prints the active document and sets printing options.",
//description: "Displays full pages.",
},
{
item: "Page Se&tup",
action: ()=> {
print();
},
description: "Prints the active document and sets printing options.",
//description: "Changes the page layout.",
},
{
item: "&Print",
shortcut: "Ctrl+P",
action: ()=> {
print();
},
description: "Prints the active document and sets printing options.",
},
$MenuBar.DIVIDER,
{
item: "Set As &Wallpaper (Tiled)",
action: ()=> { set_as_wallpaper_tiled(); },
description: "Tiles this bitmap as the desktop background.",
},
{
item: "Set As Wallpaper (&Centered)", // in mspaint it's Wa&llpaper
action: ()=> { set_as_wallpaper_centered(); },
description: "Centers this bitmap as the desktop background.",
},
$MenuBar.DIVIDER,
{
item: "Recent File",
enabled: false, // @TODO for desktop app
description: "",
},
$MenuBar.DIVIDER,
{
item: "E&xit",
shortcut: "Alt+F4",
action: ()=> {
close();
},
description: "Quits Paint.",
}
],
"&Edit": [
{
item: "&Undo",
shortcut: "Ctrl+Z",
enabled: ()=> {
return undos.length >= 1;
},
action: ()=> { undo(); },
description: "Undoes the last action.",
},
{
item: "&Repeat",
shortcut: "F4",
enabled: ()=> {
return redos.length >= 1;
},
action: ()=> { redo(); },
description: "Redoes the previously undone action.",
},
$MenuBar.DIVIDER,
{
item: "Cu&t",
shortcut: "Ctrl+X",
enabled: ()=> {
// support cutting selected text with this menu item as well (e.g. in the text tool text box)
return !!selection;
},
action: ()=> {
edit_cut(true);
},
description: "Cuts the selection and puts it on the Clipboard.",
},
{
item: "&Copy",
shortcut: "Ctrl+C",
enabled: ()=> {
// support copying selected text with this menu item as well (e.g. in the text tool text box)
return !!selection;
},
action: ()=> {
edit_copy(true);
},
description: "Copies the selection and puts it on the Clipboard.",
},
{
item: "&Paste",
shortcut: "Ctrl+V",
enabled: ()=> {
// TODO: disable if nothing in clipboard or wrong type (if we can access that)
return true;
},
action: ()=> {
edit_paste(true);
},
description: "Inserts the contents of the Clipboard.",
},
{
item: "C&lear Selection",
shortcut: "Del",
enabled: ()=> { return !!selection; },
action: ()=> { delete_selection(); },
description: "Deletes the selection.",
},
{
item: "Select &All",
shortcut: "Ctrl+A",
action: ()=> { select_all(); },
description: "Selects everything.",
},
$MenuBar.DIVIDER,
{
item: "C&opy To...",
enabled: ()=> { return !!selection; },
action: ()=> { save_selection_to_file(); },
description: "Copies the selection to a file.",
},
{
item: "Paste &From...",
action: ()=> { paste_from_file_select_dialog(); },
description: "Pastes a file into the selection.",
}
],
"&View": [
{
item: "&Tool Box",
shortcut: "Ctrl+T",
checkbox: {
toggle: ()=> {
$toolbox.toggle();
},
check: ()=> {
return $toolbox.is(":visible");
},
},
description: "Shows or hides the tool box.",
},
{
item: "&Color Box",
shortcut: "Ctrl+L",
checkbox: {
toggle: ()=> {
$colorbox.toggle();
},
check: ()=> {
return $colorbox.is(":visible");
},
},
description: "Shows or hides the color box.",
},
{
item: "&Status Bar",
checkbox: {
toggle: ()=> {
$status_area.toggle();
},
check: ()=> {
return $status_area.is(":visible");
},
},
description: "Shows or hides the status bar.",
},
{
item: "T&ext Toolbar",
enabled: false, // @TODO
checkbox: {},
description: "Shows or hides the text toolbar.",
},
$MenuBar.DIVIDER,
{
item: "E&xtras Menu",
checkbox: {
toggle: function() {
$extras_menu_button.toggle();
var checked = this.check();
try{
localStorage["jspaint extras menu visible"] = checked;
// eslint-disable-next-line no-empty
}catch(e){}
},
check: ()=> {
return $extras_menu_button.is(":visible");
}
},
description: "Shows or hides the Extras menu.",
},
$MenuBar.DIVIDER,
{
item: "&Zoom",
submenu: [
{
item: "&Normal Size",
shorcut: "Ctrl+PgUp",
description: "Zooms the picture to 100%.",
enabled: ()=> {
return magnification !== 1;
},
action: ()=> {
set_magnification(1);
},
},
{
item: "&Large Size",
shorcut: "Ctrl+PgDn",
description: "Zooms the picture to 400%.",
enabled: ()=> {
return magnification !== 4;
},
action: ()=> {
set_magnification(4);
},
},
{
item: "C&ustom...",
description: "Zooms the picture.",
action: ()=> { show_custom_zoom_window(); },
},
$MenuBar.DIVIDER,
{
item: "Show &Grid",
shorcut: "Ctrl+G",
enabled: ()=> {
return magnification >= 4;
},
checkbox: {
toggle: toggle_grid,
check: ()=> {
return show_grid;
},
},
description: "Shows or hides the grid.",
},
{
item: "Show T&humbnail",
enabled: false, // @TODO
checkbox: {},
description: "Shows or hides the thumbnail view of the picture.",
}
]
},
{
item: "&View Bitmap",
shortcut: "Ctrl+F",
action: ()=> { view_bitmap(); },
description: "Displays the entire picture.",
}
],
"&Image": [
{
item: "&Flip/Rotate",
shortcut: "Ctrl+R",
action: ()=> { image_flip_and_rotate(); },
description: "Flips or rotates the picture or a selection.",
},
{
item: "&Stretch/Skew",
// shortcut: "Ctrl+W", // closes browser tab
action: ()=> { image_stretch_and_skew(); },
description: "Stretches or skews the picture or a selection.",
},
{
item: "&Invert Colors",
shortcut: "Ctrl+I",
action: ()=> { image_invert(); },
description: "Inverts the colors of the picture or a selection.",
},
{
item: "&Attributes...",
shortcut: "Ctrl+E",
action: ()=> { image_attributes(); },
description: "Changes the attributes of the picture.",
},
{
item: "&Clear Image",
shortcut: "Ctrl+Shift+N",
//shortcut: "Ctrl+Shft+N", [sic]
action: ()=> { clear(); },
description: "Clears the picture or selection.",
},
{
item: "&Draw Opaque",
checkbox: {
toggle: ()=> {
tool_transparent_mode = !tool_transparent_mode;
$G.trigger("option-changed");
},
check: ()=> {
return !tool_transparent_mode;
},
},
description: "Makes the current selection either opaque or transparent.",
}
],
"&Colors": [
{
item: "&Edit Colors...",
action: ()=> {
$colorbox.edit_last_color();
},
description: "Creates a new color.",
},
{
item: "&Get Colors",
action: ()=> {
get_FileList_from_file_select_dialog((files)=> {
var file = files[0];
Palette.load(file, (err, new_palette)=> {
if(err){
show_error_message("This file is not in a format that paint recognizes, or no colors were found.");
}else{
palette = new_palette;
$colorbox.rebuild_palette();
}
});
});
},
description: "Uses a previously saved palette of colors.",
},
{
item: "&Save Colors",
action: ()=> {
var blob = new Blob([JSON.stringify(palette)], {type: "application/json"});
sanity_check_blob(blob, ()=> {
saveAs(blob, "colors.json");
});
},
description: "Saves the current palette of colors to a file.",
}
],
"&Help": [
{
item: "&Help Topics",
action: ()=> { show_help(); },
description: "Displays Help for the current task or command.",
},
$MenuBar.DIVIDER,
{
item: "&About Paint",
action: ()=> { show_about_paint(); },
description: "Displays information about this application.",
//description: "Displays program information, version number, and copyright.",
}
],
"E&xtras": [
{
item: "&Render History As GIF",
// shortcut: "Ctrl+Shift+G",
action: ()=> { render_history_as_gif(); },
description: "Creates an animation from the document history.",
},
// {
// item: "Render History as &APNG",
// // shortcut: "Ctrl+Shift+A",
// action: ()=> { render_history_as_apng(); },
// description: "Creates an animation from the document history.",
// },
// {
// item: "Extra T&ool Box",
// checkbox: {
// toggle: ()=> {
// // this doesn't really work well at all to have two toolboxes
// // (this was not the original plan either)
// $toolbox2.toggle();
// },
// check: ()=> {
// return $toolbox2.is(":visible");
// },
// },
// description: "Shows or hides an extra tool box.",
// },
// {
// item: "&Preferences",
// action: ()=> {
// // :)
// },
// description: "Configures JS Paint.",
// }
/*{
item: "&Draw Randomly",
checkbox: {
toggle: ()=> {
if (window.simulatingGestures) {
stopSimulatingGestures();
} else {
simulateRandomGesturesPeriodically();
}
},
check: ()=> {
return window.simulatingGestures;
},
},
description: "Draws randomly with different tools.",
},*/
{
item: "&Multi-User",
submenu: [
{
item: "&New Session From Document",
action: ()=> {
var name = prompt("Enter the session name that will be used in the URL for sharing.");
if(typeof name == "string"){
name = name.trim();
if(name == ""){
show_error_message("The session name cannot be empty.");
}else if(name.match(/[./[\]#$]/)){
show_error_message("The session name cannot contain any of ./[]#$");
}else{
location.hash = "session:" + name;
}
}
},
description: "Starts a new multi-user session from the current document.",
},
{
item: "New &Blank Session",
action: ()=> {
show_error_message("Not supported yet");
},
enabled: false,
description: "Starts a new multi-user session from an empty document.",
},
]
},
{
item: "&Themes",
submenu: [
{
item: "&Classic",
action: ()=> {
set_theme("classic.css");
},
enabled: ()=> {
return get_theme() != "classic.css"
},
description: "Makes JS Paint look like MS Paint from Windows 98.",
},
{
item: "&Modern",
action: ()=> {
set_theme("modern.css");
},
enabled: ()=> {
return get_theme() != "modern.css"
},
description: "Makes JS Paint look a bit more modern.",
},
]
},
],
};