|
- /** Modified from original Node-Red source, for audio system visualization
- * vim: set ts=4:
- * Copyright 2014 IBM Corp.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- **/
-
- RED.touch = RED.touch||{};
- RED.touch.radialMenu = (function() {
-
-
- var touchMenu = null;
- var isActive = false;
- var isOutside = false;
- var activeOption = null;
-
-
- function createRadial(obj,pos,options) {
- isActive = true;
- try {
- var w = $("body").width();
- var h = $("body").height();
-
- touchMenu = d3.select("body").append("div")
- .style({
- position:"absolute",
- top: 0,
- left:0,
- bottom:0,
- right:0,
- "z-index": 1000
- })
- .on('touchstart',function() {
- hide();
- d3.event.preventDefault();
- });
-
-
-
-
- var menu = touchMenu.append("div")
- .style({
- position: "absolute",
- top: (pos[1]-80)+"px",
- left:(pos[0]-80)+"px",
- "border-radius": "80px",
- width: "160px",
- height: "160px",
- background: "rgba(255,255,255,0.6)",
- border: "1px solid #666"
- });
-
- var menuOpts = [];
- var createMenuOpt = function(x,y,opt) {
- opt.el = menu.append("div")
- .style({
- position: "absolute",
- top: (y+80-25)+"px",
- left:(x+80-25)+"px",
- "border-radius": "20px",
- width: "50px",
- height: "50px",
- background: "#fff",
- border: "2px solid #666",
- "text-align": "center",
- "line-height":"50px"
- });
- if (opt.icon) {
- opt.el.append("i").attr("class","icon "+opt.icon)
- } else {
- opt.el.html(opt.name);
- }
- if (opt.disabled) {
- opt.el.style({"border-color":"#ccc",color:"#ccc"});
- }
- opt.x = x;
- opt.y = y;
- menuOpts.push(opt);
-
- opt.el.on('touchstart',function() {
- opt.el.style("background","#999");
- d3.event.preventDefault();
- d3.event.stopPropagation();
- });
- opt.el.on('touchend',function() {
- hide();
- opt.onselect();
- d3.event.preventDefault();
- d3.event.stopPropagation();
- });
- }
-
- var n = options.length;
- var dang = Math.max(Math.PI/(n-1),Math.PI/4);
- var ang = Math.PI;
- for (var i=0;i<n;i++) {
- var x = Math.floor(Math.cos(ang)*80);
- var y = Math.floor(Math.sin(ang)*80);
- if (options[i].name) {
- createMenuOpt(x,y,options[i]);
- }
- ang += dang;
- }
-
-
- var hide = function() {
- isActive = false;
- activeOption = null;
- touchMenu.remove();
- touchMenu = null;
- }
-
- obj.on('touchend.radial',function() {
- obj.on('touchend.radial',null);
- obj.on('touchmenu.radial',null);
-
- if (activeOption) {
- try {
- activeOption.onselect();
- } catch(err) {
- RED._debug(err);
- }
- hide();
- } else if (isOutside) {
- hide();
- }
- });
-
-
-
- obj.on('touchmove.radial',function() {
- try {
- var touch0 = d3.event.touches.item(0);
- var p = [touch0.pageX - pos[0],touch0.pageY-pos[1]];
- for (var i=0;i<menuOpts.length;i++) {
- var opt = menuOpts[i];
- if (!opt.disabled) {
- if (p[0]>opt.x-30 && p[0]<opt.x+30 && p[1]>opt.y-30 && p[1]<opt.y+30) {
- if (opt !== activeOption) {
- opt.el.style("background","#999");
- activeOption = opt;
- }
- } else if (opt === activeOption) {
- opt.el.style("background","#fff");
- activeOption = null;
- } else {
- opt.el.style("background","#fff");
- }
- }
- }
- if (!activeOption) {
- var d = Math.abs((p[0]*p[0])+(p[1]*p[1]));
- isOutside = (d > 80*80);
- }
-
- } catch(err) {
- RED._debug(err);
- }
-
-
- });
-
- } catch(err) {
- RED._debug(err);
- }
- }
-
-
- return {
- show: createRadial,
- active: function() {
- return isActive;
- }
- }
-
- })();
|