forked from B-Sides/ELCImagePickerController
-
Notifications
You must be signed in to change notification settings - Fork 1
/
ELCAssetTablePicker.m
217 lines (158 loc) · 5.55 KB
/
ELCAssetTablePicker.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
//
// AssetTablePicker.m
//
// Created by Matt Tuzzolo on 2/15/11.
// Copyright 2011 ELC Technologies. All rights reserved.
//
#import "ELCAssetTablePicker.h"
#import "ELCAssetCell.h"
#import "ELCAsset.h"
#import "ELCAlbumPickerController.h"
@interface ELCAssetTablePicker ()
@property (nonatomic, strong) NSMutableSet *selectedAssets;
@end
@implementation ELCAssetTablePicker
@synthesize parent;
@synthesize selectedAssetsLabel;
@synthesize assetGroup, elcAssets;
-(void)viewDidLoad {
_selectedAssets = [[NSMutableSet alloc] init];
[self.tableView setSeparatorColor:[UIColor clearColor]];
[self.tableView setAllowsSelection:NO];
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
self.elcAssets = tempArray;
[tempArray release];
UIBarButtonItem *doneButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(doneAction:)] autorelease];
[self.navigationItem setRightBarButtonItem:doneButtonItem];
[self.navigationItem setTitle:NSLocalizedString(@"Loading...", @"Loading...")];
[self performSelectorInBackground:@selector(preparePhotos) withObject:nil];
// Show partial while full list loads
[self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:.5];
}
-(void)preparePhotos {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"enumerating photos");
[self.assetGroup enumerateAssetsUsingBlock:^(ALAsset *result, NSUInteger index, BOOL *stop)
{
if(result == nil)
{
return;
}
ELCAsset *elcAsset = [[[ELCAsset alloc] initWithAsset:result] autorelease];
[elcAsset setParent:self];
[self.elcAssets addObject:elcAsset];
}];
NSLog(@"done enumerating photos");
[self.tableView reloadData];
[self.navigationItem setTitle:NSLocalizedString(@"Pick Photos", @"Pick Photos")];
[pool release];
}
- (void) doneAction:(id)sender {
NSMutableArray *selectedAssetsImages = [[[NSMutableArray alloc] init] autorelease];
for(ELCAsset *elcAsset in self.elcAssets)
{
if([elcAsset selected]) {
[selectedAssetsImages addObject:[elcAsset asset]];
}
}
[(ELCAlbumPickerController*)self.parent selectedAssets:selectedAssetsImages];
}
#pragma mark UITableViewDataSource Delegate Methods
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
// Return the number of sections.
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
return ceil([self.assetGroup numberOfAssets] / 4.0);
}
- (NSArray*)assetsForIndexPath:(NSIndexPath*)_indexPath {
int index = (_indexPath.row*4);
int maxIndex = (_indexPath.row*4+3);
// NSLog(@"Getting assets for %d to %d with array count %d", index, maxIndex, [assets count]);
if(maxIndex < [self.elcAssets count]) {
return [NSArray arrayWithObjects:[self.elcAssets objectAtIndex:index],
[self.elcAssets objectAtIndex:index+1],
[self.elcAssets objectAtIndex:index+2],
[self.elcAssets objectAtIndex:index+3],
nil];
}
else if(maxIndex-1 < [self.elcAssets count]) {
return [NSArray arrayWithObjects:[self.elcAssets objectAtIndex:index],
[self.elcAssets objectAtIndex:index+1],
[self.elcAssets objectAtIndex:index+2],
nil];
}
else if(maxIndex-2 < [self.elcAssets count]) {
return [NSArray arrayWithObjects:[self.elcAssets objectAtIndex:index],
[self.elcAssets objectAtIndex:index+1],
nil];
}
else if(maxIndex-3 < [self.elcAssets count]) {
return [NSArray arrayWithObject:[self.elcAssets objectAtIndex:index]];
}
return nil;
}
// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"Cell";
ELCAssetCell *cell = (ELCAssetCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
NSArray *assets = [self assetsForIndexPath:indexPath];
if (cell == nil)
{
cell = [[[ELCAssetCell alloc] initWithAssets:assets reuseIdentifier:CellIdentifier] autorelease];
}
else
{
[cell setAssets:assets];
}
// Show to user that assets of different type than the selected ones
// can't be selected.
for(ELCAsset *asset in assets) {
[asset setDisabled:![self canSelectAsset:asset.asset]];
}
return cell;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 79;
}
- (int)totalSelectedAssets {
int count = 0;
for(ELCAsset *asset in self.elcAssets)
{
if([asset selected])
{
count++;
}
}
return count;
}
- (BOOL)canSelectAsset:(ALAsset *)asset
{
ALAsset *lastSelectedAsset = [_selectedAssets anyObject];
if (lastSelectedAsset && [lastSelectedAsset valueForProperty:ALAssetPropertyType] != [asset valueForProperty:ALAssetPropertyType]) {
return NO;
}
return YES;
}
- (void)didDeselectAsset:(ALAsset *)asset
{
[_selectedAssets removeObject:asset];
if ([_selectedAssets count] == 0) {
[self.tableView reloadData];
}
}
- (void)didSelectAsset:(ALAsset *)asset
{
BOOL firstSelection = [_selectedAssets count] == 0;
[_selectedAssets addObject:asset];
if (firstSelection) {
[self.tableView reloadData];
}
}
- (void)dealloc
{
[elcAssets release];
[selectedAssetsLabel release];
[super dealloc];
}
@end