![]() |
| Boîtes dans un layout. | |
| Philippe | 18-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
| |
| coccinelle | 18-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
]
| |
| Philippe | 18-Jan-2007/17:02:50+1:00 |
| Merci marco ! Cela marche. Je vais remettre cela dans le code complet à présent. ===Philippe | |
| shadwolf | 18-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" | |
| shadwolf | 18-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. | |