Changeset 1669
- Timestamp:
- 12/11/06 19:22:41 (2 years ago)
- Files:
-
- revtreeplugin/0.10/revtree/htdocs/css/revtree.css (modified) (2 diffs)
- revtreeplugin/0.10/revtree/htdocs/js/svgtip.js (modified) (3 diffs)
- revtreeplugin/0.10/revtree/svgview.py (modified) (3 diffs)
- revtreeplugin/0.10/revtree/templates/revtree.cs (modified) (1 diff)
- revtreeplugin/0.10/revtree/templates/revtree_log.cs (modified) (1 diff)
- revtreeplugin/0.10/revtree/web_ui.py (modified) (6 diffs)
- revtreeplugin/0.10/setup.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
revtreeplugin/0.10/revtree/htdocs/css/revtree.css
r1666 r1669 56 56 position: relative; 57 57 float: left; 58 } 59 div#revtree { 60 overflow: hidden; 61 } 62 #revtree dl { 63 padding-top: 0; 64 margin-top: 0; 65 font-size: 90%; 66 } 67 #revtree dt { 68 font-weight: bold; 69 margin-left: 0em; 70 } 71 #revtree dd { 72 display: inline; 73 margin-left: 0.4em; 74 } 75 #revtree dd.message p { 76 margin-top: -1em; 77 margin-left: 0.4em; 78 margin-bottom: 0; 58 79 } 59 80 … … 120 141 border: 1px solid #CCCCCC; 121 142 } 122 .jTip{123 cursor:help;124 }125 .jTip a[title] {126 /* hide default tooltips */127 display: none;128 }revtreeplugin/0.10/revtree/htdocs/js/svgtip.js
r1666 r1669 5 5 * JTip is built on top of the very light weight jquery library. 6 6 * 7 * Badly hacked to support XHTML/XML and SVG <emmanuel.blot@free.fr>7 * Badly hacked & tweaked to support XHTML/XML and SVG <emmanuel.blot@free.fr> 8 8 */ 9 9 10 10 $(document).ready(JT_init); 11 11 12 // temporary storage for a:title attributes 13 var titles = Array(); 14 12 15 function JT_init(){ 13 16 $('a[@id^=rev]') 14 .hover(function(){JT_show(this.getAttribute('xlink:href'), 15 this.getAttribute('id'), 16 this.getAttribute('title'))},function(){$('#JT').remove()}) 17 .hover(function(){JT_show(this)},function(){JT_hide(this)}) 17 18 .click(function(){return false}); 18 19 } 19 20 20 function JT_show(url,linkId,title){ 21 function JT_hide(object) { 22 $('#JT').remove() 23 // restore the original title 24 object.setAttribute('title', titles[object]); 25 } 26 27 function JT_show(object) { 28 var url = object.getAttribute('xlink:href'); 29 var linkId = object.getAttribute('id'); 30 var title = object.getAttribute('title'); 31 // clear up the original title and back it up 32 // still looking for a better way to hide xlink:title (CSS ?) 33 titles[object] = title; 34 object.setAttribute('title', ''); 21 35 var box = getSvgPosition(linkId); 22 36 if(title == false)title=' '; … … 24 38 var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth; 25 39 var hasArea = w - box.x; 26 var clickElementy = box.y ;40 var clickElementy = box.y+8; 27 41 var queryString = url.replace(/^[^\?]+\??/,''); 28 42 var params = parseQuery( queryString ); 29 43 if(params['width'] === undefined){params['width'] = 250}; 30 44 if(params['link'] !== undefined){ 31 $( '#' + linkId).bind('click',function(){window.location = params['link']});32 $('#' + linkId).css('cursor','pointer');45 $(object).bind('click',function(){window.location = params['link']}); 46 //$(object).css('cursor','pointer'); 33 47 } 34 48 35 49 if(hasArea>((params['width']*1)+75)){ 36 50 var arrowOffset = box.w + 11; 37 var clickElementx = box.x + arrowOffset ;51 var clickElementx = box.x + arrowOffset + 3; 38 52 var side = 'left'; 39 53 } else { 40 var clickElementx = box.x - ((params['width']*1) + 15) ;54 var clickElementx = box.x - ((params['width']*1) + 15) - 3; 41 55 var side = 'right'; 42 56 } … … 66 80 67 81 document.getElementsByTagName('body')[0].appendChild(d0); 68 82 69 83 $('#JT').show(); 70 84 $('#JT_copy').load(url); revtreeplugin/0.10/revtree/svgview.py
r1666 r1669 72 72 raise AssertionError, "unsupportedcolor: %s" % value 73 73 else: 74 # FIXME: use some kind of checksum-based colorization 75 # i.e. branchname -> checksum -> color for permanent branch-color 76 # mapping (persistence over graph generation) 74 77 self._color = SvgColor.random() 75 78 … … 259 262 self._link.attributes['id'] = 'rev%d' % self._revision 260 263 self._link.attributes['title'] = 'Changeset %d' % self._revision 264 self._link.attributes['class'] = 'svgtip' 261 265 262 266 def visible(self): … … 905 909 d.toXml(filename) 906 910 907 def render(self, linkparent=False):911 def render(self, scale=1, width=None, height=None, linkparent=False): 908 912 self._svg = SVG.svg((0,0,self._extent[0],self._extent[1]), 909 '100%','100%')913 scale*self._extent[0], scale*self._extent[1]) 910 914 self._arrows.render() 911 915 map(lambda e: e.render(1), self._enhancers) revtreeplugin/0.10/revtree/templates/revtree.cs
r1666 r1669 128 128 <?cs else ?> 129 129 <div class="svg"> 130 <?cs if revtree.svg.src ?><object data="<?cs 131 var:revtree.svg.src ?>" type="image/svg+xml" width="<?cs 132 var:revtree.svg.width ?>" height="<?cs var:revtree.svg.height 133 ?>"></object><?cs else ?><?cs var:revtree.svg.image ?><?cs /if ?> 130 <?cs var:revtree.svg.image ?> 134 131 </div> 135 132 <?cs /if ?> revtreeplugin/0.10/revtree/templates/revtree_log.cs
r1666 r1669 1 <div> 2 <p>Revision <?cs var:revtree_log.rev ?></p> 3 <?cs var:revtree_log.message ?> 1 <div id="revtree"> 2 <dl id="overview"><?cs 3 if:changeset.chgset ?> 4 <dt class="property time">Timestamp:</dt> 5 <dd class="time"><?cs var:changeset.time ?> 6 (<?cs alt:changeset.age ?>less than one hour<?cs /alt ?> ago)</dd> 7 <dt class="property author">Author:</dt> 8 <dd class="author"><?cs var:changeset.author ?></dd> 9 <dt class="property message">Message:</dt> 10 <dd class="message"><?cs 11 alt:changeset.message ?> <?cs /alt ?></dd><?cs 12 /if ?> 13 </dl> 4 14 </div> revtreeplugin/0.10/revtree/web_ui.py
r1666 r1669 20 20 from trac.perm import IPermissionRequestor 21 21 from trac.util import Markup, TracError 22 from trac.util.datefmt import format_datetime, pretty_timedelta 22 23 from trac.web import IRequestHandler 23 24 from trac.web.chrome import add_stylesheet, add_script, \ 24 25 INavigationContributor, ITemplateProvider 25 26 from trac.web.href import Href 26 from trac.wiki import wiki_to_ oneliner, WikiSystem27 from trac.wiki import wiki_to_html, WikiSystem 27 28 28 29 from revtree import Repository, SvgRevtree, ChangesetEmptyRange … … 190 191 repos = self.env.get_repository(req.authname) 191 192 chgset = repos.get_changeset(rev) 192 wikimsg = wiki_to_ oneliner(chgset.message, self.env, None,193 shorten=False)193 wikimsg = wiki_to_html(chgset.message, self.env, req, None, 194 True, False) 194 195 # FIXME: check if there is a better way to discard ellipsis 196 # which are not valid in pure XML 195 197 wikimsg = Markup(wikimsg.replace('...', '')); 196 req.hdf['revtree_log.rev'] = rev 197 req.hdf['revtree_log.message'] = wikimsg 198 req.hdf['changeset'] = { 199 'chgset': True, 200 'revision': rev, 201 'time': format_datetime(chgset.date), 202 'age': pretty_timedelta(chgset.date, None, 3600), 203 'author': chgset.author or 'anonymous', 204 'message': wikimsg, 205 } 198 206 return 'revtree_log.cs', 'application/xhtml+xml' 199 except :200 raise TracError, "Invalid revision log request "207 except Exception, e: 208 raise TracError, "Invalid revision log request: %s" % e 201 209 202 210 def _process_revtree(self, req): … … 234 242 enhancer = Enhancer(repos, svgrevtree) 235 243 svgrevtree.add_enhancer(enhancer) 236 #self.env.log.debug("REVISIONS %s" % [revstore.revrange])237 #self.env.log.debug("BRANCH %s" % revstore.get_branches())238 #self.env.log.debug("AUTHOR %s" % revstore.get_authors())239 #self.env.log.debug("HIDE %s" % revstore.get_hidetermbranch())240 244 svgrevtree.create(revstore.revrange, revstore.get_branches(), 241 245 revstore.get_authors(), … … 243 247 revstore.get_style()) 244 248 svgrevtree.build() 245 svgrevtree.render() 246 extent = svgrevtree.extent() 247 extent = ((extent[0]*self.scale)/100,(extent[1]*self.scale)/100) 248 # FIXME 249 #extent = (800,(extent[1]*600)/extent[0]) 250 251 if not self.cache_url.startswith('/'): 252 src = req.href.chrome("site/cache/%s" % filename) 253 else: 254 src = "%s/%s" % (self.cache_url, filename) 255 #svgrevtree.save(os.path.join(self.cache_dir, filename)) 256 #req.hdf['revtree.svg.src'] = src 249 svgrevtree.render(self.scale*0.6) 257 250 req.hdf.set_unescaped('revtree.svg.image', str(svgrevtree)) 258 (w,h) = extent259 #(w,h) = (900, (900*h)/w)260 req.hdf['revtree.svg.width'] = "%dpx" % w261 req.hdf['revtree.svg.height'] = "%dpx" % h262 251 263 252 # create and order the drop-down list content, starting with the … … 267 256 branches.sort() 268 257 authors.sort() 258 # prepend the trunks to the selected branches 259 for b in self.trunks: 260 if b not in branches: 261 branches.insert(0, b) 269 262 branches.insert(0, revstore.anybranch) 270 263 authors.insert(0, revstore.anyauthor) … … 324 317 self.bcre = re.compile(bre) 325 318 self.urlbase = self.config.get('trac', 'base_url') 326 self.cache_dir = self.config.get('revtree', 'cache_dir', '%s/cache' \327 % self.env.get_htdocs_dir())328 self.cache_url = self.config.get('revtree',329 'cache_url', '').encode('ascii')330 319 self.trunks = self.env.config.get('revtree', 'trunks', 331 320 'trunk').split(' ') 332 self.scale = self.env.config.get('revtree', 'scale', '50') 333 if (self.scale < 1) or (self.scale>500): 334 self.scale = 50 335 336 if not self.cache_dir or not os.path.exists(self.cache_dir): 337 raise TracError("Cache directory is not valid: %s" % \ 338 self.cache_dir) 321 self.scale = float(self.env.config.get('revtree', 'scale', '1')) 339 322 if not self.urlbase: 340 323 raise TracError, "Base URL not defined" revtreeplugin/0.10/setup.py
r1668 r1669 16 16 17 17 PACKAGE = 'RevtreePlugin' 18 VERSION = '0.4. 1'18 VERSION = '0.4.2' 19 19 20 20 setup (
