diff --git a/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreen.kt b/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreen.kt index 1ad71e0..6c6eba2 100644 --- a/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreen.kt +++ b/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreen.kt @@ -32,6 +32,7 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.rememberScrollState @@ -49,6 +50,7 @@ import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.PlayArrow import androidx.compose.material.icons.filled.Settings import androidx.compose.material.icons.filled.Share +import androidx.compose.material.icons.filled.Warning import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.Card import androidx.compose.material3.DrawerValue @@ -81,11 +83,13 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel +import com.github.umer0586.droidpad.R import com.github.umer0586.droidpad.data.database.entities.ConnectionType import com.github.umer0586.droidpad.data.database.entities.ControlPad import com.github.umer0586.droidpad.data.database.entities.Orientation @@ -320,6 +324,9 @@ fun ControlPadsScreenContent( }, onBuildClick = { onUiEvent(ControlPadsScreenEvent.OnBuildClick(it)) + }, + onDuplicateClick = { + onUiEvent(ControlPadsScreenEvent.OnDuplicateClick(it)) } ) @@ -340,7 +347,8 @@ private fun ItemCard( onDeleteClick: ((ControlPad) -> Unit)? = null, onPlayClick: ((ControlPad) -> Unit)? = null, onSettingClick: ((ControlPad) -> Unit)? = null, - onBuildClick: ((ControlPad) -> Unit)? = null + onBuildClick: ((ControlPad) -> Unit)? = null, + onDuplicateClick: ((ControlPad) -> Unit)? = null, ){ Card( @@ -443,6 +451,19 @@ private fun ItemCard( } ) + IconButton( + onClick = { + onDuplicateClick?.invoke(controlPad) + }, + content = { + Icon( + modifier = Modifier.size(25.dp), + painter = painterResource(R.drawable.ic_copy), + contentDescription = "DuplicateIcon" + ) + } + ) + } diff --git a/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreenViewModel.kt b/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreenViewModel.kt index feadad0..b2722bf 100644 --- a/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreenViewModel.kt +++ b/app/src/main/java/com/github/umer0586/droidpad/ui/screens/controlpadsscreen/ControlPadsScreenViewModel.kt @@ -25,7 +25,9 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.github.umer0586.droidpad.data.database.entities.ConnectionType import com.github.umer0586.droidpad.data.database.entities.ControlPad +import com.github.umer0586.droidpad.data.database.entities.ControlPadItem import com.github.umer0586.droidpad.data.repositories.ConnectionConfigRepository +import com.github.umer0586.droidpad.data.repositories.ControlPadItemRepository import com.github.umer0586.droidpad.data.repositories.ControlPadRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -50,6 +52,7 @@ sealed interface ControlPadsScreenEvent { data class OnEditClick(val controlPad: ControlPad) : ControlPadsScreenEvent data class OnBuildClick(val controlPad: ControlPad) : ControlPadsScreenEvent data class OnSettingClick(val controlPad: ControlPad) : ControlPadsScreenEvent + data class OnDuplicateClick(val controlPad: ControlPad) : ControlPadsScreenEvent // Indicates that user clicked the "+" floating action button data object OnCreateClick : ControlPadsScreenEvent data object OnExitClick : ControlPadsScreenEvent @@ -62,7 +65,8 @@ sealed interface ControlPadsScreenEvent { @HiltViewModel class ControlPadsScreenViewModel @Inject constructor( private val controlPadsRepository: ControlPadRepository, - private val connectionConfigRepository: ConnectionConfigRepository + private val connectionConfigRepository: ConnectionConfigRepository, + private val controlPadItemRepository: ControlPadItemRepository ) : ViewModel(){ private val _uiState = MutableStateFlow(ControlPadsScreenState()) @@ -116,9 +120,48 @@ class ControlPadsScreenViewModel @Inject constructor( it.copy(itemToBeEdited = event.controlPad) } } + is ControlPadsScreenEvent.OnDuplicateClick -> { + viewModelScope.launch { + createAndSaveDuplicate(event.controlPad) + } + } else -> { } } } + + private suspend fun createAndSaveDuplicate(controlPad: ControlPad){ + + val duplicateControlPad = ControlPad( + name = controlPad.name, + orientation = controlPad.orientation, + ) + + controlPadsRepository.saveControlPad(duplicateControlPad) + .also { duplicateControlPadId -> + + controlPadsRepository.getControlPadItemsOf(controlPad) + .forEach { controlPadItem -> + val duplicateControlPadItem = controlPadItem.copy( + id = 0, // // its not zero, it will be auto-generated (unique) when save in DB + controlPadId = duplicateControlPadId + ) + controlPadItemRepository.save(duplicateControlPadItem) + } + + connectionConfigRepository.getConfigForControlPad(controlPad.id) + ?.also { connectionConfig -> + connectionConfigRepository.save( + connectionConfig.copy( + id = 0, // its not zero, it will be auto-generated (unique) when save in DB + controlPadId = duplicateControlPadId + ) + ) + _uiState.value.controlPadConnectionTypeMap[duplicateControlPadId] = connectionConfig.connectionType + } + + + } + } } \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_copy.xml b/app/src/main/res/drawable/ic_copy.xml new file mode 100644 index 0000000..c62e507 --- /dev/null +++ b/app/src/main/res/drawable/ic_copy.xml @@ -0,0 +1,12 @@ + + + +