C# で TUI ライブラリを開発していますが、表示オブジェクトのカラー テーマを実行する方法についてアドバイスが必要です。画面に描画できるオブジェクトはすべて、このインターフェイスから継承されます。
public interface IDrawable
{
Area ScreenArea { get; }
List<char[]> DisplayChars { get; }
//some other properties...
}
というか、より具体的には、各ドローアブル オブジェクトのインターフェイスがこのインターフェイスを実装しています (IWindowは ですIDrawable)。それぞれIDrawableが Area 構造体で表されるコンソール ウィンドウの指定された部分に描画されます。
public struct Area
{
public readonly int EndX;
public readonly int EndY;
public readonly int Height;
public readonly int StartX;
public readonly int StartY;
public readonly int Width;
public Area(int startX, int endX, int startY, int endY)
{
StartX = startX;
EndX = endX;
StartY = startY;
EndY = endY;
Height = endY - startY;
Width = endX - startX;
}
/// <summary>
/// Get the overlapping area between this area and another.
/// </summary>
/// <param name="refArea"></param>
/// <returns>Overlap area relative to the upper left corner of the ref area.</returns>
public Area OverlapWith(Area refArea)
{
//....
}
}
オブジェクトの実際の描画は、DisplayChars の各要素を呼び出す静的Displayクラスのメソッドによって処理されます。Console.Write()から継承する各クラスに、IDrawableその領域を個別の色の領域に分割する方法について独自のルールを強制的に実装することを希望します。たとえば、ポップアップ ウィンドウには、外側の境界線、タイトル (外側の境界)、およびその内側の領域。
私は頭の中でこれを行う方法をしばらく考えていました。ColorSchemeどの文字をどの色で書くかというルールを含む型を に作成する必要があります。これを行う最善の方法は、色を個別に適用できる「サブエリア」のリストを含む抽象クラスにすることだと判断しました。
IDrawableから継承する独自のクラスを実装する必要がありますColorScheme。たとえば、抽象Window : IWindowクラスにはそのような実装はありませんが、クラスには、作成者がクラスを個別の領域に分割する方法を定義するPopupWindow : Window対応する型が必要です。それぞれに、このタイプの独自のインスタンスがあり、特定の色が含まれます。PopupWindowColorScheme : ColorSchemePopupWindowAreaPopupWindow
これは可能ですか?そうでない場合、IDrawable型の作成者にその領域を色付け可能な領域に分割する方法を指定させる別の方法はありますか?