diff options
-rw-r--r-- | code/directory.py | 33 | ||||
-rw-r--r-- | code/environment.py | 16 | ||||
-rw-r--r-- | code/fm.py | 36 | ||||
-rw-r--r-- | code/ui.py | 39 | ||||
-rw-r--r-- | ranger | 16 |
5 files changed, 120 insertions, 20 deletions
diff --git a/code/directory.py b/code/directory.py new file mode 100644 index 00000000..4cb9fd72 --- /dev/null +++ b/code/directory.py @@ -0,0 +1,33 @@ + +class Directory(): + def __init__(self, path): + self.path = path + self.files_loaded = False + self.scheduled = False + self.files = None + self.mtime = None + self.exists = True + + def load_files(self): + import os + try: + self.files = os.listdir(self.path) + self.exists = True + except OSError: + self.files = [] + self.exists = False + self.files_loaded = True + + def __len__(self): + return len(self.files) + + def __getitem__(self, key): + return self.files[key] + +if __name__ == '__main__': + d = Directory('.') + d.load_files() + print(d.files) + print(d[1]) + + diff --git a/code/environment.py b/code/environment.py new file mode 100644 index 00000000..d0ff5763 --- /dev/null +++ b/code/environment.py @@ -0,0 +1,16 @@ +class Vector(): + def __init__(self, x, y): + self.x = x + self.y = y + +class Environment(): + # A collection of data which is relevant for more than + # one class. + def __init__(self): + self.path = None + self.directories = {} + self.pwd = None # current directory + self.cf = None # current file + self.keybuffer = '' + self.copy = None + self.termsize = Vector(80, 24) diff --git a/code/fm.py b/code/fm.py index 76316a9d..8029d915 100644 --- a/code/fm.py +++ b/code/fm.py @@ -1,38 +1,52 @@ -import time import sys -from code import ui, debug +import ui, debug, directory class FM(): - def __init__(self, options): - self.singleton = None + def __init__(self, options, environment): self.options = options - self.ui = ui.UI() + self.env = environment + + def setup(self, path, ui): + self.ui = ui + self.enter_dir(path) + + def enter_dir(self, path): + self.env.path = path + try: + self.pwd = self.env.directories[path] + except KeyError: + self.env.pwd = directory.Directory(path) + self.env.directories[path] = self.env.pwd + + self.env.pwd.load_files() + if len(self.env.pwd) > 0: self.env.cf = self.env.pwd[0] def run(self): try: while 1: try: + self.ui.feed(self.env.directories, self.env.pwd, self.env.cf, self.env.termsize) self.ui.draw() except KeyboardInterrupt: self.interrupt() except: - debug.log(sys.exc_info()[1]) + raise try: - key = None -# key = curses.getch() -# curses.flushinp() + key = self.ui.get_next_key() self.press(key) except KeyboardInterrupt: self.interrupt() except: + self.ui.exit() raise - pass def press(self, key): - pass + if (key == ord('q')): + raise SystemExit() def interrupt(self): + import time self.buffer = "" time.sleep(0.2) diff --git a/code/ui.py b/code/ui.py index 0e48a68a..7d8fd828 100644 --- a/code/ui.py +++ b/code/ui.py @@ -1,4 +1,41 @@ +import curses class UI(): + def __init__(self, options): + self.scr = curses.initscr() + self.scr.leaveok(1) + curses.noecho() + curses.halfdelay(3) + + self.options = options + self.directories = None + self.pwd = None + self.cf = None + self.termsize = None + self.rows = 0 + self.cols = 0 + + def feed(self, directories, pwd, cf, termsize): + self.directories = directories + self.pwd = pwd + self.cf = cf + self.termsize = termsize + self.cols = termsize.x + self.rows = termsize.y + + def exit(self): + curses.nocbreak() + curses.echo() + curses.endwin() + def draw(self): import time - time.sleep(0.1) + self.scr.erase() + for i in range(1, len(self.pwd)): + self.scr.addstr(i, 0, self.pwd[i]) + self.scr.refresh() + + def get_next_key(self): + key = self.scr.getch() + curses.flushinp() + return key + diff --git a/ranger b/ranger index 585108b8..175b9803 100644 --- a/ranger +++ b/ranger @@ -3,10 +3,7 @@ # TODO: cd after exit -from code import debug -from code import fm -from code import ui -from code import options +from code import debug, fm, ui, options, environment # TODO: find out the real name of this script and include files relative to here @@ -16,14 +13,17 @@ from code import options # TODO: initialize classes -# TODO: run main loop - def main(): import locale locale.setlocale(locale.LC_ALL, 'en_US.utf8') - fm.singleton = fm.FM(options.get()) - fm.singleton.run() + path = '.' + opt = options.get() + env = environment.Environment() + + my_fm = fm.FM(opt, env) + my_fm.setup(path, ui.UI(opt)) + my_fm.run() if __name__ == "__main__": main() |