Иван Денисов писал(а):
arisu писал(а):
проблема в том, что в тайлере окна — это вложеные фрэймы. которые — по правилам среды — можно добавлять только внутри Restore.
Views.ValidateRoot так то вызывает все Restore.
в этом и проблема.
Иван Денисов писал(а):
Среда не гарантирует, что старые кадры должны жить ни в какой момент времени, в цикле обработки сообщений или нет. Среда имеет право в любой момент перестроить кадры. По крайней мере я так понял Антона, может и неверно.
вот тут неверно: дерево кадров нельзя перестраивать в процессе обработки сообщений. именно поэтому, например, из цикла `f.Input()` не рекомендуется вызывать зафорсеные рисовалки: в большинстве случаев дерево фрэймов не изменится, но никакой жёсткой гарантии этого нет. если вдруг изменится — всё может трапнуться или вообще случится UB.
Иван Денисов писал(а):
Если наше окно перекрылось новым, то лучше остановить обход кадров, где бы мы там не были. Довольно предсказуемое поведение.
это невозможно: мы можем находиться где угодно в глубине кода в этот момент, и код этот свою работу ещё не закончил.
Иван Денисов писал(а):
Ещё идея, почему бы не построить сразу это всё в некой безопасной среде не откладывая. А после открытия окна разместить где надо в окне ББ, и уже сразу с выделенным текстом?
по двум причинам: во-первых, такой возможности просто нет. во-вторых, на данном этапе мы не обязательно знаем размер окна: его определит и зафорсит grid, когда будет добавлять новую вкладку.
по первому пункту: вы, по сути, предлагаете отрисовать окно в некий буфер, который мы потом просто выкинем (потому что это единственный способ получить дерево фрэймов — провести весь процесс отрисовки). для того, чтобы такое реализовать — надо делать специализированый бэкэнд и порт, которые не будут связаны ни с чем. и добавлять механизм замены бэкэнда и порта для окна на лету, чтобы потом поменять их на настоящие. или так, или делать прокси-бэкэнд и прокси-порт. и на этом этапе мы всё ещё не знаем даже правильного unit-а — он берётся из порта грида.
(если что, даже пункт меню «отцепить окно» — это хак, который довольно worrisome образом переселяет документ из одного окна в другое, и полагается на некоторое знание внутренней реализации окон и среды.)в общем, такое предложение во-первых, само по себе адовый и весьма труднореализуемый хак, а во-вторых, тайлер будет вынужден знать очень интимные подробности грида, и получится очень неприятная (взаимо)зависимость.
Иван Денисов писал(а):
В общем, я топлю за то, чтобы ничего не надо было менять в логике ББ по возможности.
увы, так не выйдет: отложеное создание окна вызвано технической необходимостью, его никак нельзя обойти без полного переписывания всей механики рисования и распространения событий. и тогда у нас уже получится совсем не тот BBCB. наименее интрузивный вариант — это возможность задавать выполнение неких действий после первой отрисовки окна.
ну, или другой вариант, не менее неприятный: тайловый менеджер надо полностью выводить из-под контроля BBCB. то есть, переписывать тайловый менеджер (StdGrids, StdMenus, и частично StdTiles) так, чтобы там вообще не использовались ни Views, ни стандартные механизмы отрисовки BBCB. по сути, лепить эмулятор host OS внутри BBCB. и мы теряем единообразность среды, и все приятные фичи типа реализации менюшек как обычных View, грида как обычного View, и так далее. в общем, пишем рядом с уже существующей системой Frame/View ещё одну, свою, полностью от неё независимую. а это, как я понимаю, именно то, чего А.А. хотел избежать, когда создавал тайлер.