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/fw/svg/icon.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/fw/svg/icon.js')
-rw-r--r-- | framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js | 265 |
1 files changed, 265 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js new file mode 100644 index 00000000..ba794313 --- /dev/null +++ b/framework/src/onos/web/gui/src/main/webapp/app/fw/svg/icon.js @@ -0,0 +1,265 @@ +/* + * 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 -- SVG -- Icon Service + */ +(function () { + 'use strict'; + + var $log, fs, gs, sus; + + var vboxSize = 50, + cornerSize = vboxSize / 10, + viewBox = '0 0 ' + vboxSize + ' ' + vboxSize; + + // Maps icon ID to the glyph ID it uses. + // NOTE: icon ID maps to a CSS class for styling that icon + var glyphMapping = { + active: 'checkMark', + inactive: 'xMark', + + plus: 'plus', + minus: 'minus', + play: 'play', + stop: 'stop', + + refresh: 'refresh', + garbage: 'garbage', + + upArrow: 'triangleUp', + downArrow: 'triangleDown', + + loading: 'loading', + + appInactive: 'unknown', + + devIcon_SWITCH: 'switch', + devIcon_ROADM: 'roadm', + flowTable: 'flowTable', + portTable: 'portTable', + groupTable: 'groupTable', + + hostIcon_endstation: 'endstation', + hostIcon_router: 'router', + hostIcon_bgpSpeaker: 'bgpSpeaker', + + nav_apps: 'bird', + nav_settings: 'chain', + nav_cluster: 'node', + nav_topo: 'topo', + nav_devs: 'switch', + nav_links: 'ports', + nav_hosts: 'endstation', + nav_intents: 'relatedIntents' + }; + + function ensureIconLibDefs() { + var body = d3.select('body'), + svg = body.select('svg#IconLibDefs'), + defs; + + if (svg.empty()) { + svg = body.append('svg').attr('id', 'IconLibDefs'); + defs = svg.append('defs'); + } + return svg.select('defs'); + } + + // div is a D3 selection of the <DIV> element into which icon should load + // glyphId identifies the glyph to use + // size is dimension of icon in pixels. Defaults to 20. + // installGlyph, if truthy, will cause the glyph to be added to + // well-known defs element. Defaults to false. + // svgClass is the CSS class used to identify the SVG layer. + // Defaults to 'embeddedIcon'. + function loadIcon(div, glyphId, size, installGlyph, svgClass) { + var dim = size || 20, + svgCls = svgClass || 'embeddedIcon', + gid = glyphId || 'unknown', + svg, g; + + if (installGlyph) { + gs.loadDefs(ensureIconLibDefs(), [gid], true); + } + + svg = div.append('svg').attr({ + 'class': svgCls, + width: dim, + height: dim, + viewBox: viewBox + }); + + g = svg.append('g').attr({ + 'class': 'icon' + }); + + g.append('rect').attr({ + width: vboxSize, + height: vboxSize, + rx: cornerSize + }); + + g.append('use').attr({ + width: vboxSize, + height: vboxSize, + 'class': 'glyph', + 'xlink:href': '#' + gid + }); + } + + // div is a D3 selection of the <DIV> element into which icon should load + // iconCls is the CSS class used to identify the icon + // size is dimension of icon in pixels. Defaults to 20. + // installGlyph, if truthy, will cause the glyph to be added to + // well-known defs element. Defaults to false. + // svgClass is the CSS class used to identify the SVG layer. + // Defaults to 'embeddedIcon'. + function loadIconByClass(div, iconCls, size, installGlyph, svgClass) { + loadIcon(div, glyphMapping[iconCls], size, installGlyph, svgClass); + div.select('svg g').classed(iconCls, true); + } + + function loadEmbeddedIcon(div, iconCls, size) { + loadIconByClass(div, iconCls, size, true); + } + + + // configuration for device and host icons in the topology view + var config = { + device: { + dim: 36, + rx: 4 + }, + host: { + radius: { + noGlyph: 9, + withGlyph: 14 + }, + glyphed: { + endstation: 1, + bgpSpeaker: 1, + router: 1 + } + } + }; + + + // Adds a device icon to the specified element, using the given glyph. + // Returns the D3 selection of the icon. + function addDeviceIcon(elem, glyphId) { + var cfg = config.device, + g = elem.append('g') + .attr('class', 'svgIcon deviceIcon'); + + g.append('rect').attr({ + x: 0, + y: 0, + rx: cfg.rx, + width: cfg.dim, + height: cfg.dim + }); + + g.append('use').attr({ + 'xlink:href': '#' + glyphId, + width: cfg.dim, + height: cfg.dim + }); + + g.dim = cfg.dim; + return g; + } + + function addHostIcon(elem, radius, glyphId) { + var dim = radius * 1.5, + xlate = -dim / 2, + g = elem.append('g') + .attr('class', 'svgIcon hostIcon'); + + g.append('circle').attr('r', radius); + + g.append('use').attr({ + 'xlink:href': '#' + glyphId, + width: dim, + height: dim, + transform: sus.translate(xlate,xlate) + }); + return g; + } + + function sortIcons() { + function sortAsc(div) { + div.style('display', 'inline-block'); + loadEmbeddedIcon(div, 'upArrow', 10); + div.classed('tableColSort', true); + } + + function sortDesc(div) { + div.style('display', 'inline-block'); + loadEmbeddedIcon(div, 'downArrow', 10); + div.classed('tableColSort', true); + } + + function sortNone(div) { + div.remove(); + } + + return { + sortAsc: sortAsc, + sortDesc: sortDesc, + sortNone: sortNone + }; + } + + + // ========================= + // === DEFINE THE MODULE + + angular.module('onosSvg') + .directive('icon', ['IconService', function (is) { + return { + restrict: 'A', + link: function (scope, element, attrs) { + attrs.$observe('iconId', function () { + var div = d3.select(element[0]); + div.selectAll('*').remove(); + is.loadEmbeddedIcon(div, attrs.iconId, attrs.iconSize); + }); + } + }; + }]) + + .factory('IconService', ['$log', 'FnService', 'GlyphService', + 'SvgUtilService', + + function (_$log_, _fs_, _gs_, _sus_) { + $log = _$log_; + fs = _fs_; + gs = _gs_; + sus = _sus_; + + return { + loadIcon: loadIcon, + loadIconByClass: loadIconByClass, + loadEmbeddedIcon: loadEmbeddedIcon, + addDeviceIcon: addDeviceIcon, + addHostIcon: addHostIcon, + iconConfig: function () { return config; }, + sortIcons: sortIcons + }; + }]); + +}()); |