[DO NOT USE] Refine drag and drop reordering, part 1/3
This commit is contained in:
1 parent
84fe0b9cb7
commit
344cd1305c
6 files changed
+494
-33
No files matched your search
@@ -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
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user