using System; using System.Globalization; using System.Linq; using Avalonia; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.Media; using Project_Periodensystem.Controller; using Project_Periodensystem.Model; using Project_Periodensystem.Persistence; using Project_Periodensystem.View.Converters; namespace Project_Periodensystem.View { /// /// Code-Behind für das Periodensystem - nur UI-Logik, keine Geschäftslogik /// public partial class PeriodicTablePage : UserControl { private readonly Grid? periodicGrid; private PeriodensystemController? _controller; /// /// Konstruktor - initialisiert UI (Controller wird per SetController gesetzt) /// public PeriodicTablePage() { InitializeComponent(); // Grid-Referenz für Element-Buttons periodicGrid = this.FindControl("PeriodicGrid"); } /// /// Controller setzen (Dependency Injection für MVC) /// public void SetController(PeriodensystemController controller) { _controller = controller ?? throw new ArgumentNullException(nameof(controller)); Logger.Log("PeriodicTablePage: Controller gesetzt (MVC-Pattern)"); // Elemente laden und anzeigen LoadAndDisplayElements(); } /// /// Lädt Elemente über Controller und zeigt sie an /// private void LoadAndDisplayElements() { try { if (_controller == null) { Logger.LogError("Controller nicht gesetzt - kann Elemente nicht laden"); return; } // Daten über Controller laden (nicht direkt!) var elements = _controller.GetAllElements(); if (!elements.Any()) { Logger.Log("Keine Elemente vom Controller erhalten"); return; } // Datenvalidierung über Controller if (!_controller.ValidateData()) { Logger.Log("Datenvalidierung fehlgeschlagen"); return; } Logger.Log($"Lade {elements.Count} Elemente in das Grid"); // UI-Update für jedes Element int successCount = 0; foreach (var element in elements) { if (_controller.ValidateElementPosition(element)) { CreateElementButton(element); successCount++; } else { Logger.Log($"Element {element?.Symbol ?? "NULL"} übersprungen - ungültige Position"); } } Logger.Log($"{successCount} von {elements.Count} Elementen erfolgreich geladen"); } catch (Exception ex) { Logger.Log($"EXCEPTION in LoadAndDisplayElements: {ex.Message}"); } } /// /// Erstellt UI-Button für ein Element (nur View-Logik) /// /// Element für das der Button erstellt wird private void CreateElementButton(Element element) { if (element == null) { Logger.Log("Null-Element kann nicht angezeigt werden"); return; } // UI-Komponenten erstellen var button = new Button { Classes = { "ElementTile" } }; var panel = new StackPanel(); // Hintergrundfarbe über Converter setzen var backgroundColor = new SeriesToColorConverter() .Convert(element.Series, typeof(Brush), null, CultureInfo.InvariantCulture) as Brush; if (backgroundColor != null) { button.Background = backgroundColor; } // Text-Elemente erstellen var symbolText = new TextBlock { Text = element.Symbol, Classes = { "Symbol" }, Foreground = new SolidColorBrush(Colors.White), HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center }; var numberText = new TextBlock { Text = element.AtomicNumber.ToString(), Classes = { "Number" }, Foreground = new SolidColorBrush(Colors.White), HorizontalAlignment = Avalonia.Layout.HorizontalAlignment.Center }; // Layout zusammenbauen panel.Children.Add(numberText); // Number on top panel.Children.Add(symbolText); // Symbol below button.Content = panel; // Grid-Position setzen (0-basiert) int gridRow = element.Row; int gridColumn = element.Column; Logger.Log($"Element {element.Symbol}: Grid({gridRow},{gridColumn})"); Grid.SetRow(button, gridRow); Grid.SetColumn(button, gridColumn); // Button zum Grid hinzufügen if (periodicGrid != null) { periodicGrid.Children.Add(button); } else { Logger.Log("PeriodicGrid ist null - Button kann nicht hinzugefügt werden"); } } /// /// Event-Handler für Theme-Button - SAUBERES MVC /// private void ThemeButton_Click(object? sender, RoutedEventArgs e) { try { if (_controller != null) { // Controller übernimmt Theme-Logik _controller.HandleToggleTheme(); } else { Logger.LogError("Controller nicht gesetzt - kann Theme nicht wechseln"); } } catch (Exception ex) { Logger.LogException(ex, "ThemeButton_Click"); } } /// /// Event-Handler für About-Button - SAUBERES MVC /// private void AboutButton_Click(object? sender, RoutedEventArgs e) { try { if (_controller != null) { // Controller übernimmt Navigation _controller.HandleNavigateToAbout(); } else { Logger.LogError("Controller nicht gesetzt - kann nicht navigieren"); } } catch (Exception ex) { Logger.LogException(ex, "AboutButton_Click"); } } /// /// Event-Handler für Zurück-Button (falls gewünscht) /// private void BackButton_Click(object? sender, RoutedEventArgs e) { try { var mainWindow = TopLevel.GetTopLevel(this) as Window; if (mainWindow != null) { var landingPage = new LandingPage(); mainWindow.Content = landingPage; Logger.Log("Navigation zurück zur Landing Page"); } } catch (Exception ex) { Logger.Log($"Fehler bei Navigation zurück: {ex.Message}"); } } /// /// Export-Button für Element-Daten - SAUBERES MVC /// private void ExportButton_Click(object? sender, RoutedEventArgs e) { try { if (_controller != null) { // Controller übernimmt Export-Logik _controller.HandleExportData(); } else { Logger.LogError("Controller nicht gesetzt - kann nicht exportieren"); } } catch (Exception ex) { Logger.LogException(ex, "ExportButton_Click"); } } } }