| 1 | REBOL[version: 118]
|
|---|
| 2 | if system/version < 1.3.2[make error! "RebGUI requires View 1.3.2 or greater"]
|
|---|
| 3 | unless value? 'viewed?[
|
|---|
| 4 | find-window: make function![
|
|---|
| 5 | "Find a face's window face."
|
|---|
| 6 | face[object!]
|
|---|
| 7 | ][
|
|---|
| 8 | while[face/parent-face][face: face/parent-face]
|
|---|
| 9 | face
|
|---|
| 10 | ]
|
|---|
| 11 | viewed?: make function![
|
|---|
| 12 | "Returns TRUE if face is displayed."
|
|---|
| 13 | face[object!]
|
|---|
| 14 | ][
|
|---|
| 15 | found? find system/view/screen-face/pane find-window face
|
|---|
| 16 | ]
|
|---|
| 17 | ]
|
|---|
| 18 | system/locale: make system/locale[
|
|---|
| 19 | colors:[black navy blue violet forest maroon coffee purple reblue coal oldrab red brick crimson leaf brown aqua teal magenta sienna water olive papaya mint gray rebolor green orange pewter base-color khaki cyan tan silver pink sky gold wheat yellow yello beige snow linen ivory white]
|
|---|
| 20 | words:[]
|
|---|
| 21 | language: "English"
|
|---|
| 22 | dictionary: none
|
|---|
| 23 | dict: none
|
|---|
| 24 | ]
|
|---|
| 25 | ctx-rebgui: make object![
|
|---|
| 26 | build: 118
|
|---|
| 27 | view*: system/view
|
|---|
| 28 | locale*: system/locale
|
|---|
| 29 | find-face: make function![pnt[pair!]f[object! block!]/local p result][
|
|---|
| 30 | all[
|
|---|
| 31 | object? :f
|
|---|
| 32 | f/show?
|
|---|
| 33 | within? pnt win-offset? f f/size
|
|---|
| 34 | return f
|
|---|
| 35 | ]
|
|---|
| 36 | p: either object? :f[get in f 'pane][:f]
|
|---|
| 37 | either block? :p[
|
|---|
| 38 | result: none
|
|---|
| 39 | foreach face head reverse copy p[
|
|---|
| 40 | if all[object? :face face/show? face: find-face pnt face][
|
|---|
| 41 | result: face
|
|---|
| 42 | break
|
|---|
| 43 | ]
|
|---|
| 44 | ]
|
|---|
| 45 | result
|
|---|
| 46 | ][
|
|---|
| 47 | all[object? :p find-face pnt :p]
|
|---|
| 48 | ]
|
|---|
| 49 | ]
|
|---|
| 50 | subface: make system/standard/face[
|
|---|
| 51 | color: edge: font: para: feel: none
|
|---|
| 52 | ]
|
|---|
| 53 | all-chars: make string! 256
|
|---|
| 54 | repeat i 256[insert tail all-chars to char! i - 1]
|
|---|
| 55 | font?: make function![
|
|---|
| 56 | font-name[string!]
|
|---|
| 57 | ][
|
|---|
| 58 | all[font-name = font-sans-serif return true]
|
|---|
| 59 | (size-text make subface[text: all-chars font: make view*/screen-face/font[name: font-sans-serif]]) <>
|
|---|
| 60 | (size-text make subface[text: all-chars font: make view*/screen-face/font[name: font-name]])
|
|---|
| 61 | ]
|
|---|
| 62 | gui-error: make function![
|
|---|
| 63 | error[string!]
|
|---|
| 64 | /continue
|
|---|
| 65 | ][
|
|---|
| 66 | write/append/lines %rebgui.log reform[now/date now/time error]
|
|---|
| 67 | unless continue[make error! error]
|
|---|
| 68 | ]
|
|---|
| 69 | span-resize: make function![face[object!]delta[pair!]][
|
|---|
| 70 | if face/span[
|
|---|
| 71 | face/old-size: face/size
|
|---|
| 72 | all[find face/span #X face/offset/x: face/offset/x + delta/x]
|
|---|
| 73 | all[find face/span #Y face/offset/y: face/offset/y + delta/y]
|
|---|
| 74 | all[find face/span #W face/size/x: face/size/x + delta/x]
|
|---|
| 75 | all[find face/span #H face/size/y: face/size/y + delta/y]
|
|---|
| 76 | all[face/old-size <> face/size object? get in face 'action face/action/on-resize face]
|
|---|
| 77 | ]
|
|---|
| 78 | any[
|
|---|
| 79 | if block? get in face 'pane[foreach f face/pane[span-resize f delta]]
|
|---|
| 80 | if object? get in face 'pane[span-resize face/pane delta]
|
|---|
| 81 | ]
|
|---|
| 82 | ]
|
|---|
| 83 | span-size: make function![face[object!]size[pair!]margin[pair!]][
|
|---|
| 84 | if face/span[
|
|---|
| 85 | all[
|
|---|
| 86 | find face/span #L
|
|---|
| 87 | face/size/x: size/x - face/offset/x - margin/x
|
|---|
| 88 | all[find[drop-list edit-list]face/type face/pane/offset/x: face/size/x - sizes/line + 1]
|
|---|
| 89 | ]
|
|---|
| 90 | all[find face/span #V face/size/y: size/y - face/offset/y - margin/y]
|
|---|
| 91 | all[face/old-size <> face/size object? get in face 'action face/action/on-resize face]
|
|---|
| 92 | if find face/span #O[
|
|---|
| 93 | face/offset/x: either any[zero? face/offset/y size/y = (face/offset/y + face/size/y)][
|
|---|
| 94 | size/x - face/size/x
|
|---|
| 95 | ][
|
|---|
| 96 | size/x - face/size/x - margin/x
|
|---|
| 97 | ]
|
|---|
| 98 | ]
|
|---|
| 99 | ]
|
|---|
| 100 | if block? get in face 'pane[
|
|---|
| 101 | either face/type = 'tab-panel[
|
|---|
| 102 | foreach f face/pane[span-size f face/size 0x0]
|
|---|
| 103 | ][
|
|---|
| 104 | foreach f face/pane[span-size f face/size face/pane/1/offset]
|
|---|
| 105 | ]
|
|---|
| 106 | ]
|
|---|
| 107 | if object? get in face 'pane[span-size face/pane face/size face/pane/offset]
|
|---|
| 108 | ]
|
|---|
| 109 | unview-keep: make function![num[integer!]/local pane][
|
|---|
| 110 | pane: head view*/screen-face/pane
|
|---|
| 111 | while[(length? pane) > num][remove back tail pane]
|
|---|
| 112 | show view*/screen-face
|
|---|
| 113 | ]
|
|---|
| 114 | words:[after at bold button-size data do edge effect feel field-size font indent italic label-size margin on on-alt-click on-away on-click on-dbl-click on-edit on-focus on-key on-over on-resize on-scroll on-unfocus options pad para rate return reverse space text-color text-size tight tip underline]
|
|---|
| 115 | select-face: make function![face][
|
|---|
| 116 | face/color: colors/state-light
|
|---|
| 117 | face/font/color: colors/page
|
|---|
| 118 | show face
|
|---|
| 119 | ]
|
|---|
| 120 | deselect-face: make function![face /fill][
|
|---|
| 121 | face/color: either fill[colors/page][none]
|
|---|
| 122 | face/font/color: colors/text
|
|---|
| 123 | show face
|
|---|
| 124 | ]
|
|---|
| 125 | colors: construct/with either exists? %ui.dat[pick load %ui.dat 3][[]]make object![
|
|---|
| 126 | page: ivory
|
|---|
| 127 | text: coal
|
|---|
| 128 | theme-light: 195.221.127
|
|---|
| 129 | theme-dark: 136.187.0
|
|---|
| 130 | state-light: 255.204.127
|
|---|
| 131 | state-dark: 255.153.0
|
|---|
| 132 | outline-light: 204.204.204
|
|---|
| 133 | outline-dark: 136.136.136
|
|---|
| 134 | ]
|
|---|
| 135 | sizes: construct/with either exists? %ui.dat[pick load %ui.dat 6][[]]make object![
|
|---|
| 136 | cell: 4
|
|---|
| 137 | edge: 1
|
|---|
| 138 | font: 12
|
|---|
| 139 | font-height: none
|
|---|
| 140 | gap: 2
|
|---|
| 141 | line: cell * 5
|
|---|
| 142 | margin: 4
|
|---|
| 143 | slider: cell * 4
|
|---|
| 144 | ]
|
|---|
| 145 | behaviors: construct/with either exists? %ui.dat[pick load %ui.dat 9][[]]make object![
|
|---|
| 146 | action-on-enter:[drop-list edit-list field password spinner]
|
|---|
| 147 | action-on-tab:[field]
|
|---|
| 148 | caret-on-focus:[area]
|
|---|
| 149 | cyclic:[group-box panel sheet tab-panel]
|
|---|
| 150 | hilight-on-focus:[edit-list field password spinner]
|
|---|
| 151 | tabbed:[area button drop-list drop-tree edit-list field grid password spinner]
|
|---|
| 152 | ]
|
|---|
| 153 | effects: construct/with either exists? %ui.dat[pick load %ui.dat 12][[]]make object![
|
|---|
| 154 | arrows-together: false
|
|---|
| 155 | radius: 5
|
|---|
| 156 | font: either font? "arial"["verdana"][font-sans-serif]
|
|---|
| 157 | fonts: sort reduce[font-sans-serif font-fixed font-serif "verdana"]
|
|---|
| 158 | splash-delay: 1
|
|---|
| 159 | tooltip-delay: 0:00:01
|
|---|
| 160 | webdings: font? "webdings"
|
|---|
| 161 | window: none
|
|---|
| 162 | ]
|
|---|
| 163 | on-fkey: make object![
|
|---|
| 164 | f1: f2: f3: f4: f5: f6: f7: f8: f9: f10: f11: f12: none
|
|---|
| 165 | ]
|
|---|
| 166 | edit: make object![
|
|---|
| 167 | siblings: none
|
|---|
| 168 | caret: none
|
|---|
| 169 | letter: make bitset![#"A" - #"Z" #"a" - #"z" #"'"]
|
|---|
| 170 | capital: make bitset![#"A" - #"Z"]
|
|---|
| 171 | other: negate letter
|
|---|
| 172 | edits: make function![
|
|---|
| 173 | words[block!]
|
|---|
| 174 | /local result ln w
|
|---|
| 175 | ][
|
|---|
| 176 | result: copy[]
|
|---|
| 177 | foreach word words[
|
|---|
| 178 | repeat n ln: length? word[
|
|---|
| 179 | insert tail result head remove at copy word n
|
|---|
| 180 | ]
|
|---|
| 181 | repeat n ln - 1[
|
|---|
| 182 | insert tail result head change change at copy word n pick word n + 1 pick word n
|
|---|
| 183 | ]
|
|---|
| 184 | foreach ch "abcdefghijklmnopqrstuvwxyz"[
|
|---|
| 185 | repeat n ln[
|
|---|
| 186 | poke w: copy word n ch
|
|---|
| 187 | insert tail result w
|
|---|
| 188 | ]
|
|---|
| 189 | repeat n ln + 1[
|
|---|
| 190 | insert tail result head insert at copy word n ch
|
|---|
| 191 | ]
|
|---|
| 192 | ]
|
|---|
| 193 | ]
|
|---|
| 194 | result
|
|---|
| 195 | ]
|
|---|
| 196 | lookup-word: make function![
|
|---|
| 197 | word[string!]
|
|---|
| 198 | /local result
|
|---|
| 199 | ][
|
|---|
| 200 | any[
|
|---|
| 201 | not empty? result: intersect locale*/dict make hash! word: reduce[word]
|
|---|
| 202 | not empty? result: intersect locale*/dict make hash! edits word
|
|---|
| 203 | result: word
|
|---|
| 204 | ]
|
|---|
| 205 | sort result
|
|---|
| 206 | ]
|
|---|
| 207 | insert?: true
|
|---|
| 208 | keymap:[
|
|---|
| 209 | #"^H" back-char
|
|---|
| 210 | #"^~" del-char
|
|---|
| 211 | #"^M" enter
|
|---|
| 212 | #"^A" all-text
|
|---|
| 213 | #"^C" copy-text
|
|---|
| 214 | #"^X" cut-text
|
|---|
| 215 | #"^V" paste-text
|
|---|
| 216 | #"^T" clear-tail
|
|---|
| 217 | #"^Z" undo
|
|---|
| 218 | #"^Y" redo
|
|---|
| 219 | #"^[" undo-all
|
|---|
| 220 | #"^S" spellcheck
|
|---|
| 221 | #"^/" ctrl-enter
|
|---|
| 222 | ]
|
|---|
| 223 | hilight-text: make function![start end][
|
|---|
| 224 | view*/highlight-start: start
|
|---|
| 225 | view*/highlight-end: end
|
|---|
| 226 | ]
|
|---|
| 227 | hilight-all: make function![face][
|
|---|
| 228 | either empty? face/text[unlight-text][
|
|---|
| 229 | view*/highlight-start: head face/text
|
|---|
| 230 | view*/highlight-end: tail face/text
|
|---|
| 231 | ]
|
|---|
| 232 | ]
|
|---|
| 233 | unlight-text: make function![][
|
|---|
| 234 | view*/highlight-start: view*/highlight-end: none
|
|---|
| 235 | ]
|
|---|
| 236 | hilight?: make function![][
|
|---|
| 237 | all[
|
|---|
| 238 | object? view*/focal-face
|
|---|
| 239 | string? view*/highlight-start
|
|---|
| 240 | string? view*/highlight-end
|
|---|
| 241 | not zero? offset? view*/highlight-end view*/highlight-start
|
|---|
| 242 | ]
|
|---|
| 243 | ]
|
|---|
| 244 | hilight-range?: make function![/local start end][
|
|---|
| 245 | start: view*/highlight-start
|
|---|
| 246 | end: view*/highlight-end
|
|---|
| 247 | if negative? offset? start end[start: end end: view*/highlight-start]
|
|---|
| 248 | reduce[start end]
|
|---|
| 249 | ]
|
|---|
| 250 | tabbed?: make function![
|
|---|
| 251 | face[object!]
|
|---|
| 252 | ][
|
|---|
| 253 | all[
|
|---|
| 254 | face/show?
|
|---|
| 255 | find behaviors/tabbed face/type
|
|---|
| 256 | not find face/options 'info
|
|---|
| 257 | face
|
|---|
| 258 | ]
|
|---|
| 259 | ]
|
|---|
| 260 | cyclic?: make function![
|
|---|
| 261 | face[object!]
|
|---|
| 262 | ][
|
|---|
| 263 | all[find behaviors/cyclic face/type face]
|
|---|
| 264 | ]
|
|---|
| 265 | unfocus: make function![/local face][
|
|---|
| 266 | if face: view*/focal-face[
|
|---|
| 267 | if all[face/type <> 'face get in face/action 'on-unfocus][
|
|---|
| 268 | unless face/action/on-unfocus face[return false]
|
|---|
| 269 | ]
|
|---|
| 270 | all[
|
|---|
| 271 | view*/caret
|
|---|
| 272 | in face 'caret
|
|---|
| 273 | face/caret: index? view*/caret
|
|---|
| 274 | ]
|
|---|
| 275 | all[
|
|---|
| 276 | face/type = 'button
|
|---|
| 277 | face/feel/over face false none
|
|---|
| 278 | ]
|
|---|
| 279 | ]
|
|---|
| 280 | view*/focal-face: view*/caret: none
|
|---|
| 281 | unlight-text
|
|---|
| 282 | all[face show face]
|
|---|
| 283 | true
|
|---|
| 284 | ]
|
|---|
| 285 | copy-selected-text: make function![/local start end][
|
|---|
| 286 | if hilight?[
|
|---|
| 287 | set[start end]hilight-range?
|
|---|
| 288 | write clipboard:// copy/part start end
|
|---|
| 289 | true
|
|---|
| 290 | ]
|
|---|
| 291 | ]
|
|---|
| 292 | delete-selected-text: make function![/local start end][
|
|---|
| 293 | if hilight?[
|
|---|
| 294 | set[start end]hilight-range?
|
|---|
| 295 | remove/part start end
|
|---|
| 296 | view*/caret: start
|
|---|
| 297 | view*/focal-face/line-list: none
|
|---|
| 298 | unlight-text
|
|---|
| 299 | true
|
|---|
| 300 | ]
|
|---|
| 301 | ]
|
|---|
| 302 | cut-text: make function![][
|
|---|
| 303 | undo-add face
|
|---|
| 304 | copy-selected-text face
|
|---|
| 305 | delete-selected-text
|
|---|
| 306 | ]
|
|---|
| 307 | paste-text: make function![][
|
|---|
| 308 | undo-add face
|
|---|
| 309 | delete-selected-text
|
|---|
| 310 | face/line-list: none
|
|---|
| 311 | view*/caret: insert view*/caret read clipboard://
|
|---|
| 312 | ]
|
|---|
| 313 | undo-max: 20
|
|---|
| 314 | undo-add: make function![face][
|
|---|
| 315 | if in face 'undo[
|
|---|
| 316 | insert clear face/undo at copy face/text index? view*/caret
|
|---|
| 317 | if all[undo-max undo-max < length? head face/undo][remove head face/undo]
|
|---|
| 318 | face/undo: tail face/undo
|
|---|
| 319 | ]
|
|---|
| 320 | ]
|
|---|
| 321 | undo-get: make function![face][
|
|---|
| 322 | face/text: head view*/caret: first face/undo
|
|---|
| 323 | face/line-list: none
|
|---|
| 324 | remove face/undo
|
|---|
| 325 | ]
|
|---|
| 326 | word-limits: make bitset! {
|
|---|
| 327 | ^-^M/[](){}"}
|
|---|
| 328 | word-limits: reduce[word-limits complement word-limits]
|
|---|
| 329 | current-word: make function![str /local s ns][
|
|---|
| 330 | unless string? str[gui-error/continue reform["Current word trap" type? str str]exit]
|
|---|
| 331 | set[s]word-limits
|
|---|
| 332 | s: any[all[s: find/reverse str s next s]head str]
|
|---|
| 333 | set[ns]word-limits
|
|---|
| 334 | ns: any[find str ns tail str]
|
|---|
| 335 | hilight-text s ns
|
|---|
| 336 | show view*/focal-face
|
|---|
| 337 | ]
|
|---|
| 338 | next-word: make function![str /local s ns][
|
|---|
| 339 | set[s ns]word-limits
|
|---|
| 340 | any[all[s: find str s find s ns]tail str]
|
|---|
| 341 | ]
|
|---|
| 342 | back-word: make function![str /local s ns][
|
|---|
| 343 | set[s ns]word-limits
|
|---|
| 344 | any[all[ns: find/reverse str ns ns: find/reverse ns s next ns]head str]
|
|---|
| 345 | ]
|
|---|
| 346 | end-of-line: make function![str][
|
|---|
| 347 | any[find str "^/" tail str]
|
|---|
| 348 | ]
|
|---|
| 349 | beg-of-line: make function![str /local nstr][
|
|---|
| 350 | either nstr: find/reverse str "^/"[next nstr][head str]
|
|---|
| 351 | ]
|
|---|
| 352 | next-field: make function![face /wrap][
|
|---|
| 353 | unless face/parent-face[return none]
|
|---|
| 354 | unless find[object! block!]type?/word get in face/parent-face 'pane[
|
|---|
| 355 | return none
|
|---|
| 356 | ]
|
|---|
| 357 | siblings: compose[(face/parent-face/pane)]
|
|---|
| 358 | unless wrap[siblings: find/tail siblings face]
|
|---|
| 359 | foreach sibling siblings[
|
|---|
| 360 | if target: any[
|
|---|
| 361 | tabbed? sibling
|
|---|
| 362 | into-widget/forwards sibling
|
|---|
| 363 | ][
|
|---|
| 364 | return target
|
|---|
| 365 | ]
|
|---|
| 366 | ]
|
|---|
| 367 | all[
|
|---|
| 368 | not cyclic? face/parent-face
|
|---|
| 369 | target: next-field face/parent-face
|
|---|
| 370 | return target
|
|---|
| 371 | ]
|
|---|
| 372 | all[
|
|---|
| 373 | target: next-field/wrap face
|
|---|
| 374 | return target
|
|---|
| 375 | ]
|
|---|
| 376 | ]
|
|---|
| 377 | back-field: make function![face /wrap][
|
|---|
| 378 | unless face/parent-face[return none]
|
|---|
| 379 | unless find[object! block!]type?/word get in face/parent-face 'pane[
|
|---|
| 380 | return none
|
|---|
| 381 | ]
|
|---|
| 382 | siblings: reverse compose[(face/parent-face/pane)]
|
|---|
| 383 | unless wrap[siblings: find/tail siblings face]
|
|---|
| 384 | foreach sibling siblings[
|
|---|
| 385 | if target: any[
|
|---|
| 386 | tabbed? sibling
|
|---|
| 387 | into-widget/backwards sibling
|
|---|
| 388 | ][
|
|---|
| 389 | return target
|
|---|
| 390 | ]
|
|---|
| 391 | ]
|
|---|
| 392 | all[
|
|---|
| 393 | not cyclic? face/parent-face
|
|---|
| 394 | target: back-field face/parent-face
|
|---|
| 395 | return target
|
|---|
| 396 | ]
|
|---|
| 397 | all[
|
|---|
| 398 | target: back-field/wrap face
|
|---|
| 399 | return target
|
|---|
| 400 | ]
|
|---|
| 401 | ]
|
|---|
| 402 | into-widget: make function![
|
|---|
| 403 | {Recursivly returns the first tabbable face in parent's face pane tree.}
|
|---|
| 404 | face[object!]
|
|---|
| 405 | /forwards
|
|---|
| 406 | /backwards
|
|---|
| 407 | /local
|
|---|
| 408 | target children
|
|---|
| 409 | ][
|
|---|
| 410 | unless find[object! block!]type?/word get in face 'pane[
|
|---|
| 411 | return none
|
|---|
| 412 | ]
|
|---|
| 413 | unless face/show?[
|
|---|
| 414 | return none
|
|---|
| 415 | ]
|
|---|
| 416 | children: compose[(face/pane)]
|
|---|
| 417 | catch[
|
|---|
| 418 | foreach child either backwards[reverse children][children][
|
|---|
| 419 | if target: any[
|
|---|
| 420 | tabbed? child
|
|---|
| 421 | either backwards[
|
|---|
| 422 | into-widget/backwards child
|
|---|
| 423 | ][
|
|---|
| 424 | into-widget child
|
|---|
| 425 | ]
|
|---|
| 426 | ][
|
|---|
| 427 | throw target
|
|---|
| 428 | ]
|
|---|
| 429 | ]
|
|---|
| 430 | ]
|
|---|
| 431 | ]
|
|---|
| 432 | keys-to-insert: make bitset! #{
|
|---|
| 433 | 01000000FFFFFFFFFFFFFFFFFFFFFF7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
|---|
| 434 | }
|
|---|
| 435 | insert-char: make function![face char][
|
|---|
| 436 | delete-selected-text
|
|---|
| 437 | unless any[insert? tail? view*/caret "^/" = first view*/caret][remove view*/caret]
|
|---|
| 438 | insert view*/caret char
|
|---|
| 439 | view*/caret: next view*/caret
|
|---|
| 440 | ]
|
|---|
| 441 | move: make function![event ctrl plain][
|
|---|
| 442 | either event/shift[
|
|---|
| 443 | any[view*/highlight-start view*/highlight-start: view*/caret]
|
|---|
| 444 | ][unlight-text]
|
|---|
| 445 | view*/caret: either event/control ctrl plain
|
|---|
| 446 | if event/shift[
|
|---|
| 447 | either view*/caret = view*/highlight-start[unlight-text][view*/highlight-end: view*/caret]
|
|---|
| 448 | ]
|
|---|
| 449 | ]
|
|---|
| 450 | move-y: make function![face delta /local pos tmp tmp2][
|
|---|
| 451 | tmp: offset-to-caret face 0x2 + delta + pos: caret-to-offset face view*/caret
|
|---|
| 452 | tmp2: caret-to-offset face tmp
|
|---|
| 453 | either tmp2/y <> pos/y[tmp][view*/caret]
|
|---|
| 454 | ]
|
|---|
| 455 | edit-text: make function![
|
|---|
| 456 | face event
|
|---|
| 457 | /local key edge para caret scroll page-up page-down face-size
|
|---|
| 458 | ][
|
|---|
| 459 | face-size: face/size - either face/edge[2 * face/edge/size][0]
|
|---|
| 460 | key: event/key
|
|---|
| 461 | if char? key[
|
|---|
| 462 | either find keys-to-insert key[
|
|---|
| 463 | undo-add face
|
|---|
| 464 | insert-char face key
|
|---|
| 465 | ][key: select keymap key]
|
|---|
| 466 | ]
|
|---|
| 467 | if word? key[
|
|---|
| 468 | page-up:[move-y face face-size - sizes/font-height - sizes/font-height * 0x-1]
|
|---|
| 469 | page-down:[move-y face face-size - sizes/font-height * 0x1]
|
|---|
| 470 | do select[
|
|---|
| 471 | left[move event[back-word view*/caret][back view*/caret]]
|
|---|
| 472 | right[move event[next-word view*/caret][next view*/caret]]
|
|---|
| 473 | up[move event page-up[move-y face sizes/font-height * 0x-1]]
|
|---|
| 474 | down[move event page-down[move-y face sizes/font-height * 0x1]]
|
|---|
| 475 | page-up[move event[head view*/caret]page-up]
|
|---|
| 476 | page-down[move event[tail view*/caret]page-down]
|
|---|
| 477 | home[move event[head view*/caret][beg-of-line view*/caret]]
|
|---|
| 478 | end[move event[tail view*/caret][end-of-line view*/caret]]
|
|---|
| 479 | insert[either event/shift[paste-text][insert?: complement insert?]]
|
|---|
| 480 | back-char[
|
|---|
| 481 | undo-add face
|
|---|
| 482 | any[
|
|---|
| 483 | delete-selected-text
|
|---|
| 484 | head? view*/caret
|
|---|
| 485 | either event/control[
|
|---|
| 486 | tmp: view*/caret
|
|---|
| 487 | remove/part view*/caret: back-word tmp tmp
|
|---|
| 488 | ][remove view*/caret: back view*/caret]
|
|---|
| 489 | ]
|
|---|
| 490 | ]
|
|---|
| 491 | del-char[
|
|---|
| 492 | undo-add face
|
|---|
| 493 | either event/shift[unless face/type = 'password[cut-text]][
|
|---|
| 494 | any[
|
|---|
| 495 | delete-selected-text
|
|---|
| 496 | tail? view*/caret
|
|---|
| 497 | either event/control[
|
|---|
| 498 | remove/part view*/caret back next-word view*/caret
|
|---|
| 499 | if tail? next view*/caret[remove back tail view*/caret]
|
|---|
| 500 | ][remove view*/caret]
|
|---|
| 501 | ]
|
|---|
| 502 | ]
|
|---|
| 503 | ]
|
|---|
| 504 | enter[
|
|---|
| 505 | either find behaviors/action-on-enter face/type[
|
|---|
| 506 | all[face/type = 'spinner face/action/on-unfocus face]
|
|---|
| 507 | set-focus face
|
|---|
| 508 | face/action/on-click face
|
|---|
| 509 | ][
|
|---|
| 510 | undo-add face
|
|---|
| 511 | insert-char face "^/"
|
|---|
| 512 | ]
|
|---|
| 513 | ]
|
|---|
| 514 | ctrl-enter[undo-add face insert-char face tab]
|
|---|
| 515 | all-text[hilight-all face]
|
|---|
| 516 | copy-text[unless face/type = 'password[copy-selected-text face unlight-text]]
|
|---|
| 517 | cut-text[unless face/type = 'password[cut-text]]
|
|---|
| 518 | paste-text[paste-text]
|
|---|
| 519 | clear-tail[
|
|---|
| 520 | undo-add face
|
|---|
| 521 | remove/part view*/caret end-of-line view*/caret
|
|---|
| 522 | ]
|
|---|
| 523 | undo[
|
|---|
| 524 | if all[in face 'undo not head? face/undo][
|
|---|
| 525 | insert face/undo at copy face/text index? view*/caret
|
|---|
| 526 | face/undo: back face/undo
|
|---|
| 527 | undo-get face
|
|---|
| 528 | ]
|
|---|
| 529 | ]
|
|---|
| 530 | redo[
|
|---|
| 531 | if all[in face 'undo not tail? face/undo][
|
|---|
| 532 | face/undo: insert face/undo at copy face/text index? view*/caret
|
|---|
| 533 | undo-get face
|
|---|
| 534 | ]
|
|---|
| 535 | ]
|
|---|
| 536 | undo-all[
|
|---|
| 537 | if in face 'esc[
|
|---|
| 538 | clear face/text
|
|---|
| 539 | all[in face 'undo clear face/undo]
|
|---|
| 540 | all[string? face/esc insert face/text face/esc]
|
|---|
| 541 | view*/caret: tail face/text
|
|---|
| 542 | ]
|
|---|
| 543 | ]
|
|---|
| 544 | spellcheck[
|
|---|
| 545 | request-spellcheck face
|
|---|
| 546 | ]
|
|---|
| 547 | ]key
|
|---|
| 548 | ]
|
|---|
| 549 | edge: face/edge
|
|---|
| 550 | para: face/para
|
|---|
| 551 | scroll: face/para/scroll
|
|---|
| 552 | if error? try[
|
|---|
| 553 | caret: caret-to-offset face view*/caret
|
|---|
| 554 | if caret/y < (edge/size/y + para/origin/y + para/indent/y)[
|
|---|
| 555 | scroll/y: round/to scroll/y - caret/y sizes/font-height
|
|---|
| 556 | ]
|
|---|
| 557 | if caret/y > (face-size/y - sizes/font-height)[
|
|---|
| 558 | scroll/y: round/to (scroll/y + ((face-size/y - sizes/font-height) - caret/y)) sizes/font-height
|
|---|
| 559 | ]
|
|---|
| 560 | unless para/wrap?[
|
|---|
| 561 | if caret/x < (edge/size/x + para/origin/x + para/indent/x)[
|
|---|
| 562 | scroll/x: scroll/x - caret/x + (edge/size/x + para/origin/x + para/indent/x)
|
|---|
| 563 | ]
|
|---|
| 564 | if caret/x > (face-size/x - para/margin/x)[
|
|---|
| 565 | scroll/x: scroll/x + (face-size/x - para/margin/x - caret/x)
|
|---|
| 566 | ]
|
|---|
| 567 | ]
|
|---|
| 568 | if scroll <> face/para/scroll[
|
|---|
| 569 | face/para/scroll: scroll
|
|---|
| 570 | if face/type = 'area[face/key-scroll?: true]
|
|---|
| 571 | ]
|
|---|
| 572 | ][gui-error/continue reform["Caret trap" face/type face/para]]
|
|---|
| 573 | show face
|
|---|
| 574 | ]
|
|---|
| 575 | feel: make object![
|
|---|
| 576 | redraw: detect: over: none
|
|---|
| 577 | engage: func[face act event /local txt][
|
|---|
| 578 | do select[
|
|---|
| 579 | key[
|
|---|
| 580 | unless all[get in face/action 'on-key not face/action/on-key face event][
|
|---|
| 581 | txt: copy face/text
|
|---|
| 582 | edit-text face event
|
|---|
| 583 | all[
|
|---|
| 584 | get in face/action 'on-edit
|
|---|
| 585 | strict-not-equal? txt face/text
|
|---|
| 586 | face/action/on-edit face
|
|---|
| 587 | ]
|
|---|
| 588 | ]
|
|---|
| 589 | ]
|
|---|
| 590 | down[
|
|---|
| 591 | either event/double-click[
|
|---|
| 592 | all[view*/caret not empty? view*/caret current-word view*/caret]
|
|---|
| 593 | ][
|
|---|
| 594 | either face = view*/focal-face[
|
|---|
| 595 | unlight-text
|
|---|
| 596 | view*/caret: offset-to-caret face event/offset
|
|---|
| 597 | show face
|
|---|
| 598 | ][
|
|---|
| 599 | caret: offset-to-caret face event/offset
|
|---|
| 600 | set-focus face
|
|---|
| 601 | ]
|
|---|
| 602 | ]
|
|---|
| 603 | ]
|
|---|
| 604 | over[
|
|---|
| 605 | unless view*/caret = offset-to-caret face event/offset[
|
|---|
| 606 | unless view*/highlight-start[view*/highlight-start: view*/caret]
|
|---|
| 607 | view*/highlight-end: view*/caret: offset-to-caret face event/offset
|
|---|
| 608 | show face
|
|---|
| 609 | ]
|
|---|
| 610 | ]
|
|---|
| 611 | alt-up[face/action/on-alt-click face]
|
|---|
| 612 | scroll-line[face/action/on-scroll face event/offset]
|
|---|
| 613 | scroll-page[face/action/on-scroll/page face event/offset]
|
|---|
| 614 | ]act
|
|---|
| 615 | ]
|
|---|
| 616 | ]
|
|---|
| 617 | ]
|
|---|
| 618 | widgets: make object![
|
|---|
| 619 | rebind: make function![][
|
|---|
| 620 | default-edge/color: colors/text
|
|---|
| 621 | default-edge/size: as-pair sizes/edge sizes/edge
|
|---|
| 622 | theme-edge/color: colors/theme-dark
|
|---|
| 623 | theme-edge/size: default-edge/size
|
|---|
| 624 | outline-edge/color: colors/outline-light
|
|---|
| 625 | outline-edge/size: default-edge/size
|
|---|
| 626 | default-font/size: sizes/font
|
|---|
| 627 | default-font/name: effects/font
|
|---|
| 628 | default-font-bold: make default-font[style: 'bold]
|
|---|
| 629 | default-font-heading: make default-font[style: 'bold color: colors/page align: 'center shadow: 1x1]
|
|---|
| 630 | default-font-large: make default-font[size: sizes/font * 2]
|
|---|
| 631 | default-font-right: make default-font[align: 'right]
|
|---|
| 632 | default-font-top: make default-font[valign: 'top]
|
|---|
| 633 | default-para-indented/origin/x: sizes/line
|
|---|
| 634 | default-text/text: copy ""
|
|---|
| 635 | sizes/font-height: second size-text default-text
|
|---|
| 636 | foreach w next find first self 'choose[
|
|---|
| 637 | widgets/:w/rebind
|
|---|
| 638 | ]
|
|---|
| 639 | ]
|
|---|
| 640 | default-edge: make object![
|
|---|
| 641 | color: colors/text
|
|---|
| 642 | image: none
|
|---|
| 643 | effect: none
|
|---|
| 644 | size: as-pair sizes/edge sizes/edge
|
|---|
| 645 | ]
|
|---|
| 646 | theme-edge: make default-edge[
|
|---|
| 647 | color: colors/theme-dark
|
|---|
| 648 | ]
|
|---|
| 649 | outline-edge: make default-edge[
|
|---|
| 650 | color: colors/outline-light
|
|---|
| 651 | ]
|
|---|
| 652 | default-font: make object![
|
|---|
| 653 | name: effects/font
|
|---|
| 654 | style: none
|
|---|
| 655 | size: sizes/font
|
|---|
| 656 | color: colors/text
|
|---|
| 657 | offset: 0x0
|
|---|
| 658 | space: 0x0
|
|---|
| 659 | align: 'left
|
|---|
| 660 | valign: 'middle
|
|---|
| 661 | shadow: none
|
|---|
| 662 | ]
|
|---|
| 663 | default-font-bold: make default-font[
|
|---|
| 664 | style: 'bold
|
|---|
| 665 | ]
|
|---|
| 666 | default-font-heading: make default-font[
|
|---|
| 667 | style: 'bold
|
|---|
| 668 | color: colors/page
|
|---|
| 669 | align: 'center
|
|---|
| 670 | shadow: 1x1
|
|---|
| 671 | ]
|
|---|
| 672 | default-font-large: make default-font[
|
|---|
| 673 | size: sizes/font * 2
|
|---|
| 674 | ]
|
|---|
| 675 | default-font-right: make default-font[
|
|---|
| 676 | align: 'right
|
|---|
| 677 | ]
|
|---|
| 678 | default-font-top: make default-font[
|
|---|
| 679 | valign: 'top
|
|---|
| 680 | ]
|
|---|
| 681 | default-para: make object![
|
|---|
| 682 | origin: 2x2
|
|---|
| 683 | margin: 2x2
|
|---|
| 684 | indent: 0x0
|
|---|
| 685 | tabs: 0
|
|---|
| 686 | wrap?: false
|
|---|
| 687 | scroll: 0x0
|
|---|
| 688 | ]
|
|---|
| 689 | default-para-wrap: make default-para[
|
|---|
| 690 | origin: 2x0
|
|---|
| 691 | indent: 0x0
|
|---|
| 692 | wrap?: true
|
|---|
| 693 | ]
|
|---|
| 694 | default-para-indented: make default-para[
|
|---|
| 695 | origin: as-pair sizes/line 2
|
|---|
| 696 | ]
|
|---|
| 697 | default-feel: make object![
|
|---|
| 698 | redraw:
|
|---|
| 699 | detect:
|
|---|
| 700 | over:
|
|---|
| 701 | engage: none
|
|---|
| 702 | ]
|
|---|
| 703 | default-action: make object![
|
|---|
| 704 | on-alt-click:
|
|---|
| 705 | on-away:
|
|---|
| 706 | on-click:
|
|---|
| 707 | on-dbl-click:
|
|---|
| 708 | on-edit:
|
|---|
| 709 | on-focus:
|
|---|
| 710 | on-key:
|
|---|
| 711 | on-over:
|
|---|
| 712 | on-resize:
|
|---|
| 713 | on-scroll:
|
|---|
| 714 | on-unfocus: none
|
|---|
| 715 | ]
|
|---|
| 716 | set 'rebface make subface[
|
|---|
| 717 | feel: default-feel
|
|---|
| 718 | action: default-action
|
|---|
| 719 | options:[]
|
|---|
| 720 | rebind: init: tip: none
|
|---|
| 721 | ]
|
|---|
| 722 | default-text: make rebface[
|
|---|
| 723 | size: 10000x10000
|
|---|
| 724 | text: ""
|
|---|
| 725 | font: default-font
|
|---|
| 726 | para: default-para
|
|---|
| 727 | ]
|
|---|
| 728 | sizes/font-height: second size-text default-text
|
|---|
| 729 | date-spec:[
|
|---|
| 730 | tight
|
|---|
| 731 | symbol 9x6 data 'rewind[face/parent-face/data/year: face/parent-face/data/year - 1 show face/parent-face]
|
|---|
| 732 | symbol 9x6 data 'left[face/parent-face/data/month: face/parent-face/data/month - 1 show face/parent-face]
|
|---|
| 733 | symbol 34x6[set-data face/parent-face first face/parent-face/options]
|
|---|
| 734 | symbol 9x6 data 'right[face/parent-face/data/month: face/parent-face/data/month + 1 show face/parent-face]
|
|---|
| 735 | symbol 9x6 data 'forward[face/parent-face/data/year: face/parent-face/data/year + 1 show face/parent-face]
|
|---|
| 736 | return
|
|---|
| 737 | ]
|
|---|
| 738 | foreach day locale*/days[
|
|---|
| 739 | insert tail date-spec compose[label 10 (copy/part day 3) font[align: 'center]]
|
|---|
| 740 | ]
|
|---|
| 741 | insert tail date-spec[return bar]
|
|---|
| 742 | loop 6[
|
|---|
| 743 | insert tail date-spec 'return
|
|---|
| 744 | loop 7[
|
|---|
| 745 | insert tail date-spec[
|
|---|
| 746 | box 10x6 font[align: 'center valign: 'middle]edge[size: 0x0 color: colors/state-dark]feel[
|
|---|
| 747 | over: make function![face act pos][
|
|---|
| 748 | either all[act face/text][
|
|---|
| 749 | face/parent-face/data/day: to integer! face/text
|
|---|
| 750 | set-title face/parent-face form face/parent-face/data
|
|---|
| 751 | select-face face
|
|---|
| 752 | ][deselect-face face]
|
|---|
| 753 | ]
|
|---|
| 754 | engage: make function![face act event][
|
|---|
| 755 | all[
|
|---|
| 756 | act = 'down
|
|---|
| 757 | face/text
|
|---|
| 758 | face/parent-face/data/day: to integer! face/text
|
|---|
| 759 | poke face/parent-face/options 1 face/parent-face/data
|
|---|
| 760 | face/parent-face/action/on-click face/parent-face
|
|---|
| 761 | ]
|
|---|
| 762 | all[
|
|---|
| 763 | find[up alt-up]act
|
|---|
| 764 | face/feel/over face false none
|
|---|
| 765 | ]
|
|---|
| 766 | ]
|
|---|
| 767 | ]
|
|---|
| 768 | ]
|
|---|
| 769 | ]
|
|---|
| 770 | ]
|
|---|
| 771 | face-iterator: make rebface[
|
|---|
| 772 | type: 'face-iterator
|
|---|
| 773 | pane:[]
|
|---|
| 774 | data:[]
|
|---|
| 775 | timeout: now/time/precise
|
|---|
| 776 | feel: make default-feel[
|
|---|
| 777 | redraw: make function![face act pos][
|
|---|
| 778 | if all[act = 'show face/size <> face/old-size][face/resize]
|
|---|
| 779 | ]
|
|---|
| 780 | engage: make function![face act event /local i][
|
|---|
| 781 | if act = 'time[
|
|---|
| 782 | if (now/time/precise - face/timeout) > 0:00:00.2[
|
|---|
| 783 | face/action face
|
|---|
| 784 | face/rate: none
|
|---|
| 785 | show face
|
|---|
| 786 | ]
|
|---|
| 787 | ]
|
|---|
| 788 | if act = 'key[
|
|---|
| 789 | do select[
|
|---|
| 790 | #"^A"[
|
|---|
| 791 | if find face/options 'multi[
|
|---|
| 792 | clear face/picked
|
|---|
| 793 | repeat i face/rows[insert tail face/picked i]
|
|---|
| 794 | face/action face
|
|---|
| 795 | ]
|
|---|
| 796 | ]
|
|---|
| 797 | down[
|
|---|
| 798 | i: 1 + last face/picked
|
|---|
| 799 | if i <= face/rows[
|
|---|
| 800 | i: min face/rows i
|
|---|
| 801 | insert clear face/picked i
|
|---|
| 802 | if find[table text-list]face/parent-face/type[
|
|---|
| 803 | face/timeout: now/time/precise
|
|---|
| 804 | face/rate: 60
|
|---|
| 805 | if i > (face/scroll + face/lines)[
|
|---|
| 806 | face/pane/2/data: 1 / (face/rows - face/lines) * ((min (face/rows - face/lines + 1) (i - face/lines + 1)) - 1)
|
|---|
| 807 | face/scroll: face/scroll + 1
|
|---|
| 808 | ]
|
|---|
| 809 | ]
|
|---|
| 810 | ]
|
|---|
| 811 | ]
|
|---|
| 812 | up[
|
|---|
| 813 | i: -1 + last face/picked
|
|---|
| 814 | if i > 0[
|
|---|
| 815 | i: max 1 i
|
|---|
| 816 | insert clear face/picked i
|
|---|
| 817 | if find[table text-list]face/parent-face/type[
|
|---|
| 818 | face/timeout: now/time/precise
|
|---|
| 819 | face/rate: 60
|
|---|
| 820 | if i = face/scroll[
|
|---|
| 821 | face/pane/2/data: 1 / (face/rows - face/lines) * ((min (face/rows - face/lines + 1) i) - 1)
|
|---|
| 822 | face/scroll: face/scroll - 1
|
|---|
| 823 | ]
|
|---|
| 824 | ]
|
|---|
| 825 | ]
|
|---|
| 826 | ]
|
|---|
| 827 | #"^M"[
|
|---|
| 828 | all[find[table text-list]face/parent-face/type face/action face]
|
|---|
| 829 | ]
|
|---|
| 830 | ]event/key
|
|---|
| 831 | show face
|
|---|
| 832 | ]
|
|---|
| 833 | ]
|
|---|
| 834 | ]
|
|---|
| 835 | lines: none
|
|---|
| 836 | rows: none
|
|---|
| 837 | cols: 1
|
|---|
| 838 | widths: none
|
|---|
| 839 | aligns: none
|
|---|
| 840 | picked:[]
|
|---|
| 841 | scroll: 0
|
|---|
| 842 | resize: make function![][
|
|---|
| 843 | lines: to integer! size/y / sizes/line
|
|---|
| 844 | pane/2/show?: either rows > lines[
|
|---|
| 845 | scroll: max 0 min scroll rows - lines
|
|---|
| 846 | true
|
|---|
| 847 | ][
|
|---|
| 848 | scroll: 0
|
|---|
| 849 | false
|
|---|
| 850 | ]
|
|---|
| 851 | ]
|
|---|
| 852 | redraw: make function![][
|
|---|
| 853 | clear picked
|
|---|
| 854 | rows: either empty? data[0][(length? data) / cols]
|
|---|
| 855 | resize
|
|---|
| 856 | pane/2/ratio: either zero? rows[1][lines / rows]
|
|---|
| 857 | show self
|
|---|
| 858 | ]
|
|---|
| 859 | selected: make function![/local blk][
|
|---|
| 860 | if empty? picked[return none]
|
|---|
| 861 | either any[find options 'multi parent-face/type = 'table][
|
|---|
| 862 | all[rows = length? picked return data]
|
|---|
| 863 | blk: copy[]
|
|---|
| 864 | either cols = 1[
|
|---|
| 865 | foreach row picked[insert tail blk pick data row]
|
|---|
| 866 | ][
|
|---|
| 867 | foreach row picked[
|
|---|
| 868 | repeat col cols[
|
|---|
| 869 | insert tail blk pick data -1 + row * cols + col
|
|---|
| 870 | ]
|
|---|
| 871 | ]
|
|---|
| 872 | ]
|
|---|
| 873 | blk
|
|---|
| 874 | ][
|
|---|
| 875 | blk: pick data first picked
|
|---|
| 876 | ]
|
|---|
| 877 | ]
|
|---|
| 878 | init: make function![/local p][
|
|---|
| 879 | attempt[remove find span #X]
|
|---|
| 880 | attempt[remove find span #Y]
|
|---|
| 881 | lines: to integer! size/y / sizes/line
|
|---|
| 882 | rows: (length? data) / cols
|
|---|
| 883 | clear pane
|
|---|
| 884 | p: self
|
|---|
| 885 | insert pane make subface[
|
|---|
| 886 | size: p/size
|
|---|
| 887 | span: p/span
|
|---|
| 888 | pane: make function![face index /local col-offset clr][
|
|---|
| 889 | either integer? index[
|
|---|
| 890 | if index <= min lines rows[
|
|---|
| 891 | line/offset/y: index - 1 * sizes/line
|
|---|
| 892 | line/size/x: size/x
|
|---|
| 893 | index: index + scroll
|
|---|
| 894 | either p/parent-face/type = 'table[
|
|---|
| 895 | col-offset: 0
|
|---|
| 896 | repeat i p/cols[
|
|---|
| 897 | line/pane/:i/offset/x: col-offset
|
|---|
| 898 | line/pane/:i/size/x: p/widths/:i - sizes/cell
|
|---|
| 899 | all[
|
|---|
| 900 | p/pane/2/show?
|
|---|
| 901 | i = p/cols
|
|---|
| 902 | line/pane/:i/size/x: line/pane/:i/size/x + (p/size/x - p/pane/2/size/x - (line/pane/:i/offset/x + line/pane/:i/size/x))
|
|---|
| 903 | ]
|
|---|
| 904 | line/pane/:i/text: replace/all form pick p/data index - 1 * cols + i "^/" "¶"
|
|---|
| 905 | line/pane/:i/font/color: either find p/options 'no-action[
|
|---|
| 906 | colors/text
|
|---|
| 907 | ][
|
|---|
| 908 | either find picked index[colors/page][colors/text]
|
|---|
| 909 | ]
|
|---|
| 910 | col-offset: col-offset + pick widths i
|
|---|
| 911 | ]
|
|---|
| 912 | ][
|
|---|
| 913 | line/text: replace/all form pick face/parent-face/data index "^/" "¶"
|
|---|
| 914 | line/font/color: either find p/options 'no-action[
|
|---|
| 915 | colors/text
|
|---|
| 916 | ][
|
|---|
| 917 | either find picked index[colors/page][colors/text]
|
|---|
| 918 | ]
|
|---|
| 919 | ]
|
|---|
| 920 | line/color: either find p/options 'no-action[none][if find picked index[colors/theme-light]]
|
|---|
| 921 | if all[
|
|---|
| 922 | line/color = colors/theme-light
|
|---|
| 923 | face/parent-face/type = 'choose
|
|---|
| 924 | ][face/parent-face/auto: pick face/parent-face/data index]
|
|---|
| 925 | line/data: index
|
|---|
| 926 | line
|
|---|
| 927 | ]
|
|---|
| 928 | ][to integer! index/y / sizes/line + 1]
|
|---|
| 929 | ]
|
|---|
| 930 | text: ""
|
|---|
| 931 | line: make rebface[
|
|---|
| 932 | size: as-pair 0 sizes/line
|
|---|
| 933 | font: make default-font[]
|
|---|
| 934 | feel: make default-feel[
|
|---|
| 935 | over: make function![face into pos][
|
|---|
| 936 | if find face/parent-face/parent-face/options 'over[
|
|---|
| 937 | either into[insert clear picked data][clear picked]
|
|---|
| 938 | show face
|
|---|
| 939 | ]
|
|---|
| 940 | ]
|
|---|
| 941 | engage: make function![face act event /local p a b][
|
|---|
| 942 | p: face/parent-face
|
|---|
| 943 | either event/double-click[
|
|---|
| 944 | all[act = 'down p/parent-face/dbl-action p/parent-face]
|
|---|
| 945 | ][
|
|---|
| 946 | if find[up alt-up]act[
|
|---|
| 947 | view*/focal-face: p
|
|---|
| 948 | view*/caret: tail p/text
|
|---|
| 949 | either find p/parent-face/options 'multi[
|
|---|
| 950 | unless any[event/control event/shift][clear picked]
|
|---|
| 951 | either all[event/control find picked data][
|
|---|
| 952 | remove find picked data
|
|---|
| 953 | ][
|
|---|
| 954 | unless find picked data[insert tail picked data]
|
|---|
| 955 | ]
|
|---|
| 956 | if all[event/shift 1 < length? picked][
|
|---|
| 957 | clear next picked
|
|---|
| 958 | repeat i (max data first picked) - (a: min data first picked) + 1[
|
|---|
| 959 | b: i + a - 1
|
|---|
| 960 | all[b <> first picked insert tail picked b]
|
|---|
| 961 | ]
|
|---|
| 962 | ]
|
|---|
| 963 | ][insert clear picked data]
|
|---|
| 964 | show p
|
|---|
| 965 | unless find p/parent-face/options 'no-action[
|
|---|
| 966 | either act = 'up[
|
|---|
| 967 | p/parent-face/action p/parent-face
|
|---|
| 968 | ][
|
|---|
| 969 | p/parent-face/alt-action p/parent-face
|
|---|
| 970 | ]
|
|---|
| 971 | ]
|
|---|
| 972 | ]
|
|---|
| 973 | ]
|
|---|
| 974 | ]
|
|---|
| 975 | ]
|
|---|
| 976 | ]
|
|---|
| 977 | ]
|
|---|
| 978 | if find options 'table[
|
|---|
| 979 | pane/1/line/pane: copy[]
|
|---|
| 980 | repeat i cols[
|
|---|
| 981 | insert tail pane/1/line/pane make subface[
|
|---|
| 982 | size: as-pair 0 sizes/line
|
|---|
| 983 | font: make default-font[align: aligns/:i]
|
|---|
| 984 | ]
|
|---|
| 985 | ]
|
|---|
| 986 | ]
|
|---|
| 987 | insert tail pane make slider[
|
|---|
| 988 | tip: none
|
|---|
| 989 | offset: as-pair p/size/x - sizes/slider 0
|
|---|
| 990 | size: as-pair sizes/slider p/size/y
|
|---|
| 991 | span: case[
|
|---|
| 992 | none? p/span[none]
|
|---|
| 993 | all[find p/span #H find p/span #W][#XH]
|
|---|
| 994 | find p/span #H[#H]
|
|---|
| 995 | find p/span #W[#X]
|
|---|
| 996 | ]
|
|---|
| 997 | options:[arrows]
|
|---|
| 998 | show?: either rows > lines[true][false]
|
|---|
| 999 | action: make default-action[
|
|---|
| 1000 | on-click: make function![face][
|
|---|
| 1001 | scroll: to integer! rows - lines * data
|
|---|
| 1002 | show face/parent-face
|
|---|
| 1003 | ]
|
|---|
| 1004 | ]
|
|---|
| 1005 | ratio: either rows > 0[lines / rows][1]
|
|---|
| 1006 | ]
|
|---|
| 1007 | pane/2/init
|
|---|
| 1008 | ]
|
|---|
| 1009 | ]
|
|---|
| 1010 | choose: make function![
|
|---|
| 1011 | parent[object!]"Widget to appear in relation to"
|
|---|
| 1012 | width[integer!]"Width in pixels"
|
|---|
| 1013 | xy[pair!]"Offset of choice box"
|
|---|
| 1014 | items[block!]"Block of items to display"
|
|---|
| 1015 | /local popup result
|
|---|
| 1016 | ][
|
|---|
| 1017 | result: none
|
|---|
| 1018 | popup: make face-iterator[
|
|---|
| 1019 | type: 'choose
|
|---|
| 1020 | offset: xy
|
|---|
| 1021 | size: as-pair width sizes/line * min length? items to-integer parent/parent-face/size/y - xy/y / sizes/line
|
|---|
| 1022 | color: colors/page
|
|---|
| 1023 | data: items
|
|---|
| 1024 | edge: outline-edge
|
|---|
| 1025 | feel: system/words/face/feel
|
|---|
| 1026 | options:[over]
|
|---|
| 1027 | action: make function![face][result: pick data first picked hide-popup]
|
|---|
| 1028 | alt-action: none
|
|---|
| 1029 | dbl-action: none
|
|---|
| 1030 | auto: none
|
|---|
| 1031 | ]
|
|---|
| 1032 | popup/init
|
|---|
| 1033 | show-popup/window/away popup parent/parent-face
|
|---|
| 1034 | do-events
|
|---|
| 1035 | either parent/type = 'edit-list[popup/auto][result]
|
|---|
| 1036 | ]
|
|---|
| 1037 | anim: make rebface[
|
|---|
| 1038 | tip:{USAGE:
|
|---|
| 1039 | anim data[%images/go-previous.png %images/go-next.png]
|
|---|
| 1040 | anim data[img1 img2 img3]rate 2
|
|---|
| 1041 | DESCRIPTION:
|
|---|
| 1042 | Cycles a set of images at a specified rate.}
|
|---|
| 1043 | size: -1x-1
|
|---|
| 1044 | effect: 'fit
|
|---|
| 1045 | feel: make default-feel[
|
|---|
| 1046 | engage: make function![face act event][
|
|---|
| 1047 | all[
|
|---|
| 1048 | act = 'time
|
|---|
| 1049 | face/image: first face/data
|
|---|
| 1050 | face/data: either tail? next face/data[head face/data][next face/data]
|
|---|
| 1051 | show face
|
|---|
| 1052 | ]
|
|---|
| 1053 | ]
|
|---|
| 1054 | ]
|
|---|
| 1055 | rate: 1
|
|---|
| 1056 | init: make function![][
|
|---|
| 1057 | repeat i length? data: reduce data[
|
|---|
| 1058 | all[file? pick data i poke data i load pick data i]
|
|---|
| 1059 | ]
|
|---|
| 1060 | image: first data
|
|---|
| 1061 | data: next data
|
|---|
| 1062 | all[negative? size/x size/x: image/size/x]
|
|---|
| 1063 | all[negative? size/y size/y: image/size/y]
|
|---|
| 1064 | ]
|
|---|
| 1065 | ]
|
|---|
| 1066 | pill: make rebface[
|
|---|
| 1067 | tip:{USAGE:
|
|---|
| 1068 | pill red
|
|---|
| 1069 | DESCRIPTION:
|
|---|
| 1070 | A rectangular area with rounded corners.}
|
|---|
| 1071 | size: 10x10
|
|---|
| 1072 | effect:[draw[pen none line-width sizes/edge fill-pen linear 0x0 0 0 90 1 1 none none none box 0x0 0x0 effects/radius]]
|
|---|
| 1073 | pen: none
|
|---|
| 1074 | fill: make function![][effect/draw/fill-pen]
|
|---|
| 1075 | feel: make default-feel[
|
|---|
| 1076 | redraw: make function![face act pos][
|
|---|
| 1077 | if act = 'show[
|
|---|
| 1078 | all[
|
|---|
| 1079 | face/color
|
|---|
| 1080 | poke face/effect/draw 13 face/color + 0.0.0.64
|
|---|
| 1081 | poke face/effect/draw 14 face/color + 0.0.0.32
|
|---|
| 1082 | poke face/effect/draw 15 face/color
|
|---|
| 1083 | face/color: none
|
|---|
| 1084 | ]
|
|---|
| 1085 | ]
|
|---|
| 1086 | ]
|
|---|
| 1087 | ]
|
|---|
| 1088 | action: make default-action[
|
|---|
| 1089 | on-resize: make function![face][
|
|---|
| 1090 | poke face/effect/draw 8 to integer! face/size/y * 0.25
|
|---|
| 1091 | poke face/effect/draw 9 to integer! face/size/y * 0.75
|
|---|
| 1092 | poke face/effect/draw 18 face/size - 1x1
|
|---|
| 1093 | poke face/effect/draw 19 either all[face/size/x > sizes/line face/size/y > sizes/line][effects/radius * 2][effects/radius]
|
|---|
| 1094 | ]
|
|---|
| 1095 | ]
|
|---|
| 1096 | init: make function![][
|
|---|
| 1097 | action/on-resize self
|
|---|
| 1098 | ]
|
|---|
| 1099 | ]
|
|---|
| 1100 | area: make rebface[
|
|---|
| 1101 | tip:{USAGE:
|
|---|
| 1102 | area
|
|---|
| 1103 | area "Text" -1
|
|---|
| 1104 | area "Text" 50x-1
|
|---|
| 1105 | DESCRIPTION:
|
|---|
| 1106 | Editable text area with wrapping and scroller.
|
|---|
| 1107 | OPTIONS:
|
|---|
| 1108 | 'info specifies read-only}
|
|---|
| 1109 | size: 50x25
|
|---|
| 1110 | text: ""
|
|---|
| 1111 | color: colors/page
|
|---|
| 1112 | edge: theme-edge
|
|---|
| 1113 | font: default-font-top
|
|---|
| 1114 | para: make default-para-wrap[margin: as-pair sizes/slider + 2 2]
|
|---|
| 1115 | feel: make edit/feel[
|
|---|
| 1116 | redraw: func[face act pos /local height total visible][
|
|---|
| 1117 | if act = 'show[
|
|---|
| 1118 | if face/size <> face/old-size[
|
|---|
| 1119 | face/pane/offset/x: max 0 face/size/x - face/pane/size/x
|
|---|
| 1120 | face/pane/size/y: face/size/y
|
|---|
| 1121 | ]
|
|---|
| 1122 | if any[
|
|---|
| 1123 | face/text-y <> height: second size-text face
|
|---|
| 1124 | face/size <> face/old-size
|
|---|
| 1125 | ][
|
|---|
| 1126 | face/text-y: height
|
|---|
| 1127 | total: face/text-y
|
|---|
| 1128 | visible: face/size/y - (edge/size/y * 2) - para/origin/y - para/indent/y
|
|---|
| 1129 | face/pane/ratio: either total > 0[min 1 (visible / total)][1]
|
|---|
| 1130 | face/pane/step: either visible < total[min 1 (sizes/font-height / (total - visible))][0]
|
|---|
| 1131 | ]
|
|---|
| 1132 | if all[face/pane/ratio < 1 face/key-scroll?][
|
|---|
| 1133 | do bind[
|
|---|
| 1134 | total: text-y
|
|---|
| 1135 | visible: size/y - (edge/size/y * 2) - para/origin/y - para/indent/y
|
|---|
| 1136 | pane/data: - para/scroll/y / (total - visible)
|
|---|
| 1137 | ]face
|
|---|
| 1138 | face/key-scroll?: false
|
|---|
| 1139 | ]
|
|---|
| 1140 | ]
|
|---|
| 1141 | ]
|
|---|
| 1142 | ]
|
|---|
| 1143 | esc: none
|
|---|
| 1144 | caret: none
|
|---|
| 1145 | undo: copy[]
|
|---|
| 1146 | text-y: none
|
|---|
| 1147 | key-scroll?: false
|
|---|
| 1148 | action: make default-action[
|
|---|
| 1149 | on-scroll: make function![face scroll /page /local total visible][
|
|---|
| 1150 | total: second size-text face
|
|---|
| 1151 | visible: face/size/y - (face/edge/size/y * 2) - face/para/origin/y - face/para/indent/y
|
|---|
| 1152 | face/para/scroll/y: either page[
|
|---|
| 1153 | min max face/para/scroll/y - (visible * sign? scroll/y) (visible - total) 0
|
|---|
| 1154 | ][
|
|---|
| 1155 | min max face/para/scroll/y - (scroll/y * sizes/font-height) (visible - total) 0
|
|---|
| 1156 | ]
|
|---|
| 1157 | all[face/pane/data: - face/para/scroll/y / (total - visible)]
|
|---|
| 1158 | show face
|
|---|
| 1159 | ]
|
|---|
| 1160 | ]
|
|---|
| 1161 | rebind: make function![][
|
|---|
| 1162 | color: colors/page
|
|---|
| 1163 | para/margin/x: sizes/slider + 2
|
|---|
| 1164 | ]
|
|---|
| 1165 | init: make function![/local p][
|
|---|
| 1166 | if find options 'info[
|
|---|
| 1167 | feel: make feel[engage: none]
|
|---|
| 1168 | all[color = colors/page color: colors/outline-light]
|
|---|
| 1169 | ]
|
|---|
| 1170 | para: make para[]
|
|---|
| 1171 | p: self
|
|---|
| 1172 | text-y: second size-text self
|
|---|
| 1173 | all[negative? size/x size/x: 10000 size/x: 4 + first size-text self]
|
|---|
| 1174 | all[negative? size/y size/y: 10000 size/y: 8 + text-y]
|
|---|
| 1175 | pane: make slider[
|
|---|
| 1176 | tip: none
|
|---|
| 1177 | offset: as-pair p/size/x - sizes/slider 0
|
|---|
| 1178 | size: as-pair sizes/slider p/size/y
|
|---|
| 1179 | span: case[
|
|---|
| 1180 | none? p/span[none]
|
|---|
| 1181 | all[find p/span #H find p/span #W][#XH]
|
|---|
| 1182 | find p/span #W[#X]
|
|---|
| 1183 | find p/span #H[#H]
|
|---|
| 1184 | true[none]
|
|---|
| 1185 | ]
|
|---|
| 1186 | options:[arrows]
|
|---|
| 1187 | action: make default-action[
|
|---|
| 1188 | on-click: make function![face /local visible][
|
|---|
| 1189 | unless parent-face/key-scroll?[
|
|---|
| 1190 | visible: (parent-face/size/y - (parent-face/edge/size/y * 2) - parent-face/para/origin/y - parent-face/para/indent/y)
|
|---|
| 1191 | parent-face/para/scroll/y: negate parent-face/text-y - visible * data
|
|---|
| 1192 | if all[
|
|---|
| 1193 | view*/caret
|
|---|
| 1194 | parent-face = view*/focal-face
|
|---|
| 1195 | ][
|
|---|
| 1196 | ]
|
|---|
| 1197 | show parent-face
|
|---|
| 1198 | ]
|
|---|
| 1199 | parent-face/key-scroll?: false
|
|---|
| 1200 | ]
|
|---|
| 1201 | ]
|
|---|
| 1202 | ratio: p/size/y - 4 / text-y
|
|---|
| 1203 | ]
|
|---|
| 1204 | pane/init
|
|---|
| 1205 | ]
|
|---|
| 1206 | ]
|
|---|
| 1207 | arrow: make rebface[
|
|---|
| 1208 | tip:{USAGE:
|
|---|
| 1209 | arrow
|
|---|
| 1210 | arrow 10
|
|---|
| 1211 | arrow data 'up
|
|---|
| 1212 | arrow data 'down
|
|---|
| 1213 | arrow data 'left
|
|---|
| 1214 | arrow data 'right
|
|---|
| 1215 | DESCRIPTION:
|
|---|
| 1216 | An arrow (default down) on a square button face with height set to width.}
|
|---|
| 1217 | size: 5x-1
|
|---|
| 1218 | data: 'down
|
|---|
| 1219 | feel: make default-feel[
|
|---|
| 1220 | redraw: make function![face act pos][
|
|---|
| 1221 | all[act = 'show face/color: either face/data[colors/state-light][colors/theme-light]]
|
|---|
| 1222 | ]
|
|---|
| 1223 | engage: make function![face act event][
|
|---|
| 1224 | do select[
|
|---|
| 1225 | time[all[face/data face/action/on-click face]]
|
|---|
| 1226 | down[face/data: on]
|
|---|
| 1227 | up[face/data: off face/action/on-click face]
|
|---|
| 1228 | over[face/data: on]
|
|---|
| 1229 | away[face/data: off]
|
|---|
| 1230 | ]act
|
|---|
| 1231 | show face
|
|---|
| 1232 | ]
|
|---|
| 1233 | ]
|
|---|
| 1234 | effect: reduce['arrow colors/page 'rotate 0]
|
|---|
| 1235 | rebind: make function![][effect/arrow: colors/page]
|
|---|
| 1236 | init: make function![][
|
|---|
| 1237 | all[negative? size/y size/y: size/x]
|
|---|
| 1238 | effect/rotate: select[up 0 right 90 down 180 left 270]data
|
|---|
| 1239 | data: off
|
|---|
| 1240 | ]
|
|---|
| 1241 | ]
|
|---|
| 1242 | bar: make rebface[
|
|---|
| 1243 | tip:{USAGE:
|
|---|
| 1244 | bar 100
|
|---|
| 1245 | DESCRIPTION:
|
|---|
| 1246 | A thin 3D bar used to separate widgets.
|
|---|
| 1247 | Defaults to maximum display width.}
|
|---|
| 1248 | size: -1x1
|
|---|
| 1249 | color: colors/outline-light
|
|---|
| 1250 | edge: make outline-edge[effect: 'bevel]
|
|---|
| 1251 | rebind: make function![][color: edge/color: colors/outline-light]
|
|---|
| 1252 | ]
|
|---|
| 1253 | box: make rebface[
|
|---|
| 1254 | tip:{USAGE:
|
|---|
| 1255 | box red
|
|---|
| 1256 | DESCRIPTION:
|
|---|
| 1257 | The most basic of widgets, a rectangular area.}
|
|---|
| 1258 | size: 25x25
|
|---|
| 1259 | ]
|
|---|
| 1260 | button: make pill[
|
|---|
| 1261 | tip:{USAGE:
|
|---|
| 1262 | button "Hello"
|
|---|
| 1263 | button -1 "Go!"
|
|---|
| 1264 | button "Click me!"[print "click"]
|
|---|
| 1265 | DESCRIPTION:
|
|---|
| 1266 | Performs action when clicked.
|
|---|
| 1267 | OPTIONS:
|
|---|
| 1268 | 'info specifies read-only}
|
|---|
| 1269 | size: 15x5
|
|---|
| 1270 | text: ""
|
|---|
| 1271 | color: colors/theme-dark
|
|---|
| 1272 | data: color
|
|---|
| 1273 | font: default-font-heading
|
|---|
| 1274 | feel: make feel[
|
|---|
| 1275 | over: make function![face act pos][
|
|---|
| 1276 | set-color face either all[act not find face/options 'info][colors/theme-light][face/data]
|
|---|
| 1277 | ]
|
|---|
| 1278 | engage: make function![face act event /local f][
|
|---|
| 1279 | unless find face/options 'info[
|
|---|
| 1280 | do select[
|
|---|
| 1281 | down[set-color face colors/state-light]
|
|---|
| 1282 | alt-down[set-color face colors/state-light]
|
|---|
| 1283 | up[set-color face colors/theme-dark face/action/on-click face]
|
|---|
| 1284 | alt-up[set-color face colors/theme-dark face/action/on-alt-click face]
|
|---|
| 1285 | away[set-color face face/data]
|
|---|
| 1286 | ]act
|
|---|
| 1287 | ]
|
|---|
| 1288 | ]
|
|---|
| 1289 | ]
|
|---|
| 1290 | rebind: make function![][
|
|---|
| 1291 | color: colors/theme-dark
|
|---|
| 1292 | ]
|
|---|
| 1293 | init: make function![][
|
|---|
| 1294 | all[negative? size/x size/x: 10000 size/x: 8 + first size-text self]
|
|---|
| 1295 | all[find options 'info color = colors/theme-dark color: colors/outline-light]
|
|---|
| 1296 | data: color
|
|---|
| 1297 | action/on-resize self
|
|---|
| 1298 | ]
|
|---|
| 1299 | ]
|
|---|
| 1300 | calendar: make rebface[
|
|---|
| 1301 | tip:{USAGE:
|
|---|
| 1302 | calendar
|
|---|
| 1303 | calendar data 1-Jan-2000
|
|---|
| 1304 | DESCRIPTION:
|
|---|
| 1305 | Used to select a date, with face/data set to current selection.
|
|---|
| 1306 | Default selection is now/date.}
|
|---|
| 1307 | size: 70x48
|
|---|
| 1308 | feel: make default-feel[
|
|---|
| 1309 | redraw: make function![face act pos /local date month][
|
|---|
| 1310 | if act = 'show[
|
|---|
| 1311 | date: face/data
|
|---|
| 1312 | month: date/month
|
|---|
| 1313 | date/day: 1
|
|---|
| 1314 | date: date - date/weekday + 1
|
|---|
| 1315 | foreach sub-face skip face/pane 13[
|
|---|
| 1316 | sub-face/edge/size: 0x0
|
|---|
| 1317 | sub-face/text: either date/month = month[
|
|---|
| 1318 | all[date = first face/options sub-face/edge/size: 2x2]
|
|---|
| 1319 | form date/day
|
|---|
| 1320 | ][none]
|
|---|
| 1321 | date: date + 1
|
|---|
| 1322 | ]
|
|---|
| 1323 | face/pane/3/text: reform[pick locale*/months face/data/month face/data/year]
|
|---|
| 1324 | ]
|
|---|
| 1325 | ]
|
|---|
| 1326 | ]
|
|---|
| 1327 | init: make function![][
|
|---|
| 1328 | insert options any[data now/date]
|
|---|
| 1329 | data: layout/only date-spec
|
|---|
| 1330 | pane: data/pane
|
|---|
| 1331 | size: data/size
|
|---|
| 1332 | data: first options
|
|---|
| 1333 | ]
|
|---|
| 1334 | ]
|
|---|
| 1335 | chat: make rebface[
|
|---|
| 1336 | tip:{USAGE:
|
|---|
| 1337 | chat 120 data["Bob" blue "My comment." yello 14-Apr-2007/10:58]
|
|---|
| 1338 | DESCRIPTION:
|
|---|
| 1339 | Three column chat display as found in IM apps such as AltME.
|
|---|
| 1340 | Messages are appended, with those exceeding 'limit not shown.
|
|---|
| 1341 | OPTIONS:
|
|---|
| 1342 | [limit n]where n specifies number of messages to show (default 100)
|
|---|
| 1343 | [id n]where n specifies id column width (default 10)
|
|---|
| 1344 | [user n]where n specifies user column width (default 15)
|
|---|
| 1345 | [date n]where n specifies date column width (default 25)}
|
|---|
| 1346 | size: 200x100
|
|---|
| 1347 | pane:[]
|
|---|
| 1348 | data:[]
|
|---|
| 1349 | edge: outline-edge
|
|---|
| 1350 | action: make default-action[
|
|---|
| 1351 | on-resize: make function![face][
|
|---|
| 1352 | poke face/pane/2/para/tabs 3 face/pane/1/size/x - (sizes/cell * any[select face/options 'date 25])
|
|---|
| 1353 | face/redraw/no-show
|
|---|
| 1354 | ]
|
|---|
| 1355 | ]
|
|---|
| 1356 | height: 0
|
|---|
| 1357 | rows: 0
|
|---|
| 1358 | limit: none
|
|---|
| 1359 | append-message: make function![
|
|---|
| 1360 | user[string!]
|
|---|
| 1361 | user-color[tuple! word! none!]
|
|---|
| 1362 | msg[string!]
|
|---|
| 1363 | msg-color[tuple! word! none!]
|
|---|
| 1364 | date[date!]
|
|---|
| 1365 | /no-show row
|
|---|
| 1366 | /local p y t1 t2 t3
|
|---|
| 1367 | ][
|
|---|
| 1368 | t1: pick pane/2/para/tabs 1
|
|---|
| 1369 | t2: pick pane/2/para/tabs 2
|
|---|
| 1370 | t3: pick pane/2/para/tabs 3
|
|---|
| 1371 | y: max sizes/line 4 + second size-text make subface[
|
|---|
| 1372 | size: as-pair t3 - t2 10000
|
|---|
| 1373 | text: msg
|
|---|
| 1374 | font: default-font
|
|---|
| 1375 | para: default-para-wrap
|
|---|
| 1376 | ]
|
|---|
| 1377 | p: self
|
|---|
| 1378 | insert tail pane/1/pane reduce[
|
|---|
| 1379 | make subface[
|
|---|
| 1380 | offset: as-pair 0 height
|
|---|
| 1381 | size: as-pair t1 y
|
|---|
| 1382 | text: form any[row rows: rows + 1]
|
|---|
| 1383 | color: colors/theme-dark
|
|---|
| 1384 | edge: make outline-edge[size: 0x1]
|
|---|
| 1385 | font: default-font-heading
|
|---|
| 1386 | ]
|
|---|
| 1387 | make subface[
|
|---|
| 1388 | offset: as-pair t1 height
|
|---|
| 1389 | size: as-pair t2 - t1 y
|
|---|
| 1390 | text: user
|
|---|
| 1391 | edge: make outline-edge[size: 0x1]
|
|---|
| 1392 | font: make default-font-top[color: either word? user-color[get user-color][user-color]style: 'bold]
|
|---|
| 1393 | ]
|
|---|
| 1394 | make subface[
|
|---|
| 1395 | offset: as-pair t2 height
|
|---|
| 1396 | size: as-pair t3 - t2 y
|
|---|
| 1397 | span: all[p/span find p/span #W #W]
|
|---|
| 1398 | text: form msg
|
|---|
| 1399 | color: either word? msg-color[get msg-color][msg-color]
|
|---|
| 1400 | edge: make outline-edge[size: 0x1]
|
|---|
| 1401 | font: default-font
|
|---|
| 1402 | para: default-para-wrap
|
|---|
| 1403 | ]
|
|---|
| 1404 | make subface[
|
|---|
| 1405 | offset: as-pair t3 height
|
|---|
| 1406 | size: as-pair p/size/x - t3 - sizes/slider y
|
|---|
| 1407 | span: all[p/span find p/span #W #X]
|
|---|
| 1408 | text: form either now/date = date/date[date/time][date/date]
|
|---|
| 1409 | edge: make outline-edge[size: 0x1]
|
|---|
| 1410 | font: default-font-top
|
|---|
| 1411 | ]
|
|---|
| 1412 | ]
|
|---|
| 1413 | height: height + y - 1
|
|---|
| 1414 | if ((length? pane/1/pane) / 4) > limit[
|
|---|
| 1415 | y: pane/1/pane/1/size/y - 1
|
|---|
| 1416 | remove/part pane/1/pane 4
|
|---|
| 1417 | foreach[i u m d]pane/1/pane[
|
|---|
| 1418 | i/offset/y: u/offset/y: m/offset/y: d/offset/y: i/offset/y - y
|
|---|
| 1419 | ]
|
|---|
| 1420 | height: height - y
|
|---|
| 1421 | ]
|
|---|
| 1422 | unless no-show[
|
|---|
| 1423 | insert tail data reduce[user user-color msg msg-color date]
|
|---|
| 1424 | pane/1/size/y: height
|
|---|
| 1425 | pane/3/ratio: pane/3/size/y / height
|
|---|
| 1426 | show p
|
|---|
| 1427 | ]
|
|---|
| 1428 | show pane/1
|
|---|
| 1429 | ]
|
|---|
| 1430 | set-user-color: make function![id[integer!]color[tuple! word! none!]/local idx][
|
|---|
| 1431 | if any[zero? id id > rows][exit]
|
|---|
| 1432 | poke data id * 5 - 3 color
|
|---|
| 1433 | if limit > (rows - id)[
|
|---|
| 1434 | idx: either rows > limit[(id + limit - rows) * 4 - 2][id * 4 - 2]
|
|---|
| 1435 | pane/1/pane/:idx/font/color: either word? color[get color][color]
|
|---|
| 1436 | show pane/1/pane/:idx
|
|---|
| 1437 | ]
|
|---|
| 1438 | ]
|
|---|
| 1439 | set-message-text: make function![id[integer!]string[string!]/local idx][
|
|---|
| 1440 | if any[zero? id id > rows][exit]
|
|---|
| 1441 | poke data id * 5 - 2 string
|
|---|
| 1442 | if limit > (rows - id)[
|
|---|
| 1443 | idx: either rows > limit[(id + limit - rows) * 4 - 1][id * 4 - 1]
|
|---|
| 1444 | insert clear pane/1/pane/:idx/text string
|
|---|
| 1445 | redraw
|
|---|
| 1446 | ]
|
|---|
| 1447 | ]
|
|---|
| 1448 | set-message-color: make function![id[integer!]color[tuple! word! none!]/local idx][
|
|---|
| 1449 | if any[zero? id id > rows][exit]
|
|---|
| 1450 | poke data id * 5 - 1 color
|
|---|
| 1451 | if limit > (rows - id)[
|
|---|
| 1452 | idx: either rows > limit[(id + limit - rows) * 4 - 1][id * 4 - 1]
|
|---|
| 1453 | pane/1/pane/:idx/color: either word? color[get color][color]
|
|---|
| 1454 | show pane/1/pane/:idx
|
|---|
| 1455 | ]
|
|---|
| 1456 | ]
|
|---|
| 1457 | redraw: make function![/no-show /local row][
|
|---|
| 1458 | clear pane/1/pane
|
|---|
| 1459 | height: 0
|
|---|
| 1460 | rows: (length? data) / 5
|
|---|
| 1461 | row: max 0 rows - limit: any[select options 'limit 100]
|
|---|
| 1462 | foreach[user user-color msg msg-color date]skip data row * 5[
|
|---|
| 1463 | append-message/no-show user user-color msg msg-color date row: row + 1
|
|---|
| 1464 | ]
|
|---|
| 1465 | pane/1/size/y: height
|
|---|
| 1466 | pane/3/ratio: either zero? height[1][pane/3/size/y / height]
|
|---|
|
|---|