From 4fdc6c46e41499ad40f99f6a1c9622493f021ffa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?David=20B=C3=BChler?= <david.buhler@cea.fr>
Date: Thu, 17 Feb 2022 09:51:49 +0100
Subject: [PATCH] [ivette] Adds configurable console scrollback.

---
 ivette/src/frama-c/server.ts        |  2 +-
 ivette/src/ivette/prefs.tsx         | 11 +++++++++++
 ivette/src/renderer/Controller.tsx  |  6 ++++++
 ivette/src/renderer/Preferences.tsx | 14 ++++++++++++++
 4 files changed, 32 insertions(+), 1 deletion(-)

diff --git a/ivette/src/frama-c/server.ts b/ivette/src/frama-c/server.ts
index 77f76c42162..c4369034000 100644
--- a/ivette/src/frama-c/server.ts
+++ b/ivette/src/frama-c/server.ts
@@ -133,7 +133,7 @@ let killingTimer: NodeJS.Timeout | undefined;
 // --------------------------------------------------------------------------
 
 /** The server console buffer. */
-export const buffer = new RichTextBuffer({ maxlines: 200 });
+export const buffer = new RichTextBuffer();
 
 // --------------------------------------------------------------------------
 // --- Server Status
diff --git a/ivette/src/ivette/prefs.tsx b/ivette/src/ivette/prefs.tsx
index 75d501a8378..4a947f3deb1 100644
--- a/ivette/src/ivette/prefs.tsx
+++ b/ivette/src/ivette/prefs.tsx
@@ -93,3 +93,14 @@ export const EditorCommand =
   new Settings.GString('Editor.Command', 'emacs +%n:%c %s');
 
 // --------------------------------------------------------------------------
+// --- Console Scrollback configuration
+// --------------------------------------------------------------------------
+
+export const ConsoleScrollback =
+  new Settings.GNumber('Console.Scrollback', 2000);
+
+export interface ConsoleScrollbackProps {
+  scrollback: Settings.GlobalSettings<number>;
+}
+
+// --------------------------------------------------------------------------
diff --git a/ivette/src/renderer/Controller.tsx b/ivette/src/renderer/Controller.tsx
index 5dde04e965f..b1a72c19ebb 100644
--- a/ivette/src/renderer/Controller.tsx
+++ b/ivette/src/renderer/Controller.tsx
@@ -30,6 +30,7 @@ import React from 'react';
 import * as Dome from 'dome';
 import * as Json from 'dome/data/json';
 import * as Settings from 'dome/data/settings';
+import * as Preferences from 'ivette/prefs';
 
 import * as Toolbars from 'dome/frame/toolbars';
 import { IconButton } from 'dome/controls/buttons';
@@ -211,6 +212,11 @@ const RenderConsole = () => {
     return () => { editor.off('change', callback); };
   });
 
+  const [maxLines] = Settings.useGlobalSettings(Preferences.ConsoleScrollback);
+  React.useEffect(() => {
+    Server.buffer.setMaxlines(maxLines);
+  });
+
   const doReload = () => {
     const cfg = Server.getConfig();
     const hst = insertConfig(history, cfg);
diff --git a/ivette/src/renderer/Preferences.tsx b/ivette/src/renderer/Preferences.tsx
index 1a2ee3750af..47ec4a74e23 100644
--- a/ivette/src/renderer/Preferences.tsx
+++ b/ivette/src/renderer/Preferences.tsx
@@ -99,6 +99,17 @@ function EditorFields() {
   );
 }
 
+// --------------------------------------------------------------------------
+// --- Console Scrollback Forms
+// --------------------------------------------------------------------------
+function ConsoleScrollbackFields(props: IvettePrefs.ConsoleScrollbackProps) {
+  const scrollback = Forms.useDefined(Forms.useValid(
+    Settings.useGlobalSettings(props.scrollback),
+  ));
+  const title = 'Maximum number of lines in the console window';
+  return (<Forms.NumberField state={scrollback} label="Lines" title={title} />);
+}
+
 // --------------------------------------------------------------------------
 // --- Export Components
 // --------------------------------------------------------------------------
@@ -112,6 +123,9 @@ export default function Preferences() {
       <Forms.Section label="Editors" unfold>
         <EditorFields />
       </Forms.Section>
+      <Forms.Section label="Console Scrollback" unfold>
+        <ConsoleScrollbackFields scrollback={IvettePrefs.ConsoleScrollback} />
+      </Forms.Section>
     </Forms.Page>
   );
 }
-- 
GitLab