main window refactor

This commit is contained in:
2025-09-23 06:01:53 +08:00
committed by Jason Ross
parent 21e858dfca
commit 6d08df1807
7 changed files with 1724 additions and 1006 deletions
+124
View File
@@ -0,0 +1,124 @@
"""
Animation Handler Module
Manages all GUI animations for the Android file transfer application.
"""
import tkinter as tk
from typing import Optional, Dict, Any
class AnimationHandler:
"""Handles all GUI animations including transfer and scanning animations."""
def __init__(self, parent_window: tk.Tk):
"""Initialize the animation handler.
Args:
parent_window: The main window instance
"""
self.parent = parent_window
self.animation_job: Optional[str] = None
self.animation_dots = 0
self.scanning_active = False
# File transfer progress tracking
self.transfer_file_progress = {
'current': 0,
'total': 0,
'active': False
}
def start_scanning_animation(self) -> None:
"""Start the 'Scanning for duplicates...' animation."""
self.animation_dots = 0
self.scanning_active = True
self.animation_job = self.parent.after(0, self._animate_scanning_text)
def start_transfer_animation(self) -> None:
"""Start the 'Transferring...' animation."""
self.animation_dots = 0
self.scanning_active = False
self.animation_job = self.parent.after(0, self._animate_transfer_text)
def stop_animation(self) -> None:
"""Stop any running animation."""
if self.animation_job is not None:
self.parent.after_cancel(self.animation_job)
self.animation_job = None
self.scanning_active = False
self._reset_file_progress()
def update_transfer_progress(self, current: int, total: int) -> None:
"""Update the file transfer progress.
Args:
current: Current number of files transferred
total: Total number of files to transfer
"""
self.transfer_file_progress['current'] = current
self.transfer_file_progress['total'] = total
self.transfer_file_progress['active'] = True
def _animate_scanning_text(self) -> None:
"""Animate the scanning text with dots."""
if self.animation_job is not None and self.scanning_active:
dots = "." * (self.animation_dots + 1)
status_text = f"Scanning for duplicates{dots}"
self._update_status_label(status_text)
self.animation_dots = (self.animation_dots + 1) % 5 # Cycle 0-4 dots
# Schedule next update in 500ms
self.animation_job = self.parent.after(500, self._animate_scanning_text)
def _animate_transfer_text(self) -> None:
"""Animate the transfer text with dots."""
if self.animation_job is not None and not self.scanning_active:
dots = "." * (self.animation_dots + 1)
# Show file progress if available
if (self.transfer_file_progress['active'] and
self.transfer_file_progress['total'] > 0):
current = self.transfer_file_progress['current']
total = self.transfer_file_progress['total']
status_text = f"Transferring {current} of {total} files{dots}"
else:
status_text = f"Transferring{dots}"
self._update_status_label(status_text)
self.animation_dots = (self.animation_dots + 1) % 5 # Cycle 0-4 dots
# Schedule next update in 500ms
self.animation_job = self.parent.after(500, self._animate_transfer_text)
def _update_status_label(self, text: str) -> None:
"""Update the status label with the given text.
Args:
text: Text to display in the status label
"""
if hasattr(self.parent, 'status_label'):
self.parent.status_label.config(text=text)
self.parent.update_idletasks()
def _reset_file_progress(self) -> None:
"""Reset file progress tracking."""
self.transfer_file_progress = {
'current': 0,
'total': 0,
'active': False
}
def is_animation_running(self) -> bool:
"""Check if any animation is currently running.
Returns:
True if animation is running, False otherwise
"""
return self.animation_job is not None
def is_scanning(self) -> bool:
"""Check if scanning animation is active.
Returns:
True if scanning animation is active, False otherwise
"""
return self.scanning_active