refactor(ui): refactor ui layer
This commit is contained in:
parent
731329879d
commit
eefcb4ef90
127 changed files with 773 additions and 762 deletions
|
|
@ -9,7 +9,7 @@ package ua.acclorite.book_story.core.crash
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
import android.os.Process
|
import android.os.Process
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.presentation.crash.CrashActivity
|
import ua.acclorite.book_story.presentation.crash.CrashActivity
|
||||||
import kotlin.system.exitProcess
|
import kotlin.system.exitProcess
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,33 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.core.data
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
object CoreData {
|
||||||
|
val languages = persistentListOf(
|
||||||
|
Pair("en", "English"),
|
||||||
|
Pair("uk", "Українська"),
|
||||||
|
Pair("de", "Deutsch"),
|
||||||
|
Pair("ar", "اَلْعَرَبِيَّةُ"),
|
||||||
|
Pair("es", "Español"),
|
||||||
|
Pair("tr", "Türkçe"),
|
||||||
|
Pair("fr", "Français"),
|
||||||
|
Pair("pl", "Polski"),
|
||||||
|
Pair("it", "Italiano"),
|
||||||
|
Pair("zh", "汉语"),
|
||||||
|
Pair("hi", "हिन्दी"),
|
||||||
|
// Currently as "pt" (which is Portuguese) instead of "pt-BR"
|
||||||
|
Pair("pt", "Português (Brasil)"),
|
||||||
|
Pair("ta", "தமிழ்"),
|
||||||
|
Pair("ml", "മലയാളം"),
|
||||||
|
Pair("cs", "Čeština"),
|
||||||
|
Pair("ro", "Română"),
|
||||||
|
Pair("be", "Беларуская"),
|
||||||
|
Pair("ja", "日本語")
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,28 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.core.data
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
|
||||||
|
object ExtensionsData {
|
||||||
|
val fileExtensions = persistentListOf(
|
||||||
|
".epub",
|
||||||
|
".pdf",
|
||||||
|
".fb2",
|
||||||
|
".txt",
|
||||||
|
".html",
|
||||||
|
".htm",
|
||||||
|
".md"
|
||||||
|
)
|
||||||
|
|
||||||
|
val imageExtensions = persistentListOf(
|
||||||
|
".png",
|
||||||
|
".jpg",
|
||||||
|
".jpeg",
|
||||||
|
".gif"
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,15 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.core.data
|
||||||
|
|
||||||
|
object LinkData {
|
||||||
|
const val RELEASES = "https://www.github.com/Acclorite/book-story/releases/latest"
|
||||||
|
const val ISSUES = "https://www.github.com/Acclorite/book-story/issues"
|
||||||
|
const val CONTRIBUTORS = "https://github.com/Acclorite/book-story/graphs/contributors"
|
||||||
|
const val TRANSLATION = "https://hosted.weblate.org/projects/book-story"
|
||||||
|
const val SUPPORT = "https://patreon.com/Acclorite"
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.util
|
package ua.acclorite.book_story.core.helpers
|
||||||
|
|
||||||
fun <T> MutableList<T>.addAll(calculation: () -> List<T>) {
|
fun <T> MutableList<T>.addAll(calculation: () -> List<T>) {
|
||||||
addAll(calculation())
|
addAll(calculation())
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.util
|
package ua.acclorite.book_story.core.helpers
|
||||||
|
|
||||||
fun String.removeTrailingZero(): String {
|
fun String.removeTrailingZero(): String {
|
||||||
if (!this.contains('.'))
|
if (!this.contains('.'))
|
||||||
|
|
@ -65,15 +65,4 @@ fun Char.isVisibleCharacter(): Boolean {
|
||||||
|
|
||||||
else -> false
|
else -> false
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
fun <T> compareByWithOrder(
|
|
||||||
descending: Boolean,
|
|
||||||
selector: (T) -> Comparable<*>?
|
|
||||||
): Comparator<T> {
|
|
||||||
return if (descending) {
|
|
||||||
compareByDescending(selector)
|
|
||||||
} else {
|
|
||||||
compareBy(selector)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.core.helpers
|
||||||
|
|
||||||
|
fun <T> compareByWithOrder(
|
||||||
|
descending: Boolean,
|
||||||
|
selector: (T) -> Comparable<*>?
|
||||||
|
): Comparator<T> {
|
||||||
|
return if (descending) {
|
||||||
|
compareByDescending(selector)
|
||||||
|
} else {
|
||||||
|
compareBy(selector)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.core
|
package ua.acclorite.book_story.core.log
|
||||||
|
|
||||||
import android.util.Log
|
import android.util.Log
|
||||||
|
|
||||||
|
|
@ -11,10 +11,10 @@ import android.graphics.BitmapFactory
|
||||||
import androidx.compose.ui.graphics.asImageBitmap
|
import androidx.compose.ui.graphics.asImageBitmap
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
import org.jsoup.nodes.Document
|
import org.jsoup.nodes.Document
|
||||||
|
import ua.acclorite.book_story.core.helpers.clearAllMarkdown
|
||||||
|
import ua.acclorite.book_story.core.helpers.clearMarkdown
|
||||||
|
import ua.acclorite.book_story.core.helpers.containsVisibleText
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.ui.common.util.clearAllMarkdown
|
|
||||||
import ua.acclorite.book_story.ui.common.util.clearMarkdown
|
|
||||||
import ua.acclorite.book_story.ui.common.util.containsVisibleText
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
import java.util.zip.ZipFile
|
import java.util.zip.ZipFile
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import org.commonmark.node.Node
|
||||||
import org.commonmark.node.StrongEmphasis
|
import org.commonmark.node.StrongEmphasis
|
||||||
import org.commonmark.node.Text
|
import org.commonmark.node.Text
|
||||||
import org.commonmark.parser.Parser
|
import org.commonmark.parser.Parser
|
||||||
import ua.acclorite.book_story.ui.common.util.clearMarkdown
|
import ua.acclorite.book_story.core.helpers.clearMarkdown
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class MarkdownParser @Inject constructor(
|
class MarkdownParser @Inject constructor(
|
||||||
|
|
|
||||||
|
|
@ -17,13 +17,13 @@ import kotlinx.coroutines.awaitAll
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
|
import ua.acclorite.book_story.core.data.ExtensionsData
|
||||||
|
import ua.acclorite.book_story.core.helpers.addAll
|
||||||
|
import ua.acclorite.book_story.core.helpers.containsVisibleText
|
||||||
import ua.acclorite.book_story.data.model.file.CachedFile
|
import ua.acclorite.book_story.data.model.file.CachedFile
|
||||||
import ua.acclorite.book_story.data.parser.DocumentParser
|
import ua.acclorite.book_story.data.parser.DocumentParser
|
||||||
import ua.acclorite.book_story.data.parser.TextParser
|
import ua.acclorite.book_story.data.parser.TextParser
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideImageExtensions
|
|
||||||
import ua.acclorite.book_story.ui.common.util.addAll
|
|
||||||
import ua.acclorite.book_story.ui.common.util.containsVisibleText
|
|
||||||
import java.io.File
|
import java.io.File
|
||||||
import java.util.concurrent.ConcurrentLinkedQueue
|
import java.util.concurrent.ConcurrentLinkedQueue
|
||||||
import java.util.zip.ZipEntry
|
import java.util.zip.ZipEntry
|
||||||
|
|
@ -60,7 +60,7 @@ class EpubTextParser @Inject constructor(
|
||||||
|
|
||||||
val chapterEntries = zip.getChapterEntries(opfEntry)
|
val chapterEntries = zip.getChapterEntries(opfEntry)
|
||||||
val imageEntries = zip.entries().toList().filter {
|
val imageEntries = zip.entries().toList().filter {
|
||||||
provideImageExtensions().any { format ->
|
ExtensionsData.imageExtensions.any { format ->
|
||||||
it.name.endsWith(format, ignoreCase = true)
|
it.name.endsWith(format, ignoreCase = true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -12,11 +12,11 @@ import com.tom_roush.pdfbox.android.PDFBoxResourceLoader
|
||||||
import com.tom_roush.pdfbox.pdmodel.PDDocument
|
import com.tom_roush.pdfbox.pdmodel.PDDocument
|
||||||
import com.tom_roush.pdfbox.text.PDFTextStripper
|
import com.tom_roush.pdfbox.text.PDFTextStripper
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
|
import ua.acclorite.book_story.core.helpers.clearAllMarkdown
|
||||||
import ua.acclorite.book_story.data.model.file.CachedFile
|
import ua.acclorite.book_story.data.model.file.CachedFile
|
||||||
import ua.acclorite.book_story.data.parser.MarkdownParser
|
import ua.acclorite.book_story.data.parser.MarkdownParser
|
||||||
import ua.acclorite.book_story.data.parser.TextParser
|
import ua.acclorite.book_story.data.parser.TextParser
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.ui.common.util.clearAllMarkdown
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val PDF_TAG = "PDF Parser"
|
private const val PDF_TAG = "PDF Parser"
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,11 @@ import android.util.Log
|
||||||
import kotlinx.coroutines.Dispatchers
|
import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
|
import ua.acclorite.book_story.core.helpers.clearAllMarkdown
|
||||||
import ua.acclorite.book_story.data.model.file.CachedFile
|
import ua.acclorite.book_story.data.model.file.CachedFile
|
||||||
import ua.acclorite.book_story.data.parser.MarkdownParser
|
import ua.acclorite.book_story.data.parser.MarkdownParser
|
||||||
import ua.acclorite.book_story.data.parser.TextParser
|
import ua.acclorite.book_story.data.parser.TextParser
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.ui.common.util.clearAllMarkdown
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
private const val TXT_TAG = "TXT Parser"
|
private const val TXT_TAG = "TXT Parser"
|
||||||
|
|
|
||||||
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.data.repository
|
package ua.acclorite.book_story.data.repository
|
||||||
|
|
||||||
|
import ua.acclorite.book_story.core.data.ExtensionsData
|
||||||
import ua.acclorite.book_story.data.local.room.BookDao
|
import ua.acclorite.book_story.data.local.room.BookDao
|
||||||
import ua.acclorite.book_story.data.mapper.file.FileMapper
|
import ua.acclorite.book_story.data.mapper.file.FileMapper
|
||||||
import ua.acclorite.book_story.data.model.file.CachedFile
|
import ua.acclorite.book_story.data.model.file.CachedFile
|
||||||
|
|
@ -14,7 +15,6 @@ import ua.acclorite.book_story.data.parser.FileParser
|
||||||
import ua.acclorite.book_story.domain.model.file.File
|
import ua.acclorite.book_story.domain.model.file.File
|
||||||
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
||||||
import ua.acclorite.book_story.domain.service.FileProvider
|
import ua.acclorite.book_story.domain.service.FileProvider
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideExtensions
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import javax.inject.Singleton
|
import javax.inject.Singleton
|
||||||
|
|
||||||
|
|
@ -47,7 +47,14 @@ class FileSystemRepositoryImpl @Inject constructor(
|
||||||
query: String,
|
query: String,
|
||||||
existingFiles: List<String>
|
existingFiles: List<String>
|
||||||
): Boolean {
|
): Boolean {
|
||||||
if (provideExtensions().none { name.endsWith(it, ignoreCase = true) }) return false
|
if (
|
||||||
|
ExtensionsData.fileExtensions.none {
|
||||||
|
name.endsWith(
|
||||||
|
it,
|
||||||
|
ignoreCase = true
|
||||||
|
)
|
||||||
|
}
|
||||||
|
) return false
|
||||||
if (query.isNotBlank() && !name.contains(query.trim(), ignoreCase = true)) return false
|
if (query.isNotBlank() && !name.contains(query.trim(), ignoreCase = true)) return false
|
||||||
if (existingFiles.any { it.equals(path, ignoreCase = true) }) return false
|
if (existingFiles.any { it.equals(path, ignoreCase = true) }) return false
|
||||||
return true
|
return true
|
||||||
|
|
|
||||||
|
|
@ -30,4 +30,20 @@ data class Book(
|
||||||
|
|
||||||
val lastOpened: Long?,
|
val lastOpened: Long?,
|
||||||
val categories: List<Int>
|
val categories: List<Int>
|
||||||
) : Parcelable
|
) : Parcelable {
|
||||||
|
companion object {
|
||||||
|
val default = Book(
|
||||||
|
id = -1,
|
||||||
|
title = "",
|
||||||
|
author = UIText.StringValue(""),
|
||||||
|
description = null,
|
||||||
|
filePath = "",
|
||||||
|
coverImage = null,
|
||||||
|
scrollIndex = 0,
|
||||||
|
scrollOffset = 0,
|
||||||
|
progress = 0f,
|
||||||
|
lastOpened = null,
|
||||||
|
categories = emptyList()
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -17,4 +17,14 @@ data class ColorPreset(
|
||||||
val backgroundColor: Color,
|
val backgroundColor: Color,
|
||||||
val fontColor: Color,
|
val fontColor: Color,
|
||||||
val isSelected: Selected
|
val isSelected: Selected
|
||||||
)
|
) {
|
||||||
|
companion object {
|
||||||
|
val default = ColorPreset(
|
||||||
|
id = -1,
|
||||||
|
name = null,
|
||||||
|
backgroundColor = Color(0xFFFAF8FF), // Blue Light Surface (hardcoded)
|
||||||
|
fontColor = Color(0xFF44464F), // Blue Light OnSurfaceVariant (hardcoded)
|
||||||
|
isSelected = false
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -8,9 +8,9 @@ package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import ua.acclorite.book_story.core.CoverImage
|
import ua.acclorite.book_story.core.CoverImage
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.logW
|
import ua.acclorite.book_story.core.log.logW
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
||||||
|
|
|
||||||
|
|
@ -8,8 +8,8 @@ package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import android.app.Application
|
import android.app.Application
|
||||||
import android.graphics.BitmapFactory
|
import android.graphics.BitmapFactory
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.logW
|
import ua.acclorite.book_story.core.log.logW
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -7,9 +7,9 @@
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.logW
|
import ua.acclorite.book_story.core.log.logW
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.book
|
package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -8,9 +8,9 @@ package ua.acclorite.book_story.domain.use_case.book
|
||||||
|
|
||||||
import androidx.core.net.toUri
|
import androidx.core.net.toUri
|
||||||
import ua.acclorite.book_story.core.CoverImage
|
import ua.acclorite.book_story.core.CoverImage
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.logW
|
import ua.acclorite.book_story.core.log.logW
|
||||||
import ua.acclorite.book_story.domain.repository.BookRepository
|
import ua.acclorite.book_story.domain.repository.BookRepository
|
||||||
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
import ua.acclorite.book_story.domain.service.CoverImageHandler
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.CategorySort
|
import ua.acclorite.book_story.domain.model.library.CategorySort
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.CategorySort
|
import ua.acclorite.book_story.domain.model.library.CategorySort
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.category
|
package ua.acclorite.book_story.domain.use_case.category
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
import ua.acclorite.book_story.domain.repository.CategoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.color_preset
|
package ua.acclorite.book_story.domain.use_case.color_preset
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.color_preset
|
package ua.acclorite.book_story.domain.use_case.color_preset
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.color_preset
|
package ua.acclorite.book_story.domain.use_case.color_preset
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.color_preset
|
package ua.acclorite.book_story.domain.use_case.color_preset
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.color_preset
|
package ua.acclorite.book_story.domain.use_case.color_preset
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
import ua.acclorite.book_story.domain.repository.ColorPresetRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -8,10 +8,10 @@ package ua.acclorite.book_story.domain.use_case.data_store
|
||||||
|
|
||||||
import androidx.appcompat.app.AppCompatDelegate
|
import androidx.appcompat.app.AppCompatDelegate
|
||||||
import androidx.core.os.LocaleListCompat
|
import androidx.core.os.LocaleListCompat
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
||||||
import ua.acclorite.book_story.ui.common.constants.DataStoreConstants
|
import ua.acclorite.book_story.presentation.main.data.DataStoreData
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
class ChangeLanguagePreferenceUseCase @Inject constructor(
|
class ChangeLanguagePreferenceUseCase @Inject constructor(
|
||||||
|
|
@ -22,7 +22,7 @@ class ChangeLanguagePreferenceUseCase @Inject constructor(
|
||||||
logI("Changing language preference.")
|
logI("Changing language preference.")
|
||||||
|
|
||||||
dataStoreRepository.putPreference(
|
dataStoreRepository.putPreference(
|
||||||
DataStoreConstants.LANGUAGE,
|
DataStoreData.LANGUAGE,
|
||||||
language
|
language
|
||||||
).fold(
|
).fold(
|
||||||
onSuccess = {
|
onSuccess = {
|
||||||
|
|
|
||||||
|
|
@ -10,9 +10,9 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.async
|
import kotlinx.coroutines.async
|
||||||
import kotlinx.coroutines.awaitAll
|
import kotlinx.coroutines.awaitAll
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.logW
|
import ua.acclorite.book_story.core.log.logW
|
||||||
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
||||||
import ua.acclorite.book_story.presentation.main.MainState
|
import ua.acclorite.book_story.presentation.main.MainState
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@
|
||||||
package ua.acclorite.book_story.domain.use_case.data_store
|
package ua.acclorite.book_story.domain.use_case.data_store
|
||||||
|
|
||||||
import androidx.datastore.preferences.core.Preferences
|
import androidx.datastore.preferences.core.Preferences
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
import ua.acclorite.book_story.domain.repository.DataStoreRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,8 +7,8 @@
|
||||||
package ua.acclorite.book_story.domain.use_case.file_system
|
package ua.acclorite.book_story.domain.use_case.file_system
|
||||||
|
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.core.ui.UIText
|
import ua.acclorite.book_story.core.ui.UIText
|
||||||
import ua.acclorite.book_story.data.model.common.NullableBook
|
import ua.acclorite.book_story.data.model.common.NullableBook
|
||||||
import ua.acclorite.book_story.data.model.common.NullableBook.NotNull
|
import ua.acclorite.book_story.data.model.common.NullableBook.NotNull
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.file_system
|
package ua.acclorite.book_story.domain.use_case.file_system
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.file.File
|
import ua.acclorite.book_story.domain.model.file.File
|
||||||
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
import ua.acclorite.book_story.domain.repository.FileSystemRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.history
|
package ua.acclorite.book_story.domain.use_case.history
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.history.History
|
import ua.acclorite.book_story.domain.model.history.History
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.history
|
package ua.acclorite.book_story.domain.use_case.history
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.history.History
|
import ua.acclorite.book_story.domain.model.history.History
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.history
|
package ua.acclorite.book_story.domain.use_case.history
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.history
|
package ua.acclorite.book_story.domain.use_case.history
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.history.History
|
import ua.acclorite.book_story.domain.model.history.History
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.history
|
package ua.acclorite.book_story.domain.use_case.history
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.model.history.History
|
import ua.acclorite.book_story.domain.model.history.History
|
||||||
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
import ua.acclorite.book_story.domain.repository.HistoryRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.permission
|
package ua.acclorite.book_story.domain.use_case.permission
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.PermissionRepository
|
import ua.acclorite.book_story.domain.repository.PermissionRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
package ua.acclorite.book_story.domain.use_case.permission
|
package ua.acclorite.book_story.domain.use_case.permission
|
||||||
|
|
||||||
import ua.acclorite.book_story.core.logE
|
import ua.acclorite.book_story.core.log.logE
|
||||||
import ua.acclorite.book_story.core.logI
|
import ua.acclorite.book_story.core.log.logI
|
||||||
import ua.acclorite.book_story.domain.repository.PermissionRepository
|
import ua.acclorite.book_story.domain.repository.PermissionRepository
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -16,8 +16,8 @@ import kotlinx.coroutines.Dispatchers
|
||||||
import kotlinx.coroutines.launch
|
import kotlinx.coroutines.launch
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.ui.common.util.launchActivity
|
import ua.acclorite.book_story.ui.common.helpers.launchActivity
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ import ua.acclorite.book_story.domain.use_case.book.UpdateCoverImageUseCase
|
||||||
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
||||||
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
||||||
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
|
|
|
||||||
|
|
@ -10,11 +10,10 @@ import androidx.compose.runtime.Immutable
|
||||||
import ua.acclorite.book_story.core.BottomSheet
|
import ua.acclorite.book_story.core.BottomSheet
|
||||||
import ua.acclorite.book_story.core.Dialog
|
import ua.acclorite.book_story.core.Dialog
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideEmptyBook
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class BookInfoState(
|
data class BookInfoState(
|
||||||
val book: Book = provideEmptyBook(),
|
val book: Book = Book.default,
|
||||||
|
|
||||||
val canResetCover: Boolean = false,
|
val canResetCover: Boolean = false,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -23,6 +23,7 @@ import kotlinx.coroutines.sync.withLock
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.helpers.compareByWithOrder
|
||||||
import ua.acclorite.book_story.data.model.common.NullableBook
|
import ua.acclorite.book_story.data.model.common.NullableBook
|
||||||
import ua.acclorite.book_story.domain.model.file.File
|
import ua.acclorite.book_story.domain.model.file.File
|
||||||
import ua.acclorite.book_story.domain.use_case.book.AddBookUseCase
|
import ua.acclorite.book_story.domain.use_case.book.AddBookUseCase
|
||||||
|
|
@ -32,8 +33,7 @@ import ua.acclorite.book_story.presentation.browse.model.BrowseSortOrder
|
||||||
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
||||||
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
||||||
import ua.acclorite.book_story.presentation.library.model.SelectableNullableBook
|
import ua.acclorite.book_story.presentation.library.model.SelectableNullableBook
|
||||||
import ua.acclorite.book_story.ui.common.util.compareByWithOrder
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
|
|
|
||||||
|
|
@ -21,9 +21,9 @@ import kotlinx.parcelize.Parcelize
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.core.crash.CrashUtils
|
import ua.acclorite.book_story.core.crash.CrashUtils
|
||||||
import ua.acclorite.book_story.presentation.navigator.Screen
|
import ua.acclorite.book_story.presentation.navigator.Screen
|
||||||
import ua.acclorite.book_story.ui.common.util.LocalActivity
|
import ua.acclorite.book_story.ui.common.helpers.LocalActivity
|
||||||
import ua.acclorite.book_story.ui.common.util.launchActivity
|
import ua.acclorite.book_story.ui.common.helpers.launchActivity
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import ua.acclorite.book_story.ui.crash.CrashContent
|
import ua.acclorite.book_story.ui.crash.CrashContent
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
|
|
|
||||||
|
|
@ -31,7 +31,7 @@ import ua.acclorite.book_story.domain.use_case.history.DeleteWholeHistoryUseCase
|
||||||
import ua.acclorite.book_story.domain.use_case.history.GetHistoryUseCase
|
import ua.acclorite.book_story.domain.use_case.history.GetHistoryUseCase
|
||||||
import ua.acclorite.book_story.presentation.history.model.GroupedHistory
|
import ua.acclorite.book_story.presentation.history.model.GroupedHistory
|
||||||
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Calendar
|
import java.util.Calendar
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ import ua.acclorite.book_story.domain.use_case.book.UpdateBookUseCase
|
||||||
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
||||||
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
||||||
import ua.acclorite.book_story.presentation.library.model.SelectableBook
|
import ua.acclorite.book_story.presentation.library.model.SelectableBook
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
|
|
|
||||||
|
|
@ -30,6 +30,7 @@ import ua.acclorite.book_story.presentation.browse.model.BrowseSortOrder
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibraryLayout
|
import ua.acclorite.book_story.presentation.library.model.LibraryLayout
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibrarySortOrder
|
import ua.acclorite.book_story.presentation.library.model.LibrarySortOrder
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition
|
import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition
|
||||||
|
import ua.acclorite.book_story.presentation.main.data.DataStoreData
|
||||||
import ua.acclorite.book_story.presentation.main.model.DarkTheme
|
import ua.acclorite.book_story.presentation.main.model.DarkTheme
|
||||||
import ua.acclorite.book_story.presentation.main.model.HorizontalAlignment
|
import ua.acclorite.book_story.presentation.main.model.HorizontalAlignment
|
||||||
import ua.acclorite.book_story.presentation.main.model.PureDark
|
import ua.acclorite.book_story.presentation.main.model.PureDark
|
||||||
|
|
@ -40,10 +41,8 @@ import ua.acclorite.book_story.presentation.reader.model.ReaderHorizontalGesture
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation
|
import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
||||||
import ua.acclorite.book_story.ui.common.constants.DataStoreConstants
|
import ua.acclorite.book_story.ui.reader.data.ReaderData
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideFonts
|
import ua.acclorite.book_story.ui.theme.Theme
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideMainState
|
|
||||||
import ua.acclorite.book_story.ui.theme.toTheme
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -63,7 +62,7 @@ class MainModel @Inject constructor(
|
||||||
private val mainModelReady = MutableStateFlow(false)
|
private val mainModelReady = MutableStateFlow(false)
|
||||||
|
|
||||||
private val _state: MutableStateFlow<MainState> = MutableStateFlow(
|
private val _state: MutableStateFlow<MainState> = MutableStateFlow(
|
||||||
stateHandle[provideMainState()] ?: MainState()
|
stateHandle["main_state"] ?: MainState()
|
||||||
)
|
)
|
||||||
val state = _state.asStateFlow()
|
val state = _state.asStateFlow()
|
||||||
|
|
||||||
|
|
@ -72,7 +71,7 @@ class MainModel @Inject constructor(
|
||||||
is MainEvent.OnChangeLanguage -> handleLanguageUpdate(event)
|
is MainEvent.OnChangeLanguage -> handleLanguageUpdate(event)
|
||||||
|
|
||||||
is MainEvent.OnChangeDarkTheme -> handleDatastoreUpdate(
|
is MainEvent.OnChangeDarkTheme -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.DARK_THEME,
|
key = DataStoreData.DARK_THEME,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(darkTheme = DarkTheme.valueOf(this))
|
it.copy(darkTheme = DarkTheme.valueOf(this))
|
||||||
|
|
@ -80,7 +79,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangePureDark -> handleDatastoreUpdate(
|
is MainEvent.OnChangePureDark -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PURE_DARK,
|
key = DataStoreData.PURE_DARK,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(pureDark = PureDark.valueOf(this))
|
it.copy(pureDark = PureDark.valueOf(this))
|
||||||
|
|
@ -88,7 +87,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeThemeContrast -> handleDatastoreUpdate(
|
is MainEvent.OnChangeThemeContrast -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.THEME_CONTRAST,
|
key = DataStoreData.THEME_CONTRAST,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(themeContrast = ThemeContrast.valueOf(this))
|
it.copy(themeContrast = ThemeContrast.valueOf(this))
|
||||||
|
|
@ -96,19 +95,19 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeTheme -> handleDatastoreUpdate(
|
is MainEvent.OnChangeTheme -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.THEME,
|
key = DataStoreData.THEME,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(theme = toTheme())
|
it.copy(theme = Theme.valueOf(this))
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFontFamily -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFontFamily -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.FONT,
|
key = DataStoreData.FONT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(
|
it.copy(
|
||||||
fontFamily = provideFonts().run {
|
fontFamily = ReaderData.fonts.run {
|
||||||
find { font ->
|
find { font ->
|
||||||
font.id == event.value
|
font.id == event.value
|
||||||
}?.id ?: get(0).id
|
}?.id ?: get(0).id
|
||||||
|
|
@ -118,7 +117,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFontStyle -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFontStyle -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IS_ITALIC,
|
key = DataStoreData.IS_ITALIC,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(isItalic = this)
|
it.copy(isItalic = this)
|
||||||
|
|
@ -126,7 +125,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFontSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFontSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.FONT_SIZE,
|
key = DataStoreData.FONT_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(fontSize = this)
|
it.copy(fontSize = this)
|
||||||
|
|
@ -134,7 +133,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLineHeight -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLineHeight -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LINE_HEIGHT,
|
key = DataStoreData.LINE_HEIGHT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(lineHeight = this)
|
it.copy(lineHeight = this)
|
||||||
|
|
@ -142,7 +141,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeParagraphHeight -> handleDatastoreUpdate(
|
is MainEvent.OnChangeParagraphHeight -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PARAGRAPH_HEIGHT,
|
key = DataStoreData.PARAGRAPH_HEIGHT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(paragraphHeight = this)
|
it.copy(paragraphHeight = this)
|
||||||
|
|
@ -150,7 +149,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeParagraphIndentation -> handleDatastoreUpdate(
|
is MainEvent.OnChangeParagraphIndentation -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PARAGRAPH_INDENTATION,
|
key = DataStoreData.PARAGRAPH_INDENTATION,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(paragraphIndentation = this)
|
it.copy(paragraphIndentation = this)
|
||||||
|
|
@ -158,7 +157,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeShowStartScreen -> handleDatastoreUpdate(
|
is MainEvent.OnChangeShowStartScreen -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.SHOW_START_SCREEN,
|
key = DataStoreData.SHOW_START_SCREEN,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(showStartScreen = this)
|
it.copy(showStartScreen = this)
|
||||||
|
|
@ -166,7 +165,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangeSidePadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.SIDE_PADDING,
|
key = DataStoreData.SIDE_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(sidePadding = this)
|
it.copy(sidePadding = this)
|
||||||
|
|
@ -174,7 +173,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeDoubleClickTranslation -> handleDatastoreUpdate(
|
is MainEvent.OnChangeDoubleClickTranslation -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.DOUBLE_CLICK_TRANSLATION,
|
key = DataStoreData.DOUBLE_CLICK_TRANSLATION,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(doubleClickTranslation = this)
|
it.copy(doubleClickTranslation = this)
|
||||||
|
|
@ -182,7 +181,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFastColorPresetChange -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFastColorPresetChange -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.FAST_COLOR_PRESET_CHANGE,
|
key = DataStoreData.FAST_COLOR_PRESET_CHANGE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(fastColorPresetChange = this)
|
it.copy(fastColorPresetChange = this)
|
||||||
|
|
@ -190,7 +189,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBrowseLayout -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBrowseLayout -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_LAYOUT,
|
key = DataStoreData.BROWSE_LAYOUT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseLayout = BrowseLayout.valueOf(this))
|
it.copy(browseLayout = BrowseLayout.valueOf(this))
|
||||||
|
|
@ -198,7 +197,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBrowseAutoGridSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBrowseAutoGridSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_AUTO_GRID_SIZE,
|
key = DataStoreData.BROWSE_AUTO_GRID_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseAutoGridSize = this)
|
it.copy(browseAutoGridSize = this)
|
||||||
|
|
@ -206,7 +205,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBrowseGridSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBrowseGridSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_GRID_SIZE,
|
key = DataStoreData.BROWSE_GRID_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseGridSize = this)
|
it.copy(browseGridSize = this)
|
||||||
|
|
@ -214,7 +213,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBrowseSortOrder -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBrowseSortOrder -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_SORT_ORDER,
|
key = DataStoreData.BROWSE_SORT_ORDER,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseSortOrder = BrowseSortOrder.valueOf(this))
|
it.copy(browseSortOrder = BrowseSortOrder.valueOf(this))
|
||||||
|
|
@ -222,7 +221,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBrowseSortOrderDescending -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBrowseSortOrderDescending -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_SORT_ORDER_DESCENDING,
|
key = DataStoreData.BROWSE_SORT_ORDER_DESCENDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseSortOrderDescending = this)
|
it.copy(browseSortOrderDescending = this)
|
||||||
|
|
@ -234,7 +233,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeTextAlignment -> handleDatastoreUpdate(
|
is MainEvent.OnChangeTextAlignment -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.TEXT_ALIGNMENT,
|
key = DataStoreData.TEXT_ALIGNMENT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(textAlignment = ReaderTextAlignment.valueOf(this))
|
it.copy(textAlignment = ReaderTextAlignment.valueOf(this))
|
||||||
|
|
@ -242,7 +241,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeDoublePressExit -> handleDatastoreUpdate(
|
is MainEvent.OnChangeDoublePressExit -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.DOUBLE_PRESS_EXIT,
|
key = DataStoreData.DOUBLE_PRESS_EXIT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(doublePressExit = this)
|
it.copy(doublePressExit = this)
|
||||||
|
|
@ -250,7 +249,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLetterSpacing -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLetterSpacing -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LETTER_SPACING,
|
key = DataStoreData.LETTER_SPACING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(letterSpacing = this)
|
it.copy(letterSpacing = this)
|
||||||
|
|
@ -258,7 +257,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeAbsoluteDark -> handleDatastoreUpdate(
|
is MainEvent.OnChangeAbsoluteDark -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.ABSOLUTE_DARK,
|
key = DataStoreData.ABSOLUTE_DARK,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(absoluteDark = this)
|
it.copy(absoluteDark = this)
|
||||||
|
|
@ -266,7 +265,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeCutoutPadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangeCutoutPadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.CUTOUT_PADDING,
|
key = DataStoreData.CUTOUT_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(cutoutPadding = this)
|
it.copy(cutoutPadding = this)
|
||||||
|
|
@ -274,7 +273,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFullscreen -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFullscreen -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.FULLSCREEN,
|
key = DataStoreData.FULLSCREEN,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(fullscreen = this)
|
it.copy(fullscreen = this)
|
||||||
|
|
@ -282,7 +281,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeKeepScreenOn -> handleDatastoreUpdate(
|
is MainEvent.OnChangeKeepScreenOn -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.KEEP_SCREEN_ON,
|
key = DataStoreData.KEEP_SCREEN_ON,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(keepScreenOn = this)
|
it.copy(keepScreenOn = this)
|
||||||
|
|
@ -290,7 +289,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeVerticalPadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangeVerticalPadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.VERTICAL_PADDING,
|
key = DataStoreData.VERTICAL_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(verticalPadding = this)
|
it.copy(verticalPadding = this)
|
||||||
|
|
@ -298,7 +297,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHideBarsOnFastScroll -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHideBarsOnFastScroll -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HIDE_BARS_ON_FAST_SCROLL,
|
key = DataStoreData.HIDE_BARS_ON_FAST_SCROLL,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(hideBarsOnFastScroll = this)
|
it.copy(hideBarsOnFastScroll = this)
|
||||||
|
|
@ -306,7 +305,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangePerceptionExpander -> handleDatastoreUpdate(
|
is MainEvent.OnChangePerceptionExpander -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PERCEPTION_EXPANDER,
|
key = DataStoreData.PERCEPTION_EXPANDER,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(perceptionExpander = this)
|
it.copy(perceptionExpander = this)
|
||||||
|
|
@ -314,7 +313,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangePerceptionExpanderPadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangePerceptionExpanderPadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PERCEPTION_EXPANDER_PADDING,
|
key = DataStoreData.PERCEPTION_EXPANDER_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(perceptionExpanderPadding = this)
|
it.copy(perceptionExpanderPadding = this)
|
||||||
|
|
@ -322,7 +321,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangePerceptionExpanderThickness -> handleDatastoreUpdate(
|
is MainEvent.OnChangePerceptionExpanderThickness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PERCEPTION_EXPANDER_THICKNESS,
|
key = DataStoreData.PERCEPTION_EXPANDER_THICKNESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(perceptionExpanderThickness = this)
|
it.copy(perceptionExpanderThickness = this)
|
||||||
|
|
@ -330,7 +329,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate(
|
is MainEvent.OnChangeScreenOrientation -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.SCREEN_ORIENTATION,
|
key = DataStoreData.SCREEN_ORIENTATION,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(screenOrientation = ReaderScreenOrientation.valueOf(this))
|
it.copy(screenOrientation = ReaderScreenOrientation.valueOf(this))
|
||||||
|
|
@ -338,7 +337,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeCustomScreenBrightness -> handleDatastoreUpdate(
|
is MainEvent.OnChangeCustomScreenBrightness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.CUSTOM_SCREEN_BRIGHTNESS,
|
key = DataStoreData.CUSTOM_SCREEN_BRIGHTNESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(customScreenBrightness = this)
|
it.copy(customScreenBrightness = this)
|
||||||
|
|
@ -346,7 +345,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeScreenBrightness -> handleDatastoreUpdate(
|
is MainEvent.OnChangeScreenBrightness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.SCREEN_BRIGHTNESS,
|
key = DataStoreData.SCREEN_BRIGHTNESS,
|
||||||
value = event.value.toDouble(),
|
value = event.value.toDouble(),
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(screenBrightness = this.toFloat())
|
it.copy(screenBrightness = this.toFloat())
|
||||||
|
|
@ -354,7 +353,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHorizontalGesture -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHorizontalGesture -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HORIZONTAL_GESTURE,
|
key = DataStoreData.HORIZONTAL_GESTURE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(horizontalGesture = ReaderHorizontalGesture.valueOf(this))
|
it.copy(horizontalGesture = ReaderHorizontalGesture.valueOf(this))
|
||||||
|
|
@ -362,7 +361,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHorizontalGestureScroll -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHorizontalGestureScroll -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HORIZONTAL_GESTURE_SCROLL,
|
key = DataStoreData.HORIZONTAL_GESTURE_SCROLL,
|
||||||
value = event.value.toDouble(),
|
value = event.value.toDouble(),
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(horizontalGestureScroll = this.toFloat())
|
it.copy(horizontalGestureScroll = this.toFloat())
|
||||||
|
|
@ -370,7 +369,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHorizontalGestureSensitivity -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHorizontalGestureSensitivity -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HORIZONTAL_GESTURE_SENSITIVITY,
|
key = DataStoreData.HORIZONTAL_GESTURE_SENSITIVITY,
|
||||||
value = event.value.toDouble(),
|
value = event.value.toDouble(),
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(horizontalGestureSensitivity = this.toFloat())
|
it.copy(horizontalGestureSensitivity = this.toFloat())
|
||||||
|
|
@ -378,7 +377,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeBottomBarPadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangeBottomBarPadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BOTTOM_BAR_PADDING,
|
key = DataStoreData.BOTTOM_BAR_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(bottomBarPadding = this)
|
it.copy(bottomBarPadding = this)
|
||||||
|
|
@ -386,7 +385,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHighlightedReading -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHighlightedReading -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HIGHLIGHTED_READING,
|
key = DataStoreData.HIGHLIGHTED_READING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(highlightedReading = this)
|
it.copy(highlightedReading = this)
|
||||||
|
|
@ -394,7 +393,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHighlightedReadingThickness -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHighlightedReadingThickness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HIGHLIGHTED_READING_THICKNESS,
|
key = DataStoreData.HIGHLIGHTED_READING_THICKNESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(highlightedReadingThickness = this)
|
it.copy(highlightedReadingThickness = this)
|
||||||
|
|
@ -402,7 +401,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeChapterTitleAlignment -> handleDatastoreUpdate(
|
is MainEvent.OnChangeChapterTitleAlignment -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.CHAPTER_TITLE_ALIGNMENT,
|
key = DataStoreData.CHAPTER_TITLE_ALIGNMENT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(chapterTitleAlignment = ReaderTextAlignment.valueOf(this))
|
it.copy(chapterTitleAlignment = ReaderTextAlignment.valueOf(this))
|
||||||
|
|
@ -410,7 +409,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeImages -> handleDatastoreUpdate(
|
is MainEvent.OnChangeImages -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IMAGES,
|
key = DataStoreData.IMAGES,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(images = this)
|
it.copy(images = this)
|
||||||
|
|
@ -418,7 +417,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeImagesCornersRoundness -> handleDatastoreUpdate(
|
is MainEvent.OnChangeImagesCornersRoundness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IMAGES_CORNERS_ROUNDNESS,
|
key = DataStoreData.IMAGES_CORNERS_ROUNDNESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(imagesCornersRoundness = this)
|
it.copy(imagesCornersRoundness = this)
|
||||||
|
|
@ -426,7 +425,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeImagesAlignment -> handleDatastoreUpdate(
|
is MainEvent.OnChangeImagesAlignment -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IMAGES_ALIGNMENT,
|
key = DataStoreData.IMAGES_ALIGNMENT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(imagesAlignment = HorizontalAlignment.valueOf(this))
|
it.copy(imagesAlignment = HorizontalAlignment.valueOf(this))
|
||||||
|
|
@ -434,7 +433,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeImagesWidth -> handleDatastoreUpdate(
|
is MainEvent.OnChangeImagesWidth -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IMAGES_WIDTH,
|
key = DataStoreData.IMAGES_WIDTH,
|
||||||
value = event.value.toDouble(),
|
value = event.value.toDouble(),
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(imagesWidth = this.toFloat())
|
it.copy(imagesWidth = this.toFloat())
|
||||||
|
|
@ -442,7 +441,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeImagesColorEffects -> handleDatastoreUpdate(
|
is MainEvent.OnChangeImagesColorEffects -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.IMAGES_COLOR_EFFECTS,
|
key = DataStoreData.IMAGES_COLOR_EFFECTS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(imagesColorEffects = ReaderColorEffects.valueOf(this))
|
it.copy(imagesColorEffects = ReaderColorEffects.valueOf(this))
|
||||||
|
|
@ -450,7 +449,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeProgressBar -> handleDatastoreUpdate(
|
is MainEvent.OnChangeProgressBar -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PROGRESS_BAR,
|
key = DataStoreData.PROGRESS_BAR,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(progressBar = this)
|
it.copy(progressBar = this)
|
||||||
|
|
@ -458,7 +457,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeProgressBarPadding -> handleDatastoreUpdate(
|
is MainEvent.OnChangeProgressBarPadding -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PROGRESS_BAR_PADDING,
|
key = DataStoreData.PROGRESS_BAR_PADDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(progressBarPadding = this)
|
it.copy(progressBarPadding = this)
|
||||||
|
|
@ -466,7 +465,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeProgressBarAlignment -> handleDatastoreUpdate(
|
is MainEvent.OnChangeProgressBarAlignment -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PROGRESS_BAR_ALIGNMENT,
|
key = DataStoreData.PROGRESS_BAR_ALIGNMENT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(progressBarAlignment = HorizontalAlignment.valueOf(this))
|
it.copy(progressBarAlignment = HorizontalAlignment.valueOf(this))
|
||||||
|
|
@ -474,7 +473,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeProgressBarFontSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeProgressBarFontSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PROGRESS_BAR_FONT_SIZE,
|
key = DataStoreData.PROGRESS_BAR_FONT_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(progressBarFontSize = this)
|
it.copy(progressBarFontSize = this)
|
||||||
|
|
@ -486,7 +485,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeFontThickness -> handleDatastoreUpdate(
|
is MainEvent.OnChangeFontThickness -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.FONT_THICKNESS,
|
key = DataStoreData.FONT_THICKNESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(fontThickness = ReaderFontThickness.valueOf(this))
|
it.copy(fontThickness = ReaderFontThickness.valueOf(this))
|
||||||
|
|
@ -494,7 +493,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeProgressCount -> handleDatastoreUpdate(
|
is MainEvent.OnChangeProgressCount -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.PROGRESS_COUNT,
|
key = DataStoreData.PROGRESS_COUNT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(progressCount = ReaderProgressCount.valueOf(this))
|
it.copy(progressCount = ReaderProgressCount.valueOf(this))
|
||||||
|
|
@ -502,7 +501,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHorizontalGestureAlphaAnim -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHorizontalGestureAlphaAnim -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HORIZONTAL_GESTURE_ALPHA_ANIM,
|
key = DataStoreData.HORIZONTAL_GESTURE_ALPHA_ANIM,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(horizontalGestureAlphaAnim = this)
|
it.copy(horizontalGestureAlphaAnim = this)
|
||||||
|
|
@ -510,7 +509,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeHorizontalGesturePullAnim -> handleDatastoreUpdate(
|
is MainEvent.OnChangeHorizontalGesturePullAnim -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.HORIZONTAL_GESTURE_PULL_ANIM,
|
key = DataStoreData.HORIZONTAL_GESTURE_PULL_ANIM,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(horizontalGesturePullAnim = this)
|
it.copy(horizontalGesturePullAnim = this)
|
||||||
|
|
@ -518,7 +517,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryLayout -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryLayout -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_LAYOUT,
|
key = DataStoreData.LIBRARY_LAYOUT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryLayout = LibraryLayout.valueOf(this))
|
it.copy(libraryLayout = LibraryLayout.valueOf(this))
|
||||||
|
|
@ -526,7 +525,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryAutoGridSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryAutoGridSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_AUTO_GRID_SIZE,
|
key = DataStoreData.LIBRARY_AUTO_GRID_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryAutoGridSize = this)
|
it.copy(libraryAutoGridSize = this)
|
||||||
|
|
@ -534,7 +533,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryGridSize -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryGridSize -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_GRID_SIZE,
|
key = DataStoreData.LIBRARY_GRID_SIZE,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryGridSize = this)
|
it.copy(libraryGridSize = this)
|
||||||
|
|
@ -542,7 +541,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryReadButton -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryReadButton -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_READ_BUTTON,
|
key = DataStoreData.LIBRARY_READ_BUTTON,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryReadButton = this)
|
it.copy(libraryReadButton = this)
|
||||||
|
|
@ -550,7 +549,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryShowProgress -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryShowProgress -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_SHOW_PROGRESS,
|
key = DataStoreData.LIBRARY_SHOW_PROGRESS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryShowProgress = this)
|
it.copy(libraryShowProgress = this)
|
||||||
|
|
@ -558,7 +557,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryTitlePosition -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryTitlePosition -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_TITLE_POSITION,
|
key = DataStoreData.LIBRARY_TITLE_POSITION,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryTitlePosition = LibraryTitlePosition.valueOf(this))
|
it.copy(libraryTitlePosition = LibraryTitlePosition.valueOf(this))
|
||||||
|
|
@ -566,7 +565,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryShowBookCount -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryShowBookCount -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_SHOW_BOOK_COUNT,
|
key = DataStoreData.LIBRARY_SHOW_BOOK_COUNT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryShowBookCount = this)
|
it.copy(libraryShowBookCount = this)
|
||||||
|
|
@ -574,7 +573,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryShowCategoryTabs -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryShowCategoryTabs -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_SHOW_CATEGORY_TABS,
|
key = DataStoreData.LIBRARY_SHOW_CATEGORY_TABS,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryShowCategoryTabs = this)
|
it.copy(libraryShowCategoryTabs = this)
|
||||||
|
|
@ -582,7 +581,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryAlwaysShowDefaultTab -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryAlwaysShowDefaultTab -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_ALWAYS_SHOW_DEFAULT_TAB,
|
key = DataStoreData.LIBRARY_ALWAYS_SHOW_DEFAULT_TAB,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryAlwaysShowDefaultTab = this)
|
it.copy(libraryAlwaysShowDefaultTab = this)
|
||||||
|
|
@ -590,7 +589,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibrarySortOrder -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibrarySortOrder -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_SORT_ORDER,
|
key = DataStoreData.LIBRARY_SORT_ORDER,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(librarySortOrder = LibrarySortOrder.valueOf(this))
|
it.copy(librarySortOrder = LibrarySortOrder.valueOf(this))
|
||||||
|
|
@ -598,7 +597,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibrarySortOrderDescending -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibrarySortOrderDescending -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_SORT_ORDER_DESCENDING,
|
key = DataStoreData.LIBRARY_SORT_ORDER_DESCENDING,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(librarySortOrderDescending = this)
|
it.copy(librarySortOrderDescending = this)
|
||||||
|
|
@ -606,7 +605,7 @@ class MainModel @Inject constructor(
|
||||||
)
|
)
|
||||||
|
|
||||||
is MainEvent.OnChangeLibraryPerCategorySort -> handleDatastoreUpdate(
|
is MainEvent.OnChangeLibraryPerCategorySort -> handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.LIBRARY_PER_CATEGORY_SORT,
|
key = DataStoreData.LIBRARY_PER_CATEGORY_SORT,
|
||||||
value = event.value,
|
value = event.value,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(libraryPerCategorySort = this)
|
it.copy(libraryPerCategorySort = this)
|
||||||
|
|
@ -662,7 +661,7 @@ class MainModel @Inject constructor(
|
||||||
set.remove(event.value)
|
set.remove(event.value)
|
||||||
}
|
}
|
||||||
handleDatastoreUpdate(
|
handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_INCLUDED_FILTER_ITEMS,
|
key = DataStoreData.BROWSE_INCLUDED_FILTER_ITEMS,
|
||||||
value = set,
|
value = set,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browseIncludedFilterItems = toList())
|
it.copy(browseIncludedFilterItems = toList())
|
||||||
|
|
@ -678,7 +677,7 @@ class MainModel @Inject constructor(
|
||||||
set.remove(event.value)
|
set.remove(event.value)
|
||||||
}
|
}
|
||||||
handleDatastoreUpdate(
|
handleDatastoreUpdate(
|
||||||
key = DataStoreConstants.BROWSE_PINNED_PATHS,
|
key = DataStoreData.BROWSE_PINNED_PATHS,
|
||||||
value = set,
|
value = set,
|
||||||
updateState = {
|
updateState = {
|
||||||
it.copy(browsePinnedPaths = toList())
|
it.copy(browsePinnedPaths = toList())
|
||||||
|
|
@ -710,7 +709,7 @@ class MainModel @Inject constructor(
|
||||||
) {
|
) {
|
||||||
withContext(Dispatchers.Main.immediate) {
|
withContext(Dispatchers.Main.immediate) {
|
||||||
_state.update {
|
_state.update {
|
||||||
stateHandle[provideMainState()] = function(it)
|
stateHandle["main_state"] = function(it)
|
||||||
function(it)
|
function(it)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -13,11 +13,13 @@ import androidx.annotation.Keep
|
||||||
import androidx.compose.runtime.Immutable
|
import androidx.compose.runtime.Immutable
|
||||||
import androidx.datastore.preferences.core.Preferences
|
import androidx.datastore.preferences.core.Preferences
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
import ua.acclorite.book_story.core.data.CoreData
|
||||||
import ua.acclorite.book_story.presentation.browse.model.BrowseLayout
|
import ua.acclorite.book_story.presentation.browse.model.BrowseLayout
|
||||||
import ua.acclorite.book_story.presentation.browse.model.BrowseSortOrder
|
import ua.acclorite.book_story.presentation.browse.model.BrowseSortOrder
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibraryLayout
|
import ua.acclorite.book_story.presentation.library.model.LibraryLayout
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibrarySortOrder
|
import ua.acclorite.book_story.presentation.library.model.LibrarySortOrder
|
||||||
import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition
|
import ua.acclorite.book_story.presentation.library.model.LibraryTitlePosition
|
||||||
|
import ua.acclorite.book_story.presentation.main.data.DataStoreData
|
||||||
import ua.acclorite.book_story.presentation.main.model.DarkTheme
|
import ua.acclorite.book_story.presentation.main.model.DarkTheme
|
||||||
import ua.acclorite.book_story.presentation.main.model.HorizontalAlignment
|
import ua.acclorite.book_story.presentation.main.model.HorizontalAlignment
|
||||||
import ua.acclorite.book_story.presentation.main.model.PureDark
|
import ua.acclorite.book_story.presentation.main.model.PureDark
|
||||||
|
|
@ -28,11 +30,8 @@ import ua.acclorite.book_story.presentation.reader.model.ReaderHorizontalGesture
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation
|
import ua.acclorite.book_story.presentation.reader.model.ReaderScreenOrientation
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
||||||
import ua.acclorite.book_story.ui.common.constants.DataStoreConstants
|
import ua.acclorite.book_story.ui.reader.data.ReaderData
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideFonts
|
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideLanguages
|
|
||||||
import ua.acclorite.book_story.ui.theme.Theme
|
import ua.acclorite.book_story.ui.theme.Theme
|
||||||
import ua.acclorite.book_story.ui.theme.toTheme
|
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -47,7 +46,7 @@ data class MainState(
|
||||||
// General Settings
|
// General Settings
|
||||||
val language: String = provideDefaultValue {
|
val language: String = provideDefaultValue {
|
||||||
val locale = Locale.getDefault().language.take(2)
|
val locale = Locale.getDefault().language.take(2)
|
||||||
provideLanguages().any { locale == it.first }.run {
|
CoreData.languages.any { locale == it.first }.run {
|
||||||
if (this) locale
|
if (this) locale
|
||||||
else "en"// Default language.
|
else "en"// Default language.
|
||||||
}
|
}
|
||||||
|
|
@ -61,7 +60,7 @@ data class MainState(
|
||||||
val doublePressExit: Boolean = provideDefaultValue { false },
|
val doublePressExit: Boolean = provideDefaultValue { false },
|
||||||
|
|
||||||
// Reader Settings
|
// Reader Settings
|
||||||
val fontFamily: String = provideDefaultValue { provideFonts()[0].id },
|
val fontFamily: String = provideDefaultValue { ReaderData.fonts[0].id },
|
||||||
val fontThickness: ReaderFontThickness = provideDefaultValue { ReaderFontThickness.NORMAL },
|
val fontThickness: ReaderFontThickness = provideDefaultValue { ReaderFontThickness.NORMAL },
|
||||||
val isItalic: Boolean = provideDefaultValue { false },
|
val isItalic: Boolean = provideDefaultValue { false },
|
||||||
val fontSize: Int = provideDefaultValue { 16 },
|
val fontSize: Int = provideDefaultValue { 16 },
|
||||||
|
|
@ -150,14 +149,14 @@ data class MainState(
|
||||||
return (data[key.name] as? T)?.convert() ?: defaultState.default()
|
return (data[key.name] as? T)?.convert() ?: defaultState.default()
|
||||||
}
|
}
|
||||||
|
|
||||||
return DataStoreConstants.run {
|
return DataStoreData.run {
|
||||||
MainState(
|
MainState(
|
||||||
language = provideValue(
|
language = provideValue(
|
||||||
LANGUAGE
|
LANGUAGE
|
||||||
) { language },
|
) { language },
|
||||||
|
|
||||||
theme = provideValue(
|
theme = provideValue(
|
||||||
THEME, convert = { toTheme() }
|
THEME, convert = { Theme.valueOf(this) }
|
||||||
) { theme },
|
) { theme },
|
||||||
|
|
||||||
darkTheme = provideValue(
|
darkTheme = provideValue(
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
package ua.acclorite.book_story.presentation.main.data
|
||||||
|
|
||||||
import androidx.datastore.preferences.core.booleanPreferencesKey
|
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||||
import androidx.datastore.preferences.core.doublePreferencesKey
|
import androidx.datastore.preferences.core.doublePreferencesKey
|
||||||
|
|
@ -12,7 +12,7 @@ import androidx.datastore.preferences.core.intPreferencesKey
|
||||||
import androidx.datastore.preferences.core.stringPreferencesKey
|
import androidx.datastore.preferences.core.stringPreferencesKey
|
||||||
import androidx.datastore.preferences.core.stringSetPreferencesKey
|
import androidx.datastore.preferences.core.stringSetPreferencesKey
|
||||||
|
|
||||||
object DataStoreConstants {
|
object DataStoreData {
|
||||||
// General settings
|
// General settings
|
||||||
val LANGUAGE = stringPreferencesKey("language")
|
val LANGUAGE = stringPreferencesKey("language")
|
||||||
val THEME = stringPreferencesKey("theme")
|
val THEME = stringPreferencesKey("theme")
|
||||||
|
|
@ -35,6 +35,7 @@ import kotlinx.coroutines.sync.withLock
|
||||||
import kotlinx.coroutines.withContext
|
import kotlinx.coroutines.withContext
|
||||||
import kotlinx.coroutines.yield
|
import kotlinx.coroutines.yield
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.helpers.coerceAndPreventNaN
|
||||||
import ua.acclorite.book_story.core.ui.UIText
|
import ua.acclorite.book_story.core.ui.UIText
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText.Chapter
|
import ua.acclorite.book_story.domain.model.reader.ReaderText.Chapter
|
||||||
import ua.acclorite.book_story.domain.use_case.book.GetBookUseCase
|
import ua.acclorite.book_story.domain.use_case.book.GetBookUseCase
|
||||||
|
|
@ -44,10 +45,9 @@ import ua.acclorite.book_story.domain.use_case.history.GetHistoryForBookUseCase
|
||||||
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
import ua.acclorite.book_story.presentation.history.HistoryScreen
|
||||||
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
import ua.acclorite.book_story.presentation.library.LibraryScreen
|
||||||
import ua.acclorite.book_story.presentation.reader.model.Checkpoint
|
import ua.acclorite.book_story.presentation.reader.model.Checkpoint
|
||||||
import ua.acclorite.book_story.ui.common.util.coerceAndPreventNaN
|
import ua.acclorite.book_story.ui.common.helpers.launchActivity
|
||||||
import ua.acclorite.book_story.ui.common.util.launchActivity
|
import ua.acclorite.book_story.ui.common.helpers.setBrightness
|
||||||
import ua.acclorite.book_story.ui.common.util.setBrightness
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,7 @@ import androidx.core.view.WindowInsetsCompat
|
||||||
import androidx.hilt.navigation.compose.hiltViewModel
|
import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
import ua.acclorite.book_story.core.helpers.calculateProgress
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoScreen
|
import ua.acclorite.book_story.presentation.book_info.BookInfoScreen
|
||||||
import ua.acclorite.book_story.presentation.main.MainModel
|
import ua.acclorite.book_story.presentation.main.MainModel
|
||||||
import ua.acclorite.book_story.presentation.navigator.Screen
|
import ua.acclorite.book_story.presentation.navigator.Screen
|
||||||
|
|
@ -51,12 +52,11 @@ import ua.acclorite.book_story.presentation.reader.model.ReaderColorEffects
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
import ua.acclorite.book_story.presentation.reader.model.ReaderProgressCount
|
||||||
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
import ua.acclorite.book_story.presentation.reader.model.ReaderTextAlignment
|
||||||
import ua.acclorite.book_story.presentation.settings.SettingsModel
|
import ua.acclorite.book_story.presentation.settings.SettingsModel
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideFonts
|
import ua.acclorite.book_story.ui.common.helpers.LocalActivity
|
||||||
import ua.acclorite.book_story.ui.common.util.LocalActivity
|
import ua.acclorite.book_story.ui.common.helpers.setBrightness
|
||||||
import ua.acclorite.book_story.ui.common.util.calculateProgress
|
|
||||||
import ua.acclorite.book_story.ui.common.util.setBrightness
|
|
||||||
import ua.acclorite.book_story.ui.navigator.LocalNavigator
|
import ua.acclorite.book_story.ui.navigator.LocalNavigator
|
||||||
import ua.acclorite.book_story.ui.reader.ReaderContent
|
import ua.acclorite.book_story.ui.reader.ReaderContent
|
||||||
|
import ua.acclorite.book_story.ui.reader.data.ReaderData
|
||||||
import kotlin.math.roundToInt
|
import kotlin.math.roundToInt
|
||||||
|
|
||||||
@Parcelize
|
@Parcelize
|
||||||
|
|
@ -117,7 +117,7 @@ data class ReaderScreen(val bookId: Int) : Screen, Parcelable {
|
||||||
}
|
}
|
||||||
|
|
||||||
val fontFamily = remember(mainState.value.fontFamily) {
|
val fontFamily = remember(mainState.value.fontFamily) {
|
||||||
provideFonts().run {
|
ReaderData.fonts.run {
|
||||||
find {
|
find {
|
||||||
it.id == mainState.value.fontFamily
|
it.id == mainState.value.fontFamily
|
||||||
} ?: get(0)
|
} ?: get(0)
|
||||||
|
|
|
||||||
|
|
@ -15,11 +15,10 @@ import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
import ua.acclorite.book_story.domain.model.reader.ReaderText
|
||||||
import ua.acclorite.book_story.domain.model.reader.ReaderText.Chapter
|
import ua.acclorite.book_story.domain.model.reader.ReaderText.Chapter
|
||||||
import ua.acclorite.book_story.presentation.reader.model.Checkpoint
|
import ua.acclorite.book_story.presentation.reader.model.Checkpoint
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideEmptyBook
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class ReaderState(
|
data class ReaderState(
|
||||||
val book: Book = provideEmptyBook(),
|
val book: Book = Book.default,
|
||||||
val text: List<ReaderText> = emptyList(),
|
val text: List<ReaderText> = emptyList(),
|
||||||
val listState: LazyListState = LazyListState(),
|
val listState: LazyListState = LazyListState(),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,7 @@ import ua.acclorite.book_story.domain.use_case.color_preset.SelectColorPresetUse
|
||||||
import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPresetUseCase
|
import ua.acclorite.book_story.domain.use_case.color_preset.UpdateColorPresetUseCase
|
||||||
import ua.acclorite.book_story.domain.use_case.permission.GrantPersistableUriPermissionUseCase
|
import ua.acclorite.book_story.domain.use_case.permission.GrantPersistableUriPermissionUseCase
|
||||||
import ua.acclorite.book_story.domain.use_case.permission.ReleasePersistableUriPermissionUseCase
|
import ua.acclorite.book_story.domain.use_case.permission.ReleasePersistableUriPermissionUseCase
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideDefaultColorPreset
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
|
||||||
import javax.inject.Inject
|
import javax.inject.Inject
|
||||||
import kotlin.random.Random
|
import kotlin.random.Random
|
||||||
|
|
||||||
|
|
@ -79,7 +78,7 @@ class SettingsModel @Inject constructor(
|
||||||
var colorPresets = getColorPresetsUseCase()
|
var colorPresets = getColorPresetsUseCase()
|
||||||
|
|
||||||
if (colorPresets.isEmpty()) {
|
if (colorPresets.isEmpty()) {
|
||||||
updateColorPresetUseCase(provideDefaultColorPreset())
|
updateColorPresetUseCase(ColorPreset.default)
|
||||||
getColorPresetsUseCase().first().select()
|
getColorPresetsUseCase().first().select()
|
||||||
colorPresets = getColorPresetsUseCase()
|
colorPresets = getColorPresetsUseCase()
|
||||||
}
|
}
|
||||||
|
|
@ -453,7 +452,7 @@ class SettingsModel @Inject constructor(
|
||||||
addColorPresetJob = launch {
|
addColorPresetJob = launch {
|
||||||
yield()
|
yield()
|
||||||
|
|
||||||
val newColorPreset = provideDefaultColorPreset().copy(
|
val newColorPreset = ColorPreset.default.copy(
|
||||||
backgroundColor = event.backgroundColor,
|
backgroundColor = event.backgroundColor,
|
||||||
fontColor = event.fontColor
|
fontColor = event.fontColor
|
||||||
)
|
)
|
||||||
|
|
@ -572,7 +571,7 @@ class SettingsModel @Inject constructor(
|
||||||
val selectedPreset = presets.firstOrNull { it.isSelected }
|
val selectedPreset = presets.firstOrNull { it.isSelected }
|
||||||
|
|
||||||
if (selectedPreset == null) {
|
if (selectedPreset == null) {
|
||||||
return provideDefaultColorPreset()
|
return ColorPreset.default
|
||||||
}
|
}
|
||||||
|
|
||||||
return selectedPreset
|
return selectedPreset
|
||||||
|
|
|
||||||
|
|
@ -11,12 +11,11 @@ import androidx.compose.runtime.Immutable
|
||||||
import ua.acclorite.book_story.domain.model.library.Category
|
import ua.acclorite.book_story.domain.model.library.Category
|
||||||
import ua.acclorite.book_story.domain.model.library.CategorySort
|
import ua.acclorite.book_story.domain.model.library.CategorySort
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideDefaultColorPreset
|
|
||||||
|
|
||||||
@Immutable
|
@Immutable
|
||||||
data class SettingsState(
|
data class SettingsState(
|
||||||
val colorPresets: List<ColorPreset> = emptyList(),
|
val colorPresets: List<ColorPreset> = emptyList(),
|
||||||
val selectedColorPreset: ColorPreset = provideDefaultColorPreset(),
|
val selectedColorPreset: ColorPreset = ColorPreset.default,
|
||||||
val animateColorPreset: Boolean = false,
|
val animateColorPreset: Boolean = false,
|
||||||
val colorPresetListState: LazyListState = LazyListState(),
|
val colorPresetListState: LazyListState = LazyListState(),
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -17,15 +17,15 @@ import androidx.hilt.navigation.compose.hiltViewModel
|
||||||
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
import androidx.lifecycle.compose.collectAsStateWithLifecycle
|
||||||
import kotlinx.parcelize.IgnoredOnParcel
|
import kotlinx.parcelize.IgnoredOnParcel
|
||||||
import kotlinx.parcelize.Parcelize
|
import kotlinx.parcelize.Parcelize
|
||||||
|
import ua.acclorite.book_story.core.data.CoreData
|
||||||
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
import ua.acclorite.book_story.presentation.browse.BrowseScreen
|
||||||
import ua.acclorite.book_story.presentation.help.HelpScreen
|
import ua.acclorite.book_story.presentation.help.HelpScreen
|
||||||
import ua.acclorite.book_story.presentation.main.MainEvent
|
import ua.acclorite.book_story.presentation.main.MainEvent
|
||||||
import ua.acclorite.book_story.presentation.main.MainModel
|
import ua.acclorite.book_story.presentation.main.MainModel
|
||||||
import ua.acclorite.book_story.presentation.navigator.Screen
|
import ua.acclorite.book_story.presentation.navigator.Screen
|
||||||
import ua.acclorite.book_story.presentation.navigator.StackEvent
|
import ua.acclorite.book_story.presentation.navigator.StackEvent
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideLanguages
|
import ua.acclorite.book_story.ui.common.helpers.LocalActivity
|
||||||
import ua.acclorite.book_story.ui.common.model.ButtonItem
|
import ua.acclorite.book_story.ui.common.model.ButtonItem
|
||||||
import ua.acclorite.book_story.ui.common.util.LocalActivity
|
|
||||||
import ua.acclorite.book_story.ui.navigator.LocalNavigator
|
import ua.acclorite.book_story.ui.navigator.LocalNavigator
|
||||||
import ua.acclorite.book_story.ui.start.StartContent
|
import ua.acclorite.book_story.ui.start.StartContent
|
||||||
|
|
||||||
|
|
@ -61,7 +61,7 @@ object StartScreen : Screen, Parcelable {
|
||||||
val stackEvent = remember { mutableStateOf(StackEvent.Default) }
|
val stackEvent = remember { mutableStateOf(StackEvent.Default) }
|
||||||
|
|
||||||
val languages = remember(mainState.value.language) {
|
val languages = remember(mainState.value.language) {
|
||||||
provideLanguages().sortedBy { it.second }.map {
|
CoreData.languages.sortedBy { it.second }.map {
|
||||||
ButtonItem(
|
ButtonItem(
|
||||||
id = it.first,
|
id = it.first,
|
||||||
title = it.second,
|
title = it.second,
|
||||||
|
|
|
||||||
|
|
@ -19,8 +19,8 @@ import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.presentation.about.AboutEvent
|
import ua.acclorite.book_story.presentation.about.AboutEvent
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideAboutBadges
|
import ua.acclorite.book_story.ui.about.data.AboutData
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AboutBadges(
|
fun AboutBadges(
|
||||||
|
|
@ -38,7 +38,7 @@ fun AboutBadges(
|
||||||
horizontalArrangement = Arrangement.spacedBy(13.dp)
|
horizontalArrangement = Arrangement.spacedBy(13.dp)
|
||||||
) {
|
) {
|
||||||
items(
|
items(
|
||||||
provideAboutBadges(),
|
AboutData.badges,
|
||||||
key = { it.id }
|
key = { it.id }
|
||||||
) { badge ->
|
) { badge ->
|
||||||
AboutBadgeItem(badge = badge) {
|
AboutBadgeItem(badge = badge) {
|
||||||
|
|
|
||||||
|
|
@ -26,13 +26,9 @@ import androidx.compose.ui.res.painterResource
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.data.LinkData
|
||||||
import ua.acclorite.book_story.presentation.about.AboutEvent
|
import ua.acclorite.book_story.presentation.about.AboutEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideContributorsPage
|
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideIssuesPage
|
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideReleasesPage
|
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideSupportPage
|
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideTranslationPage
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun AboutLayout(
|
fun AboutLayout(
|
||||||
|
|
@ -85,7 +81,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = provideReleasesPage(),
|
page = LinkData.RELEASES,
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -99,7 +95,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = provideIssuesPage(),
|
page = LinkData.ISSUES,
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -114,7 +110,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = provideContributorsPage(),
|
page = LinkData.CONTRIBUTORS,
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -146,7 +142,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = provideTranslationPage(),
|
page = LinkData.TRANSLATION,
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
@ -160,7 +156,7 @@ fun AboutLayout(
|
||||||
) {
|
) {
|
||||||
navigateToBrowserPage(
|
navigateToBrowserPage(
|
||||||
AboutEvent.OnNavigateToBrowserPage(
|
AboutEvent.OnNavigateToBrowserPage(
|
||||||
page = provideSupportPage(),
|
page = LinkData.SUPPORT,
|
||||||
context = context
|
context = context
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.ui.about.data
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.ui.about.model.Badge
|
||||||
|
|
||||||
|
object AboutData {
|
||||||
|
val badges = persistentListOf(
|
||||||
|
Badge(
|
||||||
|
id = "github",
|
||||||
|
drawable = R.drawable.github,
|
||||||
|
imageVector = null,
|
||||||
|
contentDescription = R.string.github_badge,
|
||||||
|
url = "https://www.github.com/Acclorite"
|
||||||
|
),
|
||||||
|
Badge(
|
||||||
|
id = "reddit",
|
||||||
|
drawable = R.drawable.reddit,
|
||||||
|
imageVector = null,
|
||||||
|
contentDescription = R.string.reddit_badge,
|
||||||
|
url = "https://www.reddit.com/user/Acclorite/"
|
||||||
|
),
|
||||||
|
Badge(
|
||||||
|
id = "tryzub",
|
||||||
|
drawable = R.drawable.tryzub,
|
||||||
|
imageVector = null,
|
||||||
|
contentDescription = R.string.tryzub_badge,
|
||||||
|
url = null
|
||||||
|
),
|
||||||
|
Badge(
|
||||||
|
id = "gitlab",
|
||||||
|
drawable = R.drawable.gitlab,
|
||||||
|
imageVector = null,
|
||||||
|
contentDescription = R.string.gitlab_badge,
|
||||||
|
url = "https://www.gitlab.com/Acclorite"
|
||||||
|
),
|
||||||
|
Badge(
|
||||||
|
id = "codeberg",
|
||||||
|
drawable = R.drawable.codeberg,
|
||||||
|
imageVector = null,
|
||||||
|
contentDescription = R.string.codeberg_badge,
|
||||||
|
url = "https://www.codeberg.org/Acclorite"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -18,12 +18,12 @@ import androidx.compose.ui.platform.LocalContext
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.data.ExtensionsData
|
||||||
import ua.acclorite.book_story.data.model.file.CachedFileCompat
|
import ua.acclorite.book_story.data.model.file.CachedFileCompat
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.components.modal_bottom_sheet.ModalBottomSheet
|
import ua.acclorite.book_story.ui.common.components.modal_bottom_sheet.ModalBottomSheet
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideExtensions
|
|
||||||
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
|
import ua.acclorite.book_story.ui.settings.components.SettingsSubcategoryTitle
|
||||||
import java.text.SimpleDateFormat
|
import java.text.SimpleDateFormat
|
||||||
import java.util.Date
|
import java.util.Date
|
||||||
|
|
@ -60,7 +60,7 @@ fun BookInfoDetailsBottomSheet(
|
||||||
|
|
||||||
val fileExists = remember(cachedFile) {
|
val fileExists = remember(cachedFile) {
|
||||||
cachedFile.let {
|
cachedFile.let {
|
||||||
it != null && it.canAccess() && !it.isDirectory && provideExtensions()
|
it != null && it.canAccess() && !it.isDirectory && ExtensionsData.fileExtensions
|
||||||
.any { ext ->
|
.any { ext ->
|
||||||
it.name.endsWith(ext, ignoreCase = true)
|
it.name.endsWith(ext, ignoreCase = true)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -20,7 +20,7 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayout(
|
fun BookInfoLayout(
|
||||||
|
|
@ -38,7 +38,7 @@ fun BookInfoLayout(
|
||||||
LazyColumnWithScrollbar(
|
LazyColumnWithScrollbar(
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
state = listState,
|
state = listState,
|
||||||
scrollbarSettings = providePrimaryScrollbar(false),
|
scrollbarSettings = ScrollbarData.primaryScrollbar,
|
||||||
contentPadding = PaddingValues(bottom = 18.dp)
|
contentPadding = PaddingValues(bottom = 18.dp)
|
||||||
) {
|
) {
|
||||||
item {
|
item {
|
||||||
|
|
|
||||||
|
|
@ -15,9 +15,9 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.res.stringResource
|
import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.helpers.calculateProgress
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.calculateProgress
|
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutButton(
|
fun BookInfoLayoutButton(
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutDescription(
|
fun BookInfoLayoutDescription(
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutInfoAuthor(
|
fun BookInfoLayoutInfoAuthor(
|
||||||
|
|
|
||||||
|
|
@ -28,7 +28,7 @@ import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.AsyncCoverImage
|
import ua.acclorite.book_story.ui.common.components.common.AsyncCoverImage
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutInfoCover(
|
fun BookInfoLayoutInfoCover(
|
||||||
|
|
|
||||||
|
|
@ -17,9 +17,9 @@ import androidx.compose.ui.Alignment
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.text.font.FontWeight
|
import androidx.compose.ui.text.font.FontWeight
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
|
import ua.acclorite.book_story.core.helpers.calculateProgress
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.calculateProgress
|
|
||||||
|
|
||||||
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
@OptIn(ExperimentalMaterial3ExpressiveApi::class)
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ import androidx.compose.ui.Modifier
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
import ua.acclorite.book_story.domain.model.library.Book
|
||||||
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
import ua.acclorite.book_story.presentation.book_info.BookInfoEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BookInfoLayoutInfoTitle(
|
fun BookInfoLayoutInfoTitle(
|
||||||
|
|
|
||||||
|
|
@ -25,7 +25,7 @@ import ua.acclorite.book_story.presentation.browse.BrowseEvent
|
||||||
import ua.acclorite.book_story.presentation.library.model.SelectableNullableBook
|
import ua.acclorite.book_story.presentation.library.model.SelectableNullableBook
|
||||||
import ua.acclorite.book_story.ui.common.components.dialog.Dialog
|
import ua.acclorite.book_story.ui.common.components.dialog.Dialog
|
||||||
import ua.acclorite.book_story.ui.common.components.progress_indicator.CircularProgressIndicator
|
import ua.acclorite.book_story.ui.common.components.progress_indicator.CircularProgressIndicator
|
||||||
import ua.acclorite.book_story.ui.common.util.showToast
|
import ua.acclorite.book_story.ui.common.helpers.showToast
|
||||||
import java.util.UUID
|
import java.util.UUID
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
|
|
|
||||||
|
|
@ -21,7 +21,7 @@ import ua.acclorite.book_story.presentation.browse.model.GroupedFiles
|
||||||
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyVerticalGridWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyVerticalGridWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.components.common.header
|
import ua.acclorite.book_story.ui.common.components.common.header
|
||||||
import ua.acclorite.book_story.ui.common.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseGridLayout(
|
fun BrowseGridLayout(
|
||||||
|
|
@ -38,7 +38,7 @@ fun BrowseGridLayout(
|
||||||
state = gridState,
|
state = gridState,
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
contentPadding = PaddingValues(horizontal = 8.dp),
|
contentPadding = PaddingValues(horizontal = 8.dp),
|
||||||
scrollbarSettings = providePrimaryScrollbar(false)
|
scrollbarSettings = ScrollbarData.primaryScrollbar
|
||||||
) {
|
) {
|
||||||
groupedFiles.forEach { group ->
|
groupedFiles.forEach { group ->
|
||||||
stickyHeader {
|
stickyHeader {
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ import androidx.compose.ui.res.stringResource
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseLayoutHeader(
|
fun BrowseLayoutHeader(
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.presentation.browse.model.GroupedFiles
|
import ua.acclorite.book_story.presentation.browse.model.GroupedFiles
|
||||||
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
import ua.acclorite.book_story.presentation.browse.model.SelectableFile
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun BrowseListLayout(
|
fun BrowseListLayout(
|
||||||
|
|
@ -32,7 +32,7 @@ fun BrowseListLayout(
|
||||||
state = listState,
|
state = listState,
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
contentPadding = PaddingValues(horizontal = 8.dp),
|
contentPadding = PaddingValues(horizontal = 8.dp),
|
||||||
scrollbarSettings = providePrimaryScrollbar(false)
|
scrollbarSettings = ScrollbarData.primaryScrollbar
|
||||||
) {
|
) {
|
||||||
groupedFiles.forEach { group ->
|
groupedFiles.forEach { group ->
|
||||||
stickyHeader {
|
stickyHeader {
|
||||||
|
|
|
||||||
|
|
@ -20,14 +20,14 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import my.nanihadesuka.compose.InternalLazyColumnScrollbar
|
import my.nanihadesuka.compose.InternalLazyColumnScrollbar
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideSecondaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LazyColumnWithScrollbar(
|
fun LazyColumnWithScrollbar(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
parentModifier: Modifier = Modifier,
|
parentModifier: Modifier = Modifier,
|
||||||
state: LazyListState = rememberLazyListState(),
|
state: LazyListState = rememberLazyListState(),
|
||||||
scrollbarSettings: ScrollbarSettings = provideSecondaryScrollbar(),
|
scrollbarSettings: ScrollbarSettings = ScrollbarData.secondaryScrollbar,
|
||||||
enableScrollbar: Boolean = true,
|
enableScrollbar: Boolean = true,
|
||||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||||
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
||||||
|
|
|
||||||
|
|
@ -21,14 +21,14 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import my.nanihadesuka.compose.InternalLazyVerticalGridScrollbar
|
import my.nanihadesuka.compose.InternalLazyVerticalGridScrollbar
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideSecondaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun LazyVerticalGridWithScrollbar(
|
fun LazyVerticalGridWithScrollbar(
|
||||||
modifier: Modifier = Modifier,
|
modifier: Modifier = Modifier,
|
||||||
columns: GridCells,
|
columns: GridCells,
|
||||||
state: LazyGridState = rememberLazyGridState(),
|
state: LazyGridState = rememberLazyGridState(),
|
||||||
scrollbarSettings: ScrollbarSettings = provideSecondaryScrollbar(),
|
scrollbarSettings: ScrollbarSettings = ScrollbarData.secondaryScrollbar,
|
||||||
enableScrollbar: Boolean = true,
|
enableScrollbar: Boolean = true,
|
||||||
contentPadding: PaddingValues = PaddingValues(0.dp),
|
contentPadding: PaddingValues = PaddingValues(0.dp),
|
||||||
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
verticalArrangement: Arrangement.Vertical = Arrangement.Top,
|
||||||
|
|
|
||||||
|
|
@ -41,8 +41,8 @@ import androidx.compose.ui.unit.LayoutDirection
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.ui.common.components.common.AnimatedVisibility
|
import ua.acclorite.book_story.ui.common.components.common.AnimatedVisibility
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.providePrimaryScrollbar
|
import ua.acclorite.book_story.ui.common.data.ScrollbarData
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Modal Drawer.
|
* Modal Drawer.
|
||||||
|
|
@ -145,7 +145,7 @@ fun ModalDrawer(
|
||||||
LazyColumnWithScrollbar(
|
LazyColumnWithScrollbar(
|
||||||
state = rememberLazyListState(startIndex),
|
state = rememberLazyListState(startIndex),
|
||||||
modifier = Modifier.fillMaxSize(),
|
modifier = Modifier.fillMaxSize(),
|
||||||
scrollbarSettings = providePrimaryScrollbar(),
|
scrollbarSettings = ScrollbarData.primarySelectableScrollbar,
|
||||||
contentPadding = PaddingValues(vertical = 9.dp)
|
contentPadding = PaddingValues(vertical = 9.dp)
|
||||||
) {
|
) {
|
||||||
content()
|
content()
|
||||||
|
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
import ua.acclorite.book_story.R
|
|
||||||
import ua.acclorite.book_story.ui.about.model.Badge
|
|
||||||
|
|
||||||
fun provideAboutBadges() = listOf(
|
|
||||||
Badge(
|
|
||||||
id = "github",
|
|
||||||
drawable = R.drawable.github,
|
|
||||||
imageVector = null,
|
|
||||||
contentDescription = R.string.github_badge,
|
|
||||||
url = "https://www.github.com/Acclorite"
|
|
||||||
),
|
|
||||||
Badge(
|
|
||||||
id = "reddit",
|
|
||||||
drawable = R.drawable.reddit,
|
|
||||||
imageVector = null,
|
|
||||||
contentDescription = R.string.reddit_badge,
|
|
||||||
url = "https://www.reddit.com/user/Acclorite/"
|
|
||||||
),
|
|
||||||
Badge(
|
|
||||||
id = "tryzub",
|
|
||||||
drawable = R.drawable.tryzub,
|
|
||||||
imageVector = null,
|
|
||||||
contentDescription = R.string.tryzub_badge,
|
|
||||||
url = null
|
|
||||||
),
|
|
||||||
Badge(
|
|
||||||
id = "gitlab",
|
|
||||||
drawable = R.drawable.gitlab,
|
|
||||||
imageVector = null,
|
|
||||||
contentDescription = R.string.gitlab_badge,
|
|
||||||
url = "https://www.gitlab.com/Acclorite"
|
|
||||||
),
|
|
||||||
Badge(
|
|
||||||
id = "codeberg",
|
|
||||||
drawable = R.drawable.codeberg,
|
|
||||||
imageVector = null,
|
|
||||||
contentDescription = R.string.codeberg_badge,
|
|
||||||
url = "https://www.codeberg.org/Acclorite"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
@ -1,41 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
@file:Suppress("SameReturnValue")
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
import androidx.compose.ui.graphics.Color
|
|
||||||
import ua.acclorite.book_story.core.ui.UIText
|
|
||||||
import ua.acclorite.book_story.domain.model.library.Book
|
|
||||||
import ua.acclorite.book_story.domain.model.reader.ColorPreset
|
|
||||||
|
|
||||||
// Main State
|
|
||||||
fun provideMainState() = "main_state"
|
|
||||||
|
|
||||||
// Empty Book
|
|
||||||
fun provideEmptyBook() = Book(
|
|
||||||
id = -1,
|
|
||||||
title = "",
|
|
||||||
author = UIText.StringValue(""),
|
|
||||||
description = null,
|
|
||||||
filePath = "",
|
|
||||||
coverImage = null,
|
|
||||||
scrollIndex = 0,
|
|
||||||
scrollOffset = 0,
|
|
||||||
progress = 0f,
|
|
||||||
lastOpened = null,
|
|
||||||
categories = emptyList()
|
|
||||||
)
|
|
||||||
|
|
||||||
// Default Color Preset
|
|
||||||
fun provideDefaultColorPreset() = ColorPreset(
|
|
||||||
id = -1,
|
|
||||||
name = null,
|
|
||||||
backgroundColor = Color(0xFFFAF8FF), // Blue Light Surface (hardcoded)
|
|
||||||
fontColor = Color(0xFF44464F), // Blue Light OnSurfaceVariant (hardcoded)
|
|
||||||
isSelected = false
|
|
||||||
)
|
|
||||||
|
|
@ -1,98 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
import ua.acclorite.book_story.R
|
|
||||||
import ua.acclorite.book_story.core.ui.UIText
|
|
||||||
import ua.acclorite.book_story.ui.about.model.Credit
|
|
||||||
|
|
||||||
fun provideCredits() = listOf(
|
|
||||||
Credit(
|
|
||||||
name = "Tachiyomi (Mihon)",
|
|
||||||
source = "GitHub",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_design),
|
|
||||||
UIText.StringResource(R.string.credits_ideas),
|
|
||||||
UIText.StringValue("Readme")
|
|
||||||
),
|
|
||||||
website = "https://www.github.com/mihonapp/mihon"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Kitsune",
|
|
||||||
source = "GitHub",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_updates),
|
|
||||||
UIText.StringResource(R.string.credits_ideas)
|
|
||||||
),
|
|
||||||
website = "https://www.github.com/Drumber/Kitsune"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Voyager",
|
|
||||||
source = "Voyager Website",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_ideas)
|
|
||||||
),
|
|
||||||
website = "https://voyager.adriel.cafe/"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Material Design Icons",
|
|
||||||
source = "Google Fonts",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_icon)
|
|
||||||
),
|
|
||||||
website = "https://fonts.google.com/icons"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Material Design Fonts",
|
|
||||||
source = "Google Fonts",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_fonts)
|
|
||||||
),
|
|
||||||
website = "https://fonts.google.com"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Weblate",
|
|
||||||
source = "Hosted Weblate",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_translation),
|
|
||||||
UIText.StringResource(R.string.credits_contribution)
|
|
||||||
),
|
|
||||||
website = "https://hosted.weblate.org/projects/book-story"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "OpenDyslexic Font",
|
|
||||||
source = "OpenDyslexic Website",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_fonts)
|
|
||||||
),
|
|
||||||
website = "https://opendyslexic.org"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "GitLab Badge",
|
|
||||||
source = "Censorship Website",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_icon)
|
|
||||||
),
|
|
||||||
website = "https://censorship.no/en/index.html"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "GitHub Badge",
|
|
||||||
source = "GitHub",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_icon)
|
|
||||||
),
|
|
||||||
website = "https://github.com/Kunzisoft/Github-badge"
|
|
||||||
),
|
|
||||||
Credit(
|
|
||||||
name = "Codeberg Badge",
|
|
||||||
source = "Codeberg",
|
|
||||||
credits = listOf(
|
|
||||||
UIText.StringResource(R.string.credits_icon)
|
|
||||||
),
|
|
||||||
website = "https://codeberg.org/Codeberg/GetItOnCodeberg"
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
@ -1,152 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
import androidx.compose.ui.res.stringResource
|
|
||||||
import ua.acclorite.book_story.R
|
|
||||||
import ua.acclorite.book_story.ui.help.HelpAnnotation
|
|
||||||
import ua.acclorite.book_story.ui.help.model.HelpTip
|
|
||||||
|
|
||||||
fun provideHelpTips() = listOf(
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_add_books,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_add_books_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_add_books_2))
|
|
||||||
}
|
|
||||||
append(". ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_add_books_3) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_add_books_4))
|
|
||||||
}
|
|
||||||
append(".")
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_customize_app,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_app_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_app_2))
|
|
||||||
}
|
|
||||||
append(". ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_app_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_move_or_delete_books,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_2))
|
|
||||||
}
|
|
||||||
append(". ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_edit_book,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_edit_book_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_edit_book_2))
|
|
||||||
}
|
|
||||||
append(" ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_edit_book_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_read_book,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_read_book_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_read_book_2))
|
|
||||||
}
|
|
||||||
append(". ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_read_book_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_customize_reader,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_reader_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_reader_2))
|
|
||||||
}
|
|
||||||
append(" ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_customize_reader_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_manage_history,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_manage_history_1) + " ")
|
|
||||||
|
|
||||||
HelpAnnotation {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_manage_history_2))
|
|
||||||
}
|
|
||||||
append(". ")
|
|
||||||
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_manage_history_3))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_use_tooltip,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_use_tooltip_1))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_use_double_click_translation,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_use_double_click_translation_1))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_create_color_presets,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_create_color_presets_1))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_use_color_presets,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_use_color_presets_1))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
|
|
||||||
HelpTip(
|
|
||||||
title = R.string.help_title_how_to_use_perception_expander,
|
|
||||||
description = {
|
|
||||||
append(stringResource(id = R.string.help_desc_how_to_use_perception_expander_1))
|
|
||||||
}
|
|
||||||
),
|
|
||||||
)
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
fun provideLanguages() = listOf(
|
|
||||||
Pair("en", "English"),
|
|
||||||
Pair("uk", "Українська"),
|
|
||||||
Pair("de", "Deutsch"),
|
|
||||||
Pair("ar", "اَلْعَرَبِيَّةُ"),
|
|
||||||
Pair("es", "Español"),
|
|
||||||
Pair("tr", "Türkçe"),
|
|
||||||
Pair("fr", "Français"),
|
|
||||||
Pair("pl", "Polski"),
|
|
||||||
Pair("it", "Italiano"),
|
|
||||||
Pair("zh", "汉语"),
|
|
||||||
Pair("hi", "हिन्दी"),
|
|
||||||
// Currently as "pt" (which is Portuguese) instead of "pt-BR"
|
|
||||||
Pair("pt", "Português (Brasil)"),
|
|
||||||
Pair("ta", "தமிழ்"),
|
|
||||||
Pair("ml", "മലയാളം"),
|
|
||||||
Pair("cs", "Čeština"),
|
|
||||||
Pair("ro", "Română"),
|
|
||||||
Pair("be", "Беларуская"),
|
|
||||||
Pair("ja", "日本語"),
|
|
||||||
)
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
@file:Suppress("SameReturnValue")
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
fun provideReleasesPage() =
|
|
||||||
"https://www.github.com/Acclorite/book-story/releases/latest"
|
|
||||||
|
|
||||||
fun provideIssuesPage() =
|
|
||||||
"https://www.github.com/Acclorite/book-story/issues"
|
|
||||||
|
|
||||||
fun provideContributorsPage() =
|
|
||||||
"https://github.com/Acclorite/book-story/graphs/contributors"
|
|
||||||
|
|
||||||
fun provideTranslationPage() =
|
|
||||||
"https://hosted.weblate.org/projects/book-story"
|
|
||||||
|
|
||||||
fun provideSupportPage() =
|
|
||||||
"https://patreon.com/Acclorite"
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
import androidx.compose.material3.MaterialTheme
|
|
||||||
import androidx.compose.runtime.Composable
|
|
||||||
import androidx.compose.ui.graphics.RectangleShape
|
|
||||||
import androidx.compose.ui.unit.dp
|
|
||||||
import my.nanihadesuka.compose.ScrollbarSelectionMode
|
|
||||||
import my.nanihadesuka.compose.ScrollbarSettings
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun providePrimaryScrollbar(canSelect: Boolean = true) = ScrollbarSettings(
|
|
||||||
thumbUnselectedColor = MaterialTheme.colorScheme.secondary,
|
|
||||||
thumbSelectedColor = MaterialTheme.colorScheme.secondary.copy(0.8f),
|
|
||||||
hideDelayMillis = 2000,
|
|
||||||
durationAnimationMillis = 300,
|
|
||||||
selectionMode = if (canSelect) ScrollbarSelectionMode.Thumb else ScrollbarSelectionMode.Disabled,
|
|
||||||
thumbThickness = 8.dp,
|
|
||||||
scrollbarPadding = 4.dp
|
|
||||||
)
|
|
||||||
|
|
||||||
@Composable
|
|
||||||
fun provideSecondaryScrollbar() = ScrollbarSettings(
|
|
||||||
thumbUnselectedColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.5f),
|
|
||||||
hideDelayMillis = 500,
|
|
||||||
durationAnimationMillis = 200,
|
|
||||||
thumbMinLength = 0.4f,
|
|
||||||
selectionMode = ScrollbarSelectionMode.Disabled,
|
|
||||||
thumbThickness = 4.dp,
|
|
||||||
thumbShape = RectangleShape,
|
|
||||||
hideDisplacement = 0.dp,
|
|
||||||
scrollbarPadding = 0.dp
|
|
||||||
)
|
|
||||||
|
|
@ -1,24 +0,0 @@
|
||||||
/*
|
|
||||||
* Book's Story — free and open-source Material You eBook reader.
|
|
||||||
* Copyright (C) 2024-2025 Acclorite
|
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.constants
|
|
||||||
|
|
||||||
fun provideExtensions() = listOf(
|
|
||||||
".epub",
|
|
||||||
".pdf",
|
|
||||||
".fb2",
|
|
||||||
".txt",
|
|
||||||
".html",
|
|
||||||
".htm",
|
|
||||||
".md"
|
|
||||||
)
|
|
||||||
|
|
||||||
fun provideImageExtensions() = listOf(
|
|
||||||
".png",
|
|
||||||
".jpg",
|
|
||||||
".jpeg",
|
|
||||||
".gif"
|
|
||||||
)
|
|
||||||
|
|
@ -0,0 +1,51 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.ui.common.data
|
||||||
|
|
||||||
|
import androidx.compose.material3.MaterialTheme
|
||||||
|
import androidx.compose.runtime.Composable
|
||||||
|
import androidx.compose.ui.graphics.RectangleShape
|
||||||
|
import androidx.compose.ui.unit.dp
|
||||||
|
import my.nanihadesuka.compose.ScrollbarSelectionMode
|
||||||
|
import my.nanihadesuka.compose.ScrollbarSettings
|
||||||
|
|
||||||
|
object ScrollbarData {
|
||||||
|
val primarySelectableScrollbar
|
||||||
|
@Composable get() = ScrollbarSettings(
|
||||||
|
thumbUnselectedColor = MaterialTheme.colorScheme.secondary,
|
||||||
|
thumbSelectedColor = MaterialTheme.colorScheme.secondary.copy(0.8f),
|
||||||
|
hideDelayMillis = 2000,
|
||||||
|
durationAnimationMillis = 300,
|
||||||
|
selectionMode = ScrollbarSelectionMode.Thumb,
|
||||||
|
thumbThickness = 8.dp,
|
||||||
|
scrollbarPadding = 4.dp
|
||||||
|
)
|
||||||
|
|
||||||
|
val primaryScrollbar
|
||||||
|
@Composable get() = ScrollbarSettings(
|
||||||
|
thumbUnselectedColor = MaterialTheme.colorScheme.secondary,
|
||||||
|
thumbSelectedColor = MaterialTheme.colorScheme.secondary.copy(0.8f),
|
||||||
|
hideDelayMillis = 2000,
|
||||||
|
durationAnimationMillis = 300,
|
||||||
|
selectionMode = ScrollbarSelectionMode.Disabled,
|
||||||
|
thumbThickness = 8.dp,
|
||||||
|
scrollbarPadding = 4.dp
|
||||||
|
)
|
||||||
|
|
||||||
|
val secondaryScrollbar
|
||||||
|
@Composable get() = ScrollbarSettings(
|
||||||
|
thumbUnselectedColor = MaterialTheme.colorScheme.onSurfaceVariant.copy(0.5f),
|
||||||
|
hideDelayMillis = 500,
|
||||||
|
durationAnimationMillis = 200,
|
||||||
|
thumbMinLength = 0.4f,
|
||||||
|
selectionMode = ScrollbarSelectionMode.Disabled,
|
||||||
|
thumbThickness = 4.dp,
|
||||||
|
thumbShape = RectangleShape,
|
||||||
|
hideDisplacement = 0.dp,
|
||||||
|
scrollbarPadding = 0.dp
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.util
|
package ua.acclorite.book_story.ui.common.helpers
|
||||||
|
|
||||||
import android.annotation.SuppressLint
|
import android.annotation.SuppressLint
|
||||||
import android.content.Intent
|
import android.content.Intent
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.util
|
package ua.acclorite.book_story.ui.common.helpers
|
||||||
|
|
||||||
import androidx.compose.foundation.combinedClickable
|
import androidx.compose.foundation.combinedClickable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
|
|
@ -4,7 +4,7 @@
|
||||||
* SPDX-License-Identifier: GPL-3.0-only
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
package ua.acclorite.book_story.ui.common.util
|
package ua.acclorite.book_story.ui.common.helpers
|
||||||
|
|
||||||
import android.content.Context
|
import android.content.Context
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
|
|
@ -16,7 +16,7 @@ import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.platform.LocalContext
|
import androidx.compose.ui.platform.LocalContext
|
||||||
import ua.acclorite.book_story.presentation.about.AboutEvent
|
import ua.acclorite.book_story.presentation.about.AboutEvent
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideCredits
|
import ua.acclorite.book_story.ui.credits.data.CreditData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun CreditsLayout(
|
fun CreditsLayout(
|
||||||
|
|
@ -32,7 +32,7 @@ fun CreditsLayout(
|
||||||
state = listState
|
state = listState
|
||||||
) {
|
) {
|
||||||
items(
|
items(
|
||||||
provideCredits(),
|
CreditData.credits,
|
||||||
key = { it.name }
|
key = { it.name }
|
||||||
) { credit ->
|
) { credit ->
|
||||||
CreditItem(credit = credit) {
|
CreditItem(credit = credit) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,101 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.ui.credits.data
|
||||||
|
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.core.ui.UIText
|
||||||
|
import ua.acclorite.book_story.ui.about.model.Credit
|
||||||
|
|
||||||
|
object CreditData {
|
||||||
|
val credits = persistentListOf(
|
||||||
|
Credit(
|
||||||
|
name = "Tachiyomi (Mihon)",
|
||||||
|
source = "GitHub",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_design),
|
||||||
|
UIText.StringResource(R.string.credits_ideas),
|
||||||
|
UIText.StringValue("Readme")
|
||||||
|
),
|
||||||
|
website = "https://www.github.com/mihonapp/mihon"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Kitsune",
|
||||||
|
source = "GitHub",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_updates),
|
||||||
|
UIText.StringResource(R.string.credits_ideas)
|
||||||
|
),
|
||||||
|
website = "https://www.github.com/Drumber/Kitsune"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Voyager",
|
||||||
|
source = "Voyager Website",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_ideas)
|
||||||
|
),
|
||||||
|
website = "https://voyager.adriel.cafe/"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Material Design Icons",
|
||||||
|
source = "Google Fonts",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_icon)
|
||||||
|
),
|
||||||
|
website = "https://fonts.google.com/icons"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Material Design Fonts",
|
||||||
|
source = "Google Fonts",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_fonts)
|
||||||
|
),
|
||||||
|
website = "https://fonts.google.com"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Weblate",
|
||||||
|
source = "Hosted Weblate",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_translation),
|
||||||
|
UIText.StringResource(R.string.credits_contribution)
|
||||||
|
),
|
||||||
|
website = "https://hosted.weblate.org/projects/book-story"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "OpenDyslexic Font",
|
||||||
|
source = "OpenDyslexic Website",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_fonts)
|
||||||
|
),
|
||||||
|
website = "https://opendyslexic.org"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "GitLab Badge",
|
||||||
|
source = "Censorship Website",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_icon)
|
||||||
|
),
|
||||||
|
website = "https://censorship.no/en/index.html"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "GitHub Badge",
|
||||||
|
source = "GitHub",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_icon)
|
||||||
|
),
|
||||||
|
website = "https://github.com/Kunzisoft/Github-badge"
|
||||||
|
),
|
||||||
|
Credit(
|
||||||
|
name = "Codeberg Badge",
|
||||||
|
source = "Codeberg",
|
||||||
|
credits = listOf(
|
||||||
|
UIText.StringResource(R.string.credits_icon)
|
||||||
|
),
|
||||||
|
website = "https://codeberg.org/Codeberg/GetItOnCodeberg"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
@ -39,8 +39,8 @@ import androidx.compose.ui.text.buildAnnotatedString
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.R
|
import ua.acclorite.book_story.R
|
||||||
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
import ua.acclorite.book_story.ui.common.components.common.StyledText
|
||||||
|
import ua.acclorite.book_story.ui.common.helpers.noRippleClickable
|
||||||
import ua.acclorite.book_story.ui.common.model.Position
|
import ua.acclorite.book_story.ui.common.model.Position
|
||||||
import ua.acclorite.book_story.ui.common.util.noRippleClickable
|
|
||||||
import ua.acclorite.book_story.ui.help.model.HelpTip
|
import ua.acclorite.book_story.ui.help.model.HelpTip
|
||||||
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
import ua.acclorite.book_story.ui.theme.ExpandingTransition
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -15,8 +15,8 @@ import androidx.compose.runtime.Composable
|
||||||
import androidx.compose.ui.Modifier
|
import androidx.compose.ui.Modifier
|
||||||
import androidx.compose.ui.unit.dp
|
import androidx.compose.ui.unit.dp
|
||||||
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
import ua.acclorite.book_story.ui.common.components.common.LazyColumnWithScrollbar
|
||||||
import ua.acclorite.book_story.ui.common.constants.provideHelpTips
|
|
||||||
import ua.acclorite.book_story.ui.common.model.Position
|
import ua.acclorite.book_story.ui.common.model.Position
|
||||||
|
import ua.acclorite.book_story.ui.help.data.HelpData
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun HelpLayout(
|
fun HelpLayout(
|
||||||
|
|
@ -31,14 +31,14 @@ fun HelpLayout(
|
||||||
contentPadding = PaddingValues(vertical = 16.dp)
|
contentPadding = PaddingValues(vertical = 16.dp)
|
||||||
) {
|
) {
|
||||||
itemsIndexed(
|
itemsIndexed(
|
||||||
provideHelpTips(),
|
HelpData.tips,
|
||||||
key = { _, helpTip -> helpTip.title }
|
key = { _, helpTip -> helpTip.title }
|
||||||
) { index, helpTip ->
|
) { index, helpTip ->
|
||||||
HelpItem(
|
HelpItem(
|
||||||
helpTip = helpTip,
|
helpTip = helpTip,
|
||||||
position = when (index) {
|
position = when (index) {
|
||||||
0 -> Position.TOP
|
0 -> Position.TOP
|
||||||
provideHelpTips().lastIndex -> Position.BOTTOM
|
HelpData.tips.lastIndex -> Position.BOTTOM
|
||||||
else -> Position.CENTER
|
else -> Position.CENTER
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,155 @@
|
||||||
|
/*
|
||||||
|
* Book's Story — free and open-source Material You eBook reader.
|
||||||
|
* Copyright (C) 2024-2025 Acclorite
|
||||||
|
* SPDX-License-Identifier: GPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
package ua.acclorite.book_story.ui.help.data
|
||||||
|
|
||||||
|
import androidx.compose.ui.res.stringResource
|
||||||
|
import kotlinx.collections.immutable.persistentListOf
|
||||||
|
import ua.acclorite.book_story.R
|
||||||
|
import ua.acclorite.book_story.ui.help.HelpAnnotation
|
||||||
|
import ua.acclorite.book_story.ui.help.model.HelpTip
|
||||||
|
|
||||||
|
object HelpData {
|
||||||
|
val tips = persistentListOf(
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_add_books,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_add_books_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_add_books_2))
|
||||||
|
}
|
||||||
|
append(". ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_add_books_3) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_add_books_4))
|
||||||
|
}
|
||||||
|
append(".")
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_customize_app,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_app_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_app_2))
|
||||||
|
}
|
||||||
|
append(". ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_app_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_move_or_delete_books,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_2))
|
||||||
|
}
|
||||||
|
append(". ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_move_or_delete_books_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_edit_book,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_edit_book_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_edit_book_2))
|
||||||
|
}
|
||||||
|
append(" ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_edit_book_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_read_book,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_read_book_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_read_book_2))
|
||||||
|
}
|
||||||
|
append(". ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_read_book_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_customize_reader,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_reader_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_reader_2))
|
||||||
|
}
|
||||||
|
append(" ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_customize_reader_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_manage_history,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_manage_history_1) + " ")
|
||||||
|
|
||||||
|
HelpAnnotation {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_manage_history_2))
|
||||||
|
}
|
||||||
|
append(". ")
|
||||||
|
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_manage_history_3))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_use_tooltip,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_use_tooltip_1))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_use_double_click_translation,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_use_double_click_translation_1))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_create_color_presets,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_create_color_presets_1))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_use_color_presets,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_use_color_presets_1))
|
||||||
|
}
|
||||||
|
),
|
||||||
|
|
||||||
|
HelpTip(
|
||||||
|
title = R.string.help_title_how_to_use_perception_expander,
|
||||||
|
description = {
|
||||||
|
append(stringResource(id = R.string.help_desc_how_to_use_perception_expander_1))
|
||||||
|
}
|
||||||
|
)
|
||||||
|
)
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue