Changeset 1669

Show
Ignore:
Timestamp:
12/11/06 19:22:41 (2 years ago)
Author:
eblot
Message:

RevtreePlugin:

Several improvements:

  • Fix up SVG scale (changeset-independent)
  • Fix up XHMTL tooltip (default tooltips are hidden)
  • Fix up AJAX tooltip text overflow
  • Fix up old trunks issues
  • Fix up changeset links to the original changeset page
  • Add author and pretty date to the changeset message
Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • revtreeplugin/0.10/revtree/htdocs/css/revtree.css

    r1666 r1669  
    5656 position: relative; 
    5757 float: left; 
     58} 
     59div#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; 
    5879} 
    5980 
     
    120141        border: 1px solid #CCCCCC; 
    121142} 
    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  
    55 * JTip is built on top of the very light weight jquery library. 
    66 * 
    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> 
    88 */ 
    99 
    1010$(document).ready(JT_init); 
    1111 
     12// temporary storage for a:title attributes 
     13var titles = Array(); 
     14 
    1215function JT_init(){ 
    1316    $('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)}) 
    1718      .click(function(){return false});      
    1819} 
    1920 
    20 function JT_show(url,linkId,title){ 
     21function JT_hide(object) { 
     22   $('#JT').remove() 
     23   // restore the original title 
     24   object.setAttribute('title', titles[object]);    
     25
     26 
     27function 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', ''); 
    2135  var box = getSvgPosition(linkId); 
    2236  if(title == false)title=' '; 
     
    2438  var w = self.innerWidth || (de&&de.clientWidth) || document.body.clientWidth; 
    2539  var hasArea = w - box.x; 
    26   var clickElementy = box.y
     40  var clickElementy = box.y+8
    2741  var queryString = url.replace(/^[^\?]+\??/,''); 
    2842  var params = parseQuery( queryString ); 
    2943  if(params['width'] === undefined){params['width'] = 250}; 
    3044  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'); 
    3347  } 
    3448     
    3549  if(hasArea>((params['width']*1)+75)){ 
    3650     var arrowOffset = box.w + 11; 
    37      var clickElementx = box.x + arrowOffset
     51     var clickElementx = box.x + arrowOffset + 3
    3852     var side = 'left'; 
    3953  } else { 
    40      var clickElementx = box.x - ((params['width']*1) + 15)
     54     var clickElementx = box.x - ((params['width']*1) + 15) - 3
    4155     var side = 'right'; 
    4256  } 
     
    6680 
    6781  document.getElementsByTagName('body')[0].appendChild(d0); 
    68          
     82 
    6983  $('#JT').show(); 
    7084  $('#JT_copy').load(url); 
  • revtreeplugin/0.10/revtree/svgview.py

    r1666 r1669  
    7272                raise AssertionError, "unsupportedcolor: %s" % value 
    7373        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) 
    7477            self._color = SvgColor.random() 
    7578             
     
    259262            self._link.attributes['id'] = 'rev%d' % self._revision 
    260263            self._link.attributes['title'] = 'Changeset %d' % self._revision 
     264            self._link.attributes['class'] = 'svgtip' 
    261265                     
    262266    def visible(self): 
     
    905909        d.toXml(filename) 
    906910         
    907     def render(self, linkparent=False): 
     911    def render(self, scale=1, width=None, height=None, linkparent=False): 
    908912        self._svg = SVG.svg((0,0,self._extent[0],self._extent[1]), 
    909                             '100%','100%'
     913                            scale*self._extent[0], scale*self._extent[1]
    910914        self._arrows.render() 
    911915        map(lambda e: e.render(1), self._enhancers) 
  • revtreeplugin/0.10/revtree/templates/revtree.cs

    r1666 r1669  
    128128<?cs else ?> 
    129129<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 ?> 
    134131</div> 
    135132<?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 ?>&nbsp;<?cs /alt ?></dd><?cs 
     12   /if ?> 
     13  </dl> 
    414</div> 
  • revtreeplugin/0.10/revtree/web_ui.py

    r1666 r1669  
    2020from trac.perm import IPermissionRequestor 
    2121from trac.util import Markup, TracError 
     22from trac.util.datefmt import format_datetime, pretty_timedelta 
    2223from trac.web import IRequestHandler 
    2324from trac.web.chrome import add_stylesheet, add_script, \ 
    2425                            INavigationContributor, ITemplateProvider 
    2526from trac.web.href import Href 
    26 from trac.wiki import wiki_to_oneliner, WikiSystem 
     27from trac.wiki import wiki_to_html, WikiSystem 
    2728 
    2829from revtree import Repository, SvgRevtree, ChangesetEmptyRange 
     
    190191            repos = self.env.get_repository(req.authname) 
    191192            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) 
    194195            # FIXME: check if there is a better way to discard ellipsis 
     196            #        which are not valid in pure XML 
    195197            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            } 
    198206            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 
    201209         
    202210    def _process_revtree(self, req): 
     
    234242            enhancer = Enhancer(repos, svgrevtree) 
    235243            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()) 
    240244            svgrevtree.create(revstore.revrange, revstore.get_branches(),  
    241245                              revstore.get_authors(),  
     
    243247                              revstore.get_style()) 
    244248            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) 
    257250            req.hdf.set_unescaped('revtree.svg.image', str(svgrevtree)) 
    258             (w,h) = extent 
    259             #(w,h) = (900, (900*h)/w) 
    260             req.hdf['revtree.svg.width'] = "%dpx" % w 
    261             req.hdf['revtree.svg.height'] = "%dpx" % h 
    262251             
    263252            # create and order the drop-down list content, starting with the 
     
    267256            branches.sort() 
    268257            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) 
    269262            branches.insert(0, revstore.anybranch) 
    270263            authors.insert(0, revstore.anyauthor) 
     
    324317        self.bcre = re.compile(bre) 
    325318        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') 
    330319        self.trunks = self.env.config.get('revtree', 'trunks',  
    331320                                          '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')) 
    339322        if not self.urlbase: 
    340323            raise TracError, "Base URL not defined" 
  • revtreeplugin/0.10/setup.py

    r1668 r1669  
    1616 
    1717PACKAGE = 'RevtreePlugin' 
    18 VERSION = '0.4.1
     18VERSION = '0.4.2
    1919 
    2020setup (