Skip to content

Commit

Permalink
Added multi touch behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
techiemac authored and AlanQuatermain committed Mar 5, 2011
1 parent b4be4d7 commit 2d86535
Show file tree
Hide file tree
Showing 2 changed files with 52 additions and 10 deletions.
6 changes: 5 additions & 1 deletion Classes/AQGridView.h
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -73,9 +73,11 @@ typedef enum {

// Called before selection occurs. Return a new index, or NSNotFound, to change the proposed selection.
- (NSUInteger) gridView: (AQGridView *) gridView willSelectItemAtIndex: (NSUInteger) index;
- (NSUInteger) gridView: (AQGridView *) gridView willSelectItemAtIndex: (NSUInteger) index numFingersTouch:(NSUInteger) numFingers;
- (NSUInteger) gridView: (AQGridView *) gridView willDeselectItemAtIndex: (NSUInteger) index;
// Called after the user changes the selection
- (void) gridView: (AQGridView *) gridView didSelectItemAtIndex: (NSUInteger) index;
- (void) gridView: (AQGridView *) gridView didSelectItemAtIndex: (NSUInteger) index numFingersTouch:(NSUInteger)numFingers;
- (void) gridView: (AQGridView *) gridView didDeselectItemAtIndex: (NSUInteger) index;

// NOT YET IMPLEMENTED
Expand Down Expand Up @@ -124,7 +126,7 @@ extern NSString * const AQGridViewSelectionDidChangeNotification;

UIView * _headerView;
UIView * _footerView;
struct
{
unsigned resizesCellWidths:1;
Expand All @@ -146,8 +148,10 @@ extern NSString * const AQGridViewSelectionDidChangeNotification;

unsigned delegateWillDisplayCell:1;
unsigned delegateWillSelectItem:1;
unsigned delegateWillSelectItemMultiTouch:1;
unsigned delegateWillDeselectItem:1;
unsigned delegateDidSelectItem:1;
unsigned delegateDidSelectItemMultiTouch:1;
unsigned delegateDidDeselectItem:1;
unsigned delegateGestureRecognizerActivated:1;
unsigned delegateAdjustGridCellFrame:1;
Expand Down
56 changes: 47 additions & 9 deletions Classes/AQGridView.m
100644 → 100755
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,25 @@
#import <objc/objc.h>
#import <objc/runtime.h>

// Lightweight object class for touch selection parameters
@interface UserSelectItemIndexParams : NSObject
{
NSUInteger _indexNum;
NSUInteger _numFingers;
};

@property (nonatomic, assign) NSUInteger indexNum;
@property (nonatomic, assign) NSUInteger numFingers;
@end

@implementation UserSelectItemIndexParams

@synthesize indexNum = _indexNum;
@synthesize numFingers = _numFingers;

@end


NSString * const AQGridViewSelectionDidChangeNotification = @"AQGridViewSelectionDidChangeNotification";

@interface AQGridView (AQCellGridMath)
Expand All @@ -71,6 +90,7 @@ @interface AQGridView ()
@property (nonatomic, copy) NSIndexSet * animatingIndices;
@end


@implementation AQGridView

@synthesize dataSource=_dataSource, backgroundView=_backgroundView, separatorColor=_separatorColor, animatingCells=_animatingCells, animatingIndices=_animatingIndices;
Expand Down Expand Up @@ -158,8 +178,10 @@ - (void) setDelegate: (id<AQGridViewDelegate>) obj

_flags.delegateWillDisplayCell = [obj respondsToSelector: @selector(gridView:willDisplayCell:forItemAtIndex:)];
_flags.delegateWillSelectItem = [obj respondsToSelector: @selector(gridView:willSelectItemAtIndex:)];
_flags.delegateWillSelectItemMultiTouch = [obj respondsToSelector: @selector(gridView:willSelectItemAtIndex:numFingersTouch:)];
_flags.delegateWillDeselectItem = [obj respondsToSelector: @selector(gridView:willDeselectItemAtIndex:)];
_flags.delegateDidSelectItem = [obj respondsToSelector: @selector(gridView:didSelectItemAtIndex:)];
_flags.delegateDidSelectItemMultiTouch = [obj respondsToSelector: @selector(gridView:didSelectItemAtIndex:numFingersTouch:)];
_flags.delegateDidDeselectItem = [obj respondsToSelector: @selector(gridView:didDeselectItemAtIndex:)];
_flags.delegateGestureRecognizerActivated = [obj respondsToSelector: @selector(gridView:gestureRecognizer:activatedForItemAtIndex:)];
_flags.delegateAdjustGridCellFrame = [obj respondsToSelector: @selector(gridView:adjustCellFrame:withinGridCellFrame:)];
Expand Down Expand Up @@ -1119,6 +1141,7 @@ - (void) _deselectItemAtIndex: (NSUInteger) index animated: (BOOL) animated noti

- (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
scrollPosition: (AQGridViewScrollPosition) position notifyDelegate: (BOOL) notifyDelegate
numFingersTouch: (NSUInteger) numFingers
{
if ( _selectedIndex == index )
return; // already selected this item
Expand All @@ -1131,7 +1154,11 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated

if ( notifyDelegate && _flags.delegateWillSelectItem )
index = [self.delegate gridView: self willSelectItemAtIndex: index];


if ( notifyDelegate && _flags.delegateWillSelectItemMultiTouch )
index = [self.delegate gridView: self willSelectItemAtIndex: index
numFingersTouch:numFingers];

_selectedIndex = index;
[[self cellForItemAtIndex: index] setSelected: YES animated: animated];

Expand All @@ -1146,6 +1173,9 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated

if ( notifyDelegate && _flags.delegateDidSelectItem )
[self.delegate gridView: self didSelectItemAtIndex: index];

if ( notifyDelegate && _flags.delegateDidSelectItemMultiTouch )
[self.delegate gridView: self didSelectItemAtIndex: index numFingersTouch:numFingers];

// ensure that the selected item is no longer marked as just 'highlighted' (that's an intermediary state)
[_highlightedIndices removeIndex: index];
Expand All @@ -1154,7 +1184,8 @@ - (void) _selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
- (void) selectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
scrollPosition: (AQGridViewScrollPosition) scrollPosition
{
[self _selectItemAtIndex: index animated: animated scrollPosition: scrollPosition notifyDelegate: NO];
[self _selectItemAtIndex: index animated: animated scrollPosition: scrollPosition notifyDelegate: NO
numFingersTouch: 1];
}

- (void) deselectItemAtIndex: (NSUInteger) index animated: (BOOL) animated
Expand Down Expand Up @@ -1272,14 +1303,16 @@ - (void) _gridViewDeferredTouchesBegan: (NSNumber *) indexNum
//_pendingSelectionIndex = NSNotFound;
}

- (void) _userSelectItemAtIndex: (NSNumber *) indexNum
- (void) _userSelectItemAtIndex: (UserSelectItemIndexParams*) params
{
NSUInteger index = [indexNum unsignedIntegerValue];
NSUInteger index = params.indexNum;
NSUInteger numFingersCount = params.numFingers;
[self unhighlightItemAtIndex: index animated: NO];
if ( ([[self cellForItemAtIndex: index] isSelected]) && (self.requiresSelection == NO) )
[self _deselectItemAtIndex: index animated: NO notifyDelegate: YES];
else
[self _selectItemAtIndex: index animated: NO scrollPosition: AQGridViewScrollPositionNone notifyDelegate: YES];
[self _selectItemAtIndex: index animated: NO scrollPosition: AQGridViewScrollPositionNone notifyDelegate: YES
numFingersTouch: numFingersCount];
_pendingSelectionIndex = NSNotFound;
}

Expand Down Expand Up @@ -1323,7 +1356,7 @@ - (BOOL) _gestureRecognizerIsHandlingTouches: (NSSet *) touches
- (void) touchesBegan: (NSSet *) touches withEvent: (UIEvent *) event
{
_flags.ignoreTouchSelect = ([self isDragging] ? 1 : 0);
UITouch * touch = [touches anyObject];
_touchBeganPosition = [touch locationInView: nil];
if ( (touch != nil) && (_pendingSelectionIndex == NSNotFound) )
Expand Down Expand Up @@ -1391,7 +1424,7 @@ - (void) touchesMoved: (NSSet *) touches withEvent: (UIEvent *) event

- (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
{
[[self class] cancelPreviousPerformRequestsWithTarget: self
[[self class] cancelPreviousPerformRequestsWithTarget: self
selector: @selector(_gridViewDeferredTouchesBegan:)
object: nil];

Expand Down Expand Up @@ -1431,10 +1464,15 @@ - (void) touchesEnded: (NSSet *) touches withEvent: (UIEvent *) event
if ( _flags.allowsSelection == 0 )
break;

NSSet *touchEventSet = [event allTouches];

// run this on the next runloop tick
UserSelectItemIndexParams* selectorParams = [[[UserSelectItemIndexParams alloc] init] autorelease];
selectorParams.indexNum = _pendingSelectionIndex;
selectorParams.numFingers = [touchEventSet count];
[self performSelector: @selector(_userSelectItemAtIndex:)
withObject: [NSNumber numberWithUnsignedInteger: _pendingSelectionIndex]
afterDelay: 0.0];
withObject: selectorParams
afterDelay:0.0];

[hitView release];

Expand Down

0 comments on commit 2d86535

Please sign in to comment.