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; 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); ViewModel.DispatcherShowMsgInteraction.RegisterHandler(interaction => { var msg = interaction.Input; Dispatcher.UIThread.Post(() => ShowMsg(msg), DispatcherPriority.ApplicationIdle); interaction.SetOutput(RxVoid.Default); }).DisposeWith(disposables); ViewModel?.FlushQueueMsg(); }); TextEditorKeywordHighlighter.Attach(txtMsg, Global.LogLevelColors.ToDictionary( kv => kv.Key, kv => (IBrush)new SolidColorBrush(Color.Parse(kv.Value)) )); } 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(); } }