comparison hgext/histedit.py @ 48210:0444956ecbcf

chistedit: move swap() onto state class Differential Revision: https://phab.mercurial-scm.org/D11646
author Martin von Zweigbergk <martinvonz@google.com>
date Tue, 12 Oct 2021 09:20:46 -0700
parents 0f498e03b016
children 141aafac446c
comparison
equal deleted inserted replaced
48209:0f498e03b016 48210:0444956ecbcf
1192 self.conflicts.remove(other) 1192 self.conflicts.remove(other)
1193 return self.conflicts 1193 return self.conflicts
1194 1194
1195 1195
1196 # ============ EVENTS =============== 1196 # ============ EVENTS ===============
1197 def swap(state, oldpos, newpos):
1198 """Swap two positions and calculate necessary conflicts in
1199 O(|newpos-oldpos|) time"""
1200
1201 rules = state.rules
1202 assert 0 <= oldpos < len(rules) and 0 <= newpos < len(rules)
1203
1204 rules[oldpos], rules[newpos] = rules[newpos], rules[oldpos]
1205
1206 # TODO: swap should not know about histeditrule's internals
1207 rules[newpos].pos = newpos
1208 rules[oldpos].pos = oldpos
1209
1210 start = min(oldpos, newpos)
1211 end = max(oldpos, newpos)
1212 for r in pycompat.xrange(start, end + 1):
1213 rules[newpos].checkconflicts(rules[r])
1214 rules[oldpos].checkconflicts(rules[r])
1215
1216 if state.selected:
1217 state.make_selection(newpos)
1218
1219
1220 def changeaction(state, pos, action): 1197 def changeaction(state, pos, action):
1221 """Change the action state on the given position to the new action""" 1198 """Change the action state on the given position to the new action"""
1222 rules = state.rules 1199 rules = state.rules
1223 assert 0 <= pos < len(rules) 1200 assert 0 <= pos < len(rules)
1224 rules[pos].action = action 1201 rules[pos].action = action
1507 return 1484 return
1508 if action in (b'down', b'move-down'): 1485 if action in (b'down', b'move-down'):
1509 newpos = min(oldpos + 1, len(rules) - 1) 1486 newpos = min(oldpos + 1, len(rules) - 1)
1510 self.move_cursor(oldpos, newpos) 1487 self.move_cursor(oldpos, newpos)
1511 if selected is not None or action == b'move-down': 1488 if selected is not None or action == b'move-down':
1512 swap(self, oldpos, newpos) 1489 self.swap(oldpos, newpos)
1513 elif action in (b'up', b'move-up'): 1490 elif action in (b'up', b'move-up'):
1514 newpos = max(0, oldpos - 1) 1491 newpos = max(0, oldpos - 1)
1515 self.move_cursor(oldpos, newpos) 1492 self.move_cursor(oldpos, newpos)
1516 if selected is not None or action == b'move-up': 1493 if selected is not None or action == b'move-up':
1517 swap(self, oldpos, newpos) 1494 self.swap(oldpos, newpos)
1518 elif action == b'next-action': 1495 elif action == b'next-action':
1519 cycleaction(self, oldpos, next=True) 1496 cycleaction(self, oldpos, next=True)
1520 elif action == b'prev-action': 1497 elif action == b'prev-action':
1521 cycleaction(self, oldpos, next=False) 1498 cycleaction(self, oldpos, next=False)
1522 elif action == b'select': 1499 elif action == b'select':
1524 self.make_selection(selected) 1501 self.make_selection(selected)
1525 elif action == b'goto' and int(ch) < len(rules) and len(rules) <= 10: 1502 elif action == b'goto' and int(ch) < len(rules) and len(rules) <= 10:
1526 newrule = next((r for r in rules if r.origpos == int(ch))) 1503 newrule = next((r for r in rules if r.origpos == int(ch)))
1527 self.move_cursor(oldpos, newrule.pos) 1504 self.move_cursor(oldpos, newrule.pos)
1528 if selected is not None: 1505 if selected is not None:
1529 swap(self, oldpos, newrule.pos) 1506 self.swap(oldpos, newrule.pos)
1530 elif action.startswith(b'action-'): 1507 elif action.startswith(b'action-'):
1531 changeaction(self, oldpos, action[7:]) 1508 changeaction(self, oldpos, action[7:])
1532 elif action == b'showpatch': 1509 elif action == b'showpatch':
1533 self.change_mode(MODE_PATCH if curmode != MODE_PATCH else prevmode) 1510 self.change_mode(MODE_PATCH if curmode != MODE_PATCH else prevmode)
1534 elif action == b'help': 1511 elif action == b'help':
1586 if mode == MODE_PATCH: 1563 if mode == MODE_PATCH:
1587 self.modes[MODE_PATCH][b'patchcontents'] = self.patch_contents() 1564 self.modes[MODE_PATCH][b'patchcontents'] = self.patch_contents()
1588 1565
1589 def make_selection(self, pos): 1566 def make_selection(self, pos):
1590 self.selected = pos 1567 self.selected = pos
1568
1569 def swap(self, oldpos, newpos):
1570 """Swap two positions and calculate necessary conflicts in
1571 O(|newpos-oldpos|) time"""
1572
1573 rules = self.rules
1574 assert 0 <= oldpos < len(rules) and 0 <= newpos < len(rules)
1575
1576 rules[oldpos], rules[newpos] = rules[newpos], rules[oldpos]
1577
1578 # TODO: swap should not know about histeditrule's internals
1579 rules[newpos].pos = newpos
1580 rules[oldpos].pos = oldpos
1581
1582 start = min(oldpos, newpos)
1583 end = max(oldpos, newpos)
1584 for r in pycompat.xrange(start, end + 1):
1585 rules[newpos].checkconflicts(rules[r])
1586 rules[oldpos].checkconflicts(rules[r])
1587
1588 if self.selected:
1589 self.make_selection(newpos)
1591 1590
1592 1591
1593 def _chisteditmain(repo, rules, stdscr): 1592 def _chisteditmain(repo, rules, stdscr):
1594 try: 1593 try:
1595 curses.use_default_colors() 1594 curses.use_default_colors()