summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-04 22:16:10 +0000
committersadrul@chromium.org <sadrul@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-04 22:16:10 +0000
commit4982ee1e81b6dc26a6f675b2104d9e083b2fe9fb (patch)
tree54376f826a5ed5b488c78d84f3202dc2ebe52598
parentb71f1f6946e77a95fab70d6bb0941c0c5544bc32 (diff)
downloadchromium_src-4982ee1e81b6dc26a6f675b2104d9e083b2fe9fb.zip
chromium_src-4982ee1e81b6dc26a6f675b2104d9e083b2fe9fb.tar.gz
chromium_src-4982ee1e81b6dc26a6f675b2104d9e083b2fe9fb.tar.bz2
ash: Allow the shelf to be dragged in from the bottom edge of the screen.
BUG=145406 Review URL: https://chromiumcodereview.appspot.com/10911075 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@154823 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--ash/wm/gestures/bezel_gesture_handler.cc25
-rw-r--r--ash/wm/gestures/bezel_gesture_handler.h4
-rw-r--r--ash/wm/gestures/shelf_gesture_handler.cc2
-rw-r--r--ash/wm/shelf_layout_manager.cc68
-rw-r--r--ash/wm/shelf_layout_manager.h7
5 files changed, 73 insertions, 33 deletions
diff --git a/ash/wm/gestures/bezel_gesture_handler.cc b/ash/wm/gestures/bezel_gesture_handler.cc
index 3534e77..cf783df 100644
--- a/ash/wm/gestures/bezel_gesture_handler.cc
+++ b/ash/wm/gestures/bezel_gesture_handler.cc
@@ -72,6 +72,11 @@ void BezelGestureHandler::ProcessGestureEvent(aura::Window* target,
switch (event.type()) {
case ui::ET_GESTURE_SCROLL_BEGIN:
HandleBezelGestureStart(target, event);
+
+ // TODO(sad|skuhne): Fix the bezel gestures for when the shelf is on the
+ // left/right of the screen.
+ if (start_location_ == BEZEL_START_BOTTOM)
+ shelf_handler_.ProcessGestureEvent(event);
break;
case ui::ET_GESTURE_SCROLL_UPDATE:
// Check if a valid start position has been set.
@@ -82,6 +87,9 @@ void BezelGestureHandler::ProcessGestureEvent(aura::Window* target,
HandleBezelGestureUpdate(target, event);
break;
case ui::ET_GESTURE_SCROLL_END:
+ case ui::ET_SCROLL_FLING_START:
+ if (start_location_ == BEZEL_START_BOTTOM)
+ shelf_handler_.ProcessGestureEvent(event);
HandleBezelGestureEnd();
break;
default:
@@ -120,18 +128,11 @@ bool BezelGestureHandler::HandleDeviceControl(
return false;
}
-bool BezelGestureHandler::HandleLauncherControl(
- const ui::GestureEvent& event) {
- if (start_location_ == BEZEL_START_BOTTOM &&
- event.details().scroll_y() < 0) {
- ash::AcceleratorController* accelerator =
- ash::Shell::GetInstance()->accelerator_controller();
- accelerator->PerformAction(FOCUS_LAUNCHER, ui::Accelerator());
- } else {
- return false;
- }
- // No further notifications for this gesture.
- return true;
+bool BezelGestureHandler::HandleLauncherControl(const ui::GestureEvent& event) {
+ CHECK_EQ(BEZEL_START_BOTTOM, start_location_);
+ shelf_handler_.ProcessGestureEvent(event);
+ return event.type() == ui::ET_GESTURE_SCROLL_END ||
+ event.type() == ui::ET_SCROLL_FLING_START;
}
bool BezelGestureHandler::HandleApplicationControl(
diff --git a/ash/wm/gestures/bezel_gesture_handler.h b/ash/wm/gestures/bezel_gesture_handler.h
index 3fd57e0..db8163e 100644
--- a/ash/wm/gestures/bezel_gesture_handler.h
+++ b/ash/wm/gestures/bezel_gesture_handler.h
@@ -7,6 +7,8 @@
#include "base/basictypes.h"
+#include "ash/wm/gestures/shelf_gesture_handler.h"
+
namespace aura {
class Window;
}
@@ -114,6 +116,8 @@ class BezelGestureHandler {
// True if device control bezel operations (brightness, volume) are enabled.
bool enable_bezel_device_control_;
+ ShelfGestureHandler shelf_handler_;
+
DISALLOW_COPY_AND_ASSIGN(BezelGestureHandler);
};
diff --git a/ash/wm/gestures/shelf_gesture_handler.cc b/ash/wm/gestures/shelf_gesture_handler.cc
index 545a4c3..866ddcb 100644
--- a/ash/wm/gestures/shelf_gesture_handler.cc
+++ b/ash/wm/gestures/shelf_gesture_handler.cc
@@ -52,7 +52,7 @@ bool ShelfGestureHandler::ProcessGestureEvent(const ui::GestureEvent& event) {
if (event.type() == ui::ET_GESTURE_SCROLL_END ||
event.type() == ui::ET_SCROLL_FLING_START) {
- shelf->HideFromGestureDrag(event);
+ shelf->CompleteGestureDrag(event);
return true;
}
diff --git a/ash/wm/shelf_layout_manager.cc b/ash/wm/shelf_layout_manager.cc
index 5bad6bb..7f63c1d 100644
--- a/ash/wm/shelf_layout_manager.cc
+++ b/ash/wm/shelf_layout_manager.cc
@@ -131,7 +131,8 @@ ShelfLayoutManager::ShelfLayoutManager(views::Widget* status)
workspace_controller_(NULL),
window_overlaps_shelf_(false),
gesture_drag_status_(GESTURE_DRAG_NONE),
- gesture_drag_amount_(0.f) {
+ gesture_drag_amount_(0.f),
+ gesture_drag_auto_hide_state_(AUTO_HIDE_SHOWN) {
Shell::GetInstance()->AddShellObserver(this);
aura::client::GetActivationClient(root_window_)->AddObserver(this);
}
@@ -231,7 +232,7 @@ void ShelfLayoutManager::UpdateVisibilityState() {
ShellDelegate* delegate = Shell::GetInstance()->delegate();
if (delegate && delegate->IsScreenLocked()) {
SetState(VISIBLE);
- } else if (gesture_drag_status_ == GESTURE_DRAG_HIDE_IN_PROGRESS) {
+ } else if (gesture_drag_status_ == GESTURE_DRAG_COMPLETE_IN_PROGRESS) {
SetState(AUTO_HIDE);
} else {
WorkspaceWindowState window_state(workspace_controller_->GetWindowState());
@@ -297,6 +298,8 @@ void ShelfLayoutManager::RemoveObserver(Observer* observer) {
void ShelfLayoutManager::StartGestureDrag(const ui::GestureEvent& gesture) {
gesture_drag_status_ = GESTURE_DRAG_IN_PROGRESS;
gesture_drag_amount_ = 0.f;
+ gesture_drag_auto_hide_state_ = visibility_state() == AUTO_HIDE ?
+ auto_hide_state() : AUTO_HIDE_SHOWN;
UpdateShelfBackground(internal::BackgroundAnimator::CHANGE_ANIMATE);
}
@@ -307,37 +310,44 @@ void ShelfLayoutManager::UpdateGestureDrag(const ui::GestureEvent& gesture) {
LayoutShelf();
}
-void ShelfLayoutManager::HideFromGestureDrag(const ui::GestureEvent& gesture) {
+void ShelfLayoutManager::CompleteGestureDrag(const ui::GestureEvent& gesture) {
bool horizontal = alignment() == SHELF_ALIGNMENT_BOTTOM;
- bool should_hide = false;
+ bool should_change = false;
if (gesture.type() == ui::ET_GESTURE_SCROLL_END) {
// If the shelf was dragged X% towards the correct direction, then it is
- // hidden.
+ // hidden/shown.
const float kDragHideThreshold = 0.4f;
gfx::Rect bounds = GetIdealBounds();
+ float drag_amount = gesture_drag_auto_hide_state_ == AUTO_HIDE_SHOWN ?
+ gesture_drag_amount_ : -gesture_drag_amount_;
if (horizontal)
- should_hide = gesture_drag_amount_ > kDragHideThreshold * bounds.height();
+ should_change = drag_amount > kDragHideThreshold * bounds.height();
else if (alignment() == SHELF_ALIGNMENT_LEFT)
- should_hide = -gesture_drag_amount_ > kDragHideThreshold * bounds.width();
+ should_change = -drag_amount > kDragHideThreshold * bounds.width();
else
- should_hide = gesture_drag_amount_ > kDragHideThreshold * bounds.width();
+ should_change = drag_amount > kDragHideThreshold * bounds.width();
} else if (gesture.type() == ui::ET_SCROLL_FLING_START) {
if (horizontal)
- should_hide = gesture.details().velocity_y() > 0;
+ should_change = gesture.details().velocity_y() > 0;
else if (alignment() == SHELF_ALIGNMENT_LEFT)
- should_hide = gesture.details().velocity_x() < 0;
+ should_change = gesture.details().velocity_x() < 0;
else
- should_hide = gesture.details().velocity_x() > 0;
+ should_change = gesture.details().velocity_x() > 0;
+ if (gesture_drag_auto_hide_state_ == AUTO_HIDE_HIDDEN)
+ should_change = !should_change;
} else {
NOTREACHED();
}
- if (!should_hide) {
+ if (!should_change) {
CancelGestureDrag();
return;
}
- gesture_drag_status_ = GESTURE_DRAG_HIDE_IN_PROGRESS;
+ gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS;
+ gesture_drag_auto_hide_state_ =
+ gesture_drag_auto_hide_state_ == AUTO_HIDE_SHOWN ? AUTO_HIDE_HIDDEN :
+ AUTO_HIDE_SHOWN;
if (launcher_widget())
launcher_widget()->Deactivate();
status_->Deactivate();
@@ -349,13 +359,14 @@ void ShelfLayoutManager::HideFromGestureDrag(const ui::GestureEvent& gesture) {
}
void ShelfLayoutManager::CancelGestureDrag() {
- gesture_drag_status_ = GESTURE_DRAG_NONE;
+ gesture_drag_status_ = GESTURE_DRAG_COMPLETE_IN_PROGRESS;
ui::ScopedLayerAnimationSettings
launcher_settings(GetLayer(launcher_widget())->GetAnimator()),
status_settings(GetLayer(status_)->GetAnimator());
LayoutShelf();
UpdateVisibilityState();
UpdateShelfBackground(internal::BackgroundAnimator::CHANGE_ANIMATE);
+ gesture_drag_status_ = GESTURE_DRAG_NONE;
}
////////////////////////////////////////////////////////////////////////////////
@@ -598,8 +609,29 @@ void ShelfLayoutManager::UpdateTargetBoundsForGesture(
resist = gesture_drag_amount_ < 0;
const float kDragResistanceFactor = 0.25f;
- float translate = resist ? gesture_drag_amount_ * kDragResistanceFactor :
- gesture_drag_amount_;
+ float translate = 0.f;
+ if (gesture_drag_auto_hide_state_ == AUTO_HIDE_HIDDEN) {
+ // If the shelf was hidden when the drag started, then allow the drag some
+ // resistance-free region at first to make sure the shelf sticks with the
+ // finger until the shelf is visible.
+ int resistance_free_region = horizontal ?
+ target_bounds->launcher_bounds_in_root.height() :
+ target_bounds->launcher_bounds_in_root.width();
+ resist = resist && fabsf(gesture_drag_amount_) > resistance_free_region;
+ if (resist) {
+ float diff = fabsf(gesture_drag_amount_) - resistance_free_region;
+ if (gesture_drag_amount_ < 0)
+ translate = -resistance_free_region - diff * kDragResistanceFactor;
+ else
+ translate = resistance_free_region + diff * kDragResistanceFactor;
+ } else {
+ translate = gesture_drag_amount_;
+ }
+ } else {
+ translate = resist ? gesture_drag_amount_ * kDragResistanceFactor :
+ gesture_drag_amount_;
+ }
+
if (horizontal) {
target_bounds->launcher_bounds_in_root.Offset(0, translate);
target_bounds->status_bounds_in_root.Offset(0, translate);
@@ -637,8 +669,8 @@ ShelfLayoutManager::AutoHideState ShelfLayoutManager::CalculateAutoHideState(
if (visibility_state != AUTO_HIDE || !launcher_widget())
return AUTO_HIDE_HIDDEN;
- if (gesture_drag_status_ == GESTURE_DRAG_HIDE_IN_PROGRESS)
- return AUTO_HIDE_HIDDEN;
+ if (gesture_drag_status_ == GESTURE_DRAG_COMPLETE_IN_PROGRESS)
+ return gesture_drag_auto_hide_state_;
Shell* shell = Shell::GetInstance();
if (shell->GetAppListTargetVisibility())
diff --git a/ash/wm/shelf_layout_manager.h b/ash/wm/shelf_layout_manager.h
index 515c285..0bd7c75 100644
--- a/ash/wm/shelf_layout_manager.h
+++ b/ash/wm/shelf_layout_manager.h
@@ -151,7 +151,7 @@ class ASH_EXPORT ShelfLayoutManager :
// Gesture dragging related functions:
void StartGestureDrag(const ui::GestureEvent& gesture);
void UpdateGestureDrag(const ui::GestureEvent& gesture);
- void HideFromGestureDrag(const ui::GestureEvent& gesture);
+ void CompleteGestureDrag(const ui::GestureEvent& gesture);
void CancelGestureDrag();
// Overridden from aura::LayoutManager:
@@ -295,7 +295,7 @@ class ASH_EXPORT ShelfLayoutManager :
enum GestureDragStatus {
GESTURE_DRAG_NONE,
GESTURE_DRAG_IN_PROGRESS,
- GESTURE_DRAG_HIDE_IN_PROGRESS
+ GESTURE_DRAG_COMPLETE_IN_PROGRESS
};
GestureDragStatus gesture_drag_status_;
@@ -303,6 +303,9 @@ class ASH_EXPORT ShelfLayoutManager :
// |gesture_drag_status_| is set to GESTURE_DRAG_IN_PROGRESS.
float gesture_drag_amount_;
+ // Manage the auto-hide state during the gesture.
+ AutoHideState gesture_drag_auto_hide_state_;
+
DISALLOW_COPY_AND_ASSIGN(ShelfLayoutManager);
};