Попытка найти Progressbar Morph при отправке сообщения displayProgress
Я добавил индикатор прогресса в PharoLauncher, чтобы пользователь мог получить информацию о ходе загрузки изображения с этим кодом.
PharoLauncher>>displayProgress:during: (in category 'template action') -----
displayProgress: label during: workBlock
| nextUpdateTime |
nextUpdateTime := 0.
^UIManager default displayProgress: label
from: 0.0 to: 1.0 during:[:bar|
[workBlock value] on: HTTPProgress do:[:ex|
(ex total == nil or: [ex amount == nil]) ifFalse:[
(nextUpdateTime < Time millisecondClockValue
or:[ex total = ex amount]) ifTrue:[
bar current: ex amount asFloat / ex total asFloat.
nextUpdateTime := Time millisecondClockValue + 100.
].
].
ex resume.
]
]
Таким образом, сообщение является UIManager по умолчанию displayProgress: from: to: while: . Теперь это работает нормально, но я хочу расположить морф по центру, чтобы пользователю было удобнее его видеть, и он значительно масштабируется, так что его гораздо проще сделать, Чтобы сделать это, мне нужно найти Morph, который действует как контейнер для индикатора выполнения, и полностью его масштабировать.
Проблема в том, что я зашел в тупик при попытке просмотреть иерархию этого сообщения, которое он отправляет мне
displayProgress: titleString from: minVal to: maxVal during: workBlock
"SystemProgressMorph show: titleString from: minVal to: during: "
^ workBlock asJob
title: titleString;
min: minVal;
max: maxVal;
run.
Проблема в том, что когда я иду в класс Job, как я и ожидал, Morph нигде не найти. Итак, как мне найти Morph и как я смогу позиционировать и масштабировать его, содержащий все его подморфы?
1 ответ
С помощью Тьерри Губье в списке рассылки Pharo-dev и tinchodias на #Pharo в freenode я нашел решение
Создано три объявления, эти три объявления связаны с классами JobStart, JobEnd, JobChange и триггерными методами класса startJb: endJob: и updateJob: из SystemProgressMorph. Может быть только один экземпляр SystemProgressMorph, и для захвата этого экземпляра мы используем метод класса uniqueInstance.
Таким образом, чтобы переместить и изменить размер индикатора выполнения, я использовал следующий каскад сообщений
(SystemProgressMorph uniqueInstance) minWidth: 600;
minHeight: 50;
layoutInset: 30@20;
position: 150@200.
layoutInset добавляет еще немного места для индикатора выполнения внутри SystemProgressBarMorph. Было бы лучше сбросить эти значения, чтобы мы не влияли на индикаторы выполнения, используемые другими приложениями pharo, но поскольку PharoLauncher содержится в независимом изображении, в котором нет необходимости.