mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Minor cleanup 2: Electric Boogaloo
- Reword pins on top setting - Make "Latest" button style match old UI - Sort sources by name
This commit is contained in:
		@@ -12,46 +12,36 @@ import kotlinx.coroutines.flow.distinctUntilChanged
 | 
			
		||||
 | 
			
		||||
class GetEnabledSources(
 | 
			
		||||
    private val repository: SourceRepository,
 | 
			
		||||
    private val preferences: PreferencesHelper
 | 
			
		||||
    private val preferences: PreferencesHelper,
 | 
			
		||||
) {
 | 
			
		||||
 | 
			
		||||
    fun subscribe(): Flow<List<Source>> {
 | 
			
		||||
        return preferences.pinnedSources().asFlow()
 | 
			
		||||
            .combine(preferences.enabledLanguages().asFlow()) { pinList, enabledLanguages ->
 | 
			
		||||
                Config(pinSet = pinList, enabledSources = enabledLanguages)
 | 
			
		||||
            }
 | 
			
		||||
            .combine(preferences.disabledSources().asFlow()) { config, disabledSources ->
 | 
			
		||||
                config.copy(disabledSources = disabledSources)
 | 
			
		||||
            }
 | 
			
		||||
            .combine(preferences.lastUsedSource().asFlow()) { config, lastUsedSource ->
 | 
			
		||||
                config.copy(lastUsedSource = lastUsedSource)
 | 
			
		||||
            }
 | 
			
		||||
            .combine(repository.getSources()) { (pinList, enabledLanguages, disabledSources, lastUsedSource), sources ->
 | 
			
		||||
                val pinsOnTop = preferences.pinsOnTop().get()
 | 
			
		||||
                sources
 | 
			
		||||
                    .filter { it.lang in enabledLanguages || it.id == LocalSource.ID }
 | 
			
		||||
                    .filterNot { it.id.toString() in disabledSources }
 | 
			
		||||
                    .flatMap {
 | 
			
		||||
                        val flag = if ("${it.id}" in pinList) Pins.pinned else Pins.unpinned
 | 
			
		||||
                        val source = it.copy(pin = flag)
 | 
			
		||||
                        val toFlatten = mutableListOf(source)
 | 
			
		||||
                        if (source.id == lastUsedSource) {
 | 
			
		||||
                            toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual))
 | 
			
		||||
                        }
 | 
			
		||||
                        if (pinsOnTop.not() && Pin.Pinned in source.pin) {
 | 
			
		||||
                            toFlatten[0] = toFlatten[0].copy(pin = source.pin + Pin.Forced)
 | 
			
		||||
                            toFlatten.add(source.copy(pin = source.pin - Pin.Actual))
 | 
			
		||||
                        }
 | 
			
		||||
                        toFlatten
 | 
			
		||||
        return combine(
 | 
			
		||||
            preferences.pinnedSources().asFlow(),
 | 
			
		||||
            preferences.enabledLanguages().asFlow(),
 | 
			
		||||
            preferences.disabledSources().asFlow(),
 | 
			
		||||
            preferences.lastUsedSource().asFlow(),
 | 
			
		||||
            repository.getSources(),
 | 
			
		||||
        ) { pinnedSourceIds, enabledLanguages, disabledSources, lastUsedSource, sources ->
 | 
			
		||||
            val duplicatePins = preferences.duplicatePinnedSources().get()
 | 
			
		||||
            sources
 | 
			
		||||
                .filter { it.lang in enabledLanguages || it.id == LocalSource.ID }
 | 
			
		||||
                .filterNot { it.id.toString() in disabledSources }
 | 
			
		||||
                .sortedBy { it.name }
 | 
			
		||||
                .flatMap {
 | 
			
		||||
                    val flag = if ("${it.id}" in pinnedSourceIds) Pins.pinned else Pins.unpinned
 | 
			
		||||
                    val source = it.copy(pin = flag)
 | 
			
		||||
                    val toFlatten = mutableListOf(source)
 | 
			
		||||
                    if (source.id == lastUsedSource) {
 | 
			
		||||
                        toFlatten.add(source.copy(isUsedLast = true, pin = source.pin - Pin.Actual))
 | 
			
		||||
                    }
 | 
			
		||||
            }
 | 
			
		||||
                    if (duplicatePins && Pin.Pinned in source.pin) {
 | 
			
		||||
                        toFlatten[0] = toFlatten[0].copy(pin = source.pin + Pin.Forced)
 | 
			
		||||
                        toFlatten.add(source.copy(pin = source.pin - Pin.Actual))
 | 
			
		||||
                    }
 | 
			
		||||
                    toFlatten
 | 
			
		||||
                }
 | 
			
		||||
        }
 | 
			
		||||
            .distinctUntilChanged()
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
private data class Config(
 | 
			
		||||
    val pinSet: Set<String> = setOf(),
 | 
			
		||||
    val enabledSources: Set<String> = setOf(),
 | 
			
		||||
    val disabledSources: Set<String> = setOf(),
 | 
			
		||||
    val lastUsedSource: Long? = null
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -26,11 +26,11 @@ data class Source(
 | 
			
		||||
                ?.asImageBitmap()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    val key: () -> Long = {
 | 
			
		||||
    val key: () -> String = {
 | 
			
		||||
        when {
 | 
			
		||||
            isUsedLast -> id shr 16
 | 
			
		||||
            Pin.Forced in pin -> id shr 32
 | 
			
		||||
            else -> id
 | 
			
		||||
            isUsedLast -> "$id-lastused"
 | 
			
		||||
            Pin.Forced in pin -> "$id-forced"
 | 
			
		||||
            else -> "$id"
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -21,6 +21,7 @@ import androidx.compose.material3.AlertDialog
 | 
			
		||||
import androidx.compose.material3.CircularProgressIndicator
 | 
			
		||||
import androidx.compose.material3.Icon
 | 
			
		||||
import androidx.compose.material3.IconButton
 | 
			
		||||
import androidx.compose.material3.LocalTextStyle
 | 
			
		||||
import androidx.compose.material3.MaterialTheme
 | 
			
		||||
import androidx.compose.material3.Text
 | 
			
		||||
import androidx.compose.material3.TextButton
 | 
			
		||||
@@ -195,7 +196,12 @@ fun SourceItem(
 | 
			
		||||
        }
 | 
			
		||||
        if (item.supportsLatest) {
 | 
			
		||||
            TextButton(onClick = { onClickLatest(item) }) {
 | 
			
		||||
                Text(text = stringResource(id = R.string.latest))
 | 
			
		||||
                Text(
 | 
			
		||||
                    text = stringResource(id = R.string.latest),
 | 
			
		||||
                    style = LocalTextStyle.current.copy(
 | 
			
		||||
                        color = MaterialTheme.colorScheme.primary
 | 
			
		||||
                    ),
 | 
			
		||||
                )
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        SourcePinButton(
 | 
			
		||||
 
 | 
			
		||||
@@ -324,7 +324,7 @@ class PreferencesHelper(val context: Context) {
 | 
			
		||||
 | 
			
		||||
    fun autoClearChapterCache() = prefs.getBoolean(Keys.autoClearChapterCache, false)
 | 
			
		||||
 | 
			
		||||
    fun pinsOnTop() = flowPrefs.getBoolean("pins_on_top", true)
 | 
			
		||||
    fun duplicatePinnedSources() = flowPrefs.getBoolean("duplicate_pinned_sources", false)
 | 
			
		||||
 | 
			
		||||
    fun setChapterSettingsDefault(manga: Manga) {
 | 
			
		||||
        prefs.edit {
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,7 @@ class SourcePresenter(
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private suspend fun collectLatestSources(sources: List<Source>) {
 | 
			
		||||
    private fun collectLatestSources(sources: List<Source>) {
 | 
			
		||||
        val map = TreeMap<String, MutableList<Source>> { d1, d2 ->
 | 
			
		||||
            // Catalogues without a lang defined will be placed at the end
 | 
			
		||||
            when {
 | 
			
		||||
 
 | 
			
		||||
@@ -22,13 +22,12 @@ class SettingsBrowseController : SettingsController() {
 | 
			
		||||
        titleRes = R.string.browse
 | 
			
		||||
 | 
			
		||||
        preferenceCategory {
 | 
			
		||||
            titleRes = R.string.pref_category_general
 | 
			
		||||
            titleRes = R.string.label_sources
 | 
			
		||||
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                bindTo(preferences.pinsOnTop())
 | 
			
		||||
                titleRes = R.string.pref_move_on_top
 | 
			
		||||
                summaryRes = R.string.pref_move_on_top_summary
 | 
			
		||||
                defaultValue = true
 | 
			
		||||
                bindTo(preferences.duplicatePinnedSources())
 | 
			
		||||
                titleRes = R.string.pref_duplicate_pinned_sources
 | 
			
		||||
                summaryRes = R.string.pref_duplicate_pinned_sources_summary
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -419,10 +419,10 @@
 | 
			
		||||
    <string name="action_track">Track</string>
 | 
			
		||||
 | 
			
		||||
      <!-- Browse section -->
 | 
			
		||||
    <string name="pref_duplicate_pinned_sources">Show duplicated pinned sources</string>
 | 
			
		||||
    <string name="pref_duplicate_pinned_sources_summary">Repeat pinned sources in their respective language groups</string>
 | 
			
		||||
    <string name="pref_enable_automatic_extension_updates">Check for extension updates</string>
 | 
			
		||||
    <string name="pref_search_pinned_sources_only">Only include pinned sources</string>
 | 
			
		||||
    <string name="pref_move_on_top">Move pins on top</string>
 | 
			
		||||
    <string name="pref_move_on_top_summary">Move up pins to top of the source list</string>
 | 
			
		||||
 | 
			
		||||
      <!-- Backup section -->
 | 
			
		||||
    <string name="pref_create_backup">Create backup</string>
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user