diff -ur v6/argmnt.py v7/argmnt.py --- v6/argmnt.py 2018-10-17 22:54:13.000000000 +0900 +++ v7/argmnt.py 2018-10-17 23:14:46.000000000 +0900 @@ -25,6 +25,8 @@ pass str_width = nkf.str_width +p_add = rect.p_add +p_sub = rect.p_sub frame_rects = rect.frame_rects contain_rect = rect.rects_contain_rect @@ -39,6 +41,14 @@ is_line = lambda o: is_typ(o, 'line') 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 ) ) + o_ = Empty() + ks = list( filter( lambda k: k[0] != '_', dir(o) ) ) + for k in ks: + setattr( o_, k, cp_if_lst( getattr(o, k) ) ) + return o_ + def get_vh(dxy): (dx, dy) = dxy if dx != 0 and dy == 0: @@ -48,10 +58,10 @@ return '' def get_p2_vh(p1, p2): - return get_vh( rect.p_sub(p2, p1) ) + return get_vh( p_sub(p2, p1) ) def get_d_p1_to_p2(p1, p2): # udlr - (dx, dy) = rect.p_sub(p2, p1) + (dx, dy) = p_sub(p2, p1) d = '' vh = get_p2_vh(p1, p2) if vh == 'h': @@ -94,20 +104,22 @@ r = (x-1, y-1, w+2, h+2) return r -def get_line_rects(o): +def get_line_lst_rects(lst): rects = [] - line_n = len(o.lst) - 1 + line_n = len(lst) - 1 for i in range( line_n ): - (p1, p2) = o.lst[i:i+2] + (p1, p2) = lst[i:i+2] if i < line_n-1: d = get_d_p1_to_p2(p1, p2) dxy = key.d_to_dxy( d, (0,0) ) - p2 = rect.p_sub(p2, dxy) + p2 = p_sub(p2, dxy) r = rect.p2_sort_to(p1, p2) r = rect.resize( r, (1,1) ) rects += [r] return rects +get_line_rects = lambda o: get_line_lst_rects(o.lst) + def get_rect(o, frm_force=False): if is_line(o): return contain_rect( get_line_rects(o) ) @@ -150,17 +162,6 @@ cs = frm_info.get(kind) buf.set_frm(r, cs, atts) -def draw_buf_frm(buf, o, atts): - r = get_frm_rect(o) - draw_buf_rect( buf, r, atts, o.frm.kind ) - -def draw_buf_o(buf, o, atts, frm_atts): - for i in range(o.h): - s = align_str( o.s[i], o.w, o.a ) - buf.set( o.x, o.y+i, s, atts ) - if frm_atts != None: - draw_buf_frm(buf, o, frm_atts) - def draw_buf_line(buf, o, atts): if o.kind == 'd': # at sel_kind() return @@ -195,7 +196,50 @@ if o.kind: draw_buf_rect(buf, o.r, atts, o.kind) else: - draw_buf_o(buf, o, atts, frm_atts) + for i in range(o.h): + s = align_str( o.s[i], o.w, o.a ) + buf.set( o.x, o.y+i, s, atts ) + if frm_atts != None: + r = get_frm_rect(o) + draw_buf_rect(buf, r, frm_atts, o.frm.kind) + +def resize_rect(r, p_on_frm, dxy): + r = rect.resize( r, (-1,-1) ) + (xx, yy) = rect.to_xx_yy(r) + (x, y) = p_on_frm + (dx, dy) = dxy + if x in xx: + xx[ xx.index(x) ] += dx + if y in yy: + yy[ yy.index(y) ] += dy + r = rect.xx_yy_to( (xx, yy) ) + return rect.resize( r, (1,1) ) + +def resize_line(lst, p, dxy): + vh = get_vh(dxy) + cur_p = list(p) + ps = [] + if cur_p in lst: + n = len(lst) + i = lst.index(cur_p) + j = i-1 if i == n-1 else i + eq = ( get_p2_vh( *lst[j:j+2] ) == vh ) + if i == n-1: + eq = not eq + ps = lst[:i+1] if eq else lst[i:] + else: + rs = get_line_lst_rects(lst) + for r in rs: + if rect.in_rect(cur_p, r): + j = rs.index(r) + if get_p2_vh( *lst[j:j+2] ) != vh: + ps = lst[j:j+2] + break + if ps: + (dx, dy) = dxy + for p in ps: + p[0] += dx + p[1] += dy def new(lst, nkf_opt): e = Empty() @@ -336,77 +380,78 @@ # cursor draw_r( rect.p_wh_to( e.cur, (1, 1) ), term.out ) - def normal(k): - d = key.allow(k) - (dx, dy) = key.dxy( k, [0, 0] ) + 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): + d = key.allow(k) + (dx, dy) = key.dxy( k, (0,0) ) - (x, y, w, h) = view.get_rect() - (cx, cy) = e.cur - if d == 'pu': - dy = y - cy - elif d == 'pd': - dy = y+h-1 - cy - elif d == 'pl': - dx = x - cx - elif d == 'pr': - dx = x+w-1 - cx - - if dx != 0 or dy != 0: - move_cur((dx, dy)) - - def resize_rect(r, p_on_frm, dxy): - r = rect.resize( r, (-1,-1) ) - (xx, yy) = rect.to_xx_yy(r) - (x, y) = p_on_frm - (dx, dy) = dxy - if x in xx: - xx[ xx.index(x) ] += dx - if y in yy: - yy[ yy.index(y) ] += dy - r = rect.xx_yy_to( (xx, yy) ) - return rect.resize( r, (1,1) ) + (x, y, w, h) = view.get_rect() + (cx, cy) = e.cur + if d == 'pu': + dy = y - cy + elif d == 'pd': + dy = y+h-1 - cy + elif d == 'pl': + dx = x - cx + elif d == 'pr': + dx = x+w-1 - cx + + if dx != 0 or dy != 0: + move_cur((dx, dy)) + elif e.clipboard and k == 'v': # paste + (o, p) = e.clipboard + o = copy_o(o) + move_o( o, p_sub(e.cur, p) ) + lst.append(o) + set_mode('sel') + + def f_sel(k): + if key.is_ok(k): + set_mode('sel_2') + elif key.is_allow(k): + call( [ 'move', move ], k ) + if e.sel and k in ('c', 'x'): + o = e.sel + e.clipboard = ( copy_o(o), e.cur ) + set_mode('normal') + if k == 'x': + f = new_draw(o) + lst.remove(o) + f() + return None + + def f_sel2_ok(k): + if p_on_frm(e.cur, e.sel): + set_mode('sel_3') + elif not is_line(e.sel) and len(e.sel.s) > 1: + set_mode('sel_align') + else: + set_mode('normal') def resize(k): o = e.sel - (dx, dy) = dxy = key.dxy( k, [0, 0] ) + dxy = key.dxy( k, (0,0) ) f = new_draw(o) if is_rect(o): o.r = list( resize_rect( o.r, e.cur, dxy ) ) f() - move_cur(dxy) elif is_line(o): - vh = get_vh(dxy) - cp = list(e.cur) - ps = [] - if cp in o.lst: - n = len(o.lst) - i = o.lst.index(cp) - j = i-1 if i == n-1 else i - eq = ( get_p2_vh( *o.lst[j:j+2] ) == vh ) - if i == n-1: - eq = not eq - ps = o.lst[:i+1] if eq else o.lst[i:] - else: - rs = get_line_rects(o) - for r in rs: - if rect.in_rect(e.cur, r): - j = rs.index(r) - if get_p2_vh( *o.lst[j:j+2] ) != vh: - ps = o.lst[j:j+2] - break - if ps: - for p in ps: - p[0] += dx - p[1] += dy + resize_line( o.lst, e.cur, dxy ) f() - move_cur(dxy) else: - (bx, by) = o.frm.bdr - (bx, by) = ( max( bx+dx, 0 ), max( by+dy, 0 ) ) - if [bx, by] != o.frm.bdr: - o.frm.bdr = [bx, by] # list + bdr = list( map( lambda v: max(v, 0), p_add( o.frm.bdr, dxy ) ) ) + bak = dxy + dxy = (0,0) + if bdr != o.frm.bdr: + o.frm.bdr = bdr f() - #move_cur() ... + if not p_on_frm( p_add( e.cur, dxy ) , o ): + dxy = bak + if not p_on_frm( p_add( e.cur, dxy ) , o ): + dxy = p_sub( (0,0), dxy ) + move_cur(dxy) def sel_align(k): o = e.sel @@ -414,10 +459,8 @@ o.a = get_next( ['l', 'c', 'r'], o.a ) f() - def move(k): - o = e.sel - (dx, dy) = dxy = key.dxy( k, [0, 0] ) - f = new_draw(o) + def move_o(o, dxy): + (dx, dy) = dxy if is_line(o): for p in o.lst: p[0] += dx @@ -426,6 +469,12 @@ o.r = list( rect.move(o.r, dxy) ) else: (o.x, o.y) = (o.x + dx, o.y + dy) + + def move(k): + o = e.sel + dxy = key.dxy( k, (0,0) ) + f = new_draw(o) + move_o(o, dxy) f() move_cur(dxy) # hidden @@ -455,7 +504,7 @@ f() def line(k): - dxy = key.dxy( k, [0, 0] ) + dxy = key.dxy( k, (0,0) ) if dxy == (0, 0): return if e.sel: @@ -469,7 +518,7 @@ lst.append(o) vh = get_vh(dxy) - p = list( rect.p_add(e.cur, dxy) ) + p = list( p_add(e.cur, dxy) ) if len(o.lst) >= 2 and get_p2_vh( *o.lst[-2:] ) == vh: o.lst[-1] = p else: @@ -480,7 +529,7 @@ move_cur(dxy) def f_rect(k): - dxy = key.dxy( k, [0, 0] ) + dxy = key.dxy( k, (0,0) ) if dxy == (0, 0): return if e.sel: @@ -507,22 +556,11 @@ return bx > 0 or by > 0 hdl = { - 'normal': { - 'ok': { - 'f': ( lambda k: get_o_under_cursor() != None ), - True: 'sel', False: 'sel_4' }, - 'allow': normal }, - 'sel': { 'ok': 'sel_2', 'allow': [ 'move', move ] }, + 'normal': f_normal, + 'sel': f_sel, 'move': { 'ok': 'normal', 'allow': move }, 'sel_2': { - 'ok': { - 'f': ( lambda k: p_on_frm(e.cur, e.sel) ), - True: 'sel_3', - False: { - 'f': ( lambda k: not is_line(e.sel) and len(e.sel.s) > 1 ), - True: 'sel_align', - False: 'normal' } - }, + 'ok': f_sel2_ok, 'allow': [ 'sel_kind', sel_kind ] }, 'sel_kind': { 'ok': 'normal', 'allow': sel_kind }, 'sel_align': { 'ok': 'normal', 'allow': sel_align }, @@ -571,6 +609,7 @@ e.mode = 'normal' e.sel = None + e.clipboard = None draw_r( r, term.out )