OSDN Git Service

key press events (up, down, page up, page down, home, end) are handled
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Fri, 10 Apr 2009 17:36:32 +0000 (02:36 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Fri, 10 Apr 2009 17:36:32 +0000 (02:36 +0900)
in threadview.

src/FukuiNoNamari/thread_view.py

index 23f151a..bdb4804 100644 (file)
@@ -19,6 +19,7 @@ import pygtk
 pygtk.require('2.0')
 import gtk
 import pango
+import gobject
 from FukuiNoNamariExt import thread_view_extend
 
 
@@ -473,12 +474,21 @@ class ThreadView(gtk.HBox):
     def __init__(self):
         gtk.HBox.__init__(self, False, 0)
         self.drawingarea = gtk.DrawingArea()
+        self.drawingarea.set_property("can_focus", True)
+
+        def set_focus():
+            top = self.drawingarea.get_toplevel()
+            if top.get_property("type") == gtk.WINDOW_TOPLEVEL:
+                top.set_focus(self.drawingarea)
+        gobject.idle_add(set_focus)
+
         self.vscrollbar = gtk.VScrollbar()
         self.pack_start(self.drawingarea)
         self.pack_start(self.vscrollbar, expand=False)
         self.adjustment  = self.vscrollbar.get_adjustment()
 
         self.drawingarea.add_events(
+            gtk.gdk.KEY_PRESS_MASK |
             gtk.gdk.SCROLL_MASK |
             gtk.gdk.POINTER_MOTION_MASK |
             gtk.gdk.BUTTON_PRESS_MASK |
@@ -500,6 +510,8 @@ class ThreadView(gtk.HBox):
             "button-release-event", self.on_drawingarea_button_release_event)
         self.drawingarea.connect(
             "style-set", self.on_drawingarea_style_set)
+        self.drawingarea.connect(
+            "key-press-event", self.on_drawingarea_key_press_event)
         self.vscrollbar.connect(
             "value-changed", self.on_vscrollbar_value_changed)
 
@@ -923,3 +935,29 @@ class ThreadView(gtk.HBox):
             for layout in self.res_layout_list:
                 layout.recalc_char_widths()
             self.wrap_relayout()
+
+    def on_drawingarea_key_press_event(self, widget, event, data=None):
+        if event.type is not gtk.gdk.KEY_PRESS:
+            return
+
+        if event.keyval in (gtk.keysyms.Up, gtk.keysyms.Down,
+                            gtk.keysyms.Page_Up, gtk.keysyms.Page_Down,
+                            gtk.keysyms.Home):
+            value = self.vscrollbar.get_value()
+            if event.keyval == gtk.keysyms.Up:
+                step_increment = self.adjustment.get_property("step-increment")
+                value = value - step_increment
+            elif event.keyval == gtk.keysyms.Down:
+                step_increment = self.adjustment.get_property("step-increment")
+                value = value + step_increment
+            elif event.keyval == gtk.keysyms.Page_Up:
+                step_increment = self.adjustment.get_property("page-increment")
+                value = value - step_increment
+            elif event.keyval == gtk.keysyms.Page_Down:
+                step_increment = self.adjustment.get_property("page-increment")
+                value = value + step_increment
+            elif event.keyval == gtk.keysyms.Home:
+                value = 0
+            self.jump(value)
+        elif event.keyval == gtk.keysyms.End:
+            self.jump_to_the_end()