mirror of
https://github.com/SoPat712/YTLitePlus.git
synced 2025-08-24 03:26:09 -04:00
236 lines
8.0 KiB
Objective-C
236 lines
8.0 KiB
Objective-C
//
|
|
// FLEXBookmarksViewController.m
|
|
// FLEX
|
|
//
|
|
// Created by Tanner on 2/6/20.
|
|
// Copyright © 2020 FLEX Team. All rights reserved.
|
|
//
|
|
|
|
#import "FLEXBookmarksViewController.h"
|
|
#import "FLEXExplorerViewController.h"
|
|
#import "FLEXNavigationController.h"
|
|
#import "FLEXObjectExplorerFactory.h"
|
|
#import "FLEXBookmarkManager.h"
|
|
#import "UIBarButtonItem+FLEX.h"
|
|
#import "FLEXColor.h"
|
|
#import "FLEXUtility.h"
|
|
#import "FLEXRuntimeUtility.h"
|
|
#import "FLEXTableView.h"
|
|
|
|
@interface FLEXBookmarksViewController ()
|
|
@property (nonatomic, copy) NSArray *bookmarks;
|
|
@property (nonatomic, readonly) FLEXExplorerViewController *corePresenter;
|
|
@end
|
|
|
|
@implementation FLEXBookmarksViewController
|
|
|
|
#pragma mark - Initialization
|
|
|
|
- (id)init {
|
|
return [self initWithStyle:UITableViewStylePlain];
|
|
}
|
|
|
|
- (void)viewDidLoad {
|
|
[super viewDidLoad];
|
|
|
|
self.navigationController.hidesBarsOnSwipe = NO;
|
|
self.tableView.allowsMultipleSelectionDuringEditing = YES;
|
|
|
|
[self reloadData];
|
|
}
|
|
|
|
- (void)viewWillAppear:(BOOL)animated {
|
|
[super viewWillAppear:animated];
|
|
[self setupDefaultBarItems];
|
|
}
|
|
|
|
|
|
#pragma mark - Private
|
|
|
|
- (void)reloadData {
|
|
// We assume the bookmarks aren't going to change out from under us, since
|
|
// presenting any other tool via keyboard shortcuts should dismiss us first
|
|
self.bookmarks = FLEXBookmarkManager.bookmarks;
|
|
self.title = [NSString stringWithFormat:@"Bookmarks (%@)", @(self.bookmarks.count)];
|
|
}
|
|
|
|
- (void)setupDefaultBarItems {
|
|
self.navigationItem.rightBarButtonItem = FLEXBarButtonItemSystem(Done, self, @selector(dismissAnimated));
|
|
self.toolbarItems = @[
|
|
UIBarButtonItem.flex_flexibleSpace,
|
|
FLEXBarButtonItemSystem(Edit, self, @selector(toggleEditing)),
|
|
];
|
|
|
|
// Disable editing if no bookmarks available
|
|
self.toolbarItems.lastObject.enabled = self.bookmarks.count > 0;
|
|
}
|
|
|
|
- (void)setupEditingBarItems {
|
|
self.navigationItem.rightBarButtonItem = nil;
|
|
self.toolbarItems = @[
|
|
[UIBarButtonItem flex_itemWithTitle:@"Close All" target:self action:@selector(closeAllButtonPressed:)],
|
|
UIBarButtonItem.flex_flexibleSpace,
|
|
// We use a non-system done item because we change its title dynamically
|
|
[UIBarButtonItem flex_doneStyleitemWithTitle:@"Done" target:self action:@selector(toggleEditing)]
|
|
];
|
|
|
|
self.toolbarItems.firstObject.tintColor = FLEXColor.destructiveColor;
|
|
}
|
|
|
|
- (FLEXExplorerViewController *)corePresenter {
|
|
// We must be presented by a FLEXExplorerViewController, or presented
|
|
// by another view controller that was presented by FLEXExplorerViewController
|
|
FLEXExplorerViewController *presenter = (id)self.presentingViewController;
|
|
presenter = (id)presenter.presentingViewController ?: presenter;
|
|
presenter = (id)presenter.presentingViewController ?: presenter;
|
|
NSAssert(
|
|
[presenter isKindOfClass:[FLEXExplorerViewController class]],
|
|
@"The bookmarks view controller expects to be presented by the explorer controller"
|
|
);
|
|
return presenter;
|
|
}
|
|
|
|
#pragma mark Button Actions
|
|
|
|
- (void)dismissAnimated {
|
|
[self dismissAnimated:nil];
|
|
}
|
|
|
|
- (void)dismissAnimated:(id)selectedObject {
|
|
if (selectedObject) {
|
|
UIViewController *explorer = [FLEXObjectExplorerFactory
|
|
explorerViewControllerForObject:selectedObject
|
|
];
|
|
if ([self.presentingViewController isKindOfClass:[FLEXNavigationController class]]) {
|
|
// I am presented on an existing navigation stack, so
|
|
// dismiss myself and push the bookmark there
|
|
UINavigationController *presenter = (id)self.presentingViewController;
|
|
[presenter dismissViewControllerAnimated:YES completion:^{
|
|
[presenter pushViewController:explorer animated:YES];
|
|
}];
|
|
} else {
|
|
// Dismiss myself and present explorer
|
|
UIViewController *presenter = self.corePresenter;
|
|
[presenter dismissViewControllerAnimated:YES completion:^{
|
|
[presenter presentViewController:[FLEXNavigationController
|
|
withRootViewController:explorer
|
|
] animated:YES completion:nil];
|
|
}];
|
|
}
|
|
} else {
|
|
// Just dismiss myself
|
|
[self dismissViewControllerAnimated:YES completion:nil];
|
|
}
|
|
}
|
|
|
|
- (void)toggleEditing {
|
|
NSArray<NSIndexPath *> *selected = self.tableView.indexPathsForSelectedRows;
|
|
self.editing = !self.editing;
|
|
|
|
if (self.isEditing) {
|
|
[self setupEditingBarItems];
|
|
} else {
|
|
[self setupDefaultBarItems];
|
|
|
|
// Get index set of bookmarks to close
|
|
NSMutableIndexSet *indexes = [NSMutableIndexSet new];
|
|
for (NSIndexPath *ip in selected) {
|
|
[indexes addIndex:ip.row];
|
|
}
|
|
|
|
if (selected.count) {
|
|
// Close bookmarks and update data source
|
|
[FLEXBookmarkManager.bookmarks removeObjectsAtIndexes:indexes];
|
|
[self reloadData];
|
|
|
|
// Remove deleted rows
|
|
[self.tableView deleteRowsAtIndexPaths:selected withRowAnimation:UITableViewRowAnimationAutomatic];
|
|
}
|
|
}
|
|
}
|
|
|
|
- (void)closeAllButtonPressed:(UIBarButtonItem *)sender {
|
|
[FLEXAlert makeSheet:^(FLEXAlert *make) {
|
|
NSInteger count = self.bookmarks.count;
|
|
NSString *title = FLEXPluralFormatString(count, @"Remove %@ bookmarks", @"Remove %@ bookmark");
|
|
make.button(title).destructiveStyle().handler(^(NSArray<NSString *> *strings) {
|
|
[self closeAll];
|
|
[self toggleEditing];
|
|
});
|
|
make.button(@"Cancel").cancelStyle();
|
|
} showFrom:self source:sender];
|
|
}
|
|
|
|
- (void)closeAll {
|
|
NSInteger rowCount = self.bookmarks.count;
|
|
|
|
// Close bookmarks and update data source
|
|
[FLEXBookmarkManager.bookmarks removeAllObjects];
|
|
[self reloadData];
|
|
|
|
// Delete rows from table view
|
|
NSArray<NSIndexPath *> *allRows = [NSArray flex_forEachUpTo:rowCount map:^id(NSUInteger row) {
|
|
return [NSIndexPath indexPathForRow:row inSection:0];
|
|
}];
|
|
[self.tableView deleteRowsAtIndexPaths:allRows withRowAnimation:UITableViewRowAnimationAutomatic];
|
|
}
|
|
|
|
|
|
#pragma mark - Table View Data Source
|
|
|
|
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
|
|
return self.bookmarks.count;
|
|
}
|
|
|
|
- (UITableViewCell *)tableView:(FLEXTableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kFLEXDetailCell forIndexPath:indexPath];
|
|
|
|
id object = self.bookmarks[indexPath.row];
|
|
cell.textLabel.text = [FLEXRuntimeUtility safeDescriptionForObject:object];
|
|
cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ — %p", [object class], object];
|
|
|
|
return cell;
|
|
}
|
|
|
|
|
|
#pragma mark - Table View Delegate
|
|
|
|
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
if (self.editing) {
|
|
// Case: editing with multi-select
|
|
self.toolbarItems.lastObject.title = @"Remove Selected";
|
|
self.toolbarItems.lastObject.tintColor = FLEXColor.destructiveColor;
|
|
} else {
|
|
// Case: selected a bookmark
|
|
[self dismissAnimated:self.bookmarks[indexPath.row]];
|
|
}
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
NSParameterAssert(self.editing);
|
|
|
|
if (tableView.indexPathsForSelectedRows.count == 0) {
|
|
self.toolbarItems.lastObject.title = @"Done";
|
|
self.toolbarItems.lastObject.tintColor = self.view.tintColor;
|
|
}
|
|
}
|
|
|
|
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
return YES;
|
|
}
|
|
|
|
- (void)tableView:(UITableView *)table
|
|
commitEditingStyle:(UITableViewCellEditingStyle)edit
|
|
forRowAtIndexPath:(NSIndexPath *)indexPath {
|
|
NSParameterAssert(edit == UITableViewCellEditingStyleDelete);
|
|
|
|
// Remove bookmark and update data source
|
|
[FLEXBookmarkManager.bookmarks removeObjectAtIndex:indexPath.row];
|
|
[self reloadData];
|
|
|
|
// Delete row from table view
|
|
[table deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
|
|
}
|
|
|
|
@end
|