diff --git a/app/src/androidTest/java/com/example/cahier/core/data/OfflineNotesRepositoryTest.kt b/app/src/androidTest/java/com/example/cahier/core/data/OfflineNotesRepositoryTest.kt index 2db81961..60821765 100644 --- a/app/src/androidTest/java/com/example/cahier/core/data/OfflineNotesRepositoryTest.kt +++ b/app/src/androidTest/java/com/example/cahier/core/data/OfflineNotesRepositoryTest.kt @@ -8,7 +8,6 @@ import androidx.ink.strokes.ImmutableStrokeInputBatch import androidx.ink.strokes.Stroke import androidx.test.core.app.ApplicationProvider import com.example.cahier.core.ui.Converters -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.first diff --git a/app/src/androidTest/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModelTest.kt b/app/src/androidTest/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModelTest.kt index deafe93a..89b09d2d 100644 --- a/app/src/androidTest/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModelTest.kt +++ b/app/src/androidTest/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModelTest.kt @@ -3,9 +3,9 @@ package com.example.cahier.developer.brushdesigner.viewmodel import android.content.Context import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.cahier.core.data.CustomBrushDao import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.developer.brushdesigner.data.BrushDesignerRepository -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao import dagger.hilt.android.testing.HiltAndroidRule import dagger.hilt.android.testing.HiltAndroidTest import kotlinx.coroutines.Dispatchers diff --git a/app/src/androidTest/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepositoryTest.kt b/app/src/androidTest/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepositoryTest.kt index 493584e5..cce59268 100644 --- a/app/src/androidTest/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepositoryTest.kt +++ b/app/src/androidTest/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepositoryTest.kt @@ -21,6 +21,7 @@ import androidx.ink.brush.StockBrushes import androidx.ink.storage.encode import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 +import com.example.cahier.core.data.AUTOSAVE_KEY import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.developer.brushdesigner.data.FakeCustomBrushDao import kotlinx.coroutines.Dispatchers @@ -88,7 +89,7 @@ class BrushGraphRepositoryTest { val savedEntity = fakeDao.getAutoSaveBrush().first() assertNotNull(savedEntity) assertEquals( - com.example.cahier.developer.brushdesigner.data.AUTOSAVE_KEY, + AUTOSAVE_KEY, savedEntity!!.name ) assertTrue(savedEntity.brushBytes.isNotEmpty()) diff --git a/app/src/androidTest/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModelTest.kt b/app/src/androidTest/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModelTest.kt index ba40fd49..8ce1ba61 100644 --- a/app/src/androidTest/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModelTest.kt +++ b/app/src/androidTest/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModelTest.kt @@ -19,8 +19,8 @@ package com.example.cahier.developer.brushgraph.viewmodel import androidx.ink.storage.encode import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.platform.app.InstrumentationRegistry +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.ui.CahierTextureBitmapStore -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.example.cahier.developer.brushdesigner.data.FakeCustomBrushDao import com.example.cahier.developer.brushgraph.data.BrushGraph import com.example.cahier.developer.brushgraph.data.DefaultBrushGraphRepository diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushDao.kt b/app/src/main/java/com/example/cahier/core/data/CustomBrushDao.kt similarity index 96% rename from app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushDao.kt rename to app/src/main/java/com/example/cahier/core/data/CustomBrushDao.kt index c34a9de9..eb20920a 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushDao.kt +++ b/app/src/main/java/com/example/cahier/core/data/CustomBrushDao.kt @@ -16,7 +16,7 @@ * */ -package com.example.cahier.developer.brushdesigner.data +package com.example.cahier.core.data import androidx.room.Dao import androidx.room.Insert diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushEntity.kt b/app/src/main/java/com/example/cahier/core/data/CustomBrushEntity.kt similarity index 51% rename from app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushEntity.kt rename to app/src/main/java/com/example/cahier/core/data/CustomBrushEntity.kt index e6a03eae..1cbbf645 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/data/CustomBrushEntity.kt +++ b/app/src/main/java/com/example/cahier/core/data/CustomBrushEntity.kt @@ -1,22 +1,20 @@ /* + * Copyright 2025 Google LLC. All rights reserved. * - * * Copyright 2025 Google LLC. All rights reserved. - * * - * * Licensed under the Apache License, Version 2.0 (the "License"); - * * you may not use this file except in compliance with the License. - * * You may obtain a copy of the License at - * * - * * http://www.apache.org/licenses/LICENSE-2.0 - * * - * * Unless required by applicable law or agreed to in writing, software - * * distributed under the License is distributed on an "AS IS" BASIS, - * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * * See the License for the specific language governing permissions and - * * limitations under the License. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. */ -package com.example.cahier.developer.brushdesigner.data +package com.example.cahier.core.data import androidx.room.ColumnInfo import androidx.room.Entity @@ -25,7 +23,7 @@ import androidx.room.PrimaryKey @Entity(tableName = "custom_brushes") data class CustomBrushEntity( @PrimaryKey val name: String, - @ColumnInfo(typeAffinity = ColumnInfo.BLOB) val brushBytes: ByteArray + @ColumnInfo(typeAffinity = ColumnInfo.BLOB) val brushBytes: ByteArray, ) { override fun equals(other: Any?): Boolean { if (this === other) return true @@ -44,4 +42,4 @@ data class CustomBrushEntity( result = 31 * result + brushBytes.contentHashCode() return result } -} +} \ No newline at end of file diff --git a/app/src/main/java/com/example/cahier/core/data/NoteDatabase.kt b/app/src/main/java/com/example/cahier/core/data/NoteDatabase.kt index caba62f5..75ce1aca 100644 --- a/app/src/main/java/com/example/cahier/core/data/NoteDatabase.kt +++ b/app/src/main/java/com/example/cahier/core/data/NoteDatabase.kt @@ -22,8 +22,6 @@ import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters import com.example.cahier.core.ui.Converters -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity @Database( entities = [Note::class, CustomBrushEntity::class], diff --git a/app/src/main/java/com/example/cahier/core/data/OfflineNotesRepository.kt b/app/src/main/java/com/example/cahier/core/data/OfflineNotesRepository.kt index 49097f4a..0d77ae75 100644 --- a/app/src/main/java/com/example/cahier/core/data/OfflineNotesRepository.kt +++ b/app/src/main/java/com/example/cahier/core/data/OfflineNotesRepository.kt @@ -26,7 +26,6 @@ import androidx.ink.storage.decode import androidx.ink.strokes.Stroke import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.core.ui.Converters -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao import com.example.cahier.features.drawing.CustomBrushes import kotlinx.coroutines.flow.Flow import kotlinx.serialization.json.Json diff --git a/app/src/main/java/com/example/cahier/core/di/AppModule.kt b/app/src/main/java/com/example/cahier/core/di/AppModule.kt index 6ffd8612..96c20873 100644 --- a/app/src/main/java/com/example/cahier/core/di/AppModule.kt +++ b/app/src/main/java/com/example/cahier/core/di/AppModule.kt @@ -21,6 +21,7 @@ package com.example.cahier.core.di import android.content.Context import androidx.room.Room import coil3.ImageLoader +import com.example.cahier.core.data.CustomBrushDao import com.example.cahier.core.data.MIGRATION_7_8 import com.example.cahier.core.data.MIGRATION_8_9 import com.example.cahier.core.data.NoteDatabase @@ -28,7 +29,6 @@ import com.example.cahier.core.data.NotesRepository import com.example.cahier.core.data.OfflineNotesRepository import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.core.utils.FileHelper -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao import com.example.cahier.developer.brushgraph.data.BrushGraphRepository import com.example.cahier.developer.brushgraph.data.DefaultBrushGraphRepository import dagger.Module diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerScreen.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerScreen.kt index c0240094..3d5d9cce 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerScreen.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerScreen.kt @@ -83,6 +83,7 @@ import androidx.ink.brush.StockBrushes import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.example.cahier.R import com.example.cahier.developer.brushdesigner.viewmodel.BrushDesignerViewModel +import com.example.cahier.developer.brushgraph.ui.BrushSliderControl import ink.proto.BrushTip as ProtoBrushTip /** diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerTopBar.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerTopBar.kt index a6d03849..d6b75359 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerTopBar.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerTopBar.kt @@ -58,8 +58,8 @@ import androidx.compose.ui.window.PopupProperties import androidx.ink.brush.BrushFamily import androidx.ink.brush.StockBrushes import com.example.cahier.R +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.ui.LocalTextureStore -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.example.cahier.features.drawing.CustomBrushes /** diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NodeEditors.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NodeEditors.kt index 3edc5996..21feb319 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NodeEditors.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NodeEditors.kt @@ -25,7 +25,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R +import com.example.cahier.developer.brushgraph.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.BrushBehavior +import ink.proto.CubicBezierEasingFunction +import ink.proto.LinearEasingFunction +import ink.proto.StepsEasingFunction import ink.proto.PredefinedEasingFunction as ProtoPredefinedEasingFunction /** @@ -38,7 +44,7 @@ import ink.proto.PredefinedEasingFunction as ProtoPredefinedEasingFunction internal fun NodeEditor( node: BrushBehavior.Node, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { when (node.nodeCase) { BrushBehavior.Node.NodeCase.SOURCE_NODE -> @@ -76,11 +82,14 @@ internal fun NodeEditor( internal fun SourceNodeEditor( source: BrushBehavior.SourceNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_source), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_source), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) val sources = BrushBehavior.Source.entries.filter { it != BrushBehavior.Source.SOURCE_UNSPECIFIED @@ -147,11 +156,14 @@ internal fun SourceNodeEditor( internal fun ResponseNodeEditor( response: BrushBehavior.ResponseNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_response_curve), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_response_curve), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) MathCurvePreview( responseNode = response, @@ -161,10 +173,13 @@ internal fun ResponseNodeEditor( val currentType = when (response.responseCurveCase) { BrushBehavior.ResponseNode.ResponseCurveCase.CUBIC_BEZIER_RESPONSE_CURVE -> ResponseCurveType.CubicBezier + BrushBehavior.ResponseNode.ResponseCurveCase.LINEAR_RESPONSE_CURVE -> ResponseCurveType.Linear + BrushBehavior.ResponseNode.ResponseCurveCase.STEPS_RESPONSE_CURVE -> ResponseCurveType.Steps + else -> ResponseCurveType.Predefined } @@ -180,18 +195,21 @@ internal fun ResponseNodeEditor( newResponseBuilder.setPredefinedResponseCurve( ProtoPredefinedEasingFunction.PREDEFINED_EASING_EASE ) + ResponseCurveType.CubicBezier -> newResponseBuilder.setCubicBezierResponseCurve( - ink.proto.CubicBezierEasingFunction.newBuilder() + CubicBezierEasingFunction.newBuilder() .setX1(0.25f).setY1(0.1f).setX2(0.25f).setY2(1f) ) + ResponseCurveType.Linear -> newResponseBuilder.setLinearResponseCurve( - ink.proto.LinearEasingFunction.newBuilder() + LinearEasingFunction.newBuilder() ) + ResponseCurveType.Steps -> newResponseBuilder.setStepsResponseCurve( - ink.proto.StepsEasingFunction.newBuilder().setStepCount(4) + StepsEasingFunction.newBuilder().setStepCount(4) ) } onNodeChanged( @@ -307,11 +325,14 @@ internal fun ResponseNodeEditor( internal fun DampingNodeEditor( damping: BrushBehavior.DampingNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_damping), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_damping), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) EnumDropdown( label = stringResource(R.string.brush_designer_node_damping_source), @@ -348,7 +369,7 @@ internal fun DampingNodeEditor( internal fun NoiseNodeEditor( noise: BrushBehavior.NoiseNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { Text( @@ -405,11 +426,14 @@ internal fun NoiseNodeEditor( internal fun TargetNodeEditor( target: BrushBehavior.TargetNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_target), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_target), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) EnumDropdown( label = stringResource(R.string.brush_designer_node_target_output), @@ -459,11 +483,14 @@ internal fun TargetNodeEditor( internal fun ConstantNodeEditor( constant: BrushBehavior.ConstantNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_constant_value), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_constant_value), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) NumericField( title = stringResource(R.string.brush_designer_node_value), @@ -484,11 +511,14 @@ internal fun ConstantNodeEditor( internal fun BinaryOpNodeEditor( binaryOp: BrushBehavior.BinaryOpNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_binary_operation), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_binary_operation), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) EnumDropdown( label = stringResource(R.string.brush_designer_node_operation), @@ -512,11 +542,14 @@ internal fun BinaryOpNodeEditor( internal fun InterpolationNodeEditor( interpolation: BrushBehavior.InterpolationNode, onNodeChanged: (BrushBehavior.Node) -> Unit, - modifier: Modifier = Modifier + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { - Text(stringResource(R.string.brush_designer_node_interpolation), style = MaterialTheme.typography.labelLarge, - color = MaterialTheme.colorScheme.secondary) + Text( + stringResource(R.string.brush_designer_node_interpolation), + style = MaterialTheme.typography.labelLarge, + color = MaterialTheme.colorScheme.secondary + ) EnumDropdown( label = stringResource(R.string.brush_designer_node_interpolation), diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PaintTab.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PaintTab.kt index 65a8c978..fb7cc3f2 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PaintTab.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PaintTab.kt @@ -44,6 +44,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R import com.example.cahier.core.ui.LocalTextureStore +import com.example.cahier.developer.brushgraph.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.BrushFamily as ProtoBrushFamily import ink.proto.BrushPaint as ProtoBrushPaint import ink.proto.Color as ProtoColor diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PreviewPane.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PreviewPane.kt index fc4d2ef5..1bd55349 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PreviewPane.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/PreviewPane.kt @@ -63,6 +63,7 @@ import com.example.cahier.core.ui.theme.BrushBlue import com.example.cahier.core.ui.theme.BrushGreen import com.example.cahier.core.ui.theme.BrushRed import com.example.cahier.core.ui.theme.BrushYellow +import com.example.cahier.developer.brushgraph.ui.CustomColorPickerDialog import ink.proto.BrushFamily as ProtoBrushFamily /** diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/TipShapeTab.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/TipShapeTab.kt index 903912b1..e08fcf9c 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/TipShapeTab.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/TipShapeTab.kt @@ -34,13 +34,15 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.ink.brush.Brush import com.example.cahier.R +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.BrushTip as ProtoBrushTip /** * Tab 0: Tip geometry controls — scale (with lock toggle), corner rounding, * slant, rotation, pinch, and particle (stamp) settings. * - * Uses [NumericField] for professional ±button input with degree/percent + * Uses [com.example.cahier.developer.brushgraph.ui.NumericField] for professional ±button input with degree/percent * unit conversions and click-to-edit exact-value entry. * * Stateless: receives data and callbacks, does not access ViewModel. diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModel.kt b/app/src/main/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModel.kt index 057bd98d..2be7c187 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModel.kt +++ b/app/src/main/java/com/example/cahier/developer/brushdesigner/viewmodel/BrushDesignerViewModel.kt @@ -30,11 +30,11 @@ import androidx.ink.storage.encode import androidx.ink.strokes.Stroke import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.cahier.core.data.CustomBrushDao +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.core.ui.theme.BrushBlack import com.example.cahier.developer.brushdesigner.data.BrushDesignerRepository -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.google.protobuf.ByteString import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepository.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepository.kt index 82fbdbf1..e59558ca 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepository.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/data/BrushGraphRepository.kt @@ -24,10 +24,11 @@ import androidx.ink.brush.Version import androidx.ink.storage.decode import androidx.ink.storage.encode import com.example.cahier.R +import com.example.cahier.core.data.AUTOSAVE_KEY +import com.example.cahier.core.data.CustomBrushDao +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.di.ApplicationScope import com.example.cahier.core.ui.CahierTextureBitmapStore -import com.example.cahier.developer.brushdesigner.data.AUTOSAVE_KEY -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao import dagger.hilt.android.qualifiers.ApplicationContext import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -104,7 +105,7 @@ class DefaultBrushGraphRepository @Inject constructor( val baos = ByteArrayOutputStream() family.encode(baos, textureStore) customBrushDao.saveCustomBrush( - com.example.cahier.developer.brushdesigner.data.CustomBrushEntity( + CustomBrushEntity( AUTOSAVE_KEY, baos.toByteArray() ) @@ -249,7 +250,7 @@ class DefaultBrushGraphRepository @Inject constructor( } customBrushDao.saveCustomBrush( - com.example.cahier.developer.brushdesigner.data.CustomBrushEntity( + CustomBrushEntity( AUTOSAVE_KEY, bytes ) diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/data/DisplayUtils.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/data/DisplayUtils.kt index 53be4cfa..7483d1a8 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/data/DisplayUtils.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/data/DisplayUtils.kt @@ -17,7 +17,7 @@ package com.example.cahier.developer.brushgraph.data import androidx.ink.brush.InputToolType import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.NumericLimits +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.BrushBehavior as ProtoBrushBehavior import ink.proto.BrushFamily as ProtoBrushFamily import ink.proto.BrushPaint as ProtoBrushPaint diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerComponents.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushDesignerComponents.kt similarity index 96% rename from app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerComponents.kt rename to app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushDesignerComponents.kt index b9bd0bf7..9f9d6374 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/BrushDesignerComponents.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushDesignerComponents.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.example.cahier.developer.brushdesigner.ui +package com.example.cahier.developer.brushgraph.ui import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -47,6 +47,7 @@ import androidx.compose.ui.unit.dp import com.example.cahier.R import com.godaddy.android.colorpicker.ClassicColorPicker import com.godaddy.android.colorpicker.HsvColor +import java.util.Locale /** * A reusable slider control for brush property editing. @@ -65,7 +66,7 @@ internal fun BrushSliderControl( ) { Text(text = label, style = MaterialTheme.typography.bodyMedium) Text( - text = String.format(java.util.Locale.US, "%.2f", value), + text = String.format(Locale.US, "%.2f", value), style = MaterialTheme.typography.bodySmall ) } @@ -108,7 +109,7 @@ fun CustomColorPickerDialog( Spacer(modifier = Modifier.height(16.dp)) val hexString = - String.format(java.util.Locale.US, "%08x", currentColor.toColor().toArgb()) + String.format(Locale.US, "%08x", currentColor.toColor().toArgb()) Text( text = hexString, style = MaterialTheme.typography.bodyMedium, diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphMenus.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphMenus.kt index cc1705c8..fe59cdba 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphMenus.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphMenus.kt @@ -76,8 +76,8 @@ import androidx.compose.ui.zIndex import androidx.ink.brush.BrushFamily import androidx.ink.brush.StockBrushes import com.example.cahier.R +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.ui.LocalTextureStore -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.example.cahier.developer.brushgraph.data.TutorialStep import com.example.cahier.features.drawing.CustomBrushes diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphScreen.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphScreen.kt index f0174c60..d8926451 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphScreen.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/BrushGraphScreen.kt @@ -74,7 +74,6 @@ import androidx.window.core.layout.WindowWidthSizeClass import com.example.cahier.R import com.example.cahier.core.ui.LocalTextureStore import com.example.cahier.core.ui.theme.CahierAppTheme -import com.example.cahier.developer.brushdesigner.ui.CustomColorPickerDialog import com.example.cahier.developer.brushgraph.data.DisplayText import com.example.cahier.developer.brushgraph.data.GraphPoint import com.example.cahier.developer.brushgraph.data.TutorialAction diff --git a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NumericField.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/NumericField.kt similarity index 97% rename from app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NumericField.kt rename to app/src/main/java/com/example/cahier/developer/brushgraph/ui/NumericField.kt index 60a43876..fdc3995a 100644 --- a/app/src/main/java/com/example/cahier/developer/brushdesigner/ui/NumericField.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/NumericField.kt @@ -14,7 +14,7 @@ * limitations under the License. */ -package com.example.cahier.developer.brushdesigner.ui +package com.example.cahier.developer.brushgraph.ui import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.combinedClickable @@ -44,6 +44,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp import com.example.cahier.R +import java.util.Locale import kotlin.math.PI /** @@ -60,7 +61,7 @@ class NumericLimits( val max: Float, val step: Float = 0.01f, val displayUnit: String = "", - val unitScale: Float = 1.0f + val unitScale: Float = 1.0f, ) { /** Convert a display value back to the real value as described by [unitScale]. */ fun toRealValue(displayValue: Float): Float = displayValue / unitScale @@ -73,7 +74,7 @@ class NumericLimits( val formatted = if (displayValue == displayValue.toLong().toFloat()) { displayValue.toLong().toString() } else { - String.format(java.util.Locale.US, "%.2f", displayValue) + String.format(Locale.US, "%.2f", displayValue) } return "$formatted$displayUnit" } @@ -82,7 +83,7 @@ class NumericLimits( /** Values stored as 0..1 shown as 0..100% */ fun floatShownAsPercent( minPercent: Float = 0f, - maxPercent: Float = 100f + maxPercent: Float = 100f, ): NumericLimits = NumericLimits( min = minPercent, @@ -95,7 +96,7 @@ class NumericLimits( /** Values stored in radians, shown in degrees */ fun radiansShownAsDegrees( minDegrees: Float, - maxDegrees: Float + maxDegrees: Float, ): NumericLimits = NumericLimits( min = minDegrees, @@ -127,7 +128,7 @@ internal fun NumericField( value: Float, limits: NumericLimits, onValueChangeFinished: (() -> Unit)? = null, - onValueChanged: (Float) -> Unit + onValueChanged: (Float) -> Unit, ) { val displayValue = limits.fromRealValue(value) var showTextInput by remember { mutableStateOf(false) } diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/BinaryOpNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/BinaryOpNodeFields.kt index c79d5d95..e45371d1 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/BinaryOpNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/BinaryOpNodeFields.kt @@ -20,7 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ColorFunctionNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ColorFunctionNodeFields.kt index 8c34f2c3..c3c5f1a5 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ColorFunctionNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ColorFunctionNodeFields.kt @@ -35,12 +35,12 @@ import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.getColorFunctionTooltip import ink.proto.Color as ProtoColor import ink.proto.ColorFunction as ProtoColorFunction diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ConstantNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ConstantNodeFields.kt index 99531445..95134d21 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ConstantNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ConstantNodeFields.kt @@ -20,9 +20,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/DampingNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/DampingNodeFields.kt index 8e1b8cd2..30aae0b2 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/DampingNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/DampingNodeFields.kt @@ -21,24 +21,24 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.ProgressDomainContext import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.data.getNumericLimits +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField import com.example.cahier.developer.brushgraph.ui.getTooltip import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable fun DampingNodeFields( - dampingNode: ProtoBrushBehavior.DampingNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - onFieldEditComplete: () -> Unit, - onDropdownEditComplete: () -> Unit, - modifier: Modifier = Modifier, + dampingNode: ProtoBrushBehavior.DampingNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + onFieldEditComplete: () -> Unit, + onDropdownEditComplete: () -> Unit, + modifier: Modifier = Modifier, ) { val limits = dampingNode.dampingSource.getNumericLimits(ProgressDomainContext.DAMPING) Column(modifier = modifier) { diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/FamilyNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/FamilyNodeFields.kt index 00fe613a..1ab75ebb 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/FamilyNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/FamilyNodeFields.kt @@ -28,12 +28,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.getInputModelTooltip import ink.proto.BrushFamily as ProtoBrushFamily diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/IntegralNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/IntegralNodeFields.kt index 853c2c6a..0dcd1e43 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/IntegralNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/IntegralNodeFields.kt @@ -23,22 +23,22 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.ProgressDomainContext import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.data.getNumericLimits +import com.example.cahier.developer.brushgraph.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.NumericField import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable fun IntegralNodeFields( - integralNode: ProtoBrushBehavior.IntegralNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - onFieldEditComplete: () -> Unit, - onDropdownEditComplete: () -> Unit, - modifier: Modifier = Modifier, + integralNode: ProtoBrushBehavior.IntegralNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + onFieldEditComplete: () -> Unit, + onDropdownEditComplete: () -> Unit, + modifier: Modifier = Modifier, ) { val limits = integralNode.integrateOver.getNumericLimits(ProgressDomainContext.INTEGRAL) Column(modifier = modifier) { diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/InterpolationNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/InterpolationNodeFields.kt index 625dbdb8..80c72a3e 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/InterpolationNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/InterpolationNodeFields.kt @@ -20,7 +20,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip @@ -29,10 +29,10 @@ import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable fun InterpolationNodeFields( - interpNode: ProtoBrushBehavior.InterpolationNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - modifier: Modifier = Modifier, + interpNode: ProtoBrushBehavior.InterpolationNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + modifier: Modifier = Modifier, ) { FieldWithTooltip( modifier = modifier, diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/NoiseNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/NoiseNodeFields.kt index 3ad44f7a..6b9d2433 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/NoiseNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/NoiseNodeFields.kt @@ -21,26 +21,26 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.ProgressDomainContext import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.data.getNumericLimits +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.getTooltip import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable fun NoiseNodeFields( - noiseNode: ProtoBrushBehavior.NoiseNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - onFieldEditComplete: () -> Unit, - onDropdownEditComplete: () -> Unit, - textFieldsLocked: Boolean, - modifier: Modifier = Modifier, + noiseNode: ProtoBrushBehavior.NoiseNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + onFieldEditComplete: () -> Unit, + onDropdownEditComplete: () -> Unit, + textFieldsLocked: Boolean, + modifier: Modifier = Modifier, ) { val limits = noiseNode.varyOver.getNumericLimits(ProgressDomainContext.NOISE) diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PaintNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PaintNodeFields.kt index 57615b51..107a5229 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PaintNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PaintNodeFields.kt @@ -22,7 +22,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip @@ -31,10 +31,10 @@ import ink.proto.BrushPaint as ProtoBrushPaint @Composable fun PaintNodeFields( - data: NodeData.Paint, - onUpdate: (NodeData) -> Unit, - onDropdownEditComplete: () -> Unit, - modifier: Modifier = Modifier, + data: NodeData.Paint, + onUpdate: (NodeData) -> Unit, + onDropdownEditComplete: () -> Unit, + modifier: Modifier = Modifier, ) { val paint = data.paint FieldWithTooltip( diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PolarTargetNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PolarTargetNodeFields.kt index 76732813..1d79cd01 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PolarTargetNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/PolarTargetNodeFields.kt @@ -21,23 +21,23 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.getTooltip import ink.proto.BrushBehavior as ProtoBrushBehavior @Composable fun PolarTargetNodeFields( - polarNode: ProtoBrushBehavior.PolarTargetNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - onFieldEditComplete: () -> Unit, - onDropdownEditComplete: () -> Unit, - modifier: Modifier = Modifier, + polarNode: ProtoBrushBehavior.PolarTargetNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + onFieldEditComplete: () -> Unit, + onDropdownEditComplete: () -> Unit, + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { FieldWithTooltip( diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ResponseNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ResponseNodeFields.kt index 5140e230..64a50cc2 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ResponseNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/ResponseNodeFields.kt @@ -44,11 +44,11 @@ import androidx.compose.ui.geometry.Offset import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId +import com.example.cahier.developer.brushgraph.ui.EnumDropdown +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import ink.proto.LinearEasingFunction import kotlin.math.ceil import kotlin.math.floor @@ -61,10 +61,10 @@ import ink.proto.StepsEasingFunction as ProtoSteps @Composable fun ResponseNodeFields( - responseNode: ProtoBrushBehavior.ResponseNode, - behaviorNode: ProtoBrushBehavior.Node, - onUpdate: (NodeData) -> Unit, - modifier: Modifier = Modifier, + responseNode: ProtoBrushBehavior.ResponseNode, + behaviorNode: ProtoBrushBehavior.Node, + onUpdate: (NodeData) -> Unit, + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { CurvePreviewWidget( @@ -91,9 +91,9 @@ fun CurvePreviewWidget( ) { BoxWithConstraints( modifier = modifier - .height(120.dp) - .fillMaxWidth() - .border(1.dp, MaterialTheme.colorScheme.outlineVariant) + .height(120.dp) + .fillMaxWidth() + .border(1.dp, MaterialTheme.colorScheme.outlineVariant) ) { val widthPx = constraints.maxWidth.toFloat() val heightPx = constraints.maxHeight.toFloat() @@ -339,8 +339,8 @@ fun ResponseCurveWidget( Box( modifier = Modifier - .padding(vertical = 8.dp) - .border(1.dp, MaterialTheme.colorScheme.outlineVariant) + .padding(vertical = 8.dp) + .border(1.dp, MaterialTheme.colorScheme.outlineVariant) ) { when (currentCase) { ProtoBrushBehavior.ResponseNode.ResponseCurveCase.CUBIC_BEZIER_RESPONSE_CURVE -> @@ -465,9 +465,9 @@ fun LinearWidget( @Composable fun CubicBezierWidget( - curve: ProtoCubicBezier, - modifier: Modifier = Modifier, - onCurveChanged: (ProtoCubicBezier) -> Unit, + curve: ProtoCubicBezier, + modifier: Modifier = Modifier, + onCurveChanged: (ProtoCubicBezier) -> Unit, ) { Column(modifier = modifier.padding(8.dp)) { NumericField( @@ -495,9 +495,9 @@ fun CubicBezierWidget( @Composable fun StepsWidget( - curve: ProtoSteps, - modifier: Modifier = Modifier, - onCurveChanged: (ProtoSteps) -> Unit, + curve: ProtoSteps, + modifier: Modifier = Modifier, + onCurveChanged: (ProtoSteps) -> Unit, ) { Column(modifier = modifier.padding(8.dp)) { NumericField( diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/SourceNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/SourceNodeFields.kt index b92a7616..fa5282a2 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/SourceNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/SourceNodeFields.kt @@ -42,12 +42,12 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.data.getNumericLimits +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField import com.example.cahier.developer.brushgraph.ui.TooltipDialog import com.example.cahier.developer.brushgraph.ui.getTooltip import ink.proto.BrushBehavior as ProtoBrushBehavior @@ -83,8 +83,8 @@ fun SourceNodeFields( label = { Text(stringResource(R.string.bg_source)) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expandedSource) }, modifier = Modifier - .menuAnchor() - .fillMaxWidth() + .menuAnchor() + .fillMaxWidth() ) ExposedDropdownMenu( expanded = expandedSource, diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TargetNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TargetNodeFields.kt index 14cd0442..4394e313 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TargetNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TargetNodeFields.kt @@ -42,10 +42,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.NumericField import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.data.getNumericLimits +import com.example.cahier.developer.brushgraph.ui.NumericField import com.example.cahier.developer.brushgraph.ui.TooltipDialog import com.example.cahier.developer.brushgraph.ui.getTooltip import ink.proto.BrushBehavior as ProtoBrushBehavior @@ -81,8 +81,8 @@ fun TargetNodeFields( label = { Text(stringResource(R.string.bg_target)) }, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expandedTarget) }, modifier = Modifier - .menuAnchor() - .fillMaxWidth() + .menuAnchor() + .fillMaxWidth() ) ExposedDropdownMenu( expanded = expandedTarget, diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TextureLayerNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TextureLayerNodeFields.kt index b5f4dd46..003f58fc 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TextureLayerNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TextureLayerNodeFields.kt @@ -35,13 +35,13 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.ink.rendering.android.canvas.CanvasStrokeRenderer import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.EnumDropdown -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData import com.example.cahier.developer.brushgraph.data.displayStringRId import com.example.cahier.developer.brushgraph.ui.BlendModePreviewWidget +import com.example.cahier.developer.brushgraph.ui.EnumDropdown import com.example.cahier.developer.brushgraph.ui.FieldWithTooltip +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.TextureLayerPreviewWidget import com.example.cahier.developer.brushgraph.ui.TextureWrapPreviewWidget import com.example.cahier.developer.brushgraph.ui.getTooltip @@ -49,12 +49,12 @@ import ink.proto.BrushPaint as ProtoBrushPaint @Composable fun TextureLayerNodeFields( - layer: ProtoBrushPaint.TextureLayer, - allTextureIds: Set, - onLoadTexture: () -> Unit, - onUpdate: (NodeData.TextureLayer) -> Unit, - strokeRenderer: CanvasStrokeRenderer, - modifier: Modifier = Modifier, + layer: ProtoBrushPaint.TextureLayer, + allTextureIds: Set, + onLoadTexture: () -> Unit, + onUpdate: (NodeData.TextureLayer) -> Unit, + strokeRenderer: CanvasStrokeRenderer, + modifier: Modifier = Modifier, ) { Column(modifier = modifier) { Row(verticalAlignment = Alignment.Bottom, modifier = Modifier.padding(bottom = 8.dp)) { diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TipNodeFields.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TipNodeFields.kt index d36a9175..4461c9ae 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TipNodeFields.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/ui/fields/TipNodeFields.kt @@ -21,18 +21,18 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.ink.rendering.android.canvas.CanvasStrokeRenderer import com.example.cahier.R -import com.example.cahier.developer.brushdesigner.ui.NumericField -import com.example.cahier.developer.brushdesigner.ui.NumericLimits import com.example.cahier.developer.brushgraph.data.NodeData +import com.example.cahier.developer.brushgraph.ui.NumericField +import com.example.cahier.developer.brushgraph.ui.NumericLimits import com.example.cahier.developer.brushgraph.ui.TipPreviewWidget @Composable fun TipNodeFields( - data: NodeData.Tip, - onUpdate: (NodeData) -> Unit, - onFieldEditComplete: () -> Unit, - strokeRenderer: CanvasStrokeRenderer, - modifier: Modifier = Modifier, + data: NodeData.Tip, + onUpdate: (NodeData) -> Unit, + onFieldEditComplete: () -> Unit, + strokeRenderer: CanvasStrokeRenderer, + modifier: Modifier = Modifier, ) { val tip = data.tip Column(modifier = modifier) { diff --git a/app/src/main/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModel.kt b/app/src/main/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModel.kt index f007629f..c84e3a60 100644 --- a/app/src/main/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModel.kt +++ b/app/src/main/java/com/example/cahier/developer/brushgraph/viewmodel/BrushGraphViewModel.kt @@ -29,9 +29,9 @@ import androidx.ink.storage.decode import androidx.ink.storage.encode import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.example.cahier.core.data.CustomBrushDao +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.ui.CahierTextureBitmapStore -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.example.cahier.developer.brushgraph.data.BrushGraphRepository import com.example.cahier.developer.brushgraph.data.DisplayText import com.example.cahier.developer.brushgraph.data.GraphEdge diff --git a/app/src/main/java/com/example/cahier/features/drawing/viewmodel/DrawingCanvasViewModel.kt b/app/src/main/java/com/example/cahier/features/drawing/viewmodel/DrawingCanvasViewModel.kt index eadeede0..939c6427 100644 --- a/app/src/main/java/com/example/cahier/features/drawing/viewmodel/DrawingCanvasViewModel.kt +++ b/app/src/main/java/com/example/cahier/features/drawing/viewmodel/DrawingCanvasViewModel.kt @@ -51,15 +51,15 @@ import coil3.ImageLoader import coil3.request.ImageRequest import coil3.request.allowHardware import coil3.toBitmap +import com.example.cahier.core.data.AUTOSAVE_KEY import com.example.cahier.core.data.CustomBrush +import com.example.cahier.core.data.CustomBrushDao +import com.example.cahier.core.data.CustomBrushEntity import com.example.cahier.core.data.NotesRepository import com.example.cahier.core.navigation.DrawingCanvasDestination import com.example.cahier.core.ui.CahierTextureBitmapStore import com.example.cahier.core.ui.CahierUiState import com.example.cahier.core.utils.FileHelper -import com.example.cahier.developer.brushdesigner.data.AUTOSAVE_KEY -import com.example.cahier.developer.brushdesigner.data.CustomBrushDao -import com.example.cahier.developer.brushdesigner.data.CustomBrushEntity import com.example.cahier.features.drawing.CustomBrushes import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.qualifiers.ApplicationContext diff --git a/app/src/testShared/java/com/example/cahier/developer/brushdesigner/data/FakeCustomBrushDao.kt b/app/src/testShared/java/com/example/cahier/developer/brushdesigner/data/FakeCustomBrushDao.kt index 285617fa..49c4d022 100644 --- a/app/src/testShared/java/com/example/cahier/developer/brushdesigner/data/FakeCustomBrushDao.kt +++ b/app/src/testShared/java/com/example/cahier/developer/brushdesigner/data/FakeCustomBrushDao.kt @@ -1,5 +1,7 @@ package com.example.cahier.developer.brushdesigner.data +import com.example.cahier.core.data.CustomBrushDao +import com.example.cahier.core.data.CustomBrushEntity import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow