OSDN Git Service

algo search ResLayout from y, ThreadView
authorAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 25 Dec 2007 17:36:02 +0000 (02:36 +0900)
committerAiwota Programmer <aiwotaprog@tetteke.tk>
Tue, 25 Dec 2007 17:36:02 +0000 (02:36 +0900)
src/FukuiNoNamari/thread_view.py

index 460ba76..313b06c 100644 (file)
@@ -217,6 +217,7 @@ class ResLayout:
         self.left_margin = left_margin
         self.resnum = resnum
         self.posY = 0
+        self.list_index = 0
 
     def add_text(self, text, bold, href):
         if isinstance(self.element_list[0], ElementEmpty):
@@ -406,6 +407,7 @@ class ThreadView(gtk.HBox):
 
     def initialize_buffer(self):
         self.res_layout_list = []
+        self.layout_posY_map = [(0, [])]
 
     def add_layout(self, res_layout):
         if (len(self.res_layout_list) != 0):
@@ -413,7 +415,13 @@ class ThreadView(gtk.HBox):
             x, y = last.get_pixel_size()
             res_layout.posY = last.posY + y
         self.set_layout_width(res_layout)
+        res_layout.list_index = len(self.res_layout_list)
         self.res_layout_list.append(res_layout)
+
+        if len(self.layout_posY_map[len(self.layout_posY_map)-1][1]) == 128:
+            self.layout_posY_map.append((res_layout.posY, []))
+        self.layout_posY_map[len(self.layout_posY_map)-1][1].append(res_layout)
+
         x, y = res_layout.get_pixel_size()
         self.adjustment.upper = res_layout.posY + y
         self.redraw()
@@ -430,6 +438,8 @@ class ThreadView(gtk.HBox):
         self.drawingarea.queue_draw()
 
     def relayout(self):
+        self.layout_posY_map = [(0, [])]
+
         width = self.drawingarea.allocation.width
         sum_height = 0
         for layout in self.res_layout_list:
@@ -437,6 +447,11 @@ class ThreadView(gtk.HBox):
             layout.posY = sum_height
             x, y = layout.get_pixel_size()
             sum_height += y
+
+            if len(self.layout_posY_map[len(self.layout_posY_map)-1][1])==128:
+                self.layout_posY_map.append((layout.posY, []))
+            self.layout_posY_map[len(self.layout_posY_map)-1][1].append(layout)
+
         self.vscrollbar.set_range(0, sum_height)
         self.change_vscrollbar_visible()
 
@@ -499,7 +514,13 @@ class ThreadView(gtk.HBox):
 
         selection_start, selection_end = self._get_selection_start_end()
 
-        for layout in self.res_layout_list:
+
+        top_layout = self.get_layout_on_y(view_y)
+        index = 0
+        if top_layout:
+            index = top_layout.list_index
+        while index < len(self.res_layout_list):
+            layout = self.res_layout_list[index]
             w, h = layout.get_pixel_size()
             layout_top = layout.posY
             layout_bottom = layout.posY + h
@@ -509,6 +530,10 @@ class ThreadView(gtk.HBox):
                 layout.draw(self.drawingarea,
                             0, layout.posY - int(view_y),
                             selection_start, selection_end)
+            if layout_top > area_bottom:
+                break
+
+            index += 1
 
     def transform_coordinate_gdk_to_adj(self, y):
         return y + self.vscrollbar.get_value()
@@ -520,16 +545,25 @@ class ThreadView(gtk.HBox):
         return self.transform_coordinate_adj_to_layout(
             x, self.transform_coordinate_gdk_to_adj(y), layout)
 
+    def get_layout_on_y(self, y):
+        layout_list = None
+        for pos, lay_lst in self.layout_posY_map:
+            if pos > y:
+                break
+            layout_list = lay_lst
+        if layout_list:
+            layout = None
+            for lay in layout_list:
+                if lay.posY > y:
+                    break
+                layout = lay
+            return layout
+        return None
+
     def ptrpos_to_layout(self, x, y):
         # transform coordinate, GdkWindow -> adjustment
-        adj_x = x
         adj_y = self.transform_coordinate_gdk_to_adj(y)
-        for lay in self.res_layout_list:
-            width, height = lay.get_pixel_size()
-            if (adj_y >= lay.posY and adj_y < lay.posY + height and
-                adj_x >= 0):
-                return lay
-        return None
+        return self.get_layout_on_y(adj_y)
 
     def ptrpos_to_uri(self,  x, y):
         # x, y is GdkWindow coordinate
@@ -668,7 +702,7 @@ class ThreadView(gtk.HBox):
             if uri is not None and layout is not None and element is not None:
                 self.current_pressed_uri = (uri, layout, element)
             else:
-                self._set_button_moving_pt(None)
+                self._set_button_moving_pt((event.x, event.y))
                 self._set_button_pressed_pt((event.x, event.y))
                 self.drawingarea.queue_draw()