@@ -6,15 +6,20 @@ import kotlinx.coroutines.flow.combine
66import kotlinx.coroutines.flow.flattenConcat
77import kotlinx.coroutines.flow.flowOf
88import kotlinx.coroutines.flow.map
9+ import kotlinx.coroutines.flow.update
910import kotlinx.coroutines.launch
11+ import li.songe.gkd.data.RawSubscription
1012import li.songe.gkd.data.SubsConfig
1113import li.songe.gkd.db.DbSet
1214import li.songe.gkd.store.storeFlow
1315import li.songe.gkd.ui.component.ShowGroupState
16+ import li.songe.gkd.ui.component.getActualGroupChecked
1417import li.songe.gkd.ui.component.toGroupState
1518import li.songe.gkd.ui.share.BaseViewModel
19+ import li.songe.gkd.ui.share.asMutableStateFlow
1620import li.songe.gkd.util.LogUtils
1721import li.songe.gkd.util.RuleSortOption
22+ import li.songe.gkd.util.UsedSubsEntry
1823import li.songe.gkd.util.collator
1924import li.songe.gkd.util.findOption
2025import li.songe.gkd.util.subsItemsFlow
@@ -25,6 +30,12 @@ class AppConfigVm(val route: AppConfigRoute) : BaseViewModel() {
2530 val ruleSortTypeFlow = storeFlow.mapNew {
2631 RuleSortOption .objects.findOption(it.appRuleSort)
2732 }
33+ val showDisabledRuleFlow = storeFlow.asMutableStateFlow(
34+ getter = { it.showDisabledRule },
35+ setter = {
36+ storeFlow.value.copy(showDisabledRule = it)
37+ }
38+ )
2839
2940 private val usedSubsIdsFlow = subsItemsFlow.mapNew { list ->
3041 list.filter { it.enable }.map { it.id }.sorted()
@@ -76,8 +87,77 @@ class AppConfigVm(val route: AppConfigRoute) : BaseViewModel() {
7687 }.filter { it.second.isNotEmpty() }
7788 }.stateInit(emptyList())
7889
79- val subsPairsFlow = combine(
90+ private val checkedGroupSetFlow = combine(
8091 temp1ListFlow,
92+ globalSubsConfigsFlow,
93+ categoryConfigsFlow,
94+ appSubsConfigsFlow,
95+ ) { list, globalSubsConfigs, categoryConfigs, appSubsConfigs ->
96+ val checkedSet = mutableSetOf<Triple <Long , Int , Int >>()
97+ list.forEach { (entry, groups) ->
98+ groups.forEach { group ->
99+ val subsConfig = when (group) {
100+ is RawSubscription .RawAppGroup -> appSubsConfigs
101+ is RawSubscription .RawGlobalGroup -> globalSubsConfigs
102+ }.find { it.subsId == entry.subsItem.id && it.groupKey == group.key }
103+ val category = when (group) {
104+ is RawSubscription .RawAppGroup -> entry.subscription.getCategory(group.name)
105+ is RawSubscription .RawGlobalGroup -> null
106+ }
107+ val categoryConfig = if (category != null ) {
108+ categoryConfigs.find { it.subsId == entry.subsItem.id && it.categoryKey == category.key }
109+ } else {
110+ null
111+ }
112+ val checked = getActualGroupChecked(
113+ subs = entry.subscription,
114+ group = group,
115+ appId = route.appId,
116+ subsConfig = subsConfig,
117+ categoryConfig = categoryConfig,
118+ )
119+ if (checked) {
120+ checkedSet.add(Triple (entry.subsItem.id, group.groupType, group.key))
121+ }
122+ }
123+ }
124+ checkedSet
125+ }.stateInit(emptySet())
126+
127+ private val actualCheckedGroupSetFlow = MutableStateFlow (checkedGroupSetFlow.value)
128+
129+ init {
130+ showDisabledRuleFlow.launchOnChange {
131+ actualCheckedGroupSetFlow.value = checkedGroupSetFlow.value
132+ }
133+ checkedGroupSetFlow.launchOnChange { a ->
134+ actualCheckedGroupSetFlow.update { b -> a + b }
135+ }
136+ }
137+
138+ private val temp2ListFlow = combine(
139+ temp1ListFlow,
140+ showDisabledRuleFlow,
141+ actualCheckedGroupSetFlow,
142+ ) { list, showDisabledRule, checkedSet ->
143+ if (showDisabledRule) {
144+ list
145+ } else {
146+ val newList = mutableListOf<Pair <UsedSubsEntry , List <RawSubscription .RawGroupProps >>>()
147+ list.forEach { (entry, groups) ->
148+ val newGroups = groups.filter { g ->
149+ checkedSet.contains(Triple (entry.subsItem.id, g.groupType, g.key))
150+ }
151+ if (newGroups.isNotEmpty()) {
152+ newList.add(entry to newGroups)
153+ }
154+ }
155+ newList
156+ }
157+ }.stateInit(emptyList())
158+
159+ val subsPairsFlow = combine(
160+ temp2ListFlow,
81161 latestLogsFlow,
82162 ruleSortTypeFlow
83163 ) { list, logs, sortType ->
@@ -115,11 +195,11 @@ class AppConfigVm(val route: AppConfigRoute) : BaseViewModel() {
115195 val isSelectedModeFlow = MutableStateFlow (false )
116196 val selectedDataSetFlow = MutableStateFlow (emptySet<ShowGroupState >())
117197
118- private fun getAllSelectedDataSet () = subsPairsFlow.value.map { e ->
198+ private fun getAllSelectedDataSet () = subsPairsFlow.value.flatMap { e ->
119199 e.second.map { g ->
120200 g.toGroupState(subsId = e.first.subsItem.id, appId = route.appId)
121201 }
122- }.flatten(). toSet()
202+ }.toSet()
123203
124204 fun selectAll () {
125205 selectedDataSetFlow.value = getAllSelectedDataSet()
0 commit comments