From 65536c9221c62262cca9b76431bc1fdaf4886a3b Mon Sep 17 00:00:00 2001 From: Stefan Csomor Date: Sat, 24 Oct 2009 19:28:50 +0000 Subject: [PATCH] support for auto-rotate on iphone git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62496 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- src/osx/iphone/nonownedwnd.mm | 2 +- src/osx/iphone/utils.mm | 10 ++++++++ src/osx/iphone/window.mm | 48 ++++++++++++++++------------------- src/osx/nonownedwnd_osx.cpp | 7 ++++- 4 files changed, 39 insertions(+), 28 deletions(-) diff --git a/src/osx/iphone/nonownedwnd.mm b/src/osx/iphone/nonownedwnd.mm index 6b484a5fda..ba4386f279 100644 --- a/src/osx/iphone/nonownedwnd.mm +++ b/src/osx/iphone/nonownedwnd.mm @@ -194,7 +194,7 @@ void wxNonOwnedWindowIPhoneImpl::GetSize( int &width, int &height ) const void wxNonOwnedWindowIPhoneImpl::GetContentArea( int& left, int &top, int &width, int &height ) const { - CGRect rect = [m_macWindow frame]; + CGRect rect = [m_macWindow bounds]; width = rect.size.width; height = rect.size.height; left = rect.origin.x; diff --git a/src/osx/iphone/utils.mm b/src/osx/iphone/utils.mm index 738b52dffa..f6b5b25d32 100644 --- a/src/osx/iphone/utils.mm +++ b/src/osx/iphone/utils.mm @@ -136,6 +136,7 @@ extern CGSize MeasureTextInContext( UIFont *font, NSString* text ) void wxClientDisplayRect(int *x, int *y, int *width, int *height) { +#if 0 CGRect r = [[UIScreen mainScreen] applicationFrame]; CGRect bounds = [[UIScreen mainScreen] bounds]; if ( bounds.size.height > r.size.height ) @@ -162,6 +163,15 @@ void wxClientDisplayRect(int *x, int *y, int *width, int *height) if ( height ) *height = r.size.width; } +#else + // it's easier to treat the status bar as an element of the toplevel window + // instead of the desktop in order to support easy rotation + if ( x ) + *x = 0; + if ( y ) + *y = 0; + wxDisplaySize(width, height); +#endif } void wxGetMousePosition( int* x, int* y ) diff --git a/src/osx/iphone/window.mm b/src/osx/iphone/window.mm index 15e4029b84..c6cce21b50 100644 --- a/src/osx/iphone/window.mm +++ b/src/osx/iphone/window.mm @@ -321,17 +321,21 @@ void wxOSXIPhoneClassAddWXMethods(Class c) - (BOOL) shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation) interfaceOrientation { + wxWidgetIPhoneImpl* impl = (wxWidgetIPhoneImpl* ) wxWidgetImpl::FindFromWXWidget( [self view] ); + wxNonOwnedWindow* now = dynamic_cast (impl->GetWXPeer()); + + // TODO: determine NO or YES based on min size requirements (whether it fits on the new orientation) + return YES; } - (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation { CGRect fr = [self.view frame]; -// CGRect cv = [[self.view superview] frame]; -// CGRect bounds = CGRectMake( 0,0,fr.size.width, fr.size.height); -// [[self.view superview] setFrame: fr ]; -// [self.view setFrame: bounds]; -// [self.view setNeedsDisplayInRect:bounds]; + wxWidgetIPhoneImpl* impl = (wxWidgetIPhoneImpl* ) wxWidgetImpl::FindFromWXWidget( [self view] ); + wxNonOwnedWindow* now = dynamic_cast (impl->GetWXPeer()); + + now->HandleResized(0); } @end @@ -419,7 +423,9 @@ void wxWidgetIPhoneImpl::GetSize( int &width, int &height ) const void wxWidgetIPhoneImpl::GetContentArea( int&left, int &top, int &width, int &height ) const { left = top = 0; - GetSize( width, height ); + CGRect rect = [m_osxView bounds]; + width = rect.size.width; + height = rect.size.height; } void wxWidgetIPhoneImpl::SetNeedsDisplay( const wxRect* where ) @@ -767,31 +773,21 @@ wxWidgetImpl* wxWidgetImpl::CreateUserPane( wxWindowMac* wxpeer, wxWindowMac* WX wxWidgetImpl* wxWidgetImpl::CreateContentView( wxNonOwnedWindow* now ) { UIWindow* toplevelwindow = now->GetWXWindow(); + CGRect frame = [toplevelwindow bounds]; + CGRect appframe = [[UIScreen mainScreen] applicationFrame]; - wxUIContentView* contentview = [[wxUIContentView alloc] initWithFrame:[toplevelwindow bounds]]; + if ( now->GetWindowStyle() == wxDEFAULT_FRAME_STYLE ) + { + double offset = appframe.origin.y; + frame.origin.y += offset; + frame.size.height -= offset; + } + + wxUIContentView* contentview = [[wxUIContentView alloc] initWithFrame:frame]; contentview.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; wxUIContentViewController* controller = [[wxUIContentViewController alloc] init]; controller.view = contentview; - /* - UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation]; - // left orientation not yet implemented ! - if (orientation == UIInterfaceOrientationLandscapeRight ) - { - CGAffineTransform transform = v.transform; - - // Use the status bar frame to determine the center point of the window's content area. - CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame]; - CGRect bounds = CGRectMake(0, 0, statusBarFrame.size.height, statusBarFrame.origin.x); - CGPoint center = CGPointMake(bounds.size.height / 2.0, bounds.size.width / 2.0); - - // Set the center point of the view to the center point of the window's content area. - v.center = center; - // Rotate the view 90 degrees around its new center point. - transform = CGAffineTransformRotate(transform, ( M_PI / 2.0)); - v.transform = transform; - } - */ wxWidgetIPhoneImpl* impl = new wxWidgetIPhoneImpl( now, contentview, true ); impl->InstallEventHandler(); [toplevelwindow addSubview:contentview]; diff --git a/src/osx/nonownedwnd_osx.cpp b/src/osx/nonownedwnd_osx.cpp index fc50ea4091..bdc9be1d32 100644 --- a/src/osx/nonownedwnd_osx.cpp +++ b/src/osx/nonownedwnd_osx.cpp @@ -399,8 +399,13 @@ void wxNonOwnedWindow::DoGetClientSize( int *width, int *height ) const return; int left, top, w, h; + // perhaps we should do this for all ? +#ifdef __WXOSX_IPHONE__ + m_peer->GetContentArea(left, top, w, h); +#else m_nowpeer->GetContentArea(left, top, w, h); - +#endif + if (width) *width = w ; if (height) -- 2.47.2