Почему Rebol не работает? - PullRequest
       8

Почему Rebol не работает?

1 голос
/ 05 сентября 2010

Я добавил событие клавиатуры, но ни одно не обнаружено, почему?

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 ]

3 голосов
/ 06 сентября 2010

A: просто, чувство вовлечения срабатывает только для ключевых событий, когда лицо является фокусным лицом.

здесь - частичная перезапись вашего приложения (также более быстрая и удобочитаемая), в котором используется глобальный обработчик событий и «ПЕРЕКЛЮЧАТЕЛИ вместо» IF.

Обработчик ввода получает ВСЕ события ВСЕХ окон и может использоваться для выполнения глобальных трюков, таких как горячие клавиши.

очевидно, вы можете улучшить обработчик событий, чтобы он определял каждое окно и определял, где находится мышь, чтобы включать клавиши только тогда, когда это необходимо. Вы также можете создать альтернативное отслеживание фокуса, которое работает вне обычной обработки и не входит в режим редактирования текста.

Я добавил поле выше, чтобы вы могли поэкспериментировать с эффектом активизации сфокусированного лица и с тем, как его обнаружить в обработчике событий.

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 автоматически разрешает ссылки на слова для вас, намного проще (и значительно быстрее) создавать динамические графические интерфейсы, как только вы это знаете. в качестве доказательства нажмите и удерживайте клавишу со стрелкой вверх или вниз, и вы увидите, что точки меняются довольно плавно, даже на полном графике.

Также обратите внимание, что возвращаемое значение функции-обработчика события - это событие, если вы хотите, чтобы view продолжал обрабатывать событие, или ничего, если ваш обработчик «потребляет» событие.

НТН!

0 голосов
/ 08 сентября 2010

Я попробовал 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
...