[Urwid] [PATCH] Pile updating methods

Sébastien Pierre sebastien at xprima.com
Mon Jul 17 15:18:09 EDT 2006


Hi,

As I needed to update a Pile widget according to user interaction, I
implemented some additional methods in the Pile class. Here is the
small patch that implements "add_widget", "remove_widget" and
"remove_widgets", which were sufficient for my needs.

Is it consistent with the current URWID design ?

 -- Sébastien

--- /home/sebastien/Desktop/urwid-0.9.5/urwid/widget.py	2006-07-14 21:26:45.000000000 -0400
+++ /home/sebastien/Local/lib/python2.4/site-packages/urwid/widget.py	2006-07-17 15:13:26.000000000 -0400
@@ -1806,26 +1806,41 @@
 		If the pile is treated as a box widget there must be at least
 		one 'weight' tuple in widget_list.
 		"""
-		self.widget_list = widget_list
-		self.item_types = []
-		for i in range(len(widget_list)):
-			w = widget_list[i]
-			if type(w) != type(()):
-				self.item_types.append(('weight',1))
-			elif w[0] == 'flow':
-				f, widget = w
-				self.widget_list[i] = widget
-				self.item_types.append((f,None))
-			elif w[0] in ('fixed', 'weight'):
-				f, height, widget = w
-				self.widget_list[i] = widget
-				self.item_types.append((f,height))
-			else:
-				raise PileError, "widget list item invalid %s" % `w`
-			
+		self.widget_list = []
+		self.item_types  = []
+		map(self.add_widget, widget_list)
 		self.set_focus(focus_item)
 		self.pref_col = None
 
+	def add_widget( self, widget ):
+		"""Adds a widget to this pile"""
+		w = widget
+		self.widget_list.append(widget)
+		if type(w) != type(()):
+			self.item_types.append(('weight',1))
+		elif w[0] == 'flow':
+			f, widget = w
+			self.widget_list[i] = widget
+			self.item_types.append((f,None))
+		elif w[0] in ('fixed', 'weight'):
+			f, height, widget = w
+			self.widget_list[i] = widget
+			self.item_types.append((f,height))
+		else:
+			raise PileError, "widget list item invalid %s" % `w`
+
+	def remove_widget( self, widget ):
+		"""Removes a widget from this pile"""
+		if type(widget) != type(()): widget = widget[1]
+		i = self.widget_list.index(widget)
+		del self.widget_list[i]
+		del self.item_types[i]
+	
+	def remove_widgets( self ):
+		"""Removes all widgets from this pile"""
+		self.widget_list = []
+		self.item_types  = []
+
 	def selectable(self):
 		"""Return True if the focus item is selectable."""
 		return self.focus_item.selectable()
-------------- next part --------------
A non-text attachment was scrubbed...
Name: urwid-pile_update.patch
Type: application/octet-stream
Size: 1959 bytes
Desc: not available
Url : http://lists.excess.org/pipermail/urwid/attachments/20060717/d9a7bc9c/urwid-pile_update.obj


More information about the Urwid mailing list