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.