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

Unified Diff: athena/wm/window_overview_mode.cc

Issue 459613008: athena: Allow getting into split-view mode from overview-mode. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: tot-merge Created 6 years, 4 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 | « athena/wm/window_overview_mode.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: athena/wm/window_overview_mode.cc
diff --git a/athena/wm/window_overview_mode.cc b/athena/wm/window_overview_mode.cc
index 91ee8c9e9bba06b6bd04c12d7d223010617d452f..b36ec11051513320a756f33c9d7ae41e0bd5c66a 100644
--- a/athena/wm/window_overview_mode.cc
+++ b/athena/wm/window_overview_mode.cc
@@ -9,6 +9,7 @@
#include <vector>
#include "athena/common/closure_animation_observer.h"
+#include "athena/wm/overview_toolbar.h"
#include "athena/wm/public/window_list_provider.h"
#include "base/bind.h"
#include "base/macros.h"
@@ -290,6 +291,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
void DragWindow(const ui::GestureEvent& event) {
CHECK(dragged_window_);
CHECK_EQ(ui::ET_GESTURE_SCROLL_UPDATE, event.type());
+ CHECK(overview_toolbar_);
gfx::Vector2dF dragged_distance =
dragged_start_location_ - event.location();
WindowOverviewState* dragged_state =
@@ -299,11 +301,50 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
transform.Translate(-dragged_distance.x(), 0);
dragged_window_->SetTransform(transform);
+ // Update the toolbar.
+ const int kMinDistanceForActionButtons = 20;
+ if (fabs(dragged_distance.x()) > kMinDistanceForActionButtons)
+ overview_toolbar_->ShowActionButtons();
+ else
+ overview_toolbar_->HideActionButtons();
+
+ // See if the touch-point is above one of the action-buttons.
+ OverviewToolbar::ActionType new_action =
+ overview_toolbar_->GetHighlightAction(event);
+
+ // If the touch-point is not above any of the action buttons, then highlight
+ // the close-button by default, if the user has dragged enough to close the
+ // window.
+ if (new_action == OverviewToolbar::ACTION_TYPE_NONE) {
+ if (fabs(dragged_distance.x()) > kMinDistanceForDismissal)
+ new_action = OverviewToolbar::ACTION_TYPE_CLOSE;
+ else
+ new_action = OverviewToolbar::ACTION_TYPE_NONE;
+ }
+ OverviewToolbar::ActionType previous_action =
+ overview_toolbar_->current_action();
+ overview_toolbar_->SetHighlightAction(new_action);
+
+ // If the user has selected to get into split-view mode, then show the
+ // window with full opacity. Otherwise, fade it out as it closes. Animate
+ // the opacity if transitioning to/from the split-view button.
+ bool animate_opacity =
+ (new_action != previous_action) &&
+ ((new_action == OverviewToolbar::ACTION_TYPE_SPLIT) ||
+ (previous_action == OverviewToolbar::ACTION_TYPE_SPLIT));
float ratio = std::min(
1.f, std::abs(dragged_distance.x()) / kMinDistanceForDismissal);
float opacity =
- gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity);
- dragged_window_->layer()->SetOpacity(opacity);
+ (new_action == OverviewToolbar::ACTION_TYPE_SPLIT)
+ ? 1
+ : gfx::Tween::FloatValueBetween(ratio, kMaxOpacity, kMinOpacity);
+ if (animate_opacity) {
+ ui::ScopedLayerAnimationSettings settings(
+ dragged_window_->layer()->GetAnimator());
+ dragged_window_->layer()->SetOpacity(opacity);
+ } else {
+ dragged_window_->layer()->SetOpacity(opacity);
+ }
}
bool ShouldCloseDragWindow(const ui::GestureEvent& event) const {
@@ -382,6 +423,19 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
dragged_window_ = NULL;
}
+ void EndDragWindow(const ui::GestureEvent& gesture) {
+ CHECK(dragged_window_);
+ CHECK(overview_toolbar_);
+ OverviewToolbar::ActionType action = overview_toolbar_->current_action();
+ overview_toolbar_.reset();
+ if (action == OverviewToolbar::ACTION_TYPE_SPLIT)
+ delegate_->OnSplitViewMode(NULL, dragged_window_);
+ else if (ShouldCloseDragWindow(gesture))
+ CloseDragWindow(gesture);
+ else
+ RestoreDragWindow();
+ }
+
// ui::EventHandler:
virtual void OnMouseEvent(ui::MouseEvent* mouse) OVERRIDE {
if (mouse->type() == ui::ET_MOUSE_PRESSED) {
@@ -412,6 +466,8 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
std::abs(gesture->details().scroll_y_hint()) * 2) {
dragged_start_location_ = gesture->location();
dragged_window_ = SelectWindowAt(gesture);
+ if (dragged_window_)
+ overview_toolbar_.reset(new OverviewToolbar(container_));
}
} else if (gesture->type() == ui::ET_GESTURE_SCROLL_UPDATE) {
if (dragged_window_)
@@ -420,19 +476,12 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
DoScroll(gesture->details().scroll_y());
gesture->SetHandled();
} else if (gesture->type() == ui::ET_GESTURE_SCROLL_END) {
- if (dragged_window_) {
- if (ShouldCloseDragWindow(*gesture))
- CloseDragWindow(*gesture);
- else
- RestoreDragWindow();
- }
+ if (dragged_window_)
+ EndDragWindow(*gesture);
gesture->SetHandled();
} else if (gesture->type() == ui::ET_SCROLL_FLING_START) {
if (dragged_window_) {
- if (ShouldCloseDragWindow(*gesture))
- CloseDragWindow(*gesture);
- else
- RestoreDragWindow();
+ EndDragWindow(*gesture);
} else {
CreateFlingerFor(*gesture);
AddAnimationObserver();
@@ -477,6 +526,7 @@ class WindowOverviewModeImpl : public WindowOverviewMode,
aura::Window* dragged_window_;
gfx::Point dragged_start_location_;
+ scoped_ptr<OverviewToolbar> overview_toolbar_;
DISALLOW_COPY_AND_ASSIGN(WindowOverviewModeImpl);
};
« no previous file with comments | « athena/wm/window_overview_mode.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698