[Pharo-project] a little pearl from SystemProgressMorph

Stéphane Ducasse stephane.ducasse at inria.fr
Fri Jul 27 15:27:03 EDT 2012


On Jul 27, 2012, at 2:56 PM, Tudor Girba wrote:

> I think you missed my p.s. :)

No I saw it. Don't worry :)
> 
> Doru
> 
> 
> On Fri, Jul 27, 2012 at 2:21 PM, Stéphane Ducasse
> <stephane.ducasse at inria.fr> wrote:
>> 
>> On Jul 27, 2012, at 1:06 PM, Tudor Girba wrote:
>> 
>>> I checked in Pharo 2.0, and it looks ... well, how should I put it:
>>> it's confusing. You took a clear piece of code that could be printed
>>> on a nice A4 paper, and transformed it into a myriad of delegations.
>>> 
>>> I think you are just too afraid of if-statements. Clearly, a better
>>> solution would have been to just use caseOf:.
>> 
>> I did not check the code but using blocks as objects was a bad idea.
>> 
>>> 
>>> Doru
>>> 
>>> p.s. :)
>>> 
>>> 
>>> On Thu, Jul 26, 2012 at 8:55 PM, Stéphane Ducasse
>>> <stephane.ducasse at inria.fr> wrote:
>>>> And I removed the strip behavior.
>>>> In 2.0 it is not there.
>>>> 
>>>> Stef
>>>> 
>>>> On Jul 25, 2012, at 4:47 PM, Tudor Girba wrote:
>>>> 
>>>>> 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"
>>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> 
>>> --
>>> www.tudorgirba.com
>>> 
>>> "Every thing has its own flow"
>>> 
>> 
>> 
> 
> 
> 
> -- 
> www.tudorgirba.com
> 
> "Every thing has its own flow"
> 





More information about the Pharo-dev mailing list