2010-09-05 16 views
1

J'ai ce code pour créer un graphique en chandelier dans rebol. Maintenant, je voudrais utiliser plus de sentir http://www.rebol.com/how-to/feel.html#section-6 pour afficher des informations sur chaque chandelier, mais ma boîte est dessiné avec dialecte dessiné et il ne semble pas accepter l'événement?Comment créer un graphique interactif avec Rebol

plot: [ 
    pen green line 5x404 5x440 pen gold fill-pen 0.255.0 box 3x424 7x418 line 10x396 10x422 pen gold fill-pen 0.255.0 box 8x418 12x402 line 15x397 15x436 pen gold fill-pen 255.0.0 box 13x401 17x435 line 20x429 20x447 pen gold fill-pen 255.0.0 box 18x434 22x446 line 25x441 25x464 pen gold fill-pen 255.0.0 box 23x446 27x463 line 30x445 30x493 pen gold fill-pen 255.0.0 box 28x461 32x482 line 35x470 35x504 pen gold fill-pen 255.0.0 box 33x481 37x492 line 40x466 40x498 pen gold fill-pen 0.255.0 box 38x491 42x477 
] 

    grid: [1100 600] 
    step-grid: 5 
    max-n-points: (grid/1/step-grid) - 1 
    x-axis-border: 20 
    Y-margin: 10 
    X0: 5 
    grid-color: coal 


    main: layout [ 
     origin 20x0 
     space 1x1 
     panel1: box 1100x580 black effect reduce [ 
     'line-pattern 4 4 
     'grid 30x30 0x0 (grid-color) 
     'draw plot 
     ] 
     panel2: box 1100x0 black 
     panel3: box 1100x20 black 
    ] 

    view main 

alt text

Répondre

1

Voici un petit élargissement de ma réponse précédente liée à votre lecteur de carte.

Il y a plusieurs façons de l'adapter, mais cela devrait vous donner quelques idées pour résoudre votre problème.

rebol [] 

plot: [] 
data: reduce [ ] 

refresh: func [/local clr delta prev-pos pos] [ 
    clear plot 
    prev-pos: 0x300 
    foreach [clr delta] data [ 
     pos: prev-pos + (delta * 0x1) + 7x0 
     append plot compose [ 
      pen (clr) line (prev-pos) (pos) fill-pen (clr) pen none circle dot-size (pos) 
     ] 
     prev-pos: pos 
    ] 
    show panel1 
] 
add-data: func [i][loop i [append data reduce [(random white * .85) + (white * .15) (-20 + random 40)]] refresh] 

grid: [800 600] 
step-grid: 5 
max-n-points: (grid/1/step-grid) - 1 
x-axis-border: 20 
Y-margin: 10 
X0: 5 
grid-color: coal 
dot-size: 3 

viewer-size: 800x580 

; open up console before vid window 
main: layout [ 
    origin 20x0 
    space 1x1 
    field 800 
    panel1: box viewer-size black rate 30 effect [ 
     line-pattern 4 4 
     grid 30x30 0x0 grid-color 
     draw plot 
    ] feel [ 
     ;probe first panel1 
     over: func [face over? offset /local d][ 
      panel1/pane: either over? [info-pane][none] 

      if over? [ 
       d: offset/x - face/offset/x - 1 
       d: (to-integer d/7) * 2 + 1 
       either d: pick data d [ 
        info-box/text: to-string d 
       ][ 
        panel1/pane: none 
       ] 
      ] 
     ] 
     engage: func [face action event] [ 
      switch action [ 
       down [ 
        drag-start: event/offset 
       ] 
       up [ 
        drag-end: event/offset 
        scroll-size: to-integer abs ((pick (drag-start - drag-end) 1)/5) 
       ] 
       time [ 
        info-box/offset: event/offset - 20x20 ; the offset is the main-window origin 
        show main 
       ] 
      ] 
     ] 
    ] 
    panel2: box 800x0 black 
    panel3: box 800x20 black 
] 

insert-event-func [ 
    either all [ 
     event/type = 'key 
     none? system/view/focal-face 
    ][ 
     print ["shortcut: " event/key] 
     switch event/key [ 
      ; escape 
      #"^[" [quit] 
      ; enter/return 
      #"^M" [print "resampling data" clear data add-data 100] 
      up [dot-size: dot-size + 1 show panel1] 
      down [dot-size: dot-size - 1 show panel1] 
      left [clear skip tail plot -12 clear skip tail data -2 show panel1] 
      right [add-data 2] 
     ] 
     none 
    ][ 
     event 
    ] 
] 


info-box: make face [ 
    offset: 0x0 
    color: white * .2 
    size: 150x30 
    text: "0.0.0" 
    font: make font [valign: 'middle style: [bold italic]] 
] 
info-pane: reduce [info-box] 

add-data 100 
refresh 
view/options main [all-over] 
focus panel1 

Notez que nous déplaçons la souris sur le graphique, nous utilisons seulement la composante X de la souris pour savoir quoi afficher. De meilleurs systèmes sont évidents, mais cela suffit pour illustrer ce qui doit être fait pour recevoir tous les mouvements de souris et agir sur eux.

Notez également que la sur-détection reçoit des décalages de fenêtre, vous devez donc supprimer le décalage de la face pour obtenir les coordonnées réelles relatives au visage.

alt text

PS: La flèche rouge ci-dessus, est le curseur de la souris.

+0

Super merci encore! –