60 lines
1.9 KiB
Python
60 lines
1.9 KiB
Python
from flask.signals import appcontext_pushed
|
|
|
|
from .navbar import NavigationBar
|
|
from .item import Item, ItemReference
|
|
from .utils import BoundTypeProperty
|
|
from .signals import navbar_created
|
|
|
|
|
|
class Navigation(object):
|
|
"""The navigation extension API."""
|
|
|
|
#: The subclass of :class:`~flask.ext.navigation.navbar.NavigationBar`. It
|
|
#: bound with the the current instance.
|
|
#:
|
|
#: :type: :class:`~flask.ext.navigation.utils.BoundTypeProperty`
|
|
Bar = BoundTypeProperty('Bar', NavigationBar)
|
|
|
|
#: The subclass of :class:`~flask.ext.navigation.item.Item`. It bound with
|
|
#: the the current instance.
|
|
#:
|
|
#: :type: :class:`~flask.ext.navigation.utils.BoundTypeProperty`
|
|
Item = BoundTypeProperty('Item', Item)
|
|
|
|
ItemReference = ItemReference
|
|
|
|
def __init__(self, app=None):
|
|
self.bars = {}
|
|
if app is not None:
|
|
self.init_app(app)
|
|
# connects ext-level signals
|
|
navbar_created.connect(self.bind_bar, self.Bar)
|
|
|
|
def __getitem__(self, name):
|
|
"""Gets a bound navigation bar by its name."""
|
|
return self.bars[name]
|
|
|
|
def init_app(self, app):
|
|
"""Initializes an app to work with this extension.
|
|
|
|
The app-context signals will be subscribed and the template context
|
|
will be initialized.
|
|
|
|
:param app: the :class:`flask.Flask` app instance.
|
|
"""
|
|
# connects app-level signals
|
|
appcontext_pushed.connect(self.initialize_bars, app)
|
|
# integrate with jinja template
|
|
app.add_template_global(self, 'nav')
|
|
|
|
def initialize_bars(self, sender=None, **kwargs):
|
|
"""Calls the initializers of all bound navigation bars."""
|
|
for bar in self.bars.values():
|
|
for initializer in bar.initializers:
|
|
initializer(self)
|
|
|
|
def bind_bar(self, sender=None, **kwargs):
|
|
"""Binds a navigation bar into this extension instance."""
|
|
bar = kwargs.pop('bar')
|
|
self.bars[bar.name] = bar
|