From ef38070e95bf05ca20643995bdc6867519b0c40a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Iv=C3=A1n=20L=C3=B3pez=20Gonz=C3=A1lez?= Date: Fri, 2 Jun 2017 15:53:43 +0000 Subject: [PATCH] Add EventDispatcher#event_handler --- .../general/src/lib/ui/event_dispatcher.rb | 47 +++++++++++++++++-- library/general/test/event_dispatcher_test.rb | 17 +++++++ 2 files changed, 60 insertions(+), 4 deletions(-) diff --git a/library/general/src/lib/ui/event_dispatcher.rb b/library/general/src/lib/ui/event_dispatcher.rb index 8ee2415b6..ff1a36a4c 100644 --- a/library/general/src/lib/ui/event_dispatcher.rb +++ b/library/general/src/lib/ui/event_dispatcher.rb @@ -37,14 +37,53 @@ def event_loop loop do input = user_input - raise "Unknown action #{input}" unless respond_to?(:"#{input}_handler") - - send(:"#{input}_handler") - + event_handler(input) return @_finish_dialog_value if @_finish_dialog_flag end end + # General dialog events handler. + # Can be redefined to modify the way of managing events, for example when + # some events need to be delegated to a widget. + # @example delegate events + # class OKDialog + # include Yast::UIShortcuts + # include UI::EventDispatcher + # Yast.import "UI" + # + # def initialize + # @widget = Widget.new + # end + # + # def run + # return nil unless Yast::UI.OpenDialog( + # HBox( + # PushButton(Id(:ok), "OK"), + # PushButton(Id(:cancel), "Cancel") + # ) + # ) + # begin + # return event_loop + # ensure + # Yast::UI.CloseDialog + # end + # end + # + # def event_handler(input) + # @widget.handler(input) + # case input + # when :ok + # finish_dialog(:ok) + # when :cancel + # finish_dialog(:cancel) + # end + # end + # end + def event_handler(input) + raise "Unknown action #{input}" unless respond_to?(:"#{input}_handler") + send(:"#{input}_handler") + end + # Reads input for next event dispath # Can be redefined to modify the way of getting user input, like introducing a timeout. # Default implementation uses Yast::UI.UserInput which waits indefinitely for user input. diff --git a/library/general/test/event_dispatcher_test.rb b/library/general/test/event_dispatcher_test.rb index c97a9533c..d8275b144 100755 --- a/library/general/test/event_dispatcher_test.rb +++ b/library/general/test/event_dispatcher_test.rb @@ -32,6 +32,16 @@ def user_input end end +class DispatcherEventHandlerTestDialog + include Yast::UIShortcuts + include UI::EventDispatcher + Yast.import "UI" + + def event_handler(_input) + finish_dialog(:always_cancel) + end +end + describe UI::EventDispatcher do subject { DispatcherTestDialog.new } @@ -68,6 +78,13 @@ def mock_ui_events(*events) dialog.event_loop end + + it "uses custom event_handler to manage events" do + mock_ui_events(:ok) + + dialog = DispatcherEventHandlerTestDialog.new + expect(dialog.event_loop).to eq(:always_cancel) + end end describe "#cancel_handler" do