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.
251 252 253 |
# File 'lib/tuile/component/list.rb', line 251 def initialize(position: 0) @position = position end |
Instance Attribute Details
#position ⇒ Integer (readonly)
Returns 0-based line index of the current cursor position.
286 287 288 |
# File 'lib/tuile/component/list.rb', line 286 def position @position end |
Instance Method Details
#candidate_positions(line_count) ⇒ Array<Integer>
Returns positions the cursor can land on, in ascending order.
291 292 293 |
# File 'lib/tuile/component/list.rb', line 291 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.
333 334 335 336 337 338 339 |
# File 'lib/tuile/component/list.rb', line 333 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.
299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 |
# File 'lib/tuile/component/list.rb', line 299 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::HOME go_to_first when Keys::END_ 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.
322 323 324 325 326 327 328 |
# File 'lib/tuile/component/list.rb', line 322 def handle_mouse(line, event, line_count) if event. == :left go(line.clamp(nil, line_count - 1)) else false end end |