Mercurial > hg
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 |