Commit b1435e29 authored by Adam Barth's avatar Adam Barth

Merge pull request #305 from abarth/input_layout

Give loose contraints to text inside input widget
parents 6d57a2a2 64a64535
......@@ -167,7 +167,7 @@ class InputState extends ScrollableState<Input> {
scrollTo(scrollBehavior.updateExtents(
contentExtent: _contentWidth,
containerExtent: _containerWidth,
scrollOffset: _contentWidth)
);
scrollOffset: _contentWidth
));
}
}
......@@ -177,10 +177,18 @@ class TextPainter {
return _applyFloatingPointHack(_paragraph.maxIntrinsicWidth);
}
double get width {
assert(!_needsLayout);
return _applyFloatingPointHack(_paragraph.width);
}
double get height {
assert(!_needsLayout);
return _applyFloatingPointHack(_paragraph.height);
}
Size get size {
assert(!_needsLayout);
double height = _applyFloatingPointHack(_paragraph.height);
double width = _applyFloatingPointHack(_paragraph.width);
return new Size(width, height);
}
......
......@@ -60,15 +60,21 @@ class RenderEditableParagraph extends RenderParagraph {
markNeedsPaint();
}
// Editable text does not support line wrap.
bool get allowLineWrap => false;
BoxConstraints _getTextContraints(BoxConstraints constraints) {
return new BoxConstraints(
minWidth: 0.0,
maxWidth: double.INFINITY,
minHeight: constraints.minHeight,
maxHeight: constraints.maxHeight
);
}
double _getIntrinsicWidth(BoxConstraints constraints) {
// There should be no difference between the minimum and maximum width
// because we only support single-line text.
layoutText(constraints);
layoutText(_getTextContraints(constraints));
return constraints.constrainWidth(
textPainter.size.width + _kCursorGap + _kCursorWidth
textPainter.width + _kCursorGap + _kCursorWidth
);
}
......@@ -81,23 +87,21 @@ class RenderEditableParagraph extends RenderParagraph {
}
void performLayout() {
layoutText(constraints);
layoutText(_getTextContraints(constraints));
Size contentSize = new Size(textPainter.width + _kCursorGap + _kCursorWidth, textPainter.height);
size = constraints.constrain(contentSize);
Offset cursorPadding = const Offset(_kCursorGap + _kCursorWidth, 0.0);
Size newContentSize = textPainter.size + cursorPadding;
size = constraints.constrain(newContentSize);
if (_contentSize == null || _contentSize != newContentSize) {
_contentSize = newContentSize;
if (_contentSize == null || _contentSize != contentSize) {
_contentSize = contentSize;
if (onContentSizeChanged != null)
onContentSizeChanged(newContentSize);
onContentSizeChanged(_contentSize);
}
}
void paint(PaintingContext context, Offset offset) {
layoutText(constraints);
layoutText(_getTextContraints(constraints));
bool needsClipping = (_contentSize.width > size.width);
final bool needsClipping = (_contentSize.width > size.width);
if (needsClipping) {
context.canvas.save();
context.canvas.clipRect(offset & size);
......@@ -107,15 +111,12 @@ class RenderEditableParagraph extends RenderParagraph {
if (_showCursor) {
Rect cursorRect = new Rect.fromLTWH(
textPainter.size.width + _kCursorGap,
_kCursorHeightOffset,
offset.dx + _contentSize.width - _kCursorWidth - _scrollOffset.dx,
offset.dy + _kCursorHeightOffset - _scrollOffset.dy,
_kCursorWidth,
size.height - 2.0 * _kCursorHeightOffset
);
context.canvas.drawRect(
cursorRect.shift(offset - _scrollOffset),
new Paint()..color = _cursorColor
);
context.canvas.drawRect(cursorRect, new Paint()..color = _cursorColor);
}
if (needsClipping)
......
......@@ -47,14 +47,11 @@ class RenderParagraph extends RenderBox {
markNeedsLayout();
}
// Whether the text should be allowed to wrap to multiple lines.
bool get allowLineWrap => true;
void layoutText(BoxConstraints constraints) {
assert(constraints != null);
if (_constraintsForCurrentLayout == constraints)
return; // already cached this layout
textPainter.maxWidth = allowLineWrap ? constraints.maxWidth : double.INFINITY;
textPainter.maxWidth = constraints.maxWidth;
textPainter.minWidth = constraints.minWidth;
textPainter.minHeight = constraints.minHeight;
textPainter.maxHeight = constraints.maxHeight;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment