-- SOUNDLEVEL SLIDER -- -- -- March 2001, James Newton , -- based on a behavior by Michael Nadel -- PROPERTY DECLARATIONS -- property spriteNum property sliderSprite property constraintSprite property orientation property showLevel property levelField property playSound property soundMember property myMin -- position for the soundLevel = 0 property myMax -- position for the soundLevel = 7 property myStep -- pixels to move between adjacent levels property myLevel -- last recorded value for the soundLevel property myMouseDown -- TRUE if the user is using this control -- EVENT HANDLERS -- on beginSprite(me) me.initialize() end beginSprite on mouseDown(me) myMouseDown = TRUE end mouseDown on mouseUp(me) myMouseDown = FALSE if playSound = #mouseUp then puppetsound soundMember end if end mouseUp on mouseUpOutside(me) me.mouseUp() end mouseUpOutside on exitFrame(me) if myMouseDown then me.dragSlider() else if the soundLevel <> myLevel then -- Adjust slider automatically me.showSoundLevel() end if end exitFrame -- PRIVATE METHODS -- on initialize(me) ---------------------------------------------------- -- Sent by beginSprite() -- -- Sets initial property values and places the slider sprite -- appropriately. -------------------------------------------------------------------- if sprite sliderSprite within constraintSprite then -- Convert channel numbers to sprite references sliderSprite = sprite(sliderSprite) constraintSprite = sprite(constraintSprite) else -- Center slider on constraint -- Convert channel numbers to sprite references sliderSprite = sprite(sliderSprite) constraintSprite = sprite(constraintSprite) centerH = (constraintSprite.left + constraintSprite.right) / 2 centerV = (constraintSprite.top + constraintSprite.bottom) / 2 slideLeft = centerH - sliderSprite.width / 2 slideTop = centerV - sliderSprite.height / 2 hAdjust = sliderSprite.locH - sliderSprite.left vAdjust = sliderSprite.locV - sliderSprite.top sliderSprite.loc = point(slideLeft + hAdjust, slideTop + vAdjust) end if -- Convert playSound to symbol playTimesList = me.getPlayTimesList(FALSE) playSound = playTimesList.getOne(playSound) case orientation of #vertical: -- Ensure slider remains entirely inside constraint minAdjust = sliderSprite.locV - sliderSprite.bottom maxAdjust = sliderSprite.locV - sliderSprite.top myMin = constraintSprite.bottom + minAdjust myMax = constraintSprite.top + maxAdjust -- Set initial position of slider myStep = (myMax - myMin) / 7.0 #horizontal: -- Ensure slider remains entirely inside constraint minAdjust = sliderSprite.locH - sliderSprite.left maxAdjust = sliderSprite.locH - sliderSprite.right myMin = constraintSprite.left + minAdjust myMax = constraintSprite.right + maxAdjust -- Set initial position of slider myStep = (myMax - myMin) / 7.0 end case -- Show slider at appropriate position me.showSoundLevel() end initialize on dragSlider(me) ---------------------------------------------------- -- Sent by exitFrame() if the slider is being dragged -- -- Move the slider sprite as necessary and updates the soundLevel. -------------------------------------------------------------------- case orientation of #vertical: position = min(myMin, max(the mouseV, myMax)) newLevel = integer((position - myMin) / myStep) if myLevel = newLevel then exit end if -- The soundLevel will be changed, move the slider sliderSprite.locV = myMin + (newLevel * myStep) #horizontal: position = max(myMin, min(the mouseH, myMax)) newLevel = integer((position - myMin) / myStep) if myLevel = newLevel then exit end if -- The soundLevel will be changed, move the slider sliderSprite.locH = myMin + (newLevel * myStep) end case the soundLevel = newLevel me.showSoundLevel(newLevel) if playSound = #whileDragging then puppetsound soundMember end if end dragSlider on showSoundLevel(me, newLevel) if integerP(newLevel) then myLevel = newLevel else myLevel = the soundLevel end if case orientation of #vertical: sliderSprite.locV = myMin + (myLevel * myStep) #horizontal: sliderSprite.locH = myMin + (myLevel * myStep) end case -- Update field if necessary if showLevel then levelField.text = string(myLevel) end if end showSoundLevel -- UTILITY HANDLER -- on getPlayTimesList(me, asLinearList) -------------------------------- -- Sent by getPropertyDescriptionList() and beginSprite() -- -- Allows one-stop localization of the Behavior Parameters Dialog. -------------------------------------------------------------------- playTimesList = [ \ #never: "never", \ #mouseUp: "when mouse is released", \ #whileDragging: "when slider is dragged to a new level" \ ] if asLinearList then temp = playTimesList counter = temp.count playTimesList = [] repeat with i = 1 to counter playTimesList.append(temp[i]) end repeat end if return playTimesList end getPlayTimesList -- BEHAVIOR DESCRIPTION AND PARAMETERS -- on isOKToAttach(me, spriteType, spriteNumber) return spriteType = #graphic end isOKToAttach on getPropertyDescriptionList(me) propertiesList = [:] playTimesList = me.getPlayTimesList(TRUE) propertiesList[ \ #sliderSprite] = [ \ #comment: "Slider sprite:", \ #format: #integer, \ #range: [#min: 1, #max: the lastChannel], \ #default: the currentSpriteNum \ ] propertiesList[ \ #constraintSprite] = [ \ #comment: "Constraint slider to the rect of sprite:", \ #format: #integer, \ #range: [#min: 1, #max: the lastChannel], \ #default: the currentSpriteNum\ ] propertiesList[ \ #orientation] = [ \ #comment: "Orientation of slider:", \ #format: #symbol, \ #range: [#vertical, #horizontal], \ #default: #vertical \ ] propertiesList[ \ #showLevel] = [ \ #comment: "Display the soundLevel?", \ #format: #boolean, \ #default: FALSE \ ] propertiesList[ \ #levelField] = [ \ #comment: "Field to display soundLevel:", \ #format: #field, \ #default: member 1 \ ] propertiesList[ \ #playSound] = [ \ #comment: "Play test sound", \ #format: #string, \ #range: playTimesList, \ #default: playTimesList[1] \ ] propertiesList[ \ #soundMember] = [ \ #comment: "Test sound member:", \ #format: #sound, \ #default: member 1 \ ] return propertiesList end getPropertyDescriptionList on getBehaviorTooltip(me) return \ "Add to a slider sprite and/or the sprite"&RETURN&\ "that constrains the movement of the slider"&RETURN&\ "to create a soundLevel control." end getBehaviorTooltip on getBehaviorDescription me return \ "SOUNDLEVEL SLIDER"&RETURN&RETURN&\ "Allows you to make your own custom SoundLevel Slider with just 2 sprites: a slider sprite and a sprite which constrains the movement of the slider. You can attach the behavior to the slider sprite, to the constraint sprite or both. Try attaching it only to the constraint sprite: if no behaviors are attached to the slider sprite, clicks will pass through it and be handled by the constraint sprite behavior. The constraint sprite does not need to be visible."&RETURN&RETURN&\ "The slider will adjust its position automatically if the soundLevel is modified via any other method."&RETURN&RETURN&\ "PARAMETERS:"&RETURN&\ " * Slider sprite"&RETURN&\ " * Constraint sprite used to define the slider's position and dimensions"&RETURN&\ " * Orientation of the slider (horizontal | vertical)"&RETURN&RETURN&\ " * Use field member to display soundLevel? (TRUE | FALSE)"&RETURN&\ " * Field member in which to display current soundLevel"&RETURN&\ " * Test sound member to play to indicate new soundLevel"&RETURN&\ " * When to play the test sound (never | on mouseUp | while dragging)" end getBehaviorDescription