diff options
| author | 2024-02-20 08:06:56 -0500 | |
|---|---|---|
| committer | 2024-02-20 08:06:56 -0500 | |
| commit | 0e5972b0b58306bed360e29f6fc26d62f5288ea0 (patch) | |
| tree | 804fa939a0537950b072ad25ebe896979aad0397 | |
| parent | Import keys from filesystem. (#13056) (diff) | |
| download | yuzu-0e5972b0b58306bed360e29f6fc26d62f5288ea0.tar.gz yuzu-0e5972b0b58306bed360e29f6fc26d62f5288ea0.tar.xz yuzu-0e5972b0b58306bed360e29f6fc26d62f5288ea0.zip | |
android: Add StringInputSetting settings item
5 files changed, 104 insertions, 0 deletions
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt index 03d81ceb3..40d7c4df7 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/SettingsItem.kt | |||
| @@ -90,6 +90,7 @@ abstract class SettingsItem( | |||
| 90 | const val TYPE_INPUT = 8 | 90 | const val TYPE_INPUT = 8 |
| 91 | const val TYPE_INT_SINGLE_CHOICE = 9 | 91 | const val TYPE_INT_SINGLE_CHOICE = 9 |
| 92 | const val TYPE_INPUT_PROFILE = 10 | 92 | const val TYPE_INPUT_PROFILE = 10 |
| 93 | const val TYPE_STRING_INPUT = 11 | ||
| 93 | 94 | ||
| 94 | const val FASTMEM_COMBINED = "fastmem_combined" | 95 | const val FASTMEM_COMBINED = "fastmem_combined" |
| 95 | 96 | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringInputSetting.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringInputSetting.kt new file mode 100644 index 000000000..1eb999416 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/model/view/StringInputSetting.kt | |||
| @@ -0,0 +1,22 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.model.view | ||
| 5 | |||
| 6 | import androidx.annotation.StringRes | ||
| 7 | import org.yuzu.yuzu_emu.features.settings.model.AbstractStringSetting | ||
| 8 | |||
| 9 | class StringInputSetting( | ||
| 10 | setting: AbstractStringSetting, | ||
| 11 | @StringRes titleId: Int = 0, | ||
| 12 | titleString: String = "", | ||
| 13 | @StringRes descriptionId: Int = 0, | ||
| 14 | descriptionString: String = "" | ||
| 15 | ) : SettingsItem(setting, titleId, titleString, descriptionId, descriptionString) { | ||
| 16 | override val type = TYPE_STRING_INPUT | ||
| 17 | |||
| 18 | fun getSelectedValue(needsGlobal: Boolean = false) = setting.getValueAsString(needsGlobal) | ||
| 19 | |||
| 20 | fun setSelectedValue(selection: String) = | ||
| 21 | (setting as AbstractStringSetting).setString(selection) | ||
| 22 | } | ||
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt index 45c8faa10..500ac6e66 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsAdapter.kt | |||
| @@ -85,6 +85,10 @@ class SettingsAdapter( | |||
| 85 | InputProfileViewHolder(ListItemSettingBinding.inflate(inflater), this) | 85 | InputProfileViewHolder(ListItemSettingBinding.inflate(inflater), this) |
| 86 | } | 86 | } |
| 87 | 87 | ||
| 88 | SettingsItem.TYPE_STRING_INPUT -> { | ||
| 89 | StringInputViewHolder(ListItemSettingBinding.inflate(inflater), this) | ||
| 90 | } | ||
| 91 | |||
| 88 | else -> { | 92 | else -> { |
| 89 | HeaderViewHolder(ListItemSettingsHeaderBinding.inflate(inflater), this) | 93 | HeaderViewHolder(ListItemSettingsHeaderBinding.inflate(inflater), this) |
| 90 | } | 94 | } |
| @@ -392,6 +396,15 @@ class SettingsAdapter( | |||
| 392 | popup.show() | 396 | popup.show() |
| 393 | } | 397 | } |
| 394 | 398 | ||
| 399 | fun onStringInputClick(item: StringInputSetting, position: Int) { | ||
| 400 | SettingsDialogFragment.newInstance( | ||
| 401 | settingsViewModel, | ||
| 402 | item, | ||
| 403 | SettingsItem.TYPE_STRING_INPUT, | ||
| 404 | position | ||
| 405 | ).show(fragment.childFragmentManager, SettingsDialogFragment.TAG) | ||
| 406 | } | ||
| 407 | |||
| 395 | fun onLongClick(item: SettingsItem, position: Int): Boolean { | 408 | fun onLongClick(item: SettingsItem, position: Int): Boolean { |
| 396 | SettingsDialogFragment.newInstance( | 409 | SettingsDialogFragment.newInstance( |
| 397 | settingsViewModel, | 410 | settingsViewModel, |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt index a81ff6b1a..7f562a1f4 100644 --- a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/SettingsDialogFragment.kt | |||
| @@ -14,6 +14,7 @@ import androidx.fragment.app.activityViewModels | |||
| 14 | import com.google.android.material.dialog.MaterialAlertDialogBuilder | 14 | import com.google.android.material.dialog.MaterialAlertDialogBuilder |
| 15 | import com.google.android.material.slider.Slider | 15 | import com.google.android.material.slider.Slider |
| 16 | import org.yuzu.yuzu_emu.R | 16 | import org.yuzu.yuzu_emu.R |
| 17 | import org.yuzu.yuzu_emu.databinding.DialogEditTextBinding | ||
| 17 | import org.yuzu.yuzu_emu.databinding.DialogSliderBinding | 18 | import org.yuzu.yuzu_emu.databinding.DialogSliderBinding |
| 18 | import org.yuzu.yuzu_emu.features.input.NativeInput | 19 | import org.yuzu.yuzu_emu.features.input.NativeInput |
| 19 | import org.yuzu.yuzu_emu.features.input.model.AnalogDirection | 20 | import org.yuzu.yuzu_emu.features.input.model.AnalogDirection |
| @@ -23,6 +24,7 @@ import org.yuzu.yuzu_emu.features.settings.model.view.IntSingleChoiceSetting | |||
| 23 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | 24 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem |
| 24 | import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting | 25 | import org.yuzu.yuzu_emu.features.settings.model.view.SingleChoiceSetting |
| 25 | import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting | 26 | import org.yuzu.yuzu_emu.features.settings.model.view.SliderSetting |
| 27 | import org.yuzu.yuzu_emu.features.settings.model.view.StringInputSetting | ||
| 26 | import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting | 28 | import org.yuzu.yuzu_emu.features.settings.model.view.StringSingleChoiceSetting |
| 27 | import org.yuzu.yuzu_emu.utils.ParamPackage | 29 | import org.yuzu.yuzu_emu.utils.ParamPackage |
| 28 | import org.yuzu.yuzu_emu.utils.collect | 30 | import org.yuzu.yuzu_emu.utils.collect |
| @@ -37,6 +39,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener | |||
| 37 | private val settingsViewModel: SettingsViewModel by activityViewModels() | 39 | private val settingsViewModel: SettingsViewModel by activityViewModels() |
| 38 | 40 | ||
| 39 | private lateinit var sliderBinding: DialogSliderBinding | 41 | private lateinit var sliderBinding: DialogSliderBinding |
| 42 | private lateinit var stringInputBinding: DialogEditTextBinding | ||
| 40 | 43 | ||
| 41 | override fun onCreate(savedInstanceState: Bundle?) { | 44 | override fun onCreate(savedInstanceState: Bundle?) { |
| 42 | super.onCreate(savedInstanceState) | 45 | super.onCreate(savedInstanceState) |
| @@ -131,6 +134,18 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener | |||
| 131 | .create() | 134 | .create() |
| 132 | } | 135 | } |
| 133 | 136 | ||
| 137 | SettingsItem.TYPE_STRING_INPUT -> { | ||
| 138 | stringInputBinding = DialogEditTextBinding.inflate(layoutInflater) | ||
| 139 | val item = settingsViewModel.clickedItem as StringInputSetting | ||
| 140 | stringInputBinding.editText.setText(item.getSelectedValue()) | ||
| 141 | MaterialAlertDialogBuilder(requireContext()) | ||
| 142 | .setTitle(item.title) | ||
| 143 | .setView(stringInputBinding.root) | ||
| 144 | .setPositiveButton(android.R.string.ok, this) | ||
| 145 | .setNegativeButton(android.R.string.cancel, defaultCancelListener) | ||
| 146 | .create() | ||
| 147 | } | ||
| 148 | |||
| 134 | SettingsItem.TYPE_STRING_SINGLE_CHOICE -> { | 149 | SettingsItem.TYPE_STRING_SINGLE_CHOICE -> { |
| 135 | val item = settingsViewModel.clickedItem as StringSingleChoiceSetting | 150 | val item = settingsViewModel.clickedItem as StringSingleChoiceSetting |
| 136 | MaterialAlertDialogBuilder(requireContext()) | 151 | MaterialAlertDialogBuilder(requireContext()) |
| @@ -158,6 +173,7 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener | |||
| 158 | ): View? { | 173 | ): View? { |
| 159 | return when (type) { | 174 | return when (type) { |
| 160 | SettingsItem.TYPE_SLIDER -> sliderBinding.root | 175 | SettingsItem.TYPE_SLIDER -> sliderBinding.root |
| 176 | SettingsItem.TYPE_STRING_INPUT -> stringInputBinding.root | ||
| 161 | else -> super.onCreateView(inflater, container, savedInstanceState) | 177 | else -> super.onCreateView(inflater, container, savedInstanceState) |
| 162 | } | 178 | } |
| 163 | } | 179 | } |
| @@ -200,6 +216,13 @@ class SettingsDialogFragment : DialogFragment(), DialogInterface.OnClickListener | |||
| 200 | val sliderSetting = settingsViewModel.clickedItem as SliderSetting | 216 | val sliderSetting = settingsViewModel.clickedItem as SliderSetting |
| 201 | sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value) | 217 | sliderSetting.setSelectedValue(settingsViewModel.sliderProgress.value) |
| 202 | } | 218 | } |
| 219 | |||
| 220 | is StringInputSetting -> { | ||
| 221 | val stringInputSetting = settingsViewModel.clickedItem as StringInputSetting | ||
| 222 | stringInputSetting.setSelectedValue( | ||
| 223 | (stringInputBinding.editText.text ?: "").toString() | ||
| 224 | ) | ||
| 225 | } | ||
| 203 | } | 226 | } |
| 204 | closeDialog() | 227 | closeDialog() |
| 205 | } | 228 | } |
diff --git a/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt new file mode 100644 index 000000000..a4fd36f62 --- /dev/null +++ b/src/android/app/src/main/java/org/yuzu/yuzu_emu/features/settings/ui/viewholder/StringInputViewHolder.kt | |||
| @@ -0,0 +1,45 @@ | |||
| 1 | // SPDX-FileCopyrightText: 2024 yuzu Emulator Project | ||
| 2 | // SPDX-License-Identifier: GPL-2.0-or-later | ||
| 3 | |||
| 4 | package org.yuzu.yuzu_emu.features.settings.ui.viewholder | ||
| 5 | |||
| 6 | import android.view.View | ||
| 7 | import org.yuzu.yuzu_emu.databinding.ListItemSettingBinding | ||
| 8 | import org.yuzu.yuzu_emu.features.settings.model.view.SettingsItem | ||
| 9 | import org.yuzu.yuzu_emu.features.settings.model.view.StringInputSetting | ||
| 10 | import org.yuzu.yuzu_emu.features.settings.ui.SettingsAdapter | ||
| 11 | import org.yuzu.yuzu_emu.utils.ViewUtils.setVisible | ||
| 12 | |||
| 13 | class StringInputViewHolder(val binding: ListItemSettingBinding, adapter: SettingsAdapter) : | ||
| 14 | SettingViewHolder(binding.root, adapter) { | ||
| 15 | private lateinit var setting: StringInputSetting | ||
| 16 | |||
| 17 | override fun bind(item: SettingsItem) { | ||
| 18 | setting = item as StringInputSetting | ||
| 19 | binding.textSettingName.text = setting.title | ||
| 20 | binding.textSettingDescription.setVisible(setting.description.isNotEmpty()) | ||
| 21 | binding.textSettingDescription.text = setting.description | ||
| 22 | binding.textSettingValue.setVisible(true) | ||
| 23 | binding.textSettingValue.text = setting.getSelectedValue() | ||
| 24 | |||
| 25 | binding.buttonClear.setVisible(setting.clearable) | ||
| 26 | binding.buttonClear.setOnClickListener { | ||
| 27 | adapter.onClearClick(setting, bindingAdapterPosition) | ||
| 28 | } | ||
| 29 | |||
| 30 | setStyle(setting.isEditable, binding) | ||
| 31 | } | ||
| 32 | |||
| 33 | override fun onClick(clicked: View) { | ||
| 34 | if (setting.isEditable) { | ||
| 35 | adapter.onStringInputClick(setting, bindingAdapterPosition) | ||
| 36 | } | ||
| 37 | } | ||
| 38 | |||
| 39 | override fun onLongClick(clicked: View): Boolean { | ||
| 40 | if (setting.isEditable) { | ||
| 41 | return adapter.onLongClick(setting, bindingAdapterPosition) | ||
| 42 | } | ||
| 43 | return false | ||
| 44 | } | ||
| 45 | } | ||