OSDN Git Service

implement jump
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Sat, 8 Dec 2007 09:29:12 +0000 (18:29 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Sat, 8 Dec 2007 09:29:12 +0000 (18:29 +0900)
src/FukuiNoNamari/thread_window.py

index 6ffdc0d..c6ba79c 100644 (file)
@@ -73,8 +73,14 @@ def open_thread(uri, update=False):
         winwrap.load(update)
 
     # jump to the res if necessary.
-    winwrap.jump_to_res(bbs_type.uri)
-
+    strict_uri = winwrap.bbs_type.get_thread_uri()
+    if (winwrap.bbs_type.uri != strict_uri and
+        winwrap.bbs_type.uri.startswith(strict_uri)):
+        resnum = winwrap.bbs_type.uri[len(strict_uri):]
+        match = re.match("\d+", resnum)
+        if match:
+            resnum = int(match.group())
+            winwrap.jump_to_res(resnum)
 
 class WinWrap(winwrapbase.WinWrapBase):
     hovering_over_link = False
@@ -141,6 +147,7 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.statusbar = self.widget_tree.get_widget("statusbar")
         self.drawingarea = self.widget_tree.get_widget("drawingarea")
         self.viewport = self.drawingarea.parent
+        self.adjustment = self.viewport.get_vadjustment()
 
         self.drawingarea.prev_width = 0
 
@@ -323,20 +330,16 @@ class WinWrap(winwrapbase.WinWrapBase):
                 datfile.load_dat_partly(
                     self.bbs_type, self.append_rawres_to_buffer, self.num+1)
 
-                def do_jump(num):
+                def do_jump():
                     if self.jump_request_num:
                         if self.jump_request_num <= num:
-                            # jump if enable, otherwize jump later.
                             num = self.jump_request_num
                             self.jump_request_num = 0
-                            mark = self.textbuffer.get_mark(str(num))
-#                            if mark:
-#                                self.textview.scroll_to_mark(
-#                                    mark, 0, True, 0, 0)
+                            self.jump_to_res(num)
                     else:
-                        self.jump_to_the_end(num)
+                        self.jump_to_the_end()
 
-                gobject.idle_add(do_jump, self.num)
+                gobject.idle_add(do_jump)
 
         def get():
             dat_path = misc.get_thread_dat_path(self.bbs_type)
@@ -354,9 +357,7 @@ class WinWrap(winwrapbase.WinWrapBase):
                 if self.jump_request_num:
                     num = self.jump_request_num
                     self.jump_request_num = 0
-                    mark = self.textbuffer.get_mark(str(num))
-#                    if mark:
-#                        self.textview.scroll_to_mark(mark, 0, True, 0, 0)
+                    self.jump_to_res(num)
 
             gobject.idle_add(do_jump)
 
@@ -377,25 +378,19 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.jump_request_num = 0
 
         def load():
-
-            def create_mark():
-                self.textbuffer.create_mark("1", self.enditer, True)
-            gobject.idle_add(create_mark)
-
             datfile.load_dat(self.bbs_type, self.append_rawres_to_buffer)
+
         def jump():
 
-            def do_jump(num):
+            def do_jump():
                 if self.jump_request_num:
                     num = self.jump_request_num
                     self.jump_request_num = 0
-                    mark = self.textbuffer.get_mark(str(num))
-#                    if mark:
-#                        self.textview.scroll_to_mark(mark, 0, True, 0, 0)
+                    self.jump_to_res(num)
                 else:
-                    self.jump_to_the_end(num)
+                    self.jump_to_the_end()
 
-            gobject.idle_add(do_jump, self.num)
+            gobject.idle_add(do_jump)
 
         if self.lock():
 
@@ -448,7 +443,7 @@ class WinWrap(winwrapbase.WinWrapBase):
             print "maybe syntax error.", self.num, line
 
         def process_res_queue(res_queue, num):
-            self.process_queue(res_queue)
+            self.process_queue(res_queue, num)
             # for next res
             #self.textbuffer.create_mark(str(num+1), self.enditer, True)
 
@@ -483,13 +478,14 @@ class WinWrap(winwrapbase.WinWrapBase):
         tag.set_data("href", href)
         return tag
 
-    def process_queue(self, queue):
+    def process_queue(self, queue, num):
         text = ""
         for data, bold, href, margin in queue:
             text += data
         layout = self.drawingarea.create_pango_layout(text)
         layout.set_wrap(pango.WRAP_CHAR)
         layout.posY = 0
+        layout.resnum = num
         self.pangolayout.append(layout)
         self.relayout()
 #             taglist = []
@@ -505,8 +501,23 @@ class WinWrap(winwrapbase.WinWrapBase):
 #            else:
 #                self.textbuffer.insert(self.enditer, data)
 
-    def jump_to_the_end(self, num):
-        mark = self.textbuffer.get_mark(str(num+1))
+    def jump(self, value):
+        def j():
+            if value > self.adjustment.upper - self.viewport.allocation.height:
+                self.jump_to_the_end()
+            else:
+                self.adjustment.set_value(value)
+        gobject.idle_add(j)
+
+    def jump_to_layout(self, layout):
+        gobject.idle_add(lambda : self.jump(layout.posY))
+        
+    def jump_to_the_end(self):
+        def j():
+            self.adjustment.set_value(
+                self.adjustment.upper - self.viewport.allocation.height)
+        gobject.idle_add(j)
+#        mark = self.textbuffer.get_mark(str(num+1))
 #        if mark:
 #            self.textview.scroll_to_mark(mark, 0)
 
@@ -523,19 +534,12 @@ class WinWrap(winwrapbase.WinWrapBase):
         self.lock_obj = False
         print "unlock"
 
-    def jump_to_res(self, uri):
-        strict_uri = self.bbs_type.get_thread_uri()
-        if uri != strict_uri and uri.startswith(strict_uri):
-            resnum = uri[len(strict_uri):]
-            match = re.match("\d+", resnum)
-            if match:
-                resnum = match.group()
-                mark = self.textbuffer.get_mark(resnum)
-#                if mark:
-#                    self.textview.scroll_to_mark(mark, 0, True, 0, 0)
-#                elif self.progress:
-#                    # try later.
-#                    self.jump_request_num = int(resnum)
+    def jump_to_res(self, resnum):
+        for layout in self.pangolayout:
+            if layout.resnum == resnum:
+                self.jump_to_layout(layout)
+                return
+        self.jump_request_num = resnum
 
     def load(self, update=False):
         dat_path = misc.get_thread_dat_path(self.bbs_type)