mirror of
https://github.com/T8RIN/ImageToolbox.git
synced 2025-05-17 13:35:58 +08:00
REF Pass global filter preview model to tone curve filter by #1838
This commit is contained in:
@ -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 {
|
||||
|
@ -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
|
||||
)
|
||||
|
@ -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)
|
||||
)
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
@ -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) {
|
||||
|
@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
)
|
||||
}
|
||||
|
@ -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()
|
||||
}
|
||||
|
@ -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") }
|
@ -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
|
||||
|
Reference in New Issue
Block a user