Спасибо авторам:
Дизайнер диалогов, основанный на портированной библиотеке Turbo Vision
При сохранении в JSON используется JSON for Modern C++
#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. В заголовке есть ресурсы для локализации.
- Правка редактора свойств TInputDouble;
- TInputDouble теперь содержит свойство AllowNotDefined, определяющее, что компонент может содержать неопределённое значение. Неопределённое значение задаётся как пустая строка, при этом компонент рисуется тёмно-серым цветом и выводятся допустимые границы задания значений. Соответственно, добавлены функции управления этим свойством;
- В палитру компонентов добавлен TMemo (редактор свойств пока не функционален);
- В палитру компонентов добавлен TListBox (редактор свойств пока отсутствует);
- Исправлена функция удалить в выпадающем меню для TInputLong / TInputDouble;
- TInputDouble установлены ограничения по умолчанию от -DBL_MAX до DBL_MAX. В Microsoft всё работает, в gcc 13.1 что-то не так с определениями констант;
- исправлена сборка cmake для MinGW 64 (в который раз);
- Правка редактора свойств TInputLong;
- TInputLong теперь содержит свойство AllowNotDefined, определяющее, что компонент может содержать неопределённое значение. Неопределённое значение задаётся как пустая строка, при этом компонент рисуется тёмно-серым цветом и выводятся допустимые границы задания значений. Соответсвенно, добавлены функции управления этим свойством;
- Правка cmakelists.txt;
- Откорректирован код в части подавления предупреждений компиляции;
- textrainput.h / textinputlong(double) - содержат определения для ввода long (double) с заданными ограничениями. Если вводимое значение не допустимо строка подсвечивается красным. Если вводимое значение пустое - выводится диапазон допустимых значений (по умолчанию - очень длинный текст и может не помещаться в строку). Правый клик на строке ввода - контектное меню с возможностью выбора 3-х значений минимума / по умолчанию / максимума. Имеют свойства setValue() / getValue() которыми нужно пользоваться для установки и получения значений.
- Исправлен авторазмер диалога;
- TInputDouble - добавлено свойство 'точность' - отвечает за точность представления числа, когда пользователь устанавливает значение программно. Не влияет на точность представления при ручном вводе числа;
- Добавлено окно редактирования свойств TInputDouble;
- Исправлена генерация кода диалога в части TInputDouble;
- Английские ресурсы для окна свойств TInputLong;
- Оптимизация кода;
- Сделан и проверен cmake для сборки (немного корявый, но как есть);
- msvc_eng (_ru) - командные файлы для полной сборки (Release) для MS Visual C++ с соответствующими ресурсами;
- Оптимизация кода;
- Перевод окна свойств TDialog;
- Исправлена ошибка сохранения имени базового класса диалога при редактировании его свойств;
- Генерация #define Uses_ ... содержит только необходимые элементы;
- При генерации исходного кода автоматически формируются шаблоны функций setData/getData и обработчик событий
- Добавлена генерация заголовка при создании исходного кода диалога.
- Текущий релиз рабочий в части стандартных компонентов.
- Обнаружены новые ошибки в TInputLong... печально, пытаюсь исправить;
- Добавлено окно редактирование свойств TInputLong;
- В палитру компонентов добавлен TInputLong / TInputDouble. TInputLong реализован, см. в textrainput.cpp. Предназначен для ввода любых целых чисел от LONG_MIN до LONG_MAX. TInputDouble - пока не реализован (предполагается редактирование long double). Редактор свойств в процессе доделки;
- При проектировании диалога TInputLine содержит "ABC", TInputLong - "123"/ TInputDouble - "1.2" чтобы отличать где какой тип полей, а то уже сам путаюсь;
- Для использования TInputLong используйте в своём проекте исходный код textrainput.cpp / textrainput.h
- Небольшая очистка кода;
- Сделан компонент редактирования целых чисел (в палитре пока что нет);
- Сделан CMakeLists.txt (mingw.cmd предназначен для автоматической сборки mingw компилятором в Windows) правильно или нет - неважно учусь пока что использовать. Если есть желание сделать "как надо" не стесьняйтесь предлагайте свое решение. Программа компилируется по умолчанию с Русскими ресурсами. Для использования английских откорректируйте CMakeLists.txt строку
#use Russian (RUS) or English (ENG) resource string
add_definitions(-DRUS)
- Доделано окно редактирования свойств TDialog, исходный код генерируется согласно настройкам
- С учётом дальнейшей доработки исходный код диалога теперь сохраняется в файл с расширением *.src
- Исправлена идиотская ошибка сохранения исходного файла диалога, при которой исходный код содержимого не генерировался!
- Переделано (пока что не полностью) окно редактирования свойств диалога. Сейчас можно задавать флаги окна.
- Исправлен вызов окна сохранения диалога при закрытии через кнопку закрытия окна. Ранее вызывалось не сохранение а окно свойств диалога.
- Откорректирован вызов контекстного меню диалога, согласно предложениям magiblot. Однако меню все равно вызывается только при отпускании правой клавиши :) (извините, как привык...)
- Исходный код работы со TStremableClass исключен из проекта
- Внимание! Звгрузка и выгрузка из/в ресурсы DLG исключено полностью!
- Исправления в интерфейсе контекстных меню;
- Исправлена ошибка редактирования TRadioButtons/TCheckBoxes;
- Исправлена ошибка авторазмера диалога;
- Корректировка алгоритма сохранения файлов. Теперь все диалоги по умолчанию сохраняются в JSON. F2 - сохранить, Shift+F2 - сохранить как;
- Загрузка из файлов ресурсов лишена коротких клавиш;
- ВНИМАНИЕ! Сохранение в ресурсных файлах - исключено из алгоритма как устаревшее, теперь только в JSON;
- ВНИМАНИЕ! Начиная с этой версии сохранение в виде ресурсов категорически не рекомендуется. Данная возможность будет окончательно удалена из программы как только я переведу все свои наработки (немногочисленные, к слову сказать) в формат JSON;
- Реализовно Copy/Paste (Ctrl+Ins / Shift+Ins) компонентов внутри диалога и между редактируемыми диалогами. Даже если скопируете и закроете диалог, буфер обмена будет содержать скопированный элемент, который переносится как описание в JSON формате. Перенос объектов - по одному! Никаких групповых переносов (... ну по крайней мере пока что :) );
- Исправление некоторых найденных ошибок;
- Небольшой рефакторинг/оптимизация кода;
- Добавлена функция тестирования текущего диалога (просто пересоздание на основе стандартных компонентов и отображение в модальном режиме);
- Добавлена функция автоматического подбора размера диалога (в основном меню программы). Функция смотрит правую и нижнюю границы компонентов в окне и выравнивает размеры диалогового окна;
- Сделан первый вариант сохранения в JSON,(сохраняются только: TDialog, TInputLine, TButton, TStaticText, TCheckBoxes, TRadioButtons, TMemo, остальное пока нет :) );
- Исправлены замеченные мелкие ошибки;
- Код диалога генерируется в том порядке, в котором произошла вставка компонентов в окно
- Добавлена возможность (опция) центрирования диалоговых окон в настройках TDialog Properties, которая, однако, не сохраняется пока в ресурсах, поскольку сейчас мне важна именно совместимость этих ресурсов с этим редактором из другого проекта;
- Правка генерации кода TMemo / TListBox
- Изменен цвет кнопки контекстного меню диалога стал черный на ярко зеленом фоне
- Откорректировано поведение Drag&Drop компонентов, теперь если промахиваешься мимо конкретного окна программа проверяет попадание в другие окна, и если куданибудь попадает - вставляет компонент туда. Хорошо или плохо - решать вам. Сделано для одновременного редактирования нескольких окон;
- При вставке компонента через Drag&Drop диалог, в который вставляется компонент сразу становится активным (это играет роль когда вы пытаетесь сразу изменить размеры или положение брошенного компонента, не приходится делать лишний клик);
- Увеличина длина вставляемого TInputLIne;
- Переделана функция изменения размеров компонентов. Теперь изменять размеры компонента нужно кликнув по правому нижнему углу компонента (или просто по правому, если компонент однострочный);
- Добавлено контекстное меню, вызываемое по правому клику мышкой на компоненте. Меню содержит разное количество пунктов для разных компонентов. Но стандартными являются - вызов редактора свойств (эквивалентен двойному клику по компоненту) и удаление компонента (в отличие от нажатия на Ctrl+Del -> Удаляется компонент для которого вызвано меню!) Свойства TMemo/TListBox пока что не реализованы;
- Для TStaticText/TButton доступен пункт выпадающего меню: авторазмер по содержимому, который выравнимает размер компонента по введенному тексту, даже вроде как с учетом Unicode... правда перерисовывает его порой не сразу а при последующем наведении мыши, не пойму в чем проблема;
- При простом перемещении курсора мыши по заштрихованной области редактируемого диалога текущая позиция мыши (символ) подсвечивается зеленым. Данная подсветка пропадает если навести курсо на компонент и автоматически появляется снова при перемещении мыши на заштрихованную область. Мне просто очень потребовался данный указатель :);
- Выпадающее меню диалога теперь возникает только при отпускании правой кнопки мыши на заштрихованном поле;
- Исправлено сохранение в ресурсах при добавлении TCheckBoxes / TRadioButton;
- Контекстное меню редактируемого диалога, вызываемое по правому клику мышки на пустом месте диалога;
- Вставить TMemo можно через контекствное меню диалога, код генерируется (свойства пока что не редактируются);
- Вставить TListBox можно через контекствное меню диалога, код генерируется (свойства пока что не редактируются);
- При использовании выпадающего меню диалога вставка компонентов производится в точку клика правой кнопкой мыши;
- Исправлено действие сохранения диалога, при закрытии через кнопку на окне;
- Изменен состав меню диалога, вызываемого по нажатию на "=";