--- a/src/pyams_file/zmi/image.py Thu Apr 21 16:40:03 2016 +0200
+++ b/src/pyams_file/zmi/image.py Tue Nov 15 09:55:02 2016 +0100
@@ -16,7 +16,7 @@
# import standard library
# import interfaces
-from pyams_file.interfaces import IImage, IThumnailImageWidget, IThumbnail
+from pyams_file.interfaces import IImage, IThumbnail, IResponsiveImage, IImageWidget
from pyams_form.interfaces.form import IWidgetsPrefixViewletsManager, IFormHelp
from pyams_skin.interfaces.viewlet import IContextActions
from pyams_skin.layer import IPyAMSLayer
@@ -24,7 +24,7 @@
from pyams_zmi.layer import IAdminLayer
# import packages
-from pyams_file.image import ThumbnailGeometrry
+from pyams_file.image import ThumbnailGeometry
from pyams_form.form import AJAXEditForm
from pyams_form.help import FormHelp
from pyams_form.schema import CloseButton
@@ -43,7 +43,7 @@
from pyams_file import _
-@viewlet_config(name='image.resize.divider', context=IImage, layer=IPyAMSLayer, view=Interface,
+@viewlet_config(name='image.resize.divider', context=IImage, layer=IPyAMSLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=19)
class ImageDividerAction(ToolbarMenuDivider):
"""Image divider action"""
@@ -53,7 +53,7 @@
# Image resize
#
-@viewlet_config(name='image.resize.action', context=IImage, layer=IPyAMSLayer, view=Interface,
+@viewlet_config(name='image.resize.action', context=IImage, layer=IPyAMSLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=20)
class ImageResizeAction(ToolbarMenuItem):
"""Image resize action"""
@@ -153,7 +153,7 @@
# Image crop
#
-@viewlet_config(name='image.crop.action', context=IImage, layer=IPyAMSLayer, view=Interface,
+@viewlet_config(name='image.crop.action', context=IImage, layer=IPyAMSLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=21)
class ImageCropAction(ToolbarMenuItem):
"""Image crop action"""
@@ -224,7 +224,7 @@
# Image square thumbnail selection
#
-@viewlet_config(name='image.thumb.divider', context=IImage, layer=IPyAMSLayer, view=IThumnailImageWidget,
+@viewlet_config(name='image.thumb.divider', context=IImage, layer=IPyAMSLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=30)
class ImageThumbnailsDividerAction(ToolbarMenuDivider):
"""Image divider action"""
@@ -237,7 +237,7 @@
crop = button.Button(name='crop', title=_("Select thumbnail"))
-@viewlet_config(name='image.thumb.square.action', context=IImage, layer=IPyAMSLayer, view=IThumnailImageWidget,
+@viewlet_config(name='image.thumb.square.action', context=IImage, layer=IPyAMSLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=31)
class ImageSquareThumbnailAction(ToolbarMenuItem):
"""Square thumbnail image selection"""
@@ -277,12 +277,12 @@
"""Image square thumbnail edit form, AJAX renderer"""
def update_content(self, content, data):
- geometry = ThumbnailGeometrry()
+ geometry = ThumbnailGeometry()
geometry.x1 = int(self.request.params.get('selection.x1'))
geometry.y1 = int(self.request.params.get('selection.y1'))
geometry.x2 = int(self.request.params.get('selection.x2'))
geometry.y2 = int(self.request.params.get('selection.y2'))
- IThumbnail(self.context).set_thumbnail_geometry('square', geometry)
+ IThumbnail(self.context).set_geometry('square', geometry)
def get_ajax_output(self, changes):
return {'status': 'success',
@@ -301,7 +301,7 @@
# Image panoramic thumbnail selection
#
-@viewlet_config(name='image.thumb.pano.action', context=IImage, layer=IAdminLayer, view=IThumnailImageWidget,
+@viewlet_config(name='image.thumb.pano.action', context=IImage, layer=IAdminLayer, view=IImageWidget,
manager=IContextActions, permission=MANAGE_PERMISSION, weight=32)
class ImagePanoThumbnailAction(ToolbarMenuItem):
"""Panoramic thumbnail image selection"""
@@ -312,11 +312,6 @@
url = 'pano-thumbnail.html'
modal_target = True
- def updateActions(self):
- super(ImageSquareThumbnailEditForm, self).updateActions()
- if 'crop' in self.actions:
- self.actions['crop'].addClass('btn-primary')
-
@pagelet_config(name='pano-thumbnail.html', context=IImage, layer=IPyAMSLayer, permission=MANAGE_PERMISSION)
class ImagePanoThumbnailEditForm(AdminDialogEditForm):
@@ -346,12 +341,12 @@
"""Image panoramic thumbnail edit form, AJAX renderer"""
def update_content(self, content, data):
- geometry = ThumbnailGeometrry()
+ geometry = ThumbnailGeometry()
geometry.x1 = int(self.request.params.get('selection.x1'))
geometry.y1 = int(self.request.params.get('selection.y1'))
geometry.x2 = int(self.request.params.get('selection.x2'))
geometry.y2 = int(self.request.params.get('selection.y2'))
- IThumbnail(self.context).set_thumbnail_geometry('pano', geometry)
+ IThumbnail(self.context).set_geometry('pano', geometry)
def get_ajax_output(self, changes):
return {'status': 'success',
@@ -364,3 +359,198 @@
@template_config(template='templates/image-pano-thumbnail.pt')
class ImagePanoThumbnailViewletsPrefix(Viewlet):
"""Image panoramic thumbnail viewlets prefix"""
+
+
+#
+# Image responsive selections
+#
+
+@viewlet_config(name='responsive-image.selection.divider', context=IResponsiveImage, layer=IPyAMSLayer,
+ view=IImageWidget, manager=IContextActions, permission=MANAGE_PERMISSION, weight=40)
+class ResponsiveImageSelectionDividerAction(ToolbarMenuDivider):
+ """Image divider action"""
+
+
+class IResponsiveImageSelectionFormButtons(Interface):
+ """Responsive image selection form buttons"""
+
+ close = CloseButton(name='close', title=_("Close"))
+ select = button.Button(name='select', title=_("Select image"))
+
+
+class ResponsiveImageSelectionForm(AdminDialogEditForm):
+ """Base responsive image selection edit form"""
+
+ dialog_class = 'modal-large'
+
+ fields = field.Fields(Interface)
+ buttons = button.Buttons(IResponsiveImageSelectionFormButtons)
+
+ @property
+ def title(self):
+ return self.context.title or self.context.filename
+
+ def updateActions(self):
+ super(ResponsiveImageSelectionForm, self).updateActions()
+ if 'select' in self.actions:
+ self.actions['select'].addClass('btn-primary')
+
+
+class ResponsiveImageSelectionAJAXForm(AJAXEditForm):
+ """Base responsive image selection edit form, JSON renderer"""
+
+ def update_content(self, content, data):
+ geometry = ThumbnailGeometry()
+ geometry.x1 = int(self.request.params.get('selection.x1'))
+ geometry.y1 = int(self.request.params.get('selection.y1'))
+ geometry.x2 = int(self.request.params.get('selection.x2'))
+ geometry.y2 = int(self.request.params.get('selection.y2'))
+ IThumbnail(self.context).set_geometry(self.selection_size, geometry)
+
+ def get_ajax_output(self, changes):
+ return {'status': 'success',
+ 'smallbox': self.request.localizer.translate(self.successMessage),
+ 'smallbox_status': 'success'}
+
+
+@viewlet_config(name='responsive-image.selection.widgets-prefix', context=IResponsiveImage, layer=IAdminLayer,
+ view=ResponsiveImageSelectionForm, manager=IWidgetsPrefixViewletsManager)
+@template_config(template='templates/image-selection.pt')
+class ResponsiveImageSelectionViewletsPrefix(Viewlet):
+ """Responsive image selection viewlets prefix"""
+
+
+#
+# Extra-small devices selection
+#
+
+@viewlet_config(name='responsive-image.selection.xs.action', context=IResponsiveImage, layer=IAdminLayer,
+ view=IImageWidget, manager=IContextActions, permission=MANAGE_PERMISSION, weight=41)
+class ResponsiveImageXsSelectionAction(ToolbarMenuItem):
+ """Responsive image XS selection"""
+
+ label = _("Select responsive XS image...")
+ label_css_class = 'fa fa-fw fa-mobile'
+
+ url = 'selection-xs.html'
+ modal_target = True
+
+
+@pagelet_config(name='selection-xs.html', context=IResponsiveImage, layer=IPyAMSLayer,
+ permission=MANAGE_PERMISSION)
+class ResponsiveImageXsSelectionForm(ResponsiveImageSelectionForm):
+ """Responsive image XS selection edit form"""
+
+ legend = _("Select image for extra-small (XS) devices")
+ icon_css_class = 'fa fa-fw fa-mobile'
+
+ selection_size = 'xs'
+ ajax_handler = 'selection-xs.json'
+
+
+@view_config(name='selection-xs.json', context=IResponsiveImage, request_type=IPyAMSLayer,
+ permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class ResponsiveImageXsSelectionAJAXEditForm(ResponsiveImageSelectionAJAXForm, ResponsiveImageXsSelectionForm):
+ """Responsive image XS selection edit form, JSON renderer"""
+
+
+#
+# Small devices selection
+#
+
+@viewlet_config(name='responsive-image.selection.sm.action', context=IResponsiveImage, layer=IAdminLayer,
+ view=IImageWidget, manager=IContextActions, permission=MANAGE_PERMISSION, weight=42)
+class ResponsiveImageSmSelectionAction(ToolbarMenuItem):
+ """Responsive image SM selection"""
+
+ label = _("Select responsive SM image...")
+ label_css_class = 'fa fa-fw fa-tablet'
+
+ url = 'selection-sm.html'
+ modal_target = True
+
+
+@pagelet_config(name='selection-sm.html', context=IResponsiveImage, layer=IPyAMSLayer,
+ permission=MANAGE_PERMISSION)
+class ResponsiveImageSmSelectionForm(ResponsiveImageSelectionForm):
+ """Responsive image SM selection edit form"""
+
+ legend = _("Select image for small (SM) devices")
+ icon_css_class = 'fa fa-fw fa-tablet'
+
+ selection_size = 'sm'
+ ajax_handler = 'selection-sm.json'
+
+
+@view_config(name='selection-sm.json', context=IResponsiveImage, request_type=IPyAMSLayer,
+ permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class ResponsiveImageSmSelectionAJAXEditForm(ResponsiveImageSelectionAJAXForm, ResponsiveImageSmSelectionForm):
+ """Responsive image SM selection edit form, JSON renderer"""
+
+
+#
+# Medium devices selection
+#
+
+@viewlet_config(name='responsive-image.selection.md.action', context=IResponsiveImage, layer=IAdminLayer,
+ view=IImageWidget, manager=IContextActions, permission=MANAGE_PERMISSION, weight=43)
+class ResponsiveImageMdSelectionAction(ToolbarMenuItem):
+ """Responsive image MD selection"""
+
+ label = _("Select responsive MD image...")
+ label_css_class = 'fa fa-fw fa-desktop'
+
+ url = 'selection-md.html'
+ modal_target = True
+
+
+@pagelet_config(name='selection-md.html', context=IResponsiveImage, layer=IPyAMSLayer,
+ permission=MANAGE_PERMISSION)
+class ResponsiveImageMdSelectionForm(ResponsiveImageSelectionForm):
+ """Responsive image MD selection edit form"""
+
+ legend = _("Select image for medium (MD) devices")
+ icon_css_class = 'fa fa-fw fa-desktop'
+
+ selection_size = 'md'
+ ajax_handler = 'selection-md.json'
+
+
+@view_config(name='selection-md.json', context=IResponsiveImage, request_type=IPyAMSLayer,
+ permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class ResponsiveImageMdSelectionAJAXEditForm(ResponsiveImageSelectionAJAXForm, ResponsiveImageMdSelectionForm):
+ """Responsive image MD selection edit form, JSON renderer"""
+
+
+#
+# Large devices selection
+#
+
+@viewlet_config(name='responsive-image.selection.lg.action', context=IResponsiveImage, layer=IAdminLayer,
+ view=IImageWidget, manager=IContextActions, permission=MANAGE_PERMISSION, weight=44)
+class ResponsiveImageLgSelectionAction(ToolbarMenuItem):
+ """Responsive image LG selection"""
+
+ label = _("Select responsive LG image...")
+ label_css_class = 'fa fa-fw fa-television'
+
+ url = 'selection-lg.html'
+ modal_target = True
+
+
+@pagelet_config(name='selection-lg.html', context=IResponsiveImage, layer=IPyAMSLayer,
+ permission=MANAGE_PERMISSION)
+class ResponsiveImageLgSelectionForm(ResponsiveImageSelectionForm):
+ """Responsive image LG selection edit form"""
+
+ legend = _("Select image for large (LG) devices")
+ icon_css_class = 'fa fa-fw fa-television'
+
+ selection_size = 'lg'
+ ajax_handler = 'selection-lg.json'
+
+
+@view_config(name='selection-lg.json', context=IResponsiveImage, request_type=IPyAMSLayer,
+ permission=MANAGE_PERMISSION, renderer='json', xhr=True)
+class ResponsiveImageLgSelectionAJAXEditForm(ResponsiveImageSelectionAJAXForm, ResponsiveImageLgSelectionForm):
+ """Responsive image LG selection edit form, JSON renderer"""