﻿;-- TIME_STAMP   2022-09-29 16:01:46

#include <GUIConstantsEx.au3>

_AlternateColors_ByFlag()

_AlternateColors_EvenByUser()

_AlternateColors_EvenCalculated(0xEFE4B0)
_AlternateColors_EvenCalculated(0xFFD700)
_AlternateColors_EvenCalculated(0xDC143C)
_AlternateColors_EvenCalculated(0x00FF00)
_AlternateColors_EvenCalculated(0xA0A0A0)
_AlternateColors_EvenCalculated() ; ohne Angabe: weiß / grau

Func _AlternateColors_ByFlag()
    Local $hGui = GUICreate('AlternateColors by Flag')
    Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)
    GUICtrlSetBkColor(-1, 0xEFE4B0) ; Color odd row
    GUICtrlSetBkColor(-1, $GUI_BKCOLOR_LV_ALTERNATE)

    For $i = 1 To 30
        GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
        GUICtrlSetBkColor(-1, 0xC8BFE7) ; Color even row
    Next

    GUISetState()

    Do
    Until GUIGetMsg() = -3
    GUIDelete($hGui)
EndFunc


Func _AlternateColors_EvenByUser()
    Local $hGui = GUICreate('AlternateColors by User')
    Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)

    For $i = 1 To 30
        GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
        _LV_SetAlternateBkColor($i-1, 0xC8BFE7, 0xEFE4B0) ; color even, color odd - by user
    Next

    GUISetState()

    Do
    Until GUIGetMsg() = -3
    GUIDelete($hGui)
EndFunc


Func _AlternateColors_EvenCalculated($_colorOdd=-1)
    Local $hGui = GUICreate('AlternateColors Calculated')
    Local $LV = GUICtrlCreateListView("Col 1|Col 2", 15, 15, 300, 250)

    For $i = 1 To 30
        GUICtrlCreateListViewItem(Random(10000, 1000000, 1) & '|' & Random(10000, 1000000, 1), $LV)
        _LV_SetAlternateBkColor($i-1, $_colorOdd) ; color odd, color even - calculated
    Next

    GUISetState()

    Do
    Until GUIGetMsg() = -3
    GUIDelete($hGui)
EndFunc



Func _LV_SetAlternateBkColor($_Index, $_RGBodd=-1, $_RGBeven=-1, $_ColOnDark=-1, $_ColOnBright=-1)
    $_RGBodd = $_RGBodd = -1 ? 0xFFFFFF : $_RGBodd
    $_ColOnDark = $_ColOnDark = -1 ? 0xFAFAFA : $_ColOnDark
    $_ColOnBright = $_ColOnBright = -1 ? 0x000088 : $_ColOnBright
    Local $R, $G, $B
    If Mod($_Index, 2) <> 0 Then
        GUICtrlSetBkColor(-1, $_RGBodd)
    Else
        If $_RGBeven = -1 Then
            $R = Int(0.8*BitAND(BitShift($_RGBodd, 16), 0xFF))
            $G = Int(0.8*BitAND(BitShift($_RGBodd, 8), 0xFF))
            $B = Int(0.8*BitAND($_RGBodd, 0xFF))
            $_RGBeven = '0x' & Hex($R, 2) & Hex($G, 2) & Hex($B, 2)
        EndIf
        GUICtrlSetBkColor(-1, $_RGBeven)
    EndIf
    GUICtrlSetColor(-1, _RGB_GetContrast((Mod($_Index, 2) <> 0 ? $_RGBodd : $_RGBeven), $_ColOnDark, $_ColOnBright))
EndFunc


Func _RGB_GetContrast($_RGB, $_ColOnDark=0xFAFAFA, $_colOnBright=0x000088)
    ; get brightness
    Local $R = BitAND(BitShift($_RGB, 16), 0xFF)
    Local $G = BitAND(BitShift($_RGB, 8), 0xFF)
    Local $B = BitAND($_RGB, 0xFF)
    Local $Brightness = Sqrt($R^2*0.299 + $G^2*0.587 + $B^2*0.114)

    If $Brightness < 140 Then  ; dark
        Return $_ColOnDark     ; contrast text color if background is dark
    Else
        Return $_colOnBright   ; contrast text color if background is bright
    EndIf
EndFunc