using System.Reactive.Disposables; using Avalonia.Interactivity; using Avalonia.Media; using Avalonia.ReactiveUI; using Avalonia.Threading; using ReactiveUI; using v2rayN.Desktop.Common; namespace v2rayN.Desktop.Views; public partial class MsgView : ReactiveUserControl { //private const int KeepLines = 30; public MsgView() { InitializeComponent(); txtMsg.TextArea.TextView.Options.EnableHyperlinks = false; 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); }); TextEditorKeywordHighlighter.Attach(txtMsg, Global.LogLevelColors.ToDictionary( kv => kv.Key, kv => (IBrush)new SolidColorBrush(Color.Parse(kv.Value)) )); } 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) { //var lineCount = txtMsg.LineCount; //if (lineCount > ViewModel?.NumMaxMsg) //{ // var cutLine = txtMsg.Document.GetLineByNumber(lineCount - KeepLines); // txtMsg.Document.Remove(0, cutLine.Offset); //} if (txtMsg.LineCount > ViewModel?.NumMaxMsg) { ClearMsg(); } txtMsg.AppendText(msg.ToString()); if (togScrollToEnd.IsChecked ?? true) { txtMsg.ScrollToEnd(); } } public void ClearMsg() { txtMsg.Clear(); txtMsg.AppendText("----- Message cleared -----\n"); } private void menuMsgViewSelectAll_Click(object? sender, RoutedEventArgs e) { Dispatcher.UIThread.Post(() => { txtMsg.TextArea.Focus(); txtMsg.SelectAll(); }, DispatcherPriority.Render); } 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(); } }