diff --git a/kivyblocks/markdown.py b/kivyblocks/markdown.py index f0bc1ee..77f7081 100644 --- a/kivyblocks/markdown.py +++ b/kivyblocks/markdown.py @@ -1,8 +1,10 @@ -from kivy.properties import StringProperty +from kivy.properties import StringProperty, NumericProperty, ListProperty from kivy.factory import Factory from kivy.clock import Clock +from kivy.logger import Logger +from kivy.uix.image import AsyncImage -from .baseWidget import ScrollWidget, getDataHandler +from .baseWidget import ScrollWidget, getDataHandler, CSize from .utils import CSize import re @@ -68,7 +70,7 @@ class MarkDownParser(object): self.text = f'{VIDEO_LEAD}' return title = x[0] - y = x[0].split(REFER_END,1) + y = x[1].split(REFER_END,1) if len(y) < 2: self.text = f'{VIDEO_LEAD}' return @@ -89,7 +91,7 @@ class MarkDownParser(object): self.text = f'{VIDEO_LEAD}' return title = x[0] - y = x[0].split(REFER_END,1) + y = x[1].split(REFER_END,1) if len(y) < 2: self.text = f'{VIDEO_LEAD}' return @@ -101,8 +103,7 @@ class MarkDownParser(object): } } self.result.append(d) - l = len(title) + 2 + len(url) - self.mdtext = self.mdtext[l:] + self.mdtext = y[1] def check_key(self,t): for k in self.mdkeys: @@ -131,6 +132,36 @@ class MarkDownParser(object): self.text = '' return self.result +class MDImage(AsyncImage): + parent_width=NumericProperty(None) + image_size = ListProperty(None) + def __init__(self, **kw): + super().__init__(**kw) + self.image_size = None + self.parent_width = None + self.bind(texture=self.image_loaded) + + def image_loaded(self,o, *args): + self.image_size = self.texture.size + + def resize(self, size): + self.parent_width = size[0] + Logger.info('MDImage: resize called, size=%s', size) + + def on_image_size(self, *args): + if self.parent_width: + self.set_new_height() + + def on_parent_width(self, *args): + if self.image_size: + self.set_new_height() + + def set_new_height(self): + self.height = self.parent_width * self.image_size[1] \ + / self.image_size[0] + Logger.info('MDImage: set_new_height called, size=%s', self.size) + + class Markdown(ScrollWidget): """ # Markdown @@ -167,22 +198,34 @@ description file format self.parse_line(l) def build_image(self,img_desc): - w = Factory.AsyncImage(soure=img_desc['url'], - keep_ratio=True, - size_hint_y=None + w = MDImage(source=img_desc['url'], + allow_stretch=True, + size_hint_y=None, + height=CSize(10), + keep_ratio=True ) - w.bind(minimum_height=w.setter('height')) + self.add_widget(w) + w.resize(self.size) def build_video(self, video_desc): w = Factory.NewVideo(source=video_desc['url'], keep_ratio=True, - play=True, + play=False, allow_stretch = True, size_hint_y=None ) w.height=self.width * 10 / 16 + w.state = 'pause' + def f1(x): + x.state = 'play' + def f2(x): + x.state = 'stop' + + w.bind(on_enter_focus=f1) + w.bind(on_leave_focus=f2) self.add_widget(w) + w.resize(self.size) def build_audio(self, audio_desc): w = Factory.APlayer(source=audio_desc.url) diff --git a/kivyblocks/newvideo.py b/kivyblocks/newvideo.py index 258cc17..9ae945f 100644 --- a/kivyblocks/newvideo.py +++ b/kivyblocks/newvideo.py @@ -4,6 +4,7 @@ from kivy.logger import Logger from kivy.core.window import Window from kivy.factory import Factory from kivy.properties import BooleanProperty +from kivy.clock import Clock from ffpyplayer.tools import set_log_callback @@ -15,6 +16,7 @@ logger_func = {'quiet': Logger.critical, 'panic': Logger.critical, class NewVideo(BGColorBehavior, Video): + center_screen = BooleanProperty(False) def __init__(self,color_level=-1,radius=[],**kw): Video.__init__(self, **kw) BGColorBehavior.__init__(self, @@ -23,9 +25,34 @@ class NewVideo(BGColorBehavior, Video): Window.allow_screensaver = False set_log_callback(self.ffplayerLog) self.register_event_type('on_open_failed') + self.register_event_type('on_leave_focus') + self.register_event_type('on_enter_focus') self.register_event_type('on_load_success') self.bind(source=self.record_start_time) self.load_status = None + Clock.schedule_interval(self.check_focus,0.2) + + def on_enter_focus(self, v=None): + Logger.info('NewView: enter focus') + + def on_leave_focus(self, v=None): + Logger.info('NewView: leave focus') + + def check_focus(self,*args): + if not self.parent: + return + w = self.parent + pos = w.to_widget(*Window.center) + if self.collide_point(*pos): + self.center_screen = True + else: + self.center_screen = False + + def on_center_screen(self,o, v): + if v: + self.dispatch('on_enter_focus') + else: + self.dispatch('on_leave_focus') def resize(self, size): v_size = self.get_video_size() @@ -67,9 +94,13 @@ class NewVideo(BGColorBehavior, Video): def get_video_size(self): if hasattr(self._video,'_ffplayer'): - return self._video._ffplayer.get_frame()[0][0].get_size() + try: + return self._video._ffplayer.get_frame()[0][0].get_size() + except: + return None else: Logger.error('NewVideo: _video has not _ffplayer, do nothong') + return None def audioswitch(self,btn=None): if hasattr(self._video,'_ffplayer'):