Skip to content

Commit 9d4608a

Browse files
committed
Update
1 parent 15e3867 commit 9d4608a

3 files changed

Lines changed: 80 additions & 10 deletions

File tree

app/src/main/java/com/omarea/krscript/config/PageConfigReader.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -354,6 +354,9 @@ class PageConfigReader {
354354
"depend-mode" -> {
355355
actionParamInfo.dependMode = attrValue
356356
}
357+
"depend-logic", "depend-priority" -> {
358+
actionParamInfo.dependLogic = attrValue
359+
}
357360
}
358361
}
359362
if (actionParamInfo.supported && actionParamInfo.name != null && actionParamInfo.name!!.isNotEmpty()) {

app/src/main/java/com/omarea/krscript/model/ActionParamInfo.kt

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,4 +58,19 @@ class ActionParamInfo {
5858
// Cũng có thể khai báo riêng cho từng param cha, nối bằng "|", theo đúng thứ tự dependOn,
5959
// ví dụ: "show|hide".
6060
var dependMode: String = "show"
61+
62+
// Cách kết hợp nhiều điều kiện phụ thuộc (khi dependOn khai báo nhiều param cha):
63+
// - "and" (mặc định): TẤT CẢ điều kiện phải cùng thỏa (giữ tương thích hành vi cũ).
64+
// - "priority" (hoặc "or"): xét theo THỨ TỰ ưu tiên từ TRÁI SANG PHẢI theo đúng thứ tự
65+
// khai báo trong dependOn. Điều kiện nào (đã tính cả dependMode của chính nó) thỏa
66+
// trước sẽ quyết định luôn kết quả là "show" (không cần xét tiếp các điều kiện còn lại).
67+
// Nếu không có điều kiện nào thỏa thì "hide".
68+
// Ví dụ: depend-on="mode|level" depend-value="b|7" depend-mode="show|show"
69+
// depend-logic="priority"
70+
// -> Nếu "mode" khớp "b" thì show luôn (bất kể level).
71+
// -> Nếu "mode" không khớp nhưng "level" khớp "7" thì vẫn show.
72+
// -> Nếu cả hai đều không khớp thì hide.
73+
// - "priority-rtl" (hoặc "or-rtl"): giống "priority" nhưng xét theo thứ tự ưu tiên từ
74+
// PHẢI SANG TRÁI (điều kiện cuối cùng trong dependOn được xét trước).
75+
var dependLogic: String = "and"
6176
}

app/src/main/java/com/omarea/krscript/ui/ActionParamsLayoutRender.kt

Lines changed: 62 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,24 @@ class ActionParamsLayoutRender(private var linearLayout: LinearLayout, activity:
263263
//
264264
// Hỗ trợ NHIỀU điều kiện phụ thuộc cùng lúc (nhiều param cha), nối bằng dấu "|" ở cả 3
265265
// thuộc tính depend-on / depend-value / depend-mode - các phần tử cùng vị trí (index) tương
266-
// ứng với nhau. Tất cả điều kiện phải cùng thỏa mãn (AND) thì param mới được hiện/ẩn.
267-
// Ví dụ: depend-on="mode|cam" depend-value="a|b" depend-mode="show|hide"
268-
// -> hiện khi mode = a VÀ cam khác b
266+
// ứng với nhau.
267+
//
268+
// Cách kết hợp các điều kiện được quyết định bởi depend-logic:
269+
// - "and" (mặc định, giữ tương thích hành vi cũ): TẤT CẢ điều kiện phải cùng thỏa (AND) thì
270+
// param mới được hiện.
271+
// Ví dụ: depend-on="mode|cam" depend-value="a|b" depend-mode="show|hide"
272+
// -> hiện khi mode = a VÀ cam khác b
273+
// - "priority" / "or": hỗ trợ MỨC ƯU TIÊN, xét theo thứ tự khai báo trong depend-on, TỪ
274+
// TRÁI SANG PHẢI. Điều kiện nào thỏa trước (đã tính cả depend-mode riêng của điều kiện
275+
// đó) sẽ quyết định luôn là "show", không cần xét tiếp các điều kiện còn lại. Nếu không
276+
// có điều kiện nào thỏa thì "hide".
277+
// Ví dụ: depend-on="mode|level" depend-value="b|7" depend-mode="show|show"
278+
// depend-logic="priority"
279+
// -> Nếu "mode" khớp "b" thì show luôn.
280+
// -> Nếu "mode" không khớp mà "level" khớp "7" thì vẫn show.
281+
// -> Nếu cả hai đều không khớp thì hide.
282+
// - "priority-rtl" / "or-rtl": giống "priority" nhưng xét thứ tự ưu tiên TỪ PHẢI SANG TRÁI
283+
// (điều kiện cuối cùng khai báo trong depend-on được xét trước tiên).
269284
//
270285
// Mỗi vị trí trong depend-value vẫn có thể chứa nhiều giá trị được chấp nhận, nối bằng dấu
271286
// ",", so khớp kiểu OR (giữ tương thích với cú pháp cũ), ví dụ "b,c" nghĩa là khớp khi giá
@@ -288,12 +303,14 @@ class ActionParamsLayoutRender(private var linearLayout: LinearLayout, activity:
288303
val dependValueList = (info.dependValue ?: "").split("|")
289304
val dependModeList = info.dependMode.split("|")
290305

291-
var shouldShow = true // AND toàn bộ điều kiện
292-
for (i in dependOnList.indices) {
306+
// Đánh giá điều kiện thứ i (theo đúng thứ tự khai báo trong dependOnList),
307+
// trả về null nếu không rõ param cha (bỏ qua điều kiện này), ngược lại trả về
308+
// true/false là kết quả "muốn show" của riêng điều kiện đó.
309+
fun evalCondition(i: Int): Boolean? {
293310
val parentName = dependOnList[i]
294311
val controllerInfo = currentParamInfos.find { it.name == parentName }
295312
val reader = valueReaders[parentName]
296-
if (controllerInfo == null || reader == null) continue // Không rõ param cha -> bỏ qua điều kiện này
313+
if (controllerInfo == null || reader == null) return null // Không rõ param cha -> bỏ qua
297314

298315
val currentValues = reader().split(controllerInfo.separator)
299316
.map { it.trim() }.filter { it.isNotEmpty() }
@@ -311,11 +328,46 @@ class ActionParamsLayoutRender(private var linearLayout: LinearLayout, activity:
311328
val matched = wanted.isEmpty() || wanted.any { currentIdentifiers.contains(it) }
312329

313330
val mode = (dependModeList.getOrNull(i) ?: dependModeList.lastOrNull() ?: "show").trim()
314-
val conditionShow = if (mode == "hide") !matched else matched
331+
return if (mode == "hide") !matched else matched
332+
}
315333

316-
if (!conditionShow) {
317-
shouldShow = false
318-
break // AND: chỉ cần 1 điều kiện không thỏa là đủ để ẩn
334+
val logic = info.dependLogic.trim().lowercase()
335+
val shouldShow: Boolean = when (logic) {
336+
"priority", "or", "priority-ltr", "or-ltr" -> {
337+
// Ưu tiên trái -> phải: điều kiện đầu tiên thỏa sẽ quyết định show luôn.
338+
var result = false
339+
for (i in dependOnList.indices) {
340+
val conditionShow = evalCondition(i) ?: continue
341+
if (conditionShow) {
342+
result = true
343+
break
344+
}
345+
}
346+
result
347+
}
348+
"priority-rtl", "or-rtl" -> {
349+
// Ưu tiên phải -> trái: xét từ điều kiện cuối cùng trở về đầu.
350+
var result = false
351+
for (i in dependOnList.indices.reversed()) {
352+
val conditionShow = evalCondition(i) ?: continue
353+
if (conditionShow) {
354+
result = true
355+
break
356+
}
357+
}
358+
result
359+
}
360+
else -> {
361+
// "and" (mặc định): tất cả điều kiện phải cùng thỏa.
362+
var result = true
363+
for (i in dependOnList.indices) {
364+
val conditionShow = evalCondition(i) ?: continue
365+
if (!conditionShow) {
366+
result = false
367+
break // AND: chỉ cần 1 điều kiện không thỏa là đủ để ẩn
368+
}
369+
}
370+
result
319371
}
320372
}
321373

0 commit comments

Comments
 (0)