Class: Tuile::Component::PickerWindow
- Defined in:
- lib/tuile/component/picker_window.rb,
sig/tuile.rbs
Overview
A Window that lists options identified by single keyboard keys, asks
the user to pick one, and fires a callback with the picked key. Each row
is "<key> <caption>":
PickerWindow.open("Sort by", [%w[n name], %w[s size]]) { sort_by(_1) }
┌Sort by───────┐
│n name │
│s size │
└──────────────┘
Usable tiled (just add to a Layout and read picks via the block) or
as a popup via PickerWindow.open, which wraps it in a Popup that closes itself
after a pick. ESC / q close without firing the callback.
Captions paint in the terminal's own foreground. To color them, hand in StyledString captions — the picker styles nothing itself, so an app's own token applies per option:
PickerWindow.open("File", [["o", StyledString.plain("Open")],
["d", theme.fg(:danger, "Delete")]]) { … }
Defined Under Namespace
Classes: Option
Constant Summary collapse
- MAX_ITEMS =
Scrolls the window when more items.
10
Instance Attribute Summary collapse
-
#on_pick ⇒ Proc?
Callback invoked after the user picks an option (after the block fires).
Attributes inherited from Window
Attributes included from HasContent
Class Method Summary collapse
-
.open(caption, options, &block) ⇒ void
Opens a picker as a popup.
Instance Method Summary collapse
-
#handle_key?(key) ⇒ Boolean
Handles an option-key press.
-
#initialize(caption, options, &block) ⇒ PickerWindow
constructor
@param
caption— the window caption. -
#select_option(key) ⇒ void
@param
key.
Methods inherited from Window
#bottom_border, #caption, #caption=, #content_rect, #focusable?, #footer, #footer=, #handle_focus, #inspect_details, #layout, #layout_footer, #rect=, #repaint, #repaint_border, #scrollbar=, #top_border
Methods included from HasCaption
#caption, #caption=, #inspect_details
Methods included from HasContent
Constructor Details
#initialize(caption, options, &block) ⇒ PickerWindow
@param caption — the window caption.
@param options — pairs of keyboard key and option caption. A caption goes through StyledString.parse, so a plain String, an ANSI-coded one (what Theme#fg returns) and a StyledString are all accepted.
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/tuile/component/picker_window.rb', line 51 def initialize(caption, , &block) raise ArgumentError, "block required" unless block raise ArgumentError, "options must not be empty" if .empty? super(caption) @options = .map { Option.new(_1[0], StyledString.parse(_1[1])) } @block = block list = Component::List.new list.renderer = ->(option) { StyledString.plain("#{option.key} ") + option.caption } list.items = @options list.cursor = Component::List::Cursor.new list.on_item_chosen = ->(_index, option) { select_option(option.key) } self.content = list # Optional hook for a containing Popup to dismiss itself after a pick. @on_pick = nil end |
Instance Attribute Details
#on_pick ⇒ Proc?
Callback invoked after the user picks an option (after the block
fires). The Tuile::Component::Popup returned by open sets this to its own close.
71 72 73 |
# File 'lib/tuile/component/picker_window.rb', line 71 def on_pick @on_pick end |
Class Method Details
.open(caption, options, &block) ⇒ void
This method returns an undefined value.
Opens a picker as a popup. Picking an option fires block, then
closes the popup; ESC / q close without firing block.
@param caption
@param options
@return — the wrapping popup.
96 97 98 99 100 101 |
# File 'lib/tuile/component/picker_window.rb', line 96 def self.open(caption, , &block) picker = PickerWindow.new(caption, , &block) popup = Popup.new(content: picker) picker.on_pick = -> { popup.close } popup.open end |
Instance Method Details
#handle_key?(key) ⇒ Boolean
Handles an option-key press. Reached by bubbling: the inner List
(the focused component) sees the key first and handles cursor/Enter
picks; anything it declines bubbles up here, where a key matching an
option's key picks that option.
@param key
79 80 81 82 83 84 85 86 |
# File 'lib/tuile/component/picker_window.rb', line 79 def handle_key?(key) if @options.any? { _1.key == key } select_option(key) true else false end end |
#select_option(key) ⇒ void
This method returns an undefined value.
@param key
107 108 109 110 |
# File 'lib/tuile/component/picker_window.rb', line 107 def select_option(key) @block.call(key) @on_pick&.call end |