diff --git a/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/DrawerItem.kt b/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/DrawerItem.kt index d20061216..f2778f029 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/DrawerItem.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/compose/drawer/DrawerItem.kt @@ -1,23 +1,9 @@ package org.tasks.compose.drawer -import androidx.compose.runtime.Stable -import co.touchlab.kermit.Logger -import org.tasks.data.UUIDHelper -import org.tasks.filters.CaldavFilter -import org.tasks.filters.CustomFilter -import org.tasks.filters.MyTasksFilter import org.tasks.filters.NavigationDrawerSubheader -import org.tasks.filters.NotificationsFilter -import org.tasks.filters.PlaceFilter -import org.tasks.filters.RecentlyModifiedFilter -import org.tasks.filters.SnoozedFilter -import org.tasks.filters.TagFilter -import org.tasks.filters.TimerFilter -import org.tasks.filters.TodayFilter +import org.tasks.filters.key -@Stable sealed class DrawerItem { - @Stable data class Filter( val title: String, val icon: String?, @@ -27,25 +13,9 @@ sealed class DrawerItem { val selected: Boolean = false, val filter: org.tasks.filters.Filter, ) : DrawerItem() { - override fun key() = when (filter) { - is CustomFilter -> "custom_${filter.id}" - is CaldavFilter -> "list_${filter.account.id}_${filter.calendar.id}" - is PlaceFilter -> "place_${filter.place.id}" - is TagFilter -> "tag_${filter.tagData.id}" - is MyTasksFilter -> "builtin_my_tasks" - is TodayFilter -> "builtin_today" - is RecentlyModifiedFilter -> "builtin_recently_modified" - is TimerFilter -> "builtin_timer" - is SnoozedFilter -> "builtin_snoozed" - is NotificationsFilter -> "builtin_notifications" - else -> { - Logger.w { "Unexpected filter type: ${filter.javaClass.name}" } - UUIDHelper.newUUID() - } - } + override fun key() = filter.key() } - @Stable data class Header( val title: String, val collapsed: Boolean, diff --git a/kmp/src/commonMain/kotlin/org/tasks/filters/DebugFilters.kt b/kmp/src/commonMain/kotlin/org/tasks/filters/DebugFilters.kt index 4c5c8b6ed..837674dc8 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/filters/DebugFilters.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/filters/DebugFilters.kt @@ -1,5 +1,6 @@ package org.tasks.filters +import org.tasks.CommonParcelize import org.tasks.data.entity.CaldavAccount import org.tasks.data.entity.CaldavCalendar import org.tasks.data.entity.CaldavTask @@ -10,9 +11,20 @@ import org.tasks.data.sql.Join import org.tasks.data.sql.QueryTemplate import org.tasks.themes.TasksIcons +@CommonParcelize +data class DebugFilter( + override val title: String, + override val sql: String?, + override val icon: String?, +) : Filter() { + override fun areItemsTheSame(other: FilterListItem): Boolean { + return other is Filter && sql == other.sql + } +} + object DebugFilters { fun getNoListFilter() = - FilterImpl( + DebugFilter( title = "No list", sql = QueryTemplate() .join(Join.left(CaldavTask.TABLE, CaldavTask.TASK.eq(Task.ID))) @@ -22,14 +34,14 @@ object DebugFilters { ) fun getDeleted() = - FilterImpl( + DebugFilter( title = "Deleted", sql = QueryTemplate().where(Task.DELETION_DATE.gt(0)).toString(), icon = TasksIcons.DELETE, ) fun getMissingListFilter() = - FilterImpl( + DebugFilter( title = "Missing list", sql = QueryTemplate() .join(Join.left(CaldavTask.TABLE, CaldavTask.TASK.eq(Task.ID))) @@ -45,7 +57,7 @@ object DebugFilters { ) fun getMissingAccountFilter() = - FilterImpl( + DebugFilter( title = "Missing account", sql = QueryTemplate() .join( @@ -63,21 +75,21 @@ object DebugFilters { ) fun getNoTitleFilter() = - FilterImpl( + DebugFilter( title = "No title", sql = QueryTemplate().where(or(Task.TITLE.eq(null), Task.TITLE.eq(""))).toString(), icon = TasksIcons.CLEAR, ) fun getNoCreateDateFilter() = - FilterImpl( + DebugFilter( title = "No create time", sql = QueryTemplate().where(Task.CREATION_DATE.eq(0)).toString(), icon = TasksIcons.ADD, ) fun getNoModificationDateFilter() = - FilterImpl( + DebugFilter( title = "No modify time", sql = QueryTemplate().where(Task.MODIFICATION_DATE.eq(0)).toString(), icon = TasksIcons.EDIT, diff --git a/kmp/src/commonMain/kotlin/org/tasks/filters/EmptyFilter.kt b/kmp/src/commonMain/kotlin/org/tasks/filters/EmptyFilter.kt index 95533f71f..d5b30b910 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/filters/EmptyFilter.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/filters/EmptyFilter.kt @@ -3,7 +3,7 @@ package org.tasks.filters import org.tasks.CommonParcelize @CommonParcelize -class EmptyFilter( +data class EmptyFilter( override val sql: String? = "WHERE 0", override val title: String? = null ) : Filter() { diff --git a/kmp/src/commonMain/kotlin/org/tasks/filters/Filter.kt b/kmp/src/commonMain/kotlin/org/tasks/filters/Filter.kt index 15a80cbb8..2457e35bc 100644 --- a/kmp/src/commonMain/kotlin/org/tasks/filters/Filter.kt +++ b/kmp/src/commonMain/kotlin/org/tasks/filters/Filter.kt @@ -1,9 +1,12 @@ package org.tasks.filters import androidx.compose.runtime.Stable +import co.touchlab.kermit.Logger import org.tasks.CommonParcelable import org.tasks.data.NO_COUNT import org.tasks.data.NO_ORDER +import org.tasks.data.UUIDHelper + @Stable abstract class Filter : FilterListItem, CommonParcelable { @@ -32,4 +35,30 @@ abstract class Filter : FilterListItem, CommonParcelable { open fun supportsSubtasks(): Boolean = true open fun supportsSorting(): Boolean = true open fun disableHeaders(): Boolean = !supportsSorting() + + override fun equals(other: Any?): Boolean { + if (this === other) return true + if (other !is Filter) return false + return areItemsTheSame(other) + } + + override fun hashCode(): Int = key().hashCode() +} + +fun Filter.key(): String = when (this) { + is CustomFilter -> "custom_${id}" + is CaldavFilter -> "list_${account.id}_${calendar.id}" + is PlaceFilter -> "place_${place.id}" + is TagFilter -> "tag_${tagData.id}" + is MyTasksFilter -> "builtin_my_tasks" + is TodayFilter -> "builtin_today" + is RecentlyModifiedFilter -> "builtin_recently_modified" + is TimerFilter -> "builtin_timer" + is SnoozedFilter -> "builtin_snoozed" + is NotificationsFilter -> "builtin_notifications" + is DebugFilter -> title + else -> { + Logger.w { "Unexpected filter type: ${javaClass.name}" } + UUIDHelper.newUUID() + } }