From 7152b4c5e9d37f77d7a8e06fff456eb6a596347b Mon Sep 17 00:00:00 2001 From: Tilman Vatteroth <tilman.vatteroth@udo.edu> Date: Mon, 12 Mar 2018 17:39:16 +0100 Subject: [PATCH] merge clockclass in script --- panels/clock/script.js | 420 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 419 insertions(+), 1 deletion(-) diff --git a/panels/clock/script.js b/panels/clock/script.js index ff61b99..37f20be 100755 --- a/panels/clock/script.js +++ b/panels/clock/script.js @@ -1,3 +1,421 @@ +function Clock(panel, config) { + this.canvas = panel[0].querySelector("canvas"); + this.pane = this.canvas.getContext("2d"); + this.bgCanvas = document.createElement("canvas"); + this.bgPane = this.bgCanvas.getContext("2d"); + + this.monthNames = ["jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"]; + this.dayNames = ["so","mo","di","mi","do","fr","sa"]; + + this.data = { + panel: { + widht: 0, + height: 0 + }, + bounds: { + outer: { + x: 0, + y: 0, + widht: 0, + height: 0 + }, + inner: { + x: 0, + y: 0, + widht: 0, + height: 0 + } + }, + colors: { + background: "#000", + foreground: "#fff", + shaddow: "#333" + }, + fonts: { + fat: "time-fat", + medium: "time-medium" + }, + aClock: { + bgImage: "background.svg", + radius: 0, + center: { + x: 0, + y: 0 + }, + bounds: { + outer: { + x: 0, + y: 0, + widht: 0, + height: 0 + }, + inner: { + x: 0, + y: 0, + widht: 0, + height: 0 + } + } + }, + dClock: { + fonts: { + fat: "", + big: "", + small: "" + }, + bounds: { + outer: { + x: 0, + y: 0, + widht: 0, + height: 0 + }, + inner: { + x: 0, + y: 0, + widht: 0, + height: 0 + } + }, + positions: { + hour : { + x: 0, + y: 0, + }, + pulse : { + x: 0, + y: 0, + }, + minute : { + x: 0, + y: 0, + }, + second : { + x: 0, + y: 0, + } + } + }, + dDate: { + font: "", + bounds: { + outer: { + x: 0, + y: 0, + widht: 0, + height: 0 + }, + inner: { + x: 0, + y: 0, + widht: 0, + height: 0 + } + }, + position: { + x: 0, + y: 0 + } + } + }; + + this.resize = function(width, height) { + this.data.panel.width = width; + this.data.panel.height = height; + // canvas + this.canvas.width = this.data.panel.width; + this.canvas.height = this.data.panel.height; + this.pane = this.canvas.getContext("2d"); + // bgCanvas + this.bgCanvas.width = this.data.panel.width; + this.bgCanvas.height = this.data.panel.height; + this.bgPane = this.bgCanvas.getContext("2d"); + + // outer bounds + this.data.bounds.outer.x = 10; + this.data.bounds.outer.y = 10; + this.data.bounds.outer.width = width - 20; + this.data.bounds.outer.height = height - 20; + var ratio = this.data.bounds.outer.width / this.data.bounds.outer.height; + + if (ratio > 1.5) { + // widget + if (this.data.bounds.outer.height * 3 < this.data.bounds.outer.width) { + this.data.bounds.inner.height = this.data.bounds.outer.height; + this.data.bounds.inner.width = this.data.bounds.outer.height * 3; + } else { + this.data.bounds.inner.height = this.data.bounds.outer.width / 3; + this.data.bounds.inner.width = this.data.bounds.outer.width; + } + this.data.bounds.inner.x = this.data.bounds.outer.x + (this.data.bounds.outer.width - this.data.bounds.inner.width) / 2; + this.data.bounds.inner.y = this.data.bounds.outer.y + (this.data.bounds.outer.height - this.data.bounds.inner.height) / 2; + // dClock + this.data.dClock.bounds.outer.x = this.data.bounds.inner.x + this.data.bounds.inner.width * 0.4; + this.data.dClock.bounds.outer.y = this.data.bounds.inner.y; + this.data.dClock.bounds.outer.width = this.data.bounds.inner.width * 0.6; + this.data.dClock.bounds.outer.height = this.data.bounds.inner.height * 0.6; + // dDate + this.data.dDate.bounds.outer.x = this.data.bounds.inner.x + this.data.bounds.inner.width * 0.4; + this.data.dDate.bounds.outer.y = this.data.bounds.inner.y + this.data.bounds.inner.height * 0.6; + this.data.dDate.bounds.outer.width = this.data.bounds.inner.width * 0.6; + this.data.dDate.bounds.outer.height = this.data.bounds.inner.height * 0.4; + // aClock + this.data.aClock.bounds.outer.x = this.data.bounds.inner.x; + this.data.aClock.bounds.outer.y = this.data.bounds.inner.y; + this.data.aClock.bounds.outer.width = this.data.bounds.inner.width * 0.4; + this.data.aClock.bounds.outer.height = this.data.bounds.inner.height; + } else if (ratio < 1) { + // widget + if (this.data.bounds.outer.height * 0.7 < this.data.bounds.outer.width) { + this.data.bounds.inner.height = this.data.bounds.outer.height; + this.data.bounds.inner.width = this.data.bounds.outer.height * 0.7; + } else { + this.data.bounds.inner.height = this.data.bounds.outer.width / 0.7; + this.data.bounds.inner.width = this.data.bounds.outer.width; + } + this.data.bounds.inner.x = this.data.bounds.outer.x + (this.data.bounds.outer.width - this.data.bounds.inner.width) / 2; + this.data.bounds.inner.y = this.data.bounds.outer.y + (this.data.bounds.outer.height - this.data.bounds.inner.height) / 2; + // dClock + this.data.dClock.bounds.outer.x = this.data.bounds.inner.x; + this.data.dClock.bounds.outer.y = this.data.bounds.inner.y + this.data.bounds.inner.height * 0.7; + this.data.dClock.bounds.outer.width = this.data.bounds.inner.width; + this.data.dClock.bounds.outer.height = this.data.bounds.inner.height * 0.2; + // dDate + this.data.dDate.bounds.outer.x = this.data.bounds.inner.x; + this.data.dDate.bounds.outer.y = this.data.bounds.inner.y + this.data.bounds.inner.height * 0.9; + this.data.dDate.bounds.outer.width = this.data.bounds.inner.width; + this.data.dDate.bounds.outer.height = this.data.bounds.inner.height * 0.1; + // aClock + this.data.aClock.bounds.outer.x = this.data.bounds.inner.x; + this.data.aClock.bounds.outer.y = this.data.bounds.inner.y; + this.data.aClock.bounds.outer.width = this.data.bounds.inner.width; + this.data.aClock.bounds.outer.height = this.data.bounds.inner.height * 0.7; + } else { + // widget + if (this.data.bounds.outer.height * 2 < this.data.bounds.outer.width) { + this.data.bounds.inner.height = this.data.bounds.outer.height; + this.data.bounds.inner.width = this.data.bounds.outer.height * 2; + } else { + this.data.bounds.inner.height = this.data.bounds.outer.width / 2; + this.data.bounds.inner.width = this.data.bounds.outer.width; + } + this.data.bounds.inner.x = this.data.bounds.outer.x + (this.data.bounds.outer.width - this.data.bounds.inner.width) / 2; + this.data.bounds.inner.y = this.data.bounds.outer.y + (this.data.bounds.outer.height - this.data.bounds.inner.height) / 2; + // dClock + this.data.dClock.bounds.outer.x = this.data.bounds.inner.x + this.data.bounds.inner.width / 3; + this.data.dClock.bounds.outer.y = this.data.bounds.inner.y; + this.data.dClock.bounds.outer.width = this.data.bounds.inner.width - this.data.bounds.inner.width / 3; + this.data.dClock.bounds.outer.height = this.data.bounds.inner.height - this.data.bounds.inner.height / 3; + // dDate + this.data.dDate.bounds.outer.x = this.data.bounds.inner.x; + this.data.dDate.bounds.outer.y = this.data.bounds.inner.y + this.data.bounds.inner.height / 3 * 2; + this.data.dDate.bounds.outer.width = this.data.bounds.inner.width; + this.data.dDate.bounds.outer.height = this.data.bounds.inner.height / 3; + // aClock + this.data.aClock.bounds.outer.x = this.data.bounds.inner.x; + this.data.aClock.bounds.outer.y = this.data.bounds.inner.y; + this.data.aClock.bounds.outer.width = this.data.bounds.inner.width / 3; + this.data.aClock.bounds.outer.height = this.data.bounds.inner.height - + this.data.bounds.inner.height / 3; + } + resizeDClock(); + resizeDDate(); + resizeAClock(); + renderBG(); + } + + this.render = function() { + var + date = new Date(), + n = date.getMilliseconds(), + h = date.getHours(), + i = date.getMinutes(), + s = date.getSeconds(), + t = date.getDay(), + d = date.getDate(), + m = date.getMonth(), + y = date.getFullYear(); + if (d.toString().length < 2) + d = "0" + d; + if (h.toString().length < 2) + h = "0" + h; + if (i.toString().length < 2) + i = "0" + i; + if (s.toString().length < 2) + s = "0" + s; + // background + this.pane.fillStyle = this.data.colors.background; + this.pane.fillRect(0, 0, this.data.panel.width, this.data.panel.height); + this.pane.drawImage(this.bgCanvas, 0, 0); + // foreground dClock + this.pane.fillStyle = this.data.colors.foreground; + this.pane.font = this.data.dClock.fonts.fat; + if (n < 500) this.pane.fillText(":", this.data.dClock.positions.pulse.x, this.data.dClock.positions.pulse.y); + this.pane.font = this.data.dClock.fonts.big; + this.pane.fillText(h, this.data.dClock.positions.hour.x, this.data.dClock.positions.hour.y); + this.pane.fillText(i, this.data.dClock.positions.minute.x, this.data.dClock.positions.minute.y); + this.pane.font = this.data.dClock.fonts.small; + this.pane.fillText(s, this.data.dClock.positions.second.x, this.data.dClock.positions.second.y); + // foreground dDate + this.pane.font = this.data.dDate.font; + this.pane.fillText(this.dayNames[t] + " " + d + " " + this.monthNames[m] + " " + y, this.data.dDate.position.x, this.data.dDate.position.y); + // foreground aClock + this.pane.strokeStyle = this.data.colors.foreground; + //hour + var hour = ((h % 12) * Math.PI / 6) + (i * Math.PI / (6 * 60)) + (s * Math.PI / (360 * 60)); + renderHand(hour, this.data.aClock.radius * 0.5, this.data.aClock.radius * 0.07); + //minute + var minute = (i * Math.PI / 30) + (s * Math.PI / (30 * 60)); + renderHand(minute, this.data.aClock.radius * 0.8, this.data.aClock.radius * 0.07); + // second + var second = (s * Math.PI / 30); + renderHand(second, this.data.aClock.radius * 0.9, this.data.aClock.radius * 0.02); + // debug + //renderDebug(); + } + + var renderHand = function(pos, length, width) { + this.pane.beginPath(); + this.pane.lineWidth = width; + this.pane.lineCap = "round"; + this.pane.translate(this.data.aClock.center.x, this.data.aClock.center.y); + this.pane.moveTo(0, 0); + this.pane.rotate(pos); + this.pane.lineTo(0, -length); + this.pane.stroke(); + this.pane.rotate(-pos); + this.pane.translate(-this.data.aClock.center.x, -this.data.aClock.center.y); + this.pane.lineWidth = 1; + }.bind(this); + + var renderBG = function() { + // background dClock + this.bgPane.fillStyle = this.data.colors.shaddow; + this.bgPane.font = this.data.dClock.fonts.fat; + this.bgPane.fillText(":", this.data.dClock.positions.pulse.x, this.data.dClock.positions.pulse.y); + this.bgPane.font = this.data.dClock.fonts.big; + this.bgPane.fillText("88", this.data.dClock.positions.hour.x, this.data.dClock.positions.hour.y); + this.bgPane.fillText("88", this.data.dClock.positions.minute.x, this.data.dClock.positions.minute.y); + this.bgPane.font = this.data.dClock.fonts.small; + this.bgPane.fillText("88", this.data.dClock.positions.second.x, this.data.dClock.positions.second.y); + // background dDate + this.bgPane.font = this.data.dDate.font; + this.bgPane.fillText("00 00 000 0000", this.data.dDate.position.x, this.data.dDate.position.y); + this.bgPane.fillText("** ** *** ****", this.data.dDate.position.x, this.data.dDate.position.y); + + if (typeof this.data.aClock.bgImage == "string") { + var img = new Image(); + img.onload = function(e) { + this.data.aClock.bgImage = e.target; + this.bgPane.drawImage( + this.data.aClock.bgImage, + this.data.aClock.bounds.inner.x, + this.data.aClock.bounds.inner.y, + this.data.aClock.bounds.inner.width, + this.data.aClock.bounds.inner.height + ); + }.bind(this); + img.src = "panels/clock/"+this.data.aClock.bgImage; + } else { + this.bgPane.drawImage( + this.data.aClock.bgImage, + this.data.aClock.bounds.inner.x, + this.data.aClock.bounds.inner.y, + this.data.aClock.bounds.inner.width, + this.data.aClock.bounds.inner.height + ); + } + }.bind(this); + + var resizeDClock = function() { + var aspect = 6 / 16; + var ratio = this.data.dClock.bounds.outer.width * aspect; + if (ratio > this.data.dClock.bounds.outer.height) { + this.data.dClock.bounds.inner.width = this.data.dClock.bounds.outer.height / aspect; + this.data.dClock.bounds.inner.height = this.data.dClock.bounds.outer.height; + } else if (ratio < this.data.dClock.bounds.outer.height) { + this.data.dClock.bounds.inner.width = this.data.dClock.bounds.outer.width; + this.data.dClock.bounds.inner.height = this.data.dClock.bounds.outer.width * aspect; + } else { + this.data.dClock.bounds.inner.width = this.data.dClock.bounds.outer.width; + this.data.dClock.bounds.inner.height = this.data.dClock.bounds.outer.height; + } + this.data.dClock.bounds.inner.x = this.data.dClock.bounds.outer.x + (this.data.dClock.bounds.outer.width - this.data.dClock.bounds.inner.width) / 2; + this.data.dClock.bounds.inner.y = this.data.dClock.bounds.outer.y + (this.data.dClock.bounds.outer.height - this.data.dClock.bounds.inner.height) / 2; + this.data.dClock.positions.pulse.x = this.data.dClock.bounds.inner.x + this.data.dClock.bounds.inner.width * 0.315; + this.data.dClock.positions.pulse.y = this.data.dClock.bounds.inner.y + this.data.dClock.bounds.inner.height * 0.72; + this.data.dClock.positions.hour.x = this.data.dClock.bounds.inner.x + this.data.dClock.bounds.inner.width * 0.02; + this.data.dClock.positions.hour.y = this.data.dClock.bounds.inner.y + this.data.dClock.bounds.inner.height * 0.88; + this.data.dClock.positions.minute.x = this.data.dClock.bounds.inner.x + this.data.dClock.bounds.inner.width * 0.43; + this.data.dClock.positions.minute.y = this.data.dClock.bounds.inner.y + this.data.dClock.bounds.inner.height * 0.88; + this.data.dClock.positions.second.x = this.data.dClock.bounds.inner.x + this.data.dClock.bounds.inner.width * 0.79; + this.data.dClock.positions.second.y = this.data.dClock.bounds.inner.y + this.data.dClock.bounds.inner.height * 0.85; + var + bigFontSize = this.data.dClock.bounds.inner.height * 1.3, + smlFontSize = this.data.dClock.bounds.inner.height * 0.7; + this.data.dClock.fonts.fat = bigFontSize + "px " + this.data.fonts.fat; + this.data.dClock.fonts.big = bigFontSize + "px " + this.data.fonts.medium; + this.data.dClock.fonts.small = smlFontSize + "px " + this.data.fonts.medium; + }.bind(this); + + var resizeDDate = function() { + var aspect = 2.3 / 16; + var ratio = this.data.dDate.bounds.outer.width * aspect; + if (ratio > this.data.dDate.bounds.outer.height) { + this.data.dDate.bounds.inner.width = this.data.dDate.bounds.outer.height / aspect; + this.data.dDate.bounds.inner.height = this.data.dDate.bounds.outer.height; + } else if (ratio < this.data.dDate.bounds.outer.height) { + this.data.dDate.bounds.inner.width = this.data.dDate.bounds.outer.width; + this.data.dDate.bounds.inner.height = this.data.dDate.bounds.outer.width * aspect; + } else { + this.data.dDate.bounds.inner.width = this.data.dDate.bounds.outer.width; + this.data.dDate.bounds.inner.height = this.data.dDate.bounds.outer.height; + } + this.data.dDate.bounds.inner.x = this.data.dDate.bounds.outer.x + (this.data.dDate.bounds.outer.width - this.data.dDate.bounds.inner.width) / 2; + this.data.dDate.bounds.inner.y = this.data.dDate.bounds.outer.y + (this.data.dDate.bounds.outer.height - this.data.dDate.bounds.inner.height) / 2; + this.data.dDate.position.x = this.data.dDate.bounds.inner.x + this.data.dDate.bounds.inner.width * 0.02; + this.data.dDate.position.y = this.data.dDate.bounds.inner.y + this.data.dDate.bounds.inner.height * 0.88; + var fontSize = this.data.dDate.bounds.inner.height * 1.3; + this.data.dDate.font = fontSize + "px " + this.data.fonts.medium; + }.bind(this); + + var resizeAClock = function() { + if (this.data.aClock.bounds.outer.width > this.data.aClock.bounds.outer.height) { + this.data.aClock.bounds.inner.width = this.data.aClock.bounds.outer.height; + this.data.aClock.bounds.inner.height = this.data.aClock.bounds.outer.height; + } else if (this.data.aClock.bounds.outer.width < this.data.aClock.bounds.outer.height) { + this.data.aClock.bounds.inner.width = this.data.aClock.bounds.outer.width; + this.data.aClock.bounds.inner.height = this.data.aClock.bounds.outer.width; + } else { + this.data.aClock.bounds.inner.width = this.data.aClock.bounds.outer.width; + this.data.aClock.bounds.inner.height = this.data.aClock.bounds.outer.height; + } + this.data.aClock.bounds.inner.x = this.data.aClock.bounds.outer.x + (this.data.aClock.bounds.outer.width - this.data.aClock.bounds.inner.width) / 2; + this.data.aClock.bounds.inner.y = this.data.aClock.bounds.outer.y + (this.data.aClock.bounds.outer.height - this.data.aClock.bounds.inner.height) / 2; + this.data.aClock.center.x = this.data.aClock.bounds.inner.x + this.data.aClock.bounds.inner.width / 2; + this.data.aClock.center.y = this.data.aClock.bounds.inner.y + this.data.aClock.bounds.inner.height / 2; + this.data.aClock.radius = this.data.aClock.bounds.inner.height * 0.45; + }.bind(this); + + var renderDebug = function() { + // panel bounds + this.pane.strokeStyle = "#ff0"; + this.pane.strokeRect(this.data.bounds.inner.x, this.data.bounds.inner.y, this.data.bounds.inner.width, this.data.bounds.inner.height); + this.pane.strokeStyle = "#0ff"; + this.pane.strokeRect(this.data.bounds.outer.x, this.data.bounds.outer.y, this.data.bounds.outer.width, this.data.bounds.outer.height); + // inner bounds + this.pane.strokeStyle = "#0f0"; + this.pane.strokeRect(this.data.dClock.bounds.inner.x, this.data.dClock.bounds.inner.y, this.data.dClock.bounds.inner.width, this.data.dClock.bounds.inner.height); + this.pane.strokeRect(this.data.dDate.bounds.inner.x, this.data.dDate.bounds.inner.y, this.data.dDate.bounds.inner.width, this.data.dDate.bounds.inner.height); + this.pane.strokeRect(this.data.aClock.bounds.inner.x, this.data.aClock.bounds.inner.y, this.data.aClock.bounds.inner.width, this.data.aClock.bounds.inner.height); + // outer bounds + this.pane.strokeStyle = "#f0f"; + this.pane.strokeRect(this.data.dClock.bounds.outer.x, this.data.dClock.bounds.outer.y, this.data.dClock.bounds.outer.width, this.data.dClock.bounds.outer.height); + this.pane.strokeRect(this.data.dDate.bounds.outer.x, this.data.dDate.bounds.outer.y, this.data.dDate.bounds.outer.width, this.data.dDate.bounds.outer.height); + this.pane.strokeRect(this.data.aClock.bounds.outer.x, this.data.aClock.bounds.outer.y, this.data.aClock.bounds.outer.width, this.data.aClock.bounds.outer.height); + this.pane.strokeStyle = ""; + }.bind(this); + +} this.loaded = function(panel, config) { var clock = new Clock(panel, config); @@ -16,4 +434,4 @@ this.loaded = function(panel, config) { clock.resize(panel[0].clientWidth, panel[0].clientHeight); tick(); -}; \ No newline at end of file +}; -- GitLab