From 0e28121182d97eac11aec88cade4743abac030aa Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Tue, 17 Mar 2020 23:59:18 +0800
Subject: [PATCH] Trim log size

---
 .../controller/MiraiGraphicalUIController.kt  | 24 +++++++++++----
 .../console/graphical/model/GlobalSetting.kt  | 17 +++++++++++
 .../console/graphical/view/SettingsView.kt    | 29 ++++++++++++-------
 3 files changed, 53 insertions(+), 17 deletions(-)
 create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/GlobalSetting.kt

diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt
index 03abb928c..cdeae3e5e 100644
--- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt
+++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt
@@ -5,10 +5,7 @@ import javafx.collections.ObservableList
 import javafx.stage.Modality
 import net.mamoe.mirai.Bot
 import net.mamoe.mirai.console.MiraiConsole
-import net.mamoe.mirai.console.graphical.model.BotModel
-import net.mamoe.mirai.console.graphical.model.ConsoleInfo
-import net.mamoe.mirai.console.graphical.model.PluginModel
-import net.mamoe.mirai.console.graphical.model.VerificationCodeModel
+import net.mamoe.mirai.console.graphical.model.*
 import net.mamoe.mirai.console.graphical.view.VerificationCodeFragment
 import net.mamoe.mirai.console.plugins.PluginManager
 import net.mamoe.mirai.console.utils.MiraiConsoleUI
@@ -17,6 +14,7 @@ import tornadofx.*
 
 class MiraiGraphicalUIController : Controller(), MiraiConsoleUI {
 
+    private val settingModel = find<GlobalSettingModel>()
     private val loginSolver = GraphicalLoginSolver()
     private val cache = mutableMapOf<Long, BotModel>()
     val mainLog = observableListOf<String>()
@@ -34,9 +32,23 @@ class MiraiGraphicalUIController : Controller(), MiraiConsoleUI {
     fun sendCommand(command: String) = MiraiConsole.CommandProcessor.runConsoleCommandBlocking(command)
 
     override fun pushLog(identity: Long, message: String) = Platform.runLater {
+        fun ObservableList<*>.trim() {
+            println(size)
+            println(settingModel.item.maxLongNum)
+            if (size > settingModel.item.maxLongNum) {
+                this.removeAt(0)
+            }
+        }
+
         when (identity) {
-            0L -> mainLog.add(message)
-            else -> cache[identity]?.logHistory?.add(message)
+            0L -> mainLog.apply {
+                add(message)
+                mainLog.trim()
+            }
+            else -> cache[identity]?.logHistory?.apply {
+                add(message)
+                trim()
+            }
         }
     }
 
diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/GlobalSetting.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/GlobalSetting.kt
new file mode 100644
index 000000000..0bb792e5a
--- /dev/null
+++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/GlobalSetting.kt
@@ -0,0 +1,17 @@
+package net.mamoe.mirai.console.graphical.model
+
+import javafx.beans.property.SimpleLongProperty
+import tornadofx.ItemViewModel
+import tornadofx.getValue
+import tornadofx.setValue
+
+class GlobalSetting {
+    val maxLogNumProperty = SimpleLongProperty(4096)
+    var maxLongNum: Long by maxLogNumProperty
+}
+
+class GlobalSettingModel(setting: GlobalSetting) : ItemViewModel<GlobalSetting>(setting) {
+    constructor() : this(GlobalSetting())
+
+    val maxLogNum = bind(GlobalSetting::maxLogNumProperty)
+}
diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/SettingsView.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/SettingsView.kt
index d7d2d8302..fca431caa 100644
--- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/SettingsView.kt
+++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/SettingsView.kt
@@ -1,38 +1,45 @@
 package net.mamoe.mirai.console.graphical.view
 
 import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController
+import net.mamoe.mirai.console.graphical.model.GlobalSettingModel
 import net.mamoe.mirai.console.graphical.util.jfxButton
 import net.mamoe.mirai.console.graphical.util.jfxTextfield
-import tornadofx.View
-import tornadofx.field
-import tornadofx.fieldset
-import tornadofx.form
+import tornadofx.*
+import java.awt.Desktop
+import java.io.File
 
 class SettingsView : View() {
 
     private val controller = find<MiraiGraphicalUIController>()
+    private val settingModel = find<GlobalSettingModel>()
 
     override val root = form {
 
         fieldset {
             field {
-                jfxButton("撤掉") { }
-                jfxButton("保存") { }
+                jfxButton("撤掉").action {
+                    settingModel.rollback()
+                }
+                jfxButton("保存").action {
+                    settingModel.commit()
+                }
             }
         }
 
         fieldset("插件目录") {
             field {
-                jfxTextfield("...") { isEditable = false }
-                jfxButton("打开目录")
+                jfxTextfield((System.getProperty("user.dir") + "/plugins/").replace("//", "/")) { isEditable = false }
+                jfxButton("打开目录").action {
+                    (System.getProperty("user.dir") + "/plugins/").replace("//", "/").also { path ->
+                        Desktop.getDesktop().takeIf { it.isSupported(Desktop.Action.OPEN) }?.open(File(path))
+                    }
+                }
             }
         }
 
         fieldset("最大日志容量") {
             field {
-                jfxTextfield("...") {
-
-                }
+                jfxTextfield().bind(settingModel.maxLogNum)
             }
         }
     }