Immediate mode UI оказалась действительно удобным решением для моего случая. Попробовал на зуб одну уникальную библиотеку
Nuklear на OpenGL бекенде. Из плюсов - хорошая производительность и отзывчивость. Несмотря на то, что пробное приложение написано на Си, это позволило использовать часть кодовой базы от основного "серверного" проекта (сеть, OSC таблица и прочее) без ущерба читабельности кода. В связке с асинхронным I/O получается прикольная конструкция: в одном event loop мы получаем изменения состояния извне, обрабатываем действия локального пользователя, отправляем при необходимости изменения на сервер и рисуем итоговое состояние на экран. Такое даже получится на встраиваемых системах запустить.
Но использование
Nuklear не обошлось без недостатков. Я сразу же столкнулся с неприятными особенностями:
- Оказалось достаточно сложно кастомизировать существующие виджеты. Если со стилями еще можно побороться, то вот менять поведение элементов уже не так просто.
- Проблематично создавать свои виджеты. Да, там есть простое API для рисования, с помощью которого можно сделать что угодно, но тогда большая часть библиотеки окажется не нужна (базовые элементы там реализованы довольно лаконично, не хочется дублировать это для локального случая).
- Layouting. Все API для верстки завязано на строках с колонками с привязкой по ширине (по высоте пока нельзя). Местами приходилось все делать либо с абсолютным позиционированием, либо поправлять падингами, либо расставлять костыли и использовать грязные хаки.
В итоге использовать напрямую подобные библиотеки пока что не представляется возможным. Все таки интерфейс должен быть очень не стандартным. Возможно в дальнейшем получится потратить время и сделать свой более общий Nuklear для создания произвольных интерфейсов. Все таки в Nuklear есть отличная идея с буфером команд , списками вершин и элементов. Как ядро это можно вполне успешно использовать. Пока что это только мысли.
Вопрос конечно получился очень специфический и наверно его стоит закрыть.