From 5cefa27f05b676878b4e950d18517cf3f3385eb1 Mon Sep 17 00:00:00 2001 From: sander Date: Thu, 3 Dec 2015 04:34:54 -0500 Subject: [PATCH] added onion skinning --- index.css | 0 js/ColorPickerView.js | 31 ++++++++ js/ControlsView.js | 41 ++++++++++ js/Drawpad.js | 10 ++- js/DrawpadView.js | 10 ++- js/Frames.js | 10 +++ js/Line.js | 2 - js/State.js | 25 ++++++ js/app.js | 12 ++- less/index.less | 56 ++++++++++++++ less/index.styl | 45 +++++++++++ less/main.less | 23 +++++- npm-debug.log | 171 ++++++++++++++++++++++++++++++++++++------ package.json | 1 + public/img/play.gif | Bin 0 -> 18933 bytes 15 files changed, 408 insertions(+), 29 deletions(-) create mode 100644 index.css create mode 100644 js/ColorPickerView.js create mode 100644 js/ControlsView.js create mode 100644 js/Frames.js create mode 100644 js/State.js create mode 100644 less/index.less create mode 100644 less/index.styl create mode 100644 public/img/play.gif diff --git a/index.css b/index.css new file mode 100644 index 0000000..e69de29 diff --git a/js/ColorPickerView.js b/js/ColorPickerView.js new file mode 100644 index 0000000..faf894b --- /dev/null +++ b/js/ColorPickerView.js @@ -0,0 +1,31 @@ +'use strict'; + +import React from "react"; +import ColorPicker from 'react-color-picker'; +import Drawpad from './Drawpad' +import State from './State'; + +let state=State.instance; +state.strokeColor="#000000"; +let COLOR=null; + +class ColorPickerView extends React.Component{ + constructor(props) { + super(props); + } + + onDrag(color, c){ + COLOR = color; + state.strokeColor=color; + } + + render(){ + return
+
+ {COLOR} +
+
; + } +} + +export default ColorPickerView \ No newline at end of file diff --git a/js/ControlsView.js b/js/ControlsView.js new file mode 100644 index 0000000..d2a5fe3 --- /dev/null +++ b/js/ControlsView.js @@ -0,0 +1,41 @@ +'use strict'; + +import d3 from "d3"; +import React from "react"; + +/** + */ +class ControlsView extends React.Component{ + + constructor(props) { + super(props); + } + + next(){ + let drawpad=d3.select("#drawpad"); + let drawpadMin1=d3.select("#drawpadMin1"); + let drawpadMin2=d3.select("#drawpadMin2"); + + if (drawpadMin1.select("path")[0][0]!= undefined){ + drawpadMin2.selectAll("path").remove(); + drawpadMin2 + .append("path") + .attr("d", function(){return drawpadMin1.select("path").attr("d");}) + .attr("style", function(){return drawpadMin1.select("path").attr("style");}); + } + drawpadMin1.selectAll("path").remove(); + drawpadMin1 + .append("path") + .attr("d", function(){return drawpad.select("path").attr("d");}) + .attr("style", function(){return drawpad.select("path").attr("style");}); + drawpad.selectAll("path").remove(); + } + + render() { + return
; + } + +} + + +export default ControlsView \ No newline at end of file diff --git a/js/Drawpad.js b/js/Drawpad.js index 0ed137c..b21fcdb 100644 --- a/js/Drawpad.js +++ b/js/Drawpad.js @@ -1,8 +1,16 @@ 'use strict'; +/* + * Behaviour for the drawpad component. The reason this is separate from the view is that a React component class behaves very differently from a regular ES6 class. + * Ie. you don't have 'this'. + */ + import Point from "./Point"; import simplify from "simplify-js"; import d3 from "d3"; +import State from './State'; + +let state=State.instance; class Drawpad{ constructor() { @@ -19,7 +27,7 @@ class Drawpad{ //add starting point to svg-path this.pathD="M"+newPoint.x+","+newPoint.y;//path Move operation this.path=d3.select("#drawpad").append("path").attr("d", this.pathD); - + this.path.attr("style", "stroke:" + state.strokeColor); //add new point to array of points, used to reduce the number of points after finishing the line this.points=[]; this.points.push(newPoint); diff --git a/js/DrawpadView.js b/js/DrawpadView.js index 6019a67..dddd91e 100644 --- a/js/DrawpadView.js +++ b/js/DrawpadView.js @@ -1,12 +1,17 @@ require('../less/main.less'); +require('../less/index.less'); 'use strict'; + import React from "react"; import Drawpad from './Drawpad'; let drawpad=new Drawpad(); +/** + * All methods delegate to the Drawpad class. + */ class DrawpadView extends React.Component{ constructor(props) { @@ -27,7 +32,10 @@ class DrawpadView extends React.Component{ render() { - return ; + return
+ + +
; } } diff --git a/js/Frames.js b/js/Frames.js new file mode 100644 index 0000000..46561e6 --- /dev/null +++ b/js/Frames.js @@ -0,0 +1,10 @@ +'use strict' + +class Frames { + + static createSvg(frame) { + + } +} + +export default Frames \ No newline at end of file diff --git a/js/Line.js b/js/Line.js index 7172fea..0e9a28a 100644 --- a/js/Line.js +++ b/js/Line.js @@ -7,8 +7,6 @@ class Line{ this.start=startPoint; this.end=endPoint; } - - } export default Line; \ No newline at end of file diff --git a/js/State.js b/js/State.js new file mode 100644 index 0000000..8ccf7c5 --- /dev/null +++ b/js/State.js @@ -0,0 +1,25 @@ +'use strict'; + +/* + * Keeps global state properties like frames, current strokeColor etc. + */ + +let singleton = Symbol(); +let singletonEnforcer = Symbol(); + +class State { + + constructor(enforcer, props) { + if(enforcer != singletonEnforcer) throw "Cannot construct singleton"; + this.props=props; + } + + static get instance() { + if(!this[singleton]) { + this[singleton] = new State(singletonEnforcer); + } + return this[singleton]; + } +} + +export default State \ No newline at end of file diff --git a/js/app.js b/js/app.js index 8e89130..00fe7cc 100644 --- a/js/app.js +++ b/js/app.js @@ -1,4 +1,14 @@ +/* + * The main app component + */ + import React from 'react'; import DrawpadView from './DrawpadView'; +import ColorPickerView from './ColorPickerView'; +import ControlsView from './ControlsView'; +import State from './State'; -React.render(, document.getElementById('app')); +var state=State.instance; +state.frames=[]; + +React.render(
, document.getElementById('app')); diff --git a/less/index.less b/less/index.less new file mode 100644 index 0000000..74b3336 --- /dev/null +++ b/less/index.less @@ -0,0 +1,56 @@ +.color-picker, +.color-picker *, +.cp-saturation-spectrum, +.cp-saturation-spectrum *, +.cp-hue-spectrum, +.cp-hue-spectrum * { + box-sizing: border-box; +} +.cp-saturation-spectrum, +.cp-hue-spectrum { + position: relative; + display: inline-block; +} +.cp-saturation-white, +.cp-saturation-black { + position: relative; + width: 100%; + height: 100%; +} +.cp-saturation-white { + background: linear-gradient(to right, #fff, rgba(204,154,129,0)); +} +.cp-saturation-black { + background: linear-gradient(to top, #000, rgba(204,154,129,0)); +} +.cp-saturation-spectrum { + cursor: pointer; +} +.cp-saturation-spectrum .cp-saturation-drag { + display: none; + border: 1px solid #fff; + border-radius: 10px; + position: absolute; + top: 0px; + left: 0px; +} +.cp-saturation-spectrum .cp-saturation-drag .inner { + position: relative; + width: 100%; + height: 100%; + border: 1px solid #000; + border-radius: 10px; +} +.cp-hue-spectrum { + background: linear-gradient(to bottom, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%); + cursor: pointer; +} +.cp-hue-spectrum .cp-hue-drag { + display: none; + position: absolute; + top: 0px; + left: 0px; + width: 100%; + border: 1px solid #000; +} + diff --git a/less/index.styl b/less/index.styl new file mode 100644 index 0000000..c62a630 --- /dev/null +++ b/less/index.styl @@ -0,0 +1,45 @@ +.color-picker +.color-picker * +.cp-saturation-spectrum +.cp-saturation-spectrum * +.cp-hue-spectrum +.cp-hue-spectrum * + box-sizing border-box +.cp-saturation-spectrum +.cp-hue-spectrum + position relative + display inline-block +.cp-saturation-white +.cp-saturation-black + position relative + width 100% + height 100% +.cp-saturation-white + background linear-gradient(to right, #fff, rgba(204,154,129,0)) +.cp-saturation-black + background linear-gradient(to top, #000, rgba(204,154,129,0)) +.cp-saturation-spectrum + cursor pointer + .cp-saturation-drag + display none + border 1px solid white + border-radius 10px + position absolute + top 0px + left 0px + .inner + position relative + width 100% + height 100% + border 1px solid black + border-radius 10px +.cp-hue-spectrum + background linear-gradient(to bottom, #f00 0%, #ff0 17%, #0f0 33%, #0ff 50%, #00f 67%, #f0f 83%, #f00 100%) + cursor pointer + .cp-hue-drag + display none + position absolute + top 0px + left 0px + width 100% + border 1px solid black \ No newline at end of file diff --git a/less/main.less b/less/main.less index 3b97083..4c91a21 100644 --- a/less/main.less +++ b/less/main.less @@ -4,10 +4,27 @@ svg{ background-color: #808080; + width: 700px; + height: 700px; + position: absolute; + top: 0px; + left: 0px; + opacity: .7; } path{ - stroke:#660000; - fill:none; + fill:#668800; stroke-width:5; -} \ No newline at end of file +} + +#colorpicker{ + position: absolute; + top: 0px; + left: 720px; +} + +#nextFrame{ + position: absolute; + top: 310px; + left: 720px; +} diff --git a/npm-debug.log b/npm-debug.log index 44f3984..9114af9 100644 --- a/npm-debug.log +++ b/npm-debug.log @@ -1,24 +1,153 @@ 0 info it worked if it ends with ok -1 verbose cli [ '/usr/bin/node', -1 verbose cli '/usr/bin/npm', -1 verbose cli 'install', -1 verbose cli 'simplify-js', -1 verbose cli '--save' ] +1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'install', '-g', 'styl' ] 2 info using npm@1.4.28 3 info using node@v0.10.40 -4 error Failed to parse json -4 error Unexpected token } -5 error File: /workspaces/electron/electron-react-tutorial/package.json -6 error Failed to parse package.json data. -6 error package.json must be actual JSON, not just JavaScript. -6 error -6 error This is not a bug in npm. -6 error Tell the package author to fix their package.json file. JSON.parse -7 error System Linux 3.10.0-229.20.1.el7.x86_64 -8 error command "/usr/bin/node" "/usr/bin/npm" "install" "simplify-js" "--save" -9 error cwd /workspaces/electron/electron-react-tutorial -10 error node -v v0.10.40 -11 error npm -v 1.4.28 -12 error file /workspaces/electron/electron-react-tutorial/package.json -13 error code EJSONPARSE -14 verbose exit [ 1, true ] +4 verbose cache add [ 'styl', null ] +5 verbose cache add name=undefined spec="styl" args=["styl",null] +6 verbose parsed url { protocol: null, +6 verbose parsed url slashes: null, +6 verbose parsed url auth: null, +6 verbose parsed url host: null, +6 verbose parsed url port: null, +6 verbose parsed url hostname: null, +6 verbose parsed url hash: null, +6 verbose parsed url search: null, +6 verbose parsed url query: null, +6 verbose parsed url pathname: 'styl', +6 verbose parsed url path: 'styl', +6 verbose parsed url href: 'styl' } +7 silly lockFile c0855232-styl styl +8 verbose lock styl /home/sander/.npm/c0855232-styl.lock +9 silly lockFile c0855232-styl styl +10 silly lockFile c0855232-styl styl +11 verbose addNamed [ 'styl', '' ] +12 verbose addNamed [ null, '*' ] +13 silly lockFile d9be92f8-styl styl@ +14 verbose lock styl@ /home/sander/.npm/d9be92f8-styl.lock +15 silly addNameRange { name: 'styl', range: '*', hasData: false } +16 verbose request where is /styl +17 verbose request registry https://registry.npmjs.org/ +18 verbose request id 7af8d1e5f25a0814 +19 verbose url raw /styl +20 verbose url resolving [ 'https://registry.npmjs.org/', './styl' ] +21 verbose url resolved https://registry.npmjs.org/styl +22 verbose request where is https://registry.npmjs.org/styl +23 info trying registry request attempt 1 at 14:55:17 +24 http GET https://registry.npmjs.org/styl +25 http 200 https://registry.npmjs.org/styl +26 silly registry.get cb [ 200, +26 silly registry.get { server: 'CouchDB/1.5.0 (Erlang OTP/R16B03)', +26 silly registry.get etag: '"9QC0I6Q57BCJZBWIPWWPW18CI"', +26 silly registry.get 'content-type': 'application/json', +26 silly registry.get 'cache-control': 'max-age=60', +26 silly registry.get 'content-length': '14506', +26 silly registry.get 'accept-ranges': 'bytes', +26 silly registry.get date: 'Sat, 21 Nov 2015 19:55:18 GMT', +26 silly registry.get via: '1.1 varnish', +26 silly registry.get age: '0', +26 silly registry.get connection: 'keep-alive', +26 silly registry.get 'x-served-by': 'cache-ams4136-AMS', +26 silly registry.get 'x-cache': 'HIT', +26 silly registry.get 'x-cache-hits': '1', +26 silly registry.get 'x-timer': 'S1448135717.917441,VS0,VE748', +26 silly registry.get vary: 'Accept' } ] +27 silly addNameRange number 2 { name: 'styl', range: '*', hasData: true } +28 silly addNameRange versions [ 'styl', +28 silly addNameRange [ '0.0.1', +28 silly addNameRange '0.1.0', +28 silly addNameRange '0.2.0', +28 silly addNameRange '0.2.1', +28 silly addNameRange '0.2.2', +28 silly addNameRange '0.2.3', +28 silly addNameRange '0.2.4', +28 silly addNameRange '0.2.5', +28 silly addNameRange '0.2.6', +28 silly addNameRange '0.2.7', +28 silly addNameRange '0.2.8', +28 silly addNameRange '0.2.9' ] ] +29 verbose addNamed [ 'styl', '0.2.9' ] +30 verbose addNamed [ '0.2.9', '0.2.9' ] +31 silly lockFile 71e81ccf-styl-0-2-9 styl@0.2.9 +32 verbose lock styl@0.2.9 /home/sander/.npm/71e81ccf-styl-0-2-9.lock +33 silly lockFile e76bf2a4-ry-npmjs-org-styl-styl-0-2-9-tgz https://registry.npmjs.org/styl/-/styl-0.2.9.tgz +34 verbose lock https://registry.npmjs.org/styl/-/styl-0.2.9.tgz /home/sander/.npm/e76bf2a4-ry-npmjs-org-styl-styl-0-2-9-tgz.lock +35 verbose addRemoteTarball [ 'https://registry.npmjs.org/styl/-/styl-0.2.9.tgz', +35 verbose addRemoteTarball '392a1acecf126e7ed219ec9468df8ea830a9d2d7' ] +36 info retry fetch attempt 1 at 14:55:18 +37 verbose fetch to= /tmp/npm-6371-snCn9fcA/registry.npmjs.org/styl/-/styl-0.2.9.tgz +38 http GET https://registry.npmjs.org/styl/-/styl-0.2.9.tgz +39 http 200 https://registry.npmjs.org/styl/-/styl-0.2.9.tgz +40 silly lockFile e76bf2a4-ry-npmjs-org-styl-styl-0-2-9-tgz https://registry.npmjs.org/styl/-/styl-0.2.9.tgz +41 silly lockFile e76bf2a4-ry-npmjs-org-styl-styl-0-2-9-tgz https://registry.npmjs.org/styl/-/styl-0.2.9.tgz +42 silly lockFile 71e81ccf-styl-0-2-9 styl@0.2.9 +43 silly lockFile 71e81ccf-styl-0-2-9 styl@0.2.9 +44 silly lockFile d9be92f8-styl styl@ +45 silly lockFile d9be92f8-styl styl@ +46 silly resolved [ { name: 'styl', +46 silly resolved description: 'CSS pre-processor built on Rework', +46 silly resolved version: '0.2.9', +46 silly resolved keywords: [ 'css', 'stylus', 'preprocessor', 'style' ], +46 silly resolved dependencies: +46 silly resolved { 'css-whitespace': '1.1.1', +46 silly resolved debug: '*', +46 silly resolved rework: '0.18.3', +46 silly resolved commander: '1.1.1', +46 silly resolved stdin: '0.0.1', +46 silly resolved 'rework-mixins': '1.1.1' }, +46 silly resolved devDependencies: { should: '~1.2.2', mocha: '~1.9.0' }, +46 silly resolved bin: { styl: 'bin/styl' }, +46 silly resolved repository: { type: 'git', url: 'https://github.com/tj/styl.git' }, +46 silly resolved gitHead: 'b987d4b1a2437bed398c34b2e62845468f638431', +46 silly resolved bugs: { url: 'https://github.com/tj/styl/issues' }, +46 silly resolved homepage: 'https://github.com/tj/styl', +46 silly resolved _id: 'styl@0.2.9', +46 silly resolved scripts: {}, +46 silly resolved _shasum: '392a1acecf126e7ed219ec9468df8ea830a9d2d7', +46 silly resolved _from: 'styl@', +46 silly resolved _npmVersion: '2.5.1', +46 silly resolved _nodeVersion: '0.12.0', +46 silly resolved _npmUser: { name: 'mattmueller', email: 'mattmuelle@gmail.com' }, +46 silly resolved maintainers: [ [Object], [Object] ], +46 silly resolved dist: +46 silly resolved { shasum: '392a1acecf126e7ed219ec9468df8ea830a9d2d7', +46 silly resolved tarball: 'http://registry.npmjs.org/styl/-/styl-0.2.9.tgz' }, +46 silly resolved directories: {}, +46 silly resolved _resolved: 'https://registry.npmjs.org/styl/-/styl-0.2.9.tgz' } ] +47 info install styl@0.2.9 into /usr/lib +48 info installOne styl@0.2.9 +49 verbose lib/node_modules/styl unbuild +50 verbose tar unpack /home/sander/.npm/styl/0.2.9/package.tgz +51 silly lockFile 5b1849c9-tar-usr-lib-node-modules-styl tar:///usr/lib/node_modules/styl +52 verbose lock tar:///usr/lib/node_modules/styl /home/sander/.npm/5b1849c9-tar-usr-lib-node-modules-styl.lock +53 silly lockFile 1a24ce1f-ander-npm-styl-0-2-9-package-tgz tar:///home/sander/.npm/styl/0.2.9/package.tgz +54 verbose lock tar:///home/sander/.npm/styl/0.2.9/package.tgz /home/sander/.npm/1a24ce1f-ander-npm-styl-0-2-9-package-tgz.lock +55 silly gunzTarPerm modes [ '775', '664' ] +56 error Error: EACCES, mkdir '/usr/lib/node_modules/styl' +56 error { [Error: EACCES, mkdir '/usr/lib/node_modules/styl'] +56 error errno: 3, +56 error code: 'EACCES', +56 error path: '/usr/lib/node_modules/styl', +56 error fstream_type: 'Directory', +56 error fstream_path: '/usr/lib/node_modules/styl', +56 error fstream_class: 'DirWriter', +56 error fstream_stack: +56 error [ '/usr/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23', +56 error '/usr/lib/node_modules/npm/node_modules/mkdirp/index.js:46:53', +56 error 'Object.oncomplete (fs.js:108:15)' ] } +57 error Please try running this command again as root/Administrator. +58 error System Linux 3.10.0-229.20.1.el7.x86_64 +59 error command "/usr/bin/node" "/usr/bin/npm" "install" "-g" "styl" +60 error cwd /workspaces/electron/drawpad +61 error node -v v0.10.40 +62 error npm -v 1.4.28 +63 error path /usr/lib/node_modules/styl +64 error fstream_path /usr/lib/node_modules/styl +65 error fstream_type Directory +66 error fstream_class DirWriter +67 error code EACCES +68 error errno 3 +69 error stack Error: EACCES, mkdir '/usr/lib/node_modules/styl' +70 error fstream_stack /usr/lib/node_modules/npm/node_modules/fstream/lib/dir-writer.js:36:23 +70 error fstream_stack /usr/lib/node_modules/npm/node_modules/mkdirp/index.js:46:53 +70 error fstream_stack Object.oncomplete (fs.js:108:15) +71 verbose exit [ 3, true ] diff --git a/package.json b/package.json index 7dc0c4f..294ffd9 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "d3": "^3.5.9", "electron-prebuilt": "^0.28.3", "react": "^0.13.3", + "react-color-picker": "^2.1.9", "simplify-js": "^1.2.1" } } diff --git a/public/img/play.gif b/public/img/play.gif new file mode 100644 index 0000000000000000000000000000000000000000..febc4c8790ae9eb51e1edeeb35a3c1eeb8de7536 GIT binary patch literal 18933 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 F06YB{MC1Sf literal 0 HcmV?d00001