--- v8/wx_ut.py 2022-05-02 19:11:52.000000000 +0900 +++ v9/wx_ut.py 2024-03-20 14:00:00.717505639 +0900 @@ -2,6 +2,7 @@ import os import wx +import math import empty import thr @@ -55,6 +56,8 @@ wx.ToggleButton: wx.EVT_TOGGLEBUTTON, wx.CheckBox: wx.EVT_CHECKBOX, wx.Choice: wx.EVT_CHOICE, + wx.TextCtrl: [ wx.EVT_TEXT_ENTER, wx.EVT_SET_FOCUS ], + wx.Slider: wx.EVT_SLIDER, } @@ -105,6 +108,15 @@ wx.PostEvent( obj, ev ) +def exp_path( path='', DIR='${IINO_DIR}' ): + if '$' in path: + path = os.path.expandvars( path ) + if path[ 0 ] != '/' and not os.path.exists( path ): + path = os.path.join( DIR, path ) + path = os.path.expandvars( path ) + return path + + def new(title, init, fini=None, args=None, on_init=None): e = empty.new( app=None, frame=None, args=args, on_init=on_init ) @@ -142,7 +154,8 @@ lst = wp_v.o for o_h in lst: wp_h = to_wp( o_h ) - wp_h.flag |= wx.LEFT | wx.ALIGN_CENTER_VERTICAL + #wp_h.flag |= wx.LEFT | wx.ALIGN_CENTER_VERTICAL + wp_h.flag |= wx.LEFT if o_h == lst[ -1 ]: wp_h.flag |= wx.RIGHT hsz.Add( wp_h.o, wp_h.prop, wp_h.flag, wp_h.border ) @@ -188,9 +201,14 @@ if k in bind_dic: (evt, hdl) = bind_dic.get( k ) inf = ev_inf_new( ev, o, typeId, evt, e ) # e as wxo - hdl( inf ) + if hdl: + hdl( inf ) def bind(o, hdl, evt=None): + if evt == None: + cls = obj_cls_dic.get( o ) + evt = cls_evt_dic.get( cls ) + if type( o ) == list: f = lambda o: bind( o, hdl, evt ) return list( map( f, o ) ) @@ -198,10 +216,6 @@ f = lambda evt: bind( o, hdl, evt ) return list( map( f, evt ) ) - if evt == None: - cls = obj_cls_dic.get( o ) - evt = cls_evt_dic.get( cls ) - k = ( o, evt.typeId ) bind_dic[ k ] = ( evt, hdl ) @@ -280,6 +294,15 @@ v = vs[ i ] if vs and i < len( vs ) else None return empty.new( i=i, lbl=lbl, v=v ) + def menu_set( menu, lbls, init_str='', vs=None ): + menu.SetItems( lbls ) + if not init_str: + init_str = lbls[ 0 ] + menu.SetStringSelection( init_str ) + p = obj_dic.get( menu ) + p.lbls = lbls + p.vs = vs + def menu_hdl(inf): menu = inf.o p = obj_dic.get( menu ) @@ -299,7 +322,14 @@ def menu_bind(menu, hdl): bind_obj_dic_hdl( menu, hdl ) + def menu_int_new( v_min, v_max, hdl=None, v_init=None, **kwds ): + vs = range( v_min, v_max + 1 ) + lbls = list( map( str, vs ) ) + init_str = '' + if v_init is not None: + init_str = str( v_init ) + return menu_new( lbls, hdl, init_str, vs, **kwds ) def toggle_lbl(lbls, v): if type( lbls ) == list: @@ -327,6 +357,116 @@ def toggle_bind(tbtn, hdl): bind_obj_dic_hdl( tbtn, hdl ) + def tc_new( s, hdl=None ): + tc = wx_new( wx.TextCtrl, s, style=wx.TE_PROCESS_ENTER ) + bind( tc, hdl ) + return tc + + def tc_num_new( v, qtz_exp='0.01', hdl=None ): + qtz = lambda v: dbg.quantize( v, qtz_exp ) + + def hdl_tc( inf ): + tc = inf.o + try: + inf.v = str( qtz( inf.v ) ) + tc.SetValue( inf.v ) + except: + return + if hdl: + hdl( inf ) + + return tc_new( str( qtz( v ) ), hdl_tc ) + + def tc_file_sel( init_path='', btn_lbl='sel' ): + tc = tc_new( init_path ) + + def hdl( inf ): + dlg = wx.FileDialog( e.frame ) + if dlg.ShowModal() == wx.ID_OK: + tc.SetValue( dlg.GetPath() ) + + btn = button_new( btn_lbl, hdl ) + + def GetValue(): + return tc.GetValue() + + return empty.new( locals() ) + + def sld_new( v, v_min, v_max, hdl=None ): + sld = wx_new( wx.Slider, v, v_min, v_max ) + bind( sld, hdl ) + return sld + + def sld_float_new( v, v_min, v_max, v_step=None, hdl=None ): + if v_step is None: + v_step = ( v_max - v_min ) / 100 + + n_max = math.ceil( ( v_max - v ) / v_step ) + v_max = v + v_step * n_max + + n_min = math.ceil( ( v - v_min ) / v_step ) + v_min = v - v_step * n_min + + n = n_min + n_max + + def cnv( v_i ): + return v_min + ( v_max - v_min ) * v_i / n + + def rcnv( v ): + return int( n * ( v - v_min ) / ( v_max - v_min ) ) + + def hdl_( inf ): + if hdl: + inf.v = cnv( inf.v ) + hdl( inf ) + + sld = sld_new( n_min, 0, n, hdl_ ) + + def get(): + return cnv( sld.GetValue() ) + + def set( v ): + sld.SetValue( rcnv( v ) ) + + obj_dic[ sld ] = empty.new( locals() ) # ! + + return sld + + def sld_float_get( sld ): + return obj_dic.get( sld ).get() + + def sld_float_set( sld, v ): + obj_dic.get( sld ).set( v ) + + def sld_float_tc_new( v, v_min, v_max, v_step=None, hdl=None ): + + def hdl_sld( inf ): + tc.SetValue( str( inf.v ) ) + if hdl: + hdl( inf ) + + sld = sld_float_new( v, v_min, v_max, v_step, hdl_sld ) + + def hdl_tc( inf ): + if inf.typeId == wx.EVT_TEXT_ENTER.typeId: + s = tc.GetValue() + try: + v = float( s ) + except: + return + bak = v + v = max( v, v_min ) + v = min( v, v_max ) + sld_float_set( sld, v ) + + if v != bak: + tc.SetValue( str( v ) ) + if hdl: + hdl( inf ) + + tc = tc_new( str( v ), hdl_tc ) + + return ( sld, tc ) # ! class MyApp(wx.App): @@ -352,10 +492,11 @@ e.frame.Show() return 1 - def set_icon( path='hoge.png' ): + def set_icon( path='logo_white_square_w1000.png' ): if not e.frame: return + path = exp_path( path, DIR='${IINO_DIR}/imgs' ) if not os.path.exists( path ): return