[nyx/master] Replace Submenu's get_children() with property

commit 64b5de2ebafbeae7a1a81df7d739832fea0d49ac Author: Damian Johnson <atagar@torproject.org> Date: Tue Aug 23 13:18:32 2016 -0700 Replace Submenu's get_children() with property Like parent, next, prev, and other hierarchical methods making parent an attribute. Might as well get rid of is_empty() too. --- nyx/menu.py | 56 ++++++++++++++++++++++---------------------------------- test/menu.py | 21 +++++++++++++++++++++ 2 files changed, 43 insertions(+), 34 deletions(-) diff --git a/nyx/menu.py b/nyx/menu.py index 40b3495..f086ae7 100644 --- a/nyx/menu.py +++ b/nyx/menu.py @@ -83,7 +83,7 @@ class MenuItem(object): if not self._parent: return None - my_siblings = self._parent.get_children() + my_siblings = self._parent.children try: my_index = my_siblings.index(self) @@ -97,41 +97,29 @@ class MenuItem(object): class Submenu(MenuItem): """ Menu item that lists other menu options. + + :var list children: menu items this contains """ def __init__(self, label): MenuItem.__init__(self, label, None) self.suffix = ' >' - self._children = [] + self.children = [] def add(self, menu_item): """ - Adds the given menu item to our listing. This raises a ValueError if the - item already has a parent. + Adds the given menu item to our listing. + + :param MenuItem menu_item: menu item to be added - Arguments: - menu_item - menu option to be added + :raises: **ValueError** if the item is already in a submenu """ if menu_item.parent: raise ValueError("Menu option '%s' already has a parent" % menu_item) - else: - menu_item._parent = self - self._children.append(menu_item) - - def get_children(self): - """ - Provides the menu and submenus we contain. - """ - - return list(self._children) - - def is_empty(self): - """ - True if we have no children, false otherwise. - """ - return not bool(self._children) + menu_item._parent = self + self.children.append(menu_item) class RadioMenuItem(MenuItem): @@ -470,8 +458,8 @@ class MenuCursor: if key.is_selection(): if is_selection_submenu: - if not self._selection.is_empty(): - self._selection = self._selection.get_children()[0] + if self._selection.children: + self._selection = self._selection.children[0] else: self._selection.select() self._is_done = True @@ -484,7 +472,7 @@ class MenuCursor: # shift to the previous main submenu prev_submenu = self._selection.submenu.prev - self._selection = prev_submenu.get_children()[0] + self._selection = prev_submenu.children[0] else: # go up a submenu level @@ -493,13 +481,13 @@ class MenuCursor: if is_selection_submenu: # open submenu (same as making a selection) - if not self._selection.is_empty(): - self._selection = self._selection.get_children()[0] + if self._selection.children: + self._selection = self._selection.children[0] else: # shift to the next main submenu next_submenu = self._selection.submenu.next - self._selection = next_submenu.get_children()[0] + self._selection = next_submenu.children[0] elif key.match('esc', 'm'): self._is_done = True @@ -510,7 +498,7 @@ def show_menu(): def _render(subwindow): x = 0 - for top_level_item in menu.get_children(): + for top_level_item in menu.children: if top_level_item == cursor.get_selection().submenu: selection_left[0] = x attr = UNDERLINE @@ -526,7 +514,7 @@ def show_menu(): # the file menu menu = make_menu() - cursor = MenuCursor(menu.get_children()[0].get_children()[0]) + cursor = MenuCursor(menu.children[0].children[0]) while not cursor.is_done(): # provide a message saying how to close the menu @@ -564,7 +552,7 @@ def _draw_submenu(cursor, level, top, left): # gets the size of the prefix, middle, and suffix columns - all_label_sets = [(entry.prefix, entry.label, entry.suffix) for entry in submenu.get_children()] + all_label_sets = [(entry.prefix, entry.label, entry.suffix) for entry in submenu.children] prefix_col_size = max([len(entry[0]) for entry in all_label_sets]) middle_col_size = max([len(entry[1]) for entry in all_label_sets]) suffix_col_size = max([len(entry[2]) for entry in all_label_sets]) @@ -573,15 +561,15 @@ def _draw_submenu(cursor, level, top, left): label_format = ' %%-%is%%-%is%%-%is ' % (prefix_col_size, middle_col_size, suffix_col_size) menu_width = len(label_format % ('', '', '')) - selection_top = submenu.get_children().index(selection) if selection in submenu.get_children() else 0 + selection_top = submenu.children.index(selection) if selection in submenu.children else 0 def _render(subwindow): - for y, menu_item in enumerate(submenu.get_children()): + for y, menu_item in enumerate(submenu.children): if menu_item == selection: subwindow.addstr(0, y, label_format % (menu_item.prefix, menu_item.label, menu_item.suffix), WHITE, BOLD) else: subwindow.addstr(0, y, label_format % (menu_item.prefix, menu_item.label, menu_item.suffix)) with nyx.curses.CURSES_LOCK: - nyx.curses.draw(_render, top = top, left = left, width = menu_width, height = len(submenu.get_children()), background = RED) + nyx.curses.draw(_render, top = top, left = left, width = menu_width, height = len(submenu.children), background = RED) _draw_submenu(cursor, level + 1, top + selection_top, left + menu_width) diff --git a/test/menu.py b/test/menu.py index 683b220..f3c0143 100644 --- a/test/menu.py +++ b/test/menu.py @@ -80,6 +80,27 @@ class TestSubmenu(unittest.TestCase): self.assertEqual(None, menu_item.parent) self.assertEqual(menu_item, menu_item.submenu) + def test_add(self): + submenu = Submenu('Menu') + item_1 = MenuItem('Test Item 1', NO_OP) + item_2 = MenuItem('Test Item 2', NO_OP) + + self.assertEqual([], submenu.children) + + submenu.add(item_1) + self.assertEqual([item_1], submenu.children) + + submenu.add(item_2) + self.assertEqual([item_1, item_2], submenu.children) + + def test_add_raises_when_already_in_menu(self): + submenu_1 = Submenu('Menu 1') + submenu_2 = Submenu('Menu 2') + item = MenuItem('Test Item', NO_OP) + + submenu_1.add(item) + self.assertRaises(ValueError, submenu_2.add, item) + class TestRadioMenuItem(unittest.TestCase): def setUp(self):
participants (1)
-
atagar@torproject.org