+{% import westferry.ui.menus %}
+
<ul class="vertical menu">
- {% for i in menu %}
- <li {% if i.is_active() %}class="is-active"{% end %}>
- {% if i.type == "link" %}
- {% module MenuLink(i) %}
- {% elif i.type == "menu" %}
- {% module SidebarMenu(i, nested=True) %}
+ {% for element in menu %}
+ <li {% if element.is_active() %}class="is-active"{% end %}>
+ {% if isinstance(element, westferry.ui.menus.Menu) %}
+ {% module SidebarMenu(element, nested=True) %}
+ {% elif isinstance(element, westferry.ui.menus.Link) %}
+ {% module MenuLink(element) %}
{% end %}
</li>
{% end %}
from . import base
-class MenuItem(object):
- type = None
-
- def __init__(self, menu=None):
+class Element(object):
+ def __init__(self, menu, **kwargs):
self.menu = menu
- def is_active(self):
- return False
+ # Call initializer for inheriting classes
+ self.initialize(**kwargs)
+ def initialize(self):
+ pass
-class MenuHeader(MenuItem):
- type = "header"
+ def is_active(self):
+ return False
- def __init__(self, title, menu=None):
- MenuItem.__init__(self, menu=menu)
+class Header(Element):
+ def initialize(self, title):
self.title = title
-class MenuLink(MenuItem):
- type = "link"
-
- def __init__(self, title, handler=None, url=None, menu=None):
- MenuItem.__init__(self, menu=menu)
-
+class Link(Element):
+ def initialize(self, title, handler=None, url=None):
self.title = title
self.handler = handler
-
- self.url = url or handler.url
+ self.url = url
def is_active(self):
if not self.handler:
self.title = title
self.parent = parent
+ self.elements = []
+
@property
def locale(self):
"""
"""
return self.handler.locale
- @property
- def items(self):
- if not hasattr(self, "_items"):
- self._items = []
-
- return self._items
-
def __iter__(self):
"""
Iterator over all item in this menu
"""
- return iter(self.items)
+ return iter(self.elements)
def is_active(self):
return False
+ def _add_element(self, cls, *args, **kwargs):
+ element = cls(self, *args, **kwargs)
+ self.elements.append(element)
+
+ return element
+
+ def add_link(self, *args, **kwargs):
+ """
+ Adds a link to the menu
+ """
+ return self._add_element(Link, *args, **kwargs)
+
def add_handler(self, handler, title=None, **kwargs):
"""
Automatically adds a handler to the menu
"""
Adds a headline in the menu
"""
- header = MenuHeader(*args, **kwargs)
- self.items.append(header)
-
- return header
-
- def add_link(self, *args, **kwargs):
- """
- Adds a link to the menu
- """
- link = MenuLink(*args, menu=self, **kwargs)
- self.items.append(link)
-
- return link
+ return self._add_element(Header, *args, **kwargs)
def add_menu(self, title, **kwargs):
"""
Adds a sub-menu to the menu
"""
- menu = Menu(self.handler, parent=self, title=title, **kwargs)
- self.items.append(menu)
-
- return menu
+ return self._add_element(Menu, title=title, parent=self, **kwargs)
class TopbarMenuModule(base.BaseUIModule):