diff --git a/diffstrings.py b/diffstrings.py index 5cd8378901..9c134d323e 100755 --- a/diffstrings.py +++ b/diffstrings.py @@ -262,7 +262,7 @@ def diff(self, localizedStrings): if source in localizedStrings.strings: target = localizedStrings.strings[source] translation.translated[sourceEnum] = True - + targetEnum = enumerateStringVariables(target) translation.strings[sourceEnum] = targetEnum @@ -322,7 +322,7 @@ def mergeReport(self, sourceStrings, translation): if sourceEnum in translation.strings: targetEnum = translation.strings[sourceEnum] target = denumerateStringVariables(targetEnum) - if target != self.strings[source]: + if source not in self.strings or target != self.strings[source]: updatedStrings.append(source) else: ignoredStrings.append(source) @@ -491,13 +491,14 @@ def __parse(self, filePath): def __invertSourceMap(self, sourceMap): sourceFileMap = {} - for source in self.strings: + for sourceEnum in self.strings: + source = denumerateStringVariables(sourceEnum) if source in sourceMap: sourcePaths = sourceMap[source] for sourcePath in sourcePaths: if sourcePath not in sourceFileMap: sourceFileMap[sourcePath] = [] - sourceFileMap[sourcePath].append(source) + sourceFileMap[sourcePath].append(sourceEnum) break for sourceName, sourceFileStrings in sourceFileMap.iteritems(): diff --git a/src/TTDefaultStyleSheet.m b/src/TTDefaultStyleSheet.m index 29ee1280ed..dea95f1db8 100644 --- a/src/TTDefaultStyleSheet.m +++ b/src/TTDefaultStyleSheet.m @@ -427,6 +427,14 @@ - (TTStyle*)photoStatusLabel { shadowOffset:CGSizeMake(0, -1) next:nil]]]; } +- (TTStyle*)pageDot:(UIControlState)state { + if (state == UIControlStateSelected) { + return [self pageDotWithColor:[UIColor whiteColor]]; + } else { + return [self pageDotWithColor:RGBCOLOR(77, 77, 77)]; + } +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // public colors @@ -653,6 +661,11 @@ - (UIColor*)toolbarButtonTextColorForState:(UIControlState)state { /////////////////////////////////////////////////////////////////////////////////////////////////// // public +- (TTStyle*)selectionFillStyle:(TTStyle*)next { + return [TTLinearGradientFillStyle styleWithColor1:RGBCOLOR(5,140,245) + color2:RGBCOLOR(1,93,230) next:next]; +} + - (TTStyle*)toolbarButtonForState:(UIControlState)state shape:(TTShape*)shape tintColor:(UIColor*)tintColor font:(UIFont*)font { UIColor* stateTintColor = [self toolbarButtonColorWithTintColor:tintColor forState:state]; @@ -677,9 +690,12 @@ - (TTStyle*)toolbarButtonForState:(UIControlState)state shape:(TTShape*)shape shadowOffset:CGSizeMake(0, -1) next:nil]]]]]]]]]]; } -- (TTStyle*)selectionFillStyle:(TTStyle*)next { - return [TTLinearGradientFillStyle styleWithColor1:RGBCOLOR(5,140,245) - color2:RGBCOLOR(1,93,230) next:next]; +- (TTStyle*)pageDotWithColor:(UIColor*)color { + return + [TTBoxStyle styleWithMargin:UIEdgeInsetsMake(0,0,0,10) padding:UIEdgeInsetsMake(6,6,0,0) next: + [TTShapeStyle styleWithShape:[TTRoundedRectangleShape shapeWithRadius:2.5] next: + [TTSolidFillStyle styleWithColor:color next:nil]]]; } + @end diff --git a/src/TTModelViewController.m b/src/TTModelViewController.m index d81af27e57..af22cd0a2c 100644 --- a/src/TTModelViewController.m +++ b/src/TTModelViewController.m @@ -110,6 +110,10 @@ - (void)updateViewStates { } } +- (void)createInterstitialModel { + self.model = [[[TTModel alloc] init] autorelease]; +} + /////////////////////////////////////////////////////////////////////////////////////////////////// // NSObject @@ -235,7 +239,7 @@ - (void)modelDidEndUpdates:(id)model { [self createModel]; } if (!_model) { - self.model = [[[TTModel alloc] init] autorelease]; + [self createInterstitialModel]; } } return _model; @@ -308,7 +312,7 @@ - (void)reload { } - (void)reloadIfNeeded { - if ([self shouldReload]) { + if ([self shouldReload] && !self.model.isLoading) { [self reload]; } } diff --git a/src/TTPageControl.m b/src/TTPageControl.m new file mode 100644 index 0000000000..6243f0f0ad --- /dev/null +++ b/src/TTPageControl.m @@ -0,0 +1,130 @@ +#include "Three20/TTPageControl.h" +#include "Three20/TTStyleSheet.h" +#include "Three20/TTStyle.h" + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation TTPageControl + +@synthesize numberOfPages = _numberOfPages, currentPage = _currentPage, dotStyle = _dotStyle; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (TTStyle*)normalDotStyle { + if (!_normalDotStyle) { + _normalDotStyle = [[[TTStyleSheet globalStyleSheet] styleWithSelector:_dotStyle + forState:UIControlStateNormal] retain]; + } + return _normalDotStyle; +} + +- (TTStyle*)currentDotStyle { + if (!_currentDotStyle) { + _currentDotStyle = [[[TTStyleSheet globalStyleSheet] styleWithSelector:_dotStyle + forState:UIControlStateSelected] retain]; + } + return _currentDotStyle; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// NSObject + +- (id)initWithFrame:(CGRect)frame { + if (self = [super initWithFrame:frame]) { + _numberOfPages = 0; + _currentPage = 0; + _dotStyle = nil; + _normalDotStyle = nil; + _currentDotStyle = nil; + + self.backgroundColor = [UIColor clearColor]; + self.dotStyle = @"pageDot:"; + } + return self; +} + +- (void)dealloc { + TT_RELEASE_SAFELY(_dotStyle); + TT_RELEASE_SAFELY(_normalDotStyle); + TT_RELEASE_SAFELY(_currentDotStyle); + [super dealloc]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIView + +- (void)drawRect:(CGRect)rect { + TTStyleContext* context = [[[TTStyleContext alloc] init] autorelease]; + TTBoxStyle* boxStyle = [self.normalDotStyle firstStyleOfClass:[TTBoxStyle class]]; + + CGSize dotSize = [self.normalDotStyle addToSize:CGSizeZero context:context]; + CGRect contentRect = CGRectMake(0, 0, dotSize.width, dotSize.height); + + for (NSInteger i = 0; i < _numberOfPages; ++i) { + contentRect.origin.x += boxStyle.margin.left; + + context.frame = contentRect; + context.contentFrame = contentRect; + + if (i == _currentPage) { + [self.currentDotStyle draw:context]; + } else { + [self.normalDotStyle draw:context]; + } + contentRect.origin.x += dotSize.width + boxStyle.margin.right; + } +} + +- (CGSize)sizeThatFits:(CGSize)size { + TTStyleContext* context = [[[TTStyleContext alloc] init] autorelease]; + CGSize dotSize = [self.normalDotStyle addToSize:CGSizeZero context:context]; + + CGFloat margin = 0; + TTBoxStyle* boxStyle = [self.normalDotStyle firstStyleOfClass:[TTBoxStyle class]]; + if (boxStyle) { + margin = boxStyle.margin.right + boxStyle.margin.left; + } + + return CGSizeMake((dotSize.width * _numberOfPages) + (margin * (_numberOfPages-1)), + dotSize.height); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// UIControl + +- (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { + if (self.touchInside) { + CGPoint point = [touch locationInView:self]; + self.currentPage = round(point.x / self.width); + [self sendActionsForControlEvents:UIControlEventValueChanged]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// public + +- (void)setNumberOfPages:(NSInteger)numberOfPages { + if (numberOfPages != _numberOfPages) { + _numberOfPages = numberOfPages; + [self setNeedsDisplay]; + } +} + +- (void)setCurrentPage:(NSInteger)currentPage { + if (currentPage != _currentPage) { + _currentPage = currentPage; + [self setNeedsDisplay]; + } +} + +- (void)setDotStyle:(NSString*)dotStyle { + if (![dotStyle isEqualToString:_dotStyle]) { + [_dotStyle release]; + _dotStyle = [dotStyle copy]; + TT_RELEASE_SAFELY(_normalDotStyle); + TT_RELEASE_SAFELY(_currentDotStyle); + } +} + +@end diff --git a/src/TTPostController.m b/src/TTPostController.m index 126de7534c..2f411ba533 100644 --- a/src/TTPostController.m +++ b/src/TTPostController.m @@ -328,20 +328,16 @@ - (void)setOriginView:(UIView*)view { } - (void)post { - if (_textEditor.text.isEmptyOrWhitespace) { - [self cancel]; + BOOL shouldDismiss = [self willPostText:_textEditor.text]; + if ([_delegate respondsToSelector:@selector(postController:willPostText:)]) { + shouldDismiss = [_delegate postController:self willPostText:_textEditor.text]; + } + + if (shouldDismiss) { + [self dismissWithResult:nil animated:YES]; } else { - BOOL shouldDismiss = [self willPostText:_textEditor.text]; - if ([_delegate respondsToSelector:@selector(postController:willPostText:)]) { - shouldDismiss = [_delegate postController:self willPostText:_textEditor.text]; - } - - if (shouldDismiss) { - [self dismissWithResult:nil animated:YES]; - } else { - [self enableButtons:NO]; - [self showActivity:[self titleForActivity]]; - } + [self enableButtons:NO]; + [self showActivity:[self titleForActivity]]; } } diff --git a/src/TTStyle.m b/src/TTStyle.m index 027dcb380f..fbbeb14a90 100644 --- a/src/TTStyle.m +++ b/src/TTStyle.m @@ -510,13 +510,30 @@ + (TTTextStyle*)styleWithFont:(UIFont*)font color:(UIColor*)color /////////////////////////////////////////////////////////////////////////////////////////////////// // private +- (CGSize)sizeOfText:(NSString*)text withFont:(UIFont*)font size:(CGSize)size { + if (_numberOfLines == 1) { + return [text sizeWithFont:font]; + } else { + CGSize maxSize = CGSizeMake(size.width, CGFLOAT_MAX); + CGSize textSize = [text sizeWithFont:font constrainedToSize:maxSize + lineBreakMode:_lineBreakMode]; + if (_numberOfLines) { + CGFloat maxHeight = font.lineHeight * _numberOfLines; + if (textSize.height > maxHeight) { + textSize.height = maxHeight; + } + } + return textSize; + } +} + - (CGRect)rectForText:(NSString*)text forSize:(CGSize)size withFont:(UIFont*)font { CGRect rect = CGRectZero; if (_textAlignment == UITextAlignmentLeft && _verticalAlignment == UIControlContentVerticalAlignmentTop) { rect.size = size; } else { - CGSize textSize = [text sizeWithFont:font]; + CGSize textSize = [self sizeOfText:text withFont:font size:size]; if (size.width < textSize.width) { size.width = textSize.width; @@ -539,14 +556,6 @@ - (CGRect)rectForText:(NSString*)text forSize:(CGSize)size withFont:(UIFont*)fon return rect; } -- (CGSize)sizeOfText:(NSString*)text withFont:(UIFont*)font size:(CGSize)size { - if (_numberOfLines == 1) { - return [text sizeWithFont:font]; - } else { - return [text sizeWithFont:font constrainedToSize:size lineBreakMode:_lineBreakMode]; - } -} - - (void)drawText:(NSString*)text context:(TTStyleContext*)context { CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextSaveGState(ctx); @@ -574,7 +583,8 @@ - (void)drawText:(NSString*)text context:(TTStyleContext*)context { baselineAdjustment:UIBaselineAdjustmentAlignCenters]; context.contentFrame = titleRect; } else { - rect.size = [text drawInRect:rect withFont:font lineBreakMode:_lineBreakMode + CGRect titleRect = [self rectForText:text forSize:rect.size withFont:font]; + rect.size = [text drawInRect:titleRect withFont:font lineBreakMode:_lineBreakMode alignment:_textAlignment]; context.contentFrame = rect; } diff --git a/src/TTTableViewController.m b/src/TTTableViewController.m index 7a48297500..90b8847147 100644 --- a/src/TTTableViewController.m +++ b/src/TTTableViewController.m @@ -28,6 +28,10 @@ @implementation TTTableViewController /////////////////////////////////////////////////////////////////////////////////////////////////// // private +- (void)createInterstitialModel { + self.dataSource = [[[TTTableViewInterstialDataSource alloc] init] autorelease]; +} + - (void)updateTableDelegate { if (!_tableView.delegate) { [_tableDelegate release]; @@ -44,7 +48,8 @@ - (void)addToOverlayView:(UIView*)view { CGRect frame = [self rectForOverlayView]; _tableOverlayView = [[UIView alloc] initWithFrame:frame]; _tableOverlayView.autoresizesSubviews = YES; - _tableOverlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth; + _tableOverlayView.autoresizingMask = UIViewAutoresizingFlexibleWidth + | UIViewAutoresizingFlexibleBottomMargin; NSInteger tableIndex = [_tableView.superview.subviews indexOfObject:_tableView]; if (tableIndex != NSNotFound) { [_tableView.superview addSubview:_tableOverlayView]; diff --git a/src/TTTableViewDataSource.m b/src/TTTableViewDataSource.m index 61293e1dff..2361f712b0 100644 --- a/src/TTTableViewDataSource.m +++ b/src/TTTableViewDataSource.m @@ -12,6 +12,9 @@ @implementation TTTableViewDataSource @synthesize model = _model; +/////////////////////////////////////////////////////////////////////////////////////////////////// +// class public + + (NSArray*)lettersForSectionsWithSearch:(BOOL)search summary:(BOOL)summary { NSMutableArray* titles = [NSMutableArray array]; if (search) { @@ -216,3 +219,48 @@ - (NSString*)subtitleForError:(NSError*)error { } @end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +@implementation TTTableViewInterstialDataSource + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// TTTableViewDataSource + +- (id)model { + return self; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// TTModel + +- (NSMutableArray*)delegates { + return nil; +} + +- (BOOL)isLoaded { + return NO; +} + +- (BOOL)isLoading { + return YES; +} + +- (BOOL)isLoadingMore { + return NO; +} + +- (BOOL)isOutdated { + return NO; +} + +- (void)load:(TTURLRequestCachePolicy)cachePolicy more:(BOOL)more { +} + +- (void)cancel { +} + +- (void)invalidate:(BOOL)erase { +} + +@end diff --git a/src/TTWebController.m b/src/TTWebController.m index 06f6e43252..17127b479f 100644 --- a/src/TTWebController.m +++ b/src/TTWebController.m @@ -158,6 +158,8 @@ - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)re navigationType:(UIWebViewNavigationType)navigationType { [_loadingURL release]; _loadingURL = [request.URL retain]; + _backButton.enabled = [_webView canGoBack]; + _forwardButton.enabled = [_webView canGoForward]; return YES; } @@ -180,7 +182,9 @@ - (void)webViewDidFinishLoad:(UIWebView*)webView { self.navigationItem.rightBarButtonItem = nil; } [_toolbar replaceItemWithTag:3 withItem:_refreshButton]; - [_webView canGoBack]; + + _backButton.enabled = [_webView canGoBack]; + _forwardButton.enabled = [_webView canGoForward]; } - (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error { diff --git a/src/Three20.bundle/de.lproj/Localizable.strings b/src/Three20.bundle/de.lproj/Localizable.strings index 83a39b86fb..46b134b197 100644 Binary files a/src/Three20.bundle/de.lproj/Localizable.strings and b/src/Three20.bundle/de.lproj/Localizable.strings differ diff --git a/src/Three20.bundle/es.lproj/Localizable.strings b/src/Three20.bundle/es.lproj/Localizable.strings index e4f5202595..46b134b197 100644 Binary files a/src/Three20.bundle/es.lproj/Localizable.strings and b/src/Three20.bundle/es.lproj/Localizable.strings differ diff --git a/src/Three20.bundle/fr.lproj/Localizable.strings b/src/Three20.bundle/fr.lproj/Localizable.strings index 31e6faafc1..c30783ae52 100644 Binary files a/src/Three20.bundle/fr.lproj/Localizable.strings and b/src/Three20.bundle/fr.lproj/Localizable.strings differ diff --git a/src/Three20.bundle/it.lproj/Localizable.strings b/src/Three20.bundle/it.lproj/Localizable.strings index 528b787269..46b134b197 100644 Binary files a/src/Three20.bundle/it.lproj/Localizable.strings and b/src/Three20.bundle/it.lproj/Localizable.strings differ diff --git a/src/Three20.bundle/ja.lproj/Localizable.strings b/src/Three20.bundle/ja.lproj/Localizable.strings index 46b134b197..5d4a0a3ac0 100644 Binary files a/src/Three20.bundle/ja.lproj/Localizable.strings and b/src/Three20.bundle/ja.lproj/Localizable.strings differ diff --git a/src/Three20.xcodeproj/project.pbxproj b/src/Three20.xcodeproj/project.pbxproj index 093c09b7a2..df82f7bf06 100755 --- a/src/Three20.xcodeproj/project.pbxproj +++ b/src/Three20.xcodeproj/project.pbxproj @@ -80,6 +80,8 @@ BEBB198310068D0F00744230 /* TTNavigator.m in Sources */ = {isa = PBXBuildFile; fileRef = BEBB198210068D0F00744230 /* TTNavigator.m */; }; BEBB198E10068D5800744230 /* TTNavigator.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBB198D10068D5800744230 /* TTNavigator.h */; }; BEBB199C100690FE00744230 /* TTURLPattern.h in Headers */ = {isa = PBXBuildFile; fileRef = BEBB199B100690FE00744230 /* TTURLPattern.h */; }; + BEC171D2102A71CC006B431A /* TTPageControl.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC171D1102A71CC006B431A /* TTPageControl.m */; }; + BEC171D4102A71EE006B431A /* TTPageControl.h in Headers */ = {isa = PBXBuildFile; fileRef = BEC171D3102A71EE006B431A /* TTPageControl.h */; }; BEC270B20F8C9D1900EA638F /* TTLayout.h in Headers */ = {isa = PBXBuildFile; fileRef = BEC270B10F8C9D1900EA638F /* TTLayout.h */; }; BEC270B40F8C9D2600EA638F /* TTLayout.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC270B30F8C9D2600EA638F /* TTLayout.m */; }; BEC5EC3F0F8C29DA007622CD /* TTButton.m in Sources */ = {isa = PBXBuildFile; fileRef = BEC5EC3E0F8C29DA007622CD /* TTButton.m */; }; @@ -240,6 +242,8 @@ BEBB198210068D0F00744230 /* TTNavigator.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTNavigator.m; sourceTree = ""; }; BEBB198D10068D5800744230 /* TTNavigator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TTNavigator.h; path = Three20/TTNavigator.h; sourceTree = ""; }; BEBB199B100690FE00744230 /* TTURLPattern.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TTURLPattern.h; path = Three20/TTURLPattern.h; sourceTree = ""; }; + BEC171D1102A71CC006B431A /* TTPageControl.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTPageControl.m; sourceTree = ""; }; + BEC171D3102A71EE006B431A /* TTPageControl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TTPageControl.h; path = Three20/TTPageControl.h; sourceTree = ""; }; BEC270B10F8C9D1900EA638F /* TTLayout.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = TTLayout.h; path = Three20/TTLayout.h; sourceTree = ""; }; BEC270B30F8C9D2600EA638F /* TTLayout.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTLayout.m; sourceTree = ""; }; BEC5EC3E0F8C29DA007622CD /* TTButton.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TTButton.m; sourceTree = ""; }; @@ -520,6 +524,8 @@ BE42FB790F3BBF3400A3B65A /* TTTabBar.m */, BED429440F97F7E50035B153 /* TTButtonBar.h */, BED429410F97F7DB0035B153 /* TTButtonBar.m */, + BEC171D3102A71EE006B431A /* TTPageControl.h */, + BEC171D1102A71CC006B431A /* TTPageControl.m */, ); name = "Buttons and Tabs"; sourceTree = ""; @@ -718,6 +724,7 @@ BE781809100ECF21001FACA5 /* TTSearchDisplayController.h in Headers */, BEA6B8E41013FC3400B83B3A /* UIFontAdditions.h in Headers */, BEF45BC81019CA8500E9EC07 /* TTPostController.h in Headers */, + BEC171D4102A71EE006B431A /* TTPageControl.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -837,6 +844,7 @@ BE781807100ECF0F001FACA5 /* TTSearchDisplayController.m in Sources */, BEA6B8E61013FC4900B83B3A /* UIFontAdditions.m in Sources */, BEF45BC61019CA4400E9EC07 /* TTPostController.m in Sources */, + BEC171D2102A71CC006B431A /* TTPageControl.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/Three20/TTDefaultStyleSheet.h b/src/Three20/TTDefaultStyleSheet.h index 7aeed73b22..e1f4225b61 100644 --- a/src/Three20/TTDefaultStyleSheet.h +++ b/src/Three20/TTDefaultStyleSheet.h @@ -59,10 +59,11 @@ @property(nonatomic,readonly) UITableViewCellSelectionStyle tableSelectionStyle; +- (TTStyle*)selectionFillStyle:(TTStyle*)next; + - (TTStyle*)toolbarButtonForState:(UIControlState)state shape:(TTShape*)shape tintColor:(UIColor*)tintColor font:(UIFont*)font; -- (TTStyle*)selectionFillStyle:(TTStyle*)next; - +- (TTStyle*)pageDotWithColor:(UIColor*)color; @end diff --git a/src/Three20/TTPageControl.h b/src/Three20/TTPageControl.h new file mode 100644 index 0000000000..e539e4898b --- /dev/null +++ b/src/Three20/TTPageControl.h @@ -0,0 +1,20 @@ +#import "Three20/TTGlobal.h" + +@class TTStyle; + +/** + * TTPageControl is a version of UIPageControl which allows you to style the dots. + */ +@interface TTPageControl : UIControl { + NSInteger _numberOfPages; + NSInteger _currentPage; + NSString* _dotStyle; + TTStyle* _normalDotStyle; + TTStyle* _currentDotStyle; +} + +@property(nonatomic) NSInteger numberOfPages; +@property(nonatomic) NSInteger currentPage; +@property(nonatomic,copy) NSString* dotStyle; + +@end diff --git a/src/Three20/TTTableViewDataSource.h b/src/Three20/TTTableViewDataSource.h index d6c1a39aba..fb10ad68cc 100644 --- a/src/Three20/TTTableViewDataSource.h +++ b/src/Three20/TTTableViewDataSource.h @@ -114,3 +114,12 @@ } @end + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +/** + * A datasource that is eternally loading. Useful when you are in between data sources and + * want to show the impression of loading until your actual data source is available. + */ +@interface TTTableViewInterstialDataSource : TTTableViewDataSource +@end diff --git a/src/Three20/Three20.h b/src/Three20/Three20.h index f86679b532..67069a6f39 100644 --- a/src/Three20/Three20.h +++ b/src/Three20/Three20.h @@ -39,6 +39,7 @@ #import "Three20/TTLink.h" #import "Three20/TTTabBar.h" #import "Three20/TTButtonBar.h" +#import "Three20/TTPageControl.h" #import "Three20/TTTextEditor.h" #import "Three20/TTSearchTextField.h"