Страница 1 из 1

Tree control toolkit

Добавлено: 12 авг 2022, 23:14
Juri
Мне приходилось пользоваться Tree в основном в четырех главных случаях: 1 сбор всего содержимого папки на диске, 2 разбор содержимого variant, 3 сбор массива всех контролов и индикаторов на передней панели, 4 формирование редактируемой пользователем последовательности разных команд. В каждом случае возникала одна и та же задача - сохранять содержимое дерева, таким образом, чтобы с каждой строкой ассоциировался произвольный массив байт. В первом случае приходилось сохранять массивы байт хранящих файлы, во втором - содержимое каждой переменной внутри variant, в третьем - свойства каждого контрола на передней панели.
Каждый раз я по разному изобретал велосипед и в итоге в последний раз пришел к выводу, что хорошо бы создать универсальный тулкит, который решал бы все 4 задачи одинаково. Вопрос такой: а нет ли уже чего-то готового? Если нет, то в моих планах его создать и выложить в свободное пользование.
Вот основные необходимые мне функции дерева:
1 Возможность сохранить в файл параметры дерева и в том числе ассоциируемые массивы произвольных байт, в том числе все строки таблицы с форматированием.
2 Фильтр по содержимому столбцов. В этом случае дерево превращается в обычную таблицу без иерархии.
3 Свернуть/развернуть все дерево или только выделенную область.
4 Хранение истории изменений и возможность сделать шаг назад или вперед.
5 Добавление, удаление, перетаскивание.
Все эти функции требуют хранения в памяти дубликата всего дерева в виде массива кластеров. Произвольный массив байт конечно можно хранить в текстовом виде в первом столбце и тогда все нужные функции можно будет делать стандартными Property/Invoke node. Однако в таком случае время выполнения множества операций может затягиваться на минуты или даже часы, особенно если я собираю около трех сотен контролов со всех vi которые загружаются на экран в процессе выполнения программы, получая при этом около двух тысяч строк в дереве.
На картинке переводчик программ, который позволяет создавать файл языкового пакета.

upd: Дальнейшие обновления будут тут https://github.com/Yuri-Dudygin/Tree-toolkit

Re: Tree control toolkit

Добавлено: 13 авг 2022, 00:13
Kosist
Вроде бы такого тулкита нет, но, кстати, есть такой тулкит - https://www.vipm.io/package/qsi_qcontrol_toolkit/. Он помогает в создании типа XControl, но без XControl - т.е. контролов с функционалом. И там тоже есть классы для Tree, но как они работают Вам не скажу - не клацал.
Работа с Tree и в других фреймворках/языках тоже не "прямолинейная". Я пробывал на .NET, используя WPF сделать интерфейс с деревом - тоже приходится заморачиваться; хотя там проще тем, что объекты можно прописать классами, а свойства будут "скармливаться" контролу автоматически. В :labview: это нужно делать вручную.
Кстати, Ваш интерфейс для создания файла перевода - я делал тоже такое для этого тулкита https://www.vipm.io/package/anv_s_r_o_l ... t_toolkit/. Идеи витают в воздухе, это отлично :super: .
Было бы круто сделать тулкит ООП - чтобы данные для дерева можно было представлять классами. Есть тулкит, который конвертирует классы в JSON. Есть тоже тулкит, который позволяет JSON отображать в Tree и наоборот. Если связать все это, и сделать удобным - думаю, тулкит получил бы определенную популярность (больше 10 скачиваний :haha: ).
Если напишете свой тулкит, выкладывайте здесь - думаю, много кто даст полезный фидбек.

Re: Tree control toolkit

Добавлено: 13 авг 2022, 01:45
Juri
Kosist писал(а): 13 авг 2022, 00:13 Было бы круто сделать тулкит ООП - чтобы данные для дерева можно было представлять классами.
Можно поподробней? Я не понял

Re: Tree control toolkit

Добавлено: 13 авг 2022, 09:13
Kosist
Tree control нужен для отображения иерархической структуры. В Вашем случае на скрине - дополнительно еще нужно отображать колонки (свойства объектов), но по-сути, тут главное то, что объект Кластер, например, может содержать другие контролы - значит, Кластер - родитель в иерархии, а контролы внутри его - "дети".
Но как описать такую динамическую структуру в коде? Мне, например, проще использовать классы. Т.е. можно создать поле классов-родителей (поле - задает порядок отображения), но в то же время классы могут содержать классы-детей. И вот это поле классов я не хочу вручную парсить - я бы с удовольствием использовал виайку, которая принимает поле классов на входе, и парсит их содержимое для отображения в Tree.
И когда я клацаю на строку в Tree - то тулкит мне возвращает объект, который соотвествует этой строке. А из класса я уже могу вытащить нужные поля. Или, откроется окно для редактирования строки - а окно это будет динамический метод, который я могу определить для класса. Если я удаляю рядок, то тулкит удаляет соотвествующий объект, и т.д.
Ведь API для работы с Tree уже есть, это property/invoke узлы для контрола. Поэтому более полезно иметь что-то, что позволяет более легко работать с данными и их отображать в контроле, нежели вручную их парсить для отображения.

Re: Tree control toolkit

Добавлено: 13 авг 2022, 13:47
Juri
Если я вас правильно понял, то надо сделать vi у которой на входе будет класс как на фото, далее рекурсивно ищутся все вложения классов в этот класс. Tree имеет поле tag, уникальное для каждой строки. В него следует прописать в текстовом виде весь путь расположения вроде такого: TabControl(Tab Control)::Page(Page 2)::Array(Lang all)::String(String), где в скобках свойство Label Text. По крайней мере так я делаю в своем переводчике. Если речь о классах, созданных пользователем, наследников LabVIEW Object, то тут я не понял. Выводить в дерево иерархию всего содержимого класса, т.е. все vi?

Re: Tree control toolkit

Добавлено: 13 авг 2022, 16:08
Kosist
Juri писал(а): 13 авг 2022, 13:47 Если я вас правильно понял, то надо сделать vi у которой на входе будет класс как на фото, далее рекурсивно ищутся все вложения классов в этот класс. Tree имеет поле tag, уникальное для каждой строки. В него следует прописать в текстовом виде весь путь расположения вроде такого: TabControl(Tab Control)::Page(Page 2)::Array(Lang all)::String(String), где в скобках свойство Label Text. По крайней мере так я делаю в своем переводчике. Если речь о классах, созданных пользователем, наследников LabVIEW Object, то тут я не понял. Выводить в дерево иерархию всего содержимого класса, т.е. все vi?
Это ведь просто идея; Вы все равно будете делать так, как Вам удобней/лучше.
На скрине у Вас контрол генерической ссылки. Я имел ввиду класс (lvclass). Классы могут содержать поля (свойства) и методы. Если Вы не используете ООП, то тогда это другая история.

Re: Tree control toolkit

Добавлено: 30 авг 2022, 14:34
Juri
....

Re: Tree control toolkit

Добавлено: 02 сен 2022, 19:51
Juri
Дальнейшие обновления будут тут https://github.com/Yuri-Dudygin/Tree-toolkit

Re: Tree control toolkit

Добавлено: 05 сен 2022, 19:24
Juri
Kosist писал(а): 13 авг 2022, 16:08 Я имел ввиду класс (lvclass). Классы могут содержать поля (свойства) и методы. Если Вы не используете ООП, то тогда это другая история.
Обновил. Теперь можно сделать отображение как в проекте или в том виде как файлы располагаются в файловой системе. Это то что вы имели в виду? (выбрать Mode
и нажать кнопку CLASS)

Re: Tree control toolkit

Добавлено: 06 окт 2022, 13:23
Juri
Есть проблема. В Example.vi все работает хорошо. События Drug срабатывают в TreeController.vi. Но когда запускаю тот же код в Actor Core, то эти события не срабатывают.

Re: Tree control toolkit

Добавлено: 06 окт 2022, 16:28
Artem.spb
Juri писал(а): 06 окт 2022, 13:23 В Example.vi все работает хорошо.
Уж сколько раз твердили миру...
Мало кто из готовых помочь ставит себе последние версии, так что ожидая подсказок стоит подумать о том, сколько человек сможет открыть ваш код

Re: Tree control toolkit

Добавлено: 06 окт 2022, 17:19
Juri
готово 18

Re: Tree control toolkit

Добавлено: 06 окт 2022, 17:45
Artem.spb
Акторов не нашёл.
И сделайте простейший пример, чтобы не приходилось бегать по всему коду.
Могу только предположить, что регистрация события происходит до открытия окна. Хотя, в этом случае должна была ошибка выскочить.

Re: Tree control toolkit

Добавлено: 07 окт 2022, 00:33
Kosist
Juri писал(а): 05 сен 2022, 19:24 Обновил. Теперь можно сделать отображение как в проекте или в том виде как файлы располагаются в файловой системе. Это то что вы имели в виду? (выбрать Mode
и нажать кнопку CLASS)
Нет, я имел ввиду другое - чтобы отображалось содержимое полей класса (не методы, а именно данные, которые хранятся в классе). Это не простая задача, но решаемая. Но пока не начнете использовать ООП, будет тяжело понять.
Любая попытка привнести в мир :labview: - это хорошо, Вы молодец. Но есть несколько моментов, которые бросились в глаза.
Error Codes.png
Error Codes.png (4.24 КБ) 1537 просмотров
1. -1 - не может использовать как код ошибки. В :labview: есть отдельный диапазон кодов, которые можно использовать для "своих" ошибок - вот его и нужно использовать.
Typedefs.png
2. Для кластеров нужно использовать typedefs. Для энумов тоже (там один у Вас есть на скрине, а вот второй не typedef).
3. Если хотите выкатить тулкит в широкую аудиторию - пишите комменты на английском. Комменты на русском (в кирилице в целом) не отображаются на ОС, локализованных под другие языки.
4. Стейт машина в TreeController.vi использует номера для определения стейтов - там должны быть энумы. Основы основ :wink: .
Но в целом допиливайте, это полезный для Вас опыт.

Re: Tree control toolkit

Добавлено: 07 окт 2022, 16:29
Juri
Artem.spb писал(а): 06 окт 2022, 17:45 Акторов не нашёл.
И сделайте простейший пример, чтобы не приходилось бегать по всему коду.
Могу только предположить, что регистрация события происходит до открытия окна. Хотя, в этом случае должна была ошибка выскочить.
Спасибо помогло!