REF Pass global filter preview model to tone curve filter by #1838

This commit is contained in:
T8RIN
2025-04-19 17:21:56 +03:00
parent 3912b2033e
commit 5ebe72e6a7
14 changed files with 57 additions and 54 deletions

View File

@ -80,12 +80,12 @@ import coil3.request.error
import coil3.request.transformations
import coil3.transform.Transformation
import ru.tech.imageresizershrinker.core.domain.model.FileModel
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.domain.remote.RemoteResources
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiCubeLutFilter
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedModalBottomSheet
@ -106,11 +106,11 @@ internal fun FilterSelectionCubeLutBottomContent(
forceUpdate: Boolean,
downloadOnlyNewData: Boolean
) -> Unit,
previewModel: ImageModel,
onRequestFilterMapping: ((UiFilter<*>) -> Transformation),
onClick: (UiCubeLutFilter) -> Unit
) {
cubeLutRemoteResources?.let { resources ->
val previewModel = LocalFilterPreviewModel.current
val context = LocalContext.current
var showSelection by rememberSaveable {

View File

@ -65,7 +65,6 @@ import coil3.request.transformations
import coil3.toBitmap
import coil3.transform.Transformation
import kotlinx.coroutines.launch
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.domain.remote.RemoteResources
import ru.tech.imageresizershrinker.core.domain.remote.RemoteResourcesDownloadProgress
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
@ -75,7 +74,7 @@ import ru.tech.imageresizershrinker.core.ui.theme.StrongBlack
import ru.tech.imageresizershrinker.core.ui.theme.White
import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
import ru.tech.imageresizershrinker.core.ui.utils.helper.ContextUtils.isNetworkAvailable
import ru.tech.imageresizershrinker.core.ui.utils.helper.toImageModel
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.hapticsClickable
import ru.tech.imageresizershrinker.core.ui.widget.modifier.shimmer
@ -99,12 +98,12 @@ internal fun FilterSelectionItem(
modifier: Modifier,
cubeLutRemoteResources: RemoteResources? = null,
cubeLutDownloadProgress: RemoteResourcesDownloadProgress? = null,
onCubeLutDownloadRequest: (forceUpdate: Boolean, downloadOnlyNewData: Boolean) -> Unit = { _, _ -> },
previewModel: ImageModel = remember { R.drawable.filter_preview_source.toImageModel() }
onCubeLutDownloadRequest: (forceUpdate: Boolean, downloadOnlyNewData: Boolean) -> Unit = { _, _ -> }
) {
val toastHostState = LocalToastHostState.current
val scope = rememberCoroutineScope()
val context = LocalContext.current
val previewModel = LocalFilterPreviewModel.current
val model = remember(filter, previewModel) {
ImageRequest.Builder(context)
.data(previewModel.data)
@ -243,7 +242,6 @@ internal fun FilterSelectionItem(
forceUpdate = forceUpdateP
downloadOnlyNewData = downloadOnlyNewDataP
},
previewModel = previewModel,
onRequestFilterMapping = onRequestFilterMapping,
onClick = onClick
)

View File

@ -84,8 +84,8 @@ import ru.tech.imageresizershrinker.core.filters.presentation.widget.addFilters.
import ru.tech.imageresizershrinker.core.filters.presentation.widget.addFilters.AddFiltersSheetComponent
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.utils.BaseComponent
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.utils.helper.isPortraitOrientationAsState
import ru.tech.imageresizershrinker.core.ui.utils.helper.toImageModel
import ru.tech.imageresizershrinker.core.ui.utils.provider.LocalComponentActivity
import ru.tech.imageresizershrinker.core.ui.utils.state.update
import ru.tech.imageresizershrinker.core.ui.widget.controls.selection.ImageSelector
@ -113,7 +113,7 @@ fun FilterTemplateCreationSheet(
onDismiss: () -> Unit,
initialTemplateFilter: TemplateFilter? = null
) {
val previewModel = component.previewModel
val previewModel = LocalFilterPreviewModel.current
val isPortrait by isPortraitOrientationAsState()
@ -396,10 +396,7 @@ class FilterTemplateCreationSheetComponent @AssistedInject internal constructor(
)
)
private val _previewModel: MutableState<ImageModel> = mutableStateOf(
R.drawable.filter_preview_source.toImageModel()
)
val previewModel: ImageModel by _previewModel
private val _previewModel: MutableState<ImageModel> = mutableStateOf(ImageModel(""))
private val _filterList: MutableState<List<UiFilter<*>>> = mutableStateOf(emptyList())
val filterList by _filterList
@ -427,7 +424,7 @@ class FilterTemplateCreationSheetComponent @AssistedInject internal constructor(
debouncedImageCalculation {
_previewBitmap.update {
imageGetter.getImageWithTransformations(
data = bitmapUri ?: previewModel.data,
data = bitmapUri ?: _previewModel.value.data,
transformations = filterList.map { filterProvider.filterToTransformation(it) },
size = IntegerSize(1000, 1000)
)

View File

@ -77,12 +77,12 @@ import coil3.transform.Transformation
import dev.shreyaspatil.capturable.capturable
import dev.shreyaspatil.capturable.controller.rememberCaptureController
import kotlinx.coroutines.launch
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.filters.domain.model.TemplateFilter
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
import ru.tech.imageresizershrinker.core.filters.presentation.model.toUiFilter
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.resources.icons.EditAlt
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedAlertDialog
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedButton
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
@ -108,8 +108,7 @@ internal fun FilterTemplateInfoSheet(
onRemoveTemplateFilter: (TemplateFilter) -> Unit,
onShareFile: (content: String) -> Unit,
onRequestTemplateFilename: () -> String,
onRequestFilterMapping: (UiFilter<*>) -> Transformation,
previewModel: ImageModel
onRequestFilterMapping: (UiFilter<*>) -> Transformation
) {
EnhancedModalBottomSheet(
visible = visible,
@ -197,8 +196,7 @@ internal fun FilterTemplateInfoSheet(
.offset(y = (-48).dp)
.size(64.dp),
templateFilter = templateFilter,
onRequestFilterMapping = onRequestFilterMapping,
previewModel = previewModel
onRequestFilterMapping = onRequestFilterMapping
)
}
}
@ -279,8 +277,7 @@ internal fun FilterTemplateInfoSheet(
)
.aspectRatio(1f),
templateFilter = templateFilter,
onRequestFilterMapping = onRequestFilterMapping,
previewModel = previewModel
onRequestFilterMapping = onRequestFilterMapping
)
Spacer(modifier = Modifier.height(16.dp))
Text(stringResource(R.string.delete_template_warn))
@ -392,10 +389,10 @@ internal fun FilterTemplateInfoSheet(
internal fun TemplateFilterPreviewItem(
modifier: Modifier,
onRequestFilterMapping: (UiFilter<*>) -> Transformation,
templateFilter: TemplateFilter,
previewModel: ImageModel
templateFilter: TemplateFilter
) {
val context = LocalContext.current
val previewModel = LocalFilterPreviewModel.current
val model = remember(templateFilter, previewModel) {
ImageRequest.Builder(context)
.data(previewModel.data)

View File

@ -55,7 +55,6 @@ import coil3.request.transformations
import coil3.toBitmap
import coil3.transform.Transformation
import kotlinx.coroutines.launch
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.filters.domain.model.TemplateFilter
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
import ru.tech.imageresizershrinker.core.filters.presentation.model.toUiFilter
@ -63,7 +62,7 @@ import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.theme.StrongBlack
import ru.tech.imageresizershrinker.core.ui.theme.White
import ru.tech.imageresizershrinker.core.ui.theme.outlineVariant
import ru.tech.imageresizershrinker.core.ui.utils.helper.toImageModel
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.EnhancedIconButton
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.hapticsClickable
import ru.tech.imageresizershrinker.core.ui.widget.modifier.shimmer
@ -78,10 +77,10 @@ internal fun TemplateFilterSelectionItem(
onRequestFilterMapping: (UiFilter<*>) -> Transformation,
onInfoClick: () -> Unit,
shape: Shape,
modifier: Modifier,
previewModel: ImageModel = remember { R.drawable.filter_preview_source.toImageModel() }
modifier: Modifier
) {
val context = LocalContext.current
val previewModel = LocalFilterPreviewModel.current
val model = remember(templateFilter, previewModel) {
ImageRequest.Builder(context)
.data(previewModel.data)

View File

@ -29,8 +29,6 @@ import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import ru.tech.imageresizershrinker.core.domain.dispatchers.DispatchersHolder
import ru.tech.imageresizershrinker.core.domain.image.ImageCompressor
import ru.tech.imageresizershrinker.core.domain.image.ImageGetter
@ -39,7 +37,6 @@ import ru.tech.imageresizershrinker.core.domain.image.ImageTransformer
import ru.tech.imageresizershrinker.core.domain.image.model.ImageFormat
import ru.tech.imageresizershrinker.core.domain.image.model.ImageInfo
import ru.tech.imageresizershrinker.core.domain.image.model.Quality
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.domain.model.IntegerSize
import ru.tech.imageresizershrinker.core.domain.remote.RemoteResources
import ru.tech.imageresizershrinker.core.domain.remote.RemoteResourcesDownloadProgress
@ -57,7 +54,6 @@ import ru.tech.imageresizershrinker.core.filters.presentation.model.toUiFilter
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.utils.BaseComponent
import ru.tech.imageresizershrinker.core.ui.utils.helper.toCoil
import ru.tech.imageresizershrinker.core.ui.utils.helper.toImageModel
import ru.tech.imageresizershrinker.core.ui.utils.state.update
class AddFiltersSheetComponent @AssistedInject internal constructor(
@ -73,11 +69,6 @@ class AddFiltersSheetComponent @AssistedInject internal constructor(
dispatchersHolder: DispatchersHolder
) : BaseComponent(dispatchersHolder, componentContext) {
private val _previewModel: MutableState<ImageModel> = mutableStateOf(
R.drawable.filter_preview_source.toImageModel()
)
val previewModel: ImageModel by _previewModel
private val _previewData: MutableState<List<UiFilter<*>>?> = mutableStateOf(null)
val previewData by _previewData
@ -99,10 +90,6 @@ class AddFiltersSheetComponent @AssistedInject internal constructor(
onFailure = {},
downloadOnlyNewData = false
)
favoriteInteractor
.getFilterPreviewModel().onEach { data ->
_previewModel.update { data }
}.launchIn(componentScope)
}
fun setFilterPreviewModel(uri: String) {

View File

@ -69,7 +69,6 @@ internal fun FavoritesContent(
onFilterPicked: (UiFilter<*>) -> Unit,
previewBitmap: Bitmap?
) {
val previewModel = component.previewModel
val onRequestFilterMapping = component::filterToTransformation
val favoriteFilters by component.favoritesFlow.collectAsUiState()
val essentials = rememberLocalEssentials()
@ -197,8 +196,7 @@ internal fun FavoritesContent(
onFailure = essentials::showFailureToast,
downloadOnlyNewData = downloadOnlyNewData
)
},
previewModel = previewModel
}
)
}
}

View File

@ -61,6 +61,7 @@ import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
import ru.tech.imageresizershrinker.core.filters.presentation.utils.collectAsUiState
import ru.tech.imageresizershrinker.core.filters.presentation.widget.FilterSelectionItem
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.utils.helper.asClip
import ru.tech.imageresizershrinker.core.ui.utils.provider.rememberLocalEssentials
import ru.tech.imageresizershrinker.core.ui.widget.buttons.ShareButton
@ -87,7 +88,7 @@ internal fun OtherContent(
previewBitmap: Bitmap?,
) {
val context = LocalContext.current
val previewModel = component.previewModel
val previewModel = LocalFilterPreviewModel.current
val essentials = rememberLocalEssentials()
val showConfetti: () -> Unit = essentials::showConfetti
val favoriteFilters by component.favoritesFlow.collectAsUiState()
@ -306,8 +307,7 @@ internal fun OtherContent(
onFailure = essentials::showFailureToast,
downloadOnlyNewData = downloadOnlyNewData
)
},
previewModel = previewModel
}
)
}
}

View File

@ -65,7 +65,6 @@ internal fun TemplatesContent(
onFilterPickedWithParams: (UiFilter<*>) -> Unit,
) {
val templateFilters by component.templatesFlow.collectAsUiState()
val previewModel = component.previewModel
val onRequestFilterMapping = component::filterToTransformation
val essentials = rememberLocalEssentials()
val showConfetti: () -> Unit = essentials::showConfetti
@ -134,8 +133,7 @@ internal fun TemplatesContent(
index = index,
size = templateFilters.size
),
modifier = Modifier.animateItem(),
previewModel = previewModel
modifier = Modifier.animateItem()
)
FilterTemplateInfoSheet(
visible = showFilterTemplateInfoSheet,
@ -176,7 +174,6 @@ internal fun TemplatesContent(
onComplete = showConfetti
)
},
previewModel = previewModel,
component = filterTemplateCreationSheetComponent
)
}

View File

@ -27,6 +27,7 @@ import com.t8rin.curves.ImageCurvesEditorState
import ru.tech.imageresizershrinker.core.filters.domain.model.ToneCurvesParams
import ru.tech.imageresizershrinker.core.filters.presentation.model.UiFilter
import ru.tech.imageresizershrinker.core.resources.R
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
@Composable
internal fun ToneCurvesParamsItem(
@ -45,12 +46,14 @@ internal fun ToneCurvesParamsItem(
mutableStateOf<Bitmap?>(null)
}
val previewModel = LocalFilterPreviewModel.current
val context = LocalContext.current
LaunchedEffect(context) {
LaunchedEffect(context, previewModel) {
bitmap = context.imageLoader.execute(
ImageRequest.Builder(context)
.data(R.drawable.filter_preview_source)
.data(previewModel.data)
.build()
).image?.toBitmap()
}

View File

@ -0,0 +1,7 @@
package ru.tech.imageresizershrinker.core.ui.utils.helper
import androidx.compose.runtime.compositionLocalOf
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
val LocalFilterPreviewModel =
compositionLocalOf<ImageModel> { error("FilterPreviewModel not present") }

View File

@ -26,6 +26,7 @@ import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.remember
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.platform.LocalHapticFeedback
import ru.tech.imageresizershrinker.core.domain.model.ImageModel
import ru.tech.imageresizershrinker.core.settings.domain.SimpleSettingsInteractor
import ru.tech.imageresizershrinker.core.settings.presentation.model.UiSettingsState
import ru.tech.imageresizershrinker.core.settings.presentation.provider.LocalEditPresetsController
@ -36,6 +37,7 @@ import ru.tech.imageresizershrinker.core.ui.theme.ImageToolboxThemeSurface
import ru.tech.imageresizershrinker.core.ui.utils.confetti.ConfettiHost
import ru.tech.imageresizershrinker.core.ui.utils.confetti.LocalConfettiHostState
import ru.tech.imageresizershrinker.core.ui.utils.confetti.rememberConfettiHostState
import ru.tech.imageresizershrinker.core.ui.utils.helper.LocalFilterPreviewModel
import ru.tech.imageresizershrinker.core.ui.widget.enhanced.rememberEnhancedHapticFeedback
import ru.tech.imageresizershrinker.core.ui.widget.other.LocalToastHostState
import ru.tech.imageresizershrinker.core.ui.widget.other.ToastHost
@ -46,6 +48,7 @@ import ru.tech.imageresizershrinker.core.ui.widget.other.rememberToastHostState
fun ImageToolboxCompositionLocals(
settingsState: UiSettingsState,
toastHostState: ToastHostState = rememberToastHostState(),
filterPreviewModel: ImageModel? = null,
simpleSettingsInteractor: SimpleSettingsInteractor? = null,
content: @Composable BoxScope.() -> Unit
) {
@ -56,14 +59,15 @@ fun ImageToolboxCompositionLocals(
val screenSize = rememberScreenSize()
val values = remember(
context,
toastHostState,
settingsState,
simpleSettingsInteractor,
editPresetsController,
confettiHostState,
context,
customHapticFeedback,
screenSize
screenSize,
filterPreviewModel
) {
derivedStateOf {
listOfNotNull(
@ -71,6 +75,7 @@ fun ImageToolboxCompositionLocals(
LocalSettingsState provides settingsState,
LocalSimpleSettingsInteractor providesOrNull simpleSettingsInteractor,
LocalEditPresetsController provides editPresetsController,
LocalFilterPreviewModel providesOrNull filterPreviewModel,
LocalConfettiHostState provides confettiHostState,
LocalHapticFeedback provides customHapticFeedback,
LocalScreenSize provides screenSize