From 0e3cb8925a980baf51972219d5b6c23818d12112 Mon Sep 17 00:00:00 2001 From: Andrew Ward Date: Sat, 22 Mar 2025 11:47:57 +0000 Subject: [PATCH] add check for updates banner --- utils/__pycache__/text_to_mic.cpython-312.pyc | Bin 68127 -> 68610 bytes utils/text_to_mic.py | 42 +++++-- utils/version_checker.py | 109 ++++++++++++++---- 3 files changed, 115 insertions(+), 36 deletions(-) diff --git a/utils/__pycache__/text_to_mic.cpython-312.pyc b/utils/__pycache__/text_to_mic.cpython-312.pyc index 5a709b87858c7992b788bfe9eef1a12aa73456fe..c75ce4afef0a1ba61e5bc1049a49db61610a3322 100644 GIT binary patch delta 2800 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", self._reposition_notification) + + # Add bindings for window minimize/restore events + self.app.bind("", self._handle_window_unmap) + self.app.bind("", self._handle_window_map) + + # Use the reposition function to set initial position and size + # This ensures consistent sizing between initial load and repositioning + self._reposition_notification() + + def _handle_window_unmap(self, event=None): + """Hide the notification when main window is minimized""" + if self.notification_visible and self.notification_window: + self.notification_window.withdraw() + + def _handle_window_map(self, event=None): + """Show the notification when main window is restored""" + if self.notification_visible and self.notification_window: + self.notification_window.deiconify() + # Reposition after showing + self._reposition_notification() + + def _reposition_notification(self, event=None): + """Reposition the notification window to stay at the top of the main window""" + if self.notification_visible and self.notification_window: + app_x = self.app.winfo_rootx() + app_y = self.app.winfo_rooty() + app_width = self.app.winfo_width() + + # Subtract a small amount to ensure it doesn't extend beyond the window + adjusted_width = app_width - 5 # Adjust by 4 pixels to account for borders + + # Update the width and position + notification_height = self.notification_window.winfo_height() + self.notification_window.geometry(f"{adjusted_width}x{notification_height}+{app_x}+{app_y}") + def dismiss_notification(self): """Remove the notification banner""" - if self.notification_frame: - self.notification_frame.grid_forget() - self.notification_frame = None + if self.notification_window: + # Unbind all the events first + self.app.unbind("") + self.app.unbind("") + self.app.unbind("") - # Move main frame back to top position - self.app.main_frame.grid(row=0, column=0, sticky="nsew") + # Destroy the window + self.notification_window.destroy() + self.notification_window = None self.notification_visible = False