iOS: move site/folder, delete & mute site

Now using the streamlined move menu to move sites & folders via the
feed detail menu, and the delete & mute site functions behave
similarly, more like the website (no more ugly alerts!).
This commit is contained in:
David Sinclair 2016-02-04 20:10:32 -08:00
parent fb20bb2482
commit 8bd9aeb9bc
5 changed files with 156 additions and 48 deletions

View file

@ -75,6 +75,9 @@
if ([appDelegate.storiesCollection.activeReadFilter isEqualToString:@"unread"]) {
[readFilterSegmentedControl setSelectedSegmentIndex:1];
}
NSInteger menuCount = self.menuOptions.count + 2;
self.navigationController.preferredContentSize = CGSizeMake(260, 38 * menuCount - 42);
}
- (void)buildMenuOptions {
@ -102,8 +105,8 @@
}
if (!appDelegate.storiesCollection.isRiverView && !saved && !read) {
[options addObject:[@"Mute this site" uppercaseString]];
[options addObject:[@"Rename this site" uppercaseString]];
[options addObject:[@"Mute this site" uppercaseString]];
[options addObject:[@"Train this site" uppercaseString]];
[options addObject:[@"Insta-fetch stories" uppercaseString]];
}
@ -153,9 +156,9 @@
} else if (indexPath.row == 1) {
cell.imageView.image = [UIImage imageNamed:@"menu_icn_move.png"];
} else if (indexPath.row == 2) {
cell.imageView.image = [UIImage imageNamed:@"menu_icn_mute.png"];
} else if (indexPath.row == 3) {
cell.imageView.image = [UIImage imageNamed:@"menu_icn_rename.png"];
} else if (indexPath.row == 3) {
cell.imageView.image = [UIImage imageNamed:@"menu_icn_mute.png"];
} else if (indexPath.row == 4) {
cell.imageView.image = [UIImage imageNamed:@"menu_icn_train.png"];
} else if (indexPath.row == 5) {
@ -179,27 +182,34 @@
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
BOOL shouldHide = YES;
if (indexPath.row == 0) {
[appDelegate.feedDetailViewController confirmDeleteSite];
shouldHide = NO;
} else if (indexPath.row == 1) {
[appDelegate.feedDetailViewController openMoveView];
shouldHide = NO;
} else if (indexPath.row == 2) {
[appDelegate.feedDetailViewController confirmMuteSite];
} else if (indexPath.row == 3) {
[appDelegate.feedDetailViewController openRenameSite];
} else if (indexPath.row == 3) {
[appDelegate.feedDetailViewController confirmMuteSite];
shouldHide = NO;
} else if (indexPath.row == 4) {
[appDelegate.feedDetailViewController openTrainSite];
} else if (indexPath.row == 5) {
[appDelegate.feedDetailViewController instafetchFeed];
}
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.appDelegate hidePopover];
} else {
[self.appDelegate hidePopoverAnimated:YES];
if (shouldHide) {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.appDelegate hidePopover];
} else {
[self.appDelegate hidePopoverAnimated:YES];
}
}
[tableView deselectRowAtIndexPath:indexPath animated:YES];
[tableView deselectRowAtIndexPath:indexPath animated:YES];
}
- (UITableViewCell *)makeOrderCell {

View file

@ -37,6 +37,7 @@
#import "StoriesCollection.h"
#import "NSNull+JSON.h"
#import "UISearchBar+Field.h"
#import "MenuViewController.h"
#define kTableViewRowHeight 46;
#define kTableViewRiverRowHeight 68;
@ -1884,54 +1885,44 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
[self.appDelegate.feedDetailMenuViewController view];
NSInteger menuCount = [self.appDelegate.feedDetailMenuViewController.menuOptions count] + 2;
[self.appDelegate showPopoverWithViewController:self.appDelegate.feedDetailMenuViewController contentSize:CGSizeMake(260, 38 * menuCount) barButtonItem:self.settingsBarButton];
[self.appDelegate.feedDetailMenuNavigationController popToRootViewControllerAnimated:NO];
[self.appDelegate showPopoverWithViewController:self.appDelegate.feedDetailMenuNavigationController contentSize:CGSizeMake(260, 38 * menuCount - 42) barButtonItem:self.settingsBarButton];
}
- (void)confirmDeleteSite {
UIAlertView *deleteConfirm = [[UIAlertView alloc]
initWithTitle:@"Positive?"
message:nil
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Delete",
nil];
[deleteConfirm show];
[deleteConfirm setTag:0];
MenuViewController *viewController = [MenuViewController new];
viewController.title = @"Positive?";
NSString *title = storiesCollection.isRiverView ? @"Delete Folder" : @"Delete Site";
[viewController addTitle:title iconName:@"menu_icn_delete.png" selectionShouldDismiss:YES handler:^{
if (storiesCollection.isRiverView) {
[self deleteFolder];
} else {
[self deleteSite];
}
}];
[self.appDelegate.feedDetailMenuNavigationController pushViewController:viewController animated:YES];
}
- (void)confirmMuteSite {
UIAlertView *deleteConfirm = [[UIAlertView alloc]
initWithTitle:@"Positive?"
message:nil
delegate:self
cancelButtonTitle:@"Cancel"
otherButtonTitles:@"Mute",
nil];
[deleteConfirm show];
[deleteConfirm setTag:2];
MenuViewController *viewController = [MenuViewController new];
viewController.title = @"Positive?";
[viewController addTitle:@"Mute Site" iconName:@"menu_icn_mute.png" selectionShouldDismiss:YES handler:^{
[self muteSite];
}];
[self.appDelegate.feedDetailMenuNavigationController pushViewController:viewController animated:YES];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
if (alertView.tag == 0) {
// Delete
if (buttonIndex != alertView.cancelButtonIndex) {
if (storiesCollection.isRiverView) {
[self deleteFolder];
} else {
[self deleteSite];
}
}
} else if (alertView.tag == 1) {
if (alertView.tag == 1) {
// Rename
if (buttonIndex != alertView.cancelButtonIndex) {
NSString *newTitle = [[alertView textFieldAtIndex:0] text];
[self renameTo:newTitle];
}
} else if (alertView.tag == 2) {
// Mute
if (buttonIndex != alertView.cancelButtonIndex) {
[self muteSite];
}
}
}
@ -2061,10 +2052,100 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
[request startAsynchronous];
}
- (void)openMoveView {
[appDelegate showMoveSite];
- (void)performMoveToFolder:(id)toFolder {
[MBProgressHUD hideHUDForView:self.view animated:YES];
MBProgressHUD *HUD = [MBProgressHUD showHUDAddedTo:self.view animated:YES];
ASIFormDataRequest *request = nil;
if (self.appDelegate.storiesCollection.isRiverView) {
HUD.labelText = @"Moving folder...";
NSString *urlString = [NSString stringWithFormat:@"%@/reader/move_folder_to_folder", self.appDelegate.url];
NSURL *url = [NSURL URLWithString:urlString];
request = [ASIFormDataRequest requestWithURL:url];
NSString *activeFolder = self.appDelegate.storiesCollection.activeFolder;
NSString *parentFolderName = [self.appDelegate extractParentFolderName:activeFolder];
NSString *fromFolder = [self.appDelegate extractFolderName:parentFolderName];
NSString *toFolderIdentifier = [self.appDelegate extractFolderName:toFolder];
NSString *folderName = [self.appDelegate extractFolderName:activeFolder];
[request setPostValue:fromFolder forKey:@"in_folder"];
[request setPostValue:toFolderIdentifier forKey:@"to_folder"];
[request setPostValue:folderName forKey:@"folder_name"];
} else {
HUD.labelText = @"Moving site...";
NSString *urlString = [NSString stringWithFormat:@"%@/reader/move_feed_to_folder", self.appDelegate.url];
NSURL *url = [NSURL URLWithString:urlString];
request = [ASIFormDataRequest requestWithURL:url];
NSString *fromFolder = [self.appDelegate extractFolderName:self.appDelegate.storiesCollection.activeFolder];
NSString *toFolderIdentifier = [self.appDelegate extractFolderName:toFolder];
NSString *feedIdentifier = [self.appDelegate.storiesCollection.activeFeed objectForKey:@"id"];
[request setPostValue:fromFolder forKey:@"in_folder"];
[request setPostValue:toFolderIdentifier forKey:@"to_folder"];
[request setPostValue:feedIdentifier forKey:@"feed_id"];
}
[request setDelegate:self];
[request setDidFinishSelector:@selector(moveToFolderFinished:)];
[request setDidFailSelector:@selector(requestFailed:)];
[request setUserInfo:@{@"toFolder" : toFolder}];
[request startAsynchronous];
}
- (void)moveToFolderFinished:(ASIHTTPRequest *)request {
if ([request responseStatusCode] >= 500) {
return [self requestFailed:request];
}
[MBProgressHUD hideHUDForView:self.view animated:YES];
NSString *responseString = [request responseString];
NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding];
NSError *error;
NSDictionary *results = [NSJSONSerialization
JSONObjectWithData:responseData
options:kNilOptions
error:&error];
int code = [[results valueForKey:@"code"] intValue];
if (code != -1) {
self.appDelegate.storiesCollection.activeFolder = request.userInfo[@"toFolder"];
[self.appDelegate reloadFeedsView:NO];
}
}
- (void)openMoveView {
MenuViewController *viewController = [MenuViewController new];
viewController.title = @"Move To";
__weak __typeof(&*self)weakSelf = self;
for (NSString *folder in self.appDelegate.dictFoldersArray) {
NSString *title = folder;
NSString *iconName = @"menu_icn_move.png";
if (![title hasPrefix:@"river_"] && ![title hasSuffix:@"_stories"]) {
if ([title isEqualToString:@"everything"]) {
title = @"Top Level";
iconName = @"menu_icn_all.png";
} else {
NSArray *components = [title componentsSeparatedByString:@" - "];
title = components.lastObject;
for (NSUInteger idx = 0; idx < components.count; idx++) {
title = [@"\t" stringByAppendingString:title];
}
}
[viewController addTitle:title iconName:iconName selectionShouldDismiss:YES handler:^{
[weakSelf performMoveToFolder:folder];
}];
}
}
[self.appDelegate.feedDetailMenuNavigationController pushViewController:viewController animated:YES];
}
//- (void)openMoveView {
// [appDelegate showMoveSite];
//}
- (void)openTrainSite {
[appDelegate openTrainSite];
}
@ -2284,6 +2365,7 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
}
- (void)requestFailed:(ASIHTTPRequest *)request {
[MBProgressHUD hideHUDForView:self.view animated:YES];
NSError *error = [request error];
NSLog(@"Error: %@", error);
[appDelegate informError:error];

View file

@ -70,11 +70,17 @@ NSString * const MenuHandler = @"handler";
size.width = MIN(size.width + 50.0, 240.0);
size.height = size.height + (self.items.count * 38.0);
if (self.navigationController.viewControllers.count > 1) {
size.width = MAX(size.width, self.view.frame.size.width);
}
self.navigationController.preferredContentSize = size;
return size;
}
- (void)addTitle:(NSString *)title iconName:(NSString *)iconName selectionShouldDismiss:(BOOL)selectionShouldDismiss handler:(MenuItemHandler)handler {
[self.items addObject:@{MenuTitle : title.uppercaseString, MenuIcon : [UIImage imageNamed:iconName], MenuDestructive : @([iconName isEqualToString:@"menu_icn_delete.png"]), MenuSelectionShouldDismiss : @(selectionShouldDismiss), MenuHandler : handler}];
[self.items addObject:@{MenuTitle : title.uppercaseString, MenuIcon : [UIImage imageNamed:iconName], MenuDestructive : @([iconName isEqualToString:@"menu_icn_delete.png"] || [iconName isEqualToString:@"menu_icn_mute.png"]), MenuSelectionShouldDismiss : @(selectionShouldDismiss), MenuHandler : handler}];
}
- (void)addSegmentedControlWithTitles:(NSArray *)titles selectIndex:(NSUInteger)selectIndex selectionShouldDismiss:(BOOL)selectionShouldDismiss handler:(MenuItemSegmentedHandler)handler {

View file

@ -162,6 +162,7 @@ SFSafariViewControllerDelegate> {
@property (nonatomic) IBOutlet FeedsMenuViewController *feedsMenuViewController;
@property (nonatomic) IBOutlet FeedDetailViewController *feedDetailViewController;
@property (nonatomic) IBOutlet FeedDetailMenuViewController *feedDetailMenuViewController;
@property (nonatomic, strong) UINavigationController *feedDetailMenuNavigationController;
@property (nonatomic) IBOutlet FriendsListViewController *friendsListViewController;
@property (nonatomic) IBOutlet StoryDetailViewController *storyDetailViewController;
@property (nonatomic) IBOutlet StoryPageControl *storyPageControl;

View file

@ -1509,7 +1509,7 @@
}
- (void)navigationController:(UINavigationController *)_navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if ([viewController isKindOfClass:[SFSafariViewController class]] || [viewController isKindOfClass:[FontSettingsViewController class]]) {
if ([viewController isKindOfClass:[SFSafariViewController class]] || [viewController isKindOfClass:[FontSettingsViewController class]] || [viewController isKindOfClass:[feedDetailMenuViewController class]]) {
[_navigationController setNavigationBarHidden:YES animated:YES];
} else {
[_navigationController setNavigationBarHidden:NO animated:YES];
@ -1525,6 +1525,15 @@
return _fontSettingsNavigationController;
}
- (UINavigationController *)feedDetailMenuNavigationController {
if (!_feedDetailMenuNavigationController) {
self.feedDetailMenuNavigationController = [[UINavigationController alloc] initWithRootViewController:self.feedDetailMenuViewController];
self.feedDetailMenuNavigationController.delegate = self;
}
return _feedDetailMenuNavigationController;
}
- (void)closeOriginalStory {
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
[self.masterContainerViewController transitionFromOriginalView];