From 316c849a5ebe0bb7938362636cd414d0732193ed Mon Sep 17 00:00:00 2001 From: Elias Fierke Date: Wed, 26 Feb 2025 16:24:18 +0100 Subject: [PATCH] [chore:] several fixes and improvements --- MainWindow.axaml.cs | 89 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 80 insertions(+), 9 deletions(-) diff --git a/MainWindow.axaml.cs b/MainWindow.axaml.cs index dc67ba6..7cbb497 100644 --- a/MainWindow.axaml.cs +++ b/MainWindow.axaml.cs @@ -16,6 +16,17 @@ using PdfSharp.Drawing; using PdfSharp.Drawing.Layout; using PdfSharp.Fonts; +using System.Globalization; + +// ToDo +// - Rand +// - 1,5 zeilig +// - Namen auf jeder Seite +// - PDF Export keine Namen -> Error +// + + + namespace PLG_Exam { public partial class MainWindow : Window @@ -271,9 +282,10 @@ namespace PLG_Exam _tabCounter++; var tabItem = new TabItem { - Header = $"{tab.Aufgabennummer} - {tab.Überschrift}", + Content = CreateTabContent(tab.Aufgabennummer, tab.Überschrift, tab.Inhalt) }; + tabItem.Header = ReturnTabHeaderContent($"{tab.Aufgabennummer} - {tab.Überschrift}", tabItem); TabView.Items.Add(tabItem); } @@ -281,6 +293,53 @@ namespace PLG_Exam _isSaved = true; } + private StackPanel ReturnTabHeaderContent(string name, TabItem curr_tab){ + var closeButton = new Button + { + Content = "×", + FontSize = 14, + HorizontalContentAlignment = Avalonia.Layout.HorizontalAlignment.Center, + VerticalContentAlignment = Avalonia.Layout.VerticalAlignment.Center, + Width = 20, + Height = 20, + Background = new SolidColorBrush(Color.FromRgb(123,35,39)), + Foreground = new SolidColorBrush(Color.FromRgb(0,0,0)), + Padding = new Thickness(0), + Margin = new Thickness(5, 0, 0, 0), + VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center + }; + + ToolTip.SetTip(closeButton, "Tab schließen"); + + var headerStackPanel = new StackPanel + { + Orientation = Avalonia.Layout.Orientation.Horizontal + }; + + var tabHeader = new TextBlock + { + Text = name, + VerticalAlignment = Avalonia.Layout.VerticalAlignment.Center + }; + + headerStackPanel.Children.Add(tabHeader); + headerStackPanel.Children.Add(closeButton); + + // Schließen-Event hinzufügen + closeButton.Click += async (sender, e) => + { + var result = await MessageBox.Show(this, "Diese Aktion schließt die Aufgabe unwiderruflich. Möchten Sie fortfahren?", + "Tab schließen", MessageBoxButton.YesNo); + if (result == MessageBoxResult.Yes) + { + TabView.Items.Remove(curr_tab); + _isSaved = false; + } + }; + + return headerStackPanel; + } + // Neu private async void OnNewClick(object? sender, RoutedEventArgs e) { @@ -365,9 +424,9 @@ namespace PLG_Exam var aufgabeText = string.IsNullOrWhiteSpace(aufgabennummer.Text) ? "Neu" : aufgabennummer.Text; var ueberschriftText = string.IsNullOrWhiteSpace(ueberschrift.Text) ? "" : ueberschrift.Text; - tab.Header = string.IsNullOrWhiteSpace(ueberschriftText) + tab.Header = ReturnTabHeaderContent(string.IsNullOrWhiteSpace(ueberschriftText) ? aufgabeText - : $"{aufgabeText} - {ueberschriftText}"; + : $"{aufgabeText} - {ueberschriftText}", tab); } @@ -558,7 +617,7 @@ namespace PLG_Exam foreach (var tab in _currentExam.Tabs) { - DrawTaskWithPageBreak(document, tab, descriptionFont, font); + DrawTaskWithPageBreak(document, tab, descriptionFont, font, fontsmall); } @@ -580,7 +639,7 @@ namespace PLG_Exam // Text zeichnen endformatter.DrawString( - "Erstellt mit PLG Exam - powered by PLG Development\nhttps://github.com/PLG-Development/PLG-Exam\n(c) 2024 - PLG Development", + "Erstellt mit PLG Exam - powered by PLG Development\nhttps://github.com/PLG-Development/PLG-Exam\n(c) 2025 - PLG Development", fontsmall, XBrushes.Black, bottomDescriptionRect @@ -599,16 +658,17 @@ namespace PLG_Exam } } - private void DrawTaskWithPageBreak(PdfDocument document, ExamTab tab, XFont font, XFont headerFont) + private void DrawTaskWithPageBreak(PdfDocument document, ExamTab tab, XFont font, XFont headerFont, XFont smallFont) { const double margin = 50; // Seitenränder - const double lineHeight = 14; // Höhe einer Textzeile + const double corr_margin = 250; // Seitenrand Korrektur + const double lineHeight = 21; // Höhe einer Textzeile const double headerHeight = 30; // Platz für die Kopfzeile pro Seite const double footerHeight = 20; // Platz für die Fußzeile const double usableHeight = 842 - margin * 2 - headerHeight - footerHeight; // Höhe des nutzbaren Bereichs // Text aufteilen - var lines = SplitTextIntoLines(tab.Inhalt, document.Pages[0].Width - margin * 2, font); + var lines = SplitTextIntoLines(tab.Inhalt, document.Pages[0].Width - margin -corr_margin, font); double currentHeight = 0; // Aktuelle Höhe, die der Text benötigt @@ -625,11 +685,12 @@ namespace PLG_Exam currentHeight = 0; // Kopfzeile zeichnen + DrawName(gfx, tab, smallFont, margin, headerHeight); DrawHeader(gfx, tab, headerFont, margin, headerHeight); } // Zeile zeichnen - gfx.DrawString(line, font, XBrushes.Black, new XRect(margin, margin + headerHeight + currentHeight, page.Width - margin * 2, lineHeight), XStringFormats.TopLeft); + gfx.DrawString(line, font, XBrushes.Black, new XRect(margin, margin + headerHeight + currentHeight, page.Width - margin - corr_margin, lineHeight), XStringFormats.TopLeft); currentHeight += lineHeight; } } @@ -641,6 +702,16 @@ namespace PLG_Exam gfx.DrawString(headerText, font, XBrushes.Gray, new XRect(margin, margin, gfx.PageSize.Width - margin * 2, headerHeight), XStringFormats.TopLeft); } + private void DrawName(XGraphics gfx, ExamTab tab, XFont font, double margin, double headerHeight) + { + var headerText = $"{_currentExam.Name}, {_currentExam.Vorname}"; + gfx.DrawString(headerText, font, XBrushes.Gray, new XRect(margin, margin-15, gfx.PageSize.Width - margin * 2, headerHeight), XStringFormats.TopLeft); + + var headerText2 = _currentExam.Datum.Value.ToString("dd.MM.yyyy", CultureInfo.CreateSpecificCulture("de-DE")); + gfx.DrawString(headerText2, font, XBrushes.Gray, new XRect(margin, margin-15, gfx.PageSize.Width - margin * 2, headerHeight), XStringFormats.TopRight); + + } + // Methode zum Aufteilen des Textes in Zeilen private List SplitTextIntoLines(string text, double maxWidth, XFont font) {