Skip to content

Commit a09bb0c

Browse files
authored
Merge pull request #37 from way-zer/3.0
扩展更多 UIExt的属性
2 parents e264ac8 + b5dab74 commit a09bb0c

File tree

4 files changed

+67
-18
lines changed

4 files changed

+67
-18
lines changed

src/main/kotlin/cf/wayzer/contentsTweaker/CTNode.kt

+5-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@ class CTNode private constructor() : ExtendableClass<CTExtInfo>() {
2323
fun collectAll(): CTNode {
2424
if (collected) return this
2525
collected = true
26-
resolvers.forEach { it.collectChild(this) }
26+
for (resolver in resolvers) {
27+
kotlin.runCatching { resolver.collectChild(this) }.onFailure { e ->
28+
throw Exception("Fail to collectChild in $resolver", e)
29+
}
30+
}
2731
get<Modifiable<Any?>>()?.let { modifiable ->
2832
getOrCreate("=").apply {
2933
+Modifier { json ->

src/main/kotlin/cf/wayzer/contentsTweaker/resolvers/ReflectResolver.kt

+13-13
Original file line numberDiff line numberDiff line change
@@ -16,21 +16,21 @@ object ReflectResolver : ContentsTweaker.NodeCollector {
1616

1717
fun extend(node: CTNode, objInfo: CTNode.ObjInfo<*>, filter: (Field) -> Boolean = { Modifier.isPublic(it.modifiers) }) {
1818
val obj = objInfo.obj ?: return
19-
runCatching { JsonIO.json.getFields(objInfo.type) }.getOrNull()
20-
?.filter { filter(it.value.field) }
21-
?.forEach { entry ->
22-
val meta = entry.value
23-
node.getOrCreate(entry.key).apply {
24-
var cls = meta.field.type
25-
if (cls.isAnonymousClass) cls = cls.superclass
26-
+CTNode.ObjInfo<Any?>(meta.field.get(obj), cls, meta.elementType, meta.keyType)
27-
+object : CTNode.Modifiable<Any?>(this) {
28-
override val currentValue: Any? get() = meta.field.get(obj)
29-
override fun setValue0(value: Any?) {
30-
meta.field.set(obj, value)
31-
}
19+
val fields = runCatching { JsonIO.json.getFields(objInfo.type) }.getOrNull() ?: return
20+
for (entry in fields) {
21+
if (!filter(entry.value.field)) continue
22+
val meta = entry.value
23+
node.getOrCreate(entry.key).apply {
24+
var cls = meta.field.type
25+
if (cls.isAnonymousClass) cls = cls.superclass
26+
+CTNode.ObjInfo<Any?>(meta.field.get(obj), cls, meta.elementType, meta.keyType)
27+
+object : CTNode.Modifiable<Any?>(this) {
28+
override val currentValue: Any? get() = meta.field.get(obj)
29+
override fun setValue0(value: Any?) {
30+
meta.field.set(obj, value)
3231
}
3332
}
3433
}
34+
}
3535
}
3636
}

src/main/kotlin/cf/wayzer/contentsTweaker/resolvers/UIExtResolver.kt

+48-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,14 @@
11
package cf.wayzer.contentsTweaker.resolvers
22

33
import arc.Core
4+
import arc.func.Cons
5+
import arc.input.KeyCode
6+
import arc.math.geom.Vec2
47
import arc.scene.Element
58
import arc.scene.Group
9+
import arc.scene.event.ClickListener
10+
import arc.scene.event.InputEvent
11+
import arc.scene.event.InputListener
612
import arc.scene.style.Drawable
713
import arc.scene.ui.Button
814
import arc.scene.ui.Label
@@ -12,6 +18,7 @@ import arc.scene.ui.TextButton
1218
import arc.scene.ui.layout.Cell
1319
import arc.scene.ui.layout.Table
1420
import arc.util.Align
21+
import arc.util.Tmp
1522
import cf.wayzer.contentsTweaker.*
1623
import mindustry.Vars
1724
import mindustry.gen.Call
@@ -110,6 +117,7 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
110117

111118
private fun CTNodeTypeChecked<Table>.extendTable() {
112119
val obj = objInfo.obj
120+
node.getOrCreate("cellDefaults") += CTNode.ObjInfo(obj.defaults())
113121
node.getOrCreate("row") += CTNode.Modifier { obj.row() }
114122
node.getOrCreate("align") += CTNode.Modifier {
115123
val v = if (it.isNumber) it.asInt() else alignMap[it.asString()] ?: error("invalid align: $it")
@@ -122,11 +130,33 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
122130
}
123131
}
124132

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+
125149
private fun CTNodeTypeChecked<Element>.extendModifiers() {
126150
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) })
130160
}
131161

132162
node.getOrCreate("style") += CTNode.Modifier {
@@ -148,6 +178,20 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
148178
is TextButton -> obj.setText(v)
149179
}
150180
}
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+
}
151195
}
152196

153197
//Reference arc.scene.ui.layout.Cell.clear
@@ -175,6 +219,7 @@ object UIExtResolver : ContentsTweaker.NodeCollector {
175219
fun createUIElement(type: String): Element = when (type) {
176220
"Table" -> Table()
177221
"Label" -> Label("")
222+
"TextButton" -> TextButton("")
178223
else -> error("TODO: not support Element: $type")
179224
}
180225
}

src/main/kotlin/cf/wayzer/contentsTweaker/util/ExtendableClass.kt

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ abstract class ExtendableClass<Ext : Any> {
1111
inline fun <reified T : Ext> get(): T? {
1212
if (this is T) return this
1313
return mixins.filterIsInstance<T>().let {
14-
require(it.size <= 1) { "More than one ${T::class.java} mixin" }
14+
require(it.size <= 1) { "More than one ${T::class.java} mixin: $it" }
1515
it.firstOrNull()
1616
}
1717
}

0 commit comments

Comments
 (0)