From 54119a475fdbae00a88762dddaa873469d7420d8 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 26 Sep 2020 21:58:10 +0800 Subject: [PATCH] bugfix --- kivyblocks/filebrowser.py | 44 ++++++++++++++--- kivyblocks/player_osc.py | 100 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 7 deletions(-) create mode 100644 kivyblocks/player_osc.py diff --git a/kivyblocks/filebrowser.py b/kivyblocks/filebrowser.py index 4df33a1..6a426d6 100644 --- a/kivyblocks/filebrowser.py +++ b/kivyblocks/filebrowser.py @@ -1,4 +1,6 @@ from kivy.uix.floatlayout import FloatLayout +from kivy.event import EventDispatcher +from kivy.clock import Clock from kivy.factory import Factory from kivy.properties import ObjectProperty from kivy.uix.popup import Popup @@ -21,12 +23,15 @@ class FileLoaderBrowser(Popup): Popup.__init__(self, content = self.content, title=i18n(title), size_hint=(0.9,0.9)) + self.register_event_type('on_selected') self.choose_dir = choose_dir self.list_widget = FileChooserListView(rootpath=rootpath) self.icon_widget = FileChooserIconView(rootpath=rootpath) - self.list_widget.bind(on_selection=self.set_txt_input) - self.icon_widget.bind(on_selection=self.set_txt_input) + self.list_widget.bind(on_touch_up=self.on_release) + self.icon_widget.bind(on_touch_up=self.on_release) + self.list_widget.bind(on_submit=self.do_submit) + self.icon_widget.bind(on_submit=self.do_submit) self.btn_load = Button(text=i18n('load'),size_hint=(None,None), size=CSize(8,2)) self.btn_list_view = PressableImage( \ @@ -48,19 +53,44 @@ class FileLoaderBrowser(Popup): self.view_mode = 'list_view' self.show_list_view() - def set_txt_input(self,o,v=None): - print('on_selection fired',o.selection) - self.txt_input.text = o.path + def on_selected(self,fn): + print(fn,'selected') + + def on_release(self,o,v=None): + Clock.schedule_once(self.set_txt_input,0.4) + + def set_txt_input(self,t=None): + self.txt_input.text = self.cur_widget.path + + def target_selected(self): + fn = self.txt_input.text + if not self.choose_dir and os.path.isdir(fn): + return + if self.choose_dir and os.path.isfile(fn): + fn = os.path.dirname(fn) + self.dispatch('on_selected',fn) + self.dismiss() + + def do_submit(self,o,a,b): + if not self.cur_widget.selection: + return + self.txt_input.text = self.cur_widget.selection[0] + self.target_selected() def do_load(self,o,d=None): - print(o,d) - print(self.cur_widget.selection and self.cur_widget.selection[0] or '', 'selected ') + if self.cur_widget.selection: + self.txt_input.text = self.cur_widget.selection[0] + if self.txt_input.text == '': + return + self.target_selected() + def change_view_mode(self,o,v=None): self.content.clear_widgets() if self.view_mode == 'list_view': self.show_icon_view() else: self.show_list_view() + def show_list_view(self): self.cur_widget = self.list_widget self.view_mode = 'list_view' diff --git a/kivyblocks/player_osc.py b/kivyblocks/player_osc.py new file mode 100644 index 0000000..6539675 --- /dev/null +++ b/kivyblocks/player_osc.py @@ -0,0 +1,100 @@ + +import json +from pythonosc import dispatcher, osc_server, udp_client +from appPublic.sockPackage import get_free_local_addr +from background import Background +from kivy.event import EventDispatcher + + +class PlayerOSCServer(EventDispatcher): + def __init__(self,playerid): + EventDispatcher.__init__(self) + self.playerid = playerid + dispatch = dispatcher.Dispatcher() + self.ip,self.port = get_free_local_addr() + # self.server = osc_server.ThreadingOSCUDPServer( (self.ip, self.port), dispatch) + self.server = osc_server.BlockingOSCUDPServer( (self.ip, self.port), dispatch) + self.osc_dispatch = dispatch + self.commands = [] + self.register_event_type('on_osc_event') + self.map('/mute',self.mute) + self.map('/pause',self.pause) + self.map('/menu',self.menu) + self.map('/up',self.up) + self.map('/down',self.down) + self.map('/left',self.left) + self.map('/right',self.right) + self.map('/play',self.play) + self.start() + + def on_osc_event(self,*args): + print('PlayerOSCServer():on_osc_event():args=',args) + + def menu(self,*args): + self.dispatch('on_osc_event','menu',*args) + + def mute(self,*args): + self.dispatch('on_osc_event','mute',*args) + + def pause(self,*args): + self.dispatch('on_osc_event','pouse',*args) + + def up(self,*args): + self.dispatch('on_osc_event','up',*args) + + def down(self,*args): + self.dispatch('on_osc_event','down',*args) + + def left(self,*args): + self.dispatch('on_osc_event','left',*args) + + def right(self,*args): + self.dispatch('on_osc_event','right',*args) + + def play(self,*args): + print('play():args=',args) + d = json.loads(args[1]) + self.dispatch('on_osc_event','play',d) + + def start(self): + self.thread = Background(self.server.serve_forever) + self.thread.daemon_threads = True + self.thread.start() + + def info(self): + return { + "playerid":self.playerid, + "ip":self.ip, + "port":self.port, + "commands": self.commands + } + + def map(self,cmd,func): + self.commands.append(cmd) + self.osc_dispatch.map(cmd,func) + + def stop(self): + self.server.shutdown() + self.server.server_close() + self.thread.join(5) + +class PlayerOSCClient: + def __init__(self, ip,port): + self.client = udp_client.SimpleUDPClient(ip, port) # Create client + + def play(self, mrec): + t = json.dumps(mrec) + self.client.send_message("/play", t) + + def mute(self): + self.client.send_message('/mute') + + def menu(self): + self.client.send_message('/menu') + + def pause(self): + self.client.send_message('/pause') + + def up(self): + self.client.send_message('/up') +