Boîtes dans un layout.
Philippe18-Jan-2007/14:56:53+1:00
Salut,

Ci-dessous un bout de code (issu d'un script de carl).
Tel quel, il permet d'avoir une sorte de menu avec des boîtes déroulantes.
Le code marche bien quand on l'utilise sur le layout de plus niveau (menu-window). Mais je voudrais que les boîtes déroulantes soient imbriquées dans la boite "Target" p1 ou un panel.
Si on change le code au niveau de make-menus (fin du code) avec la box p1 comme conteneur cible, rien ne va plus.
J'ai résolu une partie du pb, mais j'ai quand même un décalage d'offset et de size à chaque ouverture d'une box-menu. Cà doit être un truc tout bête à changer au niveau de size-menu, mais je séche.
A vot'bon coeur !

menu-bar-color: coal  
menu-arrow-color: coal
menu-window-size: 270x600
p1-box-size: 250x100

main-styles: stylize/master [
    cat: txt 200x20 bold white menu-bar-color font [name: "Courrier" size: 10 ]
   ; btn: btn 50  font [name: "Courrier" size: 10 colors: [255.255.255 80.80.200] ] with [color: coal]; initial : button, after : btn
]

size-menu: function [target][y face pane][
    ; Resizes the menu according to current panels open.
	pane: target/pane         
    until [
        face: first pane
        y: second face/offset + face/size
        pane: next pane 
        pane/1/style = 'cat
    ]

    y: y + 2
    foreach f pane [
        f/offset/y: y
        y: y + f/size/y + 1
    ]

   target/size/y: y
	show target 
]

make-menus: function [target][a b][
    ; For each menu above, create the necessary faces.
    forskip menus 2 [
        set [a b] menus
        insert b [styles main-styles origin 0x0 space 0 across]
        b: layout/offset b 0x0
        b/data: b/size
        b/size/y: 0
        b/color: coal
        a: make-facet-bar a target
        a/data: b
        change skip menus 1 a
    	 repend target/pane [a b]
    ]
    menus: head menus
    size-menu target 
]

make-facet-bar: func [name target /local out bx tx] [
    ; Creates a facet banner bar with arrow that opens and closes
    ; the facet detail panel. Layout just makes the basic faces.
    out: layout [ 
		styles main-styles
    	origin 0 
        at 3x4 bx: box menu-arrow-color 10x10
        at 0x0 tx: cat para [origin: 18x2] [] 
    ]
    bx/effect: copy [arrow 255.255.255 rotate 90]
    tx/pane: bx
    tx/size: 200x20
    tx/action:
    bx/action: bind/copy [
		op-menu self 4 >= length? self/pane/effect 
		size-menu target ] in tx 'self 
    tx/text: name
    tx
]

op-menu: func [face state][
    either state [
		; quand on ouvre la box
        if 4 >= length? face/pane/effect [
            append face/pane/effect [rotate 90]
            face/data/size: face/data/data
        ]
    ][
	; quand on referme la box
        if 4 < length? face/pane/effect [
            remove/part tail face/pane/effect -2
            face/data/size/y: 0
        ]
    ]
]

open-menu: func [name state target] [
    if name: select menus name [
	op-menu name state 
	size-menu target
	]
]

menus: [
test
 [ 
		at 5x5
		btn "OK" 
		btn "Clic-me" [quit]
		]
test2
 [btn "OK2" [quit]]
]


menu-window: layout [
	size menu-window-size  
	origin 0 space 0x0
	styles main-styles
	p1: box p1-box-size "Target" yellow frame black
]

p1/pane: copy []
make-menus menu-window
;make-menus menu-window/pane/1   ; = p1

view menu-window
coccinelle18-Jan-2007/16:01:31+1:00
Ca vient de la fonction size-menu qu'il faut écrire plus ou moins comme çà :
size-menu: function [target][y face pane][
    ; Resizes the menu according to current panels open.
	pane: target/pane
        y: 0
    while [pane/1/style <> 'cat] [
        face: first pane
        y: second face/offset + face/size
        pane: next pane 
    ]

    y: y + 2
    foreach f pane [
        f/offset/y: y
        y: y + f/size/y + 1
    ]

   target/size/y: y
	show target 
]
Philippe18-Jan-2007/17:02:50+1:00
Merci marco !

Cela marche. Je vais remettre cela dans le code complet à présent.

===Philippe
shadwolf18-Jan-2007/18:55:04+1:00
tiens ca me rappel que j'ai fait une widget menu pour rebgui et je ne sais pour quelle obcure raison AShley a finalement decidé de ne pas la mettre dans la "release officielle"
shadwolf18-Jan-2007/18:57:46+1:00
on peut la trouvée sur le wiki rebolfrance.info dans l'article "widgets on cooking"

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2