From 7fb2ba0cb9323bc282aefae508b94a83a7c20cb4 Mon Sep 17 00:00:00 2001 From: Cainan Date: Tue, 25 Jun 2024 00:14:18 +0100 Subject: [PATCH] Fix genre colour not working, update gui to look "modern" --- TaikoSongConversionTool/README.md | 4 +- TaikoSongConversionTool/gui.ico | Bin 0 -> 23757 bytes TaikoSongConversionTool/gui.py | 100 +++++++++++++++++------------- 3 files changed, 61 insertions(+), 43 deletions(-) create mode 100644 TaikoSongConversionTool/gui.ico diff --git a/TaikoSongConversionTool/README.md b/TaikoSongConversionTool/README.md index 8905a68..5fd9c19 100644 --- a/TaikoSongConversionTool/README.md +++ b/TaikoSongConversionTool/README.md @@ -16,6 +16,7 @@ This is still a work in-progress, so please report any issues found to me, along Prerequisites: Python 3.12.3 or newer tkinter installed through pip `pip install tk` +sv_ttk installed through pip `pip install sv_ttk` cryptography installed through pip `pip install cryptography` pydub installed through pip `pip install pydub` ffplay installed in `path`. @@ -27,7 +28,7 @@ Due to copyright reasons, etc. no song data will be provided with this tool, how Multi-Language Support. (Can be set in config.json, supports en(English) and jp(Japanese)). Custom Song Data loading through the "data_custom" folder. (Path can be changed in config.json). -![song conversion tool](https://i.imgur.com/zGr0OTb.png) +![song conversion tool](https://i.imgur.com/YRXb0NA.png) ## Tools Used at9tool - Used to convert audio to the Sony AT9 format. @@ -38,6 +39,7 @@ at9tool - Used to convert audio to the Sony AT9 format. Steam User [descatal](https://steamcommunity.com/id/descatal) for writing [this](https://exvsfbce.home.blog/2020/02/04/guide-to-encoding-bnsf-is14-audio-files-converting-wav-back-to-bnsf-is14/) guide on how to create/encode `bnsf` files. [korenkonder](https://github.com/korenkonder) for compiling the G.722.1 tool used in this project. [Kamui/despairoharmony](https://github.com/despairoharmony) for some of the Nijiiro `.nus3bank` template research. +[rdbende](https://github.com/rdbende) for the [Sun Valley ttk Theme](https://github.com/rdbende/Sun-Valley-ttk-theme) used in this project. ## Related Tools [tja2fumen](https://github.com/vivaria/tja2fumen) diff --git a/TaikoSongConversionTool/gui.ico b/TaikoSongConversionTool/gui.ico new file mode 100644 index 0000000000000000000000000000000000000000..2e4fdfdfab12cfc7e5a070286713dea6709e7c73 GIT binary patch literal 23757 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 DlT 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 Jm6;dr{{Vn(-zoqA literal 0 HcmV?d00001 diff --git a/TaikoSongConversionTool/gui.py b/TaikoSongConversionTool/gui.py index 9ba5329..b235f4e 100644 --- a/TaikoSongConversionTool/gui.py +++ b/TaikoSongConversionTool/gui.py @@ -1,5 +1,6 @@ import tkinter as tk from tkinter import ttk, messagebox +import sv_ttk import json import os import subprocess @@ -69,25 +70,25 @@ if custom_songs == True: if lang == "jp": genre_map = { - 0: ("ポップス", "light blue"), - 1: ("アニメ", "orange"), - 2: ("ボーカロイド", "turquoise"), - 3: ("バラエティ", "green"), - 4: ("Unused", "gray"), - 5: ("クラシック", "dark red"), - 6: ("ゲームミュージック", "purple"), - 7: ("ナムコオリジナル", "dark orange"), + 0: ("ポップス", "#219fbb"), + 1: ("アニメ", "#ff9700"), + 2: ("ボーカロイド", "#a2c4c8"), + 3: ("バラエティ", "#8fd321"), + 4: ("Unused", "#000000"), + 5: ("クラシック", "#d1a016"), + 6: ("ゲームミュージック", "#9c72c0"), + 7: ("ナムコオリジナル", "#ff5716"), } else: - genre_map = { - 0: ("POP", "light blue"), - 1: ("Anime", "orange"), - 2: ("Vocaloid", "turquoise"), - 3: ("Variety", "green"), - 4: ("Unused", "gray"), - 5: ("Classic", "dark red"), - 6: ("Game Music", "purple"), - 7: ("Namco Original", "dark orange"), + genre_map = { + 0: ("Pop", "#219fbb"), + 1: ("Anime", "#ff9700"), + 2: ("Vocaloid", "#a2c4c8"), + 3: ("Variety", "#8fd321"), + 4: ("Unused (Kids)", "#000000"), + 5: ("Classic", "#d1a016"), + 6: ("Game Music", "#9c72c0"), + 7: ("Namco Original", "#ff5716"), } if lang == "jp": @@ -108,15 +109,28 @@ if custom_songs == True: window = tk.Tk() window.title("Taiko no Tatsujin Song Conversion GUI Tool") +window.iconbitmap('gui.ico') + # Set the initial size of the window -window.geometry("1000x600") # Width x Height +window.geometry("1400x800") # Width x Height + +# Create a new style for Treeview with grid lines +style = ttk.Style() +style.configure("Treeview", rowheight=25, borderwidth=1) +style.layout("Treeview", [('Treeview.treearea', {'sticky': 'nswe'})]) + +# Use the new style for the Treeview +style.configure("Treeview.Heading", background="lightgrey", foreground="black", borderwidth=1) +style.map("Treeview.Heading", background=[('active', 'grey')]) + +sv_ttk.set_theme("dark") # Create a frame to contain the Treeview and scrollbar main_frame = ttk.Frame(window) main_frame.pack(fill="both", expand=True, padx=10, pady=10) # Create Treeview and Scrollbar -tree = ttk.Treeview(main_frame, columns=("Select", "Unique ID", "ID", "Song Name", "Song Subtitle", "Genre", "Difficulty"), show="headings", selectmode="extended") +tree = ttk.Treeview(main_frame, columns=("Select", "ID", "Song Name", "Song Subtitle", "Genre", "Difficulty"), show="headings", selectmode="extended") if lang == "jp": tree.heading("Song Name", text="曲") tree.heading("Song Subtitle", text="曲名") @@ -129,12 +143,10 @@ else: tree.heading("Genre", text="Genre") tree.heading("Difficulty", text="Difficulty") tree.heading("Select", text="Select") -tree.heading("Unique ID", text="") tree.heading("ID", text="ID") tree.column("Select", width=50, anchor=tk.CENTER) -tree.column("Unique ID", width=0, anchor=tk.W) tree.column("ID", width=60, anchor=tk.W) tree.column("Song Name", anchor=tk.W) tree.column("Song Subtitle", anchor=tk.W) @@ -208,23 +220,23 @@ def populate_tree(search_text=""): star_ura = song.get("starUra", 0) difficulty_info_parts = [ - f"{star_easy}", - f"{star_normal}", - f"{star_hard}", - f"{star_mania}", + f"★{star_easy}", + f"★{star_normal}", + f"★{star_hard}", + f"★{star_mania}", ] if star_ura > 0: - difficulty_info_parts.append(f"{star_ura}") + difficulty_info_parts.append(f"★{star_ura}") difficulty_info = " | ".join(difficulty_info_parts) # Check if the search text matches the song name if search_text in english_title.lower(): - values = ["☐", "", song_id, english_title, english_subtitle, genre_name, difficulty_info] + values = ["☐", song_id, english_title, english_subtitle, genre_name, difficulty_info] if song_id in selected_song_ids: values[0] = "☑" - item_id = tree.insert("", "end", values=values) + item_id = tree.insert("", "end", values=values, tags=(genre_name,)) tree.tag_configure(genre_name, background=genre_color) # Re-select item if it was previously selected if song_id in selected_song_ids: @@ -258,21 +270,21 @@ def sort_tree(sort_option): star_ura = song.get("starUra", 0) difficulty_info_parts = [ - f"{star_easy}", - f"{star_normal}", - f"{star_hard}", - f"{star_mania}", + f"★{star_easy}", + f"★{star_normal}", + f"★{star_hard}", + f"★{star_mania}", ] if star_ura > 0: - difficulty_info_parts.append(f"{star_ura}") + difficulty_info_parts.append(f"★{star_ura}") difficulty_info = " | ".join(difficulty_info_parts) - values = ["☐", "", song_id, english_title, english_subtitle, genre_name, difficulty_info] + values = ["☐", song_id, english_title, english_subtitle, genre_name, difficulty_info] if song_id in selected_song_ids: values[0] = "☑" - item_id = tree.insert("", "end", values=values) + item_id = tree.insert("", "end", values=values, tags=(genre_name,)) tree.tag_configure(genre_name, background=genre_color) # Re-select item if it was previously selected if song_id in selected_song_ids: @@ -300,7 +312,7 @@ def sort_tree(sort_option): def populate_song_entry(song): - unique_id = "" + #unique_id = "" song_id = f"{song['id']}" genre_no = song["genreNo"] genre_name, genre_color = genre_map.get(genre_no, ("Unknown Genre", "white")) @@ -328,7 +340,7 @@ def populate_song_entry(song): difficulty_info = " | ".join(difficulty_info_parts) - item_id = tree.insert("", "end", values=("☐", unique_id, song_id, english_title, english_subtitle, genre_name, difficulty_info)) + tree.insert("", "end", values=("☐", song_id, english_title, english_subtitle, genre_name, difficulty_info)) tree.tag_configure(genre_name, background=genre_color) # Populate the Treeview initially @@ -1088,7 +1100,7 @@ preview_button.pack(side="top", padx=20, pady=10) # Create sorting options if lang == "jp": - sort_options = ["ID", "曲", "ジャンル順"] + sort_options = ["ID", "Song Name", "Genre"] sort_label = tk.Label(main_frame, text="ソートフィルター:") else: sort_options = ["ID", "Song Name", "Genre"] @@ -1097,7 +1109,8 @@ sort_label.pack(side="top", padx=20, pady=5) sort_var = tk.StringVar(main_frame) sort_var.set("ID") -sort_menu = tk.OptionMenu(main_frame, sort_var, *sort_options, command=lambda _: sort_tree(sort_var.get())) +sort_menu = ttk.Combobox(main_frame, textvariable=sort_var, values=sort_options) +sort_menu.bind("<>", lambda _: sort_tree(sort_var.get())) sort_menu.pack(side="top", padx=20, pady=0) search_entry.pack(side="top", padx=20, pady=10, fill="x") # search bar, currently broken @@ -1113,10 +1126,11 @@ export_button.pack(side="bottom", padx=20, pady=10) selection_count_label = ttk.Label(main_frame, text="0/???") selection_count_label.pack(side="bottom", padx=20, pady=10) +# Game platform selection game_platform_var = tk.StringVar(main_frame) game_platform_var.set("PS4") game_platform_choices = ["PS4", "NS1", "PTB"] -game_platform_menu = tk.OptionMenu(main_frame, game_platform_var, *game_platform_choices) +game_platform_menu = ttk.Combobox(main_frame, textvariable=game_platform_var, values=game_platform_choices) game_platform_menu.pack(side="bottom", padx=20, pady=0) # Create Label for Platform selection @@ -1126,19 +1140,21 @@ else: platform_label = tk.Label(main_frame, text="Platform") platform_label.pack(side="bottom", padx=20, pady=5) -# Game region selection, needed for wordlist export. +# Game region selection, needed for wordlist export game_region_var = tk.StringVar(main_frame) game_region_var.set("JPN/ASIA") game_region_choices = ["JPN/ASIA", "EU/USA"] -game_region_menu = tk.OptionMenu(main_frame, game_region_var, *game_region_choices) +game_region_menu = ttk.Combobox(main_frame, textvariable=game_region_var, values=game_region_choices) game_region_menu.pack(side="bottom", padx=20, pady=10) +# Create Label for Region selection if lang == "jp": game_region_label = tk.Label(main_frame, text="ゲーム地域:") else: game_region_label = tk.Label(main_frame, text="Game Region:") game_region_label.pack(side="bottom", padx=20, pady=0) + # Doesn't function? # Update selection count when tree selection changes #tree.bind("<>", lambda event: update_selection_count())