Image Editor: Keep text on top.

Sorts children by a new z-order.
This commit is contained in:
Alan Evans 2020-03-25 10:04:19 -03:00 committed by Greyson Parrelli
parent d46894e5db
commit 0e2df2adbb
4 changed files with 24 additions and 16 deletions

View file

@ -320,7 +320,7 @@ public final class ImageEditorView extends FrameLayout {
private EditSession startADrawingSession(@NonNull PointF point) {
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);
Matrix elementInverseMatrix = model.findElementInverseMatrix(element, viewMatrix);

View file

@ -3,12 +3,15 @@ package org.thoughtcrime.securesms.imageeditor.model;
import android.graphics.Matrix;
import android.os.Parcel;
import android.os.Parcelable;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.imageeditor.Renderer;
import org.thoughtcrime.securesms.imageeditor.RendererContext;
import java.util.Collections;
import java.util.Comparator;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
@ -32,10 +35,13 @@ import java.util.UUID;
*/
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 EditorFlags flags;
private final Matrix localMatrix = new Matrix();
private final Matrix editorMatrix = new Matrix();
private final int zOrder;
@Nullable
private final Renderer renderer;
@ -54,9 +60,14 @@ public final class EditorElement implements Parcelable {
private AlphaAnimation alphaAnimation = AlphaAnimation.NULL_1;
public EditorElement(@Nullable Renderer renderer) {
this(renderer, 0);
}
public EditorElement(@Nullable Renderer renderer, int zOrder) {
this.id = UUID.randomUUID();
this.flags = new EditorFlags();
this.renderer = renderer;
this.zOrder = zOrder;
}
private EditorElement(Parcel in) {
@ -64,6 +75,7 @@ public final class EditorElement implements Parcelable {
flags = new EditorFlags(in.readInt());
ParcelUtils.readMatrix(localMatrix, in);
renderer = in.readParcelable(Renderer.class.getClassLoader());
zOrder = in.readInt();
in.readTypedList(children, EditorElement.CREATOR);
}
@ -127,6 +139,7 @@ public final class EditorElement implements Parcelable {
public void addElement(@NonNull EditorElement element) {
children.add(element);
Collections.sort(children, Z_ORDER_COMPARATOR);
}
public Matrix getLocalMatrix() {
@ -328,6 +341,7 @@ public final class EditorElement implements Parcelable {
dest.writeInt(this.flags.asInt());
ParcelUtils.writeMatrix(dest, localMatrix);
dest.writeParcelable(renderer, flags);
dest.writeInt(zOrder);
dest.writeTypedList(children);
}
}

View file

@ -35,6 +35,10 @@ import java.util.UUID;
*/
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 = () -> {
};

View file

@ -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_IS_AVATAR_MODE = "avatar_mode";
private static final int SELECT_OLD_STICKER_REQUEST_CODE = 123;
private static final int SELECT_NEW_STICKER_REQUEST_CODE = 124;
private static final int SELECT_STICKER_REQUEST_CODE = 124;
private EditorModel restoredModel;
@ -241,7 +240,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
String initialText = "";
int color = imageEditorHud.getActiveColor();
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.invalidate();
@ -254,20 +253,11 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
@Override
public void onActivityResult(int requestCode, int resultCode, Intent 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();
if (uri != null) {
UriGlideRenderer renderer = new UriGlideRenderer(uri, true, imageMaxWidth, imageMaxHeight);
EditorElement element = new EditorElement(renderer);
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);
EditorElement element = new EditorElement(renderer, EditorModel.Z_STICKERS);
imageEditorView.getModel().addElementCentered(element, 0.2f);
currentSelection = element;
imageEditorHud.setMode(ImageEditorHud.Mode.MOVE_DELETE);
@ -307,7 +297,7 @@ public final class ImageEditorFragment extends Fragment implements ImageEditorHu
case INSERT_STICKER: {
Intent intent = new Intent(getContext(), ImageEditorStickerSelectActivity.class);
startActivityForResult(intent, SELECT_NEW_STICKER_REQUEST_CODE);
startActivityForResult(intent, SELECT_STICKER_REQUEST_CODE);
break;
}