PayCalc

From AutoIt Wiki
Jump to navigation Jump to search

Script: payCalc

Author: Jon Dunham

Description: Simple GUI example to calculate hourly pay in real-time.

Notes: "my code is a dog's code" - R. Beef Kazenzakis


#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#region GUI setup
; create main window/form/frame
$formPC = GUICreate("payCalc", 251, 136, 346, 590)

; create labels. it's generally not necessary to set the returned handle
;  to a variable on static label controls you know you won't be interacting with
GUICtrlCreateLabel("Time:", 8, 8, 30, 17)
GUICtrlCreateLabel("Total pay:", 8, 32, 51, 17)
; create read-only status boxes
$tTime = GUICtrlCreateInput("", 72, 8, 121, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
$tTotal = GUICtrlCreateInput("", 72, 32, 121, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))

; create buttons. use $BS_DEFPUSHBUTTON constant on Start to make it the default button for when {ENTER} is pressed.
;  the ampersand character specifies the alt-key shortcut to use
$btnStart = GUICtrlCreateButton("&Start", 8, 104, 75, 25, $BS_DEFPUSHBUTTON)
$btnStop = GUICtrlCreateButton("S&top", 88, 104, 75, 25)
$btnReset = GUICtrlCreateButton("&Reset", 168, 104, 75, 25)

; rate label and input controls
GUICtrlCreateLabel("Rate ($/hr):", 8, 72, 59, 17)
$inRate = GUICtrlCreateInput("0.00", 72, 72, 57, 21)

; finally, show the GUI
GUISetState(@SW_SHOW)
#EndRegion

; init global var to keep track of the last timestamp if "Stop" is clicked
Global $lastTime = 0

While 1
	; main/idle GUI switch statement
	Switch GUIGetMsg()
	Case $GUI_EVENT_CLOSE
		GUIDelete()
		Exit
	Case $btnStart
		; enter calc function when Start is clicked
		payCalc()
	Case $btnReset
		; zero out gui controls and whatnot
		GUICtrlSetData($tTime, "")
		GUICtrlSetData($tTotal, "")
		$lastTime = 0
	EndSwitch
	
	Sleep(10)
WEnd

Func payCalc()
	; start the timer
	$timer = TimerInit()
	; get the rate of pay to multiply based on the update interval, which in this case is 100 milliseconds or 1/10th second
	$calcRate = Number(GUICtrlRead($inRate))/60/600
	
	While 1
		; check GUI for events
		Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			GUIDelete()
			Exit
		Case $btnStop
			; when Stop button is clicked, set that global lastTime var to the current timestamp plus itself (+=) if we return to this function
			$lastTime += TimerDiff($timer)
			WinSetTitle($formPC, "", "payCalc")
			; return to main loop
			Return
		EndSwitch
		
		; update the time edit box, adding a millisecond display 'cause it's fun to watch numbers... i guess
		GUICtrlSetData($tTime, timeFormat(TimerDiff($timer)+$lastTime) & " [" & Round(Mod(TimerDiff($timer), 1000), 0) & "]")

		; multiply the adjusted rate by how much time has passed in ms/10 and set edit control, window title and traytip
		$totalPay = Round($calcRate * ((TimerDiff($timer)+$lastTime)/100), 2)
		WinSetTitle($formPC, "", "$" & $totalPay & " [payCalc]")
		TraySetToolTip("$" & $totalPay & @CRLF & timeFormat(TimerDiff($timer)+$lastTime))
		GUICtrlSetData($tTotal, "$" & $totalPay)
		
		; sleep before looping
		Sleep(100)
	WEnd
EndFunc

func timeFormat($ms, $sepChar = ":")
	; custom function to make a nice HH:MM:SS display from a given time in milliseconds
	dim $sec, $min, $hr
	dim $s = round($ms/1000, 0 )

	$sec = mod($s, 60)
	if $sec < 10 then $sec = "0" & $sec
	$min = Floor(mod($s/60, 60))
	if $min < 10 then $min = "0" & $min
	$hr = Floor($s/3600)
	if $hr < 10 then $hr = "0" & $hr

	Return $hr & $sepChar & $min & $sepChar & $sec
EndFunc ; <== timeFormat