mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-10-31 23:06:43 +08:00 
			
		
		
		
	android: Refactor DriverAdapter to use AbstractSingleSelectionList
This commit is contained in:
		
							parent
							
								
									b17db2b462
								
							
						
					
					
						commit
						93239f191a
					
				| @ -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 | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user