]> git.ipfire.org Git - people/ms/westferry.git/blame - src/westferry/ui/menu.py
UI: Implement top menu bar
[people/ms/westferry.git] / src / westferry / ui / menu.py
CommitLineData
95da2e86
MT
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
22from . import base
23
a6144752
MT
24class 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
a6144752
MT
34class MenuHeader(MenuItem):
35 type = "header"
36
37 def __init__(self, title, menu=None):
38 MenuItem.__init__(self, menu=menu)
39
40 self.title = title
41
42
43class MenuLink(MenuItem):
44 type = "link"
45
46 def __init__(self, title, handler=None, url=None, menu=None):
47 MenuItem.__init__(self, menu=menu)
48
49 self.title = title
50 self.handler = handler
51
52 self.url = url or handler.url
53
54 def is_active(self):
55 if not self.handler:
56 return False
57
58 return isinstance(self.menu.handler, self.handler)
59
60
3e7374cd
MT
61class Menu(object):
62 """
63 The main menu object that creates a little menu on the side
64 """
a6144752
MT
65 type = "menu"
66
3e7374cd
MT
67 def __init__(self, handler, title=None, parent=None):
68 self.handler = handler
69 self.title = title
70 self.parent = parent
71
72 @property
73 def locale(self):
74 """
75 Shortcut to access the user's locale
76 """
77 return self.handler.locale
78
a6144752
MT
79 @property
80 def items(self):
81 if not hasattr(self, "_items"):
82 self._items = []
83
84 return self._items
85
86 def __iter__(self):
87 """
88 Iterator over all item in this menu
89 """
90 return iter(self.items)
91
3e7374cd
MT
92 def is_active(self):
93 return False
94
a6144752
MT
95 def add_handler(self, handler, title=None, **kwargs):
96 """
97 Automatically adds a handler to the menu
98 """
99 title = title or self.locale.translate(handler.title)
100
101 return self.add_link(title=title, handler=handler,
102 url=handler.url, **kwargs)
103
104 def add_header(self, *args, **kwargs):
105 """
106 Adds a headline in the menu
107 """
108 header = MenuHeader(*args, **kwargs)
109 self.items.append(header)
110
111 return header
112
113 def add_link(self, *args, **kwargs):
114 """
115 Adds a link to the menu
116 """
117 link = MenuLink(*args, menu=self, **kwargs)
118 self.items.append(link)
119
120 return link
121
3e7374cd 122 def add_menu(self, title, **kwargs):
a6144752 123 """
3e7374cd 124 Adds a sub-menu to the menu
a6144752 125 """
3e7374cd
MT
126 menu = Menu(self.handler, parent=self, title=title, **kwargs)
127 self.items.append(menu)
a6144752 128
3e7374cd 129 return menu
03f518c7 130
a6144752 131
17eb42fd
MT
132class TopbarMenuModule(base.BaseUIModule):
133 def render(self, menu):
134 return self.render_string("modules/menu/topbar.html", menu=menu)
135
136
95da2e86 137class SidebarMenuModule(base.BaseUIModule):
3c9a9d48
MT
138 def render(self, menu, nested=False):
139 return self.render_string(
140 "modules/menu/sidebar.html",
141 menu=menu,
142 nested=nested,
143 )
a6144752
MT
144
145
17eb42fd
MT
146class MenuLinkModule(base.BaseUIModule):
147 def render(self, element):
148 return self.render_string("modules/menu/link.html", element=element)
149
150
151class MenuDropdownModule(base.BaseUIModule):
152 def render(self, menu, nested=False):
153 return self.render_string("modules/menu/dropdown.html",
154 menu=menu, nested=nested)