- PVSM.RU - https://www.pvsm.ru -

GoddamnConsole — библиотека для проектирования консольного UI

GoddamnConsole — библиотека для проектирования консольного UI - 1

Предисловие

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

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

Функционал

Кроссплатформенность

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

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

Визуальные компоненты

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

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

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

GoddamnConsole — библиотека для проектирования консольного UI - 2

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

GoddamnConsole — библиотека для проектирования консольного UI - 3

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

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

GoddamnConsole — библиотека для проектирования консольного UI - 4

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

GoddamnConsole — библиотека для проектирования консольного UI - 5

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

GoddamnConsole — библиотека для проектирования консольного UI - 6

Независимость от размера консоли

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

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

Для использования библиотеки вам достаточно скачать последний релиз библиотеки из репозитория GitHub [3] и добавить ссылку в проект на нее. Кроме того, вы можете скачать исходники и самостоятельно скомпилировать их. В случае 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();                   // запуск консоли
        }
    }
}

Результат:

GoddamnConsole — библиотека для проектирования консольного UI - 7

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

Заключение

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

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

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

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

Ссылки

Автор: zawodskoj

Источник [6]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/c-2/151506

Ссылки в тексте:

[1] MonoCurses: https://github.com/mono/mono-curses

[2] CursesSharp: https://github.com/sushihangover/CursesSharp

[3] репозитория GitHub: https://github.com/zawodskoj/GoddamnConsole

[4] govnokod.ru: http://govnokod.ru

[5] Документация по API (обновляется примерно раз в релиз): https://zawodskoj.github.io/

[6] Источник: https://habrahabr.ru/post/304840/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best