Created
February 13, 2014 23:51
-
-
Save andresmrm/8986457 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import urwid | |
import string | |
import os | |
from os import walk, getcwd, chdir, listdir | |
from os.path import join, getsize, getmtime, islink, isdir, dirname | |
import pickle | |
class Index(object): | |
def __init__(self): | |
self.update() | |
def get_items(self, filter=''): | |
# Unfinished | |
'locate -d index' | |
def update(self): | |
os.system('updatedb -l 0 -o index -U /') | |
class ButtonClean(urwid.Button): | |
button_left = urwid.Text("") | |
button_right = urwid.Text("") | |
class EditSearch(urwid.Edit): | |
def keypress(self, size, key): | |
unhandled = urwid.Edit.keypress(self, size, key) | |
if unhandled: | |
if key in ('enter'): | |
self.main.select_first() | |
if key in ('tab'): | |
self.main.select_first(False) | |
if key in (''): | |
self.main.select_first(False) | |
return unhandled | |
class Traveler(object): | |
def __init__(self, dir): | |
self.cwd = dir | |
self.searching = False | |
self.navigating = False | |
self.show_hidden = False | |
#self.main = urwid.Padding(self.dir_listing(self.cwd), left=2, right=2) | |
#top = urwid.Overlay(main, urwid.SolidFill('\N{MEDIUM SHADE}'), | |
# align='center', width=('relative', 40), | |
# valign='middle', height=('relative', 40), | |
# min_width=20, min_height=9) | |
self.text_cwd = urwid.Text(self.cwd) | |
self.text_msg = urwid.Text('') | |
self.list = urwid.SimpleFocusListWalker([self.text_cwd]) | |
self.list_box = urwid.ListBox(self.list) | |
self.pile = urwid.Pile([ | |
(1, urwid.Filler(self.text_cwd)), | |
(1, urwid.Filler(self.text_msg)), | |
(1, urwid.Filler(urwid.Divider("'"))), | |
self.list_box | |
]) | |
self.edit_search = EditSearch() | |
self.edit_search.main = self | |
urwid.connect_signal(self.edit_search, 'change', self.update_listing) | |
self.box_search = urwid.LineBox(self.edit_search) | |
self.hot_items = {} | |
#self.index = Index() | |
#self.set_msg(len(self.index.get_items())) | |
palette = [ | |
('reversed', 'standout', '', 'bold'), | |
('bold', 'default,bold', 'default', 'bold'), | |
('reversed-bold', 'standout,bold', '', 'bold'), | |
] | |
self.main = urwid.MainLoop( | |
self.dir_listing(self.cwd), | |
palette=palette, | |
unhandled_input=self.hotkeys | |
) | |
self.main.run() | |
def select_first(self, end_search=True): | |
try: | |
button = self.hot_items['a'] | |
urwid.emit_signal(button, 'click', button) | |
except: | |
pass | |
if end_search: | |
self.stop_search() | |
else: | |
self.edit_search.set_edit_text('') | |
def set_msg(self, msg): | |
self.text_msg.set_text(msg) | |
def generate_symbols(self): | |
return [i for i in string.ascii_letters + string.digits] | |
#self.symbols = string.punctuation | |
#self.symbols = string.printable | |
def hotkeys(self, key): | |
#self.text_cwd.set_text(key) | |
hot_item = self.hot_items.get(key) | |
if hot_item and self.navigating: | |
urwid.emit_signal(hot_item, 'click', hot_item) | |
elif key in ('meta up', '.'): | |
self.walk_parent_dir() | |
elif key in ('meta h',): | |
self.toggle_hidden() | |
elif key in ('/',): | |
self.start_search() | |
elif key in ('u',): | |
self.update_listing() | |
elif key in ('n',): | |
self.navigating = True | |
elif key in ('esc',): | |
self.stop_search() | |
self.navigating = False | |
elif key in ('~','q'): | |
raise urwid.ExitMainLoop() | |
def start_search(self): | |
self.edit_search.set_edit_text('') | |
self.searching = True | |
self.update_listing() | |
def stop_search(self): | |
self.searching = False | |
self.update_listing() | |
def toggle_hidden(self): | |
self.show_hidden = not self.show_hidden | |
self.update_listing() | |
def change_cwd(self, dir): | |
try: | |
chdir(dir) | |
self.cwd = dir | |
self.text_cwd.set_text(self.cwd) | |
except PermissionError: | |
self.show_error("Permission Error: %s" % dir) | |
def show_error(self, msg): | |
self.set_msg(msg) | |
def walk_parent_dir(self): | |
parent_dir = dirname(self.cwd) | |
self.change_cwd(parent_dir) | |
self.update_listing(filter=self.edit_search.get_edit_text()) | |
def update_listing(self, a=None, filter=''): | |
self.main.widget = self.dir_listing(self.cwd, filter) | |
def dir_listing(self, dir, filter=''): | |
self.list.clear() | |
if self.searching: | |
self.list.append(self.box_search) | |
items = [i for i in listdir() if i.find(filter) != -1] | |
else: | |
items = listdir() | |
dirs, files = [], [] | |
for item in items: | |
if (item[0] != '.' and item[-1] != '~') or self.show_hidden: | |
if isdir(item): | |
dirs.append(item) | |
else: | |
files.append(item) | |
dirs.sort() | |
files.sort() | |
symbols = self.generate_symbols() | |
self.hot_items = {} | |
for i in dirs: | |
button = ButtonClean(i) | |
urwid.connect_signal(button, 'click', self.dir_chosen) | |
b = urwid.AttrMap(button, 'bold', focus_map='reversed-bold') | |
if symbols: | |
s = symbols.pop(0) | |
self.hot_items[s] = button | |
t = urwid.Text(s) | |
else: | |
t = urwid.Text('-') | |
self.list.append(urwid.Columns([(2, t), b ])) | |
for i in files: | |
button = ButtonClean(i) | |
urwid.connect_signal(button, 'click', self.file_chosen) | |
b = urwid.AttrMap(button, None, focus_map='reversed') | |
if symbols: | |
s = symbols.pop(0) | |
self.hot_items[s] = button | |
t = urwid.Text(s) | |
else: | |
t = urwid.Text('-') | |
self.list.append(urwid.Columns([(2, t), b ])) | |
return self.pile | |
#return urwid.Filler(urwid.GridFlow(body, 10, 1, 1, 'left')) | |
def dir_chosen(self, button): | |
dir_path = join(self.cwd, button.get_label()) | |
self.change_cwd(dir_path) | |
self.update_listing() | |
def file_chosen(self, button): | |
file_path = join(self.cwd, button.get_label()) | |
os.system("xdg-open '%s' &" % file_path) | |
t = Traveler(getcwd()) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment