What do you suppose about this ?

from Hans  the Byte Surfer.




ViewManager subclass: #GraphicsDemo
  instanceVariableNames:
    'pen graphs selectedGraph pane bitmap '
  classVariableNames:
    'Count '
  poolDictionaries:
    'ColorConstants '    !


!GraphicsDemo class methods !

initialize
        "Private - Set the color count to 0."
    Count := 0.! !



!GraphicsDemo methods !

animationMenu
        "Private - Answer the animation menu."
    ^(Menu
         labels: 'Big red\Little blue\Spider\Stop\Clear' withCrs
         lines: #()
selectors: #(bigRed littleBlue spider deactivateAnimation clearAnimation))
             title: '&Animation';
             owner: self;
             yourself!

bigRed
        "Private - Create a red animated mandala."
    | mandala |
    mandala := AnimatedObject mandala: 11 diameter: 72 color: ClrRed.
    pane addObject: mandala.
    mandala display!

cleanUp
        "Private - Clean up GraphicsDemo before closing."

    self clearAnimation.
    bitmap notNil
        ifTrue: [bitmap release].!

clearAnimation
        "Private - Clear the animation."
    | objects |
    objects := pane contents.
    pane clear.
    objects do: [: each | each frames do: [: f | f release]]!

close: aPane
         "Private - Release the bitmaps of the animated objects."

    Smalltalk isRunTime
        ifTrue: [
            (MessageBox confirm: 'Are you sure you want to exit?')
                ifTrue: [
                    self cleanUp.
                    self close.
                    ^Smalltalk exit]
                ifFalse: [
                    ^self]]
        ifFalse: [
            self cleanUp.
            Transcript notNil ifTrue:[
                Transcript enableDemo].
            ^super close].!

copyMetaFile
        "Copy a metafile to the clipboard."
    | storedPicture |
    storedPicture := pen segments at: (graphs at: #mandala).
    storedPicture isNil ifTrue: [^self].
    storedPicture pen width: pen width;
    height: pen height.
    Clipboard setMetaFile: storedPicture!

deactivateAnimation
        "Private - Stop the animation."
    pane stopAll!

display: aPane
         "Private - Display aPane contents."
    selectedGraph isNil
        ifTrue: [pen erase]
        ifFalse: [
            selectedGraph = #displayBitmap
                ifTrue: [^self displayBitmap].
            graphs at: selectedGraph ifAbsent: [^self].
            pen erase.
            pen drawSegment: (graphs at: selectedGraph)]!

displayBitmap
        "Private - Paste the bitmap."
    bitmap notNil
        ifTrue:[
           pen copyBitmap: bitmap
              from: bitmap boundingBox
              to: (0 @ 0 extent: pen extent)]!

drag: aPane
        "Private - Track the mouse."
     | animatedObject |
    animatedObject := aPane childAt: aPane mouseLocation.
    animatedObject notNil
        ifTrue: [animatedObject drag: aPane mouseLocation].
    aPane when: #button1Move perform: nil!

dragon
        "Private - Draw a dragon pattern where anInteger
         is the recursion factor."
   self drawBlockNow: [
        pen
            home;
            north;
            dragon: 11]
        for: #dragon!

drawBlock: aBlock for: symbol
        "Private - Draw the selected graphics in a segment
            and make a backup."
    | intState wasActive |
    wasActive := pane stop.
    pen erase.
    selectedGraph := symbol.
    (graphs includesKey: symbol)
        ifFalse: [
            graphs at: symbol put: (pen retainPicture: aBlock)].
    self display: nil.
    pane makeBackup.
    wasActive ifTrue: [pane go]!

drawBlockNow: aBlock for: symbol
        "Private - Draw the selected graphics and make a
          backup of the receiver."
    | intState wasActive |
    wasActive := pane stop.
    pen erase.
    selectedGraph := symbol.
    (graphs includesKey: symbol)
        ifTrue: [self display: nil]
        ifFalse: [
            graphs at: symbol put: (pen drawRetainPicture: aBlock)].
    pane makeBackup.
    wasActive ifTrue: [pane go]!

drawMandalas
        "Private - Draw 8 mandalas."
    (Commander pen: 8 forDC: pen handle medium: pane)
          place: (self mainView rectangle extent) // 2;
          fanOut;
          up;
          go: 90;
          down;
          mandala: 12 diameter: 170 initDir: 270!

drawSpirals
        "Private - Draw 4 spirals."
    | commander |
    commander := (Commander pen: 4 forDC: pen handle medium: pane).
    commander
        place: (self mainView rectangle extent) // 2;
        fanOut;
        up;
        go: 90;
        down.
    1 to: 180 do: [: i |
        commander
            go: i;
            turn: 122]!

drawWalkLine
        "Private - Draw rotating lines."
    | incrX incrY numberOfLines boundX |
    numberOfLines := 60.
    incrX := pen width / numberOfLines.
    incrY := pen height / numberOfLines.
    boundX := (incrX * (numberOfLines)).
    1 to: numberOfLines + 1 do: [: i |
          pen
              foreColor: (GraphicsTool paletteIndex: (
                  (Count := Count + 1) \\ 7 + 1));
              place: (i - 1 * incrX) rounded @ 0;
              goto: (boundX - (i * incrX) @ (i * incrY)) rounded]!

drawWith: graphPane
        "Private - Assign the receiver's pen."
    pen := graphPane pen!

graphicsMenu: aPane
        "Private - Set the menu for the graph pane."
    aPane setMenu: (
             (Menu
labels: '&Walk Line\&Mandala\M&ulti Mandala\&Dragon\Multi &Spiral\&Paste' withCrs
                   lines: #()
selectors: #(walkLine mandala multiMandala dragon multiSpiral paste))
                 title: '&Graphics';
                 owner: self;
                 yourself)!

initWindowSize
        "Private - Answer default initial window extent."
    ^Display extent * 7 // 8!

littleBlue
        "Private - Create a blue animated mandala."
    | mandala |
    mandala := AnimatedObject mandala: 9 diameter: 48 color: ClrBlue.
    pane addObject: mandala.
    mandala display!

mandala
        "Private - Draw a mandala."
    pen home.
    self drawBlockNow: [
        pen  mandala: 20 diameter: pen height * 7 // 8]
        for: #mandala!

mouseDown: aPane
        "Private - Process a mouse down event."
    | aPoint animatedObject |
    aPoint := aPane mouseLocation.
    animatedObject := aPane childAt: aPoint.
    animatedObject notNil ifTrue: [
        ^aPane when: #button1Move perform: #drag:]!

multiMandala
        "Private - Draw 8 mandalas."
    self drawBlockNow: [self drawMandalas]
        for: #multiMandala!

multiSpiral
        "Private - Draw 4 spirals."
    self drawBlockNow: [self drawSpirals]
        for: #multiSpiral!

open
        "Open the graphics demo window."
    graphs := Dictionary new.
    self label: 'Graphics Demo';
        foreColor: ClrBlack;
        backColor: ClrWhite;
        when: #close perform: #close:;
        owner: self.
    self addSubpane: (pane := AnimationPane new
        owner: self;
        when: #getContents perform: #drawWith:;
        when: #display perform: #display:;
        when: #button1Down perform: #mouseDown:;
        when: #getMenu perform: #graphicsMenu:).
    self openWindow.
    self menuWindow addMenu: self animationMenu.!

paste
        "Private - Paste a bitmap from the clipboard to window."
    selectedGraph := #displayBitmap.
    bitmap notNil ifTrue: [bitmap release].
    (bitmap := Clipboard getBitmap) isNil ifTrue: [^self].
    self displayBitmap.
    pane makeBackup!

pasteMetaFile
        "Paste a metafile from the clipboard."
    | storedPicture |
    storedPicture := Clipboard getMetaFile.
    storedPicture isNil ifTrue: [^self].
    pen erase.
    storedPicture play: pen!

setScale
        "Private - Set the scale for displaying selected graph demo."
     | scale |
     scale := (pen  width * 2 / pen width) @ (pen height * 2 /
         pen height).
     (pen setScale: scale) = 1
         ifFalse: [^self error: 'setScale error'].
     self perform: selectedGraph!

spider
        "Private - Create a spider chaser."
    | spider |
    spider := AnimatedObject spider: 100.
    pane addObject: spider.
    spider endBlock: [: s | Menu message: 'Gotcha!! !!'].
    spider display.
    spider animate!

walkLine
        "Private - Draw rotating lines."
    self drawBlock: [self drawWalkLine]
        for: #walkLine! !


Reply via email to