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/topoToolbar.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/topoToolbar.js')
-rw-r--r-- | framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js | 284 |
1 files changed, 284 insertions, 0 deletions
diff --git a/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js new file mode 100644 index 00000000..84de261b --- /dev/null +++ b/framework/src/onos/web/gui/src/main/webapp/app/view/topo/topoToolbar.js @@ -0,0 +1,284 @@ +/* + * 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 Toolbar Module. + Functions for creating and interacting with the toolbar. + */ + +(function () { + 'use strict'; + + // injected references + var $log, fs, tbs, ps, tov, api; + + // API: + // getActionEntry + // setUpKeys + + // internal state + var toolbar, keyData, cachedState, thirdRow; + + // constants + var name = 'topo-tbar', + cooktag = 'topo_prefs', + soa = 'switchOverlayActions: ', + selOver = 'Select overlay here ⇧'; + + + // key to button mapping data + var k2b = { + O: { id: 'summary-tog', gid: 'summary', isel: true}, + I: { id: 'instance-tog', gid: 'uiAttached', isel: true }, + D: { id: 'details-tog', gid: 'details', isel: true }, + H: { id: 'hosts-tog', gid: 'endstation', isel: false }, + M: { id: 'offline-tog', gid: 'switch', isel: true }, + P: { id: 'ports-tog', gid: 'ports', isel: true }, + B: { id: 'bkgrnd-tog', gid: 'map', isel: false }, + S: { id: 'sprite-tog', gid: 'cloud', isel: false }, + + //X: { id: 'nodelock-tog', gid: 'lock', isel: false }, + Z: { id: 'oblique-tog', gid: 'oblique', isel: false }, + N: { id: 'filters-btn', gid: 'filters' }, + L: { id: 'cycleLabels-btn', gid: 'cycleLabels' }, + R: { id: 'resetZoom-btn', gid: 'resetZoom' }, + + E: { id: 'eqMaster-btn', gid: 'eqMaster' } + }; + + var prohibited = [ + 'T', 'backSlash', 'slash', + 'X' // needed until we re-instate X above. + ]; + prohibited = prohibited.concat(d3.map(k2b).keys()); + + + // initial toggle state: default settings and tag to key mapping + var defaultPrefsState = { + summary: 1, + insts: 1, + detail: 1, + hosts: 0, + offdev: 1, + porthl: 1, + bg: 0, + spr: 0, + toolbar: 0 + }, + prefsMap = { + summary: 'O', + insts: 'I', + detail: 'D', + hosts: 'H', + offdev: 'M', + porthl: 'P', + bg: 'B', + spr: 'S' + // NOTE: toolbar state is handled separately + }; + + function init(_api_) { + api = _api_; + + // retrieve initial toggle button settings from user prefs + setInitToggleState(); + } + + function topoDefPrefs() { + return angular.extend({}, defaultPrefsState); + } + + function setInitToggleState() { + cachedState = ps.asNumbers(ps.getPrefs(cooktag)); + $log.debug('TOOLBAR---- read prefs state:', cachedState); + + if (!cachedState) { + cachedState = topoDefPrefs(); + ps.setPrefs(cooktag, cachedState); + $log.debug('TOOLBAR---- Set default prefs state:', cachedState); + } + + angular.forEach(prefsMap, function (v, k) { + var cfg = k2b[v]; + cfg && (cfg.isel = !!cachedState[k]); + }); + } + + function initKeyData() { + // TODO: use angular forEach instead of d3.map + keyData = d3.map(k2b); + keyData.forEach(function(key, value) { + var data = api.getActionEntry(key); + value.cb = data[0]; // on-click callback + value.tt = data[1] + ' (' + key + ')'; // tooltip + }); + } + + function addButton(key) { + var v = keyData.get(key); + v.btn = toolbar.addButton(v.id, v.gid, v.cb, v.tt); + } + + function addToggle(key, suppressIfMobile) { + var v = keyData.get(key); + if (suppressIfMobile && fs.isMobile()) { return; } + v.tog = toolbar.addToggle(v.id, v.gid, v.isel, v.cb, v.tt); + } + + function addFirstRow() { + addToggle('I'); + addToggle('O'); + addToggle('D'); + toolbar.addSeparator(); + + addToggle('H'); + addToggle('M'); + addToggle('P', true); + addToggle('B'); + addToggle('S', true); + } + + function addSecondRow() { + //addToggle('X'); + addToggle('Z'); + addButton('N'); + addButton('L'); + addButton('R'); + toolbar.addSeparator(); + addButton('E'); + } + + function addOverlays() { + toolbar.addSeparator(); + + // generate radio button set for overlays; start with 'none' + var rset = [{ + gid: 'topo', + tooltip: 'No Overlay', + cb: function () { + tov.tbSelection(null, switchOverlayActions); + } + }]; + tov.augmentRbset(rset, switchOverlayActions); + toolbar.addRadioSet('topo-overlays', rset); + } + + // invoked by overlay service to switch out old buttons and switch in new + function switchOverlayActions(oid, keyBindings) { + var prohibits = [], + kb = fs.isO(keyBindings) || {}, + order = fs.isA(kb._keyOrder) || []; + + if (keyBindings && !keyBindings._keyOrder) { + $log.warn(soa + 'no _keyOrder property defined'); + } else { + // sanity removal of reserved property names + ['esc', '_keyListener', '_helpFormat'].forEach(function (k) { + fs.removeFromArray(k, order); + }); + } + + thirdRow.clear(); + + if (!order.length) { + thirdRow.setText(selOver); + thirdRow.classed('right', true); + api.setUpKeys(); // clear previous overlay key bindings + + } else { + thirdRow.classed('right', false); + angular.forEach(order, function (key) { + var value, bid, gid, tt; + + if (prohibited.indexOf(key) > -1) { + prohibits.push(key); + + } else { + value = keyBindings[key]; + bid = oid + '-' + key; + gid = tov.mkGlyphId(oid, value.gid); + tt = value.tt + ' (' + key + ')'; + thirdRow.addButton(bid, gid, value.cb, tt); + } + }); + api.setUpKeys(keyBindings); // add overlay key bindings + } + + if (prohibits.length) { + $log.warn(soa + 'Prohibited key bindings ignored:', prohibits); + } + } + + function createToolbar() { + initKeyData(); + toolbar = tbs.createToolbar(name); + addFirstRow(); + toolbar.addRow(); + addSecondRow(); + addOverlays(); + thirdRow = toolbar.addRow(); + thirdRow.setText(selOver); + thirdRow.classed('right', true); + + if (cachedState.toolbar) { + toolbar.show(); + } else { + toolbar.hide(); + } + } + + function destroyToolbar() { + tbs.destroyToolbar(name); + } + + // allows us to ensure the button states track key strokes + function keyListener(key) { + var v = keyData.get(key); + + if (v) { + // we have a valid button mapping + if (v.tog) { + // it's a toggle button + v.tog.toggleNoCb(); + } + } + } + + function toggleToolbar() { + toolbar.toggle(); + } + + angular.module('ovTopo') + .factory('TopoToolbarService', + ['$log', 'FnService', 'ToolbarService', 'PrefsService', + 'TopoOverlayService', + + function (_$log_, _fs_, _tbs_, _ps_, _tov_) { + $log = _$log_; + fs = _fs_; + tbs = _tbs_; + ps = _ps_; + tov = _tov_; + + return { + init: init, + createToolbar: createToolbar, + destroyToolbar: destroyToolbar, + keyListener: keyListener, + toggleToolbar: toggleToolbar + }; + }]); +}());
\ No newline at end of file |