Code Editor + Lua Patchs + Fixes

This commit is contained in:
Gabriel 2024-01-10 11:51:20 -04:00
commit de027afea8
24 changed files with 265 additions and 103 deletions

View file

@ -37,6 +37,7 @@
</activity> </activity>
<activity <activity
android:name=".app.editor.CodeEditorActivity" android:name=".app.editor.CodeEditorActivity"
android:windowSoftInputMode="adjustResize"
android:configChanges="screenSize|screenLayout|orientation|density|uiMode"> android:configChanges="screenSize|screenLayout|orientation|density|uiMode">
</activity> </activity>
<activity android:name=".app.PreferenceActivity" <activity android:name=".app.PreferenceActivity"

View file

@ -8,7 +8,7 @@ import com.panda3ds.pandroid.data.config.GlobalConfig;
public class BaseActivity extends AppCompatActivity { public class BaseActivity extends AppCompatActivity {
private int currentTheme = GlobalConfig.get(GlobalConfig.KEY_APP_THEME); private int currentTheme = PandroidApplication.getThemeId();
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@ -20,19 +20,13 @@ public class BaseActivity extends AppCompatActivity {
protected void onResume() { protected void onResume() {
super.onResume(); super.onResume();
if (GlobalConfig.get(GlobalConfig.KEY_APP_THEME) != currentTheme) { if (PandroidApplication.getThemeId() != currentTheme) {
recreate(); recreate();
} }
} }
private void applyTheme() { private void applyTheme() {
switch (GlobalConfig.get(GlobalConfig.KEY_APP_THEME)) { currentTheme = PandroidApplication.getThemeId();
case GlobalConfig.THEME_ANDROID: setTheme(R.style.Theme_Pandroid); break; setTheme(currentTheme);
case GlobalConfig.THEME_LIGHT: setTheme(R.style.Theme_Pandroid_Light); break;
case GlobalConfig.THEME_DARK: setTheme(R.style.Theme_Pandroid_Dark); break;
case GlobalConfig.THEME_BLACK: setTheme(R.style.Theme_Pandroid_Black); break;
}
currentTheme = GlobalConfig.get(GlobalConfig.KEY_APP_THEME);
} }
} }

View file

@ -84,16 +84,23 @@ public class GameActivity extends BaseActivity {
@Override @Override
public boolean dispatchKeyEvent(KeyEvent event) { public boolean dispatchKeyEvent(KeyEvent event) {
if (InputHandler.processKeyEvent(event)) { if ((!drawerFragment.isOpened()) && InputHandler.processKeyEvent(event)) {
return true; return true;
} }
return super.dispatchKeyEvent(event); return super.dispatchKeyEvent(event);
} }
@Override
public void onBackPressed() {
if (drawerFragment.isOpened()) {
drawerFragment.close();
}
}
@Override @Override
public boolean dispatchGenericMotionEvent(MotionEvent ev) { public boolean dispatchGenericMotionEvent(MotionEvent ev) {
if (InputHandler.processMotionEvent(ev)) { if ((!drawerFragment.isOpened()) && InputHandler.processMotionEvent(ev)) {
return true; return true;
} }

View file

@ -2,7 +2,11 @@ package com.panda3ds.pandroid.app;
import android.app.Application; import android.app.Application;
import android.content.Context; import android.content.Context;
import android.content.res.Configuration;
import android.content.res.Resources;
import com.panda3ds.pandroid.AlberDriver; import com.panda3ds.pandroid.AlberDriver;
import com.panda3ds.pandroid.R;
import com.panda3ds.pandroid.data.config.GlobalConfig; import com.panda3ds.pandroid.data.config.GlobalConfig;
import com.panda3ds.pandroid.input.InputMap; import com.panda3ds.pandroid.input.InputMap;
import com.panda3ds.pandroid.utils.GameUtils; import com.panda3ds.pandroid.utils.GameUtils;
@ -22,5 +26,30 @@ public class PandroidApplication extends Application {
AlberDriver.Setup(); AlberDriver.Setup();
} }
public static int getThemeId() {
switch (GlobalConfig.get(GlobalConfig.KEY_APP_THEME)) {
case GlobalConfig.THEME_LIGHT:
return R.style.Theme_Pandroid_Light;
case GlobalConfig.THEME_DARK:
return R.style.Theme_Pandroid_Dark;
case GlobalConfig.THEME_BLACK:
return R.style.Theme_Pandroid_Black;
}
return R.style.Theme_Pandroid;
}
public static boolean isDarkMode() {
switch (GlobalConfig.get(GlobalConfig.KEY_APP_THEME)) {
case GlobalConfig.THEME_DARK:
case GlobalConfig.THEME_BLACK:
return true;
case GlobalConfig.THEME_LIGHT:
return false;
}
Resources res = Resources.getSystem();
int nightFlags = res.getConfiguration().uiMode & Configuration.UI_MODE_NIGHT_MASK;
return nightFlags == Configuration.UI_MODE_NIGHT_YES;
}
public static Context getAppContext() { return appContext; } public static Context getAppContext() { return appContext; }
} }

View file

@ -4,8 +4,11 @@ import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.graphics.Rect;
import android.os.Bundle; import android.os.Bundle;
import android.view.KeyEvent;
import android.view.View; import android.view.View;
import android.view.inputmethod.InputMethodManager;
import androidx.activity.result.contract.ActivityResultContract; import androidx.activity.result.contract.ActivityResultContract;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
@ -23,6 +26,7 @@ import com.panda3ds.pandroid.view.code.syntax.CodeSyntax;
import java.io.Serializable; import java.io.Serializable;
public class CodeEditorActivity extends BaseActivity { public class CodeEditorActivity extends BaseActivity {
private static final String TAB_CONTENT = " ";
private String path; private String path;
private String fileName; private String fileName;
private CodeEditor editor; private CodeEditor editor;
@ -38,6 +42,7 @@ public class CodeEditorActivity extends BaseActivity {
Arguments args = (Arguments) getIntent().getSerializableExtra("args"); Arguments args = (Arguments) getIntent().getSerializableExtra("args");
editor = findViewById(R.id.editor); editor = findViewById(R.id.editor);
getWindow().getDecorView().getViewTreeObserver().addOnGlobalLayoutListener(this::onGlobalLayoutChanged);
path = args.path; path = args.path;
fileName = args.fileName; fileName = args.fileName;
@ -66,6 +71,32 @@ public class CodeEditorActivity extends BaseActivity {
setupReadOnlyEditor(); setupReadOnlyEditor();
break; break;
} }
onGlobalLayoutChanged();
findViewById(R.id.key_hide).setOnClickListener(v -> {
((InputMethodManager) getSystemService(INPUT_METHOD_SERVICE)).hideSoftInputFromWindow(v.getWindowToken(), 0);
});
findViewById(R.id.key_tab).setOnClickListener(v -> {
editor.insert(TAB_CONTENT);
});
}
// Detect virtual keyboard is visible
private void onGlobalLayoutChanged() {
View view = getWindow().getDecorView();
Rect rect = new Rect();
view.getWindowVisibleDisplayFrame(rect);
int currentHeight = rect.height();
int height = view.getHeight();
if (currentHeight < height * 0.8) {
findViewById(R.id.keybar).setVisibility(View.VISIBLE);
} else {
findViewById(R.id.keybar).setVisibility(View.GONE);
}
System.out.println(height + "/" + currentHeight);
} }
private void setupReadOnlyEditor() { private void setupReadOnlyEditor() {
@ -98,6 +129,18 @@ public class CodeEditorActivity extends BaseActivity {
new Task(() -> FileUtils.writeTextFile(path, fileName, String.valueOf(editor.getText()))).runSync(); new Task(() -> FileUtils.writeTextFile(path, fileName, String.valueOf(editor.getText()))).runSync();
} }
@Override
public boolean dispatchKeyEvent(KeyEvent event) {
System.out.println();
if (event.getKeyCode() == KeyEvent.KEYCODE_TAB) {
if (event.getAction() == KeyEvent.ACTION_UP) {
editor.insert(TAB_CONTENT);
}
return true;
}
return super.dispatchKeyEvent(event);
}
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (changed) { if (changed) {
@ -107,8 +150,8 @@ public class CodeEditorActivity extends BaseActivity {
save(); save();
finish(); finish();
}) })
.setNegativeButton(R.string.exit_without_save, (dialog, which) -> finish()) .setNegativeButton(R.string.exit_without_saving, (dialog, which) -> finish())
.setTitle(String.format(getString(R.string.exit_without_save_title_ff), fileName)).show(); .setTitle(String.format(getString(R.string.exit_without_saving_title_ff), fileName)).show();
} else { } else {
super.onBackPressed(); super.onBackPressed();
} }

View file

@ -47,12 +47,14 @@ public class DrawerFragment extends Fragment implements DrawerLayout.DrawerListe
((AppCompatTextView)view.findViewById(R.id.game_publisher)).setText(game.getPublisher()); ((AppCompatTextView)view.findViewById(R.id.game_publisher)).setText(game.getPublisher());
((NavigationView)view.findViewById(R.id.action_navigation)).setNavigationItemSelectedListener(this); ((NavigationView)view.findViewById(R.id.action_navigation)).setNavigationItemSelectedListener(this);
((NavigationView)view.findViewById(R.id.hacks_navigation)).setNavigationItemSelectedListener(this); ((NavigationView)view.findViewById(R.id.others_navigation)).setNavigationItemSelectedListener(this);
} }
@Override @Override
public void onDetach() { public void onDetach() {
drawerContainer.removeDrawerListener(this); if (drawerContainer != null) {
drawerContainer.removeDrawerListener(this);
}
super.onDetach(); super.onDetach();
} }
@ -100,7 +102,7 @@ public class DrawerFragment extends Fragment implements DrawerLayout.DrawerListe
if (id == R.id.resume) { if (id == R.id.resume) {
close(); close();
} else if (id == R.id.exit) { } else if (id == R.id.exit) {
requireActivity().onBackPressed(); requireActivity().finish();
} else if (id == R.id.lua_script){ } else if (id == R.id.lua_script){
new LuaDialogFragment().show(getParentFragmentManager(),null); new LuaDialogFragment().show(getParentFragmentManager(),null);
} }

View file

@ -20,8 +20,8 @@ import com.panda3ds.pandroid.app.base.BottomDialogFragment;
import com.panda3ds.pandroid.app.editor.CodeEditorActivity; import com.panda3ds.pandroid.app.editor.CodeEditorActivity;
import com.panda3ds.pandroid.lang.Task; import com.panda3ds.pandroid.lang.Task;
import com.panda3ds.pandroid.utils.FileUtils; import com.panda3ds.pandroid.utils.FileUtils;
import com.panda3ds.pandroid.view.recycle.AutoFitGridLayout; import com.panda3ds.pandroid.view.recycler.AutoFitGridLayout;
import com.panda3ds.pandroid.view.recycle.SimpleListAdapter; import com.panda3ds.pandroid.view.recycler.SimpleListAdapter;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.UUID; import java.util.UUID;

View file

@ -151,7 +151,7 @@ public class BaseEditor extends BasicTextEditor {
canvas.translate(x, 0); canvas.translate(x, 0);
canvas.drawRect(0, scrollY, getPaddingLeft() - spaceWidth, visibleHeight + scrollY, paint); canvas.drawRect(0, scrollY, getPaddingLeft() - spaceWidth, visibleHeight + scrollY, paint);
paint.setColor(applyAlphaToColor(colorEnable, 50)); paint.setColor(colors[EditorColors.COLOR_CURRENT_LINE]);
canvas.drawRect(0, currentLine * lineHeight, getPaddingLeft() - spaceWidth, (currentLine * lineHeight) + lineHeight, paint); canvas.drawRect(0, currentLine * lineHeight, getPaddingLeft() - spaceWidth, (currentLine * lineHeight) + lineHeight, paint);
for (int i = beginLine; i < Math.min(getLineCount(), endLine); i++) { for (int i = beginLine; i < Math.min(getLineCount(), endLine); i++) {
@ -173,7 +173,7 @@ public class BaseEditor extends BasicTextEditor {
private void drawCurrentLine(Canvas canvas) { private void drawCurrentLine(Canvas canvas) {
float y = currentLine * lineHeight; float y = currentLine * lineHeight;
paint.setColor(applyAlphaToColor(colors[EditorColors.COLOR_TEXT], 50)); paint.setColor(colors[EditorColors.COLOR_CURRENT_LINE]);
canvas.drawRect(0, y, contentWidth, y + lineHeight, paint); canvas.drawRect(0, y, contentWidth, y + lineHeight, paint);
} }
@ -280,7 +280,7 @@ public class BaseEditor extends BasicTextEditor {
protected void onRefreshColorScheme(byte[] buffer, int index, int length) { protected void onRefreshColorScheme(byte[] buffer, int index, int length) {
} }
protected void invalidateAll(){ protected void invalidateAll() {
requireUpdate = true; requireUpdate = true;
invalidate(); invalidate();
} }

View file

@ -12,6 +12,7 @@ import android.util.AttributeSet;
import android.util.TypedValue; import android.util.TypedValue;
import android.view.GestureDetector; import android.view.GestureDetector;
import android.view.Gravity; import android.view.Gravity;
import android.view.KeyEvent;
import android.view.MotionEvent; import android.view.MotionEvent;
import android.view.inputmethod.EditorInfo; import android.view.inputmethod.EditorInfo;
import android.widget.Scroller; import android.widget.Scroller;
@ -46,7 +47,7 @@ public class BasicTextEditor extends AppCompatEditText {
setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/comic_mono.ttf")); setTypeface(Typeface.createFromAsset(getContext().getAssets(), "fonts/comic_mono.ttf"));
setGravity(Gravity.START | Gravity.TOP); setGravity(Gravity.START | Gravity.TOP);
setTextSize(TypedValue.COMPLEX_UNIT_SP,16); setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
setLineSpacing(0, 1.3f); setLineSpacing(0, 1.3f);
setScroller(new Scroller(getContext())); setScroller(new Scroller(getContext()));

View file

@ -33,7 +33,7 @@ public class CodeEditor extends BaseEditor {
@Override @Override
protected void onTextChanged() { protected void onTextChanged() {
super.onTextChanged(); super.onTextChanged();
if (contentChangeListener != null){ if (contentChangeListener != null) {
contentChangeListener.run(); contentChangeListener.run();
} }
} }

View file

@ -2,6 +2,8 @@ package com.panda3ds.pandroid.view.code;
import android.content.Context; import android.content.Context;
import com.panda3ds.pandroid.app.PandroidApplication;
public class EditorColors { public class EditorColors {
public static final byte COLOR_TEXT = 0x0; public static final byte COLOR_TEXT = 0x0;
public static final byte COLOR_KEYWORDS = 0x1; public static final byte COLOR_KEYWORDS = 0x1;
@ -15,8 +17,34 @@ public class EditorColors {
public static final byte COLOR_BACKGROUND_SECONDARY = 0x2D; public static final byte COLOR_BACKGROUND_SECONDARY = 0x2D;
public static final byte COLOR_SELECTION = 0x3D; public static final byte COLOR_SELECTION = 0x3D;
public static final byte COLOR_CARET = 0x4D; public static final byte COLOR_CARET = 0x4D;
public static final byte COLOR_CURRENT_LINE = 0x5D;
public static void obtainColorScheme(int[] colors, Context context) { public static void obtainColorScheme(int[] colors, Context context) {
if (PandroidApplication.isDarkMode()) {
applyDarkTheme(colors);
} else {
applyLightTheme(colors);
}
}
private static void applyLightTheme(int[] colors) {
colors[EditorColors.COLOR_TEXT] = 0xFF000000;
colors[EditorColors.COLOR_KEYWORDS] = 0xFF3AE666;
colors[EditorColors.COLOR_NUMBERS] = 0xFF3A9EE6;
colors[EditorColors.COLOR_METADATA] = 0xFF806AE6;
colors[EditorColors.COLOR_SYMBOLS] = 0xFF202020;
colors[EditorColors.COLOR_STRING] = 0xFF2EB541;
colors[EditorColors.COLOR_FIELDS] = 0xFF9876AA;
colors[EditorColors.COLOR_COMMENT] = 0xFF808080;
colors[EditorColors.COLOR_BACKGROUND] = 0xFFFFFFFF;
colors[EditorColors.COLOR_BACKGROUND_SECONDARY] = 0xFFF0F0F0;
colors[EditorColors.COLOR_SELECTION] = 0x701F9EDE;
colors[EditorColors.COLOR_CARET] = 0xFF000000;
colors[EditorColors.COLOR_CURRENT_LINE] = 0x05000050;
}
private static void applyDarkTheme(int[] colors) {
colors[EditorColors.COLOR_TEXT] = 0xFFFFFFFF; colors[EditorColors.COLOR_TEXT] = 0xFFFFFFFF;
colors[EditorColors.COLOR_KEYWORDS] = 0xFFE37F3E; colors[EditorColors.COLOR_KEYWORDS] = 0xFFE37F3E;
colors[EditorColors.COLOR_NUMBERS] = 0xFF3A9EE6; colors[EditorColors.COLOR_NUMBERS] = 0xFF3A9EE6;
@ -30,5 +58,6 @@ public class EditorColors {
colors[EditorColors.COLOR_BACKGROUND_SECONDARY] = 0xFF313335; colors[EditorColors.COLOR_BACKGROUND_SECONDARY] = 0xFF313335;
colors[EditorColors.COLOR_SELECTION] = 0x701F9EDE; colors[EditorColors.COLOR_SELECTION] = 0x701F9EDE;
colors[EditorColors.COLOR_CARET] = 0x60FFFFFF; colors[EditorColors.COLOR_CARET] = 0x60FFFFFF;
colors[EditorColors.COLOR_CURRENT_LINE] = 0x10FFFFFF;
} }
} }

View file

@ -1,15 +1,14 @@
package com.panda3ds.pandroid.view.code.syntax; package com.panda3ds.pandroid.view.code.syntax;
public abstract class CodeSyntax { public abstract class CodeSyntax {
public abstract void apply(byte[] syntaxBuffer,final CharSequence text); public abstract void apply(byte[] syntaxBuffer, final CharSequence text);
public static CodeSyntax obtainByFileName(String name) {
public static CodeSyntax obtainByFileName(String name){
name = name.trim().toLowerCase(); name = name.trim().toLowerCase();
String[] parts = name.split("\\."); String[] parts = name.split("\\.");
if (parts.length == 0) if (parts.length == 0)
return null; return null;
switch (parts[parts.length-1]){ switch (parts[parts.length - 1]) {
case "lua": case "lua":
return new LuaSyntax(); return new LuaSyntax();
default: default:

View file

@ -55,6 +55,5 @@ class LuaSyntax extends CodeSyntax {
for (Matcher matcher = comment.matcher(text); matcher.find(); ) { for (Matcher matcher = comment.matcher(text); matcher.find(); ) {
Arrays.fill(syntaxBuffer, matcher.start(), matcher.end(), EditorColors.COLOR_COMMENT); Arrays.fill(syntaxBuffer, matcher.start(), matcher.end(), EditorColors.COLOR_COMMENT);
} }
} }
} }

View file

@ -8,7 +8,7 @@ import androidx.annotation.Nullable;
import androidx.recyclerview.widget.RecyclerView; import androidx.recyclerview.widget.RecyclerView;
import com.panda3ds.pandroid.data.game.GameMetadata; import com.panda3ds.pandroid.data.game.GameMetadata;
import com.panda3ds.pandroid.view.recycle.AutoFitGridLayout; import com.panda3ds.pandroid.view.recycler.AutoFitGridLayout;
import java.util.List; import java.util.List;

View file

@ -1,4 +1,4 @@
package com.panda3ds.pandroid.view.recycle; package com.panda3ds.pandroid.view.recycler;
import android.content.Context; import android.content.Context;
import android.util.TypedValue; import android.util.TypedValue;
@ -27,4 +27,4 @@ public final class AutoFitGridLayout extends GridLayoutManager {
if (getSpanCount() != iconCount) if (getSpanCount() != iconCount)
setSpanCount(iconCount); setSpanCount(iconCount);
} }
} }

View file

@ -1,4 +1,4 @@
package com.panda3ds.pandroid.view.recycle; package com.panda3ds.pandroid.view.recycler;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
@ -35,23 +35,23 @@ public class SimpleListAdapter<T> extends RecyclerView.Adapter<SimpleListAdapter
binder.bind(position, list.get(position), holder.getView()); binder.bind(position, list.get(position), holder.getView());
} }
public void addAll(T... items){ public void addAll(T... items) {
addAll(Arrays.asList(items)); addAll(Arrays.asList(items));
} }
public void addAll(List<T> items){ public void addAll(List<T> items) {
int index = list.size(); int index = list.size();
this.list.addAll(items); this.list.addAll(items);
notifyItemRangeInserted(index, getItemCount()-index); notifyItemRangeInserted(index, getItemCount() - index);
} }
public void clear(){ public void clear() {
int count = getItemCount(); int count = getItemCount();
list.clear(); list.clear();
notifyItemRangeRemoved(0, count); notifyItemRangeRemoved(0, count);
} }
public void sort(Comparator<T> comparator){ public void sort(Comparator<T> comparator) {
list.sort(comparator); list.sort(comparator);
notifyItemRangeChanged(0, getItemCount()); notifyItemRangeChanged(0, getItemCount());
} }
@ -70,7 +70,7 @@ public class SimpleListAdapter<T> extends RecyclerView.Adapter<SimpleListAdapter
super(itemView); super(itemView);
} }
public View getView(){ public View getView() {
return itemView; return itemView;
} }
} }

View file

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#000000"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M20,3L4,3c-1.1,0 -1.99,0.9 -1.99,2L2,15c0,1.1 0.9,2 2,2h16c1.1,0 2,-0.9 2,-2L22,5c0,-1.1 -0.9,-2 -2,-2zM11,6h2v2h-2L11,6zM11,9h2v2h-2L11,9zM8,6h2v2L8,8L8,6zM8,9h2v2L8,11L8,9zM7,11L5,11L5,9h2v2zM7,8L5,8L5,6h2v2zM16,15L8,15v-2h8v2zM16,11h-2L14,9h2v2zM16,8h-2L14,6h2v2zM19,11h-2L17,9h2v2zM19,8h-2L17,6h2v2zM12,23l4,-4L8,19l4,4z"/>
</vector>

View file

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#000000" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M11.59,7.41L15.17,11H1v2h14.17l-3.59,3.59L13,18l6,-6 -6,-6 -1.41,1.41zM20,6v12h2V6h-2z"/>
</vector>

View file

@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#FFF"/>
<corners android:radius="99999dp"/>
</shape>

View file

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.appcompat.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android" <FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
@ -7,75 +8,126 @@
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="58dp" android:layout_height="match_parent"
android:orientation="horizontal"> android:orientation="vertical">
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="start|center"
android:paddingLeft="20dp"
android:paddingRight="20dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textSize="17sp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="58dp"
android:orientation="horizontal" android:orientation="horizontal">
android:gravity="end|center"
android:paddingLeft="14dp"
android:paddingRight="14dp">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/save"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="5dp"
android:tint="?colorOnSurface"
app:srcCompat="@drawable/ic_save"
android:scaleType="centerInside"
android:background="#0000"/>
<androidx.appcompat.widget.LinearLayoutCompat <androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/lua_toolbar"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="match_parent"
android:orientation="vertical"
android:gravity="start|center"
android:paddingLeft="20dp"
android:paddingRight="20dp">
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/app_name"
android:textSize="17sp"/>
</androidx.appcompat.widget.LinearLayoutCompat>
<androidx.appcompat.widget.LinearLayoutCompat
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" android:orientation="horizontal"
android:visibility="gone"> android:gravity="end|center"
android:paddingLeft="14dp"
android:paddingRight="14dp">
<androidx.appcompat.widget.AppCompatImageView <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lua_play" android:id="@+id/save"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:padding="5dp" android:padding="5dp"
android:layout_marginHorizontal="5dp"
android:tint="?colorOnSurface" android:tint="?colorOnSurface"
app:srcCompat="@drawable/ic_play" app:srcCompat="@drawable/ic_save"
android:scaleType="centerInside" android:scaleType="centerInside"
android:background="#0000"/> android:background="#0000"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/lua_toolbar"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:visibility="gone">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/lua_play"
android:layout_width="32dp"
android:layout_height="32dp"
android:padding="5dp"
android:layout_marginHorizontal="5dp"
android:tint="?colorOnSurface"
app:srcCompat="@drawable/ic_play"
android:scaleType="centerInside"
android:background="#0000"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="?colorOnSurface"
android:alpha="0.1"/>
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.panda3ds.pandroid.view.code.CodeEditor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/keybar"/>
<androidx.appcompat.widget.LinearLayoutCompat
android:id="@+id/keybar"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintHeight="38dp"
android:visibility="visible"
android:orientation="horizontal"
android:background="?colorSurfaceVariant">
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/key_tab"
android:layout_width="75dp"
android:layout_height="match_parent"
android:padding="0dp"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_tab"
android:tint="?colorOnSurfaceVariant"
android:background="#0000"/>
<androidx.appcompat.widget.AppCompatImageButton
android:id="@+id/key_hide"
android:layout_width="75dp"
android:layout_height="match_parent"
android:padding="0dp"
android:layout_marginEnd="10dp"
android:src="@drawable/ic_keyboard_hide"
android:tint="?colorOnSurfaceVariant"
android:background="#0000"/>
</androidx.appcompat.widget.LinearLayoutCompat>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>
<LinearLayout </FrameLayout>
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.panda3ds.pandroid.view.code.CodeEditor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>
</androidx.appcompat.widget.LinearLayoutCompat>

View file

@ -88,14 +88,14 @@
<androidx.appcompat.widget.AppCompatTextView <androidx.appcompat.widget.AppCompatTextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:text="@string/hacks" android:text="@string/others"
style="@style/TextAppearanceGameDrawerSubTitle"/> style="@style/TextAppearanceGameDrawerSubTitle"/>
<com.google.android.material.navigation.NavigationView <com.google.android.material.navigation.NavigationView
android:id="@+id/hacks_navigation" android:id="@+id/others_navigation"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
app:menu="@menu/game_drawer_hacks" app:menu="@menu/game_drawer_others"
android:background="?colorSurface"/> android:background="?colorSurface"/>
</androidx.appcompat.widget.LinearLayoutCompat> </androidx.appcompat.widget.LinearLayoutCompat>

View file

@ -40,8 +40,9 @@
<string name="scripts">Scripts</string> <string name="scripts">Scripts</string>
<string name="file_not_supported">Esse arquivo não é suportado</string> <string name="file_not_supported">Esse arquivo não é suportado</string>
<string name="save_and_exit">Salvar e sair</string> <string name="save_and_exit">Salvar e sair</string>
<string name="exit_without_save">Sair sem salvar</string> <string name="exit_without_saving">Sair sem salvar</string>
<string name="exit_without_save_title_ff">Salvar \"%s\" antes de sair?</string> <string name="exit_without_saving_title_ff">Salvar \"%s\" antes de sair?</string>
<string name="open_file">Abrir arquivo</string> <string name="open_file">Abrir arquivo</string>
<string name="create_new">Criar novo</string> <string name="create_new">Criar novo</string>
<string name="running_ff">Executando \"%s\" ...</string>
</resources> </resources>

View file

@ -41,8 +41,8 @@
<string name="scripts">Scripts</string> <string name="scripts">Scripts</string>
<string name="file_not_supported">File type isn\'t supported</string> <string name="file_not_supported">File type isn\'t supported</string>
<string name="save_and_exit">Save and exit</string> <string name="save_and_exit">Save and exit</string>
<string name="exit_without_save">Exit without save</string> <string name="exit_without_saving">Exit without saving</string>
<string name="exit_without_save_title_ff">Exit without save \"%s\"?</string> <string name="exit_without_saving_title_ff">Exit without saving \"%s\"?</string>
<string name="open_file">Open file</string> <string name="open_file">Open file</string>
<string name="create_new">Create new</string> <string name="create_new">Create new</string>
<string name="running_ff">Running \"%s\" ...</string> <string name="running_ff">Running \"%s\" ...</string>