Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h" | 5 #include "chrome/browser/ui/views/tabs/tab_drag_controller.h" |
| 6 | 6 |
| 7 #include <math.h> | 7 #include <math.h> |
| 8 #include <set> | 8 #include <set> |
| 9 | 9 |
| 10 #include "ash/accelerators/accelerator_commands.h" | 10 #include "ash/accelerators/accelerator_commands.h" |
| (...skipping 778 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 789 for (size_t i = 0; i < drag_data_.size(); ++i) | 789 for (size_t i = 0; i < drag_data_.size(); ++i) |
| 790 tabs[i] = drag_data_[i].attached_tab; | 790 tabs[i] = drag_data_[i].attached_tab; |
| 791 | 791 |
| 792 bool did_layout = false; | 792 bool did_layout = false; |
| 793 // Update the model, moving the WebContents from one index to another. Do this | 793 // Update the model, moving the WebContents from one index to another. Do this |
| 794 // only if we have moved a minimum distance since the last reorder (to prevent | 794 // only if we have moved a minimum distance since the last reorder (to prevent |
| 795 // jitter) or if this the first move and the tabs are not consecutive. | 795 // jitter) or if this the first move and the tabs are not consecutive. |
| 796 if ((abs(point_in_screen.x() - last_move_screen_loc_) > threshold || | 796 if ((abs(point_in_screen.x() - last_move_screen_loc_) > threshold || |
| 797 (initial_move_ && !AreTabsConsecutive()))) { | 797 (initial_move_ && !AreTabsConsecutive()))) { |
| 798 TabStripModel* attached_model = GetModel(attached_tabstrip_); | 798 TabStripModel* attached_model = GetModel(attached_tabstrip_); |
| 799 gfx::Rect bounds = GetDraggedViewTabStripBounds(dragged_view_point); | 799 int to_index = GetInsertionIndexForDraggedBounds( |
| 800 int to_index = GetInsertionIndexForDraggedBounds(bounds); | 800 GetDraggedViewTabStripBounds(dragged_view_point)); |
|
Peter Kasting
2014/06/17 03:16:18
I didn't think the old code was bad, but while wor
| |
| 801 bool do_move = true; | 801 bool do_move = true; |
| 802 // While dragging within a tabstrip the expectation is the insertion index | 802 // While dragging within a tabstrip the expectation is the insertion index |
| 803 // is based on the left edge of the tabs being dragged. OTOH when dragging | 803 // is based on the left edge of the tabs being dragged. OTOH when dragging |
| 804 // into a new tabstrip (attaching) the expectation is the insertion index is | 804 // into a new tabstrip (attaching) the expectation is the insertion index is |
| 805 // based on the cursor. This proves problematic as insertion may change the | 805 // based on the cursor. This proves problematic as insertion may change the |
| 806 // size of the tabs, resulting in the index calculated before the insert | 806 // size of the tabs, resulting in the index calculated before the insert |
| 807 // differing from the index calculated after the insert. To alleviate this | 807 // differing from the index calculated after the insert. To alleviate this |
| 808 // the index is chosen before insertion, and subsequently a new index is | 808 // the index is chosen before insertion, and subsequently a new index is |
| 809 // only used once the mouse moves enough such that the index changes based | 809 // only used once the mouse moves enough such that the index changes based |
| 810 // on the direction the mouse moved relative to |attach_x_| (smaller | 810 // on the direction the mouse moved relative to |attach_x_| (smaller |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 997 | 997 |
| 998 // Figure out where to insert the tab based on the bounds of the dragged | 998 // Figure out where to insert the tab based on the bounds of the dragged |
| 999 // representation and the ideal bounds of the other Tabs already in the | 999 // representation and the ideal bounds of the other Tabs already in the |
| 1000 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are | 1000 // strip. ("ideal bounds" are stable even if the Tabs' actual bounds are |
| 1001 // changing due to animation). | 1001 // changing due to animation). |
| 1002 gfx::Point tab_strip_point(point_in_screen); | 1002 gfx::Point tab_strip_point(point_in_screen); |
| 1003 views::View::ConvertPointFromScreen(attached_tabstrip_, &tab_strip_point); | 1003 views::View::ConvertPointFromScreen(attached_tabstrip_, &tab_strip_point); |
| 1004 tab_strip_point.set_x( | 1004 tab_strip_point.set_x( |
| 1005 attached_tabstrip_->GetMirroredXInView(tab_strip_point.x())); | 1005 attached_tabstrip_->GetMirroredXInView(tab_strip_point.x())); |
| 1006 tab_strip_point.Offset(0, -mouse_offset_.y()); | 1006 tab_strip_point.Offset(0, -mouse_offset_.y()); |
| 1007 gfx::Rect bounds = GetDraggedViewTabStripBounds(tab_strip_point); | 1007 int index = GetInsertionIndexForDraggedBounds( |
| 1008 int index = GetInsertionIndexForDraggedBounds(bounds); | 1008 GetDraggedViewTabStripBounds(tab_strip_point)); |
| 1009 attach_index_ = index; | 1009 attach_index_ = index; |
| 1010 attach_x_ = tab_strip_point.x(); | 1010 attach_x_ = tab_strip_point.x(); |
| 1011 base::AutoReset<bool> setter(&is_mutating_, true); | 1011 base::AutoReset<bool> setter(&is_mutating_, true); |
| 1012 for (size_t i = 0; i < drag_data_.size(); ++i) { | 1012 for (size_t i = 0; i < drag_data_.size(); ++i) { |
| 1013 int add_types = TabStripModel::ADD_NONE; | 1013 int add_types = TabStripModel::ADD_NONE; |
| 1014 if (attached_tabstrip_->touch_layout_.get()) { | 1014 if (attached_tabstrip_->touch_layout_.get()) { |
| 1015 // StackedTabStripLayout positions relative to the active tab, if we | 1015 // StackedTabStripLayout positions relative to the active tab, if we |
| 1016 // don't add the tab as active things bounce around. | 1016 // don't add the tab as active things bounce around. |
| 1017 DCHECK_EQ(1u, drag_data_.size()); | 1017 DCHECK_EQ(1u, drag_data_.size()); |
| 1018 add_types |= TabStripModel::ADD_ACTIVE; | 1018 add_types |= TabStripModel::ADD_ACTIVE; |
| (...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1259 } else if (dragged_bounds.x() >= left_half.x() && | 1259 } else if (dragged_bounds.x() >= left_half.x() && |
| 1260 dragged_bounds.x() < left_half.right()) { | 1260 dragged_bounds.x() < left_half.right()) { |
| 1261 return i; | 1261 return i; |
| 1262 } | 1262 } |
| 1263 } | 1263 } |
| 1264 return -1; | 1264 return -1; |
| 1265 } | 1265 } |
| 1266 | 1266 |
| 1267 int TabDragController::GetInsertionIndexForDraggedBounds( | 1267 int TabDragController::GetInsertionIndexForDraggedBounds( |
| 1268 const gfx::Rect& dragged_bounds) const { | 1268 const gfx::Rect& dragged_bounds) const { |
| 1269 // If the strip has no tabs, the only position to insert at is 0. | |
| 1270 const int tab_count = attached_tabstrip_->tab_count(); | |
| 1271 if (!tab_count) | |
| 1272 return 0; | |
| 1273 | |
| 1269 int index = -1; | 1274 int index = -1; |
| 1270 if (attached_tabstrip_->touch_layout_.get()) { | 1275 if (attached_tabstrip_->touch_layout_.get()) { |
| 1271 index = GetInsertionIndexForDraggedBoundsStacked(dragged_bounds); | 1276 index = GetInsertionIndexForDraggedBoundsStacked(dragged_bounds); |
| 1272 if (index != -1) { | 1277 if (index != -1) { |
| 1273 // Only move the tab to the left/right if the user actually moved the | 1278 // Only move the tab to the left/right if the user actually moved the |
| 1274 // mouse that way. This is necessary as tabs with stacked tabs | 1279 // mouse that way. This is necessary as tabs with stacked tabs |
| 1275 // before/after them have multiple drag positions. | 1280 // before/after them have multiple drag positions. |
| 1276 int active_index = attached_tabstrip_->touch_layout_->active_index(); | 1281 int active_index = attached_tabstrip_->touch_layout_->active_index(); |
| 1277 if ((index < active_index && | 1282 if ((index < active_index && |
| 1278 (mouse_move_direction_ & kMovedMouseLeft) == 0) || | 1283 (mouse_move_direction_ & kMovedMouseLeft) == 0) || |
| 1279 (index > active_index && | 1284 (index > active_index && |
| 1280 (mouse_move_direction_ & kMovedMouseRight) == 0)) { | 1285 (mouse_move_direction_ & kMovedMouseRight) == 0)) { |
| 1281 index = active_index; | 1286 index = active_index; |
| 1282 } | 1287 } |
| 1283 } | 1288 } |
| 1284 } else { | 1289 } else { |
| 1285 index = GetInsertionIndexFrom(dragged_bounds, 0, 1); | 1290 index = GetInsertionIndexFrom(dragged_bounds, 0, 1); |
| 1286 } | 1291 } |
| 1287 if (index == -1) { | 1292 if (index == -1) { |
| 1288 int tab_count = attached_tabstrip_->tab_count(); | 1293 const int last_tab_right = |
| 1289 int right_tab_x = tab_count == 0 ? 0 : | |
| 1290 attached_tabstrip_->ideal_bounds(tab_count - 1).right(); | 1294 attached_tabstrip_->ideal_bounds(tab_count - 1).right(); |
| 1291 if (dragged_bounds.right() > right_tab_x) { | 1295 index = (dragged_bounds.right() > last_tab_right) ? tab_count : 0; |
|
Peter Kasting
2014/06/17 03:16:18
Note that this assumes attached_tabstrip_->tab_cou
sky
2014/06/17 15:42:42
Yes, they should be equal (with the exception of t
| |
| 1292 index = GetModel(attached_tabstrip_)->count(); | |
| 1293 } else { | |
| 1294 index = 0; | |
| 1295 } | |
| 1296 } | 1296 } |
| 1297 | 1297 |
| 1298 if (!drag_data_[0].attached_tab) { | 1298 if (!drag_data_[0].attached_tab) { |
| 1299 // If 'attached_tab' is NULL, it means we're in the process of attaching and | 1299 // If 'attached_tab' is NULL, it means we're in the process of attaching and |
| 1300 // don't need to constrain the index. | 1300 // don't need to constrain the index. |
| 1301 return index; | 1301 return index; |
| 1302 } | 1302 } |
| 1303 | 1303 |
| 1304 int max_index = GetModel(attached_tabstrip_)->count() - | 1304 int max_index = GetModel(attached_tabstrip_)->count() - |
| 1305 static_cast<int>(drag_data_.size()); | 1305 static_cast<int>(drag_data_.size()); |
| (...skipping 487 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1793 break; | 1793 break; |
| 1794 } | 1794 } |
| 1795 default: | 1795 default: |
| 1796 break; // Nothing to do for DETACH_ABOVE_OR_BELOW. | 1796 break; // Nothing to do for DETACH_ABOVE_OR_BELOW. |
| 1797 } | 1797 } |
| 1798 | 1798 |
| 1799 // To account for the extra vertical on restored windows that is absent on | 1799 // To account for the extra vertical on restored windows that is absent on |
| 1800 // maximized windows, add an additional vertical offset extracted from the tab | 1800 // maximized windows, add an additional vertical offset extracted from the tab |
| 1801 // strip. | 1801 // strip. |
| 1802 if (source->GetWidget()->IsMaximized()) | 1802 if (source->GetWidget()->IsMaximized()) |
| 1803 new_bounds.Offset(0, -source->button_v_offset()); | 1803 new_bounds.Offset(0, -source->kNewTabButtonVerticalOffset); |
| 1804 return new_bounds; | 1804 return new_bounds; |
| 1805 } | 1805 } |
| 1806 | 1806 |
| 1807 void TabDragController::AdjustBrowserAndTabBoundsForDrag( | 1807 void TabDragController::AdjustBrowserAndTabBoundsForDrag( |
| 1808 int last_tabstrip_width, | 1808 int last_tabstrip_width, |
| 1809 const gfx::Point& point_in_screen, | 1809 const gfx::Point& point_in_screen, |
| 1810 std::vector<gfx::Rect>* drag_bounds) { | 1810 std::vector<gfx::Rect>* drag_bounds) { |
| 1811 attached_tabstrip_->InvalidateLayout(); | 1811 attached_tabstrip_->InvalidateLayout(); |
| 1812 attached_tabstrip_->DoLayout(); | 1812 attached_tabstrip_->DoLayout(); |
| 1813 const int dragged_tabstrip_width = attached_tabstrip_->tab_area_width(); | 1813 const int dragged_tabstrip_width = attached_tabstrip_->tab_area_width(); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1921 it != browser_list->end(); ++it) { | 1921 it != browser_list->end(); ++it) { |
| 1922 if ((*it)->tab_strip_model()->empty()) | 1922 if ((*it)->tab_strip_model()->empty()) |
| 1923 exclude.insert((*it)->window()->GetNativeWindow()); | 1923 exclude.insert((*it)->window()->GetNativeWindow()); |
| 1924 } | 1924 } |
| 1925 #endif | 1925 #endif |
| 1926 return GetLocalProcessWindowAtPoint(host_desktop_type_, | 1926 return GetLocalProcessWindowAtPoint(host_desktop_type_, |
| 1927 screen_point, | 1927 screen_point, |
| 1928 exclude); | 1928 exclude); |
| 1929 | 1929 |
| 1930 } | 1930 } |
| OLD | NEW |