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 readonly PeriodensystemController _controller; /// /// Konstruktor - initialisiert UI und Controller /// public PeriodicTablePage() { InitializeComponent(); // Controller initialisieren (MVC-Pattern) _controller = new PeriodensystemController(); // Grid-Referenz für Element-Buttons periodicGrid = this.FindControl("PeriodicGrid"); // Elemente laden und anzeigen LoadAndDisplayElements(); } /// /// Lädt Elemente über Controller und zeigt sie an /// private void LoadAndDisplayElements() { try { // 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 /// private void ThemeButton_Click(object? sender, RoutedEventArgs e) { try { // Theme-Wechsel über Application var app = Application.Current; if (app != null) { var currentTheme = app.ActualThemeVariant; app.RequestedThemeVariant = currentTheme == Avalonia.Styling.ThemeVariant.Dark ? Avalonia.Styling.ThemeVariant.Light : Avalonia.Styling.ThemeVariant.Dark; Logger.Log($"Theme gewechselt zu: {app.RequestedThemeVariant}"); } } catch (Exception ex) { Logger.Log($"Fehler beim Theme-Wechsel: {ex.Message}"); } } /// /// Event-Handler für About-Button /// private void AboutButton_Click(object? sender, RoutedEventArgs e) { try { // Navigation zur About-Seite var mainWindow = TopLevel.GetTopLevel(this) as Window; if (mainWindow != null) { var aboutPage = new AboutPage(); mainWindow.Content = aboutPage; Logger.Log("Navigation zur About-Seite"); } } catch (Exception ex) { Logger.Log($"Fehler bei Navigation zu About: {ex.Message}"); } } /// /// 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 (NEUE FUNKTION) /// private void ExportButton_Click(object? sender, RoutedEventArgs e) { try { var elements = _controller.GetAllElements(); DataManager.SaveElements(elements); Logger.Log($"Export: {elements.Count} Elemente als JSON gespeichert"); // Optional: Benutzer-Feedback // ShowMessage("Daten erfolgreich exportiert!"); } catch (Exception ex) { Logger.Log($"EXCEPTION in ExportButton_Click: {ex.Message}"); } } } }