1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
use ui;
use core:geometry;
use core:io;
use progvis:net;
use graphics;
class CodeView extends Window {
CodePainter painter;
init() {
init() {}
painter(painter);
}
init(Str message) {
init() {}
painter.message(message);
painter(painter);
}
void clear() {
painter.clear();
repaint();
}
void message(Str msg) {
painter.message(msg);
repaint();
}
void show(Code code) {
painter.show(code);
repaint();
}
Size minSize() : override {
Size(70, 100);
}
Bool onMouseVScroll(Point at, Int delta) : override {
painter.onVScroll(at, delta);
true;
}
}
class CodePainter extends Painter {
private SolidBrush brush;
private Text? code;
private Float yOffset;
private Bool center;
init() {
init() {
brush = SolidBrush(black);
center = false;
}
bgColor = white;
}
void show(Code code) {
MemoryProtocol mem;
Url url = code.put("code", mem);
this.code = progvis:program:highlightSource(url, code.src, progvis:view:codeFont);
this.center = false;
yOffset = 0;
}
void message(Str message) {
this.code = Text(message, progvis:view:dataFont);
this.center = true;
yOffset = 0;
}
void clear() {
this.code = null;
yOffset = 0;
}
Bool render(Size me, Graphics g) : override {
if (code) {
Size codeSz = code.size;
if (center) {
// Just center the text as a message.
g.draw(code, brush, Point((me - codeSz) / 2));
} else {
// Allow scrolling.
yOffset = max(yOffset, me.h - codeSz.h);
yOffset = min(yOffset, 0);
g.draw(code, brush, Point(4, yOffset));
// Draw scroll bar.
Float ratio = min(1.0, me.h / codeSz.h);
Float offset = -yOffset / codeSz.h;
Rect barRect(Point(me.w - 10, offset * me.h), Size(6, ratio * me.h));
brush.opacity = 0.6;
g.fill(barRect, Size(3), brush);
brush.opacity = 1;
}
}
Rect border(Point(), me);
g.draw(border, brush);
false;
}
void onVScroll(Point at, Int delta) {
yOffset += delta.float * 0.8;
repaint();
}
}
|