Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk:
http://source.squeak.org/trunk/MorphicExtras-mt.156.mcz ==================== Summary ==================== Name: MorphicExtras-mt.156 Author: mt Time: 4 March 2015, 7:04:52.068 pm UUID: 1b149c50-aaf7-b043-86e1-ce80d88bc68b Ancestors: MorphicExtras-mt.155 Uses eToys' implementation of AnimatedImageMorph, which works fine with animated GIFs now. =============== Diff against MorphicExtras-mt.155 =============== Item was changed: ImageMorph subclass: #AnimatedImageMorph + instanceVariableNames: 'images delays stepTime nextTime imageIndex stepper' - instanceVariableNames: 'images delays stepTime nextTime imageIndex formsAreDiffs' classVariableNames: '' poolDictionaries: '' category: 'MorphicExtras-AdditionalMorphs'! !AnimatedImageMorph commentStamp: '<historical>' prior: 0! I am an ImageMorph that can hold more than one image. Each image has its own delay time.! Item was added: + ----- Method: AnimatedImageMorph class>>additionsToViewerCategories (in category 'class initialization') ----- + additionsToViewerCategories + "Answer a list of (<categoryName> <list of category specs>) pairs that characterize the phrases this kind of morph wishes to add to various Viewer categories." + ^ #( + + (#'graphics' + ( + (slot isGifPlaying 'Whether the gif is playing' + Boolean readWrite Player getGifPlaying Player setGifPlaying:) + (slot opaque 'Whether the gif opaque' + Boolean readWrite Player getOpaque Player setOpaque:) + + )) + + ) + ! Item was changed: ----- Method: AnimatedImageMorph class>>fromGIFFileNamed: (in category 'instance creation') ----- fromGIFFileNamed: fileName | reader | + reader _ AnimatedGIFReadWriter formsFromFileNamed: fileName. - reader := AnimatedGIFReadWriter formsFromFileNamed: fileName. ^reader forms size = 1 ifTrue: [ ImageMorph new image: reader forms first ] ifFalse: [ self new fromReader: reader ]! Item was changed: ----- Method: AnimatedImageMorph class>>fromStream: (in category 'instance creation') ----- fromStream: aStream | reader | + reader _ AnimatedGIFReadWriter formsFromStream: aStream. - reader := AnimatedGIFReadWriter formsFromStream: aStream. ^reader forms size = 1 ifTrue: [ ImageMorph new image: reader forms first ] ifFalse: [ self new fromReader: reader ]! Item was removed: - ----- Method: AnimatedImageMorph class>>initialize (in category 'class initialization') ----- - initialize - "register the receiver in the global registries" - self environment - at: #FileList - ifPresent: [:cl | cl registerFileReader: self]! Item was changed: ----- Method: AnimatedImageMorph class>>serviceOpenGIFInWindow (in category 'fileIn/Out') ----- serviceOpenGIFInWindow "Answer a service for opening a gif graphic in a window" ^ (SimpleServiceEntry provider: self label: 'open the graphic as a morph' selector: #openGIFInWindow: description: 'open a GIF graphic file as a morph' + buttonLabel: 'open gif') - buttonLabel: 'open') argumentGetter: [:fileList | fileList readOnlyStream]! Item was changed: ----- Method: AnimatedImageMorph class>>services (in category 'fileIn/Out') ----- services ^ Array with: self serviceOpenGIFInWindow "with: Form serviceImageImports" + "with: Form serviceImageAsBackground"! - with: Form serviceImageAsBackground! Item was added: + ----- Method: AnimatedImageMorph>>addCustomMenuItems:hand: (in category 'stepping and presenter') ----- + addCustomMenuItems: aMenu hand: aHand + super addCustomMenuItems: aMenu hand: aHand. + aMenu addUpdating: #steppingString action: #toggleStepping! Item was removed: - ----- Method: AnimatedImageMorph>>formsAreDiffs (in category 'accessing') ----- - formsAreDiffs - "Should the forms be drawn on top of each other to produce the frame?" - ^ formsAreDiffs ifNil: [false]! Item was removed: - ----- Method: AnimatedImageMorph>>formsAreDiffs: (in category 'accessing') ----- - formsAreDiffs: aBoolean - - formsAreDiffs := aBoolean. - self reset.! Item was added: + ----- Method: AnimatedImageMorph>>fromArray: (in category 'private') ----- + fromArray: reader + images := reader first. + delays := reader second. + imageIndex := 0. + self + image: (Form extent: images first extent depth: 32). + self isOpaque: true. + self step! Item was changed: ----- Method: AnimatedImageMorph>>fromReader: (in category 'private') ----- + fromReader: reader - fromReader: reader - images := reader forms. delays := reader delays. + imageIndex := 0. + self + image: (Form extent: images first extent depth: 32). + self isOpaque: true. + self step! - self reset.! Item was changed: ----- Method: AnimatedImageMorph>>initialize (in category 'private') ----- initialize nextTime := Time millisecondClockValue. imageIndex := 1. stepTime := 10. + stepper :=true. super initialize! Item was removed: - ----- Method: AnimatedImageMorph>>reset (in category 'private') ----- - reset - - imageIndex := 0. - self image: (Form extent: images first extent depth: 32). - self step.! Item was added: + ----- Method: AnimatedImageMorph>>setStepping: (in category 'stepping and presenter') ----- + setStepping: aBoolean + self wantsSteps ifFalse:[^false]. + stepper := aBoolean. + stepper ifTrue:[self startStepping] + ifFalse:[self stopStepping]. + + ! Item was changed: ----- Method: AnimatedImageMorph>>step (in category 'stepping and presenter') ----- step + | form delay | + stepper ifFalse:[ self stopStepping]. + images isEmpty + ifTrue: [^ self]. + nextTime > Time millisecondClockValue + ifTrue: [^self]. + imageIndex > 0 ifTrue: [ + form := images at: imageIndex. + form displayOn: self image at: 0@0 rule: + ((self isOpaque) ifTrue:[Form paint] ifFalse:[Form erase]). + ]. + imageIndex _ imageIndex \\ images size + 1. + form := images at: imageIndex. + form displayOn: self image at: 0@0 rule: Form paint. + self changed. + delay := (delays at: imageIndex) ifNil: [0]. + nextTime := Time millisecondClockValue +delay! - | d next | - images isEmpty ifTrue: [^ self]. - - nextTime > Time millisecondClockValue - ifTrue: [^self]. - self changed . - next := images at: (imageIndex := imageIndex \\ images size + 1). - self formsAreDiffs - ifFalse: [self image: next] - ifTrue: [self image getCanvas translucentImage: next at: next offset].. - self changed . - d := (delays at: imageIndex) ifNil: [0]. - nextTime := Time millisecondClockValue + d - ! Item was changed: ----- Method: AnimatedImageMorph>>stepTime: (in category 'stepping and presenter') ----- stepTime: anInteger + stepTime _ anInteger! - stepTime := anInteger! Item was added: + ----- Method: AnimatedImageMorph>>steppingString (in category 'stepping and presenter') ----- + steppingString + ^ (stepper + ifTrue: ['<on>'] + ifFalse: ['<off>']), 'stepping' translated! Item was added: + ----- Method: AnimatedImageMorph>>toggleStepping (in category 'stepping and presenter') ----- + toggleStepping + self wantsSteps + ifTrue: [stepper := stepper not]. + stepper ifTrue:[self startStepping] + ifFalse:[self stopStepping]. + + ! |
Hi.
quick review. On 04.03.2015, at 18:04, [hidden email] wrote: > Marcel Taeumel uploaded a new version of MorphicExtras to project The Trunk: > http://source.squeak.org/trunk/MorphicExtras-mt.156.mcz > > ==================== Summary ==================== > > Name: MorphicExtras-mt.156 > Author: mt > Time: 4 March 2015, 7:04:52.068 pm > UUID: 1b149c50-aaf7-b043-86e1-ce80d88bc68b > Ancestors: MorphicExtras-mt.155 > > Uses eToys' implementation of AnimatedImageMorph, which works fine with animated GIFs now. > > =============== Diff against MorphicExtras-mt.155 =============== > > Item was changed: > ImageMorph subclass: #AnimatedImageMorph > + instanceVariableNames: 'images delays stepTime nextTime imageIndex stepper' > - instanceVariableNames: 'images delays stepTime nextTime imageIndex formsAreDiffs' > classVariableNames: '' > poolDictionaries: '' > category: 'MorphicExtras-AdditionalMorphs'! > > !AnimatedImageMorph commentStamp: '<historical>' prior: 0! > I am an ImageMorph that can hold more than one image. Each image has its own delay time.! > > Item was added: > + ----- Method: AnimatedImageMorph class>>additionsToViewerCategories (in category 'class initialization') ----- > + additionsToViewerCategories > + "Answer a list of (<categoryName> <list of category specs>) pairs that characterize the phrases this kind of morph wishes to add to various Viewer categories." > + ^ #( > + > + (#'graphics' > + ( > + (slot isGifPlaying 'Whether the gif is playing' > + Boolean readWrite Player getGifPlaying Player setGifPlaying:) > + (slot opaque 'Whether the gif opaque' > + Boolean readWrite Player getOpaque Player setOpaque:) > + > + )) > + > + ) > + ! > > Item was changed: > ----- Method: AnimatedImageMorph class>>fromGIFFileNamed: (in category 'instance creation') ----- > fromGIFFileNamed: fileName > | reader | > + reader _ AnimatedGIFReadWriter formsFromFileNamed: fileName. > - reader := AnimatedGIFReadWriter formsFromFileNamed: fileName. Should be changed back. > ^reader forms size = 1 > ifTrue: [ ImageMorph new image: reader forms first ] > ifFalse: [ self new fromReader: reader ]! > > Item was changed: > ----- Method: AnimatedImageMorph class>>fromStream: (in category 'instance creation') ----- > fromStream: aStream > | reader | > + reader _ AnimatedGIFReadWriter formsFromStream: aStream. > - reader := AnimatedGIFReadWriter formsFromStream: aStream. Should be changed back. > ^reader forms size = 1 > ifTrue: [ ImageMorph new image: reader forms first ] > ifFalse: [ self new fromReader: reader ]! > > Item was removed: > - ----- Method: AnimatedImageMorph class>>initialize (in category 'class initialization') ----- > - initialize > - "register the receiver in the global registries" > - self environment > - at: #FileList > - ifPresent: [:cl | cl registerFileReader: self]! This remove should be reverted. > > Item was changed: > ----- Method: AnimatedImageMorph class>>serviceOpenGIFInWindow (in category 'fileIn/Out') ----- > serviceOpenGIFInWindow > "Answer a service for opening a gif graphic in a window" > ^ (SimpleServiceEntry > provider: self > label: 'open the graphic as a morph' > selector: #openGIFInWindow: > description: 'open a GIF graphic file as a morph' > + buttonLabel: 'open gif') > - buttonLabel: 'open') > argumentGetter: [:fileList | fileList readOnlyStream]! > > Item was changed: > ----- Method: AnimatedImageMorph class>>services (in category 'fileIn/Out') ----- > services > ^ Array > with: self serviceOpenGIFInWindow > "with: Form serviceImageImports" > + "with: Form serviceImageAsBackground"! > - with: Form serviceImageAsBackground! While virtually no one uses services, I think this can stay without the comment > > Item was added: > + ----- Method: AnimatedImageMorph>>addCustomMenuItems:hand: (in category 'stepping and presenter') ----- > + addCustomMenuItems: aMenu hand: aHand > + super addCustomMenuItems: aMenu hand: aHand. > + aMenu addUpdating: #steppingString action: #toggleStepping! > > Item was removed: > - ----- Method: AnimatedImageMorph>>formsAreDiffs (in category 'accessing') ----- > - formsAreDiffs > - "Should the forms be drawn on top of each other to produce the frame?" > - ^ formsAreDiffs ifNil: [false]! > > Item was removed: > - ----- Method: AnimatedImageMorph>>formsAreDiffs: (in category 'accessing') ----- > - formsAreDiffs: aBoolean > - > - formsAreDiffs := aBoolean. > - self reset.! > > Item was added: > + ----- Method: AnimatedImageMorph>>fromArray: (in category 'private') ----- > + fromArray: reader > + images := reader first. > + delays := reader second. > + imageIndex := 0. > + self > + image: (Form extent: images first extent depth: 32). > + self isOpaque: true. > + self step! > > Item was changed: > ----- Method: AnimatedImageMorph>>fromReader: (in category 'private') ----- > + fromReader: reader > - fromReader: reader > - > images := reader forms. > delays := reader delays. > + imageIndex := 0. > + self > + image: (Form extent: images first extent depth: 32). > + self isOpaque: true. > + self step! > - self reset.! > > Item was changed: > ----- Method: AnimatedImageMorph>>initialize (in category 'private') ----- > initialize > nextTime := Time millisecondClockValue. > imageIndex := 1. > stepTime := 10. > + stepper :=true. > super initialize! > > Item was removed: > - ----- Method: AnimatedImageMorph>>reset (in category 'private') ----- > - reset > - > - imageIndex := 0. > - self image: (Form extent: images first extent depth: 32). > - self step.! > > Item was added: > + ----- Method: AnimatedImageMorph>>setStepping: (in category 'stepping and presenter') ----- > + setStepping: aBoolean > + self wantsSteps ifFalse:[^false]. > + stepper := aBoolean. > + stepper ifTrue:[self startStepping] > + ifFalse:[self stopStepping]. > + > + ! > > Item was changed: > ----- Method: AnimatedImageMorph>>step (in category 'stepping and presenter') ----- > step > + | form delay | > + stepper ifFalse:[ self stopStepping]. > + images isEmpty > + ifTrue: [^ self]. > + nextTime > Time millisecondClockValue > + ifTrue: [^self]. > + imageIndex > 0 ifTrue: [ > + form := images at: imageIndex. > + form displayOn: self image at: 0@0 rule: > + ((self isOpaque) ifTrue:[Form paint] ifFalse:[Form erase]). > + ]. > + imageIndex _ imageIndex \\ images size + 1. > + form := images at: imageIndex. > + form displayOn: self image at: 0@0 rule: Form paint. > + self changed. > + delay := (delays at: imageIndex) ifNil: [0]. > + nextTime := Time millisecondClockValue +delay! > - | d next | > - images isEmpty ifTrue: [^ self]. > - > - nextTime > Time millisecondClockValue > - ifTrue: [^self]. > - self changed . > - next := images at: (imageIndex := imageIndex \\ images size + 1). > - self formsAreDiffs > - ifFalse: [self image: next] > - ifTrue: [self image getCanvas translucentImage: next at: next offset].. > - self changed . > - d := (delays at: imageIndex) ifNil: [0]. > - nextTime := Time millisecondClockValue + d > - ! > > Item was changed: > ----- Method: AnimatedImageMorph>>stepTime: (in category 'stepping and presenter') ----- > stepTime: anInteger > + stepTime _ anInteger! > - stepTime := anInteger! Should be changed back. > Item was added: > + ----- Method: AnimatedImageMorph>>steppingString (in category 'stepping and presenter') ----- > + steppingString > + ^ (stepper > + ifTrue: ['<on>'] > + ifFalse: ['<off>']), 'stepping' translated! > > Item was added: > + ----- Method: AnimatedImageMorph>>toggleStepping (in category 'stepping and presenter') ----- > + toggleStepping > + self wantsSteps > + ifTrue: [stepper := stepper not]. > + stepper ifTrue:[self startStepping] > + ifFalse:[self stopStepping]. > + > + ! > > |
Free forum by Nabble | Edit this page |