From d95382e4b3fc1cebc2f75a5eb66e7f4ef55ad674 Mon Sep 17 00:00:00 2001 From: Andrew Ward Date: Fri, 21 Mar 2025 10:21:06 +0000 Subject: [PATCH] update ui --- utils/__pycache__/text_to_mic.cpython-312.pyc | Bin 70672 -> 71154 bytes utils/text_to_mic.py | 58 ++++++++++++------ 2 files changed, 38 insertions(+), 20 deletions(-) diff --git a/utils/__pycache__/text_to_mic.cpython-312.pyc b/utils/__pycache__/text_to_mic.cpython-312.pyc index 9d333b17899cbbbc1b6d2d55c478416ae13f7e06..60e9248e4658cc9a3f9f0ab41e07fc4e6a07d5bf 100644 GIT binary patch delta 10054 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 KmpYW?mG{3LC6n0z delta 9671 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 diff --git a/utils/text_to_mic.py b/utils/text_to_mic.py index 2e4bd9b..2dfe8b6 100644 --- a/utils/text_to_mic.py +++ b/utils/text_to_mic.py @@ -275,9 +275,8 @@ class TextToMic(tk.Tk): self.create_presets_section() - #Credits - info_label = tk.Label(main_frame, text="Created by Scorchsoft.com App Development", fg="blue", cursor="hand2") + info_label = tk.Label(main_frame, text="Enjoying this free tool? Thank us by referring a business friend to Scorchsoft.com", fg="blue", cursor="hand2") info_label.grid(column=0, row=10, columnspan=2, pady=(0, 0)) info_label.bind("", lambda e: self.open_scorchsoft()) @@ -909,58 +908,77 @@ Please also make sure you read the Terms of use and licence statement before usi # Get our custom style colors bg_color = self.style.lookup('TFrame', 'background') text_color = self.style.lookup('TLabel', 'foreground') - accent_color = "#e0e0e4" # Slightly darker grey for accents - + + # Use a light gray with subtle blue tint for preset buttons - distinct from white but still clean + preset_bg_color = "#f0f4f8" # Light blue-gray that contrasts with the main background + # Configure columns to fill available space for col in range(3): self.presets_scrollable_frame.columnconfigure(col, weight=1) # Populate filtered presets in grid layout for i, phrase in enumerate(display_phrases): - # Create a frame with soft border and clean look + # Create a frame with no border for cleaner look frame = ttk.Frame(self.presets_scrollable_frame, width=preset_width, height=preset_height) frame.grid(row=i // 4, column=i % 4, padx=3, pady=3, sticky="nsew") frame.grid_propagate(False) - # Create a subtle border around each preset with more modern look - inner_frame = ttk.Frame(frame, style='Card.TFrame') - inner_frame.pack(fill=tk.BOTH, expand=True, padx=1, pady=1) + # Create a unique style name for each card to avoid affecting other widgets + card_style_name = f'Card{i}.TFrame' + self.style.configure(card_style_name, + background=preset_bg_color, + borderwidth=0, + relief="flat") - # Style for card-like appearance - self.style.configure('Card.TFrame', - background=bg_color, - borderwidth=1, - relief="solid") + # Create inner frame with distinct background and no border + inner_frame = ttk.Frame(frame, style=card_style_name) + inner_frame.pack(fill=tk.BOTH, expand=True, padx=1, pady=1) self.presets_scrollable_frame.grid_columnconfigure(i % 4, weight=1) # Make columns expandable self.presets_scrollable_frame.grid_rowconfigure(i // 4, weight=1) # Make rows expandable + # Create a unique style for each label + label_style_name = f'CardLabel{i}.TLabel' + self.style.configure(label_style_name, + background=preset_bg_color, + foreground=text_color) + # Text label with truncation for long text wrapped_text = self.wrap_text(phrase["text"], max_lines=3, max_chars_per_line=20) - label = ttk.Label(inner_frame, text=wrapped_text, anchor="center", justify="center", width=20) + label = ttk.Label(inner_frame, text=wrapped_text, anchor="center", justify="center", + width=20, style=label_style_name) label.pack(fill=tk.BOTH, expand=True, padx=5, pady=5) label.bind("", lambda e, t=phrase["text"]: self.insert_text(t)) label.bind("", lambda e, t=phrase["text"]: self.play_preset(t)) + # Create a unique style for each bottom frame + bottom_frame_style = f'BottomFrame{i}.TFrame' + self.style.configure(bottom_frame_style, background=preset_bg_color) + # Bottom frame for icons - bottom_frame = ttk.Frame(inner_frame) + bottom_frame = ttk.Frame(inner_frame, style=bottom_frame_style) bottom_frame.pack(side=tk.BOTTOM, fill=tk.X, pady=2) - # Style for flat buttons with our modern look - self.style.configure("Flat.TButton", + # Create a unique style for each button + button_style_name = f'FlatButton{i}.TButton' + self.style.configure(button_style_name, borderwidth=0, highlightthickness=0, font=("Arial", 12), anchor="center", - background=bg_color) + background=preset_bg_color) # Favourite button fav_icon = "❤️" if phrase["isFavourite"] else "♡" - fav_btn = ttk.Button(bottom_frame, text=fav_icon, command=lambda p=phrase: self.toggle_favourite(p), width=2, style="Flat.TButton") + fav_btn = ttk.Button(bottom_frame, text=fav_icon, + command=lambda p=phrase: self.toggle_favourite(p), + width=2, style=button_style_name) fav_btn.pack(side=tk.RIGHT, padx=2) # Delete button - del_btn = ttk.Button(bottom_frame, text="🗑️", command=lambda t=phrase["text"]: self.delete_preset(self.current_category, t), width=2, style="Flat.TButton") + del_btn = ttk.Button(bottom_frame, text="🗑️", + command=lambda t=phrase["text"]: self.delete_preset(self.current_category, t), + width=2, style=button_style_name) del_btn.pack(side=tk.RIGHT, padx=2) # Update scroll region after populating all items