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

Unified Diff: ash/common/system/tray/tray_details_view.cc

Issue 2561253002: [ash-md] Adds support for Z-order iteration in views::View (Closed)
Patch Set: [ash-md] Adds support for Z-order iteration in views::View (using GetChildrenOrderedByVisualOrder) Created 4 years 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
Index: ash/common/system/tray/tray_details_view.cc
diff --git a/ash/common/system/tray/tray_details_view.cc b/ash/common/system/tray/tray_details_view.cc
index d48c0e3608800ba71fd7bb2ba4261fda9c035589..3f630db917093eb69246a2f7f850c7895ee53713 100644
--- a/ash/common/system/tray/tray_details_view.cc
+++ b/ash/common/system/tray/tray_details_view.cc
@@ -69,17 +69,11 @@ class ScrollContentsView : public views::View,
}
void PaintChildren(const ui::PaintContext& context) override {
- for (int i = 0; i < child_count(); ++i) {
- if (child_at(i)->id() != VIEW_ID_STICKY_HEADER && !child_at(i)->layer())
- child_at(i)->Paint(context);
- }
+ views::View::PaintChildren(context);
bool did_draw_shadow = false;
- // Paint header rows above other children in Z-order.
- for (auto& header : headers_) {
- if (!header.view->layer())
- header.view->Paint(context);
+ // Paint header row separators.
+ for (auto& header : headers_)
did_draw_shadow = PaintDelineation(header, context) || did_draw_shadow;
- }
// Draw a shadow at the top of the viewport when scrolled, but only if a
// header didn't already draw one. Overlap the shadow with the separator
@@ -100,6 +94,26 @@ class ScrollContentsView : public views::View,
PositionHeaderRows();
}
+ View::Views GetChildrenOrderedByVisualOrder() override {
+ // TODO(varkha): Not sure if this is worth it but the array could be a class
+ // member |children_in_visual_order_| and only updated in an override of
+ // ReorderChildLayers() before calling base View::ReorderChildLayers(). Then
+ // this method could simply return |children_in_visual_order_|.
+ View::Views children;
+ // Iterate over regular children and later over the sticky headers to keep
+ // the sticky headers above in Z-order.
+ for (int i = 0; i < child_count(); ++i) {
+ if (child_at(i)->id() != VIEW_ID_STICKY_HEADER)
+ children.push_back(child_at(i));
+ }
+ for (int i = 0; i < child_count(); ++i) {
+ if (child_at(i)->id() == VIEW_ID_STICKY_HEADER)
+ children.push_back(child_at(i));
+ }
+ DCHECK_EQ(child_count(), static_cast<int>(children.size()));
+ return children;
+ }
+
void ViewHierarchyChanged(
const ViewHierarchyChangedDetails& details) override {
if (!details.is_add && details.parent == this) {
@@ -123,19 +137,6 @@ class ScrollContentsView : public views::View,
}
}
- // views::ViewTargeterDelegate:
- View* TargetForRect(View* root, const gfx::Rect& rect) override {
- // Give header rows first dibs on events.
- for (auto& header : headers_) {
- views::View* view = header.view;
- gfx::Rect local_to_header = rect;
- local_to_header.Offset(-view->x(), -view->y());
- if (ViewTargeterDelegate::DoesIntersectRect(view, local_to_header))
- return ViewTargeterDelegate::TargetForRect(view, local_to_header);
- }
- return ViewTargeterDelegate::TargetForRect(root, rect);
- }
-
private:
const SkColor kSeparatorColor = SkColorSetA(SK_ColorBLACK, 0x1F);
const int kShadowOffsetY = 2;
@@ -169,24 +170,31 @@ class ScrollContentsView : public views::View,
Header* previous_header = nullptr;
for (auto& header : base::Reversed(headers_)) {
views::View* header_view = header.view;
- header.draw_separator_below = false;
+ bool draw_separator_below = false;
if (header.natural_offset >= scroll_offset) {
previous_header = &header;
header_view->SetY(header.natural_offset);
- continue;
- }
- if (previous_header &&
- previous_header->view->y() <= scroll_offset + header_view->height()) {
- // Lower header displacing the header above.
- header.draw_separator_below = true;
- header_view->SetY(previous_header->view->y() - header_view->height());
} else {
- // A header becomes sticky.
- header_view->SetY(scroll_offset);
- header_view->Layout();
- header_view->SchedulePaint();
+ if (previous_header &&
+ previous_header->view->y() <=
+ scroll_offset + header_view->height()) {
+ // Lower header displacing the header above.
+ draw_separator_below = true;
+ header_view->SetY(previous_header->view->y() - header_view->height());
+ } else {
+ // A header becomes sticky.
+ header_view->SetY(scroll_offset);
+ header_view->Layout();
+ header_view->SchedulePaint();
+ }
}
- break;
+ if (header.draw_separator_below != draw_separator_below) {
+ header.draw_separator_below = draw_separator_below;
+ TrayPopupUtils::ShowStickyHeaderSeparator(header_view,
+ draw_separator_below);
+ }
+ if (header.natural_offset < scroll_offset)
+ break;
}
}
@@ -197,21 +205,10 @@ class ScrollContentsView : public views::View,
bool PaintDelineation(const Header& header, const ui::PaintContext& context) {
const View* view = header.view;
- // If the header is where it normally belongs, draw nothing.
- if (view->y() == header.natural_offset)
- return false;
-
- // If the header is pushed by a header directly below it, draw a separator.
- if (header.draw_separator_below) {
- // TODO(estade): look better at 1.5x scale.
- ui::PaintRecorder recorder(context, size());
- gfx::Canvas* canvas = recorder.canvas();
- gfx::Rect separator = view->bounds();
- separator.set_y(separator.bottom() - kSeparatorWidth);
- separator.set_height(kSeparatorWidth);
- canvas->FillRect(separator, kSeparatorColor);
+ // If the header is where it normally belongs or If the header is pushed by
+ // a header directly below it, draw nothing.
+ if (view->y() == header.natural_offset || header.draw_separator_below)
return false;
- }
// Otherwise, draw a shadow below.
DrawShadow(context,

Powered by Google App Engine
This is Rietveld 408576698