diff -ur v7/argmnt.py v8/argmnt.py --- v7/argmnt.py 2018-10-17 23:14:46.000000000 +0900 +++ v8/argmnt.py 2018-10-18 16:29:11.000000000 +0900 @@ -42,11 +42,16 @@ is_rect = lambda o: is_typ(o, 'rect') def copy_o(o): - cp_if_lst = lambda v: v if type(v) != list else list( map( cp_if_lst, v ) ) + def cp_if_need(v): + if type(v) == list: + return list( map( cp_if_need, v ) ) + if isinstance(v, Empty): + return copy_o(v) + return v o_ = Empty() ks = list( filter( lambda k: k[0] != '_', dir(o) ) ) for k in ks: - setattr( o_, k, cp_if_lst( getattr(o, k) ) ) + setattr( o_, k, cp_if_need( getattr(o, k) ) ) return o_ def get_vh(dxy): @@ -240,6 +245,11 @@ for p in ps: p[0] += dx p[1] += dy + i = len(lst)-1 + while i > 0: + if lst[i-1] == lst[i]: + lst.pop(i) + i -= 1 def new(lst, nkf_opt): e = Empty() @@ -278,7 +288,7 @@ return [ buf.uline ] if e.mode in ('sel_3', 'resize'): return [ buf.rev ] - if e.mode in ('sel', 'move', 'frm_align'): + if e.mode in ('sel', 'move', 'frm_align', 'depth'): return [ buf.rev ] if e.mode in ('sel_align'): return [ buf.uline ] @@ -286,7 +296,7 @@ def get_frm_atts(o, buf): if o == e.sel: - if e.mode in ('sel', 'move', 'sel_3', 'resize'): + if e.mode in ('sel', 'move', 'sel_3', 'resize', 'depth'): return [ buf.rev ] if e.mode in ('sel_2', 'sel_kind'): return [ buf.uline ] @@ -309,12 +319,16 @@ return False if ( is_rect(e.sel) or is_line(e.sel) ) and e.mode in ('sel_3', 'resize'): return True - return e.mode in ('normal', 'sel_4', 'line', 'sel_5', 'rect') + return e.mode in ('normal', 'sel_4', 'line', 'sel_5', 'rect', 'depth') if do_cursor(): (x, y) = e.cur atts = [ buf.rev ] if e.mode in ('sel_4', 'line') else [] - c = '#' if e.mode in ('sel_5', 'rect') else '+' + c = '+' + if e.mode in ('sel_5', 'rect'): + c = '#' + elif e.mode in ('depth'): + c = 'd' buf.set(x, y, c, atts) buf.adjust() @@ -345,10 +359,10 @@ def new_draw(o): if is_line(o): f = new_draw_rects( get_o_rects(o) ) - return lambda : f( get_o_rects(o) ) + return lambda o2=None: f( get_o_rects( o2 if o2 else o ) ) else: f = new_draw_rect( get_o_rect(o) ) - return lambda : f( get_o_rect(o) ) + return lambda o2=None: f( get_o_rect( o2 if o2 else o ) ) def move_cur(dxy): r = rect.p_wh_to( e.cur, (1, 1) ) @@ -357,6 +371,12 @@ e.cur = rect.get_p(r) f(r) + def move_cur_to(p): + bak = e.cur + e.cur = p + for p in (bak, e.cur): + draw_r( rect.p_wh_to( p, (1,1) ), term.out ) + def get_o_under_cursor(): for o in reversed(lst): if rect.p_in_rects( e.cur, get_o_rects(o) ): @@ -367,6 +387,7 @@ if mode == 'sel': e.sel = get_o_under_cursor() o = e.sel + e.mode_bak = ( copy_o(o) if o else None, lst.index(o) if o and o in lst else -1, e.cur ) f = new_draw(o) if o else None e.mode = mode if mode == 'normal': @@ -384,22 +405,22 @@ if key.is_ok(k): set_mode( 'sel' if get_o_under_cursor() else 'sel_4' ) elif key.is_allow(k): + dxy = key.dxy( k, (0,0) ) + if dxy != (0,0): + move_cur(dxy) + return + ((x1,y1),(x2,y2)) = rect.to_p2( rect.resize( view.get_rect(), (-1,-1) ) ) d = key.allow(k) - (dx, dy) = key.dxy( k, (0,0) ) - - (x, y, w, h) = view.get_rect() - (cx, cy) = e.cur + (x, y) = e.cur if d == 'pu': - dy = y - cy + y = y1 elif d == 'pd': - dy = y+h-1 - cy + y = y2 elif d == 'pl': - dx = x - cx + x = x1 elif d == 'pr': - dx = x+w-1 - cx - - if dx != 0 or dy != 0: - move_cur((dx, dy)) + x = x2 + move_cur_to((x, y)) elif e.clipboard and k == 'v': # paste (o, p) = e.clipboard o = copy_o(o) @@ -412,7 +433,7 @@ set_mode('sel_2') elif key.is_allow(k): call( [ 'move', move ], k ) - if e.sel and k in ('c', 'x'): + elif e.sel and k in ('c', 'x'): o = e.sel e.clipboard = ( copy_o(o), e.cur ) set_mode('normal') @@ -420,6 +441,10 @@ f = new_draw(o) lst.remove(o) f() + elif k == 'd': + set_mode('depth') + elif key.is_cancel(k): + set_mode('normal') return None def f_sel2_ok(k): @@ -495,12 +520,11 @@ f = new_draw(o) d = key.allow(k) if d in 'ud': - lst = ['u', 'c', 'd'] - o.frm.va = lst[ ( lst.index(o.frm.va) + 1 ) % len(lst) ] + o.frm.va = get_next( ['u', 'c', 'd'], o.frm.va ) f() elif d in 'lr': lst = ['l', 'c', 'r'] - o.frm.ha = lst[ ( lst.index(o.frm.ha) + 1 ) % len(lst) ] + o.frm.ha = get_next( ['l', 'c', 'r'], o.frm.ha ) f() def line(k): @@ -548,6 +572,33 @@ f() move_cur(dxy) + def f_depth(k): + (dx, dy) = key.dxy( k, (0,0) ) + o = e.sel + f = new_draw(o) + i = lst.index(o) + n = len(lst) + o = lst.pop(i) + i = (i + dx + dy + n) % n + lst.insert(i, o) + f() + + def f_cancel(k): + (bak, bak_i, p) = e.mode_bak + if e.sel: + f = new_draw(e.sel) + i = lst.index(e.sel) + lst.pop(i) + if bak: + if bak_i >= 0 and bak_i != i: + i = bak_i + lst.insert(i, bak) + f(bak) + else: + f() + move_cur_to(p) + set_mode('normal') + def has_bdr(k): o = e.sel if has_typ(o): @@ -558,21 +609,24 @@ hdl = { 'normal': f_normal, 'sel': f_sel, - 'move': { 'ok': 'normal', 'allow': move }, + 'move': { 'ok': 'normal', 'allow': move, 'cancel': f_cancel }, 'sel_2': { 'ok': f_sel2_ok, - 'allow': [ 'sel_kind', sel_kind ] }, - 'sel_kind': { 'ok': 'normal', 'allow': sel_kind }, - 'sel_align': { 'ok': 'normal', 'allow': sel_align }, + 'allow': [ 'sel_kind', sel_kind ], + 'cancel': 'normal' }, + 'sel_kind': { 'ok': 'normal', 'allow': sel_kind, 'cancel': f_cancel }, + 'sel_align': { 'ok': 'normal', 'allow': sel_align, 'cancel': f_cancel }, 'sel_3': { 'ok': { 'f': has_bdr, True: 'frm_align', False: 'normal' }, - 'allow': [ 'resize', resize ] }, - 'resize': { 'ok': 'normal', 'allow': resize }, - 'frm_align': { 'ok': 'normal', 'allow': frm_align }, - 'sel_4': { 'ok': 'sel_5', 'allow': [ 'line', line ] }, - 'line': { 'ok': 'normal', 'allow': line }, - 'sel_5': { 'ok': 'normal', 'allow': [ 'rect', f_rect ] }, - 'rect': { 'ok': 'normal', 'allow': f_rect }, + 'allow': [ 'resize', resize ], + 'cancel': 'normal' }, + 'resize': { 'ok': 'normal', 'allow': resize, 'cancel': f_cancel }, + 'frm_align': { 'ok': 'normal', 'allow': frm_align, 'cancel': f_cancel }, + 'sel_4': { 'ok': 'sel_5', 'allow': [ 'line', line ], 'cancel': 'normal' }, + 'line': { 'ok': 'normal', 'allow': line, 'cancel': f_cancel }, + 'sel_5': { 'ok': 'normal', 'allow': [ 'rect', f_rect ], 'cancel': 'normal' }, + 'rect': { 'ok': 'normal', 'allow': f_rect, 'cancel': f_cancel }, + 'depth': { 'ok': 'normal', 'allow': f_depth, 'cancel': f_cancel }, } def call(o, k): @@ -592,6 +646,8 @@ return call( o.get('ok'), k ) if key.is_allow(k): return call( o.get('allow'), k ) + if key.is_cancel(k): + return call( o.get('cancel'), k ) return None def get_key(klst): @@ -608,6 +664,7 @@ e.fini = lambda : view.fini() e.mode = 'normal' + e.mode_bak = ( None, -1, e.cur ) e.sel = None e.clipboard = None