diff options
author | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
---|---|---|
committer | Ashlee Young <ashlee@onosfw.com> | 2015-09-09 22:15:21 -0700 |
commit | 13d05bc8458758ee39cb829098241e89616717ee (patch) | |
tree | 22a4d1ce65f15952f07a3df5af4b462b4697cb3a /framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js | |
parent | 6139282e1e93c2322076de4b91b1c85d0bc4a8b3 (diff) |
ONOS checkin based on commit tag e796610b1f721d02f9b0e213cf6f7790c10ecd60
Change-Id: Ife8810491034fe7becdba75dda20de4267bd15cd
Diffstat (limited to 'framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js')
-rw-r--r-- | framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js new file mode 100644 index 00000000..1c957412 --- /dev/null +++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoSprite.js @@ -0,0 +1,262 @@ +/* + * Copyright 2015 Open Networking Laboratory + * + * 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. + */ + +/* + ONOS GUI -- Topology Sprite Module. + Defines behavior for loading sprites into the sprite layer. + */ + +(function () { + 'use strict'; + + // injected refs + var $log, $http, fs, gs, sus, wss; + + // constants + var tssid = 'TopoSpriteService: ', + fontsize = 20; // default font size 20pt. + + // internal state + var spriteLayer, defsElement; + + + function registerPathsAsGlyphs(paths) { + var custom = {}, + ids = []; + + function mkd(d) { + return fs.isA(d) ? d.join('') : d; + } + + paths.forEach(function (path) { + var tag = 'spr_' + path.tag; + + if (path.glyph) { + // assumption is that we are using a built-in glyph + return; + } + + custom['_' + tag] = path.viewbox || '0 0 1000 1000'; + custom[tag] = mkd(path.d); + ids.push(tag); + }); + + gs.registerGlyphs(custom); + gs.loadDefs(defsElement, ids, true); + } + + function applyStrokeStyle(s, use) { + var style; + if (s) { + style = {}; + angular.forEach(s, function (value, key) { + style['stroke-' + key] = value; + }); + use.style(style); + } + } + + function applyFillClass(f, use) { + use.classed('fill-' + f, true); + } + + function doSprite(spr, def, pathmeta) { + var pmeta = pathmeta[def.path], + c = spr.class || 'gray1', + p = spr.pos || [0,0], + lab = spr.label, + dim = def.dim || [40,40], + w = dim[0], + h = dim[1], + dy = def.labelyoff || 1, + sc = def.scale, + xfm = sus.translate(p), + g, attr, use; + + if (sc) { + xfm += sus.scale(sc, sc); + } + + g = spriteLayer.append('g') + .classed(c, true) + .attr('transform', xfm); + + attr = { + width: w, + height: h, + 'xlink:href': '#' + pmeta.u + }; + + use = g.append('use').attr(attr); + applyStrokeStyle(pmeta.s, use); + applyFillClass(def.fill, use); + + + // add subpaths if they have been defined + if (fs.isA(def.subpaths)) { + def.subpaths.forEach(function (v) { + pmeta = pathmeta[v.path]; + attr = { + width: w, + height: h, + 'xlink:href': '#' + pmeta.u, + transform: sus.translate(v.pos) + }; + use = g.append('use').attr(attr); + applyStrokeStyle(pmeta.s, use); + applyFillClass(def.subpathfill, use); + }); + } + + if (lab) { + g.append('text') + .text(lab) + .attr({ x: w / 2, y: h * dy }); + } + } + + function doLabel(label) { + var c = label.class || 'gray1', + p = label.pos || [0,0], + sz = label.size || 1.0, + g = spriteLayer.append('g') + .classed(c, true) + .attr('transform', sus.translate(p)) + .append('text') + .text(label.text) + .style('font-size', (fontsize * sz)+'pt'); + } + + + // ========================== + // event handlers + + // Handles response from 'spriteListRequest' which lists all the + // registered sprite definitions on the server. + // (see onos-upload-sprites) + function inList(payload) { + $log.debug(tssid + 'Registered sprite definitions:', payload.names); + // Some day, we will make this list available to the user in + // a dropdown selection box... + } + + // Handles response from 'spriteDataRequest' which provides the + // data for the requested sprite definition. + function inData(payload) { + var data = payload.data, + name, desc, pfx, sprites, labels, alpha, + paths, defn, load, + pathmeta = {}, + defs = {}, + warn = []; + + if (!data) { + $log.warn(tssid + 'No sprite data loaded.'); + return; + } + name = data.defn_name; + desc = data.defn_desc; + paths = data.paths; + defn = data.defn; + load = data.load; + pfx = tssid + '[' + name + ']: '; + + $log.debug("Loading sprites...[" + name + "]", desc); + + function no(what) { + warn.push(pfx + 'No ' + what + ' property defined'); + } + + if (!paths) no('paths'); + if (!defn) no('defn'); + if (!load) no('load'); + + if (warn.length) { + $log.error(warn.join('\n')); + return; + } + + // any custom paths need to be added to the glyph DB, and imported + registerPathsAsGlyphs(paths); + + paths.forEach(function (p) { + pathmeta[p.tag] = { + s: p.stroke, + u: p.glyph || 'spr_' + p.tag + }; + }); + + defn.forEach(function (d) { + defs[d.id] = d; + }); + + // sprites, labels and alpha are each optional components of the load + sprites = load.sprites; + labels = load.labels; + alpha = load.alpha; + + if (alpha) { + spriteLayer.style('opacity', alpha); + } + + if (sprites) { + sprites.forEach(function (spr) { + var def = defs[spr.id]; + doSprite(spr, def, pathmeta); + }); + } + + if (labels) { + labels.forEach(doLabel); + } + } + + + function loadSprites(layer, defsElem, defname) { + var name = defname || 'sprites'; + spriteLayer = layer; + defsElement = defsElem; + + $log.info(tssid + 'Requesting sprite definition ['+name+']...'); + + wss.sendEvent('spriteListRequest'); + wss.sendEvent('spriteDataRequest', {name: name}); + } + + // === ----------------------------------------------------- + // === MODULE DEFINITION === + + angular.module('ovTopo') + .factory('TopoSpriteService', + ['$log', '$http', 'FnService', 'GlyphService', + 'SvgUtilService', 'WebSocketService', + + function (_$log_, _$http_, _fs_, _gs_, _sus_, _wss_) { + $log = _$log_; + $http = _$http_; + fs = _fs_; + gs = _gs_; + sus = _sus_; + wss = _wss_; + + return { + loadSprites: loadSprites, + spriteListResponse: inList, + spriteDataResponse: inData + }; + }]); + +}()); |