diff --git a/demo-edit/src/main/java/org/sudu/experiments/diff/FileDiffRootView.java b/demo-edit/src/main/java/org/sudu/experiments/diff/FileDiffRootView.java index 6c3e8cc00..35393c0b3 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/diff/FileDiffRootView.java +++ b/demo-edit/src/main/java/org/sudu/experiments/diff/FileDiffRootView.java @@ -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; @@ -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); } diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/CodeElement.java b/demo-edit/src/main/java/org/sudu/experiments/editor/CodeElement.java index 42f44fbc2..52d45f312 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/CodeElement.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/CodeElement.java @@ -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 diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/Editor1.java b/demo-edit/src/main/java/org/sudu/experiments/editor/Editor1.java index 15ee051e9..1769461d2 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/Editor1.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/Editor1.java @@ -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; @@ -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); diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/EditorComponent.java b/demo-edit/src/main/java/org/sudu/experiments/editor/EditorComponent.java index 49c1ebb64..1337de2c7 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/EditorComponent.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/EditorComponent.java @@ -229,9 +229,9 @@ void toggleMirrored() { lineNumbers.dispose(); lineNumbers = new LineNumbersComponent(); updateLineNumbersFont(); - internalLayout(); if (mergeButtons != null && lineHeight != 0) setMergeButtonsFont(); + internalLayout(); } private void toggleTopTextRenderMode() { @@ -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(); } @@ -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()); diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/MergeButtons.java b/demo-edit/src/main/java/org/sudu/experiments/editor/MergeButtons.java index 5be6e5bff..b5b331a30 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/MergeButtons.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/MergeButtons.java @@ -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; @@ -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; @@ -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; @@ -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); } @@ -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; @@ -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; @@ -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); @@ -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) { @@ -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 diff --git a/demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsTestModel.java b/demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsModel.java similarity index 64% rename from demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsTestModel.java rename to demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsModel.java index 8b4bf52cd..a895c6fb1 100644 --- a/demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsTestModel.java +++ b/demo-edit/src/main/java/org/sudu/experiments/editor/test/MergeButtonsModel.java @@ -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 applyDiff) { + public static MergeButtonsModel[] getModels(DiffInfo diffInfo, BiConsumer 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; @@ -30,10 +30,6 @@ public static MergeButtonsTestModel[] getModels(DiffInfo diffInfo, BiConsumer 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}; } } diff --git a/demo-test-scenes/src/main/java/org/sudu/experiments/ui/MergeButtonsTest.java b/demo-test-scenes/src/main/java/org/sudu/experiments/ui/MergeButtonsTest.java index b2fb83fa3..2a3261ae4 100644 --- a/demo-test-scenes/src/main/java/org/sudu/experiments/ui/MergeButtonsTest.java +++ b/demo-test-scenes/src/main/java/org/sudu/experiments/ui/MergeButtonsTest.java @@ -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; @@ -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); @@ -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(); @@ -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; @@ -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); diff --git a/graphics/src/main/java/org/sudu/experiments/WglGraphics.java b/graphics/src/main/java/org/sudu/experiments/WglGraphics.java index d27b6e4b2..a1d1f32cb 100644 --- a/graphics/src/main/java/org/sudu/experiments/WglGraphics.java +++ b/graphics/src/main/java/org/sudu/experiments/WglGraphics.java @@ -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);