using System.Windows; namespace DeskCore; /// Einstellungen der Desktop-Boxen: Portale, Schnell verstecken, Peek, Chamäleon und Snapshots. public partial class MainWindow { /// Box geschlossen o. Ä. → Kennzeichnung "hat Box" in der Seitenleiste aktualisieren. public void RefreshFromFences() { Refresh(); if (InSettings) { LoadFenceSettings(); LoadDesktopSettings(); } } private void LoadFenceSettings() { QuickHideToggle.IsChecked = S.QuickHide; PeekToggle.IsChecked = S.PeekEnabled; PeekHint.Text = $"{Hotkey.Describe(S.PeekModifiers, S.PeekKey)} holt alle Boxen vor die offenen Fenster. " + "Nochmal drücken, Esc oder woanders hinklicken schickt sie zurück."; ChameleonToggle.IsChecked = S.FenceChameleon; SnapshotList.ItemsSource = null; SnapshotList.ItemsSource = S.Snapshots.OrderByDescending(x => x.Created).ToList(); } private void AddPortal_Click(object sender, RoutedEventArgs e) { int before = S.Fences.Count; FenceManager.AddPortal(); if (S.Fences.Count > before) ShowToast("Ordner-Portal liegt jetzt auf dem Desktop", ""); LoadSettingsView(); } private void QuickHideToggle_Click(object sender, RoutedEventArgs e) { S.QuickHide = QuickHideToggle.IsChecked == true; S.Save(); DesktopToggle.Apply(); } private void PeekToggle_Click(object sender, RoutedEventArgs e) { S.PeekEnabled = PeekToggle.IsChecked == true; S.Save(); if (!App.ApplyPeekHotkey()) PeekHint.Text = "⚠ Diese Tastenkombination ist schon von einem anderen Programm belegt."; } private void ChameleonToggle_Click(object sender, RoutedEventArgs e) { S.FenceChameleon = ChameleonToggle.IsChecked == true; S.Save(); FenceManager.RefreshAll(); } // ---------- Snapshots ---------- private void SaveSnapshot_Click(object sender, RoutedEventArgs e) { if (S.Fences.Count == 0) { ShowToast("Es gibt noch keine Boxen zum Speichern", "", info: true); return; } var name = Dialog.Prompt(this, "Anordnung speichern", "Name für diese Anordnung (z. B. „Arbeit“ oder „Zocken“):", $"Anordnung {S.Snapshots.Count + 1}", "Speichern", t => t.Trim().Length == 0 ? "Bitte einen Namen eingeben." : t.Contains('"') ? "Bitte ohne Anführungszeichen." : null); if (name is null) return; bool replace = S.Snapshots.Any(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); FenceManager.SaveSnapshot(name); LoadFenceSettings(); ShowToast(replace ? $"Anordnung „{name}“ aktualisiert" : $"Anordnung „{name}“ gespeichert", ""); } private void RestoreSnapshot(FenceSnapshot snap) { var before = FenceManager.RestoreSnapshot(snap); var entry = new UndoEntry($"Anordnung „{snap.Name}“ laden"); entry.Add(() => { FenceManager.ApplyFences(before); return null; }); Undo.Push(entry); Refresh(); ShowToast($"Anordnung „{snap.Name}“ wiederhergestellt", "", undoable: true); } private void RestoreSnapshot_Click(object sender, RoutedEventArgs e) { if ((sender as FrameworkElement)?.Tag is FenceSnapshot snap) RestoreSnapshot(snap); } private void DeleteSnapshot_Click(object sender, RoutedEventArgs e) { if ((sender as FrameworkElement)?.Tag is not FenceSnapshot snap) return; S.Snapshots.Remove(snap); S.Save(); var entry = new UndoEntry($"Anordnung „{snap.Name}“ löschen"); entry.Add(() => { S.Snapshots.Add(snap); S.Save(); return null; }); Undo.Push(entry); LoadFenceSettings(); ShowToast($"Anordnung „{snap.Name}“ gelöscht", "", undoable: true); } /// Für die Befehlszeile: DeskCore.exe --snapshot "Name". public void RestoreSnapshotByName(string name) { var snap = S.Snapshots.FirstOrDefault(x => string.Equals(x.Name, name, StringComparison.OrdinalIgnoreCase)); if (snap is null) App.TrayIcon?.Notify("Anordnung nicht gefunden", $"Es gibt keine gespeicherte Anordnung „{name}“."); else RestoreSnapshot(snap); } // ---------- Regeln: Name oder Dateityp ---------- private void RuleKind_Click(object sender, RoutedEventArgs e) { if ((sender as FrameworkElement)?.Tag is not SortRule r) return; r.Kind = r.Kind == "Typ" ? "Name" : "Typ"; S.Save(); LoadSettingsView(); } }