From 78ebe4c7cd8c3a75253081033bd26934722fcfd3 Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Tue, 18 Feb 2020 22:47:48 +0800
Subject: [PATCH 1/4] logo

---
 .../src/main/resources/logo.png               | Bin 3974 -> 4752 bytes
 1 file changed, 0 insertions(+), 0 deletions(-)

diff --git a/mirai-console-graphical/src/main/resources/logo.png b/mirai-console-graphical/src/main/resources/logo.png
index 7be6c687173594899ce8f3ef3a8ea47d763168b1..bded5f13787965fb184119546f61ba11c0a5f317 100644
GIT binary patch
literal 4752
zcmbuD<yRAq!^KCph`<;nIl4m{K{}<RV<??t)CB2}5Rpb&gwb8Hf#imWGP+}cv~;83
z@B1e_=R7a&y)QoZocsPJ8X0O)ku#A4001f-ZFQ6XvgAK$lH&j8gN>w{0Kg*)9d%VR
zINpJcl|RdD;GuKKB~eTtfSWy%kl%!x+p1JuFq?Besi4}7|HW(F7Xmh$T7wPsr>Nq)
z4>`ZYH{Y7gzo`21Xj?U#Q#_mBPf{Z}Stpu3(fhL76|uM~*MX`)xdJ%NUJXy#Qik}f
zh8}iq7aY}ZucR4FX7V_`5iWVx;6eNI8$NC1P#3E{pa`J21qAtD@F>CYk8^DxKc@4~
zab&%(e4@lHd?#Xf0jZrt7~5_g>i=``v45l*-rlU_PxGFRarcftN{uO%-vjv4XZkrb
z(yojQR;BXq>{WebZgJdI%>}9IlAo57W<!?s&_7WZ3+Sq)xT*pK%grS@E&Xi%eyW*p
zfvr4q66Ok$>#NR50^5Bs_qV$7q@^OYezpd=4=ffK=Kb6hVQG60*~;ZSia(9fJm97F
zjWDij{S(ix7fpvPcl-UPv$MxqHjUg}S))VYfGs?XReF7f-Fl#S(<K5L0<NxBZsxkM
zzP;7m9DVV*K`*^lv-F1IXlOh8@<l%+@9%)iU9tHQ-s30{cA$lHX!`4hY4w?nAb$qw
zfPw4TikjjqUEu*hCBB`QIQNYs>H?d}_7}E43_U5XSNdXI!&DF@@~?O?U#6zqvH5ex
z%kz*d)a<)(i^{qE){)@)Jk1CPFeNc=+PtO2w1%)AfWb>#aej@eS*^?tHhyK}yITF?
zW3NCGjGK{~7y>J|-u;OG9WS5xA_>Jg=U%rAa$@VYY%mrNVbu~L_1$6pOo2LhMM{i&
zl2@MiDeIW13-pQ~m(sHk?^k2bs;TX?aZ|P&vgAYdQfv)|n9g}Ewgb|{HqObFe=RHu
zvWT4?{OE)kR*I$({%G7U-U0DYERW?n%<SFh1H2oJqh1@K#wGK8qHL6dq3jRN@9f5m
zw=~<PVDgpx{Djq>7#E()$|Jh;dl$c(3n%O2A(p?vXL_Qn-jUAInM$Fm?G|L8v=uu}
zwVGKd2?<c}SE}`;==B6Bkv9C>PQX&3^R7>g@$PQo*v_6vPBPyVgQsA8hPcaz*JdTz
zl5{UWjip+MyfGF~JdnaxAnbKq@y;GjkLzj|hk(<6c2Mjm0d;<e)~xM>kH{>nV~qtL
zqE`}dCF14}_+hhVk+hoDWztj|BQVGNxdb~^<D(_7sZOq>B2oABr9e$W9drGUL-91v
zz-kLur$d@fEYsXp*`Ftej^)JgVi?%~)LgOlo*aSl*(K_SnURe1#a_NCQ+qIXn{Be3
zY_pQgvRM;%)b^yHL914`YkGl}B;jOC+#RFsVPkXVtQc{5{j4XxK<j7hez|o={)FP9
z72vj}lt{6QBe$HZ`E<tY5Z3l=K)4z0PqLxp^+d#ioT&TkrQ(J8leZ6)^b^9g{li`~
z0L6(k{f9o!cjc~z{*-_7pj(rkV$ev6#?YmIw*VQlji(=yV%=eN(8hEPT7DmUKy~|>
zsb7E$t=3eQtzFZ^JrVB=HEDG5@u}O*!q-K+Y;k>L<n=7(>;q7)eK{Iu*d3}VqlUH2
zGSB_B-0&O{i?9*wR#MuZDVsoF+tQ-r97n;A=8ZspbOXnRi9mv2xg?p8ZnovGejW3@
zJ__}GY@;myh8VDa61l71Tru4MLw?y#rq9nOv#CpTnmcv}oXsAbW;=-<(h1jsC8{z6
ztI(3ovs^R$K4yojzcV{R4iNJLA~PQFLnPr3H<gbJJ>_WAL!scVkbf?_qx3GEZ`Z5j
zNHYrkX$c=wyClS8Alw)eSM@Lj8Hz~a!m-T3m*49K?liksDhib&2N^0?^`CDL=_gP#
zkxLhhll}`hxa#qo`LmQKHuP_CYh(3=pwCvql}*a+z#_g~SI~a>%+_c7ing$ejUab5
zXay%?>S!;r5xOxsgW=L$gPfnQTNFRN|FwP5hFX>nYKj%Xmqw|U$ozJ@(51PqbGW4r
zI9Ej|xPUelW-UPi6P`0k9U>&_Isq2z$s~kgo|Hm6YRfqgIbdR8!bE#2&~8jE+eg}C
zC+IyPJ94rz_?@z`9uLAp=%@LFDFKfgdvmvVP||$b{x9aW(h|qo!xIQ(dosA=g)4TP
zz0P!n7`cpuc0v7|l0M<Xu0q?U8;IK6L2;}1zMCt7dTgc5yE^KK(uyo?;q(O~=erh%
zcY~lrH*tNm^Z30O_un39fYEc>7|B`{Of-<E0K5Ij-Gs=u_2HBDfUp)W7N*Q4>354e
z(M$1FQZ9#3c+p}kI@UU#@-5hyI<C$~3m5I&UfDHs78*CU9hqU5`N7Sn_Q@=peC3=~
zW-qCuP;+(7Q>3Xww*gv1njK6oS5T0IE!Gz<G!QBvcSRJY)bhp4BU4}p_jP!#3h`+%
zrKLCi$x?mGpjLRk*tesSEl4w7Nn<1K2~{MvY~tUGIl|bou38|fur0__&e6bFHUzm^
zMwXjB&*!5%#C1}uN!#d5#3+=Q)5ywssKSU(Kgz>15QVVhjbWVBVKAZ7n1tqX335#S
zz6x9(TeOs^N>ji6MLu_qDx8>g;Pf<-JAiH>9PSMR<ezFw8Bkv2JA}ug^C}CR(-zSw
z;T2VyZx)|r4|<41LoL@MO{4KF_0uD1m~aCm@~wG_^m^Q8ZN&K|4pKJpuTjRKqONr<
z<aT%AH9ABfJ35DVn8rsuJk7_h9J)7upO$s*v==0QPw>L3>LFUTMKGrnx_n-j0o}$2
zGrD(%g6W0y`DWI38LPRDkoMsl(@u+jAT5<5UARMj#2sosCwxu$$xhoIZi@ikn`||<
z|4+y5IXX0qj2JT42b?xDU{vO(5nFMQs#`eXP=(->k2~%8*P&z90x`Xr_J)YHl=X=@
zrexpHn<uqtUJ5;5YAGn#_)q$tQm3%wO#j&R1v3~@$jh;$tY=&Z9eIbvTEn;t^OgU3
zKSc&9eWR*qF8tnZYV6=kRm?fZb4vQ^Y_8!b5@;p#7#k}A@XsC9D3ud_h5-+le6eb1
zgU`Ra=AFZvyiFjGNjro3Sw`XL*@BAZhF5%z)9|I>)ZS;Ok4~7GXRCF|-e#PQa3$F4
ztepqE3AZ9!<5tOTgKnMIa5NP`$0<vzlax~7^z@EX!P!d$5+(`JHXsx@u>e<$cLC8H
z^Z0b#j9}!it@JIEu<&&L#8?Csd}F*4A`@IYG2JjVSWir95@l;?lLU@S0xEf@*RDla
z2BtaAzXPr%Ecib5&=YwgM5BHt%7=yFZ)iidvV!F)L{GJuleaV#7{rAJ;wBbCqALa*
z)NxEF+T!QWUN+Um!=m*`i6Q6gxy-<=&2-1Sq!w71WX4?%FEv^a=7{^ZvIOXrRrO#3
zA%!EP18y^Z*M9LI_%{AENz0w-j8U;?As|;Z%Ve|qI7!wh#LbwOVo1chi`ykf@kXJG
zkAo_sRfcxNzEJ}3xQi_%WqRh;gZk}QEbYB`3B))7<Kd1IPL{DzF5SjxA9zQoi2*Xm
zIGV&{&gmvve#vg@@LRf$yX3fW@3wd}t?Y-{i|{QyR_AnE#X1J+;_<JO#o#G*CDG{y
zl4J<<KNZfbWAdgz4)ggqQ-pf#);^7x4fc9}VO_OY`Es*-_Pgc#-3y6FByprh%~1`d
zcu}G}zmCC&SWhv4LJ&R5(f+ZOyX;gbSK-YUGdfTSmDDY!O?Ry(q_B(a9ou=KiCTjT
zLYUQ<t~*<p*nG-BOF-0U02=jJZ5gDlU^zMp^a}C=-|pchT?}1SU-k4CRWx*nw;;*b
z>1Vgs50l<MLL0W|Av+ID6+w|4vcvlS6wSHTn=gW!CE2o)fmA6DTcRB^6w41(nohDt
zc}+(PwT;rj@F}ons}D0xrF=c9l4aBFhvFXs-*Cx_*I-=G<z!08+x#l%-Q?{gNh#BZ
z58?WW3DG4UbNZeq0bZAJmzN>_{#iC3HR99^5v+=X<}uAy*6Mtg4(s4+S22K^?vI96
z#^~PjbM2JRa2DcTJ0U3y&)y`gX}~_*O(1^NzkURy?PwxF)WpfVwWBg3DZy?0zKqdu
z@CNH<zhdU))baJY@&#@rT&T?LnTITJ^jH6`(BZ1v$-C_DI6krr2@Ld6bS|mzfhdDb
zj+pwZ@lMi9E+nsav7LCVhOfE>Q#osaY4W&iS2~UWjAx-{3wC;0Hb}Rr4};>XWtT?u
z=^e9j;HTb5>2Ew&fy^pL=Xw$kMDfD7)3V(1rb#-i(Y)p(G&cTLy2X~mMPXEe(Ap+e
zYA{2e+lJS@PJo#@EQP#4z|HHEW*Sk}mX}ozjoKVT3$;}Lz=Ie!TdKkY@VDJ>?xiD-
zl<>E#b-u^9zV3OOAW5XeV})S70gwgThm#g@?au8?d0awC$S1u${eKocuYzUfh3~$+
zzX)zxMei*P#b!?zw%ZBsSXF-F$fJx^aVa4s8zIa5;>!Vw)G^u95|SajVv;Ydu2?6d
zf2{8_ojEKZ&*aiZ`o3sM{?Xs-#(M?ED0VQ=+|>_`x`7rX^6|(X4Eh>9P$p-QiF%*U
ztu$rH`L$88<QUWFIk7)C87cq^74e4gKvdK4@3BC%$j#DfAK=F_NjwkH?<RM4#h0$@
z!=xQ<Mz}2NXaJ#hKGbUHgn}XUL4lsxrO8Ofh-fLNDna`UNJ4*Gf{PhW7$-`W?7B$p
zOeP>GpsXyhO+REBhD@h=DOkce5a`2WLNYHRp@4MwZ-jE%YjHfu4L%(zkT&={ON9W8
z#-mxEsS&dK0e^z<B1Iy=Zn(iYepxBA*!y4}Fi^4I=oh1Ep9ag(0UKNrDUH0{r2rK~
z`K)b$edS+FRROya3DzuC75szKysNkGACN*&;Y{Tm_aDY?v?-sOJTmJSCKA{??jl0s
zen+w@FFAdCIA=C~u{hr6_-ugBkJ$iIRnSe#<tta)s^&N1E&ziLBcNygNWyjUFN7vv
z!<_f`hFoSh&l@*;F~b^yrO%XqJPplwRr%MSo3JHG(^X9`swF8;MAJ?-x2qjfdUm(_
z(etmGI8(KbDk38@XJgokIdp{5HhUOEZ$B|7Ijf@Oc@|3vb2t9^Yxb0+MuNE5(`hSQ
z;7DO+xalti@+!wLH>>y_+cT6ZysnsL_(2ejxeYsq2#_=44BP616PcXhU!f=h6u+qN
zOhQI1Rgib)N-6f@iC5aTV@x0{mlZR$`mK(e>L2L%?&F3|5r)rU?4&OKDJybLv2Km>
zZH`s{kfW~gDgU)bVY0dr4HNxxF7HrVCe@!s!8$mJKd&Py2eow^R|dqcXO}rs*xRtb
z4>a8vCRp0wU%5578&;yQ(;=@wRM>}b(do^#)24ijZCNn<<oi2!IfgQ!aXH$>C$D!S
zyhh1^=mtvIv-nFcyM!Qv)=$eOdDB+va(P$LZB9~klm#bIqwzK8%t6q0FrA)37(S#Q
zrk0-ls%gzZxT{Z6h7`glE?Ho3jZ7x|JhC!R2l=g`1($RY4PU*z6Y-QnW|krh3luI#
z-(DM#i-cagy}`sKn_c(--6l6}>~1aJY*-XiVuz2sB<}2=XpQi}<H5U|>U(ypH*%8q
zi*Xs-89FKyOt>5h_lO=Se$VOUv^;I%-`DqWGXz)F2PYBCI@{=tVPNH;!)UQ>B5zYG
z`n4GH+5szE&?-tGN9oviJ|Snj_>e!>%9IzY(23IGG`-n4x+e;UJgXzzAW7jj@8zay
zExn1`@Qsi?TL_(c;KV3H3guUsA_`ez*B0q^%E9?sValyNpg8Wyw)x+kGD?Jhj-wyQ
zeE5@pJd}F&RM4lPo$2Jmr8y6Zh0TwMMY>L!xu=S*<KltlMV8ZT*0~wn?ROk#vp&44
zHHE@<()zkksJ`Zph>TTweH&Ac2>tQdlw=~e;tEc#7N6L}HVf^n`|hpm47!}9IRE9B
z1cf-nqBYG~ldNwEQ9IDs&sbTy99%&Px9GhmzgqB12PKuS`zJ?^W$76I{+gHn<@#&N
zduD7;q+h?*!)s3nfMU4P{ZLhN98sjx8SH~~LaSjOR|YW@nNyd*foz<Mg)XUi2O>X<
zU<AbQ=YfU^5619|Xtn_Rg=T>&z+Au^m3ZY^4;}zp_9k`Z3Ry3S)6PJ(3;waA)qUh%
e;r|QY5hTy*X-9<fl>PTK0dzDB)$5-@qW=ezF(R1&

literal 3974
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


From f68df356659382370a7f6c2f8922aeb682d66e1c Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Tue, 18 Feb 2020 22:58:15 +0800
Subject: [PATCH 2/4] update md

---
 mirai-api-http/README_CH.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/mirai-api-http/README_CH.md b/mirai-api-http/README_CH.md
index d056170e4..895d1b2e3 100644
--- a/mirai-api-http/README_CH.md
+++ b/mirai-api-http/README_CH.md
@@ -12,7 +12,7 @@ fun main() {
 
     MiraiHttpAPIServer.start()
     
-    bot.network.awaitDisconnection()
+    bot.join()
 }
 ```
 
@@ -463,7 +463,7 @@ Content-Type:multipart/form-data
 {
     "type": "Image",
     "imageId": "{01E9451B-70ED-EAE3-B37C-101F1EEBF5B5}.png" //群图片格式
-    "imageId": "/f8f1ab55-bf8e-4236-b55e-955848d7069f"      //好友图片格式
+    //"imageId": "/f8f1ab55-bf8e-4236-b55e-955848d7069f"      //好友图片格式
 }
 ```
 

From 83611ac09f001de829620b764d170aa9b7168856 Mon Sep 17 00:00:00 2001
From: ryoii <ryoii@foxmail.com>
Date: Wed, 19 Feb 2020 02:07:18 +0800
Subject: [PATCH 3/4] f**k javafx

---
 .../mirai/console/graphical/MiraiGraphical.kt |  8 +-
 .../mirai/console/graphical/model/BotModel.kt |  6 ++
 .../mirai/console/graphical/view/Decorator.kt |  9 ++
 .../console/graphical/view/LoginFragment.kt   | 38 +++++----
 .../console/graphical/view/PrimaryView.kt     | 84 +++++++------------
 5 files changed, 77 insertions(+), 68 deletions(-)
 create mode 100644 mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/Decorator.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 7e5633dee..b543a06ee 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,9 +1,15 @@
 package net.mamoe.mirai.console.graphical
 
+import com.jfoenix.controls.JFXDecorator
+import javafx.scene.control.Button
+import javafx.stage.Stage
 import net.mamoe.mirai.console.MiraiConsole
 import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController
+import net.mamoe.mirai.console.graphical.view.Decorator
 import net.mamoe.mirai.console.graphical.view.PrimaryView
 import tornadofx.App
+import tornadofx.FX.Companion.primaryStage
+import tornadofx.UIComponent
 import tornadofx.find
 import tornadofx.launch
 
@@ -11,7 +17,7 @@ fun main(args: Array<String>) {
     launch<MiraiGraphicalUI>(args)
 }
 
-class MiraiGraphicalUI: App(PrimaryView::class) {
+class MiraiGraphicalUI: App(Decorator::class) {
 
     override fun init() {
         super.init()
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
index 8d15d6998..542f8b146 100644
--- 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
@@ -11,3 +11,9 @@ class BotModel(val uin: Long) {
     val logHistory = observableListOf<String>()
     val admins = observableListOf<Long>()
 }
+
+class BotViewModel(botModel: BotModel? = null) : ItemViewModel<BotModel>(botModel) {
+    val bot = bind(BotModel::botProperty)
+    val logHistory = bind(BotModel::logHistory)
+    val admins = bind(BotModel::admins)
+}
\ No newline at end of file
diff --git a/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/Decorator.kt b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/Decorator.kt
new file mode 100644
index 000000000..9ecff5fda
--- /dev/null
+++ b/mirai-console-graphical/src/main/kotlin/net/mamoe/mirai/console/graphical/view/Decorator.kt
@@ -0,0 +1,9 @@
+package net.mamoe.mirai.console.graphical.view
+
+import com.jfoenix.controls.JFXDecorator
+import tornadofx.View
+
+class Decorator: View() {
+
+    override val root = JFXDecorator(primaryStage, find<PrimaryView>().root)
+}
\ 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
index 437031ca4..387fcc7da 100644
--- 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
@@ -1,6 +1,9 @@
 package net.mamoe.mirai.console.graphical.view
 
+import com.jfoenix.controls.JFXAlert
+import com.jfoenix.controls.JFXPopup
 import javafx.beans.property.SimpleStringProperty
+import javafx.scene.control.Label
 import kotlinx.coroutines.runBlocking
 import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController
 import net.mamoe.mirai.console.graphical.util.jfxButton
@@ -8,26 +11,31 @@ import net.mamoe.mirai.console.graphical.util.jfxPasswordfield
 import net.mamoe.mirai.console.graphical.util.jfxTextfield
 import tornadofx.*
 
-class LoginFragment : Fragment() {
+class LoginView : View() {
 
-    private val controller = find<MiraiGraphicalUIController>(FX.defaultScope)
-    private val qq = SimpleStringProperty("0")
+    private val controller = find<MiraiGraphicalUIController>()
+    private val qq = SimpleStringProperty("")
     private val psd = SimpleStringProperty("")
 
-    override val root = form {
-        fieldset("登录") {
-            field("QQ") {
-                jfxTextfield(qq)
+    override val root = pane {
+        form {
+            fieldset("登录") {
+                field("QQ") {
+                    jfxTextfield(qq)
+                }
+                field("密码") {
+                    jfxPasswordfield(psd)
+                }
             }
-            field("密码") {
-                jfxPasswordfield(psd)
+            jfxButton("登录").action {
+                runAsync {
+                    runBlocking {
+                        controller.login(qq.value, psd.value)
+                    }
+                }.ui {
+                    // show dialog
+                }
             }
         }
-        jfxButton("登录").action {
-            runBlocking {
-                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 58036ac6e..1a81c3721 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,20 +1,15 @@
 package net.mamoe.mirai.console.graphical.view
 
-import com.jfoenix.controls.JFXListCell
-import javafx.geometry.Insets
-import javafx.geometry.Pos
+import com.jfoenix.controls.*
+import javafx.collections.ObservableList
 import javafx.scene.control.Tab
 import javafx.scene.control.TabPane
 import javafx.scene.image.Image
-import javafx.scene.paint.Color
-import javafx.scene.text.FontWeight
 import net.mamoe.mirai.console.graphical.controller.MiraiGraphicalUIController
 import net.mamoe.mirai.console.graphical.model.BotModel
-import net.mamoe.mirai.console.graphical.util.jfxButton
 import net.mamoe.mirai.console.graphical.util.jfxListView
 import net.mamoe.mirai.console.graphical.util.jfxTabPane
 import tornadofx.*
-import java.io.FileInputStream
 
 class PrimaryView : View() {
 
@@ -35,20 +30,12 @@ class PrimaryView : View() {
 
                 setCellFactory {
                     object : JFXListCell<BotModel>() {
-                        var tab: Tab? = null
-
                         init {
                             onDoubleClick {
-                                if (tab == null) {
-                                    (center as TabPane).tab(item.uin.toString()) {
-                                        listview(item.logHistory)
-                                        onDoubleClick { close() }
-                                        tab = this
-                                    }
-                                } else {
-                                    (center as TabPane).tabs.add(tab)
-                                }
-                                tab?.select()
+                                (center as TabPane).logTab(
+                                    text = item.uin.toString(),
+                                    logs = item.logHistory
+                                ).select()
                             }
                         }
 
@@ -65,44 +52,37 @@ class PrimaryView : View() {
                     }
                 }
             }
-
-            hbox {
-                padding = Insets(10.0)
-                spacing = 10.0
-                alignment = Pos.CENTER
-
-                jfxButton("L").action {
-                    find<LoginFragment>().openModal()
-                }
-                jfxButton("P")
-                jfxButton("S")
-
-
-                style { backgroundColor += c("00BCD4") }
-                children.style(true) {
-                    backgroundColor += c("00BCD4")
-                    fontSize = 15.px
-                    fontWeight = FontWeight.BOLD
-                    textFill = Color.WHITE
-                    borderRadius += box(25.px)
-                    backgroundRadius += box(25.px)
-                }
-            }
         }
 
         center = jfxTabPane {
-            tab("Main") {
-                listview(controller.mainLog) {
 
-                    fitToParentSize()
-                    cellFormat {
-                        graphic = label(it) {
-                            maxWidthProperty().bind(this@listview.widthProperty())
-                            isWrapText = true
-                        }
-                    }
-                }
+            tab("Login") {
+                this += find<LoginView>().root
             }
+
+            tab("Plugin")
+
+            tab("Settings")
+
+            logTab("Main", controller.mainLog)
         }
     }
 }
+
+private fun TabPane.logTab(
+    text: String? = null,
+    logs: ObservableList<String>,
+    op: Tab.() -> Unit = {}
+)= tab(text) {
+    listview(logs) {
+
+        fitToParentSize()
+        cellFormat {
+            graphic = label(it) {
+                maxWidthProperty().bind(this@listview.widthProperty())
+                isWrapText = true
+            }
+        }
+    }
+    also(op)
+}
\ No newline at end of file

From ef679aba6391791bfb1ae365a6fed4ee7fec1be4 Mon Sep 17 00:00:00 2001
From: Him188 <Him188@mamoe.net>
Date: Wed, 19 Feb 2020 09:08:33 +0800
Subject: [PATCH 4/4] Update README.md

---
 README.md | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/README.md b/README.md
index f9151ddc1..4e77e9bca 100644
--- a/README.md
+++ b/README.md
@@ -126,7 +126,7 @@ JVM 上启动需 80M 内存, 每多一个机器人实例需要 30M 内存.
 您的 star 是对我们最大的鼓励(点击项目右上角)
 
 ## Wiki
-在 [Wiki](https://github.com/mamoe/mirai/wiki/Home) 中查看各类帮助,**如 API 示例**(可能过时,待 QQ Android 协议完成后会重写)。
+在 [Wiki](https://github.com/mamoe/mirai/wiki/Home) 中查看各类帮助,**如 API 示例**。
 
 ## Try
 
@@ -187,4 +187,4 @@ bot.subscribeAlways<MemberPermissionChangedEvent> {
 ## Acknowledgement
 特别感谢 [JetBrains](https://www.jetbrains.com/?from=mirai) 为开源项目提供免费的 [IntelliJ IDEA](https://www.jetbrains.com/idea/?from=mirai) 等 IDE 的授权  
 [<img src=".github/jetbrains-variant-3.png" width="200"/>](https://www.jetbrains.com/?from=mirai)
- 
\ No newline at end of file
+