[Lldb-commits] [lldb] r250478 - More general fixes to the tree view and BoxedPanel.
Greg Clayton via lldb-commits
lldb-commits at lists.llvm.org
Thu Oct 15 17:34:18 PDT 2015
Author: gclayton
Date: Thu Oct 15 19:34:18 2015
New Revision: 250478
URL: http://llvm.org/viewvc/llvm-project?rev=250478&view=rev
Log:
More general fixes to the tree view and BoxedPanel.
Modified:
lldb/trunk/test/lldbcurses.py
Modified: lldb/trunk/test/lldbcurses.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/lldbcurses.py?rev=250478&r1=250477&r2=250478&view=diff
==============================================================================
--- lldb/trunk/test/lldbcurses.py (original)
+++ lldb/trunk/test/lldbcurses.py Thu Oct 15 19:34:18 2015
@@ -12,6 +12,12 @@ class Point(object):
def __str__(self):
return "(x=%u, y=%u)" % (self.x, self.y)
+
+ def __eq__(self, rhs):
+ return self.x == rhs.x and self.y == rhs.y
+
+ def __ne__(self, rhs):
+ return self.x != rhs.x or self.y != rhs.y
def is_valid_coordinate(self):
return self.x >= 0 and self.y >= 0
@@ -27,6 +33,12 @@ class Size(object):
def __str__(self):
return "(w=%u, h=%u)" % (self.w, self.h)
+ def __eq__(self, rhs):
+ return self.w == rhs.w and self.h == rhs.h
+
+ def __ne__(self, rhs):
+ return self.w != rhs.w or self.h != rhs.h
+
class Rect(object):
def __init__(self, x=0, y=0, w=0, h=0):
self.origin = Point(x, y)
@@ -57,6 +69,12 @@ class Rect(object):
return pt.y >= self.get_min_y()
return False
+ def __eq__(self, rhs):
+ return self.origin == rhs.origin and self.size == rhs.size
+
+ def __ne__(self, rhs):
+ return self.origin != rhs.origin or self.size != rhs.size
+
class QuitException(Exception):
def __init__(self):
super(QuitException, self).__init__('QuitException')
@@ -74,7 +92,47 @@ class Window(object):
def add_child(self, window):
self.children.append(window)
window.parent = self
+
+ def resize(self, size):
+ self.window.resize(size.h, size.w)
+ def resize_child(self, child, delta_size, adjust_neighbors):
+ if child in self.children:
+ frame = self.get_frame()
+ orig_frame = child.get_frame()
+ new_frame = Rect(x=orig_frame.origin.x, y=orig_frame.origin.y, w=orig_frame.size.w + delta_size.w, h=orig_frame.size.h + delta_size.h)
+ old_child_max_x = orig_frame.get_max_x()
+ new_child_max_x = new_frame.get_max_x()
+ window_max_x = frame.get_max_x()
+ if new_child_max_x < window_max_x:
+ child.resize(new_frame.size)
+ if old_child_max_x == window_max_x:
+ new_frame.origin.x += window_max_x - new_child_max_x
+ child.set_position(new_frame.origin)
+ elif new_child_max_x > window_max_x:
+ new_frame.origin.x -= new_child_max_x - window_max_x
+ child.set_position(new_frame.origin)
+ child.resize(new_frame.size)
+
+ if adjust_neighbors:
+ #print 'orig_frame = %s\r\n' % (str(orig_frame)),
+ for curr_child in self.children:
+ if curr_child is child:
+ continue
+ curr_child_frame = curr_child.get_frame()
+ if delta_size.w != 0:
+ #print 'curr_child_frame = %s\r\n' % (str(curr_child_frame)),
+ if curr_child_frame.get_min_x() == orig_frame.get_max_x():
+ curr_child_frame.origin.x += delta_size.w
+ curr_child_frame.size.w -= delta_size.w
+ #print 'adjusted curr_child_frame = %s\r\n' % (str(curr_child_frame)),
+ curr_child.resize (curr_child_frame.size)
+ curr_child.slide_position (Size(w=delta_size.w, h=0))
+ elif curr_child_frame.get_max_x() == orig_frame.get_min_x():
+ curr_child_frame.size.w -= delta_size.w
+ #print 'adjusted curr_child_frame = %s\r\n' % (str(curr_child_frame)),
+ curr_child.resize (curr_child_frame.size)
+
def add_key_action(self, arg, callback, decription):
if isinstance(arg, list):
for key in arg:
@@ -270,6 +328,15 @@ class Window(object):
size = self.get_size()
return Rect(x=position.x, y=position.y, w=size.w, h=size.h)
+ def get_frame_in_parent(self):
+ position = self.get_position_in_parent()
+ size = self.get_size()
+ return Rect(x=position.x, y=position.y, w=size.w, h=size.h)
+
+ def get_position_in_parent(self):
+ (y, x) = self.window.getparyx()
+ return Point(x, y)
+
def get_position(self):
(y, x) = self.window.getbegyx()
return Point(x, y)
@@ -349,6 +416,16 @@ class Window(object):
done = False
while not done and n > 0:
c = self.window.getch()
+ if c == 27:
+ self.timeout(0)
+ escape_key = 0
+ while True:
+ escape_key = self.window.getch()
+ if escape_key == -1:
+ break
+ else:
+ c = c << 8 | escape_key
+ self.timeout(timeout_msec)
if c != -1:
try:
self.handle_key(c)
@@ -377,10 +454,10 @@ class Panel(Window):
def set_position(self, pt):
self.panel.move(pt.y, pt.x)
- def slide_position(self, pt):
+ def slide_position(self, size):
new_position = self.get_position()
- new_position.x = new_position.x + pt.x
- new_position.y = new_position.y + pt.y
+ new_position.x = new_position.x + size.w
+ new_position.y = new_position.y + size.h
self.set_position(new_position)
class BoxedPanel(Panel):
@@ -394,6 +471,8 @@ class BoxedPanel(Panel):
self.add_key_action(curses.KEY_DOWN, self.select_next, "Select the next item")
self.add_key_action(curses.KEY_HOME, self.scroll_begin, "Go to the beginning of the list")
self.add_key_action(curses.KEY_END, self.scroll_end, "Go to the end of the list")
+ self.add_key_action(0x1b4f48, self.scroll_begin, "Go to the beginning of the list")
+ self.add_key_action(0x1b4f46, self.scroll_end, "Go to the end of the list")
self.add_key_action(curses.KEY_PPAGE, self.scroll_page_backward, "Scroll to previous page")
self.add_key_action(curses.KEY_NPAGE, self.scroll_page_forward, "Scroll to next forward")
self.update()
@@ -436,6 +515,14 @@ class BoxedPanel(Panel):
if update:
self.update()
+ def scroll_to_line (self, idx):
+ if idx < len(self.lines):
+ self.selected_idx = idx
+ max_visible_lines = self.get_usable_height()
+ if idx < self.first_visible_idx or idx >= self.first_visible_idx + max_visible_lines:
+ self.first_visible_idx = idx
+ self.refresh()
+
def scroll_begin (self):
self.first_visible_idx = 0
if len(self.lines) > 0:
@@ -521,12 +608,25 @@ class BoxedPanel(Panel):
is_selected = line_idx == self.selected_idx
if is_selected:
self.attron (curses.A_REVERSE)
- self.addnstr_at_point(pt, self.lines[line_idx], max_width)
+ self.move(pt)
+ self.addnstr(self.lines[line_idx], max_width)
if is_selected:
self.attroff (curses.A_REVERSE)
else:
return
+ def load_file(self, path):
+ f = open(path)
+ if f:
+ self.lines = f.read().splitlines()
+ for (idx, line) in enumerate(self.lines):
+ # Remove any tabs from lines since they hose up the display
+ if "\t" in line:
+ self.lines[idx] = (8*' ').join(line.split('\t'))
+ self.selected_idx = 0
+ self.first_visible_idx = 0
+ self.refresh()
+
class Item(object):
def __init__(self, title, action):
self.title = title
@@ -549,6 +649,9 @@ class TreeItemDelegate(object):
def draw_item(self, tree_window, item):
self.draw_item_string(tree_window, item, item.title)
+
+ def do_action(self):
+ pass
class TreeItem(object):
def __init__(self, delegate, parent = None, title = None, action = None, is_expanded = False):
@@ -608,8 +711,9 @@ class TreeItem(object):
rows = 1
if self.is_expanded:
children = self.get_children()
- for child in children:
- rows += child.get_num_visible_rows()
+ if children:
+ for child in children:
+ rows += child.get_num_visible_rows()
return rows
def draw(self, tree_window, row):
display_row = tree_window.get_display_row(row)
@@ -621,8 +725,12 @@ class TreeItem(object):
tree_window.addch (curses.ACS_DIAMOND)
tree_window.addch (curses.ACS_HLINE)
elif self.parent and self.parent.children_might_have_children():
- tree_window.addch (curses.ACS_HLINE)
- tree_window.addch (curses.ACS_HLINE)
+ if self.parent.parent:
+ tree_window.addch (curses.ACS_HLINE)
+ tree_window.addch (curses.ACS_HLINE)
+ else:
+ tree_window.addch (' ')
+ tree_window.addch (' ')
is_selected = tree_window.is_selected(row)
if is_selected:
tree_window.attron (curses.A_REVERSE)
@@ -650,8 +758,8 @@ class TreeItem(object):
tree_window.addch (curses.ACS_VLINE)
tree_window.addch (' ')
- def was_selected(self):
- pass
+ def was_selected(self):
+ self.delegate.do_action()
class TreePanel(Panel):
def __init__(self, frame, title, root_item):
@@ -665,8 +773,10 @@ class TreePanel(Panel):
self.add_key_action(curses.KEY_DOWN, self.select_next, "Select the next item")
self.add_key_action(curses.KEY_RIGHT,self.right_arrow, "Expand an item")
self.add_key_action(curses.KEY_LEFT, self.left_arrow, "Unexpand an item or navigate to parent")
- self.add_key_action(curses.KEY_HOME, self.scroll_begin, "Go to the beginning of the list")
- self.add_key_action(curses.KEY_END, self.scroll_end, "Go to the end of the list")
+ self.add_key_action(curses.KEY_HOME, self.scroll_begin, "Go to the beginning of the tree")
+ self.add_key_action(curses.KEY_END, self.scroll_end, "Go to the end of the tree")
+ self.add_key_action(0x1b4f48, self.scroll_begin, "Go to the beginning of the tree")
+ self.add_key_action(0x1b4f46, self.scroll_end, "Go to the end of the tree")
self.add_key_action(curses.KEY_PPAGE, self.scroll_page_backward, "Scroll to previous page")
self.add_key_action(curses.KEY_NPAGE, self.scroll_page_forward, "Scroll to next forward")
@@ -717,12 +827,9 @@ class TreePanel(Panel):
def is_selected(self, row):
return row == self.selected_idx
- def get_num_lines(self):
- rows = 0
- children = self.root_item.get_children()
- for child in children:
- rows += child.get_num_visible_rows()
- return rows
+ def get_num_lines(self):
+ self.get_visible_items()
+ return len(self.items)
def get_num_visible_lines(self):
return self.get_size().h-2
@@ -730,7 +837,8 @@ class TreePanel(Panel):
self.selected_idx += 1
num_lines = self.get_num_lines()
if self.selected_idx >= num_lines:
- self.selected_idx = num_lines - 1
+ self.selected_idx = num_lines - 1
+ self._selection_changed()
self.refresh()
def select_prev (self):
@@ -741,6 +849,7 @@ class TreePanel(Panel):
self.selected_idx = 0
else:
self.selected_idx = -1
+ self._selection_changed()
self.refresh()
def scroll_begin (self):
@@ -750,7 +859,7 @@ class TreePanel(Panel):
self.selected_idx = 0
else:
self.selected_idx = -1
- self.update()
+ self.refresh()
def redisplay_tree(self):
self.items = None
@@ -775,35 +884,45 @@ class TreePanel(Panel):
def scroll_end (self):
num_visible_lines = self.get_num_visible_lines()
- num_lines = len(self.lines)
+ num_lines = self.get_num_lines()
if num_lines > num_visible_lines:
self.first_visible_idx = num_lines - num_visible_lines
else:
self.first_visible_idx = 0
self.selected_idx = num_lines-1
- self.update()
+ self.refresh()
def scroll_page_backward(self):
num_visible_lines = self.get_num_visible_lines()
- new_index = self.first_visible_idx - num_visible_lines
+ new_index = self.selected_idx - num_visible_lines
if new_index < 0:
- self.first_visible_idx = 0
+ self.selected_idx = 0
else:
- self.first_visible_idx = new_index
+ self.selected_idx = new_index
+ self._selection_changed()
self.refresh()
def scroll_page_forward(self):
+ num_lines = self.get_num_lines()
num_visible_lines = self.get_num_visible_lines()
- self.first_visible_idx += num_visible_lines
- self._adjust_first_visible_line()
+ new_index = self.selected_idx + num_visible_lines
+ if new_index >= num_lines:
+ new_index = num_lines - 1
+ self.selected_idx = new_index
+ self._selection_changed()
self.refresh()
- def _adjust_first_visible_line(self):
- num_lines = len(self.lines)
+ def _selection_changed(self):
+ num_lines = self.get_num_lines()
num_visible_lines = self.get_num_visible_lines()
- if (self.first_visible_idx >= num_lines) or (num_lines - self.first_visible_idx) > num_visible_lines:
- self.first_visible_idx = num_lines - num_visible_lines
-
+ last_visible_index = self.first_visible_idx + num_visible_lines
+ if self.selected_idx >= last_visible_index:
+ self.first_visible_idx += (self.selected_idx - last_visible_index + 1)
+ if self.selected_idx < self.first_visible_idx:
+ self.first_visible_idx = self.selected_idx
+ if self.selected_idx >= 0 and self.selected_idx < len(self.items):
+ item = self.items[self.selected_idx]
+ item.was_selected()
class Menu(BoxedPanel):
More information about the lldb-commits
mailing list