Module: Qt::EventRuntimeDispatch

Defined in:
lib/qt/event_runtime_dispatch.rb

Overview

Dispatch helpers for event/signal callbacks from the native bridge.

Constant Summary collapse

EVENT_RESULT_IGNORE =
0
EVENT_RESULT_CONTINUE =
1
EVENT_RESULT_CONSUME =
2

Class Method Summary collapse

Class Method Details

.dispatch_event(event_handlers, object_handle, event_type, payload) ⇒ Object



13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# File 'lib/qt/event_runtime_dispatch.rb', line 13

def dispatch_event(event_handlers, object_handle, event_type, payload)
  return EVENT_RESULT_CONTINUE unless object_handle && event_handlers

  per_widget = event_handlers[object_handle.address]
  return EVENT_RESULT_CONTINUE unless per_widget

  handlers = per_widget[event_type]
  return EVENT_RESULT_CONTINUE unless handlers && !handlers.empty?

  results = handlers.map { |handler| handler.call(payload) }
  return EVENT_RESULT_CONSUME if results.any? { |result| result == true || result == :consume }
  return EVENT_RESULT_IGNORE if results.any? { |result| result == false || result == :ignore }

  EVENT_RESULT_CONTINUE
end

.dispatch_signal(internal_signal_handlers, signal_handlers, object_handle, signal_index, payload) ⇒ Object



29
30
31
32
33
34
# File 'lib/qt/event_runtime_dispatch.rb', line 29

def dispatch_signal(internal_signal_handlers, signal_handlers, object_handle, signal_index, payload)
  return unless object_handle

  dispatch_signal_store(signal_handlers, object_handle, signal_index, payload)
  dispatch_signal_store(internal_signal_handlers, object_handle, signal_index, payload)
end

.dispatch_signal_store(signal_handlers, object_handle, signal_index, payload) ⇒ Object



36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/qt/event_runtime_dispatch.rb', line 36

def dispatch_signal_store(signal_handlers, object_handle, signal_index, payload)
  return unless signal_handlers

  per_widget = signal_handlers[object_handle.address]
  return unless per_widget

  per_widget.each do |signal_name, entry|
    next unless entry[:index] == signal_index

    typed_payload = Qt::DateTimeCodec.decode_for_signal(signal_name, payload)
    entry[:blocks].dup.each { |handler| handler.call(typed_payload) }
  end
end