Changeset 4360

Show
Ignore:
Timestamp:
09/30/08 05:20:25 (3 months ago)
Author:
cbalan
Message:

MenusPlugin: - Added: 'inherit' option and ctxtnav support.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • menusplugin/0.11/tracmenus/web_ui.py

    r4313 r4360  
    33# Copyright 2008 Optaros, Inc. 
    44# 
     5import re 
    56 
    67from trac.core import * 
    78from trac.web.api import IRequestFilter 
    89from trac.web.chrome import add_script, add_stylesheet,ITemplateProvider 
    9 from trac.config import ListOption 
     10from trac.config import ListOption, BoolOption 
    1011from trac.util.html import html 
    1112from trac.util.compat import sorted 
     
    1314class MenuManagerModule(Component): 
    1415    implements(IRequestFilter, ITemplateProvider) 
    15     managed_menus = ListOption('menu-custom', 'managed_menus', 'mainnav,metanav', sep=',',doc=""" """) 
    16          
     16    managed_menus = ListOption('menu-custom', 'managed_menus', 'mainnav,metanav', sep=',', doc=""" """) 
     17    serve_ui_files = BoolOption('menu-custom', 'serve_ui_files', 'true') 
     18 
    1719    # ITemplateProvider 
    1820    def get_templates_dirs(self): 
     
    2729    def post_process_request(self, req, template, data, content_type): 
    2830        req.chrome['nav_orig'] = req.chrome['nav'].copy() 
     31        if 'ctxtnav' in self.managed_menus and 'ctxtnav' in req.chrome: 
     32            req.chrome['nav_orig']['ctxtnav']=[dict(name='ctxtnav_'+str(idx), label=ctx_label)  
     33                                               for idx, ctx_label in enumerate(req.chrome['ctxtnav'])] 
    2934        for menu_name in self.managed_menus: 
    3035            req.chrome['nav'][menu_name] = list(self._get_menu(req, menu_name,  
    31                                                                req.chrome['nav_orig'].get(menu_name,[]))) 
    32         add_script(req, 'tracmenus/js/superfish.js') 
    33         add_script(req, 'tracmenus/js/tracmenus.js') 
    34         add_script(req, 'tracmenus/js/jquery.hoverIntent.minified.js') 
    35         add_stylesheet(req, 'tracmenus/css/superfish.css') 
     36                                                               req.chrome['nav_orig'])) 
     37            if menu_name=='ctxtnav': 
     38                req.chrome['ctxtnav'] = [ ctxt_item.get('label') for ctxt_item in req.chrome['nav'][menu_name] ] 
     39                 
     40        if self.serve_ui_files: 
     41            add_script(req, 'tracmenus/js/superfish.js') 
     42            add_script(req, 'tracmenus/js/tracmenus.js') 
     43            add_script(req, 'tracmenus/js/jquery.hoverIntent.minified.js') 
     44            add_stylesheet(req, 'tracmenus/css/superfish.css') 
    3645        return template, data, content_type 
    3746         
    38     def _get_menu(self, req, menu_name, menu_orig): 
    39         config_menu = self._get_config_menus(req, menu_name) 
     47    def _get_menu(self, req, menu_name, nav_orig): 
     48        config_menu, config_options = self._get_config_menus(req, menu_name) 
     49        menu_orig = nav_orig.get(menu_name, []) 
     50         
     51        if 'inherit' in config_options: 
     52            menu_orig += nav_orig.get(config_options['inherit'], []) 
     53             
    4054        tree_menu={}  
    4155        for option in sorted(menu_orig+[{'name':key} for key in config_menu.keys()],  
    4256                             key=lambda x:config_menu.get(x['name'],{}).get('order','0')): 
    43             if 'visited' in tree_menu.get(option['name'],[]) or config_menu.get(option['name'],{}).get('enabled', True)==False: 
     57            if 'visited' in tree_menu.get(option['name'],[]) \ 
     58                    or config_menu.get(option['name'],{}).get('enabled', True)==False \ 
     59                    or config_menu.get(option['name'],{}).get('if_path_info', True)==False: 
    4460                continue 
    4561            name=option['name'] 
     
    7490    def _get_config_menus(self, req, menu_name): 
    7591        new_menu_option=lambda name: dict(name=name, parent_name='top') 
    76         menu={} 
     92        menu, options = {}, {} 
    7793        for option, value in self.config[menu_name].options(): 
    7894            item_parts = option.split('.',1) 
    7995            name, prop_name = item_parts[0], len(item_parts)>1 and item_parts[1] or 'enabled' 
     96            if name in ['inherit']: 
     97                options[name] = value 
     98                continue 
    8099            menu.setdefault(name, new_menu_option(name))  
    81100            if prop_name=='parent': 
     
    85104                value=self.config[menu_name].getbool(option, True) 
    86105            elif prop_name=='href': 
     106                value = value.replace('$PATH_INFO', req.path_info) 
    87107                menu[name]['label']=menu[name].setdefault('label', html.a())(href=value.startswith('/') and req.href()+value or value) 
    88108            elif prop_name=='label': 
    89109                menu[name].setdefault('label', html.a())(value) 
    90110                continue 
     111            elif prop_name=='path_info': 
     112                menu[name]['if_path_info'] = re.match(value, req.path_info) and True or False 
    91113            menu[name][prop_name]=value 
    92         return menu 
     114        return menu, options