|
|
- function Editor(stage,xocol,doc,colors,activity,env,datastore,forcereload){
- if (forcereload === undefined) forcereload=false;
- this.radius = 22.5;
- this.scale = stage.canvas.width/1200;
- this.cxy = [stage.canvas.width/2,stage.canvas.height/2];
- this.xy = [stage.canvas.width/2+(120*this.scale),stage.canvas.height/2-(this.radius*this.scale)];
- this.dotsizeplus = this.radius*3*this.scale;
- this.dmin = 0;
- this.dmax = stage.canvas.height-(this.dotsizeplus/2.2);
- this.zones = [];
- this.dots = [];
- this.stage = stage;
- this.xo = null;
- this.width = stage.canvas.width;
- this.height = stage.canvas.height;
- this.env = env;
- this.ds = datastore;
-
- this.hexToRgb = function(hex) {
- var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
- return result ? {
- r: parseInt(result[1], 16),
- g: parseInt(result[2], 16),
- b: parseInt(result[3], 16)
- } : null;
- }
-
- this.contrast = function(rgb1, rgb2){
- var v1 = rgb1.r * 0.3 + rgb1.g * 0.6 + rgb1.b * 0.1;
- var v2 = rgb2.r * 0.3 + rgb2.g * 0.6 + rgb2.b * 0.1;
- return Math.abs(v2 - v1);
- }
-
- this.hue = function(rgb){
- var a = 0.5 * (2.0 * rgb.r - rgb.g - rgb.b);
- var b = 0.87 * (rgb.g - rgb.b);
- var h = Math.atan2(b, a);
- return h * 180 / Math.PI;
- }
-
-
- this.deltahue = function(rgb1, rgb2){
- h1 = this.hue(rgb1);
- h2 = this.hue(rgb2);
- return Math.abs(h2 - h1);
- }
-
- this.zone = function(dv, dh){
- var zone;
- if (dh < 75){
- zone = 0;
- }
- else if (dh > 150){
- zone = 1;
- } else{
- zone = 2;
- }
- if (dv > 48){
- zone += 1;
- }
- return zone;
- }
-
- this.calczones = function(self){
- for (var col in xocol.colors){
- rgb1 = this.hexToRgb(xocol.colors[col].stroke);
- rgb2 = this.hexToRgb(xocol.colors[col].fill);
- dv = this.contrast(rgb1, rgb2);
- dh = this.deltahue(rgb1, rgb2);
- this.zones.push(this.zone(dv, dh));
- }
- }
-
- this.nextdotposition = function(){
- var dx = this.xy[0]-this.cxy[0];
- var dy = this.xy[1]-this.cxy[1];
- var r = Math.sqrt(dx*dx+dy*dy);
- var c = 2*r*Math.PI;
- var a = Math.atan2(dy, dx);
- var da = (this.dotsizeplus/c)*2*Math.PI;
- a += da;
- r += this.dotsizeplus/(c/this.dotsizeplus);
- this.xy[0] = r*Math.cos(a)+this.cxy[0]
- this.xy[1] = r*Math.sin(a)+this.cxy[1]
- if (this.xy[1]<this.dmin||this.xy[1]>this.dmax){
- this.nextdotposition();
- }
- }
-
- this.saveColours = function(){
- var jsonparsed = this.ds.localStorage.getValue('sugar_settings');
- jsonparsed.colorvalue.stroke = this.xo.stroke;
- jsonparsed.colorvalue.fill = this.xo.fill;
- jsonparsed.color = this.xo.colnumber;
- this.ds.localStorage.setValue('sugar_settings', jsonparsed);
- if (jsonparsed.networkId != null && jsonparsed.server && jsonparsed.token) {
- // HACK: When connected to the server, should call the /api/users to update color on the server
- var server = jsonparsed.server.url;
- if (server == null) {
- if (document.location.protocol.substr(0,4) == "http") {
- var url = window.location.href;
- server = url.substring(0, url.indexOf('/activities'));;
- } else {
- server = "http://localhost";
- }
- }
- server = server + "/api/v1/users/" + jsonparsed.networkId;
- var request = new XMLHttpRequest();
- request.open("PUT",server,true);
- request.setRequestHeader("Content-type","application/x-www-form-urlencoded");
- request.setRequestHeader("x-key",jsonparsed.token.x_key);
- request.setRequestHeader("x-access-token",jsonparsed.token.access_token);
- request.send("user="+encodeURI(JSON.stringify({color: {stroke: this.xo.stroke, fill: this.xo.fill}})));
- }
- }
-
- this.stop = function(){
- var arr = [];
- var temparr = {};
- temparr.x = this.width;
- temparr.y = this.height;
- arr.push(temparr);
- for (var i in this.dots){
- temparr = {};
- temparr.fill = this.dots[i].innercol;
- temparr.stroke = this.dots[i].outercol;
- temparr.x = this.dots[i].circle.x;
- temparr.y = this.dots[i].circle.y;
- temparr.num = this.dots[i].number;
- arr.push(temparr);
- }
-
- var js = JSON.stringify(arr);
- activity.getDatastoreObject().setDataAsText(js);
- activity.getDatastoreObject().save(function (error) {
- if (error === null) {
- console.log("write done.");
- }
- else {
- console.log("write failed.");
- }
- });
- }
-
- this.init = function(){
- if (forcereload==true){
- this.init_getsettings(false,[]);
- } else {
- activity.getDatastoreObject().getMetadata(this.init_canaccessdatastore.bind(this));
- }
- }
-
- this.init_canaccessdatastore = function(error,mdata){
- var d = new Date().getTime();
- if (Math.abs(d-mdata.creation_time)<2000){
- this.init_getsettings(false,[]);
- } else {
- activity.getDatastoreObject().loadAsText(this.init_getdatastore.bind(this));
- }
- }
-
- this.init_getdatastore = function(error,metadata,data){
- if (error==null&&data!=null){
- data = JSON.parse(data);
- this.init_getsettings(true,data);
- } else {
- this.init_getsettings(false,[]);
- }
- }
-
- this.init_getsettings = function(isdata,data) {
- this.ds.localStorage.load(function() {
- var preferences = this.ds.localStorage.getValue('sugar_settings');
- this.init_activity(isdata,data,preferences);
- }.bind(this));
- }
-
- this.init_activity = function(isdata,data,settings){
- this.dots = [];
- this.calczones();
-
- var cnum = settings;
- var xo = new XOMan(colors.fill,colors.stroke,this,cnum.color);
- xo.init();
- this.xo = xo;
-
- if (isdata==false) {
- for (var z = 0; z<4; z++){
- for (var i in xocol.colors){
- if (this.zones[i]==z){
- var c = new ColourCircle(xocol.colors[i].fill,xocol.colors[i].stroke,this.xy[0]+15,this.xy[1],stage,this.xo,i);
- c.init();
- this.dots.push(c);
- this.nextdotposition();
- }
- }
- }
- } else {
- var scalex = this.width/data[0].x;
- var scaley = this.height/data[0].y;
- for (var i = 1; i<data.length; i++){
- var c = new ColourCircle(data[i].fill,data[i].stroke,data[i].x*scalex,data[i].y*scaley,stage,this.xo,data[i].num);
- c.init();
- this.dots.push(c);
- }
- }
- }
- }
|