On Jul 14, 2005, at 9:04 PM, mso@oz.net wrote:
>
> Is this the right way to do it? Should my ._parse method set the
> value to
> a tuple of subvalues, and .set_value propagate the values to the
> subwidgets? Or should I ignore the widget value and have caller
> look at
> the subwidget values directly? "form.get_widget('quantity')['low']"?
> I suppose I can't do "form['quantity']['low']" ?
I think that the first option you suggest, setting the value to a tuple,
or to an instance of a class you write for this particular purpose,
is a good
way to do it. The user of the widget should not need be aware of the
particulars of the subwidgets.
>
> What if I need several range controls on the same form? All the
> subwidgets will be in a flat namespace in the HTML. I'm getting
> subwidget
> names like 'release$low', so I guess that's being taken care of
> automatically somehow.
Right, you would just get the _parsed value from your composite
widget as
if it were a non-composite widget.
> def _parse(self):
> is_low = self['low'] is not None
> is_high = self['high'] is not None
> is_unit = self['unit'] is not None
> if is_high and not is_low:
> self.error = "Must provide low number."
> if (is_low or is_high) and not is_unit:
> self.error = "Must provide unit."
The _parse needs to set the value to something.
>
> I made a date widget earlier but that was pretty straightforward,
> since
> the value is a datetime object, and I put the subwidgets
> in .year, .month,
> and .day attributes. (Perhaps I should have used .add()
> and .widgets, but
> I bypassed them.) But a range object doesn't have an obvious
> single value
> unless I arbitrarily say ".value = (low, high, unit)". Is that
> how to do
> it with composite widgets?
Yes. Or, you could make a RangeWithUnit class for this purpose.
You might be interested in the classes for this that are in dulcinea.
They serve a similar purpose, but the widgets don't work the same
way as the ones you want.
>
> After that I need to make a latitude/longitude widget that accepts:
> 123.45 West (degrees)
> 123 45.67 West (degrees, minutes)
> 123 45 45.67 West (degrees, minutes, seconds)
> But first I have to get the simpler widget down.
That will be easier after you get the pattern worked out.
>
> What is the purpose of WidgetList and WidgetDict? At first I
> thought they
> were for making arbitrary composite widgets, but that raises the
> question
> of when to use them and when to use CompositeWidget directly, and what
> that funny 'add_element' widget is for. Then I thought, "No, they are
> specialized widgets, for growable lists/dicts." Are they for when you
That thought was correct.
> have multiple values and want to let the user as many additional
> values as
> they want? But there's nothing to delete an element if they want
> to go
> the other way. Or are these widgets for something else?
Dulcinea has a DeletableWidget that is designed to allow delete buttons
in a WidgetList.