mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-09-18 21:50:56 +00:00
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:
parent
fb20bb2482
commit
8bd9aeb9bc
5 changed files with 156 additions and 48 deletions
|
@ -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 {
|
||||
|
|
|
@ -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];
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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];
|
||||
|
|
Loading…
Add table
Reference in a new issue