@@ -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