1
1
package cf.wayzer.contentsTweaker.resolvers
2
2
3
3
import arc.Core
4
+ import arc.func.Cons
5
+ import arc.input.KeyCode
6
+ import arc.math.geom.Vec2
4
7
import arc.scene.Element
5
8
import arc.scene.Group
9
+ import arc.scene.event.ClickListener
10
+ import arc.scene.event.InputEvent
11
+ import arc.scene.event.InputListener
6
12
import arc.scene.style.Drawable
7
13
import arc.scene.ui.Button
8
14
import arc.scene.ui.Label
@@ -12,6 +18,7 @@ import arc.scene.ui.TextButton
12
18
import arc.scene.ui.layout.Cell
13
19
import arc.scene.ui.layout.Table
14
20
import arc.util.Align
21
+ import arc.util.Tmp
15
22
import cf.wayzer.contentsTweaker.*
16
23
import mindustry.Vars
17
24
import mindustry.gen.Call
@@ -110,6 +117,7 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
110
117
111
118
private fun CTNodeTypeChecked<Table>.extendTable () {
112
119
val obj = objInfo.obj
120
+ node.getOrCreate(" cellDefaults" ) + = CTNode .ObjInfo (obj.defaults())
113
121
node.getOrCreate(" row" ) + = CTNode .Modifier { obj.row() }
114
122
node.getOrCreate(" align" ) + = CTNode .Modifier {
115
123
val v = if (it.isNumber) it.asInt() else alignMap[it.asString()] ? : error(" invalid align: $it " )
@@ -122,11 +130,33 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
122
130
}
123
131
}
124
132
133
+ class DragHandler (private val element : Element ) : InputListener() {
134
+ private val last = Vec2 ()
135
+ override fun touchDown (event : InputEvent , x : Float , y : Float , pointer : Int , button : KeyCode ? ): Boolean {
136
+ event.stop()
137
+ last.set(x, y)
138
+ return true
139
+ }
140
+
141
+ override fun touchDragged (event : InputEvent , x : Float , y : Float , pointer : Int ) {
142
+ event.stop()
143
+ val v = element.localToStageCoordinates(Tmp .v1.set(x, y))
144
+ element.setPosition(v.x - last.x, v.y - last.y)
145
+ element.keepInStage()
146
+ }
147
+ }
148
+
125
149
private fun CTNodeTypeChecked<Element>.extendModifiers () {
126
150
val obj = objInfo.obj
127
- node.getOrCreate(" onClick" ) + = CTNode .Modifier {
128
- val message = it.asString()
129
- obj.tapped { Call .sendChatMessage(message) }
151
+ node.getOrCreate(" draggable" ) + = CTNode .Modifier { json ->
152
+ obj.listeners.removeAll { it is DragHandler }
153
+ if (json.asBoolean())
154
+ obj.addListener(DragHandler (obj))
155
+ }
156
+ node.getOrCreate(" onClick" ) + = CTNode .Modifier { json ->
157
+ val message = json.asString()
158
+ obj.listeners.removeAll { it is ClickListener }
159
+ obj.clicked(Cons {}, Cons { Call .sendChatMessage(message) })
130
160
}
131
161
132
162
node.getOrCreate(" style" ) + = CTNode .Modifier {
@@ -148,6 +178,20 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
148
178
is TextButton -> obj.setText(v)
149
179
}
150
180
}
181
+
182
+ if (obj is Label ) {
183
+ node.getOrCreate(" fontScale" ) + = CTNode .Modifier { json ->
184
+ val v = if (json.isNumber) json.asFloat().let { v -> FloatArray (2 ) { v } }
185
+ else json.asFloatArray()?.takeIf { it.size == 2 } ? : error(" invalid fontScale: $json " )
186
+ obj.setFontScale(v[0 ], v[1 ])
187
+ }
188
+ node.getOrCreate(" fontScaleX" ) + = CTNode .Modifier {
189
+ obj.fontScaleX = it.asFloat()
190
+ }
191
+ node.getOrCreate(" fontScaleY" ) + = CTNode .Modifier {
192
+ obj.fontScaleY = it.asFloat()
193
+ }
194
+ }
151
195
}
152
196
153
197
// Reference arc.scene.ui.layout.Cell.clear
@@ -175,6 +219,7 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
175
219
fun createUIElement (type : String ): Element = when (type) {
176
220
" Table" -> Table ()
177
221
" Label" -> Label (" " )
222
+ " TextButton" -> TextButton (" " )
178
223
else -> error(" TODO: not support Element: $type " )
179
224
}
180
225
}
0 commit comments