add
This commit is contained in:
parent
c1df8cbcf9
commit
cf86eb35f9
BIN
boiiiwd_package/resources/b_map_image.png
Normal file
BIN
boiiiwd_package/resources/b_map_image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 199 KiB |
BIN
boiiiwd_package/resources/b_mod_image.png
Normal file
BIN
boiiiwd_package/resources/b_mod_image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 14 KiB |
@ -1,12 +1,7 @@
|
||||
import src.shared_vars as main_app
|
||||
from src.imports import *
|
||||
|
||||
# Start helper functions
|
||||
def cwd():
|
||||
if getattr(sys, 'frozen', False):
|
||||
return os.path.dirname(sys.executable)
|
||||
else:
|
||||
return os.path.dirname(os.path.abspath(__file__))
|
||||
|
||||
def check_config(name, fallback=None):
|
||||
config = configparser.ConfigParser()
|
||||
config.read(CONFIG_FILE_PATH)
|
||||
@ -23,8 +18,8 @@ def save_config(name, value):
|
||||
config.write(config_file)
|
||||
|
||||
def check_custom_theme(theme_name):
|
||||
if os.path.exists(os.path.join(cwd(), theme_name)):
|
||||
return os.path.join(cwd(), theme_name)
|
||||
if os.path.exists(os.path.join(application_path, theme_name)):
|
||||
return os.path.join(application_path, theme_name)
|
||||
else:
|
||||
try:
|
||||
return os.path.join(RESOURCES_DIR, theme_name)
|
||||
@ -191,7 +186,7 @@ def convert_speed(speed_bytes):
|
||||
def create_default_config():
|
||||
config = configparser.ConfigParser()
|
||||
config["Settings"] = {
|
||||
"SteamCMDPath": cwd(),
|
||||
"SteamCMDPath": application_path,
|
||||
"DestinationFolder": "",
|
||||
"checkforupdtes": "on",
|
||||
"console": "off"
|
||||
@ -202,7 +197,7 @@ def create_default_config():
|
||||
def get_steamcmd_path():
|
||||
config = configparser.ConfigParser()
|
||||
config.read(CONFIG_FILE_PATH)
|
||||
return config.get("Settings", "SteamCMDPath", fallback=cwd())
|
||||
return config.get("Settings", "SteamCMDPath", fallback=application_path)
|
||||
|
||||
def extract_json_data(json_path, key):
|
||||
with open(json_path, 'r') as json_file:
|
||||
@ -254,8 +249,7 @@ def show_message(title, message, icon="warning", _return=False, option_1="No", o
|
||||
else:
|
||||
def callback():
|
||||
CTkMessagebox(title=title, message=message, icon=icon, sound=True)
|
||||
from src.main import master_win
|
||||
master_win.after(0, callback)
|
||||
main_app.app.after(0, callback)
|
||||
|
||||
def launch_boiii_func(path):
|
||||
procname = "boiii.exe"
|
||||
|
@ -29,7 +29,7 @@ from .CTkToolTip import ctk_tooltip
|
||||
|
||||
if getattr(sys, 'frozen', False):
|
||||
# If the application is run as a bundle, the PyInstaller bootloader
|
||||
# extends the sys module by a flag frozen=True and sets the app
|
||||
# extends the sys module by a flag frozen=True and sets the app
|
||||
# path into variable _MEIPASS'.
|
||||
application_path = os.path.dirname(sys.executable)
|
||||
else:
|
||||
|
@ -207,7 +207,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
||||
|
||||
folders_to_process = [mods_folder, maps_folder]
|
||||
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
|
||||
for folder_path in folders_to_process:
|
||||
for zone_path in folder_path.glob("**/zone"):
|
||||
@ -331,7 +331,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
||||
text_to_add += f" | Mode: {mode_type}"
|
||||
text_to_add += f" | ID: {workshop_id} | Size: {size}"
|
||||
date_added = datetime.now().strftime("%d %b, %Y @ %I:%M%p")
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
|
||||
item_info = {
|
||||
"id": workshop_id,
|
||||
@ -347,7 +347,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
||||
show_message("Error updating json file", f"Error while updating library json file\n{e}")
|
||||
|
||||
def remove_item(self, item, folder, id):
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
for label, button, button_view_list in zip(self.label_list, self.button_list, self.button_view_list):
|
||||
if item == label.cget("text"):
|
||||
self.added_folders.remove(os.path.basename(folder))
|
||||
@ -480,7 +480,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
||||
date_created ,date_updated, stars_image, stars_image_size, ratings_text, url, workshop_id, invalid_warn):
|
||||
def main_thread():
|
||||
try:
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
top = ctk.CTkToplevel(self)
|
||||
if os.path.exists(os.path.join(RESOURCES_DIR, "ryuk.ico")):
|
||||
top.after(210, lambda: top.iconbitmap(os.path.join(RESOURCES_DIR, "ryuk.ico")))
|
||||
@ -655,7 +655,7 @@ class LibraryTab(ctk.CTkScrollableFrame):
|
||||
def check_for_update():
|
||||
lib_data = None
|
||||
|
||||
if not os.path.exists(os.path.join(cwd(), LIBRARY_FILE)):
|
||||
if not os.path.exists(os.path.join(application_path, LIBRARY_FILE)):
|
||||
show_message("Error checking for item updates! -> Setting is on", "Please visit library tab at least once with the correct boiii path!, you also need to have at lease 1 item!")
|
||||
return
|
||||
|
||||
|
@ -1,61 +1,20 @@
|
||||
from src.update_window import check_for_updates_func
|
||||
from src.helpers import *
|
||||
|
||||
from src.library_tab import LibraryTab
|
||||
from src.settings_tab import SettingsTab
|
||||
from src.update_window import UpdateWindow
|
||||
|
||||
|
||||
def check_for_updates_func(window, ignore_up_todate=False):
|
||||
try:
|
||||
latest_version = get_latest_release_version()
|
||||
current_version = VERSION
|
||||
int_latest_version = int(latest_version.replace("v", "").replace(".", ""))
|
||||
int_current_version = int(current_version.replace("v", "").replace(".", ""))
|
||||
|
||||
if latest_version and int_latest_version > int_current_version:
|
||||
msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True)
|
||||
|
||||
result = msg_box.get()
|
||||
|
||||
if result == "View":
|
||||
webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest")
|
||||
|
||||
if result == "Yes":
|
||||
update_window = UpdateWindow(window, LATEST_RELEASE_URL)
|
||||
update_window.start_update()
|
||||
|
||||
if result == "No":
|
||||
return
|
||||
|
||||
elif int_latest_version < int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
elif int_latest_version == int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
|
||||
else:
|
||||
show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again")
|
||||
|
||||
except Exception as e:
|
||||
show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel")
|
||||
|
||||
class BOIIIWD(ctk.CTk):
|
||||
def __init__(self):
|
||||
super().__init__()
|
||||
global master_win
|
||||
master_win = self
|
||||
# self.app_instance = BOIIIWD()
|
||||
|
||||
# configure window
|
||||
self.title("boiii Workshop Downloader - Main")
|
||||
|
||||
try:
|
||||
geometry_file = os.path.join(cwd(), "boiiiwd_dont_touch.conf")
|
||||
geometry_file = os.path.join(application_path, "boiiiwd_dont_touch.conf")
|
||||
if os.path.isfile(geometry_file):
|
||||
with open(geometry_file, "r") as conf:
|
||||
self.geometry(conf.read())
|
||||
@ -466,7 +425,7 @@ class BOIIIWD(ctk.CTk):
|
||||
def load_configs(self):
|
||||
if os.path.exists(CONFIG_FILE_PATH):
|
||||
destination_folder = check_config("DestinationFolder", "")
|
||||
steamcmd_path = check_config("SteamCMDPath", os.getcwd())
|
||||
steamcmd_path = check_config("SteamCMDPath", application_path)
|
||||
new_appearance_mode = check_config("appearance", "Dark")
|
||||
new_scaling = check_config("scaling", 1.0)
|
||||
self.edit_destination_folder.delete(0, "end")
|
||||
@ -489,7 +448,7 @@ class BOIIIWD(ctk.CTk):
|
||||
scaling_int = math.trunc(scaling_float)
|
||||
self.settings_tab.scaling_optionemenu.set(f"{scaling_int}%")
|
||||
self.edit_steamcmd_path.delete(0, "end")
|
||||
self.edit_steamcmd_path.insert(0, cwd())
|
||||
self.edit_steamcmd_path.insert(0, application_path)
|
||||
create_default_config()
|
||||
|
||||
def help_queue_text_func(self, event=None):
|
||||
@ -557,11 +516,11 @@ class BOIIIWD(ctk.CTk):
|
||||
|
||||
def download_steamcmd(self):
|
||||
self.edit_steamcmd_path.delete(0, "end")
|
||||
self.edit_steamcmd_path.insert(0, cwd())
|
||||
self.edit_steamcmd_path.insert(0, application_path)
|
||||
save_config("DestinationFolder" ,self.edit_destination_folder.get())
|
||||
save_config("SteamCMDPath" ,self.edit_steamcmd_path.get())
|
||||
steamcmd_url = "https://steamcdn-a.akamaihd.net/client/installer/steamcmd.zip"
|
||||
steamcmd_zip_path = os.path.join(cwd(), "steamcmd.zip")
|
||||
steamcmd_zip_path = os.path.join(application_path, "steamcmd.zip")
|
||||
|
||||
try:
|
||||
response = requests.get(steamcmd_url)
|
||||
@ -571,7 +530,7 @@ class BOIIIWD(ctk.CTk):
|
||||
zip_file.write(response.content)
|
||||
|
||||
with zipfile.ZipFile(steamcmd_zip_path, "r") as zip_ref:
|
||||
zip_ref.extractall(cwd())
|
||||
zip_ref.extractall(application_path)
|
||||
|
||||
if check_steamcmd():
|
||||
os.remove(fr"{steamcmd_zip_path}")
|
||||
@ -1229,7 +1188,7 @@ class BOIIIWD(ctk.CTk):
|
||||
if os.path.exists(json_file_path):
|
||||
self.label_speed.configure(text="Installing...")
|
||||
mod_type = extract_json_data(json_file_path, "Type")
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
if self.library_tab.item_exists_in_file(items_file, workshop_id):
|
||||
get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name")
|
||||
if get_folder_name:
|
||||
@ -1488,7 +1447,7 @@ class BOIIIWD(ctk.CTk):
|
||||
if os.path.exists(json_file_path):
|
||||
self.label_speed.configure(text="Installing...")
|
||||
mod_type = extract_json_data(json_file_path, "Type")
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
if self.library_tab.item_exists_in_file(items_file, workshop_id):
|
||||
get_folder_name = self.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name")
|
||||
if get_folder_name:
|
||||
@ -1593,7 +1552,3 @@ class BOIIIWD(ctk.CTk):
|
||||
self.after(50, self.status_text.configure(text=f"Status: Standby!"))
|
||||
self.after(1, self.label_speed.configure(text=f"Awaiting Download!"))
|
||||
self.skip_boutton.grid_remove()
|
||||
|
||||
# if __name__ == "__main__":
|
||||
# app = BOIIIWD()
|
||||
# app.mainloop()
|
@ -1,47 +1,9 @@
|
||||
from src.update_window import check_for_updates_func
|
||||
from src.imports import *
|
||||
from src.helpers import *
|
||||
|
||||
import src.shared_vars as shared
|
||||
|
||||
def check_for_updates_func(window, ignore_up_todate=False):
|
||||
try:
|
||||
latest_version = get_latest_release_version()
|
||||
current_version = VERSION
|
||||
int_latest_version = int(latest_version.replace("v", "").replace(".", ""))
|
||||
int_current_version = int(current_version.replace("v", "").replace(".", ""))
|
||||
|
||||
if latest_version and int_latest_version > int_current_version:
|
||||
msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True)
|
||||
|
||||
result = msg_box.get()
|
||||
|
||||
if result == "View":
|
||||
webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest")
|
||||
|
||||
from src.update_window import UpdateWindow
|
||||
if result == "Yes":
|
||||
update_window = UpdateWindow(window, LATEST_RELEASE_URL)
|
||||
update_window.start_update()
|
||||
|
||||
if result == "No":
|
||||
return
|
||||
|
||||
elif int_latest_version < int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
elif int_latest_version == int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
|
||||
else:
|
||||
show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again")
|
||||
|
||||
except Exception as e:
|
||||
show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel")
|
||||
|
||||
class SettingsTab(ctk.CTkFrame):
|
||||
def __init__(self, master=None):
|
||||
@ -210,7 +172,7 @@ class SettingsTab(ctk.CTkFrame):
|
||||
if response == "No":
|
||||
return
|
||||
elif response == "Ok":
|
||||
os.system(f"notepad {os.path.join(cwd(), 'config.ini')}")
|
||||
os.system(f"notepad {os.path.join(application_path, 'config.ini')}")
|
||||
else:
|
||||
return
|
||||
self.after(0, callback)
|
||||
@ -398,7 +360,7 @@ class SettingsTab(ctk.CTkFrame):
|
||||
return 0
|
||||
|
||||
if setting == "theme":
|
||||
if os.path.exists(os.path.join(cwd(), "boiiiwd_theme.json")):
|
||||
if os.path.exists(os.path.join(application_path, "boiiiwd_theme.json")):
|
||||
return "Custom"
|
||||
if check_config("theme", "boiiiwd_theme.json") == "boiiiwd_theme.json":
|
||||
return "Default"
|
||||
@ -419,11 +381,11 @@ class SettingsTab(ctk.CTkFrame):
|
||||
return 0
|
||||
|
||||
def boiiiwd_custom_theme(self, disable_only=None):
|
||||
file_to_rename = os.path.join(cwd(), "boiiiwd_theme.json")
|
||||
file_to_rename = os.path.join(application_path, "boiiiwd_theme.json")
|
||||
if os.path.exists(file_to_rename):
|
||||
timestamp = datetime.now().strftime("%Y-%m-%d-%H-%M-%S")
|
||||
new_name = f"boiiiwd_theme_{timestamp}.json"
|
||||
os.rename(file_to_rename, os.path.join(cwd(), new_name))
|
||||
os.rename(file_to_rename, os.path.join(application_path, new_name))
|
||||
|
||||
if not disable_only:
|
||||
show_message("Preset file renamed", "Custom preset disabled, file has been renmaed\n* Restart the app to take effect", icon="info")
|
||||
@ -431,9 +393,9 @@ class SettingsTab(ctk.CTkFrame):
|
||||
if disable_only:
|
||||
return
|
||||
try:
|
||||
shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(cwd(), "boiiiwd_theme.json"))
|
||||
shutil.copy(os.path.join(RESOURCES_DIR, check_config("theme", "boiiiwd_theme.json")), os.path.join(application_path, "boiiiwd_theme.json"))
|
||||
except:
|
||||
shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(cwd(), "boiiiwd_theme.json"))
|
||||
shutil.copy(os.path.join(RESOURCES_DIR, "boiiiwd_theme.json"), os.path.join(application_path, "boiiiwd_theme.json"))
|
||||
show_message("Preset file created", "You can now edit boiiiwd_theme.json in the current directory to your liking\n* Edits will apply next time you open boiiiwd\n* Program will always take boiiiwd_theme.json as the first theme option if found\n* Click on this button again to disable your custom theme or just rename boiiiwd_theme.json", icon="info")
|
||||
|
||||
def settings_check_for_updates(self):
|
||||
@ -587,7 +549,7 @@ class SettingsTab(ctk.CTkFrame):
|
||||
|
||||
if os.path.exists(json_file_path):
|
||||
mod_type = extract_json_data(json_file_path, "Type")
|
||||
items_file = os.path.join(cwd(), LIBRARY_FILE)
|
||||
items_file = os.path.join(application_path, LIBRARY_FILE)
|
||||
|
||||
if shared.app.library_tab.item_exists_in_file(items_file, workshop_id):
|
||||
get_folder_name = shared.app.library_tab.get_item_by_id(items_file, workshop_id, return_option="folder_name")
|
||||
|
@ -1,10 +1,49 @@
|
||||
import src.shared_vars as main_app
|
||||
from src.imports import *
|
||||
from src.helpers import *
|
||||
|
||||
|
||||
def check_for_updates_func(window, ignore_up_todate=False):
|
||||
try:
|
||||
latest_version = get_latest_release_version()
|
||||
current_version = VERSION
|
||||
int_latest_version = int(latest_version.replace("v", "").replace(".", ""))
|
||||
int_current_version = int(current_version.replace("v", "").replace(".", ""))
|
||||
|
||||
if latest_version and int_latest_version > int_current_version:
|
||||
msg_box = CTkMessagebox(title="Update Available", message=f"An update is available! Install now?\n\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="View", option_2="No", option_3="Yes", fade_in_duration=int(1), sound=True)
|
||||
|
||||
result = msg_box.get()
|
||||
|
||||
if result == "View":
|
||||
webbrowser.open(f"https://github.com/{GITHUB_REPO}/releases/latest")
|
||||
|
||||
if result == "Yes":
|
||||
update_window = UpdateWindow(window, LATEST_RELEASE_URL)
|
||||
update_window.start_update()
|
||||
|
||||
if result == "No":
|
||||
return
|
||||
|
||||
elif int_latest_version < int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message=f"Unreleased version!\nCurrent Version: {current_version}\nLatest Version: {latest_version}", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
elif int_latest_version == int_current_version:
|
||||
if ignore_up_todate:
|
||||
return
|
||||
msg_box = CTkMessagebox(title="Up to Date!", message="No Updates Available!", option_1="Ok", sound=True)
|
||||
result = msg_box.get()
|
||||
|
||||
else:
|
||||
show_message("Error!", "An error occured while checking for updates!\nCheck your internet and try again")
|
||||
|
||||
except Exception as e:
|
||||
show_message("Error", f"Error while checking for updates: \n{e}", icon="cancel")
|
||||
|
||||
class UpdateWindow(ctk.CTkToplevel):
|
||||
def __init__(self, master, update_url):
|
||||
global master_win
|
||||
master_win = master
|
||||
super().__init__(master)
|
||||
self.title("BOIIIWD Self-Updater")
|
||||
self.geometry("400x150")
|
||||
@ -41,7 +80,7 @@ class UpdateWindow(ctk.CTkToplevel):
|
||||
|
||||
def update_progress_bar(self):
|
||||
try:
|
||||
update_dir = os.path.join(os.getcwd(), UPDATER_FOLDER)
|
||||
update_dir = os.path.join(application_path, UPDATER_FOLDER)
|
||||
response = requests.get(LATEST_RELEASE_URL, stream=True)
|
||||
response.raise_for_status()
|
||||
current_exe = sys.argv[0]
|
||||
@ -95,9 +134,8 @@ class UpdateWindow(ctk.CTkToplevel):
|
||||
self.label_download.configure(text="Update cancelled.")
|
||||
self.progress_bar.set(0.0)
|
||||
# there's a better solution ill implement it later
|
||||
global master_win
|
||||
try:
|
||||
master_win.attributes('-alpha', 1.0)
|
||||
main_app.app.attributes('-alpha', 1.0)
|
||||
except:
|
||||
pass
|
||||
show_message("Cancelled!", "Update cancelled by user", icon="warning")
|
||||
|
Loading…
Reference in New Issue
Block a user