Android: Add a button for accessing controller mappings

The settings GameCube Controller N and Wii Remote N (where N is a number)
have two purposes: You can select what controller type you want to use,
and also, when you select a controller type (even if you're selecting the
one that already is selected), the mapping settings open. This second part
is less discoverable than it ideally should be. I'm changing it so that
there now is a button for opening the mapping settings instead.
This commit is contained in:
JosJuice 2023-02-26 12:45:28 +01:00
parent f682225c15
commit 8acc39cc3f
5 changed files with 116 additions and 11 deletions

View File

@ -467,7 +467,7 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
} }
} }
private void handleMenuTag(MenuTag menuTag, int value) public void handleMenuTag(MenuTag menuTag, int value)
{ {
if (menuTag != null) if (menuTag != null)
{ {
@ -504,8 +504,6 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
if (scSetting.getSelectedValue(getSettings()) != value) if (scSetting.getSelectedValue(getSettings()) != value)
mView.onSettingChanged(); mView.onSettingChanged();
handleMenuTag(scSetting.getMenuTag(), value);
scSetting.setSelectedValue(getSettings(), value); scSetting.setSelectedValue(getSettings(), value);
closeDialog(); closeDialog();
@ -530,8 +528,6 @@ public final class SettingsAdapter extends RecyclerView.Adapter<SettingViewHolde
if (!scSetting.getSelectedValue(getSettings()).equals(value)) if (!scSetting.getSelectedValue(getSettings()).equals(value))
mView.onSettingChanged(); mView.onSettingChanged();
handleMenuTag(scSetting.getMenuTag(), which);
scSetting.setSelectedValue(getSettings(), value); scSetting.setSelectedValue(getSettings(), value);
closeDialog(); closeDialog();

View File

@ -10,12 +10,16 @@ import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import org.dolphinemu.dolphinemu.databinding.ListItemSettingBinding; import org.dolphinemu.dolphinemu.databinding.ListItemSettingBinding;
import org.dolphinemu.dolphinemu.features.settings.model.Settings;
import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem; import org.dolphinemu.dolphinemu.features.settings.model.view.SettingsItem;
import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSettingDynamicDescriptions; import org.dolphinemu.dolphinemu.features.settings.model.view.SingleChoiceSettingDynamicDescriptions;
import org.dolphinemu.dolphinemu.features.settings.model.view.StringSingleChoiceSetting; import org.dolphinemu.dolphinemu.features.settings.model.view.StringSingleChoiceSetting;
import org.dolphinemu.dolphinemu.features.settings.ui.MenuTag;
import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter; import org.dolphinemu.dolphinemu.features.settings.ui.SettingsAdapter;
import java.util.function.Function;
public final class SingleChoiceViewHolder extends SettingViewHolder public final class SingleChoiceViewHolder extends SettingViewHolder
{ {
private SettingsItem mItem; private SettingsItem mItem;
@ -35,6 +39,9 @@ public final class SingleChoiceViewHolder extends SettingViewHolder
mBinding.textSettingName.setText(item.getName()); mBinding.textSettingName.setText(item.getName());
SettingsAdapter adapter = getAdapter();
Settings settings = adapter.getSettings();
if (!TextUtils.isEmpty(item.getDescription())) if (!TextUtils.isEmpty(item.getDescription()))
{ {
mBinding.textSettingDescription.setText(item.getDescription()); mBinding.textSettingDescription.setText(item.getDescription());
@ -42,7 +49,7 @@ public final class SingleChoiceViewHolder extends SettingViewHolder
else if (item instanceof SingleChoiceSetting) else if (item instanceof SingleChoiceSetting)
{ {
SingleChoiceSetting setting = (SingleChoiceSetting) item; SingleChoiceSetting setting = (SingleChoiceSetting) item;
int selected = setting.getSelectedValue(getAdapter().getSettings()); int selected = setting.getSelectedValue(settings);
Resources resMgr = mBinding.textSettingDescription.getContext().getResources(); Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getChoicesId()); String[] choices = resMgr.getStringArray(setting.getChoicesId());
int[] values = resMgr.getIntArray(setting.getValuesId()); int[] values = resMgr.getIntArray(setting.getValuesId());
@ -58,7 +65,7 @@ public final class SingleChoiceViewHolder extends SettingViewHolder
{ {
StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item; StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item;
String[] choices = setting.getChoices(); String[] choices = setting.getChoices();
int valueIndex = setting.getSelectedValueIndex(getAdapter().getSettings()); int valueIndex = setting.getSelectedValueIndex(settings);
if (valueIndex != -1) if (valueIndex != -1)
mBinding.textSettingDescription.setText(choices[valueIndex]); mBinding.textSettingDescription.setText(choices[valueIndex]);
} }
@ -66,7 +73,7 @@ public final class SingleChoiceViewHolder extends SettingViewHolder
{ {
SingleChoiceSettingDynamicDescriptions setting = SingleChoiceSettingDynamicDescriptions setting =
(SingleChoiceSettingDynamicDescriptions) item; (SingleChoiceSettingDynamicDescriptions) item;
int selected = setting.getSelectedValue(getAdapter().getSettings()); int selected = setting.getSelectedValue(settings);
Resources resMgr = mBinding.textSettingDescription.getContext().getResources(); Resources resMgr = mBinding.textSettingDescription.getContext().getResources();
String[] choices = resMgr.getStringArray(setting.getDescriptionChoicesId()); String[] choices = resMgr.getStringArray(setting.getDescriptionChoicesId());
int[] values = resMgr.getIntArray(setting.getDescriptionValuesId()); int[] values = resMgr.getIntArray(setting.getDescriptionValuesId());
@ -79,6 +86,35 @@ public final class SingleChoiceViewHolder extends SettingViewHolder
} }
} }
MenuTag menuTag = null;
Function<Settings, Integer> getSelectedValue = null;
if (item instanceof SingleChoiceSetting)
{
SingleChoiceSetting setting = (SingleChoiceSetting) item;
menuTag = setting.getMenuTag();
getSelectedValue = setting::getSelectedValue;
}
else if (item instanceof StringSingleChoiceSetting)
{
StringSingleChoiceSetting setting = (StringSingleChoiceSetting) item;
menuTag = setting.getMenuTag();
getSelectedValue = setting::getSelectedValueIndex;
}
if (menuTag != null)
{
mBinding.buttonMoreSettings.setVisibility(View.VISIBLE);
final MenuTag finalMenuTag = menuTag;
final Function<Settings, Integer> finalGetSelectedValue = getSelectedValue;
mBinding.buttonMoreSettings.setOnClickListener((view) ->
adapter.handleMenuTag(finalMenuTag, finalGetSelectedValue.apply(settings)));
}
else
{
mBinding.buttonMoreSettings.setVisibility(View.GONE);
}
setStyle(mBinding.textSettingName, mItem); setStyle(mBinding.textSettingName, mItem);
} }

View File

@ -0,0 +1,57 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/root"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground"
android:clickable="true"
android:focusable="true"
android:minHeight="72dp"
android:nextFocusLeft="@id/button_more_settings">
<TextView
android:id="@+id/text_setting_name"
style="@style/TextAppearance.MaterialComponents.Headline5"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true"
android:layout_alignParentTop="true"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_large"
android:textSize="16sp"
android:textAlignment="viewStart"
tools:text="Setting Name" />
<TextView
android:id="@+id/text_setting_description"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_alignStart="@+id/text_setting_name"
android:layout_below="@+id/text_setting_name"
android:layout_marginBottom="@dimen/spacing_large"
android:layout_marginEnd="@dimen/spacing_large"
android:layout_marginStart="@dimen/spacing_large"
android:layout_marginTop="@dimen/spacing_small"
android:textAlignment="viewStart"
tools:text="@string/overclock_enable_description" />
<Button
android:id="@+id/button_more_settings"
style="?attr/materialIconButtonStyle"
android:contentDescription="@string/more_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/spacing_small"
android:nextFocusRight="@id/root"
android:visibility="gone"
app:icon="@drawable/ic_settings"
app:iconTint="?attr/colorOnPrimaryContainer" />
</RelativeLayout>

View File

@ -1,13 +1,15 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout <RelativeLayout android:id="@+id/root"
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:background="?android:attr/selectableItemBackground" android:background="?android:attr/selectableItemBackground"
android:clickable="true" android:clickable="true"
android:focusable="true" android:focusable="true"
android:minHeight="72dp"> android:minHeight="72dp"
android:nextFocusRight="@id/button_more_settings">
<TextView <TextView
android:id="@+id/text_setting_name" android:id="@+id/text_setting_name"
@ -28,7 +30,6 @@
android:id="@+id/text_setting_description" android:id="@+id/text_setting_description"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
android:layout_alignStart="@+id/text_setting_name" android:layout_alignStart="@+id/text_setting_name"
android:layout_below="@+id/text_setting_name" android:layout_below="@+id/text_setting_name"
@ -39,4 +40,18 @@
android:textAlignment="viewStart" android:textAlignment="viewStart"
tools:text="@string/overclock_enable_description" /> tools:text="@string/overclock_enable_description" />
<Button
android:id="@+id/button_more_settings"
style="?attr/materialIconButtonStyle"
android:contentDescription="@string/more_settings"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginEnd="@dimen/spacing_small"
android:nextFocusLeft="@id/root"
android:visibility="gone"
app:icon="@drawable/ic_settings"
app:iconTint="?attr/colorOnPrimaryContainer" />
</RelativeLayout> </RelativeLayout>

View File

@ -478,6 +478,7 @@
<string name="disabled">Disabled</string> <string name="disabled">Disabled</string>
<string name="other">Other</string> <string name="other">Other</string>
<string name="continue_anyway">Continue Anyway</string> <string name="continue_anyway">Continue Anyway</string>
<string name="more_settings">More Settings</string>
<!-- Game Grid Screen--> <!-- Game Grid Screen-->
<string name="platform_gamecube">GameCube Games</string> <string name="platform_gamecube">GameCube Games</string>