Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVincent Vinet <vince.vinet@gmail.com>2009-03-25 18:36:17 (GMT)
committer Vincent Vinet <vince.vinet@gmail.com>2009-03-31 14:02:57 (GMT)
commit474d482f53ca7fc89183993d9a0992b71cfcfc02 (patch)
tree479d91d072e4705566bc1e9d55e8402ac1cef985
parent6d5c55191f504357760267849c2524b3d8d64711 (diff)
Add the WidgetTypeFilter and use it in TAbiword
-rw-r--r--src/sugar/tutorius/filters.py73
1 files changed, 71 insertions, 2 deletions
diff --git a/src/sugar/tutorius/filters.py b/src/sugar/tutorius/filters.py
index a69055a..594ad6a 100644
--- a/src/sugar/tutorius/filters.py
+++ b/src/sugar/tutorius/filters.py
@@ -16,9 +16,14 @@
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
import gobject
-
+import gtk
+import logging
+logger = logging.getLogger("filters")
from sugar.tutorius.gtkutils import find_widget
+from sugar.tutorius.services import ObjectStore
+
+
class EventFilter(object):
"""
Base class for an event filter
@@ -168,4 +173,68 @@ class GtkWidgetEventFilter(EventFilter):
self._widget.handler_disconnect(self._handler_id)
self._handler_id=None
-
+class GtkWidgetTypeFilter(EventFilter):
+ """
+ Event Filter that listens for keystrokes on a widget
+ """
+ def __init__(self, next_state, object_id, text=None, strokes=None):
+ """Constructor
+ @param next_state default EventFilter param, passed on to EventFilter
+ @param object_id object tree-ish identifier
+ @param text resulting text expected
+ @param strokes list of strokes expected
+
+ At least one of text or strokes must be supplied
+ """
+ super(GtkWidgetTypeFilter, self).__init__(next_state)
+ self._object_id = object_id
+ self._text = text
+ self._captext = ""
+ self._strokes = strokes
+ self._capstrokes = []
+ self._widget = None
+ self._handler_id = None
+
+ def install_handlers(self, callback, **kwargs):
+ """install handlers
+ @param callback default EventFilter callback arg
+ """
+ super(GtkWidgetTypeFilter, self).install_handlers(callback, **kwargs)
+ logger.debug("~~~GtkWidgetTypeFilter install")
+ activity = ObjectStore().activity
+ if activity is None:
+ logger.error("No activity")
+ raise RuntimeWarning("no activity in the objectstore")
+
+ self._widget = find_widget(activity, self._object_id)
+ if self._widget:
+ self._handler_id= self._widget.connect("key-press-event",self.__keypress_cb)
+ logger.debug("~~~Connected handler %d on %s" % (self._handler_id,self._object_id) )
+
+ def remove_handlers(self):
+ """remove handlers"""
+ super(GtkWidgetTypeFilter, self).remove_handlers()
+ #if an event was connected, disconnect it
+ if self._handler_id:
+ self._widget.handler_disconnect(self._handler_id)
+ self._handler_id=None
+
+ def __keypress_cb(self, widget, event, *args):
+ """keypress callback"""
+ logger.debug("~~~keypressed!")
+ key = event.keyval
+ keystr = event.string
+ logger.debug("~~~Got key: " + str(key) + ":"+ keystr)
+ self._capstrokes += [key]
+ #TODO Treat other stuff, such as arrows
+ if key == gtk.keysyms.BackSpace:
+ self._captext = self._captext[:-1]
+ else:
+ self._captext = self._captext + keystr
+
+ logger.debug("~~~Current state: " + str(self._capstrokes) + ":" + str(self._captext))
+ if not self._strokes is None and self._strokes in self._capstrokes:
+ self.do_callback()
+ if not self._text is None and self._text in self._captext:
+ self.do_callback()
+