First functional user interface
This commit is contained in:
134
src/mainUI.py
Normal file
134
src/mainUI.py
Normal file
@@ -0,0 +1,134 @@
|
||||
from __future__ import print_function
|
||||
import urwid
|
||||
import popup
|
||||
import editorUI
|
||||
import os
|
||||
from uuid import uuid4
|
||||
import sys
|
||||
import time
|
||||
import datetime
|
||||
|
||||
# See https://stackoverflow.com/questions/5574702/how-to-print-to-stderr-in-python
|
||||
def eprint(*args, **kwargs):
|
||||
print(*args, file=sys.stderr, **kwargs)
|
||||
|
||||
|
||||
|
||||
class MainUI(object):
|
||||
|
||||
|
||||
def main_menu(self):
|
||||
choices = ("Open Note", "Quick Note", "About", "Exit")
|
||||
mainpd = urwid.Padding(self.menu("Main Menu", choices, self.main_menu_item_chosen), left=1, right=1)
|
||||
top = urwid.Overlay(mainpd, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
|
||||
align='center', width=('relative', 60),
|
||||
valign='middle', height=('relative', 60),
|
||||
min_width=20, min_height=9)
|
||||
|
||||
main_frame = urwid.Frame(top, header = self.header)
|
||||
self.mainloop.widget = main_frame
|
||||
|
||||
|
||||
def menu(self, title, choices, callback):
|
||||
body = [ urwid.Text(title, align = "center"), urwid.Divider()]
|
||||
for c in choices:
|
||||
button = urwid.Button(c)
|
||||
urwid.connect_signal(button, 'click', callback, c)
|
||||
body.append(urwid.AttrMap(button, None, focus_map='reversed'))
|
||||
body.append(urwid.Text("------"))
|
||||
return urwid.ListBox(urwid.SimpleFocusListWalker(body))
|
||||
|
||||
def file_menu(self, path, preview = True):
|
||||
choices = list()
|
||||
file_list = list()
|
||||
file_path_lookup = dict()
|
||||
|
||||
# How long each entry should be at most, before we cut its tail off
|
||||
max_len = 50
|
||||
|
||||
for filename in os.listdir(path):
|
||||
fullpath = path + "/" + filename
|
||||
file_list.append(filename)
|
||||
file_path_lookup[filename] = fullpath
|
||||
with open(fullpath, "r") as fhandle:
|
||||
|
||||
# Get creation time
|
||||
appendstring = str(datetime.datetime.strptime(time.ctime(os.path.getctime(fullpath)), "%a %b %d %H:%M:%S %Y")) + "\n"
|
||||
if preview:
|
||||
line = fhandle.readline()
|
||||
line = line.rstrip()
|
||||
if len(line) > max_len:
|
||||
line = line[:(max_len - 3)]
|
||||
line += "..."
|
||||
appendstring += line + "\n("
|
||||
|
||||
appendstring += filename
|
||||
|
||||
if preview:
|
||||
appendstring += ")"
|
||||
|
||||
choices.append(appendstring)
|
||||
self.file_list = file_list
|
||||
self.file_path_lookup = file_path_lookup
|
||||
|
||||
mainpd = urwid.Padding(self.menu("Select a file\n" + path, choices, self.file_menu_item_chosen), left=1, right=1)
|
||||
top = urwid.Overlay(mainpd, urwid.SolidFill(u'\N{MEDIUM SHADE}'),
|
||||
align='center', width=('relative', 60),
|
||||
valign='middle', height=('relative', 60),
|
||||
min_width=20, min_height=100)
|
||||
|
||||
main_frame = urwid.Frame(top, header = self.header)
|
||||
self.mainloop.widget = main_frame
|
||||
|
||||
def file_menu_item_chosen(self, button, choice):
|
||||
for filename in self.file_list:
|
||||
if filename in choice:
|
||||
eprint("TRUE")
|
||||
editorUI.EditorUI(self.file_path_lookup[filename]).open(self.mainloop, callback = self.open)
|
||||
|
||||
def main_menu_item_chosen(self, button, choice):
|
||||
self.choice = choice
|
||||
|
||||
if choice == "Open Note":
|
||||
self.file_menu(self.default_dir + "quicknotes")
|
||||
|
||||
if choice == "Quick Note":
|
||||
editorUI.EditorUI(self.default_dir + "quicknotes/" + str(uuid4()) + ".txt").open(self.mainloop, callback = self.open)
|
||||
|
||||
if choice == "Exit":
|
||||
self.exit_program()
|
||||
|
||||
|
||||
def exit_program(self):
|
||||
raise urwid.ExitMainLoop()
|
||||
|
||||
|
||||
def keypress_handler(self, key):
|
||||
|
||||
if key == "esc":
|
||||
self.main_menu()
|
||||
|
||||
def __init__ (self):
|
||||
eprint("Initialized.")
|
||||
bt = urwid.AttrWrap(urwid.BigText("Notology.", urwid.font.HalfBlock5x4Font()), "standard")
|
||||
bt = urwid.Padding(bt, "center", width = "clip")
|
||||
bt = urwid.AttrWrap(urwid.Filler(bt, "bottom"), "standard")
|
||||
bt = urwid.BoxAdapter(bt, height = 5)
|
||||
self.header = bt
|
||||
|
||||
self.default_dir = os.path.expanduser("~") + "/.notology/"
|
||||
def open(self, loop = None):
|
||||
fresh = False
|
||||
if loop == None:
|
||||
fresh = True
|
||||
self.mainloop = urwid.MainLoop(None)
|
||||
else:
|
||||
self.mainloop = loop
|
||||
|
||||
#self.mainloop = urwid.MainLoop(self.main_frame, palette=[('reversed', 'standout', '')])
|
||||
self.mainloop.screen.register_palette([("reversed", "standout", ""),
|
||||
("standard", "black", "dark blue")])
|
||||
self.mainloop.unhandled_input = self.keypress_handler
|
||||
self.main_menu()
|
||||
if fresh:
|
||||
self.mainloop.run()
|
||||
Reference in New Issue
Block a user