work in progress: layout composer
git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2889 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
d83b3ab5c6
commit
7793462e9a
6 changed files with 80 additions and 22 deletions
|
@ -8,10 +8,11 @@ Layout Management
|
||||||
>>> from zope.interface import Interface
|
>>> from zope.interface import Interface
|
||||||
|
|
||||||
>>> from cybertools.composer.layout.base import LayoutManager
|
>>> from cybertools.composer.layout.base import LayoutManager
|
||||||
>>> component.provideUtility(LayoutManager())
|
>>> manager = LayoutManager()
|
||||||
|
>>> component.provideUtility(manager)
|
||||||
|
|
||||||
>>> from cybertools.composer.layout.base import Layout, LayoutInstance
|
>>> from zope.traversing.adapters import DefaultTraversable
|
||||||
>>> from cybertools.composer.layout.browser.liquid.default import BodyLayout
|
>>> component.provideAdapter(DefaultTraversable, (Interface,))
|
||||||
|
|
||||||
|
|
||||||
Browser Views
|
Browser Views
|
||||||
|
@ -20,19 +21,19 @@ Browser Views
|
||||||
>>> from zope.app.pagetemplate import ViewPageTemplateFile
|
>>> from zope.app.pagetemplate import ViewPageTemplateFile
|
||||||
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
|
>>> standardRenderers = ViewPageTemplateFile('browser/standard.pt').macros
|
||||||
|
|
||||||
>>> from zope.traversing.adapters import DefaultTraversable
|
>>> from cybertools.composer.layout.base import Layout
|
||||||
>>> component.provideAdapter(DefaultTraversable, (Interface,))
|
>>> from cybertools.composer.layout.interfaces import ILayout
|
||||||
|
|
||||||
>>> css = Layout() # ResourceCollection()
|
>>> #css = Layout('page.css', renderer=standardRenderers['css'])
|
||||||
>>> css.renderer = standardRenderers['css'] # resourceRenderers['css']
|
>>> # css = ResourceCollection('css', resourceRenderers['css'])
|
||||||
>>> css.registerFor('page.css')
|
>>> #component.provideUtility(css, ILayout, name='css')
|
||||||
|
|
||||||
|
>>> from cybertools.composer.layout.browser.liquid.default import BodyLayout
|
||||||
>>> bodyLayout = BodyLayout()
|
>>> bodyLayout = BodyLayout()
|
||||||
>>> bodyLayout.registerFor('page.body')
|
>>> component.provideUtility(bodyLayout, ILayout, name='body.liquid')
|
||||||
|
|
||||||
>>> footerLayout = Layout()
|
>>> footerLayout = Layout('body.footer', renderer=standardRenderers['footer'])
|
||||||
>>> footerLayout.renderer = standardRenderers['footer']
|
>>> component.provideUtility(footerLayout, ILayout, name='footer.default')
|
||||||
>>> footerLayout.registerFor('body.footer')
|
|
||||||
|
|
||||||
>>> from cybertools.composer.layout.browser.view import Page
|
>>> from cybertools.composer.layout.browser.view import Page
|
||||||
>>> from zope.publisher.browser import TestRequest
|
>>> from zope.publisher.browser import TestRequest
|
||||||
|
|
|
@ -22,6 +22,7 @@ Basic classes for layouts and layout components.
|
||||||
$Id$
|
$Id$
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from zope.cachedescriptors.property import Lazy
|
||||||
from zope import component
|
from zope import component
|
||||||
from zope.interface import implements
|
from zope.interface import implements
|
||||||
|
|
||||||
|
@ -37,8 +38,21 @@ class LayoutManager(object):
|
||||||
|
|
||||||
implements(ILayoutManager)
|
implements(ILayoutManager)
|
||||||
|
|
||||||
def __init__(self):
|
@Lazy
|
||||||
self.regions = {}
|
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):
|
def register(self, layout, regionName):
|
||||||
region = self.regions.setdefault(regionName, Region(regionName))
|
region = self.regions.setdefault(regionName, Region(regionName))
|
||||||
|
@ -50,12 +64,19 @@ class Layout(Template):
|
||||||
implements(ILayout)
|
implements(ILayout)
|
||||||
|
|
||||||
name = ''
|
name = ''
|
||||||
manager = None
|
|
||||||
renderer = 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):
|
def registerFor(self, regionName):
|
||||||
manager = component.getUtility(ILayoutManager)
|
manager = component.getUtility(ILayoutManager)
|
||||||
manager.register(self, regionName)
|
manager.register(self, regionName)
|
||||||
|
self.regionName = regionName
|
||||||
|
|
||||||
|
|
||||||
class LayoutInstance(object):
|
class LayoutInstance(object):
|
||||||
|
|
33
composer/layout/browser/default.py
Normal file
33
composer/layout/browser/default.py
Normal file
|
@ -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'])
|
|
@ -35,6 +35,11 @@ template = ViewPageTemplateFile('default.pt')
|
||||||
|
|
||||||
class BodyLayout(Layout):
|
class BodyLayout(Layout):
|
||||||
|
|
||||||
|
regionName = 'page.body'
|
||||||
|
|
||||||
|
def __init__(self):
|
||||||
|
pass
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def renderer(self):
|
def renderer(self):
|
||||||
return template.macros['body']
|
return template.macros['body']
|
||||||
|
|
|
@ -51,7 +51,7 @@ class BaseView(object):
|
||||||
class Page(BaseView):
|
class Page(BaseView):
|
||||||
|
|
||||||
def __call__(self):
|
def __call__(self):
|
||||||
layout = Layout()
|
layout = Layout('page')
|
||||||
layout.renderer = ViewPageTemplateFile('main.pt').macros['page']
|
layout.renderer = ViewPageTemplateFile('main.pt').macros['page']
|
||||||
instance = LayoutInstance(self.context)
|
instance = LayoutInstance(self.context)
|
||||||
instance.template = layout
|
instance.template = layout
|
||||||
|
@ -83,9 +83,9 @@ class LayoutView(BaseView):
|
||||||
def resources(self):
|
def resources(self):
|
||||||
return ViewResources(self)
|
return ViewResources(self)
|
||||||
|
|
||||||
def getRegion(self, key):
|
def getLayoutsFor(self, key, **kw):
|
||||||
manager = component.getUtility(ILayoutManager)
|
manager = component.getUtility(ILayoutManager)
|
||||||
return manager.regions.get('.'.join((self.name, key)))
|
return manager.getLayouts('.'.join((self.name, key)), **kw)
|
||||||
|
|
||||||
|
|
||||||
# subview providers
|
# subview providers
|
||||||
|
@ -97,11 +97,8 @@ class ViewLayouts(object):
|
||||||
|
|
||||||
def __getitem__(self, key):
|
def __getitem__(self, key):
|
||||||
view = self.view
|
view = self.view
|
||||||
region = view.getRegion(key)
|
|
||||||
if region is None:
|
|
||||||
return []
|
|
||||||
subviews = []
|
subviews = []
|
||||||
for layout in region.layouts:
|
for layout in view.getLayoutsFor(key):
|
||||||
instance = LayoutInstance(view.client)
|
instance = LayoutInstance(view.client)
|
||||||
instance.template = layout
|
instance.template = layout
|
||||||
instance.view = view
|
instance.view = view
|
||||||
|
|
|
@ -58,6 +58,7 @@ class SchemaFactory(object):
|
||||||
schema.Date: ('date',),
|
schema.Date: ('date',),
|
||||||
schema.Datetime: ('date',),
|
schema.Datetime: ('date',),
|
||||||
schema.Int: ('number',),
|
schema.Int: ('number',),
|
||||||
|
schema.Float: ('number',),
|
||||||
schema.Bool: ('checkbox',),
|
schema.Bool: ('checkbox',),
|
||||||
schema.List: ('list',),
|
schema.List: ('list',),
|
||||||
schema.Choice: ('dropdown',),
|
schema.Choice: ('dropdown',),
|
||||||
|
|
Loading…
Add table
Reference in a new issue