Текст и каретка в VID или R3-Gui
Простой пример:
Если я наберу #"w" в стиле "area", как я получу #"z"? (напр. "qwerty ww" -> "qzerty zz")
2 ответа
Если вы хотите преобразование на лету, вы можете либо изменить R3-GUI перед загрузкой. Так что загрузите r3-gui.r3 в ваш локальный каталог. Затем вы добавляете строку if key == #"w" [key: #"z"] к функции do-text-key, чтобы она выглядела как
do-text-key: funct [
"Process text face keyboard events."
face [object!]
event [event! object!]
key
] [
text-key-map/face: face
text-key-map/shift?: find event/flags 'shift
if no-edit: not tag-face? face 'edit [
key: any [select/skip text-key-map/no-edit key 2 key]
]
either char? key [
if key == #"w" [key: #"z"]
text-key-map/key: key
switch/default key bind text-key-map/chars 'event [
unless no-edit [
insert-text-face face key
]
]
] [
if find event/flags 'control [
key: any [select text-key-map/control key key]
]
text-key-map/key: key
switch/default key text-key-map/words [return event]
]
none
]
Вероятно, официальным способом было бы использовать ключ с Rebol3
load-gui
view [
a: area on-key [ ; arg: event
if arg/type = 'key [
if arg/key == #"w" [arg/key: #"z"]
]
do-actor/style face 'on-key arg face/style
]
]
И, наконец, способ сделать это с Rebol2 на лету
key-event: func [face event] [
if event/type = 'key [
if all [event/key = #"w" ] [
append a/text #"z"
focus a
view w
return false
]
]
event
]
insert-event-func :key-event
view w: layout [
a: area
]
После прочтения некоторых файлов r3-gui (text-caret.r3, text-cursor.r3, text-edit.r3, text-keys.r3, text.r3) и редактора я нашел решение, которое позволяет мне вставить не только символ, но и строка:
do %r3-gui.r3
insertText-moveCursor-updateFace: func [
face
string
n-move
][
insert-text-face face string
move-cursor face 'left n-move false
update-text-caret face
see-caret face
show-later face
]
i-m-u: :insertText-moveCursor-updateFace
view [
area on-key [
either arg/type = 'key [
switch/default arg/key [
#"w" [i-m-u face/names/text-box "z" 0]
#"[" [i-m-u face/names/text-box "[]" 1]
#"$" [i-m-u face/names/text-box "func [] []" 4]
] [
;switch/default
do-actor/style face 'on-key arg face/style
]
] [
;arg/type != 'key
do-actor/style face 'on-key arg face/style
]
]
]
Площадь это составные стили. Он состоит из текстового поля и скроллера. Они содержатся в лице / именах.