[DO NOT USE] Refine drag and drop reordering, part 1/3

This commit is contained in:
FooIbar authored and tarsin committed 2023-07-19 07:17:21 +08:00
1 parent 84fe0b9cb7
commit 344cd1305c
6 files changed
+494 -33

No files matched your search

+6 -22
View File
@@ -173,40 +173,23 @@ object EhDB {
suspend fun insertQuickSearch(quickSearch: QuickSearch) {
val dao = db.quickSearchDao()
quickSearch.time = System.currentTimeMillis()
quickSearch.id = dao.insert(quickSearch)
}
private suspend fun importQuickSearch(quickSearchList: List<QuickSearch>) {
val dao = db.quickSearchDao()
for (quickSearch in quickSearchList) {
dao.insert(quickSearch)
}
dao.insert(quickSearchList)
}
suspend fun deleteQuickSearch(quickSearch: QuickSearch) {
val dao = db.quickSearchDao()
dao.delete(quickSearch)
dao.fill(quickSearch.position)
}
suspend fun moveQuickSearch(fromPosition: Int, toPosition: Int) {
if (fromPosition == toPosition) return
val reverse = fromPosition > toPosition
val offset = if (reverse) toPosition else fromPosition
val limit = if (reverse) fromPosition - toPosition + 1 else toPosition - fromPosition + 1
suspend fun updateQuickSearch(quickSearchList: List<QuickSearch>) {
val dao = db.quickSearchDao()
val list = dao.list(offset, limit)
val step = if (reverse) 1 else -1
val start = if (reverse) limit - 1 else 0
val end = if (reverse) 0 else limit - 1
val toTime = list[end].time
var i = end
while (if (reverse) i < start else i > 0) {
list[i].time = list[i + step].time
i += step
}
list[start].time = toTime
dao.update(list)
dao.update(quickSearchList)
}
val historyLazyList: PagingSource<Int, HistoryInfo>
@@ -338,9 +321,10 @@ object EhDB {
runCatching {
val quickSearchList = oldDB.quickSearchDao().list()
val currentQuickSearchList = db.quickSearchDao().list()
val offset = currentQuickSearchList.size
val importList = quickSearchList.filter { newQS ->
currentQuickSearchList.none { it.name == newQS.name }
}
}.onEachIndexed { index, q -> q.position = index + offset }
importQuickSearch(importList)
}
runCatching {
@@ -19,6 +19,12 @@ class HistoryMigration : AutoMigrationSpec {
}
}
class QuickSearchMigration : AutoMigrationSpec {
override fun onPostMigrate(db: SupportSQLiteDatabase) {
db.execSQL("UPDATE QUICK_SEARCH SET POSITION = (SELECT COUNT(*) FROM QUICK_SEARCH T WHERE T.TIME < QUICK_SEARCH.TIME)")
}
}
class ThumbKeyMigration : AutoMigrationSpec {
override fun onPostMigrate(db: SupportSQLiteDatabase) {
val needMigrationTables = arrayOf(
@@ -41,7 +47,7 @@ class ThumbKeyMigration : AutoMigrationSpec {
@Database(
entities = [DownloadInfo::class, DownloadLabel::class, DownloadDirname::class, Filter::class, HistoryInfo::class, LocalFavoriteInfo::class, QuickSearch::class],
version = 10,
version = 11,
exportSchema = true,
autoMigrations = [
AutoMigration(
@@ -71,6 +77,11 @@ class ThumbKeyMigration : AutoMigrationSpec {
to = 10,
spec = HistoryMigration::class,
),
AutoMigration(
from = 10,
to = 11,
spec = QuickSearchMigration::class,
),
],
)
@TypeConverters(FilterModeConverter::class)
@@ -36,4 +36,7 @@ data class QuickSearch(
@ColumnInfo(name = "TIME")
var time: Long = 0,
@ColumnInfo(name = "POSITION", defaultValue = "0")
var position: Int = 0,
)
@@ -8,17 +8,23 @@ import androidx.room.Update
@Dao
interface QuickSearchDao {
@Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC")
@Query("SELECT * FROM QUICK_SEARCH ORDER BY POSITION ASC")
suspend fun list(): List<QuickSearch>
@Query("SELECT * FROM QUICK_SEARCH ORDER BY TIME ASC LIMIT :limit OFFSET :offset")
@Query("SELECT * FROM QUICK_SEARCH ORDER BY POSITION ASC LIMIT :limit OFFSET :offset")
suspend fun list(offset: Int, limit: Int): List<QuickSearch>
@Query("UPDATE QUICK_SEARCH SET POSITION = POSITION - 1 WHERE POSITION > :position")
suspend fun fill(position: Int)
@Update
suspend fun update(downloadLabels: List<QuickSearch>)
suspend fun update(quickSearchList: List<QuickSearch>)
@Insert
suspend fun insert(t: QuickSearch): Long
suspend fun insert(quickSearch: QuickSearch): Long
@Insert
suspend fun insert(quickSearchList: List<QuickSearch>)
@Delete
suspend fun delete(quickSearch: QuickSearch)
@@ -585,6 +585,7 @@ class GalleryListScene : SearchBarScene() {
builder.setError(null)
dialog.dismiss()
val quickSearch = mUrlBuilder.toQuickSearch(text)
quickSearch.position = mQuickSearchList.size
EhDB.insertQuickSearch(quickSearch)
mQuickSearchList.add(quickSearch)
withUIContext {
@@ -1043,13 +1044,14 @@ class GalleryListScene : SearchBarScene() {
if (fromPosition == toPosition) {
return false
}
val item = mQuickSearchList.removeAt(fromPosition)
mQuickSearchList.add(toPosition, item)
mAdapter.notifyItemMoved(fromPosition, toPosition)
lifecycleScope.launchIO {
EhDB.moveQuickSearch(fromPosition, toPosition)
val item = mQuickSearchList.removeAt(fromPosition)
mQuickSearchList.add(toPosition, item)
withUIContext {
mAdapter.notifyItemMoved(fromPosition, toPosition)
}
val range = if (fromPosition < toPosition) fromPosition..toPosition else toPosition..fromPosition
val list = mQuickSearchList.slice(range)
list.zip(range).forEach { it.first.position = it.second }
EhDB.updateQuickSearch(list)
}
return true
}