From be82136e32ebe5ab90e43a16797b88d3517f47c0 Mon Sep 17 00:00:00 2001 From: Zlatin Balevsky Date: Tue, 12 Nov 2019 16:30:55 +0000 Subject: [PATCH] limit scrollback --- .../com/muwire/gui/ChatRoomController.groovy | 15 +++++++++++++++ .../com/muwire/gui/OptionsController.groovy | 4 ++++ .../models/com/muwire/gui/ChatRoomModel.groovy | 3 +++ .../models/com/muwire/gui/OptionsModel.groovy | 2 ++ .../views/com/muwire/gui/OptionsView.groovy | 3 +++ .../main/groovy/com/muwire/gui/UISettings.groovy | 3 +++ 6 files changed, 30 insertions(+) diff --git a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy index f6e31c85..9528ea7b 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/ChatRoomController.groovy @@ -56,6 +56,7 @@ class ChatRoomController { view.roomTextArea.append(toShow) view.roomTextArea.append('\n') + trimLines() } if (command.action == ChatAction.JOIN) { @@ -131,6 +132,7 @@ class ChatRoomController { String toDisplay = DataHelper.formatTime(e.timestamp) + " <"+e.sender.getHumanReadableName()+"> " + text + "\n" runInsideUIAsync { view.roomTextArea.append(toDisplay) + trimLines() } } @@ -139,6 +141,7 @@ class ChatRoomController { runInsideUIAsync { model.members.add(p) view.roomTextArea.append(toDisplay) + trimLines() view.membersTable?.model?.fireTableDataChanged() } } @@ -158,6 +161,7 @@ class ChatRoomController { runInsideUIAsync { model.members.remove(p) view.roomTextArea.append(toDisplay) + trimLines() view.membersTable?.model?.fireTableDataChanged() } } @@ -167,8 +171,19 @@ class ChatRoomController { runInsideUIAsync { if (model.members.remove(p)) { view.roomTextArea.append(toDisplay) + trimLines() view.membersTable?.model?.fireTableDataChanged() } } } + + private void trimLines() { + if (model.settings.maxChatLines < 0) + return + while(view.roomTextArea.getLineCount() > model.settings.maxChatLines) { + int line0Start = view.roomTextArea.getLineStartOffset(0) + int line0End = view.roomTextArea.getLineEndOffset(0) + view.roomTextArea.replaceRange(null, line0Start, line0End) + } + } } \ No newline at end of file diff --git a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy index 3031ea30..09f35722 100644 --- a/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy +++ b/gui/griffon-app/controllers/com/muwire/gui/OptionsController.groovy @@ -151,6 +151,10 @@ class OptionsController { boolean advertiseChat = view.advertiseChatCheckbox.model.isSelected() model.advertiseChat = advertiseChat settings.advertiseChat = advertiseChat + + int maxChatLines = Integer.parseInt(view.maxChatLinesField.text) + model.maxChatLines = maxChatLines + uiSettings.maxChatLines = maxChatLines core.saveMuSettings() diff --git a/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy index 6e550973..bc8a722d 100644 --- a/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/ChatRoomModel.groovy @@ -19,7 +19,10 @@ class ChatRoomModel { def members = [] + UISettings settings + void mvcGroupInit(Map args) { members.add(core.me) + settings = application.context.get("ui-settings") } } \ No newline at end of file diff --git a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy index 94ff0e1b..e98365d0 100644 --- a/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy +++ b/gui/griffon-app/models/com/muwire/gui/OptionsModel.groovy @@ -60,6 +60,7 @@ class OptionsModel { @Observable boolean startChatServer @Observable int maxChatConnections @Observable boolean advertiseChat + @Observable int maxChatLines void mvcGroupInit(Map args) { MuWireSettings settings = application.context.get("muwire-settings") @@ -112,5 +113,6 @@ class OptionsModel { startChatServer = settings.startChatServer maxChatConnections = settings.maxChatConnections advertiseChat = settings.advertiseChat + maxChatLines = uiSettings.maxChatLines } } \ No newline at end of file diff --git a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy index c1b1454d..808e7199 100644 --- a/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy +++ b/gui/griffon-app/views/com/muwire/gui/OptionsView.groovy @@ -75,6 +75,7 @@ class OptionsView { def startChatServerCheckbox def maxChatConnectionsField def advertiseChatCheckbox + def maxChatLinesField def buttonsPanel @@ -284,6 +285,8 @@ class OptionsView { maxChatConnectionsField = textField(text : bind {model.maxChatConnections}, constraints : gbc(gridx: 1, gridy : 1, anchor:GridBagConstraints.LINE_END)) label(text : "Advertise chat ability in search results", constraints : gbc(gridx: 0, gridy:2, anchor:GridBagConstraints.LINE_START, weightx:100)) advertiseChatCheckbox = checkBox(selected : bind{model.advertiseChat}, constraints : gbc(gridx:1, gridy:2, anchor:GridBagConstraints.LINE_END)) + label(text : "Maximum lines of scrollback (-1 means unlimited)", constraints : gbc(gridx:0, gridy:3, anchor : GridBagConstraints.LINE_START, weightx: 100)) + maxChatLinesField = textField(text : bind{model.maxChatLines}, constraints : gbc(gridx:1, gridy: 3, anchor: GridBagConstraints.LINE_END)) } panel(constraints : gbc(gridx: 0, gridy : 1, weighty: 100)) } diff --git a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy index 2ef4ec45..2691e028 100644 --- a/gui/src/main/groovy/com/muwire/gui/UISettings.groovy +++ b/gui/src/main/groovy/com/muwire/gui/UISettings.groovy @@ -19,6 +19,7 @@ class UISettings { boolean clearUploads boolean storeSearchHistory boolean groupByFile + int maxChatLines Set searchHistory Set openTabs @@ -38,6 +39,7 @@ class UISettings { clearUploads = Boolean.parseBoolean(props.getProperty("clearUploads","false")) storeSearchHistory = Boolean.parseBoolean(props.getProperty("storeSearchHistory","true")) groupByFile = Boolean.parseBoolean(props.getProperty("groupByFile","false")) + maxChatLines = Integer.parseInt(props.getProperty("maxChatLines","-1")) searchHistory = DataUtil.readEncodedSet(props, "searchHistory") openTabs = DataUtil.readEncodedSet(props, "openTabs") @@ -59,6 +61,7 @@ class UISettings { props.setProperty("clearUploads", String.valueOf(clearUploads)) props.setProperty("storeSearchHistory", String.valueOf(storeSearchHistory)) props.setProperty("groupByFile", String.valueOf(groupByFile)) + props.setProperty("maxChatLines", String.valueOf(maxChatLines)) if (font != null) props.setProperty("font", font)