]> git.ipfire.org Git - people/ms/westferry.git/blob - src/westferry/ui/menu.py
Add a simple menu implementation
[people/ms/westferry.git] / src / westferry / ui / menu.py
1 #!/usr/bin/python3
2 ###############################################################################
3 # #
4 # Westferry - The IPFire web user interface #
5 # Copyright (C) 2015 IPFire development team #
6 # #
7 # This program is free software: you can redistribute it and/or modify #
8 # it under the terms of the GNU General Public License as published by #
9 # the Free Software Foundation, either version 3 of the License, or #
10 # (at your option) any later version. #
11 # #
12 # This program is distributed in the hope that it will be useful, #
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of #
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the #
15 # GNU General Public License for more details. #
16 # #
17 # You should have received a copy of the GNU General Public License #
18 # along with this program. If not, see <http://www.gnu.org/licenses/>. #
19 # #
20 ###############################################################################
21
22 from . import base
23
24 class MenuItem(object):
25 type = None
26
27 def __init__(self, menu=None):
28 self.menu = menu
29
30 def is_active(self):
31 return False
32
33
34 class MenuDivider(MenuItem):
35 type = "divider"
36
37
38 class MenuHeader(MenuItem):
39 type = "header"
40
41 def __init__(self, title, menu=None):
42 MenuItem.__init__(self, menu=menu)
43
44 self.title = title
45
46
47 class MenuLink(MenuItem):
48 type = "link"
49
50 def __init__(self, title, handler=None, url=None, menu=None):
51 MenuItem.__init__(self, menu=menu)
52
53 self.title = title
54 self.handler = handler
55
56 self.url = url or handler.url
57
58 def is_active(self):
59 if not self.handler:
60 return False
61
62 return isinstance(self.menu.handler, self.handler)
63
64
65 class MenuMixin(object):
66 type = "menu"
67
68 @property
69 def items(self):
70 if not hasattr(self, "_items"):
71 self._items = []
72
73 return self._items
74
75 def __iter__(self):
76 """
77 Iterator over all item in this menu
78 """
79 return iter(self.items)
80
81 def add_divider(self, *args, **kwargs):
82 """
83 Adds a divider to the menu
84 """
85 divider = MenuDivider(*args, **kwargs)
86 self.items.append(divider)
87
88 return divider
89
90 def add_handler(self, handler, title=None, **kwargs):
91 """
92 Automatically adds a handler to the menu
93 """
94 title = title or self.locale.translate(handler.title)
95
96 return self.add_link(title=title, handler=handler,
97 url=handler.url, **kwargs)
98
99 def add_header(self, *args, **kwargs):
100 """
101 Adds a headline in the menu
102 """
103 header = MenuHeader(*args, **kwargs)
104 self.items.append(header)
105
106 return header
107
108 def add_link(self, *args, **kwargs):
109 """
110 Adds a link to the menu
111 """
112 link = MenuLink(*args, menu=self, **kwargs)
113 self.items.append(link)
114
115 return link
116
117 def add_submenu(self, *args, **kwargs):
118 """
119 Adds a submenu to the menu
120 """
121 kwargs.update({
122 "menu" : self,
123 })
124
125 submenu = SubMenu(*args, **kwargs)
126 self.items.append(submenu)
127
128 return submenu
129
130
131 class Menu(MenuMixin):
132 """
133 The main menu object that creates a little menu on the side
134 """
135 def __init__(self, handler, title=None):
136 self.handler = handler
137 self.title = title
138
139 @property
140 def locale(self):
141 """
142 Shortcut to access the user's locale
143 """
144 return self.handler.locale
145
146
147
148 class SubMenu(MenuItem, MenuMixin):
149 """
150 A sub menu in the side menu
151 """
152
153 type = "menu"
154
155 def __init__(self, title, menu=None):
156 self.title = title
157 self.menu = menu
158
159 @property
160 def locale(self):
161 """
162 Shortcut to access the user's locale
163 """
164 return self.menu.locale
165
166
167 class SidebarMenuModule(base.BaseUIModule):
168 def render(self, menu):
169 return self.render_string("modules/menu/sidebar.html", menu=menu)
170
171
172 class SidebarMenuLinkModule(base.BaseUIModule):
173 def render(self, menu, item):
174 return self.render_string("modules/menu/sidebar-link.html", item=item)
175
176
177 class SidebarMenuDividerModule(base.BaseUIModule):
178 def render(self, menu, item):
179 return self.render_string("modules/menu/sidebar-divider.html")
180
181
182 class SidebarMenuSubMenuModule(base.BaseUIModule):
183 def render(self, menu, submenu):
184 return self.render_string("modules/menu/sidebar-submenu.html", submenu=submenu)
185
186
187 class SidebarMenuSubMenuHeaderModule(base.BaseUIModule):
188 def render(self, menu, item):
189 return self.render_string("modules/menu/sidebar-submenu-header.html", item=item)