30 lines
953 B
Ruby
30 lines
953 B
Ruby
# frozen_string_literal: true
|
|
|
|
module BBS
|
|
# A normalised event delivered to widgets.
|
|
#
|
|
# kind — :key, :mouse, :idle, :resize, :tick
|
|
# key — Symbol (:up, :enter, :f1, …) or single-char String (for :key)
|
|
# mouse — Telnet::MouseEvent (for :mouse)
|
|
# x, y — terminal-relative cursor position (for :mouse)
|
|
Event = Struct.new(:kind, :key, :mouse, :x, :y, keyword_init: true) do
|
|
def self.key(name)
|
|
new(kind: :key, key: name)
|
|
end
|
|
|
|
def self.mouse(mevt)
|
|
new(kind: :mouse, mouse: mevt, x: mevt.x, y: mevt.y)
|
|
end
|
|
|
|
def self.idle = new(kind: :idle)
|
|
def self.tick = new(kind: :tick)
|
|
def self.resize(cols, rows) = new(kind: :resize, x: cols, y: rows)
|
|
|
|
def key? = kind == :key
|
|
def mouse? = kind == :mouse
|
|
def alt? = key? && key.to_s.start_with?('alt_')
|
|
def alt_char = alt? ? key.to_s.sub('alt_', '') : nil
|
|
def char? = key? && key.is_a?(String) && key.length == 1
|
|
end
|
|
end
|