diff --git a/src/$ColorBox.js b/src/$ColorBox.js index 75d16b4..0607c06 100644 --- a/src/$ColorBox.js +++ b/src/$ColorBox.js @@ -5,7 +5,7 @@ function $Swatch(color){ var swatch_canvas = new Canvas(); $(swatch_canvas).css({pointerEvents: "none"}).appendTo($b); - $b.update = function(_color){ + $b.update = _color => { color = _color; if(color instanceof CanvasPattern){ $b.addClass("pattern"); @@ -13,7 +13,7 @@ function $Swatch(color){ $b.removeClass("pattern"); } - requestAnimationFrame(function(){ + requestAnimationFrame(() => { swatch_canvas.width = $b.innerWidth(); swatch_canvas.height = $b.innerHeight(); // I don't think disable_image_smoothing() is needed here @@ -24,7 +24,7 @@ function $Swatch(color){ } }); }; - $G.on("theme-load", function(){ + $G.on("theme-load", () => { $b.update(color); }); $b.update(color); @@ -58,13 +58,13 @@ function $ColorBox(){ bottom: 3, }); - $G.on("option-changed", function(){ + $G.on("option-changed", () => { $foreground_color.update(colors.foreground); $background_color.update(colors.background); $current_colors.update(colors.ternary); }); - $current_colors.on("pointerdown", function(){ + $current_colors.on("pointerdown", () => { var new_bg = colors.foreground; colors.foreground = colors.background; colors.background = new_bg; @@ -77,9 +77,9 @@ function $ColorBox(){ // TODO: base this on the element sizes var width_per_button = 16; - var build_palette = function(){ + var build_palette = () => { $palette.empty(); - $.each(palette, function(i, color){ + $.each(palette, (i, color) => { var $b = $Swatch(color).addClass("color-button"); $b.appendTo($palette); @@ -90,7 +90,7 @@ function $ColorBox(){ var $i = $(E("input")).attr({type: "color"}); $i.appendTo($b); - $i.on("change", function(){ + $i.on("change", () => { color = $i.val(); $b.update(color); set_color(color); @@ -102,7 +102,7 @@ function $ColorBox(){ $i.val(rgb2hex(color)); var button, ctrl; - $b.on("pointerdown", function(e){ + $b.on("pointerdown", e => { // TODO: how should the ternary color, and selection cropping, work on macOS? ctrl = e.ctrlKey; button = e.button; @@ -119,11 +119,11 @@ function $ColorBox(){ } $i.prop("enabled", true); - setTimeout(function(){ + setTimeout(() => { $i.prop("enabled", false); }, 400); }); - $i.on("click", function(e, synthetic){ + $i.on("click", (e, synthetic) => { if(!synthetic){ e.preventDefault(); } @@ -156,9 +156,9 @@ function $ColorBox(){ var $c = $Component("Colors", "wide", $cb); - $c.edit_last_color = function(){ + $c.edit_last_color = () => { // Edit the last color cell that's been selected as the foreground color. - create_and_trigger_input({type: "color"}, function(input){ + create_and_trigger_input({type: "color"}, input => { // console.log(input, input.value); $last_fg_color_button.trigger({type: "pointerdown", ctrlKey: false, button: 0}); $last_fg_color_button.find("input").val(input.value).triggerHandler("change"); diff --git a/src/$Component.js b/src/$Component.js index fa196bd..042200d 100644 --- a/src/$Component.js +++ b/src/$Component.js @@ -36,7 +36,7 @@ function $Component(name, orientation, $el){ pos_axis = "left"; } - var dock_to = function($dock_to){ + var dock_to = $dock_to => { $w.hide(); $dock_to.append($c); @@ -60,13 +60,13 @@ function $Component(name, orientation, $el){ var $last_docked_to; var $dock_to; var $ghost; - $c.on("pointerdown", function(e){ + $c.on("pointerdown", e => { // Only start a drag via a left click directly on the component element if(e.button !== 0){ return; } if(!$c.is(e.target)){ return; } $G.on("pointermove", drag_onpointermove); - $G.one("pointerup", function(e){ + $G.one("pointerup", e => { $G.off("pointermove", drag_onpointermove); drag_onpointerup(e); }); @@ -94,7 +94,7 @@ function $Component(name, orientation, $el){ // Prevent text selection anywhere within the component e.preventDefault(); }); - var drag_onpointermove = function(e){ + var drag_onpointermove = e => { $ghost.css({ left: e.clientX + ox, @@ -135,7 +135,7 @@ function $Component(name, orientation, $el){ e.preventDefault(); }; - var drag_onpointerup = function(e){ + var drag_onpointerup = e => { $w.hide(); @@ -175,23 +175,23 @@ function $Component(name, orientation, $el){ $G.trigger("resize"); }; - $c.dock = function(){ + $c.dock = () => { pos = last_docked_to_pos; dock_to($last_docked_to); }; - $c.show = function(){ + $c.show = () => { $($c[0]).show(); // avoid recursion if($.contains($w[0], $c[0])){ $w.show(); } return $c; }; - $c.hide = function(){ + $c.hide = () => { $c.add($w).hide(); return $c; }; - $c.toggle = function(){ + $c.toggle = () => { if($c.is(":visible")){ $c.hide(); }else{ @@ -200,7 +200,7 @@ function $Component(name, orientation, $el){ return $c; }; - $w.on("close", function(e){ + $w.on("close", e => { e.preventDefault(); $w.hide(); }); diff --git a/src/$FontBox.js b/src/$FontBox.js index 2703e55..bf7c88d 100644 --- a/src/$FontBox.js +++ b/src/$FontBox.js @@ -22,13 +22,13 @@ function $FontBox(){ $button_group.append($bold, $italic, $underline, $vertical); $fb.append($family, $size, $button_group); - var update_font = function(){ + var update_font = () => { text_tool_font.size = Number($size.val()); text_tool_font.family = $family.val(); $G.trigger("option-changed"); }; - FontDetective.each(function(font){ + FontDetective.each(font => { var $option = $(E("option")); $option.val(font).text(font.name); $family.append($option); @@ -65,7 +65,7 @@ function $FontBox(){ backgroundImage: "url(images/text-tools.png)", backgroundPosition: xi*-16 + "px 0px" }); - $button.on("click", function(){ + $button.on("click", () => { $button.toggleClass("selected"); text_tool_font[thing] = $button.hasClass("selected"); update_font(); diff --git a/src/$Handles.js b/src/$Handles.js index 4f1e5f4..34ff720 100644 --- a/src/$Handles.js +++ b/src/$Handles.js @@ -1,11 +1,11 @@ function $Handles($container, element, options){ var outset = options.outset || 0; - var get_offset_left = options.get_offset_left || function(){ return 0; }; - var get_offset_top = options.get_offset_top || function(){ return 0; }; + var get_offset_left = options.get_offset_left || (() => { return 0; }); + var get_offset_top = options.get_offset_top || (() => { return 0; }); var size_only = options.size_only || false; var el = element; - $container.on("new-element", function(e, element){ + $container.on("new-element", (e, element) => { el = element; }); @@ -19,7 +19,7 @@ function $Handles($container, element, options){ ["bottom", "middle"], // ↓ ["bottom", "right"], // ↘ ["middle", "right"], // → - ], function(pos){ + ], pos => { var y_axis = pos[0]; var x_axis = pos[1]; @@ -57,7 +57,7 @@ function $Handles($container, element, options){ cursor = Cursor([cursor_fname, [16, 16], cursor]); $h.css({cursor: cursor}); - var drag = function(e){ + var drag = e => { $resize_ghost.appendTo($container); dragged = true; @@ -91,13 +91,13 @@ function $Handles($container, element, options){ height: magnification * height, }); }; - $h.on("pointerdown", function(e){ + $h.on("pointerdown", e => { dragged = false; if(e.button === 0){ $G.on("pointermove", drag); $("body").css({cursor: cursor}).addClass("cursor-bully"); } - $G.one("pointerup", function(e){ + $G.one("pointerup", e => { $G.off("pointermove", drag); $("body").css({cursor: ""}).removeClass("cursor-bully"); @@ -108,12 +108,12 @@ function $Handles($container, element, options){ $container.trigger("update"); }); }); - $h.on("mousedown selectstart", function(e){ + $h.on("mousedown selectstart", e => { e.preventDefault(); }); } - var update_handle = function(){ + var update_handle = () => { var rect = el.getBoundingClientRect(); var hs = $h.width(); if(x_axis === "middle"){ diff --git a/src/$MenuBar.js b/src/$MenuBar.js index 6068562..14db6c9 100644 --- a/src/$MenuBar.js +++ b/src/$MenuBar.js @@ -13,22 +13,22 @@ function $MenuBar(menus){ $menus.attr("touch-action", "none"); var selecting_menus = false; - var _html = function(menus_key){ - return menus_key.replace(/&(.)/, function(m){ + var _html = menus_key => { + return menus_key.replace(/&(.)/, m => { return "" + m[1] + ""; }); }; - var _hotkey = function(menus_key){ + var _hotkey = menus_key => { return menus_key[menus_key.indexOf("&")+1].toUpperCase(); }; - var close_menus = function(){ + var close_menus = () => { $menus.find(".menu-button").trigger("release"); // Close any rogue floating submenus $(".menu-popup").hide(); }; - var is_disabled = function(item){ + var is_disabled = item => { if(typeof item.enabled === "function"){ return !item.enabled(); }else if(typeof item.enabled === "boolean"){ @@ -43,7 +43,7 @@ function $MenuBar(menus){ var $menu_popup = $(E("div")).addClass("menu-popup"); var $menu_popup_table = $(E("table")).addClass("menu-popup-table").appendTo($menu_popup); - $.map(menu_items, function(item){ + $.map(menu_items, item => { var $row = $(E("tr")).addClass("menu-row").appendTo($menu_popup_table) if(item === $MenuBar.DIVIDER){ var $td = $(E("td")).attr({colspan: 4}).appendTo($row); @@ -62,13 +62,13 @@ function $MenuBar(menus){ $label.html(_html(item.item)); $shortcut.text(item.shortcut); - $menu_popup.on("update", function(){ + $menu_popup.on("update", () => { $item.attr("disabled", is_disabled(item)); if(item.checkbox && item.checkbox.check){ $checkbox_area.text(item.checkbox.check() ? "✓" : ""); } }); - $item.on("pointerover", function(){ + $item.on("pointerover", () => { $menu_popup.triggerHandler("update"); $item[0].focus(); }); @@ -83,7 +83,7 @@ function $MenuBar(menus){ var $submenu_popup = $MenuPopup(item.submenu).appendTo("body"); $submenu_popup.hide(); - var open_submenu = function(){ + var open_submenu = () => { $submenu_popup.show(); $submenu_popup.triggerHandler("update"); var rect = $submenu_area[0].getBoundingClientRect(); @@ -94,27 +94,27 @@ function $MenuBar(menus){ }); }; var open_tid, close_tid; - $item.add($submenu_popup).on("pointerover", function(e){ + $item.add($submenu_popup).on("pointerover", e => { if(open_tid){clearTimeout(open_tid);} if(close_tid){clearTimeout(close_tid);} }); - $item.on("pointerover", function(e){ + $item.on("pointerover", e => { if(open_tid){clearTimeout(open_tid);} if(close_tid){clearTimeout(close_tid);} open_tid = setTimeout(open_submenu, 200); }); - $item.add($submenu_popup).on("pointerout", function(){ + $item.add($submenu_popup).on("pointerout", () => { $menu_popup.closest(".menu-container").find(".menu-button")[0].focus(); if(open_tid){clearTimeout(open_tid);} if(close_tid){clearTimeout(close_tid);} - close_tid = setTimeout(function(){ + close_tid = setTimeout(() => { $submenu_popup.hide(); }, 200); }); $item.on("click pointerdown", open_submenu); } - var item_action = function(){ + var item_action = () => { if(item.checkbox){ if(item.checkbox.toggle){ item.checkbox.toggle(); @@ -125,20 +125,20 @@ function $MenuBar(menus){ item.action(); } }; - $item.on("pointerup", function(e){ + $item.on("pointerup", e => { if(e.pointerType === "mouse" && e.button !== 0){ return; } item_action(); }); - $item.on("pointerover", function(){ + $item.on("pointerover", () => { if(item.submenu){ $menus.triggerHandler("info", ""); }else{ $menus.triggerHandler("info", item.description || ""); } }); - $item.on("pointerout", function(){ + $item.on("pointerout", () => { if($item.is(":visible")){ $menus.triggerHandler("info", ""); // may not exist for submenu popups @@ -149,7 +149,7 @@ function $MenuBar(menus){ } }); - $item.on("keydown", function(e){ + $item.on("keydown", e => { if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey){ return; } @@ -159,7 +159,7 @@ function $MenuBar(menus){ } }); - $menu_popup.on("keydown", function(e){ + $menu_popup.on("keydown", e => { if(e.ctrlKey || e.shiftKey || e.altKey || e.metaKey){ return; } @@ -175,7 +175,7 @@ function $MenuBar(menus){ } var this_click_opened_the_menu = false; - $.each(menus, function(menus_key, menu_items){ + $.each(menus, (menus_key, menu_items) => { var $menu_container = $(E("div")).addClass("menu-container").appendTo($menus); var $menu_button = $(E("div")).addClass("menu-button").appendTo($menu_container); var $menu_popup = $MenuPopup(menu_items).appendTo($menu_container); @@ -199,7 +199,7 @@ function $MenuBar(menus){ $menu_popup.hide(); $menu_button.html(_html(menus_key)); $menu_button.attr("tabIndex", -1) - $menu_container.on("keydown", function(e){ + $menu_container.on("keydown", e => { var $focused_item = $menu_popup.find(".menu-item:focus"); switch(e.keyCode){ case 37: // Left @@ -240,7 +240,7 @@ function $MenuBar(menus){ break; } }); - $G.on("keydown", function(e){ + $G.on("keydown", e => { if(e.ctrlKey || e.metaKey){ // Ctrl or Command held if(e.keyCode !== 17 && e.keyCode !== 91 && e.keyCode !== 93 && e.keyCode !== 224){ // anything but Ctrl or Command pressed close_menus(); @@ -254,7 +254,7 @@ function $MenuBar(menus){ } } }); - $menu_button.on("pointerdown pointerover", function(e){ + $menu_button.on("pointerdown pointerover", e => { if(e.type === "pointerover" && !selecting_menus){ return; } @@ -275,7 +275,7 @@ function $MenuBar(menus){ $menus.triggerHandler("info", ""); }); - $menu_button.on("pointerup", function(e){ + $menu_button.on("pointerup", e => { if(this_click_opened_the_menu){ this_click_opened_the_menu = false; return; @@ -284,7 +284,7 @@ function $MenuBar(menus){ close_menus(); } }); - $menu_button.on("release", function(e){ + $menu_button.on("release", e => { selecting_menus = false; $menu_button.removeClass("active"); @@ -293,16 +293,16 @@ function $MenuBar(menus){ $menus.triggerHandler("default-info"); }); }); - $G.on("keypress", function(e){ + $G.on("keypress", e => { if(e.keyCode === 27){ // Esc close_menus(); } }); - $G.on("blur", function(e){ + $G.on("blur", e => { // console.log("blur", e.target, document.activeElement); close_menus(); }); - $G.on("pointerdown pointerup", function(e){ + $G.on("pointerdown pointerup", e => { if($(e.target).closest(".menus, .menu-popup").length === 0){ // console.log(e.type, "occurred outside of menus (on ", e.target, ") so..."); close_menus(); diff --git a/src/$ToolBox.js b/src/$ToolBox.js index fcdb2b6..2859cec 100644 --- a/src/$ToolBox.js +++ b/src/$ToolBox.js @@ -5,12 +5,12 @@ function $ToolBox(tools, is_extras){ var $tool_options = $(E("div")).addClass("tool-options"); var showing_tooltips = false; - $tools.on("pointerleave", function(){ + $tools.on("pointerleave", () => { showing_tooltips = false; $status_text.default(); }); - var $buttons = $($.map(tools, function(tool, i){ + var $buttons = $($.map(tools, (tool, i) => { var $b = $(E("div")).addClass("tool"); $b.appendTo($tools); tool.$button = $b; @@ -36,7 +36,7 @@ function $ToolBox(tools, is_extras){ update_css(); $G.on("theme-load", update_css); - $b.on("click", function(e){ + $b.on("click", e => { if (e.shiftKey || e.ctrlKey) { select_tool(tool, true); return; @@ -48,8 +48,8 @@ function $ToolBox(tools, is_extras){ } }); - $b.on("pointerenter", function(){ - var show_tooltip = function(){ + $b.on("pointerenter", () => { + var show_tooltip = () => { showing_tooltips = true; $status_text.text(tool.description); }; @@ -57,7 +57,7 @@ function $ToolBox(tools, is_extras){ show_tooltip(); }else{ var tid = setTimeout(show_tooltip, 300); - $b.on("pointerleave", function(){ + $b.on("pointerleave", () => { clearTimeout(tid); }); } @@ -67,7 +67,7 @@ function $ToolBox(tools, is_extras){ })); var $c = $Component(is_extras ? "Extra Tools" : "Tools", "tall", $tools.add($tool_options)); - $c.update_selected_tool = function(){ + $c.update_selected_tool = () => { $buttons.removeClass("selected"); selected_tools.forEach((selected_tool)=> { selected_tool.$button.addClass("selected"); diff --git a/src/$Window.js b/src/$Window.js index f394e42..a667060 100644 --- a/src/$Window.js +++ b/src/$Window.js @@ -14,10 +14,10 @@ function $Window($component){ $w.attr("touch-action", "none"); - $w.$x.on("click", function(){ + $w.$x.on("click", () => { $w.close(); }); - $w.$x.on("mousedown selectstart", function(e){ + $w.$x.on("mousedown selectstart", e => { e.preventDefault(); }); @@ -29,13 +29,13 @@ function $Window($component){ position: "absolute", zIndex: $Window.Z_INDEX++ }); - $w.on("pointerdown", function(){ + $w.on("pointerdown", () => { $w.css({ zIndex: $Window.Z_INDEX++ }); }); - $w.on("keydown", function(e){ + $w.on("keydown", e => { if(e.ctrlKey || e.altKey || e.shiftKey || e.metaKey){ return; } @@ -66,12 +66,12 @@ function $Window($component){ case 13: // Enter (doesn't actually work in chrome because the button gets clicked immediately) if($focused.is("button")){ $focused.addClass("pressed"); - var release = function(){ + var release = () => { $focused.removeClass("pressed"); $focused.off("focusout", release); $(window).off("keyup", keyup); }; - var keyup = function(e){ + var keyup = e => { if(e.keyCode === 32 || e.keyCode === 13){ release(); } @@ -97,14 +97,14 @@ function $Window($component){ } }); - $w.applyBounds = function(){ + $w.applyBounds = () => { $w.css({ left: Math.max(0, Math.min(innerWidth - $w.width(), $w[0].getBoundingClientRect().left)), top: Math.max(0, Math.min(innerHeight - $w.height(), $w[0].getBoundingClientRect().top)), }); }; - $w.center = function(){ + $w.center = () => { $w.css({ left: (innerWidth - $w.width()) / 2, top: (innerHeight - $w.height()) / 2, @@ -116,17 +116,17 @@ function $Window($component){ $G.on("resize", $w.applyBounds); var drag_offset_x, drag_offset_y; - var drag = function(e){ + var drag = e => { $w.css({ left: e.clientX - drag_offset_x, top: e.clientY - drag_offset_y, }); }; $w.$titlebar.attr("touch-action", "none"); - $w.$titlebar.on("mousedown selectstart", function(e){ + $w.$titlebar.on("mousedown selectstart", e => { e.preventDefault(); }); - $w.$titlebar.on("pointerdown", function(e){ + $w.$titlebar.on("pointerdown", e => { if($(e.target).is("button")){ return; } @@ -135,22 +135,22 @@ function $Window($component){ $G.on("pointermove", drag); $("body").addClass("dragging"); }); - $G.on("pointerup", function(e){ + $G.on("pointerup", e => { $w.applyBounds(); $G.off("pointermove", drag); $("body").removeClass("dragging"); }); - $w.$titlebar.on("dblclick", function(e){ + $w.$titlebar.on("dblclick", e => { if($component){ $component.dock(); } }); - $w.$Button = function(text, handler){ + $w.$Button = (text, handler) => { var $b = $(E("button")) .appendTo($w.$content) .text(text) - .on("click", function(){ + .on("click", () => { if(handler){ handler(); } @@ -158,7 +158,7 @@ function $Window($component){ }); return $b; }; - $w.title = function(title){ + $w.title = title => { if(title){ $w.$title.text(title); return $w; @@ -166,7 +166,7 @@ function $Window($component){ return $w.$title.text(); } }; - $w.close = function(){ + $w.close = () => { var e = $.Event("close"); $w.trigger(e); if(e.isDefaultPrevented()){ @@ -195,9 +195,9 @@ function $FormWindow(title){ $w.$main = $(E("div")).appendTo($w.$form); $w.$buttons = $(E("div")).appendTo($w.$form).addClass("button-group"); - $w.$Button = function(label, action){ + $w.$Button = (label, action) => { var $b = $(E("button")).appendTo($w.$buttons).text(label); - $b.on("click", function(e){ + $b.on("click", e => { // prevent the form from submitting // @TODO: instead, prevent the form's submit event e.preventDefault(); @@ -205,7 +205,7 @@ function $FormWindow(title){ action(); }); - $b.on("pointerdown", function(){ + $b.on("pointerdown", () => { $b[0].focus(); }); diff --git a/src/OnCanvasSelection.js b/src/OnCanvasSelection.js index bcc32c5..2b4ff21 100644 --- a/src/OnCanvasSelection.js +++ b/src/OnCanvasSelection.js @@ -7,7 +7,7 @@ class OnCanvasSelection extends OnCanvasObject { sel.$el.addClass("selection"); var last_tool_transparent_mode = tool_transparent_mode; var last_background_color = colors.background; - this._on_option_changed = function () { + this._on_option_changed = () => { if (!sel.source_canvas) { return; } @@ -68,7 +68,7 @@ class OnCanvasSelection extends OnCanvasObject { } sel.$el.append(sel.canvas); sel.$handles = $Handles(sel.$el, sel.canvas, { outset: 2 }); - sel.$el.on("user-resized", function (e, delta_x, delta_y, width, height) { + sel.$el.on("user-resized", (e, delta_x, delta_y, width, height) => { sel.x += delta_x; sel.y += delta_y; sel.width = width; @@ -77,7 +77,7 @@ class OnCanvasSelection extends OnCanvasObject { sel.resize(); }); var mox, moy; - var pointermove = function (e) { + var pointermove = e => { var m = e2c(e); sel.x = Math.max(Math.min(m.x - mox, canvas.width), -sel.width); sel.y = Math.max(Math.min(m.y - moy, canvas.height), -sel.height); @@ -86,7 +86,7 @@ class OnCanvasSelection extends OnCanvasObject { sel.draw(); } }; - sel.canvas_pointerdown = function (e) { + sel.canvas_pointerdown = e => { e.preventDefault(); var rect = sel.canvas.getBoundingClientRect(); var cx = e.clientX - rect.left; @@ -94,7 +94,7 @@ class OnCanvasSelection extends OnCanvasObject { mox = ~~(cx / rect.width * sel.canvas.width); moy = ~~(cy / rect.height * sel.canvas.height); $G.on("pointermove", pointermove); - $G.one("pointerup", function () { + $G.one("pointerup", () => { $G.off("pointermove", pointermove); }); if (e.shiftKey) { @@ -258,7 +258,7 @@ class OnCanvasSelection extends OnCanvasObject { var sel = this; sel.instantiate(null, "passive"); if (sel.canvas) { - undoable(0, function () { + undoable(0, () => { ctx.copy(sel.canvas); $canvas_area.trigger("resize"); }); diff --git a/src/OnCanvasTextBox.js b/src/OnCanvasTextBox.js index 06a0507..1e29049 100644 --- a/src/OnCanvasTextBox.js +++ b/src/OnCanvasTextBox.js @@ -6,7 +6,7 @@ class OnCanvasTextBox extends OnCanvasObject { var tb = this; tb.$el.addClass("textbox"); tb.$editor = $(E("textarea")).addClass("textbox-editor"); - var update = function () { + var update = () => { var font = text_tool_font; font.color = colors.foreground; font.background = tool_transparent_mode ? "transparent" : colors.background; @@ -63,7 +63,7 @@ class OnCanvasTextBox extends OnCanvasObject { tb.$el.append(tb.$editor); tb.$editor[0].focus(); tb.$handles = $Handles(tb.$el, tb.$editor[0], { outset: 2 }); - tb.$el.on("user-resized", function (e, delta_x, delta_y, width, height) { + tb.$el.on("user-resized", (e, delta_x, delta_y, width, height) => { tb.x += delta_x; tb.y += delta_y; tb.width = width; @@ -71,7 +71,7 @@ class OnCanvasTextBox extends OnCanvasObject { tb.position(); }); var mox, moy; - var pointermove = function (e) { + var pointermove = e => { var m = e2c(e); tb.x = Math.max(Math.min(m.x - mox, canvas.width), -tb.width); tb.y = Math.max(Math.min(m.y - moy, canvas.height), -tb.height); @@ -80,7 +80,7 @@ class OnCanvasTextBox extends OnCanvasObject { tb.draw(); } }; - tb.$el.on("pointerdown", function (e) { + tb.$el.on("pointerdown", e => { if (e.target instanceof HTMLInputElement || e.target instanceof HTMLTextAreaElement || e.target.classList.contains("handle")) { @@ -93,7 +93,7 @@ class OnCanvasTextBox extends OnCanvasObject { mox = ~~(cx); moy = ~~(cy); $G.on("pointermove", pointermove); - $G.one("pointerup", function () { + $G.one("pointerup", () => { $G.off("pointermove", pointermove); }); }); @@ -106,7 +106,7 @@ class OnCanvasTextBox extends OnCanvasObject { var tb = this; var text = tb.$editor.val(); if (text) { - undoable(0, function () { + undoable(0, () => { var font = text_tool_font; ctx.fillStyle = font.background; ctx.fillRect(tb.x, tb.y, tb.width, tb.height); diff --git a/src/app.js b/src/app.js index ba37147..ef61d21 100644 --- a/src/app.js +++ b/src/app.js @@ -92,7 +92,7 @@ var $status_text = $(E("div")).addClass("status-text").appendTo($status_area); var $status_position = $(E("div")).addClass("status-coordinates").appendTo($status_area); var $status_size = $(E("div")).addClass("status-coordinates").appendTo($status_area); -$status_text.default = function(){ +$status_text.default = () => { $status_text.text("For Help, click Help Topics on the Help Menu."); }; $status_text.default(); @@ -115,10 +115,10 @@ if(menu_bar_outside_frame){ $menu_bar.prependTo($V); } -$menu_bar.on("info", function(e, info){ +$menu_bar.on("info", (e, info) => { $status_text.text(info); }); -$menu_bar.on("default-info", function(e){ +$menu_bar.on("default-info", e => { $status_text.default(); }); @@ -145,8 +145,8 @@ var $toolbox = $ToolBox(tools); // so it can display names of the tools, and maybe authors and previews (and not necessarily icons) var $colorbox = $ColorBox(); -$canvas.on("user-resized", function(e, _x, _y, width, height){ - undoable(0, function(){ +$canvas.on("user-resized", (e, _x, _y, width, height) => { + undoable(0, () => { canvas.width = Math.max(1, width); canvas.height = Math.max(1, height); ctx.disable_image_smoothing(); @@ -167,30 +167,30 @@ $canvas.on("user-resized", function(e, _x, _y, width, height){ storage.set({ width: canvas.width, height: canvas.height, - }, function(err){ + }, err => { // oh well }) }); }); -$G.on("resize", function(){ // for browser zoom, and in-app zoom of the canvas +$G.on("resize", () => { // for browser zoom, and in-app zoom of the canvas update_canvas_rect(); update_disable_aa(); }); -$canvas_area.on("scroll", function() { +$canvas_area.on("scroll", () => { update_canvas_rect(); }); -$canvas_area.on("resize", function() { +$canvas_area.on("resize", () => { update_magnified_canvas_size(); }); -$("body").on("dragover dragenter", function(e){ +$("body").on("dragover dragenter", e => { var dt = e.originalEvent.dataTransfer; var has_files = Array.from(dt.types).indexOf("Files") !== -1; if(has_files){ e.preventDefault(); } -}).on("drop", function(e){ +}).on("drop", e => { if(e.isDefaultPrevented()){ return; } @@ -205,10 +205,10 @@ $("body").on("dragover dragenter", function(e){ }); var keys = {}; -$G.on("keyup", function(e){ +$G.on("keyup", e => { delete keys[e.keyCode]; }); -$G.on("keydown", function(e){ +$G.on("keydown", e => { if(e.isDefaultPrevented()){ return; } @@ -229,7 +229,7 @@ $G.on("keydown", function(e){ // probably best to use a library at this point! if(selection){ - var nudge_selection = function(delta_x, delta_y){ + var nudge_selection = (delta_x, delta_y) => { selection.x += delta_x; selection.y += delta_y; selection.position(); @@ -361,7 +361,7 @@ $G.on("keydown", function(e){ e.preventDefault(); } }); -$G.on("cut copy paste", function(e){ +$G.on("cut copy paste", e => { if(e.isDefaultPrevented()){ return; } @@ -380,7 +380,7 @@ $G.on("cut copy paste", function(e){ if(e.type === "copy" || e.type === "cut"){ if(selection && selection.canvas){ - var do_sync_clipboard_copy_or_cut = function() { + var do_sync_clipboard_copy_or_cut = () => { // works only for pasting within a jspaint instance var data_url = selection.canvas.toDataURL(); cd.setData("text/x-data-uri; type=image/png", data_url); @@ -404,12 +404,12 @@ $G.on("cut copy paste", function(e){ } } }else if(e.type === "paste"){ - $.each(cd.items, function(i, item){ + $.each(cd.items, (i, item) => { if(item.type.match(/^text\/(?:x-data-uri|uri-list|plain)|URL$/)){ - item.getAsString(function(text){ + item.getAsString(text => { var uris = get_URIs(text); if (uris.length > 0) { - load_image_from_URI(uris[0], function(err, img){ + load_image_from_URI(uris[0], (err, img) => { if(err){ return show_resource_load_error_message(); } paste(img); }); @@ -434,7 +434,7 @@ set_magnification(1); storage.get({ width: default_canvas_width, height: default_canvas_height, -}, function(err, values){ +}, (err, values) => { if(err){return;} my_canvas_width = values.width; my_canvas_height = values.height; @@ -449,7 +449,7 @@ storage.get({ }); if(window.document_file_path_to_open){ - open_from_file_path(document_file_path_to_open, function(err){ + open_from_file_path(document_file_path_to_open, err => { if(err){ return show_error_message("Failed to open file " + document_file_path_to_open, err); } @@ -520,7 +520,7 @@ function tool_go(selected_tool, event_name){ if(selected_tool.paint){ if(selected_tool.continuous === "space"){ var ham = brush_shape.match(/diagonal/) ? brosandham_line : bresenham_line; - ham(pointer_previous.x, pointer_previous.y, pointer.x, pointer.y, function(x, y){ + ham(pointer_previous.x, pointer_previous.y, pointer.x, pointer.y, (x, y) => { selected_tool.paint(ctx, x, y); }); }else{ @@ -582,11 +582,11 @@ function canvas_pointer_move(e){ }); pointer_previous = pointer; } -$canvas.on("pointermove", function(e){ +$canvas.on("pointermove", e => { pointer = e2c(e); $status_position.text(pointer.x + "," + pointer.y); }); -$canvas.on("pointerenter", function(e){ +$canvas.on("pointerenter", e => { pointer_over_canvas = true; update_helper_layer(); @@ -596,7 +596,7 @@ $canvas.on("pointerenter", function(e){ update_helper_layer_on_pointermove_active = true; } }); -$canvas.on("pointerleave", function(e){ +$canvas.on("pointerleave", e => { pointer_over_canvas = false; $status_position.text(""); @@ -612,7 +612,7 @@ $canvas.on("pointerleave", function(e){ var pointer_active = false; var pointer_over_canvas = false; var update_helper_layer_on_pointermove_active = false; -$canvas.on("pointerdown", function(e){ +$canvas.on("pointerdown", e => { update_canvas_rect(); // Quick Undo when there are multiple pointers (i.e. for touch) @@ -626,7 +626,7 @@ $canvas.on("pointerdown", function(e){ pointer_active = true; pointer_type = e.pointerType; pointer_buttons = e.buttons; - $G.one("pointerup", function(e){ + $G.one("pointerup", e => { pointer_active = false; update_helper_layer(); @@ -649,7 +649,7 @@ $canvas.on("pointerdown", function(e){ shift = e.shiftKey; pointer_start = pointer_previous = pointer = e2c(e); - var pointerdown_action = function(){ + var pointerdown_action = () => { // TODO for multitools: don't register event listeners for each tool selected_tools.forEach((selected_tool)=> { @@ -661,7 +661,7 @@ $canvas.on("pointerdown", function(e){ if(selected_tool.continuous === "time"){ var iid = setInterval(()=> { tool_go(selected_tool); }, 5); } - $G.one("pointerup", function(e, canceling){ + $G.one("pointerup", (e, canceling) => { button = undefined; reverse = false; if(canceling){ @@ -692,7 +692,7 @@ $canvas.on("pointerdown", function(e){ update_helper_layer(); }); -$canvas_area.on("pointerdown", function(e){ +$canvas_area.on("pointerdown", e => { if(e.button === 0){ if($canvas_area.is(e.target)){ if(selection){ @@ -706,7 +706,7 @@ $app .add($toolbox) // .add($toolbox2) .add($colorbox) -.on("mousedown selectstart contextmenu", function(e){ +.on("mousedown selectstart contextmenu", e => { if(e.isDefaultPrevented()){ return; } @@ -729,6 +729,6 @@ $app }); // Stop drawing (or dragging or whatver) if you Alt+Tab or whatever -$G.on("blur", function(e){ +$G.on("blur", e => { $G.triggerHandler("pointerup"); }); diff --git a/src/canvas-change.js b/src/canvas-change.js index 8ef0292..5bd0f24 100644 --- a/src/canvas-change.js +++ b/src/canvas-change.js @@ -1,12 +1,12 @@ -(function(){ +(() => { - var may_be_changed = function(){ + var may_be_changed = () => { window.console && console.log("change may have occured"); $canvas.triggerHandler("change"); }; - var debug_event = function(e, synthetic){ + var debug_event = (e, synthetic) => { // var label = synthetic ? "(synthetic)" : "(normal)"; // window.console && console.debug && console.debug(e.type, label); }; @@ -15,7 +15,7 @@ $canvas.on("user-resized.ugly-hook", may_be_changed); - $canvas_area.on("pointerdown.ugly-hook", "*", function(e, synthetic){ + $canvas_area.on("pointerdown.ugly-hook", "*", (e, synthetic) => { debug_event(e, synthetic); if(synthetic){ return; } @@ -29,14 +29,14 @@ }else{ // Changes may occur when you release pointer_operations = [e]; - var pointermove = function(e, synthetic){ + var pointermove = (e, synthetic) => { debug_event(e, synthetic); if(synthetic){ return; } pointer_operations.push(e); }; $G.on("pointermove.ugly-hook", pointermove); - $G.one("pointerup.ugly-hook", function(e, synthetic){ + $G.one("pointerup.ugly-hook", (e, synthetic) => { debug_event(e, synthetic); if(synthetic){ return; } @@ -47,8 +47,8 @@ } }); - $G.on("session-update.ugly-hook", function(){ + $G.on("session-update.ugly-hook", () => { setTimeout(may_be_changed); }); -}()); +})(); diff --git a/src/electron-injected.js b/src/electron-injected.js index 514759b..949d0eb 100644 --- a/src/electron-injected.js +++ b/src/electron-injected.js @@ -21,7 +21,7 @@ var reg_contents = `Windows Registry Editor Version 5.00 `; // oof \\\\ var reg_file_path = path.join(is_dev ? "." : path.dirname(argv[0]), `set-jspaint${is_dev ? "-DEV-MODE" : ""}-as-default-image-editor.reg`); if(process.platform == "win32" && !is_dev){ - fs.writeFile(reg_file_path, reg_contents, function(err){ + fs.writeFile(reg_file_path, reg_contents, err => { if(err){ return console.error(err); } @@ -36,8 +36,8 @@ if (process.platform == "win32" && argv.length >= 2) { } } -window.open_from_file_path = function(file_path, callback, canceled){ - fs.readFile(file_path, function(err, buffer) { +window.open_from_file_path = (file_path, callback, canceled) => { + fs.readFile(file_path, (err, buffer) => { if(err){ return callback(err); } @@ -51,7 +51,7 @@ window.open_from_file_path = function(file_path, callback, canceled){ }); }; -window.save_to_file_path = function(filePath, formatName, savedCallback){ +window.save_to_file_path = (filePath, formatName, savedCallback) => { var mimeType = { "JPEG": "image/jpeg", "PNG": "image/png", @@ -68,16 +68,16 @@ window.save_to_file_path = function(filePath, formatName, savedCallback){ // if(mimeType === "image/gif"){ // new GIF(); // } - canvas.toBlob(function(blob){ + canvas.toBlob(blob => { if(blob.type !== mimeType){ return show_error_message("Failed to save as " + formatName + " (your browser doesn't support exporting a canvas as \"" + mimeType + "\")"); } - sanity_check_blob(blob, function(){ - blob_to_buffer(blob, function(err, buffer){ + sanity_check_blob(blob, () => { + blob_to_buffer(blob, (err, buffer) => { if(err){ return show_error_message("Failed to save! (Technically, failed to convert a Blob to a Buffer.)", err); } - fs.writeFile(filePath, buffer, function(err){ + fs.writeFile(filePath, buffer, err => { if(err){ return show_error_message("Failed to save file!", err); } @@ -90,8 +90,8 @@ window.save_to_file_path = function(filePath, formatName, savedCallback){ }; // TODO: window.platform.saveCanvasAs etc. or platformIntegration or system or something -window.systemSaveCanvasAs = function(canvas, suggestedFileName, savedCallback){ - var getExtension = function(filePathOrName){ +window.systemSaveCanvasAs = (canvas, suggestedFileName, savedCallback) => { + var getExtension = filePathOrName => { var splitByDots = filePathOrName.split(/\./g); return splitByDots[splitByDots.length - 1].toLowerCase(); }; @@ -116,7 +116,7 @@ window.systemSaveCanvasAs = function(canvas, suggestedFileName, savedCallback){ dialog.showSaveDialog({ defaultPath: suggestedFileName, filters: filters, - }, function(filePath) { + }, filePath => { if(!filePath){ return; // user canceled } @@ -125,7 +125,7 @@ window.systemSaveCanvasAs = function(canvas, suggestedFileName, savedCallback){ // TODO: Linux/Unix?? you're not supposed to need file extensions return show_error_message("Missing file extension - try adding .png to the file name"); } - var formatNameMatched = ((filters.find(function(filter){return filter.extensions.indexOf(extension) > -1})) || {}).name; + var formatNameMatched = ((filters.find(filter => {return filter.extensions.indexOf(extension) > -1})) || {}).name; if(!formatNameMatched){ return show_error_message("Can't save as *." +extension + " - try adding .png to the file name"); } @@ -134,7 +134,7 @@ window.systemSaveCanvasAs = function(canvas, suggestedFileName, savedCallback){ }); }; -window.systemSetAsWallpaperCentered = function(c){ +window.systemSetAsWallpaperCentered = c => { var dataPath = require('electron').remote.app.getPath("userData"); var imgPath = require("path").join(dataPath, "bg.png"); @@ -153,14 +153,14 @@ window.systemSetAsWallpaperCentered = function(c){ wallpaperCanvas.ctx.drawImage(c, ~~x, ~~y); } - get_array_buffer_from_canvas(wallpaperCanvas).then(function(array_buffer){ + get_array_buffer_from_canvas(wallpaperCanvas).then(array_buffer => { var buffer = new Buffer(array_buffer); - fs.writeFile(imgPath, buffer, function(err){ + fs.writeFile(imgPath, buffer, err => { if(err){ return show_error_message("Failed to set as desktop background: couldn't write temporary image file.", err); } // {scale: "center"} only supported on macOS; see above workaround - wallpaper.set(imgPath, {scale: "center"}, function(err){ + wallpaper.set(imgPath, {scale: "center"}, err => { if(err){ show_error_message("Failed to set as desktop background!", err); } diff --git a/src/electron-main.js b/src/electron-main.js index 2e95f17..8bbd437 100644 --- a/src/electron-main.js +++ b/src/electron-main.js @@ -50,7 +50,7 @@ const createWindow = () => { mainWindow = null; }); - const handleRedirect = function(e, url) { + const handleRedirect = (e, url) => { // check that the URL is not part of the app if(url.indexOf("file://") === -1){ e.preventDefault(); diff --git a/src/extra-tools.js b/src/extra-tools.js index db1844d..41ee84c 100644 --- a/src/extra-tools.js +++ b/src/extra-tools.js @@ -27,7 +27,7 @@ extra_tools = [{ this.rendered_size = brush_size; this.rendered_shape = brush_shape; } - var draw_brush = function(x, y){ + var draw_brush = (x, y) => { ctx.drawImage(brush_canvas, Math.ceil(x-csz/2), Math.ceil(y-csz/2)); }; var r = airbrush_size * 2; @@ -83,7 +83,7 @@ extra_tools = [{ this.rendered_size = brush_size; this.rendered_shape = brush_shape; } - var draw_brush = function(x, y){ + var draw_brush = (x, y) => { ctx.drawImage(brush_canvas, Math.ceil(x-csz/2), Math.ceil(y-csz/2)); }; for(var i = 0; i < 60; i++){ diff --git a/src/functions.js b/src/functions.js index dd12281..6f1fabb 100644 --- a/src/functions.js +++ b/src/functions.js @@ -156,7 +156,7 @@ function show_custom_zoom_window() { var $really_custom_radio_option = $fieldset.find("input[value='really-custom']"); var $really_custom_input = $fieldset.find("input[name='really-custom-zoom-input']"); - $really_custom_input.closest("label").on("click", function(e){ + $really_custom_input.closest("label").on("click", e => { $really_custom_radio_option.prop("checked", true); $really_custom_input[0].focus(); }); @@ -168,7 +168,7 @@ function show_custom_zoom_window() { $fieldset.find("label").css({display: "block"}); - $w.$Button("Okay", function(){ + $w.$Button("Okay", () => { var option_val = $fieldset.find("input[name='custom-zoom-radio']:checked").val(); var mag; if(option_val === "really-custom"){ @@ -181,7 +181,7 @@ function show_custom_zoom_window() { if(isNaN(mag)){ var $msgw = new $FormWindow("Invalid Value").addClass("dialogue-window"); $msgw.$main.text("The value specified for custom zoom was invalid."); - $msgw.$Button("Okay", function(){ + $msgw.$Button("Okay", () => { $msgw.close(); }); return; @@ -194,7 +194,7 @@ function show_custom_zoom_window() { $w.close(); })[0].focus(); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); }); @@ -255,13 +255,13 @@ function create_and_trigger_input(attrs, callback){ // TODO: rename these functions to lowercase (and maybe say "files" in this case) function get_FileList_from_file_select_dialog(callback){ // TODO: specify mime types? - create_and_trigger_input({type: "file"}, function(input){ + create_and_trigger_input({type: "file"}, input => { callback(input.files); }); } function open_from_Image(img, callback, canceled){ - are_you_sure(function(){ + are_you_sure(() => { // TODO: shouldn't open_from_* start a new session? this_ones_a_frame_changer(); @@ -281,7 +281,7 @@ function open_from_Image(img, callback, canceled){ function get_URIs(text) { // parse text/uri-list // get lines, discarding comments - var lines = text.split(/[\n\r]+/).filter(function(line){return line[0] !== "#" && line}); + var lines = text.split(/[\n\r]+/).filter(line => {return line[0] !== "#" && line}); // discard text with too many lines (likely pasted HTML or something) - may want to revisit this if (lines.length > 15) { return []; @@ -300,9 +300,9 @@ function get_URIs(text) { function load_image_from_URI(uri, callback){ // TODO: if URI is not blob: or data:, show dialog with progress bar and this string from mspaint.exe: "Downloading picture" fetch(uri) - .then(function(response) { + .then(response => { return response.blob(); - }).then(function(blob) { + }).then(blob => { var img = new Image(); img.crossOrigin = "Anonymous"; img.onload = function(){ @@ -311,28 +311,28 @@ function load_image_from_URI(uri, callback){ } callback(null, img); }; - img.onerror = function(e) { + img.onerror = e => { callback && callback(new Error("Image failed to load")); }; img.src = window.URL.createObjectURL(blob); - }).catch(function(exception) { + }).catch(exception => { callback && callback(new Error("Image failed to load")); }); } function open_from_URI(uri, callback, canceled){ - load_image_from_URI(uri, function(err, img){ + load_image_from_URI(uri, (err, img) => { if(err){ return callback(err); } open_from_Image(img, callback, canceled); }); } function open_from_File(file, callback, canceled){ var blob_url = URL.createObjectURL(file); - load_image_from_URI(blob_url, function(err, img){ + load_image_from_URI(blob_url, (err, img) => { // revoke object URL regardless of error URL.revokeObjectURL(file); if(err){ return callback(err); } - open_from_Image(img, function(){ + open_from_Image(img, () => { file_name = file.name; document_file_path = file.path; // available in Electron update_title(); @@ -357,14 +357,14 @@ function get_image_file_from_FileList_or_show_error(files, user_input_method_ver function open_from_FileList(files, user_input_method_verb_past_tense){ var file = get_image_file_from_FileList_or_show_error(files, user_input_method_verb_past_tense); if(file){ - open_from_File(file, function(err){ + open_from_File(file, err => { if(err){ return show_error_message("Failed to open file:", err); } }); } } function file_new(){ - are_you_sure(function(){ + are_you_sure(() => { this_ones_a_frame_changer(); reset_file(); @@ -379,7 +379,7 @@ function file_new(){ // there's this little thing called Inversion of Control... // also paste_from_file_select_dialog function file_open(){ - get_FileList_from_file_select_dialog(function(files){ + get_FileList_from_file_select_dialog(files => { open_from_FileList(files, "selected"); }); } @@ -395,7 +395,7 @@ function file_load_from_url(){ // TODO: URL validation (input has to be in a form (and we don't want the form to submit)) $w.$main.html(""); var $input = $w.$main.find(".url-input"); - $w.$Button("Load", function(){ + $w.$Button("Load", () => { var uris = get_URIs($input.val()); if (uris.length > 0) { // TODO: retry loading if same URL entered @@ -408,7 +408,7 @@ function file_load_from_url(){ show_error_message("Invalid URL. It must include a protocol (https:// or http://)"); } }); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); }); $w.center(); @@ -424,7 +424,7 @@ function file_save(){ } if(document_file_path){ // TODO: save as JPEG by default if the previously opened/saved file was a JPEG? - return save_to_file_path(document_file_path, "PNG", function(saved_file_path, saved_file_name){ + return save_to_file_path(document_file_path, "PNG", (saved_file_path, saved_file_name) => { saved = true; document_file_path = saved_file_path; file_name = saved_file_name; @@ -436,7 +436,7 @@ function file_save(){ function file_save_as(){ deselect(); - save_canvas_as(canvas, file_name.replace(/\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/, "") + ".png", function(saved_file_path, saved_file_name){ + save_canvas_as(canvas, file_name.replace(/\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/, "") + ".png", (saved_file_path, saved_file_name) => { saved = true; document_file_path = saved_file_path; file_name = saved_file_name; @@ -452,20 +452,20 @@ function are_you_sure(action, canceled){ var $w = new $FormWindow().addClass("dialogue-window"); $w.title("Paint"); $w.$main.text("Save changes to "+file_name+"?"); - $w.$Button("Save", function(){ + $w.$Button("Save", () => { $w.close(); file_save(); action(); })[0].focus(); - $w.$Button("Discard", function(){ + $w.$Button("Discard", () => { $w.close(); action(); }); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); canceled && canceled(); }); - $w.$x.on("click", function(){ + $w.$x.on("click", () => { canceled && canceled(); }); $w.center(); @@ -490,7 +490,7 @@ function show_error_message(message, error){ overflow: "auto", }); } - $w.$Button("OK", function(){ + $w.$Button("OK", () => { $w.close(); }); $w.center(); @@ -510,7 +510,7 @@ function show_resource_load_error_message(){ ", such as Imgur." ); $w.$main.css({maxWidth: "500px"}); - $w.$Button("OK", function(){ + $w.$Button("OK", () => { $w.close(); }); $w.center(); @@ -664,7 +664,7 @@ function paste_image_from_file(file){ // TODO: revoke object URL var blob_url = URL.createObjectURL(file); // paste_image_from_URI(blob_url); - load_image_from_URI(blob_url, function(err, img){ + load_image_from_URI(blob_url, (err, img) => { // TODO: this shouldn't really have the CORS error message, if it's from a blob URI if(err){ return show_resource_load_error_message(); } paste(img); @@ -674,7 +674,7 @@ function paste_image_from_file(file){ } function paste_from_file_select_dialog(){ - get_FileList_from_file_select_dialog(function(files){ + get_FileList_from_file_select_dialog(files => { var file = get_image_file_from_FileList_or_show_error(files, "selected"); if(file){ paste_image_from_file(file); @@ -691,10 +691,10 @@ function paste(img){ "The image is bigger than the canvas.
" + "Would you like the canvas to be enlarged?
" ); - $w.$Button("Enlarge", function(){ + $w.$Button("Enlarge", () => { $w.close(); // Additional undoable - undoable(function(){ + undoable(() => { var original = undos[undos.length-1]; canvas.width = Math.max(original.width, img.width); canvas.height = Math.max(original.height, img.height); @@ -708,11 +708,11 @@ function paste(img){ $canvas_area.trigger("resize"); }); })[0].focus(); - $w.$Button("Crop", function(){ + $w.$Button("Crop", () => { $w.close(); do_the_paste(); }); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); }); $w.center(); @@ -744,11 +744,11 @@ function render_history_as_gif(){ }); $win.$main.css({padding: 5}); - var $cancel = $win.$Button('Cancel', function(){ + var $cancel = $win.$Button('Cancel', () => { $win.close(); }); - $win.on('close', function(){ + $win.on('close', () => { gif.abort(); }); @@ -762,12 +762,12 @@ function render_history_as_gif(){ height: height, }); - gif.on("progress", function(p){ + gif.on("progress", p => { $progress.val(p); $progress_percent.text(~~(p*100)+"%"); }); - gif.on("finished", function(blob){ + gif.on("finished", blob => { $win.title("Rendered GIF"); var url = URL.createObjectURL(blob); $output.empty().append( @@ -777,15 +777,15 @@ function render_history_as_gif(){ height: height, }) ); - $win.$Button("Upload to Imgur", function(){ + $win.$Button("Upload to Imgur", () => { $win.close(); - sanity_check_blob(blob, function(){ + sanity_check_blob(blob, () => { show_imgur_uploader(blob); }); }); - $win.$Button("Save", function(){ + $win.$Button("Save", () => { $win.close(); - sanity_check_blob(blob, function(){ + sanity_check_blob(blob, () => { saveAs(blob, file_name.replace(/\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/, "") + " history.gif"); }); }); @@ -872,12 +872,12 @@ function undoable(callback, action){ var $w = new $FormWindow().addClass("dialogue-window"); $w.title("Paint"); $w.$main.html("Discard "+redos.length+" possible redo-able actions?
(Ctrl+Y or Ctrl+Shift+Z to redo)
"); - $w.$Button(action ? "Discard and Apply" : "Discard", function(){ + $w.$Button(action ? "Discard and Apply" : "Discard", () => { $w.close(); redos = []; action && action(); })[0].focus(); - $w.$Button("Keep", function(){ + $w.$Button("Keep", () => { $w.close(); }); $w.center(); @@ -1009,16 +1009,16 @@ async function edit_copy(execCommandFallback){ throw new Error("The Async Clipboard API is not supported by this browser. " + browserRecommendationForClipboardAccess); } } - selection.canvas.toBlob(function(blob) { - sanity_check_blob(blob, function(){ + selection.canvas.toBlob(blob => { + sanity_check_blob(blob, () => { navigator.clipboard.write([ new ClipboardItem(Object.defineProperty({}, blob.type, { value: blob, enumerable: true, })) - ]).then(function(){ + ]).then(() => { console.log("Copied image to the clipboard"); - }, function(error){ + }, error => { show_error_message("Failed to copy to the Clipboard.", error); }); }); @@ -1072,7 +1072,7 @@ async function edit_paste(execCommandFallback){ if(clipboardText) { var uris = get_URIs(clipboardText); if (uris.length > 0) { - load_image_from_URI(uris[0], function(err, img){ + load_image_from_URI(uris[0], (err, img) => { if(err){ return show_resource_load_error_message(); } paste(img); }); @@ -1092,7 +1092,7 @@ async function edit_paste(execCommandFallback){ } function image_invert(){ - apply_image_transformation(function(original_canvas, original_ctx, new_canvas, new_ctx){ + apply_image_transformation((original_canvas, original_ctx, new_canvas, new_ctx) => { var id = original_ctx.getImageData(0, 0, original_canvas.width, original_canvas.height); for(var i=0; i { this_ones_a_frame_changer(); if(transparency){ @@ -1203,7 +1203,7 @@ function detect_transparency(){ function make_monochrome_pattern(lightness){ - var dither_threshold_table = Array.from({length: 64}, function(undef, p){ + var dither_threshold_table = Array.from({length: 64}, (undef, p) => { var q = p ^ (p >> 3); return ( ((p & 4) >> 2) | ((q & 4) >> 1) | @@ -1313,7 +1313,7 @@ function image_attributes(){ $units.append(''); $units.append(''); $units.find("[value=" + current_unit + "]").attr({checked: true}); - $units.on("change", function(){ + $units.on("change", () => { var new_unit = $units.find(":checked").val(); $width.val(width_in_px / unit_sizes_in_px[new_unit]); $height.val(height_in_px / unit_sizes_in_px[new_unit]); @@ -1332,7 +1332,7 @@ function image_attributes(){ // Buttons on the right - $w.$Button("Okay", function(){ + $w.$Button("Okay", () => { var transparency_option = $transparency.find(":checked").val(); var colors_option = $colors.find(":checked").val(); var unit = $units.find(":checked").val(); @@ -1363,11 +1363,11 @@ function image_attributes(){ image_attributes.$window.close(); })[0].focus(); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { image_attributes.$window.close(); }); - $w.$Button("Default", function(){ + $w.$Button("Default", () => { width_in_px = default_canvas_width; height_in_px = default_canvas_height; $width.val(width_in_px / unit_sizes_in_px[current_unit]); @@ -1396,7 +1396,7 @@ function image_flip_and_rotate(){ $rotate_by_angle.append(""); $rotate_by_angle.find("input").attr({disabled: true}); - $fieldset.find("input").on("change", function(){ + $fieldset.find("input").on("change", () => { var action = $fieldset.find("input[name='flip-or-rotate']:checked").val(); $rotate_by_angle.find("input").attr({ disabled: action !== "rotate-by-angle" @@ -1420,7 +1420,7 @@ function image_flip_and_rotate(){ $fieldset.find("label").css({display: "block"}); - $w.$Button("Okay", function(){ + $w.$Button("Okay", () => { var action = $fieldset.find("input[name='flip-or-rotate']:checked").val(); var angle_val = $fieldset.find("input[name='rotate-by-angle']:checked").val(); if(angle_val === "arbitrary"){ @@ -1432,7 +1432,7 @@ function image_flip_and_rotate(){ if(isNaN(angle)){ var $msgw = new $FormWindow("Invalid Value").addClass("dialogue-window"); $msgw.$main.text("The value specified for Degrees was invalid."); - $msgw.$Button("Okay", function(){ + $msgw.$Button("Okay", () => { $msgw.close(); }); return; @@ -1454,7 +1454,7 @@ function image_flip_and_rotate(){ $w.close(); })[0].focus(); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); }); @@ -1469,7 +1469,7 @@ function image_stretch_and_skew(){ var $fieldset_skew = $(E("fieldset")).appendTo($w.$main); $fieldset_skew.append("Skew
"); - var $RowInput = function($table, img_src, label_text, default_value, label_unit){ + var $RowInput = ($table, img_src, label_text, default_value, label_unit) => { var $tr = $(E("tr")).appendTo($table); var $img = $(E("img")).attr({ src: "images/transforms/" + img_src + ".png" @@ -1494,7 +1494,7 @@ function image_stretch_and_skew(){ var skew_x = $RowInput($fieldset_skew.find("table"), "skew-x", "Horizontal:", 0, "Degrees"); var skew_y = $RowInput($fieldset_skew.find("table"), "skew-y", "Vertical:", 0, "Degrees"); - $w.$Button("Okay", function(){ + $w.$Button("Okay", () => { var xscale = parseFloat(stretch_x.val())/100; var yscale = parseFloat(stretch_y.val())/100; var hskew = parseFloat(skew_x.val())/360*TAU; @@ -1504,7 +1504,7 @@ function image_stretch_and_skew(){ $w.close(); })[0].focus(); - $w.$Button("Cancel", function(){ + $w.$Button("Cancel", () => { $w.close(); }); @@ -1519,10 +1519,10 @@ function save_canvas_as(canvas, fileName, savedCallbackUnreliable){ } // TODO: file name + type dialog - canvas.toBlob(function(blob){ - sanity_check_blob(blob, function(){ + canvas.toBlob(blob => { + sanity_check_blob(blob, () => { var file_saver = saveAs(blob, file_name.replace(/\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/, "") + ".png"); - file_saver.onwriteend = function(){ + file_saver.onwriteend = () => { // this won't fire in chrome savedCallbackUnreliable(); }; @@ -1554,8 +1554,8 @@ function set_as_wallpaper_centered(c){ return window.systemSetAsWallpaperCentered(c); } - c.toBlob(function(blob){ - sanity_check_blob(blob, function(){ + c.toBlob(blob => { + sanity_check_blob(blob, () => { saveAs(blob, file_name.replace(/\.(bmp|dib|a?png|gif|jpe?g|jpe|jfif|tiff?|webp|raw)$/, "") + " wallpaper.png"); }); }); @@ -1566,19 +1566,19 @@ function set_as_wallpaper_centered(c){ * @return {Promise} */ function get_array_buffer_from_canvas(canvas) { - return new Promise(function(resolve, reject) { + return new Promise((resolve, reject) => { var file_reader = new FileReader(); - file_reader.onloadend = function() { + file_reader.onloadend = () => { resolve(file_reader.result); }; - file_reader.onerror = function() { + file_reader.onerror = () => { reject(new Error("Failed to read canvas image to array buffer")); }; - canvas.toBlob(function(blob) { - sanity_check_blob(blob, function(){ + canvas.toBlob(blob => { + sanity_check_blob(blob, () => { file_reader.readAsArrayBuffer(blob); }); }); @@ -1587,8 +1587,8 @@ function get_array_buffer_from_canvas(canvas) { function save_selection_to_file(){ if(selection && selection.canvas){ - selection.canvas.toBlob(function(blob){ - sanity_check_blob(blob, function(){ + selection.canvas.toBlob(blob => { + sanity_check_blob(blob, () => { saveAs(blob, "selection.png"); }); }); @@ -1606,7 +1606,7 @@ function sanity_check_blob(blob, okay_callback){ "Issue #118" ); $w.$main.css({maxWidth: "500px"}); - $w.$Button("OK", function(){ + $w.$Button("OK", () => { $w.close(); }); $w.center(); diff --git a/src/help.js b/src/help.js index 94bfcd6..ee83075 100644 --- a/src/help.js +++ b/src/help.js @@ -18,10 +18,10 @@ function show_help(){ $iframe.css({backgroundColor: "white"}); $help_window.center(); - var parse_object_params = function($object){ + var parse_object_params = $object => { // parse an $() to a plain object of key value pairs var object = {}; - $object.children("param").each(function(i, param){ + $object.children("param").each((i, param) => { object[param.name] = param.value; }); return object; @@ -29,13 +29,13 @@ function show_help(){ var $last_expanded; - var $Item = function(text){ + var $Item = text => { var $item = $(E("div")).addClass("item").text(text); - $item.on("mousedown", function(){ + $item.on("mousedown", () => { $contents.find(".item").removeClass("selected"); $item.addClass("selected"); }); - $item.on("click", function(){ + $item.on("click", () => { var $li = $item.parent(); if($li.is(".folder")){ if($last_expanded){ @@ -49,13 +49,13 @@ function show_help(){ }; var $default_item_li = $(E("li")).addClass("page"); - $default_item_li.append($Item("Welcome to Help").on("click", function(e){ + $default_item_li.append($Item("Welcome to Help").on("click", e => { $iframe.attr({src: "help/default.html"}); })); $contents.append($default_item_li); - $.get("help/mspaint.hhc", function(hhc){ - $($.parseHTML(hhc)).filter("ul").children().each(function(i, li){ + $.get("help/mspaint.hhc", hhc => { + $($.parseHTML(hhc)).filter("ul").children().each((i, li) => { var object = parse_object_params($(li).children("object")); @@ -66,10 +66,10 @@ function show_help(){ var $folder_items_ul = $(E("ul")); $folder_li.append($folder_items_ul); - $(li).children("ul").children().each(function(i, li){ + $(li).children("ul").children().each((i, li) => { var object = parse_object_params($(li).children("object")); var $item_li = $(E("li")).addClass("page"); - $item_li.append($Item(object.Name).on("click", function(e){ + $item_li.append($Item(object.Name).on("click", e => { $iframe.attr({src: "help/" + object.Local}); })); $folder_items_ul.append($item_li); diff --git a/src/helpers.js b/src/helpers.js index 5951e78..82d5198 100644 --- a/src/helpers.js +++ b/src/helpers.js @@ -54,13 +54,13 @@ function Canvas(width, height){ new_canvas.ctx = new_ctx; - new_ctx.disable_image_smoothing = function(image){ + new_ctx.disable_image_smoothing = image => { new_ctx.mozImageSmoothingEnabled = false; new_ctx.webkitImageSmoothingEnabled = false; new_ctx.msImageSmoothingEnabled = false; new_ctx.imageSmoothingEnabled = false; }; - new_ctx.enable_image_smoothing = function(image){ + new_ctx.enable_image_smoothing = image => { new_ctx.mozImageSmoothingEnabled = true; new_ctx.webkitImageSmoothingEnabled = true; new_ctx.msImageSmoothingEnabled = true; @@ -71,7 +71,7 @@ function Canvas(width, height){ // that reset the image smoothing to disabled // and remove all external calls to disable_image_smoothing - new_ctx.copy = function(image){ + new_ctx.copy = image => { new_canvas.width = image.naturalWidth || image.width; new_canvas.height = image.naturalHeight || image.height; diff --git a/src/image-manipulation.js b/src/image-manipulation.js index 5240184..23de321 100644 --- a/src/image-manipulation.js +++ b/src/image-manipulation.js @@ -148,11 +148,11 @@ function draw_line_without_pattern_support(ctx, x1, y1, x2, y2, stroke_size){ stroke_size = stroke_size || 1; if(aliasing){ if(stroke_size > 1){ - bresenham_line(x1, y1, x2, y2, function(x, y){ + bresenham_line(x1, y1, x2, y2, (x, y) => { ctx.drawImage(line_brush_canvas, ~~(x - line_brush_canvas.width/2), ~~(y - line_brush_canvas.height/2)); }); }else{ - bresenham_line(x1, y1, x2, y2, function(x, y){ + bresenham_line(x1, y1, x2, y2, (x, y) => { ctx.fillRect(x, y, 1, 1); }); } @@ -368,7 +368,7 @@ function apply_image_transformation(fn){ if(selection){ selection.replace_source_canvas(new_canvas); }else{ - undoable(0, function(){ + undoable(0, () => { this_ones_a_frame_changer(); ctx.copy(new_canvas); @@ -379,7 +379,7 @@ function apply_image_transformation(fn){ } function flip_horizontal(){ - apply_image_transformation(function(original_canvas, original_ctx, new_canvas, new_ctx){ + apply_image_transformation((original_canvas, original_ctx, new_canvas, new_ctx) => { new_ctx.translate(new_canvas.width, 0); new_ctx.scale(-1, 1); new_ctx.drawImage(original_canvas, 0, 0); @@ -387,7 +387,7 @@ function flip_horizontal(){ } function flip_vertical(){ - apply_image_transformation(function(original_canvas, original_ctx, new_canvas, new_ctx){ + apply_image_transformation((original_canvas, original_ctx, new_canvas, new_ctx) => { new_ctx.translate(0, new_canvas.height); new_ctx.scale(1, -1); new_ctx.drawImage(original_canvas, 0, 0); @@ -395,7 +395,7 @@ function flip_vertical(){ } function rotate(angle){ - apply_image_transformation(function(original_canvas, original_ctx, new_canvas, new_ctx){ + apply_image_transformation((original_canvas, original_ctx, new_canvas, new_ctx) => { new_ctx.save(); switch(angle){ case TAU / 4: @@ -427,7 +427,7 @@ function rotate(angle){ var bb_max_x = -Infinity; var bb_min_y = +Infinity; var bb_max_y = -Infinity; - var corner = function(x01, y01){ + var corner = (x01, y01) => { var x = Math.sin(-angle)*h*x01 + Math.cos(+angle)*w*y01; var y = Math.sin(+angle)*w*y01 + Math.cos(-angle)*h*x01; bb_min_x = Math.min(bb_min_x, x); @@ -466,7 +466,7 @@ function rotate(angle){ } function stretch_and_skew(xscale, yscale, hsa, vsa){ - apply_image_transformation(function(original_canvas, original_ctx, new_canvas, new_ctx){ + apply_image_transformation((original_canvas, original_ctx, new_canvas, new_ctx) => { var w = original_canvas.width * xscale; var h = original_canvas.height * yscale; @@ -474,7 +474,7 @@ function stretch_and_skew(xscale, yscale, hsa, vsa){ var bb_max_x = -Infinity; var bb_min_y = +Infinity; var bb_max_y = -Infinity; - var corner = function(x01, y01){ + var corner = (x01, y01) => { var x = Math.tan(hsa)*h*x01 + w*y01; var y = Math.tan(vsa)*w*y01 + h*x01; bb_min_x = Math.min(bb_min_x, x); @@ -568,7 +568,7 @@ function draw_bezier_curve(ctx, start_x, start_y, control_1_x, control_1_y, cont var min_y = Math.min(start_y, control_1_y, control_2_y, end_y); var max_x = Math.max(start_x, control_1_x, control_2_x, end_x); var max_y = Math.max(start_y, control_1_y, control_2_y, end_y); - draw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, function(op_ctx_2d){ + draw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, op_ctx_2d => { draw_bezier_curve_without_pattern_support(op_ctx_2d, start_x, start_y, control_1_x, control_1_y, control_2_x, control_2_y, end_x, end_y, stroke_size); }); } @@ -577,7 +577,7 @@ function draw_line(ctx, x1, y1, x2, y2, stroke_size){ var min_y = Math.min(y1, y2); var max_x = Math.max(x1, x2); var max_y = Math.max(y1, y2); - draw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, function(op_ctx_2d){ + draw_with_swatch(ctx, min_x, min_y, max_x, max_y, stroke_color, op_ctx_2d => { draw_line_without_pattern_support(op_ctx_2d, x1, y1, x2, y2, stroke_size); }); // also works: @@ -616,7 +616,7 @@ function draw_grid(ctx, scale) { ctx.restore(); } -(function(){ +(() => { var tessy = (function initTesselator() { // function called for each vertex of tesselator output @@ -792,10 +792,10 @@ function draw_grid(ctx, scale) { } } - window.draw_line_strip = function(ctx, points){ + window.draw_line_strip = (ctx, points) => { draw_polygon_or_line_strip(ctx, points, true, false, false); }; - window.draw_polygon = function(ctx, points, stroke, fill){ + window.draw_polygon = (ctx, points, stroke, fill) => { draw_polygon_or_line_strip(ctx, points, stroke, fill, true); }; @@ -900,7 +900,7 @@ function draw_grid(ctx, scale) { } } - window.copy_contents_within_polygon = function(canvas, points, x_min, y_min, x_max, y_max){ + window.copy_contents_within_polygon = (canvas, points, x_min, y_min, x_max, y_max) => { // Copy the contents of the given canvas within the polygon given by points bounded by x/y_min/max x_max = Math.max(x_max, x_min + 1); y_max = Math.max(y_max, y_min + 1); @@ -923,7 +923,7 @@ function draw_grid(ctx, scale) { } // TODO: maybe shouldn't be external... - window.draw_with_swatch = function(ctx, x_min, y_min, x_max, y_max, swatch, callback) { + window.draw_with_swatch = (ctx, x_min, y_min, x_max, y_max, swatch, callback) => { var stroke_margin = ~~(stroke_size * 1.1); x_max = Math.max(x_max, x_min + 1); diff --git a/src/imgur.js b/src/imgur.js index a241dcb..823fd69 100644 --- a/src/imgur.js +++ b/src/imgur.js @@ -22,12 +22,12 @@ function show_imgur_uploader(blob){ overflow: "auto", marginBottom: "0.5em", }); - $preview_image.on("load", function(){ + $preview_image.on("load", () => { $imgur_window.css({width: "auto"}); $imgur_window.center(); }); - var $upload_button = $imgur_window.$Button("Upload", function(){ + var $upload_button = $imgur_window.$Button("Upload", () => { $preview_image_area.remove(); $upload_button.remove(); @@ -43,7 +43,7 @@ function show_imgur_uploader(blob){ textAlign: "center", }); - var parseImgurResponseJSON = function(responseJSON){ + var parseImgurResponseJSON = responseJSON => { try { var response = JSON.parse(responseJSON); } catch(error) { @@ -86,7 +86,7 @@ function show_imgur_uploader(blob){ var req = new XMLHttpRequest(); if(req.upload){ - req.upload.addEventListener('progress', function(event){ + req.upload.addEventListener('progress', event => { if(event.lengthComputable){ var progress_value = event.loaded / event.total; var percentage_text = Math.floor(progress_value * 100) + "%"; @@ -96,7 +96,7 @@ function show_imgur_uploader(blob){ }, false); } - req.addEventListener("readystatechange", function() { + req.addEventListener("readystatechange", () => { if(req.readyState == 4 && req.status == 200){ $progress.add($progress_percent).remove(); @@ -121,10 +121,10 @@ function show_imgur_uploader(blob){ // TODO: a button to copy the URL to the clipboard // (also maybe put the URL in a readonly input) - var $delete_button = $imgur_window.$Button("Delete", function(){ + var $delete_button = $imgur_window.$Button("Delete", () => { var req = new XMLHttpRequest(); - req.addEventListener("readystatechange", function() { + req.addEventListener("readystatechange", () => { if(req.readyState == 4 && req.status == 200){ $delete_button.remove(); @@ -150,7 +150,7 @@ function show_imgur_uploader(blob){ $imgur_status.text("Deleting..."); }); - var $okay_button = $imgur_window.$Button("OK", function(){ + var $okay_button = $imgur_window.$Button("OK", () => { $imgur_window.close(); }); }else if(req.readyState == 4){ @@ -170,7 +170,7 @@ function show_imgur_uploader(blob){ $imgur_status.text("Uploading..."); }); - var $cancel_button = $imgur_window.$Button("Cancel", function(){ + var $cancel_button = $imgur_window.$Button("Cancel", () => { $imgur_window.close(); }); $imgur_window.width(300); diff --git a/src/manage-storage.js b/src/manage-storage.js index 55c5a5d..ef09af6 100644 --- a/src/manage-storage.js +++ b/src/manage-storage.js @@ -20,12 +20,12 @@ function storage_quota_exceeded(){ "

You can still save the current image with File > Save. " + "You should save frequently, or free up enough space to keep the image safe.

" ); - $w.$Button("View and manage storage", function(){ + $w.$Button("View and manage storage", () => { $w.close(); ignoring_quota_exceeded = false; manage_storage(); }); - $w.$Button("Ignore", function(){ + $w.$Button("Ignore", () => { $w.close(); ignoring_quota_exceeded = true; }); @@ -44,11 +44,11 @@ function manage_storage(){ var $message = $(E("p")).appendTo($storage_manager.$main).html( "Any images you've saved to your computer with File > Save will not be affected." ); - $storage_manager.$Button("Close", function(){ + $storage_manager.$Button("Close", () => { $storage_manager.close(); }); - var addRow = function(k, imgSrc){ + var addRow = (k, imgSrc) => { var $tr = $(E("tr")).appendTo($table); var $img = $(E("img")).attr({src: imgSrc}); @@ -61,7 +61,7 @@ function manage_storage(){ $(E("td")).append($open_link).appendTo($tr); $(E("td")).append($remove).appendTo($tr); - $remove.on("click", function(){ + $remove.on("click", () => { localStorage.removeItem(k); $tr.remove(); if($table.find("tr").length == 0){ diff --git a/src/sessions.js b/src/sessions.js index a54bc8e..e330ad8 100644 --- a/src/sessions.js +++ b/src/sessions.js @@ -1,5 +1,5 @@ -(function(){ +(() => { var log = function(){ if(typeof console !== "undefined"){ @@ -100,12 +100,12 @@ var lsid = "image#" + session_id; log("local storage id: " + lsid); // save image to storage - var save_image_to_storage = function () { + var save_image_to_storage = () => { var save_paused = handle_data_loss(); if (save_paused) { return; } - storage.set(lsid, canvas.toDataURL("image/png"), function (err) { + storage.set(lsid, canvas.toDataURL("image/png"), err => { if (err) { if (err.quotaExceeded) { storage_quota_exceeded(); @@ -118,7 +118,7 @@ } }); }; - storage.get(lsid, function (err, uri) { + storage.get(lsid, (err, uri) => { if (err) { if (localStorageAvailable) { show_error_message("Failed to retrieve image from local storage:", err); @@ -129,7 +129,7 @@ } } else if (uri) { - open_from_URI(uri, function (err) { + open_from_URI(uri, err => { if (err) { return show_error_message("Failed to open image from local storage:", err); } @@ -196,14 +196,14 @@ session.id = session_id; file_name = "[Loading " + session.id + "]"; update_title(); - var on_firebase_loaded = function () { + var on_firebase_loaded = () => { file_name = "[" + session.id + "]"; update_title(); session.start(); }; if (!FireSession.fb_root) { $.getScript("lib/firebase.js") - .done(function () { + .done(() => { var config = { apiKey: "AIzaSyBgau8Vu9ZE8u_j0rp-Lc044gYTX5O3X9k", authDomain: "jspaint.firebaseapp.com", @@ -216,7 +216,7 @@ FireSession.fb_root = firebase.database().ref("/"); on_firebase_loaded(); }) - .fail(function () { + .fail(() => { show_error_message("Failed to load Firebase; the document will not load, and changes will not be saved."); file_name = "[Failed to load " + session.id + "]"; update_title(); @@ -239,14 +239,14 @@ // "this issue to show interest, and/or subscribe for updates.

" ); $w.$main.css({ maxWidth: "500px" }); - $w.$Button("OK", function () { + $w.$Button("OK", () => { $w.close(); }); $w.center(); // Wrap the Firebase API because they don't // provide a great way to clean up event listeners session._fb_listeners = []; - var _fb_on = function (fb, event_type, callback, error_callback) { + var _fb_on = (fb, event_type, callback, error_callback) => { session._fb_listeners.push({ fb, event_type, callback, error_callback }); fb.on(event_type, callback, error_callback); }; @@ -267,7 +267,7 @@ session.fb_user.set(user); // @TODO: Execute the above two lines when .info/connected // For each existing and new user - _fb_on(session.fb_users, "child_added", function (snap) { + _fb_on(session.fb_users, "child_added", snap => { // Is this you? if (snap.key === user_id) { // You already have a cursor. @@ -294,7 +294,7 @@ transition: "opacity 0.5s", }); // When the cursor data changes - _fb_on(fb_other_user, "value", function (snap) { + _fb_on(fb_other_user, "value", snap => { other_user = snap.val(); // If the user has left if (other_user == null) { @@ -303,7 +303,7 @@ } else { // Draw the cursor - var draw_cursor = function () { + var draw_cursor = () => { cursor_canvas.width = cursor_image.width; cursor_canvas.height = cursor_image.height; var cctx = cursor_canvas.ctx; @@ -334,7 +334,7 @@ }); var previous_uri; var pointer_operations = []; - var sync = function () { + var sync = () => { var save_paused = handle_data_loss(); if (save_paused) { return; @@ -354,7 +354,7 @@ }; $canvas.on("change.session-hook", sync); // Any time we change or recieve the image data - _fb_on(session.fb_data, "value", function (snap) { + _fb_on(session.fb_data, "value", snap => { log("data update"); var uri = snap.val(); if (uri == null) { @@ -367,7 +367,7 @@ saved = true; // hopefully // Load the new image data var img = new Image(); - img.onload = function () { + img.onload = () => { // Cancel any in-progress pointer operations if (pointer_operations.length) { $G.triggerHandler("pointerup", "cancel"); @@ -389,13 +389,13 @@ }; img.src = uri; } - }, function (error) { + }, error => { show_error_message("Failed to retrieve data from Firebase. The document will not load, and changes will not be saved.", error); file_name = "[Failed to load " + session.id + "]"; update_title(); }); // Update the cursor status - $G.on("pointermove.session-hook", function (e) { + $G.on("pointermove.session-hook", e => { var m = e2c(e); session.fb_user.child("cursor").update({ x: m.x, @@ -403,7 +403,7 @@ away: false, }); }); - $G.on("blur.session-hook", function (e) { + $G.on("blur.session-hook", e => { session.fb_user.child("cursor").update({ away: true, }); @@ -438,17 +438,17 @@ // Handle the starting, switching, and ending of sessions from the location.hash var current_session; - var end_current_session = function(){ + var end_current_session = () => { if(current_session){ log("ending current session"); current_session.end(); current_session = null; } }; - var generate_session_id = function(){ + var generate_session_id = () => { return (Math.random()*Math.pow(2, 32)).toString(16).replace(".", ""); }; - var update_session_from_location_hash = function(e){ + var update_session_from_location_hash = e => { // TODO: should #load: be separate from #session:/#local:, // and be able to load *into* a session, rather than just start one? // well I guess loading into a session wouldn't be that helpful if it makes a new image anyways @@ -494,18 +494,18 @@ end_current_session(); // TODO: fix loading duplicately, from popstate and hashchange - open_from_URI(url, function(err){ + open_from_URI(url, err => { if(err){ show_resource_load_error_message(); } // TODO: saved = false;? // NOTE: the following is intended to run regardless of error (as opposed to returning if there's an error) // FIXME: race condition (make the timeout long and try to fix it with a flag or something ) - setTimeout(function(){ + setTimeout(() => { // NOTE: this "change" event doesn't *guarantee* there was a change :/ // let alone that there was a user interaction with the currently loaded document // that is, it also triggers for session changes, which I'm trying to avoid here - $canvas.one("change", function(){ + $canvas.one("change", () => { if(location.hash === hash_loading_url_from){ log("switching to new session from #load: URL because of user interaction"); end_current_session(); @@ -526,7 +526,7 @@ } }; - $G.on("hashchange popstate", function(e){ + $G.on("hashchange popstate", e => { log(e.type, location.hash); update_session_from_location_hash(); }); diff --git a/src/storage.js b/src/storage.js index 4dd8f8b..4eb3c54 100644 --- a/src/storage.js +++ b/src/storage.js @@ -1,10 +1,10 @@ // TODO: remove "ref" cruft from being compiled from CoffeeScript // or maybe replace this module with localforage actually -(function() { +((() => { var isArray, localStore, ref, ref1; - isArray = (ref = Array.isArray) != null ? ref : function(a) { + isArray = (ref = Array.isArray) != null ? ref : a => { return ("" + a) !== a && {}.toString.call(a) === "[object Array]"; }; @@ -79,4 +79,4 @@ window.storage = localStore; -}).call(this); +})).call(this); diff --git a/src/theme.js b/src/theme.js index 8da6e60..88f883a 100644 --- a/src/theme.js +++ b/src/theme.js @@ -1,7 +1,7 @@ -(function() { +(() => { var default_theme = "classic.css"; var theme_storage_key = "jspaint theme"; - var href_for = function(theme) { + var href_for = theme => { return "styles/themes/" + theme; }; @@ -15,7 +15,7 @@ var iid; function wait_for_theme_loaded(theme, callback) { clearInterval(iid); - iid = setInterval(function() { + iid = setInterval(() => { var theme_loaded = getComputedStyle(document.documentElement) .getPropertyValue("--theme-loaded") @@ -34,11 +34,11 @@ theme_link.id = "theme-link"; document.head.appendChild(theme_link); - window.get_theme = function() { + window.get_theme = () => { return current_theme; }; - window.set_theme = function(theme) { + window.set_theme = theme => { current_theme = theme; try { @@ -51,7 +51,7 @@ $(window).trigger("resize"); // not exactly, but get dynamic cursor to update its offset }); - wait_for_theme_loaded(theme, function(){ + wait_for_theme_loaded(theme, () => { $(window).triggerHandler("theme-load"); }); theme_link.href = href_for(theme); diff --git a/src/tool-options.js b/src/tool-options.js index cabd227..0b3663d 100644 --- a/src/tool-options.js +++ b/src/tool-options.js @@ -9,19 +9,27 @@ var pencil_size = 1; var stroke_size = 1; // lines, curves, shape outlines var tool_transparent_mode = false; -var ChooserCanvas = function( - url, invert, - width, height, - sourceX, sourceY, sourceWidth, sourceHeight, - destX, destY, destWidth, destHeight -){ +var ChooserCanvas = ( + url, + invert, + width, + height, + sourceX, + sourceY, + sourceWidth, + sourceHeight, + destX, + destY, + destWidth, + destHeight +) => { var c = new Canvas(width, height); var img = ChooserCanvas.cache[url]; if(!img){ img = ChooserCanvas.cache[url] = E("img"); img.src = url; } - var render = function(){ + var render = () => { c.ctx.drawImage( img, sourceX, sourceY, sourceWidth, sourceHeight, @@ -43,22 +51,22 @@ var ChooserCanvas = function( }; ChooserCanvas.cache = {}; -var $Choose = function(things, display, choose, is_chosen){ +var $Choose = (things, display, choose, is_chosen) => { var $chooser = $(E("div")).addClass("chooser"); - $chooser.on("update", function(){ + $chooser.on("update", () => { $chooser.empty(); for(var i=0; i { var $option_container = $(E("div")).appendTo($chooser); var $option = $(); - var choose_thing = function(){ + var choose_thing = () => { if(is_chosen(thing)){ return; // unnecessary optimization } choose(thing); $G.trigger("option-changed"); } - var update = function(){ + var update = () => { var selected_color = get_theme() === "modern.css" ? "#0178d7" : "#000080"; // TODO: get from a CSS variable $option_container.css({ backgroundColor: is_chosen(thing) ? selected_color : "" @@ -72,10 +80,10 @@ var $Choose = function(things, display, choose, is_chosen){ $G.on("option-changed", update); $option_container.on("pointerdown click", choose_thing); - $chooser.on("pointerdown", function(){ + $chooser.on("pointerdown", () => { $option_container.on("pointerenter", choose_thing); }); - $G.on("pointerup", function(){ + $G.on("pointerup", () => { $option_container.off("pointerenter", choose_thing); }); @@ -84,14 +92,14 @@ var $Choose = function(things, display, choose, is_chosen){ }); return $chooser; }; -var $ChooseShapeStyle = function(){ +var $ChooseShapeStyle = () => { var $chooser = $Choose( [ {stroke: true, fill: false}, {stroke: true, fill: true}, {stroke: false, fill: true} ], - function(a, is_chosen){ + (a, is_chosen) => { var sscanvas = new Canvas(39, 21); var ssctx = sscanvas.ctx; @@ -117,11 +125,11 @@ var $ChooseShapeStyle = function(){ return sscanvas; }, - function(a){ + a => { $chooser.stroke = a.stroke; $chooser.fill = a.fill; }, - function(a){ + a => { return $chooser.stroke === a.stroke && $chooser.fill === a.fill; } ).addClass("choose-shape-style"); @@ -132,49 +140,44 @@ var $ChooseShapeStyle = function(){ return $chooser; }; -var $choose_brush = $Choose( - (function(){ - var brush_shapes = ["circle", "square", "reverse_diagonal", "diagonal"]; - var circular_brush_sizes = [7, 4, 1]; - var brush_sizes = [8, 5, 2]; - var things = []; - brush_shapes.forEach((brush_shape)=> { - var sizes = brush_shape === "circle" ? circular_brush_sizes : brush_sizes; - sizes.forEach((brush_size)=> { - things.push({ - shape: brush_shape, - size: brush_size, - }); - }); - }); - return things; - })(), - function(o, is_chosen){ - var cbcanvas = new Canvas(10, 10); - - var shape = o.shape; - var size = o.size; - - cbcanvas.ctx.fillStyle = - cbcanvas.ctx.strokeStyle = - is_chosen ? "#fff" : "#000"; - - render_brush(cbcanvas.ctx, shape, size); - - return cbcanvas; - }, - function(o){ - brush_shape = o.shape; - brush_size = o.size; - }, - function(o){ - return brush_shape === o.shape && brush_size === o.size; - } -).addClass("choose-brush"); +var $choose_brush = $Choose((() => { + var brush_shapes = ["circle", "square", "reverse_diagonal", "diagonal"]; + var circular_brush_sizes = [7, 4, 1]; + var brush_sizes = [8, 5, 2]; + var things = []; + brush_shapes.forEach((brush_shape)=> { + var sizes = brush_shape === "circle" ? circular_brush_sizes : brush_sizes; + sizes.forEach((brush_size)=> { + things.push({ + shape: brush_shape, + size: brush_size, + }); + }); + }); + return things; +})(), (o, is_chosen) => { + var cbcanvas = new Canvas(10, 10); + + var shape = o.shape; + var size = o.size; + + cbcanvas.ctx.fillStyle = + cbcanvas.ctx.strokeStyle = + is_chosen ? "#fff" : "#000"; + + render_brush(cbcanvas.ctx, shape, size); + + return cbcanvas; +}, o => { + brush_shape = o.shape; + brush_size = o.size; +}, o => { + return brush_shape === o.shape && brush_size === o.size; +}).addClass("choose-brush"); var $choose_eraser_size = $Choose( [4, 6, 8, 10], - function(size, is_chosen){ + (size, is_chosen) => { var cecanvas = new Canvas(39, 16); cecanvas.ctx.fillStyle = is_chosen ? "#fff" : "#000"; @@ -182,17 +185,17 @@ var $choose_eraser_size = $Choose( return cecanvas; }, - function(size){ + size => { eraser_size = size; }, - function(size){ + size => { return eraser_size === size; } ).addClass("choose-eraser"); var $choose_stroke_size = $Choose( [1, 2, 3, 4, 5], - function(size, is_chosen){ + (size, is_chosen) => { var w = 39, h = 12, b = 5; var cscanvas = new Canvas(w, h); var center_y = (h - size) / 2; @@ -200,10 +203,10 @@ var $choose_stroke_size = $Choose( cscanvas.ctx.fillRect(b, ~~center_y, w - b*2, size); return cscanvas; }, - function(size){ + size => { stroke_size = size; }, - function(size){ + size => { return stroke_size === size; } ).addClass("choose-stroke-size"); @@ -211,7 +214,7 @@ var $choose_stroke_size = $Choose( var magnifications = [1, 2, 6, 8, 10]; var $choose_magnification = $Choose( magnifications, - function(scale, is_chosen){ + (scale, is_chosen) => { var i = magnifications.indexOf(scale); var secret = scale === 10; // 10x is secret var chooser_canvas = ChooserCanvas( @@ -226,16 +229,16 @@ var $choose_magnification = $Choose( } return chooser_canvas; }, - function(scale){ + scale => { set_magnification(scale); }, - function(scale){ + scale => { return scale === magnification; } ).addClass("choose-magnification") .css({position: "relative"}); // positioning context for above `position: "absolute"` canvas -$choose_magnification.on("update", function(){ +$choose_magnification.on("update", () => { $choose_magnification .find(".secret-option") .parent() @@ -245,7 +248,7 @@ $choose_magnification.on("update", function(){ var airbrush_sizes = [9, 16, 24]; var $choose_airbrush_size = $Choose( airbrush_sizes, - function(size, is_chosen){ + (size, is_chosen) => { var image_width = 72; // width of source image var i = airbrush_sizes.indexOf(size); // 0 or 1 or 2 @@ -265,17 +268,17 @@ var $choose_airbrush_size = $Choose( 0, 0, w, h // x, y, width, height on created destination canvas ); }, - function(size){ + size => { airbrush_size = size; }, - function(size){ + size => { return size === airbrush_size; } ).addClass("choose-airbrush-size"); var $choose_transparent_mode = $Choose( [false, true], - function(_tool_transparent_mode, is_chosen){ + (_tool_transparent_mode, is_chosen) => { var sw = 35, sh = 23; // width, height from source image var b = 2; // margin by which the source image is inset on the destination var theme_folder = `images/${get_theme().replace(/\.css/, "")}`; @@ -287,10 +290,10 @@ var $choose_transparent_mode = $Choose( b, b, sw, sh // x, y, width, height on created destination canvas ); }, - function(_tool_transparent_mode){ + _tool_transparent_mode => { tool_transparent_mode = _tool_transparent_mode; }, - function(_tool_transparent_mode){ + _tool_transparent_mode => { return _tool_transparent_mode === tool_transparent_mode; } ).addClass("choose-transparent-mode"); diff --git a/src/tools.js b/src/tools.js index 24283f4..60d91c3 100644 --- a/src/tools.js +++ b/src/tools.js @@ -33,7 +33,7 @@ tools = [{ // The inverty brush is continuous in space which means // paint(ctx, x, y) will be called for each pixel the pointer moves // and we only need to record individual pointer events to make the polygon - var onpointermove = function(e){ + var onpointermove = e => { var pointer = e2c(e); // Constrain the pointer to the canvas pointer.x = Math.min(canvas.width, pointer.x); @@ -49,7 +49,7 @@ tools = [{ tool.y_max = Math.max(pointer.y, tool.y_max); }; $G.on("pointermove", onpointermove); - $G.one("pointerup", function(){ + $G.one("pointerup", () => { $G.off("pointermove", onpointermove); }); }, @@ -144,10 +144,10 @@ tools = [{ selection = null; } var pointer_has_moved = false; - $G.one("pointermove", function(){ + $G.one("pointermove", () => { pointer_has_moved = true; }); - $G.one("pointerup", function(){ + $G.one("pointerup", () => { if(!pointer_has_moved && selection){ selection.draw();//? selection.destroy(); @@ -301,7 +301,7 @@ tools = [{ }, pointerdown: function(){ var _this = this; - $G.one("pointerup", function(){ + $G.one("pointerup", () => { _this.$options.css({ background: "" }); @@ -535,10 +535,10 @@ tools = [{ textbox.destroy(); } var pointer_has_moved = false; - $G.one("pointermove", function(){ + $G.one("pointermove", () => { pointer_has_moved = true; }); - $G.one("pointerup", function(){ + $G.one("pointerup", () => { if(!pointer_has_moved && textbox){ textbox.draw(); textbox.destroy(); @@ -716,7 +716,7 @@ tools = [{ // @TODO: stop needing this: tool.canvas_base = canvas; - undoable(function(){ + undoable(() => { // @TODO: stop needing this: tool.canvas_base = undos[undos.length-1]; diff --git a/src/vaporwave-fun.js b/src/vaporwave-fun.js index 39d7008..9229357 100644 --- a/src/vaporwave-fun.js +++ b/src/vaporwave-fun.js @@ -1,4 +1,4 @@ -(function () { +(() => { var rAF_ID, rotologo, $window, space_phase_key_handler, player, player_placeholder; var vaporwave_active = false; @@ -8,7 +8,7 @@ $window = $(); } - var wait_for_youtube_api = function (callback) { + var wait_for_youtube_api = callback => { if (typeof YT !== "undefined") { callback(); } else { @@ -18,13 +18,13 @@ firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); // The YouTube API will call this global function when loaded and ready. - window.onYouTubeIframeAPIReady = function () { + window.onYouTubeIframeAPIReady = () => { callback(); }; } }; - var stop_vaporwave = function () { + var stop_vaporwave = () => { vaporwave_active = false; cancelAnimationFrame(rAF_ID); @@ -43,7 +43,7 @@ // bepis pepsi isded pepsi isded }; - var start_vaporwave = function () { + var start_vaporwave = () => { vaporwave_active = true; rotologo = document.createElement("img"); @@ -66,7 +66,7 @@ opacity: "0", }); - var animate = function () { + var animate = () => { rAF_ID = requestAnimationFrame(animate); $(rotologo).css({ @@ -123,7 +123,7 @@ // NOTE: placeholder not a container; the YT API replaces the element passed in the DOM // but keeps inline styles apparently, and maybe other things, I don't know; it's weird - wait_for_youtube_api(function () { + wait_for_youtube_api(() => { player = new YT.Player(player_placeholder, { height: "390", width: "640", @@ -155,7 +155,7 @@ function onPlayerStateChange(event) { if (event.data == YT.PlayerState.PLAYING) { // TODO: pause and resume this timer with the video - setTimeout(function(){ + setTimeout(() => { $(rotologo).css({opacity: 1}); }, 14150); } @@ -174,7 +174,7 @@ } var is_theoretically_playing = true; - space_phase_key_handler = function (e) { + space_phase_key_handler = e => { // press space to phase in and out of space phase スペース相 - windows 98 マイクロソフト 『WINTRAP』 X 将来のオペレーティングシステムサウンド 1998 VAPORWAVE if (e.which === 32) { // TODO: record player SFX @@ -198,7 +198,7 @@ addEventListener("keydown", space_phase_key_handler); }; - var toggle_vaporwave = function () { + var toggle_vaporwave = () => { if (vaporwave_active) { stop_vaporwave(); } else { @@ -208,4 +208,4 @@ addEventListener("keydown", Konami.code(toggle_vaporwave)); -}()); +})();