
commit d5d569d2d99f2d9fc658fed01b21d7733b5fc31a Author: Damian Johnson <atagar@torproject.org> Date: Wed Aug 24 11:01:44 2016 -0700 Condense menu creation Taking a quick pass through all our functions that create menus, condensing them using the new constructor capabilities we added. Much shorter and simpler. :) --- nyx/menu.py | 298 ++++++++++++++++++++++-------------------------------------- 1 file changed, 109 insertions(+), 189 deletions(-) diff --git a/nyx/menu.py b/nyx/menu.py index 7a42fd1..b0fb646 100644 --- a/nyx/menu.py +++ b/nyx/menu.py @@ -111,22 +111,26 @@ class Submenu(MenuItem): if children: for child in children: - self.add(child) + if isinstance(child, list): + self.add(*child) + else: + self.add(child) - def add(self, menu_item): + def add(self, *menu_items): """ Adds the given menu item to our listing. - :param MenuItem menu_item: menu item to be added + :param list menu_items: menu item 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) + for menu_item in menu_items: + if menu_item.parent: + raise ValueError("Menu option '%s' already has a parent" % menu_item) - menu_item._parent = self - self.children.append(menu_item) + menu_item._parent = self + self.children.append(menu_item) class RadioMenuItem(MenuItem): @@ -159,243 +163,160 @@ def make_menu(): Constructs the base menu and all of its contents. """ - base_menu = Submenu('') - base_menu.add(make_actions_menu()) - base_menu.add(make_view_menu()) + nyx_controller = nyx.controller.get_controller() - control = nyx.controller.get_controller() + if not nyx_controller.is_paused(): + pause_item = MenuItem('Pause', nyx_controller.set_paused, True) + else: + pause_item = MenuItem('Unpause', nyx_controller.set_paused, False) + + root_menu = Submenu('') + + root_menu.add(Submenu('Actions', [ + MenuItem('Close Menu', None), + MenuItem('New Identity', nyx_controller.header_panel().send_newnym), + MenuItem('Reset Tor', tor_controller().signal, stem.Signal.RELOAD), + pause_item, + MenuItem('Exit', nyx_controller.quit), + ])) - for page_panel in control.get_display_panels(): + root_menu.add(_view_menu()) + + for page_panel in nyx_controller.get_display_panels(): if isinstance(page_panel, nyx.panel.graph.GraphPanel): - base_menu.add(make_graph_menu(page_panel)) + root_menu.add(_graph_menu(page_panel)) elif isinstance(page_panel, nyx.panel.log.LogPanel): - base_menu.add(make_log_menu(page_panel)) + root_menu.add(_log_menu(page_panel)) elif isinstance(page_panel, nyx.panel.connection.ConnectionPanel): - base_menu.add(make_connections_menu(page_panel)) + root_menu.add(_connections_menu(page_panel)) elif isinstance(page_panel, nyx.panel.config.ConfigPanel): - base_menu.add(make_configuration_menu(page_panel)) + root_menu.add(_configuration_menu(page_panel)) elif isinstance(page_panel, nyx.panel.torrc.TorrcPanel): - base_menu.add(make_torrc_menu(page_panel)) + root_menu.add(_torrc_menu(page_panel)) - base_menu.add(make_help_menu()) + root_menu.add(Submenu('Help', [ + MenuItem('Hotkeys', nyx.popups.show_help), + MenuItem('About', nyx.popups.show_about), + ])) - return base_menu + return root_menu -def make_actions_menu(): - """ - Submenu consisting of... - Close Menu - New Identity - Reset Tor - Pause / Unpause - Exit +def _view_menu(): """ + View submenu consisting of... - control = nyx.controller.get_controller() - controller = tor_controller() - header_panel = control.header_panel() - - actions_menu = Submenu('Actions') - actions_menu.add(MenuItem('Close Menu', None)) - actions_menu.add(MenuItem('New Identity', header_panel.send_newnym)) - actions_menu.add(MenuItem('Reset Tor', controller.signal, stem.Signal.RELOAD)) - - if control.is_paused(): - actions_menu.add(MenuItem('Unpause', control.set_paused, False)) - else: - actions_menu.add(MenuItem('Pause', control.set_paused, True)) - - actions_menu.add(MenuItem('Exit', control.quit)) - - return actions_menu - - -def make_view_menu(): - """ - Submenu consisting of... [X] <Page 1> [ ] <Page 2> [ ] etc... Color (Submenu) """ - view_menu = Submenu('View') - control = nyx.controller.get_controller() - - if control.get_page_count() > 0: - page_group = RadioGroup(control.set_page, control.get_page()) + nyx_controller = nyx.controller.get_controller() - for i in range(control.get_page_count()): - page_panels = control.get_display_panels(page_number = i) - label = ' / '.join([type(panel).__name__.replace('Panel', '') for panel in page_panels]) + view_menu = Submenu('View') + page_group = RadioGroup(nyx_controller.set_page, nyx_controller.get_page()) - view_menu.add(RadioMenuItem(label, page_group, i)) + for i in range(nyx_controller.get_page_count()): + page_panels = nyx_controller.get_display_panels(page_number = i) + label = ' / '.join([type(panel).__name__.replace('Panel', '') for panel in page_panels]) + view_menu.add(RadioMenuItem(label, page_group, i)) if nyx.curses.is_color_supported(): - color_menu = Submenu('Color') color_group = RadioGroup(nyx.curses.set_color_override, nyx.curses.get_color_override()) - color_menu.add(RadioMenuItem('All', color_group, None)) - - for color in nyx.curses.Color: - color_menu.add(RadioMenuItem(str_tools._to_camel_case(color), color_group, color)) - - view_menu.add(color_menu) + view_menu.add(Submenu('Color', [ + RadioMenuItem('All', color_group, None), + [RadioMenuItem(str_tools._to_camel_case(opt), color_group, opt) for opt in nyx.curses.Color], + ])) return view_menu -def make_help_menu(): - """ - Submenu consisting of... - Hotkeys - About +def _graph_menu(graph_panel): """ + Graph panel submenu consisting of... - return Submenu('Help', [ - MenuItem('Hotkeys', nyx.popups.show_help), - MenuItem('About', nyx.popups.show_about), - ]) - - -def make_graph_menu(graph_panel): - """ - Submenu for the graph panel, consisting of... [X] <Stat 1> [ ] <Stat 2> [ ] <Stat 2> Resize... Interval (Submenu) Bounds (Submenu) - - Arguments: - graph_panel - instance of the graph panel """ - graph_menu = Submenu('Graph') - - # stats options - stat_group = RadioGroup(functools.partial(setattr, graph_panel, 'displayed_stat'), graph_panel.displayed_stat) - available_stats = graph_panel.stat_options() - available_stats.sort() - - for stat_key in ['None'] + available_stats: - label = str_tools._to_camel_case(stat_key, divider = ' ') - stat_key = None if stat_key == 'None' else stat_key - graph_menu.add(RadioMenuItem(label, stat_group, stat_key)) - - # resizing option - - graph_menu.add(MenuItem('Resize...', graph_panel.resize_graph)) - - # interval submenu - - interval_menu = Submenu('Interval') interval_group = RadioGroup(functools.partial(setattr, graph_panel, 'update_interval'), graph_panel.update_interval) - - for interval in nyx.panel.graph.Interval: - interval_menu.add(RadioMenuItem(interval, interval_group, interval)) - - graph_menu.add(interval_menu) - - # bounds submenu - - bounds_menu = Submenu('Bounds') bounds_group = RadioGroup(functools.partial(setattr, graph_panel, 'bounds_type'), graph_panel.bounds_type) - for bounds_type in nyx.panel.graph.Bounds: - bounds_menu.add(RadioMenuItem(bounds_type, bounds_group, bounds_type)) - - graph_menu.add(bounds_menu) - - return graph_menu + return Submenu('Graph', [ + RadioMenuItem('None', stat_group, None), + [RadioMenuItem(str_tools._to_camel_case(opt, divider = ' '), stat_group, opt) for opt in sorted(graph_panel.stat_options())], + MenuItem('Resize...', graph_panel.resize_graph), + Submenu('Interval', [RadioMenuItem(opt, interval_group, opt) for opt in nyx.panel.graph.Interval]), + Submenu('Bounds', [RadioMenuItem(opt, bounds_group, opt) for opt in nyx.panel.graph.Bounds]), + ]) -def make_log_menu(log_panel): +def _log_menu(log_panel): """ - Submenu for the log panel, consisting of... + Log panel submenu consisting of... + Events... Snapshot... Clear Show / Hide Duplicates Filter (Submenu) - - Arguments: - log_panel - instance of the log panel """ - log_menu = Submenu('Log') - - log_menu.add(MenuItem('Events...', log_panel.show_event_selection_prompt)) - log_menu.add(MenuItem('Snapshot...', log_panel.show_snapshot_prompt)) - log_menu.add(MenuItem('Clear', log_panel.clear)) - - if log_panel.is_duplicates_visible(): - log_menu.add(MenuItem('Hide Duplicates', log_panel.set_duplicate_visability, False)) - else: - log_menu.add(MenuItem('Show Duplicates', log_panel.set_duplicate_visability, True)) - - # filter submenu - log_filter = log_panel.get_filter() - - filter_menu = Submenu('Filter') filter_group = RadioGroup(log_filter.select, log_filter.selection()) - filter_menu.add(RadioMenuItem('None', filter_group, None)) - - for option in log_filter.latest_selections(): - filter_menu.add(RadioMenuItem(option, filter_group, option)) - - filter_menu.add(MenuItem('New...', log_panel.show_filter_prompt)) - log_menu.add(filter_menu) - - return log_menu + if not log_panel.is_duplicates_visible(): + duplicate_item = MenuItem('Show Duplicates', log_panel.set_duplicate_visability, True) + else: + duplicate_item = MenuItem('Hide Duplicates', log_panel.set_duplicate_visability, False) + + return Submenu('Log', [ + MenuItem('Events...', log_panel.show_event_selection_prompt), + MenuItem('Snapshot...', log_panel.show_snapshot_prompt), + MenuItem('Clear', log_panel.clear), + duplicate_item, + Submenu('Filter', [ + RadioMenuItem('None', filter_group, None), + [RadioMenuItem(opt, filter_group, opt) for opt in log_filter.latest_selections()], + MenuItem('New...', log_panel.show_filter_prompt), + ]), + ]) -def make_connections_menu(conn_panel): +def _connections_menu(conn_panel): """ - Submenu for the connections panel, consisting of... - Sorting... - Resolver (Submenu) + Connection panel submenu consisting of... - Arguments: - conn_panel - instance of the connections panel + Sorting... + Resolver (Submenu) """ - connections_menu = Submenu('Connections') - - # sorting option - - connections_menu.add(MenuItem('Sorting...', conn_panel.show_sort_dialog)) - - # resolver submenu - - conn_resolver = nyx.tracker.get_connection_tracker() - resolver_menu = Submenu('Resolver') - resolver_group = RadioGroup(conn_resolver.set_custom_resolver, conn_resolver.get_custom_resolver()) - - resolver_menu.add(RadioMenuItem('auto', resolver_group, None)) - - for option in stem.util.connection.Resolver: - resolver_menu.add(RadioMenuItem(option, resolver_group, option)) + tracker = nyx.tracker.get_connection_tracker() + resolver_group = RadioGroup(tracker.set_custom_resolver, tracker.get_custom_resolver()) - connections_menu.add(resolver_menu) - - return connections_menu + return Submenu('Connections', [ + MenuItem('Sorting...', conn_panel.show_sort_dialog), + Submenu('Resolver', [ + RadioMenuItem('auto', resolver_group, None), + [RadioMenuItem(opt, resolver_group, opt) for opt in stem.util.connection.Resolver], + ]), + ]) -def make_configuration_menu(config_panel): +def _configuration_menu(config_panel): """ - Submenu for the configuration panel, consisting of... + Configuration panel submenu consisting of... + Save Config... Sorting... Filter / Unfilter Options - - Arguments: - config_panel - instance of the configuration panel """ return Submenu('Configuration', [ @@ -404,30 +325,29 @@ def make_configuration_menu(config_panel): ]) -def make_torrc_menu(torrc_panel): +def _torrc_menu(torrc_panel): """ - Submenu for the torrc panel, consisting of... + Torrc panel submenu consisting of... + Reload Show / Hide Comments Show / Hide Line Numbers - - Arguments: - torrc_panel - instance of the torrc panel """ - torrc_menu = Submenu('Torrc') - - if torrc_panel._show_comments: - torrc_menu.add(MenuItem('Hide Comments', torrc_panel.set_comments_visible, False)) + if not torrc_panel._show_comments: + comments_item = MenuItem('Show Comments', torrc_panel.set_comments_visible, True) else: - torrc_menu.add(MenuItem('Show Comments', torrc_panel.set_comments_visible, True)) + comments_item = MenuItem('Hide Comments', torrc_panel.set_comments_visible, False) - if torrc_panel._show_line_numbers: - torrc_menu.add(MenuItem('Hide Line Numbers', torrc_panel.set_line_number_visible, False)) + if not torrc_panel._show_line_numbers: + line_number_item = MenuItem('Show Line Numbers', torrc_panel.set_line_number_visible, True) else: - torrc_menu.add(MenuItem('Show Line Numbers', torrc_panel.set_line_number_visible, True)) + line_number_item = MenuItem('Hide Line Numbers', torrc_panel.set_line_number_visible, False) - return torrc_menu + return Submenu('Torrc', [ + comments_item, + line_number_item, + ]) class MenuCursor: