Class: Tuile::Component::List::Cursor
- Inherits:
-
Object
- Object
- Tuile::Component::List::Cursor
- Defined in:
- lib/tuile/component/list.rb
Overview
Tracks cursor position within the list.
Defined Under Namespace
Instance Attribute Summary collapse
-
#position ⇒ Integer
readonly
0-based line index of the current cursor position.
Instance Method Summary collapse
-
#candidate_positions(line_count) ⇒ Array<Integer>
Positions the cursor can land on, in ascending order.
-
#go(new_position) ⇒ Boolean
Moves the cursor to the new position.
-
#handle_key(key, line_count, viewport_lines) ⇒ Boolean
True if the cursor moved.
-
#handle_mouse(line, event, line_count) ⇒ Boolean
True if the event was handled.
-
#initialize(position: 0) ⇒ Cursor
constructor
A new instance of Cursor.
Constructor Details
#initialize(position: 0) ⇒ Cursor
Returns a new instance of Cursor.
297 298 299 |
# File 'lib/tuile/component/list.rb', line 297 def initialize(position: 0) @position = position end |
Instance Attribute Details
#position ⇒ Integer (readonly)
Returns 0-based line index of the current cursor position.
332 333 334 |
# File 'lib/tuile/component/list.rb', line 332 def position @position end |
Instance Method Details
#candidate_positions(line_count) ⇒ Array<Integer>
Returns positions the cursor can land on, in ascending order.
337 338 339 |
# File 'lib/tuile/component/list.rb', line 337 def candidate_positions(line_count) (0...line_count).to_a end |
#go(new_position) ⇒ Boolean
Moves the cursor to the new position. Public only because of testing.
379 380 381 382 383 384 385 |
# File 'lib/tuile/component/list.rb', line 379 def go(new_position) new_position = new_position.clamp(0, nil) return false if @position == new_position @position = new_position true end |
#handle_key(key, line_count, viewport_lines) ⇒ Boolean
Returns true if the cursor moved.
345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 |
# File 'lib/tuile/component/list.rb', line 345 def handle_key(key, line_count, ) case key when *Keys::DOWN_ARROWS go_down_by(1, line_count) when *Keys::UP_ARROWS go_up_by(1) when *Keys::HOMES go_to_first when *Keys::ENDS_ go_to_last(line_count) when Keys::CTRL_U go_up_by( / 2) when Keys::CTRL_D go_down_by( / 2, line_count) else false end end |
#handle_mouse(line, event, line_count) ⇒ Boolean
Returns true if the event was handled.
368 369 370 371 372 373 374 |
# File 'lib/tuile/component/list.rb', line 368 def handle_mouse(line, event, line_count) if event. == :left go(line.clamp(nil, line_count - 1)) else false end end |