using System.Reactive.Disposables; using Avalonia.Controls; using Avalonia.Interactivity; using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views; public partial class MsgView : ReactiveUserControl { private readonly ScrollViewer _scrollViewer; public MsgView() { InitializeComponent(); _scrollViewer = this.FindControl("msgScrollViewer"); ViewModel = new MsgViewModel(UpdateViewHandler); this.WhenActivated(disposables => { this.Bind(ViewModel, vm => vm.MsgFilter, v => v.cmbMsgFilter.Text).DisposeWith(disposables); this.Bind(ViewModel, vm => vm.AutoRefresh, v => v.togAutoRefresh.IsChecked).DisposeWith(disposables); }); } private async Task UpdateViewHandler(EViewAction action, object? obj) { switch (action) { case EViewAction.DispatcherShowMsg: if (obj is null) return false; Dispatcher.UIThread.Post(() => ShowMsg(obj), DispatcherPriority.ApplicationIdle); break; } return await Task.FromResult(true); } private void ShowMsg(object msg) { txtMsg.Text = msg.ToString(); if (togScrollToEnd.IsChecked ?? true) { _scrollViewer?.ScrollToEnd(); } } public void ClearMsg() { ViewModel?.ClearMsg(); txtMsg.Text = ""; } private void menuMsgViewSelectAll_Click(object? sender, RoutedEventArgs e) { txtMsg.Focus(); txtMsg.SelectAll(); } private async void menuMsgViewCopy_Click(object? sender, RoutedEventArgs e) { var data = txtMsg.SelectedText.TrimEx(); await AvaUtils.SetClipboardData(this, data); } private async void menuMsgViewCopyAll_Click(object? sender, RoutedEventArgs e) { var data = txtMsg.Text.TrimEx(); await AvaUtils.SetClipboardData(this, data); } private void menuMsgViewClear_Click(object? sender, RoutedEventArgs e) { ClearMsg(); } }