diff -ur v8/argmnt.py v9/argmnt.py --- v8/argmnt.py 2018-10-18 16:29:11.000000000 +0900 +++ v9/argmnt.py 2018-10-22 02:30:19.000000000 +0900 @@ -261,6 +261,14 @@ (x, y, w, h) = view.get_rect() e.cur = (x, y) + step_modes = ('normal', 'move', 'resize', 'line', 'rect') + + def key_dxy(k): + dxy = key.dxy( k, (0,0) ) + if e.mode in step_modes: + return rect.p_mul(dxy, e.step) + return dxy + def frm_visible(o): if has_typ(o): return False @@ -319,16 +327,22 @@ 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', 'depth') + return e.mode in ('normal', 'sel_4', 'line', 'sel_5', 'rect', 'depth', 'step') if do_cursor(): (x, y) = e.cur - atts = [ buf.rev ] if e.mode in ('sel_4', 'line') else [] + atts = [] + if e.mode in ('sel_4', 'line'): + atts = [ buf.rev ] + elif e.mode in ('step'): + atts = [ buf.uline ] c = '+' if e.mode in ('sel_5', 'rect'): c = '#' elif e.mode in ('depth'): c = 'd' + elif e.mode in ('step'): + c = str(e.step) buf.set(x, y, c, atts) buf.adjust() @@ -343,6 +357,9 @@ out(s) return s + def draw_cur(): + draw_r( rect.p_wh_to( e.cur, (1, 1) ), term.out ) + def new_draw_rect(bak): def f(r): r = contain_rect( [ bak, r ] ) @@ -387,7 +404,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 ) + e.mode_bak = ( copy_o(o) if o else None, lst.index(o) if o and o in lst else -1, e.cur, e.step, e.mode ) f = new_draw(o) if o else None e.mode = mode if mode == 'normal': @@ -398,14 +415,13 @@ lst.remove(o) if f: f() - # cursor - draw_r( rect.p_wh_to( e.cur, (1, 1) ), term.out ) + draw_cur() def f_normal(k): 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) ) + dxy = key_dxy(k) if dxy != (0,0): move_cur(dxy) return @@ -427,6 +443,8 @@ move_o( o, p_sub(e.cur, p) ) lst.append(o) set_mode('sel') + elif k == '\t': + set_mode('step') def f_sel(k): if key.is_ok(k): @@ -457,7 +475,7 @@ def resize(k): o = e.sel - dxy = key.dxy( k, (0,0) ) + dxy = key_dxy(k) f = new_draw(o) if is_rect(o): o.r = list( resize_rect( o.r, e.cur, dxy ) ) @@ -497,7 +515,7 @@ def move(k): o = e.sel - dxy = key.dxy( k, (0,0) ) + dxy = key_dxy(k) f = new_draw(o) move_o(o, dxy) f() @@ -508,7 +526,7 @@ f = new_draw(o) rlst = sorted( frm_info.keys() ) if is_line(o): - o.kind = get_next( ['', 's', 'e', 'b', 'd'], o.kind ) + o.kind = get_next( ['', 'e', 's', 'b', 'd'], o.kind ) elif is_rect(o): o.kind = get_next( rlst, o.kind ) else: @@ -528,7 +546,7 @@ f() def line(k): - dxy = key.dxy( k, (0,0) ) + dxy = key_dxy(k) if dxy == (0, 0): return if e.sel: @@ -553,7 +571,7 @@ move_cur(dxy) def f_rect(k): - dxy = key.dxy( k, (0,0) ) + dxy = key_dxy(k) if dxy == (0, 0): return if e.sel: @@ -573,7 +591,7 @@ move_cur(dxy) def f_depth(k): - (dx, dy) = key.dxy( k, (0,0) ) + (dx, dy) = key_dxy(k) o = e.sel f = new_draw(o) i = lst.index(o) @@ -583,8 +601,20 @@ lst.insert(i, o) f() + def f_step(k): + (bak, bak_i, p, step, mode) = e.mode_bak + if key.is_ok(k) or k == '\t': + set_mode(mode) + elif key.is_cancel(k): + e.setp = step + set_mode(mode) + elif key.is_allow(k): + (dx, dy) = key_dxy(k) + e.step = min( max( int( e.step * (2 if dx + dy > 0 else 0.5) ), 1 ), 8 ) + draw_cur() + def f_cancel(k): - (bak, bak_i, p) = e.mode_bak + (bak, bak_i, p, step, mode) = e.mode_bak if e.sel: f = new_draw(e.sel) i = lst.index(e.sel) @@ -597,6 +627,7 @@ else: f() move_cur_to(p) + e.step = step set_mode('normal') def has_bdr(k): @@ -609,7 +640,7 @@ hdl = { 'normal': f_normal, 'sel': f_sel, - 'move': { 'ok': 'normal', 'allow': move, 'cancel': f_cancel }, + 'move': { 'ok': 'normal', 'allow': move, 'cancel': f_cancel, 'key_\t': 'step' }, 'sel_2': { 'ok': f_sel2_ok, 'allow': [ 'sel_kind', sel_kind ], @@ -620,13 +651,14 @@ 'ok': { 'f': has_bdr, True: 'frm_align', False: 'normal' }, 'allow': [ 'resize', resize ], 'cancel': 'normal' }, - 'resize': { 'ok': 'normal', 'allow': resize, 'cancel': f_cancel }, + 'resize': { 'ok': 'normal', 'allow': resize, 'cancel': f_cancel, 'key_\t': 'step' }, '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 }, + 'line': { 'ok': 'normal', 'allow': line, 'cancel': f_cancel, 'key_\t': 'step' }, 'sel_5': { 'ok': 'normal', 'allow': [ 'rect', f_rect ], 'cancel': 'normal' }, - 'rect': { 'ok': 'normal', 'allow': f_rect, 'cancel': f_cancel }, + 'rect': { 'ok': 'normal', 'allow': f_rect, 'cancel': f_cancel, 'key_\t': 'step' }, 'depth': { 'ok': 'normal', 'allow': f_depth, 'cancel': f_cancel }, + 'step': f_step, } def call(o, k): @@ -639,9 +671,13 @@ ret = call(e, k) return ret if type(o) == dict: - if 'f' in o: - ret = call( o.get('f'), k ) - return call( o.get(ret), k ) + dk = 'key_' + k + if dk in o: + call( o.get(dk), k ) # not return + dk = 'f' + if dk in o: + dk = call( o.get(dk), k ) + return call( o.get(dk), k ) if key.is_ok(k): return call( o.get('ok'), k ) if key.is_allow(k): @@ -664,7 +700,8 @@ e.fini = lambda : view.fini() e.mode = 'normal' - e.mode_bak = ( None, -1, e.cur ) + e.step = 1 + e.mode_bak = ( None, -1, e.cur, e.step, e.mode ) e.sel = None e.clipboard = None @@ -784,8 +821,7 @@ lst.append(o) o = opt.get('-o', '') - if not o: - o = nkf_opt + o = '-' + o if o else nkf_opt if opt.index('-txt') >= 0: txt_out(lst, o) diff -ur v8/rect.py v9/rect.py --- v8/rect.py 2018-10-17 20:55:40.000000000 +0900 +++ v9/rect.py 2018-10-22 02:30:19.000000000 +0900 @@ -10,6 +10,10 @@ (xb, yb) = pb return (xa - xb, ya - yb) +def p_mul(p, m): + (x, y) = p + return (x*m, y*m) + def to_p_wh(r): (x, y, w, h) = r return ( (x, y), (w, h) )