""" Project Manager Handler Handles project CRUD operations and project-related UI updates """ 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 ProjectManagerHandler: """Handles all project 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.project_manager = main_window.project_manager self.terminal_launcher = main_window.terminal_launcher self.readme_generator = main_window.readme_generator self.vps_connection = main_window.vps_connection logger.info("ProjectManagerHandler initialized") def add_new_project(self) -> None: """Add a new project with logging""" logger.info("Add new project initiated") return self.main_window._original_add_new_project() def open_project(self, project: 'Project') -> None: """Open a project with comprehensive logging""" logger.info(f"Opening project: {project.name} (ID: {project.id}) at {project.path}") return self.main_window._original_open_project(project) def delete_project(self, project: 'Project') -> None: """Delete a project""" # Direct implementation from tkinter import messagebox logger.info(f"Attempting to delete project: {project.name}") if messagebox.askyesno("Projekt löschen", f"Möchten Sie das Projekt '{project.name}' wirklich aus dem Projekt-Manager entfernen?\n\n" "Hinweis: Die Dateien werden NICHT gelöscht."): self.project_manager.remove_project(project.id) self.main_window.refresh_projects() if hasattr(self.main_window, 'update_status'): self.main_window.update_status(f"Removed: {project.name}") logger.info(f"Project deleted: {project.name}") def rename_project(self, project: 'Project') -> None: """Rename a project with logging""" logger.info(f"Rename project initiated for: {project.name}") return self.main_window._original_rename_project(project) def refresh_projects(self) -> None: """Refresh the project display with logging""" logger.debug("Refresh projects called") logger.info(f"Refreshing projects - Total: {len(self.project_manager.projects)}") return self.main_window._original_refresh_projects() def create_project_from_repo(self, repo_data: dict, project_path: str) -> None: """Create a project from repository data""" return self.main_window._original_create_project_from_repo(repo_data, project_path) def open_vps_connection(self, project: 'Project') -> None: """Open VPS connection for project""" return self.main_window._original_open_vps_connection(project) def open_admin_panel(self, project: 'Project') -> None: """Open admin panel for project""" return self.main_window._original_open_admin_panel(project) def open_vps_docker(self, project: 'Project') -> None: """Open VPS Docker management""" return self.main_window._original_open_vps_docker(project) def open_readme(self, project: 'Project') -> None: """Open or generate README for project""" return self.main_window._original_open_readme(project) def generate_readme_background(self, project: 'Project') -> None: """Generate README in background""" return self.main_window._original_generate_readme_background(project) def open_gitea_window(self) -> None: """Open Gitea explorer window""" return self.main_window._original_open_gitea_window() def on_gitea_repo_select(self, repo_data: dict) -> None: """Handle Gitea repository selection""" return self.main_window._original_on_gitea_repo_select(repo_data) def clear_project_selection(self) -> None: """Clear current project selection""" return self.main_window._original_clear_project_selection() def on_project_select(self, project: 'Project', tile) -> None: """Handle project selection with logging""" logger.info(f"Project selected: {project.name} (has Gitea repo: {bool(getattr(project, 'gitea_repo', None))})") return self.main_window._original_on_project_select(project, tile)