# HG changeset patch # User paulb@jeremy # Date 1161034775 -7200 # Node ID 571122c644ad090fa7f80e3f7218acdd58587c96 # Parent 615d76683bbbe0d1afd04b509754484aa530911f Made pop-up information appear inside a common pop-up box. Added writes/accesses information to the type details where appropriate. diff -r 615d76683bbb -r 571122c644ad viewer.py --- a/viewer.py Mon Oct 16 00:39:44 2006 +0200 +++ b/viewer.py Mon Oct 16 23:39:35 2006 +0200 @@ -116,16 +116,20 @@ .ref { color: cyan; } .ref a { color: cyan; text-decoration: none; } - .types { + .popup { display: none; z-index: 2; - position: absolute; top: 1em; left: 7.5em; + position: absolute; top: 1em; left: 0.5em; + padding: 0.5em; background-color: #000000; + } + + .types { padding: 0.5em; background-color: #0000FF; + float: right; } .scopes { - display: none; z-index: 2; - position: absolute; top: 1em; left: 0.5em; padding: 0.5em; background-color: #007700; + float: left; } .name, @@ -134,10 +138,8 @@ position: relative; } - .name:hover > .types, - .name:hover > .scopes, - .attr:hover > .types, - .attr:hover > .scopes + .name:hover > .popup, + .attr:hover > .popup { display: block; } @@ -191,7 +193,9 @@ self.stream.write("

\n") self._keyword("class") self._name_start(structure.name) + self._popup_start() self._scopes(definition) + self._popup_end() self._name_end() bases = structure.bases if bases: @@ -201,8 +205,10 @@ if not first: self.stream.write(",\n") self._name_start(base.name) + self._popup_start() self._types(base) self._scopes(base) + self._popup_end() self._name_end() first = 0 self.stream.write(")") @@ -223,7 +229,9 @@ self.stream.write("

\n") self._keyword("def") self._name_start(subprogram.name) + self._popup_start() self._scopes(definition) + self._popup_end() self._name_end() self.stream.write("(") first = 1 @@ -232,7 +240,9 @@ self.stream.write(",\n") self._name_start(param) if hasattr(subprogram, "paramtypes"): + self._popup_start() self._types_list(subprogram.paramtypes[param]) + self._popup_end() self._name_end() first = 0 self.stream.write(")") @@ -281,14 +291,18 @@ def visitName(self, node): self._name_start(node._node.name) + self._popup_start() self._types(node._node) self._scopes(node._node) + self._popup_end() self._name_end() def visitAssName(self, node): self._name_start(node._node.name) + self._popup_start() self._types(node._node.expr) self._scopes(node._node) + self._popup_end() self._name_end() def visitConst(self, node): @@ -299,8 +313,10 @@ self.dispatch(node.expr) self.stream.write("\n") self.stream.write(".%s\n" % self._text(node.attrname)) + self._popup_start() self._types(node._node) self._scopes(node._node) + self._popup_end() self.stream.write("\n") self.stream.write("\n") @@ -309,8 +325,10 @@ self.dispatch(node.expr) self.stream.write("\n") self.stream.write(".%s\n" % self._text(node.attrname)) + self._popup_start() self._types(node._node) self._scopes(node._node) + self._popup_end() self.stream.write("\n") self.stream.write("\n") @@ -352,13 +370,23 @@ def _name_end(self): self.stream.write("\n") + def _popup_start(self): + self.stream.write("\n") + + def _popup_end(self): + self.stream.write("\n") + def _types(self, node): - if not hasattr(node, "types"): + if hasattr(node, "types"): + self._types_list(node.types) + elif hasattr(node, "writes"): + self._types_list(flatten(node.writes.values())) + elif hasattr(node, "accesses"): + self._types_list(flatten(node.accesses.values())) + else: self.stream.write("

\n") self.stream.write("No types!\n") self.stream.write("
\n") - else: - self._types_list(node.types) def _types_list(self, types): self.stream.write("
\n") @@ -382,6 +410,16 @@ self.stream.write("
\n") self.stream.write("\n") +# Utility functions. + +def flatten(lists): + result = [] + for l in lists: + for attr in l: + if attr not in result: + result.append(attr) + return result + # Convenience functions. def view(module, stream=None):