|
|
|
@ -7,65 +7,34 @@ import android.text.TextUtils |
|
|
|
import android.view.LayoutInflater |
|
|
|
import android.view.View |
|
|
|
import android.view.ViewGroup |
|
|
|
import androidx.recyclerview.widget.AsyncDifferConfig |
|
|
|
import androidx.recyclerview.widget.DiffUtil |
|
|
|
import androidx.recyclerview.widget.ListAdapter |
|
|
|
import androidx.recyclerview.widget.RecyclerView |
|
|
|
import org.yuzu.yuzu_emu.R |
|
|
|
import org.yuzu.yuzu_emu.databinding.CardDriverOptionBinding |
|
|
|
import org.yuzu.yuzu_emu.model.Driver |
|
|
|
import org.yuzu.yuzu_emu.model.DriverViewModel |
|
|
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper |
|
|
|
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata |
|
|
|
import org.yuzu.yuzu_emu.viewholder.AbstractViewHolder |
|
|
|
|
|
|
|
class DriverAdapter(private val driverViewModel: DriverViewModel) : |
|
|
|
ListAdapter<Pair<String, GpuDriverMetadata>, DriverAdapter.DriverViewHolder>( |
|
|
|
AsyncDifferConfig.Builder(DiffCallback()).build() |
|
|
|
AbstractSingleSelectionList<Driver, DriverAdapter.DriverViewHolder>( |
|
|
|
driverViewModel.driverList.value |
|
|
|
) { |
|
|
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DriverViewHolder { |
|
|
|
val binding = |
|
|
|
CardDriverOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false) |
|
|
|
return DriverViewHolder(binding) |
|
|
|
} |
|
|
|
|
|
|
|
override fun getItemCount(): Int = currentList.size |
|
|
|
|
|
|
|
override fun onBindViewHolder(holder: DriverViewHolder, position: Int) = |
|
|
|
holder.bind(currentList[position]) |
|
|
|
|
|
|
|
private fun onSelectDriver(position: Int) { |
|
|
|
driverViewModel.setSelectedDriverIndex(position) |
|
|
|
notifyItemChanged(driverViewModel.previouslySelectedDriver) |
|
|
|
notifyItemChanged(driverViewModel.selectedDriver) |
|
|
|
} |
|
|
|
|
|
|
|
private fun onDeleteDriver(driverData: Pair<String, GpuDriverMetadata>, position: Int) { |
|
|
|
if (driverViewModel.selectedDriver > position) { |
|
|
|
driverViewModel.setSelectedDriverIndex(driverViewModel.selectedDriver - 1) |
|
|
|
} |
|
|
|
if (GpuDriverHelper.customDriverSettingData == driverData.second) { |
|
|
|
driverViewModel.setSelectedDriverIndex(0) |
|
|
|
} |
|
|
|
driverViewModel.driversToDelete.add(driverData.first) |
|
|
|
driverViewModel.removeDriver(driverData) |
|
|
|
notifyItemRemoved(position) |
|
|
|
notifyItemChanged(driverViewModel.selectedDriver) |
|
|
|
CardDriverOptionBinding.inflate(LayoutInflater.from(parent.context), parent, false) |
|
|
|
.also { return DriverViewHolder(it) } |
|
|
|
} |
|
|
|
|
|
|
|
inner class DriverViewHolder(val binding: CardDriverOptionBinding) : |
|
|
|
RecyclerView.ViewHolder(binding.root) { |
|
|
|
private lateinit var driverData: Pair<String, GpuDriverMetadata> |
|
|
|
|
|
|
|
fun bind(driverData: Pair<String, GpuDriverMetadata>) { |
|
|
|
this.driverData = driverData |
|
|
|
val driver = driverData.second |
|
|
|
|
|
|
|
AbstractViewHolder<Driver>(binding) { |
|
|
|
override fun bind(model: Driver) { |
|
|
|
binding.apply { |
|
|
|
radioButton.isChecked = driverViewModel.selectedDriver == bindingAdapterPosition |
|
|
|
radioButton.isChecked = model.selected |
|
|
|
root.setOnClickListener { |
|
|
|
onSelectDriver(bindingAdapterPosition) |
|
|
|
selectItem(bindingAdapterPosition) { driverViewModel.onDriverSelected(it) } |
|
|
|
} |
|
|
|
buttonDelete.setOnClickListener { |
|
|
|
onDeleteDriver(driverData, bindingAdapterPosition) |
|
|
|
removeSelectableItem( |
|
|
|
bindingAdapterPosition |
|
|
|
) { removedPosition: Int, selectedPosition: Int -> |
|
|
|
driverViewModel.onDriverRemoved(removedPosition, selectedPosition) |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
// Delay marquee by 3s |
|
|
|
@ -80,38 +49,19 @@ class DriverAdapter(private val driverViewModel: DriverViewModel) : |
|
|
|
}, |
|
|
|
3000 |
|
|
|
) |
|
|
|
if (driver.name == null) { |
|
|
|
title.setText(R.string.system_gpu_driver) |
|
|
|
description.text = "" |
|
|
|
version.text = "" |
|
|
|
version.visibility = View.GONE |
|
|
|
description.visibility = View.GONE |
|
|
|
buttonDelete.visibility = View.GONE |
|
|
|
} else { |
|
|
|
title.text = driver.name |
|
|
|
version.text = driver.version |
|
|
|
description.text = driver.description |
|
|
|
title.text = model.title |
|
|
|
version.text = model.version |
|
|
|
description.text = model.description |
|
|
|
if (model.description.isNotEmpty()) { |
|
|
|
version.visibility = View.VISIBLE |
|
|
|
description.visibility = View.VISIBLE |
|
|
|
buttonDelete.visibility = View.VISIBLE |
|
|
|
} else { |
|
|
|
version.visibility = View.GONE |
|
|
|
description.visibility = View.GONE |
|
|
|
buttonDelete.visibility = View.GONE |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
private class DiffCallback : DiffUtil.ItemCallback<Pair<String, GpuDriverMetadata>>() { |
|
|
|
override fun areItemsTheSame( |
|
|
|
oldItem: Pair<String, GpuDriverMetadata>, |
|
|
|
newItem: Pair<String, GpuDriverMetadata> |
|
|
|
): Boolean { |
|
|
|
return oldItem.first == newItem.first |
|
|
|
} |
|
|
|
|
|
|
|
override fun areContentsTheSame( |
|
|
|
oldItem: Pair<String, GpuDriverMetadata>, |
|
|
|
newItem: Pair<String, GpuDriverMetadata> |
|
|
|
): Boolean { |
|
|
|
return oldItem.second == newItem.second |
|
|
|
} |
|
|
|
} |
|
|
|
} |