[ID CS4-CS6] как узнать размер панели в Window("dialog","")

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
если при создании панелей в
Код:
myScriptPanel = new Window("dialog", "Выберите нужный скрипт");
my_panel = myScriptPanel.add("panel"))
не указывать руками размер этих панелей, то этот размер зависит от объектов внутри неё.
и получается где-то так:
sizes.jpg
и, опять же, без ручного указания размеров панели, её параметр
Код:
my_panel.size
равен undefined.

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

в общем — внимание, вопрос!
а можно ли таки вытащить откуда-нибудь эту самую высоту автоматически получившейся панели?


Не по теме:
а то неаккуратно как-то ;)
 
Последнее редактирование:

Oleg Butrin

15 лет на форуме
Сообщения
1 887
Реакции
1 127
и получается где-то так:
Мне это живо напомнило письмо пани Мюллеровой из концентрационного лагеря (Гашек, Швейк).
но это получилось нифига не гармонично
У панели (как и у группы и окна в целом) есть много параметров, позволяющих управлять размерами и ориентацией элементов внутри. Лучше всего взять документацию и вгрызться в нее, а не изобретать коней заново.
 

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
Лучше всего взять документацию и вгрызться в нее, а не изобретать коней заново.
конечно лучше. жаль только в этой документации единственное, что написано про автоматическое создание раскладки — это то, что она "неплохо справляется". всё. а как и где посмотреть результаты её работы — так нигде и не написано :(
 

iv-mi

15 лет на форуме
Сообщения
523
Реакции
325
Это мой перевод первой редакции руководства, написанного Питером Крелом.
С тех пор было много обновлений, и последнее по объему, наверное, вдвое больше.
Попробуйте там найти ответ.
 
  • Спасибо
Реакции: bossrus

Eugenyus

Модератор
12 лет на форуме
Сообщения
1 946
Реакции
3 569
вытащить откуда-нибудь эту самую высоту автоматически получившейся панели
Можно только после показа окна. До показа можно определить только maximumSize.width, maximumSize.height, и соответственно minimumSize.width и minimumSize.height.
А точными размерами можно оперировать вот так:
JavaScript:
w.onShow = function(){
    panel.size.width = w.size.width - 40;
    button1.size.height = panel.size.height - 20;
    //etc   
}
(Страница 67 книги по ссылке Михаила)
 
  • Спасибо
Реакции: bossrus

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
Можно только после показа окна....
ну конечно же!
это же очевидно, что автораскладка делается не в момент создания, а в момент показа. во я тормоз.
можно оперировать вот так:
JavaScript:
w.onShow = function(){
    panel.size.width = w.size.width - 40;
    button1.size.height = panel.size.height - 20;
    //etc  
}
(Страница 67 книги по ссылке Михаила)
именно. тут и перебор устроить, чтобы делать максимальный размер панели в строке.
спасибо! :)
 

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
JavaScript:
w.onShow = function(){
...
}
сбацал такой скрипт:
Код:
myScriptPanel.onShow = function(){
        go = false;
        for (iblock = 0; iblock<blocks.length; iblock++){
            maxpanel = 0;
            maxtext = 0;
            for (ichield = 0; ichield<blocks[iblock].children.length;ichield++) {
                block = blocks[iblock].children[ichield];
                if (block.type=='panel'){
                    if (maxpanel < block.size[1])
                        maxpanel = block.size[1];
                    for (itexts = 0; itexts < block.children.length; itexts++){
                        txt = block.children[itexts];
                        if (txt.type == 'statictext'){
                            if (maxtext<txt.size[1]){
                                maxtext=txt.size[1]
                            }

                        }
                    }
                }
            }
            for (ichield = 0; ichield<blocks[iblock].children.length;ichield++) {
                block = blocks[iblock].children[ichield];
                if (block.type=='panel'){
                    if (maxpanel > block.size[1]) {
                        block.size[1] = maxpanel;
                        for (itexts = 0; itexts < block.children.length; itexts++){
                            txt = block.children[itexts];
                            if (txt.type == 'statictext'){
                                if (maxtext > txt.size[1]){
                                    txt.size[1] = maxtext;
                                }
                            }
                        }
                        go = true;
                    }
                }
            }
        }
        if (go) {
            this.layout.resize ();
        }              
    }

в CS5, CS6 — всё офигенно. выравнивает панели по размеру, и кнопки вниз панели опускает, чтобы на одном уровне были.
в CC2018 — размеры выставляются (если вызывать alert(block.size); после присваивания — то показывает одинаковые размеры).
но строчка this.layout.resize (); судя по всему игнорируется :(

подумал, что в сс поменялся синтаксис, залез в Object Model Viewer — нет. всё в порядке. layout.resize(); таки осталась.
но её вызов не обновляет панель с новыми размерами :(

я даже на кпопку повесил цикл с выводом всех размеров всех панелей, чтобы убедиться, что глаза меня не обманывают. и да. размеры таки одинаковые, где нужно.
а выглядит именно в indesign cc2018 — как на первом посте :(

чо делать?
 
Последнее редактирование:

_MBK_

Пикирующий бомбардировщик
12 лет на форуме
Сообщения
30 532
Реакции
10 035
Видимо в новой версии при допиливании UI допилили так, что в обработчике onShow нельзя ресайзить (что, честно говоря, по логике не индуса, но здорового человека вполне логично)
Запоминайте размеры, гасите окно и заново создавайте уже с ресайзингом, такой костыль *[[
 
  • Спасибо
Реакции: bossrus

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
Видимо в новой версии при допиливании UI допилили так, что в обработчике onShow нельзя ресайзить
его, судя по всему, вообще нельзя ресайзить программно.
навешенный на кнопку ресайз тоже нифига не работает
Запоминайте размеры, гасите окно и заново создавайте уже с ресайзингом, такой костыль *[[
вариант, в принципе. спасибо
 
Последнее редактирование:

Eugenyus

Модератор
12 лет на форуме
Сообщения
1 946
Реакции
3 569
обработчике onShow нельзя ресайзить
Можно. Страница 67 из книги — с примером того, как это работает.
Метод resize() там не нужен. Он работает при других обстоятельствах:
Screenshot_4.jpg

Т.е. если у окна включена опция resizeable = true;, и пользователь это окно изменит, потянув мышью за одну из его границ, то сработает событие w.onResize.

Я бы вообще в окне типа "dialog" не морочился бы с кнопками. Там, по-хорошему, нужны только ОК и Cancel. А выбор скрипта из списка можно сделать радиокнопками (radiobutton).
 

bossrus

шибка умный, аднака
Топикстартер
10 лет на форуме
Сообщения
425
Реакции
71
Там, по-хорошему, нужны только ОК и Cancel. А выбор скрипта из списка можно сделать радиокнопками (radiobutton).
я ещё к каждому скрипту приделал описание (оно-то и занимает разный объём)
Можно. Страница 67 из книги — с примером того, как это работает.
Метод resize() там не нужен. Он работает при других обстоятельствах:
дык _MBK_ и сказал, что метод ресайз не работает именно в онШоу.
об том и речь, что нужно куда-то что-то потянуть, чтобы сработало :)