#!/usr/bin/python3
# -*- coding: utf-8 -*-


###  Copyright (C) 2021 4bitFox / Fabian C.  ###


#Basic portable Camera UI for the Raspberry Pi.
#I wrote it for the Raspberry Pi HQ Camera on a Rasberry Pi 4B, with a small LCD on top.
#If you use a different camera module you will have to adjust some settings (e.g. the Sensor Mode). Same when you use a different res display ect...
#I'm new to programming, so the code could probably be better and some things are hacky (Filename-date, simulated keypresses and image viewing with feh). It works fine for what I want to use it for tough.

#This script requires "feh" for image viewing to be installed (sudo apt install feh).
#You also need to have the python3 library "pynput" installed (pip3 install pynput).
from PyQt5.QtWidgets import QMainWindow, QApplication, QPushButton, QCheckBox, QLabel
from PyQt5.QtGui import QFont, QCursor
from PyQt5.QtCore import Qt
from gpiozero import Button
from pynput.keyboard import Key, Controller
from time import sleep
from threading import Timer
import os
import datetime
import sys 


##Settings##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#This script uses raspistill. 
#Search the documentation or use "raspistill --help" for possible options:
#https://www.raspberrypi.org/documentation/raspbian/applications/camera.md

#Screen & Preview dimentions in pixels
#If you have to change this, you'll probably have to adjust the font-sizes in the code below by yourself! 
#Button boundaries will scale automatically.
wscreen  = 800 #Screen width
hscreen  = 480 #Screen height
wpreview = 640 #Preview width (https://andrew.hedges.name/experiments/aspect_ratio/)
wmenu    = 100 #Menu with (left)


#Output settings
setting_output_location = "/home/pi/Pictures" #Where to store pictures
setting_output_prefix = "FCM_"   #Filename prefix
setting_output_suffix_noraw = "" #Filename suffix when RAW disabled
setting_output_suffix_raw = "R"  #Filename suffix when RAW enabled
setting_encoding = "jpg"         #Encoding of picture taken
setting_mode = 3                 #Sensor mode
setting_quality = 90             #Compression quality
setting_thumbnail = "64,48,35" #Thumbnail settings ("width,height,quality")


#Default Camera settings
setting_ISO = 0        #ISO
setting_AWB = "auto"   #Auto White Balance
setting_SS  = 0        #Shutter Speed
setting_EXP = "auto"   #Exposure Mode
setting_EXM = "matrix" #Exposure Metering
#Default additional settings
setting_FoM     = False  #Display focus FoM value
setting_raw     = False  #Add raw Bayer data to JPEG
setting_flicker = "50hz" #Flicker avoidance
setting_hf      = False  #Flip Image horizontally
setting_vf      = False  #Flip Image vertically
#Default advanced settings
setting_USB  = True
setting_HDMI = True
setting_WiFi = True
setting_SSH  = True
setting_VNC  = True

#Artist
setting_photographer = "Fabian C." #Name of photographer (for EXIF Artist)


#GPIO Buttons
#If you use buttons connected to GPIO, you can set the pin numbers here:
button_capture = Button(5) #Take a photo
button_up      = Button(13) #Move up in menu
button_select  = Button(26) #Select in menu
button_down    = Button(19) #Move down in menu

#Hardware
hw_battery = True #Enable battery. You have change the "battery()" function yourself if you use something different than a pisugar: https://github.com/PiSugar/PiSugar/wiki/PiSugar-Power-Manager-(Software)
hw_utc = True #Enable UTC. You have change the "utc()" function yourself if you use something different than a pisugar: https://github.com/PiSugar/PiSugar/wiki/PiSugar-Power-Manager-(Software)

#Other
title = "PiCam"
cursor_hidden = True
style = "line-keys" #How the UI looks. You can use "boxes", "line", "line-keys" or "line-touch"
debugging = True #Debugging (print stuff to console)


###Code beginns here :)###
##Variables##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
winfo = wscreen - wpreview - wmenu #width of info menu on the right
h = hscreen

xdistl = 0
xdistr = 0

setting_flicker_init = setting_flicker #Save initial flicker setting
if setting_flicker_init == "off": #Initial bool for checkbox
    setting_flicker_init_bool = False
else:
    setting_flicker_init_bool = True
    
def setting_ISO_hr(): #ISO in info menu
    if setting_ISO == 0:
        ISO = "auto"
    else:
        ISO = str(setting_ISO)
    return ISO
    
def setting_SS_hr(): #Shutter speed in info menu
    if setting_SS == 0:
        SS = "auto"
    elif setting_SS == 125:
        SS = "1/8000"
    elif setting_SS == 250:
        SS = "1/4000"
    elif setting_SS == 500:
        SS = "1/2000"
    elif setting_SS == 1000:
        SS = "1/1000"
    elif setting_SS == 2000:
        SS = "1/500"
    elif setting_SS == 4000:
        SS = "1/250"
    elif setting_SS == 8000:
        SS = "1/125"
    elif setting_SS == 16667:
        SS = "1/60"
    elif setting_SS == 33333:
        SS = "1/30"
    elif setting_SS == 66667:
        SS = "1/15"
    elif setting_SS == 125000:
        SS = "1/8"
    elif setting_SS == 250000:
        SS = "1/4"
    elif setting_SS == 500000:
        SS = "1/2"
    elif setting_SS == 1000000:
        SS = "1"
    elif setting_SS == 2000000:
        SS = "2"
    elif setting_SS == 4000000:
        SS = "4"
    elif setting_SS == 8000000:
        SS = "8"
    elif setting_SS == 15000000:
        SS = "15"
    elif setting_SS == 30000000:
        SS = "30"
    elif setting_SS == 60000000:
        SS = "60"
    else:
        SS = "?"
    return SS
  
    
##Apply settings to Pi##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
def setting_USB_set(state): #Apply USB setting
    if state:
        os.system("echo 1-1 | sudo tee /sys/bus/usb/drivers/usb/bind > /dev/null 2>&1")
        if debugging:
            print("USB enabled")
    else:
        os.system("echo 1-1 | sudo tee /sys/bus/usb/drivers/usb/unbind > /dev/null 2>&1")
        if debugging:
            print("USB disabled")

setting_USB_set(setting_USB)

def setting_HDMI_set(state): #Apply HDMI setting
    if state:
        os.system("sudo vcgencmd display_power 1")
        if debugging:
            print("HDMI enabled")
    else:
        os.system("sudo vcgencmd display_power 0")
        if debugging:
            print("HDMI disabled")

setting_HDMI_set(setting_HDMI)

def setting_WiFi_set(state): #Apply WiFi setting
    if state:
        os.system("sudo ifconfig wlan0 up")
        if debugging:
            print("WiFi enabled")
    else:
        os.system("sudo ifconfig wlan0 down")
        if debugging:
            print("WiFi disabled")

setting_WiFi_set(setting_WiFi)

def setting_SSH_set(state): #Apply SSH setting
    if state:
        os.system("sudo systemctl start --now ssh.service")
        if debugging:
            print("SSH enabled")
    else:
        os.system("sudo systemctl stop --now ssh.service")
        if debugging:
            print("SSH disabled")

setting_SSH_set(setting_SSH)

def setting_VNC_set(state): #Apply VNC setting
    if state:
        os.system("sudo systemctl start --now vncserver-x11-serviced.service")
        if debugging:
            print("VNC enabled")
    else:
        os.system("sudo systemctl stop --now vncserver-x11-serviced.service")
        if debugging:
            print("VNC disabled")

setting_VNC_set(setting_VNC)


##Stats##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
def fs_stat(output): #Filesystem statistics (Space total and available)
    statvfs = os.statvfs(setting_output_location)
    if output == "total":
        total     = statvfs.f_frsize * statvfs.f_blocks
        total_TiB     = round(total     / 1099511627776)
        total_GiB     = round(total     / 1073742000)
        total_MiB     = round(total     / 1048576)
        if total_TiB >= 1:
            total = str(total_TiB) + "TiB"
            return total
        elif total_GiB >= 1:
            total = str(total_GiB) + "GiB"
            return total
        else:
            total = str(total_MiB) + "GiB"
            return total
    if output == "available":
        available = statvfs.f_frsize * statvfs.f_bavail
        available_TiB = round(available / 1099511627776)
        available_GiB = round(available / 1073742000)
        available_MiB = round(available / 1048576)
        if available_TiB >= 1:
            available = str(available_TiB) + "TiB"
            return available
        elif available_GiB >= 1:
            available = str(available_GiB) + "GiB"
            return available
        else:
            available = str(available_MiB) + "GiB"
            return available

def battery(): #Get battery level in %
    if hw_battery:
        battery = os.popen("echo get battery | netcat -q 0 127.0.0.1 8423 | sed s/[^0-9.]*//g").read()
        battery = battery.split(".")[0].strip() + "%"
        return battery
    else:
        return "N/A"


##UTC and System Time##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
def utc(): #Set System time from UTC and update time from internet if connected
    time = 300
    Timer(time, utc).start() #Run function periodically
    os.system("echo rtc_web | netcat -q 0 127.0.0.1 8423 > /dev/null 2>&1 &")
    os.system("sleep 5 && echo rtc_rtc2pi | netcat -q 0 127.0.0.1 8423 > /dev/null &")

utc()
        
        
##WINDOW CLASS##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
class Window(QMainWindow): 
    def __init__(self):
        #Window properties
        super().__init__()
        
        global xdistl
        global xdistr
        
        self.setWindowTitle(title) 
        self.setGeometry(0, 0, wscreen, h)
        self.setWindowFlag(Qt.FramelessWindowHint)
        self.setWindowFlag(Qt.WindowStaysOnTopHint)
        if cursor_hidden:
            self.setCursor(QCursor(Qt.BlankCursor))
        
        if style == "boxes":
            xdistl = 5
            xdistr = 5
            stylesheet = """
            QWidget {
            background-color: black;
            }
            
            QLabel {
            color: white;
            text-align: center;
            }
    
            QPushButton {
            border: 1px solid gray;
            color: white;
            }
        
            QPushButton:focus {
            border: 2px solid gray;
            }
            
            QPushButton:hover {
            border: 2px solid gray;
            }
        
            QPushButton:pressed {
            background-color: gray;
            }
        
            QCheckBox {
            border: 1px solid gray;
            color: white;
            }
        
            QCheckBox:focus {
            border: 2px solid gray;
            }
            
            QCheckBox:hover {
            border: 2px solid gray;
            }
        
            QCheckBox:pressed {
            background-color: gray;
            }
        
            QCheckBox:checked {
            color: green;
            }
        
            QCheckBox:unchecked {
            color: red;
            }
        
            QCheckBox::indicator {
            width: 0px;
            height: 0px;
            }
            """
        
        if style == "line":
            xdistl = 0
            xdistr = -2
            stylesheet = """
            QWidget {
            background-color: black;
            }
            
            QLabel {
            color: white;
            text-align: center;
            }
    
            QPushButton {
            border: 6px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            text-align: center;
            }
        
            QPushButton:focus {
            border: 10px solid;
            border-left-color: white;
            }
            
            QPushButton:hover {
            border: 8px solid;
            border-left-color: gray;
            }
        
            QPushButton:pressed {
            border: 4px solid;
            border-left-color: gray;
            }
        
            QCheckBox {
            border: 6px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            }
        
            QCheckBox:focus {
            border: 10px solid;
            border-left-color: white;
            }
            
            QCheckBox:hover {
            border: 8px solid;
            border-left-color: gray;
            }
        
            QCheckBox:pressed {
            border: 6px solid;
            border-left-color: gray;
            }
        
            QCheckBox:checked {
            color: green;
            }
        
            QCheckBox:unchecked {
            color: red;
            }
        
            QCheckBox::indicator {
            width: 0px;
            height: 0px;
            }
            """
            
        if style == "line-keys":
            xdistl = 0
            xdistr = -2
            stylesheet = """
            QWidget {
            background-color: black;
            }
            
            QLabel {
            color: white;
            text-align: center;
            }
    
            QPushButton {
            border: 6px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            text-align: center;
            }
        
            QPushButton:focus {
            border: 10px solid;
            border-left-color: white;
            }
        
            QPushButton:pressed {
            border: 4px solid;
            border-left-color: gray;
            }
        
            QCheckBox {
            border: 6px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            }
        
            QCheckBox:focus {
            border: 10px solid;
            border-left-color: white;
            }
        
            QCheckBox:pressed {
            border: 6px solid;
            border-left-color: gray;
            }
        
            QCheckBox:checked {
            color: green;
            }
        
            QCheckBox:unchecked {
            color: red;
            }
        
            QCheckBox::indicator {
            width: 0px;
            height: 0px;
            }
            """
            
        if style == "line-touch":
            xdistl = 0
            xdistr = -2
            stylesheet = """
            QWidget {
            background-color: black;
            }
            
            QLabel {
            color: white;
            text-align: center;
            }
    
            QPushButton {
            border: 8px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            text-align: center;
            }
        
            QPushButton:pressed {
            border: 4px solid;
            border-left-color: gray;
            }
        
            QCheckBox {
            border: 6px solid;
            border-left-color: lightgray;
            border-right-color: black;
            border-top-color: black;
            border-bottom-color: black;
            color: white;
            }
        
            QCheckBox:pressed {
            border: 6px solid;
            border-left-color: gray;
            }
        
            QCheckBox:checked {
            color: green;
            }
        
            QCheckBox:unchecked {
            color: red;
            }
        
            QCheckBox::indicator {
            width: 0px;
            height: 0px;
            }
            """

        self.setStyleSheet(stylesheet)
        
    def quit(self):
        os.system("pkill raspistill")
        os.system("pkill feh")
        self.close()
        print("Quit")
        sys.exit(0)
    
    #Create Button
    def button(self, x, y, w, h, Label, font_size, Command, visibility):
        button = QPushButton(Label, self)
        button.move(x, y)
        button.resize(w, h)
        button.clicked.connect(Command)
        button.setFont(QFont("Arial", font_size))
        if not visibility:
            button.hide()
            
        return button
    
    #Create CheckBox
    def checkbox(self, x, y, w, h, Label, font_size, State, Command, visibility):
        checkbox = QCheckBox(Label, self)
        checkbox.move(x, y)
        checkbox.resize(w, h)
        checkbox.setChecked(State)
        checkbox.stateChanged.connect(Command)
        checkbox.setFont(QFont("Arial", font_size))
        if not visibility:
            checkbox.hide()
            
        return checkbox
    
    #Create Label
    def label(self, x, y, w, h, Label, font_size, visibility):
        label = QLabel(Label, self)
        label.move(x, y)
        label.resize(w, h)
        label.setFont(QFont("Arial", font_size))
        if not visibility:
            label.hide()
            
        return label
        

##Create window instance##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
App = QApplication(sys.argv)
Menu = Window()


##Print settings##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
def print_settings():
        print("##Picture Settings:##")
        print("ISO:", setting_ISO_hr())
        print("SS :", setting_SS_hr())
        print("AWB:", setting_AWB)
        print("EXP:", setting_EXP)
        print("EXM:", setting_EXM)
        print()
        print("##Additional Settings:##")
        print("FoM:         ", setting_FoM)
        print("raw Bayer:   ", setting_raw)
        print("Anti-Flicker:", setting_flicker)
        print("H Flip:      ", setting_hf)
        print("V Flip:      ", setting_vf)
        print()

if debugging:
    print_settings()
    

##Camera preview and capture##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#Make raspistill command
def raspistill_command():
    #Output
    year = datetime.date.today().year
    month = datetime.date.today().month
    if month < 10:
        arg_output_prefix = setting_output_prefix + str(year) + "0"
    else:
        arg_output_prefix = setting_output_prefix + str(year)
    if setting_raw:
        arg_output_suffix = setting_output_suffix_raw
    else:
        arg_output_suffix = setting_output_suffix_noraw
    
    #Arguments
    arg_needed = "-t 0 -dt -s "
    
    arg_preview   = "-p "  + str(wmenu) + ",0," + str(wpreview) + "," + str(h) + " "
    arg_output    = "-o "  + setting_output_location + "/" + arg_output_prefix + "%d" + arg_output_suffix + "." + setting_encoding + " "
    arg_encoding  = "-e "  + setting_encoding     + " "
    arg_mode      = "-md " + str(setting_mode)    + " "
    arg_quality   = "-q "  + str(setting_quality) + " "
    arg_thumbnail = "-th " + setting_thumbnail    + " "
    
    arg_ISO = "-ISO " + str(setting_ISO) + " "
    arg_SS  = "-ss "  + str(setting_SS)  + " "
    arg_AWB = "-awb " + str(setting_AWB) + " "
    arg_EXP = "-ex "  + str(setting_EXP) + " "
    arg_EXM = "-mm "  + str(setting_EXM) + " "
    
    arg_FoM     = "-fw "
    arg_raw     = "-r "
    arg_flicker = "-fli " + str(setting_flicker) + " "
    arg_hf      = "-hf "
    arg_vf      = "-vf "
    
    arg_artist = "-x IFD1.Artist='" + setting_photographer + "'"
    
    
    #Make Command
    command  = "raspistill "
    command += arg_needed
    command += arg_preview
    command += arg_output
    command += arg_encoding
    command += arg_mode
    command += arg_quality
    command += arg_thumbnail
    command += arg_ISO
    command += arg_SS
    command += arg_AWB
    command += arg_EXP
    command += arg_EXM
    if setting_FoM:
        command += arg_FoM
    if setting_raw:
        command += arg_raw
    command += arg_flicker
    if setting_hf:
        command += arg_hf
    if setting_vf:
        command += arg_vf
    command += arg_artist
    #Debugging message
    if debugging:
        print("##raspistill command:##")
        print(command)
        print("")
        
    return command + "&"

#Launch (or) relaunch raspistill. Needs to be run each time camera settings change
def raspistill():
    os.system("pkill feh")
    os.system("pkill raspistill")
    Menu.resize(wscreen, h)
    raspistill = raspistill_command()
    os.system(raspistill)
    
raspistill()

#capture image
def capture():
    os.system("pkill -USR1 raspistill")
    update_i_storage()
    #Debugging message
    if debugging:
        print("Image captured")


##Image viever##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#Make feh command
def feh_command():
    arg_path = setting_output_location + " "
    arg_geometry = "-x -g " + str(wpreview) + "x" + str(h) + "+" + str(wmenu) + "+0 -. "
    arg_needed = "-n -d -Y -B black -N --edit "
    arg_cursor = "-Y "
    
    command  = "feh "
    command += arg_path
    command += arg_geometry
    command += arg_needed
    if cursor_hidden:
        command += arg_cursor
    #Debugging message
    if debugging:
        print("##feh command:##")
        print(command)
        print("")
    
    return command + "&"


def feh():
    os.system("pkill raspistill")
    feh = feh_command()
    os.system(feh)
    sleep(1)#Increrase if feh takes long to open
    Menu.resize(wmenu, h)
    Menu.activateWindow()


##GPIO & simulated keys##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
keyboard = Controller()
#Shoot picture button
def gpio_button_capture_pressed():
    capture()
#Simulate the correct Keypresses from GPIO
def gpio_button_up_pressed():
    keyboard.press(Key.up)
    keyboard.release(Key.up)
def gpio_button_select_pressed():
    keyboard.press(Key.space)
    keyboard.release(Key.space)
    sleep(0.2) #Prevent accidental "double press"
def gpio_button_down_pressed():
    keyboard.press(Key.down)
    keyboard.release(Key.down)

#Test for GPIO button presses
button_capture.when_pressed = gpio_button_capture_pressed
button_up.when_pressed      = gpio_button_up_pressed
button_select.when_pressed  = gpio_button_select_pressed
button_down.when_pressed    = gpio_button_down_pressed

#Simulate Keypress from QPushButton
def simulate_alt_tab(): #workaround for now :)
    alt_tab_delay = 0.1
    keyboard.press(Key.alt)
    keyboard.press(Key.tab)
    sleep(alt_tab_delay)
    keyboard.release(Key.tab)
    keyboard.release(Key.alt)
    sleep(alt_tab_delay)
def simulate_button_PIC_next_pressed():
    simulate_alt_tab()
    keyboard.press(Key.right)
    keyboard.release(Key.right)
def simulate_button_PIC_prev_pressed():
    simulate_alt_tab()
    keyboard.press(Key.left)
    keyboard.release(Key.left)
def simulate_button_PIC_zi_pressed():
    simulate_alt_tab()
    keyboard.press(Key.up)
    keyboard.release(Key.up)
def simulate_button_PIC_zo_pressed():
    simulate_alt_tab()
    keyboard.press(Key.down)
    keyboard.release(Key.down)
def simulate_button_PIC_rotr_pressed():
    simulate_alt_tab()
    keyboard.press(">")
    keyboard.release(">")
def simulate_button_PIC_rotl_pressed():
    simulate_alt_tab()
    keyboard.press("<")
    keyboard.release("<")
def simulate_button_PIC_del_pressed():
    simulate_alt_tab()
    keyboard.press(Key.ctrl)
    keyboard.press(Key.delete)
    keyboard.release(Key.delete)
    keyboard.release(Key.ctrl)


##Button pressed actions##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#Button action Main Menu
def button_ISO_pressed():
    visibility_Menu(False)
    visibility_Menu_ISO(True)
def button_SS_pressed():
    visibility_Menu(False)
    visibility_Menu_SS_1(True)
def button_AWB_pressed():
    visibility_Menu(False)
    visibility_Menu_AWB(True)
def button_EXP_pressed():
    visibility_Menu(False)
    visibility_Menu_EXP(True)
def button_ETC_pressed():
    visibility_Menu_ETC(True)
    visibility_Menu(False)


#Button action ISO Menu
def button_ISO_any_act(value):
    global setting_ISO
    setting_ISO = value
    visibility_Menu_ISO(False)
    visibility_Menu(True)


#Button action SS Menu 1
def button_SS_UP_1_pressed():
    visibility_Menu_SS_1(False)
    visibility_Menu_SS_3(True)
def button_SS_DOWN_1_pressed():
    visibility_Menu_SS_1(False)
    visibility_Menu_SS_2(True)
def button_SS_1_act(value):
    global setting_SS
    setting_SS = value
    visibility_Menu_SS_1(False)
    visibility_Menu(True)
    
#Button action SS Menu 2
def button_SS_UP_2_pressed():
    visibility_Menu_SS_2(False)
    visibility_Menu_SS_1(True)
def button_SS_DOWN_2_pressed():
    visibility_Menu_SS_2(False)
    visibility_Menu_SS_3(True)
def button_SS_2_act(value):
    global setting_SS
    setting_SS = value
    visibility_Menu_SS_2(False)
    visibility_Menu(True)
    
#Button action SS Menu 3
def button_SS_UP_3_pressed():
    visibility_Menu_SS_3(False)
    visibility_Menu_SS_2(True)
def button_SS_DOWN_3_pressed():
    visibility_Menu_SS_3(False)
    visibility_Menu_SS_1(True)
def button_SS_3_act(value):
    global setting_SS
    setting_SS = value
    visibility_Menu_SS_3(False)
    visibility_Menu(True)


#Button action AWB Menu
def button_AWB_any_act(mode):
    global setting_AWB
    setting_AWB = mode
    visibility_Menu_AWB(False)
    visibility_Menu(True)


#Button action EXP Menu
def button_EXP_mode_pressed(): #Switch menu
    visibility_Menu_EXP(False)
    visibility_Menu_EXP_Mode(True)
def button_EXM_any_act(mode):
    global setting_EXM
    setting_EXM = mode
    visibility_Menu_EXP(False)
    visibility_Menu(True)


#Button action EXP Mode Menu
def button_EXP_any_act(mode):
    global setting_EXP
    setting_EXP = mode
    visibility_Menu_EXP_Mode(False)
    visibility_Menu(True)
    

#Button action ETC Menu
def button_ETC_ADV_pressed():
    visibility_Menu_ETC(False)
    visibility_Menu_ADV(True)
def button_ETC_PIC_pressed():
    visibility_Menu_ETC(False)
    feh()
    visibility_Menu_PIC(True)
def button_ETC_BACK_pressed():
    visibility_Menu_ETC(False)
    visibility_Menu(True)
    

#Button action ADV Menu
def button_ADV_poweroff_pressed():
    os.system("poweroff")
def button_ADV_quit_pressed():
    Menu.quit()
def button_ADV_BACK_pressed():
    visibility_Menu_ADV(False)
    visibility_Menu_ETC(True)
    
    

#Button action PIC Menu
def button_PIC_next_pressed():
    simulate_button_PIC_next_pressed()
    Menu.activateWindow()
def button_PIC_prev_pressed():
    simulate_button_PIC_prev_pressed()
    Menu.activateWindow()
def button_PIC_zi_pressed():
    simulate_button_PIC_zi_pressed()
    Menu.activateWindow()
def button_PIC_zo_pressed():
    simulate_button_PIC_zo_pressed()
    Menu.activateWindow()
def button_PIC_rotr_pressed():
    simulate_button_PIC_rotr_pressed()
    Menu.activateWindow()
def button_PIC_rotl_pressed():
    simulate_button_PIC_rotl_pressed()
    Menu.activateWindow()
def button_PIC_del_pressed():
    simulate_button_PIC_del_pressed()
    Menu.activateWindow()
def button_PIC_BAK_pressed():
    visibility_Menu_PIC(False)
    visibility_Menu(True)
    

##CheckBox checked actions##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
#CheckBox action ETC
def checkbox_ETC_FoM_pressed():
    global setting_FoM
    setting_FoM = not setting_FoM
def checkbox_ETC_raw_pressed():
    global setting_raw
    setting_raw = not setting_raw
def checkbox_ETC_flicker_pressed():
    global setting_flicker
    global setting_flicker_init
    if setting_flicker == "50hz" or setting_flicker == "60hz" or setting_flicker == "auto":
        setting_flicker = "off"
    else:
        setting_flicker = setting_flicker_init
def checkbox_ETC_hf_pressed():
    global setting_hf
    setting_hf = not setting_hf
def checkbox_ETC_vf_pressed():
    global setting_vf
    setting_vf = not setting_vf
    
#CheckBox action ADV
def checkbox_ADV_USB_pressed():
    global setting_USB
    if setting_USB:
        setting_USB_set(False)
    else:
        setting_USB_set(True)
    setting_USB = not setting_USB
def checkbox_ADV_HDMI_pressed():
    global setting_HDMI
    if setting_HDMI:
        setting_HDMI_set(False)
    else:
        setting_HDMI_set(True)
    setting_HDMI = not setting_HDMI
def checkbox_ADV_WiFi_pressed():
    global setting_WiFi
    if setting_WiFi:
        setting_WiFi_set(False)
    else:
        setting_WiFi_set(True)
    setting_WiFi = not setting_WiFi
def checkbox_ADV_SSH_pressed():
    global setting_SSH
    if setting_SSH:
        setting_SSH_set(False)
    else:
        setting_SSH_set(True)
def checkbox_ADV_VNC_pressed():
    global setting_VNC
    if setting_VNC:
        setting_VNC_set(False)
    else:
        setting_VNC_set(True)
    setting_VNC = not setting_VNC


##Preview label##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
label_preview = Menu.label(wmenu, 0, wpreview, h, "⌛", 60, True)
label_preview.setAlignment(Qt.AlignCenter) #Align


##Create menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
ydist = 20
button_w = wmenu - (xdistl + xdistr) * 2
button_h = h/8
button_dist = button_h + h/24
#Create buttons for Main Menu
button_ISO = Menu.button(xdistl, ydist + button_dist*0, button_w, button_h, "ISO", 26, button_ISO_pressed, True)
button_SS  = Menu.button(xdistl, ydist + button_dist*1, button_w, button_h,  "SS", 26,  button_SS_pressed, True)
button_AWB = Menu.button(xdistl, ydist + button_dist*2, button_w, button_h, "AWB", 26, button_AWB_pressed, True)
button_EXP = Menu.button(xdistl, ydist + button_dist*3, button_w, button_h, "EXP", 26, button_EXP_pressed, True)
button_ETC = Menu.button(xdistl,  h - ydist - button_h, button_w, button_h,   "⚙", 30, button_ETC_pressed, True)
#Change visibility of Main Menu
def visibility_Menu(visibility):
    if visibility:
        button_ISO.show()
        button_SS.show()
        button_AWB.show()
        button_EXP.show()
        button_ETC.show()
        button_ISO.setFocus() #Set Focus
        if debugging:
            print_settings() #Print changed settings to console if debugging
        raspistill() #Refresh preview
        update_i_settings() #Update info menu
    else:
        button_ISO.hide()
        button_SS.hide()
        button_AWB.hide()
        button_EXP.hide()
        button_ETC.hide()


##Create ISO menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_ISO_h = h/11
button_ISO_dist = (h - 2*ydist - button_ISO_h)/7
#Create buttons for ISO Menu
button_ISO_auto = Menu.button(xdistl, ydist + button_ISO_dist*0, button_w, button_ISO_h, "AUTO", 18, lambda: button_ISO_any_act(0),   False)
button_ISO_100  = Menu.button(xdistl, ydist + button_ISO_dist*1, button_w, button_ISO_h,  "100", 24, lambda: button_ISO_any_act(100), False)
button_ISO_200  = Menu.button(xdistl, ydist + button_ISO_dist*2, button_w, button_ISO_h,  "200", 24, lambda: button_ISO_any_act(200), False)
button_ISO_320  = Menu.button(xdistl, ydist + button_ISO_dist*3, button_w, button_ISO_h,  "320", 24, lambda: button_ISO_any_act(320), False)
button_ISO_400  = Menu.button(xdistl, ydist + button_ISO_dist*4, button_w, button_ISO_h,  "400", 24, lambda: button_ISO_any_act(400), False)
button_ISO_500  = Menu.button(xdistl, ydist + button_ISO_dist*5, button_w, button_ISO_h,  "500", 24, lambda: button_ISO_any_act(500), False)
button_ISO_640  = Menu.button(xdistl, ydist + button_ISO_dist*6, button_w, button_ISO_h,  "640", 24, lambda: button_ISO_any_act(640), False)
button_ISO_800  = Menu.button(xdistl, ydist + button_ISO_dist*7, button_w, button_ISO_h,  "800", 24, lambda: button_ISO_any_act(800), False)
#Change visibility of ISO Menu
def visibility_Menu_ISO(visibility):
    if visibility:
        button_ISO_auto.show()
        button_ISO_100.show()
        button_ISO_200.show()
        button_ISO_320.show()
        button_ISO_400.show()
        button_ISO_500.show()
        button_ISO_640.show()
        button_ISO_800.show()
        button_ISO_auto.setFocus() #Set Focus
    else:
        button_ISO_auto.hide()
        button_ISO_100.hide()
        button_ISO_200.hide()
        button_ISO_320.hide()
        button_ISO_400.hide()
        button_ISO_500.hide()
        button_ISO_640.hide()
        button_ISO_800.hide()


##Create SS menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_SS_h = h/12
button_SS_dist = (h - 2*ydist - button_SS_h)/8
#Create buttons for SS Menu 1
button_SS_UP_1     = Menu.button(xdistl, ydist + button_SS_dist*0, button_w, button_SS_h,      "▲", 20, button_SS_UP_1_pressed,            False)
button_SS_1000     = Menu.button(xdistl, ydist + button_SS_dist*1, button_w, button_SS_h, "1/1000", 18, lambda: button_SS_1_act(1000),     False)
button_SS_2000     = Menu.button(xdistl, ydist + button_SS_dist*2, button_w, button_SS_h,  "1/500", 18, lambda: button_SS_1_act(2000),     False)
button_SS_4000     = Menu.button(xdistl, ydist + button_SS_dist*3, button_w, button_SS_h,  "1/250", 18, lambda: button_SS_1_act(4000),     False)
button_SS_8000     = Menu.button(xdistl, ydist + button_SS_dist*4, button_w, button_SS_h,  "1/125", 18, lambda: button_SS_1_act(8000),     False)
button_SS_16667    = Menu.button(xdistl, ydist + button_SS_dist*5, button_w, button_SS_h,   "1/60", 18, lambda: button_SS_1_act(16667),    False)
button_SS_33333    = Menu.button(xdistl, ydist + button_SS_dist*6, button_w, button_SS_h,   "1/30", 18, lambda: button_SS_1_act(33333),    False)
button_SS_66667    = Menu.button(xdistl, ydist + button_SS_dist*7, button_w, button_SS_h,   "1/15", 18, lambda: button_SS_1_act(66667),    False)
button_SS_DOWN_1   = Menu.button(xdistl, ydist + button_SS_dist*8, button_w, button_SS_h,      "▼", 20, button_SS_DOWN_1_pressed,          False)
#Change visibility of SS Menu 1
def visibility_Menu_SS_1(visibility):
    if visibility:
        button_SS_UP_1.show()
        button_SS_1000.show()
        button_SS_2000.show()
        button_SS_4000.show()
        button_SS_8000.show()
        button_SS_16667.show()
        button_SS_33333.show()
        button_SS_66667.show()
        button_SS_DOWN_1.show()
        button_SS_8000.setFocus() #Set Focus
    else:
        button_SS_UP_1.hide()
        button_SS_1000.hide()
        button_SS_2000.hide()
        button_SS_4000.hide()
        button_SS_8000.hide()
        button_SS_16667.hide()
        button_SS_33333.hide()
        button_SS_66667.hide()
        button_SS_DOWN_1.hide()
        
#Create buttons for SS Menu 2
button_SS_UP_2     = Menu.button(xdistl, ydist + button_SS_dist*0, button_w, button_SS_h,      "▲", 20, button_SS_UP_2_pressed,            False)
button_SS_125000   = Menu.button(xdistl, ydist + button_SS_dist*1, button_w, button_SS_h,    "1/8", 18, lambda: button_SS_2_act(125000),   False)
button_SS_250000   = Menu.button(xdistl, ydist + button_SS_dist*2, button_w, button_SS_h,    "1/4", 18, lambda: button_SS_2_act(250000),   False)
button_SS_500000   = Menu.button(xdistl, ydist + button_SS_dist*3, button_w, button_SS_h,    "1/2", 18, lambda: button_SS_2_act(500000),   False)
button_SS_1000000  = Menu.button(xdistl, ydist + button_SS_dist*4, button_w, button_SS_h,      "1", 18, lambda: button_SS_2_act(1000000),  False)
button_SS_2000000  = Menu.button(xdistl, ydist + button_SS_dist*5, button_w, button_SS_h,      "2", 18, lambda: button_SS_2_act(2000000),  False)
button_SS_4000000  = Menu.button(xdistl, ydist + button_SS_dist*6, button_w, button_SS_h,      "4", 18, lambda: button_SS_2_act(4000000),  False)
button_SS_8000000  = Menu.button(xdistl, ydist + button_SS_dist*7, button_w, button_SS_h,      "8", 18, lambda: button_SS_2_act(8000000),  False)
button_SS_DOWN_2   = Menu.button(xdistl, ydist + button_SS_dist*8, button_w, button_SS_h,      "▼", 20, button_SS_DOWN_2_pressed,          False)
#Change visibility of SS Menu 2
def visibility_Menu_SS_2(visibility):
    if visibility:
        button_SS_UP_2.show()
        button_SS_125000.show()
        button_SS_250000.show()
        button_SS_500000.show()
        button_SS_1000000.show()
        button_SS_2000000.show()
        button_SS_4000000.show()
        button_SS_8000000.show()
        button_SS_DOWN_2.show()
        button_SS_1000000.setFocus() #Set Focus
    else:
        button_SS_UP_2.hide()
        button_SS_125000.hide()
        button_SS_250000.hide()
        button_SS_500000.hide()
        button_SS_1000000.hide()
        button_SS_2000000.hide()
        button_SS_4000000.hide()
        button_SS_8000000.hide()
        button_SS_DOWN_2.hide()
        
#Create buttons for SS Menu 3
button_SS_UP_3     = Menu.button(xdistl, ydist + button_SS_dist*0, button_w, button_SS_h,      "▲", 20, button_SS_UP_3_pressed,            False)
button_SS_15000000 = Menu.button(xdistl, ydist + button_SS_dist*1, button_w, button_SS_h,     "15", 18, lambda: button_SS_3_act(15000000), False)
button_SS_30000000 = Menu.button(xdistl, ydist + button_SS_dist*2, button_w, button_SS_h,     "30", 18, lambda: button_SS_3_act(30000000), False)
button_SS_60000000 = Menu.button(xdistl, ydist + button_SS_dist*3, button_w, button_SS_h,     "60", 18, lambda: button_SS_3_act(60000000), False)
button_SS_auto     = Menu.button(xdistl, ydist + button_SS_dist*4, button_w, button_SS_h,   "AUTO", 18, lambda: button_SS_3_act(0),        False)
button_SS_125      = Menu.button(xdistl, ydist + button_SS_dist*5, button_w, button_SS_h, "1/8000", 18, lambda: button_SS_3_act(125),      False)
button_SS_250      = Menu.button(xdistl, ydist + button_SS_dist*6, button_w, button_SS_h, "1/4000", 18, lambda: button_SS_3_act(250),      False)
button_SS_500      = Menu.button(xdistl, ydist + button_SS_dist*7, button_w, button_SS_h, "1/2000", 18, lambda: button_SS_3_act(500),      False)
button_SS_DOWN_3   = Menu.button(xdistl, ydist + button_SS_dist*8, button_w, button_SS_h,      "▼", 20, button_SS_DOWN_3_pressed,          False)
#Change visibility of SS Menu 3
def visibility_Menu_SS_3(visibility):
    if visibility:
        button_SS_UP_3.show()
        button_SS_15000000.show()
        button_SS_30000000.show()
        button_SS_60000000.show()
        button_SS_auto.show()
        button_SS_125.show()
        button_SS_250.show()
        button_SS_500.show()
        button_SS_DOWN_3.show()
        button_SS_auto.setFocus() #Set Focus
    else:
        button_SS_UP_3.hide()
        button_SS_15000000.hide()
        button_SS_30000000.hide()
        button_SS_60000000.hide()
        button_SS_auto.hide()
        button_SS_125.hide()
        button_SS_250.hide()
        button_SS_500.hide()
        button_SS_DOWN_3.hide()
        

##Create AWB menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_AWB_h = h/12
button_AWB_dist = (h - 2*ydist - button_AWB_h)/8
#Create buttons for AWB Menu
button_AWB_auto         = Menu.button(xdistl, ydist + button_AWB_dist*0, button_w, button_AWB_h,  "AUTO", 18, lambda: button_AWB_any_act("auto"),         False)
button_AWB_sunlight     = Menu.button(xdistl, ydist + button_AWB_dist*1, button_w, button_AWB_h,     "☀", 22, lambda: button_AWB_any_act("sun"),          False)
button_AWB_cloudy       = Menu.button(xdistl, ydist + button_AWB_dist*2, button_w, button_AWB_h,     "☁", 22, lambda: button_AWB_any_act("cloud"),        False)
button_AWB_shade        = Menu.button(xdistl, ydist + button_AWB_dist*3, button_w, button_AWB_h,     "⛱️", 20, lambda: button_AWB_any_act("shade"),        False)
button_AWB_tungsten     = Menu.button(xdistl, ydist + button_AWB_dist*4, button_w, button_AWB_h, " 💡 W", 18, lambda: button_AWB_any_act("tungsten"),     False)
button_AWB_fluorescent  = Menu.button(xdistl, ydist + button_AWB_dist*5, button_w, button_AWB_h,  "💡 F", 18, lambda: button_AWB_any_act("fluorescent"),  False)
button_AWB_incandescent = Menu.button(xdistl, ydist + button_AWB_dist*6, button_w, button_AWB_h, "💡 I ", 18, lambda: button_AWB_any_act("incandescent"), False)
button_AWB_flash        = Menu.button(xdistl, ydist + button_AWB_dist*7, button_w, button_AWB_h, " 💡 ⚡", 18, lambda: button_AWB_any_act("flash"),        False)
button_AWB_horizon      = Menu.button(xdistl, ydist + button_AWB_dist*8, button_w, button_AWB_h,    "🛣️", 20, lambda: button_AWB_any_act("horizon"),      False)
#Change visibility of AWB Menu
def visibility_Menu_AWB(visibility):
    if visibility:
        button_AWB_auto.show()
        button_AWB_sunlight.show()
        button_AWB_cloudy.show()
        button_AWB_shade.show()
        button_AWB_tungsten.show()
        button_AWB_fluorescent.show()
        button_AWB_incandescent.show()
        button_AWB_flash.show()
        button_AWB_horizon.show()
        button_AWB_auto.setFocus() #Set Focus
    else:
        button_AWB_auto.hide()
        button_AWB_sunlight.hide()
        button_AWB_cloudy.hide()
        button_AWB_shade.hide()
        button_AWB_tungsten.hide()
        button_AWB_fluorescent.hide()
        button_AWB_incandescent.hide()
        button_AWB_flash.hide()
        button_AWB_horizon.hide()


##Create EXM menus##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_EXM_h = h/8
button_EXM_dist = button_EXM_h + h/24
#Create buttons for EXP (Metering) Menu
button_EXM_average   = Menu.button(xdistl, ydist + button_EXM_dist*0, button_w, button_EXM_h,    "∅", 28, lambda: button_EXM_any_act("average"),   False)
button_EXM_matrix    = Menu.button(xdistl, ydist + button_EXM_dist*1, button_w, button_EXM_h,    "◯", 22, lambda: button_EXM_any_act("matrix"),    False)
button_EXM_spot      = Menu.button(xdistl, ydist + button_EXM_dist*2, button_w, button_EXM_h,    "·", 22, lambda: button_EXM_any_act("spot"),      False)
button_EXM_backlit   = Menu.button(xdistl, ydist + button_EXM_dist*3, button_w, button_EXM_h,   "⚞I", 22, lambda: button_EXM_any_act("backlit"),   False)
button_EXP_mode      = Menu.button(xdistl,  h - ydist - button_EXM_h, button_w, button_EXM_h, "MODE", 18, button_EXP_mode_pressed,                 False)
#Change visibility of EXM Menu
def visibility_Menu_EXP(visibility):
    if visibility:
        button_EXM_average.show()
        button_EXM_matrix.show()
        button_EXM_spot.show()
        button_EXM_backlit.show()
        button_EXP_mode.show()
        button_EXM_matrix.setFocus() #Set Focus
    else:
        button_EXM_average.hide()
        button_EXM_matrix.hide()
        button_EXM_spot.hide()
        button_EXM_backlit.hide()
        button_EXP_mode.hide()
        

##Create EXP menus##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_EXP_h = h/12
button_EXP_dist = (h - 2*ydist - button_EXP_h)/8
#Create buttons for EXP Mode Menu
button_EXP_auto      = Menu.button(xdistl, ydist + button_EXP_dist*0, button_w, button_EXP_h, "AUTO", 18, lambda: button_EXP_any_act("auto"),      False)
button_EXP_night     = Menu.button(xdistl, ydist + button_EXP_dist*1, button_w, button_EXP_h,   " ☾", 20, lambda: button_EXP_any_act("night"),     False)
button_EXP_backlight = Menu.button(xdistl, ydist + button_EXP_dist*2, button_w, button_EXP_h,   "⚞I", 22, lambda: button_EXP_any_act("backlight"), False)
button_EXP_spotlight = Menu.button(xdistl, ydist + button_EXP_dist*3, button_w, button_EXP_h,    "☄", 22, lambda: button_EXP_any_act("spotlight"), False)
button_EXP_sports    = Menu.button(xdistl, ydist + button_EXP_dist*4, button_w, button_EXP_h,    "🚴", 22, lambda: button_EXP_any_act("sports"),    False)
button_EXP_snow      = Menu.button(xdistl, ydist + button_EXP_dist*5, button_w, button_EXP_h,    "☃", 22, lambda: button_EXP_any_act("snow"),      False)
button_EXP_beach     = Menu.button(xdistl, ydist + button_EXP_dist*6, button_w, button_EXP_h,    "🏖️", 20, lambda: button_EXP_any_act("beach"),     False)
button_EXP_fireworks = Menu.button(xdistl, ydist + button_EXP_dist*7, button_w, button_EXP_h,    "🎆", 20, lambda: button_EXP_any_act("fireworks"), False)
button_EXP_antishake = Menu.button(xdistl, ydist + button_EXP_dist*8, button_w, button_EXP_h,    "👋", 22, lambda: button_EXP_any_act("antishake"), False)
#Cange visibility of EXP Mode Menu
def visibility_Menu_EXP_Mode(visibility):
    if visibility:
        button_EXP_auto.show()
        button_EXP_night.show()
        button_EXP_backlight.show()
        button_EXP_spotlight.show()
        button_EXP_sports.show()
        button_EXP_snow.show()
        button_EXP_beach.show()
        button_EXP_fireworks.show()
        button_EXP_antishake.show()
        button_EXP_auto.setFocus() #Set Focus
    else:
        button_EXP_auto.hide()
        button_EXP_night.hide()
        button_EXP_backlight.hide()
        button_EXP_spotlight.hide()
        button_EXP_sports.hide()
        button_EXP_snow.hide()
        button_EXP_beach.hide()
        button_EXP_fireworks.hide()
        button_EXP_antishake.hide()


##Create ECT menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
checkbox_w = button_w
checkbox_ETC_h = h/12
checkbox_ETC_dist = checkbox_ETC_h + h/50
button_ETC_h = h/10
button_ETC_dist = button_ETC_h + h/50
checkbox_ETC_FoM     = Menu.checkbox(xdistl, ydist + checkbox_ETC_dist*0, checkbox_w, checkbox_ETC_h, "FoM", 18, setting_FoM,               checkbox_ETC_FoM_pressed,     False)
checkbox_ETC_raw     = Menu.checkbox(xdistl, ydist + checkbox_ETC_dist*1, checkbox_w, checkbox_ETC_h, "RAW", 18, setting_raw,               checkbox_ETC_raw_pressed,     False)
checkbox_ETC_flicker = Menu.checkbox(xdistl, ydist + checkbox_ETC_dist*2, checkbox_w, checkbox_ETC_h,  "Hz", 18, setting_flicker_init_bool, checkbox_ETC_flicker_pressed, False)
checkbox_ETC_hf      = Menu.checkbox(xdistl, ydist + checkbox_ETC_dist*3, checkbox_w, checkbox_ETC_h,  "HF", 18, setting_hf,                checkbox_ETC_hf_pressed,      False)
checkbox_ETC_vf      = Menu.checkbox(xdistl, ydist + checkbox_ETC_dist*4, checkbox_w, checkbox_ETC_h,  "VF", 18, setting_vf,                checkbox_ETC_vf_pressed,      False)
button_ETC_ADV       = Menu.button(xdistl, h - ydist - button_ETC_h - button_ETC_dist*2, button_w, button_ETC_h, "⚒",    24, button_ETC_ADV_pressed,  False)
button_ETC_PIC       = Menu.button(xdistl, h - ydist - button_ETC_h - button_ETC_dist*1, button_w, button_ETC_h, "🏖️", 24, button_ETC_PIC_pressed,  False)
button_ETC_BACK      = Menu.button(xdistl, h - ydist - button_ETC_h - button_ETC_dist*0, button_w, button_ETC_h,   "↩", 32, button_ETC_BACK_pressed, False)
#Change visibility of ETC Menu
def visibility_Menu_ETC(visibility):
    if visibility:
        checkbox_ETC_FoM.show()
        checkbox_ETC_raw.show()
        checkbox_ETC_flicker.show()
        checkbox_ETC_hf.show()
        checkbox_ETC_vf.show()
        button_ETC_ADV.show()
        button_ETC_PIC.show()
        button_ETC_BACK.show()
        button_ETC_BACK.setFocus() #Set Focus
    else:
        checkbox_ETC_FoM.hide()
        checkbox_ETC_raw.hide()
        checkbox_ETC_flicker.hide()
        checkbox_ETC_hf.hide()
        checkbox_ETC_vf.hide()
        button_ETC_ADV.hide()
        button_ETC_PIC.hide()
        button_ETC_BACK.hide()


##Create ADV menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
checkbox_ADV_h = h/12
checkbox_ADV_dist = checkbox_ADV_h + h/50
button_ADV_h = h/10
button_ADV_dist = button_ADV_h + h/50
checkbox_ADV_USB  = Menu.checkbox(xdistl, ydist + checkbox_ADV_dist*0, checkbox_w, checkbox_ADV_h, "USB",  18,  setting_USB, checkbox_ADV_USB_pressed,  False)
checkbox_ADV_HDMI  = Menu.checkbox(xdistl, ydist + checkbox_ADV_dist*1, checkbox_w, checkbox_ADV_h, "HDMI", 18, setting_HDMI, checkbox_ADV_HDMI_pressed, False)
checkbox_ADV_WiFi = Menu.checkbox(xdistl, ydist + checkbox_ADV_dist*2, checkbox_w, checkbox_ADV_h, "WiFi", 18, setting_WiFi, checkbox_ADV_WiFi_pressed, False)
checkbox_ADV_SSH  = Menu.checkbox(xdistl, ydist + checkbox_ADV_dist*3, checkbox_w, checkbox_ADV_h, "SSH",  18,  setting_SSH, checkbox_ADV_SSH_pressed,  False)
checkbox_ADV_VNC  = Menu.checkbox(xdistl, ydist + checkbox_ADV_dist*4, checkbox_w, checkbox_ADV_h, "VNC",  18,  setting_VNC, checkbox_ADV_VNC_pressed,  False)
button_ADV_poweroff = Menu.button(xdistl, h - ydist - button_ADV_h - button_ADV_dist*2, button_w, button_ADV_h, "↴", 30, button_ADV_poweroff_pressed, False)
button_ADV_quit     = Menu.button(xdistl, h - ydist - button_ADV_h - button_ADV_dist*1, button_w, button_ADV_h, "✕", 30, button_ADV_quit_pressed,     False)
button_ADV_BACK     = Menu.button(xdistl, h - ydist - button_ADV_h - button_ADV_dist*0, button_w, button_ADV_h, "↩", 32, button_ADV_BACK_pressed,     False)
#Change visibility of ADV Menu
def visibility_Menu_ADV(visibility):
    if visibility:
        checkbox_ADV_USB.show()
        checkbox_ADV_HDMI.show()
        checkbox_ADV_WiFi.show()
        checkbox_ADV_SSH.show()
        checkbox_ADV_VNC.show()
        button_ADV_poweroff.show()
        button_ADV_quit.show()
        button_ADV_BACK.show()
        button_ADV_BACK.setFocus() #Set Focus
    else:
        checkbox_ADV_USB.hide()
        checkbox_ADV_HDMI.hide()
        checkbox_ADV_WiFi.hide()
        checkbox_ADV_SSH.hide()
        checkbox_ADV_VNC.hide()
        button_ADV_poweroff.hide()
        button_ADV_quit.hide()
        button_ADV_BACK.hide()


##Create PIC menu##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
button_PIC_h = h/12
button_PIC_dist = button_PIC_h + h/50
#Create buttons for PIC (Metering) Menu
button_PIC_next = Menu.button(xdistl, ydist + button_PIC_dist*0, button_w, button_PIC_h,    "►", 20, button_PIC_next_pressed,   False)
button_PIC_prev = Menu.button(xdistl, ydist + button_PIC_dist*1, button_w, button_PIC_h,    "◄", 20, button_PIC_prev_pressed,   False)
button_PIC_zi   = Menu.button(xdistl, ydist + button_PIC_dist*2, button_w, button_PIC_h, "🔎 +", 20, button_PIC_zi_pressed,     False)
button_PIC_zo   = Menu.button(xdistl, ydist + button_PIC_dist*3, button_w, button_PIC_h, "🔎 -", 20, button_PIC_zo_pressed,     False)
button_PIC_rotr = Menu.button(xdistl, ydist + button_PIC_dist*4, button_w, button_PIC_h,    "↻", 26, button_PIC_rotr_pressed,   False)
button_PIC_rotl = Menu.button(xdistl, ydist + button_PIC_dist*5, button_w, button_PIC_h,    "↺", 26, button_PIC_rotl_pressed,   False)
button_PIC_del  = Menu.button(xdistl, ydist + button_PIC_dist*6, button_w, button_PIC_h,    "🚮", 20, button_PIC_del_pressed,    False)
button_PIC_BAK  = Menu.button(xdistl,  h - ydist - button_PIC_h, button_w, button_PIC_h,    "↩", 32, button_PIC_BAK_pressed,    False)
#Change visibility of PIC Menu
def visibility_Menu_PIC(visibility):
    if visibility:
        button_PIC_next.show()
        button_PIC_prev.show()
        button_PIC_zi.show()
        button_PIC_zo.show()
        button_PIC_rotr.show()
        button_PIC_rotl.show()
        button_PIC_del.show()
        button_PIC_BAK.show()
        button_PIC_next.setFocus() #Set Focus
    else:
        button_PIC_next.hide()
        button_PIC_prev.hide()
        button_PIC_zi.hide()
        button_PIC_zo.hide()
        button_PIC_rotr.hide()
        button_PIC_rotl.hide()
        button_PIC_del.hide()
        button_PIC_BAK.hide()


##Create INFO Labels##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
label_xdistl = wscreen - winfo + 6
label_xdistr = 0
label_w = winfo - label_xdistl - label_xdistr + wscreen - winfo
label_i_ht = h/22
label_i_hs = h/30
label_i_h  = label_i_ht + label_i_hs
label_i_dist = label_i_h + ydist/2
#Create labels for Info bar top
label_it_battery           = Menu.label(label_xdistl, ydist + label_i_hs*0              + label_i_dist*0, label_w, label_i_ht, "🔋",                16, True)
label_is_battery           = Menu.label(label_xdistl, ydist + label_i_hs*0 + label_i_ht + label_i_dist*0, label_w, label_i_hs, battery(),                  10, True)
label_it_storage           = Menu.label(label_xdistl, ydist + label_i_hs*0              + label_i_dist*1.8, label_w, label_i_ht, "💾",                 16, True)
label_is_storage_total     = Menu.label(label_xdistl, ydist + label_i_hs*0 + label_i_ht + label_i_dist*1.8, label_w, label_i_hs, fs_stat("total"),     10, True)
label_it_storage_total     = Menu.label(label_xdistl, ydist + label_i_hs*1 + label_i_ht + label_i_dist*1.8, label_w, label_i_hs, "total",              10, True)
label_is_storage_available = Menu.label(label_xdistl, ydist + label_i_hs*2 + label_i_ht + label_i_dist*1.8, label_w, label_i_hs, fs_stat("available"), 10, True)
label_it_storage_available = Menu.label(label_xdistl, ydist + label_i_hs*3 + label_i_ht + label_i_dist*1.8, label_w, label_i_hs, "avail.",          10, True)
#Create labels for Info bar top
label_it_CAM = Menu.label(label_xdistl, h - ydist - label_i_hs*1 - label_i_h - label_i_ht - label_i_dist*3, label_w, label_i_ht, "📷",             18, True)
label_it_ISO = Menu.label(label_xdistl, h - ydist - label_i_hs*1 - label_i_h              - label_i_dist*3, label_w, label_i_ht, "ISO",            16, True)
label_is_ISO = Menu.label(label_xdistl, h - ydist - label_i_hs*1 + label_i_ht - label_i_h - label_i_dist*3, label_w, label_i_hs, setting_ISO_hr(), 10, True)
label_it_SS  = Menu.label(label_xdistl, h - ydist - label_i_hs*1 - label_i_h              - label_i_dist*2, label_w, label_i_ht, "SS",             16, True)
label_is_SS  = Menu.label(label_xdistl, h - ydist - label_i_hs*1 + label_i_ht - label_i_h - label_i_dist*2, label_w, label_i_hs, setting_SS_hr(),  10, True)
label_it_AWB = Menu.label(label_xdistl, h - ydist - label_i_hs*1 - label_i_h              - label_i_dist*1, label_w, label_i_ht, "AWB",            15, True)
label_is_AWB = Menu.label(label_xdistl, h - ydist - label_i_hs*1 + label_i_ht - label_i_h - label_i_dist*1, label_w, label_i_hs, setting_AWB,      10, True)
label_it_EXP = Menu.label(label_xdistl, h - ydist - label_i_hs*1 - label_i_h              - label_i_dist*0, label_w, label_i_ht, "EXP",            16, True)
label_is_EXM = Menu.label(label_xdistl, h - ydist - label_i_hs*1 + label_i_ht - label_i_h - label_i_dist*0, label_w, label_i_hs, setting_EXM,      10, True)
label_is_EXP = Menu.label(label_xdistl, h - ydist - label_i_hs*0 + label_i_ht - label_i_h - label_i_dist*0, label_w, label_i_hs, setting_EXP,      10, True)
#Update info
def update_i_periodically():
    time = 20
    Timer(time, update_i_periodically).start() #Run function periodically
    update_i_battery()
    update_i_storage()
def update_i_battery():
    label_is_battery.setText(battery())
def update_i_storage():
    label_is_storage_total.setText(fs_stat("total"))
    label_is_storage_available.setText(fs_stat("available"))
def update_i_settings():
    label_is_ISO.setText(setting_ISO_hr())
    label_is_SS.setText(setting_SS_hr())
    label_is_AWB.setText(setting_AWB)
    label_is_EXM.setText(setting_EXM)
    label_is_EXP.setText(setting_EXP)

update_i_periodically()


##Run App##────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
Menu.show()
App.exec()