capturing keys within a field
Started by OneArb on 22-Feb-2017/23:16:15-8:00
OneArb — 22-Feb-2017/23:16:15-8:00
Is there a way to capture keys within a field as they get typed along?
With feel and engage, I can get keys as they are typed, at the cost of writing key handling.
Is there a way to copy the field face object and modify its behavior?
Can I access the string containing the characters showing on the screen?
Also How to use a face created with make face inside a VID layout?
R ebol[]
view-block: [
txt: field
entry: field feel [
engage: func [face action event] [
switch/default event/key reduce [
bs [remove back tail face/text]
cr [unview]
escape [unview]
'left [
system/view/caret: back face/text
; not working
]
] [
append face/text event/key
txt/text: face/text
]
show face
show txt
event
]
]
]
view/new center-face layout view-block
focus entry
do-events
Chris — 23-Feb-2017/0:30:31-8:00
This is a little closer to traditional behaviour:
switch/default event/key reduce [
bs [system/view/caret: remove back system/view/caret]
cr [unview]
escape [unview]
'left [
system/view/caret: back system/view/caret
; not working
]
][
system/view/caret: insert system/view/caret event/key
txt/text: face/text
]
Q. Is there a way to copy the field face object and modify its behavior?
What would you do with the copy of the field face? You can just do -- make face [...some changes...] -- within the ENGAGE functions to make a clone. A face is just an object after all.
Q. Can I access the string containing the characters showing on the screen?
FACE/TEXT is the self same string.
Q. Also How to use a face created with make face inside a VID layout?
You need to place it inside another face's pane. SOME-FACE/PANE can be a face or a block of faces. Note that View kicks in when you place faces within SYSTEM/VIEW/SCREEN-FACE/PANE (try SOURCE VIEW).
Nick — 23-Feb-2017/12:53:30-8:00
Does this help toward your end goal?
R E B O L []
view/new w: layout [
f: field
field
key #"^[" [quit]
key #"^H" [system/view/caret: remove back system/view/caret show w]
] forever [
old: copy f/text
if not viewed? w [quit] wait .1
if old <> x: copy f/text [print x]
]
OneArb — 25-Feb-2017/9:16:34-8:00
Q. Is there a way to copy the field face object and modify its behavior?
What would you do with the copy of the field face?
Capture keystrokes before they get to FACE/TEXT
OneArb — 25-Feb-2017/9:23:21-8:00
The first solution works great, the additional code is minimal.
Why do I need to change txt/text: face/text
into txt/text: copy face/text
when I use a text field instead of field?
view-block: [
txt: text white blue bold 200
entry: field feel [
engage: func [face action event] [
; -- contributed code
switch/default event/key reduce [
bs [system/view/caret: remove back system/view/caret]
cr [unview]
escape [unview]
'left [
system/view/caret: back system/view/caret
]
'right [
system/view/caret: next system/view/caret
]
'end [
system/view/caret: tail system/view/caret
]
'home [
system/view/caret: head system/view/caret
]
][
system/view/caret: insert system/view/caret event/key
txt/text: copy face/text
]
; --- contributed code
show face
show txt
]
]
]
view/new center-face layout view-block
focus entry
do-events
Nick — 25-Feb-2017/9:36:23-8:00
Without the 'copy', txt/text permanently refers to the text in face/text (if you change txt/text, you're changing that face/text too). By copying face/text, you're referring to the text that's in face/text as that moment.
OneArb — 26-Feb-2017/17:51:30-8:00
That's the intended behavior.
With txt field
txt/text: face/text
; does update txt
With txt text
txt/text: face/text
; show txt displays nothing
txt/text: copy face/text
; does update txt
OneArb — 27-Feb-2017/20:41:30-8:00
I tried the first version:
'left [
system/view/caret: back system/view/caret
]
It requires to redefine the behavior of every single key, including highlight insert / over ...
The second proposed solution can be made to use the native field editing. dirty? allows to find out about each new keystroke:
R EBOL []
print ""
view/new center-face w: layout [
f: field
target: field
key #"^[" [quit]
]
focus f
forever [
if not viewed? w [break]
wait .01
if f/dirty? [
either (length? f/text) > (length? target/text) [
action-type: "add char - "
] [
action-type: "modify string - "
]
newchar: exclude f/text target/text
; needs fixing
print join action-type (newchar)
target/text: copy f/text
show target
f/dirty?: false
]
]
I am not 100% sure how
if not viewed? w [break]
works.
Nick — 28-Feb-2017/4:04:34-8:00
If the Window is closed, the forever loop continues to evaluate and you'll have an invisible Rebol process running, so I put the 'viewed? w' condition to close the process properly.
OneArb — 28-Feb-2017/16:39:51-8:00
Without viewed? w field editing locks up.
I figured viewed? would become false when closing w.
I am yet to comprehend the lockup.
Reply