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

Unified Diff: views/view.cc

Issue 8620008: Get rid of Widget::ConvertPointFromAncestor. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 1 month 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 | « views/view.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: views/view.cc
===================================================================
--- views/view.cc (revision 111096)
+++ views/view.cc (working copy)
@@ -75,6 +75,14 @@
DISALLOW_COPY_AND_ASSIGN(ScopedCanvas);
};
+// Returns the top view in |view|'s hierarchy.
+const views::View* GetHierarchyRoot(const views::View* view) {
+ const views::View* root = view;
+ while (root && root->parent())
+ root = root->parent();
+ return root;
+}
+
} // namespace
namespace views {
@@ -581,10 +589,29 @@
// Coordinate conversion -------------------------------------------------------
// static
-void View::ConvertPointToView(const View* src,
- const View* dst,
+void View::ConvertPointToView(const View* source,
+ const View* target,
gfx::Point* point) {
- ConvertPointToView(src, dst, point, true);
+ if (source == target)
+ return;
+
+ // |source| can be NULL.
+ const View* root = GetHierarchyRoot(target);
+ if (source) {
+ CHECK_EQ(GetHierarchyRoot(source), root);
+
+ if (source != root)
+ source->ConvertPointForAncestor(root, point);
+ }
+
+ if (target != root)
+ target->ConvertPointFromAncestor(root, point);
+
+ // API defines NULL |source| as returning the point in screen coordinates.
+ if (!source) {
+ *point = point->Subtract(
+ root->GetWidget()->GetClientAreaScreenBounds().origin());
+ }
}
// static
@@ -1705,50 +1732,6 @@
// Coordinate conversion -------------------------------------------------------
-// static
-void View::ConvertPointToView(const View* src,
- const View* dst,
- gfx::Point* point,
- bool try_other_direction) {
- // src can be NULL
- DCHECK(dst);
- DCHECK(point);
-
- const Widget* src_widget = src ? src->GetWidget() : NULL ;
- const Widget* dst_widget = dst->GetWidget();
- // If dest and src aren't in the same widget, try to convert the
- // point to the destination widget's coordinates first.
- // TODO(oshima|sadrul): Cleanup and consolidate conversion methods.
- if (Widget::IsPureViews() && src_widget && src_widget != dst_widget) {
- // convert to src_widget first.
- gfx::Point p = *point;
- src->ConvertPointForAncestor(src_widget->GetRootView(), &p);
- if (dst_widget->ConvertPointFromAncestor(src_widget, &p)) {
- // Convertion to destination widget's coordinates was successful.
- // Use destination's root as a source to convert the point further.
- src = dst_widget->GetRootView();
- *point = p;
- }
- }
-
- if (src == NULL || src->Contains(dst)) {
- dst->ConvertPointFromAncestor(src, point);
- if (!src) {
- if (dst_widget) {
- gfx::Rect b = dst_widget->GetClientAreaScreenBounds();
- point->SetPoint(point->x() - b.x(), point->y() - b.y());
- }
- }
- } else if (src && try_other_direction) {
- if (!src->ConvertPointForAncestor(dst, point)) {
- // |src| is not an ancestor of |dst|, and |dst| is not an ancestor of
- // |src| either. At this stage, |point| is in the widget's coordinate
- // system. So convert from the widget's to |dst|'s coordinate system now.
- ConvertPointFromWidget(dst, point);
- }
- }
-}
-
bool View::ConvertPointForAncestor(const View* ancestor,
gfx::Point* point) const {
ui::Transform trans;
« no previous file with comments | « views/view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698