blob: 5d830c6bf4941b2fb8456adad3ed6957e5baafd3 [file] [log] [blame]
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/ui_devtools/viz/viz_element.h"
#include <algorithm>
#include "components/ui_devtools/ui_element_delegate.h"
#include "components/ui_devtools/viz/frame_sink_element.h"
#include "components/ui_devtools/viz/surface_element.h"
namespace ui_devtools {
namespace {
bool IsVizElement(const UIElement* element) {
return element->type() == UIElementType::FRAMESINK ||
element->type() == UIElementType::SURFACE;
}
bool CompareVizElements(const UIElement* a, const UIElement* b) {
if (a->type() == UIElementType::FRAMESINK) {
if (b->type() == UIElementType::SURFACE)
return true;
// From() checks that |b| is a FrameSinkElement.
return FrameSinkElement::From(a) < FrameSinkElement::From(b);
} else {
if (b->type() == UIElementType::FRAMESINK)
return false;
// From() checks that |a| and |b| are SurfaceElements.
return SurfaceElement::From(a) < SurfaceElement::From(b);
}
}
} // namespace
VizElement::VizElement(const UIElementType type,
UIElementDelegate* delegate,
UIElement* parent)
: UIElement(type, delegate, parent) {}
VizElement::~VizElement() {}
void VizElement::AddToParentSorted(UIElement* parent, bool notify_delegate) {
parent->AddOrderedChild(this, &CompareVizElements, notify_delegate);
}
void VizElement::Reparent(UIElement* new_parent) {
if (parent() == new_parent)
return;
// Become a child of |new_parent| without calling OnUIElementRemoved or
// OnUIElementAdded on |delegate_|. Instead, call OnUIElementReordered, which
// destroys and rebuilds the DOM node in the new location.
parent()->RemoveChild(this, false);
AddToParentSorted(new_parent, false);
delegate()->OnUIElementReordered(new_parent, this);
set_parent(new_parent);
}
VizElement* VizElement::AsVizElement(UIElement* element) {
DCHECK(IsVizElement(element));
return static_cast<VizElement*>(element);
}
} // namespace ui_devtools