Files

109 lines
2.7 KiB
C#
Raw Permalink Normal View History

//
// Copyright (c) Antmicro
//
// Full license details are defined in the 'LICENSE' file.
//
using System;
using TermSharp.Misc;
using Xwt;
namespace TermSharp
{
public sealed class Cursor : IDisposable
{
internal Cursor(Terminal terminal, Terminal.TerminalCanvas canvas)
{
this.terminal = terminal;
this.canvas = canvas;
BlinkingRate = TimeSpan.FromMilliseconds(300);
blinkHandle = Application.TimeoutInvoke(BlinkingRate, UpdateBlinkState);
}
public void Dispose()
{
blinkHandle.Dispose();
}
public void StayOnForNBlinks(int n)
{
blinkWaitRounds = n;
BlinkState = true;
canvas.Redraw();
}
public IntegerPosition Position
{
get
{
return position;
}
set
{
if(value.Y < 0)
{
value = value.WithY(0);
}
if(value.Y >= terminal.ScreenRowCount)
{
value = value.WithY(terminal.ScreenRowCount - 1);
}
if(value.X < 0)
{
value = value.WithX(0);
}
position = value;
}
}
public IntegerPosition MaximalPosition
{
get
{
var maxY = terminal.ScreenRowCount - 1;
var maxX = terminal.GetScreenRow(maxY).CurrentMaximalCursorPosition;
return new IntegerPosition(maxX, maxY);
}
}
public TimeSpan BlinkingRate
{
get => blinkingRate;
set
{
blinkingRate = value;
if(blinkHandle != null)
{
blinkHandle.Dispose();
blinkHandle = Application.TimeoutInvoke(BlinkingRate, UpdateBlinkState);
}
}
}
public bool Enabled { get; set; }
internal bool BlinkState { get; private set; }
private bool UpdateBlinkState()
{
if(blinkWaitRounds > 0)
{
blinkWaitRounds--;
}
else if(Enabled)
{
BlinkState = !BlinkState;
canvas.Redraw();
}
return true;
}
private TimeSpan blinkingRate;
private int blinkWaitRounds;
private IntegerPosition position;
private IDisposable blinkHandle;
private readonly Terminal terminal;
private readonly Terminal.TerminalCanvas canvas;
}
}