diff options
author | Steve McIntyre <steve.mcintyre@linaro.org> | 2015-10-30 18:28:32 +0000 |
---|---|---|
committer | Steve McIntyre <steve.mcintyre@linaro.org> | 2015-10-30 18:28:32 +0000 |
commit | bfef5069a1aa476dedb1578c8405659fc026664c (patch) | |
tree | 6421d5da1c3237fc2b6c433ebe6784a5567d2a05 | |
parent | 8179f610f609054c762c7918964f13699de413b4 (diff) |
Major change to the tooltip code design - switch to javascript
Some browsers will do the imagemap and span CSS, but IE and
Konqueror (Safari?) won't. Ugh. Give up on that, and switch to trivial
Javascript functions to trigger on onMouseOver() and onMouseOut()
events instead. Generate all the port tooltip boxes in the right place
but invisible, and when desired simply make the right one visible.
Works on all of IE, Firefox, Chrome and Konqueror here, so this will
do.
Change-Id: I9062ff02c09f275d570148542bcf994f6698c9fc
-rw-r--r-- | visualisation/visualisation.py | 129 |
1 files changed, 80 insertions, 49 deletions
diff --git a/visualisation/visualisation.py b/visualisation/visualisation.py index 8418135..e1b000b 100644 --- a/visualisation/visualisation.py +++ b/visualisation/visualisation.py @@ -139,6 +139,8 @@ class GetHandler(BaseHTTPRequestHandler): page.append('<meta http-equiv="refresh" content="%d">' % config.refresh) page.append('</HEAD>') page.append('<body>') + + # Generate left-hand menu with links to each VLAN diagram page.append('<div class="menu">') if len(switches) > 0: page.append('<h2>Menu</h2>') @@ -152,46 +154,84 @@ class GetHandler(BaseHTTPRequestHandler): page.append('</div>') page.append('</div>') + # Now the main content area with the graphics page.append('<div class="content">') page.append('<h1>VLANd visualisation</h1>') + # Bail early if we have nothing to show! if len(switches) == 0: page.append('<p>No switches found in the database, nothing to show...</p>') - else: - for vlan in vlans: - this_image = cache.graphics[vlan.vlan_id] - page.append('<a name="vlan%d"></a>' % vlan.vlan_id) - page.append('<h3>VLAN ID %d, Tag %d, name %s</h3>' % (vlan.vlan_id, vlan.tag, vlan.name)) - page.append('<p><img src="/images/vlan/%d.png" ' % vlan.vlan_id) - page.append('width="%d" height="%d" ' % ( this_image['image']['width'], this_image['image']['height'])) - page.append('alt="VLAN %d diagram" usemap="#MAPVLAN%d">' % (vlan.vlan_id,vlan.vlan_id)) - page.append('<map name="MAPVLAN%d">' % vlan.vlan_id) - for switch in this_image['ports'].keys(): - for portnum in this_image['ports'][switch].keys(): - this_port = this_image['ports'][switch][portnum] - # Grab the data about the port that we stored - # earlier when generating the image - port = this_port['db'] - ((ulx,uly),(lrx,lry),upper) = this_port['location'] - page.append('<area shape="rect" ') - page.append('coords="%d,%d,%d,%d" ' % (ulx,uly,lrx,lry)) - page.append(' />') - page.append('<span>Port ID: %d Port number: %d<br>' % (port.port_id, port.number)) - if port.is_locked: - page.append('Locked<br>') - if port.is_trunk: - page.append('Trunk') - if port.trunk_id != -1: - page.append(' (Trunk ID %d)' % port.trunk_id) - page.append('<br>') - else: - page.append('Current VLAN ID: %d (Tag %d)<br>' % (port.current_vlan_id, vlan_tags[port.current_vlan_id])) - page.append('Base VLAN ID: %d (Tag %d)<br>' % (port.base_vlan_id, vlan_tags[port.base_vlan_id])) - page.append('</span>') - page.append('</map></p>') - page.append('<hr>') + page.append('</div>') + page.append('</body>') + self.wfile.write('\r\n'.join(page)) + return + + # Trivial javascript helpers for tooltip control + page.append('<SCRIPT LANGUAGE="javascript">') + page.append('function popup(v,p) {') + page.append('a=v.toString();') + page.append('b=p.toString();') + page.append('id="port".concat("",a).concat(".",b);') + page.append('document.getElementById(id).style.visibility="visible";') + page.append('}') + page.append('function popdown(v,p) {') + page.append('a=v.toString();') + page.append('b=p.toString();') + page.append('id="port".concat("",a).concat(".",b);') + page.append('document.getElementById(id).style.visibility="hidden";') + page.append('}') + page.append('</SCRIPT>') + + # For each VLAN, add a graphic + for vlan in vlans: + this_image = cache.graphics[vlan.vlan_id] + page.append('<a name="vlan%d"></a>' % vlan.vlan_id) + page.append('<h3>VLAN ID %d, Tag %d, name %s</h3>' % (vlan.vlan_id, vlan.tag, vlan.name)) + + # Link to an image we generate from our data + page.append('<p><img src="images/vlan/%d.png" ' % vlan.vlan_id) + page.append('width="%d" height="%d" ' % ( this_image['image']['width'], this_image['image']['height'])) + page.append('alt="VLAN %d diagram" usemap="#MAPVLAN%d">' % (vlan.vlan_id,vlan.vlan_id)) + + # Generate an imagemap describing all the ports, with + # javascript hooks to pop up/down a tooltip box based on + # later data. + page.append('<map name="MAPVLAN%d">' % vlan.vlan_id) + for switch in this_image['ports'].keys(): + for portnum in this_image['ports'][switch].keys(): + this_port = this_image['ports'][switch][portnum] + port = this_port['db'] + ((ulx,uly),(lrx,lry),upper) = this_port['location'] + page.append('<area shape="rect" ') + page.append('coords="%d,%d,%d,%d" ' % (ulx,uly,lrx,lry)) + page.append('onMouseOver="popup(%d,%d)" onMouseOut="popdown(%d,%d)">' % (vlan.vlan_id, port.port_id, vlan.vlan_id, port.port_id)) + page.append('</map></p>') + page.append('<hr>') + page.append('</div>') # End of normal content, all the VLAN graphics shown + + # Now generate the tooltip boxes for the ports. Each is + # fully-formed but invisible, ready for our javascript helper + # to pop visible on demand. + for vlan in vlans: + this_image = cache.graphics[vlan.vlan_id] + for switch in this_image['ports'].keys(): + for portnum in this_image['ports'][switch].keys(): + this_port = this_image['ports'][switch][portnum] + port = this_port['db'] + page.append('<div class="port" id="port%d.%d">' % (vlan.vlan_id, port.port_id)) + page.append('Port ID: %d Port number: %d<br>' % (port.port_id, port.number)) + if port.is_locked: + page.append('Locked<br>') + if port.is_trunk: + page.append('Trunk') + if port.trunk_id != -1: + page.append(' (Trunk ID %d)' % port.trunk_id) + page.append('<br>') + else: + page.append('Current VLAN ID: %d (Tag %d)<br>' % (port.current_vlan_id, vlan_tags[port.current_vlan_id])) + page.append('Base VLAN ID: %d (Tag %d)<br>' % (port.base_vlan_id, vlan_tags[port.base_vlan_id])) + page.append('</div>') - page.append('</div>') page.append('</body>') self.wfile.write('\r\n'.join(page)) @@ -247,30 +287,21 @@ class GetHandler(BaseHTTPRequestHandler): page.append('ol { margin-top: 1pt; text-indent: 0 }') page.append('div.date { font-size: 8pt; }') page.append('div.sig { font-size: 8pt; }') - page.append('map { ') - page.append(' position: relative;') - page.append(' text-indent: 0;') - page.append('}') - page.append('area + span {') - page.append(' position: absolute;') - page.append(' margin-left: -9999em;') - page.append(' background: #00FFFF;') - page.append('}') - page.append('area:hover + span {') + page.append('div.port {') page.append(' display: block;') page.append(' position: fixed;') - page.append(' left: 9999em;') + page.append(' left: 0px;') page.append(' bottom: 0px;') page.append(' z-index: 99;') page.append(' background: #FFFF00;') - page.append(' border-style:solid;') - page.append(' border-width:3pt;') + page.append(' border-style: solid;') + page.append(' border-width: 3pt;') page.append(' border-color: #3B3B3B;') - page.append(' margin: 2;') - page.append(' width: 300px;') + page.append(' margin: 1;') page.append(' padding: 5px;') page.append(' font-size: 10pt;') page.append(' font-family: Courier,monotype;') + page.append(' visibility: hidden;') page.append('}') self.wfile.write('\r\n'.join(page)) |