Есть ли способ центрировать кнопки и поля графического интерфейса в Rebol?

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

Может, я слишком многого жду?

edit: ну, я обнаружил хак: indent num, затем indent -num в следующей строке. Из всех впечатляющих возможностей этого языка, почему они не могли просто добавить такую ​​простую команду, как center?


person user2020783    schedule 29.01.2013    source источник


Ответы (3)


Существует функция CENTER-FACE, которую вы можете повторно использовать для выравнивания лиц, но, к сожалению, по моему опыту она работает не очень хорошо. Вот более простая версия для замены, которая должна помочь:

center-face: func [face [object!] parent [object!]][
    face/offset: parent/size - face/size / 2 
]

Вот пример использования:

lay: layout [
    size 300x300
    b: button "Hello World"
]
center-face b lay
view lay
person DocKimbel    schedule 30.01.2013
comment
приведенное выше фактически приведет к ошибкам ... 'LAY не имеет значения внутри блока макета. - person moliad; 02.02.2013

Во-первых, VID - это не Rebol, а демонстрационный диалект, написанный автором, Карлом Сассенратом, для демонстрации того, как интерфейсы могут быть диалектированы в Rebol. Есть и другие, включая RebGUI (http://www.dobeash.com/rebgui.html), хотя Я подозреваю, что там нет способа расположить кнопки по центру, поскольку ни один из авторов не считал это важным.

Вы также можете использовать PAD для выравнивания курсора близко к центру макета.

person Graham Chiu    schedule 30.01.2013
comment
Директивы Span в RebGUI могут использоваться для выравнивания виджетов внутри макетов. dobeash.com/RebGUI/user-guide.html#21 - person Brian Tiffin; 01.02.2013

Мы не можем центрировать или выровнять материал на основе самого окна, потому что элементы управления не могут ссылаться на свое родительское лицо, пока ПОСЛЕ того, как родительский объект не вызвал 'SHOW'.

face / parent-face не устанавливается, пока не будет показан parent. Таким образом, в обычном VID вам нужно настроить графический интерфейс сразу после того, как был сделан первоначальный макет и просмотр.

вот небольшой сценарий, который показывает, как центрировать любое лицо после того, как оно было показано хотя бы один раз.

view / new используется для задержки обработки событий, чтобы изменить макет.

rebol []

center: func [face][
    face/offset/x: (face/parent-face/size/x / 2) - (face/size/x / 2)
    show face
]

view/new layout [
    across
    t: h1  "This is a centered title!" 
    return
    button "1"
    button "2"
    button "3"
    button "4"
]

center t

do-events
person moliad    schedule 02.02.2013