|
41 | 41 | %margin-right %margin-bottom %draw %attrs |
42 | 42 | %event-mouse-button %last-common-attr %event-key |
43 | 43 | %event-motion %event-motion-out %event-active |
44 | | - %event-deactive) |
| 44 | + %event-deactive %event-button-down %event-button-up) |
45 | 45 | (import (scheme) (gui graphic) (gui stb) (gui utils)) |
46 | 46 | (define %draw 5) |
47 | 47 | (define %x 0) |
|
68 | 68 | (define %attrs 22) |
69 | 69 | (define %events 23) |
70 | 70 | (define %visible 24) |
71 | | - (define %last-common-attr 25) |
72 | | - (define %status-active 1) |
| 71 | + (define %focus 25) |
| 72 | + (define %focusable 26) |
| 73 | + (define %last-common-attr 27) |
73 | 74 | (define %status-default 0) |
| 75 | + (define %status-active 1) |
74 | 76 | (define %status-hover 2) |
75 | 77 | (define %status-focus 4) |
| 78 | + (define %status-drag 8) |
| 79 | + (define %status-resize 16) |
76 | 80 | (define window-width 0) |
77 | 81 | (define window-height 0) |
78 | 82 | (define %event-scroll 4) |
|
83 | 87 | (define %event-resize 6) |
84 | 88 | (define %event-layout 7) |
85 | 89 | (define %event-motion-out 8) |
| 90 | + (define %event-motion-in 9) |
| 91 | + (define %event-focus-in 10) |
| 92 | + (define %event-focus-out 11) |
86 | 93 | (define %event-active 9) |
87 | 94 | (define %event-deactive 10) |
| 95 | + (define %event-button-down 1) |
| 96 | + (define %event-button-up 0) |
88 | 97 | (define cursor-x 0) |
89 | 98 | (define cursor-y 0) |
90 | 99 | (define cursor-arrow 0) |
|
297 | 306 | (= 0 (bitwise-xor (bitwise-and status flag) flag))) |
298 | 307 | (define (widget-set-status widget status) |
299 | 308 | (let ([s (widget-get-attr widget %status)]) |
300 | | - (widget-set-attr widget %status (bitwise-ior s status)))) |
| 309 | + (widget-set-attr widget %status (set-status s status)))) |
| 310 | + (define (widget-clear-status widget status) |
| 311 | + (let ([s (widget-get-attr widget %status)]) |
| 312 | + (widget-set-attr widget %status (clear-status s status)))) |
301 | 313 | (define (widget-set-child-status widget status) |
302 | 314 | (let loop ([child (vector-ref widget %child)]) |
303 | 315 | (if (pair? child) |
|
312 | 324 | (widget-clear-status (car child) status) |
313 | 325 | (widget-clear-child-status (car child) status) |
314 | 326 | (loop (cdr child)))))) |
315 | | - (define (widget-clear-status widget status) |
316 | | - (let ([s (widget-get-attr widget %status)]) |
317 | | - (widget-set-attr |
318 | | - widget |
319 | | - %status |
320 | | - (bitwise-and s (bitwise-not status))))) |
321 | 327 | (define (widget-status-is-set widget status) |
322 | 328 | (let ([s (widget-get-attr widget %status)]) |
323 | 329 | (= 0 (bitwise-xor (bitwise-and s status) status)))) |
|
327 | 333 | (let loop ([child (vector-ref widget %child)]) |
328 | 334 | (if (pair? child) |
329 | 335 | (begin |
330 | | - (if (or (widget-status-is-set (car child) %status-active) |
331 | | - (widget-status-is-set (car child) %status-focus)) |
| 336 | + (if (or (widget-status-is-set (car child) %status-focus)) |
332 | 337 | (begin |
333 | 338 | ((vector-ref (car child) %event) |
334 | 339 | (car child) |
|
471 | 476 | (define (widget-new x y w h text) |
472 | 477 | (let ([offset (vector 0 0)] |
473 | 478 | [active 0] |
474 | | - [resize-status 0] |
475 | 479 | [resize-pos (vector 0 0)] |
476 | 480 | [nw '()]) |
477 | 481 | (set! nw |
|
490 | 494 | [yy (vector-ref widget %y)] |
491 | 495 | [ww (vector-ref widget %w)] |
492 | 496 | [hh (vector-ref widget %h)]) |
493 | | - (if (in-rect (+ xx ww -20.0) (+ yy hh -20.0) (+ xx ww) |
494 | | - (+ yy hh) (vector-ref data 3) (vector-ref data 4)) |
495 | | - (begin (set! resize-status (vector-ref data 1)))) |
496 | | - (if (and (= (vector-ref data 1) 0) (= resize-status 1)) |
497 | | - (set! resize-status 0)) |
498 | | - (set! active (vector-ref data 1)) |
499 | | - (widget-set-attrs widget '%drag 1))) |
500 | | - (if (and (= type %event-mouse-button) |
501 | | - (= (vector-ref data 1) 1)) |
502 | | - (let ([mx (vector-ref data 3)] [my (vector-ref data 4)]) |
503 | | - (set! resize-pos (vector mx my)) |
504 | | - (set! offset |
505 | | - (vector |
506 | | - (- (vector-ref widget %x) mx) |
507 | | - (- (vector-ref widget %y) my))) |
508 | | - (widget-child-rect-event-mouse-button widget type data) |
509 | | - (if (not (widget-get-attr widget %visible)) |
510 | | - (begin (widget-set-attrs widget '%drag 0))))) |
| 497 | + (if (= (vector-ref data 1) %event-button-down) |
| 498 | + (let ([mx (vector-ref data 3)] |
| 499 | + [my (vector-ref data 4)]) |
| 500 | + (if (in-rect xx yy ww (widget-get-attr widget %top) |
| 501 | + mx my) |
| 502 | + (widget-set-status widget %status-drag)) |
| 503 | + (if (or (in-rect (+ xx ww -20.0) (+ yy) 20.0 hh mx |
| 504 | + my) |
| 505 | + (in-rect (+ xx) (+ yy hh -20.0) ww 20.0 mx |
| 506 | + my)) |
| 507 | + (begin |
| 508 | + (widget-set-status widget %status-resize))) |
| 509 | + (set! resize-pos (vector mx my)) |
| 510 | + (set! offset |
| 511 | + (vector |
| 512 | + (- (vector-ref widget %x) mx) |
| 513 | + (- (vector-ref widget %y) my))) |
| 514 | + (widget-child-rect-event-mouse-button |
| 515 | + widget |
| 516 | + type |
| 517 | + data) |
| 518 | + (if (not (widget-get-attr widget %visible)) |
| 519 | + (begin |
| 520 | + (widget-clear-status widget %status-drag))))) |
| 521 | + (if (= (vector-ref data 1) %event-button-up) |
| 522 | + (begin |
| 523 | + (widget-clear-status widget %status-drag) |
| 524 | + (widget-clear-status widget %status-resize))))) |
511 | 525 | (if (= type %event-motion) |
512 | 526 | (begin |
513 | | - (if (and (= active %status-active) |
514 | | - (= (widget-get-attrs widget '%drag) 1)) |
| 527 | + (if (or (widget-status-is-set widget %status-resize) |
| 528 | + (widget-status-is-set widget %status-drag)) |
515 | 529 | (let () |
516 | | - (if (= 1 resize-status) |
| 530 | + (if (widget-status-is-set widget %status-resize) |
517 | 531 | (let ([mx (vector-ref data 0)] |
518 | 532 | [my (vector-ref data 1)] |
519 | 533 | [w (vector-ref widget %w)] |
|
544 | 558 | (widget-status-is-set widget %status-active)) |
545 | 559 | (begin (widget-child-key-event widget type data)))) |
546 | 560 | (list) 0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 '() 0.0 0.0 text |
547 | | - '() (make-hashtable equal-hash equal?) |
548 | | - (make-hashtable equal-hash equal?) #t '() '() '() '() '() |
| 561 | + 'widget (make-hashtable equal-hash equal?) |
| 562 | + (make-hashtable equal-hash equal?) #t '() #f '() '() '() '() |
549 | 563 | '() '() '() '())) |
550 | 564 | (widget-set-attrs nw '%w w) |
551 | 565 | (widget-set-attrs nw '%h h) |
|
678 | 692 | (if (>= len 0) |
679 | 693 | (let ([w (list-ref $widgets len)]) |
680 | 694 | (if (and (widget-get-attr w %visible) |
681 | | - (or (equal? |
682 | | - %status-active |
683 | | - (widget-get-attrs w '%drag)) |
| 695 | + (or (widget-status-is-set w %status-drag) |
| 696 | + (widget-status-is-set w %status-resize) |
684 | 697 | (is-in-widget w cursor-x cursor-y))) |
685 | 698 | (let ([event (vector-ref w %event)]) |
686 | 699 | (event w '() type data) |
|
0 commit comments