Just for fun read the below piece of code :)
SystemProgressMorph>>label: shortDescription min: startMinValue max:
startMaxValue
"Answer the block that updates the progress bar."
"some fun stuff added (by kph)
- bar value: #label. - tell me my current label.
- bar value: 'newLabel'. - enable changing the label from within the
workBlock
- bar value: #increment. - enable progress by one without keeping a
counter
- bar value: #decrement. - go backwards (if you really have to,
useful for an abort, or rollback)!
- bar value: newBigNum. - change the max on the fly - when you find
there is more to do.
- bar value: (bar value: #setMax) + 20 - change the max on the fly -
when you find there is more/less to do.
- bar value: (bar value: #setMin) - 20 - change the min on the fly -
not sure why you would want to.
"
| slot range barSize lastRefresh maxValue minValue bar|
maxValue := startMaxValue.
minValue := startMinValue.
((range := maxValue - minValue) <= 0 or: [(slot := self nextSlotFor:
shortDescription) = 0])
ifTrue: [^[:barVal| 0 ]].
self recenter.
self openInWorld.
barSize := -1. "Enforces a inital draw of the morph"
lastRefresh := Time millisecondClockValue.
bar := bars at: slot.
^[:barValArg | | barVal return newBarSize |
barVal := barValArg.
return := nil.
bar := bars at: slot.
"new fun stuff here"
barVal == #current ifTrue: [ return := barSize ].
barVal == #label ifTrue:[ return := (labels at: slot) contents
].
barVal == #setMax ifTrue: [ return := maxValue. maxValue :=
minValue ].
barVal == #setMin ifTrue: [ return := minValue. minValue :=
maxValue ].
barVal == #increment ifTrue: [return := barVal := barSize + 1].
barVal == #decrement ifTrue: [ return := barVal := barSize - 1].
(barVal isString and: [barVal isSymbol not]) ifTrue: [
(labels at: slot) contents: barVal.
barVal := #refresh].
barVal == #refresh ifTrue: [self currentWorld displayWorld.
return := true].
(barVal == SmallInteger maxVal or: [ barVal == #finished ])
ifTrue:
[return := slot].
return ifNil: [
barVal > maxValue ifTrue: [return := maxValue :=
barVal].
barVal < minValue ifTrue: [return := minValue :=
barVal].
(barVal between: minValue and: maxValue)
ifTrue: [newBarSize := (barVal - minValue /
range * BarWidth) truncated.
newBarSize = barSize
ifFalse: [barSize :=
newBarSize.
(Time
millisecondsSince: lastRefresh) > 25
ifTrue: [barVal := #refresh ]]].
barVal == #refresh ifTrue: [
((bar valueOfProperty: #useStripes)
ifNil: [false])
ifTrue: [bar fillStyle origin:
bar position - ((Time
millisecondClockValue // 50 \\ 30) @ 0)].
bar barSize: barSize.
self currentWorld displayWorld.
lastRefresh := Time
millisecondClockValue]].
return]
Cheers,
Doru
--
www.tudorgirba.com
"Every thing has its own flow"