X-Git-Url: https://git.saurik.com/cydia.git/blobdiff_plain/291cc5b9eede4150afa87878823d248f10fad174..172b238d6f66f6b1a0298ef9ebbcfbe9477a2221:/UICaboodle/RVBook.mm?ds=sidebyside diff --git a/UICaboodle/RVBook.mm b/UICaboodle/RVBook.mm index db1ae0a7..3fd525e0 100644 --- a/UICaboodle/RVBook.mm +++ b/UICaboodle/RVBook.mm @@ -8,19 +8,78 @@ #import #import +#import +#import + +#include +#include + +#include + #import "RVPage.h" +@interface NSObject (UICaboodleRVBook) +- (float) widthForButtonContents:(float)width; +@end + +@implementation NSObject (UICaboodleRVBook) + +- (float) widthForButtonContents:(float)width { + return width; +} + +@end + +@interface UIImage (UICaboodleRVBook) +- (float) widthForButtonContents:(float)width; +@end + +@implementation UIImage (UICaboodleRVBook) + +- (float) widthForButtonContents:(float)width { + return [self size].width + 8; +} + +@end + +@interface RVNavigationBar : UINavigationBar { +} + +- (id) createButtonWithContents:(id)contents width:(float)width barStyle:(int)barStyle buttonStyle:(int)style isRight:(BOOL)right; +@end + +@implementation RVNavigationBar + +- (id) createButtonWithContents:(id)contents width:(float)width barStyle:(int)barStyle buttonStyle:(int)style isRight:(BOOL)right { + float adjust = [contents widthForButtonContents:width]; + width = adjust; + return [super createButtonWithContents:contents width:width barStyle:barStyle buttonStyle:style isRight:right]; +} + +@end + @implementation RVBook - (void) dealloc { [navbar_ setDelegate:nil]; + if (toolbar_ != nil) + [toolbar_ setDelegate:nil]; + + for (RVPage *page in pages_) + [page setBook:nil]; [pages_ release]; [navbar_ release]; [transition_ release]; + if (toolbar_ != nil) + [toolbar_ release]; [super dealloc]; } +- (UINavigationBar *) navigationBar { + return navbar_; +} + - (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button { _assert([pages_ count] != 0); RVPage *page = [pages_ lastObject]; @@ -44,21 +103,22 @@ pages_ = [[NSMutableArray arrayWithCapacity:4] retain]; struct CGRect bounds = [self bounds]; - CGSize navsize = [UINavigationBar defaultSizeWithPrompt]; - CGRect navrect = {{0, 0}, navsize}; + CGSize navsize = [UINavigationBar defaultSize]; + CGRect navrect = {{0, 0}, {bounds.size.width, navsize.height}}; - navbar_ = [[UINavigationBar alloc] initWithFrame:navrect]; + navbar_ = [[RVNavigationBar alloc] initWithFrame:navrect]; + [navbar_ setAutoresizingMask:UIViewAutoresizingFlexibleWidth]; [self addSubview:navbar_]; - [navbar_ setBarStyle:1]; + [navbar_ setBarStyle:0]; [navbar_ setDelegate:self]; - [navbar_ setPrompt:@""]; - transition_ = [[UITransitionView alloc] initWithFrame:CGRectMake( bounds.origin.x, bounds.origin.y + navsize.height, bounds.size.width, bounds.size.height - navsize.height )]; + [transition_ setAutoresizingMask:(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight)]; + [self addSubview:transition_]; } return self; } @@ -67,6 +127,10 @@ delegate_ = delegate; } +- (void) setHook:(id)hook { + hook_ = hook; +} + - (void) setPage:(RVPage *)page { if ([pages_ count] != 0) [[pages_ lastObject] setPageActive:NO]; @@ -81,10 +145,22 @@ [navbar_ enableAnimation]; } -- (void) pushPage:(RVPage *)page { - if ([pages_ count] != 0) - [[pages_ lastObject] setPageActive:NO]; +- (void) swapPage:(RVPage *)page { + if ([pages_ count] == 0) + return [self pushPage:page]; + + [[pages_ lastObject] setPageActive:NO]; + [navbar_ disableAnimation]; + resetting_ = true; + [navbar_ popNavigationItem]; + resetting_ = false; + + [self pushPage:page animated:NO]; + [navbar_ enableAnimation]; +} + +- (void) pushPage:(RVPage *)page animated:(BOOL)animated { NSString *title = [self getTitleForPage:page]; NSString *backButtonTitle = [page backButtonTitle]; @@ -95,18 +171,27 @@ [navitem setBackButtonTitle:backButtonTitle]; [navbar_ pushNavigationItem:navitem]; - BOOL animated = [pages_ count] == 0 ? NO : YES; + [page setFrame:[transition_ bounds]]; [transition_ transition:(animated ? 1 : 0) toView:page]; [page setPageActive:YES]; [pages_ addObject:page]; [self reloadButtonsForPage:page]; -#ifdef __OBJC2__ - [navbar_ setAccessoryView:[page accessoryView] animate:animated removeOnPop:NO]; -#else - [navbar_ setAccessoryView:[page accessoryView] animate:animated goingBack:NO]; -#endif + if ([navbar_ respondsToSelector:@selector(setAccessoryView:animate:removeOnPop:)]) + [navbar_ setAccessoryView:[page accessoryView] animate:animated removeOnPop:NO]; + else + [navbar_ setAccessoryView:[page accessoryView] animate:animated]; +} + +- (void) pushPage:(RVPage *)page { + if ([pages_ count] != 0) + [[pages_ lastObject] setPageActive:NO]; + [self pushPage:page animated:([pages_ count] == 0 ? NO : YES)]; +} + +- (void) pushBook:(RVBook *)book { + [delegate_ popUpBook:book]; } - (void) popPages:(unsigned)pages { @@ -123,10 +208,6 @@ [self resetViewAnimated:YES toPage:[pages_ lastObject]]; } -- (void) setPrompt:(NSString *)prompt { - [navbar_ setPrompt:prompt]; -} - - (void) resetViewAnimated:(BOOL)animated { resetting_ = true; @@ -146,35 +227,54 @@ - (void) resetViewAnimated:(BOOL)animated toPage:(RVPage *)page { [page resetViewAnimated:animated]; + [page setFrame:[transition_ bounds]]; [transition_ transition:(animated ? 2 : 0) toView:page]; [page setPageActive:YES]; [self reloadButtonsForPage:page]; -#ifdef __OBJC2__ - [navbar_ setAccessoryView:[page accessoryView] animate:animated removeOnPop:NO]; -#else - [navbar_ setAccessoryView:[page accessoryView] animate:animated goingBack:YES]; -#endif + + if ([navbar_ respondsToSelector:@selector(setAccessoryView:animate:removeOnPop:)]) + [navbar_ setAccessoryView:[page accessoryView] animate:animated removeOnPop:NO]; + else + [navbar_ setAccessoryView:[page accessoryView] animate:animated]; } -- (void) setTitle:(NSString *)title forPage:(RVPage *)page { +- (void) setBackButtonTitle:(NSString *)title forPage:(RVPage *)page { if ([pages_ count] == 0 || page != [pages_ lastObject]) return; UINavigationItem *navitem = [navbar_ topItem]; - [navitem setTitle:title]; + [navitem setBackButtonTitle:title]; } -- (void) setBackButtonTitle:(NSString *)title forPage:(RVPage *)page { +- (void) reloadTitleForPage:(RVPage *)page { if ([pages_ count] == 0 || page != [pages_ lastObject]) return; UINavigationItem *navitem = [navbar_ topItem]; - [navitem setBackButtonTitle:title]; + NSString *title = [self getTitleForPage:page]; + [navitem setTitle:title]; +} + +- (void) _leftButtonTitle:(NSString *&)leftButtonTitle style:(UINavigationButtonStyle &)leftButtonStyle forPage:(RVPage *)page { + leftButtonTitle = [page leftButtonTitle]; + leftButtonStyle = [page leftButtonStyle]; } - (void) reloadButtonsForPage:(RVPage *)page { if ([pages_ count] == 0 || page != [pages_ lastObject]) return; - NSString *leftButtonTitle([pages_ count] == 1 ? [page leftButtonTitle] : nil); - [navbar_ showButtonsWithLeftTitle:leftButtonTitle rightTitle:[page rightButtonTitle]]; + + NSString *leftButtonTitle; + UINavigationButtonStyle leftButtonStyle; + [self _leftButtonTitle:leftButtonTitle style:leftButtonStyle forPage:page]; + + UINavigationButtonStyle rightButtonStyle = [page rightButtonStyle]; + //[navbar_ showButtonsWithLeftTitle:leftButtonTitle rightTitle:[page rightButtonTitle] leftBack:(leftButtonTitle == nil)]; + + [navbar_ + showLeftButton:leftButtonTitle + withStyle:leftButtonStyle + rightButton:[page rightButtonTitle] + withStyle:rightButtonStyle + ]; } - (NSString *) getTitleForPage:(RVPage *)page { @@ -182,14 +282,57 @@ } - (void) reloadData { - for (int i(0), e([pages_ count]); i != e; ++i) { - RVPage *page([pages_ objectAtIndex:(e - i - 1)]); + size_t count([pages_ count]); + for (size_t i(0); i != count; ++i) { + RVPage *page([pages_ objectAtIndex:(count - i - 1)]); [page reloadData]; } + + if (count != 0) { + RVPage *page([pages_ lastObject]); + [self reloadButtonsForPage:page]; + } +} + +- (void) reloadButtons { + size_t count([pages_ count]); + if (count != 0) { + RVPage *page([pages_ lastObject]); + [self reloadButtonsForPage:page]; + } } - (CGRect) pageBounds { return [transition_ bounds]; } +- (void) close { + if (hook_ != nil) + [hook_ didCloseBook:self]; +} + +@end + +@implementation RVPopUpBook + +- (void) _leftButtonTitle:(NSString *&)leftButtonTitle style:(UINavigationButtonStyle &)leftButtonStyle forPage:(RVPage *)page { + [super _leftButtonTitle:leftButtonTitle style:leftButtonStyle forPage:page]; + if ((cancel_ = leftButtonTitle == nil && [pages_ count] == 1)) { + leftButtonTitle = [[NSBundle mainBundle] localizedStringForKey:@"CANCEL" value:nil table:nil]; + leftButtonStyle = UINavigationButtonStyleNormal; + } +} + +- (void) navigationBar:(UINavigationBar *)navbar buttonClicked:(int)button { + if (button == 1 && cancel_) + [self close]; + else + [super navigationBar:navbar buttonClicked:button]; +} + +- (void) close { + [self popFromSuperviewAnimated:YES]; + [super close]; +} + @end