From b0518d7b1a5a6d268fc38e39d1f553da9b10708c Mon Sep 17 00:00:00 2001 From: khanhduytran0 Date: Fri, 27 Nov 2020 12:59:16 +0700 Subject: [PATCH] [Custom controls] Add Toggelable option --- .../com/kdt/handleview/ActionPopupWindow.java | 4 ++ .../customcontrols/ControlButton.java | 72 +++++++++++++------ .../customcontrols/ControlData.java | 13 ++-- .../customcontrols/ControlLayout.java | 4 +- app/src/main/res/layout/control_setting.xml | 6 ++ app/src/main/res/values/strings.xml | 1 + 6 files changed, 70 insertions(+), 30 deletions(-) diff --git a/app/src/main/java/com/kdt/handleview/ActionPopupWindow.java b/app/src/main/java/com/kdt/handleview/ActionPopupWindow.java index 7e279d668..f8e2d3aa4 100644 --- a/app/src/main/java/com/kdt/handleview/ActionPopupWindow.java +++ b/app/src/main/java/com/kdt/handleview/ActionPopupWindow.java @@ -119,6 +119,9 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe final CheckBox checkHidden = dialog.findViewById(R.id.controlsetting_checkbox_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 CheckBox checkDynamicPos = dialog.findViewById(R.id.controlsetting_checkbox_dynamicpos); checkDynamicPos.setOnCheckedChangeListener(new CheckBox.OnCheckedChangeListener(){ @@ -194,6 +197,7 @@ public class ActionPopupWindow extends PinnedPopupWindow implements OnClickListe properties.name = editName.getText().toString(); properties.hidden = checkHidden.isChecked(); properties.isDynamicBtn = checkDynamicPos.isChecked(); + properties.isToggle = checkToggle.isChecked(); properties.dynamicX = editDynamicX.getText().toString(); properties.dynamicY = editDynamicY.getText().toString(); diff --git a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java index c972bc777..4b13d5406 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java +++ b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlButton.java @@ -1,16 +1,19 @@ package net.kdt.pojavlaunch.customcontrols; import android.content.*; +import android.graphics.*; +import android.util.*; import android.view.*; import android.view.View.*; import android.widget.*; -import net.kdt.pojavlaunch.*; import com.kdt.handleview.*; -import android.view.ViewGroup.*; +import net.kdt.pojavlaunch.*; import org.lwjgl.glfw.*; public class ControlButton extends Button implements OnLongClickListener, OnTouchListener { + private Paint mRectPaint; + private GestureDetector mGestureDetector; private ControlData mProperties; private SelectionEndHandleView mHandleView; @@ -18,12 +21,18 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc private boolean mModifiable = false; private boolean mCanTriggerLongClick = true; + private boolean mChecked = false; + + private float mScaleAt; private int mMods; - public ControlButton(Context ctx, ControlData properties) { - super(ctx); + public ControlButton(ControlLayout layout, ControlData properties) { + 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); setOnLongClickListener(this); @@ -33,6 +42,12 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc setModified(false); 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() { @@ -121,6 +136,14 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc setProperties(mProperties); } + @Override + protected void onDraw(Canvas canvas) { + super.onDraw(canvas); + if (mChecked) { + canvas.drawRect(0, getHeight() - 10 * mScaleAt, getWidth(), getHeight(), mRectPaint); + } + } + @Override public boolean onLongClick(View p1) { if (mCanTriggerLongClick && mModifiable) { @@ -144,25 +167,30 @@ public class ControlButton extends Button implements OnLongClickListener, OnTouc if (!mModifiable) { mCanTriggerLongClick = false; - if (mProperties.keycode >= 0) { - boolean isDown; - switch (event.getActionMasked()) { - case MotionEvent.ACTION_DOWN: // 0 - case MotionEvent.ACTION_POINTER_DOWN: // 5 - isDown = true; - break; - case MotionEvent.ACTION_UP: // 1 - case MotionEvent.ACTION_CANCEL: // 3 - case MotionEvent.ACTION_POINTER_UP: // 6 - isDown = false; - break; - default: - return false; + if (!mProperties.isToggle) { + if (mProperties.keycode >= 0) { + boolean isDown; + switch (event.getActionMasked()) { + case MotionEvent.ACTION_DOWN: // 0 + case MotionEvent.ACTION_POINTER_DOWN: // 5 + isDown = true; + break; + case MotionEvent.ACTION_UP: // 1 + case MotionEvent.ACTION_CANCEL: // 3 + case MotionEvent.ACTION_POINTER_UP: // 6 + isDown = false; + break; + default: + return false; + } + MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown); } - MainActivity.sendKeyPress(mProperties.keycode, mMods, isDown); - - return true; + } else if (mGestureDetector.onTouchEvent(event)) { + mChecked = !mChecked; + MainActivity.sendKeyPress(mProperties.keycode, mMods, mChecked); } + + return true; } else { if (mGestureDetector.onTouchEvent(event)) { mCanTriggerLongClick = true; diff --git a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java index ac919fff4..f5bb2cbc2 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java +++ b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlData.java @@ -35,7 +35,7 @@ public class ControlData implements Cloneable * bigger device or vice versa. */ public String dynamicX, dynamicY; - public boolean isDynamicBtn; + public boolean isDynamicBtn, isToggle; public static ControlData[] getSpecialButtons(){ 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) { - 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; } 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) { @@ -113,10 +113,10 @@ public class ControlData implements Cloneable } 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.keycode = keycode; this.dynamicX = dynamicX; @@ -124,6 +124,7 @@ public class ControlData implements Cloneable this.width = width; this.height = height; this.isDynamicBtn = true; + this.isToggle = isToggle; update(); } @@ -133,7 +134,7 @@ public class ControlData implements Cloneable public ControlData clone() { 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 { return new ControlData(name, keycode, x, y, width, height); } diff --git a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java index 6cd0cdde7..2e563d6dd 100644 --- a/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java +++ b/app/src/main/java/net/kdt/pojavlaunch/customcontrols/ControlLayout.java @@ -11,8 +11,8 @@ import org.lwjgl.glfw.*; public class ControlLayout extends FrameLayout { + protected CustomControls mLayout; private boolean mModifiable; - private CustomControls mLayout; private CustomControlsActivity mActivity; private boolean mControlVisible = false; @@ -66,7 +66,7 @@ public class ControlLayout extends FrameLayout } private void addControlView(ControlData controlButton) { - final ControlButton view = new ControlButton(getContext(), controlButton); + final ControlButton view = new ControlButton(this, controlButton); view.setModifiable(mModifiable); addView(view); diff --git a/app/src/main/res/layout/control_setting.xml b/app/src/main/res/layout/control_setting.xml index 2b9fb98a2..70b94a37d 100644 --- a/app/src/main/res/layout/control_setting.xml +++ b/app/src/main/res/layout/control_setting.xml @@ -42,6 +42,12 @@ android:text="@string/customctrl_dynamicpos" android:id="@+id/controlsetting_checkbox_dynamicpos"/> + + Keycode Special Key Hidden + Toggleable Dynamic position Dynamic X