;; SUI
;; 6.891 Spring 2006
;;
;; Example SUI uses
;;
;; $Id: examples.scm 17 2006-04-27 00:31:03Z zev $

;; button and text box where button reverses text

(define reverser-win
  (make-frame
   'frame "Text reverser"
   (make-row-layout
    'layout
    (make-text-area 'text "")
    (make-button
     'button "click me"
     (lambda (dictionary)
       (let ((text-area (dictionary-lookup 'text)))
	 (set-text text-area
		   (reverse-text (get-text text-area)))))))))

(define reverser-win
  (make-frame
   'frame "Text reverser"
   (make-row-layout
    'layout
    (make-text-area 'text "")
    (make-button
     'button "click me"
     (function (which-button)
       (set-text 'text
		 (reverse-text (get-text 'text))))))))

(define reverser-win
  (frame
   'frame "Text reverser"
   (row-layout
    'layout
    (text-area 'text "")
    (button
     'button "click me"
     (function (which-button)
       (set-text 'text
		 (reverse-text (get-text 'text))))))))

(define-gui reverser-win
  (frame
   ((name 'frame)
    (title "Text reverser")
    (contents (row-layout
	       ((name 'layout)
		(contents (text-area
			   ((name 'text)
			    (label "")))
			  (button
			   ((name 'button)
			    (label "click me")
			    (onclick (which-button)
			     (set-text 'text
				       (reverse-text (get-text 'text)))))))))))))

;; now you can also right click on the text box to reverse text

(define-gui reverser-win
  (frame
   'frame "Text reverser"
   (row-layout
    'layout
    (text-area 'text ""
	       ((onclick (which-button)  ;; subset of the available arguments so that new arguments can be added
			 (if (eq? which-button *right-button*)
			     (reverse-text (get-text 'text))))))
    (button
     'button "click me"
     (function (which-button)
       (set-text 'text
		 (reverse-text (get-text 'text))))))))

;; buttons with labels 1-9 on them in a square grid.  clicking on any button adds that number to the text box

(define-gui calculator
  (frame
   'frame "Not a calculator"
   (row-layout
    (grid-layout
     'button-layout
     3 ;; number of columns
     (map (lambda (n)
	    (button (symbol-append 'button- (number->symbol n))
		    (number->string n)
		    (fuction ()
			     (set-text 'text
				       (string-append (get-text 'text)
						      (number->string n))))))
	  (iota 1 9)))
    (text-area 'text ""))))

;; image viewer with some manipulation tools

(define-gui image-viewer
  (frame
   "Image viewer"
   (row-layout
    (column-layout
     ;; manipulation buttons
     (grid-layout
      1
      (button 'rotator "Rotate image"
	      (function ()
			(let ((new-image (rotate-image (get-image 'image-buffer))))
			  (set-image 'image-buffer new-image))
			  (image-ring-set-data! image-ring new-image))))
     (image-canvas
      'image-buffer
      300 300 ;; canvas size
      #()))
    (column-layout
     (button
      'prev "Previous"
      (function ()
		(image-ring-previous! image-ring)
		(set-image 'image-buffer (image-ring-data image-ring))))
     (button
      'next "Next"
      (function ()
		(image-ring-next! image-ring)
		(set-image 'image-buffer (image-ring-data image-ring))))))))

;; dynamically rearanging gui components based on a user's
;; preferences file.  probably implemented as a gui item rearranger
;; function

;; simple text editor

(define-gui text-edit
  (frame
   "Text editor"
   (row-layout
    (column-layout
     (button 'open-button "Open"
	     (function ()
		       (let ((new-filename (file-chooser (pwd))))
			 (set! *current-filename* new-filename)
			 (set-text 'text
				   (get-file-contents *current-filename*)))))
     (button 'save-button "Save"
	     (function ()
		       (write-file-contents *current-filename*
					    (get-text 'text)))))
    (scroll-bars
     (text-area 'text "")))))