[sugar] storing Activity parameters

Gary C Martin gary at garycmartin.com
Fri Mar 14 20:44:47 EDT 2008


On 3 Mar 2008, at 10:44, Tomeu Vizoso wrote:

> On Sun, Mar 2, 2008 at 1:51 PM, Gary C Martin <gary at garycmartin.com>  
> wrote:
>
>> What if both journal and file-system were used to store the
>> activity state, with the journal settings overriding the file-system
>> settings. This way a new activity start-up could inherit the last  
>> used
>> activity settings, and a specific journal start-up would inherit the
>> settings used for that specific entry. So in the case of Speak I  
>> could
>> have separate favourite journal entries for '3 eyed alien' and  
>> another
>> for 'Mr square eyes', then if I also just started the activity from
>> fresh I'd pick-up whatever the last used setting were (picked up from
>> the FS).
>
> I like this idea a lot. Thanks for sharing.

I just wanted to follow up on this activity preference storage idea  
from a few weeks ago, with some working code, as I've finally got  
around to writing/testing and all appears to work well. Feedback  
appreciated if I'm doing something dubious here. Activity defaults are  
hard coded, then overwritten by a persistent file (if it exists), then  
overwritten by a call to read_file (if the activity was started from  
the journal):

class MyActivity(activity.Activity):
	"""MyActivity main class."""
	def __init__(self, handle):
		activity.Activity.__init__(self, handle)
		self._name = handle
		self.set_title(_("MyActivity"))
		
		# Defaults (Journal resume priority, default persistent file  
secondary, fall-back hardcoded values)
		self.preferenceOne = 'foo'
		self.preferenceTwo = 'bar'
		self.activityState = {}
		self.activityState['preferenceOne'] = self.preferenceOne
		self.activityState['preferenceTwo'] = self.preferenceTwo
		self.parse_preferences(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/ 
defaults')

		#
		# Rest of MyActivity init code
		#

	def parse_preferences(self, file_path):
		"""Parse and set preference data from a given file."""
		try:
			f = file(file_path, 'r')
			self.activityState = cPickle.load(f)
			f.close()
			if 'preferenceOne' in self.activityState.keys():
				self. preferenceOne = self.activityState['preferenceOne']
			if 'preferenceTwo' in self.activityState.keys():
				self. preferenceTwo = self.activityState['preferenceTwo']
		except:
			print "preference data %s not available" % (file_path)

	def read_file(self, file_path):
		"""Read state from datastore."""
		self.parse_preferences(file_path)

		#
		# Update state of MyActivity interface if necessary
		#
		
	def write_file(self, file_path):
		"""Write state to journal datastore and to persistent file system."""
		self.activityState['preferenceOne'] = self. preferenceOne
		self.activityState['preferenceTwo'] = self. preferenceTwo
		toJournal = file(file_path, 'w')
		cPickle.dump(self.activityState, toJournal)
		toJournal.close()
		toPersistentFs = file(os.environ['SUGAR_ACTIVITY_ROOT'] + '/data/ 
defaults', 'w')
		cPickle.dump(self.activityState, toPersistentFs)
		toPersistentFs.close()

So... just to recap, when you first launch an activity, the hard coded  
settings are used. If you make changes and exit, they become the new  
defaults if you launch another. If you resume from a previous Journal  
entry its settings are honoured (and will become the new defaults when  
you exit). If your activity has lots of complicate preferences you  
might want to provide an option for resetting preferences back to hard  
coded defaults, but having lot's of complicated settings needing reset  
suggests you might need to simplify things a little for the target  
audience ;-)

If this looks like is might be useful/stable approach for some others  
to use in activities, let me know and I'll find somewhere on the wiki  
to document it more permanently.

G



More information about the Sugar mailing list