Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ash/common/system/tray/tray_details_view.h" | 5 #include "ash/common/system/tray/tray_details_view.h" |
| 6 | 6 |
| 7 #include "ash/common/ash_view_ids.h" | 7 #include "ash/common/ash_view_ids.h" |
| 8 #include "ash/common/material_design/material_design_controller.h" | 8 #include "ash/common/material_design/material_design_controller.h" |
| 9 #include "ash/common/system/tray/fixed_sized_scroll_view.h" | 9 #include "ash/common/system/tray/fixed_sized_scroll_view.h" |
| 10 #include "ash/common/system/tray/system_menu_button.h" | 10 #include "ash/common/system/tray/system_menu_button.h" |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 71 void PaintChildren(const ui::PaintContext& context) override { | 71 void PaintChildren(const ui::PaintContext& context) override { |
| 72 for (int i = 0; i < child_count(); ++i) { | 72 for (int i = 0; i < child_count(); ++i) { |
| 73 if (child_at(i)->id() != VIEW_ID_STICKY_HEADER && !child_at(i)->layer()) | 73 if (child_at(i)->id() != VIEW_ID_STICKY_HEADER && !child_at(i)->layer()) |
| 74 child_at(i)->Paint(context); | 74 child_at(i)->Paint(context); |
| 75 } | 75 } |
| 76 bool did_draw_shadow = false; | 76 bool did_draw_shadow = false; |
| 77 // Paint header rows above other children in Z-order. | 77 // Paint header rows above other children in Z-order. |
| 78 for (auto& header : headers_) { | 78 for (auto& header : headers_) { |
| 79 if (!header.view->layer()) | 79 if (!header.view->layer()) |
| 80 header.view->Paint(context); | 80 header.view->Paint(context); |
| 81 did_draw_shadow = PaintDelineation(header, context) || did_draw_shadow; | 81 did_draw_shadow = PaintDelineation(header, context) || did_draw_shadow; |
|
varkha
2016/12/09 18:59:32
Self review: This is broken now that the headers h
varkha
2016/12/12 18:24:05
Should be fixed now that a separator is painted by
| |
| 82 } | 82 } |
| 83 | 83 |
| 84 // Draw a shadow at the top of the viewport when scrolled, but only if a | 84 // Draw a shadow at the top of the viewport when scrolled, but only if a |
| 85 // header didn't already draw one. Overlap the shadow with the separator | 85 // header didn't already draw one. Overlap the shadow with the separator |
| 86 // that's below the header view so we don't get both a separator and a full | 86 // that's below the header view so we don't get both a separator and a full |
| 87 // shadow. | 87 // shadow. |
| 88 if (y() != 0 && !did_draw_shadow) | 88 if (y() != 0 && !did_draw_shadow) |
| 89 DrawShadow(context, gfx::Rect(0, 0, width(), -y() - kSeparatorWidth)); | 89 DrawShadow(context, gfx::Rect(0, 0, width(), -y() - kSeparatorWidth)); |
| 90 } | 90 } |
| 91 | 91 |
| 92 void Layout() override { | 92 void Layout() override { |
| 93 views::View::Layout(); | 93 views::View::Layout(); |
| 94 headers_.clear(); | 94 headers_.clear(); |
| 95 for (int i = 0; i < child_count(); ++i) { | 95 for (int i = 0; i < child_count(); ++i) { |
| 96 views::View* view = child_at(i); | 96 views::View* view = child_at(i); |
| 97 if (view->id() == VIEW_ID_STICKY_HEADER) | 97 if (view->id() == VIEW_ID_STICKY_HEADER) |
| 98 headers_.emplace_back(view); | 98 headers_.emplace_back(view); |
| 99 } | 99 } |
| 100 PositionHeaderRows(); | 100 PositionHeaderRows(); |
| 101 } | 101 } |
| 102 | 102 |
| 103 void ReorderChildLayers(ui::Layer* parent_layer) override { | |
| 104 views::View::ReorderChildLayers(parent_layer); | |
| 105 ui::Layer* topmost_layer = TopmostLayer(this, parent_layer); | |
| 106 if (!topmost_layer) | |
| 107 return; | |
| 108 | |
| 109 // Keep the sticky headers with layers above the rest of the children's | |
| 110 // layers. Make sure to avoid changing the stacking order of the layers that | |
| 111 // are children of |parent_layer| but do not belong to the same parent view. | |
| 112 // Note: this assumes that all views that have id=VIEW_ID_STICKY_HEADER have | |
| 113 // a layer. | |
| 114 for (int i = child_count() - 1; i >= 0; --i) { | |
| 115 View* child = child_at(i); | |
| 116 if (child->id() == VIEW_ID_STICKY_HEADER) { | |
| 117 if (child->layer() != topmost_layer) | |
| 118 parent_layer->StackAbove(child->layer(), topmost_layer); | |
| 119 } | |
| 120 } | |
| 121 } | |
| 122 | |
| 103 void ViewHierarchyChanged( | 123 void ViewHierarchyChanged( |
| 104 const ViewHierarchyChangedDetails& details) override { | 124 const ViewHierarchyChangedDetails& details) override { |
| 105 if (!details.is_add && details.parent == this) { | 125 if (!details.is_add && details.parent == this) { |
| 106 headers_.erase(std::remove_if(headers_.begin(), headers_.end(), | 126 headers_.erase(std::remove_if(headers_.begin(), headers_.end(), |
| 107 [details](const Header& header) { | 127 [details](const Header& header) { |
| 108 return header.view == details.child; | 128 return header.view == details.child; |
| 109 }), | 129 }), |
| 110 headers_.end()); | 130 headers_.end()); |
| 111 } else if (details.is_add && details.parent == this && | 131 } else if (details.is_add && details.parent == this && |
| 112 details.child == child_at(0)) { | 132 details.child == child_at(0)) { |
| (...skipping 114 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 227 SkPaint paint; | 247 SkPaint paint; |
| 228 gfx::ShadowValues shadow; | 248 gfx::ShadowValues shadow; |
| 229 shadow.emplace_back(gfx::Vector2d(0, kShadowOffsetY), kShadowBlur, | 249 shadow.emplace_back(gfx::Vector2d(0, kShadowOffsetY), kShadowBlur, |
| 230 kSeparatorColor); | 250 kSeparatorColor); |
| 231 paint.setLooper(gfx::CreateShadowDrawLooperCorrectBlur(shadow)); | 251 paint.setLooper(gfx::CreateShadowDrawLooperCorrectBlur(shadow)); |
| 232 paint.setAntiAlias(true); | 252 paint.setAntiAlias(true); |
| 233 canvas->ClipRect(shadowed_area, kDifference_SkClipOp); | 253 canvas->ClipRect(shadowed_area, kDifference_SkClipOp); |
| 234 canvas->DrawRect(shadowed_area, paint); | 254 canvas->DrawRect(shadowed_area, paint); |
| 235 } | 255 } |
| 236 | 256 |
| 257 // Recursively iterates through children to return the child layer that is | |
| 258 // stacked at the top. Only considers layers that are direct |parent_layer|'s | |
| 259 // children. | |
| 260 ui::Layer* TopmostLayer(views::View* view, ui::Layer* parent_layer) { | |
| 261 DCHECK(parent_layer); | |
| 262 // Iterate backwards through the children to find the topmost layer. | |
| 263 for (int i = view->child_count() - 1; i >= 0; --i) { | |
| 264 views::View* child = view->child_at(i); | |
| 265 ui::Layer* layer = TopmostLayer(child, parent_layer); | |
| 266 if (layer) | |
| 267 return layer; | |
| 268 } | |
| 269 if (view->layer() && view->layer() != parent_layer && | |
| 270 view->layer()->parent() == parent_layer) { | |
| 271 return view->layer(); | |
| 272 } | |
| 273 return nullptr; | |
| 274 } | |
| 275 | |
| 237 views::BoxLayout* box_layout_; | 276 views::BoxLayout* box_layout_; |
| 238 | 277 |
| 239 // Header child views that stick to the top of visible viewport when scrolled. | 278 // Header child views that stick to the top of visible viewport when scrolled. |
| 240 std::vector<Header> headers_; | 279 std::vector<Header> headers_; |
| 241 | 280 |
| 242 DISALLOW_COPY_AND_ASSIGN(ScrollContentsView); | 281 DISALLOW_COPY_AND_ASSIGN(ScrollContentsView); |
| 243 }; | 282 }; |
| 244 | 283 |
| 245 // Constants for the title row in material design. | 284 // Constants for the title row in material design. |
| 246 const int kTitleRowVerticalPadding = 4; | 285 const int kTitleRowVerticalPadding = 4; |
| (...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 566 if (index < child_count() - 1 && child_at(index + 1) != title_row_) | 605 if (index < child_count() - 1 && child_at(index + 1) != title_row_) |
| 567 scroll_border_->set_visible(true); | 606 scroll_border_->set_visible(true); |
| 568 else | 607 else |
| 569 scroll_border_->set_visible(false); | 608 scroll_border_->set_visible(false); |
| 570 } | 609 } |
| 571 | 610 |
| 572 views::View::OnPaintBorder(canvas); | 611 views::View::OnPaintBorder(canvas); |
| 573 } | 612 } |
| 574 | 613 |
| 575 } // namespace ash | 614 } // namespace ash |
| OLD | NEW |