From cfae15c68031d291acbbc90ea6f88fb763bde191 Mon Sep 17 00:00:00 2001 From: artdeell Date: Fri, 22 Apr 2022 22:08:40 +0300 Subject: [PATCH] Finally. The color selector is at home. Other changes: The ColorSelectionListener is back! Now ColorSelector.runColor(int) is used for unified initialization Added invalidate flag into SVRectangleView.setColor() to avoid a useless invalidation in runColor() Moved repeating Color.HSVtoColor into ColorSelector.dispatchColorChange() Fixed a bug: mAlphaSelected wasn't set to the appropriate value by runColor, leading to the Color Preview and HEX edit breaking in some cases --- .../pojavlaunch/colorselector/AlphaView.java | 1 - .../colorselector/ColorSelectionListener.java | 9 +++ .../colorselector/ColorSelector.java | 61 ++++++++++++++----- .../colorselector/SVRectangleView.java | 4 +- .../handleview/EditControlButtonPopup.java | 17 +++++- 5 files changed, 72 insertions(+), 20 deletions(-) create mode 100644 app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelectionListener.java diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/AlphaView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/AlphaView.java index d454d4608..b4b549650 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/AlphaView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/AlphaView.java @@ -10,7 +10,6 @@ import android.graphics.RectF; import android.graphics.Shader; import android.graphics.drawable.Drawable; import android.util.AttributeSet; -import android.util.Log; import android.view.MotionEvent; import android.view.View; diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelectionListener.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelectionListener.java new file mode 100644 index 000000000..9dd43a2b0 --- /dev/null +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelectionListener.java @@ -0,0 +1,9 @@ +package net.kdt.pojavlaunch.colorselector; + +public interface ColorSelectionListener { + /** + * This method gets called by the ColorSelector when the color is selected + * @param color the selected color + */ + void onColorSelected(int color); +} diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelector.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelector.java index dd96b4635..adad978fe 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelector.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/ColorSelector.java @@ -18,77 +18,108 @@ public class ColorSelector implements HueSelectionListener, RectangleSelectionLi AlphaView mAlphaView; ColorSideBySideView mColorView; EditText mTextView; + ColorSelectionListener mColorSelectionListener; float[] mHueTemplate = new float[] {0,1,1}; float[] mHsvSelected = new float[] {360,1,1}; int mAlphaSelected = 0xff; boolean mWatch = true; AlertDialog mDialog; - public ColorSelector(Context context) { + + /** + * Creates a color selector dialog for this Context. + * @param context Context used for this ColorSelector dialog + * @param colorSelectionListener Color selection listener to which the events will be sent to. Can be null. + */ + public ColorSelector(Context context, ColorSelectionListener colorSelectionListener) { AlertDialog.Builder builder = new AlertDialog.Builder(context); View view = LayoutInflater.from(context).inflate(R.layout.dialog_color_selector,null); mHueView = view.findViewById(R.id.color_selector_hue_view); - mHueView.setHue(0f); mLuminosityIntensityView = view.findViewById(R.id.color_selector_rectangle_view); - mLuminosityIntensityView.setColor(Color.RED); - mLuminosityIntensityView.setLuminosityIntensity(1,1); mAlphaView = view.findViewById(R.id.color_selector_alpha_view); - mAlphaView.setAlpha(0xff); mColorView = view.findViewById(R.id.color_selector_color_view); - mColorView.setColor(Color.RED); mTextView = view.findViewById(R.id.color_selector_hex_edit); + runColor(Color.RED); mHueView.setHueSelectionListener(this); mLuminosityIntensityView.setRectSelectionListener(this); mAlphaView.setAlphaSelectionListener(this); mTextView.addTextChangedListener(this); builder.setView(view); builder.setPositiveButton(android.R.string.ok,(dialog,which)->{ - + if (mColorSelectionListener != null) { + mColorSelectionListener.onColorSelected(Color.HSVToColor(mAlphaSelected, mHsvSelected)); + } }); + builder.setNegativeButton(android.R.string.cancel, ((dialog, which) -> {})); + mColorSelectionListener = colorSelectionListener; mDialog = builder.create(); } + /** + * Shows the color selector with the default (red) color selected. + */ public void show() { + runColor(Color.RED); + dispatchColorChange(); + mDialog.show(); + } + + /** + * Shows the color selector with the desired ARGB color selected + * @param previousColor the desired ARGB color + */ + public void show(int previousColor) { + runColor(previousColor); // initialize + dispatchColorChange(); // set the hex text mDialog.show(); } @Override public void onHueSelected(float hue) { mHsvSelected[0] = mHueTemplate[0] = hue; - mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate)); - dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected)); + mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate), true); + dispatchColorChange(); } @Override public void onLuminosityIntensityChanged(float luminosity, float intensity) { mHsvSelected[1] = intensity; mHsvSelected[2] = luminosity; - dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected)); + dispatchColorChange(); } @Override public void onAlphaSelected(int alpha) { mAlphaSelected = alpha; - dispatchColorChange(Color.HSVToColor(mAlphaSelected, mHsvSelected)); + dispatchColorChange(); } - + /** + * Replaces the alpha value of the color passed in, and returns the result. + * @param color the color to replace the alpha of + * @param alpha the alpha to use + * @return the new color + */ public static int setAlpha(int color, int alpha) { return color & ALPHA_MASK | ((alpha & 0xFF) << 24); } - protected void dispatchColorChange(int color) { + //IUO: called on all color changes + protected void dispatchColorChange() { + int color = Color.HSVToColor(mAlphaSelected, mHsvSelected); mColorView.setColor(color); mWatch = false; mTextView.setText(String.format("%08X",color)); } + //IUO: sets all Views to render the desired color. Used for initilaization and HEX color input protected void runColor(int color) { Color.RGBToHSV(Color.red(color), Color.green(color), Color.blue(color), mHsvSelected); mHueTemplate[0] = mHsvSelected[0]; mHueView.setHue(mHsvSelected[0]); - mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate)); + mLuminosityIntensityView.setColor(Color.HSVToColor(mHueTemplate), false); mLuminosityIntensityView.setLuminosityIntensity(mHsvSelected[2], mHsvSelected[1]); - mAlphaView.setAlpha(Color.alpha(color)); + mAlphaSelected = Color.alpha(color); + mAlphaView.setAlpha(mAlphaSelected); mColorView.setColor(color); } diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/SVRectangleView.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/SVRectangleView.java index 0d75ab0b7..3bd8a799f 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/SVRectangleView.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/colorselector/SVRectangleView.java @@ -62,9 +62,9 @@ public class SVRectangleView extends View { invalidate(); } - public void setColor(int color) { + public void setColor(int color, boolean invalidate) { mColorPaint.setColor(color); - invalidate(); + if(invalidate) invalidate(); } public void setRectSelectionListener(RectangleSelectionListener listener) { diff --git a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java index 18c7d7c1a..53565bdd4 100644 --- a/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java +++ b/app_pojavlauncher/src/main/java/net/kdt/pojavlaunch/customcontrols/handleview/EditControlButtonPopup.java @@ -9,6 +9,7 @@ import android.widget.ArrayAdapter; import android.widget.CheckBox; import android.widget.EditText; import android.widget.ImageButton; +import android.widget.ImageView; import android.widget.SeekBar; import android.widget.Spinner; import android.widget.TextView; @@ -18,6 +19,7 @@ import androidx.appcompat.app.AlertDialog; import net.kdt.pojavlaunch.EfficientAndroidLWJGLKeycode; import net.kdt.pojavlaunch.R; import net.kdt.pojavlaunch.Tools; +import net.kdt.pojavlaunch.colorselector.ColorSelector; import net.kdt.pojavlaunch.customcontrols.buttons.ControlButton; import net.kdt.pojavlaunch.customcontrols.ControlData; @@ -56,6 +58,9 @@ public class EditControlButtonPopup { protected TextView mStrokeWidthTextView; protected TextView mStrokeColorTextView; + protected ColorSelector mColorSelector; + protected ImageView mEditingView; + protected final ControlButton mControlButton; protected final ControlData mProperties; @@ -168,9 +173,11 @@ public class EditControlButtonPopup { spinner.setAdapter(mAdapter); } + mColorSelector = new ColorSelector(ctx,color -> mEditingView.setImageDrawable(new ColorDrawable(color))); + //Set color imageButton behavior - mBackgroundColorButton.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit background color", true, mBackgroundColorButton)); - mStrokeColorButton.setOnClickListener(view -> ActionPopupWindow.showColorPicker(ctx, "Edit stroke color", false, mStrokeColorButton)); + mBackgroundColorButton.setOnClickListener(this::colorButtonHandler); + mStrokeColorButton.setOnClickListener(this::colorButtonHandler); //Set dialog buttons behavior @@ -183,6 +190,12 @@ public class EditControlButtonPopup { setupCheckerboards(); } + protected void colorButtonHandler(View view) { + ImageView imgView = (ImageView) view; + mEditingView = imgView; + mColorSelector.show(((ColorDrawable)(imgView.getDrawable())).getColor()); + } + protected void setupDialogButtons(){ //Set dialog buttons behavior mBuilder.setPositiveButton(android.R.string.ok, (dialogInterface1, i) -> {