Reputation: 2754
I have added keyboard event but none is detected why ?
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
Upvotes: 1
Views: 274
Reputation: 2754
I tried insert-event-func with dummy func and my own example above I fail to see why it doesn't work:
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
Upvotes: 0
Reputation: 1503
A: simple, the engage feel only triggers for key events when the face is the focal-face.
here is a partial rewrite of your app (faster and more readable too) which uses a global event handler and 'SWITCHes instead of 'IFs.
The input handler is fed ALL events of ALL windows, and can be used to do global tricks like hotkeys.
obviously, you can improve the event-handler to detect per window, and detect where the mouse is located to only enable keys when appropriate. you could also build an alternate focus tracking that works outside of the usual handling and which doesn't enter the text edit mode.
I added a field above, just so you can experiment with the effect of having a focused face active and how to detect it in your event-handler.
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
Note that there is no need to reduce your code block when you use words within. VID automatically resolves word references for you, its a lot easier (and dramatically faster) to make dynamic GUIs once you know this. as a proof, hold down the up or down arrow key, and you'll see the dots resize quite smoothly, even on a full graph.
Also note the return value of event-handler func is the event, if you want view to continue handling the event, or none, if your handler "consumes" the event.
HTH!
Upvotes: 3