GUI -- [ONOS-265] - fixed quick help:
- 'keymap' renamed 'quickhelp' - opacity of text now solid. - translucent background now auto-fits the content. - renamed files. Change-Id: I217f9e26acb0beb2686d1935e1e986f1404980db
Showing
4 changed files
with
109 additions
and
82 deletions
| ... | @@ -40,7 +40,7 @@ | ... | @@ -40,7 +40,7 @@ |
| 40 | <link rel="stylesheet" href="mast2.css"> | 40 | <link rel="stylesheet" href="mast2.css"> |
| 41 | <link rel="stylesheet" href="floatPanel.css"> | 41 | <link rel="stylesheet" href="floatPanel.css"> |
| 42 | <link rel="stylesheet" href="feedback.css"> | 42 | <link rel="stylesheet" href="feedback.css"> |
| 43 | - <link rel="stylesheet" href="keymap.css"> | 43 | + <link rel="stylesheet" href="onosQuickHelp.css"> |
| 44 | 44 | ||
| 45 | <!-- This is where contributed stylesheets get INJECTED --> | 45 | <!-- This is where contributed stylesheets get INJECTED --> |
| 46 | <!-- TODO: replace with template marker and inject refs server-side --> | 46 | <!-- TODO: replace with template marker and inject refs server-side --> |
| ... | @@ -70,10 +70,10 @@ | ... | @@ -70,10 +70,10 @@ |
| 70 | <!-- NOTE: alert content injected here, as needed --> | 70 | <!-- NOTE: alert content injected here, as needed --> |
| 71 | </div> | 71 | </div> |
| 72 | <div id="feedback"> | 72 | <div id="feedback"> |
| 73 | - <!-- NOTE: feedback to user --> | 73 | + <!-- NOTE: feedback flashes to user --> |
| 74 | </div> | 74 | </div> |
| 75 | - <div id="keymap"> | 75 | + <div id="quickhelp"> |
| 76 | - <!-- NOTE: key bindings map --> | 76 | + <!-- NOTE: key bindings and mouse gesture help --> |
| 77 | </div> | 77 | </div> |
| 78 | </div> | 78 | </div> |
| 79 | 79 | ||
| ... | @@ -93,7 +93,7 @@ | ... | @@ -93,7 +93,7 @@ |
| 93 | <!-- Framework module files included here --> | 93 | <!-- Framework module files included here --> |
| 94 | <script src="mast2.js"></script> | 94 | <script src="mast2.js"></script> |
| 95 | <script src="feedback.js"></script> | 95 | <script src="feedback.js"></script> |
| 96 | - <script src="keymap.js"></script> | 96 | + <script src="onosQuickHelp.js"></script> |
| 97 | 97 | ||
| 98 | <!-- View Module Templates; REMOVE THESE LINES, FOR PRODUCTION --> | 98 | <!-- View Module Templates; REMOVE THESE LINES, FOR PRODUCTION --> |
| 99 | <script src="module-svg-template.js"></script> | 99 | <script src="module-svg-template.js"></script> | ... | ... |
| ... | @@ -415,7 +415,7 @@ | ... | @@ -415,7 +415,7 @@ |
| 415 | 415 | ||
| 416 | function setupGlobalKeys() { | 416 | function setupGlobalKeys() { |
| 417 | keyHandler.globalKeys = { | 417 | keyHandler.globalKeys = { |
| 418 | - slash: [keyMap, 'Show / hide keyboard shortcuts'], | 418 | + slash: [quickHelp, 'Show / hide Quick Help'], |
| 419 | esc: [escapeKey, 'Dismiss dialog or cancel selections'], | 419 | esc: [escapeKey, 'Dismiss dialog or cancel selections'], |
| 420 | T: [toggleTheme, "Toggle theme"] | 420 | T: [toggleTheme, "Toggle theme"] |
| 421 | }; | 421 | }; |
| ... | @@ -427,19 +427,19 @@ | ... | @@ -427,19 +427,19 @@ |
| 427 | }; | 427 | }; |
| 428 | } | 428 | } |
| 429 | 429 | ||
| 430 | - function keyMap(view, key, code, ev) { | 430 | + function quickHelp(view, key, code, ev) { |
| 431 | - libApi.keymap.show(keyHandler); | 431 | + libApi.quickHelp.show(keyHandler); |
| 432 | return true; | 432 | return true; |
| 433 | } | 433 | } |
| 434 | 434 | ||
| 435 | function escapeKey(view, key, code, ev) { | 435 | function escapeKey(view, key, code, ev) { |
| 436 | - if (libApi.keymap.hide()) { | ||
| 437 | - return true; | ||
| 438 | - } | ||
| 439 | if (alerts.open) { | 436 | if (alerts.open) { |
| 440 | closeAlerts(); | 437 | closeAlerts(); |
| 441 | return true; | 438 | return true; |
| 442 | } | 439 | } |
| 440 | + if (libApi.quickHelp.hide()) { | ||
| 441 | + return true; | ||
| 442 | + } | ||
| 443 | return false; | 443 | return false; |
| 444 | } | 444 | } |
| 445 | 445 | ... | ... |
| ... | @@ -15,53 +15,54 @@ | ... | @@ -15,53 +15,54 @@ |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | - ONOS GUI -- Key map layer -- CSS file | 18 | + ONOS GUI -- Quick Help layer -- CSS file |
| 19 | 19 | ||
| 20 | @author Simon Hunt | 20 | @author Simon Hunt |
| 21 | */ | 21 | */ |
| 22 | 22 | ||
| 23 | -#keymap { | 23 | +#quickhelp { |
| 24 | z-index: 1300; | 24 | z-index: 1300; |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | -#keymap svg { | 27 | +#quickhelp svg { |
| 28 | position: absolute; | 28 | position: absolute; |
| 29 | bottom: 40px; | 29 | bottom: 40px; |
| 30 | - opacity: 0.7; | 30 | + opacity: 1; |
| 31 | } | 31 | } |
| 32 | 32 | ||
| 33 | -#keymap svg g.pane { | 33 | +#quickhelp svg g.help rect { |
| 34 | fill: black; | 34 | fill: black; |
| 35 | + opacity: 0.7; | ||
| 35 | } | 36 | } |
| 36 | 37 | ||
| 37 | -#keymap svg text.title { | 38 | +#quickhelp svg text.title { |
| 38 | font-size: 10pt; | 39 | font-size: 10pt; |
| 39 | font-style: italic; | 40 | font-style: italic; |
| 40 | text-anchor: middle; | 41 | text-anchor: middle; |
| 41 | fill: #999; | 42 | fill: #999; |
| 42 | } | 43 | } |
| 43 | 44 | ||
| 44 | -#keymap svg g.keyItem { | 45 | +#quickhelp svg g.keyItem { |
| 45 | fill: white; | 46 | fill: white; |
| 46 | } | 47 | } |
| 47 | 48 | ||
| 48 | -#keymap svg g.keyItem line { | 49 | +#quickhelp svg g.keyItem line { |
| 49 | - stroke: #444; | 50 | + stroke: #888; |
| 50 | - stroke-dasharray: 4 4; | 51 | + stroke-dasharray: 2 2; |
| 51 | } | 52 | } |
| 52 | 53 | ||
| 53 | -#keymap svg text { | 54 | +#quickhelp svg text { |
| 54 | font-size: 7pt; | 55 | font-size: 7pt; |
| 55 | alignment-baseline: middle; | 56 | alignment-baseline: middle; |
| 56 | } | 57 | } |
| 57 | 58 | ||
| 58 | -#keymap svg text.key { | 59 | +#quickhelp svg text.key { |
| 59 | font-size: 7pt; | 60 | font-size: 7pt; |
| 60 | fill: #add; | 61 | fill: #add; |
| 61 | } | 62 | } |
| 62 | 63 | ||
| 63 | -#keymap svg text.desc { | 64 | +#quickhelp svg text.desc { |
| 64 | font-size: 7pt; | 65 | font-size: 7pt; |
| 65 | - fill: #aaa; | 66 | + fill: #ddd; |
| 66 | } | 67 | } |
| 67 | 68 | ... | ... |
| ... | @@ -15,7 +15,7 @@ | ... | @@ -15,7 +15,7 @@ |
| 15 | */ | 15 | */ |
| 16 | 16 | ||
| 17 | /* | 17 | /* |
| 18 | - ONOS GUI -- Keymap Layer | 18 | + ONOS GUI -- Quick Help Layer |
| 19 | 19 | ||
| 20 | Defines the key-map layer for the UI. Used to give user a list of | 20 | Defines the key-map layer for the UI. Used to give user a list of |
| 21 | key bindings; both global, and for the current view. | 21 | key bindings; both global, and for the current view. |
| ... | @@ -33,34 +33,54 @@ | ... | @@ -33,34 +33,54 @@ |
| 33 | var w = '100%', | 33 | var w = '100%', |
| 34 | h = '80%', | 34 | h = '80%', |
| 35 | fade = 500, | 35 | fade = 500, |
| 36 | - vb = '-220 -220 440 440', | 36 | + vb = '-200 0 400 400'; |
| 37 | - paneW = 400, | ||
| 38 | - paneH = 280, | ||
| 39 | - offy = 65, | ||
| 40 | - dy = 14, | ||
| 41 | - offKey = 40, | ||
| 42 | - offDesc = offKey + 50, | ||
| 43 | - lineW = paneW - (2*offKey); | ||
| 44 | 37 | ||
| 45 | // State variables | 38 | // State variables |
| 46 | var data = []; | 39 | var data = []; |
| 47 | 40 | ||
| 48 | // DOM elements and the like | 41 | // DOM elements and the like |
| 49 | - var kmdiv = d3.select('#keymap'); | 42 | + var qhdiv = d3.select('#quickhelp'), |
| 43 | + svg = qhdiv.select('svg'), | ||
| 44 | + pane, | ||
| 45 | + rect, | ||
| 46 | + items; | ||
| 50 | 47 | ||
| 48 | + // General functions | ||
| 51 | function isA(a) { | 49 | function isA(a) { |
| 52 | return $.isArray(a) ? a : null; | 50 | return $.isArray(a) ? a : null; |
| 53 | } | 51 | } |
| 54 | 52 | ||
| 53 | + var keyDisp = { | ||
| 54 | + equals: '=', | ||
| 55 | + dash: '-', | ||
| 56 | + slash: '/', | ||
| 57 | + leftArrow: 'L-arrow', | ||
| 58 | + upArrow: 'U-arrow', | ||
| 59 | + rightArrow: 'R-arrow', | ||
| 60 | + downArrow: 'D-arrow' | ||
| 61 | + }; | ||
| 62 | + | ||
| 63 | + function cap(s) { | ||
| 64 | + return s.replace(/^[a-z]/, function (m) { return m.toUpperCase(); }); | ||
| 65 | + } | ||
| 66 | + | ||
| 67 | + function mkKeyDisp(id) { | ||
| 68 | + var v = keyDisp[id] || id; | ||
| 69 | + return cap(v); | ||
| 70 | + } | ||
| 55 | 71 | ||
| 56 | - var svg = kmdiv.select('svg'), | 72 | + // layout configuration |
| 57 | - pane; | 73 | + var pad = 8, |
| 74 | + offy = 45, | ||
| 75 | + dy = 14, | ||
| 76 | + offDesc = 40; | ||
| 58 | 77 | ||
| 78 | + // D3 magic | ||
| 59 | function updateKeyItems() { | 79 | function updateKeyItems() { |
| 60 | - var items = pane.selectAll('.keyItem') | 80 | + var keyItems = items.selectAll('.keyItem') |
| 61 | .data(data); | 81 | .data(data); |
| 62 | 82 | ||
| 63 | - var entering = items.enter() | 83 | + var entering = keyItems.enter() |
| 64 | .append('g') | 84 | .append('g') |
| 65 | .attr({ | 85 | .attr({ |
| 66 | id: function (d) { return d.id; }, | 86 | id: function (d) { return d.id; }, |
| ... | @@ -73,19 +93,13 @@ | ... | @@ -73,19 +93,13 @@ |
| 73 | 93 | ||
| 74 | if (d.id === '_') { | 94 | if (d.id === '_') { |
| 75 | el.append('line') | 95 | el.append('line') |
| 76 | - .attr({ | 96 | + .attr({ x1: 0, y1: y, x2: 1, y2: y}); |
| 77 | - class: 'sep', | ||
| 78 | - x1: offKey, | ||
| 79 | - y1: y, | ||
| 80 | - x2: offKey + lineW, | ||
| 81 | - y2: y | ||
| 82 | - }); | ||
| 83 | } else { | 97 | } else { |
| 84 | el.append('text') | 98 | el.append('text') |
| 85 | .text(d.key) | 99 | .text(d.key) |
| 86 | .attr({ | 100 | .attr({ |
| 87 | class: 'key', | 101 | class: 'key', |
| 88 | - x: offKey, | 102 | + x: 0, |
| 89 | y: y | 103 | y: y |
| 90 | }); | 104 | }); |
| 91 | 105 | ||
| ... | @@ -98,6 +112,22 @@ | ... | @@ -98,6 +112,22 @@ |
| 98 | }); | 112 | }); |
| 99 | } | 113 | } |
| 100 | }); | 114 | }); |
| 115 | + | ||
| 116 | + var box = items.node().getBBox(), | ||
| 117 | + paneW = box.width + pad * 2, | ||
| 118 | + paneH = box.height + offy; | ||
| 119 | + | ||
| 120 | + items.select('line').attr('x2', box.width); | ||
| 121 | + items.attr('transform', translate(-paneW/2, -pad)); | ||
| 122 | + rect.attr({ | ||
| 123 | + width: paneW, | ||
| 124 | + height: paneH, | ||
| 125 | + transform: translate(-paneW/2-pad, 0) | ||
| 126 | + }); | ||
| 127 | + } | ||
| 128 | + | ||
| 129 | + function translate(x, y) { | ||
| 130 | + return 'translate(' + x + ',' + y + ')'; | ||
| 101 | } | 131 | } |
| 102 | 132 | ||
| 103 | function aggregateData(bindings) { | 133 | function aggregateData(bindings) { |
| ... | @@ -127,7 +157,7 @@ | ... | @@ -127,7 +157,7 @@ |
| 127 | { | 157 | { |
| 128 | id: id, | 158 | id: id, |
| 129 | type: type, | 159 | type: type, |
| 130 | - key: k, | 160 | + key: mkKeyDisp(k), |
| 131 | desc: desc | 161 | desc: desc |
| 132 | } | 162 | } |
| 133 | ); | 163 | ); |
| ... | @@ -138,51 +168,47 @@ | ... | @@ -138,51 +168,47 @@ |
| 138 | }); | 168 | }); |
| 139 | } | 169 | } |
| 140 | } | 170 | } |
| 141 | - | ||
| 142 | } | 171 | } |
| 143 | 172 | ||
| 144 | - function populateBindings(bindings) { | 173 | + function popBind(bindings) { |
| 145 | - svg.append('g') | 174 | + pane = svg.append('g') |
| 146 | .attr({ | 175 | .attr({ |
| 147 | - class: 'keyBindings', | 176 | + class: 'help', |
| 148 | - transform: 'translate(-200,-200)', | ||
| 149 | opacity: 0 | 177 | opacity: 0 |
| 150 | - }) | ||
| 151 | - .transition() | ||
| 152 | - .duration(fade) | ||
| 153 | - .attr('opacity', 1); | ||
| 154 | - | ||
| 155 | - pane = svg.select('g'); | ||
| 156 | - | ||
| 157 | - pane.append('rect') | ||
| 158 | - .attr({ | ||
| 159 | - width: paneW, | ||
| 160 | - height: paneH, | ||
| 161 | - rx: 8 | ||
| 162 | }); | 178 | }); |
| 163 | 179 | ||
| 180 | + rect = pane.append('rect') | ||
| 181 | + .attr('rx', 8); | ||
| 182 | + | ||
| 164 | pane.append('text') | 183 | pane.append('text') |
| 165 | - .text('Keyboard Shortcuts') | 184 | + .text('Quick Help') |
| 166 | .attr({ | 185 | .attr({ |
| 167 | - x: 200, | 186 | + class: 'title', |
| 168 | - y: 0, | 187 | + dy: '1.2em', |
| 169 | - dy: '1.4em', | 188 | + transform: translate(-pad,0) |
| 170 | - class: 'title' | ||
| 171 | }); | 189 | }); |
| 172 | 190 | ||
| 191 | + items = pane.append('g'); | ||
| 192 | + | ||
| 173 | aggregateData(bindings); | 193 | aggregateData(bindings); |
| 174 | updateKeyItems(); | 194 | updateKeyItems(); |
| 195 | + | ||
| 196 | + _fade(1); | ||
| 175 | } | 197 | } |
| 176 | 198 | ||
| 177 | function fadeBindings() { | 199 | function fadeBindings() { |
| 178 | - svg.selectAll('g.keyBindings') | 200 | + _fade(0); |
| 201 | + } | ||
| 202 | + | ||
| 203 | + function _fade(o) { | ||
| 204 | + svg.selectAll('g.help') | ||
| 179 | .transition() | 205 | .transition() |
| 180 | .duration(fade) | 206 | .duration(fade) |
| 181 | - .attr('opacity', 0); | 207 | + .attr('opacity', o); |
| 182 | } | 208 | } |
| 183 | 209 | ||
| 184 | function addSvg() { | 210 | function addSvg() { |
| 185 | - svg = kmdiv.append('svg') | 211 | + svg = qhdiv.append('svg') |
| 186 | .attr({ | 212 | .attr({ |
| 187 | width: w, | 213 | width: w, |
| 188 | height: h, | 214 | height: h, |
| ... | @@ -196,18 +222,18 @@ | ... | @@ -196,18 +222,18 @@ |
| 196 | .remove(); | 222 | .remove(); |
| 197 | } | 223 | } |
| 198 | 224 | ||
| 199 | - function showKeyMap(bindings) { | 225 | + function showQuickHelp(bindings) { |
| 200 | - svg = kmdiv.select('svg'); | 226 | + svg = qhdiv.select('svg'); |
| 201 | if (svg.empty()) { | 227 | if (svg.empty()) { |
| 202 | addSvg(); | 228 | addSvg(); |
| 203 | - populateBindings(bindings); | 229 | + popBind(bindings); |
| 204 | } else { | 230 | } else { |
| 205 | - hideKeyMap(); | 231 | + hideQuickHelp(); |
| 206 | } | 232 | } |
| 207 | } | 233 | } |
| 208 | 234 | ||
| 209 | - function hideKeyMap() { | 235 | + function hideQuickHelp() { |
| 210 | - svg = kmdiv.select('svg'); | 236 | + svg = qhdiv.select('svg'); |
| 211 | if (!svg.empty()) { | 237 | if (!svg.empty()) { |
| 212 | fadeBindings(); | 238 | fadeBindings(); |
| 213 | removeSvg(); | 239 | removeSvg(); |
| ... | @@ -216,8 +242,8 @@ | ... | @@ -216,8 +242,8 @@ |
| 216 | return false; | 242 | return false; |
| 217 | } | 243 | } |
| 218 | 244 | ||
| 219 | - onos.ui.addLib('keymap', { | 245 | + onos.ui.addLib('quickHelp', { |
| 220 | - show: showKeyMap, | 246 | + show: showQuickHelp, |
| 221 | - hide: hideKeyMap | 247 | + hide: hideQuickHelp |
| 222 | }); | 248 | }); |
| 223 | }(ONOS)); | 249 | }(ONOS)); | ... | ... |
-
Please register or login to post a comment