vak: (Default)
[personal profile] vak
Понадобилось мне по работе сваять простой плеер мультиков. То есть утилитку с графическим интерфейсом, показывающую выполнение некого вычислительного процесса на хитром матричном процессоре. Выглядит как мультик: данные бегают туда-сюда, умножители пыхтят. Как делать понятно, но надо подобрать, на чём делать. Пошёл я искать, какие нынче фреймворки в ходу, и оказалось непросто.

Работать должно на маке, линуксе и виндоуз, как обычно принято. Должен быть родной бинарный код для каждой платформы, а не виртуальные машины. Ну и размер приложения чтобы не зашкаливал. Ещё один критерий: язык лучше Rust, а не Си++, по возможности. Накушались уже этого Си++, всё с ним понятно, пора начинать переходить на более развитые вещи.

По старой памяти, стал я смотреть Qt, Gtk, Wx и другие известные библиотеки. У всех у них есть даже кое-какая привязка к Rust. Но Wx давно отстал от жизни, Gtk нормально фурычит только на линуксе, остался один Qt. И выяснились с ним серьёзные проблемы.
  • Qt больше не свободный софт. Мало того, для коммерческого применения его нельзя купить один раз и всю жизнь использовать, как раньше. Надо платить подписку каждый год, на каждого программиста в команде. Перестал платить - не можешь больше продавать свой софт на базе Qt.
  • Можно юзать Qt с лицензией LGPL, не все компоненты, но основные. Но только с разделяемыми библиотеками. Никакой статической линковки. Это означает, что вместе с кодом своего приложения (обычно пара мегабайт) надо выдавать юзеру 200 мегабайт бинарников библиотек Qt. Как-то несоразмерно.
  • Для Rust есть привязка к Qt, и на первый взгляд оно работает, я даже переписал пример простого текстового редактора с Си++ на Rust+Qt. Но при ближайшем рассмотрении возникают большие проблемы. Порождение новых элементов графического интерфейса в Qt делается через наследование классов Си++. Отлично работает, но... в языке Rust нет наследования. Серьёзная часть базовой функциональности недоступна.
По совету [personal profile] spamsink попробовал я CopperSpice. Тут хотя бы не надо подписку платить. Но опять же LGPL, то есть 200 мегабайт бинарников вынь да положь. И главная проблема: недостаточная поддержка. Из готовых пакетов не поставишь: ни на Убунту, ни на маке CopperSpice нету в пакетах. Собрать на маке не удалось: неопределённые темплейты и классы где-то в cs_string.h. Явная несовместимость с последней версией Apple SDK12.0. На линуксе собралось, но не запускается:
The application failed to start because the platform plugin was not found or did not load.
Requested Plugin Key: "xcb"
Бился-бился, да так и бросил.

Вообще этот CopperSpice (да и Qt) - махина жуткого размера. Компиляция занимает несколько часов на не самой слабой машине. Для небольшого приложения явный перебор.

В общем, пока я остановился на Iced. Делает ровно то, что нужно, и приложения имеют разумный размер в пределах 4-7 мегабайт, без больших зависимостей.

Date: 2021-11-08 23:46 (UTC)
sab123: (Default)
From: [personal profile] sab123
Для такого рода вещей самая милая штука - Tk. Хоть с тиклом, хоть с перлом, хоть с питоном.

Date: 2021-11-09 07:31 (UTC)
sab123: (Default)
From: [personal profile] sab123
Писать гуй на компилируемом языке - совершенно бессмыссленные страдания. Для гуя скриптовые языки просто идеальны.

Date: 2021-11-09 00:07 (UTC)
sjtonic: (Default)
From: [personal profile] sjtonic
Посмотрите на Qt4 - вполне нормальные библиотеки и без лицензионных ограничений Qt5. Компилировать Qt надо один раз, а потом используются сгенерирование бинарники.

Date: 2021-11-09 00:35 (UTC)
ircicq: (Default)
From: [personal profile] ircicq
https://github.com/AvaloniaUI/Avalonia

если нет предубеждений против .NET

Date: 2021-11-09 00:59 (UTC)
dmm: (Default)
From: [personal profile] dmm
> В общем, пока я остановился на Iced

На первый взгляд, выглядит отлично.

"Inspired by Elm programming language" - это, вообще, практически лучшее, что бывает в области интерфейсов... Permissive license, как и должно быть.

Date: 2021-11-09 01:23 (UTC)
archaicos: Шарж (Default)
From: [personal profile] archaicos
Ещё есть https://www.libsdl.org/ .

Date: 2021-11-09 01:45 (UTC)
From: [personal profile] qvb
А нужен именно бинарный код? А то ведь и на JS написать можно, и будет работать практически везде.

Date: 2021-11-09 05:25 (UTC)
From: [personal profile] vakhitov
FLTK?

Date: 2021-11-09 07:02 (UTC)
From: [personal profile] alequest
Непонятно, в русской Вики написано, что лицензия LGPL. Свой код раскрывать необязательно. Врут?

Date: 2021-11-09 07:39 (UTC)
norian: (Default)
From: [personal profile] norian
кутэ подскурвилось конечно и обросло всякой шнягой после коммерциализации троллтека

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

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

Date: 2021-11-09 07:54 (UTC)
norian: (Default)
From: [personal profile] norian
не, там больше 700 мегов базовых библиотек для гуя, партизан боснюк завидуэ
Edited Date: 2021-11-09 07:54 (UTC)

Date: 2021-11-09 09:08 (UTC)
From: [personal profile] ivanrubilo
Я б на libSDL зафигачил, если гуй не особо забубённый, для более забубённого наверное на Mono, а то и вообще на Electron.

Date: 2021-11-09 10:04 (UTC)
ufm: (Default)
From: [personal profile] ufm
Что люди не придумают, лишь бы на Паскале не писать... :)

Date: 2021-11-09 15:37 (UTC)
vlad_m: (Default)
From: [personal profile] vlad_m
Шит!
Я, когда читал про отсутствие статических библиотек в qt, решил, что лицензия на программиста нужна на время разработки.
А, оказывается, "пожизненно".

Date: 2021-11-21 11:15 (UTC)
x86128: (Default)
From: [personal profile] x86128
Библиотека, очевидно, последнее слово техники - асинхронщина есть, экспорт в WebAssembly.

Интересно, использование таких билдеров:
Row::new()
                    .spacing(20)
                    .align_items(Alignment::Center)
                    .push(checkbox)
                    .push(
                        Button::new(edit_button, edit_icon())
                            .on_press(TaskMessage::Edit)
                            .padding(10)
                            .style(style::Button::Icon),
                    )
                    .into()

Приводит ли к тому что Rust на этапе компиляции преобразует это в команды отрисовщика, которые будут вызываться только тогда, когда этот элемент будет перерисовываться? Таким образом переложив заботу отрисовки на клиента, а не систему. (позволив избежать построения динамических структур внутри библиотеки/системы) Мне кажется в теории, это более эффективно должно быть.

Для веба там еще заявлена отрисовка через WebGPU API 😮
Edited Date: 2021-11-21 11:59 (UTC)