src/pyams_file/zmi/image.py
changeset 31 58686bb1a7b9
parent 24 0ae2f9d50bb6
child 33 bd1f5624dce8
--- 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"""