Skip to content

Commit 2ec416a

Browse files
committed
✨ (apply): 增加样式应用功能
1 parent 7d0aae1 commit 2ec416a

File tree

4 files changed

+75
-13
lines changed

4 files changed

+75
-13
lines changed

src/main/kotlin/irony/pycharm/qsseditor/QSSAction.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,5 +41,6 @@ class QSSAction : AnAction() {
4141
if (text.isEmpty()) {
4242
return
4343
}
44+
QSSClient.applyStyle(listOf(text))
4445
}
4546
}

src/main/kotlin/irony/pycharm/qsseditor/QSSClient.kt

Lines changed: 55 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@
1111
@file:Suppress("ktlint:standard:no-wildcard-imports")
1212

1313
package irony.pycharm.qsseditor
14+
1415
import com.intellij.openapi.diagnostic.logger
16+
import com.intellij.util.ui.update.MergingUpdateQueue
17+
import com.intellij.util.ui.update.Update
1518
import kotlinx.serialization.json.*
1619
import okhttp3.*
20+
import org.jetbrains.annotations.Nullable
1721
import java.util.concurrent.TimeUnit
1822

1923
private val Log = logger<QSSClient>()
@@ -24,7 +28,7 @@ interface MessageListener {
2428

2529
class KeywordsListener : MessageListener {
2630
override fun onParams(array: JsonArray) {
27-
Log.info("onParams: $array")
31+
// TODO: 添加关键词
2832
}
2933
}
3034

@@ -37,14 +41,15 @@ class QSSClient : WebSocketListener() {
3741
webSocket: WebSocket,
3842
response: Response,
3943
) {
44+
twice = 0
4045
Log.debug("onOpen")
4146
}
4247

4348
override fun onMessage(
4449
webSocket: WebSocket,
4550
text: String,
4651
) {
47-
Log.debug("onMessage: $text")
52+
// Log.debug("onMessage: $text")
4853
if (text.isNotEmpty()) {
4954
val json = Json.parseToJsonElement(text).jsonObject
5055
if (json.getValue(
@@ -79,7 +84,9 @@ class QSSClient : WebSocketListener() {
7984
t: Throwable,
8085
response: Response?,
8186
) {
82-
Log.warn("onFailure, ${t.message}")
87+
if (twice < 50) {
88+
Log.warn("onFailure, ${t.message}")
89+
}
8390
if (done) {
8491
Log.info("client require shutdown")
8592
return
@@ -91,10 +98,13 @@ class QSSClient : WebSocketListener() {
9198
companion object {
9299
private var host: String = ""
93100
private var port: Int = 0
101+
private var twice: Int = 0
94102
private var done: Boolean = false
95103
private var self: QSSClient? = null
96104
private var client: OkHttpClient? = null
97105
private var socket: WebSocket? = null
106+
private var queue: MergingUpdateQueue? = null
107+
private var messages: MutableMap<String, List<String>> = mutableMapOf()
98108
private var listener: HashMap<String, MessageListener> = HashMap()
99109

100110
fun connect(
@@ -114,6 +124,8 @@ class QSSClient : WebSocketListener() {
114124

115125
if (self == null) {
116126
self = QSSClient()
127+
queue = MergingUpdateQueue("QSSClient", 2000, true, MergingUpdateQueue.ANY_COMPONENT, null)
128+
queue!!.setRestartTimerOnAdd(true)
117129
}
118130
if (client == null) {
119131
client = OkHttpClient.Builder().pingInterval(5, TimeUnit.SECONDS).connectTimeout(30, TimeUnit.SECONDS).build()
@@ -129,7 +141,10 @@ class QSSClient : WebSocketListener() {
129141
host: String,
130142
port: Int,
131143
) {
132-
Log.debug("do reconnect")
144+
if (twice < 50) {
145+
twice = twice.inc()
146+
Log.debug("do reconnect")
147+
}
133148
socket = client!!.newWebSocket(Request.Builder().url("ws://$host:$port").build(), self!!)
134149
}
135150

@@ -161,12 +176,44 @@ class QSSClient : WebSocketListener() {
161176
}.toString()
162177
}
163178

164-
fun applyStyle(message: List<String>) {
165-
socket!!.send(buildMessage("setStyleSheet", message))
179+
private fun sendMessage(
180+
method: String,
181+
@Nullable message: List<String>,
182+
delay: Boolean = false,
183+
) {
184+
if (message.isEmpty()) {
185+
return
186+
}
187+
if (delay) {
188+
messages.clear()
189+
messages[method] = message
190+
queue?.queue(
191+
object : Update(method) {
192+
override fun run() {
193+
for (item in messages) {
194+
sendMessage(item.key, item.value, false)
195+
}
196+
}
197+
},
198+
)
199+
} else {
200+
// Log.info("sendMessage: method=$method, message=" + message.joinToString("\n"))
201+
socket!!.send(buildMessage(method, message))
202+
}
203+
}
204+
205+
fun applyStyle(
206+
@Nullable message: List<String>,
207+
delay: Boolean = false,
208+
) {
209+
sendMessage("setStyleSheet", message, delay)
166210
}
167211

168-
fun selectWidget(message: List<String>) {
169-
socket!!.send(buildMessage("selectWidget", message))
212+
fun selectWidget(
213+
@Nullable message: List<String>,
214+
delay: Boolean = false,
215+
) {
216+
sendMessage("selectWidget", message, delay)
170217
}
171218
}
172219
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package irony.pycharm.qsseditor
2+
3+
import com.intellij.openapi.editor.event.DocumentEvent
4+
import com.intellij.openapi.editor.event.DocumentListener
5+
6+
class QSSDocumentListener : DocumentListener {
7+
override fun documentChanged(event: DocumentEvent) {
8+
if (QSSState.instance::auto.get()) {
9+
QSSClient.applyStyle(listOf(event.document.text), true)
10+
}
11+
}
12+
}

src/main/resources/META-INF/plugin.xml

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,11 +50,13 @@ Must Install Proxy Server from first(首先需要安装设计师插件)<br/><br/
5050
<applicationService
5151
serviceImplementation="irony.pycharm.qsseditor.QSSState"/>
5252
<applicationConfigurable
53-
parentId="language"
54-
groupWeight="-500"
55-
instance="irony.pycharm.qsseditor.QSSConfig"
56-
id="irony.pycharm.qsseditor.QSSConfig"
57-
displayName="QSS Editor"/>
53+
parentId="language"
54+
groupWeight="-500"
55+
instance="irony.pycharm.qsseditor.QSSConfig"
56+
id="irony.pycharm.qsseditor.QSSConfig"
57+
displayName="QSS Editor"/>
58+
<editorFactoryDocumentListener
59+
implementation="irony.pycharm.qsseditor.QSSDocumentListener"/>
5860
</extensions>
5961

6062
<applicationListeners>

0 commit comments

Comments
 (0)