# Python imports # Lib imports import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk # Application imports from ..widgets.image_list import ImageList class ImageListScroll(Gtk.ScrolledWindow): def __init__(self): super(ImageListScroll, self).__init__() self.image_list_widget = None self.size = 0 self.start = 0 self.end = settings.get_max_ring_thumbnail_list() self._setup_styling() self._setup_signals() self._subscribe_to_events() self._load_widgets() self.show_all() def _setup_styling(self): self.set_vexpand(True) self.set_overlay_scrolling(False) def _setup_signals(self): self.connect("edge-reached", self._handle_edge_reached) self.connect("edge-overshot", self._handle_edge_reached) def _subscribe_to_events(self): event_system.subscribe("update_list_size_constraints", self._update_list_size_constraints) def _load_widgets(self): self.image_list_widget = ImageList() self.add(self.image_list_widget) # TODO: Setup to load range start/end values from settings, # NOTE: Must align with ImageList start/end limits too def _update_list_size_constraints(self, size): self.size = size self.start = 0 self.end = settings.get_max_ring_thumbnail_list() def _handle_edge_reached(self, widget, edge): children = self.image_list_widget.get_children() vadjustment = self.get_vadjustment() vvalue = vadjustment.get_value() if edge == Gtk.PositionType.TOP: if self.start >= 1: self.start -= 1 self._unload_image(children[self.end]) children[self.start].show() self.end -= 1 vadjustment.set_value(vvalue + 1) if edge == Gtk.PositionType.BOTTOM: if (self.end + 1) < self.size: self.end += 1 self._unload_image(children[self.start]) if not children[self.end].is_loaded: children[self.end].load_pixbuf() children[self.end].show() self.start += 1 vadjustment.set_value(vvalue - 1) def _unload_image(self, child): child.hide() # child.image.clear() child.is_loaded = False