diff --git a/composer/layout/README.txt b/composer/layout/README.txt index a54136c..9ce03e2 100644 --- a/composer/layout/README.txt +++ b/composer/layout/README.txt @@ -8,10 +8,11 @@ Layout Management >>> from zope.interface import Interface >>> from cybertools.composer.layout.base import LayoutManager - >>> component.provideUtility(LayoutManager()) + >>> manager = LayoutManager() + >>> component.provideUtility(manager) - >>> from cybertools.composer.layout.base import Layout, LayoutInstance - >>> from cybertools.composer.layout.browser.liquid.default import BodyLayout + >>> from zope.traversing.adapters import DefaultTraversable + >>> component.provideAdapter(DefaultTraversable, (Interface,)) Browser Views @@ -20,19 +21,19 @@ Browser Views >>> from zope.app.pagetemplate import ViewPageTemplateFile >>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros - >>> from zope.traversing.adapters import DefaultTraversable - >>> component.provideAdapter(DefaultTraversable, (Interface,)) + >>> from cybertools.composer.layout.base import Layout + >>> from cybertools.composer.layout.interfaces import ILayout - >>> css = Layout() # ResourceCollection() - >>> css.renderer = standardRenderers['css'] # resourceRenderers['css'] - >>> css.registerFor('page.css') + >>> #css = Layout('page.css', renderer=standardRenderers['css']) + >>> # css = ResourceCollection('css', resourceRenderers['css']) + >>> #component.provideUtility(css, ILayout, name='css') + >>> from cybertools.composer.layout.browser.liquid.default import BodyLayout >>> bodyLayout = BodyLayout() - >>> bodyLayout.registerFor('page.body') + >>> component.provideUtility(bodyLayout, ILayout, name='body.liquid') - >>> footerLayout = Layout() - >>> footerLayout.renderer = standardRenderers['footer'] - >>> footerLayout.registerFor('body.footer') + >>> footerLayout = Layout('body.footer', renderer=standardRenderers['footer']) + >>> component.provideUtility(footerLayout, ILayout, name='footer.default') >>> from cybertools.composer.layout.browser.view import Page >>> from zope.publisher.browser import TestRequest diff --git a/composer/layout/base.py b/composer/layout/base.py index cc76259..ae65121 100644 --- a/composer/layout/base.py +++ b/composer/layout/base.py @@ -22,6 +22,7 @@ Basic classes for layouts and layout components. $Id$ """ +from zope.cachedescriptors.property import Lazy from zope import component from zope.interface import implements @@ -37,8 +38,21 @@ class LayoutManager(object): implements(ILayoutManager) - def __init__(self): - self.regions = {} + @Lazy + def regions(self): + result = {} + for name, layout in component.getUtilitiesFor(ILayout): + region = result.setdefault(layout.regionName, + Region(layout.regionName)) + region.layouts.append(layout) + return result + + def getLayouts(self, key, **kw): + region = self.regions.get(key) + if region is None: + return [] + # TODO: filter region.layouts + return region.layouts def register(self, layout, regionName): region = self.regions.setdefault(regionName, Region(regionName)) @@ -50,12 +64,19 @@ class Layout(Template): implements(ILayout) name = '' - manager = None renderer = None + regionName = None + skin = 'default' + + def __init__(self, regionName, **kw): + self.regionName = regionName + for k, v in kw.items(): + setattr(self, k, v) def registerFor(self, regionName): manager = component.getUtility(ILayoutManager) manager.register(self, regionName) + self.regionName = regionName class LayoutInstance(object): diff --git a/composer/layout/browser/default.py b/composer/layout/browser/default.py new file mode 100644 index 0000000..1949e26 --- /dev/null +++ b/composer/layout/browser/default.py @@ -0,0 +1,33 @@ +# +# Copyright (c) 2008 Helmut Merz helmutm@cy55.de +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# + +""" +Default layouts. + +$Id$ +""" + +from zope.app.pagetemplate import ViewPageTemplateFile + +from cybertools.composer.layout.base import Layout + + +standardRenderers = ViewPageTemplateFile('standard.pt').macros + + +footer = Layout('body.footer', renderer=standardRenderers['footer']) diff --git a/composer/layout/browser/liquid/default.py b/composer/layout/browser/liquid/default.py index 3ca7038..cbc0b49 100644 --- a/composer/layout/browser/liquid/default.py +++ b/composer/layout/browser/liquid/default.py @@ -35,6 +35,11 @@ template = ViewPageTemplateFile('default.pt') class BodyLayout(Layout): + regionName = 'page.body' + + def __init__(self): + pass + @Lazy def renderer(self): return template.macros['body'] diff --git a/composer/layout/browser/view.py b/composer/layout/browser/view.py index 1330ea0..a58b43a 100644 --- a/composer/layout/browser/view.py +++ b/composer/layout/browser/view.py @@ -51,7 +51,7 @@ class BaseView(object): class Page(BaseView): def __call__(self): - layout = Layout() + layout = Layout('page') layout.renderer = ViewPageTemplateFile('main.pt').macros['page'] instance = LayoutInstance(self.context) instance.template = layout @@ -83,9 +83,9 @@ class LayoutView(BaseView): def resources(self): return ViewResources(self) - def getRegion(self, key): + def getLayoutsFor(self, key, **kw): manager = component.getUtility(ILayoutManager) - return manager.regions.get('.'.join((self.name, key))) + return manager.getLayouts('.'.join((self.name, key)), **kw) # subview providers @@ -97,11 +97,8 @@ class ViewLayouts(object): def __getitem__(self, key): view = self.view - region = view.getRegion(key) - if region is None: - return [] subviews = [] - for layout in region.layouts: + for layout in view.getLayoutsFor(key): instance = LayoutInstance(view.client) instance.template = layout instance.view = view diff --git a/composer/schema/factory.py b/composer/schema/factory.py index 64dc1e9..5b3746f 100644 --- a/composer/schema/factory.py +++ b/composer/schema/factory.py @@ -58,6 +58,7 @@ class SchemaFactory(object): schema.Date: ('date',), schema.Datetime: ('date',), schema.Int: ('number',), + schema.Float: ('number',), schema.Bool: ('checkbox',), schema.List: ('list',), schema.Choice: ('dropdown',),