Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with
or
.
Download ZIP
Browse files

Add new default Featured Collections tab

  • Loading branch information...
commit ef7a0edb9fba4a98c64649cd27ad90bbd1ef899a 1 parent 4cef3bc
@dmpatierno dmpatierno authored
Showing with 1,017 additions and 143 deletions.
  1. +8 −47 Classes/DetailView.xib
  2. +0 −2  Classes/DetailViewController.h
  3. +0 −11 Classes/DetailViewController.m
  4. +27 −0 Classes/FeaturedViewController.h
  5. +296 −0 Classes/FeaturedViewController.m
  6. +35 −0 Classes/GridViewController/DMPGridViewCell.h
  7. +160 −0 Classes/GridViewController/DMPGridViewCell.m
  8. +17 −0 Classes/GridViewController/DMPGridViewController.h
  9. +150 −0 Classes/GridViewController/DMPGridViewController.m
  10. +21 −0 Classes/GridViewController/DMPGridViewDelegate.h
  11. +7 −0 Classes/GuideBookmarks.m
  12. +3 −9 Classes/GuideIntroViewController.m
  13. +4 −9 Classes/GuideStepViewController.m
  14. +4 −7 Classes/GuideViewController.m
  15. +5 −1 Classes/ListViewController.m
  16. +17 −0 Classes/PastFeaturesViewController.h
  17. +94 −0 Classes/PastFeaturesViewController.m
  18. +13 −0 Classes/PastFeaturesViewDelegate.h
  19. +23 −23 Classes/SDWebImage/.svn/entries
  20. +2 −0  Classes/iFixitAPI.h
  21. +29 −0 Classes/iFixitAPI.m
  22. +0 −1  Classes/iFixitAppDelegate.h
  23. +25 −20 Classes/iFixitAppDelegate.m
  24. BIN  Graphics/collectionsHeaderGradient.png
  25. BIN  Graphics/collectionsImagePlaceholder.png
  26. BIN  Graphics/concreteBackground.png
  27. BIN  Lobster.ttf
  28. +1 −1  css/ifixit_intro.css
  29. +1 −1  css/ifixit_step.css
  30. +7 −7 iFixit-Info.plist
  31. +67 −3 iFixit.xcodeproj/project.pbxproj
  32. +1 −1  main.m
View
55 Classes/DetailView.xib
@@ -2,13 +2,13 @@
<archive type="com.apple.InterfaceBuilder3.CocoaTouch.iPad.XIB" version="7.10">
<data>
<int key="IBDocument.SystemTarget">1280</int>
- <string key="IBDocument.SystemVersion">11B2118</string>
- <string key="IBDocument.InterfaceBuilderVersion">1923</string>
- <string key="IBDocument.AppKitVersion">1138.1</string>
- <string key="IBDocument.HIToolboxVersion">566.00</string>
+ <string key="IBDocument.SystemVersion">11C74</string>
+ <string key="IBDocument.InterfaceBuilderVersion">1938</string>
+ <string key="IBDocument.AppKitVersion">1138.23</string>
+ <string key="IBDocument.HIToolboxVersion">567.00</string>
<object class="NSMutableDictionary" key="IBDocument.PluginVersions">
<string key="NS.key.0">com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string key="NS.object.0">919</string>
+ <string key="NS.object.0">933</string>
</object>
<object class="NSArray" key="IBDocument.IntegratedClassDependencies">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -53,15 +53,6 @@
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<object class="NSMutableArray" key="IBUIItems">
<bool key="EncodedWithXMLCoder">YES</bool>
- <object class="IBUIBarButtonItem" id="229923592">
- <object class="NSCustomResource" key="IBUIImage">
- <string key="NSClassName">NSImage</string>
- <string key="NSResourceName">splashButton.png</string>
- </object>
- <string key="targetRuntimeIdentifier">IBIPadFramework</string>
- <int key="IBUIStyle">1</int>
- <reference key="IBUIToolbar" ref="410698538"/>
- </object>
<object class="IBUIBarButtonItem" id="110546682">
<string key="targetRuntimeIdentifier">IBIPadFramework</string>
<reference key="IBUIToolbar" ref="410698538"/>
@@ -109,7 +100,6 @@
<string key="NSFrame">{{0, 44}, {1024, 704}}</string>
<reference key="NSSuperview" ref="647120888"/>
<reference key="NSWindow"/>
- <reference key="NSNextKeyView"/>
<object class="NSColor" key="IBUIBackgroundColor">
<int key="NSColorSpace">1</int>
<bytes key="NSRGB">MSAxIDEAA</bytes>
@@ -180,14 +170,6 @@
</object>
<int key="connectionID">79</int>
</object>
- <object class="IBConnectionRecord">
- <object class="IBCocoaTouchEventConnection" key="connection">
- <string key="label">showSplash:</string>
- <reference key="source" ref="229923592"/>
- <reference key="destination" ref="841351856"/>
- </object>
- <int key="connectionID">84</int>
- </object>
</object>
<object class="IBMutableOrderedSet" key="objectRecords">
<object class="NSArray" key="orderedObjects">
@@ -231,7 +213,6 @@
<reference ref="69973950"/>
<reference ref="767121731"/>
<reference ref="867349467"/>
- <reference ref="229923592"/>
</object>
<reference key="parent" ref="647120888"/>
</object>
@@ -265,11 +246,6 @@
<reference key="object" ref="867349467"/>
<reference key="parent" ref="410698538"/>
</object>
- <object class="IBObjectRecord">
- <int key="objectID">82</int>
- <reference key="object" ref="229923592"/>
- <reference key="parent" ref="410698538"/>
- </object>
</object>
</object>
<object class="NSMutableDictionary" key="flattenedProperties">
@@ -289,7 +265,6 @@
<string>8.IBPluginDependency</string>
<string>80.IBPluginDependency</string>
<string>81.IBPluginDependency</string>
- <string>82.IBPluginDependency</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
@@ -306,7 +281,6 @@
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
<string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
- <string>com.apple.InterfaceBuilder.IBCocoaTouchPlugin</string>
</object>
</object>
<object class="NSMutableDictionary" key="unlocalizedProperties">
@@ -329,17 +303,6 @@
<object class="IBPartialClassDescription">
<string key="className">DetailViewController</string>
<string key="superclassName">UIViewController</string>
- <object class="NSMutableDictionary" key="actions">
- <string key="NS.key.0">showSplash:</string>
- <string key="NS.object.0">UIBarButtonItem</string>
- </object>
- <object class="NSMutableDictionary" key="actionInfosByName">
- <string key="NS.key.0">showSplash:</string>
- <object class="IBActionInfo" key="NS.object.0">
- <string key="name">showSplash:</string>
- <string key="candidateClassName">UIBarButtonItem</string>
- </object>
- </object>
<object class="NSMutableDictionary" key="outlets">
<bool key="EncodedWithXMLCoder">YES</bool>
<object class="NSArray" key="dict.sortedKeys">
@@ -419,15 +382,13 @@
<bool key="EncodedWithXMLCoder">YES</bool>
<string>back.png</string>
<string>forward.png</string>
- <string>splashButton.png</string>
</object>
<object class="NSMutableArray" key="dict.values">
<bool key="EncodedWithXMLCoder">YES</bool>
- <string>{20, 20}</string>
- <string>{20, 20}</string>
- <string>{19, 19}</string>
+ <string>{14, 17}</string>
+ <string>{14, 17}</string>
</object>
</object>
- <string key="IBCocoaTouchPluginVersion">919</string>
+ <string key="IBCocoaTouchPluginVersion">933</string>
</data>
</archive>
View
2  Classes/DetailViewController.h
@@ -20,6 +20,4 @@
@property (nonatomic, retain) IBOutlet UIBarButtonItem *fwdButton;
@property (nonatomic, retain) UIPopoverController *popoverController;
-- (IBAction)showSplash:(UIBarButtonItem *)button;
-
@end
View
11 Classes/DetailViewController.m
@@ -101,13 +101,6 @@ - (void)viewDidLoad {
backButton.action = @selector(goBack);
fwdButton.target = webView;
fwdButton.action = @selector(goForward);
-
- // Hide the splash button if on a Dozuki site.
- if ([Config currentConfig].dozuki) {
- NSMutableArray *items = [[toolbar items] mutableCopy];
- [items removeObjectAtIndex:0];
- [toolbar setItems:items animated:YES];
- }
}
- (NSDictionary *)treeMatchInTree:(NSDictionary *)tree forURL:(NSString *)url {
@@ -221,10 +214,6 @@ - (void)viewDidUnload {
self.fwdButton = nil;
}
-- (IBAction)showSplash:(UIBarButtonItem *)button {
- [(iFixitAppDelegate *)[[UIApplication sharedApplication] delegate] showSplash];
-}
-
#pragma mark -
#pragma mark Memory management
View
27 Classes/FeaturedViewController.h
@@ -0,0 +1,27 @@
+//
+// FeaturedViewController.h
+// iFixit
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011 iFixit. All rights reserved.
+//
+
+#import "DMPGridViewDelegate.h"
+#import "PastFeaturesViewDelegate.h"
+
+@class PastFeaturesViewController;
+@class DMPGridViewController;
+@class WBProgressHUD;
+
+@interface FeaturedViewController : UINavigationController <UIAlertViewDelegate, DMPGridViewDelegate, PastFeaturesViewDelegate>
+
+@property (retain, nonatomic) UIPopoverController *poc;
+@property (assign, nonatomic) PastFeaturesViewController *pvc;
+@property (assign, nonatomic) DMPGridViewController *gvc;
+@property (retain, nonatomic) NSDictionary *collection;
+@property (retain, nonatomic) NSArray *guides;
+@property (retain, nonatomic) WBProgressHUD *loading;
+
+- (void)showPastFeatures:(id)sender;
+
+@end
View
296 Classes/FeaturedViewController.m
@@ -0,0 +1,296 @@
+//
+// FeaturedViewController.m
+// iFixit
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011 iFixit. All rights reserved.
+//
+
+#import "FeaturedViewController.h"
+#import "PastFeaturesViewController.h"
+#import "DMPGridViewController.h"
+#import "GuideViewController.h"
+#import "iFixitAPI.h"
+#import "Config.h"
+#import "UIImageView+WebCache.h"
+#import "WBProgressHUD.h"
+#import "GANTracker.h"
+#import <QuartzCore/QuartzCore.h>
+
+@implementation FeaturedViewController
+@synthesize poc, pvc, gvc;
+@synthesize collection = _collection;
+@synthesize guides = _guides;
+@synthesize loading;
+
+- (void)showLoading {
+ if (loading.superview) {
+ [loading showInView:self.gvc.view];
+ return;
+ }
+
+ CGRect frame = CGRectMake(self.view.frame.size.width / 2.0 - 60, 400.0, 120.0, 120.0);
+ self.loading = [[[WBProgressHUD alloc] initWithFrame:frame] autorelease];
+ self.loading.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleBottomMargin;
+ [loading showInView:self.gvc.view];
+}
+
+- (void)loadCollections {
+ [self showLoading];
+ self.gvc.navigationItem.rightBarButtonItem = nil;
+ [[iFixitAPI sharedInstance] getCollectionsWithLimit:200 andOffset:0 forObject:self withSelector:@selector(gotCollections:)];
+}
+
+- (id)init {
+ if ((self = [super init])) {
+ self.pvc = [[[PastFeaturesViewController alloc] init] autorelease];
+ self.pvc.delegate = self;
+
+ UINavigationController *nvc = [[UINavigationController alloc] initWithRootViewController:pvc];
+ self.poc = [[[UIPopoverController alloc] initWithContentViewController:nvc] autorelease];
+ poc.popoverContentSize = CGSizeMake(320.0, 500.0);
+ [nvc release];
+
+ self.gvc = [[[DMPGridViewController alloc] initWithDelegate:nil] autorelease];
+ self.viewControllers = [NSArray arrayWithObject:gvc];
+ self.gvc.delegate = self;
+
+ [self loadCollections];
+ }
+ return self;
+}
+
+- (void)gotCollections:(NSArray *)collections {
+ if (![collections count]) {
+ [self.loading hide];
+ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
+ message:@"Could not load featured collections."
+ delegate:self
+ cancelButtonTitle:@"Cancel"
+ otherButtonTitles:@"Retry", nil];
+ alert.tag = 1;
+ [alert show];
+ [alert release];
+ return;
+ }
+
+ // Grab the most recent collection to populate our display.
+ self.collection = [collections objectAtIndex:0];
+
+ // Pass the whole list onto the popover view.
+ pvc.collections = [NSMutableArray arrayWithArray:collections];
+
+ // Analytics
+ [[GANTracker sharedTracker] trackPageview:[NSString stringWithFormat:@"/collection/%d", [[self.collection valueForKey:@"collectionid"] intValue]] withError:NULL];
+}
+
+- (void)loadGuides {
+ [self showLoading];
+ self.gvc.navigationItem.rightBarButtonItem = nil;
+ [[iFixitAPI sharedInstance] getGuidesByIds:[_collection objectForKey:@"guideids"] forObject:self withSelector:@selector(gotGuides:)];
+}
+
+// Run this method both when we set the collection and on viewDidLoad, in case we're coming back from a low memory condition.
+- (void)updateTitleAndHeader {
+ if (!_collection)
+ return;
+
+ self.gvc.title = [_collection valueForKey:@"title"];
+
+ // Create the header container view with a drop shadow.
+ UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, self.view.frame.size.width, 256.0)];
+ headerView.layer.masksToBounds = NO;
+ headerView.layer.shadowOffset = CGSizeZero;
+ headerView.layer.shadowRadius = 6.0;
+ headerView.layer.shadowOpacity = 1;
+ headerView.layer.shadowPath = [UIBezierPath bezierPathWithRect:headerView.bounds].CGPath;
+
+ // Add the image
+ UIImageView *imageView = [[UIImageView alloc] initWithFrame:headerView.frame];
+ imageView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
+ imageView.contentMode = UIViewContentModeScaleAspectFill;
+ imageView.clipsToBounds = YES;
+ imageView.backgroundColor = [UIColor lightGrayColor];
+ [imageView setImageWithURL:[NSURL URLWithString:[[_collection objectForKey:@"image"] objectForKey:@"large"]]];
+ [headerView addSubview:imageView];
+ [imageView release];
+
+ // Add a gradient overlay.
+ UIImageView *gradientView = [[UIImageView alloc] initWithFrame:headerView.frame];
+ gradientView.alpha = 0.80;
+ gradientView.image = [UIImage imageNamed:@"collectionsHeaderGradient.png"];
+ gradientView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleBottomMargin;
+ gradientView.contentMode = UIViewContentModeScaleToFill;
+ gradientView.clipsToBounds = YES;
+ [headerView addSubview:gradientView];
+ [gradientView release];
+
+ // Add the giant text.
+ UILabel *titleLabel = [[UILabel alloc] initWithFrame:CGRectMake(120.0, 150.0, self.view.frame.size.width - 130.0, 106.0)];
+ titleLabel.adjustsFontSizeToFitWidth = YES;
+ titleLabel.minimumFontSize = 70.0;
+ titleLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth;
+ if ([Config currentConfig].dozuki)
+ titleLabel.font = [UIFont fontWithName:@"Lobster" size:120.0];
+ else
+ titleLabel.font = [UIFont fontWithName:@"TrebuchetMS-Italic" size:120.0];
+ titleLabel.textColor = [UIColor whiteColor];
+ titleLabel.backgroundColor = [UIColor clearColor];
+ titleLabel.textAlignment = UITextAlignmentRight;
+ titleLabel.text = [_collection valueForKey:@"title"];
+ [headerView addSubview:titleLabel];
+ [titleLabel release];
+
+ // Apply!
+ self.gvc.tableView.tableHeaderView = headerView;
+ [headerView release];
+}
+
+- (void)setCollection:(NSDictionary *)collection {
+ // Save the collection.
+ [_collection release];
+ _collection = [collection retain];
+
+ // Reset the guides list.
+ self.guides = nil;
+
+ // Dismiss the popover
+ [poc dismissPopoverAnimated:YES];
+
+ // Update the title and header image.
+ [self updateTitleAndHeader];
+
+ // Scroll to the top.
+ [self.gvc.tableView scrollRectToVisible:CGRectMake(0.0, 0.0, 1.0, 1.0) animated:NO];
+
+ // Reload the grid.
+ [self.gvc.tableView reloadData];
+
+ // Retrieve guide data.
+ [self loadGuides];
+}
+
+- (void)gotGuides:(NSArray *)guides {
+ if (![guides count]) {
+ [self.loading hide];
+ UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
+ message:@"Could not load collection."
+ delegate:self
+ cancelButtonTitle:@"Cancel"
+ otherButtonTitles:@"Retry", nil];
+ alert.tag = 2;
+ [alert show];
+ [alert release];
+ return;
+ }
+
+ self.guides = guides;
+ [self.gvc.tableView reloadData];
+ [self.loading hide];
+}
+
+- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
+ if (!buttonIndex) {
+ UIBarButtonItem *refreshItem;
+
+ if (alertView.tag == 1) {
+ refreshItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
+ target:self
+ action:@selector(loadCollections)];
+ }
+ else if (alertView.tag == 2) {
+ refreshItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh
+ target:self
+ action:@selector(loadGuides)];
+ }
+
+ self.gvc.navigationItem.rightBarButtonItem = refreshItem;
+ [refreshItem release];
+ return;
+ }
+
+ if (alertView.tag == 1) {
+ [self loadCollections];
+ }
+ else if (alertView.tag == 2) {
+ [self loadGuides];
+ }
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+ // Add a 10px bottom margin.
+ self.gvc.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 10.0, 0.0);
+
+ self.navigationBar.barStyle = UIBarStyleBlackOpaque;
+
+ self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"concreteBackground.png"]];
+ self.gvc.view.backgroundColor = [UIColor clearColor];
+
+ UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithTitle:@"Past Features"
+ style:UIBarButtonItemStyleBordered
+ target:self
+ action:@selector(showPastFeatures:)];
+ self.gvc.navigationItem.leftBarButtonItem = button;
+ [button release];
+
+ [self updateTitleAndHeader];
+}
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ // Return YES for supported orientations
+ return YES;
+}
+
+- (void)dealloc {
+ [poc release];
+ [pvc release];
+ [gvc release];
+ [_collection release];
+ [_guides release];
+ [loading release];
+
+ [super dealloc];
+}
+
+- (void)showPastFeatures:(id)sender {
+ if (poc.popoverVisible)
+ [poc dismissPopoverAnimated:YES];
+ else
+ [poc presentPopoverFromBarButtonItem:sender permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
+}
+
+- (NSInteger)numberOfCellsForGridViewController:(DMPGridViewController *)gridViewController {
+ return [[_collection objectForKey:@"guideids"] count];
+}
+- (NSString *)gridViewController:(DMPGridViewController *)gridViewController imageURLForCellAtIndex:(NSUInteger)index {
+ if (![_guides count])
+ return nil;
+ return [[[_guides objectAtIndex:index] valueForKey:@"image_url"] stringByAppendingString:@".medium"];
+}
+- (NSString *)gridViewController:(DMPGridViewController *)gridViewController titleForCellAtIndex:(NSUInteger)index {
+ if (![_guides count])
+ return @"Loading...";
+
+ NSDictionary *guide = [_guides objectAtIndex:index];
+ if ([guide objectForKey:@"title"] != [NSNull null])
+ return [guide objectForKey:@"title"];
+ return [NSString stringWithFormat:@"%@ %@", [guide valueForKey:@"device"], [guide valueForKey:@"thing"]];
+}
+- (void)gridViewController:(DMPGridViewController *)gridViewController tappedCellAtIndex:(NSUInteger)index {
+ NSInteger guideid = [[[_collection objectForKey:@"guideids"] objectAtIndex:index] intValue];
+ GuideViewController *vc = [[GuideViewController alloc] initWithGuideid:guideid];
+ [self presentModalViewController:vc animated:YES];
+ [vc release];
+}
+
+@end
View
35 Classes/GridViewController/DMPGridViewCell.h
@@ -0,0 +1,35 @@
+//
+// DMPGridViewCell.h
+// DMPGridViewController
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011. All rights reserved.
+//
+
+#import "DMPGridViewDelegate.h"
+
+typedef enum {
+ DMPGridViewCellStylePortrait1 = 0,
+ DMPGridViewCellStylePortrait2 = 1,
+ DMPGridViewCellStylePortrait3 = 2,
+ DMPGridViewCellStylePortrait4 = 3,
+ DMPGridViewCellStyleLandscape1 = 4,
+ DMPGridViewCellStyleLandscape2 = 5,
+ DMPGridViewCellStyleLandscape3 = 6,
+ DMPGridViewCellStyleLandscape4 = 7
+} DMPGridViewCellStyle;
+
+@interface DMPGridViewCell : UIView
+
+@property (nonatomic) DMPGridViewCellStyle style;
+@property (nonatomic) NSUInteger index;
+@property (nonatomic, assign) id<DMPGridViewDelegate> delegate;
+
+@property (nonatomic, retain) UIImageView *imageView;
+@property (nonatomic, retain) UILabel *textLabel;
+
++ (NSUInteger)cellsPerRowForStyle:(DMPGridViewCellStyle)style;
+- (id)initWithStyle:(DMPGridViewCellStyle)style index:(NSUInteger)index;
+- (void)setupView;
+
+@end
View
160 Classes/GridViewController/DMPGridViewCell.m
@@ -0,0 +1,160 @@
+//
+// DMPGridViewCell.m
+// DMPGridViewController
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011. All rights reserved.
+//
+
+#import "DMPGridViewCell.h"
+#import <QuartzCore/QuartzCore.h>
+
+@implementation DMPGridViewCell
+
+@synthesize style = _style, index = _index, delegate = _delegate;
+@synthesize imageView = _imageView, textLabel = _textLabel;
+
++ (NSUInteger)cellsPerRowForStyle:(DMPGridViewCellStyle)style {
+ NSUInteger result = 0;
+
+ switch (style) {
+ case DMPGridViewCellStylePortrait1:
+ result = 2;
+ break;
+ case DMPGridViewCellStylePortrait2:
+ result = 2;
+ break;
+ case DMPGridViewCellStylePortrait3:
+ result = 2;
+ break;
+ case DMPGridViewCellStylePortrait4:
+ result = 3;
+ break;
+ case DMPGridViewCellStyleLandscape1:
+ result = 3;
+ break;
+ case DMPGridViewCellStyleLandscape2:
+ result = 2;
+ break;
+ case DMPGridViewCellStyleLandscape3:
+ result = 3;
+ break;
+ case DMPGridViewCellStyleLandscape4:
+ result = 3;
+ break;
+ }
+
+ return result;
+}
+
+- (CGRect)pickFrame {
+ CGRect frame;
+
+ switch (_style) {
+ case DMPGridViewCellStylePortrait1:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 300.0, 225.0); break;
+ case 1: frame = CGRectMake(320.0, 10.0, 440.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStylePortrait2:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 440.0, 225.0); break;
+ case 1: frame = CGRectMake(460.0, 10.0, 300.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStylePortrait3:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 370.0, 225.0); break;
+ case 1: frame = CGRectMake(390.0, 10.0, 370.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStylePortrait4:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 243.0, 225.0); break;
+ case 1: frame = CGRectMake(263.0, 10.0, 243.0, 225.0); break;
+ case 2: frame = CGRectMake(516.0, 10.0, 244.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStyleLandscape1:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 280.0, 225.0); break;
+ case 1: frame = CGRectMake(300.0, 10.0, 424.0, 225.0); break;
+ case 2: frame = CGRectMake(734.0, 10.0, 280.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStyleLandscape2:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 497.0, 225.0); break;
+ case 1: frame = CGRectMake(517.0, 10.0, 497.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStyleLandscape3:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 328.0, 225.0); break;
+ case 1: frame = CGRectMake(348.0, 10.0, 328.0, 225.0); break;
+ case 2: frame = CGRectMake(686.0, 10.0, 328.0, 225.0); break;
+ }
+ break;
+ case DMPGridViewCellStyleLandscape4:
+ switch (_index) {
+ case 0: frame = CGRectMake( 10.0, 10.0, 328.0, 225.0); break;
+ case 1: frame = CGRectMake(348.0, 10.0, 328.0, 225.0); break;
+ case 2: frame = CGRectMake(686.0, 10.0, 328.0, 225.0); break;
+ }
+ break;
+ default:
+ frame = CGRectMake(10.0, 10.0, 300.0, 225.0);
+ break;
+ }
+ return frame;
+}
+
+- (id)initWithStyle:(DMPGridViewCellStyle)style index:(NSUInteger)index {
+ if ((self = [super init])) {
+ _style = style;
+ _index = index;
+
+ self.frame = [self pickFrame];
+ [self setupView];
+
+ // Add a drop shadow.
+ self.layer.masksToBounds = NO;
+ self.layer.shadowOffset = CGSizeMake(0.0, 2.0);
+ self.layer.shadowRadius = 6.0;
+ self.layer.shadowOpacity = 1;
+ self.layer.shadowPath = [UIBezierPath bezierPathWithRect:self.bounds].CGPath;
+ }
+ return self;
+}
+
+- (void)setupView {
+ CGFloat width = self.frame.size.width;
+ CGFloat height = self.frame.size.height;
+
+ // Image
+ self.imageView = [[[UIImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, width, height)] autorelease];
+ _imageView.backgroundColor = [UIColor whiteColor];
+ _imageView.contentMode = UIViewContentModeScaleAspectFill;
+ _imageView.clipsToBounds = YES;
+ [self addSubview:_imageView];
+
+ // Title
+ UIView *overlayView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 175.0, width, 50.0)];
+ overlayView.backgroundColor = [UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:0.5];
+ self.textLabel = [[[UILabel alloc] initWithFrame:CGRectMake(10.0, 5.0, width - 20.0, 40.0)] autorelease];
+ _textLabel.font = [UIFont boldSystemFontOfSize:16.0];
+ _textLabel.textColor = [UIColor whiteColor];
+ _textLabel.backgroundColor = [UIColor clearColor];
+ [overlayView addSubview:_textLabel];
+ [self addSubview:overlayView];
+ [overlayView release];
+}
+
+- (void)dealloc {
+ [_imageView release];
+ [_textLabel release];
+ [super dealloc];
+}
+
+@end
View
17 Classes/GridViewController/DMPGridViewController.h
@@ -0,0 +1,17 @@
+//
+// DMPGridViewController.h
+// DMPGridViewController
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011. All rights reserved.
+//
+
+#import "DMPGridViewDelegate.h"
+
+@interface DMPGridViewController : UITableViewController
+
+@property (nonatomic, assign) id<DMPGridViewDelegate> delegate;
+
+- (id)initWithDelegate:(id<DMPGridViewDelegate>)delegate;
+
+@end
View
150 Classes/GridViewController/DMPGridViewController.m
@@ -0,0 +1,150 @@
+//
+// DMPGridViewController.m
+// DMPGridViewController
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011. All rights reserved.
+//
+
+#import "DMPGridViewController.h"
+#import "DMPGridViewCell.h"
+#import "UIImageView+WebCache.h"
+
+@implementation DMPGridViewController
+
+@synthesize delegate = _delegate;
+
+- (id)initWithDelegate:(id<DMPGridViewDelegate>)delegate {
+ if ((self = [super init])) {
+ self.delegate = delegate;
+ }
+ return self;
+}
+
+- (void)didReceiveMemoryWarning {
+ // Releases the view if it doesn't have a superview.
+ [super didReceiveMemoryWarning];
+
+ // Release any cached data, images, etc that aren't in use.
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
+}
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ // Return YES for supported orientations
+ return YES;
+}
+
+- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
+ [self.tableView reloadData];
+}
+
+#pragma mark - Table view data source
+
+- (DMPGridViewCellStyle)styleForRow:(NSUInteger)row {
+ DMPGridViewCellStyle style;
+ if (UIInterfaceOrientationIsPortrait(self.interfaceOrientation)) {
+ style = (row + 1) % 4;
+ }
+ else {
+ style = (row + 1) % 3 + 4;
+ }
+ return style;
+}
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ NSInteger numberOfCells = [_delegate numberOfCellsForGridViewController:self];
+
+ NSUInteger rows = 0;
+ for (int i=0; numberOfCells>0; i++) {
+ numberOfCells -= [DMPGridViewCell cellsPerRowForStyle:[self styleForRow:i]];
+ rows++;
+ }
+
+ return rows;
+}
+
+- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
+ return 235.0;
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ // Choose a row style.
+ DMPGridViewCellStyle style = [self styleForRow:indexPath.row];
+
+ NSString *CellIdentifier = [NSString stringWithFormat:@"Cell%d", style];
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil) {
+ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
+ cell.selectionStyle = UITableViewCellSelectionStyleNone;
+ }
+ else {
+ // Remove any existing DMPGridViewCells since we don't reuse them.
+ for (UIView *v in cell.contentView.subviews)
+ [v removeFromSuperview];
+ }
+
+ // Configure the cell...
+ NSUInteger offset = 0;
+ for (NSUInteger i=0; i<indexPath.row; i++)
+ offset += [DMPGridViewCell cellsPerRowForStyle:[self styleForRow:i]];
+
+ NSInteger numberOfCells = [_delegate numberOfCellsForGridViewController:self];
+
+ for (NSUInteger i=0; i<[DMPGridViewCell cellsPerRowForStyle:style]; i++) {
+ if (offset + i >= numberOfCells)
+ break;
+
+ DMPGridViewCell *gridCell = [[DMPGridViewCell alloc] initWithStyle:style index:i];
+
+ // Image
+ if ([_delegate respondsToSelector:@selector(gridViewController:imageURLForCellAtIndex:)]) {
+ NSURL *url = [NSURL URLWithString:[_delegate gridViewController:self imageURLForCellAtIndex:offset + i]];
+ [gridCell.imageView setImageWithURL:url placeholderImage:[UIImage imageNamed:@"collectionsImagePlaceholder.png"]];
+ }
+ else if ([_delegate respondsToSelector:@selector(gridViewController:imageForCellAtIndex:)]) {
+ UIImage *image = [_delegate gridViewController:self imageForCellAtIndex:offset + i];
+ [gridCell.imageView setImage:image];
+ }
+
+ // Title
+ NSString *text = [_delegate gridViewController:self titleForCellAtIndex:offset + i];
+ [gridCell.textLabel setText:text];
+
+ // Handle taps.
+ gridCell.tag = offset + i;
+ UITapGestureRecognizer *g = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];
+ g.numberOfTapsRequired = 1;
+ g.numberOfTouchesRequired = 1;
+ [gridCell addGestureRecognizer:g];
+ [g release];
+
+ [cell.contentView addSubview:gridCell];
+ [gridCell release];
+ }
+
+ return cell;
+}
+
+- (void)tap:(UIGestureRecognizer *)gestureRecognizer {
+ [_delegate gridViewController:self tappedCellAtIndex:gestureRecognizer.view.tag];
+}
+
+
+@end
View
21 Classes/GridViewController/DMPGridViewDelegate.h
@@ -0,0 +1,21 @@
+//
+// DMPGridViewDelegate.h
+// DMPGridViewController
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011. All rights reserved.
+//
+
+@class DMPGridViewController;
+
+@protocol DMPGridViewDelegate <UITableViewDelegate>
+
+- (NSString *)gridViewController:(DMPGridViewController *)gridViewController titleForCellAtIndex:(NSUInteger)index;
+- (NSInteger)numberOfCellsForGridViewController:(DMPGridViewController *)gridViewController;
+- (void)gridViewController:(DMPGridViewController *)gridViewController tappedCellAtIndex:(NSUInteger)index;
+
+@optional
+- (NSString *)gridViewController:(DMPGridViewController *)gridViewController imageURLForCellAtIndex:(NSUInteger)index;
+- (UIImage *)gridViewController:(DMPGridViewController *)gridViewController imageForCellAtIndex:(NSUInteger)index;
+
+@end
View
7 Classes/GuideBookmarks.m
@@ -16,6 +16,7 @@
#import "User.h"
#import "SDWebImageManager.h"
#import "Config.h"
+#import "GANTracker.h"
#include <sys/xattr.h>
static GuideBookmarks *sharedBookmarks = nil;
@@ -60,6 +61,9 @@ - (Guide *)guideForGuideid:(NSNumber *)guideid {
}
- (void)addGuideid:(NSNumber *)guideid {
+ // Analytics
+ [[GANTracker sharedTracker] trackPageview:[NSString stringWithFormat:@"/favorites/add/%d", guideid] withError:NULL];
+
[queue setValue:@"add" forKey:[NSString stringWithFormat:@"%d_%d",
[[iFixitAPI sharedInstance].user.userid intValue],
[guideid intValue]]];
@@ -106,6 +110,9 @@ - (void)saveGuide:(Guide *)guide {
}
- (void)removeGuideid:(NSNumber *)guideid {
+ // Analytics
+ [[GANTracker sharedTracker] trackPageview:[NSString stringWithFormat:@"/favorites/remove/%d", guideid] withError:NULL];
+
NSString *key = [NSString stringWithFormat:@"%d_%d",
[[iFixitAPI sharedInstance].user.userid intValue],
[guideid intValue]];
View
12 Classes/GuideIntroViewController.m
@@ -52,17 +52,11 @@ - (void)viewDidLoad {
if (![self.guide.steps count])
swipeLabel.hidden = YES;
- // Set the background color, softening black and white by 5%.
- UIColor *bgColor = [Config currentConfig].backgroundColor;
- /*
- if ([bgColor isEqual:[UIColor blackColor]])
- bgColor = [UIColor colorWithRed:0.05 green:0.05 blue:0.05 alpha:1.0];
- else if ([bgColor isEqual:[UIColor whiteColor]])
- bgColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1.0];
- */
-
+ UIColor *bgColor = [UIColor clearColor];
+
self.view.backgroundColor = bgColor;
webView.backgroundColor = bgColor;
+ webView.opaque = NO;
// Load the intro contents as HTML.
NSString *header = [NSString stringWithFormat:@"<html><head><style type=\"text/css\"> %@ </style></head><body class=\"%@\">",
View
13 Classes/GuideStepViewController.m
@@ -37,17 +37,12 @@ - (void)viewDidLoad {
UIInterfaceOrientationIsLandscape(self.interfaceOrientation) ?
[self layoutLandscape] : [self layoutPortrait];
- // Set the background color, softening black and white by 15%.
- UIColor *bgColor = [Config currentConfig].backgroundColor;
- /*
- if ([bgColor isEqual:[UIColor blackColor]])
- bgColor = [UIColor colorWithRed:0.05 green:0.05 blue:0.05 alpha:1.0];
- else if ([bgColor isEqual:[UIColor whiteColor]])
- bgColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1.0];
- */
+ UIColor *bgColor = [UIColor clearColor];
+
self.view.backgroundColor = bgColor;
webView.backgroundColor = bgColor;
-
+ webView.opaque = NO;
+
NSString *stepTitle = [NSString stringWithFormat:@"Step %d", self.step.number];
if (![self.step.title isEqual:@""])
stepTitle = [NSString stringWithFormat:@"%@ - %@", stepTitle, self.step.title];
View
11 Classes/GuideViewController.m
@@ -53,16 +53,13 @@ - (id)initWithGuideid:(NSInteger)guideid guide:(Guide *)guide {
- (void)viewDidLoad {
[super viewDidLoad];
- // Soften black and white by 5%.
+ // Replace black with concrete.
UIColor *bgColor = [Config currentConfig].backgroundColor;
- /*
- if ([bgColor isEqual:[UIColor blackColor]])
- bgColor = [UIColor colorWithRed:0.05 green:0.05 blue:0.05 alpha:1.0];
- else if ([bgColor isEqual:[UIColor whiteColor]])
- bgColor = [UIColor colorWithRed:0.95 green:0.95 blue:0.95 alpha:1.0];
- */
+ //if ([bgColor isEqual:[UIColor blackColor]])
+ // bgColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"concreteBackground.png"]];
self.view.backgroundColor = bgColor;
+
if ([[Config currentConfig].backgroundColor isEqual:[UIColor whiteColor]]) {
navBar.tintColor = [UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad ?
nil : [Config currentConfig].toolbarColor;
View
6 Classes/ListViewController.m
@@ -50,7 +50,11 @@ - (void)viewDidLoad {
UIToolbar *toolbar = [[UIToolbar alloc] init];
if ([UIDevice currentDevice].userInterfaceIdiom == UIUserInterfaceIdiomPad) {
- toolbar.frame = CGRectMake(0, 768 - 20 - 44, 320, 44);
+ int diff = 20 + 44;
+ // Adjust for iFixit's tab bar.
+ if (![Config currentConfig].dozuki)
+ diff += 49;
+ toolbar.frame = CGRectMake(0, 768 - diff, 320, 44);
}
else {
toolbar.frame = CGRectMake(0, 480 - 43, 320, 44);
View
17 Classes/PastFeaturesViewController.h
@@ -0,0 +1,17 @@
+//
+// PastFeaturesViewController.h
+// iFixit
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011 iFixit. All rights reserved.
+//
+
+#import "PastFeaturesViewDelegate.h"
+
+@interface PastFeaturesViewController : UITableViewController
+
+@property (nonatomic, retain) NSMutableArray *collections;
+@property (nonatomic, retain) NSDateFormatter *dateFormat;
+@property (nonatomic, assign) id<PastFeaturesViewDelegate> delegate;
+
+@end
View
94 Classes/PastFeaturesViewController.m
@@ -0,0 +1,94 @@
+//
+// PastFeaturesViewController.m
+// iFixit
+//
+// Created by David Patierno on 11/7/11.
+// Copyright (c) 2011 iFixit. All rights reserved.
+//
+
+#import "PastFeaturesViewController.h"
+#import "PastFeaturesViewDelegate.h"
+
+@implementation PastFeaturesViewController
+
+@synthesize collections = _collections, dateFormat, delegate = _delegate;
+
+- (id)init {
+ if ((self = [super initWithStyle:UITableViewStyleGrouped])) {
+ self.title = @"Past Features";
+ self.collections = [NSMutableArray array];
+
+ self.dateFormat = [[[NSDateFormatter alloc] init] autorelease];
+ [dateFormat setDateFormat:@"MM/dd"];
+ }
+ return self;
+}
+
+- (void)setCollections:(NSMutableArray *)collections {
+ [_collections release];
+ _collections = [collections retain];
+ [self.tableView reloadData];
+}
+
+#pragma mark - View lifecycle
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+
+}
+
+- (void)viewDidUnload {
+ [super viewDidUnload];
+ // Release any retained subviews of the main view.
+ // e.g. self.myOutlet = nil;
+}
+
+- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
+ // Return YES for supported orientations
+ return YES;
+}
+
+#pragma mark - Table view data source
+
+- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
+ // Return the number of sections.
+ return 1;
+}
+
+- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
+ // Return the number of rows in the section.
+ return [self.collections count];
+}
+
+- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
+ static NSString *CellIdentifier = @"Cell";
+
+ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
+ if (cell == nil) {
+ cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
+ }
+
+ // Configure the cell...
+ NSDictionary *collection = [self.collections objectAtIndex:indexPath.row];
+ NSDate *date = [NSDate dateWithTimeIntervalSince1970:[[collection valueForKey:@"date"] intValue]];
+ NSString *title = [collection valueForKey:@"title"];
+
+ cell.textLabel.text = [NSString stringWithFormat:@"%@ %@",
+ [dateFormat stringFromDate:date], title];
+
+ return cell;
+}
+
+#pragma mark - Table view delegate
+
+- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
+ _delegate.collection = [_collections objectAtIndex:indexPath.row];
+ [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
+}
+
+- (void)dealloc {
+ [_collections release];
+ [super dealloc];
+}
+
+@end
View
13 Classes/PastFeaturesViewDelegate.h
@@ -0,0 +1,13 @@
+//
+// PastFeaturesViewDelegate.h
+// iFixit
+//
+// Created by David Patierno on 11/8/11.
+// Copyright (c) 2011 iFixit. All rights reserved.
+//
+
+@protocol PastFeaturesViewDelegate <NSObject>
+
+@property (nonatomic, retain) NSDictionary *collection;
+
+@end
View
46 Classes/SDWebImage/.svn/entries
@@ -94,14 +94,14 @@ has-props
1084
-SDWebImageManagerDelegate.h
+SDImageCache.h
file
2011-08-03T01:47:55.000000Z
-9e595b9e92b222be479a511f7060c4c2
+869deb374a7b6fc0c1c1cf643da28f68
2011-04-27T16:53:52.665198Z
11327
dpatierno
@@ -126,16 +126,16 @@ has-props
-417
+1127
-SDImageCache.h
+SDWebImageManagerDelegate.h
file
2011-08-03T01:47:55.000000Z
-869deb374a7b6fc0c1c1cf643da28f68
+9e595b9e92b222be479a511f7060c4c2
2011-04-27T16:53:52.665198Z
11327
dpatierno
@@ -160,18 +160,18 @@ has-props
-1127
+417
-SDWebImageManager.h
+SDImageCache.m
file
-2011-08-03T01:47:55.000000Z
-4726886eef81f80dac8cb96ee5b2c881
-2011-04-27T16:53:52.665198Z
-11327
+2011-11-04T23:01:11.000000Z
+c4f3597eeacdeb3ec9dac99ff5e7d702
+2011-07-06T01:00:19.888536Z
+11786
dpatierno
has-props
@@ -194,18 +194,18 @@ has-props
-942
+11132
-SDImageCache.m
+SDWebImageManager.h
file
2011-08-03T01:47:55.000000Z
-c4f3597eeacdeb3ec9dac99ff5e7d702
-2011-07-06T01:00:19.888536Z
-11786
+4726886eef81f80dac8cb96ee5b2c881
+2011-04-27T16:53:52.665198Z
+11327
dpatierno
has-props
@@ -228,16 +228,16 @@ has-props
-11132
+942
-UIButton+WebCache.h
+README.md
file
2011-08-03T01:47:55.000000Z
-d85dc9af6fcc58ea5c934b0b8f4818c3
+f336d3e6ebd9938f5c81904348d87313
2011-04-27T16:53:52.665198Z
11327
dpatierno
@@ -262,16 +262,16 @@ has-props
-483
+8097
-README.md
+UIButton+WebCache.h
file
2011-08-03T01:47:55.000000Z
-f336d3e6ebd9938f5c81904348d87313
+d85dc9af6fcc58ea5c934b0b8f4818c3
2011-04-27T16:53:52.665198Z
11327
dpatierno
@@ -296,7 +296,7 @@ has-props
-8097
+483
SDWebImageManager.m
file
View
2  Classes/iFixitAPI.h
@@ -18,9 +18,11 @@
// Anonymous
- (void)getSitesWithLimit:(NSUInteger)limit andOffset:(NSUInteger)offset forObject:(id)object withSelector:(SEL)selector;
+- (void)getCollectionsWithLimit:(NSUInteger)limit andOffset:(NSUInteger)offset forObject:(id)object withSelector:(SEL)selector;
- (void)getGuide:(NSInteger)guideid forObject:(id)object withSelector:(SEL)selector;
- (void)getAreas:(NSString *)parent forObject:(id)object withSelector:(SEL)selector;
- (void)getGuides:(NSString *)type forObject:(id)object withSelector:(SEL)selector;
+- (void)getGuidesByIds:(NSArray *)guideids forObject:(id)object withSelector:(SEL)selector;
- (void)getSearchResults:(NSString *)search forObject:(id)object withSelector:(SEL)selector;
- (void)getDevice:(NSString *)device forObject:(id)object withSelector:(SEL)selector;
View
29 Classes/iFixitAPI.m
@@ -80,6 +80,20 @@ - (void)getSitesWithLimit:(NSUInteger)limit andOffset:(NSUInteger)offset forObje
[request startAsynchronous];
}
+- (void)getCollectionsWithLimit:(NSUInteger)limit andOffset:(NSUInteger)offset forObject:(id)object withSelector:(SEL)selector {
+ NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/collections?limit=%d&offset=%d", [Config host], limit, offset];
+
+ __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
+ [request setCompletionBlock:^{
+ NSArray *results = [[request responseString] JSONValue];
+ [object performSelector:selector withObject:results];
+ }];
+ [request setFailedBlock:^{
+ [object performSelector:selector withObject:nil];
+ }];
+ [request startAsynchronous];
+}
+
- (void)getGuide:(NSInteger)guideid forObject:(id)object withSelector:(SEL)selector {
NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/guide/%d", [Config host], guideid];
@@ -148,6 +162,21 @@ - (void)getGuides:(NSString *)type forObject:(id)object withSelector:(SEL)select
[request startAsynchronous];
}
+- (void)getGuidesByIds:(NSArray *)guideids forObject:(id)object withSelector:(SEL)selector {
+ NSString *guideidsString = [guideids componentsJoinedByString:@","];
+ NSString *url = [NSString stringWithFormat:@"http://%@/api/0.1/guides?guideids=%@", [Config host], guideidsString];
+
+ __block ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:[NSURL URLWithString:url]];
+ [request setCompletionBlock:^{
+ NSArray *results = [[request responseString] JSONValue];
+ [object performSelector:selector withObject:results];
+ }];
+ [request setFailedBlock:^{
+ [object performSelector:selector withObject:nil];
+ }];
+ [request startAsynchronous];
+}
+
- (void)getSearchResults:(NSString *)search forObject:(id)object withSelector:(SEL)selector {
search = [search stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
search = [search stringByReplacingOccurrencesOfString:@"&" withString:@"%26"];
View
1  Classes/iFixitAppDelegate.h
@@ -31,7 +31,6 @@
- (UIViewController *)iPadRoot;
- (UIViewController *)iPhoneRoot;
- (void)showBrowser;
-- (void)showSplash;
- (void)loadSite:(NSString *)domain;
- (void)loadSite:(NSString *)domain withColor:(UIColor *)color;
View
45 Classes/iFixitAppDelegate.m
@@ -13,6 +13,7 @@
#import "AreasViewController.h"
#import "DetailViewController.h"
#import "SplashViewController.h"
+#import "FeaturedViewController.h"
#import "DozukiSplashViewController.h"
#import "DozukiInfoViewController.h"
#import "GuideBookmarks.h"
@@ -39,6 +40,9 @@ @implementation iFixitAppDelegate
#pragma mark Application lifecycle
- (void)setupAnalytics {
+ if ([Config currentConfig].dozuki)
+ return;
+
[[GANTracker sharedTracker] startTrackerWithAccountID:@"UA-30506-9"
dispatchPeriod:kGANDispatchPeriodSec
delegate:nil];
@@ -48,19 +52,11 @@ - (void)setupAnalytics {
value:[UIDevice currentDevice].model
withError:NULL];
[[GANTracker sharedTracker] setCustomVariableAtIndex:2
- name:@"name"
- value:[UIDevice currentDevice].name
- withError:NULL];
- [[GANTracker sharedTracker] setCustomVariableAtIndex:3
name:@"systemVersion"
value:[UIDevice currentDevice].systemVersion
withError:NULL];
- [[GANTracker sharedTracker] trackEvent:@"iOS Launch"
- action:[NSString stringWithFormat:@"Launch %@", [UIDevice currentDevice].model]
- label:@"Launch"
- value:99
- withError:NULL];
+ [[GANTracker sharedTracker] trackPageview:[NSString stringWithFormat:@"/launch/%@", [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]] withError:NULL];
}
// Override point for customization after app launch.
@@ -72,6 +68,10 @@ - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(
[TestFlight takeOff:@"c74d40d00ff8789a3c63bc4c2ee210e6_MTcxMjIwMTEtMDktMTIgMTc6MzY6MzcuNzIyMTQ3"];
[self setupAnalytics];
+ /* iOS 5 appearance */
+ if ([UITabBar respondsToSelector:@selector(appearance)])
+ [[UITabBar appearance] setBackgroundImage:[UIImage imageNamed:@"customTabBarBackground.png"]];
+
/* Setup and launch. */
self.window.rootViewController = nil;
firstLoad = YES;
@@ -179,13 +179,23 @@ - (UIViewController *)iPadRoot {
areasViewController.delegate = self;
- // Inject the splash view controller if necessary.
- if ([Config currentConfig].site != ConfigDozuki) {
- self.splashViewController = [[SplashViewController alloc] initWithNibName:@"SplashView" bundle:nil];
- [self showSplash];
- }
+ // Dozuki ends here, but iFixit gets a fancy tab bar at the bottom.
+ if ([Config currentConfig].dozuki)
+ return splitViewController;
+
+ // Create the featured view controller
+ FeaturedViewController *featuredViewController = [[FeaturedViewController alloc] init];
- return splitViewController;
+ // Initialize the tab bar items.
+ splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Repair" image:nil tag:0] autorelease];
+ featuredViewController.tabBarItem = [[[UITabBarItem alloc] initWithTabBarSystemItem:UITabBarSystemItemFeatured tag:0] autorelease];
+
+ // Create the tab bar.
+ UITabBarController *tbc = [[UITabBarController alloc] init];
+ tbc.viewControllers = [NSArray arrayWithObjects:featuredViewController, splitViewController, nil];
+ [featuredViewController release];
+
+ return [tbc autorelease];
}
- (UIViewController *)iPhoneRoot {
@@ -204,11 +214,6 @@ - (void)showBrowser {
[controllers replaceObjectAtIndex:1 withObject:detailViewController];
splitViewController.viewControllers = [NSArray arrayWithArray:controllers];
}
-- (void)showSplash {
- NSMutableArray *controllers = [splitViewController.viewControllers mutableCopy];
- [controllers replaceObjectAtIndex:1 withObject:splashViewController];
- splitViewController.viewControllers = [NSArray arrayWithArray:controllers];
-}
- (void)loadSite:(NSString *)domain {
[self loadSite:domain withColor:nil];
View
BIN  Graphics/collectionsHeaderGradient.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  Graphics/collectionsImagePlaceholder.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  Graphics/concreteBackground.png
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
View
BIN  Lobster.ttf
Binary file not shown
View
2  css/ifixit_intro.css
@@ -1,5 +1,5 @@
html, body {
- background-color: black;
+ background-color: transparent;
color: white;
font-family: "Helvetica", sans-serif;
margin: 0px 10px;
View
2  css/ifixit_step.css
@@ -1,5 +1,5 @@
html, body {
- background-color: black;
+ background-color: transparent;
color: white;
font-family: "Helvetica", sans-serif;
margin: 0;
View
14 iFixit-Info.plist
@@ -6,8 +6,6 @@
<string>English</string>
<key>CFBundleDisplayName</key>
<string>iFixit</string>
- <key>CFBundleDocumentTypes</key>
- <array/>
<key>CFBundleExecutable</key>
<string>${EXECUTABLE_NAME}</string>
<key>CFBundleIconFiles</key>
@@ -25,6 +23,8 @@
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
+ <key>CFBundleShortVersionString</key>
+ <string>3</string>
<key>CFBundleSignature</key>
<string>????</string>
<key>CFBundleURLTypes</key>
@@ -41,11 +41,15 @@
</dict>
</array>
<key>CFBundleVersion</key>
- <string>1.1.1</string>
+ <string>1.2</string>
<key>LSRequiresIPhoneOS</key>
<true/>
<key>NSMainNibFile</key>
<string>MainWindow</string>
+ <key>UIAppFonts</key>
+ <array>
+ <string>Lobster.ttf</string>
+ </array>
<key>UIInterfaceOrientation</key>
<string>UIInterfaceOrientationPortrait</string>
<key>UIPrerenderedIcon</key>
@@ -59,9 +63,5 @@
<string>UIInterfaceOrientationLandscapeLeft</string>
<string>UIInterfaceOrientationPortraitUpsideDown</string>
</array>
- <key>UTExportedTypeDeclarations</key>
- <array/>
- <key>UTImportedTypeDeclarations</key>
- <array/>
</dict>
</plist>
View
70 iFixit.xcodeproj/project.pbxproj
@@ -94,6 +94,8 @@
DA8860E21427DD490030F52C /* SVWebViewController.bundle in Resources */ = {isa = PBXBuildFile; fileRef = DA8860DF1427DD490030F52C /* SVWebViewController.bundle */; };
DA8860E31427DD490030F52C /* SVWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8860E11427DD490030F52C /* SVWebViewController.m */; };
DA8860E51427DE590030F52C /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DA8860E41427DE590030F52C /* MessageUI.framework */; };
+ DA8F60061469B29700482D29 /* DMPGridViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F60021469B29700482D29 /* DMPGridViewCell.m */; };
+ DA8F60071469B29700482D29 /* DMPGridViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DA8F60041469B29700482D29 /* DMPGridViewController.m */; };
DA994894142ABA7D00E4167D /* dozukiSplash.png in Resources */ = {isa = PBXBuildFile; fileRef = DA994893142ABA7D00E4167D /* dozukiSplash.png */; };
DA994896142ABB7700E4167D /* dozukiSplash~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = DA994895142ABB7700E4167D /* dozukiSplash~ipad.png */; };
DA99489B142ABDDB00E4167D /* dozukiGetStarted~ipad.png in Resources */ = {isa = PBXBuildFile; fileRef = DA994897142ABDDB00E4167D /* dozukiGetStarted~ipad.png */; };
@@ -117,6 +119,8 @@
DAAAC74A1433F43C00CB90AF /* GuideStepView~ipad.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAAAC7491433F43C00CB90AF /* GuideStepView~ipad.xib */; };
DAAAC74D1433F49300CB90AF /* AreasView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAAAC74B1433F49000CB90AF /* AreasView.xib */; };
DAAAC74E1433F49300CB90AF /* DetailView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAAAC74C1433F49100CB90AF /* DetailView.xib */; };
+ DAAED15914686A2D00C476C1 /* FeaturedViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAAED15714686A2D00C476C1 /* FeaturedViewController.m */; };
+ DAAED15E1468710C00C476C1 /* PastFeaturesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAAED15D1468710C00C476C1 /* PastFeaturesViewController.m */; };
DAAFB80012BEE79C003ACCD0 /* SplashViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAAFB7FE12BEE79C003ACCD0 /* SplashViewController.m */; };
DAAFB80112BEE79C003ACCD0 /* SplashView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DAAFB7FF12BEE79C003ACCD0 /* SplashView.xib */; };
DAB9343A137228AD00B6AA9A /* LoginViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DAB93439137228AD00B6AA9A /* LoginViewController.m */; };
@@ -125,6 +129,11 @@
DABE9CF513C54D2200B778FE /* GuideView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DABE9CF413C54D2200B778FE /* GuideView.xib */; };
DABE9CF713C5519800B778FE /* GuideIntroView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DABE9CF613C5519800B778FE /* GuideIntroView.xib */; };
DABE9CF913C5535200B778FE /* GuideStepView.xib in Resources */ = {isa = PBXBuildFile; fileRef = DABE9CF813C5535200B778FE /* GuideStepView.xib */; };
+ DAC0C19D146B182000EF42DC /* collectionsImagePlaceholder.png in Resources */ = {isa = PBXBuildFile; fileRef = DAC0C19C146B182000EF42DC /* collectionsImagePlaceholder.png */; };
+ DAC0C1A1146B37E000EF42DC /* concreteBackground.png in Resources */ = {isa = PBXBuildFile; fileRef = DAC0C1A0146B37E000EF42DC /* concreteBackground.png */; };
+ DAC0C1A3146B3F6F00EF42DC /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = DAC0C1A2146B3F6F00EF42DC /* QuartzCore.framework */; };
+ DAC0C1A5146B411A00EF42DC /* collectionsHeaderGradient.png in Resources */ = {isa = PBXBuildFile; fileRef = DAC0C1A4146B411A00EF42DC /* collectionsHeaderGradient.png */; };
+ DAC0C1A7146B49AA00EF42DC /* Lobster.ttf in Resources */ = {isa = PBXBuildFile; fileRef = DAC0C1A6146B49AA00EF42DC /* Lobster.ttf */; };
DAC26873140842B300752982 /* backtosites.png in Resources */ = {isa = PBXBuildFile; fileRef = DAC26871140842B300752982 /* backtosites.png */; };
DAC26874140842B300752982 /* backtosites@2x.png in Resources */ = {isa = PBXBuildFile; fileRef = DAC26872140842B300752982 /* backtosites@2x.png */; };
DACE44381353B87E00F78360 /* x-icon.png in Resources */ = {isa = PBXBuildFile; fileRef = DACE44361353B87E00F78360 /* x-icon.png */; };
@@ -291,6 +300,12 @@
DA8860E01427DD490030F52C /* SVWebViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SVWebViewController.h; sourceTree = "<group>"; };
DA8860E11427DD490030F52C /* SVWebViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SVWebViewController.m; sourceTree = "<group>"; };
DA8860E41427DE590030F52C /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = System/Library/Frameworks/MessageUI.framework; sourceTree = SDKROOT; };
+ DA8F60011469B29700482D29 /* DMPGridViewCell.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DMPGridViewCell.h; path = GridViewController/DMPGridViewCell.h; sourceTree = "<group>"; };
+ DA8F60021469B29700482D29 /* DMPGridViewCell.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DMPGridViewCell.m; path = GridViewController/DMPGridViewCell.m; sourceTree = "<group>"; };
+ DA8F60031469B29700482D29 /* DMPGridViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DMPGridViewController.h; path = GridViewController/DMPGridViewController.h; sourceTree = "<group>"; };
+ DA8F60041469B29700482D29 /* DMPGridViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = DMPGridViewController.m; path = GridViewController/DMPGridViewController.m; sourceTree = "<group>"; };
+ DA8F60051469B29700482D29 /* DMPGridViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = DMPGridViewDelegate.h; path = GridViewController/DMPGridViewDelegate.h; sourceTree = "<group>"; };
+ DA8F60081469F8E600482D29 /* PastFeaturesViewDelegate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PastFeaturesViewDelegate.h; sourceTree = "<group>"; };
DA994893142ABA7D00E4167D /* dozukiSplash.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = dozukiSplash.png; path = Graphics/dozukiSplash.png; sourceTree = "<group>"; };
DA994895142ABB7700E4167D /* dozukiSplash~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dozukiSplash~ipad.png"; path = "Graphics/dozukiSplash~ipad.png"; sourceTree = "<group>"; };
DA994897142ABDDB00E4167D /* dozukiGetStarted~ipad.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "dozukiGetStarted~ipad.png"; path = "Graphics/dozukiGetStarted~ipad.png"; sourceTree = "<group>"; };
@@ -320,6 +335,10 @@
DAAAC7491433F43C00CB90AF /* GuideStepView~ipad.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = "GuideStepView~ipad.xib"; sourceTree = "<group>"; };
DAAAC74B1433F49000CB90AF /* AreasView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = AreasView.xib; sourceTree = "<group>"; };
DAAAC74C1433F49100CB90AF /* DetailView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = DetailView.xib; sourceTree = "<group>"; };
+ DAAED15614686A2D00C476C1 /* FeaturedViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FeaturedViewController.h; sourceTree = "<group>"; };
+ DAAED15714686A2D00C476C1 /* FeaturedViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = FeaturedViewController.m; sourceTree = "<group>"; };
+ DAAED15C1468710C00C476C1 /* PastFeaturesViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PastFeaturesViewController.h; sourceTree = "<group>"; };
+ DAAED15D1468710C00C476C1 /* PastFeaturesViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = PastFeaturesViewController.m; sourceTree = "<group>"; };
DAAFB7FD12BEE79C003ACCD0 /* SplashViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SplashViewController.h; sourceTree = "<group>"; };
DAAFB7FE12BEE79C003ACCD0 /* SplashViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SplashViewController.m; sourceTree = "<group>"; };
DAAFB7FF12BEE79C003ACCD0 /* SplashView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = SplashView.xib; sourceTree = "<group>"; };
@@ -330,6 +349,11 @@
DABE9CF413C54D2200B778FE /* GuideView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GuideView.xib; sourceTree = "<group>"; };
DABE9CF613C5519800B778FE /* GuideIntroView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GuideIntroView.xib; sourceTree = "<group>"; };
DABE9CF813C5535200B778FE /* GuideStepView.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = GuideStepView.xib; sourceTree = "<group>"; };
+ DAC0C19C146B182000EF42DC /* collectionsImagePlaceholder.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = collectionsImagePlaceholder.png; path = Graphics/collectionsImagePlaceholder.png; sourceTree = "<group>"; };
+ DAC0C1A0146B37E000EF42DC /* concreteBackground.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = concreteBackground.png; path = Graphics/concreteBackground.png; sourceTree = "<group>"; };
+ DAC0C1A2146B3F6F00EF42DC /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = System/Library/Frameworks/QuartzCore.framework; sourceTree = SDKROOT; };
+ DAC0C1A4146B411A00EF42DC /* collectionsHeaderGradient.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = collectionsHeaderGradient.png; path = Graphics/collectionsHeaderGradient.png; sourceTree = "<group>"; };
+ DAC0C1A6146B49AA00EF42DC /* Lobster.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = Lobster.ttf; sourceTree = "<group>"; };
DAC26871140842B300752982 /* backtosites.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = backtosites.png; path = Graphics/backtosites.png; sourceTree = "<group>"; };
DAC26872140842B300752982 /* backtosites@2x.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "backtosites@2x.png"; path = "Graphics/backtosites@2x.png"; sourceTree = "<group>"; };
DACE44361353B87E00F78360 /* x-icon.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; name = "x-icon.png"; path = "Graphics/x-icon.png"; sourceTree = "<group>"; };
@@ -363,6 +387,7 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
+ DAC0C1A3146B3F6F00EF42DC /* QuartzCore.framework in Frameworks */,
DAAAC7481433E03B00CB90AF /* libsqlite3.dylib in Frameworks */,
DA8860E51427DE590030F52C /* MessageUI.framework in Frameworks */,
DA0A0C16138B07DA0027721E /* libxml2.2.dylib in Frameworks */,
@@ -392,6 +417,7 @@
C1C894F9121B44FA0036FAFC /* Image View */,
DA59293413FB250800504CD3 /* Dozuki */,
DAF3AF511422881B00913238 /* Navigation */,
+ DAAED15B146870E800C476C1 /* Featured Collections */,
DA881854134A5AFE004387CE /* BookmarksViewController.h */,
DA881855134A5AFE004387CE /* BookmarksViewController.m */,
DA881856134A5AFE004387CE /* BookmarksView.xib */,
@@ -434,6 +460,7 @@
29B97315FDCFA39411CA2CEA /* Other Sources */ = {
isa = PBXGroup;
children = (
+ DAC0C1A6146B49AA00EF42DC /* Lobster.ttf */,
DAE7D7C0142A9FC900C07529 /* icon57.png */,
DAE7D7C1142A9FC900C07529 /* icon72.png */,
DAE7D7C2142A9FC900C07529 /* icon114.png */,
@@ -463,6 +490,7 @@
29B97323FDCFA39411CA2CEA /* Frameworks */ = {
isa = PBXGroup;
children = (
+ DAC0C1A2146B3F6F00EF42DC /* QuartzCore.framework */,
DA8860E41427DE590030F52C /* MessageUI.framework */,
1DF5F4DF0D08C38300B7A737 /* UIKit.framework */,
1D30AB110D05D00D00671497 /* Foundation.framework */,
@@ -530,6 +558,9 @@
isa = PBXGroup;
children = (
DA9948AB142ACC6000E4167D /* Dozuki Splash */,
+ DAC0C1A4146B411A00EF42DC /* collectionsHeaderGradient.png */,
+ DAC0C19C146B182000EF42DC /* collectionsImagePlaceholder.png */,
+ DAC0C1A0146B37E000EF42DC /* concreteBackground.png */,
DAC26871140842B300752982 /* backtosites.png */,
DAC26872140842B300752982 /* backtosites@2x.png */,
DAB9344313722AEB00B6AA9A /* login.png */,
@@ -697,6 +728,18 @@
path = SVWebViewController/SVWebViewController;
sourceTree = SOURCE_ROOT;
};
+ DA8F60001469B25B00482D29 /* GridViewController */ = {
+ isa = PBXGroup;
+ children = (
+ DA8F60011469B29700482D29 /* DMPGridViewCell.h */,
+ DA8F60021469B29700482D29 /* DMPGridViewCell.m */,
+ DA8F60031469B29700482D29 /* DMPGridViewController.h */,
+ DA8F60041469B29700482D29 /* DMPGridViewController.m */,
+ DA8F60051469B29700482D29 /* DMPGridViewDelegate.h */,
+ );
+ name = GridViewController;
+ sourceTree = "<group>";
+ };
DA9948AB142ACC6000E4167D /* Dozuki Splash */ = {
isa = PBXGroup;
children = (
@@ -743,6 +786,19 @@
path = GAnalytics;
sourceTree = SOURCE_ROOT;
};
+ DAAED15B146870E800C476C1 /* Featured Collections */ = {
+ isa = PBXGroup;
+ children = (
+ DA8F60001469B25B00482D29 /* GridViewController */,
+ DAAED15614686A2D00C476C1 /* FeaturedViewController.h */,
+ DAAED15714686A2D00C476C1 /* FeaturedViewController.m */,
+ DAAED15C1468710C00C476C1 /* PastFeaturesViewController.h */,
+ DAAED15D1468710C00C476C1 /* PastFeaturesViewController.m */,
+ DA8F60081469F8E600482D29 /* PastFeaturesViewDelegate.h */,
+ );
+ name = "Featured Collections";
+ sourceTree = "<group>";
+ };
DAC88AD51427E10B00D33C00 /* Packages */ = {
isa = PBXGroup;
children = (
@@ -930,6 +986,10 @@
DAAAC74A1433F43C00CB90AF /* GuideStepView~ipad.xib in Resources */,
DAAAC74D1433F49300CB90AF /* AreasView.xib in Resources */,
DAAAC74E1433F49300CB90AF /* DetailView.xib in Resources */,
+ DAC0C19D146B182000EF42DC /* collectionsImagePlaceholder.png in Resources */,
+ DAC0C1A1146B37E000EF42DC /* concreteBackground.png in Resources */,
+ DAC0C1A5146B411A00EF42DC /* collectionsHeaderGradient.png in Resources */,
+ DAC0C1A7146B49AA00EF42DC /* Lobster.ttf in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -996,6 +1056,10 @@
DA8860DD1427DD2A0030F52C /* Reachability.m in Sources */,
DA8860E31427DD490030F52C /* SVWebViewController.m in Sources */,
DA0877BD142D3E6200954482 /* UIColor+Hex.m in Sources */,
+ DAAED15914686A2D00C476C1 /* FeaturedViewController.m in Sources */,
+ DAAED15E1468710C00C476C1 /* PastFeaturesViewController.m in Sources */,
+ DA8F60061469B29700482D29 /* DMPGridViewCell.m in Sources */,
+ DA8F60071469B29700482D29 /* DMPGridViewController.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -1024,7 +1088,7 @@
"\"$(SRCROOT)/GAnalytics\"",
);
PRODUCT_NAME = iFixit;
- "PROVISIONING_PROFILE[sdk=iphoneos*]" = "5DF6B989-29D2-477D-AEF8-1DA413BFA5BB";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "8081545A-70C0-470B-B9AE-0B055086A910";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
@@ -1049,7 +1113,7 @@
"\"$(SRCROOT)/GAnalytics\"",
);
PRODUCT_NAME = iFixit;
- "PROVISIONING_PROFILE[sdk=iphoneos*]" = "618705B0-6E6B-4509-8414-3852B0A51B15";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "67F817B6-EA39-44E6-9311-857446D92110";
TARGETED_DEVICE_FAMILY = "1,2";
VALIDATE_PRODUCT = YES;
};
@@ -1133,7 +1197,7 @@
"\"$(SRCROOT)/GAnalytics\"",
);
PRODUCT_NAME = iFixit;
- "PROVISIONING_PROFILE[sdk=iphoneos*]" = "618705B0-6E6B-4509-8414-3852B0A51B15";
+ "PROVISIONING_PROFILE[sdk=iphoneos*]" = "67F817B6-EA39-44E6-9311-857446D92110";
TARGETED_DEVICE_FAMILY = "1,2";
};
name = "Ad-Hoc";
View
2  main.m
@@ -1,4 +1,4 @@
- //
+//
// main.m
// iFixit
//
Please sign in to comment.
Something went wrong with that request. Please try again.