Add a ListWin to cui to show scrollabled lists

Author: Paul Redmond <paul.redmond@intel.com>
llvm-svn: 192765
This commit is contained in:
Ben Langmuir 2013-10-16 02:00:21 +00:00
parent 0018a59d01
commit ac20991f1d
4 changed files with 102 additions and 22 deletions

View File

@ -11,27 +11,40 @@ import cui
import curses
import lldb, lldbutil
class BreakWin(cui.TitledWin):
class BreakWin(cui.ListWin):
def __init__(self, driver, x, y, w, h):
super(BreakWin, self).__init__(x, y, w, h, 'Breakpoints')
self.win.scrollok(1)
super(BreakWin, self).draw()
super(BreakWin, self).__init__(x, y, w, h)
self.driver = driver
self.update()
def handleEvent(self, event):
if isinstance(event, lldb.SBEvent):
if lldb.SBBreakpoint.EventIsBreakpointEvent(event):
self.update()
if isinstance(event, int):
if event == ord('d'):
self.deleteSelected()
super(BreakWin, self).handleEvent(event)
def deleteSelected(self):
if self.getSelected() == -1:
return
target = self.driver.getTarget()
if not target.IsValid():
return
bp = target.GetBreakpointAtIndex(self.getSelected())
target.BreakpointDelete(bp.id)
def update(self):
target = self.driver.getTarget()
if not target.IsValid():
return
self.win.addstr(0, 0, '')
selected = self.getSelected()
self.clearItems()
for i in range(0, target.GetNumBreakpoints()):
bp = target.GetBreakpointAtIndex(i)
if bp.IsInternal():
continue
text = lldbutil.get_description(bp)
self.win.addstr(text)
self.win.addstr('\n')
self.addItem(text)
self.setSelected(selected)

View File

@ -72,6 +72,65 @@ class TitledWin(CursesWin):
self.title_win.draw()
self.win.noutrefresh()
class ListWin(CursesWin):
def __init__(self, x, y, w, h):
super(ListWin, self).__init__(x, y, w, h)
self.items = []
self.selected = 0
self.first_drawn = 0
def draw(self):
h, w = self.win.getmaxyx()
if self.selected < self.first_drawn:
self.first_drawn = self.selected
if self.selected >= self.first_drawn + h:
self.first_drawn = self.selected - h + 1
self.win.clear()
begin = self.first_drawn
end = begin + h
for i, item in enumerate(self.items[begin:end]):
text = item
if i + begin == self.selected:
attr = curses.A_REVERSE
text = '{0:{width}}'.format(text, width=w-1)
else:
attr = curses.A_NORMAL
self.win.addstr(i, 0, text, attr)
self.win.noutrefresh()
def getSelected(self):
if self.items:
return self.selected
return -1
def setSelected(self, selected):
self.selected = selected
if self.selected < 0:
self.selected = 0
elif self.selected >= len(self.items):
self.selected = len(self.items) - 1
def handleEvent(self, event):
if isinstance(event, int):
if len(self.items) > 0:
if event == curses.KEY_UP:
self.setSelected(self.selected - 1)
if event == curses.KEY_DOWN:
self.setSelected(self.selected + 1)
if event == curses.ascii.NL:
self.handleSelect(self.selected)
def addItem(self, item):
self.items.append(item)
def clearItems(self):
self.items = []
def handleSelect(self, index):
return
class InputHandler(threading.Thread):
def __init__(self, screen, queue):
super(InputHandler, self).__init__()

View File

@ -31,28 +31,33 @@ class SandboxUI(cui.CursesUI):
h2 = height / 2
self.wins = []
#self.wins.append(cui.TitledWin(w2, h2, w2, h2, "Test Window 4"))
list_win = cui.ListWin(w2, h2, w2, h2)
for i in range(0, 40):
list_win.addItem('Item %s' % i)
self.wins.append(list_win)
self.wins.append(cui.TitledWin( 0, 0, w2, h2, "Test Window 1"))
self.wins.append(cui.TitledWin(w2, 0, w2, h2, "Test Window 2"))
self.wins.append(cui.TitledWin( 0, h2, w2, h2, "Test Window 3"))
self.wins.append(cui.TitledWin(w2, h2, w2, h2, "Test Window 4"))
def callback(s, content):
self.wins[0].win.scroll(1)
self.wins[0].win.addstr(10, 0, '%s: %s' % (s, content))
self.wins[0].win.scroll(1)
self.el.showPrompt(10, 0)
#def callback(s, content):
# self.wins[0].win.scroll(1)
# self.wins[0].win.addstr(10, 0, '%s: %s' % (s, content))
# self.wins[0].win.scroll(1)
# self.el.showPrompt(10, 0)
self.wins[0].win.scrollok(1)
self.el = cui.CursesEditLine(self.wins[0].win, None,
lambda c: callback('got', c), lambda c: callback('tab', c))
self.el.prompt = '>>> '
self.el.showPrompt(10, 0)
#self.wins[0].win.scrollok(1)
#self.el = cui.CursesEditLine(self.wins[0].win, None,
# lambda c: callback('got', c), lambda c: callback('tab', c))
#self.el.prompt = '>>> '
#self.el.showPrompt(10, 0)
def handleEvent(self, event):
if isinstance(event, int):
if event == ord('q'):
sys.exit(0)
self.el.handleEvent(event)
#self.el.handleEvent(event)
super(SandboxUI, self).handleEvent(event)
def main(screen):
global event_queue

View File

@ -18,10 +18,13 @@ class StatusWin(cui.TextWin):
self.keys = [#('F1', 'Help', curses.KEY_F1),
('F3', 'Cycle-focus', curses.KEY_F3),
('F10', 'Quit', curses.KEY_F10)]
text = ''
def draw(self):
self.win.addstr(0, 0, '')
for key in self.keys:
text = text + '{0} {1} '.format(key[0], key[1])
self.setText(text)
self.win.addstr('{0}'.format(key[0]), curses.A_REVERSE)
self.win.addstr(' {0} '.format(key[1]), curses.A_NORMAL)
super(StatusWin, self).draw()
def handleEvent(self, event):
if isinstance(event, int):