Skip to content

Commit

Permalink
arrows redesign and bugfix
Browse files Browse the repository at this point in the history
  • Loading branch information
kirillp committed Aug 21, 2024
1 parent 6b48354 commit 7187b48
Show file tree
Hide file tree
Showing 8 changed files with 83 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import org.sudu.experiments.editor.*;
import org.sudu.experiments.editor.Diff;
import org.sudu.experiments.editor.test.MergeButtonsTestModel;
import org.sudu.experiments.editor.test.MergeButtonsModel;
import org.sudu.experiments.editor.ui.colors.EditorColorScheme;
import org.sudu.experiments.editor.worker.diff.DiffInfo;
import org.sudu.experiments.editor.worker.diff.DiffUtils;
Expand Down Expand Up @@ -164,8 +164,8 @@ public void setDiffModel(DiffInfo diffInfo) {
diffSync.setModel(diffModel);
middleLine.setModel(diffModel);

var pair = MergeButtonsTestModel.getModels(diffInfo, this::applyDiff);
MergeButtonsTestModel m1 = pair[0], m2 = pair[1];
var pair = MergeButtonsModel.getModels(diffInfo, this::applyDiff);
MergeButtonsModel m1 = pair[0], m2 = pair[1];
editor1.setMergeButtons(m1.actions, m1.lines);
editor2.setMergeButtons(m2.actions, m2.lines);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
import org.sudu.experiments.parser.ParserConstants;

public class CodeElement {
public static final int italic = 1;
public static final int bold = 2;

public String s;

// color values: org.sudu.experiments.parser.ParserConstants.TokenTypes
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package org.sudu.experiments.editor;

import org.sudu.experiments.SceneApi;
import org.sudu.experiments.editor.test.MergeButtonsTestModel;
import org.sudu.experiments.fonts.Fonts;
import org.sudu.experiments.input.KeyCode;
import org.sudu.experiments.input.KeyEvent;
Expand All @@ -12,15 +11,9 @@ public Editor1(SceneApi api) {
super(api);
StartFile.apply(editor);

setMergeModel();
api.input.onKeyPress.add(this::onKeyPress);
}

private void setMergeModel() {
var m = new MergeButtonsTestModel(document().length());
editor.setMergeButtons(m.actions, m.lines);
}

boolean onKeyPress(KeyEvent event) {
if (event.keyCode == KeyCode.F10) {
api.window.addChild("child", Editor1::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -229,9 +229,9 @@ void toggleMirrored() {
lineNumbers.dispose();
lineNumbers = new LineNumbersComponent();
updateLineNumbersFont();
internalLayout();
if (mergeButtons != null && lineHeight != 0)
setMergeButtonsFont();
internalLayout();
}

private void toggleTopTextRenderMode() {
Expand Down Expand Up @@ -331,10 +331,9 @@ private void doChangeFont(String name, float virtualSize) {
invalidateFont();
setFont(name, newPixelFontSize);
model.caretPos = caretCodeLine().computePixelLocation(model.caretCharPos, g.mCanvas, fonts);
if (mergeButtons != null) {
if (mergeButtons != null)
setMergeButtonsFont();
layoutMergeButtons();
}
internalLayout();
adjustEditorScrollToCaret();
updateLineNumbersFont();
}
Expand Down Expand Up @@ -1714,26 +1713,28 @@ public String toString() {
}

private void setMergeButtonsFont() {
mergeButtons.setFont(lineHeight, !mirrored);
mergeButtons.setFont(lineHeight, !mirrored, fonts[CodeElement.bold]);
}

private void layoutMergeButtons() {
int x = mirrored ? lineNumbers.pos.x
: lineNumbers.pos.x + lineNumbers.size.x;
mergeButtons.setPosition(x, lineNumbers.pos.y, mergeWidth(), lineNumbers.size.y, dpr);
int mWidth = mergeWidth();
mergeButtons.setPosition(x, lineNumbers.pos.y, mWidth, lineNumbers.size.y, dpr);
mergeButtons.setScrollPos(vScrollPos);
}

private int mergeWidth() {
return Numbers.iDivRound(lineHeight, 15, 16);
return mergeButtons.measure(fonts[CodeElement.bold], g.mCanvas, dpr);
}

public void setMergeButtons(Runnable[] actions, int[] lines) {
if (mergeButtons == null) {
mergeButtons = new MergeButtons();
if (dpr != 0)
if (dpr != 0) {
setMergeButtonsFont();
internalLayout();
internalLayout();
}
}
mergeButtons.setModel(actions, lines);
mergeButtons.setColors(lineNumbers.colors());
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
package org.sudu.experiments.editor;

import org.sudu.experiments.Cursor;
import org.sudu.experiments.Disposable;
import org.sudu.experiments.GL;
import org.sudu.experiments.WglGraphics;
import org.sudu.experiments.*;
import org.sudu.experiments.diff.DiffTypes;
import org.sudu.experiments.editor.ui.colors.EditorColorScheme;
import org.sudu.experiments.editor.ui.colors.LineNumbersColors;
Expand All @@ -19,6 +16,11 @@

public class MergeButtons implements Disposable {

static final char arrowL = '≪';
static final char arrowR = '≫';
static final char arrowR1 = '→';
static final char arrowL1 = '←';

public final V2i pos = new V2i();
public final V2i size = new V2i();
public float dpr;
Expand All @@ -36,6 +38,7 @@ public class MergeButtons implements Disposable {
private int selectedBtLine = -1, selectedBtIndex = -1;
private final boolean drawBg;
private boolean toLeft;
private FontDesk font;

static final boolean drawFrames = false;

Expand All @@ -51,11 +54,11 @@ public void setPosition(int x, int y, int width, int height, float dpr) {
this.dpr = dpr;
}

public void setFont(int lineHeight, boolean rtl) {
public void setFont(int lineHeight, boolean rtl, FontDesk font) {
this.lineHeight = lineHeight;
this.toLeft = rtl;
System.out.println("MergeButtons.setFont " +
lineHeight);
this.font = font;
// System.out.println("MergeButtons.setFont " + font.name + " lh=" + lineHeight);
texture = Disposable.dispose(texture);
}

Expand All @@ -79,8 +82,6 @@ public void draw(
LineNumbersColors lnColors = scheme.lineNumber;
if (drawBg) {
g.drawRect(pos.x, pos.y, size, lnColors.bgColor);
} else {
// WindowPaint.drawInnerFrame(g, size, pos, scheme.diff.deletedBgColor, -1, c.size);
}
this.firstLine = firstLine;
this.lastLine = lastLine;
Expand All @@ -94,7 +95,7 @@ public void draw(
g.enableScissor(pos, size);
int nextBt = bIndex < lines.length ? lines[bIndex] : -1;
int x = pos.x;
bSize.set(lineHeight, lineHeight);
bSize.set(texture.width(), lineHeight);
for (int l = firstLine; l <= lastLine ; l++) {
int y = pos.y + l * lineHeight - scrollPos;
byte color = l < colors.length ? colors[l] : 0;
Expand All @@ -107,7 +108,7 @@ public void draw(
// g.drawRect(x, y, bSize, bg);
c.drawIcon(
g, texture, x, y,
bgColor, lnColors.textColor
bgColor, lnColors.caretTextColor
);
if (drawFrames) {
debug.set(x, y);
Expand All @@ -130,7 +131,9 @@ public void draw(
WindowPaint.drawInnerFrame(g, bSize, debug, scheme.diff.deletedBgColor, -1, c.size);
}
}
// WindowPaint.drawInnerFrame(g, size, pos, scheme.diff.deletedBgColor, -1, c.size);
if (drawFrames) {
WindowPaint.drawInnerFrame(g, size, pos, scheme.diff.deletedBgColor, -1, c.size);
}
}

private int findBIndex(int firstLine) {
Expand Down Expand Up @@ -211,12 +214,23 @@ private FontDesk fontDesk(WglGraphics g, float size) {
}

private GL.Texture renderIcon(WglGraphics g, boolean cleartype) {
char icon = toLeft ? Codicons.chevron_left : Codicons.chevron_right;
FontDesk font = fontDesk(g, lineHeight);
int yOffset = -Numbers.iDivRound(lastLine, 3, 32);
return g.renderTexture(
String.valueOf(icon), font, iconTextureMargin,
// char icon = toLeft ? Codicons.chevron_left : Codicons.chevron_right;
// FontDesk font = fontDesk(g, lineHeight);
// int yOffset = -Numbers.iDivRound(lastLine, 3, 32);
char icon = toLeft ? arrowL : arrowR;
int yOffset = 0;
int margin = DprUtil.toPx(iconTextureMargin, dpr);
GL.Texture t = g.renderTexture(
String.valueOf(icon), font, margin,
lineHeight, yOffset, cleartype);
// System.out.println("MergeButtons.renderIcon: t.w=" + t.width() + ", w = " + size.x);
return t;
}

public int measure(FontDesk font, Canvas mCanvas, float dpr) {
int margin = DprUtil.toPx(iconTextureMargin, dpr);
char icon = toLeft ? arrowL : arrowR;
return mCanvas.measurePx(font, String.valueOf(icon), margin * 2);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,21 +6,21 @@

import java.util.function.BiConsumer;

public class MergeButtonsTestModel {
public class MergeButtonsModel {
public int[] lines;
public Runnable[] actions;

public MergeButtonsTestModel(int n) {
public MergeButtonsModel(int n) {
actions = new Runnable[n];
lines = new int[n];
}

public static MergeButtonsTestModel[] getModels(DiffInfo diffInfo, BiConsumer<DiffRange, Boolean> applyDiff) {
public static MergeButtonsModel[] getModels(DiffInfo diffInfo, BiConsumer<DiffRange, Boolean> applyDiff) {
int n = 0;
for (var range: diffInfo.ranges) if (range.type != DiffTypes.DEFAULT) n++;

var left = new MergeButtonsTestModel(n);
var right = new MergeButtonsTestModel(n);
var left = new MergeButtonsModel(n);
var right = new MergeButtonsModel(n);
int i = 0;
for (var range: diffInfo.ranges) {
if (range.type == DiffTypes.DEFAULT) continue;
Expand All @@ -30,10 +30,6 @@ public static MergeButtonsTestModel[] getModels(DiffInfo diffInfo, BiConsumer<Di
right.actions[i] = () -> applyDiff.accept(range, false);
i++;
}
return new MergeButtonsTestModel[]{left, right};
}

static Runnable action(int pi) {
return () -> System.out.println("Runnable #" + pi);
return new MergeButtonsModel[]{left, right};
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,18 @@
import org.sudu.experiments.WglGraphics;
import org.sudu.experiments.editor.ClrContext;
import org.sudu.experiments.editor.MergeButtons;
import org.sudu.experiments.editor.test.MergeButtonsTestModel;
import org.sudu.experiments.editor.test.MergeButtonsModel;
import org.sudu.experiments.editor.ui.colors.EditorColorScheme;
import org.sudu.experiments.editor.ui.window.TestColors;
import org.sudu.experiments.fonts.FontDesk;
import org.sudu.experiments.fonts.Fonts;
import org.sudu.experiments.input.KeyCode;
import org.sudu.experiments.input.KeyEvent;
import org.sudu.experiments.input.MouseEvent;
import org.sudu.experiments.input.MouseListener;
import org.sudu.experiments.math.Numbers;
import org.sudu.experiments.math.V2i;
import org.sudu.experiments.math.XorShiftRandom;

import java.util.function.Consumer;

Expand All @@ -32,6 +35,7 @@ public class MergeButtonsTest extends Scene0 implements MouseListener {
private int lineHeight = 0;
private int docLines = 100;
private int virtualSize;
private FontDesk font;

public MergeButtonsTest(SceneApi api) {
super(api);
Expand All @@ -42,11 +46,29 @@ public MergeButtonsTest(SceneApi api) {
api.input.onScroll.add(this::onMouseWheel);
api.input.onKeyPress.add(this::onKey);

var m = new MergeButtonsTestModel(docLines);
var m = new TestModel(docLines);
buttons.setModel(m.actions, m.lines);
buttons.setColors(new byte[docLines]);
}

static class TestModel extends MergeButtonsModel {
public TestModel(int docLines) {
super(docLines);
int n = docLines / 4;
XorShiftRandom rand = new XorShiftRandom();
int space = docLines / (1 + n);
for (int i = 0, pi = 0; i < n; i++) {
lines[i] = pi;
actions[i] = action(pi);
pi += 1 + rand.nextInt(space);
}
}
}

static Runnable action(int pi) {
return () -> System.out.println("Runnable #" + pi);
}

@Override
public void dispose() {
buttons.dispose();
Expand All @@ -55,7 +77,7 @@ public void dispose() {

private boolean onKey(KeyEvent keyEvent) {
if (keyEvent.keyCode == KeyCode.SPACE) {
buttons.setFont(lineHeight, toLeft = !toLeft);
buttons.setFont(lineHeight, toLeft = !toLeft, font);
return true;
}
return false;
Expand All @@ -79,11 +101,12 @@ public void onResize(V2i newSize, float dpr) {
int left = DprUtil.toPx(20, dpr);
buttons.setPosition(left, top, w, size.y / 2, dpr);

font = api.graphics.fontDesk(Fonts.Consolas, 20, dpr);
int _20 = DprUtil.toPx(20, dpr);
lineHeight = _20;
lineHeight = font.lineHeight();
virtualSize = docLines * lineHeight;

buttons.setFont(lineHeight, toLeft);
buttons.setFont(lineHeight, toLeft, font);
}

final ClrContext ctx = new ClrContext(true);
Expand Down
4 changes: 2 additions & 2 deletions graphics/src/main/java/org/sudu/experiments/WglGraphics.java
Original file line number Diff line number Diff line change
Expand Up @@ -123,8 +123,8 @@ public GL.Texture renderTexture(
int lrMargin, int height, int yOffset, boolean cleartype
) {
mCanvas.setFont(font);
int measured = mCanvas.measurePx(s);
Canvas canvas = createCanvas(measured + lrMargin * 2, height, cleartype);
int measured = mCanvas.measurePx(s, lrMargin * 2);
Canvas canvas = createCanvas(measured, height, cleartype);
canvas.setFont(font);
canvas.drawText(s, lrMargin, font.baselineShift(height) + yOffset);
GL.Texture texture = createTexture(canvas);
Expand Down

0 comments on commit 7187b48

Please sign in to comment.