А кто из вас ещё помнит Norton Commander, Turbo Pascal IDE, DOS-программы? Да, да, это устаревшая технология. Стоит ли применять её сейчас? Но ведь многие администраторы предпочитают использовать CLI (Command Line Interface) - интерфейс командной строки. И время от времени кто нибудь да посетует - "Вот бы интерактива добавить, выбрать файл, выбрать значение из списка". Есть, конечно, для этого GUI (Graphical User Interface) - графический пользовательский интерфейс, но он "тяжеловесен".
TUI - это "золотая середина" между суровым CLI и тяжёлым GUI. Он даёт удобство взаимодействия там, где графика невозможна или нецелесообразна, сохраняя скорость, портативность и низкую нагрузку на систему. Попробуйте ещё один инструмент для OneScript, вот эту разработку. При создании его так же имелся в виду и образовательный аспект. Обучение "от простого к сложному" опирается на когнитивные механизмы усвоения знаний. OneScript для этого по моему подходит идеально.
Для кого это решение может пригодиться?
- разработчикам, желающим создать удобный консольный интерфейс без перехода на GUI;
- разработчикам, которые создают интерактивные инструменты для себя и команды, стремящимся автоматизировать рутину с удобным интерфейсом;
- командам, нуждающимся в кросс-платформенном TUI-решении для администрирования, мониторинга или настройки;
- тем, кто ищет альтернативу традиционным CLI-приложениям с минимальным потреблением ресурсов;
- всем, кто хочет сделать свои консольные скрипты и программы по-настоящему профессиональными и удобными;
- и не забываем про возможность обучения программированию и работе с терминалом (для самых маленьких).
Ключевые преимущества
1. Кросс-платформенность.
2. Богатый набор элементов управления. Вот некоторые из основных классов:
- ВыборЦвета (ColorPicker) Выбор цвета из палитры;
- Дерево (TreeView) Древовидный элемент с ветвями;
- Диалог (Dialog) Окно, которое расположено по центру и содержит несколько кнопок;
- ДиалогОткрытия (OpenDialog) Окно для выбора файлов или каталогов;
- ДиалогСохранения (SaveDialog) Окно для сохранения файлов;
- Индикатор (ProgressBar) Индикатор выполнения;
- Кнопка (Button) Элемент, который вызывает действие;
- КонтекстноеМеню (ContextMenu) Всплывающее меню;
- Математика (Math) Предоставляет константы и статические методы математических функций;
- Надпись (Label) Отображает строку в заданной позиции;
- Окно (Window) Элемент с границами и названием сверху;
- ОкноСообщений (MessageBox) Модальное сообщение с вариантами действий;
- ПанельВкладок (TabView) Элемент с вкладками;
- ПанельМеню (MenuBar) Панель меню с каскадными меню;
- Переключатель (RadioGroup) Группа меток с индикатором выбора;
- ПолеВвода (TextField) Однострочное поле для ввода текста;
- ПолеВремени (TimeField) Элемент редактирования времени;
- ПолеВыбора (ComboBox) Раскрывающийся список элементов;
- ПолеДаты (DateField) Элемент редактирования даты;
- Прокручиваемый (ScrollView) Элемент управления с полосами прокрутки;
- РамкаГруппы (FrameView) Контейнерная рамка вокруг содержимого;
- СписокЭлементов (ListView) Прокручиваемый список данных;
- СтрокаСостояния (StatusBar) Элемент, который привязан к нижней части элемента верхнего уровня;
- Таблица (TableView) Просмотр табличных данных;
- Таймер (Timer) Возможность создания повторяющихся событий;
- Текстовый (TextView) Многострочное текстовое поле для редактирования;
- Уведомление (Balloons) Аналог окна сообщений, но с интервалом для автоматического закрытия;
- Флажок (CheckBox) Переключатель.
3. Гибкая система компоновки. Поддерживается:
- абсолютное и относительное позиционирование;
- процентные размеры;
- автоматическое заполнение пространства;
- центрирование.
4. Поддержка ввода. Обрабатывает:
- клавиатурные события (включая сочетания клавиш);
- события мыши (в поддерживающих эмуляторах);
- перетаскивание (ограниченная поддержка).
5. Цвета. Система цветовых схем позволяет настраивать внешний вид интерфейса под нужды проекта.
6. Событийная модель. Четкая и привычная модель событий для реакции на действия пользователя.
Технические детали
Библиотека применима к OneScript 1.x. Исходный код доступен на github (OneScriptTerminalGui). Там же найдете ссылку на документацию (Справка). Документация содержит подробные примеры.
Проверка выполнялась на OneScript v1.8.4.5 в среде Windows 10 и Linux Mint 20.3 (терминал - "mate-terminal").
Пример кода
Условно можно обозначить два варианта использования библиотеки.
Первый - это работа внутри приложения. Вы пишите код сценария на языке OneScript, запускаете сценарий на исполнение в окне терминала и при этом вся информация для пользователя может быть показана только средствами элементов интерфейса. Командная строка не видна, она закрыта приложением. При закрытии приложения закроется и окно терминала.
Второй вариант - вызов интерактивных диалогов или таблиц и другой информации как дополнительная возможность по ходу выполнения вашего основного сценария. Вы при этом остаетесь в командной строке и видите результат например метода Сообщить() непосредственно. При закрытии приложения окно терминала не закроется.
Вот как можно реализовать этот второй вариант в коде. Содержимое основного сценария ПримерGUI.os
Перем ТекПуть;
Процедура ОткрытьДиалог(параметр1) Экспорт
Контекст = Новый Структура();
Контекст.Вставить("МояСтруктура", параметр1);
ЗагрузитьСценарий(ОбъединитьПути(ТекПуть,"ДиалогОткрытия.os"), Контекст);
КонецПроцедуры
ТекПуть = Новый Файл(ТекущийСценарий().Источник).Путь;
МояСтруктура = Новый Структура("Результат", "Файл не выбран");
МассивПараметров = Новый Массив(1);
МассивПараметров[0] = МояСтруктура;
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ОткрытьДиалог", МассивПараметров);
Задание.ОжидатьЗавершения();
Сообщить("Результат = " + МояСтруктура.Результат);
Приостановить(2000);
Задание = ФоновыеЗадания.Выполнить(ЭтотОбъект, "ОткрытьДиалог", МассивПараметров);
Задание.ОжидатьЗавершения();
Сообщить("Результат = " + МояСтруктура.Результат);
Пока Истина Цикл
Приостановить(1000);
КонецЦикла;
Содержимое сценария для интерактивного выбора файла ДиалогОткрытия.os (должен лежать рядом с основным сценарием)
Перем ТФ;
Процедура ДиалогЗакрыт() Экспорт
Если ТФ.АргументыСобытия.Файлы.Количество() > 0 Тогда
МояСтруктура.Результат = ТФ.АргументыСобытия.Файлы.Получить(0);
КонецЕсли;
ТФ.Завершить();
КонецПроцедуры
ПодключитьВнешнююКомпоненту("OneScriptTerminalGui.dll");
ТФ = Новый ТерминалФормыДляОдноСкрипта();
ДиалогОткрытия1 = ТФ.Верхний.Добавить(ТФ.ДиалогОткрытия("Диалог открытия", "Сообщение"));
ДиалогОткрытия1.ДиалогЗакрыт = ТФ.Действие(ЭтотОбъект, "ДиалогЗакрыт");
ДиалогОткрытия1.ПутьКаталога = "C:\";
ДиалогОткрытия1.ПоказатьДиалог();
ТФ.Запуск();
Подобным образом можно организовать любые диалоги с пользователем и вывод различной информации в удобном виде, таблиц, списков, текста и т.д.
Заключение
Я портной. Шью одежды для OneScript. Сшил два пиджака (OneScriptForms и OneScriptDeclarativeForms). И вот этот спортивный костюмчик OneScriptTerminalGui.
Если пуговицу не туда пришил, Вы мне скажите.
У меня в мастерской есть ещё материал, нитки, иголки для пошивки нового фрака. Как сошью, обязательно напишу.
Вступайте в нашу телеграмм-группу Инфостарт