newlisp/guiserver/shapes-demo.lsp

125 lines
4 KiB
Text

#!/usr/local/bin/newlisp
;;
;; shapes-demo.lsp - demonstrate different lines, outlines and shapes
;; v.1.0
;;;; initialization
(set-locale "C")
(load (append (env "NEWLISPDIR") "/guiserver.lsp"))
;; subroutines for random shapes
(define (random-draw-line)
(gs:draw-line 'L (rand 640) (rand 640) (rand 640) (rand 640) (list (random) (random) (random))))
(define (random-draw-rect)
(gs:draw-rect 'R (rand 640) (rand 640) (rand 100) (rand 100) (list (random) (random) (random))))
(define (random-fill-rect)
(gs:fill-rect 'R (rand 640) (rand 640) (rand 100) (rand 100) (list (random) (random) (random))))
(define (random-draw-round-rect)
(gs:draw-round-rect 'R (rand 640) (rand 640) (rand 100) (rand 100)
(rand 40) (rand 40) (list (random) (random) (random))))
(define (random-fill-round-rect)
(gs:fill-round-rect 'R (rand 640) (rand 640) (rand 100) (rand 100)
(rand 40) (rand 40) (list (random) (random) (random))))
(define (random-draw-circle)
(gs:draw-circle 'C (rand 640) (rand 640) (rand 100) (list (random) (random) (random))))
(define (random-fill-circle)
(gs:fill-circle 'C (rand 640) (rand 640) (rand 100) (list (random) (random) (random))))
(define (random-draw-ellipse)
(gs:draw-ellipse 'E (rand 640) (rand 640) (rand 100) (rand 100) (list (random) (random) (random))))
(define (random-fill-ellipse)
(gs:fill-ellipse 'E (rand 640) (rand 640) (rand 100) (rand 100) (list (random) (random) (random))))
(define (random-draw-arc)
(gs:draw-arc 'A (rand 640) (rand 640) (rand 100) (rand 100) (rand 360) (rand 360) (list (random) (random) (random))))
(define (random-fill-arc)
(gs:fill-arc 'A (rand 640) (rand 640) (rand 100) (rand 100) (rand 360) (rand 360) (list (random) (random) (random))))
(gs:init)
;(gs:set-trace true)
;;;; describe the GUI
(gs:frame 'ShapesDemo 100 100 640 640 "Random lines, rectangles, circles, ellipses and arcs Demo")
(gs:set-border-layout 'ShapesDemo)
(gs:canvas 'MyCanvas 'ShapesDemo)
(gs:panel 'Selection)
(gs:label 'HelpText "show or hide shapes:")
(gs:check-box 'LineSelect 'select-action "lines")
(gs:check-box 'RectangleSelect 'select-action "rectangles")
(gs:check-box 'CircleSelect 'select-action "circles")
(gs:check-box 'EllipseSelect 'select-action "ellipse")
(gs:check-box 'ArcSelect 'select-action "arcs")
(gs:set-selected 'LineSelect true 'RectangleSelect true 'CircleSelect true 'EllipseSelect true 'ArcSelect true)
(gs:add-to 'Selection 'HelpText 'LineSelect 'RectangleSelect 'CircleSelect 'EllipseSelect 'ArcSelect)
(gs:add-to 'ShapesDemo 'MyCanvas "center" 'Selection "south")
(gs:set-background 'MyCanvas gs:white)
; default color if not specified in shape or text
(gs:set-paint gs:darkGray)
;(gs:set-translation 100 100) ;only for test, will shift everything
;(gs:set-scale 0.5 0.5) ; only for testing scrinks or zooms
;(gs:set-rotation 10) ; only for testing tilts by 10 degree
(set 'N 20)
(set 'N-shapes (* N 11))
(set 'start (time-of-day))
(dotimes (i N)
(random-draw-line)
(random-draw-rect)
(random-fill-rect)
(random-draw-round-rect)
(random-fill-round-rect)
(random-draw-circle)
(random-fill-circle)
(random-draw-ellipse)
(random-fill-ellipse)
(random-draw-arc)
(random-fill-arc)
)
(println N-shapes " shapes " (div (- (time-of-day) start) N-shapes) "ms per shape")
(gs:set-font 'MyCanvas "Lucida Sans Regular" 40 "italic")
(gs:draw-text 'T "Random" 60 100)
(gs:set-font 'MyCanvas "Monospaced" 40 "plain")
(gs:draw-text 'T "Shapes and Outlines" 60 160 gs:green -15)
;(gs:draw-text 'T "Third text line" 60 220) ; only for testing
(gs:set-visible 'ShapesDemo true)
;; action handler
(define (select-action id flag)
(let (tag (case id
("MAIN:LineSelect" 'L)
("MAIN:RectangleSelect" 'R)
("MAIN:CircleSelect" 'C)
("MAIN:EllipseSelect" 'E)
("MAIN:ArcSelect" 'A)))
(if flag
(gs:show-tag tag)
(gs:hide-tag tag))
)
)
(gs:add-to 'Selection 'HelpText 'LineSelect 'RectangleSelect 'CircleSelect 'EllipseSelect 'ArcSelect)
;;;; listen for incoming action requests and dispatch
;(gs:export "shapes.png") ; just for testing
(gs:listen)
;; eof