diff --git a/Vector/ViewController/RoomSettingsViewController.h b/Vector/ViewController/RoomSettingsViewController.h index cde70e4ef..3318d8f97 100644 --- a/Vector/ViewController/RoomSettingsViewController.h +++ b/Vector/ViewController/RoomSettingsViewController.h @@ -19,7 +19,38 @@ #import "MediaPickerViewController.h" #import "TableViewCellWithCheckBoxes.h" +/** + List the settings fields. Used to preselect/edit a field + */ +typedef enum : NSUInteger { + /** + Default. + */ + RoomSettingsViewControllerFieldNone, + + /** + The room name. + */ + RoomSettingsViewControllerFieldName, + + /** + The room topic. + */ + RoomSettingsViewControllerFieldTopic, + + /** + The room avatar. + */ + RoomSettingsViewControllerFieldAvatar + +} RoomSettingsViewControllerField; + @interface RoomSettingsViewController : MXKRoomSettingsViewController +/** + Select a settings field in order to edit it ('RoomSettingsViewControllerFieldNone' by default). + */ +@property (nonatomic) RoomSettingsViewControllerField selectedRoomSettingsField; + @end diff --git a/Vector/ViewController/RoomSettingsViewController.m b/Vector/ViewController/RoomSettingsViewController.m index 4f82fee54..6128471a3 100644 --- a/Vector/ViewController/RoomSettingsViewController.m +++ b/Vector/ViewController/RoomSettingsViewController.m @@ -147,6 +147,13 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance @implementation RoomSettingsViewController +- (void)finalizeInit +{ + [super finalizeInit]; + + _selectedRoomSettingsField = RoomSettingsViewControllerFieldNone; +} + - (void)initWithSession:(MXSession *)session andRoomId:(NSString *)roomId { [super initWithSession:session andRoomId:roomId]; @@ -244,6 +251,17 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance }]; } +- (void)viewDidAppear:(BOOL)animated +{ + [super viewDidAppear:animated]; + + // Edit the selected field if any + if (_selectedRoomSettingsField != RoomSettingsViewControllerFieldNone) + { + self.selectedRoomSettingsField = _selectedRoomSettingsField; + } +} + - (void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; @@ -371,6 +389,44 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance } } +#pragma mark - + +- (void)setSelectedRoomSettingsField:(RoomSettingsViewControllerField)selectedRoomSettingsField +{ + // Check whether the view controller is already embedded inside a navigation controller + if (self.navigationController) + { + [self dismissFirstResponder]; + + switch (selectedRoomSettingsField) + { + case RoomSettingsViewControllerFieldName: + { + [self editRoomName]; + break; + } + case RoomSettingsViewControllerFieldTopic: + { + [self editRoomTopic]; + break; + } + case RoomSettingsViewControllerFieldAvatar: + { + [self onRoomAvatarTap:nil]; + break; + } + + default: + break; + } + } + else + { + // This selection will be applied when the view controller will become active (see 'viewDidAppear') + _selectedRoomSettingsField = selectedRoomSettingsField; + } +} + #pragma mark - private - (void)editRoomName @@ -428,6 +484,8 @@ NSString *const kRoomSettingsAdvancedCellViewIdentifier = @"kRoomSettingsAdvance { [addAddressTextField resignFirstResponder]; } + + _selectedRoomSettingsField = RoomSettingsViewControllerFieldNone; } - (void)startActivityIndicator diff --git a/Vector/ViewController/RoomViewController.m b/Vector/ViewController/RoomViewController.m index 17582a17f..ba26870fc 100644 --- a/Vector/ViewController/RoomViewController.m +++ b/Vector/ViewController/RoomViewController.m @@ -88,9 +88,13 @@ // Typing notifications listener. id typingNotifListener; - // The first tab is selected by default in room details screen in of case 'showRoomDetails' segue. + // The first tab is selected by default in room details screen in case of 'showRoomDetails' segue. // Use this flag to select a specific tab (0: people, 1: settings). NSUInteger selectedRoomDetailsIndex; + + // No field is selected by default in room details screen in case of 'showRoomDetails' segue. + // Use this value to select a specific field in room settings. + RoomSettingsViewControllerField selectedRoomSettingsField; // The position of the first touch down event stored in case of scrolling when the expanded header is visible. CGPoint startScrollingPoint; @@ -1802,8 +1806,12 @@ segmentedViewController.title = NSLocalizedStringFromTable(@"room_details_title", @"Vector", nil); [segmentedViewController initWithTitles:titles viewControllers:viewControllers defaultSelected:selectedRoomDetailsIndex]; - // to display a red navbar when the home server cannot be reached. + // Add the current session to be able to observe its state change. [segmentedViewController addMatrixSession:session]; + + // Preselect the tapped field if any + settingsViewController.selectedRoomSettingsField = selectedRoomSettingsField; + selectedRoomSettingsField = RoomSettingsViewControllerFieldNone; } } else if ([[segue identifier] isEqualToString:@"showRoomSearch"]) @@ -2054,9 +2062,9 @@ - (void)roomTitleView:(RoomTitleView*)titleView recognizeTapGesture:(UITapGestureRecognizer*)tapGestureRecognizer { - UIView *view = tapGestureRecognizer.view; + UIView *tappedView = tapGestureRecognizer.view; - if (view == titleView.titleMask) + if (tappedView == titleView.titleMask) { if (self.expandedHeaderContainer.isHidden) { @@ -2065,18 +2073,56 @@ } else { + selectedRoomSettingsField = RoomSettingsViewControllerFieldNone; + + CGPoint point = [tapGestureRecognizer locationInView:self.expandedHeaderContainer]; + + CGRect roomNameArea = expandedHeader.displayNameTextField.frame; + roomNameArea.origin.x -= 10; + roomNameArea.origin.y -= 10; + roomNameArea.size.width += 20; + roomNameArea.size.height += 15; + if (CGRectContainsPoint(roomNameArea, point)) + { + // Starting to move the local preview view + selectedRoomSettingsField = RoomSettingsViewControllerFieldName; + } + else + { + CGRect roomTopicArea = expandedHeader.roomTopic.frame; + roomTopicArea.origin.x -= 10; + roomTopicArea.size.width += 20; + roomTopicArea.size.height += 10; + if (CGRectContainsPoint(roomTopicArea, point)) + { + // Starting to move the local preview view + selectedRoomSettingsField = RoomSettingsViewControllerFieldTopic; + } + else if ([self.titleView isKindOfClass:[RoomAvatarTitleView class]]) + { + RoomAvatarTitleView *avatarTitleView = (RoomAvatarTitleView*)self.titleView; + CGRect roomAvatarFrame = avatarTitleView.roomAvatar.frame; + roomAvatarFrame.origin = [avatarTitleView convertPoint:roomAvatarFrame.origin toView:self.expandedHeaderContainer]; + if (CGRectContainsPoint(roomAvatarFrame, point)) + { + // Starting to move the local preview view + selectedRoomSettingsField = RoomSettingsViewControllerFieldAvatar; + } + } + } + // Open room settings selectedRoomDetailsIndex = 1; [self performSegueWithIdentifier:@"showRoomDetails" sender:self]; } } - else if (view == titleView.roomDetailsMask) + else if (tappedView == titleView.roomDetailsMask) { // Open room details by selecting member list selectedRoomDetailsIndex = 0; [self performSegueWithIdentifier:@"showRoomDetails" sender:self]; } - else if (view == previewHeader.rightButton) + else if (tappedView == previewHeader.rightButton) { // 'Join' button has been pressed if (roomPreviewData) @@ -2140,7 +2186,7 @@ }]; } } - else if (view == previewHeader.leftButton) + else if (tappedView == previewHeader.leftButton) { // 'Decline' button has been pressed if (roomPreviewData)