comparison hgext/histedit.py @ 48202:9006eafa0942

chistedit: move layout() and dependencies onto state class Differential Revision: https://phab.mercurial-scm.org/D11638
author Martin von Zweigbergk <martinvonz@google.com>
date Mon, 11 Oct 2021 23:02:49 -0700
parents 8ac61257c807
children 8dd2422b0109
comparison
equal deleted inserted replaced
48201:8ac61257c807 48202:9006eafa0942
1406 class _chistedit_state(object): 1406 class _chistedit_state(object):
1407 def __init__( 1407 def __init__(
1408 self, 1408 self,
1409 repo, 1409 repo,
1410 rules, 1410 rules,
1411 stdscr,
1411 ): 1412 ):
1412 self.repo = repo 1413 self.repo = repo
1413 self.rules = rules 1414 self.rules = rules
1415 self.stdscr = stdscr
1414 self.pos = 0 1416 self.pos = 0
1415 self.selected = None 1417 self.selected = None
1416 self.mode = (MODE_INIT, MODE_INIT) 1418 self.mode = (MODE_INIT, MODE_INIT)
1417 self.page_height = None 1419 self.page_height = None
1418 self.modes = { 1420 self.modes = {
1473 conflictstr = b'no overlap' 1475 conflictstr = b'no overlap'
1474 1476
1475 win.addstr(y, 1, conflictstr[:length]) 1477 win.addstr(y, 1, conflictstr[:length])
1476 win.noutrefresh() 1478 win.noutrefresh()
1477 1479
1480 def helplines(self):
1481 if self.mode[0] == MODE_PATCH:
1482 help = b"""\
1483 ?: help, k/up: line up, j/down: line down, v: stop viewing patch
1484 pgup: prev page, space/pgdn: next page, c: commit, q: abort
1485 """
1486 else:
1487 help = b"""\
1488 ?: help, k/up: move up, j/down: move down, space: select, v: view patch
1489 d: drop, e: edit, f: fold, m: mess, p: pick, r: roll
1490 pgup/K: move patch up, pgdn/J: move patch down, c: commit, q: abort
1491 """
1492 return help.splitlines()
1493
1494 def render_help(self, win):
1495 maxy, maxx = win.getmaxyx()
1496 for y, line in enumerate(self.helplines()):
1497 if y >= maxy:
1498 break
1499 addln(win, y, 0, line, curses.color_pair(COLOR_HELP))
1500 win.noutrefresh()
1501
1502 def layout(self):
1503 maxy, maxx = self.stdscr.getmaxyx()
1504 helplen = len(self.helplines())
1505 mainlen = maxy - helplen - 12
1506 if mainlen < 1:
1507 raise error.Abort(
1508 _(b"terminal dimensions %d by %d too small for curses histedit")
1509 % (maxy, maxx),
1510 hint=_(
1511 b"enlarge your terminal or use --config ui.interface=text"
1512 ),
1513 )
1514 return {
1515 b'commit': (12, maxx),
1516 b'help': (helplen, maxx),
1517 b'main': (mainlen, maxx),
1518 }
1519
1478 1520
1479 def _chisteditmain(repo, rules, stdscr): 1521 def _chisteditmain(repo, rules, stdscr):
1480 try: 1522 try:
1481 curses.use_default_colors() 1523 curses.use_default_colors()
1482 except curses.error: 1524 except curses.error:
1500 # don't display the cursor 1542 # don't display the cursor
1501 try: 1543 try:
1502 curses.curs_set(0) 1544 curses.curs_set(0)
1503 except curses.error: 1545 except curses.error:
1504 pass 1546 pass
1505
1506 def helplines(mode):
1507 if mode == MODE_PATCH:
1508 help = b"""\
1509 ?: help, k/up: line up, j/down: line down, v: stop viewing patch
1510 pgup: prev page, space/pgdn: next page, c: commit, q: abort
1511 """
1512 else:
1513 help = b"""\
1514 ?: help, k/up: move up, j/down: move down, space: select, v: view patch
1515 d: drop, e: edit, f: fold, m: mess, p: pick, r: roll
1516 pgup/K: move patch up, pgdn/J: move patch down, c: commit, q: abort
1517 """
1518 return help.splitlines()
1519
1520 def renderhelp(win, state):
1521 maxy, maxx = win.getmaxyx()
1522 mode, _ = state.mode
1523 for y, line in enumerate(helplines(mode)):
1524 if y >= maxy:
1525 break
1526 addln(win, y, 0, line, curses.color_pair(COLOR_HELP))
1527 win.noutrefresh()
1528 1547
1529 def renderrules(rulesscr, state): 1548 def renderrules(rulesscr, state):
1530 rules = state.rules 1549 rules = state.rules
1531 pos = state.pos 1550 pos = state.pos
1532 selected = state.selected 1551 selected = state.selected
1598 def renderpatch(win, state): 1617 def renderpatch(win, state):
1599 start = state.modes[MODE_PATCH][b'line_offset'] 1618 start = state.modes[MODE_PATCH][b'line_offset']
1600 content = state.modes[MODE_PATCH][b'patchcontents'] 1619 content = state.modes[MODE_PATCH][b'patchcontents']
1601 renderstring(win, state, content[start:], diffcolors=True) 1620 renderstring(win, state, content[start:], diffcolors=True)
1602 1621
1603 def layout(mode):
1604 maxy, maxx = stdscr.getmaxyx()
1605 helplen = len(helplines(mode))
1606 mainlen = maxy - helplen - 12
1607 if mainlen < 1:
1608 raise error.Abort(
1609 _(b"terminal dimensions %d by %d too small for curses histedit")
1610 % (maxy, maxx),
1611 hint=_(
1612 b"enlarge your terminal or use --config ui.interface=text"
1613 ),
1614 )
1615 return {
1616 b'commit': (12, maxx),
1617 b'help': (helplen, maxx),
1618 b'main': (mainlen, maxx),
1619 }
1620
1621 def drawvertwin(size, y, x): 1622 def drawvertwin(size, y, x):
1622 win = curses.newwin(size[0], size[1], y, x) 1623 win = curses.newwin(size[0], size[1], y, x)
1623 y += size[0] 1624 y += size[0]
1624 return win, y, x 1625 return win, y, x
1625 1626
1626 state = _chistedit_state(repo, rules) 1627 state = _chistedit_state(repo, rules, stdscr)
1627 1628
1628 # eventloop 1629 # eventloop
1629 ch = None 1630 ch = None
1630 stdscr.clear() 1631 stdscr.clear()
1631 stdscr.refresh() 1632 stdscr.refresh()
1643 if e == E_RESIZE: 1644 if e == E_RESIZE:
1644 size = screen_size() 1645 size = screen_size()
1645 if size != stdscr.getmaxyx(): 1646 if size != stdscr.getmaxyx():
1646 curses.resizeterm(*size) 1647 curses.resizeterm(*size)
1647 1648
1649 sizes = state.layout()
1648 curmode, unused = state.mode 1650 curmode, unused = state.mode
1649 sizes = layout(curmode)
1650 if curmode != oldmode: 1651 if curmode != oldmode:
1651 state.page_height = sizes[b'main'][0] 1652 state.page_height = sizes[b'main'][0]
1652 # Adjust the view to fit the current screen size. 1653 # Adjust the view to fit the current screen size.
1653 movecursor(state, state.pos, state.pos) 1654 movecursor(state, state.pos, state.pos)
1654 1655
1678 elif curmode == MODE_HELP: 1679 elif curmode == MODE_HELP:
1679 renderstring(mainwin, state, __doc__.strip().splitlines()) 1680 renderstring(mainwin, state, __doc__.strip().splitlines())
1680 else: 1681 else:
1681 renderrules(mainwin, state) 1682 renderrules(mainwin, state)
1682 state.render_commit(commitwin) 1683 state.render_commit(commitwin)
1683 renderhelp(helpwin, state) 1684 state.render_help(helpwin)
1684 curses.doupdate() 1685 curses.doupdate()
1685 # done rendering 1686 # done rendering
1686 ch = encoding.strtolocal(stdscr.getkey()) 1687 ch = encoding.strtolocal(stdscr.getkey())
1687 1688
1688 1689