From eda8379e8cd07418f51c92b6a0d1f962616acb21 Mon Sep 17 00:00:00 2001 From: hius07 <62179190+hius07@users.noreply.github.com> Date: Wed, 1 Dec 2021 19:58:48 +0200 Subject: [PATCH] SpinWidget, DoubleSpinWidget: enable/disable OK button (#8495) OK/Apply button is enabled only after changing the input value. --- frontend/ui/widget/doublespinwidget.lua | 27 +++++++++++++++++------ frontend/ui/widget/numberpickerwidget.lua | 5 +++++ frontend/ui/widget/spinwidget.lua | 16 ++++++++++---- 3 files changed, 37 insertions(+), 11 deletions(-) diff --git a/frontend/ui/widget/doublespinwidget.lua b/frontend/ui/widget/doublespinwidget.lua index f14e3fd43..1a46ef9a8 100644 --- a/frontend/ui/widget/doublespinwidget.lua +++ b/frontend/ui/widget/doublespinwidget.lua @@ -89,10 +89,10 @@ function DoubleSpinWidget:init() self:update() end -function DoubleSpinWidget:update() +function DoubleSpinWidget:update(numberpicker_left_value, numberpicker_right_value) local left_widget = NumberPickerWidget:new{ show_parent = self, - value = self.left_value, + value = numberpicker_left_value or self.left_value, value_min = self.left_min, value_max = self.left_max, value_step = self.left_step, @@ -102,7 +102,7 @@ function DoubleSpinWidget:update() } local right_widget = NumberPickerWidget:new{ show_parent = self, - value = self.right_value, + value = numberpicker_right_value or self.right_value, value_min = self.right_min, value_max = self.right_max, value_step = self.right_step, @@ -110,12 +110,20 @@ function DoubleSpinWidget:update() precision = self.right_precision, wrap = self.right_wrap, } + left_widget.picker_updated_callback = function(value) + self:update(value, right_widget:getValue()) + end + right_widget.picker_updated_callback = function(value) + self:update(left_widget:getValue(), value) + end + + local text_max_width = math.floor(0.95 * self.width / 2) local left_vertical_group = VerticalGroup:new{ align = "center", TextWidget:new{ text = self.left_text, face = self.title_face, - max_width = math.floor(0.95 * self.width / 2), + max_width = text_max_width, }, left_widget, } @@ -124,7 +132,7 @@ function DoubleSpinWidget:update() TextWidget:new{ text = self.right_text, face = self.title_face, - max_width = math.floor(0.95 * self.width / 2), + max_width = text_max_width, }, right_widget, } @@ -221,11 +229,16 @@ function DoubleSpinWidget:update() }, { text = self.ok_text, + enabled = self.left_value ~= left_widget:getValue() or self.right_value ~= right_widget:getValue(), callback = function() + self.left_value = left_widget:getValue() + self.right_value = right_widget:getValue() if self.callback then - self.callback(left_widget:getValue(), right_widget:getValue()) + self.callback(self.left_value, self.right_value) end - if not self.keep_shown_on_apply then + if self.keep_shown_on_apply then + self:update() + else self:onClose() end end, diff --git a/frontend/ui/widget/numberpickerwidget.lua b/frontend/ui/widget/numberpickerwidget.lua index 32b9dea90..7987d448c 100644 --- a/frontend/ui/widget/numberpickerwidget.lua +++ b/frontend/ui/widget/numberpickerwidget.lua @@ -48,6 +48,8 @@ local NumberPickerWidget = InputContainer:new{ -- in case we need calculate number of days in a given month and year date_month = nil, date_year = nil, + -- on update signal to the caller and pass updated value + picker_updated_callback = nil, } function NumberPickerWidget:init() @@ -224,6 +226,9 @@ function NumberPickerWidget:update() UIManager:setDirty(self.show_parent, function() return "ui", self.dimen end) + if self.picker_updated_callback then + self.picker_updated_callback(self.value) + end end --[[-- diff --git a/frontend/ui/widget/spinwidget.lua b/frontend/ui/widget/spinwidget.lua index a2f17a55d..fa0f6794c 100644 --- a/frontend/ui/widget/spinwidget.lua +++ b/frontend/ui/widget/spinwidget.lua @@ -52,6 +52,7 @@ local SpinWidget = InputContainer:new{ } function SpinWidget:init() + self.original_value = self.value -- used to enable ok_button, self.value may be changed in extra callback self.screen_width = Screen:getWidth() self.screen_height = Screen:getHeight() if not self.width then @@ -83,10 +84,10 @@ function SpinWidget:init() self:update() end -function SpinWidget:update() +function SpinWidget:update(numberpicker_value) local value_widget = NumberPickerWidget:new{ show_parent = self, - value = self.value, + value = numberpicker_value or self.value, value_table = self.value_table, value_index = self.value_index, value_min = self.value_min, @@ -95,6 +96,9 @@ function SpinWidget:update() value_hold_step = self.value_hold_step, precision = self.precision, wrap = self.wrap, + picker_updated_callback = function(value) + self:update(value) + end, } local value_group = HorizontalGroup:new{ align = "center", @@ -159,12 +163,16 @@ function SpinWidget:update() }, { text = self.ok_text, + enabled = self.original_value ~= value_widget:getValue(), callback = function() + self.value, self.value_index = value_widget:getValue() + self.original_value = self.value if self.callback then - self.value, self.value_index = value_widget:getValue() self.callback(self) end - if not self.keep_shown_on_apply then + if self.keep_shown_on_apply then + self:update() + else self:onClose() end end,