From 5ebe72e6a72d2fa82dcbb9afd52d1a7e38c09012 Mon Sep 17 00:00:00 2001 From: T8RIN Date: Sat, 19 Apr 2025 17:21:56 +0300 Subject: [PATCH] REF Pass global filter preview model to tone curve filter by #1838 --- .../widget/FilterSelectionCubeLutBottomContent.kt | 4 ++-- .../presentation/widget/FilterSelectionItem.kt | 8 +++----- .../widget/FilterTemplateCreationSheet.kt | 11 ++++------- .../widget/FilterTemplateInfoSheet.kt | 15 ++++++--------- .../widget/TemplateFilterSelectionItem.kt | 7 +++---- .../widget/addFilters/AddFiltersSheetComponent.kt | 13 ------------- .../widget/addFilters/FavoritesContent.kt | 4 +--- .../widget/addFilters/OtherContent.kt | 6 +++--- .../widget/addFilters/TemplatesContent.kt | 5 +---- .../widget/filterItem/ToneCurvesParamsItem.kt | 7 +++++-- .../ui/utils/helper/LocalFilterPreviewModel.kt | 7 +++++++ .../provider/ImageToolboxCompositionLocals.kt | 9 +++++++-- .../feature/root/presentation/RootContent.kt | 1 + .../presentation/screenLogic/RootComponent.kt | 14 ++++++++++++++ 14 files changed, 57 insertions(+), 54 deletions(-) create mode 100644 core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/helper/LocalFilterPreviewModel.kt diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionCubeLutBottomContent.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionCubeLutBottomContent.kt index 9cb2e4f29..0eaa554b2 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionCubeLutBottomContent.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionCubeLutBottomContent.kt @@ -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 { diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionItem.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionItem.kt index 28891a688..ec08f09c9 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionItem.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterSelectionItem.kt @@ -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 ) diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateCreationSheet.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateCreationSheet.kt index fb51ff511..bffdc5aad 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateCreationSheet.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateCreationSheet.kt @@ -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 = mutableStateOf( - R.drawable.filter_preview_source.toImageModel() - ) - val previewModel: ImageModel by _previewModel + private val _previewModel: MutableState = mutableStateOf(ImageModel("")) private val _filterList: MutableState>> = 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) ) diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateInfoSheet.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateInfoSheet.kt index 1f73ead8b..1c94a9519 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateInfoSheet.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/FilterTemplateInfoSheet.kt @@ -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) diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/TemplateFilterSelectionItem.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/TemplateFilterSelectionItem.kt index 6b8da1539..887071803 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/TemplateFilterSelectionItem.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/TemplateFilterSelectionItem.kt @@ -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) diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/AddFiltersSheetComponent.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/AddFiltersSheetComponent.kt index 5c7835783..80efcefd5 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/AddFiltersSheetComponent.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/AddFiltersSheetComponent.kt @@ -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 = mutableStateOf( - R.drawable.filter_preview_source.toImageModel() - ) - val previewModel: ImageModel by _previewModel - private val _previewData: MutableState>?> = 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) { diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/FavoritesContent.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/FavoritesContent.kt index d7f8a4d08..c93bab9fd 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/FavoritesContent.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/FavoritesContent.kt @@ -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 + } ) } } diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/OtherContent.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/OtherContent.kt index 8cac7d292..80b4d9459 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/OtherContent.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/OtherContent.kt @@ -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 + } ) } } diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/TemplatesContent.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/TemplatesContent.kt index 6bd3bb08a..f0f1cdede 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/TemplatesContent.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/addFilters/TemplatesContent.kt @@ -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 ) } diff --git a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/filterItem/ToneCurvesParamsItem.kt b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/filterItem/ToneCurvesParamsItem.kt index 0f12c8e57..2f5795667 100644 --- a/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/filterItem/ToneCurvesParamsItem.kt +++ b/core/filters/src/main/java/ru/tech/imageresizershrinker/core/filters/presentation/widget/filterItem/ToneCurvesParamsItem.kt @@ -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(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() } diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/helper/LocalFilterPreviewModel.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/helper/LocalFilterPreviewModel.kt new file mode 100644 index 000000000..b2f404704 --- /dev/null +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/helper/LocalFilterPreviewModel.kt @@ -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 { error("FilterPreviewModel not present") } \ No newline at end of file diff --git a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt index 6bfc65fee..255f3d4b8 100644 --- a/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt +++ b/core/ui/src/main/kotlin/ru/tech/imageresizershrinker/core/ui/utils/provider/ImageToolboxCompositionLocals.kt @@ -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 diff --git a/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/RootContent.kt b/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/RootContent.kt index 9bfbdc9dd..515c04712 100644 --- a/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/RootContent.kt +++ b/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/RootContent.kt @@ -34,6 +34,7 @@ fun RootContent( ImageToolboxCompositionLocals( settingsState = component.uiSettingsState(), toastHostState = component.toastHostState, + filterPreviewModel = component.filterPreviewModel, simpleSettingsInteractor = component.simpleSettingsInteractor ) { AppExitDialog(component) diff --git a/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/screenLogic/RootComponent.kt b/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/screenLogic/RootComponent.kt index 0ec2d1f9a..3e987cd97 100644 --- a/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/screenLogic/RootComponent.kt +++ b/feature/root/src/main/java/ru/tech/imageresizershrinker/feature/root/presentation/screenLogic/RootComponent.kt @@ -20,6 +20,7 @@ package ru.tech.imageresizershrinker.feature.root.presentation.screenLogic import android.net.Uri import androidx.compose.material.icons.Icons import androidx.compose.material.icons.rounded.ErrorOutline +import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.ui.graphics.vector.ImageVector @@ -49,10 +50,12 @@ import org.w3c.dom.Element import ru.tech.imageresizershrinker.core.domain.APP_RELEASES import ru.tech.imageresizershrinker.core.domain.dispatchers.DispatchersHolder import ru.tech.imageresizershrinker.core.domain.model.ExtraDataType +import ru.tech.imageresizershrinker.core.domain.model.ImageModel import ru.tech.imageresizershrinker.core.domain.model.PerformanceClass import ru.tech.imageresizershrinker.core.domain.remote.AnalyticsManager import ru.tech.imageresizershrinker.core.domain.resource.ResourceManager import ru.tech.imageresizershrinker.core.domain.saving.FileController +import ru.tech.imageresizershrinker.core.filters.domain.FavoriteFiltersInteractor import ru.tech.imageresizershrinker.core.resources.BuildConfig import ru.tech.imageresizershrinker.core.resources.R import ru.tech.imageresizershrinker.core.settings.domain.SettingsManager @@ -60,6 +63,7 @@ import ru.tech.imageresizershrinker.core.settings.domain.SimpleSettingsInteracto import ru.tech.imageresizershrinker.core.settings.domain.model.SettingsState import ru.tech.imageresizershrinker.core.settings.domain.toSimpleSettingsInteractor import ru.tech.imageresizershrinker.core.ui.utils.BaseComponent +import ru.tech.imageresizershrinker.core.ui.utils.helper.toImageModel import ru.tech.imageresizershrinker.core.ui.utils.navigation.Screen import ru.tech.imageresizershrinker.core.ui.utils.state.update import ru.tech.imageresizershrinker.core.ui.widget.other.ToastDuration @@ -76,6 +80,7 @@ class RootComponent @AssistedInject internal constructor( private val settingsManager: SettingsManager, private val childProvider: ChildProvider, private val analyticsManager: AnalyticsManager, + favoriteFiltersInteractor: FavoriteFiltersInteractor, fileController: FileController, dispatchersHolder: DispatchersHolder, settingsComponentFactory: SettingsComponent.Factory, @@ -156,6 +161,10 @@ class RootComponent @AssistedInject internal constructor( private val _changelog = mutableStateOf("") val changelog by _changelog + private val _filterPreviewModel: MutableState = + mutableStateOf(R.drawable.filter_preview_source.toImageModel()) + val filterPreviewModel by _filterPreviewModel + val toastHostState = ToastHostState() init { @@ -186,6 +195,11 @@ class RootComponent @AssistedInject internal constructor( ) } } + + favoriteFiltersInteractor + .getFilterPreviewModel().onEach { data -> + _filterPreviewModel.update { data } + }.launchIn(componentScope) } fun toggleShowUpdateDialog() {