Image Editor: Keep text on top.
Sorts children by a new z-order.
This commit is contained in:
parent
d46894e5db
commit
0e2df2adbb
4 changed files with 24 additions and 16 deletions
|
@ -320,7 +320,7 @@ public final class ImageEditorView extends FrameLayout {
|
||||||
|
|
||||||
private EditSession startADrawingSession(@NonNull PointF point) {
|
private EditSession startADrawingSession(@NonNull PointF point) {
|
||||||
BezierDrawingRenderer renderer = new BezierDrawingRenderer(color, thickness * Bounds.FULL_BOUNDS.width(), cap, model.findCropRelativeToRoot());
|
BezierDrawingRenderer renderer = new BezierDrawingRenderer(color, thickness * Bounds.FULL_BOUNDS.width(), cap, model.findCropRelativeToRoot());
|
||||||
EditorElement element = new EditorElement(renderer);
|
EditorElement element = new EditorElement(renderer, EditorModel.Z_DRAWING);
|
||||||
model.addElementCentered(element, 1);
|
model.addElementCentered(element, 1);
|
||||||
|
|
||||||
Matrix elementInverseMatrix = model.findElementInverseMatrix(element, viewMatrix);
|
Matrix elementInverseMatrix = model.findElementInverseMatrix(element, viewMatrix);
|
||||||
|
|
|
@ -3,12 +3,15 @@ package org.thoughtcrime.securesms.imageeditor.model;
|
||||||
import android.graphics.Matrix;
|
import android.graphics.Matrix;
|
||||||
import android.os.Parcel;
|
import android.os.Parcel;
|
||||||
import android.os.Parcelable;
|
import android.os.Parcelable;
|
||||||
|
|
||||||
import androidx.annotation.NonNull;
|
import androidx.annotation.NonNull;
|
||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
|
|
||||||
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
import org.thoughtcrime.securesms.imageeditor.Renderer;
|
||||||
import org.thoughtcrime.securesms.imageeditor.RendererContext;
|
import org.thoughtcrime.securesms.imageeditor.RendererContext;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
@ -32,10 +35,13 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class EditorElement implements Parcelable {
|
public final class EditorElement implements Parcelable {
|
||||||
|
|
||||||
|
private static final Comparator<EditorElement> Z_ORDER_COMPARATOR = (e1, e2) -> Integer.compare(e1.zOrder, e2.zOrder);
|
||||||
|
|
||||||
private final UUID id;
|
private final UUID id;
|
||||||
private final EditorFlags flags;
|
private final EditorFlags flags;
|
||||||
private final Matrix localMatrix = new Matrix();
|
private final Matrix localMatrix = new Matrix();
|
||||||
private final Matrix editorMatrix = new Matrix();
|
private final Matrix editorMatrix = new Matrix();
|
||||||
|
private final int zOrder;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
private final Renderer renderer;
|
private final Renderer renderer;
|
||||||
|
@ -54,9 +60,14 @@ public final class EditorElement implements Parcelable {
|
||||||
private AlphaAnimation alphaAnimation = AlphaAnimation.NULL_1;
|
private AlphaAnimation alphaAnimation = AlphaAnimation.NULL_1;
|
||||||
|
|
||||||
public EditorElement(@Nullable Renderer renderer) {
|
public EditorElement(@Nullable Renderer renderer) {
|
||||||
|
this(renderer, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
public EditorElement(@Nullable Renderer renderer, int zOrder) {
|
||||||
this.id = UUID.randomUUID();
|
this.id = UUID.randomUUID();
|
||||||
this.flags = new EditorFlags();
|
this.flags = new EditorFlags();
|
||||||
this.renderer = renderer;
|
this.renderer = renderer;
|
||||||
|
this.zOrder = zOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private EditorElement(Parcel in) {
|
private EditorElement(Parcel in) {
|
||||||
|
@ -64,6 +75,7 @@ public final class EditorElement implements Parcelable {
|
||||||
flags = new EditorFlags(in.readInt());
|
flags = new EditorFlags(in.readInt());
|
||||||
ParcelUtils.readMatrix(localMatrix, in);
|
ParcelUtils.readMatrix(localMatrix, in);
|
||||||
renderer = in.readParcelable(Renderer.class.getClassLoader());
|
renderer = in.readParcelable(Renderer.class.getClassLoader());
|
||||||
|
zOrder = in.readInt();
|
||||||
in.readTypedList(children, EditorElement.CREATOR);
|
in.readTypedList(children, EditorElement.CREATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +139,7 @@ public final class EditorElement implements Parcelable {
|
||||||
|
|
||||||
public void addElement(@NonNull EditorElement element) {
|
public void addElement(@NonNull EditorElement element) {
|
||||||
children.add(element);
|
children.add(element);
|
||||||
|
Collections.sort(children, Z_ORDER_COMPARATOR);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Matrix getLocalMatrix() {
|
public Matrix getLocalMatrix() {
|
||||||
|
@ -328,6 +341,7 @@ public final class EditorElement implements Parcelable {
|
||||||
dest.writeInt(this.flags.asInt());
|
dest.writeInt(this.flags.asInt());
|
||||||
ParcelUtils.writeMatrix(dest, localMatrix);
|
ParcelUtils.writeMatrix(dest, localMatrix);
|
||||||
dest.writeParcelable(renderer, flags);
|
dest.writeParcelable(renderer, flags);
|
||||||
|
dest.writeInt(zOrder);
|
||||||
dest.writeTypedList(children);
|
dest.writeTypedList(children);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,10 @@ import java.util.UUID;
|
||||||
*/
|
*/
|
||||||
public final class EditorModel implements Parcelable, RendererContext.Ready {
|
public final class EditorModel implements Parcelable, RendererContext.Ready {
|
||||||
|
|
||||||
|
public static final int Z_DRAWING = 0;
|
||||||
|
public static final int Z_STICKERS = 0;
|
||||||
|
public static final int Z_TEXT = 1;
|
||||||
|
|
||||||
private static final Runnable NULL_RUNNABLE = () -> {
|
private static final Runnable NULL_RUNNABLE = () -> {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
||||||
private static final String KEY_IMAGE_URI = "image_uri";
|
private static final String KEY_IMAGE_URI = "image_uri";
|
||||||
private static final String KEY_IS_AVATAR_MODE = "avatar_mode";
|
private static final String KEY_IS_AVATAR_MODE = "avatar_mode";
|
||||||
|
|
||||||
private static final int SELECT_OLD_STICKER_REQUEST_CODE = 123;
|
private static final int SELECT_STICKER_REQUEST_CODE = 124;
|
||||||
private static final int SELECT_NEW_STICKER_REQUEST_CODE = 124;
|
|
||||||
|
|
||||||
private EditorModel restoredModel;
|
private EditorModel restoredModel;
|
||||||
|
|
||||||
|
@ -241,7 +240,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
||||||
String initialText = "";
|
String initialText = "";
|
||||||
int color = imageEditorHud.getActiveColor();
|
int color = imageEditorHud.getActiveColor();
|
||||||
MultiLineTextRenderer renderer = new MultiLineTextRenderer(initialText, color);
|
MultiLineTextRenderer renderer = new MultiLineTextRenderer(initialText, color);
|
||||||
EditorElement element = new EditorElement(renderer);
|
EditorElement element = new EditorElement(renderer, EditorModel.Z_TEXT);
|
||||||
|
|
||||||
imageEditorView.getModel().addElementCentered(element, 1);
|
imageEditorView.getModel().addElementCentered(element, 1);
|
||||||
imageEditorView.invalidate();
|
imageEditorView.invalidate();
|
||||||
|
@ -254,20 +253,11 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
||||||
@Override
|
@Override
|
||||||
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
public void onActivityResult(int requestCode, int resultCode, Intent data) {
|
||||||
super.onActivityResult(requestCode, resultCode, data);
|
super.onActivityResult(requestCode, resultCode, data);
|
||||||
if (resultCode == RESULT_OK && requestCode == SELECT_NEW_STICKER_REQUEST_CODE && data != null) {
|
if (resultCode == RESULT_OK && requestCode == SELECT_STICKER_REQUEST_CODE && data != null) {
|
||||||
final Uri uri = data.getData();
|
final Uri uri = data.getData();
|
||||||
if (uri != null) {
|
if (uri != null) {
|
||||||
UriGlideRenderer renderer = new UriGlideRenderer(uri, true, imageMaxWidth, imageMaxHeight);
|
UriGlideRenderer renderer = new UriGlideRenderer(uri, true, imageMaxWidth, imageMaxHeight);
|
||||||
EditorElement element = new EditorElement(renderer);
|
EditorElement element = new EditorElement(renderer, EditorModel.Z_STICKERS);
|
||||||
imageEditorView.getModel().addElementCentered(element, 0.2f);
|
|
||||||
currentSelection = element;
|
|
||||||
imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE);
|
|
||||||
}
|
|
||||||
} else if (resultCode == RESULT_OK && requestCode == SELECT_OLD_STICKER_REQUEST_CODE && data != null) {
|
|
||||||
final Uri uri = data.getData();
|
|
||||||
if (uri != null) {
|
|
||||||
UriGlideRenderer renderer = new UriGlideRenderer(uri, false, imageMaxWidth, imageMaxHeight);
|
|
||||||
EditorElement element = new EditorElement(renderer);
|
|
||||||
imageEditorView.getModel().addElementCentered(element, 0.2f);
|
imageEditorView.getModel().addElementCentered(element, 0.2f);
|
||||||
currentSelection = element;
|
currentSelection = element;
|
||||||
imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE);
|
imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE);
|
||||||
|
@ -307,7 +297,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
|
||||||
|
|
||||||
case INSERT_STICKER: {
|
case INSERT_STICKER: {
|
||||||
Intent intent = new Intent(getContext(), ImageEditorStickerSelectActivity.class);
|
Intent intent = new Intent(getContext(), ImageEditorStickerSelectActivity.class);
|
||||||
startActivityForResult(intent, SELECT_NEW_STICKER_REQUEST_CODE);
|
startActivityForResult(intent, SELECT_STICKER_REQUEST_CODE);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue