mirror of
https://github.com/vector-im/element-ios.git
synced 2024-09-29 15:52:40 +00:00
recents_category_drag_drop
the drag and drop is implemented : the cell can be move in the recents sections.
This commit is contained in:
parent
5e8e81d019
commit
27a72ae7db
3 changed files with 136 additions and 6 deletions
|
@ -36,4 +36,15 @@
|
||||||
*/
|
*/
|
||||||
- (CGFloat)heightForHeaderInSection:(NSInteger)section;
|
- (CGFloat)heightForHeaderInSection:(NSInteger)section;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return true of the cell can be moved from a section to another one.
|
||||||
|
*/
|
||||||
|
- (BOOL)isDraggableCellAt:(NSIndexPath*)path;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Move a cell from a path to another one.
|
||||||
|
It is based on room Tag.
|
||||||
|
*/
|
||||||
|
- (void)moveCellFrom:(NSIndexPath*)oldPath to:(NSIndexPath*)newPath;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -482,4 +482,76 @@
|
||||||
[super destroy];
|
[super destroy];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#pragma mark - drag and drop managemenent
|
||||||
|
|
||||||
|
- (BOOL)isDraggableCellAt:(NSIndexPath*)path
|
||||||
|
{
|
||||||
|
return (path && ((path.section == favoritesSection) || (path.section == lowPrioritySection) || (path.section == conversationSection)));
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)canCellMoveFrom:(NSIndexPath*)oldPath to:(NSIndexPath*)newPath
|
||||||
|
{
|
||||||
|
BOOL res = [self isDraggableCellAt:oldPath] && [self isDraggableCellAt:newPath];
|
||||||
|
|
||||||
|
// the both index pathes are movable
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
// cannot move conversation rooms in the same section
|
||||||
|
res &= !((oldPath.section == conversationSection) && (newPath.section == conversationSection));
|
||||||
|
|
||||||
|
// other cases ?
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString*)roomTagAt:(NSIndexPath*)path
|
||||||
|
{
|
||||||
|
if (path.section == favoritesSection)
|
||||||
|
{
|
||||||
|
return kMXRoomTagFavourite;
|
||||||
|
}
|
||||||
|
else if (path.section == lowPrioritySection)
|
||||||
|
{
|
||||||
|
return kMXRoomTagLowPriority;
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)moveCellFrom:(NSIndexPath*)oldPath to:(NSIndexPath*)newPath
|
||||||
|
{
|
||||||
|
if ([self canCellMoveFrom:oldPath to:newPath] && ![newPath isEqual:oldPath])
|
||||||
|
{
|
||||||
|
NSString* oldRoomTag = [self roomTagAt:oldPath];
|
||||||
|
NSString* dstRoomTag = [self roomTagAt:newPath];
|
||||||
|
|
||||||
|
MXRoom* room = [self getRoomAtIndexPath:oldPath];
|
||||||
|
|
||||||
|
NSString* tagOrder = [room.mxSession tagOrderToBeAtIndex:newPath.row withTag:dstRoomTag];
|
||||||
|
|
||||||
|
NSLog(@"[MXKRecentsDataSource] Update the room %@ tag from %@ to %@ with tag order %@", room.state.roomId, oldRoomTag, dstRoomTag, tagOrder);
|
||||||
|
|
||||||
|
[room replaceTag:oldRoomTag
|
||||||
|
byTag:dstRoomTag
|
||||||
|
withOrder:tagOrder
|
||||||
|
success: ^{
|
||||||
|
|
||||||
|
// Refresh table display
|
||||||
|
if (self.delegate)
|
||||||
|
{
|
||||||
|
[self.delegate dataSource:self didCellChange:nil];
|
||||||
|
}
|
||||||
|
|
||||||
|
} failure:^(NSError *error) {
|
||||||
|
|
||||||
|
NSLog(@"[MXKRecentsDataSource] Failed to update the tag %@ of room (%@) failed: %@", dstRoomTag, room.state.roomId, error);
|
||||||
|
|
||||||
|
// Notify MatrixKit user
|
||||||
|
[[NSNotificationCenter defaultCenter] postNotificationName:kMXKErrorNotification object:error];
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
|
|
||||||
// recents drag and drop management
|
// recents drag and drop management
|
||||||
UIView *cellSnapshot;
|
UIView *cellSnapshot;
|
||||||
|
NSIndexPath* movingCellPath;
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
@ -323,7 +324,6 @@ static NSMutableDictionary* backgroundByImageNameDict;
|
||||||
{
|
{
|
||||||
NSString* title = @" ";
|
NSString* title = @" ";
|
||||||
|
|
||||||
|
|
||||||
// pushes settings
|
// pushes settings
|
||||||
BOOL isMuted = ![self.dataSource isRoomNotifiedAtIndexPath:indexPath];
|
BOOL isMuted = ![self.dataSource isRoomNotifiedAtIndexPath:indexPath];
|
||||||
|
|
||||||
|
@ -416,9 +416,6 @@ static NSMutableDictionary* backgroundByImageNameDict;
|
||||||
[self.recentsTableView setEditing:NO];
|
[self.recentsTableView setEditing:NO];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#pragma mark - Override UISearchBarDelegate
|
#pragma mark - Override UISearchBarDelegate
|
||||||
|
|
||||||
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
|
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
|
||||||
|
@ -467,20 +464,42 @@ static NSMutableDictionary* backgroundByImageNameDict;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma mark - recents drag & drop management
|
#pragma mark - recents drag & drop management
|
||||||
|
|
||||||
- (IBAction) onRecentsLongPress:(id)sender
|
- (IBAction) onRecentsLongPress:(id)sender
|
||||||
{
|
{
|
||||||
|
RecentsDataSource* recentsDataSource = nil;
|
||||||
|
|
||||||
|
if ([self.dataSource isKindOfClass:[RecentsDataSource class]])
|
||||||
|
{
|
||||||
|
recentsDataSource = (RecentsDataSource*)self.dataSource;
|
||||||
|
}
|
||||||
|
|
||||||
|
// only support RecentsDataSource
|
||||||
|
if (!recentsDataSource)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;
|
UILongPressGestureRecognizer *longPress = (UILongPressGestureRecognizer *)sender;
|
||||||
UIGestureRecognizerState state = longPress.state;
|
UIGestureRecognizerState state = longPress.state;
|
||||||
|
|
||||||
|
// check if there is a moving cell during the long press managemnt
|
||||||
|
if ((state != UIGestureRecognizerStateBegan) && !movingCellPath)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
CGPoint location = [longPress locationInView:self.recentsTableView];
|
CGPoint location = [longPress locationInView:self.recentsTableView];
|
||||||
NSIndexPath *indexPath = [self.recentsTableView indexPathForRowAtPoint:location];
|
|
||||||
|
|
||||||
switch (state)
|
switch (state)
|
||||||
{
|
{
|
||||||
// step 1 : display the selected cell
|
// step 1 : display the selected cell
|
||||||
case UIGestureRecognizerStateBegan:
|
case UIGestureRecognizerStateBegan:
|
||||||
{
|
{
|
||||||
if (indexPath)
|
NSIndexPath *indexPath = [self.recentsTableView indexPathForRowAtPoint:location];
|
||||||
|
|
||||||
|
// check if the cell can be moved
|
||||||
|
if (indexPath && [recentsDataSource isDraggableCellAt:indexPath])
|
||||||
{
|
{
|
||||||
UITableViewCell *cell = [self.recentsTableView cellForRowAtIndexPath:indexPath];
|
UITableViewCell *cell = [self.recentsTableView cellForRowAtIndexPath:indexPath];
|
||||||
|
|
||||||
|
@ -498,6 +517,8 @@ static NSMutableDictionary* backgroundByImageNameDict;
|
||||||
cellSnapshot.center = center;
|
cellSnapshot.center = center;
|
||||||
cellSnapshot.alpha = 0.5f;
|
cellSnapshot.alpha = 0.5f;
|
||||||
[self.recentsTableView addSubview:cellSnapshot];
|
[self.recentsTableView addSubview:cellSnapshot];
|
||||||
|
|
||||||
|
movingCellPath = indexPath;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -565,6 +586,32 @@ static NSMutableDictionary* backgroundByImageNameDict;
|
||||||
case UIGestureRecognizerStateEnded:
|
case UIGestureRecognizerStateEnded:
|
||||||
{
|
{
|
||||||
[cellSnapshot removeFromSuperview];
|
[cellSnapshot removeFromSuperview];
|
||||||
|
cellSnapshot = nil;
|
||||||
|
|
||||||
|
NSIndexPath *indexPath = [self.recentsTableView indexPathForRowAtPoint:location];
|
||||||
|
NSInteger section = indexPath.section;
|
||||||
|
|
||||||
|
UITableViewCell* cell = [self.recentsTableView cellForRowAtIndexPath:indexPath];
|
||||||
|
|
||||||
|
// the destinated row is retrieved from the moving cell (center comparison)
|
||||||
|
int row = (location.y > cell.center.y) ? indexPath.row + 1 : indexPath.row;
|
||||||
|
|
||||||
|
[recentsDataSource moveCellFrom:movingCellPath to: [NSIndexPath indexPathForRow:row inSection:section]];
|
||||||
|
|
||||||
|
[cellSnapshot removeFromSuperview];
|
||||||
|
cellSnapshot = nil;
|
||||||
|
movingCellPath = nil;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// default behaviour
|
||||||
|
// remove the cell and cancel the insertion
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
[cellSnapshot removeFromSuperview];
|
||||||
|
cellSnapshot = nil;
|
||||||
|
movingCellPath = nil;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue