OSDN Git Service

implement uri click event
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 11 Dec 2007 15:38:16 +0000 (00:38 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 11 Dec 2007 15:38:16 +0000 (00:38 +0900)
src/FukuiNoNamari/thread_view.py
src/FukuiNoNamari/thread_window.py

index 78a14da..83f70be 100644 (file)
@@ -36,7 +36,9 @@ class ThreadView(gtk.HBox):
 
         self.drawingarea.add_events(
             gtk.gdk.SCROLL_MASK |
-            gtk.gdk.POINTER_MOTION_MASK)
+            gtk.gdk.POINTER_MOTION_MASK |
+            gtk.gdk.BUTTON_PRESS_MASK |
+            gtk.gdk.BUTTON_RELEASE_MASK)
 
         self.adjustment.step_increment = 20
         self.drawingarea_prev_width = 0
@@ -51,11 +53,23 @@ class ThreadView(gtk.HBox):
             "scroll-event", self.on_drawingarea_scroll_event)
         self.drawingarea.connect(
             "motion-notify-event", self.on_drawingrarea_motion_notify_event)
+        self.drawingarea.connect(
+            "button-press-event", self.on_drawingrarea_button_press_event)
+        self.drawingarea.connect(
+            "button-release-event", self.on_drawingrarea_button_release_event)
         self.vscrollbar.connect(
             "value-changed", self.on_vscrollbar_value_changed)
 
         self.initialize_buffer()
 
+        self.on_uri_clicked = self._on_uri_clicked
+
+        self.button1_pressed = False
+        self.current_pressed_uri = None
+            
+    def _on_uri_clicked(self, uri):
+        print uri, "clicked!!!!"
+
     def initialize_buffer(self):
         self.pangolayout = []
 
@@ -229,6 +243,9 @@ class ThreadView(gtk.HBox):
         self.prevent_adjustment_overflow()
 
     def on_drawingrarea_motion_notify_event(self, widget, event, data=None):
+        if event.state & gtk.gdk.BUTTON1_MASK != gtk.gdk.BUTTON1_MASK:
+            self.button1_pressed = False
+
         cursor = ThreadView.regular_cursor
 
         uri, layout, index = self.ptrpos_to_uri(event.x, event.y)
@@ -239,3 +256,23 @@ class ThreadView(gtk.HBox):
                 cursor = ThreadView.hand_cursor
 
         self.drawingarea.window.set_cursor(cursor)
+
+    def on_drawingrarea_button_press_event(self, widget, event, data=None):
+        if event.button == 1:
+            self.current_pressed_uri = None
+            self.button1_pressed = True
+            uri, layout, index = self.ptrpos_to_uri(event.x, event.y)
+            if uri is not None and layout is not None and index is not None:
+                self.current_pressed_uri = (uri, layout, index)
+
+    def on_drawingrarea_button_release_event(self, widget, event, data=None):
+        if event.button == 1:
+            button1_pressed = self.button1_pressed
+            self.button1_pressed = False
+
+            if button1_pressed and self.current_pressed_uri is not None:
+                uri, layout, index = self.ptrpos_to_uri(event.x, event.y)
+                p_uri, p_layout, p_index = self.current_pressed_uri
+                self.current_preesed_uri = None
+                if uri == p_uri and layout == p_layout and index == p_index:
+                    self.on_uri_clicked(uri)
index f9b4e6e..bdcca76 100644 (file)
@@ -150,6 +150,8 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.vbox.pack_start(self.threadview)
         self.vbox.reorder_child(self.threadview, 2)
 
+        self.threadview.on_uri_clicked = self.on_threadview_uri_clicked
+
         self.initialize_buffer()
 
         sigdic = {"on_refresh_activate": self.update,
@@ -247,6 +249,18 @@ class WinWrap(winwrapbase.WinWrapBase):
         except OSError:
             traceback.print_exc()
 
+    def on_threadview_uri_clicked(self, uri):
+
+        if not uri.startswith("http://"):
+            # maybe a relative uri.
+            uri = urlparse.urljoin(self.bbs_type.get_uri_base(), uri)
+
+        try:
+            uri_opener.open_uri(uri)
+        except bbs_type_exception.BbsTypeError:
+            # not supported, show with the web browser.
+            gnome.url_show(uri)
+            
     def http_get_dat(self, on_get_res):
         datfile_url = self.bbs_type.get_dat_uri()