def check_cudatext(): fn = os.path.join(tempfile.gettempdir(), 'cudatext_download.html') app.msg_status('Downloading: ' + DOWNLOAD_PAGE, True) get_url(DOWNLOAD_PAGE, fn, True) app.msg_status('') if not os.path.isfile(fn): app.msg_status('Cannot download: ' + DOWNLOAD_PAGE) return text = open(fn, encoding='utf8').read() items = re.findall(DOWNLOAD_REGEX, text) if not items: app.msg_status('Cannot find download links') return items = sorted(items, key=lambda i: i[1], reverse=True) print('Found links:') for i in items: print(' ' + i[0]) url = items[0][0] ver_inet = items[0][1] ver_local = app.app_exe_version() #ver_inet = '1.10.0.2' #test #ver_local = '0' #test if versions_ordered(ver_inet, ver_local): app.msg_box( 'Latest CudaText is already here\nHere: %s\nInternet: %s' % (ver_local, ver_inet), app.MB_OK + app.MB_ICONINFO) return text = '\n'.join([ 'type=label\1pos=6,20,500,0\1cap=CudaText newer version is available at this URL:', 'type=linklabel\1pos=6,45,800,0\1cap=' + url + '\1props=' + url + '\1font_size=9', 'type=button\1pos=300,100,400,0\1cap=OK\1props=1' ]) app.dlg_custom('CudaText update', 700, 132, text)
def dlg_wrapper(title, w, h, cnts, in_vals={}, focus_cid=None): """ Wrapper for dlg_custom. Params title, w, h Title, Width, Height cnts List of static control properties [{cid:'*', tp:'*', t:1,l:1,w:1,r:1,b;1,h:1,tid:'cid', cap:'*', hint:'*', en:'0', props:'*', items:[*], act='0'}] cid (opt)(str) C(ontrol)id. Need only for buttons and conrols with value (and for tid) tp (str) Control types from wiki or short names t (opt)(int) Top tid (opt)(str) Ref to other control cid for horz-align text in both controls l (int) Left r,b,w,h (opt)(int) Position. w>>>r=l+w, h>>>b=t+h, b can be omitted cap (str) Caption for labels and buttons hint (opt)(str) Tooltip en (opt)('0'|'1'|True|False) Enabled-state props (opt)(str) See wiki act (opt)('0'|'1'|True|False) Will close dlg when changed items (str|list) String as in wiki. List structure by types: [v1,v2,] For combo, combo_ro, listbox, checkgroup, radiogroup, checklistbox (head, body) For listview, checklistview head [(cap,width),(cap,width),] body [[r0c0,r0c1,],[r1c0,r1c1,],[r2c0,r2c1,],] in_vals Dict of start values for some controls {'cid':val} focus_cid (opt) Control cid for start focus Return btn_cid Clicked/changed control cid {'cid':val} Dict of new values for the same (as in_vals) controls Format of values is same too. focus_cid Focused control cid [cid] List of controls with changed values Short names for types lb label ln-lb linklabel ed edit sp-ed spinedit me memo bt button rd radio ch check ch-bt checkbutton ch-gp checkgroup rd-gp radiogroup cb combo cb-ro combo_ro lbx listbox ch-lbx checklistbox lvw listview ch-lvw checklistview Example. def ask_number(ask, def_val): cnts=[dict( tp='lb',tid='v',l=3 ,w=70,cap=ask) ,dict(cid='v',tp='ed',t=3 ,l=73,w=70) ,dict(cid='!',tp='bt',t=45 ,l=3 ,w=70,cap='OK',props='1') ,dict(cid='-',tp='bt',t=45 ,l=73,w=70,cap='Cancel')] vals={'v':def_val} while True: aid,vals,fid,chds=dlg_wrapper('Example',146,75,cnts,vals,'v') if aid is None or btn=='-': return def_val if not re.match(r'\d+$', vals['v']): continue return vals['v'] """ pass; #log('in_vals={}',pformat(in_vals, width=120)) cid2i = {cnt['cid']:i for i,cnt in enumerate(cnts) if 'cid' in cnt} if True: # Checks no_tids = {cnt['tid'] for cnt in cnts if 'tid' in cnt and cnt['tid'] not in cid2i} if no_tids: raise Exception(f('No cid(s) for tid(s): {}', no_tids)) no_vids = {cid for cid in in_vals if cid not in cid2i} if no_vids: raise Exception(f('No cid(s) for vals: {}', no_vids)) ctrls_l = [] for cnt in cnts: tp = cnt['tp'] tp = REDUCTS.get(tp, tp) if tp=='--': # Horz-line t = cnt.get('t') l = cnt.get('l', 0) # def: from DlgLeft r = cnt.get('r', l+cnt.get('w', w)) # def: to DlgRight lst = ['type=label'] lst+= ['cap='+'—'*1000] lst+= ['en=0'] lst+= ['pos={l},{t},{r},0'.format(l=l,t=t,r=r)] ctrls_l+= [chr(1).join(lst)] continue#for cnt lst = ['type='+tp] # Simple props for k in ['cap', 'hint', 'props']: if k in cnt: lst += [k+'='+str(cnt[k])] # Props with preparation # Position: # t[op] or tid, l[eft] required # w[idth] >>> r[ight ]=l+w # h[eight] >>> b[ottom]=t+h # b dont need for buttons, edit, labels l = cnt['l'] t = cnt.get('t', 0) if 'tid' in cnt: # cid for horz-align text bs_cnt = cnts[cid2i[cnt['tid']]] bs_tp = bs_cnt['tp'] t = bs_cnt['t'] + fit_top_by_env(tp, REDUCTS.get(bs_tp, bs_tp)) # t = bs_cnt['t'] + top_plus_for_os(tp, REDUCTS.get(bs_tp, bs_tp)) r = cnt.get('r', l+cnt.get('w', 0)) b = cnt.get('b', t+cnt.get('h', 0)) lst += ['pos={l},{t},{r},{b}'.format(l=l,t=t,r=r,b=b)] if 'en' in cnt: val = cnt['en'] lst += ['en='+('1' if val in [True, '1'] else '0')] if 'items' in cnt: items = cnt['items'] if isinstance(items, str): pass elif tp in ['listview', 'checklistview']: # For listview, checklistview: "\t"-separated items. # first item is column headers: title1+"="+size1 + "\r" + title2+"="+size2 + "\r" +... # other items are data: cell1+"\r"+cell2+"\r"+... # ([(hd,wd)], [[cells],[cells],]) items = '\t'.join(['\r'.join(['='.join((hd,sz)) for hd,sz in items[0]])] +['\r'.join(row) for row in items[1]] ) else: # For combo, combo_ro, listbox, checkgroup, radiogroup, checklistbox: "\t"-separated lines items = '\t'.join(items) lst+= ['items='+items] # Prepare val if cnt.get('cid') in in_vals: in_val = in_vals[cnt['cid']] if False:pass elif tp in ['check', 'radio', 'checkbutton'] and isinstance(in_val, bool): # For check, radio, checkbutton: value "0"/"1" in_val = '1' if in_val else '0' elif tp=='memo': # For memo: "\t"-separated lines (in lines "\t" must be replaced to chr(2)) if isinstance(in_val, list): in_val = '\t'.join([v.replace('\t', chr(2)) for v in in_val]) else: in_val = in_val.replace('\t', chr(2)).replace('\r\n','\n').replace('\r','\n').replace('\n','\t') elif tp=='checkgroup' and isinstance(in_val, list): # For checkgroup: ","-separated checks (values "0"/"1") in_val = ','.join(in_val) elif tp in ['checklistbox', 'checklistview'] and isinstance(in_val, tuple): # For checklistbox, checklistview: index+";"+checks in_val = ';'.join( (str(in_val[0]), ','.join( in_val[1]) ) ) lst+= ['val='+str(in_val)] if 'act' in cnt: # must be last in lst val = cnt['act'] lst += ['act='+('1' if val in [True, '1'] else '0')] pass; #log('lst={}',lst) ctrls_l+= [chr(1).join(lst)] #for cnt pass; #log('ok ctrls_l={}',pformat(ctrls_l, width=120)) ans = app.dlg_custom(title, w, h, '\n'.join(ctrls_l), cid2i.get(focus_cid, -1)) if ans is None: return None, None, None, None # btn_cid, {cid:v}, focus_cid, [cid] btn_i, \ vals_ls = ans[0], ans[1].splitlines() focus_cid = '' if vals_ls[-1].startswith('focused='): # From API 1.0.156 dlg_custom also returns index of active control focus_n_s = vals_ls.pop() focus_i = int(focus_n_s.split('=')[1]) focus_cid = cnts[focus_i].get('cid', '') act_cid = cnts[btn_i]['cid'] # Parse output values an_vals = {cid:vals_ls[cid2i[cid]] for cid in in_vals} for cid in an_vals: cnt = cnts[cid2i[cid]] tp = cnt['tp'] tp = REDUCTS.get(tp, tp) in_val = in_vals[cid] an_val = an_vals[cid] if False:pass elif tp=='memo': # For memo: "\t"-separated lines (in lines "\t" must be replaced to chr(2)) if isinstance(in_val, list): an_val = [v.replace(chr(2), '\t') for v in an_val.split('\t')] #in_val = '\t'.join([v.replace('\t', chr(2)) for v in in_val]) else: an_val = an_val.replace('\t','\n').replace(chr(2), '\t') #in_val = in_val.replace('\t', chr(2)).replace('\r\n','\n').replace('\r','\n').replace('\n','\t') elif tp=='checkgroup' and isinstance(in_val, list): # For checkgroup: ","-separated checks (values "0"/"1") an_val = an_val.split(',') #in_val = ','.join(in_val) elif tp in ['checklistbox', 'checklistview'] and isinstance(in_val, tuple): an_val = an_val.split(';') an_val = (an_val[0], an_val[1].strip(',').split(',')) #in_val = ';'.join(in_val[0], ','.join(in_val[1])) elif isinstance(in_val, bool): an_val = an_val=='1' elif tp=='listview': an_val = -1 if an_val=='' else int(an_val) else: an_val = type(in_val)(an_val) an_vals[cid] = an_val #for cid chds = [cid for cid in in_vals if in_vals[cid]!=an_vals[cid]] if focus_cid: # If out focus points to button then will point to a unique changed control focus_tp= cnts[cid2i[focus_cid]]['tp'] focus_tp= REDUCTS.get(focus_tp, focus_tp) if focus_tp in ('button'): focus_cid = '' if len(chds)!=1 else chds[0] return act_cid \ , an_vals \ , focus_cid \ , chds
def do_options_dlg(): id_color_err = 0 id_color_warn = 2 id_color_info = 4 id_bk_err = 1 id_bk_warn = 3 id_bk_info = 5 id_ev_open = 6 id_ev_save = 7 id_ev_ch = 8 id_ok = 9 while True: c1 = chr(1) text = '\n'.join([] + [ c1.join(['type=button', 'pos=6,6,180,0', 'cap=Color of &errors']) ] + [ c1.join([ 'type=check', 'pos=186,6,400,0', 'cap=Colored e&rror bookmarks', 'val=' + str(int(opt.color_error_use)) ]) ] + [ c1.join(['type=button', 'pos=6,36,180,0', 'cap=Color of &warns']) ] + [ c1.join([ 'type=check', 'pos=186,36,400,0', 'cap=Colored warn &bookmarks', 'val=' + str(int(opt.color_warn_use)) ]) ] + [ c1.join(['type=button', 'pos=6,66,180,0', 'cap=Color of &infos']) ] + [ c1.join([ 'type=check', 'pos=186,66,400,0', 'cap=Colored info boo&kmarks', 'val=' + str(int(opt.color_info_use)) ]) ] + [ c1.join([ 'type=check', 'pos=6,100,400,0', 'cap=Lint on &opening file', 'val=' + str(int(opt.use_on_open)) ]) ] + [ c1.join([ 'type=check', 'pos=6,126,400,0', 'cap=Lint on &saving file', 'val=' + str(int(opt.use_on_save)) ]) ] + [ c1.join([ 'type=check', 'pos=6,152,400,0', 'cap=Lint &after text changed, and pause', 'val=' + str(int(opt.use_on_change)) ]) ] + [ c1.join(['type=button', 'pos=206,182,300,0', 'cap=OK', 'props=1']) ] + [c1.join(['type=button', 'pos=306,182,400,0', 'cap=Cancel'])]) res = app.dlg_custom('CudaLint options', 406, 215, text) if res is None: return btn, text = res if btn == id_color_err: n = app.dlg_color(opt.color_error) if n is not None: opt.color_error = n continue if btn == id_color_warn: n = app.dlg_color(opt.color_warn) if n is not None: opt.color_warn = n continue if btn == id_color_info: n = app.dlg_color(opt.color_info) if n is not None: opt.color_info = n continue break if btn != id_ok: return text = text.splitlines() opt.color_error_use = text[id_bk_err] == '1' opt.color_warn_use = text[id_bk_warn] == '1' opt.color_info_use = text[id_bk_info] == '1' opt.use_on_open = text[id_ev_open] == '1' opt.use_on_save = text[id_ev_save] == '1' opt.use_on_change = text[id_ev_ch] == '1' opt.do_options_save()
def run(self, mcr_id, times=1, waits=0, while_chngs=False, till_endln=False): ''' Main (and single) way to run any macro ''' pass; LOG and log('mcr_id, times, waits, while_chngs, till_endln={}',(mcr_id, times, waits, while_chngs, till_endln)) mcr = self.mcr4id.get(str(mcr_id)) if mcr is None: pass; LOG and log('no id',) return app.msg_status('No macros: {}'.format(mcr_id)) cmds4eval = ';'.join(mcr['evl']) pass; LOG and log('nm, cmds4eval={}',(mcr['nm'], cmds4eval)) how_t = 'wait' rp_ctrl = self.tm_ctrl.get('rp_ctrl', 1000) # testing one of 1000 execution tm_wait = waits if waits>0 else self.tm_ctrl.get('tm_wait', 10) # sec start_t = datetime.datetime.now() pre_body = '' if not while_chngs else ed.get_text_all() for rp in range(times if times>0 else 0xffffffff): exec(cmds4eval) if till_endln and ed.get_carets()[0][1] == ed.get_line_count()-1: pass; LOG and log('break endln',) break #for rp if while_chngs: new_body = ed.get_text_all() if pre_body == new_body: pass; LOG and log('break no change',) break #for rp pre_body = new_body if (how_t=='wait' and (rp_ctrl-1) == rp % rp_ctrl and tm_wait < (datetime.datetime.now()-start_t).seconds): WD_BTN = 220 ans = app.dlg_custom( 'Playback macro', GAP*2+WD_BTN, GAP*7+4*25, '\n'.join([] +[C1.join(['type=label' ,POS_FMT(l=GAP, t=GAP*1+25*0+3, r=GAP+WD_BTN, b=0) ,'cap=Macro playback time is too long' ] # i=0 )] +[C1.join(['type=button' ,POS_FMT(l=GAP, t=GAP*2+25*1, r=GAP+WD_BTN, b=0) ,'cap=Wait &another {} sec'.format(tm_wait) ] # i=1 )] +[C1.join(['type=button' ,POS_FMT(l=GAP, t=GAP*3+25*2, r=GAP+WD_BTN, b=0) ,'cap=Continue &without control' ] # i=2 )] +[C1.join(['type=button' ,POS_FMT(l=GAP, t=GAP*6+25*3, r=GAP+WD_BTN, b=0) ,'cap=&Cancel playback [ESC]' ] # i=3 )] ), 1) # start focus pass; #LOG and log('ans={}',ans) ans =('break' if ans is None else 'break' if ans[0]==3 else 'wait' if ans[0]==1 else 'cont' if ans[0]==2 else 'break') if ans=='cont': how_t = 'work' if ans=='wait': start_t = datetime.datetime.now() if ans=='break': pass; LOG and log('break by user',) break #for rp #for rp self.last_mcr_id = mcr_id
def dlg_export(self): ''' Show dlg for export some macros. ''' if app.app_api_version()<FROM_API_VERSION: return app.msg_status('Need update CudaText') if 0==len(self.macros): return app.msg_status('No macros for export') exp_file= app.dlg_file(False, '', '', 'Cuda macros|*.cuda-macros') exp_file= '' if exp_file is None else exp_file exp_file= exp_file+('' if ''==exp_file or exp_file.endswith('.cuda-macros') else '.cuda-macros') (WD_LST ,HT_LST)= (500 ,500) lmcrs = len(self.macros) crt,sels= '0', ['0'] * lmcrs while True: pass; LOG and log('sels={}',sels) ans = app.dlg_custom('Export macros' ,GAP+WD_LST+GAP, GAP*5+HT_LST+25*2, '\n'.join([] +[C1.join(['type=label' ,POS_FMT(l=GAP, t=GAP+3, r=GAP+70, b=0) ,'cap=Export &to' ] # i=0 )] +[C1.join(['type=edit' ,POS_FMT(l=GAP+70, t=GAP, r=GAP+WD_LST-35,b=0) ,'val={}'.format(exp_file) ] # i=1 )] +[C1.join(['type=button' ,POS_FMT(l=GAP+HT_LST-35, t=GAP-2, r=GAP+WD_LST, b=0) ,'cap=&...' ] # i=2 )] +[C1.join(['type=checklistbox' ,POS_FMT(l=GAP, t=GAP*2+30, r=GAP+WD_LST, b=GAP+25+HT_LST) ,'items=' +'\t'.join([mcr['nm'] for mcr in self.macros]) ,'val=' + crt+';'+','.join(sels) ] # i=3 )] +[C1.join(['type=button' ,POS_FMT(l=GAP*1, t=GAP*3+25+HT_LST, r=GAP*1+80*1, b=0) ,'cap=Check &all' ] # i=4 )] +[C1.join(['type=button' ,POS_FMT(l=GAP*2+80, t=GAP*3+25+HT_LST, r=GAP*2+80*2, b=0) ,'cap=U&ncheck all' ] # i=5 )] +[C1.join(['type=button' ,POS_FMT(l= WD_LST-60*2, t=GAP*3+25+HT_LST, r= WD_LST-60*1, b=0) ,'cap=&Export' ] # i=6 )] +[C1.join(['type=button' ,POS_FMT(l=GAP+WD_LST-60*1, t=GAP*3+25+HT_LST, r=GAP+WD_LST-60*0, b=0) ,'cap=&Close' ] # i=7 )] ), 3) # start focus pass; LOG and log('ans={}',ans) if ans is None: break #while (ans_i ,vals) = ans ans_s = apx.icase(False,'' ,ans_i==2, 'file' ,ans_i==4, 'all' ,ans_i==5, 'no' ,ans_i==6, 'exp' ,ans_i==7, 'close' ) if ans_s=='close': break #while v_3 = vals.splitlines()[3] crt,sels= v_3.split(';') sels = sels.strip(',').split(',') pass; LOG and log('sels={}',sels) if False:pass elif ans_s=='file': new_exp_file= app.dlg_file(False, '', '', 'Cuda macros|*.cuda-macros') if new_exp_file is not None: exp_file = new_exp_file exp_file = exp_file+('' if ''==exp_file or exp_file.endswith('.cuda-macros') else '.cuda-macros') elif ans_s=='all': sels = ['1'] * lmcrs elif ans_s=='no': sels = ['0'] * lmcrs elif ans_s=='exp': if '1' not in sels: app.msg_box('Select some names', app.MB_OK) continue self.export_to_file(exp_file, [mcr for (ind, mcr) in enumerate(self.macros) if sels[ind]=='1']) return
def dlg_import(self): ''' Show dlg for import some macros. ''' if app.app_api_version()<FROM_API_VERSION: return app.msg_status('Need update CudaText') (imp_file ,mcrs) = self.dlg_import_choose_mcrs() if imp_file is None: return lmcrs = len(mcrs) GAP = 5 (WD_LST ,HT_LST)= (500 ,500) crt,sels= '0', ['1'] * lmcrs while True: ans = app.dlg_custom('Import macros' ,GAP+WD_LST+GAP, GAP*5+HT_LST+25*2, '\n'.join([] +[C1.join(['type=label' ,POS_FMT(l=GAP, t=GAP+3, r=GAP+85, b=0) ,'cap=Import &from' ] # i=0 )] +[C1.join(['type=edit' ,POS_FMT(l=GAP+85, t=GAP, r=GAP+WD_LST-35,b=0) ,'val={}'.format(imp_file) ] # i=1 )] +[C1.join(['type=button' ,POS_FMT(l=GAP+HT_LST-35, t=GAP-2, r=GAP+WD_LST, b=0) ,'cap=&...' ] # i=2 )] +[C1.join(['type=checklistbox' ,POS_FMT(l=GAP, t=GAP*2+30, r=GAP+WD_LST, b=GAP+25+HT_LST) ,'items=' +'\t'.join([mcr['nm'] for mcr in mcrs]) ,'val=' + crt+';'+','.join(sels) ] # i=3 )] +[C1.join(['type=button' ,POS_FMT(l=GAP*1, t=GAP*3+25+HT_LST, r=GAP*1+80*1, b=0) ,'cap=Check &all' ] # i=4 )] +[C1.join(['type=button' ,POS_FMT(l=GAP*2+80, t=GAP*3+25+HT_LST, r=GAP*2+80*2, b=0) ,'cap=U&ncheck all' ] # i=5 )] +[C1.join(['type=button' ,POS_FMT(l= WD_LST-60*2, t=GAP*3+25+HT_LST, r= WD_LST-60*1, b=0) ,'cap=&Import' ] # i=6 )] +[C1.join(['type=button' ,POS_FMT(l=GAP+WD_LST-60*1, t=GAP*3+25+HT_LST, r=GAP+WD_LST-60*0, b=0) ,'cap=&Close' ] # i=7 )] ), 3) # start focus pass; LOG and log('ans={}',ans) if ans is None: break #while (ans_i ,vals) = ans ans_s = apx.icase(False,'' ,ans_i==2, 'file' ,ans_i==4, 'all' ,ans_i==5, 'no' ,ans_i==6, 'imp' ,ans_i==7, 'close' ) if ans_s=='close': break #while v_3 = vals.splitlines()[3] crt,sels= v_3.split(';') sels = sels.strip(',').split(',') pass; LOG and log('sels={}',sels) if False:pass elif ans_s=='file': (new_imp_file ,new_mcrs) = self.dlg_import_choose_mcrs() if new_imp_file is None: continue #while imp_file = new_imp_file mcrs = new_mcrs lmcrs = len(mcrs) crt,sels = '0', ['1'] * lmcrs elif ans_s=='all': sels = ['1'] * lmcrs elif ans_s=='no': sels = ['0'] * lmcrs elif ans_s=='imp': if '1' not in sels: app.msg_box('Select some names', app.MB_OK) continue (good_nms ,fail_nms) = self.import_from_list([mcr for (ind, mcr) in enumerate(mcrs) if sels[ind]=='1']) l,lt = '\n', '\n ' app.msg_box( 'Import macros:' +lt+lt.join(good_nms) +l+'' +l+'Skip duplicates:' +lt+lt.join(fail_nms) ,app.MB_OK)
def dlg_config(self): ''' Show dlg for change macros list. ''' if app.app_api_version()<FROM_API_VERSION: return app.msg_status('Need update CudaText') keys_json = app.app_path(app.APP_DIR_SETTINGS)+os.sep+'keys.json' keys = apx._json_loads(open(keys_json).read()) if os.path.exists(keys_json) else {} GAP = 5 ids = [mcr['id'] for mcr in self.macros] mcr_ind = ids.index(self.last_mcr_id) if self.last_mcr_id in ids else -1 pass; LOG and log('self.last_mcr_id, mcr_ind={}',(self.last_mcr_id,mcr_ind)) times = 1 waits = 5 chngs = '0' endln = '0' while True: (WD_LST ,HT_LST)= (self.dlg_prs.get('w_list', 300) ,self.dlg_prs.get('h_list', 500)) (WD_ACTS ,HT_ACTS)=(self.dlg_prs.get('w_acts', 300) ,self.dlg_prs.get('h_acts', 500)) (WD_BTN ,HT_BTN)= (self.dlg_prs.get('w_btn', 150), 24) l_btn = GAP+WD_LST+GAP vw_acts = (WD_ACTS>0) WD_ACTS = max(0, WD_ACTS) rec_on = ed.get_prop(app.PROP_MACRO_REC) lmcrs = len(self.macros) pass; LOG and log('mcr_ind,vw_acts,rec_on={}',(mcr_ind,vw_acts,rec_on)) nmkys = [] for mcr in self.macros: mcr_cid = 'cuda_macros,run,{}'.format(mcr['id']) mcr_keys= keys.get(mcr_cid, {}) kys = '/'.join([' * '.join(mcr_keys.get('s1', [])) ,' * '.join(mcr_keys.get('s2', [])) ]).strip('/') nmkys += [mcr['nm'] + (' ['+kys+']' if kys else '')] mcr_acts= '' if vw_acts and mcr_ind in range(lmcrs): mcr = self.macros[mcr_ind] mcr_acts= '\t'.join(['# '+nmkys[mcr_ind]] + mcr['evl']) ans = app.dlg_custom('Macros' ,GAP+WD_LST+GAP+WD_BTN+GAP+WD_ACTS+GAP,GAP+HT_LST+GAP, '\n'.join([] +[C1.join(['type=listbox' ,POS_FMT(l=GAP, t=GAP, r=GAP+WD_LST, b=GAP+HT_LST) ,'items=' +'\t'.join(nmkys) ,'val=' +str(mcr_ind) # start sel ,'en=' +str(0 if rec_on else 1) # enabled ] # i=0 )] +([C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*1+HT_BTN*0, r=l_btn+WD_BTN, b=0) ,'cap=&View actions...' ,'props=' +str(0 if rec_on or 0==lmcrs else 1) # default ,'en=' +str(0 if rec_on or 0==lmcrs else 1) # enabled ] # i=1 )] if vw_acts else []) +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*2+HT_BTN*1, r=l_btn+WD_BTN, b=0) ,'cap=Hot&keys...' ,'en=' +str(0 if rec_on or 0==lmcrs else 1) # enabled ] # i=2 if vw_acts else i=1 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*3+HT_BTN*2, r=l_btn+WD_BTN, b=0) ,'cap=Re&name...' ,'en=' +str(0 if rec_on or 0==lmcrs else 1) # enabled ] # i=3 if vw_acts else i=2 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*4+HT_BTN*3, r=l_btn+WD_BTN, b=0) ,'cap=&Delete...' ,'en=' +str(0 if rec_on or 0==lmcrs else 1) # enabled ] # i=4 if vw_acts else i=3 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*6+HT_BTN*5, r=l_btn+WD_BTN, b=0) ,'cap=&Run!' ,'props=' +str(1 if not vw_acts and not rec_on else 0) # default ,'en=' +str(0 if rec_on or 0==lmcrs else 1) # enabled ] # i=5 if vw_acts else i=4 )] +[C1.join(['type=label' ,POS_FMT(l=l_btn, t=GAP*7+HT_BTN*6+3, r=l_btn+int(WD_BTN/3),b=0) ,'cap=&Times' ] # i=6 if vw_acts else i=5 )] +[C1.join(['type=spinedit' ,POS_FMT(l=l_btn+int(WD_BTN/3)+GAP, t=GAP*7+HT_BTN*6, r=l_btn+WD_BTN, b=0) ,'val=' +str(times) ,'props=0,{},1'.format(self.dlg_prs.get('times', 1000)) ,'en=' +str(0 if rec_on else 1) # enabled ] # i=7 if vw_acts else i=6 )] +[C1.join(['type=label' ,POS_FMT(l=l_btn, t=GAP*8+HT_BTN*7+3, r=l_btn+int(WD_BTN/3),b=0) ,'cap=&Wait' ] # i=8 if vw_acts else i=7 )] +[C1.join(['type=spinedit' ,POS_FMT(l=l_btn+int(WD_BTN/3)+GAP, t=GAP*8+HT_BTN*7, r=l_btn+WD_BTN-40, b=0) ,'val=' +str(waits) ,'props=1,3600,1' ,'en=' +str(0 if rec_on else 1) # enabled ] # i=9 if vw_acts else i=8 )] +[C1.join(['type=label' ,POS_FMT(l=l_btn+WD_BTN-40+GAP, t=GAP*8+HT_BTN*7+3, r=l_btn+WD_BTN,b=0) ,'cap=sec' ] # i=10 if vw_acts else i=9 )] +[C1.join(['type=check' ,POS_FMT(l=l_btn, t=GAP*9+HT_BTN*8, r=l_btn+WD_BTN,b=0) ,'cap=While text c&hanges' ,'val=' +chngs ] # i=11 if vw_acts else i=10 )] +[C1.join(['type=check' ,POS_FMT(l=l_btn, t=GAP*10+HT_BTN*9, r=l_btn+WD_BTN,b=0) ,'cap=Until c&aret on last line' ,'val=' +endln ] # i=12 if vw_acts else i=11 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*12+HT_BTN*11, r=l_btn+WD_BTN, b=0) ,'cap={}'.format('&Stop record' if rec_on else '&Start record') ,'props=' +str(1 if rec_on or 0==lmcrs else 0) # default ] # i=13 if vw_acts else i=12 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP*13+HT_BTN*12, r=l_btn+WD_BTN, b=0) ,'cap=Canc&el record' ,'en=' +str(1 if rec_on else 0) # enabled ] # i=14 if vw_acts else i=13 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t= HT_LST-HT_BTN*2, r=l_btn+WD_BTN, b=0) ,'cap=C&ustom...' ,'en=' +str(0 if rec_on else 1) # enabled ] # i=15 if vw_acts else i=14 )] +[C1.join(['type=button' ,POS_FMT(l=l_btn, t=GAP+HT_LST-HT_BTN*1, r=l_btn+WD_BTN, b=0) ,'cap=&Close' ] # i=16 if vw_acts else i=15 )] +([C1.join(['type=memo' ,POS_FMT(l=GAP+WD_LST+GAP+WD_BTN+GAP, t=GAP, r=GAP+WD_LST+GAP+WD_BTN+GAP+WD_ACTS, b=GAP+HT_ACTS) ,'val='+mcr_acts ,'props=1,1,1' # ro,mono,border ] # i=17 )] if vw_acts else []) ), apx.icase( vw_acts and not rec_on, 0 # View ,not vw_acts and not rec_on, 0 # View , vw_acts and rec_on, 11 ,not vw_acts and rec_on, 10 )) # start focus pass; LOG and log('ans={}',ans) if ans is None: break #while (ans_i ,vals) = ans ans_s = apx.icase(False,'' ,vw_acts and ans_i==1, 'view' ,vw_acts and ans_i==2, 'hotkeys' ,not vw_acts and ans_i==1, 'hotkeys' ,vw_acts and ans_i==3, 'rename' ,not vw_acts and ans_i==2, 'rename' ,vw_acts and ans_i==4, 'delete' ,not vw_acts and ans_i==3, 'delete' ,vw_acts and ans_i==5, 'run' ,not vw_acts and ans_i==4, 'run' ,vw_acts and ans_i==12,'rec' ,not vw_acts and ans_i==7, 'rec' ,vw_acts and ans_i==14,'cancel' ,not vw_acts and ans_i==13,'cancel' ,vw_acts and ans_i==15,'custom' ,not vw_acts and ans_i==14,'custom' ,vw_acts and ans_i==16,'close' ,not vw_acts and ans_i==15,'close' ,'?') mcr_ind = int(vals.splitlines()[0]) times = int(vals.splitlines()[ 7 if vw_acts else 6]) waits = int(vals.splitlines()[ 9 if vw_acts else 8]) chngs = vals.splitlines()[11 if vw_acts else 10] endln = vals.splitlines()[12 if vw_acts else 11] pass; LOG and log('mcr_ind,times,waits,chngs,endln={}',(mcr_ind,times,waits,chngs,endln)) if 0!=lmcrs and mcr_ind in range(lmcrs): mcr = self.macros[mcr_ind] self.last_mcr_id = mcr['id'] if ans_s=='close': break #while if ans_s=='custom': #Custom custs = app.dlg_input_ex(5, 'Custom dialog Macros' , 'Height of macro list (min 450)' , str(self.dlg_prs.get('h_list', 400)) , 'Width of macro list (min 200)' , str(self.dlg_prs.get('w_list', 500)) , 'Width of action list (min 200, <=0-hide)', str(self.dlg_prs.get('w_acts', 500)) , 'Width of buttons (min 150)' , str(self.dlg_prs.get('w_btn', 150)) , 'Max run times (min 100)' , str(self.dlg_prs.get('times', 1000)) ) if custs is not None: self.dlg_prs['h_list'] = max(450, int(custs[0])); self.dlg_prs['h_acts'] = self.dlg_prs['h_list'] self.dlg_prs['w_list'] = max(200, int(custs[1])) self.dlg_prs['w_acts'] = max(200, int(custs[2])) if int(custs[2])>0 else int(custs[2]) self.dlg_prs['w_btn'] = max(150, int(custs[3])) self.dlg_prs['times'] = max(100, int(custs[4])) open(MACROS_JSON, 'w').write(json.dumps({'ver':JSON_FORMAT_VER, 'list':self.macros, 'dlg_prs':self.dlg_prs}, indent=4)) continue #while if mcr_ind not in range(lmcrs): app.msg_box('Select macro', app.MB_OK) continue #while what = '' changed = False if False:pass elif ans_s=='view': #View continue #while elif ans_s=='rename': #Rename mcr_nm = app.dlg_input('New name for: {}'.format(nmkys[mcr_ind]) ,mcr['nm']) if mcr_nm is None or mcr_nm==mcr['nm']: continue #while while mcr_nm in [mcr['nm'] for mcr in self.macros]: app.msg_box('Select other name.\nMacro names now are:\n\n'+'\n'.join(nmkys), app.MB_OK) mcr_nm = app.dlg_input('New name for: {}'.format(nmkys[mcr_ind]) ,mcr_nm) if mcr_nm is None or mcr_nm==mcr['nm']: break #while mcr_nm if mcr_nm is None or mcr_nm==mcr['nm']: continue #while what = 'rename' mcr['nm'] = mcr_nm changed = True elif ans_s=='delete': #Del if app.msg_box( 'Delete macro\n {}'.format(nmkys[mcr_ind]) , app.MB_YESNO)!=app.ID_YES: continue #while what = 'delete:'+str(mcr['id']) del self.macros[mcr_ind] mcr_ind = min(mcr_ind, len(self.macros)-1) changed = True elif ans_s=='hotkeys': #Hotkeys app.dlg_hotkeys('cuda_macros,run,'+str(mcr['id'])) keys = apx._json_loads(open(keys_json).read()) if os.path.exists(keys_json) else {} changed = True elif ans_s=='run': #Run if (times==0 and waits==0 and chngs=='0' and endln=='0'): app.msg_box('Select stop condition', app.MB_OK) continue self.run(mcr['id'], max(0, times), max(0, waits), chngs=='1', endln=='1') return elif ans_s=='rec' and not rec_on: #Start record return ed.cmd(cmds.cmd_MacroStart) elif ans_s=='rec' and rec_on: #Stop record self.need_dlg = True return ed.cmd(cmds.cmd_MacroStop) # Return for clear rec-mode in StatusBar, will recall from on_macro elif ans_s=='cancel' and rec_on: #Cancel record return ed.cmd(cmds.cmd_MacroCancel) # Return for clear rec-mode in StatusBar if changed: self._do_acts(what)
def do_options_dlg(): id_color_err=0 id_color_warn=2 id_color_info=4 id_bk_err=1 id_bk_warn=3 id_bk_info=5 id_ev_open=6 id_ev_save=7 id_ev_ch=8 id_ok=9 while True: c1 = chr(1) text = '\n'.join([] +[c1.join(['type=button', 'pos=6,6,180,0', 'cap=Color of &errors'])] +[c1.join(['type=check', 'pos=186,6,400,0', 'cap=Colored e&rror bookmarks', 'val='+str(int(opt.color_error_use))])] +[c1.join(['type=button', 'pos=6,36,180,0', 'cap=Color of &warns'])] +[c1.join(['type=check', 'pos=186,36,400,0', 'cap=Colored warn &bookmarks', 'val='+str(int(opt.color_warn_use))])] +[c1.join(['type=button', 'pos=6,66,180,0', 'cap=Color of &infos'])] +[c1.join(['type=check', 'pos=186,66,400,0', 'cap=Colored info boo&kmarks', 'val='+str(int(opt.color_info_use))])] +[c1.join(['type=check', 'pos=6,100,400,0', 'cap=Lint on &opening file', 'val='+str(int(opt.use_on_open))])] +[c1.join(['type=check', 'pos=6,126,400,0', 'cap=Lint on &saving file', 'val='+str(int(opt.use_on_save))])] +[c1.join(['type=check', 'pos=6,152,400,0', 'cap=Lint &after text changed, and pause', 'val='+str(int(opt.use_on_change))])] +[c1.join(['type=button', 'pos=206,182,300,0', 'cap=OK', 'props=1'])] +[c1.join(['type=button', 'pos=306,182,400,0', 'cap=Cancel'])] ) res = app.dlg_custom('CudaLint options', 406, 215, text) if res is None: return btn, text = res if btn==id_color_err: n=app.dlg_color(opt.color_error) if n is not None: opt.color_error=n continue if btn==id_color_warn: n=app.dlg_color(opt.color_warn) if n is not None: opt.color_warn=n continue if btn==id_color_info: n=app.dlg_color(opt.color_info) if n is not None: opt.color_info=n continue break if btn!=id_ok: return text = text.splitlines() opt.color_error_use = text[id_bk_err]=='1' opt.color_warn_use = text[id_bk_warn]=='1' opt.color_info_use = text[id_bk_info]=='1' opt.use_on_open = text[id_ev_open]=='1' opt.use_on_save = text[id_ev_save]=='1' opt.use_on_change = text[id_ev_ch]=='1' opt.do_options_save() #app.msg_box('CudaLint options changed, need to restart app', app.MB_OK+app.MB_ICONINFO)
def run(self, mcr_id, times=1, waits=0, while_chngs=False, till_endln=False): ''' Main (and single) way to run any macro ''' pass LOG and log('mcr_id, times, waits, while_chngs, till_endln={}', (mcr_id, times, waits, while_chngs, till_endln)) mcr = self.mcr4id.get(str(mcr_id)) if mcr is None: pass LOG and log('no id', ) return app.msg_status('No macros: {}'.format(mcr_id)) cmds4eval = ';'.join(mcr['evl']) pass LOG and log('nm, cmds4eval={}', (mcr['nm'], cmds4eval)) how_t = 'wait' rp_ctrl = self.tm_ctrl.get('rp_ctrl', 1000) # testing one of 1000 execution tm_wait = waits if waits > 0 else self.tm_ctrl.get('tm_wait', 10) # sec start_t = datetime.datetime.now() pre_body = '' if not while_chngs else ed.get_text_all() for rp in range(times if times > 0 else 0xffffffff): exec(cmds4eval) if till_endln and ed.get_carets()[0][1] == ed.get_line_count() - 1: pass LOG and log('break endln', ) break #for rp if while_chngs: new_body = ed.get_text_all() if pre_body == new_body: pass LOG and log('break no change', ) break #for rp pre_body = new_body if (how_t == 'wait' and (rp_ctrl - 1) == rp % rp_ctrl and tm_wait < (datetime.datetime.now() - start_t).seconds): WD_BTN = 220 ans = app.dlg_custom( 'Playback macro', GAP * 2 + WD_BTN, GAP * 7 + 4 * 25, '\n'.join([] + [ C1.join([ 'type=label', POS_FMT(l=GAP, t=GAP * 1 + 25 * 0 + 3, r=GAP + WD_BTN, b=0), 'cap=Macro playback time is too long' ] # i=0 ) ] + [ C1.join([ 'type=button', POS_FMT( l=GAP, t=GAP * 2 + 25 * 1, r=GAP + WD_BTN, b=0 ), 'cap=Wait &another {} sec'.format(tm_wait) ] # i=1 ) ] + [ C1.join([ 'type=button', POS_FMT( l=GAP, t=GAP * 3 + 25 * 2, r=GAP + WD_BTN, b=0), 'cap=Continue &without control' ] # i=2 ) ] + [ C1.join([ 'type=button', POS_FMT( l=GAP, t=GAP * 6 + 25 * 3, r=GAP + WD_BTN, b=0), 'cap=&Cancel playback [ESC]' ] # i=3 ) ]), 1) # start focus pass #LOG and log('ans={}',ans) ans = ('break' if ans is None else 'break' if ans[0] == 3 else 'wait' if ans[0] == 1 else 'cont' if ans[0] == 2 else 'break') if ans == 'cont': how_t = 'work' if ans == 'wait': start_t = datetime.datetime.now() if ans == 'break': pass LOG and log('break by user', ) break #for rp #for rp self.last_mcr_id = mcr_id
def dlg_config(self): ''' Show dlg for change macros list. ''' if app.app_api_version() < FROM_API_VERSION: return app.msg_status('Need update CudaText') keys_json = app.app_path(app.APP_DIR_SETTINGS) + os.sep + 'keys.json' keys = apx._json_loads( open(keys_json).read()) if os.path.exists(keys_json) else {} GAP = 5 ids = [mcr['id'] for mcr in self.macros] mcr_ind = ids.index( self.last_mcr_id) if self.last_mcr_id in ids else -1 pass LOG and log('self.last_mcr_id, mcr_ind={}', (self.last_mcr_id, mcr_ind)) times = 1 waits = 5 chngs = '0' endln = '0' while True: (WD_LST, HT_LST) = (self.dlg_prs.get('w_list', 300), self.dlg_prs.get('h_list', 500)) (WD_ACTS, HT_ACTS) = (self.dlg_prs.get('w_acts', 300), self.dlg_prs.get('h_acts', 500)) (WD_BTN, HT_BTN) = (self.dlg_prs.get('w_btn', 150), 24) l_btn = GAP + WD_LST + GAP vw_acts = (WD_ACTS > 0) WD_ACTS = max(0, WD_ACTS) rec_on = ed.get_prop(app.PROP_MACRO_REC) lmcrs = len(self.macros) pass LOG and log('mcr_ind,vw_acts,rec_on={}', (mcr_ind, vw_acts, rec_on)) nmkys = [] for mcr in self.macros: mcr_cid = 'cuda_macros,run,{}'.format(mcr['id']) mcr_keys = keys.get(mcr_cid, {}) kys = '/'.join([ ' * '.join(mcr_keys.get('s1', [])), ' * '.join(mcr_keys.get('s2', [])) ]).strip('/') nmkys += [mcr['nm'] + (' [' + kys + ']' if kys else '')] mcr_acts = '' if vw_acts and mcr_ind in range(lmcrs): mcr = self.macros[mcr_ind] mcr_acts = '\t'.join(['# ' + nmkys[mcr_ind]] + mcr['evl']) ans = app.dlg_custom( 'Macros', GAP + WD_LST + GAP + WD_BTN + GAP + WD_ACTS + GAP, GAP + HT_LST + GAP, '\n'.join([] + [ C1.join([ 'type=listbox', POS_FMT(l=GAP, t=GAP, r=GAP + WD_LST, b=GAP + HT_LST), 'items=' + '\t'.join(nmkys), 'val=' + str(mcr_ind) # start sel , 'en=' + str(0 if rec_on else 1) # enabled ] # i=0 ) ] + ([ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 1 + HT_BTN * 0, r=l_btn + WD_BTN, b=0), 'cap=&View actions...', 'props=' + str(0 if rec_on or 0 == lmcrs else 1) # default , 'en=' + str(0 if rec_on or 0 == lmcrs else 1) # enabled ] # i=1 ) ] if vw_acts else []) + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 2 + HT_BTN * 1, r=l_btn + WD_BTN, b=0), 'cap=Hot&keys...', 'en=' + str(0 if rec_on or 0 == lmcrs else 1) # enabled ] # i=2 if vw_acts else i=1 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 3 + HT_BTN * 2, r=l_btn + WD_BTN, b=0), 'cap=Re&name...', 'en=' + str(0 if rec_on or 0 == lmcrs else 1) # enabled ] # i=3 if vw_acts else i=2 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 4 + HT_BTN * 3, r=l_btn + WD_BTN, b=0), 'cap=&Delete...', 'en=' + str(0 if rec_on or 0 == lmcrs else 1) # enabled ] # i=4 if vw_acts else i=3 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 6 + HT_BTN * 5, r=l_btn + WD_BTN, b=0), 'cap=&Run!', 'props=' + str(1 if not vw_acts and not rec_on else 0) # default , 'en=' + str(0 if rec_on or 0 == lmcrs else 1) # enabled ] # i=5 if vw_acts else i=4 ) ] + [ C1.join([ 'type=label', POS_FMT(l=l_btn, t=GAP * 7 + HT_BTN * 6 + 3, r=l_btn + int(WD_BTN / 3), b=0), 'cap=&Times' ] # i=6 if vw_acts else i=5 ) ] + [ C1.join([ 'type=spinedit', POS_FMT(l=l_btn + int(WD_BTN / 3) + GAP, t=GAP * 7 + HT_BTN * 6, r=l_btn + WD_BTN, b=0), 'val=' + str(times), 'props=0,{},1'.format(self.dlg_prs.get('times', 1000)), 'en=' + str(0 if rec_on else 1) # enabled ] # i=7 if vw_acts else i=6 ) ] + [ C1.join([ 'type=label', POS_FMT(l=l_btn, t=GAP * 8 + HT_BTN * 7 + 3, r=l_btn + int(WD_BTN / 3), b=0), 'cap=&Wait' ] # i=8 if vw_acts else i=7 ) ] + [ C1.join([ 'type=spinedit', POS_FMT(l=l_btn + int(WD_BTN / 3) + GAP, t=GAP * 8 + HT_BTN * 7, r=l_btn + WD_BTN - 40, b=0), 'val=' + str(waits), 'props=1,3600,1', 'en=' + str(0 if rec_on else 1) # enabled ] # i=9 if vw_acts else i=8 ) ] + [ C1.join([ 'type=label', POS_FMT(l=l_btn + WD_BTN - 40 + GAP, t=GAP * 8 + HT_BTN * 7 + 3, r=l_btn + WD_BTN, b=0), 'cap=sec' ] # i=10 if vw_acts else i=9 ) ] + [ C1.join([ 'type=check', POS_FMT(l=l_btn, t=GAP * 9 + HT_BTN * 8, r=l_btn + WD_BTN, b=0), 'cap=While text c&hanges', 'val=' + chngs ] # i=11 if vw_acts else i=10 ) ] + [ C1.join([ 'type=check', POS_FMT(l=l_btn, t=GAP * 10 + HT_BTN * 9, r=l_btn + WD_BTN, b=0), 'cap=Until c&aret on last line', 'val=' + endln ] # i=12 if vw_acts else i=11 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 12 + HT_BTN * 11, r=l_btn + WD_BTN, b=0), 'cap={}'.format( '&Stop record' if rec_on else '&Start record'), 'props=' + str(1 if rec_on or 0 == lmcrs else 0) # default ] # i=13 if vw_acts else i=12 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP * 13 + HT_BTN * 12, r=l_btn + WD_BTN, b=0), 'cap=Canc&el record', 'en=' + str(1 if rec_on else 0) # enabled ] # i=14 if vw_acts else i=13 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=HT_LST - HT_BTN * 2, r=l_btn + WD_BTN, b=0), 'cap=C&ustom...', 'en=' + str(0 if rec_on else 1) # enabled ] # i=15 if vw_acts else i=14 ) ] + [ C1.join([ 'type=button', POS_FMT(l=l_btn, t=GAP + HT_LST - HT_BTN * 1, r=l_btn + WD_BTN, b=0), 'cap=&Close' ] # i=16 if vw_acts else i=15 ) ] + ([ C1.join([ 'type=memo', POS_FMT(l=GAP + WD_LST + GAP + WD_BTN + GAP, t=GAP, r=GAP + WD_LST + GAP + WD_BTN + GAP + WD_ACTS, b=GAP + HT_ACTS), 'val=' + mcr_acts, 'props=1,1,1' # ro,mono,border ] # i=17 ) ] if vw_acts else [])), apx.icase( vw_acts and not rec_on, 0 # View , not vw_acts and not rec_on, 0 # View , vw_acts and rec_on, 11, not vw_acts and rec_on, 10)) # start focus pass LOG and log('ans={}', ans) if ans is None: break #while (ans_i, vals) = ans ans_s = apx.icase( False, '', vw_acts and ans_i == 1, 'view', vw_acts and ans_i == 2, 'hotkeys', not vw_acts and ans_i == 1, 'hotkeys', vw_acts and ans_i == 3, 'rename', not vw_acts and ans_i == 2, 'rename', vw_acts and ans_i == 4, 'delete', not vw_acts and ans_i == 3, 'delete', vw_acts and ans_i == 5, 'run', not vw_acts and ans_i == 4, 'run', vw_acts and ans_i == 12, 'rec', not vw_acts and ans_i == 7, 'rec', vw_acts and ans_i == 14, 'cancel', not vw_acts and ans_i == 13, 'cancel', vw_acts and ans_i == 15, 'custom', not vw_acts and ans_i == 14, 'custom', vw_acts and ans_i == 16, 'close', not vw_acts and ans_i == 15, 'close', '?') mcr_ind = int(vals.splitlines()[0]) times = int(vals.splitlines()[7 if vw_acts else 6]) waits = int(vals.splitlines()[9 if vw_acts else 8]) chngs = vals.splitlines()[11 if vw_acts else 10] endln = vals.splitlines()[12 if vw_acts else 11] pass LOG and log('mcr_ind,times,waits,chngs,endln={}', (mcr_ind, times, waits, chngs, endln)) if 0 != lmcrs and mcr_ind in range(lmcrs): mcr = self.macros[mcr_ind] self.last_mcr_id = mcr['id'] if ans_s == 'close': break #while if ans_s == 'custom': #Custom custs = app.dlg_input_ex( 5, 'Custom dialog Macros', 'Height of macro list (min 450)', str(self.dlg_prs.get('h_list', 400)), 'Width of macro list (min 200)', str(self.dlg_prs.get('w_list', 500)), 'Width of action list (min 200, <=0-hide)', str(self.dlg_prs.get('w_acts', 500)), 'Width of buttons (min 150)', str(self.dlg_prs.get('w_btn', 150)), 'Max run times (min 100)', str(self.dlg_prs.get('times', 1000))) if custs is not None: self.dlg_prs['h_list'] = max(450, int(custs[0])) self.dlg_prs['h_acts'] = self.dlg_prs['h_list'] self.dlg_prs['w_list'] = max(200, int(custs[1])) self.dlg_prs['w_acts'] = max(200, int( custs[2])) if int(custs[2]) > 0 else int(custs[2]) self.dlg_prs['w_btn'] = max(150, int(custs[3])) self.dlg_prs['times'] = max(100, int(custs[4])) open(MACROS_JSON, 'w').write( json.dumps( { 'ver': JSON_FORMAT_VER, 'list': self.macros, 'dlg_prs': self.dlg_prs }, indent=4)) continue #while if mcr_ind not in range(lmcrs): app.msg_box('Select macro', app.MB_OK) continue #while what = '' changed = False if False: pass elif ans_s == 'view': #View continue #while elif ans_s == 'rename': #Rename mcr_nm = app.dlg_input( 'New name for: {}'.format(nmkys[mcr_ind]), mcr['nm']) if mcr_nm is None or mcr_nm == mcr['nm']: continue #while while mcr_nm in [mcr['nm'] for mcr in self.macros]: app.msg_box( 'Select other name.\nMacro names now are:\n\n' + '\n'.join(nmkys), app.MB_OK) mcr_nm = app.dlg_input( 'New name for: {}'.format(nmkys[mcr_ind]), mcr_nm) if mcr_nm is None or mcr_nm == mcr['nm']: break #while mcr_nm if mcr_nm is None or mcr_nm == mcr['nm']: continue #while what = 'rename' mcr['nm'] = mcr_nm changed = True elif ans_s == 'delete': #Del if app.msg_box('Delete macro\n {}'.format(nmkys[mcr_ind]), app.MB_YESNO) != app.ID_YES: continue #while what = 'delete:' + str(mcr['id']) del self.macros[mcr_ind] mcr_ind = min(mcr_ind, len(self.macros) - 1) changed = True elif ans_s == 'hotkeys': #Hotkeys app.dlg_hotkeys('cuda_macros,run,' + str(mcr['id'])) keys = apx._json_loads(open( keys_json).read()) if os.path.exists(keys_json) else {} changed = True elif ans_s == 'run': #Run if (times == 0 and waits == 0 and chngs == '0' and endln == '0'): app.msg_box('Select stop condition', app.MB_OK) continue self.run(mcr['id'], max(0, times), max(0, waits), chngs == '1', endln == '1') return elif ans_s == 'rec' and not rec_on: #Start record return ed.cmd(cmds.cmd_MacroStart) elif ans_s == 'rec' and rec_on: #Stop record self.need_dlg = True return ed.cmd( cmds.cmd_MacroStop ) # Return for clear rec-mode in StatusBar, will recall from on_macro elif ans_s == 'cancel' and rec_on: #Cancel record return ed.cmd(cmds.cmd_MacroCancel ) # Return for clear rec-mode in StatusBar if changed: self._do_acts(what)
def dlg_import(self): ''' Show dlg for import some macros. ''' if app.app_api_version() < FROM_API_VERSION: return app.msg_status('Need update CudaText') (imp_file, mcrs) = self.dlg_import_choose_mcrs() if imp_file is None: return lmcrs = len(mcrs) GAP = 5 (WD_LST, HT_LST) = (500, 500) crt, sels = '0', ['1'] * lmcrs while True: ans = app.dlg_custom( 'Import macros', GAP + WD_LST + GAP, GAP * 5 + HT_LST + 25 * 2, '\n'.join([] + [ C1.join([ 'type=label', POS_FMT(l=GAP, t=GAP + 3, r=GAP + 85, b=0), 'cap=Import &from' ] # i=0 ) ] + [ C1.join([ 'type=edit', POS_FMT(l=GAP + 85, t=GAP, r=GAP + WD_LST - 35, b=0), 'val={}'.format(imp_file) ] # i=1 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP + HT_LST - 35, t=GAP - 2, r=GAP + WD_LST, b=0), 'cap=&...' ] # i=2 ) ] + [ C1.join([ 'type=checklistbox', POS_FMT(l=GAP, t=GAP * 2 + 30, r=GAP + WD_LST, b=GAP + 25 + HT_LST), 'items=' + '\t'.join([mcr['nm'] for mcr in mcrs]), 'val=' + crt + ';' + ','.join(sels) ] # i=3 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP * 1, t=GAP * 3 + 25 + HT_LST, r=GAP * 1 + 80 * 1, b=0), 'cap=Check &all' ] # i=4 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP * 2 + 80, t=GAP * 3 + 25 + HT_LST, r=GAP * 2 + 80 * 2, b=0), 'cap=U&ncheck all' ] # i=5 ) ] + [ C1.join([ 'type=button', POS_FMT(l=WD_LST - 60 * 2, t=GAP * 3 + 25 + HT_LST, r=WD_LST - 60 * 1, b=0), 'cap=&Import' ] # i=6 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP + WD_LST - 60 * 1, t=GAP * 3 + 25 + HT_LST, r=GAP + WD_LST - 60 * 0, b=0), 'cap=&Close' ] # i=7 ) ]), 3) # start focus pass LOG and log('ans={}', ans) if ans is None: break #while (ans_i, vals) = ans ans_s = apx.icase(False, '', ans_i == 2, 'file', ans_i == 4, 'all', ans_i == 5, 'no', ans_i == 6, 'imp', ans_i == 7, 'close') if ans_s == 'close': break #while v_3 = vals.splitlines()[3] crt, sels = v_3.split(';') sels = sels.strip(',').split(',') pass LOG and log('sels={}', sels) if False: pass elif ans_s == 'file': (new_imp_file, new_mcrs) = self.dlg_import_choose_mcrs() if new_imp_file is None: continue #while imp_file = new_imp_file mcrs = new_mcrs lmcrs = len(mcrs) crt, sels = '0', ['1'] * lmcrs elif ans_s == 'all': sels = ['1'] * lmcrs elif ans_s == 'no': sels = ['0'] * lmcrs elif ans_s == 'imp': if '1' not in sels: app.msg_box('Select some names', app.MB_OK) continue (good_nms, fail_nms) = self.import_from_list([ mcr for (ind, mcr) in enumerate(mcrs) if sels[ind] == '1' ]) l, lt = '\n', '\n ' app.msg_box( 'Import macros:' + lt + lt.join(good_nms) + l + '' + l + 'Skip duplicates:' + lt + lt.join(fail_nms), app.MB_OK)
def dlg_export(self): ''' Show dlg for export some macros. ''' if app.app_api_version() < FROM_API_VERSION: return app.msg_status('Need update CudaText') if 0 == len(self.macros): return app.msg_status('No macros for export') exp_file = app.dlg_file(False, '', '', 'Cuda macros|*.cuda-macros') exp_file = '' if exp_file is None else exp_file exp_file = exp_file + ('' if '' == exp_file or exp_file.endswith('.cuda-macros') else '.cuda-macros') (WD_LST, HT_LST) = (500, 500) lmcrs = len(self.macros) crt, sels = '0', ['0'] * lmcrs while True: pass LOG and log('sels={}', sels) ans = app.dlg_custom( 'Export macros', GAP + WD_LST + GAP, GAP * 5 + HT_LST + 25 * 2, '\n'.join([] + [ C1.join([ 'type=label', POS_FMT(l=GAP, t=GAP + 3, r=GAP + 70, b=0), 'cap=Export &to' ] # i=0 ) ] + [ C1.join([ 'type=edit', POS_FMT(l=GAP + 70, t=GAP, r=GAP + WD_LST - 35, b=0), 'val={}'.format(exp_file) ] # i=1 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP + HT_LST - 35, t=GAP - 2, r=GAP + WD_LST, b=0), 'cap=&...' ] # i=2 ) ] + [ C1.join([ 'type=checklistbox', POS_FMT(l=GAP, t=GAP * 2 + 30, r=GAP + WD_LST, b=GAP + 25 + HT_LST), 'items=' + '\t'.join([mcr['nm'] for mcr in self.macros]), 'val=' + crt + ';' + ','.join(sels) ] # i=3 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP * 1, t=GAP * 3 + 25 + HT_LST, r=GAP * 1 + 80 * 1, b=0), 'cap=Check &all' ] # i=4 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP * 2 + 80, t=GAP * 3 + 25 + HT_LST, r=GAP * 2 + 80 * 2, b=0), 'cap=U&ncheck all' ] # i=5 ) ] + [ C1.join([ 'type=button', POS_FMT(l=WD_LST - 60 * 2, t=GAP * 3 + 25 + HT_LST, r=WD_LST - 60 * 1, b=0), 'cap=&Export' ] # i=6 ) ] + [ C1.join([ 'type=button', POS_FMT(l=GAP + WD_LST - 60 * 1, t=GAP * 3 + 25 + HT_LST, r=GAP + WD_LST - 60 * 0, b=0), 'cap=&Close' ] # i=7 ) ]), 3) # start focus pass LOG and log('ans={}', ans) if ans is None: break #while (ans_i, vals) = ans ans_s = apx.icase(False, '', ans_i == 2, 'file', ans_i == 4, 'all', ans_i == 5, 'no', ans_i == 6, 'exp', ans_i == 7, 'close') if ans_s == 'close': break #while v_3 = vals.splitlines()[3] crt, sels = v_3.split(';') sels = sels.strip(',').split(',') pass LOG and log('sels={}', sels) if False: pass elif ans_s == 'file': new_exp_file = app.dlg_file(False, '', '', 'Cuda macros|*.cuda-macros') if new_exp_file is not None: exp_file = new_exp_file exp_file = exp_file + ('' if '' == exp_file or exp_file.endswith('.cuda-macros') else '.cuda-macros') elif ans_s == 'all': sels = ['1'] * lmcrs elif ans_s == 'no': sels = ['0'] * lmcrs elif ans_s == 'exp': if '1' not in sels: app.msg_box('Select some names', app.MB_OK) continue self.export_to_file(exp_file, [ mcr for (ind, mcr) in enumerate(self.macros) if sels[ind] == '1' ]) return