mirror of https://github.com/buggins/dlangui.git
Edit Box - measure and draw lines
This commit is contained in:
parent
e04d2ab7a5
commit
d9162b7496
|
@ -371,7 +371,7 @@ class EditLine : EditWidgetBase {
|
||||||
|
|
||||||
protected void measureText() {
|
protected void measureText() {
|
||||||
FontRef font = font();
|
FontRef font = font();
|
||||||
Point sz = font.textSize(text);
|
//Point sz = font.textSize(text);
|
||||||
_measuredText = text;
|
_measuredText = text;
|
||||||
_measuredTextWidths.length = _measuredText.length;
|
_measuredTextWidths.length = _measuredText.length;
|
||||||
int charsMeasured = font.measureText(_measuredText, _measuredTextWidths, int.max);
|
int charsMeasured = font.measureText(_measuredText, _measuredTextWidths, int.max);
|
||||||
|
@ -499,8 +499,9 @@ class EditLine : EditWidgetBase {
|
||||||
|
|
||||||
/// single line editor
|
/// single line editor
|
||||||
class EditBox : EditWidgetBase {
|
class EditBox : EditWidgetBase {
|
||||||
ScrollBar _hscrollbar;
|
protected ScrollBar _hscrollbar;
|
||||||
ScrollBar _vscrollbar;
|
protected ScrollBar _vscrollbar;
|
||||||
|
|
||||||
this(string ID, dstring initialContent = null) {
|
this(string ID, dstring initialContent = null) {
|
||||||
super(ID);
|
super(ID);
|
||||||
_content = new EditableContent(true); // multiline
|
_content = new EditableContent(true); // multiline
|
||||||
|
@ -513,6 +514,38 @@ class EditBox : EditWidgetBase {
|
||||||
addChild(_vscrollbar);
|
addChild(_vscrollbar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected int _lineHeight;
|
||||||
|
|
||||||
|
protected Point _scrollPos;
|
||||||
|
protected int _firstVisibleLine;
|
||||||
|
|
||||||
|
protected int _numVisibleLines; // number of lines visible in client area
|
||||||
|
protected dstring[] _visibleLines; // text for visible lines
|
||||||
|
protected int[][] _visibleLinesMeasurement; // char positions for visible lines
|
||||||
|
protected int[] _visibleLinesWidths; // width (in pixels) of visible lines
|
||||||
|
|
||||||
|
protected Point measureVisibleText() {
|
||||||
|
Point sz;
|
||||||
|
FontRef font = font();
|
||||||
|
_lineHeight = font.height;
|
||||||
|
_numVisibleLines = (_clientRc.height + _lineHeight - 1) / _lineHeight;
|
||||||
|
if (_firstVisibleLine + _numVisibleLines > _content.length)
|
||||||
|
_numVisibleLines = _content.length - _firstVisibleLine;
|
||||||
|
_visibleLines.length = _numVisibleLines;
|
||||||
|
_visibleLinesMeasurement.length = _numVisibleLines;
|
||||||
|
_visibleLinesWidths.length = _numVisibleLines;
|
||||||
|
for (int i = 0; i < _numVisibleLines; i++) {
|
||||||
|
_visibleLines[i] = _content[i];
|
||||||
|
_visibleLinesMeasurement[i].length = _visibleLines[i].length;
|
||||||
|
int charsMeasured = font.measureText(_visibleLines[i], _visibleLinesMeasurement[i], int.max);
|
||||||
|
_visibleLinesWidths[i] = charsMeasured > 0 ? _visibleLinesMeasurement[i][charsMeasured - 1] : 0;
|
||||||
|
if (sz.x < _visibleLinesWidths[i])
|
||||||
|
sz.x = _visibleLinesWidths[i]; // width - max from visible lines
|
||||||
|
}
|
||||||
|
sz.y = _lineHeight * _content.length; // height - for all lines
|
||||||
|
return sz;
|
||||||
|
}
|
||||||
|
|
||||||
override bool onContentChange(EditableContent content, EditOperation operation, ref TextRange rangeBefore, ref TextRange rangeAfter) {
|
override bool onContentChange(EditableContent content, EditOperation operation, ref TextRange rangeBefore, ref TextRange rangeAfter) {
|
||||||
//measureText();
|
//measureText();
|
||||||
_caretPos = rangeAfter.end;
|
_caretPos = rangeAfter.end;
|
||||||
|
@ -558,7 +591,7 @@ class EditBox : EditWidgetBase {
|
||||||
int hsbheight = _hscrollbar.measuredHeight;
|
int hsbheight = _hscrollbar.measuredHeight;
|
||||||
int vsbwidth = _vscrollbar.measuredWidth;
|
int vsbwidth = _vscrollbar.measuredWidth;
|
||||||
//measureText();
|
//measureText();
|
||||||
Point textSz = Point(200, 150); // TODO
|
Point textSz = measureVisibleText();
|
||||||
measuredContent(parentWidth, parentHeight, textSz.x + vsbwidth, textSz.y + hsbheight);
|
measuredContent(parentWidth, parentHeight, textSz.x + vsbwidth, textSz.y + hsbheight);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,6 +618,7 @@ class EditBox : EditWidgetBase {
|
||||||
_clientRc = rc;
|
_clientRc = rc;
|
||||||
_clientRc.right -= vsbwidth;
|
_clientRc.right -= vsbwidth;
|
||||||
_clientRc.bottom -= hsbheight;
|
_clientRc.bottom -= hsbheight;
|
||||||
|
Point textSz = measureVisibleText();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// draw content
|
/// draw content
|
||||||
|
@ -601,7 +635,13 @@ class EditBox : EditWidgetBase {
|
||||||
//dstring txt = text;
|
//dstring txt = text;
|
||||||
//Point sz = font.textSize(txt);
|
//Point sz = font.textSize(txt);
|
||||||
//font.drawText(buf, rc.left, rc.top + sz.y / 10, txt, textColor);
|
//font.drawText(buf, rc.left, rc.top + sz.y / 10, txt, textColor);
|
||||||
buf.fillRect(_clientRc, 0x80E0E0FF);
|
for (int i = 0; i < _visibleLines.length; i++) {
|
||||||
|
dstring txt = _visibleLines[i];
|
||||||
|
if (txt.length > 0)
|
||||||
|
font.drawText(buf, rc.left, rc.top + i * _lineHeight, txt, textColor);
|
||||||
|
}
|
||||||
|
|
||||||
|
//buf.fillRect(_clientRc, 0x80E0E0FF); // testing clientRc
|
||||||
if (focused) {
|
if (focused) {
|
||||||
// draw caret
|
// draw caret
|
||||||
Rect caretRc = textPosToClient(_caretPos);
|
Rect caretRc = textPosToClient(_caretPos);
|
||||||
|
|
Loading…
Reference in New Issue