FPS-Studio / modules /toolbox /message_manager.py
rahul7star's picture
Migrated from GitHub
05fcd0f verified
from datetime import datetime
from typing import List, Optional
import queue
import threading
class MessageManager:
def __init__(self, max_messages: int = 100):
self._messages: List[str] = []
self._max_messages = max_messages
self._message_queue = queue.Queue()
self._lock = threading.Lock()
# ANSI-style formatting for different message types
self._formats = {
"INFO": "ℹ️", # Info icon
"SUCCESS": "✅", # Checkmark
"WARNING": "⚠️", # Warning icon
"ERROR": "❌", # Error icon
}
def add_message(self, message: str, message_type: str = "INFO") -> None:
"""Add a new message with minimal timestamp and icon."""
# Only show hours:minutes for timestamps
timestamp = datetime.now().strftime("%H:%M")
icon = self._formats.get(message_type, "•")
# Format filename paths to be more readable
if "Processing file" in message or "Created batch folder" in message:
message = self._format_path(message)
formatted_message = f"{icon} {message}"
with self._lock:
self._messages.append(formatted_message)
if len(self._messages) > self._max_messages:
self._messages.pop(0)
def _format_path(self, message: str) -> str:
"""Format file paths to be more concise and readable."""
if "GRADIO_TEMP_DIR" in message:
# Extract just the filename from temp path
filename = message.split("\\")[-1]
return message.split(":")[0] + ": " + filename
elif "batch_" in message:
# Shorten batch folder path
return message.replace("../outputs/", "")
return message
def add_success(self, message: str) -> None:
"""Add a success message."""
self.add_message(message, "SUCCESS")
def add_warning(self, message: str) -> None:
"""Add a warning message."""
self.add_message(message, "WARNING")
def add_error(self, message: str) -> None:
"""Add an error message."""
self.add_message(message, "ERROR")
def get_messages(self) -> str:
"""Get all messages as a single string with spacing between different types."""
with self._lock:
# Add a blank line between different message types for readability
formatted = []
last_type = None
for msg in self._messages:
current_type = next((t for t in self._formats if self._formats[t] in msg), None)
if last_type and current_type != last_type:
formatted.append("") # Add spacing between different types
formatted.append(msg)
last_type = current_type
return "\n".join(formatted)
def clear(self) -> None:
"""Clear all messages."""
with self._lock:
self._messages.clear()