242 lines
7.7 KiB
Python
242 lines
7.7 KiB
Python
|
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()
|