| @@ -1003,20 +1003,40 @@ def cmd_hosts(options, persona, objstr, cache): | |||||
| printhost(i) | 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): | def getnextfile(files, idx): | ||||
| # original data incase of abort | |||||
| origfiles = files | |||||
| origidx = idx | origidx = idx | ||||
| maxstart = max(0, len(files) - 10) | |||||
| idx = min(maxstart, idx) | |||||
| # current selection (last file or dir) | |||||
| curselidx = origidx | |||||
| currentcnt = None | |||||
| while True: | 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): | 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('P) Previous page') | ||||
| print('N) Next page') | print('N) Next page') | ||||
| @@ -1025,13 +1045,13 @@ def getnextfile(files, idx): | |||||
| inp = sys.stdin.readline().strip() | inp = sys.stdin.readline().strip() | ||||
| if inp.lower() == 'p': | if inp.lower() == 'p': | ||||
| idx = max(10, idx - 19) | |||||
| idx = max(0, idx - 19) | |||||
| continue | continue | ||||
| if inp.lower() == 'n': | if inp.lower() == 'n': | ||||
| idx = min(maxstart, idx + 19) | |||||
| idx = min(currentcnt - 1, idx + 19) | |||||
| continue | continue | ||||
| if inp.lower() == 'a': | if inp.lower() == 'a': | ||||
| return origidx | |||||
| return origfiles, origidx | |||||
| try: | try: | ||||
| inp = int(inp) | inp = int(inp) | ||||
| @@ -1039,11 +1059,23 @@ def getnextfile(files, idx): | |||||
| print('Invalid selection.') | print('Invalid selection.') | ||||
| continue | 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): | if inp < 1 or inp > len(subset): | ||||
| print('Invalid selection.') | print('Invalid selection.') | ||||
| continue | 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): | def checkforfile(objstr, curfile, ask=False): | ||||
| try: | try: | ||||
| @@ -1144,7 +1176,7 @@ def cmd_interactive(options, persona, objstr, cache): | |||||
| idx = min(len(files) - 1, idx + 1) | idx = min(len(files) - 1, idx + 1) | ||||
| continue | continue | ||||
| if inp == '3': | if inp == '3': | ||||
| idx = getnextfile(files, idx) | |||||
| files, idx = getnextfile(files, idx) | |||||
| continue | continue | ||||
| if inp == '4': | if inp == '4': | ||||
| files = sorted(curfile.parent.iterdir()) | files = sorted(curfile.parent.iterdir()) | ||||
| @@ -1526,6 +1558,18 @@ class _TestCases(unittest.TestCase): | |||||
| os.chdir(self.oldcwd) | 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): | def test_fileobject(self): | ||||
| os.chdir(self.tempdir) | os.chdir(self.tempdir) | ||||