Class: Tuile::Component::List::Cursor
- Inherits:
-
Object
- Object
- Tuile::Component::List::Cursor
- Defined in:
- lib/tuile/component/list.rb,
sig/tuile.rbs
Overview
Tracks cursor position within the list.
Defined Under Namespace
Instance Attribute Summary collapse
-
#position ⇒ Integer
readonly
@return — 0-based item index of the current cursor position.
Instance Method Summary collapse
-
#candidate_positions(item_count) ⇒ ::Array[Integer]
@param
item_count— number of items in the list. -
#go(new_position) ⇒ Boolean
Moves the cursor to the new position.
-
#go_down_by(count, item_count) ⇒ Boolean
@param
count. - #go_to_first ⇒ Boolean
-
#go_to_last(item_count) ⇒ Boolean
Moves the cursor to the last reachable position.
-
#go_up_by(count) ⇒ Boolean
@param
count. -
#handle_key?(key, item_count, viewport_rows) ⇒ Boolean
@param
key— pressed keyboard key. -
#handle_mouse_down?(item_index, event, item_count) ⇒ Boolean
@param
item_index— the item pressed on. -
#initialize(position: 0) ⇒ Cursor
constructor
@param
position— the initial cursor position.
Constructor Details
#initialize(position: 0) ⇒ Cursor
@param position — the initial cursor position.
375 376 377 378 379 |
# File 'lib/tuile/component/list.rb', line 375 def initialize(position: 0) raise "invalid position #{position}" unless position.is_a? Integer @position = position end |
Instance Attribute Details
#position ⇒ Integer (readonly)
@return — 0-based item index of the current cursor position.
422 423 424 |
# File 'lib/tuile/component/list.rb', line 422 def position @position end |
Instance Method Details
#candidate_positions(item_count) ⇒ ::Array[Integer]
@param item_count — number of items in the list.
@return — positions the cursor can land on, in ascending order.
427 428 429 |
# File 'lib/tuile/component/list.rb', line 427 def candidate_positions(item_count) (0...item_count).to_a end |
#go(new_position) ⇒ Boolean
Moves the cursor to the new position. Public only because of testing.
@param new_position — new 0-based cursor position.
@return — true if the position changed.
469 470 471 472 473 474 475 |
# File 'lib/tuile/component/list.rb', line 469 def go(new_position) new_position = new_position.clamp(0, nil) return false if @position == new_position @position = new_position true end |
#go_down_by(count, item_count) ⇒ Boolean
@param count
@param item_count
491 492 493 |
# File 'lib/tuile/component/list.rb', line 491 def go_down_by(count, item_count) go((@position + count).clamp(nil, item_count - 1)) end |
#go_to_first ⇒ Boolean
502 503 504 |
# File 'lib/tuile/component/list.rb', line 502 def go_to_first go(0) end |
#go_to_last(item_count) ⇒ Boolean
Moves the cursor to the last reachable position. For base Tuile::Component::List::Cursor, the last item; Limited clamps to the last allowed position; None is a no-op.
@param item_count — number of items in the list.
@return — true if the position changed.
482 483 484 |
# File 'lib/tuile/component/list.rb', line 482 def go_to_last(item_count) go(item_count - 1) end |
#go_up_by(count) ⇒ Boolean
@param count
497 498 499 |
# File 'lib/tuile/component/list.rb', line 497 def go_up_by(count) go(@position - count) end |
#handle_key?(key, item_count, viewport_rows) ⇒ Boolean
@param key — pressed keyboard key.
@param item_count — number of items in the list.
@param viewport_rows — number of visible rows.
@return — true if the cursor moved.
435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 |
# File 'lib/tuile/component/list.rb', line 435 def handle_key?(key, item_count, ) case key when *Keys::DOWN_ARROWS go_down_by(1, item_count) when *Keys::UP_ARROWS go_up_by(1) when *Keys::HOMES go_to_first when *Keys::ENDS_ go_to_last(item_count) when Keys::CTRL_U go_up_by( / 2) when Keys::CTRL_D go_down_by( / 2, item_count) else false end end |
#handle_mouse_down?(item_index, event, item_count) ⇒ Boolean
@param item_index — the item pressed on.
@param event — the event.
@param item_count — number of items in the list.
@return — true if the cursor moved.
458 459 460 461 462 463 464 |
# File 'lib/tuile/component/list.rb', line 458 def handle_mouse_down?(item_index, event, item_count) if event. == :left go(item_index.clamp(nil, item_count - 1)) else false end end |