LINUX.ORG.RU

Бывают ли человечьи Immediate Mode GUI?

 , imgui


0

2

Я тут столкнулся с понятием Immediate Mode GUI. Начинается там все со стандартного «MVC плёха» но дальше чувствуется запах серы :). Я в принципе положительно отношусь к выпиливанию стейтов, но делать это ценой смешивания кода со всем чем-то можно - как-то подозрительно. Как там анимацию приделывать - вообще непонятно.

Там есть вообще какая-то приличные по современным меркам реализации, пригодные на что-то большее чем накладывание субтитров на видео? Возможно мне попадались не самые лучшие библиотеки.

★★★★★
Ответ на: комментарий от RazrFalcon

Зачем? Если речь об LVGL, то она оптимизирована под мелкие чипы, и там вообще отсутствует прослойка команд, которые можно было бы на GPU переложить. К мелким SOC-ам никто не будет подключать 4К.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Shadow

Вопрос философский. IMHO нынче именно в жабаскрипте обкатываются свежие идеи по моделям и методикам, потому что там клиент и сервер разделены физически и схалявить гарантированно не получится.

Если ты про реактивные биндинги - IMHO это вполне годная тема для уменьшения ада из эвентов.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Ну только если так. Всё равно ад костылей то там, то тут прорывается :(

Shadow ★★★★★
()
Ответ на: комментарий от Vit

Так и я вас не заставляю. :)

Я так и не упираюсь, мне прекрасно живётся без неё. Просто может пригодится, вот я и говорю, что с imgui такое просто по-моему около невозможно.

a1batross ★★★★★
()
Ответ на: комментарий от RazrFalcon

Цель программы: выполнять полезную работу. А интерфейс — всего лишь средство получить данные от пользователя и передать результат работы пользователю.

monk ★★★★★
()
Ответ на: комментарий от Vit

Представь что у тебя дисплей 200*200, и это скриншоты. Есть список настроек, когда в какую-то тыкаешь, сбоку выезжает один из вариантов. Как на мобилке.

Тут два варианта: 1) анимировать при нажатии, блокируя основной цикл; 2) добавить счётчик циклов после нажатия и отрисовывать кадры анимации интерфейса

Примерно так: пример.

Но на мобилке будет скорее первый вариант. Всё равно во время анимации не имеет смысла что-то ещё делать.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Замечательно. Многозадачные компьютеры, на которых не заканчивается вся доступная память после запуска текстового редактора, музыкального проигрывателя и клиента обмена мгновенными сообщениями.

Быстрые и удобные интерфейсы, которые не тормозят внезапно из-за того, что ОС решила сложить суперкрасивую текстуру в своп или из-за того, что дизайнер решил, что без его обалденной анимации на 3 секунды компьютер будет выглядеть недостаточно медленным и вызывать у пользователя чувство неполноценности.

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Да это понятно, что если упереться рогом, то сделать можно. Мне хотелось понять, можно ли это сделать на imgui просто и красиво.

Vit ★★★★★
() автор топика

со стандартного «MVC плёха»

а чем плохо? я что-то проспал?

next_time ★★★★★
()
Ответ на: комментарий от a1batross

Да. С интерпретаторами я немного погорячился.

Не, не погорячился. В интерпретаторах объекты, классы - вот это вот всё. И там никто лапшу не пишет. А всякие nano - это уже TUI. monk

next_time ★★★★★
()
Ответ на: комментарий от monk

Так это хрень, которая не выжила. Её в качестве интерпретатора использует примерно никто. Вот если бы вы такое для питона/руби показали, тогда - другое дело.

next_time ★★★★★
()

immediate mode

Поперхнулся, вспомнив времена immediate mode opengl.

anonymous
()
Ответ на: комментарий от monk

Многозадачные компьютеры, на которых не заканчивается вся доступная память после запуска текстового редактора, музыкального проигрывателя и клиента обмена мгновенными сообщениями.

Сейчас тебе расскажут, что ты просто нищеброд и в 2019 году нужно как минимум 32 Гб памяти :)

shatsky ★★
()
Ответ на: комментарий от ya-betmen

Что это

Дерьмо.

и когда оно появилось?

В древних виндовсах ещё до 95 было. Теперь вот веб-макаки откопали.

anonymous
()
Ответ на: комментарий от shatsky

Сейчас тебе расскажут, что ты просто нищеброд и в 2019 году нужно как минимум 32 Гб памяти :)

Вот это меня и печалит. Что в 2019 на 32ГБ я могу сделать меньше и буду делать дольше, чем в 1995 на 32МБ.

monk ★★★★★
()
Ответ на: комментарий от PatrickKilpatrick

погугли «реактивное программирование»

Тогда совсем непонятно, почему оно идеология ректа если идеология появилась как минимум за несколько лет до появления реакта.

ya-betmen ★★★★★
()
Ответ на: комментарий от ya-betmen

идеология чего-то может появиться за несколько лет до воплощения этого чего-то в жизнь

PatrickKilpatrick
()
Ответ на: комментарий от next_time

Я:

Речь шла про пользовательский интерфейс интерпретатора.

Вы:

нет, речь шла про интерфейсы

с какой целью вы мне кидаете кишки интерпретатора, когда речь про его использование?

Так при чём тут использование, если по Вашим-же словам, мы обсуждаем интерфейсы?

monk ★★★★★
()
Ответ на: комментарий от monk

Оригинальные слова человека, которому я отвечал «Да. С интерпретаторами я немного погорячился. TUI их вроде не назовёшь.» Там рассматривались интерпретаторы как разновидность пользовательского интерфейса. GUI, TUI, командная строка. Так вот, нормальные современные интерпретаторы, а не башик, вполне поддерживают классы и мусорке не способствуют.

next_time ★★★★★
()
Ответ на: комментарий от next_time

Там рассматривались интерпретаторы как разновидность пользовательского интерфейса.

Если брать пользовательский интерфейс интерпретатора, то он почти всегда командная строка.

Так вот, нормальные современные интерпретаторы, а не башик, вполне поддерживают классы и мусорке не способствуют.

Это на интерпретаторах можно делать интерфейс с классами (а можно и без классов: tcl/tk, sh/zenity, perl/tk). Но интерфейс самого интерпретатора очень редко на ООП. Именно на него я ссылки и давал.

monk ★★★★★
()
Ответ на: комментарий от monk

О! Я нашёл совсем оригинальное сообщение, по поводу которого был спор «В CLI программах вы тоже все вызовы scanf/printf в отдельный модуль выносите, чтобы не «превращать код CLI в лапшу»?» (monk)

После чего чел вспомнил про интерпретаторы.

Ну так вот, в CLI на современных языках, да даже на лиспе, код в лапшу не превращается. Потому, что да, есть классы и вызовы scanf/printf очень даже полезно в них оборачивать

next_time ★★★★★
()
Ответ на: комментарий от next_time

Почему б тебе не создать отдельную тему, вместо того чтобы тусоваться здесь с абстрактными чатиками за жизнь?

Vit ★★★★★
() автор топика

Объясните кто-то как это работает, что-то я не понимаю. Получается вызовы функций/виджетов не блокирующие, а где-то внтури происходит цикл отрисовки? В каком месте оно завязано на фреймрейт? Виджеты идентифицируются строками? То есть

ImGui::Button("Toggle")
в любом месте кода даст мне доступ к одной и той же кнопке?

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 3)
Ответ на: комментарий от loz

Получается вызовы функций/виджетов не блокирующие

Да.

где-то внтури происходит цикл отрисовки?

Нет.

Это отрисовка происходит по ходу основного цикла программы. В смысле программа что-то делает и по ходу дела выводит своё текущее состояние. А отдельные элементы этого состояния являются кнопками и элементами меню и позволяют пользователю что-то делать

monk ★★★★★
()
Ответ на: комментарий от monk

Это отрисовка происходит по ходу основного цикла программы

Все равное не понимаю, как тогда отработает этот if?

ImGui::Text("Hello, world %d", 123);
if (ImGui::Button("Save"))
{
    // do stuff
}
ImGui::InputText("string", buf, IM_ARRAYSIZE(buf));
ImGui::SliderFloat("float", &f, 0.0f, 1.0f);

Если просто произошла отрисовка и оно не ждет реакции пользователя и это все не в цикле, то `do stuff` не выполнится ведь?

И как делать изменения тут, например поменять текст на лейбле?

loz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Если они блокирующие то еще более непонятно, ведь тогда отрисовка остановится на первой кнопке и будет ждать пока пользователь нажмет ее или что?

loz ★★★★★
()
Ответ на: комментарий от loz

Виджеты идентифицируются строками?

Фактически адресами строк. Если нужна одинаковая константная строка, то надо делать как в примере.

ImGui::Button("Toggle##1")
...
ImGui::Button("Toggle##2")

в любом месте кода даст мне доступ к одной и той же кнопке?

Нет. Вызов нарисует новую кнопку. Но так как идентификатор совпадает, то у может быть частично общее поведение (хотя большая часть коллизий отфильтруется, так как разные координаты).

monk ★★★★★
()
Ответ на: комментарий от loz

Они не блокирующие. Вызов Button рисует кнопку и проверяет, нажата ли она сейчас (в предыдущем фрейме для этого id было нажатие мышки и сейчас нет нажатия и курсор над кнопкой, если более подробно, то вот) и возвращает этот факт.

monk ★★★★★
()
Ответ на: комментарий от monk

Ок, то есть я получаю состояние когда мне надо вызовом Button, а как тогда реализован эффект «вдавливания» при нажатии? Насколько я понимаю должен быть код который как-то реагирует на клик все равно?

loz ★★★★★
()
Ответ на: комментарий от loz

И как делать изменения тут, например поменять текст на лейбле?

«Save» в данном примере и есть текст на кнопке. Можешь его менять хоть каждый фрейм.

это все не в цикле

Это всё в том цикле, в котором работает программа. Ведь если у тебя программа сразу не завершается и как-то взаимодействует с пользователем, в ней определённо есть какой-то цикл.

monk ★★★★★
()
Ответ на: комментарий от RazrFalcon

Потому что нарисовал кнопку, получил ответ сразу же и пошёл дальше работать. Блокировки нет.

monk ★★★★★
()
Ответ на: комментарий от monk

То есть чтобы узнать нажата кнопка или нет, мне нужно в коде отрисовки это проверять и затем запускать асинхронную функцию оттуда?

RazrFalcon ★★★★★
()
Ответ на: комментарий от monk

Ведь если у тебя программа сразу не завершается и как-то взаимодействует с пользователем, в ней определённо есть какой-то цикл.

Ааа, этот обычно «вшешний» цикл теперь в моем коде, понял, спасибо :)

loz ★★★★★
()
Ответ на: комментарий от RazrFalcon

Зачем? Просто вызываешь

if (ImGui::Button("Button")) {
  // если сюда попал, значит нажата
  // меняешь состояние программы
}

Никаких асинхронных функций. Или ты про ситуацию, когда действие по кнопке невозможно выполнить в главном цикле программы? Ну тогда да, запускаешь внутри проверки поток с функцией.

monk ★★★★★
()
Ответ на: комментарий от monk

Я к тому, что там нельзя затратные функции вызывать. Максимум флаг поставить и всё. А значит нужно отдельно хранить состояние или костылять event loop.

RazrFalcon ★★★★★
()
Ответ на: комментарий от RazrFalcon

Наверное можно, просто у тебя подвесится интерфейс, что вобще говоря не редкость даже сегодня.

loz ★★★★★
()
Ответ на: комментарий от RazrFalcon

А значит нужно отдельно хранить состояние или костылять event loop.

Так вся программа по факту им и является. И состояние у программы, как правило, есть.

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

monk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.