Inline edit field
[1/3] from: henrik:webz:dk at: 25-Feb-2004 21:01
Hi I'm trying to put together a real inline edit field, such as the one used in spreadsheets or in the Windows file requester when renaming a file, and I can't find anything related directly to what I want to do. Basically I'm using a button and change the feel to that of a field and I want the Enter key, tab, escape or clicking outside the field to revert the feel to button with new contents. It seems that ctx-text/edit makes the field editable, but I can't figure out how to make it behave as a single line edit field and how to get out of the editing state again in a simple fasion. Probing the feels of the button, field and textarea gadgets with: layout [r: button] probe r/feel layout [r: field] probe r/feel layout [r: textarea] probe r/feel reveals the code to do this, and I can't figure out how field captures an enter or tab key to unfocus the field, where a textarea sets it to a new line. The button behaves the same way. Any ideas? I'm using the latest beta 1.2.40 to test this. -- Regards, Henrik Mikael Kristensen
[2/3] from: ammon:addept:ws at: 25-Feb-2004 16:17
----- Original Message ----- From: "Henrik Mikael Kristensen" <[henrik--webz--dk]> To: <[rebol-list--rebol--com]> Sent: Wednesday, February 25, 2004 1:01 PM Subject: [REBOL] Inline edit field
> Hi > I'm trying to put together a real inline edit field, such as the one
<<quoted lines omitted: 6>>> out how to make it behave as a single line edit field and how to get out > of the editing state again in a simple fasion.
You can change the way any face reacts to any key-press by altering the FEEL/ENGAGE function. This: feel/engage: func [f a e] [ if e/key [print e/key] ] will print the key that has been pressed if indeed a key has been pressed. I would recomend building your own custom feel that does just what you want (i.e. special case handling for Esc, Enter and Tab) and then create a function that looks something like this... ;********************************************************** ; WARNING! Untested Code ;********************************************************** custom-feel: make ctx-text/edit [ ;your engage funciton goes here ] current-face: none set-feel: func [face event][ if event/type = 'down [ if none? current-face [current-face: event/face] either current-face = event/face [ current-face/feel: custom-feel ][ current-face/feel: ctx-text/swipe current-face: event/face current-face/feel: custom-feel ] ] event ] insert-event-func :set-feel using insert-event-func plugs your function into the event pipeline so whatever you do, you want to make sure that your event-func *always* returns the event that is passed to it. Also this particular function will only handle mouse presses and sets the face's feel no matter what face it is. You will prolly need to set the TYPE facet to a particular value and check for this before setting the feel. To handle keyboard events you can actually alter the event-func I gave you and just check for the event/type to be 'key instead of 'down. I would recomend making sure that none of your faces has 'return or 'tabbed in their FLAGS facet (more on the FLAGS facet below...) and handle them all on your own via the event-func.
> Probing the feels of the button, field and textarea gadgets with: > layout [r: button] probe r/feel
<<quoted lines omitted: 3>>> an enter or tab key to unfocus the field, where a textarea sets it to a > new line. The button behaves the same way. Any ideas?
The FLAGS facet controls this...
>> get in (get-style 'field) 'flags
== [field return tabbed on-unfocus]
>> get in (get-style 'area) 'flags
== [tabbed on-unfocus]
>> get in (get-style 'button) 'flags
==  That should give you enough info to get you started. HTH ~~Ammon ;~>
[3/3] from: brett::codeconscious::com at: 27-Feb-2004 22:20
> reveals the code to do this, and I can't figure out how field captures > an enter or tab key to unfocus the field, where a textarea sets it to a > new line. The button behaves the same way. Any ideas?
Focus directs keystroke events to a specific face - the focal face. When a Field is the focal-face, its Feel object (ctx-text/edit) has an Engage function which processes Key events - it actually delegates the key processing to another function (ctx-text/edit-text). The Edit-text function performs focussing functionality when it receives Enter and Tab keys. As Ammon pointed out you can intercept key events using an event function. Alternatively you can use a detect function in any face that contains the focal-face (the parent-face or the parent of the parent,etc) For example - here panel intercepts events directed to the box - type some keys to test it: view layout [ style testbox box green feel [ engage: func [face action event] [ if event/key [print [face/var event/key]] ] ] p1: panel feel [ detect: func [face event] [ print [event/type event/key] event ; Must return the event or None ] ] [ b1: testbox] do [focus b1] ] HTH Brett.
- Quoted lines have been omitted from some messages.
View the message alone to see the lines that have been omitted