210 lines
7.5 KiB
C#
210 lines
7.5 KiB
C#
using System;
|
|
using Avalonia;
|
|
using Avalonia.Controls;
|
|
using Project_Periodensystem.Model;
|
|
using Project_Periodensystem.Persistence;
|
|
using Project_Periodensystem.Controller;
|
|
|
|
namespace Project_Periodensystem.View
|
|
{
|
|
/// <summary>
|
|
/// 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.
|
|
/// </summary>
|
|
public class NavigationService : INavigationService
|
|
{
|
|
// ===== PRIVATE FELDER =====
|
|
|
|
/// <summary>
|
|
/// Referenz zum Hauptfenster für Navigation zwischen Seiten
|
|
/// </summary>
|
|
private readonly MainWindow _mainWindow;
|
|
|
|
/// <summary>
|
|
/// Data Controller für Datenzugriff (wird nach Konstruktion gesetzt)
|
|
/// </summary>
|
|
private PeriodensystemController? _dataController;
|
|
|
|
// ===== KONSTRUKTOR UND INITIALISIERUNG =====
|
|
|
|
/// <summary>
|
|
/// Initialisiert den NavigationService mit dem Hauptfenster
|
|
/// </summary>
|
|
/// <param name="mainWindow">Das Hauptfenster der Avalonia-Anwendung</param>
|
|
public NavigationService(MainWindow mainWindow)
|
|
{
|
|
_mainWindow = mainWindow ?? throw new ArgumentNullException(nameof(mainWindow));
|
|
Logger.Log("NavigationService initialisiert");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Setzt den Data Controller nach der Konstruktion (löst zirkuläre Abhängigkeit)
|
|
/// </summary>
|
|
/// <param name="dataController">Der PeriodensystemController für Datenzugriff</param>
|
|
public void SetDataController(PeriodensystemController dataController)
|
|
{
|
|
_dataController = dataController ?? throw new ArgumentNullException(nameof(dataController));
|
|
Logger.Log("DataController in NavigationService gesetzt");
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigation zum Periodensystem - zeigt PeriodicTablePage im MainContent an
|
|
/// </summary>
|
|
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<ContentControl>("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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigation zur About-Seite - zeigt Projektinformationen und Credits
|
|
/// </summary>
|
|
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<ContentControl>("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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Navigation zur Landing Page - Startseite der Anwendung
|
|
/// </summary>
|
|
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<ContentControl>("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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Wechselt zwischen Dark- und Light-Theme der Avalonia-Anwendung
|
|
/// </summary>
|
|
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");
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Zeigt eine Export-Bestätigung an (aktuell nur Logging)
|
|
/// </summary>
|
|
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");
|
|
}
|
|
}
|
|
}
|
|
}
|