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

Unified Diff: ash/common/wm/workspace/magnetism_matcher.cc

Issue 2734653002: chromeos: Move files in //ash/common to //ash (Closed)
Patch Set: fix a11y tests, fix docs Created 3 years, 10 months 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/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
« no previous file with comments | « ash/common/wm/workspace/magnetism_matcher.h ('k') | ash/common/wm/workspace/multi_window_resize_controller.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698