gui/implementation/ProgressBox.tcl


@implementation ProgressBox {
  - init {} {
      $super init
      $super hideBorder
      set bg [[entry $frame.e] cget -selectbackground]
      set lightBg [$frame.e cget -background]
      destroy $frame.e
      set canvas [canvas $frame.bar -width 100 -height 20 -relief sunken -bd 1]
      $canvas configure -bg $lightBg
      set items(value) [$canvas create text 50 10 \
        -text 0 -font Fixed -anchor e -fill black -tag value]
      set items(unit) [$canvas create text 55 10 \
        -text % -font Fixed -anchor w -fill black]
      set items(bar) [$canvas create rectangle -100 0 0 20 \
        -fill $bg -outline $bg -tag bar]
      grid $canvas -sticky snew
      $canvas configure -scrollregion {0 0 100 20}
      set timer(value) 60
      set timer(step) 600
      set timer(id) 0
      set value 0
    }

  - value: aValueFrom0To100 {
      $canvas move $items(bar) [expr $aValueFrom0To100 - $value] 0
      $canvas itemconfigure $items(value) -text $aValueFrom0To100
      set value $aValueFrom0To100
      $canvas raise $items(value)
      $canvas raise $items(unit)
      if {[info exists callbacks(Change)] \
        && [string length $callbacks(Change)]} {
        catch {eval $callbacks(Change)}
      }
    }
  - value {} {
      return $value
    }

  - timerStep: aTimeValueInMs {
      if {$aTimeValueInMs == 0 } {
        $self stop 
      } else { 
        set timer(step) $aTimeValueInMs
        set timer(value) [expr $timer(step) * 100]
      }
    }

  - timerStep {} {
      return $timer(step)
    }

  - timer: aTimeValueInSec {
      if {$aTimeValueInSec == 0 } {
        $self stop
      } else {
        set timer(value) [expr $aTimeValueInSec * 1000]
        set timer(step) [expr $timer(value) / 100]
      }
    }

  - timer {} {
      return $timer(value)
    }

  - start {} {
      return [$self run]
    }

  - run {} {
      if {$value < 100} {
        $self value: [expr $value + 1]
        set timer(id) [after $timer(step) $self start]
      } else {
        set timer(id) 0
        if {[info exists callbacks(End)] \
          && [string length callbacks(End)]} {
          catch {eval $callbacks(End)}
        }
      }
    }

  - onChange: aCallback {
      set callbacks(Change) $aCallback
    }

  - onEnd: aCallback {
      set callbacks(End) $aCallback
    }

  - stop {} {
      if {$timer(id) != 0} {
        after cancel $timer(id)
        set timer(id) 0
      }

    }

  - reset {} {
      $self value: 0
    }
}