HashCalculator.GUI/MainWindow.xaml.cs
2022-01-25 21:59:01 +01:00

111 lines
3.8 KiB
C#

using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace HashCalculator.GUI
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
internal ViewModel ViewModel => (ViewModel)DataContext;
private bool _autoscroll = true;
public MainWindow()
{
InitializeComponent();
Translator.ProviderChanged += (s, e) => Dispatcher.Invoke(() =>
{
ViewModel.NotifyCsfChange();
});
ViewModel.ShowCopyableBox += ViewModel_ShowCopyableBox;
ViewModel.OpenFileDialog += ViewModel_OpenFileDialog;
ViewModel.ClearTracer += ViewModel_ClearTracer;
}
private void ViewModel_ShowCopyableBox(object? sender, ShowCopyableBoxEventArgs e)
{
var title = e.Title;
var getContent = e.GetContent;
e.Completion = Dispatcher.InvokeAsync(() =>
{
using var box = new CopyableBox(this, title, getContent);
box.ShowDialog();
}).Task;
}
private void ViewModel_OpenFileDialog(object? sender, OpenFileDialogEventArgs e)
{
var sdkRoot = new OpenFileDialog
{
Title = e.Title,
Filter = string.Join('|', e.Filters.Select(t =>
{
if (t.Description is null)
{
return $"{t.Extension}|{t.Extension}";
}
return $"{t.Description} ({t.Extension})|{t.Extension}";
}))
};
e.Result = Dispatcher.InvokeAsync(() => sdkRoot.ShowDialog(this) is not true ? null : sdkRoot.FileName).Task;
}
private void OnButtomScrollViewerScrollChanged(object sender, ScrollChangedEventArgs e)
{
var scrollViewer = (ScrollViewer)sender;
// User scroll event : set or unset auto-scroll mode
if (e.ExtentHeightChange == 0)
{ // Content unchanged : user scroll event
if (scrollViewer.VerticalOffset == scrollViewer.ScrollableHeight)
{ // Scroll bar is in bottom
// Set auto-scroll mode
_autoscroll = true;
}
else
{ // Scroll bar isn't in bottom
// Unset auto-scroll mode
_autoscroll = false;
}
}
// Content scroll event : auto-scroll eventually
if (_autoscroll && e.ExtentHeightChange != 0)
{ // Content changed and auto-scroll mode set
// Autoscroll
scrollViewer.ScrollToVerticalOffset(scrollViewer.ExtentHeight);
}
}
private void OnInitialized(object sender, EventArgs e)
{
TracerListener.DataAvailaible += delegate
{
Dispatcher.InvokeAsync(() =>
{
if (TracerListener.GetText() is not { Length: > 0 } text)
{
return;
}
LogPrefix.Visibility = Visibility.Visible;
LogText.AppendText(text);
ClearLogs.Visibility = Visibility.Visible;
});
};
}
private void ViewModel_ClearTracer(object? sender, EventArgs e)
{
LogPrefix.Visibility = Visibility.Collapsed;
LogText.Clear();
ClearLogs.Visibility = Visibility.Collapsed;
}
}
}