Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(719)

Unified Diff: sky/sdk/lib/framework/rendering/box.dart

Issue 1172723002: Add a proper material shadow the popup menu (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sky/sdk/lib/framework/components2/popup_menu.dart ('k') | sky/sdk/lib/framework/theme2/shadows.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: sky/sdk/lib/framework/rendering/box.dart
diff --git a/sky/sdk/lib/framework/rendering/box.dart b/sky/sdk/lib/framework/rendering/box.dart
index e6810a3355a2e767710c94c8a0aaaccd5dab323a..3b2ac5ab2b32e3caf3a4957d05069442c2aec4e5 100644
--- a/sky/sdk/lib/framework/rendering/box.dart
+++ b/sky/sdk/lib/framework/rendering/box.dart
@@ -630,15 +630,31 @@ class Border {
String toString() => 'Border($top, $right, $bottom, $left)';
}
+class BoxShadow {
+ const BoxShadow({
+ this.color,
+ this.offset,
+ this.blur
+ });
+
+ final Color color;
+ final Size offset;
+ final double blur;
+
+ String toString() => 'BoxShadow($color, $offset, $blur)';
+}
+
// This must be immutable, because we won't notice when it changes
class BoxDecoration {
const BoxDecoration({
this.backgroundColor,
- this.border
+ this.border,
+ this.boxShadow
});
final Color backgroundColor;
final Border border;
+ final List<BoxShadow> boxShadow;
String toString([String prefix = '']) {
List<String> result = [];
@@ -646,6 +662,8 @@ class BoxDecoration {
result.add('${prefix}backgroundColor: $backgroundColor');
if (border != null)
result.add('${prefix}border: $border');
+ // if (boxShadow != null)
+ // result.add('${prefix}boxShadow: $boxShadow');
if (result.isEmpty)
return '${prefix}<no decorations specified>';
return result.join('\n');
@@ -668,17 +686,50 @@ class RenderDecoratedBox extends RenderProxyBox {
if (value == _decoration)
return;
_decoration = value;
+ _cachedBackgroundPaint = null;
markNeedsPaint();
}
+ Paint _cachedBackgroundPaint;
+ Paint get _backgroundPaint {
+ if (_cachedBackgroundPaint == null) {
+ Paint paint = new Paint();
+
+ if (_decoration.backgroundColor != null)
+ paint.color = _decoration.backgroundColor;
+
+ if (_decoration.boxShadow != null) {
+ var builder = new sky.LayerDrawLooperBuilder();
+ for (BoxShadow boxShadow in _decoration.boxShadow) {
+ builder.addLayerOnTop(
+ new sky.DrawLooperLayerInfo()
+ ..setPaintBits(-1)
+ ..setOffset(boxShadow.offset.toPoint())
+ ..setColorMode(sky.TransferMode.srcMode),
+ (Paint layerPaint) {
+ layerPaint.color = boxShadow.color;
+ layerPaint.setMaskFilter(
+ new sky.MaskFilter.Blur(sky.BlurStyle.normal,
+ boxShadow.blur,
+ highQuality: true));
+ });
+ }
+ builder.addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {});
+ paint.setDrawLooper(builder.build());
+ }
+
+ _cachedBackgroundPaint = paint;
+ }
+
+ return _cachedBackgroundPaint;
+ }
+
void paint(RenderObjectDisplayList canvas) {
assert(size.width != null);
assert(size.height != null);
- if (_decoration.backgroundColor != null) {
- Paint paint = new Paint()..color = _decoration.backgroundColor;
- canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint);
- }
+ if (_decoration.backgroundColor != null || _decoration.boxShadow != null)
+ canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), _backgroundPaint);
if (_decoration.border != null) {
assert(_decoration.border.top != null);
@@ -823,63 +874,6 @@ class RenderSizeObserver extends RenderProxyBox {
}
}
-// This must be immutable, because we won't notice when it changes
-class BoxShadow {
- const BoxShadow({
- this.color,
- this.offset,
- this.blur
- });
-
- final Size offset;
- final double blur;
- final Color color;
-}
-
-class RenderShadowedBox extends RenderProxyBox {
-
- RenderShadowedBox({
- BoxShadow shadow,
- RenderBox child
- }) : _shadow = shadow, super(child);
-
- BoxShadow _shadow;
- BoxShadow get shadow => _shadow;
- void set shadow (BoxShadow value) {
- if (value == _shadow)
- return;
- _shadow = value;
- markNeedsPaint();
- }
-
- Paint _createShadowPaint(BoxShadow shadow) {
- // TODO(eseidel): This should not be hard-coded yellow.
- Paint paint = new Paint()..color = const Color.fromARGB(255, 0, 255, 0);
- var builder = new sky.LayerDrawLooperBuilder()
- // Shadow layer.
- ..addLayerOnTop(
- new sky.DrawLooperLayerInfo()
- ..setPaintBits(-1)
- ..setOffset(shadow.offset.toPoint())
- ..setColorMode(sky.TransferMode.srcMode),
- (Paint layerPaint) {
- layerPaint.color = shadow.color;
- layerPaint.setMaskFilter(
- new sky.MaskFilter.Blur(sky.BlurStyle.normal, shadow.blur, highQuality: true));
- })
- // Main layer.
- ..addLayerOnTop(new sky.DrawLooperLayerInfo(), (_) {});
- paint.setDrawLooper(builder.build());
- return paint;
- }
-
- void paint(RenderObjectDisplayList canvas) {
- Paint paint = _createShadowPaint(_shadow);
- canvas.drawRect(new Rect.fromLTRB(0.0, 0.0, size.width, size.height), paint);
- super.paint(canvas);
- }
-}
-
typedef void CustomPaintCallback(sky.Canvas canvas);
class RenderCustomPaint extends RenderProxyBox {
« no previous file with comments | « sky/sdk/lib/framework/components2/popup_menu.dart ('k') | sky/sdk/lib/framework/theme2/shadows.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698