consoleui/windows.py

117 lines
3.1 KiB
Python

import curses
import os
import sys
import consoleui
import consoleui.events
class OpenFileDialog(consoleui.Window):
def __init__(self, *args, **kwargs):
super(OpenFileDialog, self).__init__(*args, **kwargs)
self.callback = kwargs['callback']
self.start = kwargs.get('start')
self.parent = consoleui.root_window
self.cwindow = self.parent.centered_subwindow(window=self)
self.cwindow.keypad(1)
self.cwd = self.start or os.getcwd()
self.listing = os.listdir(self.cwd)
self.selected = 0
self.offset = 0
self.current_max = 0
self.more = False
self.last_listing = []
self.page_adjust = 5
def keyhandler(self, key):
if key == curses.KEY_DOWN and self.selected < len(self.last_listing):
self.selected = self.selected + 1
self.redraw(nofullrefresh=True)
return True
if key == curses.KEY_UP and self.selected != 0:
self.selected = self.selected - 1
self.redraw(nofullrefresh=True)
return True
if key == curses.KEY_NPAGE and (self.selected + self.page_adjust) < len(self.last_listing):
self.selected = self.selected + self.page_adjust
self.redraw(nofullrefresh=True)
return True
if key == curses.KEY_PPAGE and (self.selected - self.page_adjust) > 0:
self.selected = self.selected - self.page_adjust
self.redraw(nofullrefresh=True)
return True
if key == 10:
listing = self.last_listing
selected = listing[self.selected]
path = '%s%s%s' % (self.cwd, os.path.sep, selected)
if os.path.isdir(path):
self.cwd = path
self.selected = 0
self.redraw(nofullrefresh=True)
return True
else:
self.close()
self.callback(path)
return True
def dir_listing(self):
listing = os.listdir(self.cwd)
listing.sort()
listing.insert(0, '..')
self.last_listing = listing
return self.last_listing
def render(self):
self.cwindow.bkgdset(0, curses.A_REVERSE)
self.box()
self.fill_window(self.cwindow)
self.cwindow.addstr(1, 2, 'OPEN FILE', curses.A_BOLD | curses.A_UNDERLINE)
maxy, maxx = self.cwindow.getmaxyx()
bottom = (maxy - 5)
listing = self.dir_listing()
if self.selected >= bottom - 1:
if self.selected > self.current_max:
if not self.selected == len(listing):
self.offset = len(listing) - bottom
else:
self.offset = self.selected
if self.offset < 0:
self.offset = 0
if self.selected < self.offset:
self.offset = self.selected
trimmed = listing[self.offset:(bottom + self.offset)]
self.current_max = self.selected
self.more = (len(listing) > bottom) and not (len(trimmed) < len(listing[:bottom]))
index = self.selected
if self.selected == len(listing):
index = self.selected - 1
starty, startx = 3, 3
for i in xrange(len(trimmed)):
entry = trimmed[i]
if entry == listing[index]:
self.cwindow.addstr(starty, startx + 1, '>> %s' % entry, curses.A_BOLD)
else:
self.cwindow.addstr(starty, startx, entry)
starty = starty + 1
if self.more:
self.cwindow.addstr(starty, startx, 'more..', curses.A_BOLD | curses.A_UNDERLINE)
def redraw(self, **kwargs):
self.render()
if not kwargs.get('nofullrefresh'):
self.parent.redraw()