diff -ur v5/argmnt.py v6/argmnt.py --- v5/argmnt.py 2018-10-17 02:54:24.000000000 +0900 +++ v6/argmnt.py 2018-10-17 22:54:13.000000000 +0900 @@ -35,22 +35,28 @@ return lst[i] has_typ = lambda o: hasattr(o, 'typ') - -def is_typ(o, typ): - return has_typ(o) and o.typ == typ - +is_typ = lambda o, typ: has_typ(o) and o.typ == typ is_line = lambda o: is_typ(o, 'line') is_rect = lambda o: is_typ(o, 'rect') +def get_vh(dxy): + (dx, dy) = dxy + if dx != 0 and dy == 0: + return 'h' + if dx == 0 and dy != 0: + return 'v' + return '' + def get_p2_vh(p1, p2): - (dx, dy) = rect.p_sub(p2, p1) - return 'v' if dx == 0 else 'h' + return get_vh( rect.p_sub(p2, p1) ) def get_d_p1_to_p2(p1, p2): # udlr (dx, dy) = rect.p_sub(p2, p1) - if get_p2_vh(p1, p2) == 'h': + d = '' + vh = get_p2_vh(p1, p2) + if vh == 'h': d = 'l' if dx < 0 else 'r' - else: + elif vh == 'v': d = 'u' if dy < 0 else 'd' return d @@ -92,14 +98,13 @@ rects = [] line_n = len(o.lst) - 1 for i in range( line_n ): - ((x1,y1),(x2,y2)) = (p1, p2) = o.lst[i:i+2] - add = 1 if i == line_n - 1 else 0 - if get_p2_vh(p1, p2) == 'h': - (x1,x2) = sorted( (x1,x2) ) - r = (x1, y1, x2 - x1 + add, 1) - else: - (y1,y2) = sorted( (y1,y2) ) - r = (x1, y1, 1, y2 - y1 + add) + (p1, p2) = o.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) + r = rect.p2_sort_to(p1, p2) + r = rect.resize( r, (1,1) ) rects += [r] return rects @@ -124,9 +129,11 @@ def p_on_frm(p, o): if is_line(o): - return False - r = o.r if is_rect(o) else get_frm_rect(o) - return rect.p_in_rects(p, frame_rects(r) ) + rects = get_line_rects(o) + else: + r = o.r if is_rect(o) else get_frm_rect(o) + rects = frame_rects(r) + return rect.p_in_rects(p, rects) def align_str(s, w, a): m = w - str_width(s) @@ -140,24 +147,18 @@ return s def draw_buf_rect(buf, r, atts, kind): - (x, y, w, h) = r cs = frm_info.get(kind) - s = cs[0] + cs[1]*(w-2) + (cs[0] if w > 1 else '') - buf.set(x, y, s, atts) - buf.set(x, y+h-1, s, atts) - for i in range(1,h-1): - buf.set(x, y+i, cs[2], atts) - buf.set(x+w-1, y+i, cs[2], atts) + 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, do_frm, frm_atts): +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 do_frm: + if frm_atts != None: draw_buf_frm(buf, o, frm_atts) def draw_buf_line(buf, o, atts): @@ -166,16 +167,12 @@ line_n = len(o.lst) - 1 for i in range( line_n ): - ((x1,y1),(x2,y2)) = (p1, p2) = o.lst[i:i+2] - is_top = (i == 0) - is_tail = (i == line_n - 1) - if get_p2_vh(p1, p2) == 'h': - (x1,x2) = sorted( (x1,x2) ) - buf.set( x1, y1, '-' * (x2-x1+1), atts ) - else: - (y1,y2) = sorted( (y1,y2) ) - for i in range(y2-y1+1): - buf.set(x1, y1+i, '|', atts) + (p1, p2) = o.lst[i:i+2] + r = rect.p2_sort_to(p1, p2) + r = rect.resize( r, (1,1) ) + c = '-' if get_p2_vh(p1, p2) == 'h' else '|' + buf.set_r(r, c, atts) + for (x, y) in o.lst[1:-1]: buf.set(x, y, '+', atts) @@ -198,8 +195,7 @@ if o.kind: draw_buf_rect(buf, o.r, atts, o.kind) else: - do_frm = (frm_atts != None) - draw_buf_o(buf, o, atts, do_frm, frm_atts) + draw_buf_o(buf, o, atts, frm_atts) def new(lst, nkf_opt): e = Empty() @@ -236,7 +232,6 @@ if is_line(o) or is_rect(o): if e.mode in ('sel_2', 'sel_kind'): return [ buf.uline ] - if is_rect(o): if e.mode in ('sel_3', 'resize'): return [ buf.rev ] if e.mode in ('sel', 'move', 'frm_align'): @@ -268,7 +263,7 @@ def do_cursor(): if not rect.in_rect(e.cur, r): return False - if is_rect(e.sel) and e.mode in ('sel_3', 'resize'): + 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') @@ -311,10 +306,10 @@ f = new_draw_rect( get_o_rect(o) ) return lambda : f( get_o_rect(o) ) - def move_cur(dx, dy): + def move_cur(dxy): r = rect.p_wh_to( e.cur, (1, 1) ) f = new_draw_rect(r) - r = rect.move( r, (dx, dy) ) + r = rect.move(r, dxy) e.cur = rect.get_p(r) f(r) @@ -357,34 +352,61 @@ dx = x+w-1 - cx if dx != 0 or dy != 0: - move_cur(dx, dy) + 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) ) def resize(k): o = e.sel (dx, dy) = dxy = key.dxy( k, [0, 0] ) f = new_draw(o) if is_rect(o): - ((x1,y1),(x2,y2)) = rect.to_p2(o.r) - (x2, y2) = (x2-1, y2-1) - (xx, yy) = ( [x1,x2], [y1,y2] ) - (cx, cy) = e.cur - xi = xx.index(cx) if cx in xx else -1 - yi = yy.index(cy) if cy in yy else -1 - if xi >= 0: - xx[xi] += dx - if yi >= 0: - yy[yi] += dy - ((x1,x2),(y1,y2)) = ( sorted(xx), sorted(yy) ) - o.r = list( rect.p2_to((x1,y1),(x2+1,y2+1)) ) + o.r = list( resize_rect( o.r, e.cur, dxy ) ) f() - move_cur(dx, dy) + 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 + 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 f() - #move_cur(dx, dy) # ... + #move_cur() ... def sel_align(k): o = e.sel @@ -405,7 +427,7 @@ else: (o.x, o.y) = (o.x + dx, o.y + dy) f() - move_cur(dx, dy) # hidden + move_cur(dxy) # hidden def sel_kind(k): o = e.sel @@ -433,7 +455,7 @@ f() def line(k): - (dx, dy) = dxy = key.dxy( k, [0, 0] ) + dxy = key.dxy( k, [0, 0] ) if dxy == (0, 0): return if e.sel: @@ -446,7 +468,7 @@ e.sel = o lst.append(o) - vh = 'v' if dx == 0 else 'h' + vh = get_vh(dxy) p = list( rect.p_add(e.cur, dxy) ) if len(o.lst) >= 2 and get_p2_vh( *o.lst[-2:] ) == vh: o.lst[-1] = p @@ -455,10 +477,10 @@ if len(o.lst) >= 2 and o.lst[-1] == o.lst[-2]: o.lst = o.lst[:-1] - move_cur(dx, dy) + move_cur(dxy) def f_rect(k): - (dx, dy) = dxy = key.dxy( k, [0, 0] ) + dxy = key.dxy( k, [0, 0] ) if dxy == (0, 0): return if e.sel: @@ -473,20 +495,9 @@ lst.append(o) f = new_draw(o) - - ((x1,y1),(x2,y2)) = rect.to_p2(o.r) - (x2, y2) = (x2-1, y2-1) - (xx, yy) = ( [x1,x2], [y1,y2] ) - (cx, cy) = e.cur - xi = 0 if xx[0] == cx else 1 - yi = 0 if yy[0] == cy else 1 - xx[xi] += dx - yy[yi] += dy - ((x1,x2),(y1,y2)) = ( sorted(xx), sorted(yy) ) - o.r = list( rect.p2_to((x1,y1),(x2+1,y2+1)) ) - + o.r = list( resize_rect( o.r, e.cur, dxy ) ) f() - move_cur(dx, dy) + move_cur(dxy) def has_bdr(k): o = e.sel diff -ur v5/key.py v6/key.py --- v5/key.py 2018-10-13 12:32:24.000000000 +0900 +++ v6/key.py 2018-10-17 20:55:40.000000000 +0900 @@ -40,11 +40,13 @@ return tbl[0][ lst.index(k) ] return '' -def dxy(k, def_val=None): - d = allow(k) +def d_to_dxy(d, def_val=None): dic = { 'l': (-1,0), 'r': (1,0), 'u': (0,-1), 'd': (0,1) } return dic.get(d, def_val) +def dxy(k, def_val=None): + return d_to_dxy( allow(k), def_val ) + is_ok = lambda k: k in ('\n', ' ') is_cancel = lambda k: k in ( chr(0x1b) ) is_allow = lambda k: allow(k) != '' diff -ur v5/rect.py v6/rect.py --- v5/rect.py 2018-10-17 02:13:14.000000000 +0900 +++ v6/rect.py 2018-10-17 20:55:40.000000000 +0900 @@ -37,10 +37,32 @@ (w, h) = p_sub(p2, p) return (x, y, w, h) +def p2_sort(p1, p2): + ((x1,y1),(x2,y2)) = (p1, p2) + (x1,x2) = sorted( (x1,x2) ) + (y1,y2) = sorted( (y1,y2) ) + (p1, p2) = ((x1,y1),(x2,y2)) + return (p1, p2) + +def p2_sort_to(p1, p2): + return p2_to( *p2_sort(p1, p2) ) + def move(r, dxy): (p, wh) = to_p_wh(r) return p_wh_to( p_add(p, dxy), wh ) +def resize(r, dwh): + (p, wh)= to_p_wh(r) + return p_wh_to( p, p_add(wh, dwh) ) + +def to_xx_yy(r): # [ [x1,x2],[y1,y2] ] + (p1, p2) = to_p2(r) + return list( map( list, zip(p1, p2) ) ) + +def xx_yy_to(xx_yy): + (p1, p2) = zip(*xx_yy) + return p2_sort_to(p1, p2) + def op_and(ra, rb): ( (ax, ay), (ax2, ay2) ) = to_p2(ra) ( (bx, by), (bx2, by2) ) = to_p2(rb) @@ -80,6 +102,17 @@ (x+w-1, y+1, 1, h-2), ] +def to_frame_h2_v2_p4_rects(r): # ( [hu,hd],[vl,vr],[pul,pur,pdl,pdr] ) + (hu, hd, vl, vr) = frame_rects(r) + h2 = list( map( lambda r: move( resize( r,(-2,0) ), (1,0) ), (hu, hd) ) ) + v2 = (vl, vr) + + ((x1,y1),(x2,y2)) = to_p2( resize( r, (-1,-1) ) ) + p4 = ( (x1,y1), (x2,y1), (x1,y2), (x2,y2) ) + p4 = list( map( lambda p: p_wh_to( p, (1,1) ), p4 ) ) + + return (h2, v2, p4) + def rects_contain_rect(rects): rx = None for r in rects: diff -ur v5/txbuf.py v6/txbuf.py --- v5/txbuf.py 2018-10-16 05:36:26.000000000 +0900 +++ v6/txbuf.py 2018-10-17 20:55:40.000000000 +0900 @@ -57,6 +57,23 @@ e.att[iy][ix:ix+w] = [atts] * w e.set = set + def set_r(r, c, atts=[]): + ((x,y),(w,h)) = rect.to_p_wh(r) + s = c * w + for i in range(h): + set(x, y+i, s, atts) + e.set_r = set_r + + def set_frm(r, cs, atts=[]): + (h2, v2, p4) = rect.to_frame_h2_v2_p4_rects(r) + for r in h2: + set_r(r, cs[1], atts) + for r in v2: + set_r(r, cs[2], atts) + for r in p4: + set_r(r, cs[0], atts) + e.set_frm = set_frm + def adjust(): e.arr = list( map( adj_line, e.arr ) ) e.adjust = adjust