mirror of
https://github.com/Grasscutters/mitmproxy.git
synced 2024-11-30 11:19:23 +00:00
70 lines
2.1 KiB
Python
70 lines
2.1 KiB
Python
|
import glob
|
||
|
import os.path
|
||
|
|
||
|
import urwid
|
||
|
|
||
|
|
||
|
class _PathCompleter:
|
||
|
def __init__(self, _testing=False):
|
||
|
"""
|
||
|
_testing: disables reloading of the lookup table to make testing
|
||
|
possible.
|
||
|
"""
|
||
|
self.lookup, self.offset = None, None
|
||
|
self.final = None
|
||
|
self._testing = _testing
|
||
|
|
||
|
def reset(self):
|
||
|
self.lookup = None
|
||
|
self.offset = -1
|
||
|
|
||
|
def complete(self, txt):
|
||
|
"""
|
||
|
Returns the next completion for txt, or None if there is no
|
||
|
completion.
|
||
|
"""
|
||
|
path = os.path.expanduser(txt)
|
||
|
if not self.lookup:
|
||
|
if not self._testing:
|
||
|
# Lookup is a set of (display value, actual value) tuples.
|
||
|
self.lookup = []
|
||
|
if os.path.isdir(path):
|
||
|
files = glob.glob(os.path.join(path, "*"))
|
||
|
prefix = txt
|
||
|
else:
|
||
|
files = glob.glob(path+"*")
|
||
|
prefix = os.path.dirname(txt)
|
||
|
prefix = prefix or "./"
|
||
|
for f in files:
|
||
|
display = os.path.join(prefix, os.path.basename(f))
|
||
|
if os.path.isdir(f):
|
||
|
display += "/"
|
||
|
self.lookup.append((display, f))
|
||
|
if not self.lookup:
|
||
|
self.final = path
|
||
|
return path
|
||
|
self.lookup.sort()
|
||
|
self.offset = -1
|
||
|
self.lookup.append((txt, txt))
|
||
|
self.offset += 1
|
||
|
if self.offset >= len(self.lookup):
|
||
|
self.offset = 0
|
||
|
ret = self.lookup[self.offset]
|
||
|
self.final = ret[1]
|
||
|
return ret[0]
|
||
|
|
||
|
|
||
|
class PathEdit(urwid.Edit, _PathCompleter):
|
||
|
def __init__(self, *args, **kwargs):
|
||
|
urwid.Edit.__init__(self, *args, **kwargs)
|
||
|
_PathCompleter.__init__(self)
|
||
|
|
||
|
def keypress(self, size, key):
|
||
|
if key == "tab":
|
||
|
comp = self.complete(self.get_edit_text())
|
||
|
self.set_edit_text(comp)
|
||
|
self.set_edit_pos(len(comp))
|
||
|
else:
|
||
|
self.reset()
|
||
|
return urwid.Edit.keypress(self, size, key)
|