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