Commit 2d6dd098 authored by jiahua.liu's avatar jiahua.liu

main frame complete

parent 1437ad70
...@@ -237,7 +237,7 @@ object MiraiConsole { ...@@ -237,7 +237,7 @@ object MiraiConsole {
object CommandListener { object CommandListener {
fun start() { fun start() {
thread { thread {
processNextCommandLine() //processNextCommandLine()
} }
} }
...@@ -281,7 +281,6 @@ class MiraiConsoleLoader { ...@@ -281,7 +281,6 @@ class MiraiConsoleLoader {
companion object { companion object {
@JvmStatic @JvmStatic
fun main(args: Array<String>) { fun main(args: Array<String>) {
MiraiConsole.start() MiraiConsole.start()
Runtime.getRuntime().addShutdownHook(thread(start = false) { Runtime.getRuntime().addShutdownHook(thread(start = false) {
MiraiConsole.stop() MiraiConsole.stop()
......
...@@ -11,11 +11,15 @@ import com.googlecode.lanterna.terminal.Terminal ...@@ -11,11 +11,15 @@ import com.googlecode.lanterna.terminal.Terminal
import com.googlecode.lanterna.terminal.TerminalResizeListener import com.googlecode.lanterna.terminal.TerminalResizeListener
import com.googlecode.lanterna.terminal.swing.SwingTerminal import com.googlecode.lanterna.terminal.swing.SwingTerminal
import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame import com.googlecode.lanterna.terminal.swing.SwingTerminalFrame
import net.mamoe.mirai.MiraiConsoleUI.LoggerDrawer.drawLog
import net.mamoe.mirai.MiraiConsoleUI.LoggerDrawer.redrawLogs
import net.mamoe.mirai.utils.currentTimeSeconds
import java.io.OutputStream import java.io.OutputStream
import java.io.PrintStream import java.io.PrintStream
import java.lang.StringBuilder import java.nio.charset.Charset
import java.util.* import java.util.*
import kotlin.concurrent.thread import kotlin.concurrent.thread
import kotlin.math.ceil
object MiraiConsoleUI { object MiraiConsoleUI {
...@@ -36,12 +40,17 @@ object MiraiConsoleUI { ...@@ -36,12 +40,17 @@ object MiraiConsoleUI {
lateinit var textGraphics: TextGraphics lateinit var textGraphics: TextGraphics
var hasStart = false var hasStart = false
private lateinit var internalPrinter: PrintStream
fun start() { fun start() {
if (hasStart) { if (hasStart) {
return return
} }
internalPrinter = System.out
hasStart = true hasStart = true
val defaultTerminalFactory = DefaultTerminalFactory() val defaultTerminalFactory = DefaultTerminalFactory(internalPrinter, System.`in`, Charset.defaultCharset())
try { try {
terminal = defaultTerminalFactory.createTerminal() terminal = defaultTerminalFactory.createTerminal()
terminal.enterPrivateMode() terminal.enterPrivateMode()
...@@ -64,8 +73,27 @@ object MiraiConsoleUI { ...@@ -64,8 +73,27 @@ object MiraiConsoleUI {
inited = false inited = false
update() update()
redrawCommand() redrawCommand()
redrawLogs(log[screens[currentScreenId]]!!)
}) })
if (terminal !is SwingTerminalFrame) {
System.setOut(PrintStream(object : OutputStream() {
var builder = java.lang.StringBuilder()
override fun write(b: Int) {
with(b.toChar()) {
if (this == '\n') {
pushLog(0, builder.toString())
builder = java.lang.StringBuilder()
} else {
builder.append(this)
}
}
}
}))
}
System.setErr(System.out)
update() update()
val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ') val charList = listOf(',', '.', '/', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '=', '+', '!', ' ')
...@@ -197,52 +225,83 @@ object MiraiConsoleUI { ...@@ -197,52 +225,83 @@ object MiraiConsoleUI {
textGraphics.putString(width - 2 - "Add admins via commands|".length, 4, "Add admins via commands|") textGraphics.putString(width - 2 - "Add admins via commands|".length, 4, "Add admins via commands|")
} }
fun drawLogs(values: List<String>) {
val width = terminal.terminalSize.columns - 6
val heightMin = 5
var currentHeight = terminal.terminalSize.rows - 5
for (index in heightMin until currentHeight) { object LoggerDrawer {
clearRows(index) var currentHeight = 6
}
values.forEach { fun drawLog(string: String, flush: Boolean = true) {
if (currentHeight > heightMin) { val maxHeight = terminal.terminalSize.rows - 6
var x = it val heightNeed = (string.length / (terminal.terminalSize.columns - 6)) + 1
while (currentHeight > heightMin) { if (currentHeight + heightNeed > maxHeight) {
if (x.isEmpty() || x.isBlank()) break cleanPage()
textGraphics.foregroundColor = TextColor.ANSI.GREEN }
textGraphics.backgroundColor = TextColor.ANSI.DEFAULT textGraphics.foregroundColor = TextColor.ANSI.GREEN
val towrite = if (x.length > width) { textGraphics.backgroundColor = TextColor.ANSI.DEFAULT
x.substring(0, width).also { val width = terminal.terminalSize.columns - 6
x = x.substring(width) var x = string
} while (true) {
} else { if (x == "") break
x.also { val toWrite = if (x.length > width) {
x = "" x.substring(0, width).also {
} x = x.substring(width)
}
} else {
x.also {
x = ""
} }
textGraphics.putString(3, currentHeight, towrite, SGR.ITALIC)
--currentHeight
} }
try {
textGraphics.putString(3, currentHeight, toWrite, SGR.ITALIC)
} catch (ignored: Exception) {
//
}
++currentHeight
}
if (flush && terminal is SwingTerminalFrame) {
terminal.flush()
}
}
fun cleanPage() {
for (index in 6 until terminal.terminalSize.rows - 6) {
clearRows(index)
} }
currentHeight = 6
} }
textGraphics.putString(3, 9, "AAAAAAAAAAAAAAAAAAAAAAa", SGR.ITALIC)
terminal.flush() fun redrawLogs(toDraw: List<String>) {
this.cleanPage()
var logsToDraw = 0
var vara = 0
toDraw.reversed().forEach {
val heightNeed = (it.length / (terminal.terminalSize.columns - 6)) + 1
vara += heightNeed
if (currentHeight + vara < terminal.terminalSize.rows - 6) {
logsToDraw++
} else {
return
}
}
for (index in (toDraw.size - logsToDraw) until toDraw.size - 1) {
drawLog(toDraw[index], false)
}
if (terminal is SwingTerminalFrame) {
terminal.flush()
}
}
} }
fun pushLog(uin: Long, str: String) { fun pushLog(uin: Long, str: String) {
log[uin]!!.push(str) log[uin]!!.push(str)
if (uin == screens[currentScreenId]) { if (uin == screens[currentScreenId]) {
drawLogs(log[screens[currentScreenId]]!!) drawLog(str)
} }
} }
var commandBuilder = StringBuilder() var commandBuilder = StringBuilder()
fun redrawCommand() { fun redrawCommand() {
val height = terminal.terminalSize.rows val height = terminal.terminalSize.rows
val width = terminal.terminalSize.columns val width = terminal.terminalSize.columns
...@@ -303,7 +362,7 @@ object MiraiConsoleUI { ...@@ -303,7 +362,7 @@ object MiraiConsoleUI {
drawBotFrame(screens[currentScreenId], 0) drawBotFrame(screens[currentScreenId], 0)
} }
} }
terminal.flush() redrawLogs(log[screens[currentScreenId]]!!)
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment