barotrauma-sunken-tapes/main.py

242 lines
7.7 KiB
Python
Raw Normal View History

2021-09-24 12:00:38 +02:00
import os
import tkinter as tk
from tkinter import filedialog as fd
from tkinter.messagebox import showinfo, askyesno, askokcancel
from tkinter import ttk
from pathlib import Path
from deploy import download_ffmpeg, download_git, deploy, get_ffmpeg_version, update
import logging
import sys
def get_curr_screen_geometry():
"""
Workaround to get the size of the current screen in a multi-screen setup.
Returns:
geometry (str): The standard Tk geometry string.
[width]x[height]+[left]+[top]
"""
root = tk.Tk()
root.update_idletasks()
root.attributes('-fullscreen', True)
root.state('iconic')
geometry = root.winfo_geometry()
root.destroy()
return geometry
def create_install_frame(container):
def find_barotrauma_directory():
first_guess = Path("C:/Program Files (x86)/Steam/steamapps/common/Barotrauma")
second_guess = Path("D:/Steam/steamapps/common/Barotrauma")
if first_guess.is_dir():
return first_guess.as_posix()
elif second_guess.is_dir():
return second_guess.as_posix()
else:
return False
def select_barotrauma_directory():
return_dir = fd.askdirectory(initialdir="C:/")
install_dir.set(return_dir)
frame = ttk.LabelFrame(container, text='Barotrauma installation directory')
find_button = ttk.Button(frame, text='Guess',
command=lambda: install_dir.set(find_barotrauma_directory()))
find_button.pack(side="left", padx=3, pady=3)
install_dir = tk.StringVar()
install_dir.set(find_barotrauma_directory())
directory_entry = ttk.Entry(frame, width=60, textvariable=install_dir)
directory_entry.pack(side="left", padx=3, pady=3, expand=True, fill="x")
browse_button = ttk.Button(frame, text='Browse', command=select_barotrauma_directory)
browse_button.pack(side="left", padx=3, pady=3)
return frame, install_dir
def create_options_frame(container):
frame = ttk.LabelFrame(container, text='Options')
# Use ITA checkbox
use_ita = tk.StringVar()
use_ita.set("1")
use_ita_check = ttk.Checkbutton(
frame,
variable=use_ita,
text='Use ITA mod',
command=lambda: print(use_ita.get()))
# Buffs checkbox
buffs = tk.StringVar()
buffs.set("1")
buffs_check = ttk.Checkbutton(
frame,
variable=buffs,
text='Buffs',
command=lambda: print(buffs.get()))
for widget in frame.winfo_children():
widget.pack(side="top", padx=3, pady=3, fill="x")
return frame, use_ita, buffs
def create_resolution_frame(container):
frame = ttk.LabelFrame(container, text='Resolution')
def detect_screen_resolution():
w, h = get_curr_screen_geometry().split("+")[0].split("x")
width.set(w)
height.set(h)
width = tk.StringVar()
width.set("1920")
width_label = ttk.Label(frame, text='Width:')
width_frame = ttk.Entry(frame, width=12, textvariable=width)
height = tk.StringVar()
height.set("1080")
height_label = ttk.Label(frame, text='Height:')
height_frame = ttk.Entry(frame, width=12, textvariable=height)
detect_button = ttk.Button(frame, text='Detect', command=detect_screen_resolution)
for widget in frame.winfo_children():
widget.pack(side="left", padx=3, pady=3)
return frame, width, height
def create_deploy_frame(container, config):
def deploy_action():
config_values = {"installdir": config["installdir"].get(),
"use_ita": config["use_ita"].get() == "1",
"buffs": config["buffs"].get() == "1",
"resolution_x": int(config["resolution_x"].get()),
"resolution_y": int(config["resolution_x"].get())}
logging.info(f"deploying with config: {config_values}")
deploy(config_values)
showinfo(title='Success!',
message=f'Sunken Tapes was successfully installed to:'
f'\n{config["installdir"].get()}'
f'\n\nThis installer will now close.')
container.destroy()
def download_ffmpeg_action():
def finish():
does_ffmpeg_exists()
showinfo(title='Success!',
message=f'ffmpeg downloaded. You can now deploy Sunken Tapes:')
if not Path("./utils/ffmpeg-" + get_ffmpeg_version() + "-full_build/bin/ffmpeg.exe").exists():
download_ffmpeg()
finish()
return
else:
answer = askyesno(title='ffmpeg already downloaded',
message='ffmpeg is already in utils directory!'
'\n\nDelete the existing one and download again?')
if answer:
download_ffmpeg(clean=True)
finish()
else:
return
def update_action():
if not Path("./utils/git").exists():
answer = askokcancel(
title='Confirmation',
message='Portable version of git will be downloaded.'
'\nThis is needed to check for updates in the repository')
if answer:
download_git()
else:
return
else:
logging.info(f"git already in utils")
update()
def does_ffmpeg_exists():
if Path("./utils/ffmpeg-" + get_ffmpeg_version() + "-full_build/bin/ffmpeg.exe").exists():
deploy_button["state"] = "normal"
else:
deploy_button["state"] = "disable"
frame = ttk.LabelFrame(container, text='Install')
frame_1 = ttk.Frame(frame)
download_tools_label = ttk.Label(frame_1, text='Download and unpack ffmpeg:')
download_tools_label.pack(side="left", padx=3, pady=3)
download_tools_button = ttk.Button(frame_1, text='Download', command=download_ffmpeg_action)
download_tools_button.pack(side="right", padx=3, pady=3)
frame_1.pack(side="top", fill="x")
frame_2 = ttk.Frame(frame)
update_label = ttk.Label(frame_2, text='Download update from git.kompot.si/jaka/barotrauma-sunken-tapes:')
update_label.pack(side="left", padx=3, pady=3)
update_button = ttk.Button(frame_2, text='Update', command=update_action)
update_button.pack(side="right", padx=3, pady=3)
frame_2.pack(side="top", fill="x")
frame_3 = ttk.Frame(frame)
deploy_label = ttk.Label(frame_3, text='Download songs and deploy mod to Barotrauma Mods directory:')
deploy_label.pack(side="left", padx=3, pady=3)
deploy_button = ttk.Button(frame_3, text='Deploy', command=deploy_action)
deploy_button.pack(side="right", padx=3, pady=3)
frame_3.pack(side="top", fill="x")
does_ffmpeg_exists()
return frame
def create_main_window():
# root window
root = tk.Tk()
root.title('Sunken Tapes')
middle_frame = ttk.Frame(root)
install_frame, install_dir = create_install_frame(root)
options_frame, use_ita, buffs = create_options_frame(middle_frame)
resolution_frame, width, height = create_resolution_frame(middle_frame)
config = {"installdir": install_dir,
"use_ita": use_ita,
"buffs": buffs,
"resolution_x": width,
"resolution_y": height}
deploy_frame = create_deploy_frame(root, config)
install_frame.pack(side="top", fill="x", pady=3, padx=3)
options_frame.pack(side="left", fill="y", pady=3, padx=3)
resolution_frame.pack(side="left", fill="both", pady=3, padx=3, expand=True)
middle_frame.pack(side="top", fill="x")
deploy_frame.pack(side="top", fill="x", pady=3, padx=3)
root.mainloop()
if __name__ == "__main__":
os.chdir(Path(__file__).parents[0])
logging.basicConfig(stream=sys.stdout, level=logging.INFO)
create_main_window()