Mirage2/src/new-src/core/containers/image_list_scroll.py

81 lines
2.3 KiB
Python

# 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