Improve the debugPaintPointersEnabled feature. (#5435)

We have so many render objects going on these days that showing every
box that gets an event just makes the screen blue. This limits it down
to only the ones that are actually doing something with the events.
This commit is contained in:
Ian Hickson 2016-08-16 14:52:07 -07:00 committed by GitHub
parent e62bcefb5a
commit 3c51648fa6
8 changed files with 52 additions and 6 deletions

View File

@ -326,6 +326,7 @@ class _RenderSlider extends RenderConstrainedBox implements SemanticActionHandle
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (event is PointerDownEvent && isInteractive) if (event is PointerDownEvent && isInteractive)
_drag.addPointer(event); _drag.addPointer(event);
} }

View File

@ -286,6 +286,7 @@ class _RenderSwitch extends RenderToggleable {
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (event is PointerDownEvent && onChanged != null) if (event is PointerDownEvent && onChanged != null)
_drag.addPointer(event); _drag.addPointer(event);
super.handleEvent(event, entry); super.handleEvent(event, entry);

View File

@ -242,6 +242,7 @@ abstract class RenderToggleable extends RenderConstrainedBox implements Semantic
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (event is PointerDownEvent && isInteractive) if (event is PointerDownEvent && isInteractive)
_tap.addPointer(event); _tap.addPointer(event);
} }

View File

@ -1255,16 +1255,46 @@ abstract class RenderBox extends RenderObject {
@override @override
Rect get paintBounds => Point.origin & size; Rect get paintBounds => Point.origin & size;
int _debugActivePointers = 0;
/// Override this method to handle pointer events that hit this render object. /// Override this method to handle pointer events that hit this render object.
/// ///
/// For [RenderBox] objects, the `entry` argument is a [BoxHitTestEntry]. From this /// For [RenderBox] objects, the `entry` argument is a [BoxHitTestEntry]. From this
/// object you can determine the [PointerDownEvent]'s position in local coordinates. /// object you can determine the [PointerDownEvent]'s position in local coordinates.
/// (This is useful because [PointerEvent.position] is in global coordinates.) /// (This is useful because [PointerEvent.position] is in global coordinates.)
///
/// If you override this, consider calling [debugHandleEvent] as follows, so
/// that you can support [debugPaintPointersEnabled]:
///
/// ```dart
/// @override
/// void handleEvent(PointerEvent event, HitTestEntry entry) {
/// assert(debugHandleEvent(event, entry));
/// // ... handle the event ...
/// }
/// ```
// TODO(ianh): Fix the type of the argument here once https://github.com/dart-lang/sdk/issues/25232 is fixed
@override @override
void handleEvent(PointerEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
super.handleEvent(event, entry); super.handleEvent(event, entry);
}
int _debugActivePointers = 0;
/// Implements the [debugPaintPointersEnabled] debugging feature.
///
/// [RenderBox] subclasses that implement [handleEvent] should call
/// [debugHandleEvent] from their [handleEvent] method, as follows:
///
/// ```dart
/// @override
/// void handleEvent(PointerEvent event, HitTestEntry entry) {
/// assert(debugHandleEvent(event, entry));
/// // ... handle the event ...
/// }
/// ```
///
/// If you call this for a [PointerDownEvent], make sure you also call it for
/// the corresponding [PointerUpEvent] or [PointerCancelEvent].
bool debugHandleEvent(PointerEvent event, HitTestEntry entry) {
assert(() { assert(() {
if (debugPaintPointersEnabled) { if (debugPaintPointersEnabled) {
if (event is PointerDownEvent) { if (event is PointerDownEvent) {
@ -1276,6 +1306,7 @@ abstract class RenderBox extends RenderObject {
} }
return true; return true;
}); });
return true;
} }
@override @override
@ -1338,9 +1369,13 @@ abstract class RenderBox extends RenderObject {
}); });
} }
/// In debug mode, paints a rectangle if this render box has received more pointer downs than pointer up events. /// In debug mode, paints a rectangle if this render box has counted more
/// pointer downs than pointer up events.
/// ///
/// Called for every [RenderBox] when [debugPaintPointersEnabled] is true. /// Called for every [RenderBox] when [debugPaintPointersEnabled] is true.
///
/// By default, events are not counted. For details on how to ensure that
/// events are counted for your class, see [debugHandleEvent].
@protected @protected
void debugPaintPointers(PaintingContext context, Offset offset) { void debugPaintPointers(PaintingContext context, Offset offset) {
assert(() { assert(() {

View File

@ -42,10 +42,15 @@ bool debugPaintLayerBordersEnabled = false;
/// The color to use when painting Layer borders. /// The color to use when painting Layer borders.
Color debugPaintLayerBordersColor = const Color(0xFFFF9800); Color debugPaintLayerBordersColor = const Color(0xFFFF9800);
/// Causes RenderBox objects to flash while they are being tapped. /// Causes objects like [RenderPointerListener] to flash while they are being
bool debugPaintPointersEnabled = false; /// tapped. This can be useful to see how large the hit box is, e.g. when
/// debugging buttons that are harder to hit than expected.
///
/// For details on how to support this in your [RenderBox] subclass, see
/// [RenderBox.debugHandleEvent].
bool debugPaintPointersEnabled = true;
/// The color to use when reporting pointers. /// The color to use when reporting pointers for [debugPaintPointersEnabled].
int debugPaintPointersColorValue = 0x00BBBB; int debugPaintPointersColorValue = 0x00BBBB;
/// Overlay a rotating set of colors when repainting layers in checked mode. /// Overlay a rotating set of colors when repainting layers in checked mode.

View File

@ -209,6 +209,7 @@ class RenderEditableLine extends RenderBox {
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (event is PointerDownEvent && onSelectionChanged != null) { if (event is PointerDownEvent && onSelectionChanged != null) {
_tap.addPointer(event); _tap.addPointer(event);
_longPress.addPointer(event); _longPress.addPointer(event);

View File

@ -132,6 +132,7 @@ class RenderParagraph extends RenderBox {
@override @override
void handleEvent(PointerEvent event, BoxHitTestEntry entry) { void handleEvent(PointerEvent event, BoxHitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (event is! PointerDownEvent) if (event is! PointerDownEvent)
return; return;
_layoutText(minWidth: constraints.minWidth, maxWidth: constraints.maxWidth); _layoutText(minWidth: constraints.minWidth, maxWidth: constraints.maxWidth);

View File

@ -1771,6 +1771,7 @@ class RenderPointerListener extends RenderProxyBoxWithHitTestBehavior {
@override @override
void handleEvent(PointerEvent event, HitTestEntry entry) { void handleEvent(PointerEvent event, HitTestEntry entry) {
assert(debugHandleEvent(event, entry));
if (onPointerDown != null && event is PointerDownEvent) if (onPointerDown != null && event is PointerDownEvent)
return onPointerDown(event); return onPointerDown(event);
if (onPointerMove != null && event is PointerMoveEvent) if (onPointerMove != null && event is PointerMoveEvent)