Jump to content

Timer thing (yep, another one)


argumentum
 Share

Recommended Posts

I wanted a timer, could not find what I wanted and wrote this. Posted for the next lazy one, like me, copy'n'paste kind of ppl.
And added an "Alarm", ( at times I need it to trigger at a time and not, in so many minutes )
Also added an "insist/replay" ( since I'm coding, might as well have the feature )
timerThing.png

#NoTrayIcon
#include <TrayConstants.au3>
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Opt("MustDeclareVars", 1) ; removes the chance for misspelled variables causing bugs.
Opt("TrayMenuMode", 3) ; The default tray menu items will not be shown and items are not checked when selected. These are options 1 and 2 for TrayMenuMode.
Opt("TrayOnEventMode", 1) ; Enable TrayOnEventMode.
Opt("GUIOnEventMode", 1) ; OnEvent functions notifications

Global $seconds = 0, $g_sec, $g_min, $g_hr, $started = False, $sec = 99, $aTimeHold[3], $g_IsAlarm = 0, $iAppTitle, $sAppTitle = timerTitle()
$iAppTitle = @extended


#Region ### START Koda GUI section ### Form=\\WDMYCLOUDEX4100\Public\[FMIS]\au3_Shared_projects\timerThing.kxf
Global $Form1 = GUICreate($sAppTitle, 245, 74, @DesktopWidth - 275 - (40 * $iAppTitle), 20 + (40 * $iAppTitle), -1, BitOR($WS_EX_TOPMOST, $WS_EX_WINDOWEDGE))
Global $idHour = GUICtrlCreateInput("00", 5, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idMin = GUICtrlCreateInput("00", 58, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idSec = GUICtrlCreateInput("00", 110, 4, 49, 32, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER))
Global $idStart = GUICtrlCreateButton("Start Timer", 163, 6, 75, 61, $BS_MULTILINE)
Global $idTitle = GUICtrlCreateInput("", 4, 40, 129, 28, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_WANTRETURN))
Global $idAlarm = GUICtrlCreateCheckbox("", 137, 53, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON))
Global $idInsist = GUICtrlCreateCheckbox("", 137, 37, 17, 19, BitOR($GUI_SS_DEFAULT_CHECKBOX, $BS_RIGHTBUTTON))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

GUICtrlSetFont($idHour, 14, 800)
GUICtrlSetFont($idMin, 14, 800)
GUICtrlSetFont($idSec, 14, 800)
GUICtrlSetFont($idStart, 12, 800)
GUICtrlSetFont($idTitle, 12, 800)

GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
GUICtrlSetOnEvent($idStart, "idStartClick")
GUICtrlSetOnEvent($idTitle, "idTitleChange")
GUICtrlSetOnEvent($idAlarm, "idAlarmEvent")

TraySetOnEvent($TRAY_EVENT_PRIMARYDOUBLE, "OnTray_PRIMARYDOUBLE")

GUICtrlSetTip($idStart, 'press ENTER or click' & @CR & @CR & 'once started, on close,' & @CR & 'will move to the tray area.')
GUICtrlSetTip($idHour, 'Hours' & @CR & @CR & 'enter the hours' & @CR & 'and press ENTER')
GUICtrlSetTip($idMin, 'Minutes' & @CR & @CR & 'enter the minutes' & @CR & 'and press ENTER')
GUICtrlSetTip($idSec, 'Seconds' & @CR & @CR & 'enter the seconds' & @CR & 'and press ENTER')
GUICtrlSetTip($idTitle, 'Type a title for this' & @CR & 'timer and press ENTER')
GUICtrlSetTip($idAlarm, 'Swap between' & @CR & 'Timer and Alarm' & @CR & 'functionality')
GUICtrlSetTip($idInsist, 'Replay the alert' & @CR & 'every 10 sec.' & @CR & 'for 10 min.')

;~ If Not FileGetSize("timerThing.wav") Then FileInstall("timerThing.wav", "timerThing.wav") ; if you wanna include your WAV file

Global $hForm1 = WinGetHandle($Form1)
Global $idDummy = GUICtrlCreateDummy()
Global $aAccelKeys[1][2] = [["{Enter}", $idDummy]]
GUISetAccelerators($aAccelKeys)
GUICtrlSetOnEvent($idDummy, "On_idDummy")

While 1
    Sleep(50)
    If Not $started Then ContinueLoop
    If $sec = @SEC Then ContinueLoop
    $sec = @SEC
    Countdown()
WEnd

Func Form1Close()
    If $started Then
        TraySetState(1)
        WinSetState($hForm1, "", @SW_HIDE)
    Else
        GUIDelete()
        Exit
    EndIf
EndFunc   ;==>Form1Close

Func Countdown() ; mod. from https://www.autoitscript.com/forum/topic/135227-simple-counter/?do=findComment&comment=950305
    If $g_IsAlarm Then
        If Int(GUICtrlRead($idHour)) = Int(@HOUR) And Int(GUICtrlRead($idMin)) = Int(@MIN) And Int(GUICtrlRead($idSec)) = Int(@SEC) Then
            $seconds = -1
        Else
            Return
        EndIf
    EndIf
    $g_sec = Mod($seconds, 60)
    $g_min = Mod($seconds / 60, 60)
    $g_hr = Floor($seconds / 60 ^ 2)
    If $seconds < -3 Then Return
    TrayToolTip()
    $seconds -= 1
    If $seconds = -2 Then
        GUICtrlSetState($idInsist, $GUI_DISABLE)
        If GUICtrlRead($idInsist) = 1 Then
            $seconds = -5
            InsistPlayTheWAV()
            AdlibRegister("InsistPlayTheWAV", 10000)
        Else
            playTheWAV()
        EndIf
        Return
    EndIf
    If $seconds < -1 Then Return
    GUICtrlSetData($idHour, StringFormat("%02i", $g_hr))
    GUICtrlSetData($idMin, StringFormat("%02i", $g_min))
    GUICtrlSetData($idSec, StringFormat("%02i", $g_sec))
EndFunc   ;==>Countdown

Func playTheWAV()
    OnTray_PRIMARYDOUBLE()
    WinActivate($hForm1)
    If Not FileGetSize(@ScriptDir & "\timerThing.wav") Then
        SoundSetWaveVolume(25)
        SoundPlay(@WindowsDir & "\media\tada.wav")
    Else
        SoundSetWaveVolume(5)
        SoundPlay(@ScriptDir & "\timerThing.wav")
    EndIf
EndFunc   ;==>playTheWAV

Func InsistPlayTheWAV()
    Local Static $t = 0
    If $t = 0 Then $t = TimerInit()
    playTheWAV()
    If TimerDiff($t) > 600000 Then
        AdlibUnRegister("InsistPlayTheWAV")
        $t = 0
    EndIf
EndFunc   ;==>InsistPlayTheWAV

Func TrayToolTip()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    TraySetToolTip('' & _
            $title & @CR & _
            GUICtrlRead($idHour) & ":" & GUICtrlRead($idMin) & ":" & GUICtrlRead($idSec) & @CR & @CR & _
            'Double' & @CR & _
            'Click to' & @CR & _
            'restore' & @CR & @CR & ' ')
EndFunc   ;==>TrayToolTip

Func idStartClick()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    WinSetTitle($hForm1, "", $title)
    $sec = 99
    $started = Not $started
    Switch $started
        Case True
            GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Start", "STOP"))
            $seconds = (Int(GUICtrlRead($idHour)) * 60 * 60) + (Int(GUICtrlRead($idMin)) * 60) + Int(GUICtrlRead($idSec))
            $aTimeHold[0] = StringFormat("%02i", GUICtrlRead($idHour))
            $aTimeHold[1] = StringFormat("%02i", GUICtrlRead($idMin))
            $aTimeHold[2] = StringFormat("%02i", GUICtrlRead($idSec))
            GUICtrlSetState($idStart, $GUI_FOCUS)
            GUICtrlSetState($idHour, $GUI_DISABLE)
            GUICtrlSetState($idMin, $GUI_DISABLE)
            GUICtrlSetState($idSec, $GUI_DISABLE)
            GUICtrlSetState($idAlarm, $GUI_DISABLE)
        Case Else
            GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "STOP", "Start"))
            GUICtrlSetData($idHour, $aTimeHold[0])
            GUICtrlSetData($idMin, $aTimeHold[1])
            GUICtrlSetData($idSec, $aTimeHold[2])
            GUICtrlSetState($idHour, $GUI_ENABLE)
            GUICtrlSetState($idMin, $GUI_ENABLE)
            GUICtrlSetState($idSec, $GUI_ENABLE)
            GUICtrlSetState($idAlarm, $GUI_ENABLE)
            GUICtrlSetState($idInsist, $GUI_ENABLE)
            GUICtrlSetState($idStart, $GUI_FOCUS)
    EndSwitch
EndFunc   ;==>idStartClick

Func On_idDummy()
    Local $i, $s = ControlGetFocus($hForm1)
    $i = Int(StringRight($s, 1))
    If $s = "Button1" Then Return ControlClick($hForm1, "", "Button1")
    If StringInStr($s, "Edit") Then
        Switch $i
            Case 1, 2, 3
                Send("{Tab}")
        EndSwitch
    EndIf
EndFunc   ;==>On_idDummy

Func idTitleChange()
    Local $title = $sAppTitle
    If GUICtrlRead($idTitle) Then $title = GUICtrlRead($idTitle)
    WinSetTitle($hForm1, "", $title)
EndFunc   ;==>idTitleChange

Func timerTitle()
    Local $n, $i = 0
    For $n = 1 To 1000
        If Not WinExists(" Timer  thing [" & $n & "]") Then
            AutoItWinSetTitle(" Timer  thing [" & $n & "]")
            $i = $n - 1
            If 40 * $n > @DesktopHeight - 150 Then $i = 1
            Return SetError(0, $i, " Timer " & $n)
        EndIf
    Next
    Return SetError(1, $i, " Timer ???")
EndFunc   ;==>timerTitle

Func OnTray_PRIMARYDOUBLE()
    TraySetState(2)
    WinSetState($hForm1, "", @SW_SHOW)
EndFunc   ;==>OnTray_PRIMARYDOUBLE

Func idAlarmEvent()
    ConsoleWrite('+ Func idAlarmEvent() : ' & GUICtrlRead($idAlarm) & @CRLF)
    If GUICtrlRead($idAlarm) = 1 Then
        $g_IsAlarm = 1
        GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Timer", "Alarm"))
        $sAppTitle = StringReplace($sAppTitle, "Timer", "Alarm")
    Else
        $g_IsAlarm = 0
        GUICtrlSetData($idStart, StringReplace(GUICtrlRead($idStart), "Alarm", "Timer"))
        $sAppTitle = StringReplace($sAppTitle, "Alarm", "Timer")
    EndIf
    idTitleChange()
EndFunc   ;==>idAlarmEvent

 

Edited by argumentum
updated the code

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...