[squeak-dev] The Trunk: MorphicExtras-nice.134.mcz

Chris Muller asqueaker at gmail.com
Thu Dec 12 16:19:26 UTC 2013


Images are often reused in multiple places.  We already have MenuIcons
and HelpIcons.

Shouldn't we leverage one of these existing places or even factor them
all into one global "ImageLibrary" rather than introducing yet another
one solely for PaintBoxMorph?

On Wed, Dec 11, 2013 at 5:47 PM,  <commits at source.squeak.org> wrote:
> Nicolas Cellier uploaded a new version of MorphicExtras to project The Trunk:
> http://source.squeak.org/trunk/MorphicExtras-nice.134.mcz
>
> ==================== Summary ====================
>
> Name: MorphicExtras-nice.134
> Author: nice
> Time: 12 December 2013, 12:47:36.164 am
> UUID: 8675f085-dad7-499d-a3b9-b277864ea9c4
> Ancestors: MorphicExtras-nice.133
>
> PaintBoxMorph re-engineering: a first attempt at reconstructing the Prototype (from which new instances are cloned).
> Reminder: this is required step in order to properly unload/reload MorphicExtras via Monticello.
>
> =============== Diff against MorphicExtras-nice.133 ===============
>
> Item was changed:
>   ImageMorph subclass: #PaintBoxMorph
>         instanceVariableNames: 'action tool currentCursor thumbnail currentColor currentBrush colorMemory colorPatch stampHolder rotationTabForm scaleTabForm colorMemoryThin brushes focusMorph weakDependents recentColors'
> +       classVariableNames: 'AllOffImage AllOnImage AllPressedImage ColorChart ImageLibrary OriginalBounds Prototype RecentColors ScaleTabImage UseLargeColorPicker'
> -       classVariableNames: 'AllOffImage AllOnImage AllPressedImage ColorChart ColorMemoryImage ColorMemoryThinImage OriginalBounds PaletteImage Prototype RecentColors RotationTabImage ScaleTabImage ShapeTabImage StampTabImage UseLargeColorPicker'
>         poolDictionaries: ''
>         category: 'MorphicExtras-Support'!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>colorMemoryImage (in category 'resources') -----
> (excessive size, no diff calculated)
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>colorMemoryThinImage (in category 'resources') -----
>   colorMemoryThinImage
> +       ^self imageLibrary at: #colorMemoryThinImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> -       ^ColorMemoryThinImage ifNil: [ColorMemoryThinImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
>                 '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' readStream)]!
>
> Item was changed:
> + ----- Method: PaintBoxMorph class>>fixUpPrototype (in category 'class initialization') -----
> - ----- Method: PaintBoxMorph class>>fixUpPrototype (in category 'as yet unclassified') -----
>   fixUpPrototype
>         "PaintBoxMorph fixUpPrototype"
>   self error: 'who uses this?'.
>         Prototype eventHandler: nil!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>imageLibrary (in category 'resources') -----
> + imageLibrary
> +       ^ImageLibrary ifNil: [ImageLibrary := IdentityDictionary new]!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>newPrototype (in category 'instance creation') -----
> + newPrototype
> +       ^self basicNew buildAPrototype!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>paletteImage (in category 'resources') -----
> (excessive size, no diff calculated)
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>paletteOnImage (in category 'resources') -----
> (excessive size, no diff calculated)
>
> Item was changed:
> + ----- Method: PaintBoxMorph class>>prototype (in category 'resources') -----
> - ----- Method: PaintBoxMorph class>>prototype (in category 'as yet unclassified') -----
>   prototype
>         "Later we will be a subclass of Model, and it will have a general version of this"
> +       ^ Prototype ifNil: [Prototype := self newPrototype]!
> -       ^ Prototype!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>rotationTabImage (in category 'resources') -----
>   rotationTabImage
> +       ^self imageLibrary at: #rotationTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> -       ^RotationTabImage ifNil: [RotationTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
>                 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABHNCSVQFBQUBSsjp7wAAAwZJREFUeF6VlS2UpDAQhCORSCQSiUQikUgkEolEIpFIJBKJRCKRSOTIkchxfVX5Ydnd2b27vNdvZjbJ19WVTlb9Np7rKkfbypplskSRTEEgUxjKlCSy1JXs8yzqf8e577IXuWxhIFtgYkUsiJkJECOiD3wZkOifkzynSXao3AHWEZhwCVySjwSBtEgyNc3vCR59r4HH17gl2L5UMCA635cG0Zel/KiYoIeOUAdBNTZFnicRqonjWEL8TvGbwNmpx/cWUTFBXcs3j4840uAnAGdRyJSmElERyt0xf56njsfjITM8TuA1kwwEBgZOIYXvyTyOHwmOPDdgqD2rUuau00q3bZPX6/VjMHGklIZ3Fl4iclRDEercVu2zhkewAxsytN5xHBeECwkqUFEJX0coc3P8nVubGgvPWBEEqkfbXF4TPqCKu+IVvR5Z70co7K3nFECbns+neFDfXMo9Da/BUTtVXnC0FZTcS8/g/dbUOvFh25P9T7U1Dk+vAYNeOzjnctiqNrvJeI6TRzkOzApaHPSZJXrewdeQrejrzuG6FreY1dQAO+UJ5tRqN7gEXOjgPfqeXt7Bs+2MKTAtSmu4LsH3CuDCwmOEWqB8u12YlK2IDYQPwyAlFl122K7w8Deq9vHJdVVVaWBp4awipvIlTXSZLgEXsY+5iYcVoT0HQDm/Br5WzgPmQbuDZ7LUwnP7PcU+teF1W+xmBkG8IM4aqo89dYFpR3IT4OzjfQnQNdpvRIFGUAcWcQMTrCGTmD5lX7tOaHnrLJjtSG/Z37SPyXnhCI6tan527iGbklhvnG2SWatTkiI7VTsoq+JtbACn37QstGpph1MdYX6HZeb6L7PeOFp1Luhhh3BgHqa5iQZW3Hy+wHfVbiy4qb2F3KPXt9IkoT2Nb/pZW2MTOHDsvH43RvhIQHcDvoXalss/gWEP2lg/WD+NCVe6trDmBv0E9r6Diyz9HezGilevxmGVFuaU3tWmFhr7bzz+6/9SqJjwzrR43Uq0WhaY1zDh9WZiKCX06oo34w9N0ZSkQD6ZeQAAAABJRU5ErkJggg==' readStream)]!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>scaleTabImage (in category 'resources') -----
>   scaleTabImage
> +       ^self imageLibrary at: #scaleTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> -       ^ScaleTabImage ifNil: [ScaleTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
>                 'iVBORw0KGgoAAAANSUhEUgAAABcAAAAXCAYAAADgKtSgAAAABHNCSVQFBQUBSsjp7wAAAr9JREFUeF6VlSGUo0AQRJHISCQSiUQikUgkEolEIpHISCQSGYlEIpFIJBLXVzVpcvOyZHPHe7UDZPOrp6e74/x27eMoS13LnCQyBoEMnie970sfRfIoC5mHQZz/vfZ5liVLZfa9p7ynRsgYQB3Ueje5w+ifTba+lzUMZAV0Ua0ALdCkBg81MQa3m9RQX1W/G2xta6AbtJvVN/cr1kWjtw3MDgCmQeW60mbZtcHOiC3wAeCuosl6ATcpUngNeOE40haF/MgxU2HAgS9HFMoRhsbgNDFpuooe4DvUAF4CnkLD/f7XYE1TBSPiOJKjLKEC97Hk+GKGSslgFgMW4ZkKKQADyAcwhypdE3y2rqs4+zSaQyP8YNSokqPrnsIWE0Bn7gz/vCyLubfFdymCSy14zPQ0jThrXb1y/YLjg6Op5UgTqfJc9n2X4zg+qkAQNjzhit5wFvxZ9RBNWpjvJJYd4n2DJvoGzxHAOzzGOTkTol2sKqEBD/VUi/r9Bs9Qgu9wnoczno1iGTzQeT1XHGSOfA7oQKpHuW7b9gPOnBPIask05wHkjIhutgwoVgLz2KKpGuS/Rmr4HOJw+fwJXig8esFRepPOkLPdWXJX26dZhTRdwWNNSarwEAxnQj0zDTQ4FeGDq+2fu7jKeaRRJxp1ih5xFuYScBqMPoT1N3iML9GgRKMxVVw9NpcVNZuqxnvToT1KjgaDmoTQFZxpCTXCVBUrMNH7UOHzND3hy2OQO4Adq8R7tjY7kiVoi5ET2DAyrY7cMjnBzfv4feBFe3MxhDArXOQNZcjqsMXtn/VcfACn+PG4HLtdnmHwu9Lc4O5a0kgrK9rsAhwjIDOwPl0dDqlQyLsKC5pY9expdawYYl9/6h6Yx2bUKswGngd4RuujzetvP3HvF6PocIAlBluKIRRxdjNSrCxVRkrodFbFxfUHM1HXoyHv+TYAAAAASUVORK5CYII=' readStream)]!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>shapeTabImage (in category 'resources') -----
>   shapeTabImage
> +       ^self imageLibrary at: #shapeTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> -       ^ShapeTabImage ifNil: [ShapeTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
>                 'iVBORw0KGgoAAAANSUhEUgAAACUAAAAXCAYAAACMLIalAAAABHNCSVQFBQUBSsjp7wAAAmFJREFUeF7FlCGQpDAQRZHIkStPjkSuHHlyJRKJRCKRSCQSiYyMRCKRSGQkclxf/w4ZAlu3M2zVsqn6RRFI5/XvTgKtChqHlqaxJTMpuhstmkZFfVdT2xbU1Dm1TUFBEFJWdw/lTS8q2sETz9Wa0rJ9zGHd0DeicWi+3MuYiQ5DORCBcVpg3HucFhS9/2W4jt+7X4JalDNAkld0eXujK0NllRLXToVa1QlAnOYCdItThqulhJg/Hwq9xQLQNXpnh24Us1sWqvkFKAHSlBWlfAMQYJIFKmOn8uqM8i3OWClKMjt/+0gozsrVpaI5safclcAOAOjPNeKy3SxQVgmUAMElBjrl9Nk7SlNZN7Zkke0hAcosUFoq+QfXRHnGPZWwAzhdm5ItDiWFPXFwCD0HoFKNPw8V88bR7UPuIQeDpwVa+mi5t0p1EhR6KeWN4QhArJrHneRueOdSdTaU9I8HZBt7KdujdBg/DHUJLxuFYfhUWKdV9TrUMGgvC/vzjJ9nLU8swLyfqS/Vllaq5I1X4d19QwwIsffx8Y64+A/JG2MomGezs3ZdhCwcGLID3F5u7VcyO6Bt0i11eq3IPM+25NPUi33/c8tlBCHIUfkws9kmiz3hLNpjmlwP8gAdoByYH+juBfHhjsgH8uMMXJlOVw+XpHT+MGbcgPmO+Rl+R3sY5xCA0EufXPLHNA1S3xVscW1Un5w7CuVgbB/WrwH5jmEBtHVude+o3IHoBaaW60FOJZvwFMjvMSzAYr0AOshXTtteXWed2cIMhJMfHB33+8zWG852tIFGqP+GLATizOY5yD+ABou9MdPjbQAAAABJRU5ErkJggg==' readStream)]!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>shapesImage (in category 'resources') -----
> + shapesImage
> +       ^self imageLibrary at: #shapesImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> +               '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' readStream)]!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>shapesOnImage (in category 'resources') -----
> + shapesOnImage
> +       ^self imageLibrary at: #shapesOnImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> +               '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' readStream)]!
>
> Item was changed:
>   ----- Method: PaintBoxMorph class>>stampTabImage (in category 'resources') -----
>   stampTabImage
> +       ^self imageLibrary at: #stampTabImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> -       ^StampTabImage ifNil: [StampTabImage := Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
>                 'iVBORw0KGgoAAAANSUhEUgAAADMAAAAWCAYAAABtwKSvAAAABHNCSVQFBQUBSsjp7wAAA6tJREFUeF69ViuwqzAURFYikUgkEhkZiUQiI5FIJLISWYlEIisrkUhkJLLuvLNJU0J75777PoWZnbTAJmd3T9IG49DQPPW0zD3pZaC7Hg2WeaDbtaO+b+jS1dRfGgqCExVVYVEXVNblDrjnYO41JSmgVTtU54rBn8/q7ZkPrDfdLgbzdPm2Rq0X+jsxLwVjbHjszznVSvA7uX3uCUHxVoQF7p353tAVdK4llRXm2zh45/Ni6pdUHmJ0J+k+KhqrjPIspryUT0G+CIe2LWk9C8OZGkkqi54c1ZZHi9mSQVpKRNTIxIxpdKJMpJSr/CFGvQuCCWlItYwNRHyiJLGCnAGHiFEQ4vYOI+e2UqUgyQXFYUDhKWAxGUlXGLdNDUHP/VAaM5TieTgRcCLmxHFEspDGJBjwcTEVF7HUKS2t4PYQNHCLFEVGV/5cipjiBIh2yXRtQbrJDOfWSurRViz+xmPDqaRpYjgpc+SRyZScQhOHNGQhTVVKMxeJtkKbpFxQnMaUZAmJQtj2w2bmsY0CusqIZjbiUqbMCUgmoUkFYt44h7QZ2ordy+OYFBdScVECe4TFZCwm4cIyuTnsTrOSUyq4jSrmlMzJnpzQiDFJeqkck0xt9wiKFZL3RRRSwf2ehyiQwakJrzD12Pz4vSlYkMSzkE3h94vIcThZTmY7MFhMd4SYxm5el5DIM8rY2fwhSqJt0HZpZIrffiQhSBme5HYSHudphDnNxHFtZsQ4GFGPlCAKG5j3TM7pSEbORTun60tNNc+Dz7iHFHBygSeRCgsBB8nZ0+wAMXDX/8vhhJmkXIEsAu4/24ZbpmF+01tAmPsXYLm5SRmm+JyPiwlP4Q6n0+kPERqEPwDWG4fzz8VM0+ipty+veHkdzQgC7vsO+Rj61mJoeeEN+P585j2/jmdTALCfr7emPoy1GAxQ02td+A4+5obZWmsK1lW/RLmRoN4JwuRuQR+O+z26By5fmLKfzxeiX4TsTe7ZmK1z1nXlJPlalpvn1Hs6zglgW+wT2Cfhi1j13lzUiqTR/ssyWyG4oMqP3vWmm+Cu30X9f/D8y7gr/iuY9uJE0a4uFdNi/qX1/NLL/ZfOfBzrhlcRLhEIwV55S8W/lmUyfehvTpPSPLwl9b/xXRLbIdT9TIifEAhfnzr9B9tseBbuHzhY+2ZEdOaYhhCY/lsh/h4CAeTxIcyJ+9np9W9wJl6vNom9iIlwAgd/et3vK0et2bHZTjQDtwNhi8f6q/69gF+MUOdTGgYgKwAAAABJRU5ErkJggg==' readStream)]!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>stampsImage (in category 'resources') -----
> + stampsImage
> +       ^self imageLibrary at: #stampsImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> +               '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' readStream)]!
>
> Item was added:
> + ----- Method: PaintBoxMorph class>>stampsOnImage (in category 'resources') -----
> + stampsOnImage
> +       ^self imageLibrary at: #stampsOnImage ifAbsentPut: [Form fromBinaryStream: (Base64MimeConverter mimeDecodeToBytes:
> +               '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' readStream)]!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addActionsOffImage:onImage: (in category 'initialization') -----
> + addActionsOffImage: offImage onImage: onImage
> +       | posSpec actionSpec |
> +       posSpec := #(
> +               (53 53 53 53) "offset X"
> +               (154 178 202 226) "offset Y"
> +               (39 39 39 39) "width"
> +               (23 23 23 23) "height").
> +       actionSpec := #(undo:with:evt: keep:with:evt: clear:with:evt: toss:with:evt:).
> +       #(undo: keep: clear: toss:) keysAndValuesDo: [:index :name |
> +               | button rect |
> +               (self submorphNamed: name) ifNil:
> +                       [rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
> +                                       extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
> +                       (button := ThreePhaseButtonMorph new)
> +                               onImage: (onImage copy: rect);
> +                               offImage: (offImage copy: rect);
> +                               pressedImage: (onImage copy: rect);
> +                               bounds: (rect translateBy: self position);
> +                               setNamePropertyTo: name;
> +                               actionSelector: (actionSpec at: index);
> +                                       arguments: (Array with: button with: name);
> +                               actWhen: #buttonUp; target: self.
> +                       self addMorph: button.]].!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addBrushesOffImage:onImage: (in category 'initialization') -----
> + addBrushesOffImage: offImage onImage: onImage
> +       | posSpec |
> +       posSpec := #(
> +               (13 36 63 13 36 63) "offset X"
> +               (107 107 107 124 124 124) "offset Y"
> +               (21 24 27 21 24 27) "width"
> +               (18 18 18 25 25 25) "height").
> +       #(brush1: brush2: brush3: brush4: brush5: brush6: ) keysAndValuesDo: [:index :name |
> +               | button nib rect |
> +               (self submorphNamed: name) ifNil:
> +                       [nib := Form dotOfSize: (#(1 2 3 6 11 26) at: index).
> +                       rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
> +                                       extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
> +                       (button := ThreePhaseButtonMorph new)
> +                               onImage: (onImage copy: rect) as8BitColorForm;
> +                               offImage: (offImage copy: rect) as8BitColorForm;
> +                               pressedImage: (onImage copy: rect) as8BitColorForm;
> +                               bounds: (rect translateBy: self position);
> +                               setNamePropertyTo: name;
> +                               actionSelector: #brush:action:nib:evt:;
> +                                       arguments: (Array with: button with: name with: nib);
> +                               actWhen: #buttonUp; target: self.
> +                       self addMorph: button.]].
> +       brushes := #(brush1: brush2: brush3: brush4: brush5: brush6: ) collect: [:name | self submorphNamed: name]
> +
> + !
>
> Item was changed:
> + ----- Method: PaintBoxMorph>>addGraphicLabels (in category 'initialization') -----
> - ----- Method: PaintBoxMorph>>addGraphicLabels (in category 'other') -----
>   addGraphicLabels
>         "translate button labels"
>
>         | formTranslator |
>         formTranslator := NaturalLanguageFormTranslator localeID: (Locale current localeID).
>
>         #('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:label |
>                 (formTranslator translate: label, '-off') ifNil: [^ false].
>                 (formTranslator translate: label, '-pressed') ifNil: [^ false].
>         ].
>
>         #('keep:' 'undo:' 'clear:' 'toss:') with: #('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:extName :label |
>                 | button newForm ext pos |
>                 button := submorphs detect: [:m | m externalName = extName] ifNone: [nil].
>                 button ifNotNil: [
>                         button removeAllMorphs.
>                         ext := button extent.
>                         pos := button position.
>                         (newForm := formTranslator translate: label, '-off') ifNotNil: [
>                                 button offImage: newForm.
>
>                         ].
>                         (newForm := formTranslator translate: label, '-pressed') ifNotNil: [
>                                 button pressedImage: newForm.
>                         ].
>                         button extent: ext.
>                         button position: pos.
>                 ].
>         ].
>
>         ^ true.
>   !
>
> Item was changed:
> + ----- Method: PaintBoxMorph>>addLabels (in category 'initialization') -----
> - ----- Method: PaintBoxMorph>>addLabels (in category 'other') -----
>   addLabels
>
>         Preferences useFormsInPaintBox ifFalse: [
>                 self addTextualLabels.
>         ] ifTrue: [
>                 self addGraphicLabels ifFalse: [self addTextualLabels].
>         ].
>   !
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addShapeButtonsOffImage:onImage: (in category 'initialization') -----
> + addShapeButtonsOffImage: offImage onImage: onImage
> +       | shapes posSpec |
> +       posSpec := #(
> +               (17 17 17 17 17) "offset X"
> +               (0 22 44 66 88) "offset Y"
> +               (30 30 30 30 30) "width"
> +               (21 21 21 21 21) "height").
> +       shapes := self submorphNamed: 'shapes'.
> +       #(line: rect: ellipse: poylgon: star:) keysAndValuesDo: [:index :name |
> +               | button rect |
> +               (self submorphNamed: name) ifNil:
> +                       [rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
> +                                       extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
> +                       (button := ThreePhaseButtonMorph new)
> +                               onImage: (onImage copy: rect);
> +                               offImage: (offImage copy: rect);
> +                               pressedImage: (onImage copy: rect);
> +                               bounds: (rect translateBy: shapes position);
> +                               setNamePropertyTo: name;
> +                               actionSelector: #tool:action:cursor:evt:;
> +                                       arguments: (Array with: button with: name with: (self makeCursorFrom: (offImage copy: rect)));
> +                               actWhen: #buttonUp; target: self.
> +                       shapes addMorph: button.]].!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addStampButtonsOffImage:onImage: (in category 'initialization') -----
> + addStampButtonsOffImage: offImage onImage: onImage
> +       | stamps posSpec actionSpec argSpec names |
> +       posSpec := #(
> +               (13 38 63 13 38 63 37 55) "offset X"
> +               (0 0 0 25 25 25 51 51) "offset Y"
> +               (25 25 25 25 25 25 15 15) "width"
> +               (25 25 25 25 25 25 15 15) "height").
> +       actionSpec := #(
> +               pickup:action:cursor:evt: pickup:action:cursor:evt: pickup:action:cursor:evt:
> +               pickup:action:cursor:evt: pickup:action:cursor:evt: pickup:action:cursor:evt:
> +               scrollStamps:action:evt: scrollStamps:action:evt:).
> +       argSpec := #(
> +               stamp: stamp: stamp:
> +               stamp: stamp: stamp:
> +               prevStamp: nextStamp:).
> +       names := #(
> +               pickup: pickup: pickup:
> +               stamp: stamp: stamp:
> +               prevStamp: nextStamp:).
> +       stamps := self submorphNamed: 'stamps'.
> +       names keysAndValuesDo: [:index :name |
> +               | button rect |
> +               (self submorphNamed: name) ifNil:
> +                       [rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
> +                                       extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
> +                       (button := ThreePhaseButtonMorph new)
> +                               onImage: (onImage copy: rect);
> +                               offImage: (offImage copy: rect);
> +                               pressedImage: (onImage copy: rect);
> +                               bounds: (rect translateBy: stamps position);
> +                               setNamePropertyTo: name;
> +                               actionSelector: (actionSpec at: index);
> +                                       arguments: ((Array with: button with: (argSpec at: index) with: Cursor origin) first: (actionSpec at: index) numArgs - 1);
> +                               actWhen: #buttonUp; target: self.
> +                       stamps addMorph: button.]].!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addStampsAndShapes (in category 'initialization') -----
> + addStampsAndShapes
> +       | shapeTab shapes stampTab stamps |
> +       (stampTab := ThreePhaseButtonMorph new)
> +               onImage: self class stampTabImage;
> +               offImage: self class stampTabImage;
> +               pressedImage: self class stampTabImage;
> +               setNamePropertyTo: 'stampTab';
> +               actionSelector: #toggleStamps; target: self;
> +               position: self position + (9 at image height);
> +               bounds: (stampTab position extent: stampTab onImage extent).
> +       self addMorph: stampTab.
> +
> +       (shapeTab := ThreePhaseButtonMorph new)
> +               onImage: self class shapeTabImage;
> +               offImage: self class shapeTabImage;
> +               pressedImage: self class shapeTabImage;
> +               setNamePropertyTo: 'shapeTab';
> +               actionSelector: #toggleShapes; target: self;
> +               position: self position + (image width - shapeTab onImage width-9 at image height);
> +               bounds: (shapeTab position extent: shapeTab onImage extent).
> +       self addMorph: shapeTab.
> +
> +       self layoutChanged.
> +
> +       (stamps := self class stampsImage asMorph)
> +               setNamePropertyTo: 'stamps';
> +               visible: false;
> +               position: self position + (0@(image height - stamps image height)).
> +       self addMorph: stamps.
> +
> +       (shapes := self class shapesImage asMorph)
> +               setNamePropertyTo: 'shapes';
> +               visible: false;
> +               position: self position + (image width - shapes image width at image height).
> +       self addMorph: shapes.!
>
> Item was changed:
> + ----- Method: PaintBoxMorph>>addTextualLabels (in category 'initialization') -----
> - ----- Method: PaintBoxMorph>>addTextualLabels (in category 'other') -----
>   addTextualLabels
>         "translate button labels"
>
>         #('keep:' 'undo:' 'clear:' 'toss:') with: #('KEEP' 'UNDO' 'CLEAR' 'TOSS') do: [:extName :label |
>                 | button |
>                 button := submorphs detect: [:m | m externalName = extName] ifNone: [nil].
>                 button ifNotNil: [
>                         button removeAllMorphs.
>                         button addMorph: (TextMorph new
>                                 contentsWrapped: (Text string: label translated
>                                         attributes: {
>                                                 TextAlignment centered.
>                                                 TextEmphasis bold.
>                                                 TextFontReference toFont:
>                                                         (Preferences standardPaintBoxButtonFont)});
>                                 bounds: (button bounds translateBy: 0 at 3);
>                                 lock)]]!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>addToolsOffImage:onImage: (in category 'initialization') -----
> + addToolsOffImage: offImage onImage: onImage
> +       | posSpec actionSpec |
> +       posSpec := #(
> +               (13 53 13 53) "offset X"
> +               (13 13 61 61) "offset Y"
> +               (40 40 40 40) "width"
> +               (48 48 44 44) "height").
> +       actionSpec := #(tool:action:cursor:evt: tool:action:cursor:evt: eyedropper:action:cursor:evt: tool:action:cursor:evt:).
> +       #(paint: fill: eyedropper: erase:) keysAndValuesDo: [:index :name |
> +               | button rect |
> +               (self submorphNamed: name) ifNil:
> +                       [rect := ((posSpec at: 1) at: index) @ ((posSpec at: 2) at: index)
> +                                       extent: ((posSpec at: 3) at: index) @ ((posSpec at: 4) at: index).
> +                       (button := ThreePhaseButtonMorph new)
> +                               onImage: (onImage copy: rect);
> +                               offImage: (offImage copy: rect);
> +                               pressedImage: (onImage copy: rect);
> +                               bounds: (rect translateBy: self position);
> +                               setNamePropertyTo: name;
> +                               actionSelector: (actionSpec at: index);
> +                                       arguments: (Array with: button with: name with: (self makeCursorFrom: (offImage copy: rect)));
> +                               actWhen: #buttonUp; target: self.
> +                       self addMorph: button.]].
> +
> + !
>
> Item was added:
> + ----- Method: PaintBoxMorph>>buildAPrototype (in category 'initialization') -----
> + buildAPrototype
> +       | onImage |
> +       self initialize.
> +       self image: self class paletteImage.
> +       rotationTabForm := self class rotationTabImage.
> +       scaleTabForm := self class scaleTabImage.
> +       (colorMemoryThin := self class colorMemoryThinImage asMorph)
> +               setNamePropertyTo: 'ColorPickerClosed';
> +               position: self position + (11 at 150);
> +               on: #mouseEnter send: #showColorPalette: to: self.
> +       self addMorph: colorMemoryThin.
> +       (colorMemory := PaintBoxColorPicker new image: self class colorMemoryImage)
> +               setNamePropertyTo: 'ColorPickerOpened';
> +               on: #mouseDown send: #takeColorEvt:from: to: self.
> +
> +       onImage := self class paletteOnImage.
> +       self
> +               addToolsOffImage: image onImage: onImage;
> +               addBrushesOffImage: image onImage: onImage;
> +               addActionsOffImage: image onImage: onImage;
> +               addStampsAndShapes;
> +               addShapeButtonsOffImage: self class shapesImage onImage: self class shapesOnImage;
> +               addStampButtonsOffImage: self class stampsImage onImage: self class stampsOnImage.
> +       stampHolder := ScrollingToolHolder newPrototypeFor: self!
>
> Item was added:
> + ----- Method: PaintBoxMorph>>makeCursorFrom: (in category 'initialization') -----
> + makeCursorFrom: aForm
> +       | cursor map index colorToReplace |
> +       cursor :=  aForm as8BitColorForm.
> +       map := Color indexedColors.
> +       index := cursor pixelValueAt: 2 at 2.
> +       colorToReplace := map at: index.
> +       cursor colors: (map collect: [:color | (color diff: colorToReplace) < 0.25
> +               ifTrue: [Color transparent]
> +               ifFalse: [color]]).
> +       ^cursor
> +
> +
> + !
>
> Item was added:
> + ----- Method: ScrollingToolHolder class>>newPrototype (in category 'instance creation') -----
> + newPrototype
> +       ^self new buildAPrototype!
>
> Item was added:
> + ----- Method: ScrollingToolHolder class>>newPrototypeFor: (in category 'instance creation') -----
> + newPrototypeFor: aPaintBoxMorph
> +       ^self new buildAPrototypeFor: aPaintBoxMorph!
>
> Item was added:
> + ----- Method: ScrollingToolHolder>>buildAPrototypeFor: (in category 'initialize-release') -----
> + buildAPrototypeFor: aPaintBoxMorph
> +       pickupButtons := (aPaintBoxMorph submorphNamed: 'stamps') submorphs select: [:e | e externalName = 'pickup:'].
> +       stampButtons := (aPaintBoxMorph submorphNamed: 'stamps') submorphs select: [:e | e externalName = 'stamp:'].
> +       stamps := OrderedCollection new: 3 withAll: nil.
> +       thumbnailPics := OrderedCollection new: 3 withAll: nil.
> +       start := 3.!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>clear (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>clear (in category 'as yet unclassified') -----
>   clear
>         "wipe out all existing stamps"
>
>         stamps := OrderedCollection new: 16.
>         thumbnailPics := OrderedCollection new: 16.
>         stampButtons do: [:each |
>                 stamps addLast: nil.    "hold a space"
>                 thumbnailPics addLast: nil].
>         start := 1.
>         self normalize.!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>normalize (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>normalize (in category 'as yet unclassified') -----
>   normalize
>         "Correspondence between buttons and stamp forms has changed.  Make all thumbnails show up right."
>
>         | shrunkForm button trans |
>         1 to: stampButtons size do: [:ind |
>                 shrunkForm := thumbnailPics atWrap: ind+start-1.
>                 button := stampButtons at: ind.
>                 shrunkForm
>                         ifNil: [trans := Form extent: button extent depth: 8.
>                                 trans fill: trans boundingBox fillColor: Color transparent.
>                                 button onImage: trans]
>                         ifNotNil: [button onImage: shrunkForm].
>                 button offImage: shrunkForm; pressedImage: shrunkForm.  "later modify them"
>                 ].!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>otherButtonFor: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>otherButtonFor: (in category 'as yet unclassified') -----
>   otherButtonFor: aButton
>         "Find the corresponding button for either a pickup or a stamp button"
>
>         | ii |
>         (ii := pickupButtons indexOf: aButton) > 0 ifTrue: [^ stampButtons at: ii].
>         (ii := stampButtons indexOf: aButton) > 0 ifTrue: [^ pickupButtons at: ii].
>         self error: 'stamp button not found'.!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>pickupButtons (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>pickupButtons (in category 'as yet unclassified') -----
>   pickupButtons
>
>         ^ pickupButtons!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>pickupButtons: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>pickupButtons: (in category 'as yet unclassified') -----
>   pickupButtons: anArray
>         "Save the list of buttons that are for making a new stamp.  Left to right"
>
>         pickupButtons := anArray!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>remove: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>remove: (in category 'as yet unclassified') -----
>   remove: tool
>         "Remove a stamp.  Make this stamp blank.  OK to have a bunch of blank ones."
>
>         | which |
>         which := stampButtons indexOf: tool ifAbsent: [
>                                 pickupButtons indexOf: tool ifAbsent: [^ self]].
>         stamps atWrap: which+start-1 put: nil.
>         thumbnailPics atWrap: which+start-1 put: nil.
>         self normalize. "show them"!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>scroll: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>scroll: (in category 'as yet unclassified') -----
>   scroll: amt
>         "Move the stamps over"
>
>         start := start - 1 + amt \\ stamps size + 1.
>         self normalize. "show them"!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>stampButtons (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>stampButtons (in category 'as yet unclassified') -----
>   stampButtons
>
>         ^ stampButtons!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>stampButtons: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>stampButtons: (in category 'as yet unclassified') -----
>   stampButtons: anArray
>         "Pop in a new list of buttons that are the tools for stamping.  Left to right"
>
>         stampButtons := anArray.
>         self clear.!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>stampForm:for: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>stampForm:for: (in category 'as yet unclassified') -----
>   stampForm: stampForm for: aPickupButton
>         "Install this form to stamp. Find its index.  Make a thumbnail."
>
>         | which scale shrunkForm stampBtn mini |
>         which := pickupButtons indexOf: aPickupButton.
>         which = 0 ifTrue: [which := stampButtons indexOf: aPickupButton].
>         stamps atWrap: which+start-1 put: stampForm.
>
>         "Create the thumbnail"
>         stampBtn := stampButtons at: which.
>         scale := stampBtn width / (stampForm extent x max: stampForm extent y).
>         scale := scale min: 1.0.        "do not expand it"
>         mini := stampForm magnify: stampForm boundingBox by: scale smoothing: 1.
>         shrunkForm := mini class extent: stampBtn extent depth: stampForm depth.
>         mini displayOn: shrunkForm at: (stampBtn extent - mini extent)//2.
>         thumbnailPics atWrap: which+start-1 put: shrunkForm.
>         stampBtn offImage: shrunkForm; onImage: shrunkForm; pressedImage: shrunkForm.
>                 "Emphasis is done by border of enclosing layoutMorph, not modifying image"
>
>         (stamps indexOf: nil) = 0 ifTrue: ["Add an extra blank place"
>                 "Keep stamp we just installed in the same location!!"
>                 start+which-1 > stamps size ifTrue: [start := start + 1].
>                 stamps addLast: nil.
>                 thumbnailPics addLast: nil.
>                 self normalize].
>   !
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>stampFormFor: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>stampFormFor: (in category 'as yet unclassified') -----
>   stampFormFor: aButton
>
>         | which |
>         which := stampButtons indexOf: aButton ifAbsent: [1].
>         ^ stamps atWrap: which+start-1!
>
> Item was changed:
> + ----- Method: ScrollingToolHolder>>updateReferencesUsing: (in category 'accessing') -----
> - ----- Method: ScrollingToolHolder>>updateReferencesUsing: (in category 'as yet unclassified') -----
>   updateReferencesUsing: aDictionary
>         "Fix up the Morphs I own"
>         "Note: Update this method when adding new inst vars that could contain Morphs."
>
>         stampButtons := stampButtons collect:
>                 [:old | aDictionary at: old ifAbsent: [old]].
>         pickupButtons := pickupButtons collect:
>                 [:old | aDictionary at: old ifAbsent: [old]].
>   !
>
>


More information about the Squeak-dev mailing list