using System; using Avalonia; using Avalonia.Controls; using Project_Periodensystem.Model; using Project_Periodensystem.Persistence; using Project_Periodensystem.Controller; namespace Project_Periodensystem.View { /// /// Implementiert die Navigation zwischen verschiedenen Seiten der Avalonia-Anwendung. /// Trennt die Navigation-Logik (WAS) vom UI-Framework (WIE) durch Interface-Implementation. /// Löst zirkuläre Abhängigkeiten durch zweistufige Initialisierung. /// public class NavigationService : INavigationService { // ===== PRIVATE FELDER ===== /// /// Referenz zum Hauptfenster für Navigation zwischen Seiten /// private readonly MainWindow _mainWindow; /// /// Data Controller für Datenzugriff (wird nach Konstruktion gesetzt) /// private PeriodensystemController? _dataController; // ===== KONSTRUKTOR UND INITIALISIERUNG ===== /// /// Initialisiert den NavigationService mit dem Hauptfenster /// /// Das Hauptfenster der Avalonia-Anwendung public NavigationService(MainWindow mainWindow) { _mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow)); Logger.Log("NavigationService initialisiert"); } /// /// Setzt den Data Controller nach der Konstruktion (löst zirkuläre Abhängigkeit) /// /// Der PeriodensystemController für Datenzugriff public void SetDataController(PeriodensystemController dataController) { _dataController = dataController ?? throw new ArgumentNullException(nameof(dataController)); Logger.Log("DataController in NavigationService gesetzt"); } /// /// Navigation zum Periodensystem - zeigt PeriodicTablePage im MainContent an /// public void NavigateToPeriodicTable() { try { if (_dataController == null) { Logger.LogError("DataController nicht gesetzt"); return; } // PeriodicTablePage erstellen und Controller setzen var periodicTablePage = new PeriodicTablePage(); periodicTablePage.SetController(_dataController); // MainContent Control finden und neue Seite anzeigen var mainContent = _mainWindow.FindControl("MainContent"); if (mainContent != null) { mainContent.Content = periodicTablePage; Logger.Log("NavigationService: Navigation zum Periodensystem"); } else { Logger.LogError("MainContent Control nicht gefunden"); } } catch (Exception ex) { Logger.LogException(ex, "NavigateToPeriodicTable"); } } /// /// Navigation zur About-Seite - zeigt Projektinformationen und Credits /// public void NavigateToAbout() { try { if (_dataController == null) { Logger.LogError("DataController nicht gesetzt"); return; } // AboutPage erstellen und Controller setzen var aboutPage = new AboutPage(); aboutPage.SetController(_dataController); // MainContent Control finden und neue Seite anzeigen var mainContent = _mainWindow.FindControl("MainContent"); if (mainContent != null) { mainContent.Content = aboutPage; Logger.Log("NavigationService: Navigation zu About"); } else { Logger.LogError("MainContent Control nicht gefunden"); } } catch (Exception ex) { Logger.LogException(ex, "NavigateToAbout"); } } /// /// Navigation zur Landing Page - Startseite der Anwendung /// public void NavigateToLanding() { try { if (_dataController == null) { Logger.LogError("DataController nicht gesetzt"); return; } // LandingPage erstellen und Controller setzen var landingPage = new LandingPage(); landingPage.SetController(_dataController); // MainContent Control finden und neue Seite anzeigen var mainContent = _mainWindow.FindControl("MainContent"); if (mainContent != null) { mainContent.Content = landingPage; Logger.Log("NavigationService: Navigation zur Landing Page"); } else { Logger.LogError("MainContent Control nicht gefunden"); } } catch (Exception ex) { Logger.LogException(ex, "NavigateToLanding"); } } /// /// Wechselt zwischen Dark- und Light-Theme der Avalonia-Anwendung /// public void ToggleTheme() { try { var app = Application.Current; if (app != null) { // Aktuelles Theme ermitteln und umschalten var currentTheme = app.ActualThemeVariant; var newTheme = currentTheme == Avalonia.Styling.ThemeVariant.Dark ? Avalonia.Styling.ThemeVariant.Light : Avalonia.Styling.ThemeVariant.Dark; // Neues Theme anwenden app.RequestedThemeVariant = newTheme; // Theme-Einstellung persistent speichern var settings = new AppSettings { LastTheme = newTheme.ToString() ?? "Dark", LastUsed = DateTime.Now, PreferredLanguage = "German" }; DataManager.SaveSettings(settings); Logger.Log($"NavigationService: Theme gewechselt zu {newTheme}"); } } catch (Exception ex) { Logger.LogException(ex, "ToggleTheme"); } } /// /// Zeigt eine Export-Bestätigung an (aktuell nur Logging) /// public void ShowExportConfirmation() { try { Logger.Log("NavigationService: Export-Bestätigung angezeigt"); // TODO: Hier könnte ein Dialog oder Notification angezeigt werden } catch (Exception ex) { Logger.LogException(ex, "ShowExportConfirmation"); } } } }