def wait_and_listen_for_keypress(self, observer: CursesMenuControllerObserver): self.highlighted_menu_option_index = self.data_source.initially_highlighted_menu_option_index(controller=self) menu_options_count = self.data_source.menu_options_count(controller=self) waiting_for_next_keypress = True while waiting_for_next_keypress: self.refresh(observer=observer) keypress_integer = self.keypress_listener() close_menu_key_set = self.key_bindings.close_menu_keys(controller=self) select_individual_menu_option_key_set = self.key_bindings.select_option_keys(controller=self) highlight_menu_option_key_set = self.key_bindings.highlight_keys(controller=self, menu_options_count=menu_options_count) next_menu_option_key_set = self.key_bindings.next_keys(controller=self) previous_menu_option_key_set = self.key_bindings.previous_keys(controller=self) if keypress_integer in close_menu_key_set: observer.did_signal_intent_to_close_menu(controller=self) break elif keypress_integer in select_individual_menu_option_key_set: should_dismiss_menu = observer.did_select_menu_option_at_index(controller=self, menu_option_index=self.highlighted_menu_option_index) if should_dismiss_menu: break elif keypress_integer in highlight_menu_option_key_set: key_char = int(chr(keypress_integer)) self.highlighted_menu_option_index = key_char elif keypress_integer in next_menu_option_key_set: self.highlighted_menu_option_index = (self.highlighted_menu_option_index + 1) % menu_options_count elif keypress_integer in previous_menu_option_key_set: self.highlighted_menu_option_index = (self.highlighted_menu_option_index - 1) % menu_options_count
def refresh(self, observer: CursesMenuControllerObserver = None): super().refresh() if observer: observer.will_redisplay_updated_menu_options(controller=self) for menu_option_index in range(self.data_source.menu_options_count(controller=self)): menu_option_display_number = menu_option_index menu_option_display_number_string = "{}. ".format(menu_option_display_number) menu_option_title_text = self.data_source.text_for_menu_option_at_index(controller=self, menu_option_index=menu_option_index) title = "{} ".format(menu_option_title_text) highlighted_color = self.highlighter.highlighted_menu_option_color_pair(controller=self) normal_color = self.highlighter.non_highlighted_menu_option_color_pair(controller=self) color = highlighted_color if menu_option_index == self.highlighted_menu_option_index else normal_color self._window.addstr(menu_option_index + self.text_inset_y, self.text_inset_x, menu_option_display_number_string, normal_color) self._window.addstr(menu_option_index + self.text_inset_y, self.text_inset_x + len(menu_option_display_number_string), title, color) if observer: observer.did_redisplay_updated_menu_options(controller=self)