Skip to content

Instantly share code, notes, and snippets.

@andresmrm
Created February 13, 2014 23:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save andresmrm/8986457 to your computer and use it in GitHub Desktop.
Save andresmrm/8986457 to your computer and use it in GitHub Desktop.
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