added changeHue
authorClaus Gittinger <cg@exept.de>
Mon, 04 Nov 2002 21:18:07 +0100
changeset 1649 80586cf27eb8
parent 1648 d88ec5777284
child 1650 cb63d6bf76c1
added changeHue
ImageEditor.st
--- a/ImageEditor.st	Mon Nov 04 17:07:37 2002 +0100
+++ b/ImageEditor.st	Mon Nov 04 21:18:07 2002 +0100
@@ -908,6 +908,101 @@
       )
 !
 
+hueShiftDialogSpec
+    "This resource specification was automatically generated
+     by the UIPainter of ST/X."
+
+    "Do not manually edit this!! If it is corrupted,
+     the UIPainter may not be able to read the specification."
+
+    "
+     UIPainter new openOnClass:ImageEditor andSelector:#hueShiftDialogSpec
+     ImageEditor new openInterface:#hueShiftDialogSpec
+    "
+
+    <resource: #canvas>
+
+    ^ 
+     #(#FullSpec
+        #name: #hueShiftDialogSpec
+        #window: 
+       #(#WindowSpec
+          #label: 'Shift Hue'
+          #name: 'Shift Hue'
+          #min: #(#Point 10 10)
+          #max: #(#Point 800 478)
+          #bounds: #(#Rectangle 16 46 261 229)
+        )
+        #component: 
+       #(#SpecCollection
+          #collection: #(
+           #(#LabelSpec
+              #label: 'Hue-Shift:'
+              #name: 'HueLabel'
+              #layout: #(#LayoutFrame 14 0 21 0 90 0 43 0)
+              #translateLabel: true
+              #adjust: #right
+            )
+           #(#InputFieldSpec
+              #name: 'HueShiftEntryField'
+              #layout: #(#LayoutFrame 95 0 21 0 138 0 43 0)
+              #tabable: true
+              #model: #hueShiftAmount
+              #type: #number
+              #acceptChannel: #acceptChannel
+              #acceptOnPointerLeave: false
+            )
+           #(#HorizontalPanelViewSpec
+              #name: 'HorizontalPanel1'
+              #layout: #(#LayoutFrame 0 0.0 -30 1 0 1.0 0 1)
+              #horizontalLayout: #fitSpace
+              #verticalLayout: #center
+              #horizontalSpace: 3
+              #verticalSpace: 3
+              #reverseOrderIfOKAtLeft: true
+              #component: 
+             #(#SpecCollection
+                #collection: #(
+                 #(#ActionButtonSpec
+                    #label: 'Cancel'
+                    #name: 'Button1'
+                    #translateLabel: true
+                    #tabable: true
+                    #model: #cancel
+                    #extent: #(#Point 118 22)
+                  )
+                 #(#ActionButtonSpec
+                    #label: 'OK'
+                    #name: 'Button2'
+                    #translateLabel: true
+                    #tabable: true
+                    #model: #accept
+                    #extent: #(#Point 118 22)
+                  )
+                 )
+               
+              )
+            )
+           #(#ThumbWheelSpec
+              #name: 'ThumbWheel1'
+              #layout: #(#LayoutFrame 60 0 83 0 177 0 103 0)
+              #model: #hueShiftAmount
+              #orientation: #horizontal
+              #step: 1
+              #endlessRotation: true
+            )
+           #(#LabelSpec
+              #name: 'HueColorLabel'
+              #layout: #(#LayoutFrame 5 0 109 0 241 0 148 0)
+              #translateLabel: true
+              #backgroundChannel: #hueColor
+            )
+           )
+         
+        )
+      )
+!
+
 shiftDialogSpec
     "This resource specification was automatically generated
      by the UIPainter of ST/X."
@@ -985,7 +1080,7 @@
             )
            #(#ArrowButtonSpec
               #name: 'ArrowButton1'
-              #layout: #(#LayoutFrame 105 0 67 0 127 0 89 0)
+              #layout: #(#LayoutFrame 105 0 63 0 127 0 85 0)
               #model: #shiftUpNow
               #isTriggerOnDown: true
               #actionValue: ''
@@ -993,7 +1088,7 @@
             )
            #(#ArrowButtonSpec
               #name: 'ArrowButton2'
-              #layout: #(#LayoutFrame 88 0 86 0 110 0 108 0)
+              #layout: #(#LayoutFrame 84 0 86 0 106 0 108 0)
               #model: #shiftLeftNow
               #isTriggerOnDown: true
               #actionValue: ''
@@ -1001,7 +1096,7 @@
             )
            #(#ArrowButtonSpec
               #name: 'ArrowButton3'
-              #layout: #(#LayoutFrame 122 0 86 0 144 0 108 0)
+              #layout: #(#LayoutFrame 126 0 86 0 148 0 108 0)
               #model: #shiftRightNow
               #isTriggerOnDown: true
               #actionValue: ''
@@ -1009,7 +1104,7 @@
             )
            #(#ArrowButtonSpec
               #name: 'ArrowButton4'
-              #layout: #(#LayoutFrame 105 0 103 0 127 0 125 0)
+              #layout: #(#LayoutFrame 105 0 107 0 127 0 129 0)
               #model: #shiftDownNow
               #isTriggerOnDown: true
               #actionValue: ''
@@ -1740,145 +1835,188 @@
            #(#Menu
               #(
                #(#MenuItem
-                  #activeHelpKey: #colorMap8
-                  #label: '8-Plane'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '8-plane'
-                  #choice: #colorMapMode
-                  #choiceValue: '8-plane'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap4
-                  #label: '4-Plane'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '4-plane'
-                  #choice: #colorMapMode
-                  #choiceValue: '4-plane'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap2
-                  #label: '2-Plane'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '2-plane'
-                  #choice: #colorMapMode
-                  #choiceValue: '2-plane'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap1
-                  #label: '1-Plane'
-                  #itemValue: #colorMapMode:
+                  #label: 'Depth'
                   #translateLabel: true
-                  #argument: '1-plane'
-                  #choice: #colorMapMode
-                  #choiceValue: '1-plane'
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap8M
-                  #label: '8-Plane + Mask'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '8-plane + mask'
-                  #choice: #colorMapMode
-                  #choiceValue: '8-plane + mask'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap4M
-                  #label: '4-Plane + Mask'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '4-plane + mask'
-                  #choice: #colorMapMode
-                  #choiceValue: '4-plane + mask'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #colorMap2M
-                  #label: '2-Plane + Mask'
-                  #itemValue: #colorMapMode:
-                  #translateLabel: true
-                  #argument: '2-plane + mask'
-                  #choice: #colorMapMode
-                  #choiceValue: '2-plane + mask'
+                  #submenu: 
+                 #(#Menu
+                    #(
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap8
+                        #label: '8-Plane'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '8-plane'
+                        #choice: #colorMapMode
+                        #choiceValue: '8-plane'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap4
+                        #label: '4-Plane'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '4-plane'
+                        #choice: #colorMapMode
+                        #choiceValue: '4-plane'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap2
+                        #label: '2-Plane'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '2-plane'
+                        #choice: #colorMapMode
+                        #choiceValue: '2-plane'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap1
+                        #label: '1-Plane'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '1-plane'
+                        #choice: #colorMapMode
+                        #choiceValue: '1-plane'
+                      )
+                     #(#MenuItem
+                        #label: '-'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap8M
+                        #label: '8-Plane + Mask'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '8-plane + mask'
+                        #choice: #colorMapMode
+                        #choiceValue: '8-plane + mask'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap4M
+                        #label: '4-Plane + Mask'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '4-plane + mask'
+                        #choice: #colorMapMode
+                        #choiceValue: '4-plane + mask'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap2M
+                        #label: '2-Plane + Mask'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '2-plane + mask'
+                        #choice: #colorMapMode
+                        #choiceValue: '2-plane + mask'
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #colorMap1M
+                        #label: '1-Plane + Mask'
+                        #itemValue: #colorMapMode:
+                        #translateLabel: true
+                        #argument: '1-plane + mask'
+                        #choice: #colorMapMode
+                        #choiceValue: '1-plane + mask'
+                      )
+                     )
+                    nil
+                    nil
+                  )
                 )
                #(#MenuItem
-                  #activeHelpKey: #colorMap1M
-                  #label: '1-Plane + Mask'
-                  #itemValue: #colorMapMode:
+                  #label: 'Colors'
                   #translateLabel: true
-                  #argument: '1-plane + mask'
-                  #choice: #colorMapMode
-                  #choiceValue: '1-plane + mask'
-                )
-               #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #compressColormap
-                  #enabled: #hasColormap
-                  #label: 'Compress Colormap'
-                  #itemValue: #compressColorMap
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #enabled: #hasColormap
-                  #label: 'Sort Colormap'
-                  #itemValue: #sortColorMap
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: 'Reduce Number of Colors...'
-                  #itemValue: #reduceNumberOfColors
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: '-'
+                  #submenu: 
+                 #(#Menu
+                    #(
+                     #(#MenuItem
+                        #activeHelpKey: #compressColormap
+                        #enabled: #hasColormap
+                        #label: 'Compress Colormap'
+                        #itemValue: #compressColorMap
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #enabled: #hasColormap
+                        #label: 'Sort Colormap'
+                        #itemValue: #sortColorMap
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: 'Reduce Number of Colors...'
+                        #itemValue: #reduceNumberOfColors
+                        #translateLabel: true
+                      )
+                     )
+                    nil
+                    nil
+                  )
                 )
                #(#MenuItem
-                  #label: 'Make GrayScale'
-                  #itemValue: #makeGrayScale
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: 'Make Brighter'
-                  #itemValue: #makeBrighter
+                  #label: 'Process'
                   #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: 'Make Darker'
-                  #itemValue: #makeDarker
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: 'Make Inverse'
-                  #itemValue: #makeInverse
-                  #translateLabel: true
+                  #submenu: 
+                 #(#Menu
+                    #(
+                     #(#MenuItem
+                        #label: 'Make GrayScale'
+                        #itemValue: #makeGrayScale
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: 'Make Brighter'
+                        #itemValue: #makeBrighter
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: 'Make Darker'
+                        #itemValue: #makeDarker
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: 'Make Inverse'
+                        #itemValue: #makeInverse
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: '-'
+                      )
+                     #(#MenuItem
+                        #label: 'Change Hue...'
+                        #itemValue: #changeHue
+                        #translateLabel: true
+                      )
+                     )
+                    nil
+                    nil
+                  )
                 )
                #(#MenuItem
-                  #label: '-'
-                )
-               #(#MenuItem
-                  #activeHelpKey: #copyMask
-                  #enabled: #hasMask
-                  #label: 'Copy Mask'
-                  #itemValue: #copyMask
+                  #label: 'Mask'
                   #translateLabel: true
-                )
-               #(#MenuItem
-                  #activeHelpKey: #pasteMask
-                  #enabled: #hasMask
-                  #label: 'Paste Mask'
-                  #itemValue: #pasteMask
-                  #translateLabel: true
-                )
-               #(#MenuItem
-                  #label: 'Clear Masked Pixels'
-                  #itemValue: #clearMaskedPixels
-                  #translateLabel: true
+                  #submenu: 
+                 #(#Menu
+                    #(
+                     #(#MenuItem
+                        #activeHelpKey: #copyMask
+                        #enabled: #hasMask
+                        #label: 'Copy Mask'
+                        #itemValue: #copyMask
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #activeHelpKey: #pasteMask
+                        #enabled: #hasMask
+                        #label: 'Paste Mask'
+                        #itemValue: #pasteMask
+                        #translateLabel: true
+                      )
+                     #(#MenuItem
+                        #label: 'Clear Masked Pixels'
+                        #itemValue: #clearMaskedPixels
+                        #translateLabel: true
+                      )
+                     )
+                    nil
+                    nil
+                  )
                 )
                )
               nil
@@ -3073,6 +3211,46 @@
     "Modified: / 16.3.1999 / 21:57:26 / cg"
 !
 
+changeHue
+    "let user specify amount and shift"
+
+    |bindings shiftAmount originalColormap img firstChange shiftAction acceptChannel hueColorHolder|
+
+    originalColormap := imageEditView image colorMap copy.
+
+    acceptChannel := TriggerValue new.
+
+    firstChange := true.
+
+    shiftAction := 
+        [
+            acceptChannel value:true.
+
+            firstChange ifTrue:[
+                imageEditView makeUndo.
+                firstChange := false.
+            ].
+            hueColorHolder value:(Color hue:shiftAmount value light:50 saturation:100).
+            imageEditView image colorMap:originalColormap copy.
+            imageEditView image colorMapProcessing:[:clr | Color hue:((clr hue) ? 0+shiftAmount value) light:clr light saturation:clr saturation].
+            self updateImage.
+            self updateInfoLabel.
+        ].
+
+    bindings := IdentityDictionary new.
+    bindings at:#hueShiftAmount put:(shiftAmount := 0 asValue).
+    (bindings at:#hueShiftAmount) onChangeEvaluate:shiftAction.
+    bindings at:#acceptChannel put:acceptChannel.
+    bindings at:#hueColor put:(hueColorHolder := Color white asValue).
+
+    (self openDialogInterface:#hueShiftDialogSpec withBindings:bindings) 
+    ifFalse:[ 
+        firstChange ~~ true ifTrue:[
+            imageEditView undo
+        ]
+    ].
+!
+
 clearMaskedPixels
     "clear all masked pixels (to pixelValue 0)"