| @@ -1003,20 +1003,40 @@ def cmd_hosts(options, persona, objstr, cache): | |||
| printhost(i) | |||
| def genstartstop(cnt, idx): | |||
| idx = min(idx, cnt - 10) | |||
| idx = max(0, idx) | |||
| maxstart = max(0, cnt - 20) | |||
| startidx = min(max(0, idx - 10), maxstart) | |||
| endidx = min(cnt, startidx + 20) | |||
| return startidx, endidx | |||
| def getnextfile(files, idx): | |||
| # original data incase of abort | |||
| origfiles = files | |||
| origidx = idx | |||
| maxstart = max(0, len(files) - 10) | |||
| idx = min(maxstart, idx) | |||
| # current selection (last file or dir) | |||
| curselidx = origidx | |||
| currentcnt = None | |||
| while True: | |||
| startidx = min(max(10, idx - 10), maxstart) | |||
| _debprint(len(files), startidx) | |||
| subset = files[startidx:min(len(files), idx + 10)] | |||
| selfile = -1 if origidx < startidx or origidx >= startidx + \ | |||
| 20 else origidx - startidx | |||
| if len(files) != currentcnt: | |||
| currentcnt = len(files) | |||
| maxidx = max(0, currentcnt - 10) | |||
| idx = min(maxidx, idx) | |||
| startidx, endidx = genstartstop(currentcnt, idx) | |||
| subset = files[startidx:endidx] | |||
| selfile = -1 if curselidx < startidx or curselidx >= startidx + \ | |||
| 20 else curselidx - startidx | |||
| print('%2d) Parent directory' % 0) | |||
| for i, f in enumerate(subset): | |||
| print('%2d)%1s%s' % (i + 1, '*' if i == selfile else '', repr(str(f)))) | |||
| print('%2d)%1s%s%s' % (i + 1, '*' if i == selfile else '', repr(str(f)), '/' if f.is_dir() else '')) | |||
| print('P) Previous page') | |||
| print('N) Next page') | |||
| @@ -1025,13 +1045,13 @@ def getnextfile(files, idx): | |||
| inp = sys.stdin.readline().strip() | |||
| if inp.lower() == 'p': | |||
| idx = max(10, idx - 19) | |||
| idx = max(0, idx - 19) | |||
| continue | |||
| if inp.lower() == 'n': | |||
| idx = min(maxstart, idx + 19) | |||
| idx = min(currentcnt - 1, idx + 19) | |||
| continue | |||
| if inp.lower() == 'a': | |||
| return origidx | |||
| return origfiles, origidx | |||
| try: | |||
| inp = int(inp) | |||
| @@ -1039,11 +1059,23 @@ def getnextfile(files, idx): | |||
| print('Invalid selection.') | |||
| continue | |||
| if inp == 0: | |||
| curdir = files[idx].parent | |||
| files = sorted(files[idx].parent.parent.iterdir()) | |||
| idx = curselidx = files.index(curdir) | |||
| continue | |||
| if inp < 1 or inp > len(subset): | |||
| print('Invalid selection.') | |||
| continue | |||
| return startidx - 1 + inp | |||
| newidx = startidx - 1 + inp | |||
| if files[newidx].is_dir(): | |||
| files = sorted(files[newidx].iterdir()) | |||
| curselidx = idx = 0 | |||
| continue | |||
| return files, newidx | |||
| def checkforfile(objstr, curfile, ask=False): | |||
| try: | |||
| @@ -1144,7 +1176,7 @@ def cmd_interactive(options, persona, objstr, cache): | |||
| idx = min(len(files) - 1, idx + 1) | |||
| continue | |||
| if inp == '3': | |||
| idx = getnextfile(files, idx) | |||
| files, idx = getnextfile(files, idx) | |||
| continue | |||
| if inp == '4': | |||
| files = sorted(curfile.parent.iterdir()) | |||
| @@ -1526,6 +1558,18 @@ class _TestCases(unittest.TestCase): | |||
| os.chdir(self.oldcwd) | |||
| def test_genstartstop(self): | |||
| self.assertEqual(genstartstop(5, 0), (0, 5)) | |||
| self.assertEqual(genstartstop(5, 1), (0, 5)) | |||
| self.assertEqual(genstartstop(5, 4), (0, 5)) | |||
| self.assertEqual(genstartstop(25, 1), (0, 20)) | |||
| self.assertEqual(genstartstop(25, 20), (5, 25)) | |||
| self.assertEqual(genstartstop(25, 24), (5, 25)) | |||
| self.assertEqual(genstartstop(124, 1), (0, 20)) | |||
| self.assertEqual(genstartstop(124, 53), (43, 63)) | |||
| self.assertEqual(genstartstop(124, 120), (104, 124)) | |||
| self.assertEqual(genstartstop(124, 124), (104, 124)) | |||
| def test_fileobject(self): | |||
| os.chdir(self.tempdir) | |||