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):
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):
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()
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:
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()
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
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()
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
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()