GUI -- ToolbarService - showing and hiding the toolbar panel - WIP.
Change-Id: Idf9ccbfdeb2b3906fefdf022c216eee2611787fa
Showing
7 changed files
with
170 additions
and
27 deletions
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/* | ||
| 18 | + ONOS GUI -- Button Service -- CSS file | ||
| 19 | + */ | ||
| 20 | + | ||
| 21 | +.btn svg.embeddedIcon, | ||
| 22 | +.tog svg.embeddedIcon, | ||
| 23 | +.rad svg.embeddedIcon { | ||
| 24 | + cursor: pointer; | ||
| 25 | +} |
| ... | @@ -22,7 +22,7 @@ | ... | @@ -22,7 +22,7 @@ |
| 22 | 22 | ||
| 23 | var $log, fs, is; | 23 | var $log, fs, is; |
| 24 | 24 | ||
| 25 | - var btnSize = 30; | 25 | + var btnSize = 25; |
| 26 | 26 | ||
| 27 | function noop() {} | 27 | function noop() {} |
| 28 | 28 | ||
| ... | @@ -41,7 +41,7 @@ | ... | @@ -41,7 +41,7 @@ |
| 41 | var btnDiv = createDiv(div, 'btn', id), | 41 | var btnDiv = createDiv(div, 'btn', id), |
| 42 | cbFnc = fs.isF(cb) || noop; | 42 | cbFnc = fs.isF(cb) || noop; |
| 43 | 43 | ||
| 44 | - is.loadIcon(btnDiv, gid, btnSize); | 44 | + is.loadIcon(btnDiv, gid, btnSize, true); |
| 45 | 45 | ||
| 46 | btnDiv.on('click', cbFnc); | 46 | btnDiv.on('click', cbFnc); |
| 47 | 47 | ||
| ... | @@ -62,7 +62,7 @@ | ... | @@ -62,7 +62,7 @@ |
| 62 | togDiv = createDiv(div, 'tog', id), | 62 | togDiv = createDiv(div, 'tog', id), |
| 63 | cbFnc = fs.isF(cb) || noop; | 63 | cbFnc = fs.isF(cb) || noop; |
| 64 | 64 | ||
| 65 | - is.loadIcon(togDiv, gid, btnSize); | 65 | + is.loadIcon(togDiv, gid, btnSize, true); |
| 66 | 66 | ||
| 67 | function _toggle(b) { | 67 | function _toggle(b) { |
| 68 | if (b === undefined) { | 68 | if (b === undefined) { | ... | ... |
| 1 | +/* | ||
| 2 | + * Copyright 2015 Open Networking Laboratory | ||
| 3 | + * | ||
| 4 | + * Licensed under the Apache License, Version 2.0 (the "License"); | ||
| 5 | + * you may not use this file except in compliance with the License. | ||
| 6 | + * You may obtain a copy of the License at | ||
| 7 | + * | ||
| 8 | + * http://www.apache.org/licenses/LICENSE-2.0 | ||
| 9 | + * | ||
| 10 | + * Unless required by applicable law or agreed to in writing, software | ||
| 11 | + * distributed under the License is distributed on an "AS IS" BASIS, | ||
| 12 | + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
| 13 | + * See the License for the specific language governing permissions and | ||
| 14 | + * limitations under the License. | ||
| 15 | + */ | ||
| 16 | + | ||
| 17 | +/* | ||
| 18 | + ONOS GUI -- Toolbar Service -- CSS file | ||
| 19 | + */ | ||
| 20 | + | ||
| 21 | +.floatpanel.toolbar { | ||
| 22 | + position: absolute; | ||
| 23 | + z-index: 100; | ||
| 24 | + display: block; | ||
| 25 | + top: 75px; /* TODO: change this to proper height*/ | ||
| 26 | + width: 200px; | ||
| 27 | + right: -220px; | ||
| 28 | + opacity: 0; | ||
| 29 | + | ||
| 30 | + padding: 10px; | ||
| 31 | + font-size: 10pt; | ||
| 32 | + | ||
| 33 | + -moz-border-radius: 6px; | ||
| 34 | + border-radius: 6px; | ||
| 35 | +} |
| ... | @@ -20,18 +20,27 @@ | ... | @@ -20,18 +20,27 @@ |
| 20 | (function () { | 20 | (function () { |
| 21 | 'use strict'; | 21 | 'use strict'; |
| 22 | 22 | ||
| 23 | - var $log, fs, ps, bns; | 23 | + var $log, fs, ps, bns, is; |
| 24 | 24 | ||
| 25 | var ids = [], | 25 | var ids = [], |
| 26 | + defaultSettings = { | ||
| 27 | + edge: 'left', | ||
| 28 | + width: 400 | ||
| 29 | + }, | ||
| 30 | + settings, | ||
| 31 | + arrowSize = 10, | ||
| 26 | tbarId, | 32 | tbarId, |
| 27 | tbarPanel, | 33 | tbarPanel, |
| 28 | tbarDiv, | 34 | tbarDiv, |
| 29 | tbarArrowDiv; | 35 | tbarArrowDiv; |
| 30 | 36 | ||
| 37 | + // this function is only used in testing | ||
| 31 | function init() { | 38 | function init() { |
| 32 | ids = []; | 39 | ids = []; |
| 33 | } | 40 | } |
| 34 | 41 | ||
| 42 | + // === Helper functions -------------------------------------- | ||
| 43 | + | ||
| 35 | function validId(id, caller) { | 44 | function validId(id, caller) { |
| 36 | if (fs.inArray(id, ids) !== -1) { | 45 | if (fs.inArray(id, ids) !== -1) { |
| 37 | $log.warn(caller + ': ID already exists'); | 46 | $log.warn(caller + ': ID already exists'); |
| ... | @@ -40,6 +49,34 @@ | ... | @@ -40,6 +49,34 @@ |
| 40 | return true; | 49 | return true; |
| 41 | } | 50 | } |
| 42 | 51 | ||
| 52 | + // translate(0 50) looks good with arrowSize of 10 | ||
| 53 | + function rotateArrowLeft() { | ||
| 54 | + tbarArrowDiv.select('g') | ||
| 55 | + .attr('transform', 'translate(0 50) rotate(-90)'); | ||
| 56 | + } | ||
| 57 | + | ||
| 58 | + function rotateArrowRight() { | ||
| 59 | + tbarArrowDiv.select('g') | ||
| 60 | + .attr('transform', 'translate(0 50) rotate(90)'); | ||
| 61 | + } | ||
| 62 | + | ||
| 63 | + function createArrow() { | ||
| 64 | + tbarArrowDiv = tbarDiv.append('div') | ||
| 65 | + .classed('tbarArrow', true) | ||
| 66 | + .style({'position': 'absolute', | ||
| 67 | + 'top': '50%', | ||
| 68 | + 'left': '98%', | ||
| 69 | + 'margin-right': '-2%', | ||
| 70 | + 'transform': 'translate(-50%, -50%)', | ||
| 71 | + 'cursor': 'pointer'}); | ||
| 72 | + is.loadEmbeddedIcon(tbarArrowDiv, 'tableColSortAsc', arrowSize); | ||
| 73 | + rotateArrowLeft(); | ||
| 74 | + | ||
| 75 | + tbarArrowDiv.on('click', toggleTools); | ||
| 76 | + } | ||
| 77 | + | ||
| 78 | + // === Adding to toolbar functions ---------------------------- | ||
| 79 | + | ||
| 43 | function addButton(id, gid, cb, tooltip) { | 80 | function addButton(id, gid, cb, tooltip) { |
| 44 | var btnId = tbarId + '-' + id; | 81 | var btnId = tbarId + '-' + id; |
| 45 | if (!validId(btnId, 'addButton')) { return null; } | 82 | if (!validId(btnId, 'addButton')) { return null; } |
| ... | @@ -66,46 +103,72 @@ | ... | @@ -66,46 +103,72 @@ |
| 66 | $log.warn('Separator cannot append to div'); | 103 | $log.warn('Separator cannot append to div'); |
| 67 | return null; | 104 | return null; |
| 68 | } | 105 | } |
| 69 | - tbarArrowDiv = tbarDiv.append('div') | 106 | + return tbarDiv.append('div') |
| 70 | .classed('sep', true) | 107 | .classed('sep', true) |
| 71 | .style('width', '2px'); | 108 | .style('width', '2px'); |
| 72 | } | 109 | } |
| 73 | 110 | ||
| 74 | - function createToolbar(id, settings) { | 111 | + // === Main toolbar API functions ---------------------------- |
| 112 | + | ||
| 113 | + function createToolbar(id, opts) { | ||
| 75 | if (!id) { | 114 | if (!id) { |
| 76 | $log.warn('createToolbar: no ID given'); | 115 | $log.warn('createToolbar: no ID given'); |
| 77 | return null; | 116 | return null; |
| 78 | } | 117 | } |
| 79 | tbarId = 'tbar-' + id; | 118 | tbarId = 'tbar-' + id; |
| 80 | - var opts = fs.isO(settings) || {}; // default settings should be put here | 119 | + settings = angular.extend({}, defaultSettings, fs.isO(opts)); |
| 81 | 120 | ||
| 82 | if (!validId(tbarId, 'createToolbar')) { return null; } | 121 | if (!validId(tbarId, 'createToolbar')) { return null; } |
| 83 | ids.push(tbarId); | 122 | ids.push(tbarId); |
| 84 | 123 | ||
| 85 | - tbarPanel = ps.createPanel(tbarId, opts); | 124 | + tbarPanel = ps.createPanel(tbarId, settings); |
| 86 | - tbarDiv = tbarPanel.classed('toolbar', true); | 125 | + tbarDiv = tbarPanel.classed('toolbar', true) |
| 126 | + .style('position', 'relative'); | ||
| 127 | + | ||
| 128 | + createArrow(); | ||
| 87 | 129 | ||
| 88 | return { | 130 | return { |
| 89 | addButton: addButton, | 131 | addButton: addButton, |
| 90 | addToggle: addToggle, | 132 | addToggle: addToggle, |
| 91 | addRadioSet: addRadioSet, | 133 | addRadioSet: addRadioSet, |
| 92 | - addSeparator: addSeparator | 134 | + addSeparator: addSeparator, |
| 135 | + | ||
| 136 | + show: show, | ||
| 137 | + hide: hide, | ||
| 138 | + toggleTools: toggleTools | ||
| 93 | } | 139 | } |
| 94 | } | 140 | } |
| 95 | 141 | ||
| 96 | - //function currently not working | ||
| 97 | function destroyToolbar(id) { | 142 | function destroyToolbar(id) { |
| 98 | - //ps.destroyPanel(id); | 143 | + ps.destroyPanel(id); |
| 144 | + tbarDiv = null; | ||
| 145 | + } | ||
| 146 | + | ||
| 147 | + function show(cb) { | ||
| 148 | + tbarPanel.show(cb); | ||
| 149 | + rotateArrowLeft(); | ||
| 150 | + } | ||
| 151 | + | ||
| 152 | + function hide(cb) { | ||
| 153 | + tbarPanel.hide(cb); | ||
| 154 | + //tbarPanel.style(opts.edge, (arrowSize + 4 + 'px')); | ||
| 155 | + rotateArrowRight(); | ||
| 156 | + } | ||
| 157 | + | ||
| 158 | + function toggleTools(cb) { | ||
| 159 | + if (tbarPanel.isVisible()) { hide(cb); } | ||
| 160 | + else { show(cb) } | ||
| 99 | } | 161 | } |
| 100 | 162 | ||
| 101 | angular.module('onosWidget') | 163 | angular.module('onosWidget') |
| 102 | .factory('ToolbarService', ['$log', 'FnService', | 164 | .factory('ToolbarService', ['$log', 'FnService', |
| 103 | - 'PanelService', 'ButtonService', | 165 | + 'PanelService', 'ButtonService', 'IconService', |
| 104 | - function (_$log_, _fs_, _ps_, _bns_) { | 166 | + function (_$log_, _fs_, _ps_, _bns_, _is_) { |
| 105 | $log = _$log_; | 167 | $log = _$log_; |
| 106 | fs = _fs_; | 168 | fs = _fs_; |
| 107 | ps = _ps_; | 169 | ps = _ps_; |
| 108 | bns = _bns_; | 170 | bns = _bns_; |
| 171 | + is = _is_; | ||
| 109 | 172 | ||
| 110 | return { | 173 | return { |
| 111 | init: init, | 174 | init: init, | ... | ... |
| ... | @@ -20,13 +20,21 @@ | ... | @@ -20,13 +20,21 @@ |
| 20 | 20 | ||
| 21 | (function () { | 21 | (function () { |
| 22 | 'use strict'; | 22 | 'use strict'; |
| 23 | + var tbs; | ||
| 24 | + | ||
| 23 | angular.module('ovSample', ['onosUtil']) | 25 | angular.module('ovSample', ['onosUtil']) |
| 24 | - .controller('OvSampleCtrl', ['$log', function (_$log_) { | 26 | + .controller('OvSampleCtrl', ['$log', 'ToolbarService', |
| 25 | - var self = this, | 27 | + function (_$log_, _tbs_) { |
| 26 | - $log = _$log_; | 28 | + var self = this, |
| 29 | + $log = _$log_, | ||
| 30 | + tbs = _tbs_; | ||
| 31 | + | ||
| 32 | + self.message = 'Hey there folks!'; | ||
| 27 | 33 | ||
| 28 | - self.message = 'Hey there folks!'; | 34 | + var toolbar = tbs.createToolbar('sample'); |
| 35 | + toolbar.addButton('some-btn', 'crown', function () {}); | ||
| 36 | + toolbar.show(); | ||
| 29 | 37 | ||
| 30 | - $log.log('OvSampleCtrl has been created'); | 38 | + $log.log('OvSampleCtrl has been created'); |
| 31 | }]); | 39 | }]); |
| 32 | }()); | 40 | }()); | ... | ... |
| ... | @@ -79,6 +79,8 @@ | ... | @@ -79,6 +79,8 @@ |
| 79 | <link rel="stylesheet" href="app/fw/layer/quickhelp.css"> | 79 | <link rel="stylesheet" href="app/fw/layer/quickhelp.css"> |
| 80 | <link rel="stylesheet" href="app/fw/layer/veil.css"> | 80 | <link rel="stylesheet" href="app/fw/layer/veil.css"> |
| 81 | <link rel="stylesheet" href="app/fw/nav/nav.css"> | 81 | <link rel="stylesheet" href="app/fw/nav/nav.css"> |
| 82 | + <link rel="stylesheet" href="app/fw/widget/button.css"> | ||
| 83 | + <link rel="stylesheet" href="app/fw/widget/toolbar.css"> | ||
| 82 | 84 | ||
| 83 | <!-- This is where contributed javascript will get injected --> | 85 | <!-- This is where contributed javascript will get injected --> |
| 84 | <!-- {INJECTED-JAVASCRIPT-START} --> | 86 | <!-- {INJECTED-JAVASCRIPT-START} --> | ... | ... |
| ... | @@ -74,6 +74,16 @@ describe('factory: fw/widget/toolbar.js', function () { | ... | @@ -74,6 +74,16 @@ describe('factory: fw/widget/toolbar.js', function () { |
| 74 | expect($log.warn).not.toHaveBeenCalled(); | 74 | expect($log.warn).not.toHaveBeenCalled(); |
| 75 | }); | 75 | }); |
| 76 | 76 | ||
| 77 | + it('should verify the toolbar arrow div exists', function () { | ||
| 78 | + tbs.createToolbar('test'); | ||
| 79 | + | ||
| 80 | + var arrow = d3Elem.select('.tbarArrow'); | ||
| 81 | + expect(arrow).toBeTruthy(); | ||
| 82 | + expect(arrow.select('svg')).toBeTruthy(); | ||
| 83 | + expect(arrow.select('svg').select('g') | ||
| 84 | + .classed('tableColSortAsc')).toBeTruthy(); | ||
| 85 | + }); | ||
| 86 | + | ||
| 77 | it('should create a button', function () { | 87 | it('should create a button', function () { |
| 78 | spyOn($log, 'warn'); | 88 | spyOn($log, 'warn'); |
| 79 | var toolbar = tbs.createToolbar('test'), | 89 | var toolbar = tbs.createToolbar('test'), |
| ... | @@ -140,13 +150,13 @@ describe('factory: fw/widget/toolbar.js', function () { | ... | @@ -140,13 +150,13 @@ describe('factory: fw/widget/toolbar.js', function () { |
| 140 | expect(d3Elem.select('.sep').style('width')).toBe('2px'); | 150 | expect(d3Elem.select('.sep').style('width')).toBe('2px'); |
| 141 | }); | 151 | }); |
| 142 | 152 | ||
| 143 | - //it('should not append to a destroyed toolbar', function () { | 153 | + it('should not append to a destroyed toolbar', function () { |
| 144 | - // spyOn($log, 'warn'); | 154 | + spyOn($log, 'warn'); |
| 145 | - // var toolbar = tbs.createToolbar1('test'); | 155 | + var toolbar = tbs.createToolbar('test'); |
| 146 | - // expect(toolbar).not.toBeNull(); | 156 | + expect(toolbar).not.toBeNull(); |
| 147 | - // tbs.destroyToolbar('tbar-test'); | 157 | + tbs.destroyToolbar('tbar-test'); |
| 148 | - // expect(toolbar.addButton1('btn', 'gid', function () {})).toBeNull(); | 158 | + expect(toolbar.addButton('btn', 'gid', function () {})).toBeNull(); |
| 149 | - // expect($log.warn).toHaveBeenCalledWith('Button cannot append to div'); | 159 | + expect($log.warn).toHaveBeenCalledWith('Button cannot append to div'); |
| 150 | - //}); | 160 | + }); |
| 151 | 161 | ||
| 152 | }); | 162 | }); | ... | ... |
-
Please register or login to post a comment