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

Unified Diff: ash/wm/workspace/workspace_window_resizer.cc

Issue 10008084: Add ctrl+drag feature for allowing resizing window with exact positioning. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix nits. Created 8 years, 8 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
« no previous file with comments | « ash/wm/workspace/workspace_window_resizer.h ('k') | ash/wm/workspace/workspace_window_resizer_unittest.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ash/wm/workspace/workspace_window_resizer.cc
diff --git a/ash/wm/workspace/workspace_window_resizer.cc b/ash/wm/workspace/workspace_window_resizer.cc
index 7e6eb1e59fd17920e183f79af0413aea24766b1b..89f24ab9f9115913afb27cd4dcdab4ebfcf7464d 100644
--- a/ash/wm/workspace/workspace_window_resizer.cc
+++ b/ash/wm/workspace/workspace_window_resizer.cc
@@ -53,31 +53,33 @@ WorkspaceWindowResizer* WorkspaceWindowResizer::Create(
aura::Window* window,
const gfx::Point& location,
int window_component,
- int grid_size,
const std::vector<aura::Window*>& attached_windows) {
- Details details(window, location, window_component, grid_size);
+ Details details(window, location, window_component);
return details.is_resizable ?
new WorkspaceWindowResizer(details, attached_windows) : NULL;
}
-void WorkspaceWindowResizer::Drag(const gfx::Point& location) {
- gfx::Rect bounds = CalculateBoundsForDrag(details_, location);
+void WorkspaceWindowResizer::Drag(const gfx::Point& location, int event_flags) {
+ int grid_size = event_flags & ui::EF_CONTROL_DOWN ?
+ 0 : ash::Shell::GetInstance()->GetGridSize();
+ gfx::Rect bounds = CalculateBoundsForDrag(details_, location, grid_size);
+
if (wm::IsWindowNormal(details_.window))
- AdjustBoundsForMainWindow(&bounds);
+ AdjustBoundsForMainWindow(&bounds, grid_size);
if (bounds != details_.window->bounds()) {
if (!did_move_or_resize_)
RestackWindows();
did_move_or_resize_ = true;
}
- UpdatePhantomWindow(location, bounds);
+ UpdatePhantomWindow(location, bounds, grid_size);
if (!attached_windows_.empty())
- LayoutAttachedWindows(bounds);
+ LayoutAttachedWindows(bounds, grid_size);
if (bounds != details_.window->bounds())
details_.window->SetBounds(bounds);
// WARNING: we may have been deleted.
}
-void WorkspaceWindowResizer::CompleteDrag() {
+void WorkspaceWindowResizer::CompleteDrag(int event_flags) {
phantom_window_controller_.reset();
if (!did_move_or_resize_ || details_.window_component != HTCAPTION)
return;
@@ -89,10 +91,12 @@ void WorkspaceWindowResizer::CompleteDrag() {
return;
}
- if (details_.grid_size <= 1)
+ int grid_size = event_flags & ui::EF_CONTROL_DOWN ?
+ 0 : ash::Shell::GetInstance()->GetGridSize();
+ if (grid_size <= 1)
return;
- gfx::Rect bounds(GetFinalBounds(details_.window->bounds()));
+ gfx::Rect bounds(GetFinalBounds(details_.window->bounds(), grid_size));
if (bounds == details_.window->bounds())
return;
@@ -163,6 +167,7 @@ WorkspaceWindowResizer::WorkspaceWindowResizer(
// Calculate sizes so that we can maintain the ratios if we need to resize.
int total_available = 0;
+ int grid_size = ash::Shell::GetInstance()->GetGridSize();
for (size_t i = 0; i < attached_windows_.size(); ++i) {
gfx::Size min(attached_windows_[i]->delegate()->GetMinimumSize());
int initial_size = PrimaryAxisSize(attached_windows_[i]->bounds().size());
@@ -172,8 +177,8 @@ WorkspaceWindowResizer::WorkspaceWindowResizer(
int min_size = std::min(initial_size,
std::max(PrimaryAxisSize(min), kMinOnscreenSize));
// Make sure the min size falls on the grid.
- if (details_.grid_size > 1 && min_size % details_.grid_size != 0)
- min_size = (min_size / details_.grid_size + 1) * details_.grid_size;
+ if (grid_size > 1 && min_size % grid_size != 0)
+ min_size = (min_size / grid_size + 1) * grid_size;
min_size_.push_back(min_size);
total_min_ += min_size;
total_initial_size_ += initial_size;
@@ -195,16 +200,18 @@ WorkspaceWindowResizer::WorkspaceWindowResizer(
}
gfx::Rect WorkspaceWindowResizer::GetFinalBounds(
- const gfx::Rect& bounds) const {
+ const gfx::Rect& bounds,
+ int grid_size) const {
if (phantom_window_controller_.get() &&
phantom_window_controller_->IsShowing()) {
return phantom_window_controller_->bounds();
}
- return AdjustBoundsToGrid(bounds, details_.grid_size);
+ return AdjustBoundsToGrid(bounds, grid_size);
}
void WorkspaceWindowResizer::LayoutAttachedWindows(
- const gfx::Rect& bounds) {
+ const gfx::Rect& bounds,
+ int grid_size) {
gfx::Rect work_area(gfx::Screen::GetMonitorWorkAreaNearestWindow(window()));
std::vector<int> sizes;
CalculateAttachedSizes(
@@ -212,6 +219,7 @@ void WorkspaceWindowResizer::LayoutAttachedWindows(
PrimaryAxisSize(bounds.size()),
PrimaryAxisCoordinate(bounds.right(), bounds.bottom()),
PrimaryAxisCoordinate(work_area.right(), work_area.bottom()),
+ grid_size,
&sizes);
DCHECK_EQ(attached_windows_.size(), sizes.size());
int last = PrimaryAxisCoordinate(bounds.right(), bounds.bottom());
@@ -234,6 +242,7 @@ void WorkspaceWindowResizer::CalculateAttachedSizes(
int current_size,
int start,
int end,
+ int grid_size,
std::vector<int>* sizes) const {
sizes->clear();
if (current_size < initial_size) {
@@ -243,7 +252,7 @@ void WorkspaceWindowResizer::CalculateAttachedSizes(
for (size_t i = 0; i < attached_windows_.size(); ++i) {
int next = AlignToGrid(
current + initial_size_[i] + expand_fraction_[i] * delta,
- details_.grid_size);
+ grid_size);
if (i == attached_windows_.size())
next = end;
sizes->push_back(next - current);
@@ -260,7 +269,7 @@ void WorkspaceWindowResizer::CalculateAttachedSizes(
for (size_t i = 0; i < attached_windows_.size(); ++i) {
int size = initial_size_[i] -
static_cast<int>(compress_fraction_[i] * delta);
- size = AlignToGrid(size, details_.grid_size);
+ size = AlignToGrid(size, grid_size);
if (i == attached_windows_.size())
size = end - current;
current += size;
@@ -270,11 +279,11 @@ void WorkspaceWindowResizer::CalculateAttachedSizes(
}
void WorkspaceWindowResizer::AdjustBoundsForMainWindow(
- gfx::Rect* bounds) const {
+ gfx::Rect* bounds, int grid_size) const {
// Always keep kMinOnscreenHeight on the bottom.
gfx::Rect work_area(gfx::Screen::GetMonitorWorkAreaNearestWindow(window()));
int max_y = AlignToGridRoundUp(work_area.bottom() - kMinOnscreenHeight,
- details_.grid_size);
+ grid_size);
if (bounds->y() > max_y)
bounds->set_y(max_y);
@@ -282,8 +291,8 @@ void WorkspaceWindowResizer::AdjustBoundsForMainWindow(
if (bounds->y() <= work_area.y())
bounds->set_y(work_area.y());
- if (details_.grid_size >= 0 && details_.window_component == HTCAPTION)
- SnapToWorkAreaEdges(work_area, bounds);
+ if (grid_size >= 0 && details_.window_component == HTCAPTION)
+ SnapToWorkAreaEdges(work_area, bounds, grid_size);
if (attached_windows_.empty())
return;
@@ -300,22 +309,22 @@ void WorkspaceWindowResizer::AdjustBoundsForMainWindow(
void WorkspaceWindowResizer::SnapToWorkAreaEdges(
const gfx::Rect& work_area,
- gfx::Rect* bounds) const {
- int left_edge = AlignToGridRoundUp(work_area.x(), details_.grid_size);
- int right_edge = AlignToGridRoundDown(work_area.right(), details_.grid_size);
- int top_edge = AlignToGridRoundUp(work_area.y(), details_.grid_size);
+ gfx::Rect* bounds,
+ int grid_size) const {
+ int left_edge = AlignToGridRoundUp(work_area.x(), grid_size);
+ int right_edge = AlignToGridRoundDown(work_area.right(), grid_size);
+ int top_edge = AlignToGridRoundUp(work_area.y(), grid_size);
int bottom_edge = AlignToGridRoundDown(work_area.bottom(),
- details_.grid_size);
- if (ShouldSnapToEdge(bounds->x() - left_edge, details_.grid_size)) {
+ grid_size);
+ if (ShouldSnapToEdge(bounds->x() - left_edge, grid_size)) {
bounds->set_x(left_edge);
} else if (ShouldSnapToEdge(right_edge - bounds->right(),
- details_.grid_size)) {
+ grid_size)) {
bounds->set_x(right_edge - bounds->width());
}
- if (ShouldSnapToEdge(bounds->y() - top_edge, details_.grid_size)) {
+ if (ShouldSnapToEdge(bounds->y() - top_edge, grid_size)) {
bounds->set_y(top_edge);
- } else if (ShouldSnapToEdge(bottom_edge - bounds->bottom(),
- details_.grid_size) &&
+ } else if (ShouldSnapToEdge(bottom_edge - bounds->bottom(), grid_size) &&
bounds->height() < (bottom_edge - top_edge)) {
// Only snap to the bottom if the window is smaller than the work area.
// Doing otherwise can lead to window snapping in weird ways as it bounces
@@ -350,7 +359,8 @@ int WorkspaceWindowResizer::PrimaryAxisCoordinate(int x, int y) const {
}
void WorkspaceWindowResizer::UpdatePhantomWindow(const gfx::Point& location,
- const gfx::Rect& bounds) {
+ const gfx::Rect& bounds,
+ int grid_size) {
if (!did_move_or_resize_ || details_.window_component != HTCAPTION)
return;
@@ -366,7 +376,7 @@ void WorkspaceWindowResizer::UpdatePhantomWindow(const gfx::Point& location,
SnapSizer::Edge edge = (snap_type_ == SNAP_LEFT_EDGE) ?
SnapSizer::LEFT_EDGE : SnapSizer::RIGHT_EDGE;
snap_sizer_.reset(
- new SnapSizer(details_.window, location, edge, details_.grid_size));
+ new SnapSizer(details_.window, location, edge, grid_size));
} else {
snap_sizer_->Update(location);
}
« no previous file with comments | « ash/wm/workspace/workspace_window_resizer.h ('k') | ash/wm/workspace/workspace_window_resizer_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698