One Step Ahead

プログラミングやエンジニアリング全般について書いていきます

『CommandLineSelectableMenu』をリリースしました。

はじめに


タイトル通り、先日『CommandLineSelectableMenu』をリリースしました。
今日はそのご紹介記事になります。
(リリースしたばかりで、versionがすでに『v1.1.1』になっていますが、そこはご愛嬌。)

紹介よりもまずは実物!! という方は、下記からどうぞ。

Githubはこちら
nugetはこちら

CommandLineSelectableMenuって何?


まさに読んで字のごとくで、そのままですが『CommandLine専用の選択可能メニュー』を作成するためのライブラリです。
対話形式の選択メニューを非常に簡単に実装することができます。

.NETStandard 2.0で作成されたプロジェクトですので、.NET Framework, .NET Coreどちらのプロジェクトでも使用することができます。

機能紹介


対話形式選択メニューの作成

非常に小さなライブラリなので、機能は本当にこれだけです。
Generatorの作成などに活用してもらえればという想いで作成しました。

実装方法Tips


最小限の実装

最小の実装は非常に簡単です。SelectableMenu<T>をインスタンス化し、選択対象の項目を追加するだけです。

using System;
using CommandLineSelectableMenu;

class Program
{
    static void Main(string[] args)
    {

        // インスタンスの生成
        var selectableMenu = new SelectableMenu<Action>();

        // メニュー項目の追加.
        selectableMenu.Add(title: "項目A ?", item: () => { Console.WriteLine("項目A が選択されました。"); });
        selectableMenu.Add(title: "項目B ?", item: () => { Console.WriteLine("項目B が選択されました。"); });
        selectableMenu.Add(title: "項目C ?", item: () => { Console.WriteLine("項目C が選択されました。"); });
        selectableMenu.Add(title: "項目D ?", item: () => { Console.WriteLine("項目D が選択されました。"); });

        // メニューの描画
        var item = selectableMenu.Draw();

        // 選択対象の実行
        item.Invoke();

        Console.ReadKey();
    }
}

描画メソッドにあたるDrawメソッドは、戻り値T型をとるため、関数を渡すことで即座に処理を実行することもできます。

f:id:EaE:20210201183347g:plain

サンプルからもわかる通り、Optionを設定しない状態では矢印が付くのみで選択対象の項目は色が変化しません。

カーソル付き選択メニューのカラー設定

今度はOptionの設定方法です。

  • 選択時カラーを赤色に設定
  • 矢印をアスタリスクに設定
  • 選択後にメニューをClearする。

上記の設定を追加していきます。

using System;
using CommandLineSelectableMenu;

class Program
using System;
using CommandLineSelectableMenu;

class Program
{
    static void Main(string[] args)
    {
        // オプションの設定
        var option = new SelectableMenuOptions()
        {
            // 選択タイプを選ぶことができます。
            // default は `ArrowSelectedType`が設定されています。
            SelectedType = new ArrowSelectedType()
            {
                SelectedColor = ConsoleColor.Red,
                ArrowType = ArrowType.Asterisk,
            },

            // defaultは `false`ですが、`true`を設定することで、項目選択後にメニューを消すことができます。
            IsClearAfterSelection = true
        };

        // インスタンスの生成
        var selectableMenu = new SelectableMenu<Action>(option);

        // メニュー項目の追加.
        selectableMenu.Add(title: "項目A ?", item: () => { Console.WriteLine("項目A が選択されました。"); });
        selectableMenu.Add(title: "項目B ?", item: () => { Console.WriteLine("項目B が選択されました。"); });
        selectableMenu.Add(title: "項目C ?", item: () => { Console.WriteLine("項目C が選択されました。"); });
        selectableMenu.Add(title: "項目D ?", item: () => { Console.WriteLine("項目D が選択されました。"); });

        // メニューの描画
        var item = selectableMenu.Draw();

        // 選択対象の実行
        item.Invoke();

        Console.ReadKey();
    }
}

SelectedTypeのDefaultはArrowSelectedTypeが設定されていますが、選択時カラーはConsole.ForegroundColorのままになっています。
ここにConsoleColor.Redを設定しています。

ArrowTypeは、Arrow(>), Asterisk(*), Plus(+) が選択可能です。

f:id:EaE:20210201185641g:plain

矢印が変更され、選択項目が赤くなっているのが確認できます。

カラー選択メニューの設定

最後は選択矢印なしのOption設定方法です。

  • 選択時カラーを緑色に設定
  • 選択矢印を描画しない。
  • 選択後にメニューをClearする。

上記の設定を追加していきます。

using System;
using CommandLineSelectableMenu;

class Program
{
    static void Main(string[] args)
    {
        // オプションの設定
        var option = new SelectableMenuOptions()
        {
            // 選択タイプを選ぶことができます。
            // ColorSelectedTypeは矢印が付きません。色のみが変更されます。
            // defaultで選択項目色は `Console.Yellow`に設定されています。
            SelectedType = new ColorSelectedType()
            {
                SelectedColor = ConsoleColor.Green,
            },

            // defaultは `false`ですが、`true`を設定することで、項目選択後にメニューを消すことができます。
            IsClearAfterSelection = true
        };

        // インスタンスの生成
        var selectableMenu = new SelectableMenu<Action>(option);

        // メニュー項目の追加.
        selectableMenu.Add(title: "項目A ?", item: () => { Console.WriteLine("項目A が選択されました。"); });
        selectableMenu.Add(title: "項目B ?", item: () => { Console.WriteLine("項目B が選択されました。"); });
        selectableMenu.Add(title: "項目C ?", item: () => { Console.WriteLine("項目C が選択されました。"); });
        selectableMenu.Add(title: "項目D ?", item: () => { Console.WriteLine("項目D が選択されました。"); });

        // メニューの描画
        var item = selectableMenu.Draw();

        // 選択対象の実行
        item.Invoke();

        Console.ReadKey();
    }
}

カラーのみの設定は非常に簡単で、ConsoleColor.Greenを設定するだけです。
ColorSelectedTypeをSelectedTypeに設定しているので、矢印は表示されません。

f:id:EaE:20210201191349g:plain

矢印が消え、選択中の項目が緑色になっているのが確認できました。

今後のUpdate予定


  • nugetに表示されるアイコンの設定
  • メニューデザインのオプション化

ここら辺が直近の目標です!!

まとめ


  • 対話形式の選択メニューを作成するためのライブラリです。
  • 矢印付きメニュー、矢印なしメニュー、カラーメニューを簡単に作成できます。

今後の情報はこの記事のUpdateと更新情報記事でやっていきます