diff -ur v10/snddiv_gui.py v11/snddiv_gui.py --- v10/snddiv_gui.py 2020-02-01 12:37:41.000000000 +0900 +++ v11/snddiv_gui.py 2020-05-30 17:44:48.000000000 +0900 @@ -1,42 +1,23 @@ #!/usr/bin/env python import sys -import threading from decimal import Decimal import wx + +import empty import thr import io_ut +import wx_ut import dbg -def wrap( lsts, border=4 ): - vsz = wx.BoxSizer(wx.VERTICAL) - for lst in lsts: - hsz = wx.BoxSizer(wx.HORIZONTAL) - for o in lst: - flag = wx.LEFT | ( wx.RIGHT if o == lst[-1] else 0 ) - flag |= wx.ALIGN_CENTER_VERTICAL - hsz.Add(o, 0, flag, border) - flag = wx.TOP | ( wx.BOTTOM if lst == lsts[-1] else 0 ) - vsz.Add( hsz, 0, flag, border ) - return vsz - -def set_min_w(o, w): - o.SetMinSize((w, -1)) - -cls_evt_dic = { - wx.Button: wx.EVT_BUTTON, - wx.ToggleButton: wx.EVT_TOGGLEBUTTON, - wx.CheckBox: wx.EVT_CHECKBOX, - wx.Choice: wx.EVT_CHOICE, -} -def init(app, title): +def init(wxo): rdr = io_ut.reader_new( sys.stdin, 1, no_buf=True ) - lock = threading.Lock() + lock = thr.lock_new() def comm(cmd, rep_func=None): - lock.acquire() + lock.on() if cmd: dbg.out(cmd) rep = None @@ -45,7 +26,7 @@ rep = rep_func() if rep == '': break - lock.release() + lock.off() return rep while True: @@ -55,50 +36,26 @@ if not s: sys.exit(1) - frame = wx.Frame(None, wx.ID_ANY, title) - - obj_cls_dic = {} - def wx_new(cls, *args, **kwds): - (k, w) = ('min_w', -1) - if k in kwds: - w = kwds.pop(k) - o = cls( frame, wx.ID_ANY, *args, **kwds ) - if w != -1: - set_min_w(o, w) - obj_cls_dic[o] = cls - return o - - def bind_o(o, hdl): - cls = obj_cls_dic.get(o) - evt = cls_evt_dic.get(cls) - if evt: - frame.Bind(evt, hdl, o) - - def bind_objs(objs, hdl): - for o in objs: - bind_o(o, hdl) play_lbs = ( ' Play |>', ' Play <|', 'Pause ||' ) - btn_play = wx_new( wx.ToggleButton, play_lbs[0], min_w=104 ) + btn_play = wxo.toggle_new( play_lbs[ 0 ], min_w=104 ) lb_pause = play_lbs[-1] is_play = lambda : btn_play.GetValue() - cbox_reverse = wx_new( wx.CheckBox, 'reverse' ) + cbox_reverse = wxo.wx_new( wx.CheckBox, 'reverse' ) is_reverse = lambda : cbox_reverse.GetValue() speed_lbs = ('x4', 'x2', 'x1', 'x0.5') - menu_speed = wx_new( wx.Choice, choices=speed_lbs ) - #menu_speed.SetSelection(2) - menu_speed.SetStringSelection('x1') shifts = (2, 1, 0, -1) + menu_speed = wxo.menu_new( speed_lbs, None, 'x1', shifts ) get_shift = lambda : shifts[ menu_speed.GetSelection() ] - btn_rw = wx_new( wx.Button, '<<', min_w=50 ) - btn_ff = wx_new( wx.Button, '>>', min_w=50 ) + btn_rw = wxo.wx_new( wx.Button, '<<', min_w=50 ) + btn_ff = wxo.wx_new( wx.Button, '>>', min_w=50 ) - btn_div = wx_new( wx.Button, '', min_w=50 ) + btn_div = wxo.wx_new( wx.Button, '', min_w=50 ) btn_div.Enable(False) - area = wx_new( wx.StaticText, '-/-', min_w=50 ) + area = wxo.label_new( '-/-', min_w=50 ) def div_update(): cmd = 'dbg.out( snd.div_join_label() )' @@ -112,14 +69,14 @@ s = comm(cmd, rdr.readline).strip() area.SetLabel(s) - pos = wx_new( wx.StaticText, '-', min_w=50 ) + pos = wxo.label_new( '-', min_w=50 ) def pos_update(): cmd = 'dbg.out("{}".format( snd.get_sec() ) )' s = comm(cmd, rdr.readline).strip() s = str( Decimal(s).quantize( Decimal('.01') ) ) wx.CallAfter( pos.SetLabel, s ) - btn_save = wx_new( wx.Button, 'save', min_w=50 ) + btn_save = wxo.wx_new( wx.Button, 'save', min_w=50 ) def save(): dlg = wx.FileDialog( frame, style=wx.FD_SAVE ) @@ -141,7 +98,7 @@ frame.Enable(False) wx.CallAfter(do_save) - pos_ev = threading.Event() + pos_ev = thr.event_new() def th_func(): tmout = 0.2 if is_play() else None pos_ev.wait(tmout) @@ -161,8 +118,8 @@ lb = lb_pause if is_play() else play_lbs[ 1 if is_reverse() else 0 ] btn_play.SetLabel(lb) - def hdl(evt): - o = evt.GetEventObject() + def hdl(inf): + o = inf.o if o in ( btn_play, cbox_reverse ): lb_update() s = '' @@ -190,37 +147,31 @@ wx.CallAfter( div_update ) wx.CallAfter( area_update ) - def quit_hdl(evt): - dbg.err('quit') - th_stop() - wx.Exit() - - objs = ( + objs = [ btn_rw, btn_play, btn_ff, cbox_reverse, menu_speed, btn_div, btn_save, - ) - bind_objs(objs, hdl) - frame.Bind( wx.EVT_CLOSE, quit_hdl ) - - szr = wrap( [ - (btn_rw, btn_play, btn_ff), - (cbox_reverse, menu_speed), - (pos, btn_div, area, btn_save), - ] ) - frame.SetSizer(szr) - frame.Layout() - frame.Fit() - app.SetTopWindow(frame) - frame.Show() - -def wx_run(title=''): - class MyApp(wx.App): - def OnInit(self): - init(self, title) - return 1 - MyApp(0).MainLoop() + ] + + wxo.bind( objs, hdl ) + + wp = wxo.wp + lsts = [ + wp( [ wp( btn_rw ), wp( btn_play ), wp( btn_ff ) ] ), + wp( [ wp( cbox_reverse ), wp( menu_speed ) ] ), + wp( [ wp( pos ), wp( btn_div ), wp( area ), wp( btn_save ) ] ), + ] + wxo.wrap( wxo.frame, lsts ) + + wxo.L = empty.new( locals() ) + +def fini(wxo): + wxo.L.th_stop() + +def run(): + wxo = wx_ut.new( 'snd', init, fini ) + wxo.main_loop() if __name__ == "__main__": - wx_run('snd') + run() # EOF