mirror of
https://github.com/izzy2lost/dolphin.git
synced 2026-06-19 01:16:48 -07:00
Merge pull request #2688 from sigmabeta/android-tv-ingame-menu
Android TV: Replace toolbar on EmulationActivity with a full-screen menu
This commit is contained in:
+275
-74
File diff suppressed because it is too large
Load Diff
+5
-2
@@ -81,9 +81,12 @@ public final class EmulationFragment extends Fragment implements SurfaceHolder.C
|
||||
mSurfaceView.getHolder().addCallback(this);
|
||||
|
||||
// If the input overlay was previously disabled, then don't show it.
|
||||
if (!mPreferences.getBoolean("showInputOverlay", true))
|
||||
if (mInputOverlay != null)
|
||||
{
|
||||
mInputOverlay.setVisibility(View.GONE);
|
||||
if (!mPreferences.getBoolean("showInputOverlay", true))
|
||||
{
|
||||
mInputOverlay.setVisibility(View.GONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package org.dolphinemu.dolphinemu.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.GridLayout;
|
||||
|
||||
import org.dolphinemu.dolphinemu.BuildConfig;
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
|
||||
|
||||
public final class LoadStateFragment extends Fragment implements View.OnClickListener
|
||||
{
|
||||
public static final String FRAGMENT_TAG = BuildConfig.APPLICATION_ID + ".load_state";
|
||||
public static final int FRAGMENT_ID = R.layout.fragment_state_load;
|
||||
|
||||
public static LoadStateFragment newInstance()
|
||||
{
|
||||
LoadStateFragment fragment = new LoadStateFragment();
|
||||
|
||||
// TODO Add any appropriate arguments to this fragment.
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
View rootView = inflater.inflate(FRAGMENT_ID, container, false);
|
||||
|
||||
GridLayout grid = (GridLayout) rootView.findViewById(R.id.grid_state_slots);
|
||||
for (int childIndex = 0; childIndex < grid.getChildCount(); childIndex++)
|
||||
{
|
||||
Button button = (Button) grid.getChildAt(childIndex);
|
||||
|
||||
button.setOnClickListener(this);
|
||||
}
|
||||
|
||||
// So that item clicked to start this Fragment is no longer the focused item.
|
||||
grid.requestFocus();
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View button)
|
||||
{
|
||||
((EmulationActivity) getActivity()).onMenuItemClicked(button.getId());
|
||||
}
|
||||
}
|
||||
+52
@@ -0,0 +1,52 @@
|
||||
package org.dolphinemu.dolphinemu.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.LinearLayout;
|
||||
import android.widget.TextView;
|
||||
|
||||
import org.dolphinemu.dolphinemu.BuildConfig;
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
|
||||
|
||||
public final class MenuFragment extends Fragment implements View.OnClickListener
|
||||
{
|
||||
public static final String FRAGMENT_TAG = BuildConfig.APPLICATION_ID + ".ingame_menu";
|
||||
public static final int FRAGMENT_ID = R.layout.fragment_ingame_menu;
|
||||
private TextView mTitleText;
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
View rootView = inflater.inflate(FRAGMENT_ID, container, false);
|
||||
|
||||
LinearLayout options = (LinearLayout) rootView.findViewById(R.id.layout_options);
|
||||
for (int childIndex = 0; childIndex < options.getChildCount(); childIndex++)
|
||||
{
|
||||
Button button = (Button) options.getChildAt(childIndex);
|
||||
|
||||
button.setOnClickListener(this);
|
||||
}
|
||||
|
||||
mTitleText = (TextView) rootView.findViewById(R.id.text_game_title);
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View button)
|
||||
{
|
||||
((EmulationActivity) getActivity()).onMenuItemClicked(button.getId());
|
||||
}
|
||||
|
||||
public void setTitleText(String title)
|
||||
{
|
||||
mTitleText.setText(title);
|
||||
}
|
||||
}
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
package org.dolphinemu.dolphinemu.fragments;
|
||||
|
||||
import android.app.Fragment;
|
||||
import android.os.Bundle;
|
||||
import android.support.annotation.Nullable;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.Button;
|
||||
import android.widget.GridLayout;
|
||||
|
||||
import org.dolphinemu.dolphinemu.BuildConfig;
|
||||
import org.dolphinemu.dolphinemu.R;
|
||||
import org.dolphinemu.dolphinemu.activities.EmulationActivity;
|
||||
|
||||
public final class SaveStateFragment extends Fragment implements View.OnClickListener
|
||||
{
|
||||
public static final String FRAGMENT_TAG = BuildConfig.APPLICATION_ID + ".save_state";
|
||||
public static final int FRAGMENT_ID = R.layout.fragment_state_save;
|
||||
|
||||
public static SaveStateFragment newInstance()
|
||||
{
|
||||
SaveStateFragment fragment = new SaveStateFragment();
|
||||
|
||||
// TODO Add any appropriate arguments to this fragment.
|
||||
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
@Override
|
||||
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
|
||||
{
|
||||
View rootView = inflater.inflate(FRAGMENT_ID, container, false);
|
||||
|
||||
GridLayout grid = (GridLayout) rootView.findViewById(R.id.grid_state_slots);
|
||||
for (int childIndex = 0; childIndex < grid.getChildCount(); childIndex++)
|
||||
{
|
||||
Button button = (Button) grid.getChildAt(childIndex);
|
||||
|
||||
button.setOnClickListener(this);
|
||||
}
|
||||
|
||||
// So that item clicked to start this Fragment is no longer the focused item.
|
||||
grid.requestFocus();
|
||||
|
||||
return rootView;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onClick(View button)
|
||||
{
|
||||
((EmulationActivity) getActivity()).onMenuItemClicked(button.getId());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<objectAnimator
|
||||
android:propertyName="translationX"
|
||||
android:valueType="floatType"
|
||||
android:valueFrom="1280"
|
||||
android:valueTo="0"
|
||||
android:interpolator="@android:interpolator/decelerate_quad"
|
||||
android:duration="300"/>
|
||||
<objectAnimator
|
||||
android:propertyName="alpha"
|
||||
android:valueType="floatType"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1"
|
||||
android:interpolator="@android:interpolator/accelerate_quad"
|
||||
android:duration="300"/>
|
||||
</set>
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<set xmlns:android="http://schemas.android.com/apk/res/android">
|
||||
<!-- This animation is used ONLY when a submenu is replaced. -->
|
||||
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:propertyName="translationX"
|
||||
android:valueType="floatType"
|
||||
android:valueFrom="0"
|
||||
android:valueTo="1280"
|
||||
android:interpolator="@android:interpolator/decelerate_quad"
|
||||
android:duration="300"/>
|
||||
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:propertyName="alpha"
|
||||
android:valueType="floatType"
|
||||
android:valueFrom="1"
|
||||
android:valueTo="0"
|
||||
android:interpolator="@android:interpolator/decelerate_quad"
|
||||
android:duration="300"/>
|
||||
</set>
|
||||
@@ -0,0 +1,44 @@
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:id="@+id/frame_content">
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/frame_emulation_fragment"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:visibility="invisible"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:id="@+id/image_screenshot"
|
||||
android:transitionName="image_game_screenshot"/>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_ingame_menu"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:orientation="horizontal"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
android:baselineAligned="false">
|
||||
|
||||
<fragment
|
||||
android:id="@+id/fragment_menu"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="1"
|
||||
android:name="org.dolphinemu.dolphinemu.fragments.MenuFragment"
|
||||
tools:layout="@layout/fragment_ingame_menu"/>
|
||||
|
||||
<FrameLayout
|
||||
android:id="@+id/frame_submenu"
|
||||
android:layout_width="0dp"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_weight="3"/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,14 @@
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
tools:context="org.dolphinemu.dolphinemu.fragments.EmulationFragment">
|
||||
|
||||
<!-- This is what everything is rendered to during emulation -->
|
||||
<SurfaceView
|
||||
android:id="@+id/surface_emulation"
|
||||
android:layout_height="match_parent"
|
||||
android:layout_width="match_parent"
|
||||
android:focusable="false"
|
||||
android:focusableInTouchMode="false"/>
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,69 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
xmlns:tools="http://schemas.android.com/tools"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="@color/dolphin_blue_dark"
|
||||
tools:layout_width="250dp"
|
||||
>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/text_game_title"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
tools:text="The Legend of Zelda: The Wind Waker"
|
||||
android:textColor="@android:color/white"
|
||||
android:textSize="20sp"
|
||||
android:layout_margin="32dp"/>
|
||||
|
||||
<ScrollView
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="0dp"
|
||||
android:layout_weight="1"
|
||||
>
|
||||
|
||||
<LinearLayout
|
||||
android:id="@+id/layout_options"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:orientation="vertical">
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_take_screenshot"
|
||||
android:text="@string/overlay_screenshot"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_quicksave"
|
||||
android:text="@string/emulation_quicksave"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_quickload"
|
||||
android:text="@string/emulation_quickload"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_root"
|
||||
android:text="@string/overlay_savestate"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_root"
|
||||
android:text="@string/overlay_loadstate"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_ingame_settings"
|
||||
android:text="@string/settings"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_exit"
|
||||
android:text="@string/overlay_exit_emulation"
|
||||
style="@style/InGameMenuOption"/>
|
||||
|
||||
</LinearLayout>
|
||||
</ScrollView>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#af000000"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<GridLayout
|
||||
android:id="@+id/grid_state_slots"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:columnCount="3"
|
||||
android:rowCount="2"
|
||||
android:layout_gravity="center">
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_1"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot1"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_2"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot2"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_3"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot3"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_4"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot4"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_5"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot5"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_load_6"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot6"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
</GridLayout>
|
||||
</FrameLayout>
|
||||
@@ -0,0 +1,65 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent"
|
||||
android:background="#af000000"
|
||||
android:orientation="vertical"
|
||||
>
|
||||
|
||||
<GridLayout
|
||||
android:id="@+id/grid_state_slots"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:columnCount="3"
|
||||
android:rowCount="2"
|
||||
android:layout_gravity="center">
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_1"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot1"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_2"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot2"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_3"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot3"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_4"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot4"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_5"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot5"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
|
||||
<Button
|
||||
android:id="@+id/menu_emulation_save_6"
|
||||
android:layout_width="128dp"
|
||||
android:layout_height="128dp"
|
||||
android:text="@string/overlay_slot6"
|
||||
style="@style/InGameMenuOption"
|
||||
/>
|
||||
</GridLayout>
|
||||
</FrameLayout>
|
||||
@@ -66,6 +66,7 @@
|
||||
<string name="overlay_slot3">Slot 3</string>
|
||||
<string name="overlay_slot4">Slot 4</string>
|
||||
<string name="overlay_slot5">Slot 5</string>
|
||||
<string name="overlay_slot6">Slot 6</string>
|
||||
|
||||
<!-- Input Config Fragment -->
|
||||
<string name="input_settings">Input</string>
|
||||
|
||||
@@ -95,9 +95,48 @@
|
||||
<item name="colorAccent">@color/dolphin_accent_wiiware</item>
|
||||
</style>
|
||||
|
||||
<style name="DolphinEmulationTvBase" parent="Theme.AppCompat.NoActionBar">
|
||||
<item name="colorPrimary">@color/dolphin_blue</item>
|
||||
<item name="colorPrimaryDark">@color/dolphin_blue_dark</item>
|
||||
<item name="android:windowTranslucentNavigation">true</item>
|
||||
|
||||
<item name="android:windowBackground">@android:color/black</item>
|
||||
|
||||
<!--enable window content transitions-->
|
||||
<item name="android:windowContentTransitions">true</item>
|
||||
<item name="android:windowAllowEnterTransitionOverlap">true</item>
|
||||
<item name="android:windowAllowReturnTransitionOverlap">true</item>
|
||||
</style>
|
||||
|
||||
<!-- Inherit from the Base Dolphin Emulation Theme-->
|
||||
<style name="DolphinEmulationTvWii" parent="DolphinEmulationTvBase">
|
||||
<item name="colorAccent">@color/dolphin_accent_wii</item>
|
||||
</style>
|
||||
|
||||
<style name="DolphinEmulationTvGamecube" parent="DolphinEmulationTvBase">
|
||||
<item name="colorAccent">@color/dolphin_accent_gamecube</item>
|
||||
</style>
|
||||
|
||||
<style name="DolphinEmulationTvWiiware" parent="DolphinEmulationTvBase">
|
||||
<item name="colorAccent">@color/dolphin_accent_wiiware</item>
|
||||
</style>
|
||||
|
||||
<!-- Hax to make Tablayout render icons -->
|
||||
<style name="MyCustomTextAppearance" parent="TextAppearance.Design.Tab">
|
||||
<item name="textAllCaps">false</item>
|
||||
</style>
|
||||
|
||||
<style name="InGameMenuOption" parent="Widget.AppCompat.Button.Borderless">
|
||||
<item name="android:textSize">16sp</item>
|
||||
<item name="android:fontFamily">sans-serif-condensed</item>
|
||||
<item name="android:textColor">@android:color/white</item>
|
||||
<item name="android:textAllCaps">false</item>
|
||||
<item name="android:layout_width">match_parent</item>
|
||||
<item name="android:layout_height">48dp</item>
|
||||
<item name="android:gravity">center_vertical|left</item>
|
||||
<item name="android:paddingLeft">32dp</item>
|
||||
<item name="android:paddingRight">32dp</item>
|
||||
<item name="android:layout_margin">0dp</item>
|
||||
</style>
|
||||
|
||||
</resources>
|
||||
Reference in New Issue
Block a user