From f266d1a011813b5d3fb777a2c59b8957edea7606 Mon Sep 17 00:00:00 2001 From: Cheng Lian Date: Wed, 6 Sep 2023 09:20:38 -0700 Subject: [PATCH 1/2] Add text input validators for numerical parameter types --- trogon/widgets/parameter_controls.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/trogon/widgets/parameter_controls.py b/trogon/widgets/parameter_controls.py index 3ea3b13..a329f2f 100644 --- a/trogon/widgets/parameter_controls.py +++ b/trogon/widgets/parameter_controls.py @@ -6,13 +6,13 @@ import click from rich.text import Text -from textual import log, on +from textual import on from textual.app import ComposeResult from textual.containers import Vertical, Horizontal from textual.css.query import NoMatches +from textual.validation import Integer, Number, Validator from textual.widget import Widget from textual.widgets import ( - RadioButton, Label, Checkbox, Input, @@ -333,6 +333,22 @@ def get_control_method( else: return self.make_text_control + @staticmethod + def _make_text_validators( + schema: OptionSchema | ArgumentSchema, + ) -> list[Validator]: + validators: list[Validator] = [] + + if isinstance(schema.type, type(click.INT)): + validators.append(Integer()) + + if isinstance(schema.type, (click.IntRange, click.FloatRange)): + validators.append(Number(minimum=schema.type.min, maximum=schema.type.max)) + elif isinstance(schema.type, type(click.FLOAT)): + validators.append(Number()) + + return validators + @staticmethod def make_text_control( default: Any, @@ -343,6 +359,7 @@ def make_text_control( ) -> Widget: control = Input( classes=f"command-form-input {control_id}", + validators=ParameterControls._make_text_validators(schema), ) yield control return control From e49d51275f3d437180bc382eb84f59f0bd41e6f1 Mon Sep 17 00:00:00 2001 From: Cheng Lian Date: Wed, 6 Sep 2023 09:43:26 -0700 Subject: [PATCH 2/2] Refactor --- trogon/widgets/parameter_controls.py | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/trogon/widgets/parameter_controls.py b/trogon/widgets/parameter_controls.py index a329f2f..2a07f63 100644 --- a/trogon/widgets/parameter_controls.py +++ b/trogon/widgets/parameter_controls.py @@ -336,18 +336,16 @@ def get_control_method( @staticmethod def _make_text_validators( schema: OptionSchema | ArgumentSchema, - ) -> list[Validator]: - validators: list[Validator] = [] - - if isinstance(schema.type, type(click.INT)): - validators.append(Integer()) + ) -> Iterable[Validator]: + # `IntParamType` goes first as `IntRange` inherits `IntParamType`. + if isinstance(schema.type, click.types.IntParamType): + yield Integer() if isinstance(schema.type, (click.IntRange, click.FloatRange)): - validators.append(Number(minimum=schema.type.min, maximum=schema.type.max)) - elif isinstance(schema.type, type(click.FLOAT)): - validators.append(Number()) + yield Number(minimum=schema.type.min, maximum=schema.type.max) - return validators + if isinstance(schema.type, click.types.FloatParamType): + yield Number() @staticmethod def make_text_control(