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

Тестил летом с Pharo 1.4. Я думаю, что лучше объяснить это на скриншотах, код ниже.

Это мое начальное состояние (что я получаю сейчас с моим кодом):

Исходное состояние

Я хочу, чтобы морфинг группового окна заполнялся горизонтально при открытии, например:

Исходное желаемое состояние

И после изменения размера я хочу, чтобы морфинг группового поля сохранял границы, то есть:

Изменить желаемое состояние

Это код, который я пробовал:

| s morph1 morph2 row groupBox scroller |
s := ScrollPane new.
morph1 := BorderedMorph new.
morph2 := BorderedMorph new.
row := UITheme builder newRow: {morph1 . morph2}.
groupBox := UITheme builder newGroupbox: 'Group Box Test' for: row.
    groupBox 
        layoutFrame: (LayoutFrame fractions: (0 @ 0 corner: 1 @ 0.8));
        vResizing: #spaceFill;
        hResizing: #spaceFill;
        layoutChanged.
scroller := s scroller.
scroller 
    addMorph: (groupBox position: 0@0)
    fullFrame: (0 @ 0 corner: [email protected]).
s scroller color: Color white.
s
 extent: 250@150;
 openCenteredInWorld

Контейнер должен быть ScrollPane.

Я адаптировал код Берта, чтобы он не использовал Polymorph UIBuilder, в результате чего:

morph1 := Morph new.
morph2 := Morph new.
row := ScrollPane new.
row
    color: Color white; borderColor: Color gray; borderWidth: 1;
    layoutPolicy: ProportionalLayout new.
row scroller
    addMorph: morph1 fullFrame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (5@5 corner: -60@45));
    addMorph: morph2 fullFrame: (LayoutFrame fractions: (1@0 corner: 1@0) offsets: (-50@5 corner: -5@45)).
row
    extent: 250@150;
    openInHand

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


person user183928    schedule 24.01.2013    source источник


Ответы (2)


Используя UIBuilder, вам не нужно вручную создавать скроллер. Проверьте следующий скрипт, изменяя размер до тех пор, пока автоматически не появятся вертикальные или горизонтальные полосы прокрутки.

| dialog morphList row morph1 morph2 morph3 morph4 |

morph1 := BorderedMorph new hResizing: #spaceFill.
morph2 := BorderedMorph new.
morph3 := BorderedMorph new.
morph4 := BorderedMorph new.
row := UITheme builder newRow: {morph1 . morph2 . morph3}.
morphList := UITheme builder 
    newMorphListFor: (ListModel new list: {row . morph4})
    list: #list 
    getSelected: #selectionIndex 
    setSelected: #selectionIndex:
    help: 'This is a morph list'.
dialog := UITheme builder newWindowFor: nil title: 'titleString'.
dialog addMorph: morphList fullFrame: (LayoutFrame fractions: (0@0 corner: [email protected])).
dialog openInWorld
person Hernán    schedule 29.01.2013

Вам не хватает того, что ProportionalLayout не использует #spaceFill и т. д. Так что либо используйте TableLayout:

morph1 := Morph new hResizing: #spaceFill.
morph2 := Morph new.
row := Morph new
    color: Color white; borderColor: Color gray; borderWidth: 1;
    layoutPolicy: TableLayout new;
    layoutInset: 5; cellInset: 5;
    listDirection: #leftToRight;
    addAllMorphs: {morph1. morph2};
    extent: 250@150;
    openInHand

или ProportionalLayout со смещениями, так вы можете смешивать фиксированную ширину и относительные размеры:

morph1 := Morph new.
morph2 := Morph new.
row := Morph new
    color: Color white; borderColor: Color gray; borderWidth: 1;
    layoutPolicy: ProportionalLayout new;
    addMorph: morph1 fullFrame: (LayoutFrame fractions: (0@0 corner: 1@0) offsets: (5@5 corner: -60@45));
    addMorph: morph2 fullFrame: (LayoutFrame fractions: (1@0 corner: 1@0) offsets: (-50@5 corner: -5@45));
    extent: 250@150;
    openInHand

Я попробовал это в Squeak, у которого нет UITheme, так что это напрямую использует Morphs.

person Vanessa Freudenberg    schedule 24.01.2013
comment
Я отредактировал свой вопрос, добавив версию адаптера вашего кода, но, похоже, он тоже не работает. Может быть, это ошибка ScrollPane? - person user183928; 25.01.2013