From 8e2763fc2f08769bb2d6e2b64257f6c238ce65c3 Mon Sep 17 00:00:00 2001 From: Andy Wood Date: Fri, 26 Apr 2024 11:38:53 +0100 Subject: [PATCH] Dynamically load page render/buttons from the subpackages to reduce boilerplate code --- ui/book/buttons.py | 2 +- ui/bookmarks/buttons.py | 2 +- ui/buttons.py | 46 +++++++++++++++------------------------ ui/config_loader.py | 17 +++++++++++++++ ui/display.py | 27 ++++++----------------- ui/go_to_page/buttons.py | 2 +- ui/go_to_page/view.py | 2 +- ui/language/buttons.py | 2 +- ui/language/view.py | 2 +- ui/library/buttons.py | 2 +- ui/library/view.py | 2 +- ui/system_menu/buttons.py | 2 +- ui/system_menu/view.py | 2 +- 13 files changed, 51 insertions(+), 59 deletions(-) diff --git a/ui/book/buttons.py b/ui/book/buttons.py index d9d3683..6aacc74 100644 --- a/ui/book/buttons.py +++ b/ui/book/buttons.py @@ -1,6 +1,6 @@ from ..state import state -book_buttons = { +buttons = { 'single': { '2': state.app.user.enter_go_to_page, '5': state.app.user.insert_bookmark, diff --git a/ui/bookmarks/buttons.py b/ui/bookmarks/buttons.py index 7f9b78e..f3d02e7 100644 --- a/ui/bookmarks/buttons.py +++ b/ui/bookmarks/buttons.py @@ -15,7 +15,7 @@ def close_menu(): return lambda: state.app.close_menu(True) -bookmarks_buttons = { +buttons = { 'single': { 'L': state.app.close_menu, '2': go_to_bookmark(0), diff --git a/ui/buttons.py b/ui/buttons.py index 5032400..24779e1 100644 --- a/ui/buttons.py +++ b/ui/buttons.py @@ -2,39 +2,27 @@ import signal from datetime import datetime from .state import state -from .library.buttons import library_buttons -from .book.buttons import book_buttons -from .go_to_page.buttons import go_to_page_buttons -from .bookmarks.buttons import bookmarks_buttons -from .system_menu.buttons import system_buttons -from .language.buttons import language_buttons - +from .config_loader import import_pages log = logging.getLogger(__name__) +page_buttons = import_pages('buttons') -bindings = { - 'library': library_buttons, - 'book': book_buttons, - 'go_to_page': go_to_page_buttons, - 'bookmarks_menu': bookmarks_buttons, - 'system_menu': system_buttons, - 'language': language_buttons, - 'help_menu': { - 'single': { - 'L': state.app.close_menu, - '>': state.app.next_page, - '<': state.app.previous_page, - 'R': state.app.help_menu.toggle, - }, - 'long': { - 'L': state.app.close_menu, - '>': state.app.next_page, - '<': state.app.previous_page, - 'R': state.app.help_menu.toggle, - 'X': state.hardware.reset_display, - }, - } +bindings = { p:p.buttons for p in page_buttons } +bindings['help_menu'] = { + 'single': { + 'L': state.app.close_menu, + '>': state.app.next_page, + '<': state.app.previous_page, + 'R': state.app.help_menu.toggle, + }, + 'long': { + 'L': state.app.close_menu, + '>': state.app.next_page, + '<': state.app.previous_page, + 'R': state.app.help_menu.toggle, + 'X': state.hardware.reset_display, + }, } # add a signal handler to manage going to the system menu when the rear diff --git a/ui/config_loader.py b/ui/config_loader.py index 78743e1..b4a7d8f 100644 --- a/ui/config_loader.py +++ b/ui/config_loader.py @@ -16,3 +16,20 @@ def load(config_file=config_file): files_section['media_dir'] = os.path.expanduser(media_dir) return config + +def import_pages(module): + """ + return a dictionary of location -> module (such as buttons or view) + from a list of subpackages + """ + config = load() + ui_section = config.get('ui', {}) + pages = ui_section.get('pages', [ + 'library', + 'book', + 'go_to_page', + 'bookmarks_menu', + 'system_menu', + 'language' + ]) + return { p:__import__(f'.{p}.{module}') for p in pages } diff --git a/ui/display.py b/ui/display.py index d981df7..1baed10 100644 --- a/ui/display.py +++ b/ui/display.py @@ -1,15 +1,12 @@ import logging -from .library import view as library_view -from .system_menu import view as system_menu_view -from .go_to_page import view as go_to_page_view -from .language import view as language_view -from .book import view as book_view -from .bookmarks import view as bookmarks_view +from .config_loader import import_pages log = logging.getLogger(__name__) +page_views = import_pages('view') + class Display(): def __init__(self): self.row = 0 @@ -20,21 +17,11 @@ def __init__(self): async def render_to_buffer(self, state): width, height = state.app.dimensions location = state.app.location - page_data = None - if location == 'library': - page_data = library_view.render(width, height, state) - elif location == 'system_menu': - page_data = system_menu_view.render(width, height, state) - elif location == 'go_to_page': - page_data = go_to_page_view.render(width, height, state) - elif location == 'language': - page_data = language_view.render(width, height, state) - elif location == 'book': - page_data = await book_view.render(width, height, state) - elif location == 'bookmarks_menu': - page_data = await bookmarks_view.render(width, height, state) - if page_data: + try: + page_data = await page_views[location].render(width, height, state) self._set_buffer(page_data) + except: + log.warn('unknown page location') async def send_line(self, driver): row = self.row diff --git a/ui/go_to_page/buttons.py b/ui/go_to_page/buttons.py index b3f5534..f534e5a 100644 --- a/ui/go_to_page/buttons.py +++ b/ui/go_to_page/buttons.py @@ -25,7 +25,7 @@ def thunk(): return thunk -go_to_page_buttons = { +buttons = { 'single': { 'L': state.app.close_menu, '1': queue_key_press(1), diff --git a/ui/go_to_page/view.py b/ui/go_to_page/view.py index b787332..8789286 100644 --- a/ui/go_to_page/view.py +++ b/ui/go_to_page/view.py @@ -24,7 +24,7 @@ def render_help(width, height): return tuple(data) -def render(width, height, state): +async def render(width, height, state): if state.app.help_menu.visible: all_lines = render_help(width, height) num_pages = len(all_lines) // height diff --git a/ui/language/buttons.py b/ui/language/buttons.py index b3fa402..32c37ee 100644 --- a/ui/language/buttons.py +++ b/ui/language/buttons.py @@ -7,7 +7,7 @@ def select_language(index): return lambda: state.app.languages.select_language(index) -language_buttons = { +buttons = { 'single': { 'L': state.app.close_menu, '2': select_language(0), diff --git a/ui/language/view.py b/ui/language/view.py index 1a92bd1..65e14fe 100644 --- a/ui/language/view.py +++ b/ui/language/view.py @@ -19,7 +19,7 @@ def render_help(width, height): return tuple(data) -def render(width, height, state): +async def render(width, height, state): help_menu = state.app.help_menu.visible if help_menu: all_lines = render_help(width, height) diff --git a/ui/library/buttons.py b/ui/library/buttons.py index b5f216d..692988b 100644 --- a/ui/library/buttons.py +++ b/ui/library/buttons.py @@ -7,7 +7,7 @@ def library_action(number): return lambda: state.app.library.action(number - 1) -library_buttons = { +buttons = { 'single': { '2': library_action(2), '3': library_action(3), diff --git a/ui/library/view.py b/ui/library/view.py index 4bc7357..f759423 100644 --- a/ui/library/view.py +++ b/ui/library/view.py @@ -131,7 +131,7 @@ def render_library(width, height, state): yield tuple() -def render(width, height, state): +async def render(width, height, state): if state.app.help_menu.visible: all_lines = render_help(width, height) num_pages = len(all_lines) // height diff --git a/ui/system_menu/buttons.py b/ui/system_menu/buttons.py index 3ca9c35..7509409 100644 --- a/ui/system_menu/buttons.py +++ b/ui/system_menu/buttons.py @@ -1,6 +1,6 @@ from ..state import state -system_buttons = { +buttons = { 'single': { '2': state.app.shutdown, '3': state.app.go_to_language_menu, diff --git a/ui/system_menu/view.py b/ui/system_menu/view.py index f813c75..fdd85fb 100644 --- a/ui/system_menu/view.py +++ b/ui/system_menu/view.py @@ -20,7 +20,7 @@ serial = release -def render(width, height, state): +async def render(width, height, state): if state.app.help_menu.visible: all_lines = render_help(width, height) num_pages = len(all_lines) // height