|
|
|
@ -5,6 +5,7 @@ from kivy.uix.scatter import Matrix
|
|
|
|
|
from kivy.uix.scatterlayout import ScatterLayout
|
|
|
|
|
from kivy.uix.image import Image, AsyncImage
|
|
|
|
|
from kivy.uix.boxlayout import BoxLayout
|
|
|
|
|
from kivy.uix.floatlayout import FloatLayout
|
|
|
|
|
from kivy.uix.stencilview import StencilView
|
|
|
|
|
from kivy.uix.popup import Popup
|
|
|
|
|
from kivy.uix.button import ButtonBehavior
|
|
|
|
@ -21,49 +22,6 @@ class ViewerScreen(Screen):
|
|
|
|
|
app = ObjectProperty(None)
|
|
|
|
|
dialog = ObjectProperty(None)
|
|
|
|
|
|
|
|
|
|
def on_touch_down(self, touch, *args):
|
|
|
|
|
bottom_right_corner = [(dp(self.size[0]) - dp(200), dp(200)), (dp(self.size[0]), 0)]
|
|
|
|
|
top_left_corner = [(0, dp(self.size[1])), (dp(200), dp(self.size[1]) - dp(200))]
|
|
|
|
|
top_right_corner = [(dp(self.size[0]) - dp(200), dp(self.size[1])), (dp(self.size[0]), dp(self.size[1]) - dp(200))]
|
|
|
|
|
center = [(dp(200), dp(200)), (dp(self.size[0]) - dp(200), dp(self.size[1]) - dp(200))]
|
|
|
|
|
if self.collide_point(*touch.pos):
|
|
|
|
|
|
|
|
|
|
if Vector.in_bbox(touch.pos, bottom_right_corner[0], bottom_right_corner[1]) \
|
|
|
|
|
and touch.is_double_tap and len(self.app.presentation['slides']) > 0:
|
|
|
|
|
|
|
|
|
|
self.dialog.to_switch = True
|
|
|
|
|
self.dialog.title = _('Switch to...')
|
|
|
|
|
self.dialog.open()
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
elif Vector.in_bbox(touch.pos, top_left_corner[0], top_left_corner[1]) \
|
|
|
|
|
and touch.is_double_tap:
|
|
|
|
|
|
|
|
|
|
self.app.root.current = 'editor'
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
elif Vector.in_bbox(touch.pos, top_right_corner[0], top_right_corner[1]) \
|
|
|
|
|
and touch.is_double_tap and len(self.app.presentation['slides']) > 0:
|
|
|
|
|
|
|
|
|
|
# TODO: Switch to toolbox mode.
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
elif Vector.in_bbox(touch.pos, center[0], center[1]) \
|
|
|
|
|
and touch.is_double_tap and len(self.app.presentation['slides']) > 0:
|
|
|
|
|
|
|
|
|
|
if len(self.box.children) < 2:
|
|
|
|
|
Logger.info('Application: Switching to compare mode.')
|
|
|
|
|
self.dialog.to_switch = False
|
|
|
|
|
self.dialog.title = _('Compare to...')
|
|
|
|
|
self.dialog.open()
|
|
|
|
|
else:
|
|
|
|
|
self.app.compare_slide(action='rm')
|
|
|
|
|
touch.ungrab(self)
|
|
|
|
|
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
return super(ViewerScreen, self).on_touch_down(touch)
|
|
|
|
|
|
|
|
|
|
def on_pre_enter(self, *args):
|
|
|
|
|
if not self.dialog:
|
|
|
|
|
self.dialog = Factory.SlidesDialog()
|
|
|
|
@ -94,6 +52,41 @@ class ViewerScreen(Screen):
|
|
|
|
|
image = SlideBox(slide=slide)
|
|
|
|
|
self.carousel.add_widget(image)
|
|
|
|
|
|
|
|
|
|
class TouchActionArea(FloatLayout):
|
|
|
|
|
|
|
|
|
|
def on_touch_down(self, touch):
|
|
|
|
|
|
|
|
|
|
if self.collide_point(*touch.pos) and touch.is_double_tap and len(self.app.presentation['slides']) > 0:
|
|
|
|
|
try:
|
|
|
|
|
child = [child for child in self.children if child.collide_point(*touch.pos)][0]
|
|
|
|
|
except IndexError:
|
|
|
|
|
Logger.debug('Viewer: No TouchActionArea child touched.')
|
|
|
|
|
return
|
|
|
|
|
if child.name == 'center':
|
|
|
|
|
if len(self.app.root.current_screen.box.children) < 2:
|
|
|
|
|
Logger.info('Application: Switching to compare mode.')
|
|
|
|
|
self.parent.dialog.to_switch = False
|
|
|
|
|
self.parent.dialog.title = _('Compare to...')
|
|
|
|
|
self.parent.dialog.open()
|
|
|
|
|
else:
|
|
|
|
|
self.app.compare_slide(action='rm')
|
|
|
|
|
touch.ungrab(self)
|
|
|
|
|
return True
|
|
|
|
|
|
|
|
|
|
elif child.name == 'ltop':
|
|
|
|
|
self.app.root.current = 'editor'
|
|
|
|
|
return True
|
|
|
|
|
elif child.name == 'rtop':
|
|
|
|
|
pass
|
|
|
|
|
elif child.name == 'lbottom':
|
|
|
|
|
pass
|
|
|
|
|
elif child.name == 'rbottom':
|
|
|
|
|
self.parent.dialog.to_switch = True
|
|
|
|
|
self.parent.dialog.title = _('Switch to...')
|
|
|
|
|
self.parent.dialog.open()
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
return super(TouchActionArea, self).on_touch_down(touch)
|
|
|
|
|
|
|
|
|
|
class SlideBox(BoxLayout, StencilView):
|
|
|
|
|
slide = DictProperty(None)
|
|
|
|
@ -114,10 +107,12 @@ class SlideBox(BoxLayout, StencilView):
|
|
|
|
|
|
|
|
|
|
def on_size(self, *args):
|
|
|
|
|
|
|
|
|
|
for child in self.float_layout.children:
|
|
|
|
|
if child.id == 'img_zoom':
|
|
|
|
|
child.size = (self.size[0] / 6, (self.size[0] / 6) / child.image_ratio)
|
|
|
|
|
child.pos = [self.pos[0], 0.05 * dp(self.size[1])]
|
|
|
|
|
try:
|
|
|
|
|
img_zoom = [child for child in self.float_layout.children if child.id == 'img_zoom'][0]
|
|
|
|
|
img_zoom.size = (self.size[0] / 6, (self.size[0] / 6) / img_zoom.image_ratio)
|
|
|
|
|
img_zoom.pos = [self.pos[0], 0.05 * dp(self.size[1])]
|
|
|
|
|
except IndexError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def get_caption(self):
|
|
|
|
|
|
|
|
|
@ -184,9 +179,11 @@ class SlideViewer(ScatterLayout):
|
|
|
|
|
self.parent.add_widget(thumb)
|
|
|
|
|
|
|
|
|
|
elif min(self.bbox[0]) > 0:
|
|
|
|
|
for child in self.parent.children:
|
|
|
|
|
if child.id == 'img_zoom':
|
|
|
|
|
self.parent.remove_widget(child)
|
|
|
|
|
img_zoom = [child for child in self.parent.children if child.id == 'img_zoom']
|
|
|
|
|
try:
|
|
|
|
|
self.parent.remove_widget(img_zoom[0])
|
|
|
|
|
except IndexError:
|
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
|
def lock(self):
|
|
|
|
|
if not self.locked:
|
|
|
|
|