Index: components/mus/example/wm/move_loop.cc |
diff --git a/components/mus/example/wm/move_loop.cc b/components/mus/example/wm/move_loop.cc |
index 227b786f05cae279a1450f85fc4072c1d89543f4..96a7b347dd59986e7d2b589e34cbbcc377e15e09 100644 |
--- a/components/mus/example/wm/move_loop.cc |
+++ b/components/mus/example/wm/move_loop.cc |
@@ -54,7 +54,12 @@ scoped_ptr<MoveLoop> MoveLoop::Create(mus::Window* target, |
return nullptr; |
} |
- return make_scoped_ptr(new MoveLoop(target, event)); |
+ Type type; |
+ HorizontalLocation h_loc; |
+ VerticalLocation v_loc; |
+ DetermineType(target, location, &type, &h_loc, &v_loc); |
+ |
+ return make_scoped_ptr(new MoveLoop(target, event, type, h_loc, v_loc)); |
} |
MoveLoop::MoveResult MoveLoop::Move(const mus::mojom::Event& event) { |
@@ -88,8 +93,15 @@ MoveLoop::MoveResult MoveLoop::Move(const mus::mojom::Event& event) { |
return MoveResult::CONTINUE; |
} |
-MoveLoop::MoveLoop(mus::Window* target, const mus::mojom::Event& event) |
+MoveLoop::MoveLoop(mus::Window* target, |
+ const mus::mojom::Event& event, |
+ Type type, |
+ HorizontalLocation h_loc, |
+ VerticalLocation v_loc) |
: target_(target), |
+ type_(type), |
+ h_loc_(h_loc), |
+ v_loc_(v_loc), |
pointer_id_(event.pointer_data->pointer_id), |
initial_event_screen_location_(EventScreenLocationToPoint(event)), |
initial_window_bounds_(target->bounds()), |
@@ -97,11 +109,46 @@ MoveLoop::MoveLoop(mus::Window* target, const mus::mojom::Event& event) |
target->AddObserver(this); |
} |
+// static |
+void MoveLoop::DetermineType(mus::Window* target, |
+ const gfx::Point& location, |
+ Type* type, |
+ HorizontalLocation* h_loc, |
+ VerticalLocation* v_loc) { |
+ *h_loc = HorizontalLocation::OTHER; |
+ *v_loc = VerticalLocation::OTHER; |
+ const int resize_size = static_cast<int>( |
+ kResizeSize * |
+ std::max(1.f, target->viewport_metrics().device_pixel_ratio)); |
+ |
+ if (location.x() < target->client_area().x()) |
+ *h_loc = HorizontalLocation::LEFT; |
+ else if (location.x() >= target->client_area().right()) |
+ *h_loc = HorizontalLocation::RIGHT; |
+ else |
+ *h_loc = HorizontalLocation::OTHER; |
+ |
+ if (location.y() < resize_size) |
+ *v_loc = VerticalLocation::TOP; |
+ else if (location.y() >= target->client_area().bottom()) |
+ *v_loc = VerticalLocation::BOTTOM; |
+ else |
+ *v_loc = VerticalLocation::OTHER; |
+ |
+ if (*v_loc == VerticalLocation::OTHER && location.y() >= resize_size && |
+ *h_loc == HorizontalLocation::OTHER) { |
+ *type = Type::MOVE; |
+ return; |
+ } |
+ *type = Type::RESIZE; |
+ DCHECK(*h_loc != HorizontalLocation::OTHER || |
+ *v_loc != VerticalLocation::OTHER); |
+} |
+ |
void MoveLoop::MoveImpl(const mus::mojom::Event& event) { |
const gfx::Vector2d delta = |
EventScreenLocationToPoint(event) - initial_event_screen_location_; |
- const gfx::Rect new_bounds(initial_window_bounds_.origin() + delta, |
- initial_window_bounds_.size()); |
+ const gfx::Rect new_bounds(DetermineBoundsFromDelta(delta)); |
base::AutoReset<bool> resetter(&changing_bounds_, true); |
target_->SetBounds(new_bounds); |
} |
@@ -116,6 +163,36 @@ void MoveLoop::Revert() { |
target_->SetBounds(initial_window_bounds_); |
} |
+gfx::Rect MoveLoop::DetermineBoundsFromDelta(const gfx::Vector2d& delta) { |
+ if (type_ == Type::MOVE) { |
+ return gfx::Rect(initial_window_bounds_.origin() + delta, |
+ initial_window_bounds_.size()); |
+ } |
+ |
+ // TODO(sky): support better min sizes, make sure doesn't get bigger than |
+ // screen and max. Also make sure keep some portion on screen. |
+ gfx::Rect bounds(initial_window_bounds_); |
+ if (h_loc_ == HorizontalLocation::LEFT) { |
+ const int x = std::min(bounds.right() - 1, bounds.x() + delta.x()); |
+ const int width = bounds.right() - x; |
+ bounds.set_x(x); |
+ bounds.set_width(width); |
+ } else if (h_loc_ == HorizontalLocation::RIGHT) { |
+ bounds.set_width(std::max(1, bounds.width() + delta.x())); |
+ } |
+ |
+ if (v_loc_ == VerticalLocation::TOP) { |
+ const int y = std::min(bounds.bottom() - 1, bounds.y() + delta.y()); |
+ const int height = bounds.bottom() - y; |
+ bounds.set_y(y); |
+ bounds.set_height(height); |
+ } else if (v_loc_ == VerticalLocation::BOTTOM) { |
+ bounds.set_height(std::max(1, bounds.height() + delta.y())); |
+ } |
+ |
+ return bounds; |
+} |
+ |
void MoveLoop::OnTreeChanged(const TreeChangeParams& params) { |
if (params.target == target_) |
Cancel(); |