155 lines
4.8 KiB
Plaintext
155 lines
4.8 KiB
Plaintext
;;;;
|
|
;;;; G a u g e . s t k l o s -- Gauges class definition
|
|
;;;;
|
|
;;;; Copyright © 1996-1998 Erick Gallesio - I3S-CNRS/ESSI <eg@unice.fr>
|
|
;;;;
|
|
;;;; Permission to use, copy, and/or distribute this software and its
|
|
;;;; documentation for any purpose and without fee is hereby granted, provided
|
|
;;;; that both the above copyright notice and this permission notice appear in
|
|
;;;; all copies and derived works. Fees for distribution or use of this
|
|
;;;; software or derived works may only be charged with express written
|
|
;;;; permission of the copyright holder.
|
|
;;;; This software is provided ``as is'' without express or implied warranty.
|
|
;;;;
|
|
;;;; $Id: Gauge.stklos 1.1 Wed, 04 Feb 1998 10:34:59 +0000 eg $
|
|
;;;;
|
|
;;;; Author: Erick Gallesio [eg@unice.fr]
|
|
;;;; Creation date: 17-Oct-1996 14:53
|
|
;;;; Last file update: 4-Feb-1998 10:23
|
|
;;;
|
|
|
|
(require "Basics")
|
|
(select-module STklos+Tk)
|
|
|
|
;=============================================================================
|
|
;
|
|
; < G a u g e >
|
|
;
|
|
;=============================================================================
|
|
|
|
;;
|
|
;; Resources
|
|
;;
|
|
|
|
;; We don't use the <Canvas> class for implementing gauges to avoid
|
|
;; to load <Canvas> (which is rather long to load if no <Canvas> are
|
|
;; used elsewhere). BTW, only a little bit of canvas capabilities are
|
|
;; used here
|
|
|
|
|
|
(define-class <Gauge> (<Tk-simple-widget>)
|
|
( priv-box ;; The Cid of the box used in the canvas to represent the gauge
|
|
(foreground :accessor foreground
|
|
:initform "#3a5fcd" ; RoyalBlue3
|
|
:init-keyword :foreground
|
|
:allocation :active
|
|
:after-slot-set! (lambda(o v)
|
|
(when (slot-bound? o 'priv-box)
|
|
((Id o) 'itemconfigure (slot-ref o 'priv-box)
|
|
:fill v :outline v))))
|
|
(height :accessor height
|
|
:init-keyword :height
|
|
:init-form 20
|
|
:allocation :tk-virtual)
|
|
(value :accessor value
|
|
:init-keyword :value
|
|
:initform 0
|
|
:allocation :active
|
|
:after-slot-set! (lambda(o v) (configure-gauge o)))
|
|
(width :accessor width
|
|
:init-keyword :width
|
|
:init-form 200
|
|
:allocation :tk-virtual))
|
|
:metaclass <Tk-active-metaclass>)
|
|
|
|
|
|
(define-method tk-constructor ((self <Gauge>)) Tk:canvas)
|
|
|
|
;;;;
|
|
;;;; Initialize
|
|
;;;;
|
|
(define-method initialize ((self <Gauge>) initargs)
|
|
(next-method)
|
|
(let ((Id (slot-ref self 'Id))
|
|
(fg (foreground self)))
|
|
(slot-set! self 'highlight-thickness 0)
|
|
(slot-set! self 'relief "raised")
|
|
(slot-set! self 'priv-box
|
|
(Id 'create 'rectangle 0 0 0 0 :outline fg :fill fg))
|
|
(bind self "<Configure>" (lambda () (configure-gauge self)))))
|
|
|
|
;;;;
|
|
;;;; configure-gauge
|
|
;;;;
|
|
(define-method configure-gauge ((self <Gauge>))
|
|
(when (slot-bound? self 'priv-box)
|
|
(let ((width (winfo 'width self))
|
|
(height (winfo 'height self)))
|
|
((Id self) 'coords (slot-ref self 'priv-box)
|
|
0 0
|
|
(quotient (* width (value self)) 100) height))))
|
|
|
|
;=============================================================================
|
|
;
|
|
; < V a l u e d - G a u g e >
|
|
;
|
|
;=============================================================================
|
|
|
|
(define-class <Valued-Gauge> (<Gauge>)
|
|
( priv-txt
|
|
(text-font :accessor text-font
|
|
:initform '(Helvetica -14 bold)
|
|
:allocation :active
|
|
:after-slot-set! (lambda(o v)
|
|
(when (slot-bound? o 'priv-txt)
|
|
((Id o) 'itemconfigure
|
|
(slot-ref o 'priv-txt)
|
|
:font v))))
|
|
(text-foreground :accessor text-foreground
|
|
:initform "black"
|
|
:allocation :active
|
|
:after-slot-set! (lambda(o v)
|
|
(when (slot-bound? o 'priv-txt)
|
|
((Id o) 'itemconfigure
|
|
(slot-ref o 'priv-txt)
|
|
:fill v))))))
|
|
;;;;
|
|
;;;; Initialize
|
|
;;;;
|
|
(define-method initialize ((self <Valued-Gauge>) initargs)
|
|
(next-method)
|
|
(let* ((Id (slot-ref self 'Id))
|
|
(fg (slot-ref self 'text-foreground))
|
|
(fn (slot-ref self 'text-font)))
|
|
(slot-set! self 'priv-txt
|
|
(Id 'create 'text 10 10
|
|
:anchor "nw" :text "XX%" :fill fg :font fn))))
|
|
|
|
(define-method configure-gauge ((self <Valued-Gauge>) . val)
|
|
(next-method)
|
|
(when (slot-bound? self 'priv-txt)
|
|
(let* ((Id (Id self))
|
|
(txt (slot-ref self 'priv-txt))
|
|
(bbox (Id 'bbox txt))
|
|
(wtxt (- (list-ref bbox 2) (list-ref bbox 0)))
|
|
(htxt (- (list-ref bbox 3) (list-ref bbox 1))))
|
|
(Id 'coords txt (/ (- (winfo 'width self) wtxt) 2)
|
|
(/ (- (winfo 'height self) htxt) 2))
|
|
(Id 'itemconfigure (slot-ref self 'priv-txt)
|
|
:text (format #f "~A%" (value self))))))
|
|
|
|
(provide "Gauge")
|
|
|
|
#|
|
|
Example:
|
|
|
|
(define g1 (make <Gauge> :border-width 2 :relief "raised"))
|
|
(define g2 (make <Valued-Gauge> :border-width 2 :relief "raised"))
|
|
(pack g1 g2)
|
|
(dotimes (i 101)
|
|
(set! (value g1) i)
|
|
(set! (value g2) (- 100 i))
|
|
(update 'idle)
|
|
(after 60))
|
|
|#
|