[Custom controls] Add Toggelable option

This commit is contained in:
khanhduytran0 2020-11-27 12:59:16 +07:00
parent b9cd11498e
commit b0518d7b1a
6 changed files with 70 additions and 30 deletions

View File

@ -119,6 +119,9 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe
final CheckBox checkHidden = dialog.findViewById(R.id.controlsetting_checkbox_hidden); final CheckBox checkHidden = dialog.findViewById(R.id.controlsetting_checkbox_hidden);
checkHidden.setChecked(properties.hidden); checkHidden.setChecked(properties.hidden);
final CheckBox checkToggle = dialog.findViewById(R.id.controlsetting_checkbox_toggle);
checkToggle.setChecked(properties.isToggle);
final LinearLayout layoutDynamicBtn = dialog.findViewById(R.id.controlsetting_dynamicbtnlayout); final LinearLayout layoutDynamicBtn = dialog.findViewById(R.id.controlsetting_dynamicbtnlayout);
final CheckBox checkDynamicPos = dialog.findViewById(R.id.controlsetting_checkbox_dynamicpos); final CheckBox checkDynamicPos = dialog.findViewById(R.id.controlsetting_checkbox_dynamicpos);
checkDynamicPos.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){ checkDynamicPos.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){
@ -194,6 +197,7 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe
properties.name = editName.getText().toString(); properties.name = editName.getText().toString();
properties.hidden = checkHidden.isChecked(); properties.hidden = checkHidden.isChecked();
properties.isDynamicBtn = checkDynamicPos.isChecked(); properties.isDynamicBtn = checkDynamicPos.isChecked();
properties.isToggle = checkToggle.isChecked();
properties.dynamicX = editDynamicX.getText().toString(); properties.dynamicX = editDynamicX.getText().toString();
properties.dynamicY = editDynamicY.getText().toString(); properties.dynamicY = editDynamicY.getText().toString();

View File

@ -1,16 +1,19 @@
package net.kdt.pojavlaunch.customcontrols; package net.kdt.pojavlaunch.customcontrols;
import android.content.*; import android.content.*;
import android.graphics.*;
import android.util.*;
import android.view.*; import android.view.*;
import android.view.View.*; import android.view.View.*;
import android.widget.*; import android.widget.*;
import net.kdt.pojavlaunch.*;
import com.kdt.handleview.*; import com.kdt.handleview.*;
import android.view.ViewGroup.*; import net.kdt.pojavlaunch.*;
import org.lwjgl.glfw.*; import org.lwjgl.glfw.*;
public class ControlButton extends Button implements OnLongClickListener, OnTouchListener public class ControlButton extends Button implements OnLongClickListener, OnTouchListener
{ {
private Paint mRectPaint;
private GestureDetector mGestureDetector; private GestureDetector mGestureDetector;
private ControlData mProperties; private ControlData mProperties;
private SelectionEndHandleView mHandleView; private SelectionEndHandleView mHandleView;
@ -18,12 +21,18 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
private boolean mModifiable = false; private boolean mModifiable = false;
private boolean mCanTriggerLongClick = true; private boolean mCanTriggerLongClick = true;
private boolean mChecked = false;
private float mScaleAt;
private int mMods; private int mMods;
public ControlButton(Context ctx, ControlData properties) { public ControlButton(ControlLayout layout, ControlData properties) {
super(ctx); super(layout.getContext());
setWillNotDraw(false);
mGestureDetector = new GestureDetector(ctx, new SingleTapConfirm()); mScaleAt = layout.mLayout.scaledAt;
mGestureDetector = new GestureDetector(getContext(), new SingleTapConfirm());
setBackgroundResource(R.drawable.control_button); setBackgroundResource(R.drawable.control_button);
setOnLongClickListener(this); setOnLongClickListener(this);
@ -33,6 +42,12 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
setModified(false); setModified(false);
mHandleView = new SelectionEndHandleView(this); mHandleView = new SelectionEndHandleView(this);
final TypedValue value = new TypedValue();
getContext().getTheme().resolveAttribute(R.attr.colorAccent, value, true);
mRectPaint = new Paint();
mRectPaint.setColor(value.data);
} }
public HandleView getHandleView() { public HandleView getHandleView() {
@ -121,6 +136,14 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
setProperties(mProperties); setProperties(mProperties);
} }
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if (mChecked) {
canvas.drawRect(0, getHeight() - 10 * mScaleAt, getWidth(), getHeight(), mRectPaint);
}
}
@Override @Override
public boolean onLongClick(View p1) { public boolean onLongClick(View p1) {
if (mCanTriggerLongClick && mModifiable) { if (mCanTriggerLongClick && mModifiable) {
@ -144,25 +167,30 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc
if (!mModifiable) { if (!mModifiable) {
mCanTriggerLongClick = false; mCanTriggerLongClick = false;
if (mProperties.keycode >= 0) { if (!mProperties.isToggle) {
boolean isDown; if (mProperties.keycode >= 0) {
switch (event.getActionMasked()) { boolean isDown;
case MotionEvent.ACTION_DOWN: // 0 switch (event.getActionMasked()) {
case MotionEvent.ACTION_POINTER_DOWN: // 5 case MotionEvent.ACTION_DOWN: // 0
isDown = true; case MotionEvent.ACTION_POINTER_DOWN: // 5
break; isDown = true;
case MotionEvent.ACTION_UP: // 1 break;
case MotionEvent.ACTION_CANCEL: // 3 case MotionEvent.ACTION_UP: // 1
case MotionEvent.ACTION_POINTER_UP: // 6 case MotionEvent.ACTION_CANCEL: // 3
isDown = false; case MotionEvent.ACTION_POINTER_UP: // 6
break; isDown = false;
default: break;
return false; default:
return false;
}
MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown);
} }
MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown); } else if (mGestureDetector.onTouchEvent(event)) {
mChecked = !mChecked;
return true; MainActivity.sendKeyPress(mProperties.keycode, mMods, mChecked);
} }
return true;
} else { } else {
if (mGestureDetector.onTouchEvent(event)) { if (mGestureDetector.onTouchEvent(event)) {
mCanTriggerLongClick = true; mCanTriggerLongClick = true;

View File

@ -35,7 +35,7 @@ public class ControlData implements Cloneable
* bigger device or vice versa. * bigger device or vice versa.
*/ */
public String dynamicX, dynamicY; public String dynamicX, dynamicY;
public boolean isDynamicBtn; public boolean isDynamicBtn, isToggle;
public static ControlData[] getSpecialButtons(){ public static ControlData[] getSpecialButtons(){
if (SPECIAL_BUTTONS == null) { if (SPECIAL_BUTTONS == null) {
@ -100,12 +100,12 @@ public class ControlData implements Cloneable
} }
public ControlData(String name, int keycode, float x, float y, float width, float height) { public ControlData(String name, int keycode, float x, float y, float width, float height) {
this(name, keycode, Float.toString(x), Float.toString(y), width, height); this(name, keycode, Float.toString(x), Float.toString(y), width, height, false);
this.isDynamicBtn = false; this.isDynamicBtn = false;
} }
public ControlData(String name, int keycode, String dynamicX, String dynamicY) { public ControlData(String name, int keycode, String dynamicX, String dynamicY) {
this(name, keycode, dynamicX, dynamicY, pixelOf50dp, pixelOf50dp); this(name, keycode, dynamicX, dynamicY, pixelOf50dp, pixelOf50dp, false);
} }
public ControlData(android.content.Context ctx, int resId, int keycode, String dynamicX, String dynamicY, boolean isSquare) { public ControlData(android.content.Context ctx, int resId, int keycode, String dynamicX, String dynamicY, boolean isSquare) {
@ -113,10 +113,10 @@ public class ControlData implements Cloneable
} }
public ControlData(String name, int keycode, String dynamicX, String dynamicY, boolean isSquare) { public ControlData(String name, int keycode, String dynamicX, String dynamicY, boolean isSquare) {
this(name, keycode, dynamicX, dynamicY, isSquare ? pixelOf50dp : pixelOf80dp, isSquare ? pixelOf50dp : pixelOf30dp); this(name, keycode, dynamicX, dynamicY, isSquare ? pixelOf50dp : pixelOf80dp, isSquare ? pixelOf50dp : pixelOf30dp, false);
} }
public ControlData(String name, int keycode, String dynamicX, String dynamicY, float width, float height) { public ControlData(String name, int keycode, String dynamicX, String dynamicY, float width, float height, boolean isToggle) {
this.name = name; this.name = name;
this.keycode = keycode; this.keycode = keycode;
this.dynamicX = dynamicX; this.dynamicX = dynamicX;
@ -124,6 +124,7 @@ public class ControlData implements Cloneable
this.width = width; this.width = width;
this.height = height; this.height = height;
this.isDynamicBtn = true; this.isDynamicBtn = true;
this.isToggle = isToggle;
update(); update();
} }
@ -133,7 +134,7 @@ public class ControlData implements Cloneable
public ControlData clone() { public ControlData clone() {
if (this instanceof ControlData) { if (this instanceof ControlData) {
return new ControlData(name, keycode, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height); return new ControlData(name, keycode, ((ControlData) this).dynamicX, ((ControlData) this).dynamicY, width, height, isToggle);
} else { } else {
return new ControlData(name, keycode, x, y, width, height); return new ControlData(name, keycode, x, y, width, height);
} }

View File

@ -11,8 +11,8 @@ import org.lwjgl.glfw.*;
public class ControlLayout extends FrameLayout public class ControlLayout extends FrameLayout
{ {
protected CustomControls mLayout;
private boolean mModifiable; private boolean mModifiable;
private CustomControls mLayout;
private CustomControlsActivity mActivity; private CustomControlsActivity mActivity;
private boolean mControlVisible = false; private boolean mControlVisible = false;
@ -66,7 +66,7 @@ public class ControlLayout extends FrameLayout
} }
private void addControlView(ControlData controlButton) { private void addControlView(ControlData controlButton) {
final ControlButton view = new ControlButton(getContext(), controlButton); final ControlButton view = new ControlButton(this, controlButton);
view.setModifiable(mModifiable); view.setModifiable(mModifiable);
addView(view); addView(view);

View File

@ -42,6 +42,12 @@
android:text="@string/customctrl_dynamicpos" android:text="@string/customctrl_dynamicpos"
android:id="@+id/controlsetting_checkbox_dynamicpos"/> android:id="@+id/controlsetting_checkbox_dynamicpos"/>
<CheckBox
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="@string/customctrl_toggle"
android:id="@+id/controlsetting_checkbox_toggle"/>
<LinearLayout <LinearLayout
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"

View File

@ -190,6 +190,7 @@
<string name="customctrl_keyname">Keycode</string> <string name="customctrl_keyname">Keycode</string>
<string name="customctrl_specialkey">Special Key</string> <string name="customctrl_specialkey">Special Key</string>
<string name="customctrl_hidden">Hidden</string> <string name="customctrl_hidden">Hidden</string>
<string name="customctrl_toggle">Toggleable</string>
<string name="customctrl_dynamicpos">Dynamic position</string> <string name="customctrl_dynamicpos">Dynamic position</string>
<string name="customctrl_dynamicpos_x">Dynamic X</string> <string name="customctrl_dynamicpos_x">Dynamic X</string>