From 983b307429ca24afe773bf195adacf08ff85e802 Mon Sep 17 00:00:00 2001 From: Devine Lu Linvega Date: Sun, 29 Jul 2018 17:15:01 +1200 Subject: [PATCH] Improved scaling --- desktop/sources/links/main.css | 6 +- desktop/sources/scripts/dotgrid.js | 2 +- index.html | 23 +- web/links/fonts.css | 15 - web/links/main.css | 42 --- web/links/reset.css | 1 - web/media/fonts/input_mono_medium.ttf | Bin 110032 -> 0 bytes web/media/fonts/input_mono_regular.ttf | Bin 109152 -> 0 bytes web/scripts/dotgrid.js | 410 ------------------------- web/scripts/generator.js | 114 ------- web/scripts/guide.js | 232 -------------- web/scripts/interface.js | 79 ----- web/scripts/lib/history.js | 50 --- web/scripts/lib/theme.js | 86 ------ web/scripts/picker.js | 114 ------- web/scripts/renderer.js | 87 ------ web/scripts/tool.js | 286 ----------------- 17 files changed, 16 insertions(+), 1531 deletions(-) delete mode 100644 web/links/fonts.css delete mode 100644 web/links/main.css delete mode 100644 web/links/reset.css delete mode 100644 web/media/fonts/input_mono_medium.ttf delete mode 100644 web/media/fonts/input_mono_regular.ttf delete mode 100644 web/scripts/dotgrid.js delete mode 100644 web/scripts/generator.js delete mode 100644 web/scripts/guide.js delete mode 100644 web/scripts/interface.js delete mode 100644 web/scripts/lib/history.js delete mode 100644 web/scripts/lib/theme.js delete mode 100644 web/scripts/picker.js delete mode 100644 web/scripts/renderer.js delete mode 100644 web/scripts/tool.js diff --git a/desktop/sources/links/main.css b/desktop/sources/links/main.css index 8e5be04..17bdd96 100644 --- a/desktop/sources/links/main.css +++ b/desktop/sources/links/main.css @@ -1,9 +1,9 @@ -body { padding: 5px; font-family: 'input_mono_regular'; -webkit-user-select: none; overflow: hidden; padding-left:5px; transition: background 500ms} +body { padding: 0px; font-family: 'input_mono_regular'; -webkit-user-select: none; overflow: hidden; transition: background 500ms} /* Core */ -#app { display: flex; flex-direction: column; align-items: center; -webkit-app-region: drag; padding-top:30px;} -#guide { position: absolute;width: 300px;height: 300px; transition: opacity 150ms;} +#app { -webkit-app-region: drag; padding: 30px;width:calc(100vw - 60px);height:calc(100vh - 60px)} +#guide { position: absolute;width: 300px;height: 300px; transition: opacity 150ms; -webkit-app-region: no-drag;} #render { display: none } #vector { z-index: 1000;position: relative;width:300px; height:300px; } diff --git a/desktop/sources/scripts/dotgrid.js b/desktop/sources/scripts/dotgrid.js index 8ffa328..b2b8f1e 100644 --- a/desktop/sources/scripts/dotgrid.js +++ b/desktop/sources/scripts/dotgrid.js @@ -459,7 +459,7 @@ function Dotgrid(width,height,grid_x,grid_y,block_x,block_y) this.position_in_grid = function(pos) { - return {x:(window.innerWidth/2) - (this.tool.settings.size.width/2) - pos.x,y:pos.y - (30+10)} + return {x:(window.innerWidth/2) - (this.tool.settings.size.width/2) - pos.x - 5,y:pos.y - (30+5)} } this.position_on_grid = function(pos) diff --git a/index.html b/index.html index b413db1..fe64f57 100644 --- a/index.html +++ b/index.html @@ -1,20 +1,21 @@ - - + + + - - - - - + + + + + - + - - - + + + Dotgrid diff --git a/web/links/fonts.css b/web/links/fonts.css deleted file mode 100644 index be688de..0000000 --- a/web/links/fonts.css +++ /dev/null @@ -1,15 +0,0 @@ -/* Input */ - -@font-face { - font-family: 'input_mono_regular'; - src: url('../media/fonts/input_mono_regular.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} - -@font-face { - font-family: 'input_mono_medium'; - src: url('../media/fonts/input_mono_medium.ttf') format('truetype'); - font-weight: normal; - font-style: normal; -} \ No newline at end of file diff --git a/web/links/main.css b/web/links/main.css deleted file mode 100644 index e7f9f3d..0000000 --- a/web/links/main.css +++ /dev/null @@ -1,42 +0,0 @@ -body { padding: 5px; font-family: 'input_mono_regular'; -webkit-user-select: none; overflow: hidden; padding-left:5px; transition: background 500ms} - -/* Core */ - -#app { display: flex; flex-direction: column; align-items: center; -webkit-app-region: drag; padding-top:30px;} -#guide { position: absolute;width: 300px;height: 300px; transition: opacity 150ms; margin-left:50%;} -#render { display: none } -#vector { z-index: 1000;position: relative;width:300px; height:300px; } - -/* Interface */ - -#interface { font-size: 11px;line-height: 30px;text-transform: uppercase;-webkit-app-region: no-drag; transition: all 150ms; width: 315px; position:fixed; bottom:20px; left:calc(50vw - 155px); height:30px;} -#interface svg.inactive { opacity: 0.2 } -#interface svg path.inactive { opacity: 0.2 } -#interface svg:hover { opacity: 0.5 } -#interface svg.icon:last-child { margin-right: 0; } -#interface svg path { fill:none; stroke-linecap: round; stroke-linejoin: round; stroke-width:12px; } -#interface.hidden { bottom:10px;opacity: 0 } -#interface.visible { bottom:20px; opacity: 1 } -#interface #menu { opacity: 1; position: absolute; top:0px; transition: all 250ms; z-index: 900} -#interface #picker { background:red; position: absolute; line-height: 30px; z-index: 0; width:250px; top:5px; opacity: 0; transition: all 250ms;} -#interface.picker #menu { opacity: 0; top:-5px; z-index: 0 } -#interface.picker #picker { opacity: 1; top:0px; z-index: 900 } -#interface .icon { width:30px; height:30px; margin-right:-2px; opacity: 1} -#interface .icon:hover { cursor: pointer; opacity: 1 } - -/* Theme Overrides */ - -:root { --background: "#222"; --f_high: "#fff";--f_med: "#777";--f_low: "#444";--f_inv: "#000";--b_high: "#000";--b_med: "#affec7";--b_low: "#000";--b_inv: "#affec7"; } - -body { background:var(--background) !important; } -#picker { background:var(--background) !important; color:var(--f_high) !important; } -.fh { color:var(--f_high) !important; stroke:var(--f_high) !important; } -.fm { color:var(--f_med) !important ; stroke:var(--f_med) !important; } -.fl { color:var(--f_low) !important ; stroke:var(--f_low) !important; } -.f_inv { color:var(--f_inv) !important ; stroke:var(--f_inv) !important; } -.f_inv { color:var(--f_inv) !important ; stroke:var(--f_inv) !important; } -.bh { background:var(--b_high) !important; } -.bm { background:var(--b_med) !important ; } -.bl { background:var(--b_low) !important ; } -.b_inv { background:var(--b_inv) !important ; ; } -.icon { color:var(--f_high) !important; stroke:var(--f_high) !important; } \ No newline at end of file diff --git a/web/links/reset.css b/web/links/reset.css deleted file mode 100644 index 9f57584..0000000 --- a/web/links/reset.css +++ /dev/null @@ -1 +0,0 @@ -* { margin:0;padding:0;border:0;outline:0;text-decoration:none;font-weight:inherit;font-style:inherit;color:inherit;font-size:100%;font-family:inherit;vertical-align:baseline;list-style:none;border-collapse:collapse;border-spacing:0; -webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;} \ No newline at end of file diff --git a/web/media/fonts/input_mono_medium.ttf b/web/media/fonts/input_mono_medium.ttf deleted file mode 100644 index 0d488bf84fa12e5c717824a0d24e6a615766c834..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 110032 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 diff --git a/web/media/fonts/input_mono_regular.ttf b/web/media/fonts/input_mono_regular.ttf deleted file mode 100644 index c19c28706f53f11edad8e705b467fd084c99a0c7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109152 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 Xn { - if(err){ alert("An error ocurred reading the file :" + err.message); return; } - this.tool.replace(JSON.parse(data.toString().trim())); - this.guide.refresh(); - }); - } - - this.save = function(content = this.tool.export()) - { - dialog.showSaveDialog({ - title:"Save to .grid", - filters: [{name: "Dotgrid", extensions: ["grid", "dot"]}] - },(fileName) => { - if (fileName === undefined){ return; } - fileName = fileName.substr(-5,5) != ".grid" ? fileName+".grid" : fileName; - fs.writeFileSync(fileName, content); - this.guide.refresh() - }); - } - - this.refresh = function() - { - this.set_size({width:window.innerWidth - 120,height:window.innerHeight- 120}) - } - - this.render = function(content = this.renderer.to_png({width:dotgrid.tool.settings.size.width*2,height:dotgrid.tool.settings.size.height*2}), ready = null, size = null) - { - if(!ready){return; } - - dialog.showSaveDialog({title:"Render to .png"},(fileName) => { - if (fileName === undefined){ return; } - fileName = fileName.substr(-4,4) != ".png" ? fileName+".png" : fileName; - console.log(`Rendered ${size.width}x${size.height}`) - fs.writeFileSync(fileName, ready); - }); - } - - this.export = function(content = this.renderer.to_svg()) - { - dialog.showSaveDialog({title:"Export to .svg"},(fileName) => { - if (fileName === undefined){ return; } - fileName = fileName.substr(-4,4) != ".svg" ? fileName+".svg" : fileName; - fs.writeFileSync(fileName, content); - this.guide.refresh() - }); - } - - this.bundle = {} - - this.build = function() - { - this.bundle = {} - - var sizes = [ - {width:16,height:16}, - {width:32,height:32}, - {width:52,height:52}, - {width:64,height:64}, - {width:72,height:72}, - {width:96,height:96}, - {width:128,height:128}, - {width:256,height:256}, - {width:512,height:512} - ] - - for(id in sizes){ - this.renderer.to_png(sizes[id],dotgrid.package) - } - } - - this.package = function(n = null, ready,size) - { - dotgrid.bundle[`${size.width}x${size.height}`] = ready - - console.log(`Rendered ${size.width}x${size.height}`,`${Object.keys(dotgrid.bundle).length}/9`) - - if(Object.keys(dotgrid.bundle).length == 9){ - dialog.showSaveDialog({title:"Export to Icons"},(fileName) => { - if (fileName === undefined){ return; } - for(id in dotgrid.bundle){ - fs.writeFileSync(`${fileName}.${id}.png`, dotgrid.bundle[id]); - } - }); - } - } - - // Cursor - - this.mouse_down = function(e) - { - var o = e.target.getAttribute("ar"); - - if(o){ - if(o == "line"){ this.tool.cast("line"); return; } - if(o == "arc_c"){ this.tool.cast("arc_c"); return;} - if(o == "arc_r"){ this.tool.cast("arc_r"); return; } - if(o == "bezier"){ this.tool.cast("bezier"); return; } - if(o == "close"){ this.tool.cast("close"); return; } - - if(o == "thickness"){ this.mod_thickness(10,true,true); return; } - if(o == "linecap"){ this.mod_linecap(); return; } - if(o == "linejoin"){ this.mod_linejoin(); return; } - if(o == "mirror"){ this.tool.toggle_mirror(); return; } - if(o == "fill"){ this.mod_fill(); return; } - if(o == "color"){ setTimeout(()=>{ this.picker.start(); }, 100); return; } - if(o == "depth"){ this.tool.select_next_layer(); return; } - - e.preventDefault(); - } - - var pos = this.position_in_grid({x:e.clientX+5,y:e.clientY-5}); - pos = this.position_on_grid(pos); - - if(e.altKey){ dotgrid.tool.remove_segments_at(pos); return; } - - if(dotgrid.tool.vertex_at(pos)){ - console.log("Begin translation"); dotgrid.cursor.translation = {from:pos,to:pos}; - if(e.shiftKey){ console.log("Begin translation(multi)"); dotgrid.cursor.multi = true; } - } - - dotgrid.guide.refresh(); - dotgrid.interface.refresh(); - } - - this.mouse_move = function(e) - { - var pos = this.position_in_grid({x:e.clientX+5,y:e.clientY-5}); pos = this.position_on_grid(pos); - - this.cursor.pos = pos; - this.cursor.updated = new Date().getTime(); - this.cursor.operation = e.target.getAttribute("ar"); - - if(dotgrid.cursor.translation && (Math.abs(dotgrid.cursor.translation.from.x) != Math.abs(pos.x) || Math.abs(dotgrid.cursor.translation.from.y) != Math.abs(pos.y))){ dotgrid.cursor.translation.to = pos; } - - dotgrid.guide.refresh(); - dotgrid.interface.refresh(); - e.preventDefault(); - } - - this.mouse_up = function(e) - { - if(e.target.getAttribute("ar")){ return } // If clicking on interface - - var pos = this.position_in_grid({x:e.clientX+5,y:e.clientY-5}); - pos = this.position_on_grid(pos); - - if(e.altKey || e.target.id != "guide"){ return; } - - if(pos.x > 0) { dotgrid.cursor.translation = null; return; } - - if(dotgrid.cursor.translation && (Math.abs(dotgrid.cursor.translation.from.x) != Math.abs(dotgrid.cursor.translation.to.x) || Math.abs(dotgrid.cursor.translation.from.y) != Math.abs(dotgrid.cursor.translation.to.y))){ - if(dotgrid.cursor.multi){ - dotgrid.tool.translate_multi(dotgrid.cursor.translation.from,dotgrid.cursor.translation.to); - } - else{ - dotgrid.tool.translate(dotgrid.cursor.translation.from,dotgrid.cursor.translation.to); - } - dotgrid.cursor.translation = null; - dotgrid.cursor.multi = null; - dotgrid.guide.refresh(); - e.preventDefault(); - return; - } - - this.tool.add_vertex({x:pos.x * -1,y:pos.y}); - dotgrid.cursor.translation = null; - - dotgrid.interface.refresh(); - dotgrid.guide.refresh(); - - e.preventDefault(); - } - - this.mouse_alt = function(e) - { - var pos = this.position_in_grid({x:e.clientX+5,y:e.clientY-5}); pos = this.position_on_grid(pos); - dotgrid.tool.remove_segments_at(pos); - e.preventDefault(); - - setTimeout(() => { dotgrid.tool.clear(); },150); - } - - // Toggles - - this.mod_thickness = function(mod = 10,step = false,cap = false) - { - if(cap){ - this.tool.style().thickness = this.tool.style().thickness > 40 ? 1 : this.tool.style().thickness - } - if(step){ - this.tool.style().thickness = parseInt(this.tool.style().thickness/5) * 5; - } - - this.tool.style().thickness = clamp(this.tool.style().thickness+mod,1,40); - dotgrid.guide.refresh(); - } - - this.mod_linecap_index = 1; - - this.mod_linecap = function(mod) - { - var a = ["butt","square","round"]; - this.mod_linecap_index += 1; - this.tool.style().strokeLinecap = a[this.mod_linecap_index % a.length]; - dotgrid.guide.refresh(); - } - - this.mod_linejoin_index = 1; - - this.mod_linejoin = function(mod) - { - var a = ["miter","round","bevel"]; - this.mod_linejoin_index += 1; - this.tool.style().strokeLinejoin = a[this.mod_linejoin_index % a.length]; - dotgrid.guide.refresh(); - } - - this.mod_fill = function() - { - this.tool.style().fill = this.tool.style().fill == "none" ? this.tool.style().color : "none"; - dotgrid.guide.refresh(); - } - - // Basics - - this.set_size = function(size = {width:300,height:300},interface = true,scale = 1) - { - size = { width:clamp(parseInt(size.width/15)*15,120,1000),height:clamp(parseInt(size.height/15)*15,120,1000)} - - if(this.tool.settings.size.width == size.width && this.tool.settings.size.height == size.height){ return; } - - console.log(`Setting size: ${size.width}x${size.height}`) - - this.tool.settings.size.width = size.width - this.tool.settings.size.height = size.height - - this.grid_x = size.width/15 - this.grid_y = size.height/15 - - this.grid_width = this.tool.settings.size.width/this.grid_x; - this.grid_height = this.tool.settings.size.height/this.grid_y; - - dotgrid.guide.resize(size); - - this.interface.refresh(); - dotgrid.guide.refresh(); - } - - // Draw - - this.reset = function() - { - this.tool.clear(); - } - - this.clear = function() - { - this.refresh(); - this.history.clear(); - this.tool.reset(); - this.reset(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.drag = function(e) - { - e.preventDefault(); - e.stopPropagation(); - - var file = e.dataTransfer.files[0]; - - if(!file.path || file.path.indexOf(".dot") < 0 && file.path.indexOf(".grid") < 0){ console.log("Dotgrid","Not a dot file"); return; } - - var reader = new FileReader(); - reader.onload = function(e){ - dotgrid.tool.replace(JSON.parse(e.target.result.toString().trim())); - dotgrid.guide.refresh(); - }; - reader.readAsText(file); - } - - this.copy = function(e) - { - dotgrid.guide.refresh(); - - e.clipboardData.setData('text/source', dotgrid.tool.export(dotgrid.tool.layer())); - e.clipboardData.setData('text/plain', dotgrid.tool.path()); - e.clipboardData.setData('text/html', dotgrid.renderer.to_svg()); - e.clipboardData.setData('text/svg+xml', dotgrid.renderer.to_svg()); - - dotgrid.guide.refresh(); - } - - this.cut = function(e) - { - dotgrid.guide.refresh(); - - e.clipboardData.setData('text/plain', dotgrid.tool.export(dotgrid.tool.layer())); - e.clipboardData.setData('text/html', dotgrid.renderer.to_svg()); - e.clipboardData.setData('text/svg+xml', dotgrid.renderer.to_svg()); - - dotgrid.tool.layers[dotgrid.tool.index] = []; - - dotgrid.guide.refresh(); - } - - this.paste = function(e) - { - var data = e.clipboardData.getData("text/source"); - if(is_json(data)){ - data = JSON.parse(data.trim()); - dotgrid.tool.import(data); - } - - dotgrid.guide.refresh(); - } - - // Normalizers - - this.position_in_grid = function(pos) - { - return {x:(window.innerWidth/2) - (this.tool.settings.size.width/2) - pos.x,y:pos.y - (30+10)} - } - - this.position_on_grid = function(pos) - { - pos.y = pos.y - 7.5 - pos.x = pos.x + 7.5 - x = Math.round(pos.x/this.grid_width)*this.grid_width - y = Math.round(pos.y/this.grid_height)*this.grid_height - - x = clamp(x * -1,0,this.tool.settings.size.width) - y = clamp(y,0,this.tool.settings.size.height) - return {x:x*-1,y:y}; - } - - function is_json(text){ try{ JSON.parse(text);return true; } catch(error){ return false; }} - function pos_is_equal(a,b){ return a && b && a.x == b.x && a.y == b.y } - function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } -} - -window.addEventListener('resize', function(e) -{ - dotgrid.refresh() -}, false); - -window.addEventListener('dragover',function(e) -{ - e.stopPropagation(); - e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; -}); - -String.prototype.capitalize = function() -{ - return this.charAt(0).toUpperCase() + this.slice(1).toLowerCase(); -} diff --git a/web/scripts/generator.js b/web/scripts/generator.js deleted file mode 100644 index 8dd1764..0000000 --- a/web/scripts/generator.js +++ /dev/null @@ -1,114 +0,0 @@ -function Generator(layer,style) -{ - this.layer = layer; - this.style = style; - - function operate(layer,offset,scale,mirror = 0,angle = 0) - { - var l = copy(layer) - - for(k1 in l){ - var seg = l[k1]; - for(k2 in seg.vertices){ - if(mirror == 1){ seg.vertices[k2].x = (dotgrid.tool.settings.size.width) - seg.vertices[k2].x } - if(mirror == 2){ seg.vertices[k2].y = (dotgrid.tool.settings.size.height) - seg.vertices[k2].y } - - // Offset - seg.vertices[k2].x += offset.x - seg.vertices[k2].y += offset.y - - // Rotate - var center = {x:(dotgrid.tool.settings.size.width/2)+offset.x,y:(dotgrid.tool.settings.size.height/2)+offset.y} - seg.vertices[k2] = rotate_point(seg.vertices[k2],center,angle) - - // Scale - seg.vertices[k2].x *= scale - seg.vertices[k2].y *= scale - } - } - return l; - } - - this.render = function(prev,segment,mirror = 0) - { - var type = segment.type; - var vertices = segment.vertices; - var html = ''; - var skip = 0; - - for(id in vertices){ - if(skip > 0){ skip -= 1; continue; } - - var vertex = vertices[id] - var next = vertices[parseInt(id)+1] - var after_next = vertices[parseInt(id)+2] - - if(id == 0 && !prev || id == 0 && prev && (prev.x != vertex.x || prev.y != vertex.y)){ - html += `M${vertex.x},${vertex.y} ` - } - - if(type == "line"){ - html += `L${vertex.x},${vertex.y} `; - } - else if(type == "arc_c"){ - var clock = mirror > 0 ? '0,0' : '0,1' - html += next ? `A${Math.abs(next.x - vertex.x)},${Math.abs(next.y - vertex.y)} 0 ${clock} ${next.x},${next.y} ` : ''; - } - else if(type == "arc_r"){ - var clock = mirror > 0 ? '0,1' : '0,0' - html += next ? `A${Math.abs(next.x - vertex.x)},${Math.abs(next.y - vertex.y)} 0 ${clock} ${next.x},${next.y} ` : ''; - } - else if(type == "bezier"){ - html += next && after_next ?`Q${next.x},${next.y} ${after_next.x},${after_next.y} ` : ''; - skip = 1 - } - else{ - console.warn(`unknown type:${type}`) - } - } - - if(segment.type == "close"){ - html += "Z " - } - - return html - } - - this.convert = function(layer,mirror,angle) - { - var s = "" - var prev = null - for(id in layer){ - var seg = layer[id]; - s += `${this.render(prev,seg,mirror)}` - prev = seg.vertices ? seg.vertices[seg.vertices.length-1] : null - } - - return s; - } - - this.toString = function(offset = {x:0,y:0}, scale = 1, mirror = this.style && this.style.mirror_style ? this.style.mirror_style : 0) - { - var s = this.convert(operate(this.layer,offset,scale)) - - if(mirror == 1 || mirror == 2){ - s += this.convert(operate(this.layer,offset,scale,mirror),mirror) - } - - if(mirror == 3){ - s += this.convert(operate(this.layer,offset,scale,mirror,120),mirror) - s += this.convert(operate(this.layer,offset,scale,mirror,240),mirror) - } - if(mirror == 4){ - s += this.convert(operate(this.layer,offset,scale,mirror,72),mirror) - s += this.convert(operate(this.layer,offset,scale,mirror,144),mirror) - s += this.convert(operate(this.layer,offset,scale,mirror,216),mirror) - s += this.convert(operate(this.layer,offset,scale,mirror,288),mirror) - } - - return s - } - - function copy(data){ return data ? JSON.parse(JSON.stringify(data)) : []; } - function rotate_point(point, origin, angle){ angle = angle * Math.PI / 180.0; return { x: (Math.cos(angle) * (point.x-origin.x) - Math.sin(angle) * (point.y-origin.y) + origin.x).toFixed(1), y: (Math.sin(angle) * (point.x-origin.x) + Math.cos(angle) * (point.y-origin.y) + origin.y).toFixed(1) }; } -} \ No newline at end of file diff --git a/web/scripts/guide.js b/web/scripts/guide.js deleted file mode 100644 index 5bfd3bd..0000000 --- a/web/scripts/guide.js +++ /dev/null @@ -1,232 +0,0 @@ -function Guide() -{ - this.el = document.createElement("canvas"); - this.el.id = "guide"; - this.el.width = 640; - this.el.height = 640; - this.el.style.width = "320px"; - this.el.style.height = "320px"; - this.show_extras = true; - - var scale = 2; - - this.start = function() - { - this.clear(); - this.refresh(); - } - - this.refresh = function() - { - this.clear(); - - if(dotgrid.tool.index == 2){ this.draw_markers() ; this.draw_vertices() } - this.draw_path(new Generator(dotgrid.tool.layers[2],dotgrid.tool.styles[2]).toString({x:15,y:15},scale),dotgrid.tool.styles[2]) - if(dotgrid.tool.index == 1){ this.draw_markers() ; this.draw_vertices() } - this.draw_path(new Generator(dotgrid.tool.layers[1],dotgrid.tool.styles[1]).toString({x:15,y:15},scale),dotgrid.tool.styles[1]) - if(dotgrid.tool.index == 0){ this.draw_markers(); this.draw_vertices() } - this.draw_path(new Generator(dotgrid.tool.layers[0],dotgrid.tool.styles[0]).toString({x:15,y:15},scale),dotgrid.tool.styles[0]) - - this.draw_handles() - this.draw_translation(); - this.draw_cursor(); - this.draw_preview(); - } - - this.clear = function() - { - this.el.getContext('2d').clearRect(0, 0, this.el.width*scale, this.el.height*scale); - } - - this.toggle = function() - { - this.show_extras = this.show_extras ? false : true; - this.refresh() - } - - this.resize = function(size) - { - var offset = 30 - this.el.width = (size.width+offset)*scale; - this.el.height = (size.height+offset)*scale; - this.el.style.width = (size.width+offset)+"px"; - this.el.style.height = (size.height+offset)+"px"; - - this.el.style.left = (size.width/2) * -1 - this.refresh(); - } - - this.draw_handles = function() - { - if(!this.show_extras){ return; } - - for(segment_id in dotgrid.tool.layer()){ - var segment = dotgrid.tool.layer()[segment_id]; - for(vertex_id in segment.vertices){ - var vertex = segment.vertices[vertex_id]; - this.draw_handle(vertex); - } - } - } - - this.draw_vertices = function() - { - for(id in dotgrid.tool.vertices){ - this.draw_vertex(dotgrid.tool.vertices[id]); - } - } - - this.draw_markers = function() - { - if(!this.show_extras){ return; } - - for (var x = dotgrid.grid_x; x >= 0; x--) { - for (var y = dotgrid.grid_y; y >= 0; y--) { - var pos_x = parseInt(x * dotgrid.grid_width) + dotgrid.grid_width ; - var pos_y = parseInt(y * dotgrid.grid_height) + dotgrid.grid_height ; - var is_step = x % dotgrid.block_x == 0 && y % dotgrid.block_y == 0; - var radius = is_step ? 2.5 : 1.5; - this.draw_marker({x:pos_x,y:pos_y},radius,is_step); - } - } - } - - this.draw_vertex = function(pos, radius = 5) - { - var ctx = this.el.getContext('2d'); - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.arc((pos.x * scale)+30, (pos.y * scale)+30, radius, 0, 2 * Math.PI, false); - ctx.fillStyle = dotgrid.theme.active.f_med; - ctx.fill(); - ctx.closePath(); - } - - this.draw_handle = function(pos, radius = 6) - { - var ctx = this.el.getContext('2d'); - - ctx.beginPath(); - ctx.setLineDash([0,0]); - ctx.lineWidth = 3; - ctx.lineCap="round"; - ctx.arc(Math.abs(pos.x * -scale)+30, Math.abs(pos.y * scale)+30, radius+3, 0, 2 * Math.PI, false); - ctx.fillStyle = dotgrid.theme.active.f_high; - ctx.fill(); - ctx.strokeStyle = dotgrid.theme.active.f_high; - ctx.stroke(); - ctx.closePath(); - - ctx.beginPath(); - ctx.arc((pos.x * scale)+30, (pos.y * scale)+30, radius, 0, 2 * Math.PI, false); - ctx.fillStyle = dotgrid.theme.active.f_low; - ctx.fill(); - ctx.closePath(); - - ctx.beginPath(); - ctx.arc((pos.x * scale)+30, (pos.y * scale)+30, radius-3, 0, 2 * Math.PI, false); - ctx.fillStyle = dotgrid.theme.active.f_high; - ctx.fill(); - ctx.closePath(); - } - - this.draw_marker = function(pos,radius = 1,step) - { - var ctx = this.el.getContext('2d'); - ctx.beginPath(); - ctx.lineWidth = 2; - ctx.arc(pos.x * scale, pos.y * scale, radius, 0, 2 * Math.PI, false); - ctx.fillStyle = step ? dotgrid.theme.active.f_med : dotgrid.theme.active.f_low; - ctx.fill(); - ctx.closePath(); - } - - this.draw_path = function(path,style) - { - var ctx = this.el.getContext('2d'); - var p = new Path2D(path); - - ctx.setLineDash([0,0]); - - ctx.strokeStyle = style.color; - ctx.lineWidth = style.thickness * scale; - ctx.lineCap = style.strokeLinecap; - ctx.lineJoin = style.strokeLinejoin; - - if(style.fill && style.fill != "none"){ - ctx.fillStyle = style.color - ctx.fill(p); - } - if(style.strokeLineDash){ - ctx.setLineDash(style.strokeLineDash); - } - - ctx.stroke(p); - } - - this.draw_translation = function() - { - if(!dotgrid.cursor.translation){ return; } - // From - var ctx = this.el.getContext('2d'); - var from = dotgrid.cursor.translation.from; - var to = dotgrid.cursor.translation.to; - - if(to.x<=0) { - ctx.beginPath(); - ctx.setLineDash([0,0]); - ctx.moveTo((from.x * -scale)+30,(from.y * scale)+30); - ctx.lineTo((to.x * -scale)+30,(to.y * scale)+30); - ctx.lineCap="round"; - ctx.lineWidth = 5; - ctx.strokeStyle = dotgrid.theme.active.b_inv; - ctx.stroke(); - ctx.closePath(); - } - } - - this.draw_cursor = function(pos = dotgrid.cursor.pos,radius = dotgrid.tool.style().thickness-1) - { - var ctx = this.el.getContext('2d'); - - ctx.beginPath(); - ctx.setLineDash([0,0]); - ctx.lineWidth = 3; - ctx.lineCap="round"; - ctx.arc(Math.abs(pos.x * -scale)+30, Math.abs(pos.y * scale)+30, 3, 0, 2 * Math.PI, false); - ctx.fillStyle = dotgrid.theme.active.f_low; - ctx.fill(); - ctx.closePath(); - - ctx.beginPath(); - ctx.setLineDash([0,0]); - ctx.lineWidth = 3; - ctx.lineCap="round"; - ctx.arc(Math.abs(pos.x * -scale)+30, Math.abs(pos.y * scale)+30, clamp(radius,5,100), 0, 2 * Math.PI, false); - ctx.strokeStyle = dotgrid.theme.active.f_med; - ctx.stroke(); - ctx.closePath(); - } - - this.draw_preview = function() - { - var operation = dotgrid.cursor.operation - - if(!dotgrid.tool.can_cast(operation)){ return; } - if(operation == "close"){ return; } - - var path = new Generator([{vertices:dotgrid.tool.vertices,type:operation}]).toString({x:15,y:15},2) - var style = { - color:dotgrid.theme.active.f_med, - thickness:2, - strokeLinecap:"round", - strokeLinejoin:"round", - strokeLineDash:[5, 15] - } - - this.draw_path(path,style) - } - - function pos_is_equal(a,b){ return a && b && Math.abs(a.x) == Math.abs(b.x) && Math.abs(a.y) == Math.abs(b.y) } - function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } -} diff --git a/web/scripts/interface.js b/web/scripts/interface.js deleted file mode 100644 index a40b153..0000000 --- a/web/scripts/interface.js +++ /dev/null @@ -1,79 +0,0 @@ -function Interface() -{ - this.el = document.createElement("div"); - this.el.id = "interface"; - - this.el.appendChild(this.menu_el = document.createElement("div")); - this.menu_el.id = "menu"; - - this.is_visible = true; - this.zoom = false; - - this.start = function() - { - document.getElementById("app").appendChild(this.el); - this.el.appendChild(dotgrid.picker.el); - - var html = "" - var tools = { - line: ["line","M60,60 L240,240","A"], - arc_c: ["arc clockwise","M60,60 A180,180 0 0,1 240,240","S"], - arc_r: ["arc reverse","M60,60 A180,180 0 0,0 240,240","D"], - bezier: ["bezier","M60,60 Q60,150 150,150 Q240,150 240,240","F"], - close: ["close","M60,60 A180,180 0 0,1 240,240 M60,60 A180,180 0 0,0 240,240","Z"], - - linecap: ["linecap","M60,60 L60,60 L180,180 L240,180 L240,240 L180,240 L180,180","Q"], - linejoin: ["linejoin","M60,60 L120,120 L180,120 M120,180 L180,180 L240,240","W"], - thickness: ["thickness","M120,90 L120,90 L90,120 L180,210 L210,180 Z M105,105 L105,105 L60,60 M195,195 L195,195 L240,240"], - - mirror: ["mirror","M60,60 L60,60 L120,120 M180,180 L180,180 L240,240 M210,90 L210,90 L180,120 M120,180 L120,180 L90,210","E"], - fill: ["fill","M60,60 L60,150 L150,150 L240,150 L240,240 Z","R"], - color: ["color","M150,60 A90,90 0 0,1 240,150 A-90,90 0 0,1 150,240 A-90,-90 0 0,1 60,150 A90,-90 0 0,1 150,60","G"], - } - - for(id in tools){ - var tool = tools[id]; - var shortcut = tool[2]; - html += `${id == "depth" ? `` : ""}${id.capitalize()}${shortcut ? '('+shortcut+')' : ''}` - } - this.menu_el.innerHTML = html - } - - this.prev_operation = null; - - this.refresh = function(force = false) - { - if(this.prev_operation == dotgrid.cursor.operation && force == false){ return; } - - document.getElementById("line").className.baseVal = !dotgrid.tool.can_cast("line") ? "icon inactive" : "icon"; - document.getElementById("arc_c").className.baseVal = !dotgrid.tool.can_cast("arc_c") ? "icon inactive" : "icon"; - document.getElementById("arc_r").className.baseVal = !dotgrid.tool.can_cast("arc_r") ? "icon inactive" : "icon"; - document.getElementById("bezier").className.baseVal = !dotgrid.tool.can_cast("bezier") ? "icon inactive" : "icon"; - document.getElementById("close").className.baseVal = !dotgrid.tool.can_cast("close") ? "icon inactive" : "icon"; - - document.getElementById("thickness").className.baseVal = dotgrid.tool.layer().length < 1 ? "icon inactive" : "icon"; - document.getElementById("linecap").className.baseVal = dotgrid.tool.layer().length < 1 ? "icon inactive" : "icon"; - document.getElementById("linejoin").className.baseVal = dotgrid.tool.layer().length < 1 ? "icon inactive" : "icon"; - document.getElementById("mirror").className.baseVal = dotgrid.tool.layer().length < 1 ? "icon inactive" : "icon"; - document.getElementById("fill").className.baseVal = dotgrid.tool.layer().length < 1 ? "icon inactive" : "icon"; - - document.getElementById("color").children[0].style.fill = dotgrid.tool.style().color; - document.getElementById("color").children[0].style.stroke = dotgrid.tool.style().color; - document.getElementById("color").className.baseVal = "icon"; - - // Mirror - if(dotgrid.tool.style().mirror_style == 0){ document.getElementById("mirror_path").setAttribute("d","M60,60 L60,60 L120,120 M180,180 L180,180 L240,240 M210,90 L210,90 L180,120 M120,180 L120,180 L90,210") } - else if(dotgrid.tool.style().mirror_style == 1){ document.getElementById("mirror_path").setAttribute("d","M60,60 L240,240 M180,120 L210,90 M120,180 L90,210") } - else if(dotgrid.tool.style().mirror_style == 2){ document.getElementById("mirror_path").setAttribute("d","M210,90 L210,90 L90,210 M60,60 L60,60 L120,120 M180,180 L180,180 L240,240") } - else if(dotgrid.tool.style().mirror_style == 3){ document.getElementById("mirror_path").setAttribute("d","M60,60 L60,60 L120,120 L120,120 L180,120 M120,150 L120,150 L180,150 M120,180 L120,180 L180,180 L180,180 L240,240 ") } - else if(dotgrid.tool.style().mirror_style == 4){ document.getElementById("mirror_path").setAttribute("d","M120,120 L120,120 L120,120 L180,120 M120,150 L120,150 L180,150 M120,180 L120,180 L180,180 L180,180 L180,180 L240,240 M120,210 L120,210 L180,210 M120,90 L120,90 L180,90 M60,60 L60,60 L120,120 ") } - - this.prev_operation = dotgrid.cursor.operation; - } - - this.toggle = function() - { - this.is_visible = this.is_visible ? false : true; - this.el.className = this.is_visible ? "visible" : "hidden"; - } -} diff --git a/web/scripts/lib/history.js b/web/scripts/lib/history.js deleted file mode 100644 index a3578cb..0000000 --- a/web/scripts/lib/history.js +++ /dev/null @@ -1,50 +0,0 @@ -function History() -{ - this.index = 0; - this.a = []; - - this.clear = function() - { - this.a = []; - this.index = 0; - } - - this.push = function(data) - { - if(this.index < this.a.length-1){ - this.fork(); - } - this.index = this.a.length; - this.a = this.a.slice(0,this.index); - this.a.push(copy(data)); - - if(this.a.length > 20){ - this.a.shift(); - } - } - - this.fork = function() - { - this.a = this.a.slice(0,this.index+1); - } - - this.pop = function() - { - return this.a.pop(); - } - - this.prev = function() - { - this.index = clamp(this.index-1,0,this.a.length-1); - return copy(this.a[this.index]); - } - - this.next = function() - { - this.index = clamp(this.index+1,0,this.a.length-1); - return copy(this.a[this.index]); - } - - function copy(data){ return data ? JSON.parse(JSON.stringify(data)) : []; } - function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } -} \ No newline at end of file diff --git a/web/scripts/lib/theme.js b/web/scripts/lib/theme.js deleted file mode 100644 index a3b3180..0000000 --- a/web/scripts/lib/theme.js +++ /dev/null @@ -1,86 +0,0 @@ -function Theme() -{ - var app = this; - - this.el = document.createElement("style"); - this.el.type = 'text/css'; - this.default = {meta:{}, data: { background: "#222", f_high: "#fff", f_med: "#777", f_low: "#444", f_inv: "#000", b_high: "#000", b_med: "#affec7", b_low: "#000", b_inv: "#affec7" }} - this.active = this.default; - - this.start = function() - { - this.load(localStorage.theme ? localStorage.theme : this.default, this.default); - window.addEventListener('dragover',this.drag_enter); - window.addEventListener('drop', this.drag); - document.head.appendChild(this.el) - } - - this.load = function(t, fall_back) - { - var theme = is_json(t) ? JSON.parse(t).data : t.data; - - if(!theme || !theme.background){ - if(fall_back) { - theme = fall_back.data; - } else { - return; - } - } - - var css = ` - :root { - --background: ${theme.background}; - --f_high: ${theme.f_high}; - --f_med: ${theme.f_med}; - --f_low: ${theme.f_low}; - --f_inv: ${theme.f_inv}; - --b_high: ${theme.b_high}; - --b_med: ${theme.b_med}; - --b_low: ${theme.b_low}; - --b_inv: ${theme.b_inv}; - }`; - - this.active = theme; - this.el.textContent = css; - localStorage.setItem("theme", JSON.stringify({data: theme})); - } - - this.reset = function() - { - this.load(this.default); - } - - this.drag_enter = function(e) - { - e.stopPropagation(); - e.preventDefault(); - e.dataTransfer.dropEffect = 'copy'; - } - - this.drag = function(e) - { - e.preventDefault(); - e.stopPropagation(); - - var file = e.dataTransfer.files[0]; - - if(!file.name || !file.name.indexOf(".thm") < 0){ console.log("Theme","Not a theme"); return; } - - var reader = new FileReader(); - reader.onload = function(e){ - app.load(e.target.result); - }; - reader.readAsText(file); - } - - function is_json(text) - { - try{ - JSON.parse(text); - return true; - } - catch (error){ - return false; - } - } -} \ No newline at end of file diff --git a/web/scripts/picker.js b/web/scripts/picker.js deleted file mode 100644 index 936ce5c..0000000 --- a/web/scripts/picker.js +++ /dev/null @@ -1,114 +0,0 @@ -function Picker() -{ - this.memory = ""; - this.el = document.createElement("input"); - this.el.id = "picker" - this.original = null; - - this.start = function() - { - this.el.setAttribute("placeholder",`${dotgrid.tool.style().color} ${dotgrid.tool.settings.size.width}x${dotgrid.tool.settings.size.height}`) - - dotgrid.controller.set("picker"); - dotgrid.interface.el.className = "picker" - this.el.focus() - this.original = dotgrid.tool.style().color - this.el.value = "" - } - - this.stop = function() - { - this.cancel(); - dotgrid.controller.set(); - dotgrid.interface.el.className = "" - this.el.blur() - this.el.value = "" - } - - this.validate = function() - { - var parts = this.parse(this.el.value) - - if(parts.color){ this.set_color(parts.color); } - if(parts.size){ this.set_size(parts.size); } - - dotgrid.guide.refresh(); - dotgrid.controller.set(); - dotgrid.interface.el.className = "" - this.el.blur() - this.el.value = "" - } - - this.set_color = function(color) - { - dotgrid.tool.style().color = color; - dotgrid.tool.style().fill = dotgrid.tool.style().fill != "none" ? color : "none"; - } - - this.set_size = function(size) - { - dotgrid.set_size(size); - } - - this.cancel = function() - { - if(!this.original){ return; } - dotgrid.tool.style().color = this.original; - dotgrid.tool.style().fill = dotgrid.tool.style().fill != "none" ? this.original : "none"; - dotgrid.guide.refresh(); - } - - this.update = function() - { - var parts = this.parse(this.el.value) - if(!parts.color){ return; } - - dotgrid.tool.style().color = parts.color; - dotgrid.tool.style().fill = dotgrid.tool.style().fill != "none" ? parts.color : "none"; - dotgrid.guide.refresh(); - } - - this.listen = function(e) - { - if(e.key == "Enter"){ - this.validate(); - e.preventDefault(); - return; - } - - this.update(); - } - - this.parse = function(value) - { - var parts = value.split(" "); - var color = null; - var size = null; - - for(id in parts){ - var part = parts[id]; - if(is_color(part) && !color){ color = part; } - if(is_size(part) && !size){ size = { width:parseInt(part.toLowerCase().split("x")[0]),height:parseInt(part.toLowerCase().split("x")[1]) }; } - } - return {color:color,size:size} - } - - function is_size(val) - { - if(val.toLowerCase().indexOf("x") < 1){ return false; } - - return true - } - - function is_color(val) - { - if(val.length != 4 && val.length != 7){ - return false - } - - var re = /\#[0-9A-Fa-f]/g; - return re.test(val) - } - - this.el.onkeyup = function(event){ dotgrid.picker.listen(event); }; -} \ No newline at end of file diff --git a/web/scripts/renderer.js b/web/scripts/renderer.js deleted file mode 100644 index 7c59cb6..0000000 --- a/web/scripts/renderer.js +++ /dev/null @@ -1,87 +0,0 @@ -function Renderer() -{ - // Create SVG parts - this.svg_el = document.createElementNS("http://www.w3.org/2000/svg", "svg"); - this.svg_el.setAttribute("xmlns","http://www.w3.org/2000/svg"); - this.svg_el.setAttribute("baseProfile","full"); - this.svg_el.setAttribute("version","1.1"); - this.svg_el.style.fill = "none"; - - this.layer_1 = document.createElementNS("http://www.w3.org/2000/svg", "path"); - this.layer_2 = document.createElementNS("http://www.w3.org/2000/svg", "path"); - this.layer_3 = document.createElementNS("http://www.w3.org/2000/svg", "path"); - - this.svg_el.appendChild(this.layer_3); - this.svg_el.appendChild(this.layer_2); - this.svg_el.appendChild(this.layer_1); - - this.refresh = function() - { - this.svg_el.setAttribute("width",dotgrid.tool.settings.size.width+"px"); - this.svg_el.setAttribute("height",dotgrid.tool.settings.size.height+"px"); - this.svg_el.style.width = dotgrid.tool.settings.size.width; - this.svg_el.style.height = dotgrid.tool.settings.size.height; - this.svg_el.style.strokeWidth = dotgrid.tool.style().thickness; - - var styles = dotgrid.tool.styles - var paths = dotgrid.tool.paths() - - this.layer_1.style.strokeWidth = styles[0].thickness; - this.layer_1.style.strokeLinecap = styles[0].strokeLinecap; - this.layer_1.style.strokeLinejoin = styles[0].strokeLinejoin; - this.layer_1.style.stroke = styles[0].color; - this.layer_1.style.fill = styles[0].fill; - this.layer_1.setAttribute("d",paths[0]) - - this.layer_2.style.strokeWidth = styles[1].thickness; - this.layer_2.style.strokeLinecap = styles[1].strokeLinecap; - this.layer_2.style.strokeLinejoin = styles[1].strokeLinejoin; - this.layer_2.style.stroke = styles[1].color; - this.layer_2.style.fill = styles[1].fill; - this.layer_2.setAttribute("d",paths[1]) - - this.layer_3.style.strokeWidth = styles[2].thickness; - this.layer_3.style.strokeLinecap = styles[2].strokeLinecap; - this.layer_3.style.strokeLinejoin = styles[2].strokeLinejoin; - this.layer_3.style.stroke = styles[2].color; - this.layer_3.style.fill = styles[2].fill; - this.layer_3.setAttribute("d",paths[2]) - } - - this.to_png = function(size = dotgrid.tool.settings.size,callback = dotgrid.render) - { - this.refresh(); - - var xml = new XMLSerializer().serializeToString(this.svg_el); - var svg64 = btoa(xml); - var b64Start = 'data:image/svg+xml;base64,'; - var image64 = b64Start + svg64; - var img = new Image; - - var canvas = document.createElement("canvas"); - - canvas.width = size.width; - canvas.height = size.height; - - var ctx = canvas.getContext('2d'); - - img.onload = function(){ - ctx.drawImage(img, 0, 0, size.width, size.height); - var data = canvas.toDataURL('image/png').replace(/^data:image\/\w+;base64,/, ""); - dotgrid.renderer.to_png_ready(callback, new Buffer(data, 'base64'),size) - }; - img.src = image64; - } - - this.to_png_ready = function(callback, buffer, size) - { - callback(null,buffer,size) - } - - this.to_svg = function() - { - this.refresh(); - - return this.svg_el.outerHTML; - } -} \ No newline at end of file diff --git a/web/scripts/tool.js b/web/scripts/tool.js deleted file mode 100644 index 8f779aa..0000000 --- a/web/scripts/tool.js +++ /dev/null @@ -1,286 +0,0 @@ -function Tool() -{ - this.index = 0; - this.settings = { size:{width:300,height:300} } - this.layers = [[],[],[]]; - this.styles = [ - { thickness:10,strokeLinecap:"round",strokeLinejoin:"round",color:"#f00",fill:"none",mirror_style:0 }, - { thickness:10,strokeLinecap:"round",strokeLinejoin:"round",color:"#0f0",fill:"none",mirror_style:0 }, - { thickness:10,strokeLinecap:"round",strokeLinejoin:"round",color:"#00f",fill:"none",mirror_style:0 } - ]; - this.vertices = []; - this.reqs = { line:2,arc_c:2,arc_r:2,bezier:3,close:0 }; - - this.start = function() - { - this.styles[0].color = dotgrid.theme.active.f_high - this.styles[1].color = dotgrid.theme.active.f_med - this.styles[2].color = dotgrid.theme.active.f_low - } - - this.reset = function() - { - this.layers = [[],[],[]]; - this.vertices = []; - this.index = 0; - } - - this.clear = function() - { - this.vertices = []; - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.undo = function() - { - this.layers = dotgrid.history.prev(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.redo = function() - { - this.layers = dotgrid.history.next(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - // I/O - - this.export = function(target = {settings:this.settings,layers:this.layers,styles:this.styles}) - { - return JSON.stringify(copy(target), null, 2); - } - - this.import = function(layer) - { - this.layers[this.index] = this.layers[this.index].concat(layer) - dotgrid.history.push(this.layers); - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.replace = function(dot) - { - if(!dot.layers || dot.layers.length != 3){ console.warn("Incompatible version"); return; } - - if(dot.settings.width && dot.settings.height){ - dot.settings.size = {width:dot.settings.width,height:dot.settings.height} - } - if(this.settings && (this.settings.size.width != dot.settings.size.width || this.settings.size.height != dot.settings.size.height)){ - dotgrid.set_size({width:dot.settings.size.width,height:dot.settings.size.height}) - } - - this.layers = dot.layers; - this.styles = dot.styles; - this.settings = dot.settings; - - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - dotgrid.history.push(this.layers); - } - - // EDIT - - this.remove_segment = function() - { - if(this.vertices.length > 0){ this.clear(); return; } - - this.layer().pop(); - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.remove_segments_at = function(pos) - { - for(segment_id in this.layer()){ - var segment = this.layer()[segment_id]; - for(vertex_id in segment.vertices){ - var vertex = segment.vertices[vertex_id]; - if(Math.abs(pos.x) == Math.abs(vertex.x) && Math.abs(pos.y) == Math.abs(vertex.y)){ - segment.vertices.splice(vertex_id,1) - } - } - if(segment.vertices.length < 2){ - this.layers[this.index].splice(segment_id,1) - } - } - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - this.add_vertex = function(pos) - { - pos = {x:Math.abs(pos.x),y:Math.abs(pos.y)} - this.vertices.push(pos); - dotgrid.interface.refresh(true); - } - - this.vertex_at = function(pos) - { - for(segment_id in this.layer()){ - var segment = this.layer()[segment_id]; - for(vertex_id in segment.vertices){ - var vertex = segment.vertices[vertex_id]; - if(vertex.x == Math.abs(pos.x) && vertex.y == Math.abs(pos.y)){ - return vertex; - } - } - } - return null; - } - - this.cast = function(type) - { - if(!this.layer()){ this.layers[this.index] = []; } - if(!this.can_cast(type)){ console.warn("Cannot cast"); return; } - - var append_target = this.can_append({type:type,vertices:this.vertices.slice()}) - - if(append_target){ - this.layers[this.index][append_target].vertices = this.layers[this.index][append_target].vertices.concat(this.vertices.slice()) - } - else{ - this.layer().push({type:type,vertices:this.vertices.slice()}) - } - - dotgrid.history.push(this.layers); - - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - - console.log(`Casted ${type} -> ${this.layer().length} elements`); - } - - this.can_append = function(content) - { - for(id in this.layer()){ - var stroke = this.layer()[id]; - if(stroke.type != content.type){ continue; } - if(!stroke.vertices){ continue; } - if(!stroke.vertices[stroke.vertices.length-1]){ continue; } - if(stroke.vertices[stroke.vertices.length-1].x != content.vertices[0].x){ continue; } - if(stroke.vertices[stroke.vertices.length-1].y != content.vertices[0].y){ continue; } - return id; - } - return false; - } - - this.can_cast = function(type) - { - if(!type){ return false; } - // Cannot cast close twice - if(type == "close"){ - var prev = this.layer()[this.layer().length-1]; - if(!prev || prev.type == "close"){ - return false; - } - } - if(type == "bezier"){ - if(this.vertices.length != 3 && this.vertices.length != 5 && this.vertices.length != 7 && this.vertices.length != 9){ - return false; - } - } - return this.vertices.length >= this.reqs[type]; - } - - this.paths = function() - { - var l1 = new Generator(dotgrid.tool.layers[0],dotgrid.tool.styles[0]).toString({x:0,y:0},1) - var l2 = new Generator(dotgrid.tool.layers[1],dotgrid.tool.styles[1]).toString({x:0,y:0},1) - var l3 = new Generator(dotgrid.tool.layers[2],dotgrid.tool.styles[2]).toString({x:0,y:0},1) - - return [l1,l2,l3] - } - - this.path = function() - { - return new Generator(dotgrid.tool.layer(),dotgrid.tool.style()).toString({x:0,y:0},1) - } - - this.translate = function(a,b) - { - for(segment_id in this.layer()){ - var segment = this.layer()[segment_id]; - for(vertex_id in segment.vertices){ - var vertex = segment.vertices[vertex_id]; - if(vertex.x == Math.abs(a.x) && vertex.y == Math.abs(a.y)){ - segment.vertices[vertex_id] = {x:Math.abs(b.x),y:Math.abs(b.y)}; - } - } - } - dotgrid.history.push(this.layers); - this.clear(); - dotgrid.guide.refresh(); - } - - this.translate_multi = function(a,b) - { - var offset = {x:a.x - b.x,y:a.y - b.y} - - for(segment_id in this.layer()){ - var segment = this.layer()[segment_id]; - for(vertex_id in segment.vertices){ - var vertex = segment.vertices[vertex_id]; - segment.vertices[vertex_id] = {x:vertex.x+offset.x,y:vertex.y-offset.y}; - } - } - dotgrid.history.push(this.layers); - this.clear(); - dotgrid.guide.refresh(); - } - - // Toggles - - this.toggle_mirror = function() - { - this.style().mirror_style = this.style().mirror_style > 3 ? 0 : this.style().mirror_style+1; - - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - } - - // Style - - this.style = function() - { - if(!this.styles[this.index]){ - this.styles[this.index] = []; - } - return this.styles[this.index]; - } - - // Layers - - this.layer = function() - { - if(!this.layers[this.index]){ - this.layers[this.index] = []; - } - return this.layers[this.index]; - } - - this.select_layer = function(id) - { - this.index = clamp(id,0,2); - this.clear(); - dotgrid.guide.refresh(); - dotgrid.interface.refresh(true); - console.log(`layer:${this.index}`) - } - - this.select_next_layer = function() - { - this.index = this.index >= 2 ? 0 : this.index+1 - this.select_layer(this.index); - } - - function copy(data){ return data ? JSON.parse(JSON.stringify(data)) : []; } - function clamp(v, min, max) { return v < min ? min : v > max ? max : v; } -}