about summary refs log tree commit diff stats
path: root/LICENSE
Commit message (Expand)AuthorAgeFilesLines
* added Sander to LICENSE (since he has contributed/revised big portions)Anselm R.Garbe2006-08-141-0/+1
* initial importAnselm R. Garbe2006-07-101-0/+21
34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
class CommandList():
	def __init__(self):
		self.commandlist = []
		self.paths = {}
		self.dummies_in_paths = False
		self.dummy_object = None

	# We need to know when to clear the keybuffer (when a wrong key is pressed)
	# and when to wait for the rest of the key combination. For "gg" we
	# will assign "g" to a dummy which tells the program not to do the latter.
	def rebuild_paths(self):
		""" fill the path dictionary with dummie objects """
		if self.dummies_in_paths:
			self.remove_dummies()
		
		for cmd in self.commandlist:
			for key in cmd.keys:
				for path in self.keypath(key):
					if path not in self.paths:
						self.paths[path] = self.dummy_object

		self.dummies_in_paths = True

	def keypath(self, tup):
		""" split a tuple like (a,b,c,d) into [(a,), (a,b), (a,b,c)] """
		length = len(tup)

		if length == 0:
			return ()
		if length == 1:
			return (tup, )

		current = []
		all = []
		
		for i in range(len(tup) - 1):
			current.append(tup[i])
			all.append(tuple(current))

		return all

	def remove_dummies(self):
		""" remove dummie objects in case you have to rebuild a path dictionary which already contains dummie objects. """
		for k in tuple(paths.keys()):
			if paths[k] == self.dummy_object: del paths[k]
		self.dummies_in_paths = False


	def str_to_tuple(self, obj):
		"""splits a string into a tuple of integers"""
		if isinstance(obj, tuple):
			return obj
		elif isinstance(obj, str):
			return tuple(map(ord, list(obj)))
		elif isinstance(obj, int):
			return (obj, )
		else:
			raise TypeError('need a str, int or tuple for str_to_tuple')
	
	def bind(self, fnc, *keys):
		""" create a Command object and assign it to the given key combinations. """
		if len(keys) == 0: return

		keys = tuple(map(self.str_to_tuple, keys))

		cmd = Command(fnc, keys)
		cmd.commandlist = self

		self.commandlist.append(cmd)
		for key in keys:
			self.paths[key] = cmd
	
class Command():
	def __init__(self, fnc, keys):
		self.execute = fnc
		self.keys = keys
		self.commandlist = None

#	def execute(self, fm):
#		self.fnc(fm)