class ImageThumbScreen(Screen): view_name = "images_thumb" click_constant = 20 speed_threshold = 1000 def __init__(self, canvas, main_window, title="Photos", elements=None, theme=None): Screen.__init__(self, canvas, "images/thumbnail", main_window, title, theme) self._setup_gui() self.elements = elements self.throbber = self.part_swallow_get("throbber") self.row_widths = [] self.over_speed = False self.kinetic = KineticMouse(self._move_offset) self.is_dragging = False self.mouse_down_pos = None self.callback_block_load = None self.callback_resume_load = None self.callback_transition_in_finished = None self.callback_clicked = None self.callback_move_offset = None # the resize callback is triggered in ImageGridContainer's _setup_gui self.callback_resized = None self.callback_on_theme_changed = None def ImageFrameThumb(self, theme=None): return ImageFrameThumb(self.evas, self, theme) def theme_changed(self): Screen.theme_changed(self) self.image_grid.theme_changed() self._setup_click_area() self.callback_on_theme_changed() def loaded(self): self._check_has_elements() self.throbber_stop() def _check_has_elements(self): if self.elements: self.signal_emit("message,hide", "") else: self.part_text_set("message", "No items found.") self.signal_emit("message,show", "") def throbber_start(self): self.throbber.signal_emit("throbber,start", "") def throbber_stop(self): self.throbber.signal_emit("throbber,stop", "") def _setup_gui(self): self.image_grid = ImageGridContainer(self, hpadding=20, vpadding=20) self.part_swallow("contents", self.image_grid) self._setup_click_area() def _setup_click_area(self): self.click_area = self.part_object_get("click_area") self.click_area.on_mouse_down_add(self._cb_on_mouse_down) self.click_area.on_mouse_up_add(self._cb_on_mouse_up) self.click_area.on_mouse_move_add(self._cb_on_mouse_move) def clear_all(self): self.image_grid.clear_all() def _check_speed(self, keep_moving): if not keep_moving: if self.over_speed: log.debug("resume load callback") if self.callback_resume_load: self.callback_resume_load() self.over_speed = False return if self.kinetic.animation: speed = abs(self.kinetic.anim_speed) log.debug("abs vel = %s", speed) if not self.over_speed and (speed > self.speed_threshold): log.debug("hold file sets") if self.callback_block_load: self.callback_block_load() self.over_speed = True def _move_offset(self, offset): if not self.callback_move_offset: return False keep_moving = self.callback_move_offset(offset) self._check_speed(keep_moving) return keep_moving def _emit_clicked(self, x, y): obj = self.image_grid.object_at_xy(x, y) if obj: self.callback_clicked(obj) def _is_click_possible(self, x): if self.is_dragging or self.mouse_down_pos is None: return False else: return abs(x - self.mouse_down_pos) <= self.click_constant def _cb_on_mouse_up(self, obj, event): if not event.button == 1: return x, y = event.position.canvas if self._is_click_possible(x): self._emit_clicked(x, y) self.kinetic.mouse_cancel() else: self.kinetic.mouse_up(x) def _cb_on_mouse_down(self, obj, event): if not event.button == 1: return x, y = event.position.canvas self.mouse_down_pos = x self.is_dragging = not self.kinetic.mouse_down(x) def _cb_on_mouse_move(self, obj, event): if not event.buttons == 1: return x, y = event.position.canvas if not self._is_click_possible(x): self.is_dragging = True self.kinetic.mouse_move(x) @edje.decorators.signal_callback("transition,in,finished", "") def cb_transition_in_finished(self, emission, source): self.callback_transition_in_finished() @evas.decorators.del_callback def _cb_on_delete(self): self.image_grid.delete()