109 lines
2.7 KiB
C#
109 lines
2.7 KiB
C#
|
|
//
|
|||
|
|
// 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;
|
|||
|
|
}
|
|||
|
|
}
|