| 1 | edit-list: make drop-list [
|
|---|
| 2 | tip: {
|
|---|
| 3 | USAGE:
|
|---|
| 4 | edit-list "1" data [1 2 3]
|
|---|
| 5 | edit-list data ["One" "Two" "Three"]
|
|---|
| 6 | edit-list data ctx-rebgui/locale*/colors
|
|---|
| 7 |
|
|---|
| 8 | DESCRIPTION:
|
|---|
| 9 | Editable single column modal selection list.
|
|---|
| 10 | At runtime face/text contains current selection.
|
|---|
| 11 | }
|
|---|
| 12 | edge: theme-edge
|
|---|
| 13 | feel: make edit/feel bind [
|
|---|
| 14 | engage: make function! [face action event /local start end total visible fd pf] [
|
|---|
| 15 | switch action [
|
|---|
| 16 | key [
|
|---|
| 17 | if event/key = #"^M" [
|
|---|
| 18 | edit-text face event
|
|---|
| 19 | hide-popup
|
|---|
| 20 | edit/unfocus
|
|---|
| 21 | exit
|
|---|
| 22 | ]
|
|---|
| 23 | if event/key = 'down [
|
|---|
| 24 | either view*/pop-face [set-focus view*/pop-face] [face/pane/action/on-click face/pane]
|
|---|
| 25 | exit
|
|---|
| 26 | ]
|
|---|
| 27 | prev-caret: index? view*/caret
|
|---|
| 28 | face/text: any [face/hidden-text head view*/caret]
|
|---|
| 29 | view*/caret: any [face/hidden-caret view*/caret]
|
|---|
| 30 | all [view*/highlight-start view*/highlight-start: at face/text index? view*/highlight-start]
|
|---|
| 31 | all [view*/highlight-end view*/highlight-end: at face/text index? view*/highlight-end]
|
|---|
| 32 | edit-text face event
|
|---|
| 33 | face/hidden-text: copy face/text
|
|---|
| 34 | face/hidden-caret: at face/hidden-text index? view*/caret
|
|---|
| 35 | fd: copy []
|
|---|
| 36 | if find face/text edit/letter [ ; no auto-complete for numbers
|
|---|
| 37 | foreach ln sort face/data [
|
|---|
| 38 | if find/match ln face/text [
|
|---|
| 39 | face/text: copy ln
|
|---|
| 40 | view*/caret: at face/text index? view*/caret
|
|---|
| 41 | unless char? event/key [
|
|---|
| 42 | view*/caret: at face/text prev-caret
|
|---|
| 43 | edit-text face event
|
|---|
| 44 | face/hidden-text: copy face/text
|
|---|
| 45 | face/hidden-caret: at face/hidden-text index? view*/caret
|
|---|
| 46 | ]
|
|---|
| 47 | ]
|
|---|
| 48 | if find/match ln face/hidden-text [
|
|---|
| 49 | insert tail fd ln
|
|---|
| 50 | ]
|
|---|
| 51 | ]
|
|---|
| 52 | ]
|
|---|
| 53 | either not empty? fd [
|
|---|
| 54 | either none? view*/pop-face [
|
|---|
| 55 | face/pane/action/on-click/filter-data face/pane fd
|
|---|
| 56 | ][
|
|---|
| 57 | pf: view*/pop-face
|
|---|
| 58 | pf/data: copy fd
|
|---|
| 59 | pf/pane/1/size/y: pf/size/y: sizes/line * (length? fd)
|
|---|
| 60 | pf/lines: to integer! pf/size/y / sizes/line
|
|---|
| 61 | pf/rows: length? fd
|
|---|
| 62 | ;check-editable
|
|---|
| 63 | show pf
|
|---|
| 64 | ]
|
|---|
| 65 | ][
|
|---|
| 66 | hide-popup
|
|---|
| 67 | ]
|
|---|
| 68 | show face
|
|---|
| 69 | ]
|
|---|
| 70 | down [
|
|---|
| 71 | either event/double-click [
|
|---|
| 72 | all [view*/caret not empty? view*/caret current-word view*/caret]
|
|---|
| 73 | ][
|
|---|
| 74 | either face <> view*/focal-face [set-focus face] [unlight-text]
|
|---|
| 75 | view*/caret: offset-to-caret face event/offset
|
|---|
| 76 | show face
|
|---|
| 77 | ]
|
|---|
| 78 | ]
|
|---|
| 79 | over [
|
|---|
| 80 | unless equal? view*/caret offset-to-caret face event/offset [
|
|---|
| 81 | unless view*/highlight-start [view*/highlight-start: view*/caret]
|
|---|
| 82 | view*/highlight-end: view*/caret: offset-to-caret face event/offset
|
|---|
| 83 | show face
|
|---|
| 84 | ]
|
|---|
| 85 | ]
|
|---|
| 86 | ]
|
|---|
| 87 | ]
|
|---|
| 88 | ] in edit 'self
|
|---|
| 89 | options: []
|
|---|
| 90 | caret: none
|
|---|
| 91 | ] |
|---|