diff options
author | tkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-14 07:48:40 +0000 |
---|---|---|
committer | tkent@chromium.org <tkent@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-09-14 07:48:40 +0000 |
commit | c5cb2ed8738c6117a24b984b2f065f2839a585a3 (patch) | |
tree | 2635954ee1b2759225f25768a7c85f70f483097f /chrome/browser/cocoa | |
parent | 8a6461cf71bd1401e9b551d30818bfe39a2e4061 (diff) | |
download | chromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.zip chromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.tar.gz chromium_src-c5cb2ed8738c6117a24b984b2f065f2839a585a3.tar.bz2 |
Mac: push back the detached tab position inside the dragging window.
BUG=32597
TEST=manual
Patch by morrita@google
Original code review: http://codereview.chromium.org/3333018/show
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@59342 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/cocoa')
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.h | 4 | ||||
-rw-r--r-- | chrome/browser/cocoa/browser_window_controller.mm | 31 |
2 files changed, 34 insertions, 1 deletions
diff --git a/chrome/browser/cocoa/browser_window_controller.h b/chrome/browser/cocoa/browser_window_controller.h index 7bbbe96..c90de7a 100644 --- a/chrome/browser/cocoa/browser_window_controller.h +++ b/chrome/browser/cocoa/browser_window_controller.h @@ -378,6 +378,10 @@ class TabContents; // or the download shelf), so that future shrinking will occur from the bottom. - (void)resetWindowGrowthState; +// Computes by how far in each direction, horizontal and vertical, the +// |source| rect doesn't fit into |target|. +- (NSSize)overflowFrom:(NSRect)source + to:(NSRect)target; @end // @interface BrowserWindowController(TestingAPI) diff --git a/chrome/browser/cocoa/browser_window_controller.mm b/chrome/browser/cocoa/browser_window_controller.mm index b2ec489..b7bbe34 100644 --- a/chrome/browser/cocoa/browser_window_controller.mm +++ b/chrome/browser/cocoa/browser_window_controller.mm @@ -1155,7 +1155,15 @@ gfx::Rect browserRect(windowRect.origin.x, windowRect.origin.y, windowRect.size.width, windowRect.size.height); - NSRect tabRect = [tabView frame]; + NSRect sourceTabRect = [tabView frame]; + NSView* tabStrip = [self tabStripView]; + + // Pushes tabView's frame back inside the tabstrip. + NSSize tabOverflow = + [self overflowFrom:[tabStrip convertRectToBase:sourceTabRect] + to:[tabStrip frame]]; + NSRect tabRect = NSOffsetRect(sourceTabRect, + -tabOverflow.width, -tabOverflow.height); // Before detaching the tab, store the pinned state. bool isPinned = browser_->tabstrip_model()->IsTabPinned(index); @@ -1684,6 +1692,27 @@ willAnimateFromState:(bookmarks::VisualState)oldState isShrinkingFromZoomed_ = NO; } +- (NSSize)overflowFrom:(NSRect)source + to:(NSRect)target { + // If |source|'s boundary is outside of |target|'s, set its distance + // to |x|. Note that |source| can overflow to both side, but we + // have nothing to do for such case. + CGFloat x = 0; + if (NSMaxX(target) < NSMaxX(source)) // |source| overflows to right + x = NSMaxX(source) - NSMaxX(target); + else if (NSMinX(source) < NSMinX(target)) // |source| overflows to left + x = NSMinX(source) - NSMinX(target); + + // Same as |x| above. + CGFloat y = 0; + if (NSMaxY(target) < NSMaxY(source)) + y = NSMaxY(source) - NSMaxY(target); + else if (NSMinY(source) < NSMinY(target)) + y = NSMinY(source) - NSMinY(target); + + return NSMakeSize(x, y); +} + // Override to swap in the correct tab strip controller based on the new // tab strip mode. - (void)toggleTabStripDisplayMode { |