@ -32,7 +32,6 @@ import androidx.compose.material.TextField
import androidx.compose.material.TextFieldDefaults
import androidx.compose.material.TriStateCheckbox
import androidx.compose.runtime.Composable
import androidx.compose.runtime.MutableState
import androidx.compose.runtime.State
import androidx.compose.runtime.livedata.observeAsState
import androidx.compose.runtime.mutableStateOf
@ -44,7 +43,6 @@ import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.state.ToggleableState
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import androidx.lifecycle.viewModelScope
import com.google.android.material.composethemeadapter.MdcTheme
@ -69,48 +67,28 @@ class TagPickerActivityCompose : ThemedInjectingAppCompatActivity() {
private val viewModel : TagPickerViewModel by viewModels ( )
private var taskIds : ArrayList < Long > ? = null
private val searchPattern = mutableStateOf ( " " )
override fun onCreate ( savedInstanceState : Bundle ? ) {
super . onCreate ( savedInstanceState )
val intent = intent
taskIds = intent . getSerializableExtra ( TagPickerActivity . EXTRA _TASKS ) as ArrayList < Long > ?
taskIds = intent . getSerializableExtra ( EXTRA _TASKS ) as ArrayList < Long > ?
if ( savedInstanceState == null ) {
val selected = intent . getParcelableArrayListExtra < TagData > ( TagPickerActivity . EXTRA _SELECTED )
val selected = intent . getParcelableArrayListExtra < TagData > ( EXTRA _SELECTED )
if ( selected != null ) {
viewModel . setSelected (
selected , intent . getParcelableArrayListExtra < TagData > ( TagPickerActivity . EXTRA _PARTIALLY _SELECTED )
selected , intent . getParcelableArrayListExtra < TagData > ( EXTRA _PARTIALLY _SELECTED )
)
}
}
searchPattern . value = viewModel . text ?: " "
viewModel . search ( searchPattern . value )
viewModel . search ( " " )
setContent {
MdcTheme {
TagPicker (
searchPattern ,
viewModel . tagsList . observeAsState ( initial = emptyList ( ) ) ,
onTextChange = { newText ->
viewModel . search ( newText ) ; searchPattern . value = newText
} ,
viewModel ,
onBackClicked = { onBackPressed ( ) } ,
checkedState = {
when ( viewModel . getState ( it ) ) {
CheckBoxTriStates . State . CHECKED -> ToggleableState . On
CheckBoxTriStates . State . PARTIALLY _CHECKED -> ToggleableState . Indeterminate
else -> ToggleableState . Off
}
} ,
onTagClicked = {
onToggle (
it ,
viewModel . getState ( it ) != CheckBoxTriStates . State . CHECKED
)
} ,
createTag = { onNewTag ( it . name !! ) ; searchPattern . value = " " } ,
getTagIcon = { tagData -> getIcon ( tagData ) } ,
getTagColor = { tagData -> getColor ( tagData ) }
)
@ -118,14 +96,8 @@ class TagPickerActivityCompose : ThemedInjectingAppCompatActivity() {
}
} /* onCreate */
private fun onToggle ( tag : TagData , checked : Boolean ) =
viewModel . viewModelScope . launch { viewModel . toggle ( tag , checked ) }
private fun onNewTag ( name : String ) =
viewModel . viewModelScope . launch { viewModel . createNew ( name ) }
override fun onBackPressed ( ) {
if ( Strings . isNullOrEmpty ( viewModel . text ) ) {
if ( Strings . isNullOrEmpty ( viewModel . pattern . value ) ) {
val data = Intent ( )
data . putExtra ( EXTRA _TASKS , taskIds )
data . putParcelableArrayListExtra ( EXTRA _PARTIALLY _SELECTED , viewModel . getPartiallySelected ( ) )
@ -133,7 +105,6 @@ class TagPickerActivityCompose : ThemedInjectingAppCompatActivity() {
setResult ( Activity . RESULT _OK , data )
finish ( )
} else {
searchPattern . value = " "
viewModel . search ( " " )
}
} /* onBackPressed */
@ -158,7 +129,7 @@ class TagPickerActivityCompose : ThemedInjectingAppCompatActivity() {
return iconResource
}
/* Copy o g the TagPickerActivity's companion object */
/* Copy o f the TagPickerActivity's companion object */
companion object {
const val EXTRA _SELECTED = " extra_tags "
const val EXTRA _PARTIALLY _SELECTED = " extra_partial "
@ -168,13 +139,8 @@ class TagPickerActivityCompose : ThemedInjectingAppCompatActivity() {
@Composable
internal fun TagPicker (
searchPattern : MutableState < String > ,
tagsList : State < List < TagData > > , /* tags selected in accordance to searchText */
onTextChange : ( String ) -> Unit = { } ,
viewModel : TagPickerViewModel ,
onBackClicked : ( ) -> Unit ,
checkedState : ( TagData ) -> ToggleableState = { ToggleableState . Off } ,
onTagClicked : ( TagData ) -> Unit ,
createTag : ( TagData ) -> Unit ,
getTagIcon : ( TagData ) -> Int ,
getTagColor : ( TagData ) -> Color
) {
@ -182,12 +148,12 @@ internal fun TagPicker(
{
Column ( modifier = Modifier . padding ( horizontal = 12. dp ) ) {
Box ( modifier = Modifier . fillMaxWidth ( ) ) {
SearchBar ( searchPattern, onTextChange , onBackClicked )
SearchBar ( viewModel , onBackClicked )
}
Box (
modifier = Modifier . weight ( 1f )
) {
PickerBox ( tagsList, checkedState , onTagClicked , createTag , getTagIcon , getTagColor )
PickerBox ( viewModel, viewModel . tagsList . observeAsState ( initial = emptyList ( ) ) , getTagIcon , getTagColor )
}
}
}
@ -195,10 +161,10 @@ internal fun TagPicker(
@Composable
internal fun SearchBar (
text : MutableState < String > ,
onTextChange : ( String ) -> Unit ,
viewModel : TagPickerViewModel ,
onBack : ( ) -> Unit
) {
val searchPattern = remember { viewModel . pattern }
val invitation = LocalContext . current . getString ( R . string . enter _tag _name )
Row ( verticalAlignment = Alignment . CenterVertically ) {
Icon (
@ -210,8 +176,8 @@ internal fun SearchBar(
)
TextField (
value = tex t. value ,
onValueChange = { onTextChange( it ) ; text . value = it } ,
value = searchPa ttern . value ,
onValueChange = { viewModel. search ( it ) } ,
placeholder = { Text ( invitation ) } ,
colors = TextFieldDefaults . textFieldColors (
textColor = MaterialTheme . colors . onBackground ,
@ -226,23 +192,39 @@ internal fun SearchBar(
@Composable
internal fun PickerBox (
viewModel : TagPickerViewModel ,
tags : State < List < TagData > > ,
getState : ( TagData ) -> ToggleableState = { ToggleableState . Off } ,
onClick : ( TagData ) -> Unit = { } ,
newItem : ( TagData ) -> Unit = { } ,
getTagIcon : ( TagData ) -> Int = { R . drawable . ic _outline _label _24px } ,
getTagColor : ( TagData ) -> Color = { Color . Gray }
) {
val getState : ( TagData ) -> ToggleableState = {
when ( viewModel . getState ( it ) ) {
CheckBoxTriStates . State . CHECKED -> ToggleableState . On
CheckBoxTriStates . State . PARTIALLY _CHECKED -> ToggleableState . Indeterminate
else -> ToggleableState . Off
}
}
val onClick : ( TagData ) -> Unit = {
viewModel . viewModelScope . launch {
viewModel . toggle ( it , viewModel . getState ( it ) != CheckBoxTriStates . State . CHECKED ) }
}
val newItem : ( TagData ) -> Unit = {
viewModel . viewModelScope . launch { viewModel . createNew ( it . name !! ) ; viewModel . search ( " " ) }
}
LazyColumn {
items ( tags . value , key = { if ( it . id == null ) - 1 else it . id !! } )
{
val checked = remember { mutableStateOf ( getState ( it ) ) }
Row ( modifier = Modifier
. fillMaxWidth ( )
. clickable {
if ( it . id == null ) newItem ( it )
else { onClick ( it ) ; checked . value = getState ( it ) }
} ,
. fillMaxWidth ( )
. clickable {
if ( it . id == null ) newItem ( it )
else {
onClick ( it ) ; checked . value = getState ( it )
}
} ,
verticalAlignment = Alignment . CenterVertically ,
) {
Icon (
@ -255,13 +237,13 @@ internal fun PickerBox(
val text = LocalContext . current . getString ( R . string . new _tag ) + " \" ${it.name!!} \" "
Text ( text ,
modifier = Modifier
. padding ( horizontal = 24. dp )
. clickable { newItem ( it ) } )
. padding ( horizontal = 24. dp )
. clickable { newItem ( it ) } )
} else {
Text ( it . name !! ,
modifier = Modifier
. weight ( 1f )
. padding ( horizontal = 24. dp )
. weight ( 1f )
. padding ( horizontal = 24. dp )
)
TriStateCheckbox (
modifier = Modifier . padding ( 6. dp ) ,
@ -274,10 +256,11 @@ internal fun PickerBox(
}
} /* PickerBox */
/ *
internal fun genTestTags ( ) : List < TagData >
{
var idcc : Long = 1
return " al f a beta gamma delta kappa theta alfa1 beta1 gamma1 delta1 kappa1 theta1"
return " al ph a beta gamma delta kappa theta alfa1 beta1 gamma1 delta1 kappa1 theta1"
. split ( " " )
. map { name -> TagData ( name ) . also { it . id = idcc ++ } }
}
@ -287,4 +270,5 @@ internal fun genTestTags(): List<TagData>
internal fun PickerBoxPreview ( ) {
val list = remember { mutableStateOf ( genTestTags ( ) ) }
PickerBox ( list , getTagColor = { Color . Green } )
}
}
* /