feat: update attribute value in list when updated

This commit is contained in:
Akash Yadav
2022-12-03 19:11:38 +05:30
parent e8fda92985
commit 31ee94ed4f
4 changed files with 33 additions and 3 deletions
Binary file not shown.
@@ -20,10 +20,15 @@ package com.itsaky.androidide.uidesigner.adapters
import android.annotation.SuppressLint
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.Observer
import androidx.recyclerview.widget.RecyclerView
import com.itsaky.androidide.inflater.IAttribute
import com.itsaky.androidide.inflater.IView
import com.itsaky.androidide.inflater.IView.SingleAttributeChangeListener
import com.itsaky.androidide.uidesigner.adapters.ViewAttrListAdapter.VH
import com.itsaky.androidide.uidesigner.databinding.LayoutViewattrItemBinding
import com.itsaky.androidide.uidesigner.viewmodel.WorkspaceViewModel
/**
* A [RecyclerView.Adapter] which shows the list of attributes of the selected view in the UI
@@ -31,7 +36,8 @@ import com.itsaky.androidide.uidesigner.databinding.LayoutViewattrItemBinding
*
* @author Akash Yadav
*/
class ViewAttrListAdapter(attributes: List<IAttribute>, private val onClick: (IAttribute) -> Unit) : RecyclerView.Adapter<VH>() {
class ViewAttrListAdapter(attributes: List<IAttribute>, private val viewModel: WorkspaceViewModel?, private val onClick: (IAttribute) -> Unit) :
RecyclerView.Adapter<VH>() {
private val attributes = attributes.sortedBy { it.name }
@@ -55,6 +61,21 @@ class ViewAttrListAdapter(attributes: List<IAttribute>, private val onClick: (IA
binding.root.setOnClickListener {
onClick(attr)
val viewModel = this.viewModel ?: return@setOnClickListener
val attrUpdateListener = object : SingleAttributeChangeListener() {
override fun onAttributeUpdated(view: IView, attribute: IAttribute, oldValue: String) {
binding.attrValue.text = attribute.value
}
}
val viewInfoScreenObserver = object : Observer<Int> {
override fun onChanged(t: Int?) {
if (t == WorkspaceViewModel.SCREEN_VIEW_INFO) {
viewModel._viewInfoScreen.removeObserver(this)
}
}
}
viewModel._viewInfoScreen.observe(binding.root.context as LifecycleOwner, viewInfoScreenObserver)
viewModel.view?.registerAttributeChangeListener(attrUpdateListener)
}
}
}
@@ -24,6 +24,9 @@ import android.view.ViewGroup
import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels
import com.google.android.material.bottomsheet.BottomSheetDialogFragment
import com.itsaky.androidide.inflater.IAttribute
import com.itsaky.androidide.inflater.IView
import com.itsaky.androidide.inflater.IView.SingleAttributeChangeListener
import com.itsaky.androidide.uidesigner.adapters.ViewAttrListAdapter
import com.itsaky.androidide.uidesigner.databinding.LayoutViewInfoBinding
import com.itsaky.androidide.uidesigner.databinding.LayoutViewInfoHeaderBinding
@@ -49,7 +52,7 @@ class ViewInfoFragment : Fragment() {
field = value
header = LayoutViewInfoHeaderBinding.bind(value.root)
}
private var header: LayoutViewInfoHeaderBinding? = null
companion object {
@@ -83,7 +86,7 @@ class ViewInfoFragment : Fragment() {
header.name.text = view.simpleName
header.desc.text = view.name
binding.attrList.adapter =
ViewAttrListAdapter(view.attributes) {
ViewAttrListAdapter(view.attributes, viewModel) {
viewModel.selectedAttr = it
viewModel.viewInfoScreen = SCREEN_VALUE_EDITOR
}
@@ -146,4 +146,10 @@ interface IView {
*/
fun onAttributeUpdated(view: IView, attribute: IAttribute, oldValue: String)
}
open class SingleAttributeChangeListener : AttributeChangeListener {
override fun onAttributeAdded(view: IView, attribute: IAttribute) {}
override fun onAttributeRemoved(view: IView, attribute: IAttribute) {}
override fun onAttributeUpdated(view: IView, attribute: IAttribute, oldValue: String) {}
}
}