Initial commit
Dieser Commit ist enthalten in:
101
gui/handlers/process_manager.py
Normale Datei
101
gui/handlers/process_manager.py
Normale Datei
@ -0,0 +1,101 @@
|
||||
"""
|
||||
Process Manager Handler
|
||||
Handles process monitoring and management operations
|
||||
"""
|
||||
|
||||
from typing import Optional, TYPE_CHECKING
|
||||
from utils.logger import logger
|
||||
|
||||
if TYPE_CHECKING:
|
||||
from gui.main_window import MainWindow
|
||||
from project_manager import Project
|
||||
|
||||
|
||||
class ProcessManagerHandler:
|
||||
"""Handles all process management operations for MainWindow"""
|
||||
|
||||
def __init__(self, main_window: 'MainWindow'):
|
||||
"""Initialize with reference to main window"""
|
||||
self.main_window = main_window
|
||||
self.root = main_window.root
|
||||
self.process_manager = main_window.process_manager
|
||||
self.process_tracker = main_window.process_tracker
|
||||
self.project_manager = main_window.project_manager
|
||||
logger.info("ProcessManagerHandler initialized")
|
||||
|
||||
def monitor_process(self, project: 'Project', process) -> None:
|
||||
"""Monitor a process for a project"""
|
||||
return self.main_window._original_monitor_process(project, process)
|
||||
|
||||
def check_process_status(self) -> None:
|
||||
"""Check status of all processes"""
|
||||
return self.main_window._original_check_process_status()
|
||||
|
||||
def stop_project(self, project: 'Project') -> None:
|
||||
"""Stop a running project"""
|
||||
return self.main_window._original_stop_project(project)
|
||||
|
||||
def update_status(self, message: str, error: bool = False) -> None:
|
||||
"""Update status bar message"""
|
||||
# Direct implementation
|
||||
from gui.styles import COLORS
|
||||
|
||||
if hasattr(self.main_window, 'status_label'):
|
||||
self.main_window.status_label.configure(
|
||||
text=message,
|
||||
text_color=COLORS['accent_error'] if error else COLORS['text_secondary']
|
||||
)
|
||||
logger.debug(f"Status updated: {message} (error={error})")
|
||||
|
||||
def download_log(self) -> None:
|
||||
"""Download comprehensive application log with all interactions"""
|
||||
# Direct implementation
|
||||
from tkinter import filedialog, messagebox
|
||||
import os
|
||||
from datetime import datetime
|
||||
|
||||
logger.info(f"Download log clicked - Total entries: {len(logger.log_entries)}")
|
||||
|
||||
try:
|
||||
# Generate default filename with timestamp
|
||||
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
||||
default_filename = f"CPM_FullLog_{timestamp}.log"
|
||||
|
||||
# Open file dialog to choose save location
|
||||
file_path = filedialog.asksaveasfilename(
|
||||
defaultextension=".log",
|
||||
filetypes=[("Log files", "*.log"), ("Text files", "*.txt"), ("All files", "*.*")],
|
||||
initialfile=default_filename,
|
||||
title="Save Complete Application Log"
|
||||
)
|
||||
|
||||
if file_path:
|
||||
# Export logs to chosen location with system info
|
||||
logger.export_logs(file_path, include_system_info=True)
|
||||
|
||||
# Add completion entry
|
||||
logger.info(f"Log export completed - Total entries: {len(logger.log_entries)}, Interactions: {logger.interaction_count}")
|
||||
|
||||
# Update status
|
||||
self.update_status(f"Log saved: {os.path.basename(file_path)} ({len(logger.log_entries)} entries)")
|
||||
|
||||
# Show success message with log details
|
||||
messagebox.showinfo(
|
||||
"Log Export Successful",
|
||||
f"Complete application log saved to:\n{file_path}\n\n"
|
||||
f"Total log entries: {len(logger.log_entries):,}\n"
|
||||
f"UI interactions logged: {logger.interaction_count:,}\n"
|
||||
f"File size: {os.path.getsize(file_path) / 1024:.1f} KB"
|
||||
)
|
||||
else:
|
||||
logger.info("Log export cancelled by user")
|
||||
|
||||
except Exception as e:
|
||||
error_msg = f"Error saving log: {str(e)}"
|
||||
self.update_status(error_msg, error=True)
|
||||
logger.log_exception(e, "download_log")
|
||||
messagebox.showerror("Export Error", error_msg)
|
||||
|
||||
def _handle_process_ended(self, project: 'Project') -> None:
|
||||
"""Handle process end event (private method)"""
|
||||
return self.main_window._original_handle_process_ended(project)
|
||||
In neuem Issue referenzieren
Einen Benutzer sperren