Skip to content

IngvarRiga/TurboVision-dialog-designer

Repository files navigation

TurboVision dialog designer

Основное окно

Спасибо авторам:

Дизайнер диалогов, основанный на портированной библиотеке Turbo Vision

При сохранении в JSON используется JSON for Modern C++

To compile with English resources, use the definition when building the project.

#define ENG

Краткое описание

Проект создан для облегчения формирования диалоговых окон, при использовании библиотеки TurboVision при создании консольных приложений. Я не ставил перед собой цель создать многофункциональный программный продукт, а просто решил некоторым образом облегчить себе жизнь при работе над одной из собственных задач. В связи с этим - не ожидайте, что данный редактор будет обновляться очень часто и вообще будет постоянно в активном развитии.

Реализованный на сегодняшний момент вариант практически полностью удовлетворяет моим потребностям, хотя, имея перед собой пример, как можно реализовать подобное (например дизайнер диалогов TV от L. David Baldwin) я понимаю, что совершенству нет предела... Но эта программа - только "гаечный ключ" и ничего более. Таким образом - постоянная ее доработка и наращивание функционала не планируется. Хотя и вполне вероятна.

Код проекта является неорганизованным и не оптимизированным, поскольку писался на коленке в спешке. Будет или нет производится его нормализация - не знаю.

Исходя из сказанного и как я обещал автору портированной библиотеки, указанной выше, я выкладываю исходный код проекта в открытый доступ. Если кто желает использовать данный код, для того чтобы доработать программу, улучшить ее функционал - используйте.

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

А теперь немного о самом проекте:

  • собран с использованием MS Visual Studio 2022 Community Edition;
  • позволяет использовать локализацию интерфейса не "на лету", но все же. Для этого используйте файл multilang.h и задавайте соответствующую константу при сборке проекта;
  • библиотеку TurboVision ищите по ссылке вверху (собранная бибилиотека/заголовки есть внутри проекта);
  • библиотеку nlohmann::json ищите по ссылке вверху (рабочая версия есть внутри проекта);
  • проверка под Linux не производилась, изначально проект был разработан с использованием TDM MinGW C++ x64 c++14, но по некоторым причинам перенесен в MS VC, тем не менее должен собираться и в Linux;
  • программа должна запускаться от имени администратора иначе с высокой вероятностью будет виснуть;
  • после запуска программа отображает только "палитру компонентов", помеченную в заголовке "D&D". Все как всегда, зажали компонент левым кликом мыши и тащите куда надо, и там бросайте. Над каким окном бросили туда и попадет, несмотря ни на что. Бросили над "desktop" - отменили операцию;
  • никаких окон по умолчанию не создается, используйте меню/горячие клавиши;
  • программа позволяет использовать механизм Drag&Drop для компонентов, которые полностью реализованы в дизайнере, т.е. создание, настройка и генерация кода;
  • кроме Drag&Drop в созданном диалоговом окне есть контекстное меню, вызываемое по клику на знаке "=" на левой границе окна;
  • сохранение разрабатываемых диалогов производится только в формате JSON;
  • и да, программа позволяет редактировать одновременно несколько диалогов.

Кратко по редактированию:

  • Ctrl+N - создать новый диалог (можно несколько одновременно);
  • компонент становится выделенным, когда по нему кликнут (красный цвет) (для TListBox/TMemo пока не работает, но они все равно становятся "выделенными");
  • перемещение компонента по форме - кликнув и зажав левую клавишу мыши;
  • изменение размеров - кликнув и зажав левую кнопку мыши на правом нижнем углу компонента (или просто на правом для TInputLine, например, поскольку он однострочный);
  • двойной клик на компоненте - вызов его настроек;
  • правый клик - контекстное меню компонента;
  • Ctrl+Del - удаляет выделенный красным компонент (есть плавающая ошибка, при которой крайне редко удаляются не только красный компонент, но и несколько других, пытаюсь найти, замечено только при удалении строки ввода);
  • двойной клик по пустому месту в диалоге - вызов свойств самого диалога;
  • Alt+C - выравнивание размера текущего диалога по его содержимому;
  • F9 - тестирование диалога.
  • F2 сохранение диалога с тем же самым именем с каким был загружен, либо, если вновь созданный - задается имя;
  • Shift+F2 - сохранить диалог как...;
  • Ctrl+Ins / Shift+Ins - взять в буфер текущий элемент / вставить из буфера;

Самое главное: Alt+X - мгновенно закрывает программу, даже если вы не сохранили измененные диалоги - никаких вопросов задано не будет. Да, это неправильно, я знаю. Пока руки не дошли :)

Все остальное - смотрите на указанные в меню короткие клавиши.

Планы, которые могут быть реализованы, а могут и нет


Сразу оговорюсь: то что здесь перечислено - это просто то, чего мне в свое время так не хватало или то, что пришло в голову по результатам собственной тестовой эксплуатации. Но учитывая, что данный проект - просто хобби, помогающее основному направлению деятельности - ждать, что будет реализовано написанное не стоит. Можете присоединиться и дописать сами. Как уже говорил - буду рад помощи.

  • индикатор сохранения диалога на границе окна;
  • добавление редактора свойств или хотя бы его отображение для удобства;
  • переделка базовых компонентов с "выравниванием" API для нормального доступа к функциям и полям, имеющим стандартизированные имена и упорядоченные модификаторы доступа, а не как бог на душу положил в случае стандартной библиотеки;
  • дизайнер меню;
  • дизайнер цветовых схем для использования различными компонентами, поскольку реализацию палитр сделанную в базовой версии считаю убогой и неудобной (могу ошибаться);

Известные проблемы


  • да, свойства и прочие настройки TMemo/TListBox не реализованы и когда будут - не знаю, поскольку сам я их пока что не использую, понимаю, что стоило бы доделать до конца, однако и без того пришлось переопределять практически всю ветку объектов, короче пока нет времени. Если кто захочет - пишите, я подскажу что делать;
  • в коде программы для парирования ошибок загрузки JSON используется конструкция try/catch, которая на сколько мне известно не работает или работает криво в Linux. Печально, но это проблемы самого Linux и его компиляторов. Проверять самому нет времени и желания, если есть кто-то кто хочет исправит/поправить - пишите сразу решение, я сам разбираться не буду - нет времени.

Небольшие комментарии

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

В исходном коде редактора диалогов реализованы 2 дополнительных компонента, которых так не хватает постоянно:

  • TInputLong - радактор, базирующийся на TInputLine и позволяющий вводить исключительно данные типа long int;
  • TInputDouble - радактор, базирующийся на TInputLine и позволяющий вводить исключительно данные типа long double.

Компоненты имеют:

  • задаваемые min/max/default/AllowNotDefined. В TInputDouble дополнительно есть свойство precision, которое управляет точностью вывода числа при отображении. Правда, при этом есть небольшая неприятность: при конвертации используется функция snprintf, которая округляет числа и может так получиться, что полученное при округлении число будет выходить за пределы заданного диапазона;
  • выпадающие меню, которое вызывается при правом клике мышкой на строке ввода и позволяет устанавливать предопределённые значения (реализовано не в редакторе а в самих компонентах);
  • цветовые подсказки некорректности ввода - красным, при пустом значении в поле ввода выводится допустимый диапазон на красном фоне, а если AllowNotDefined = true - на сером.
  • границы по умолчанию установлены в LONG_MIN...LONG_MAX / -DBL_MAX...DBL_MIN. Данные границы корректно работают при сборке в MS VC 2022 и глючат для MinGW в части TInputDouble. Разбираюсь в чём дело.

Короче говоря - пробуйте в дизайнере и жмите тестировать диалог для понимания что и как. Будут вопросы - пишите.

Для включения в свой проект берите textrainput.h / textinputdouble.cpp / textinputlong.cpp. В заголовке есть ресурсы для локализации.

Последние изменения

(последние изменения всегда вверху списка, не нужно листать)

28.06.2023

  • Правка редактора свойств TInputDouble;
  • TInputDouble теперь содержит свойство AllowNotDefined, определяющее, что компонент может содержать неопределённое значение. Неопределённое значение задаётся как пустая строка, при этом компонент рисуется тёмно-серым цветом и выводятся допустимые границы задания значений. Соответственно, добавлены функции управления этим свойством;
  • В палитру компонентов добавлен TMemo (редактор свойств пока не функционален);
  • В палитру компонентов добавлен TListBox (редактор свойств пока отсутствует);
  • Исправлена функция удалить в выпадающем меню для TInputLong / TInputDouble;
  • TInputDouble установлены ограничения по умолчанию от -DBL_MAX до DBL_MAX. В Microsoft всё работает, в gcc 13.1 что-то не так с определениями констант;
  • исправлена сборка cmake для MinGW 64 (в который раз);

22.06.2023

  • Правка редактора свойств TInputLong;
  • TInputLong теперь содержит свойство AllowNotDefined, определяющее, что компонент может содержать неопределённое значение. Неопределённое значение задаётся как пустая строка, при этом компонент рисуется тёмно-серым цветом и выводятся допустимые границы задания значений. Соответсвенно, добавлены функции управления этим свойством;

12.06.2023

  • Правка cmakelists.txt;
  • Откорректирован код в части подавления предупреждений компиляции;

05.06.2023

  • textrainput.h / textinputlong(double) - содержат определения для ввода long (double) с заданными ограничениями. Если вводимое значение не допустимо строка подсвечивается красным. Если вводимое значение пустое - выводится диапазон допустимых значений (по умолчанию - очень длинный текст и может не помещаться в строку). Правый клик на строке ввода - контектное меню с возможностью выбора 3-х значений минимума / по умолчанию / максимума. Имеют свойства setValue() / getValue() которыми нужно пользоваться для установки и получения значений.
  • Исправлен авторазмер диалога;
  • TInputDouble - добавлено свойство 'точность' - отвечает за точность представления числа, когда пользователь устанавливает значение программно. Не влияет на точность представления при ручном вводе числа;
  • Добавлено окно редактирования свойств TInputDouble;
  • Исправлена генерация кода диалога в части TInputDouble;
  • Английские ресурсы для окна свойств TInputLong;

01.06.2023

  • Оптимизация кода;
  • Сделан и проверен cmake для сборки (немного корявый, но как есть);
  • msvc_eng (_ru) - командные файлы для полной сборки (Release) для MS Visual C++ с соответствующими ресурсами;

31.05.2023

  • Оптимизация кода;
  • Перевод окна свойств TDialog;

26.08.2022

  • Исправлена ошибка сохранения имени базового класса диалога при редактировании его свойств;
  • Генерация #define Uses_ ... содержит только необходимые элементы;
  • При генерации исходного кода автоматически формируются шаблоны функций setData/getData и обработчик событий

25.08.2022

  • Добавлена генерация заголовка при создании исходного кода диалога.

24.08.2022

  • Текущий релиз рабочий в части стандартных компонентов.

08.08.2022

  • Обнаружены новые ошибки в TInputLong... печально, пытаюсь исправить;
  • Добавлено окно редактирование свойств TInputLong;

05.08.2022

  • В палитру компонентов добавлен TInputLong / TInputDouble. TInputLong реализован, см. в textrainput.cpp. Предназначен для ввода любых целых чисел от LONG_MIN до LONG_MAX. TInputDouble - пока не реализован (предполагается редактирование long double). Редактор свойств в процессе доделки;
  • При проектировании диалога TInputLine содержит "ABC", TInputLong - "123"/ TInputDouble - "1.2" чтобы отличать где какой тип полей, а то уже сам путаюсь;
  • Для использования TInputLong используйте в своём проекте исходный код textrainput.cpp / textrainput.h

27.07.2022

  • Небольшая очистка кода;
  • Сделан компонент редактирования целых чисел (в палитре пока что нет);
  • Сделан CMakeLists.txt (mingw.cmd предназначен для автоматической сборки mingw компилятором в Windows) правильно или нет - неважно учусь пока что использовать. Если есть желание сделать "как надо" не стесьняйтесь предлагайте свое решение. Программа компилируется по умолчанию с Русскими ресурсами. Для использования английских откорректируйте CMakeLists.txt строку
#use Russian (RUS) or English (ENG) resource string
add_definitions(-DRUS)

17.06.2022

  • Доделано окно редактирования свойств TDialog, исходный код генерируется согласно настройкам
  • С учётом дальнейшей доработки исходный код диалога теперь сохраняется в файл с расширением *.src

16.06.2022

  • Исправлена идиотская ошибка сохранения исходного файла диалога, при которой исходный код содержимого не генерировался!
  • Переделано (пока что не полностью) окно редактирования свойств диалога. Сейчас можно задавать флаги окна.

06.06.2022

  • Исправлен вызов окна сохранения диалога при закрытии через кнопку закрытия окна. Ранее вызывалось не сохранение а окно свойств диалога.

24.05.2022

  • Откорректирован вызов контекстного меню диалога, согласно предложениям magiblot. Однако меню все равно вызывается только при отпускании правой клавиши :) (извините, как привык...)

12.05.2022

  • Исходный код работы со TStremableClass исключен из проекта

26.04.2022

  • Внимание! Звгрузка и выгрузка из/в ресурсы DLG исключено полностью!
  • Исправления в интерфейсе контекстных меню;

24.04.2022

  • Исправлена ошибка редактирования TRadioButtons/TCheckBoxes;
  • Исправлена ошибка авторазмера диалога;

21.04.2022

  • Корректировка алгоритма сохранения файлов. Теперь все диалоги по умолчанию сохраняются в JSON. F2 - сохранить, Shift+F2 - сохранить как;
  • Загрузка из файлов ресурсов лишена коротких клавиш;
  • ВНИМАНИЕ! Сохранение в ресурсных файлах - исключено из алгоритма как устаревшее, теперь только в JSON;

20.04.2022

  • ВНИМАНИЕ! Начиная с этой версии сохранение в виде ресурсов категорически не рекомендуется. Данная возможность будет окончательно удалена из программы как только я переведу все свои наработки (немногочисленные, к слову сказать) в формат JSON;
  • Реализовно Copy/Paste (Ctrl+Ins / Shift+Ins) компонентов внутри диалога и между редактируемыми диалогами. Даже если скопируете и закроете диалог, буфер обмена будет содержать скопированный элемент, который переносится как описание в JSON формате. Перенос объектов - по одному! Никаких групповых переносов (... ну по крайней мере пока что :) );
  • Исправление некоторых найденных ошибок;
  • Небольшой рефакторинг/оптимизация кода;

06.04.2022

  • Добавлена функция тестирования текущего диалога (просто пересоздание на основе стандартных компонентов и отображение в модальном режиме);

05.04.2022

  • Добавлена функция автоматического подбора размера диалога (в основном меню программы). Функция смотрит правую и нижнюю границы компонентов в окне и выравнивает размеры диалогового окна;

01.04.2022

  • Сделан первый вариант сохранения в JSON,(сохраняются только: TDialog, TInputLine, TButton, TStaticText, TCheckBoxes, TRadioButtons, TMemo, остальное пока нет :) );
  • Исправлены замеченные мелкие ошибки;

07.02.2022

  • Код диалога генерируется в том порядке, в котором произошла вставка компонентов в окно
  • Добавлена возможность (опция) центрирования диалоговых окон в настройках TDialog Properties, которая, однако, не сохраняется пока в ресурсах, поскольку сейчас мне важна именно совместимость этих ресурсов с этим редактором из другого проекта;

02.02.2022

  • Правка генерации кода TMemo / TListBox
  • Изменен цвет кнопки контекстного меню диалога стал черный на ярко зеленом фоне

01.02.2022

  • Откорректировано поведение Drag&Drop компонентов, теперь если промахиваешься мимо конкретного окна программа проверяет попадание в другие окна, и если куданибудь попадает - вставляет компонент туда. Хорошо или плохо - решать вам. Сделано для одновременного редактирования нескольких окон;
  • При вставке компонента через Drag&Drop диалог, в который вставляется компонент сразу становится активным (это играет роль когда вы пытаетесь сразу изменить размеры или положение брошенного компонента, не приходится делать лишний клик);
  • Увеличина длина вставляемого TInputLIne;

31.01.2022

  • Переделана функция изменения размеров компонентов. Теперь изменять размеры компонента нужно кликнув по правому нижнему углу компонента (или просто по правому, если компонент однострочный);
  • Добавлено контекстное меню, вызываемое по правому клику мышкой на компоненте. Меню содержит разное количество пунктов для разных компонентов. Но стандартными являются - вызов редактора свойств (эквивалентен двойному клику по компоненту) и удаление компонента (в отличие от нажатия на Ctrl+Del -> Удаляется компонент для которого вызвано меню!) Свойства TMemo/TListBox пока что не реализованы;
  • Для TStaticText/TButton доступен пункт выпадающего меню: авторазмер по содержимому, который выравнимает размер компонента по введенному тексту, даже вроде как с учетом Unicode... правда перерисовывает его порой не сразу а при последующем наведении мыши, не пойму в чем проблема;
  • При простом перемещении курсора мыши по заштрихованной области редактируемого диалога текущая позиция мыши (символ) подсвечивается зеленым. Данная подсветка пропадает если навести курсо на компонент и автоматически появляется снова при перемещении мыши на заштрихованную область. Мне просто очень потребовался данный указатель :);
  • Выпадающее меню диалога теперь возникает только при отпускании правой кнопки мыши на заштрихованном поле;

28.01.2022

  • Исправлено сохранение в ресурсах при добавлении TCheckBoxes / TRadioButton;
  • Контекстное меню редактируемого диалога, вызываемое по правому клику мышки на пустом месте диалога;
  • Вставить TMemo можно через контекствное меню диалога, код генерируется (свойства пока что не редактируются);
  • Вставить TListBox можно через контекствное меню диалога, код генерируется (свойства пока что не редактируются);
  • При использовании выпадающего меню диалога вставка компонентов производится в точку клика правой кнопкой мыши;
  • Исправлено действие сохранения диалога, при закрытии через кнопку на окне;
  • Изменен состав меню диалога, вызываемого по нажатию на "=";