为什么Rebol参与不起作用?

时间:2010-09-05 19:21:15

标签: functional-programming 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
      ] feel [
        engage: func [face action event] [
            if action = 'down [drag-start: event/offset]
            if action = 'up [drag-end: event/offset
                scroll-size: to-integer abs ((pick (drag-start - drag-end) 1) / 5)
            ]
            if action = 'key [
                probe event/key
                either word? event/key [
                    probe event/key
                    if (event/key = 'left) [
                        probe event/key
                    ]
                    if (event/key = 'right) [
                        probe event/key
                    ]
                ][

                ]
            ]
        ]
    ]
      panel2: box 1100x0 black
      panel3: box 1100x20 black
  ]

  view main
  focus panel1

2 个答案:

答案 0 :(得分:3)

答:简单,当面部是焦点时,感觉只会触发关键事件。

这里是你的应用程序的部分重写(更快,更可读),它使用全局事件处理程序和'SWITCHes而不是'IFs。

输入处理程序为所有窗口的所有事件提供信息,并可用于执行热键等全局技巧。

显然,您可以改进事件处理程序以检测每个窗口,并检测鼠标所在的位置,以便在适当时启用密钥。您还可以构建一个备用焦点跟踪,该跟踪在常规处理之外工作,并且不会进入文本编辑模式。

我在上面添加了一个字段,这样您就可以尝试使焦点面部处于活动状态以及如何在事件处理程序中检测它的效果。

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: 1

; open up console before vid window
prin "!"
main: layout [
    origin 20x0
    space 1x1
    field 800
    panel1: box 800x580 black effect [
        line-pattern 4 4
        grid 30x30 0x0 grid-color
        draw plot
    ] feel [
        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)
                ]
            ]
        ]
    ]
    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
    ]
]
add-data 100
refresh
view main
focus panel1

请注意,当您在其中使用单词时,无需减少代码块。 VID会自动为您解析单词引用,一旦您知道这一点,它就会更容易(并且速度更快)制作动态GUI。作为证明,按住向上或向下箭头键,即使在完整的图形上,您也会看到点调整得非常顺利。

另请注意,如果希望视图继续处理事件,则事件处理程序func的返回值是事件,如果处理程序“消耗”事件,则返回none。

HTH!

答案 1 :(得分:0)

我尝试使用dummy func和我自己的例子上面的insert-event-func,但我不明白为什么它不起作用:

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
      ] feel [
        engage: func [face action event] [
            if action = 'down [drag-start: event/offset]
            if action = 'up [drag-end: event/offset
                scroll-size: to-integer abs ((pick (drag-start - drag-end) 1) / 5)
            ]
        ]
    ]
      panel2: box 1100x0 black
      panel3: box 1100x20 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 [print "up"]
              down [print "down"]
              left [print "left"]
              right [print "right"]
          ]
          none
      ][
          event
      ]
    ]


  view main
  focus panel1