src/pyams_form/widget/__init__.py
changeset 10 674e6e01ea54
parent 7 51b8d68d9c4d
child 16 2f2596eee744
--- a/src/pyams_form/widget/__init__.py	Fri Mar 20 17:29:54 2015 +0100
+++ b/src/pyams_form/widget/__init__.py	Wed Apr 15 15:00:56 2015 +0200
@@ -19,10 +19,12 @@
 import venusian
 
 # import interfaces
-from pyams_form.interfaces.form import IFormLayer, IResetWidget, ICloseWidget, IDateWidget, IDatetimeWidget, ITimeWidget
+from pyams_form.interfaces.form import IFormLayer, IResetWidget, ICloseWidget, IDateWidget, IDatetimeWidget, ITimeWidget, \
+    IColorWidget
 from pyams_form.schema import IResetButton, ICloseButton
+from pyams_utils.schema import IColorField
 from pyramid.interfaces import IRequest
-from z3c.form.interfaces import INPUT_MODE, IFieldWidget, IButtonAction, IWidgetLayoutTemplate
+from z3c.form.interfaces import INPUT_MODE, IFieldWidget, IButtonAction, IWidgetLayoutTemplate, IDataConverter
 from zope.pagetemplate.interfaces import IPageTemplate
 from zope.schema.interfaces import IDate, IDatetime, ITime
 
@@ -33,6 +35,7 @@
 from z3c.form.browser.submit import SubmitWidget
 from z3c.form.browser.text import TextWidget
 from z3c.form.button import ButtonAction
+from z3c.form.converter import BaseDataConverter
 from z3c.form.widget import FieldWidget, WidgetTemplateFactory, WidgetLayoutFactory
 from zope.interface import implementer_only, directlyProvides, Interface
 
@@ -242,3 +245,34 @@
 @adapter_config(context=(ITime, IFormLayer), provides=IFieldWidget)
 def TimeFieldWidget(field, request):
     return FieldWidget(field, TimeWidget(request))
+
+
+#
+# Color widget
+#
+
+@adapter_config(context=(IColorField, IColorWidget), provides=IDataConverter)
+class ColorDataConverter(BaseDataConverter):
+    """Color field data converter"""
+
+    def toWidgetValue(self, value):
+        value = super(ColorDataConverter, self).toWidgetValue(value)
+        if value:
+            value = '#' + value
+        return value
+
+    def toFieldValue(self, value):
+        if value and value.startswith('#'):
+            value = value[1:]
+        return super(ColorDataConverter, self).toFieldValue(value)
+
+
+@widgettemplate_config(mode='input', template='templates/color-input.pt', layer=IFormLayer)
+@implementer_only(IColorWidget)
+class ColorWidget(TextWidget):
+    """Color widget"""
+
+
+@adapter_config(context=(IColorField, IFormLayer), provides=IFieldWidget)
+def ColorFieldWidget(field, request):
+    return FieldWidget(field, ColorWidget(request))