diff --git a/client.py b/client.py index 7b2fe5a..3bbc3e0 100644 --- a/client.py +++ b/client.py @@ -9,7 +9,7 @@ customtkinter.set_default_color_theme("blue") app = customtkinter.CTk() -app.geometry("1000x750") +app.geometry("1030x750") last_geometry = app.winfo_geometry() app.title("Test") app.update() @@ -26,10 +26,16 @@ def create_navbar(): def switch_to_main(): '''Switch back to main view from details''' + global details_elements + global last_geometry + + last_geometry = (0,0) + # destroy details elements # for el in details_elements: - el.destory() + el.destroy() + details_elements = [] load_main() def switch_to_game_details(software): @@ -48,21 +54,27 @@ def load_main(): create_main_window_tile(software) # set update listener & update positions # - app.bind("", update_button_positions) update_button_positions() + app.bind("", update_button_positions) def destroy_main(): '''Destroy all elements in the main view''' + global buttons + app.unbind("") for b in buttons: b.destroy() + + buttons = [] def load_details(app, software): '''Load the details page for a software''' + global details_elements + app.title("Lan Vault: {}".format(software.title)) - details_elements = client_details.create_details_page(app, software) + details_elements = client_details.create_details_page(app, software, switch_to_main) def create_main_window_tile(software): '''Create the main window tile''' diff --git a/client_details.py b/client_details.py index 2fd2ec1..ebdb0c7 100644 --- a/client_details.py +++ b/client_details.py @@ -6,7 +6,7 @@ def show_large_picture(app, path): '''Show a full-window version of the clicked picture''' pass -def create_details_page(app, software): +def create_details_page(app, software, backswitch_function): '''Create the details page for a software and return its elements for later destruction''' elements = [] @@ -19,10 +19,19 @@ def create_details_page(app, software): img = PIL.ImageTk.PhotoImage(img) + # navbar # + navbar = customtkinter.CTkFrame(app) + navbar.grid(column=0, row=0) + back_button = customtkinter.CTkButton(navbar, text="Back", + command=backswitch_function) + back_button.pack(anchor="nw", side="left") + elements.append(navbar) + elements.append(back_button) + # thumbnail image # thumbnail_image = customtkinter.CTkButton(app, text="", image=img, width=500, height=700, command=lambda: show_large_picture(app, path)) - thumbnail_image.grid(column=0, row=0, padx=10, pady=10) + thumbnail_image.grid(column=0, row=1, padx=10, pady=10) elements.append(thumbnail_image) # fonts # @@ -31,7 +40,8 @@ def create_details_page(app, software): # info box # info_frame = customtkinter.CTkFrame(app) - info_frame.grid(column=1, row=0, sticky="ns", padx=10, pady=10) + info_frame.grid(column=1, row=1, sticky="ns", padx=10, pady=10) + elements.append(info_frame) # title # title = customtkinter.CTkLabel(info_frame, text=software.title, font=title_font) @@ -46,18 +56,32 @@ def create_details_page(app, software): elements.append(genre) # description # - description = customtkinter.CTkTextbox(info_frame, width=400, height=200) + description = customtkinter.CTkTextbox(info_frame) description.insert("0.0", software.description) description.pack(anchor="w", side="top", fill="both", padx=20, pady=15) elements.append(description) + # registry modification # + reg_mod_yes_no = "yes" if software.reg_files else "no" + reg_mod_text = "Requires Registry Modification: {}".format(reg_mod_yes_no) + reg_mod_info = customtkinter.CTkLabel(info_frame, text=reg_mod_text, padx=20) + reg_mod_info.pack(anchor="w", side="top") + elements.append(reg_mod_info) + # dependencies # if software.dependencies: - dependencies_text = ",".join(software.dependencies) + dependencies_text = "Dependencies: " + ",".join(software.dependencies) dependencies = customtkinter.CTkLabel(info_frame, text=dependencies_text) dependencies.pack(anchor="w", side="top", padx=20) elements.append(dependencies) + # extra_files # + if software.extra_files: + extra_text = "Targets extra directories: " + ",".join(set(software.extra_files.values())) + extra_text_label = customtkinter.CTkLabel(info_frame, text=extra_text) + extra_text_label.pack(anchor="w", side="top", padx=20) + elements.append(extra_text_label) + # buttons # install_button = customtkinter.CTkButton(info_frame, text="Install", command=lambda: software.install()) @@ -75,15 +99,21 @@ def create_details_page(app, software): elements.append(remove_button) # add other pictures # - i = 0 - for path in software.pictures[1:]: - img = PIL.Image.open(path) - img = img.resize((200, 300)) - img = PIL.ImageTk.PhotoImage(img) - extra_pic_button = customtkinter.CTkButton(app, text="", image=img, width=200, height=300, - command=lambda: show_large_picture(app, path)) - extra_pic_button.grid(padx=10, pady=10, row=0, column=i) - elements.append(extra_pic_button) - i += 1 + if software.pictures: + + picture_frame = customtkinter.CTkScrollableFrame(info_frame, height=200, width=300, orientation="horizontal") + picture_frame.pack(anchor="w", side="top", padx=10) + + i = 0 + for path in software.pictures[1:]: + img = PIL.Image.open(path) + img = img.resize((180, 180)) + img = PIL.ImageTk.PhotoImage(img) + extra_pic_button = customtkinter.CTkButton(picture_frame, text="", image=img, command=lambda: show_large_picture(app, path)) + extra_pic_button.grid(padx=10, pady=10, row=0, column=i) + elements.append(extra_pic_button) + i += 1 + + elements.append(picture_frame) return elements diff --git a/example_software_root/FreeDink/meta.yaml b/example_software_root/FreeDink/meta.yaml index 1821ffc..92cfbfb 100644 --- a/example_software_root/FreeDink/meta.yaml +++ b/example_software_root/FreeDink/meta.yaml @@ -11,6 +11,5 @@ dependencies: - DirectX 9.0c link_only: false extra_files: - dummy_file_1.txt: "%APP_DATA%/game_vault/" - dummy_dir_1: "%APP_DATA%/game_vault/" + dummy_file_1.txt: "%APPDATA%/game_vault/" run_exe: "GNUFreeDink/dink.exe" \ No newline at end of file diff --git a/example_software_root/FreeDink/pictures/freedink_ingamel.jpg b/example_software_root/FreeDink/pictures/freedink_ingamel.jpg new file mode 100644 index 0000000..0f161b1 Binary files /dev/null and b/example_software_root/FreeDink/pictures/freedink_ingamel.jpg differ diff --git a/software.py b/software.py index 5eaef81..36b178a 100644 --- a/software.py +++ b/software.py @@ -2,6 +2,8 @@ import yaml import os import localaction import zipfile +import shutil +import pathlib class Software: @@ -84,7 +86,13 @@ class Software: print("Running installer:", installer_path) localaction.run_exe(installer_path) - # TODO download & install gamefiles # + # install gamefiles # + if self.extra_files: + for src, dest in self.extra_files.items(): + tmp = self.backend.get(os.path.join(self.directory, "extra_files", src), self.cache_dir) + dest_dir = os.path.expandvars(dest) + os.makedirs(dest_dir, exist_ok=True) + shutil.copy(tmp, dest_dir) def run(self): '''Run the configured exe for this software'''