If you are serious about mobile development using CoronaSDK there is one tool you should definitely check out, Corona Project Manager by J. A. Whye. For me, it’s an organic extension to CoronaSDK and makes it very easier to work with.
One of the most important features of CPM is the autocomplete function. It speeds up my coding but also it reminds me the functions I might have forgotten at the time, or functions recently added which might make things easier. Because of that, I’d like to keep it up-to-date. You may copy & paste the following list to keep yours updated as well! ;)
Updated on December 9, 2011 for Corona SDK 2011.701+
analytics.init ( )
analytics.logEvent ( )
and
assert( )
audio.dispose ( )
audio.fade ( [ { [channel=] [, time=] [, volume= ] } ] )
audio.fadeOut ( [ { [channel=] [, time=] } ] )
audio.findFreeChannel ( )
audio.freeChannels
audio.getDuration ( )
audio.getMaxVolume ( { channel= } )
audio.getMinVolume ( { channel= } )
audio.getVolume ( [ { channel= } ] )
audio.isChannelActive ( )
audio.isChannelPaused ( )
audio.isChannelPlaying ( )
audio.loadSound ( )
audio.loadStream ( )
audio.pause ( )
audio.play ( [, { [channel=] [, loops=] [, duration=] [, fadein=] [, onComplete=] } ] )
audio.reserveChannels ( )
audio.reservedChannels
audio.resume ( )
audio.rewind ( [ ] [, { channel= } ] )
audio.seek ( [, { channel= } ] )
audio.setMaxVolume ( , { channel= } )
audio.setMinVolume ( , { channel= } )
audio.setVolume ( [,{ channel= }] )
audio.stop ( )
audio.stopWithDelay ( )
audio.totalChannels
audio.unreservedFreeChannels
audio.unreservedUsedChannels
audio.usedChannels
body.angularDamping
body.angularVelocity
body.bodyType
body.isAwake
body.isBodyActive
body.isBullet
body.isFixedRotation
body.isSleepingAllowed
body.linearDamping
body:applyAngularImpulse ( )
body:applyForce ( , , , )
body:applyLinearImpulse ( , , , )
body:applyTorque ( )
body:getLinearVelocity ( )
body:resetMassData ( )
body:setLinearVelocity ( , )
break
crypto.digest ( , )
crypto.hmac ( , , )
crypto.md4
crypto.md5
crypto.sha1
crypto.sha224
crypto.sha256
crypto.sha384
crypto.sha512
display.captureScreen ( )
display.contentCenterX
display.contentCenterY
display.contentHeight
display.contentScaleX
display.contentScaleY
display.contentWidth
display.getCurrentStage ( )
display.loadRemoteImage ( , , , )
display.newCircle( , , )
display.newGroup ( )
display.newImage( )
display.newImage( )
display.newImageRect ( , )
display.newLine( , , , )
display.newRect( , , , )
display.newRoundedRect( , , , , )
display.newText( "", , , , )
display.save ( , )
display.screenOriginX
display.screenOriginY
display.setDefault( , , , )
display.setStatusBar ( )
display.statusBarHeight
display.viewableContentHeight
display.viewableContentWidth
do
easing.inExpo ( , , , )
easing.inOutExpo ( , , , )
easing.inOutQuad ( , , , )
easing.inQuad ( , , , )
easing.linear ( , , , )
easing.outExpo ( , , , )
easing.outQuad ( , , , )
else
elseif
end
error ( )
event.accuracy
event.altitude
event.city
event.cityDetail
event.count
event.country
event.countryCode
event.delta
event.direction
event.errorCode
event.errorMessage
event.force
event.friction
event.geographic
event.id
event.invalidProducts
event.isError
event.isShake
event.latitude
event.longitude
event.magnetic
event.name
event.object1
event.object2
event.other
event.phase
event.postalCode
event.products
event.region
event.regionDetail
event.source
event.speed
event.sprite
event.street
event.streetDetail
event.time
event.transaction
event.type
event.url
event.x
event.xGravity
event.xInstant
event.xStart
event.y
event.yGravity
event.yInstant
event.yStart
event.zGravity
event.zInstant
facebook.login ( , )
facebook.logout ( )
facebook.request ( )
facebook.showDialog ( )
false
file:close ( )
file:flush ( )
file:lines ( )
file:read ( )
file:seek ( )
file:setvbuf ( )
file:write ( )
for
function
getfenv ( )
getmetatable ( )
group.numChildren
group:insert( , )
group:remove ( )
if
in
io.close ( )
io.flush ( )
io.input ( )
io.lines ( )
io.open ( )
io.output ( )
io.popen ( )
io.read ( )
io.tmpfile ( )
io.type ( )
io.write ( )
ipairs ( )
joint.dampingRatio
joint.frequency
joint.isLimitEnabled
joint.isMotorEnabled
joint.jointAngle
joint.jointSpeed
joint.jointTranslation
joint.length
joint.length1
joint.length2
joint.maxForce
joint.maxMotorForce
joint.maxMotorTorque
joint.maxTorque
joint.motorForce
joint.motorSpeed
joint.motorTorque
joint.ratio
joint:getAnchorA ( )
joint:getAnchorB ( )
joint:getLimits ( )
joint:getReactionForce ( )
joint:getRotationLimits ( )
joint:removeSelf ( )
joint:setLimits ( , )
joint:setRotationLimits ( , )
local
math.abs ( )
math.acos ( )
math.asin ( )
math.atan ( )
math.atan2 ( , )
math.ceil ( )
math.cos ( )
math.cosh ( )
math.deg ( )
math.exp ( )
math.floor ( )
math.fmod ( , )
math.frexp ( )
math.huge
math.ldexp ( , )
math.log ( )
math.log10 ( )
math.max ( , )
math.min ( , )
math.modf ( )
math.pi
math.pow ( , )
math.rad ( )
math.random ( )
math.randomseed ( )
math.sin ( )
math.sinh ( )
math.sqrt ( )
math.tan ( )
math.tanh ( )
media.getSoundVolume ( )
media.newEventSound ( )
media.newRecording( )
media.pauseSound ( )
media.playEventSound ( )
media.playSound( )
media.playSound( )
media.playVideo( , , )
media.setSoundVolume( )
media.show ( , )
media.stopSound ( )
module ( )
movieclip.newAnim ( )
myMap.isLocationVisible =
myMap.isScrollEnabled =
myMap.isZoomEnabled =
myMap.mapType =
myMap:addMarker ( , , [{ title="", subtitle="" } ] )
myMap:getAddressLocation ( )
myMap:getUserLocation ( )
myMap:removeAllMarkers ( )
myMap:setCenter ( , , )
myMap:setRegion ( , , , , )
native.cancelAlert ( )
native.cancelWebPopup ( )
native.getFontNames ( )
native.newFont ( )
native.newTextBox ( , , , )
native.newTextField ( , , , )
native.setActivityIndicator ( )
native.setKeyboardFocus ( )
native.showAlert ( , )
native.showWebPopup( )
native.showWebPopup( , , , , )
network.download ( , , , )
network.request ( , , )
next ( )
nil
not
object.align
object.alpha
object.baseUrl
object.font
object.hasBackground
object.height
object.isHitTestable
object.isSecure
object.isVisible
object.parent
object.play ( )
object.rotation
object.size
object.strokeWidth
object.text
object.urlRequest
object.width
object.x
object.xOrigin
object.xReference
object.xScale
object.y
object.yOrigin
object.yReference
object.yScale
object:addEventListener ( , )
object:dispatchEvent( )
object:getSampleRate ( )
object:getTunerFrequency ( )
object:getTunerVolume ( )
object:isRecording ( )
object:nextFrame ( )
object:play ( )
object:play { startFrame=, endFrame=, loop=, remove= }
object:previousFrame ( )
object:removeEventListener ( , )
object:reverse ( )
object:reverse { startFrame=, endFrame=, loop=, remove= }
object:rotate( )
object:scale ( , )
object:setDrag ( drag= )
object:setFillColor ( , , )
object:setLabels { frameLabel1=, frameLabel2=, frameLabelN= }
object:setReferencePoint ( )
object:setSampleRate( )
object:setStrokeColor ( , , )
object:setTextColor ( , , )
object:startRecording ( )
object:startTuner ( )
object:stop ( )
object:stopAtFrame ( )
object:stopRecording ( )
object:stopTuner ( )
object:translate ( , )
openfeint.downloadBlob ( , )
openfeint.init ( , , , )
openfeint.launchDashboard ( )
openfeint.launchDashboard ( , )
openfeint.setHighScore ( { leaderboardID=, score= } )
openfeint.unlockAchievement ( )
openfeint.uploadBlob ( , )
or
os.clock ( )
os.date ( )
os.difftime ( , )
os.execute( )
os.exit ( )
os.remove ( )
os.rename ( , )
os.time ( )
package.loaded
package.loaders
package.seeall ( )
pairs ( )
pcall ( , , )
physics.addBody ( , {density=, friction=, bounce= [,radius=]} )
physics.addBody ( , {density=, friction=, bounce= [,shape=]} )
physics.newJoint ( , , , , )
print ( )
rawequal ( , )
rawget ( , )
rawset ( , , )
removeSelf()
repeat
require ( )
return
select ( , )
setfenv ( , )
setmetatable ( , )
setReferencePoint(display.TopLeftReferencePoint)
sprite.add ( , , , , , )
sprite.newSpriteSet ( , , )
sprite.newSpriteSheet ( , , )
sprite.newSpriteSheetFromData( , )
spriteInstance.animating
spriteInstance.currentFrame
spriteInstance.newSprite ( )
spriteInstance.sequence
spriteInstance:addListener ( )
spriteInstance:pause ( )
spriteInstance:play ( )
spriteInstance:prepare ( )
spriteSheet:dispose ( )
stage:setFocus ( )
store.canMakePurchases
store.finishTransaction ( )
store.init ( )
store.loadProducts ( , )
store.purchase ( )
store.restore()
string.byte ( )
string.char ( )
string.find ( , )
string.format ( )
string.gmatch( , )
string.gsub ( , , )
string.len ( )
string.lower ( )
string.match ( , )
string.rep ( , )
string.reverse ( )
string.sub ( , )
string.upper ( )
system.getInfo( )
system.getPreference ( , )
system.getTimer ( )
system.openURL ( )
system.pathForFile ( )
system.setAccelerometerInterval ( )
system.setIdleTimer ( )
system.setLocationAccuracy ( )
system.setLocationThreshold ( )
system.vibrate ( )
table.concat ( )
table.insert ( , )
table.maxn ( )
table.remove ( )
table.sort ( )
then
timer.cancel ( )
timer.performWithDelay ( , )
tonumber ( )
tostring ( )
transition.cancel ( )
transition.dissolve( , , , )
transition.from ( , )
transition.to ( , )
true
type ( )
unpack ( )
until
while
_G
alphabet
align
alpha
baseUrl
font
hasBackground
height
isHitTestable
isSecure
isVisible
parent
rotation
size
contentBounds
contentHeight
contentWidth
strokeWidth
text
urlRequest
width
xOrigin
xReference
xScale
yOrigin
yReference
yScale
addEventListener ( , )
dispatchEvent( )
getSampleRate ( )
getTunerFrequency ( )
getTunerVolume ( )
isRecording ( )
nextFrame ( )
play ( )
play { startFrame=, endFrame=, loop=, remove= }
previousFrame ( )
removeEventListener ( , )
reverse ( )
reverse { startFrame=, endFrame=, loop=, remove= }
rotate( )
scale ( , )
setDrag ( drag= )
setFillColor ( , , )
setLabels { frameLabel1=, frameLabel2=, frameLabelN= }
setReferencePoint ( )
setSampleRate( )
setStrokeColor ( , , )
setTextColor ( , , )
startRecording ( )
startTuner ( )
stop ( )
stopAtFrame ( )
stopRecording ( )
stopTuner ( )
translate ( , )
math.round( )
table.copy( , )
table.indexOf( , )
credits.init( , , )
credits.requestUpdate( )
credits.showOffers( )
event.newCredits
event.totalCredits
graphics.newMask( )
display.remove( )
object:contentToLocal( , )
object:localToContent( , )
object:removeSelf( )
object:setMask( )
object:toBack( )
object:toFront( )
object.contentBounds
object.contentHeight
object.contentWidth
object.isHitTestMasked
object.maskRotation
object.maskScaleX
object.maskScaleY
object.maskX
object.maskY
object:append( , )
object:setColor( , , )
native.newMapView( , , , )
system.DocumentsDirectory
system.ResourceDirectory
system.TemporaryDirectory
system.activate( )
system.orientation( )
network.canDetectNetworkStatusChanges
network.setStatusListener( , )
native.systemFont
event.address
event.isConnectionOnDemand
event.isConnectionRequired
event.isInteractionRequired
event.isReachable
event.isReachableViaCellular
event.isReachableViaWiFi
event.channel
event.completed
event.handle
event.action
event.index
event.target
event.numTaps
object.inputType =
physics.getGravity( )
physics.pause( )
physics.setDrawMode( )
physics.setGravity( , )
physics.setPositionIterations( )
physics.setScale( )
physics.setVelocityIterations( )
physics.start( )
physics.stop( )
body.isSensor
joint.reactionTorque
spriteInstance.timeScale
sprite.newSpriteMultiSet({ { sheet = , frames = { n1, n2, nx} }, })
audio.supportsSessionProperty
audio.setSessionProperty( , )
audio.getSessionProperty( )
audio.ActiveMode
audio.MixMode
audio.OverrideMixWithOthers
audio.OtherAudioIsPlaying
audio.OtherMixableAudioShouldDuck
audio.AmbientMixMode
audio.SoloAmbientMixMode
audio.MediaPlaybackMixMode
audio.RecordAudioMixMode
audio.PlayAndRecordMixMode
system.setGyroscopeInterval( )
system.hasEventSource( )
event.deltaTime
event.xRotation
event.yRotation
event.zRotation
gameNetwork.init ( )
gameNetwork.request ( )
gameNetwork.show ( )
json.encode( )
json.decode( )
json.null()
event.keyName
event.phase
event.name
physics.removeBody( )
timer.pause( )
timer.resume( )
ads.init( , )
ads.show( )
ads.hide( )
object.isEditable
graphics.newGradient( , )
system.scheduleNotification( )
system.scheduleNotification( )
system.cancelNotification( )
display.newRetinaText( "", , , , )
display.newEmbossedText( "", , , , , )
widget.newButton ( )
widget.newSlider ( )
widget.newScrollView ( )
widget.newTableView ( )
widget.newTabBar ( )
widget.newPickerWheel ( )
widget.setTheme ( )
storyboard.newScene ( )
storyboard.gotoScene ( "" )
storyboard.purgeScene ( "" )
storyboard.removeScene ( "" )
storyboard.getPrevious ( )
storyboard.getScene ( "" )
storyboard.purgeAll ( )
storyboard.removeAll ( )
system.setLocationThreshold( )
While working with CoronaSDK I ended up using ui.lua for the buttons in our upcoming iPhone/iPad game. But I had hard time locating the latest version as many other developers had their own versions.
So, I have decided to make an ultimate latest version that will combine all previous enhancements along with my own. Copy of that Lua code is still available at Ansca code exchange.
NEW: Updated to eliminate the use of LUAs deprecated module() function. This is an internal change only, usage stays the same.
NEW: Added event support, now returns even.target, event.x & event.y values. You can use x/y values to provide different actions based on the coordinates of the touch event reative to the x/y size of the button image.
NEW: isActive state enhanced, so the button can be enabled/disabled without checking current isActive state with if-then.
-- ui.lua (currently includes Button class with labels, font selection and optional event model)
-- Version 2.4
-- Based on the folowing original provided by Ansca Inc.
-- Version 1.5 (works with multitouch, adds setText() method to buttons)
--
-- Copyright (C) 2010 ANSCA Inc. All Rights Reserved.
--
-- Permission is hereby granted, free of charge, to any person obtaining a copy of
-- this software and associated documentation files (the "Software"), to deal in the
-- Software without restriction, including without limitation the rights to use, copy,
-- modify, merge, publish, distribute, sublicense, and/or sell copies of the Software,
-- and to permit persons to whom the Software is furnished to do so, subject to the
-- following conditions:
--
-- The above copyright notice and this permission notice shall be included in all copies
-- or substantial portions of the Software.
--
-- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
-- INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
-- PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE
-- FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
-- OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
-- DEALINGS IN THE SOFTWARE.
-- Version 1.6 Works with Dynamic Scaling.
-- Based on the work edited by William Flagello, williamflagello.com
-- Original from https://developer.anscamobile.com/code/ui-library
--
-- Version 1.7 Dynamic Scaling text fixes by Jonathan Bebe
-- http://developer.anscamobile.com/forum/2010/12/17/easily-make-your-text-sharp-retina-displays#comment-18164
-- Provided in Ghosts & Monsters Sample Project
--
-- Version 1.71 Retina Updates by Jonathan Bebe
-- http://developer.anscamobile.com/forum/2010/12/17/easily-make-your-text-sharp-retina-displays#comment-38284
-- Adapted to 1.7 base code by E. Gonenc, pixelenvision.com
--
-- Version 1.8 added support for providing already realized display-objects for use in Tiled/Lime
-- Based on the file changed by Frank Siebenlist
-- http://developer.anscamobile.com/forum/2011/02/19/enhanced-uilua-v15
-- Adapted to 1.7 base code by E. Gonenc, pixelenvision.com
--
-- Version 1.9
-- Added transparency & scaling options to use as over state. newLabel updated to support retina text.
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 1.91
-- Added suggested fix for overlapping buttons by Jonathan Bebe
-- http://jonbeebe.net/to-return-true-or-not-to
-- Adapted by E. Gonenc, pixelenvision.com
--
-- Version 2.02
-- Button text will now follow scaling & alpha states of over button
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.1
-- Added suggested .isActive update by monoxgas http://developer.anscamobile.com/code/enhanced-ui-library-uilua#comment-49272
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.2
-- Updated to eliminate the use of LUAs deprecated module() function. This is an internal change only, usage stays the same.
-- http://blog.anscamobile.com/2011/09/a-better-approach-to-external-modules/
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.3
-- Updated to use object.contentBounds instead of deprecated object.stageBounds
-- Added event support, now returns even.target, event.x & event.y values. You can use x/y values to provide different actions
-- based on the coordinates of the touch event reative to the x/y size of the button image.
-- Edited by E. Gonenc, pixelenvision.com
--
-- Version 2.4
-- isActive state enhanced to button can be enabled/disabled without checking current isActive state with if-then.
-- ie. btn.isActive = true (Default state, button is enabled) btn.isActive = false (button is disabled, no animation and action)
-- Edited by E. Gonenc, pixelenvision.com
local M = {}
-------------
-- convenience test functions added by Frank.
local coronaMetaTable = getmetatable(display.getCurrentStage())
--- Test function that returns whether object is a Corona display object.
-- Note that all Corona types seem to share the same metatable...
local isDisplayObject = function(o)
return type(o) == "table" and getmetatable(o) == coronaMetaTable
end
-----------------
-- Helper function for newButton utility function below
local function newButtonHandler( self, event )
local result = true
local default = self[1]
local over = self[2]
local txt1,txt2,txt3
local OX,OY,SX,SY,SM
if self[3] then txt1 = self[3] end
if self[4] then txt2 = self[4] end
if self[5] then txt3 = self[5] end
if txt1 or txt2 or txt3 then
if display.contentScaleX < 1.0 or display.contentScaleY < 1.0 then SM = 2 else SM = 1 end
OX,OY = (over.xScale/default.xScale),(over.yScale/default.yScale)
SX,SY = (default.xScale/over.xScale),(default.yScale/over.yScale)
end
-- General "onEvent" function overrides onPress and onRelease, if present
local onEvent = self._onEvent
local onPress = self._onPress
local onRelease = self._onRelease
local buttonEvent = {}
if (self._id) then
buttonEvent.id = self._id
end
buttonEvent.isActive = self.isActive
buttonEvent.target = self
local phase = event.phase
if self.isActive then
if "began" == phase then
if over then
default.isVisible = false
over.isVisible = true
if txt1 then txt1:scale(OX,OY);txt1.alpha = over.alpha end
if txt2 then txt2:scale(OX,OY);txt2.alpha = over.alpha end
if txt3 then txt3:scale(OX,OY);txt3.alpha = over.alpha end
end
if onEvent then
buttonEvent.phase = "press"
buttonEvent.x = event.x - self.contentBounds.xMin
buttonEvent.y = event.y - self.contentBounds.yMin
result = onEvent( buttonEvent )
elseif onPress then
result = onPress( event )
end
-- Subsequent touch events will target button even if they are outside the contentBounds of button
display.getCurrentStage():setFocus( self, event.id )
self.isFocus = true
elseif self.isFocus then
local bounds = self.contentBounds
local x,y = event.x,event.y
local isWithinBounds =
bounds.xMin = x and bounds.yMin = y
if "moved" == phase then
if over then
-- The rollover image should only be visible while the finger is within button's stageBounds
default.isVisible = not isWithinBounds
over.isVisible = isWithinBounds
if txt1 and not isWithinBounds and txt1.xScale*SM == OX then txt1:scale(SX,SY);txt1.alpha = default.alpha
elseif txt1 and isWithinBounds and txt1.xScale*SM ~= OX then txt1:scale(OX,OY);txt1.alpha = over.alpha end
if txt2 and not isWithinBounds and txt2.xScale*SM == OX then txt2:scale(SX,SY);txt2.alpha = default.alpha
elseif txt2 and isWithinBounds and txt2.xScale*SM ~= OX then txt2:scale(OX,OY);txt2.alpha = over.alpha end
if txt3 and not isWithinBounds and txt3.xScale*SM == OX then txt3:scale(SX,SY);txt3.alpha = default.alpha
elseif txt3 and isWithinBounds and txt3.xScale*SM ~= OX then txt3:scale(OX,OY);txt3.alpha = over.alpha end
end
elseif "ended" == phase or "cancelled" == phase then
if over then
default.isVisible = true
over.isVisible = false
if txt1 and txt1.xScale*SM == OX then txt1:scale(SX,SY);txt1.alpha = default.alpha end
if txt2 and txt2.xScale*SM == OX then txt2:scale(SX,SY);txt2.alpha = default.alpha end
if txt3 and txt3.xScale*SM == OX then txt3:scale(SX,SY);txt3.alpha = default.alpha end
end
if "ended" == phase then
-- Only consider this a "click" if the user lifts their finger inside button's stageBounds
if isWithinBounds then
if onEvent then
buttonEvent.phase = "release"
buttonEvent.x = event.x - bounds.xMin
buttonEvent.y = event.y - bounds.yMin
result = onEvent( buttonEvent )
elseif onRelease then
result = onRelease( event )
end
end
end
-- Allow touch events to be sent normally to the objects they "hit"
display.getCurrentStage():setFocus( self, nil )
self.isFocus = false
end
end
end
return true
end
---------------
-- Button class
local function newButton( params )
local button, defaultSrc , defaultX , defaultY , overSrc , overX , overY , overScale , overAlpha , size, font, textColor, offset
local sizeDivide = 1
local sizeMultiply = 1
if display.contentScaleX < 1.0 or display.contentScaleY < 1.0 then
sizeMultiply = 2
sizeDivide = 0.5
end
if params.defaultSrc then
button = display.newGroup()
if isDisplayObject(params.defaultSrc) then
default = params.defaultSrc
else
default = display.newImageRect ( params.defaultSrc , params.defaultX , params.defaultY )
end
button:insert( default, false )
end
if params.overSrc then
if isDisplayObject(params.overSrc) then
over = params.overSrc
else
over = display.newImageRect ( params.overSrc , params.overX , params.overY )
end
if params.overAlpha then
over.alpha = params.overAlpha
end
if params.overScale then
over:scale(params.overScale,params.overScale)
end
over.isVisible = false
button:insert( over, false )
end
-- Public methods
function button:setText( newText )
local labelText = self.text
if ( labelText ) then
labelText:removeSelf()
self.text = nil
end
local labelShadow = self.shadow
if ( labelShadow ) then
labelShadow:removeSelf()
self.shadow = nil
end
local labelHighlight = self.highlight
if ( labelHighlight ) then
labelHighlight:removeSelf()
self.highlight = nil
end
if ( params.size and type(params.size) == "number" ) then size=params.size else size=20 end
if ( params.font ) then font=params.font else font=native.systemFontBold end
if ( params.textColor ) then textColor=params.textColor else textColor={ 255, 255, 255, 255 } end
size = size * sizeMultiply
-- Optional vertical correction for fonts with unusual baselines (I'm looking at you, Zapfino)
if ( params.offset and type(params.offset) == "number" ) then offset=params.offset else offset = 0 end
if ( params.emboss ) then
-- Make the label text look "embossed" (also adjusts effect for textColor brightness)
local textBrightness = ( textColor[1] + textColor[2] + textColor[3] ) / 3
labelHighlight = display.newText( newText, 0, 0, font, size )
if ( textBrightness > 127) then
labelHighlight:setTextColor( 255, 255, 255, 20 )
else
labelHighlight:setTextColor( 255, 255, 255, 140 )
end
button:insert( labelHighlight, true )
labelHighlight.x = labelHighlight.x + 1.5; labelHighlight.y = labelHighlight.y + 1.5 + offset
self.highlight = labelHighlight
labelShadow = display.newText( newText, 0, 0, font, size )
if ( textBrightness > 127) then
labelShadow:setTextColor( 0, 0, 0, 128 )
else
labelShadow:setTextColor( 0, 0, 0, 20 )
end
button:insert( labelShadow, true )
labelShadow.x = labelShadow.x - 1; labelShadow.y = labelShadow.y - 1 + offset
self.shadow = labelShadow
labelHighlight.xScale = sizeDivide; labelHighlight.yScale = sizeDivide
labelShadow.xScale = sizeDivide; labelShadow.yScale = sizeDivide
end
labelText = display.newText( newText, 0, 0, font, size )
labelText:setTextColor( textColor[1], textColor[2], textColor[3], textColor[4] )
button:insert( labelText, true )
labelText.y = labelText.y + offset
self.text = labelText
labelText.xScale = sizeDivide; labelText.yScale = sizeDivide
end
if params.text then
button:setText( params.text )
end
if ( params.onPress and ( type(params.onPress) == "function" ) ) then
button._onPress = params.onPress
end
if ( params.onRelease and ( type(params.onRelease) == "function" ) ) then
button._onRelease = params.onRelease
end
if (params.onEvent and ( type(params.onEvent) == "function" ) ) then
button._onEvent = params.onEvent
end
-- set button to active (meaning, can be pushed)
button.isActive = true
-- Set button as a table listener by setting a table method and adding the button as its own table listener for "touch" events
button.touch = newButtonHandler
button:addEventListener( "touch", button )
if params.x then
button.x = params.x
end
if params.y then
button.y = params.y
end
if params.id then
button._id = params.id
end
return button
end
M.newButton = newButton
--------------
-- Label class
local function newLabel( params )
local labelText
local size, font, textColor, align
local t = display.newGroup()
local sizeDivide = 1
local sizeMultiply = 1
if ( params.bounds ) then
local bounds = params.bounds
local left = bounds[1]
local top = bounds[2]
local width = bounds[3]
local height = bounds[4]
if ( params.size and type(params.size) == "number" ) then size=params.size else size=20 end
if ( params.font ) then font=params.font else font=native.systemFontBold end
if ( params.textColor ) then textColor=params.textColor else textColor={ 255, 255, 255, 255 } end
if ( params.offset and type(params.offset) == "number" ) then offset=params.offset else offset = 0 end
if ( params.align ) then align = params.align else align = "center" end
if ( params.text ) then
labelText = display.newText( params.text, 0, 0, font, size * 2 )
labelText.xScale = 0.5; labelText.yScale = 0.5
labelText:setTextColor( textColor[1], textColor[2], textColor[3], textColor[4] )
t:insert( labelText )
-- TODO: handle no-initial-text case by creating a field with an empty string?
if ( align == "left" ) then
labelText.x = left + labelText.contentWidth * 0.5
elseif ( align == "right" ) then
labelText.x = (left + width) - labelText.contentWidth * 0.5
else
labelText.x = ((2 * left) + width) * 0.5
end
end
labelText.y = top + labelText.contentHeight * 0.5
-- Public methods
function t:setText( newText )
if ( newText ) then
labelText.text = newText
if ( "left" == align ) then
labelText.x = left + labelText.contentWidth * 0.5
elseif ( "right" == align ) then
labelText.x = (left + width) - labelText.contentWidth * 0.5
else
labelText.x = ((2 * left) + width) * 0.5
end
end
end
function t:setTextColor( r, g, b, a )
local newR = 255
local newG = 255
local newB = 255
local newA = 255
if ( r and type(r) == "number" ) then newR = r end
if ( g and type(g) == "number" ) then newG = g end
if ( b and type(b) == "number" ) then newB = b end
if ( a and type(a) == "number" ) then newA = a end
labelText:setTextColor( r, g, b, a )
end
end
-- Return instance (as display group)
return t
end
M.newLabel = newLabel
return M