| Index: ash/launcher/launcher_view.cc
|
| diff --git a/ash/launcher/launcher_view.cc b/ash/launcher/launcher_view.cc
|
| index 2f2ba3fc79456cc6628301145d5933feaddf2e55..1af16ac2b8d55b4a17676a31b7868ab06130e039 100644
|
| --- a/ash/launcher/launcher_view.cc
|
| +++ b/ash/launcher/launcher_view.cc
|
| @@ -45,9 +45,7 @@ static const int kLeadingInset = 8;
|
| // Minimum distance before drag starts.
|
| static const int kMinimumDragDistance = 8;
|
|
|
| -// Size given to the buttons on the launcher.
|
| -static const int kButtonWidth = 48;
|
| -static const int kButtonHeight = 48;
|
| +// Size between the buttons.
|
| static const int kButtonSpacing = 4;
|
|
|
| namespace {
|
| @@ -250,7 +248,8 @@ LauncherView::LauncherView(LauncherModel* model, LauncherDelegate* delegate)
|
| drag_view_(NULL),
|
| drag_offset_(0),
|
| start_drag_index_(-1),
|
| - context_menu_id_(0) {
|
| + context_menu_id_(0),
|
| + alignment_(SHELF_ALIGNMENT_BOTTOM) {
|
| DCHECK(model_);
|
| bounds_animator_.reset(new views::BoundsAnimator(this));
|
| set_context_menu_controller(this);
|
| @@ -293,6 +292,13 @@ void LauncherView::Init() {
|
| // We'll layout when our bounds change.
|
| }
|
|
|
| +void LauncherView::SetAlignment(ShelfAlignment alignment) {
|
| + if (alignment_ == alignment)
|
| + return;
|
| + alignment_ = alignment;
|
| + LayoutToIdealBounds();
|
| +}
|
| +
|
| gfx::Rect LauncherView::GetIdealBoundsOfItemIcon(LauncherID id) {
|
| int index = model_->ItemIndexByID(id);
|
| if (index == -1 || index > last_visible_index_)
|
| @@ -350,23 +356,24 @@ void LauncherView::LayoutToIdealBounds() {
|
| }
|
|
|
| void LauncherView::CalculateIdealBounds(IdealBounds* bounds) {
|
| - int available_width = width();
|
| - if (!available_width)
|
| + int available_size = primary_axis_coordinate(width(), height());
|
| + if (!available_size)
|
| return;
|
|
|
| - int x = kLeadingInset;
|
| + int x = primary_axis_coordinate(kLeadingInset, 0);
|
| + int y = primary_axis_coordinate(0, kLeadingInset);
|
| for (int i = 0; i < view_model_->view_size(); ++i) {
|
| - gfx::Size pref(kButtonWidth, kButtonHeight);
|
| view_model_->set_ideal_bounds(i, gfx::Rect(
|
| - x, (kLauncherPreferredHeight - pref.height()) / 2, pref.width(),
|
| - pref.height()));
|
| - x += pref.width() + kButtonSpacing;
|
| + x, y, kLauncherPreferredSize, kLauncherPreferredSize));
|
| + x = primary_axis_coordinate(x + kLauncherPreferredSize + kButtonSpacing, 0);
|
| + y = primary_axis_coordinate(0, y + kLauncherPreferredSize + kButtonSpacing);
|
| }
|
|
|
| - bounds->overflow_bounds.set_size(gfx::Size(kButtonWidth, kButtonHeight));
|
| + bounds->overflow_bounds.set_size(
|
| + gfx::Size(kLauncherPreferredSize, kLauncherPreferredSize));
|
| last_visible_index_ = DetermineLastVisibleIndex(
|
| - available_width - kLeadingInset - bounds->overflow_bounds.width() -
|
| - kButtonSpacing - kButtonWidth);
|
| + available_size - kLeadingInset - kLauncherPreferredSize -
|
| + kButtonSpacing - kLauncherPreferredSize);
|
| int app_list_index = view_model_->view_size() - 1;
|
| bool show_overflow = (last_visible_index_ + 1 < app_list_index);
|
|
|
| @@ -378,23 +385,34 @@ void LauncherView::CalculateIdealBounds(IdealBounds* bounds) {
|
| overflow_button_->SetVisible(show_overflow);
|
| if (show_overflow) {
|
| DCHECK_NE(0, view_model_->view_size());
|
| - // We always want the app list visible.
|
| + if (last_visible_index_ == -1) {
|
| + x = primary_axis_coordinate(kLeadingInset, 0);
|
| + y = primary_axis_coordinate(0, kLeadingInset);
|
| + } else {
|
| + x = primary_axis_coordinate(
|
| + view_model_->ideal_bounds(last_visible_index_).right(), 0);
|
| + y = primary_axis_coordinate(0,
|
| + view_model_->ideal_bounds(last_visible_index_).bottom());
|
| + }
|
| gfx::Rect app_list_bounds = view_model_->ideal_bounds(app_list_index);
|
| - x = last_visible_index_ == -1 ?
|
| - kLeadingInset : view_model_->ideal_bounds(last_visible_index_).right();
|
| app_list_bounds.set_x(x);
|
| + app_list_bounds.set_y(y);
|
| view_model_->set_ideal_bounds(app_list_index, app_list_bounds);
|
| - x = app_list_bounds.right() + kButtonSpacing;
|
| + x = primary_axis_coordinate(x + kLauncherPreferredSize + kButtonSpacing, 0);
|
| + y = primary_axis_coordinate(0, y + kLauncherPreferredSize + kButtonSpacing);
|
| bounds->overflow_bounds.set_x(x);
|
| - bounds->overflow_bounds.set_y(
|
| - (kLauncherPreferredHeight - bounds->overflow_bounds.height()) / 2);
|
| + bounds->overflow_bounds.set_y(y);
|
| }
|
| }
|
|
|
| -int LauncherView::DetermineLastVisibleIndex(int max_x) {
|
| +int LauncherView::DetermineLastVisibleIndex(int max_value) {
|
| int index = view_model_->view_size() - 1;
|
| - while (index >= 0 && view_model_->ideal_bounds(index).right() > max_x)
|
| + while (index >= 0 &&
|
| + primary_axis_coordinate(
|
| + view_model_->ideal_bounds(index).right(),
|
| + view_model_->ideal_bounds(index).bottom()) > max_value) {
|
| index--;
|
| + }
|
| return index;
|
| }
|
|
|
| @@ -511,7 +529,7 @@ void LauncherView::PrepareForDrag(const views::MouseEvent& event) {
|
|
|
| void LauncherView::ContinueDrag(const views::MouseEvent& event) {
|
| // TODO: I don't think this works correctly with RTL.
|
| - gfx::Point drag_point(event.x(), 0);
|
| + gfx::Point drag_point(event.location());
|
| views::View::ConvertPointToView(drag_view_, this, &drag_point);
|
| int current_index = view_model_->GetIndexOfView(drag_view_);
|
| DCHECK_NE(-1, current_index);
|
| @@ -523,28 +541,41 @@ void LauncherView::ContinueDrag(const views::MouseEvent& event) {
|
| return;
|
| }
|
|
|
| - // Constrain the x location to the range of valid indices for the type.
|
| + // Constrain the location to the range of valid indices for the type.
|
| std::pair<int,int> indices(GetDragRange(current_index));
|
| - int x = std::max(view_model_->ideal_bounds(indices.first).x(),
|
| - drag_point.x() - drag_offset_);
|
| - if (view_model_->view_at(indices.second)->visible()) {
|
| - x = std::min(view_model_->ideal_bounds(indices.second).right() -
|
| + int last_drag_index = indices.second;
|
| + // If the last index isn't valid, we're overflowing. Constrain to the app list
|
| + // (which is the last visible item).
|
| + if (last_drag_index > last_visible_index_)
|
| + last_drag_index = last_visible_index_;
|
| + int x = 0, y = 0;
|
| + if (is_horizontal_alignment()) {
|
| + x = std::max(view_model_->ideal_bounds(indices.first).x(),
|
| + drag_point.x() - drag_offset_);
|
| + x = std::min(view_model_->ideal_bounds(last_drag_index).right() -
|
| view_model_->ideal_bounds(current_index).width(),
|
| x);
|
| + if (drag_view_->x() == x)
|
| + return;
|
| + drag_view_->SetX(x);
|
| } else {
|
| - // If the last index isn't valid, we're overflowing. Constrain to the app
|
| - // list (which is the last visible item).
|
| - x = std::min(
|
| - view_model_->ideal_bounds(view_model_->view_size() - 1).right() -
|
| - view_model_->ideal_bounds(current_index).width(),
|
| - x);
|
| - }
|
| - if (drag_view_->x() == x)
|
| - return;
|
| + y = std::max(view_model_->ideal_bounds(indices.first).y(),
|
| + drag_point.y() - drag_offset_);
|
| + y = std::min(view_model_->ideal_bounds(last_drag_index).bottom() -
|
| + view_model_->ideal_bounds(current_index).height(),
|
| + y);
|
| + if (drag_view_->y() == y)
|
| + return;
|
| + drag_view_->SetY(y);
|
| + }
|
|
|
| - drag_view_->SetX(x);
|
| int target_index =
|
| - views::ViewModelUtils::DetermineMoveIndex(*view_model_, drag_view_, x);
|
| + views::ViewModelUtils::DetermineMoveIndex(
|
| + *view_model_, drag_view_,
|
| + is_horizontal_alignment() ?
|
| + views::ViewModelUtils::HORIZONTAL :
|
| + views::ViewModelUtils::VERTICAL,
|
| + x, y);
|
| target_index =
|
| std::min(indices.second, std::max(target_index, indices.first));
|
| if (target_index == current_index)
|
| @@ -671,13 +702,22 @@ void LauncherView::CancelDrag(views::View* deleted_view) {
|
| gfx::Size LauncherView::GetPreferredSize() {
|
| IdealBounds ideal_bounds;
|
| CalculateIdealBounds(&ideal_bounds);
|
| + if (is_horizontal_alignment()) {
|
| + if (view_model_->view_size() >= 2) {
|
| + // Should always have two items.
|
| + return gfx::Size(view_model_->ideal_bounds(1).right() + kLeadingInset,
|
| + kLauncherPreferredSize);
|
| + }
|
| + return gfx::Size(kLauncherPreferredSize * 2 + kLeadingInset * 2,
|
| + kLauncherPreferredSize);
|
| + }
|
| if (view_model_->view_size() >= 2) {
|
| // Should always have two items.
|
| - return gfx::Size(view_model_->ideal_bounds(1).right() + kLeadingInset,
|
| - kLauncherPreferredHeight);
|
| + return gfx::Size(kLauncherPreferredSize,
|
| + view_model_->ideal_bounds(1).bottom() + kLeadingInset);
|
| }
|
| - return gfx::Size(kButtonWidth * 2 + kLeadingInset * 2,
|
| - kLauncherPreferredHeight);
|
| + return gfx::Size(kLauncherPreferredSize,
|
| + kLauncherPreferredSize * 2 + kLeadingInset * 2);
|
| }
|
|
|
| void LauncherView::OnBoundsChanged(const gfx::Rect& previous_bounds) {
|
| @@ -808,14 +848,17 @@ void LauncherView::MousePressedOnButton(views::View* view,
|
| return; // View is being deleted or not draggable, ignore request.
|
|
|
| drag_view_ = view;
|
| - drag_offset_ = event.x();
|
| + drag_offset_ = primary_axis_coordinate(event.x(), event.y());
|
| }
|
|
|
| void LauncherView::MouseDraggedOnButton(views::View* view,
|
| const views::MouseEvent& event) {
|
| if (!dragging_ && drag_view_ &&
|
| - abs(event.x() - drag_offset_) >= kMinimumDragDistance)
|
| + primary_axis_coordinate(abs(event.x() - drag_offset_),
|
| + abs(event.y() - drag_offset_)) >=
|
| + kMinimumDragDistance) {
|
| PrepareForDrag(event);
|
| + }
|
| if (dragging_)
|
| ContinueDrag(event);
|
| }
|
| @@ -834,6 +877,10 @@ void LauncherView::MouseReleasedOnButton(views::View* view,
|
| void LauncherView::MouseExitedButton(views::View* view) {
|
| }
|
|
|
| +ShelfAlignment LauncherView::GetShelfAlignment() const {
|
| + return alignment_;
|
| +}
|
| +
|
| string16 LauncherView::GetAccessibleName(const views::View* view) {
|
| if (!delegate_)
|
| return string16();
|
|
|