[Из песочницы] GoddamnConsole — библиотека для проектирования консольного UI

dd235344614d4385bb0ebbb2c37786e0

Предисловие


Некоторое время назад мне понадобилось написать некое консольное приложение для собственных нужд. Но так как это было бы слишком просто, было решено прикрутить к нему некое подобие GUI.

Блуждая на просторах интернета, мне удалось найти только две библиотеки для .NET, которые, возможно, удовлетворили бы мои потребности: MonoCurses и CursesSharp. Но эти библиотеки целиком и полностью заточены под ncurses — *nix-библиотеку для управления терминалом, и с Windows если и вообще совместимы, то очень плохо. В итоге возникло единственное решение написать свой велосипед.

Функционал


Кроссплатформенность
GoddamnConsole полностью совместим и с Windows (используется WinAPI), и с Linux (используется ncurses), и, возможно, даже с другими Unix-подобными ОС (Mac OS X, FreeBSD).

Весь функционал библиотеки одинаково работает на обеих операционных системах. Кроме того, поддержку ОС можно расширить путем написания консольного провайдера (если на этой ОС можно запустить .NET, конечно).

Визуальные компоненты
Компонент — основная единица UI библиотеки. Для написания своего компонента достаточно просто создать наследника класса Control и переопределить пару методов (отрисовка, события клавиатуры). Также доступно несколько встроенных компонентов:

— TabControl — компонент, использующийся для создания вкладок. Переключение вкладок происходит по нажатию на стрелку вправо и влево.

— TextView — компонент для отображения текста.

716fb884b7a447168a777977e194da08

StackPanel — простейший контейнер, укладывает дочерние элементы в столбец или строку.

d51fbb71a39043cdbd18fb084bf776ac

Кстати, это пример компонента, у которого даже не переопределен метод отрисовки — т.е. сам он ничего не рисует.

— Grid — контейнер, представляющий собой сетку элементов. Очень похож на одноименный компонент из WPF.
GridWindow дублирует функциональность этого контейнера, за исключением того, что GridWindow самостоятелен, а Grid — нет.

4268328173314699b9652c7d57611981

— TextBox — компонент для отображения и ввода текста. В отличие от TextView, захватывает фокус и поддерживает скроллинг.

49693ee82bb743c98af119a2cb5197b1

— Button — кнопка. Имеет событие Clicked, вызывающееся при нажатии на Enter.

7e7737ae48684f949f0ab940586e7bfa

Независимость от размера консоли
Независимость от размера консоли — очень важный элемент консольного (да и вообще любого) UI, так как терминалы *nix поддерживают свободное изменение своего размера. А с недавних пор такая возможность была добавлена и в Windows 10.

Как это использовать?


Для использования библиотеки вам достаточно скачать последний релиз библиотеки из репозитория GitHub и добавить ссылку в проект на нее. Кроме того, вы можете скачать исходники и самостоятельно скомпилировать их. В случае Linux с компиляцией могут возникнуть проблемы из-за того, что xbuild не умеет собирать проекты .NET 4.5. Вам потребуется либо собрать библиотеку вручную (инструкция будет позже), либо воспользоваться компьютером с Windows.

Простой пример использования:

using GoddamnConsole.Controls;
using Console = GoddamnConsole.Console;

namespace GoddamnConsoleSample
{
    internal class Program
    {
        private static void Main()
        {
            var window = new ContentWindow();  // создание окна
            window.Title = "Sample Window";    // установка заголовка окна
            var text = new TextView();         // создание текстового поля
            text.Text = "Hello, World!";
            window.Content = text;             // установка содержимого окна
            Console.Windows.Add(window);       // добавление окна в консоль
            Console.Start();                   // запуск консоли
        }
    }
}

Результат:

d570db569c904d0aa5534ffba9425b79

Кроме того, в репозитории вы можете найти пример, который охватывает практически всю текущую функциональность.

Заключение


Библиотека еще готова полностью, но она вполне пригодна для построения простых (и не только) приложений.

Некоторая функциональность в статье не описана (например, Data Binding) в следствие ее недостаточной завершенности. В дальнейшем планируется добавить больше компонентов, добавить новую функциональность и отладить существующую.

С удовольствием отвечу на все вопросы в комментариях, если возникнут.

Отдельное спасибо сайту govnokod.ru за помощь в костылировании под линукс.

Ссылки
  • Репозиторий проекта
  • Документация по API (обновляется примерно раз в релиз)

Комментарии (8)

  • 6 июля 2016 в 12:10

    0

    Красота. Надо будет из powershell ее заиспользовать.
  • 6 июля 2016 в 12:12

    0

    Для использования библиотеки вам достаточно скачать последний релиз библиотеки из репозитория GitHub и добавить ссылку в проект на нее.

    NuGet?

    • 6 июля 2016 в 13:10

      0

      Будет и в нугете, но чуть позже
  • 6 июля 2016 в 12:33

    0

    Может пригодится в обучении программированию — сначала учат на консольных программах, потом на переходном этапе — приложениям с этой библиотекой, и, затем, переходят к неконсольным программам.

    • 6 июля 2016 в 12:49

      0

      А зачем? Какой от этого выигрыш для обучаемого?

  • 6 июля 2016 в 12:44

    +1

    Ух ты, TurboVision!
  • 6 июля 2016 в 12:56

    0

    Какая прелесть, хорошо бы ещё ProgressBar.
  • 6 июля 2016 в 12:58

    0

    Прямо захотелось написать плагин, позволяющий описать такой интерфейс в виде XAML.

© Habrahabr.ru