From cf6408cb716692d16432317911d37192c68ce958 Mon Sep 17 00:00:00 2001 From: ryoii Date: Mon, 17 Feb 2020 00:15:55 +0800 Subject: [PATCH] console graphical almost done --- .../mirai/console/graphical/MiraiGraphical.kt | 13 +++- .../graphical/controller/MiraiController.kt | 31 --------- .../controller/MiraiGraphicalUIController.kt | 66 +++++++++++++++++++ .../mirai/console/graphical/model/BotModel.kt | 13 ++++ .../console/graphical/model/ConsoleInfo.kt | 17 +++++ .../graphical/model/VerificationCodeModel.kt | 17 +++++ .../console/graphical/view/LoginFragment.kt | 27 ++++++++ .../console/graphical/view/PrimaryView.kt | 49 +++++++++++++- .../view/VerificationCodeFragment.kt | 19 ++++++ 9 files changed, 217 insertions(+), 35 deletions(-) delete mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/BotModel.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/ConsoleInfo.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/VerificationCodeModel.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/LoginFragment.kt create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/VerificationCodeFragment.kt diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/MiraiGraphical.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/MiraiGraphical.kt index 315f79b50..7e5633dee 100644 --- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/MiraiGraphical.kt +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/MiraiGraphical.kt @@ -1,17 +1,26 @@ package net.mamoe.mirai.console.graphical +import net.mamoe.mirai.console.MiraiConsole +import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController import net.mamoe.mirai.console.graphical.view.PrimaryView import tornadofx.App +import tornadofx.find import tornadofx.launch fun main(args: Array) { - launch(args) + launch(args) } -class MainApp: App(PrimaryView::class) { +class MiraiGraphicalUI: App(PrimaryView::class) { override fun init() { super.init() + MiraiConsole.start(find()) + } + + override fun stop() { + super.stop() + MiraiConsole.stop() } } \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt deleted file mode 100644 index c5e77d5fb..000000000 --- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiController.kt +++ /dev/null @@ -1,31 +0,0 @@ -package net.mamoe.mirai.console.graphical.controller - -import net.mamoe.mirai.Bot -import net.mamoe.mirai.console.MiraiConsoleUI -import tornadofx.Controller - -class MiraiController : Controller(), MiraiConsoleUI { - override fun pushLog(identity: Long, message: String) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun prePushBot(identity: Long) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun pushBot(bot: Bot) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun pushVersion(consoleVersion: String, consoleBuild: String, coreVersion: String) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override suspend fun requestInput(question: String): String { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } - - override fun pushBotAdminStatus(identity: Long, admins: List) { - TODO("not implemented") //To change body of created functions use File | Settings | File Templates. - } -} \ No newline at end of file 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 new file mode 100644 index 000000000..51fd99bca --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/controller/MiraiGraphicalUIController.kt @@ -0,0 +1,66 @@ +package net.mamoe.mirai.console.graphical.controller + +import javafx.application.Platform +import javafx.stage.Modality +import net.mamoe.mirai.Bot +import net.mamoe.mirai.console.MiraiConsole +import net.mamoe.mirai.console.MiraiConsoleUI +import net.mamoe.mirai.console.graphical.model.BotModel +import net.mamoe.mirai.console.graphical.model.ConsoleInfo +import net.mamoe.mirai.console.graphical.model.VerificationCodeModel +import net.mamoe.mirai.console.graphical.view.VerificationCodeFragment +import tornadofx.Controller +import tornadofx.Scope +import tornadofx.find +import tornadofx.observableListOf + +class MiraiGraphicalUIController : Controller(), MiraiConsoleUI { + + private val cache = mutableMapOf() + val mainLog = observableListOf() + val botList = observableListOf() + val consoleInfo = ConsoleInfo() + + fun login(qq: String, psd: String) { + MiraiConsole.CommandListener.commandChannel.offer("/login $qq $psd") + } + + override fun pushLog(identity: Long, message: String) = Platform.runLater { + when (identity) { + 0L -> mainLog.add(message) + else -> cache[identity]?.logHistory?.add(message) + } + } + + override fun prePushBot(identity: Long) = Platform.runLater { + BotModel(identity).also { + cache[identity] = it + botList.add(it) + } + } + + override fun pushBot(bot: Bot) = Platform.runLater { + cache[bot.uin]?.bot = bot + } + + override fun pushVersion(consoleVersion: String, consoleBuild: String, coreVersion: String) { + Platform.runLater { + consoleInfo.consoleVersion = consoleVersion + consoleInfo.consoleBuild = consoleBuild + consoleInfo.coreVersion = coreVersion + } + } + + override suspend fun requestInput(question: String): String { + val model = VerificationCodeModel() + find(Scope(model)).openModal( + modality = Modality.APPLICATION_MODAL, + resizable = false + ) + return model.code.value + } + + override fun pushBotAdminStatus(identity: Long, admins: List) = Platform.runLater { + cache[identity]?.admins?.setAll(admins) + } +} \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/BotModel.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/BotModel.kt new file mode 100644 index 000000000..8d15d6998 --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/BotModel.kt @@ -0,0 +1,13 @@ +package net.mamoe.mirai.console.graphical.model + +import javafx.beans.property.SimpleObjectProperty +import net.mamoe.mirai.Bot +import tornadofx.* + +class BotModel(val uin: Long) { + val botProperty = SimpleObjectProperty(null) + var bot: Bot by botProperty + + val logHistory = observableListOf() + val admins = observableListOf() +} diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/ConsoleInfo.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/ConsoleInfo.kt new file mode 100644 index 000000000..9c43ecc1e --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/ConsoleInfo.kt @@ -0,0 +1,17 @@ +package net.mamoe.mirai.console.graphical.model + +import javafx.beans.property.SimpleStringProperty +import tornadofx.setValue +import tornadofx.getValue + +class ConsoleInfo { + + val consoleVersionProperty = SimpleStringProperty() + var consoleVersion by consoleVersionProperty + + val consoleBuildProperty = SimpleStringProperty() + var consoleBuild by consoleBuildProperty + + val coreVersionProperty = SimpleStringProperty() + var coreVersion by coreVersionProperty +} \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/VerificationCodeModel.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/VerificationCodeModel.kt new file mode 100644 index 000000000..5582cfa8c --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/model/VerificationCodeModel.kt @@ -0,0 +1,17 @@ +package net.mamoe.mirai.console.graphical.model + +import javafx.beans.property.SimpleStringProperty +import tornadofx.ItemViewModel +import tornadofx.getValue +import tornadofx.setValue + +class VerificationCode { + val codeProperty = SimpleStringProperty("") + var code: String by codeProperty +} + +class VerificationCodeModel(code: VerificationCode) : ItemViewModel(code) { + constructor(): this(VerificationCode()) + + val code = bind(VerificationCode::codeProperty) +} \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/LoginFragment.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/LoginFragment.kt new file mode 100644 index 000000000..1290b7808 --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/LoginFragment.kt @@ -0,0 +1,27 @@ +package net.mamoe.mirai.console.graphical.view + +import javafx.beans.property.SimpleStringProperty +import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController +import tornadofx.* + +class LoginFragment : Fragment() { + + private val controller = find(FX.defaultScope) + private val qq = SimpleStringProperty() + private val psd = SimpleStringProperty() + + override val root = form { + fieldset("登录") { + field("QQ") { + textfield(qq) + } + field("密码") { + passwordfield(psd) + } + button("登录").action { + controller.login(qq.value, psd.value) + close() + } + } + } +} \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt index 5cded1380..1900e25cc 100644 --- a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/PrimaryView.kt @@ -1,11 +1,56 @@ package net.mamoe.mirai.console.graphical.view -import tornadofx.View -import tornadofx.borderpane +import javafx.scene.control.TabPane +import javafx.stage.Modality +import net.mamoe.mirai.Bot +import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController +import tornadofx.* class PrimaryView : View() { + private val controller = find() + override val root = borderpane { + top = menubar { + menu("机器人") { + item("登录").action { + find().openModal( + modality = Modality.APPLICATION_MODAL, + resizable = false + ) + } + } + } + + left = listview(controller.botList) { + fitToParentHeight() + + cellFormat { + + graphic = vbox { + label(it.uin.toString()) +// label(stringBinding(it.botProperty) { if (value != null) value.nick else "登陆中" }) + } + + onDoubleClick { + (center as TabPane).tab(it.uin.toString()) { + listview(it.logHistory) + + isClosable = true + select() + } + } + } + } + + center = tabpane { + tab("Main") { + listview(controller.mainLog) + + isClosable = false + } + } } + } \ No newline at end of file diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/VerificationCodeFragment.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/VerificationCodeFragment.kt new file mode 100644 index 000000000..7e386ba8a --- /dev/null +++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/VerificationCodeFragment.kt @@ -0,0 +1,19 @@ +package net.mamoe.mirai.console.graphical.view + +import javafx.scene.Parent +import tornadofx.* + +class VerificationCodeFragment : Fragment() { + + override val root = vbox { + //TODO: 显示验证码 + + form { + fieldset { + field("验证码") { + textfield() + } + } + } + } +} \ No newline at end of file