Index: ash/common/wm/workspace/magnetism_matcher.cc |
diff --git a/ash/common/wm/workspace/magnetism_matcher.cc b/ash/common/wm/workspace/magnetism_matcher.cc |
deleted file mode 100644 |
index e428d968678f67317a7e8931eb0563a0301bed2c..0000000000000000000000000000000000000000 |
--- a/ash/common/wm/workspace/magnetism_matcher.cc |
+++ /dev/null |
@@ -1,195 +0,0 @@ |
-// Copyright (c) 2012 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 "ash/common/wm/workspace/magnetism_matcher.h" |
- |
-#include <algorithm> |
-#include <cmath> |
- |
-#include "base/memory/ptr_util.h" |
- |
-namespace ash { |
-namespace { |
- |
-// Returns true if |a| is close enough to |b| that the two edges snap. |
-bool IsCloseEnough(int a, int b) { |
- return abs(a - b) <= MagnetismMatcher::kMagneticDistance; |
-} |
- |
-// Returns true if the specified SecondaryMagnetismEdge can be matched with a |
-// primary edge of |primary|. |edges| is a bitmask of the allowed |
-// MagnetismEdges. |
-bool CanMatchSecondaryEdge(MagnetismEdge primary, |
- SecondaryMagnetismEdge secondary, |
- uint32_t edges) { |
- // Convert |secondary| to a MagnetismEdge so we can compare it to |edges|. |
- MagnetismEdge secondary_as_magnetism_edge = MAGNETISM_EDGE_TOP; |
- switch (primary) { |
- case MAGNETISM_EDGE_TOP: |
- case MAGNETISM_EDGE_BOTTOM: |
- if (secondary == SECONDARY_MAGNETISM_EDGE_LEADING) |
- secondary_as_magnetism_edge = MAGNETISM_EDGE_LEFT; |
- else if (secondary == SECONDARY_MAGNETISM_EDGE_TRAILING) |
- secondary_as_magnetism_edge = MAGNETISM_EDGE_RIGHT; |
- else |
- NOTREACHED(); |
- break; |
- case MAGNETISM_EDGE_LEFT: |
- case MAGNETISM_EDGE_RIGHT: |
- if (secondary == SECONDARY_MAGNETISM_EDGE_LEADING) |
- secondary_as_magnetism_edge = MAGNETISM_EDGE_TOP; |
- else if (secondary == SECONDARY_MAGNETISM_EDGE_TRAILING) |
- secondary_as_magnetism_edge = MAGNETISM_EDGE_BOTTOM; |
- else |
- NOTREACHED(); |
- break; |
- } |
- return (edges & secondary_as_magnetism_edge) != 0; |
-} |
- |
-} // namespace |
- |
-// MagnetismEdgeMatcher -------------------------------------------------------- |
- |
-MagnetismEdgeMatcher::MagnetismEdgeMatcher(const gfx::Rect& bounds, |
- MagnetismEdge edge) |
- : bounds_(bounds), edge_(edge) { |
- ranges_.push_back(GetSecondaryRange(bounds_)); |
-} |
- |
-MagnetismEdgeMatcher::~MagnetismEdgeMatcher() {} |
- |
-bool MagnetismEdgeMatcher::ShouldAttach(const gfx::Rect& bounds) { |
- if (is_edge_obscured()) |
- return false; |
- |
- if (IsCloseEnough(GetPrimaryCoordinate(bounds_, edge_), |
- GetPrimaryCoordinate(bounds, FlipEdge(edge_)))) { |
- const Range range(GetSecondaryRange(bounds)); |
- Ranges::const_iterator i = |
- std::lower_bound(ranges_.begin(), ranges_.end(), range); |
- // Close enough, but only attach if some portion of the edge is visible. |
- if ((i != ranges_.begin() && RangesIntersect(*(i - 1), range)) || |
- (i != ranges_.end() && RangesIntersect(*i, range))) { |
- return true; |
- } |
- } |
- // NOTE: this checks against the current bounds, we may want to allow some |
- // flexibility here. |
- const Range primary_range(GetPrimaryRange(bounds)); |
- if (primary_range.first <= GetPrimaryCoordinate(bounds_, edge_) && |
- primary_range.second >= GetPrimaryCoordinate(bounds_, edge_)) { |
- UpdateRanges(GetSecondaryRange(bounds)); |
- } |
- return false; |
-} |
- |
-void MagnetismEdgeMatcher::UpdateRanges(const Range& range) { |
- Ranges::const_iterator it = |
- std::lower_bound(ranges_.begin(), ranges_.end(), range); |
- if (it != ranges_.begin() && RangesIntersect(*(it - 1), range)) |
- --it; |
- if (it == ranges_.end()) |
- return; |
- |
- for (size_t i = it - ranges_.begin(); |
- i < ranges_.size() && RangesIntersect(ranges_[i], range);) { |
- if (range.first <= ranges_[i].first && range.second >= ranges_[i].second) { |
- ranges_.erase(ranges_.begin() + i); |
- } else if (range.first < ranges_[i].first) { |
- DCHECK_GT(range.second, ranges_[i].first); |
- ranges_[i] = Range(range.second, ranges_[i].second); |
- ++i; |
- } else { |
- Range existing(ranges_[i]); |
- ranges_[i].second = range.first; |
- ++i; |
- if (existing.second > range.second) { |
- ranges_.insert(ranges_.begin() + i, |
- Range(range.second, existing.second)); |
- ++i; |
- } |
- } |
- } |
-} |
- |
-// MagnetismMatcher ------------------------------------------------------------ |
- |
-// static |
-const int MagnetismMatcher::kMagneticDistance = 8; |
- |
-MagnetismMatcher::MagnetismMatcher(const gfx::Rect& bounds, uint32_t edges) |
- : edges_(edges) { |
- if (edges & MAGNETISM_EDGE_TOP) { |
- matchers_.push_back( |
- base::MakeUnique<MagnetismEdgeMatcher>(bounds, MAGNETISM_EDGE_TOP)); |
- } |
- if (edges & MAGNETISM_EDGE_LEFT) { |
- matchers_.push_back( |
- base::MakeUnique<MagnetismEdgeMatcher>(bounds, MAGNETISM_EDGE_LEFT)); |
- } |
- if (edges & MAGNETISM_EDGE_BOTTOM) { |
- matchers_.push_back( |
- base::MakeUnique<MagnetismEdgeMatcher>(bounds, MAGNETISM_EDGE_BOTTOM)); |
- } |
- if (edges & MAGNETISM_EDGE_RIGHT) { |
- matchers_.push_back( |
- base::MakeUnique<MagnetismEdgeMatcher>(bounds, MAGNETISM_EDGE_RIGHT)); |
- } |
-} |
- |
-MagnetismMatcher::~MagnetismMatcher() {} |
- |
-bool MagnetismMatcher::ShouldAttach(const gfx::Rect& bounds, |
- MatchedEdge* edge) { |
- for (const auto& matcher : matchers_) { |
- if (matcher->ShouldAttach(bounds)) { |
- edge->primary_edge = matcher->edge(); |
- AttachToSecondaryEdge(bounds, edge->primary_edge, |
- &(edge->secondary_edge)); |
- return true; |
- } |
- } |
- return false; |
-} |
- |
-bool MagnetismMatcher::AreEdgesObscured() const { |
- for (const auto& matcher : matchers_) { |
- if (!matcher->is_edge_obscured()) |
- return false; |
- } |
- return true; |
-} |
- |
-void MagnetismMatcher::AttachToSecondaryEdge( |
- const gfx::Rect& bounds, |
- MagnetismEdge edge, |
- SecondaryMagnetismEdge* secondary_edge) const { |
- const gfx::Rect& src_bounds(matchers_[0]->bounds()); |
- if (edge == MAGNETISM_EDGE_LEFT || edge == MAGNETISM_EDGE_RIGHT) { |
- if (CanMatchSecondaryEdge(edge, SECONDARY_MAGNETISM_EDGE_LEADING, edges_) && |
- IsCloseEnough(bounds.y(), src_bounds.y())) { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_LEADING; |
- } else if (CanMatchSecondaryEdge(edge, SECONDARY_MAGNETISM_EDGE_TRAILING, |
- edges_) && |
- IsCloseEnough(bounds.bottom(), src_bounds.bottom())) { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_TRAILING; |
- } else { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_NONE; |
- } |
- } else { |
- if (CanMatchSecondaryEdge(edge, SECONDARY_MAGNETISM_EDGE_LEADING, edges_) && |
- IsCloseEnough(bounds.x(), src_bounds.x())) { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_LEADING; |
- } else if (CanMatchSecondaryEdge(edge, SECONDARY_MAGNETISM_EDGE_TRAILING, |
- edges_) && |
- IsCloseEnough(bounds.right(), src_bounds.right())) { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_TRAILING; |
- } else { |
- *secondary_edge = SECONDARY_MAGNETISM_EDGE_NONE; |
- } |
- } |
-} |
- |
-} // namespace ash |