]> git.ipfire.org Git - people/ms/westferry.git/blob - src/westferry/ui/menus.py
menus: Refactor code and simplify class names
[people/ms/westferry.git] / src / westferry / ui / menus.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 Element(object):
25 def __init__(self, menu, **kwargs):
26 self.menu = menu
27
28 # Call initializer for inheriting classes
29 self.initialize(**kwargs)
30
31 def initialize(self):
32 pass
33
34 def is_active(self):
35 return False
36
37
38 class Header(Element):
39 def initialize(self, title):
40 self.title = title
41
42
43 class Link(Element):
44 def initialize(self, title, handler=None, url=None):
45 self.title = title
46 self.handler = handler
47 self.url = url
48
49 def is_active(self):
50 if not self.handler:
51 return False
52
53 return isinstance(self.menu.handler, self.handler)
54
55
56 class Menu(object):
57 """
58 The main menu object that creates a little menu on the side
59 """
60 type = "menu"
61
62 def __init__(self, handler, title=None, parent=None):
63 self.handler = handler
64 self.title = title
65 self.parent = parent
66
67 self.elements = []
68
69 @property
70 def locale(self):
71 """
72 Shortcut to access the user's locale
73 """
74 return self.handler.locale
75
76 def __iter__(self):
77 """
78 Iterator over all item in this menu
79 """
80 return iter(self.elements)
81
82 def is_active(self):
83 return False
84
85 def _add_element(self, cls, *args, **kwargs):
86 element = cls(self, *args, **kwargs)
87 self.elements.append(element)
88
89 return element
90
91 def add_link(self, *args, **kwargs):
92 """
93 Adds a link to the menu
94 """
95 return self._add_element(Link, *args, **kwargs)
96
97 def add_handler(self, handler, title=None, **kwargs):
98 """
99 Automatically adds a handler to the menu
100 """
101 title = title or self.locale.translate(handler.title)
102
103 return self.add_link(title=title, handler=handler,
104 url=handler.url, **kwargs)
105
106 def add_header(self, *args, **kwargs):
107 """
108 Adds a headline in the menu
109 """
110 return self._add_element(Header, *args, **kwargs)
111
112 def add_menu(self, title, **kwargs):
113 """
114 Adds a sub-menu to the menu
115 """
116 return self._add_element(Menu, title=title, parent=self, **kwargs)
117
118
119 class TopbarMenuModule(base.BaseUIModule):
120 def render(self, menu):
121 return self.render_string("modules/menus/topbar.html", menu=menu)
122
123
124 class SidebarMenuModule(base.BaseUIModule):
125 def render(self, menu, nested=False):
126 return self.render_string(
127 "modules/menus/sidebar.html",
128 menu=menu,
129 nested=nested,
130 )
131
132
133 class MenuLinkModule(base.BaseUIModule):
134 def render(self, element):
135 return self.render_string("modules/menus/link.html", element=element)
136
137
138 class MenuDropdownModule(base.BaseUIModule):
139 def render(self, menu, nested=False):
140 return self.render_string("modules/menus/dropdown.html",
141 menu=menu, nested=nested)