﻿#NoTrayIcon
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_Icon=prog.ico
#AutoIt3Wrapper_Outfile=Spielzeit-Timer.exe
#AutoIt3Wrapper_Res_Description=Spielzeit-Timer
#AutoIt3Wrapper_Res_Fileversion=1.0.0.0
#AutoIt3Wrapper_Res_LegalCopyright=Oscar (www.autoit.de)/geändert SCCSSF
#AutoIt3Wrapper_Res_Language=1031
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

#Region Includes
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <Sound.au3>
#include <StaticConstants.au3>
#include <Timers.au3>
#include <WinAPI.au3>
#include <WinAPIGdi.au3>
#include <WindowsConstants.au3>
#include '_ProgressEx.au3'
#include '_DateiEx.au3'
#EndRegion Includes

#Region Optionen
Opt('MustDeclareVars', 1)
Opt('GUIOnEventMode', 1)
#EndRegion Optionen

_GDIPlus_Startup()

#Region Konstanten deklarieren
Global Const $sAppTitle = 'Spielzeit-Timer'
Global Const $sAppVersion = '1.0.0.0'
Global Const $sAppDate = '16.02.2019'
Global Const $sAppAuthor = 'Oscar (www.autoit.de) / SCCCSF'
Global Const $sAppDir = @AppDataDir & '\TeaTimer\'
If Not FileExists($sAppDir) Then DirCreate($sAppDir)
Global Const $sInifile = $sAppDir & 'TeaTimer.ini'
Global $b7SegmentFont = _Segment7new()
Global $t7SegmentFont = DllStructCreate('byte[' & BinaryLen($b7SegmentFont) & ']')
DllStructSetData($t7SegmentFont, 1, $b7SegmentFont)
Global $h7SegmentFont = _WinAPI_AddFontMemResourceEx(DllStructGetPtr($t7SegmentFont), DllStructGetSize($t7SegmentFont))
Global $hUpBitmap = _GDIPlus_BitmapCreateFromMemory(_uppng())
Global $hDownBitmap = _GDIPlus_BitmapCreateFromMemory(_downpng())
Global $sSoundfile = @TempDir & '\glocke.mp3'
If Not FileExists($sSoundfile) Then _glocke(True, @TempDir)
Global $aSound = _SoundOpen($sSoundfile)

Global Const $iAppDPI = RegRead('HKEY_CURRENT_USER\Control Panel\Desktop\WindowMetrics', 'AppliedDPI')
Global Const $iRed = 0, $iYellow = 60, $iGreen = 120, $iBlue = -150 ; Farbwerte/HUE gegenueber dem roten Standardwert (Werte von -180 bis +180 sind moeglich)
Global Const $iWidth = 240, $iHeight = 360
#EndRegion Konstanten deklarieren

#Region globale Variablen
Global $iTimerSeconds = IniRead($sInifile, 'Config', 'TimerSeconds', 600)
Global $iTimerStep = IniRead($sInifile, 'Config', 'TimerStep', 10) ; In der Inidatei kann man die Schrittweite (in Sekunden) fuer die Timereinstellung festlegen
Global $iTimerDiv = IniRead($sInifile, 'Config', 'TimerDiv', 5) ; In der Inidatei kann man die Schrittweite (in Sekunden) fuer die Timerdiverens festlegen
Global $bTimerOn = False, $iSeconds = $iTimerSeconds
#EndRegion globale Variablen

#Region Fenster erstellen
Global $hGui = GUICreate(StringFormat('%s  v%-3.3s', $sAppTitle, $sAppVersion), $iWidth, $iHeight, -1, -1, BitOR($WS_POPUPWINDOW, $WS_CAPTION))
GUISetOnEvent($GUI_EVENT_CLOSE, '_CloseMainGui')
GUISetBkColor(0x000000)
GUISetIcon(@ScriptDir & '\prog.ico', 0, $hGui)
Global $idTime = GUICtrlCreateLabel(StringFormat('%02d:%02d', Int($iTimerSeconds / 60), Mod($iTimerSeconds, 60)), 20, 12, $iWidth - 60, 44, $SS_CENTER)
GUICtrlSetColor(-1, 0x22FF22)
GUICtrlSetFont(-1, 40 / $iAppDPI * 96, 400, 0, 'Segment7')
Global $hGUi1 = GUICtrlCreateLabel("Spielzeit", 30, 50, 172, 33,$SS_CENTER)
GUICtrlSetColor(-1, 0xFEFF22)
GUICtrlSetFont(-1, 20)

Global $idTime1 = GUICtrlCreateLabel(StringFormat('%02d:%02d', Int(($iTimerSeconds- $iTimerDiv*60) /60  ), Mod($iTimerSeconds, 60)), 20, 100, $iWidth - 60, 44, $SS_CENTER)
GUICtrlSetColor(-1, 0x22FF22)
GUICtrlSetFont(-1, 40 / $iAppDPI * 96, 400, 0, 'Segment7')
Global $hGUi2 = GUICtrlCreateLabel("letzte Minute", 30, 138, 172, 33,$SS_CENTER)
GUICtrlSetColor(-1, 0xFEFF22)
GUICtrlSetFont(-1, 20)

Global $idTime2 = GUICtrlCreateLabel(StringFormat('%02d:%02d', Int($iTimerSeconds / 60), Mod($iTimerSeconds, 60)), 20, 180, $iWidth - 60, 44, $SS_CENTER)
GUICtrlSetColor(-1, 0x22FF22)
GUICtrlSetFont(-1, 40 / $iAppDPI * 96, 400, 0, 'Segment7')
Global $hGUi3 = GUICtrlCreateLabel("Pause", 30, 218, 172, 33,$SS_CENTER)
GUICtrlSetColor(-1, 0xFEFF22)
GUICtrlSetFont(-1, 20)


Global $idUp = GUICtrlCreatePic('', $iWidth - 34, 6, 24, 24)
GUICtrlSetOnEvent(-1, '_ChangeTimerSeconds')
Global $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hUpBitmap)
_WinAPI_DeleteObject(GUICtrlSendMsg($idUp, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
_WinAPI_DeleteObject($hBMP)

Global $idDown = GUICtrlCreatePic('', $iWidth - 34, 34, 24, 24)
GUICtrlSetOnEvent(-1, '_ChangeTimerSeconds')
Global $hBMP = _GDIPlus_BitmapCreateDIBFromBitmap($hDownBitmap)
_WinAPI_DeleteObject(GUICtrlSendMsg($idDown, $STM_SETIMAGE, $IMAGE_BITMAP, $hBMP))
_WinAPI_DeleteObject($hBMP)

Global $aProgress = _ProgressEx_Create(10, 270, $iWidth - 20, 15, $PE_NOTEXT)
_ProgressEx_SetData($aProgress, 100, $iGreen)

Global $idStart = GUICtrlCreateButton('Reset', 10, 310, 80, 25)
GUICtrlSetFont(-1, 12 / $iAppDPI * 96, 600, 0, 'Tahoma')
GUICtrlSetOnEvent(-1, '_ResetTimer')

Global $idStart = GUICtrlCreateButton('Start', $iWidth - 120, 310, 110, 25, $BS_DEFPUSHBUTTON)
GUICtrlSetFont(-1, 12 / $iAppDPI * 96, 600, 0, 'Tahoma')
GUICtrlSetOnEvent(-1, '_StartTimer')
#EndRegion Fenster erstellen

#Region Fenster anzeigen und auf das Schliessen warten (der Rest ist funktionsgesteuert)
Global $aAccelKeys[2][2] = [['{UP}', $idUp], ['{DOWN}', $idDown]]
GUISetAccelerators($aAccelKeys)
GUISetState(@SW_SHOW)
GUIRegisterMsg($WM_MOUSEWHEEL, '_WM_MOUSEWHEEL')
_Timer_SetTimer($hGui, 1000, '_ChangeTimer')
WinWaitClose($hGui)
Exit
#EndRegion Fenster anzeigen und auf das Schliessen warten (der Rest ist funktionsgesteuert)

#Region Funktionen
Func _CloseMainGui()
	_Timer_KillAllTimers($hGui)
	_WinAPI_RemoveFontMemResourceEx($h7SegmentFont)
	$t7SegmentFont = 0
	_GDIPlus_BitmapDispose($hUpBitmap)
	_GDIPlus_BitmapDispose($hDownBitmap)
	_GDIPlus_Shutdown()
	_SoundClose($aSound)
	IniWrite($sInifile, 'Config', 'TimerSeconds', $iTimerSeconds)
	IniWrite($sInifile, 'Config', 'TimerStep', $iTimerStep)
	IniWrite($sInifile, 'Config', 'TimerDiv', $iTimerDiv)
	GUIDelete($hGui)
EndFunc   ;==>_CloseMainGui

Func _ChangeTimer($hWnd, $iMsg, $iIDTimer, $iTime, $idTime1, $idTime2)
	If Not $bTimerOn Then Return
	$iSeconds -= 1
		GUICtrlSetData($idTime, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))

	If (($iSeconds -$iTimerDiv*60) /60) > 0 Then
		GUICtrlSetData($idTime1, StringFormat('%02d:%02d', Int(($iSeconds- $iTimerDiv*60) / 60), Mod($iSeconds, 60)))
	Else
		GUICtrlSetData($idTime1, '00:00')
	EndIf

	GUICtrlSetData($idTime2, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))

	_ProgressEx_SetData($aProgress, 100 / $iTimerSeconds * $iSeconds, $iGreen)
	If (($iSeconds -$iTimerDiv*60) /60) = 0 Then
		_SoundPlay($aSound)
	EndIf
	If $iSeconds = 0 Then
		$bTimerOn = False
		_SoundPlay($aSound)
		#MsgBox($MB_OK + $MB_ICONINFORMATION, $sAppTitle, 'Die eingestellte Zeit ist abgelaufen.', 0, $hGui)
		#_ResetTimer()
	EndIf
EndFunc   ;==>_ChangeTimer

Func _WM_MOUSEWHEEL($hWnd, $iMsg, $wParam, $lParam)
	Local $iWheel = _WinAPI_HiWord($wParam) / 120 ; down = -1, up = 1
	Local $aGuiInfo = GUIGetCursorInfo($hGui)
	Switch $aGuiInfo[4]
		Case $idTime
			If $bTimerOn Then Return
			$iTimerSeconds += $iWheel * $iTimerStep
			If $iTimerSeconds < $iTimerStep Then $iTimerSeconds = 6000 - $iTimerStep
			If $iTimerSeconds > 6000 - $iTimerStep Then $iTimerSeconds = $iTimerStep
			$iSeconds = $iTimerSeconds
			GUICtrlSetData($idTime, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))
			Return
		Case Else
			Return $GUI_RUNDEFMSG
	EndSwitch
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_MOUSEWHEEL

Func _ChangeTimerSeconds()
	If $bTimerOn Then Return
	$iTimerSeconds += (@GUI_CtrlId = $idUp ? 1 : -1) * $iTimerStep
	If $iTimerSeconds < $iTimerStep Then $iTimerSeconds = 6000 - $iTimerStep
	If $iTimerSeconds > 6000 - $iTimerStep Then $iTimerSeconds = $iTimerStep
	$iSeconds = $iTimerSeconds
	GUICtrlSetData($idTime, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))
	GUICtrlSetData($idTime1, StringFormat('%02d:%02d', Int(($iSeconds- $iTimerDiv*60) / 60), Mod($iSeconds, 60)))
	GUICtrlSetData($idTime2, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))

EndFunc   ;==>_ChangeTimerSeconds

Func _ResetTimer()
	$iSeconds = $iTimerSeconds
	GUICtrlSetData($idTime, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))
	GUICtrlSetData($idTime1, StringFormat('%02d:%02d', Int(($iSeconds- $iTimerDiv*60) / 60 ), Mod($iSeconds, 60)))
	GUICtrlSetData($idTime2, StringFormat('%02d:%02d', Int($iSeconds / 60), Mod($iSeconds, 60)))

	$bTimerOn = False
	GUICtrlSetState($idStart, $GUI_ENABLE)
	_ProgressEx_SetData($aProgress, 100, $iGreen)
EndFunc   ;==>_ResetTimer

Func _StartTimer()
	$bTimerOn = True
	GUICtrlSetState($idStart, $GUI_DISABLE)
EndFunc   ;==>_StartTimer
#EndRegion Funktionen
