public TextScrollWidget(PrinterConfig printer, TerminalLog terminalLog) { this.printer = printer; this.typeFacePrinter = new TypeFacePrinter("", new StyledTypeFace(ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono), 12)); this.typeFacePrinter.DrawFromHintedCache = true; this.terminalLog = terminalLog; this.visibleLines = terminalLog.AllLines().ToList(); // Register listeners printer.Connection.TerminalLog.LineAdded += this.TerminalLog_LineAdded; printer.Connection.TerminalLog.LogCleared += this.TerminalLog_LogCleared; }
public TerminalWidget(PrinterConfig printer, ThemeConfig theme) : base(FlowDirection.TopToBottom) { this.printer = printer; this.Name = "TerminalWidget"; this.Padding = new BorderDouble(5, 0); // Header var headerRow = new FlowLayoutWidget(FlowDirection.LeftToRight) { HAnchor = HAnchor.Left | HAnchor.Stretch, Padding = new BorderDouble(0, 8) }; this.AddChild(headerRow); headerRow.AddChild(CreateVisibilityOptions(theme)); autoUppercase = new CheckBox("Auto Uppercase".Localize(), textSize: theme.DefaultFontSize) { Margin = new BorderDouble(left: 25), Checked = UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalAutoUppercase, true), TextColor = theme.TextColor, VAnchor = VAnchor.Center }; autoUppercase.CheckedStateChanged += (s, e) => { UserSettings.Instance.Fields.SetBool(UserSettingsKey.TerminalAutoUppercase, autoUppercase.Checked); }; headerRow.AddChild(autoUppercase); // Body var bodyRow = new FlowLayoutWidget() { Margin = new BorderDouble(bottom: 4), HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Stretch }; this.AddChild(bodyRow); textScrollWidget = new TextScrollWidget(printer, printer.Connection.TerminalLog) { BackgroundColor = theme.MinimalShade, TextColor = theme.TextColor, HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Stretch, Margin = 0, Padding = new BorderDouble(3, 0) }; bodyRow.AddChild(textScrollWidget); bodyRow.AddChild(new TextScrollBar(textScrollWidget, 15) { ThumbColor = theme.AccentMimimalOverlay, BackgroundColor = theme.SlightShade, Margin = 0 }); textScrollWidget.LineFilterFunction = lineData => { var line = lineData.Line; var output = lineData.Direction == TerminalLine.MessageDirection.ToPrinter; var outputLine = line; var lineWithoutChecksum = GCodeFile.GetLineWithoutChecksum(line); // and set this as the output if desired if (output && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowChecksum, true)) { outputLine = lineWithoutChecksum; } if (!output && lineWithoutChecksum == "ok" && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowOks, true)) { return(null); } else if (output && lineWithoutChecksum.StartsWith("M105") && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowTempRequests, true)) { return(null); } else if (output && (lineWithoutChecksum.StartsWith("G0 ") || lineWithoutChecksum.StartsWith("G1 ")) && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowMovementRequests, true)) { return(null); } else if (!output && (lineWithoutChecksum.StartsWith("T") || lineWithoutChecksum.StartsWith("ok T")) && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowTempResponse, true)) { return(null); } else if (!output && lineWithoutChecksum == "wait" && !UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowWaitResponse, false)) { return(null); } if (UserSettings.Instance.Fields.GetBool(UserSettingsKey.TerminalShowInputOutputMarks, true)) { switch (lineData.Direction) { case TerminalLine.MessageDirection.FromPrinter: outputLine = "→ " + outputLine; break; case TerminalLine.MessageDirection.ToPrinter: outputLine = "← " + outputLine; break; case TerminalLine.MessageDirection.ToTerminal: outputLine = "* " + outputLine; break; } } return(outputLine); }; // Input Row var inputRow = new FlowLayoutWidget(FlowDirection.LeftToRight) { BackgroundColor = this.BackgroundColor, HAnchor = HAnchor.Stretch, Margin = new BorderDouble(bottom: 2) }; this.AddChild(inputRow); manualCommandTextEdit = new MHTextEditWidget("", theme, typeFace: ApplicationController.GetTypeFace(NamedTypeFace.Liberation_Mono)) { Margin = new BorderDouble(right: 3), HAnchor = HAnchor.Stretch, VAnchor = VAnchor.Bottom }; manualCommandTextEdit.ActualTextEditWidget.EnterPressed += (s, e) => { SendManualCommand(); }; manualCommandTextEdit.ActualTextEditWidget.KeyDown += (s, keyEvent) => { bool changeToHistory = false; if (keyEvent.KeyCode == Keys.Up) { commandHistoryIndex--; if (commandHistoryIndex < 0) { commandHistoryIndex = 0; } changeToHistory = true; } else if (keyEvent.KeyCode == Keys.Down) { commandHistoryIndex++; if (commandHistoryIndex > commandHistory.Count - 1) { commandHistoryIndex = commandHistory.Count - 1; } else { changeToHistory = true; } } else if (keyEvent.KeyCode == Keys.Escape) { manualCommandTextEdit.Text = ""; } if (changeToHistory && commandHistory.Count > 0) { manualCommandTextEdit.Text = commandHistory[commandHistoryIndex]; } }; inputRow.AddChild(manualCommandTextEdit); // Footer var toolbarPadding = theme.ToolbarPadding; var footerRow = new FlowLayoutWidget { HAnchor = HAnchor.Stretch, Padding = new BorderDouble(0, toolbarPadding.Bottom, toolbarPadding.Right, toolbarPadding.Top) }; this.AddChild(footerRow); var sendButton = theme.CreateDialogButton("Send".Localize()); sendButton.Margin = theme.ButtonSpacing; sendButton.Click += (s, e) => { SendManualCommand(); }; footerRow.AddChild(sendButton); var clearButton = theme.CreateDialogButton("Clear".Localize()); clearButton.Margin = theme.ButtonSpacing; clearButton.Click += (s, e) => { printer.Connection.TerminalLog.Clear(); }; footerRow.AddChild(clearButton); var exportButton = theme.CreateDialogButton("Export".Localize()); exportButton.Margin = theme.ButtonSpacing; exportButton.Click += (s, e) => { UiThread.RunOnIdle(() => TerminalLog.Export(printer.Connection)); }; footerRow.AddChild(exportButton); footerRow.AddChild(new HorizontalSpacer()); this.AnchorAll(); }