From 0c616b2845dba97e45696f72ea9462ff58e58a23 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Wed, 23 Nov 2022 14:41:47 +0800 Subject: [PATCH] fix rectangle bug --- kivyblocks/blocks.py | 20 +++++++++++--------- kivyblocks/blocksapp.py | 3 +++ kivyblocks/ffpyplayer_video.py | 7 ++++--- kivyblocks/landscopehide.py | 25 +++++++++++++++++-------- kivyblocks/modalbehavior.py | 18 +++++++++--------- kivyblocks/register.py | 1 + kivyblocks/version.py | 2 +- kivyblocks/videobehavior.py | 26 +++++++++++++++----------- kivyblocks/widget_css.py | 4 +++- 9 files changed, 64 insertions(+), 42 deletions(-) diff --git a/kivyblocks/blocks.py b/kivyblocks/blocks.py index 7feb765..cfcd47a 100644 --- a/kivyblocks/blocks.py +++ b/kivyblocks/blocks.py @@ -147,11 +147,14 @@ class Blocks(EventDispatcher): x = ClassX{klass_cnt}() """ - # print(code) - exec(code, env, lenv) - w = lenv.get('x', None) - klass_cnt += 1 - return w + try: + exec(code, env, lenv) + w = lenv.get('x', None) + klass_cnt += 1 + return w + except Exception as e: + print(code) + raise e def set(self, k:str, v): self.env[k] = v @@ -501,8 +504,9 @@ x = ClassX{klass_cnt}() target.add_widget(w) def doerr(o,e): - Logger.info('Block: urlwidgetAction(): desc=%s widgetBuild error' - ,str(desc)) + Logger.info('Block: urlwidgetAction(): desc=%s widgetBuild error e=%s' + ,str(desc), str(e)) + print('d=', d) b = Blocks() b.bind(on_built=partial(doit,target,add_mode)) @@ -858,5 +862,3 @@ class {{ classname }}({% for b in bases -%}{{b}}{% endfor %}) """ Factory.register('Blocks',Blocks) -Factory.register('Video',Video) -Factory.register('OrientationLayout', OrientationLayout) diff --git a/kivyblocks/blocksapp.py b/kivyblocks/blocksapp.py index 2353a23..262abd7 100644 --- a/kivyblocks/blocksapp.py +++ b/kivyblocks/blocksapp.py @@ -1,6 +1,7 @@ import os import sys +from kivyblocks import setconfig from kivy.resources import resource_add_path import signal import codecs @@ -22,6 +23,7 @@ from kivy.app import App import plyer +from .i18n import I18n from .register import * from .threadcall import HttpClient,Workers from .utils import * @@ -74,6 +76,7 @@ class BlocksApp(App): register_css(k,v) def build(self): + i18n = I18n() self.platform = platform self.is_desktop = platform in ['win', 'linux', 'macosx'] config = getConfig() diff --git a/kivyblocks/ffpyplayer_video.py b/kivyblocks/ffpyplayer_video.py index d1c1f91..7a074e2 100644 --- a/kivyblocks/ffpyplayer_video.py +++ b/kivyblocks/ffpyplayer_video.py @@ -35,6 +35,7 @@ vhks = ['v_src', ] class FFVideo(WidgetReady, VideoBehavior, BoxLayout): +# class FFVideo(VideoBehavior, BoxLayout): def __init__(self, **kw): kw1 = {k:v for k,v in kw.items() if k in vhks} kw1['renderto'] = 'background' @@ -43,9 +44,9 @@ class FFVideo(WidgetReady, VideoBehavior, BoxLayout): BoxLayout.__init__(self, **kw2) VideoBehavior.__init__(self, **kw1) WidgetReady.__init__(self) - self.msg_w = Label(text='Hello') - self.add_widget(self.msg_w) - self.bind(on_frame=self.show_info) + # self.msg_w = Label(text='Hello') + # self.add_widget(self.msg_w) + # self.bind(on_frame=self.show_info) def show_info(self, o, d): txt = f"size={d['size']}, vpos={d['pos']}, vsize={d['texture_size']}" diff --git a/kivyblocks/landscopehide.py b/kivyblocks/landscopehide.py index 06da9c8..753f6dc 100644 --- a/kivyblocks/landscopehide.py +++ b/kivyblocks/landscopehide.py @@ -1,4 +1,5 @@ +from kivy.graphics import Color, Line from kivy.uix.floatlayout import FloatLayout from kivy.uix.widget import Widget from kivyblocks.bgcolorbehavior import BGColorBehavior @@ -16,6 +17,7 @@ class LandscopeHide(FloatLayout): self.fix_widget = fix_desc else: self.fix_widget = widget_build(fix_desc) + self.add_widget(self.fix_widget) if float_desc: if isinstance(float_desc, Widget): self.float_widget = float_desc @@ -44,23 +46,26 @@ class LandscopeHide(FloatLayout): return self.width > self.height def size_changed(self, *args): - print(f'force={self.float_show_landscope}, landscope={self.is_landscope()}, w={self.width}, h={self.height}') self.rate = min(*self.size) / max(*self.size) - self.clear_widgets() self.show_fix() self.show_float() + self._trigger_layout() + print(f'landscope={self.is_landscope()}, w={self.width}, h={self.height}, fix_pos={self.fix_widget.pos}, fix_size={self.fix_widget.size}') + self.canvas.before.clear() + with self.canvas.before: + Color(1,0,0,1) + Line(rectangle=(0,0, self.width, self.height), width=2) def show_fix(self): if self.is_landscope(): print('show_fix() landscope') self.fix_widget.size_hint = (1, 1) - self.fix_widget.pos = (0,0) + self.fix_widget.pos_hint = {'x':0, 'y':0} else: print('show_fix() not landscope') - self.fix_widget.size_hint = (1, None) - self.fix_widget.height = self.width * self.rate - self.fix_widget.pos = (0, self.height - self.fix_widget.height) - self.add_widget(self.fix_widget) + hr = self.width * self.rate / self.height + self.fix_widget.size_hint = (1, hr) + self.fix_widget.pos_hint = {'x':0, 'y':(1-hr)} def show_float(self): if self.is_landscope(): @@ -70,12 +75,16 @@ class LandscopeHide(FloatLayout): self.float_widget.width = self.height * self.rate self.float_widget.pos = (0, 0) self.add_widget(self.float_widget) + else: + if self.float_widget in self.children: + self.remove_widget(self.float_widget) else: print('show_float() not landscope') self.float_widget.size_hint = (1, None) self.float_widget.height = self.height - self.fix_widget.height self.float_widget.pos = (0, 0) - self.add_widget(self.float_widget) + if not self.float_widget in self.children: + self.add_widget(self.float_widget) if __name__ == '__main__': from kivy.app import App diff --git a/kivyblocks/modalbehavior.py b/kivyblocks/modalbehavior.py index 850a2ca..3e0df61 100644 --- a/kivyblocks/modalbehavior.py +++ b/kivyblocks/modalbehavior.py @@ -9,7 +9,7 @@ class ModalBehavior(object): auto_dismiss = BooleanProperty(True) target = StringProperty(None) show_time = NumericProperty(0) - position = OptionProperty('cc',options=['tl', 'tc', 'tr', + anchor = OptionProperty('cc',options=['tl', 'tc', 'tr', 'cl', 'cc', 'cr', 'bl', 'bc', 'br']) def __init__(self, **kw): @@ -17,8 +17,8 @@ class ModalBehavior(object): setattr(self, k,v) self.time_task = None self._target = None - self.set_size_position() - self._target.bind(size=self.set_size_position) + self.set_size_anchor() + self._target.bind(size=self.set_size_anchor) self.register_event_type('on_open') self.register_event_type('on_pre_open') self.register_event_type('on_pre_dismiss') @@ -48,18 +48,18 @@ class ModalBehavior(object): w = Window self._target = w - def set_size_position(self, *args): + def set_size_anchor(self, *args): self.set_target() if self.size_hint_x: self.width = self.size_hint_x * self._target.width if self.size_hint_y: self.height = self.size_hint_y * self._target.height - self.set_modal_position() + self.set_modal_anchor() - def set_modal_position(self): + def set_modal_anchor(self): self.set_target() - xn = self.position[1] - yn = self.position[0] + xn = self.anchor[1] + yn = self.anchor[0] x, y = 0, 0 if xn == 'c': x = (self._target.width - self.width) / 2 @@ -77,7 +77,7 @@ class ModalBehavior(object): self.pos = x, y else: self.pos = self._target.pos[0] + x, self._target.pos[1] + y - print("modal",self._target.size, self.position, self.pos, self.size, self.size_hint) + print("modal",self._target.size, self.anchor, self.pos, self.size, self.size_hint) def open(self): if self.time_task is not None: diff --git a/kivyblocks/register.py b/kivyblocks/register.py index a98f5c1..333558f 100644 --- a/kivyblocks/register.py +++ b/kivyblocks/register.py @@ -30,6 +30,7 @@ from .markdown import Markdown # from .custom_camera import CustomCamera, QrReader from .defaultimage import * from .price import * +from .blocks import Blocks #if kivy.platform in ['win','linux', 'macosx']: # from .camerawithmic import ScreenWithMic diff --git a/kivyblocks/version.py b/kivyblocks/version.py index ab45471..1e4826d 100644 --- a/kivyblocks/version.py +++ b/kivyblocks/version.py @@ -1 +1 @@ -__version__ = '0.4.6' +__version__ = '0.4.7' diff --git a/kivyblocks/videobehavior.py b/kivyblocks/videobehavior.py index 2951a2a..c012111 100644 --- a/kivyblocks/videobehavior.py +++ b/kivyblocks/videobehavior.py @@ -48,7 +48,7 @@ class VideoBehavior(object): } self.lib_opts = {} self.headers_pattern = {} - self.set_black() + # self.set_black() self.start_task = None self.block_task = None self.register_event_type('on_frame') @@ -292,9 +292,9 @@ class VideoBehavior(object): return image_texture = Texture.create( size=self.size, colorfmt='rgb') - buf = b'\x00' * int(self.width * self.height * 3) + buf = b'\x33' * int(self.width * self.height * 3) image_texture.blit_buffer(buf, colorfmt='rgb', bufferfmt='ubyte') - self._draw_texture(image_texture, *self.size) + self._my_show_texture(image_texture, *self.size) self.is_black = True def show_yuv420(self, img): @@ -324,7 +324,7 @@ class VideoBehavior(object): self._fbo.ask_update() self._fbo.draw() texture.flip_vertical() - self.draw_texture(texture, w, h) + self.my_show_texture(texture, w, h) # self.texture = texture def show_others(self, img): @@ -334,16 +334,18 @@ class VideoBehavior(object): img.to_memoryview()[0], colorfmt='rgb', bufferfmt='ubyte') texture.flip_vertical() - self.draw_texture(texture, w, h) + self.my_show_texture(texture, w, h) # self.texture = texture # print('img_size=', w, h, 'window size=', self.size) - def draw_texture(self, texture, w, h): - d = self._draw_texture(texture, w, h) + def my_show_texture(self, texture, w, h): + d = self._my_show_texture(texture, w, h) if d: self.dispatch('on_frame', d) - def _draw_texture(self, texture, w, h): + def _my_show_texture(self, texture, w, h): + if self.width == 100 and self.height== 100: + return if abs(self.width - w) > 1 and abs(self.height - h) > 1: self._set_video_size() if w > self.width: @@ -365,7 +367,9 @@ class VideoBehavior(object): Color(1,1,1,1) Line(points=[0, 1, self.width, 1], width=2) Color(1,0,0,1) - Line(points=[0,1,p,1], width=2) + Line(points=[1,1,p,1], width=2) + # Color(1,1,0,1) + # Line(rectangle=[0,0, self.width, self.height], width=4) d = { 'texture':texture, 'position':self.position, @@ -389,7 +393,7 @@ class VideoBehavior(object): self.play() return self.status = 'stop' - self.set_black() + # self.set_black() self.last_val = None return if val == 'pause': @@ -397,7 +401,7 @@ class VideoBehavior(object): self.last_val = None return if frame is None: - self.set_black() + # self.set_black() self.last_val = None self.vh_task = Clock.schedule_once(self.video_handle, 0.1) return diff --git a/kivyblocks/widget_css.py b/kivyblocks/widget_css.py index 6495ef5..84072d0 100644 --- a/kivyblocks/widget_css.py +++ b/kivyblocks/widget_css.py @@ -164,6 +164,8 @@ class WidgetCSS(object): self.set_background_color() def set_background_color(self, *args): + if self.width == 100 and self.height == 100: + return if not self.bgcolor: return if not self.canvas: @@ -171,7 +173,7 @@ class WidgetCSS(object): # self.__class__.__name__) return - # self.canvas.before.clear() + self.canvas.before.clear() with self.canvas.before: Color(*self.bgcolor) if self.radius: