From ef0eb6a42b440b351f9f08251b51f306d7a892fe Mon Sep 17 00:00:00 2001 From: Isaiah Odhner Date: Thu, 4 May 2023 23:32:26 -0400 Subject: [PATCH] Use radio buttons in Custom Zoom window --- src/textual_paint/paint.css | 21 +++++++++++++++++ src/textual_paint/paint.py | 46 +++++++++++++++++++++++-------------- 2 files changed, 50 insertions(+), 17 deletions(-) diff --git a/src/textual_paint/paint.css b/src/textual_paint/paint.css index 049b81b..350ad31 100644 --- a/src/textual_paint/paint.css +++ b/src/textual_paint/paint.css @@ -263,6 +263,27 @@ CharacterSelectorDialogWindow .cancel { height: auto; width: 1fr; } +RadioSet { + layout: grid; + width: 35; + grid-size: 3; + grid-gutter: 0 1; + grid-columns: 10; + grid-rows: 2; + padding: 1 1; + height: auto; + /* Why is border-title-color not recognized? */ + /* https://textual.textualize.io/styles/border_title_color/ */ + /* It's documented, maybe it was removed from the library? */ + /* border-title-color: $text; */ + /* Also this isn't accepting $text */ + /* border: round $text; */ + border: round black; +} +.-dark-mode RadioSet { + border: round white; +} + DialogWindow .buttons { layout: horizontal; height: auto; diff --git a/src/textual_paint/paint.py b/src/textual_paint/paint.py index 7ddf2bd..bddc8a3 100755 --- a/src/textual_paint/paint.py +++ b/src/textual_paint/paint.py @@ -29,7 +29,7 @@ from textual.reactive import var, reactive from textual.strip import Strip from textual.dom import DOMNode from textual.widget import Widget -from textual.widgets import Button, Static, Input, Header +from textual.widgets import Button, Static, Input, Header, RadioSet, RadioButton from textual.binding import Binding from textual.color import Color @@ -2348,16 +2348,19 @@ class PaintApp(App[None]): self.close_windows("#zoom_dialog") def handle_button(button: Button) -> None: if button.has_class("ok"): - min_zoom = 1 - max_zoom = 16 - try: - n = int(window.content.query_one("#zoom_input", Input).value) - if n < min_zoom or n > max_zoom: - raise ValueError - self.magnification = n - window.close() - except ValueError: - self.warning_message_box(_("Zoom"), _("Please enter an integer between %1 and %2.", str(min_zoom), str(max_zoom)), "ok") + # min_zoom = 1 + # max_zoom = 16 + # try: + # n = int(window.content.query_one("#zoom_input", Input).value) + # if n < min_zoom or n > max_zoom: + # raise ValueError + # self.magnification = n + # window.close() + # except ValueError: + # self.warning_message_box(_("Zoom"), _("Please enter an integer between %1 and %2.", str(min_zoom), str(max_zoom)), "ok") + radio_button = window.content.query_one(RadioSet).pressed_button + self.magnification = int(radio_button.id.split("_")[1]) + window.close() else: window.close() window = DialogWindow( @@ -2366,16 +2369,23 @@ class PaintApp(App[None]): handle_button=handle_button, ) window.content.mount( - # TODO: radio button group, and show as percentage Vertical( Horizontal( Static(_("Current zoom:")), - Static(str(self.magnification) + "x"), + # Static(str(self.magnification) + "x"), + Static(str(self.magnification * 100) + "%"), ), - # Horizontal( - Static(_("Zoom to")), - Input(id="zoom_input", value=str(self.magnification)), - # ), + # # Horizontal( + # Static(_("Zoom to")), + # Input(id="zoom_input", value=str(self.magnification)), + # # ), + RadioSet( + RadioButton(_("100%"), id="value_1"), + RadioButton(_("200%"), id="value_2"), + RadioButton(_("400%"), id="value_4"), + RadioButton(_("600%"), id="value_6"), + RadioButton(_("800%"), id="value_8"), + ) ), Container( Button(_("OK"), classes="ok submit", variant="primary"), @@ -2383,6 +2393,8 @@ class PaintApp(App[None]): classes="buttons", ) ) + window.content.query_one("#value_" + str(self.magnification), RadioButton).value = True + window.content.query_one(RadioSet).border_title = _("Zoom to") self.mount(window) def action_show_grid(self) -> None: self.warning_message_box(_("Paint"), "Not implemented.", "ok")