#1247 (Mac Catalyst edition)

- Added submenus to the View menu for Layout, Story Preview, Image Preview, Grid Columns, and Grid Height.
- Implemented the remaining menu items.
- Menus now update based on folder vs site.
- Menus now disable when not appropriate.
- Added some handy new stories collection properties.
This commit is contained in:
David Sinclair 2024-02-09 11:47:03 -05:00
parent 9f8786d94a
commit ed9279e2a3
9 changed files with 383 additions and 36 deletions

View file

@ -14,6 +14,7 @@
@property (nonatomic, readonly) BOOL isVision;
@property (nonatomic, readonly) BOOL isPortrait;
@property (nonatomic, readonly) BOOL isCompactWidth;
@property (nonatomic, readonly) BOOL isGrid;
@property (nonatomic, readonly) BOOL isFeedShown;
@property (nonatomic, readonly) BOOL isStoryShown;
@ -47,10 +48,28 @@
- (IBAction)showPremium:(id)sender;
- (IBAction)showSupportForum:(id)sender;
- (IBAction)showLogout:(id)sender;
- (IBAction)chooseColumns:(id)sender;
- (IBAction)chooseLayout:(id)sender;
- (IBAction)chooseTitle:(id)sender;
- (IBAction)choosePreview:(id)sender;
- (IBAction)chooseGridColumns:(id)sender;
- (IBAction)chooseGridHeight:(id)sender;
- (IBAction)chooseFontSize:(id)sender;
- (IBAction)chooseSpacing:(id)sender;
- (IBAction)chooseTheme:(id)sender;
- (IBAction)moveSite:(id)sender;
- (IBAction)openRenameSite:(id)sender;
- (IBAction)muteSite:(id)sender;
- (IBAction)deleteSite:(id)sender;
- (IBAction)openTrainSite:(id)sender;
- (IBAction)openNotifications:(id)sender;
- (IBAction)openStatistics:(id)sender;
- (IBAction)instaFetchFeed:(id)sender;
- (IBAction)doMarkAllRead:(id)sender;
- (IBAction)showSendTo:(id)sender;
- (IBAction)showTrain:(id)sender;
- (IBAction)showShare:(id)sender;

View file

@ -218,6 +218,15 @@
}
}
- (BOOL)isCompactWidth {
return self.view.window.windowScene.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact;
//return self.compactWidth > 0.0;
}
- (BOOL)isGrid {
return self.appDelegate.detailViewController.storyTitlesInGrid;
}
- (BOOL)isFeedShown {
return appDelegate.storiesCollection.activeFeed != nil || appDelegate.storiesCollection.activeFolder != nil;
}
@ -226,19 +235,30 @@
return !appDelegate.storyPagesViewController.currentPage.view.isHidden && appDelegate.storyPagesViewController.currentPage.noStoryMessage.isHidden;
}
- (BOOL)isCompactWidth {
return self.view.window.windowScene.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassCompact;
//return self.compactWidth > 0.0;
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if (action == @selector(muteSite) || action == @selector(openRenameSite)) {
return !appDelegate.storiesCollection.isEverything;
} else if (action == @selector(openTrainSite) || action == @selector(openNotifications:) || action == @selector(openStatistics:)) {
return !appDelegate.storiesCollection.isRiverOrSocial;
} else if (action == @selector(openRenameSite)) {
return appDelegate.storiesCollection.isSocialView;
} else if (action == @selector(showTrain:) || action == @selector(showShare:)) {
if (action == @selector(chooseLayout:)) {
return self.isFeedShown;
} else if (action == @selector(chooseTitle:) || action == @selector(choosePreview:)) {
return self.isFeedShown && !self.isGrid;
} else if (action == @selector(chooseGridColumns:) || action == @selector(chooseGridHeight:)) {
return self.isFeedShown && self.isGrid;
} else if (action == @selector(openTrainSite) ||
action == @selector(openTrainSite:) ||
action == @selector(openNotifications:) ||
action == @selector(openStatistics:) ||
action == @selector(moveSite:) ||
action == @selector(openRenameSite:) ||
action == @selector(deleteSite:)) {
return self.isFeedShown && appDelegate.storiesCollection.isCustomFolderOrFeed;
} else if (action == @selector(muteSite) ||
action == @selector(muteSite:)) {
return self.isFeedShown && !appDelegate.storiesCollection.isRiverView;
} else if (action == @selector(instaFetchFeed:) ||
action == @selector(doMarkAllRead:)) {
return self.isFeedShown;
} else if (action == @selector(showSendTo:) ||
action == @selector(showTrain:) ||
action == @selector(showShare:)) {
return self.isStoryShown;
} else {
return [super canPerformAction:action withSender:sender];
@ -250,6 +270,27 @@
if (command.action == @selector(chooseColumns:)) {
command.state = [command.propertyList isEqualToString:appDelegate.detailViewController.behaviorString];
} else if (command.action == @selector(chooseLayout:)) {
NSString *value = self.appDelegate.storiesCollection.activeStoryTitlesPosition;
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(chooseTitle:)) {
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"story_list_preview_text_size"];
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(choosePreview:)) {
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"story_list_preview_images_size"];
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(chooseGridColumns:)) {
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"grid_columns"];
if (value == nil) {
value = @"auto";
}
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(chooseGridHeight:)) {
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"grid_height"];
if (value == nil) {
value = @"medium";
}
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(chooseFontSize:)) {
NSString *value = [[NSUserDefaults standardUserDefaults] objectForKey:@"feed_list_font_size"];
command.state = [command.propertyList isEqualToString:value];
@ -258,12 +299,24 @@
command.state = [command.propertyList isEqualToString:value];
} else if (command.action == @selector(chooseTheme:)) {
command.state = [command.propertyList isEqualToString:ThemeManager.themeManager.theme];
} else if (command.action == @selector(openRenameSite:)) {
if (appDelegate.storiesCollection.isRiverOrSocial) {
command.title = @"Rename Folder…";
} else {
command.title = @"Rename Site…";
}
} else if (command.action == @selector(deleteSite:)) {
if (appDelegate.storiesCollection.isRiverOrSocial) {
command.title = @"Delete Folder…";
} else {
command.title = @"Delete Site…";
}
} else if (command.action == @selector(toggleStorySaved:)) {
BOOL isRead = [[self.appDelegate.activeStory objectForKey:@"starred"] boolValue];
if (isRead) {
command.title = @"Unsave This Story";
} else {
command.title = @"Save THis Story";
command.title = @"Save This Story";
}
} else if (command.action == @selector(toggleStoryUnread:)) {
BOOL isRead = [[self.appDelegate.activeStory objectForKey:@"read_status"] boolValue];
@ -275,6 +328,9 @@
}
}
#pragma mark -
#pragma mark File menu
- (IBAction)reloadFeeds:(id)sender {
[appDelegate reloadFeedsView:NO];
}
@ -312,6 +368,9 @@
[self.appDelegate confirmLogout];
}
#pragma mark -
#pragma mark View menu
- (IBAction)chooseColumns:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
@ -325,6 +384,52 @@
[self.appDelegate.detailViewController updateLayoutWithReload:NO fetchFeeds:YES];
}
- (IBAction)chooseLayout:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
NSString *key = self.appDelegate.storiesCollection.storyTitlesPositionKey;
[[NSUserDefaults standardUserDefaults] setObject:string forKey:key];
[self.appDelegate.detailViewController updateLayoutWithReload:YES fetchFeeds:YES];
}
- (IBAction)chooseTitle:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
[[NSUserDefaults standardUserDefaults] setObject:string forKey:@"story_list_preview_text_size"];
[self.appDelegate resizePreviewSize];
}
- (IBAction)choosePreview:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
[[NSUserDefaults standardUserDefaults] setObject:string forKey:@"story_list_preview_images_size"];
[self.appDelegate resizePreviewSize];
}
- (IBAction)chooseGridColumns:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
[[NSUserDefaults standardUserDefaults] setObject:string forKey:@"grid_columns"];
[self.appDelegate.detailViewController updateLayoutWithReload:YES fetchFeeds:YES];
}
- (IBAction)chooseGridHeight:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
[[NSUserDefaults standardUserDefaults] setObject:string forKey:@"grid_height"];
[self.appDelegate.detailViewController updateLayoutWithReload:YES fetchFeeds:YES];
}
- (IBAction)chooseFontSize:(id)sender {
UICommand *command = sender;
NSString *string = command.propertyList;
@ -351,6 +456,66 @@
[ThemeManager themeManager].theme = string;
}
#pragma mark -
#pragma mark Site menu
- (IBAction)moveSite:(id)sender {
[self.appDelegate.feedDetailViewController openMoveView:self.appDelegate.navigationController];
}
- (IBAction)openRenameSite:(id)sender {
[self.appDelegate.feedDetailViewController openRenameSite];
}
- (IBAction)muteSite:(id)sender {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"Are you sure you wish to mute %@?", self.appDelegate.storiesCollection.activeTitle] message:nil preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle: @"Mute Site" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {
[alertController dismissViewControllerAnimated:YES completion:nil];
[self.appDelegate.feedDetailViewController muteSite];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
- (IBAction)deleteSite:(id)sender {
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:[NSString stringWithFormat:@"Are you sure you wish to delete %@?", self.appDelegate.storiesCollection.activeTitle] message:nil preferredStyle:UIAlertControllerStyleAlert];
[alertController addAction:[UIAlertAction actionWithTitle: @"Delete Site" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * action) {
[alertController dismissViewControllerAnimated:YES completion:nil];
[self.appDelegate.feedDetailViewController deleteSite];
}]];
[alertController addAction:[UIAlertAction actionWithTitle:@"Cancel"
style:UIAlertActionStyleCancel handler:nil]];
[self presentViewController:alertController animated:YES completion:nil];
}
- (IBAction)openTrainSite:(id)sender {
[self.appDelegate.feedDetailViewController openTrainSite];
}
- (IBAction)openNotifications:(id)sender {
[self.appDelegate.feedDetailViewController openNotifications:sender];
}
- (IBAction)openStatistics:(id)sender {
[self.appDelegate.feedDetailViewController openStatistics:sender];
}
- (IBAction)instaFetchFeed:(id)sender {
[self.appDelegate.feedDetailViewController instafetchFeed];
}
- (IBAction)doMarkAllRead:(id)sender {
[self.appDelegate.feedDetailViewController doMarkAllRead:sender];
}
#pragma mark -
#pragma mark Story menu
- (IBAction)showSendTo:(id)sender {
[appDelegate showSendTo:self sender:sender];
}
- (IBAction)showTrain:(id)sender {
[self.appDelegate openTrainStory:self.appDelegate.storyPagesViewController.fontSettingsButton];
}

View file

@ -110,6 +110,7 @@
- (void)loadStoryAtRow:(NSInteger)row;
- (void)redrawUnreadStory;
- (IBAction)doOpenMarkReadMenu:(id)sender;
- (IBAction)doMarkAllRead:(id)sender;
- (IBAction)doOpenSettingsMenu:(id)sender;
- (void)deleteSite;
- (void)deleteFolder;
@ -132,4 +133,7 @@
- (void)failedMarkAsUnsaved:(NSDictionary *)params;
- (void)failedMarkAsUnread:(NSDictionary *)params;
- (void)confirmDeleteSite:(UINavigationController *)menuNavigationController;
- (void)openMoveView:(UINavigationController *)menuNavigationController;
@end

View file

@ -764,7 +764,7 @@ typedef NS_ENUM(NSUInteger, FeedSection)
}
- (void)beginOfflineTimer {
if ([self.storiesCollection.activeFolder isEqualToString:@"infrequent"]) {
if (self.storiesCollection.isInfrequent) {
return;
}
@ -2442,11 +2442,6 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
appDelegate.storiesCollection.isReadView;
}
- (BOOL)isInfrequent {
return appDelegate.storiesCollection.isRiverView &&
[appDelegate.storiesCollection.activeFolder isEqualToString:@"infrequent"];
}
- (IBAction)doShowFeeds:(id)sender {
[self.appDelegate showColumn:UISplitViewControllerColumnPrimary debugInfo:@"showFeeds"];
}
@ -2461,8 +2456,8 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
MenuViewController *viewController = [MenuViewController new];
__weak MenuViewController *weakViewController = viewController;
BOOL everything = [appDelegate.storiesCollection.activeFolder isEqualToString:@"everything"];
BOOL infrequent = [self isInfrequent];
BOOL everything = appDelegate.storiesCollection.isEverything;
BOOL infrequent = appDelegate.storiesCollection.isInfrequent;
BOOL river = [self isRiver];
BOOL read = appDelegate.storiesCollection.isReadView;
BOOL widget = appDelegate.storiesCollection.isWidgetView;
@ -3233,7 +3228,7 @@ didEndSwipingSwipingWithState:(MCSwipeTableViewCellState)state
- (BOOL)canPullToRefresh {
BOOL river = appDelegate.storiesCollection.isRiverView;
BOOL infrequent = [self isInfrequent];
BOOL infrequent = appDelegate.storiesCollection.isInfrequent;
BOOL read = appDelegate.storiesCollection.isReadView;
BOOL widget = appDelegate.storiesCollection.isWidgetView;
BOOL saved = appDelegate.storiesCollection.isSavedView;

View file

@ -29,10 +29,6 @@ class FeedDetailViewController: FeedDetailObjCViewController {
case loading
}
var isGrid: Bool {
return appDelegate.detailViewController.layout == .grid
}
var wasGrid: Bool {
return appDelegate.detailViewController.wasGrid
}

View file

@ -60,7 +60,10 @@
@property (nonatomic, readwrite) BOOL showHiddenStories;
@property (nonatomic, readwrite) BOOL inSearch;
@property (nonatomic, readonly) BOOL isEverything;
@property (nonatomic, readonly) BOOL isInfrequent;
@property (nonatomic, readonly) BOOL isRiverOrSocial;
@property (nonatomic, readonly) BOOL isCustomFolder;
@property (nonatomic, readonly) BOOL isCustomFolderOrFeed;
@property (nonatomic) NSString *searchQuery;
@property (nonatomic) NSString *savedSearchQuery;

View file

@ -101,10 +101,22 @@
return [activeFolder isEqualToString:@"everything"];
}
- (BOOL)isInfrequent {
return [activeFolder isEqualToString:@"infrequent"];
}
- (BOOL)isRiverOrSocial {
return self.isRiverView || self.isSavedView || self.isReadView || self.isWidgetView || self.isSocialView || self.isSocialRiverView;
}
- (BOOL)isCustomFolder {
return self.isRiverView && !self.isEverything && !self.isInfrequent && !self.isSavedView && !self.isReadView && !self.isSocialView && !self.isWidgetView;
}
- (BOOL)isCustomFolderOrFeed {
return !self.isRiverView || self.isCustomFolder;
}
#pragma mark - Story Traversal
- (BOOL)isStoryUnread:(NSDictionary *)story {

View file

@ -2251,9 +2251,11 @@
}
- (BOOL)canPerformAction:(SEL)action withSender:(id)sender {
if ([self respondsToSelector:action])
return self.noStoryMessage.hidden;
return [super canPerformAction:action withSender:sender];
if ([self respondsToSelector:action]) {
return [super canPerformAction:action withSender:sender] && self.noStoryMessage.hidden;
} else {
return [super canPerformAction:action withSender:sender];
}
}
# pragma mark -

View file

@ -372,6 +372,151 @@
</command>
</children>
</menu>
<menu title="Layout" id="2UT-ZB-x5H">
<children>
<command title="Left" propertyListString="titles_on_left" menuElementState="on" id="SHF-Gm-yHM">
<connections>
<action selector="chooseLayout:" destination="J28-e1-gcC" id="v7b-YA-qHb"/>
</connections>
</command>
<command title="Top" propertyListString="titles_on_top" id="Zeq-Nu-dqs">
<connections>
<action selector="chooseLayout:" destination="J28-e1-gcC" id="E0V-4w-fMx"/>
</connections>
</command>
<command title="Bottom" propertyListString="titles_on_bottom" id="iQo-Uv-UPm">
<connections>
<action selector="chooseLayout:" destination="J28-e1-gcC" id="APi-KB-zyb"/>
</connections>
</command>
<command title="Grid" propertyListString="titles_in_grid" id="hc6-3c-pEr">
<connections>
<action selector="chooseLayout:" destination="J28-e1-gcC" id="lPQ-q9-ULB"/>
</connections>
</command>
</children>
</menu>
<menu title="Inline Menu" id="rEb-O5-WxE">
<menuOptions key="menuOptions" displayInline="YES"/>
</menu>
<menu title="Story Preview" id="11o-Ny-Ay8">
<children>
<command title="Only Title" propertyListString="title" menuElementState="on" id="3VQ-tS-tca">
<connections>
<action selector="chooseTitle:" destination="J28-e1-gcC" id="dVZ-e9-eMx"/>
</connections>
</command>
<command title="Short" propertyListString="short" id="kKo-nO-rdD">
<connections>
<action selector="chooseTitle:" destination="J28-e1-gcC" id="L2L-i9-jJu"/>
</connections>
</command>
<command title="Medium" propertyListString="medium" id="8kl-JH-cAR">
<connections>
<action selector="chooseTitle:" destination="J28-e1-gcC" id="cHy-Qn-qYA"/>
</connections>
</command>
<command title="Long" propertyListString="long" id="6c5-Aa-VWc">
<connections>
<action selector="chooseTitle:" destination="J28-e1-gcC" id="laa-aj-lRm"/>
</connections>
</command>
</children>
</menu>
<menu title="Image Preview" id="JBe-EV-vd0">
<children>
<command title="None" propertyListString="none" menuElementState="on" id="xUQ-iP-Xav">
<keyModifierFlags key="modifierFlags" command="YES"/>
<connections>
<action selector="choosePreview:" destination="J28-e1-gcC" id="ydY-6y-Vu7"/>
</connections>
</command>
<command title="Small Left" propertyListString="small_left" id="pgV-T3-JgP">
<connections>
<action selector="choosePreview:" destination="J28-e1-gcC" id="6bd-eh-Jkf"/>
</connections>
</command>
<command title="Large Left" propertyListString="large_left" id="rJC-gP-ub8">
<connections>
<action selector="choosePreview:" destination="J28-e1-gcC" id="dXF-jY-GB9"/>
</connections>
</command>
<command title="Large Right" propertyListString="large_right" id="DHS-T6-h9f">
<connections>
<action selector="choosePreview:" destination="J28-e1-gcC" id="ZrD-28-3r7"/>
</connections>
</command>
<command title="Small Right" propertyListString="small_right" id="0ZJ-kc-nG7">
<connections>
<action selector="choosePreview:" destination="J28-e1-gcC" id="yQ3-7h-2eZ"/>
</connections>
</command>
</children>
</menu>
<menu title="Inline Menu" id="uRc-h2-2ur">
<menuOptions key="menuOptions" displayInline="YES"/>
</menu>
<menu title="Grid Columns" id="gPp-Vp-Aqb">
<children>
<command title="Automatic" propertyListString="auto" menuElementState="on" id="W9M-jz-7Wo">
<connections>
<action selector="chooseGridColumns:" destination="J28-e1-gcC" id="r7t-6H-NdZ"/>
</connections>
</command>
<command title="1" propertyListString="1" id="COJ-8T-jFG">
<connections>
<action selector="chooseGridColumns:" destination="J28-e1-gcC" id="sg6-ao-Ca6"/>
</connections>
</command>
<command title="2" propertyListString="2" id="Enn-ac-qRo">
<connections>
<action selector="chooseGridColumns:" destination="J28-e1-gcC" id="9uC-A2-7y3"/>
</connections>
</command>
<command title="3" propertyListString="3" id="LL9-1i-7gs">
<connections>
<action selector="chooseGridColumns:" destination="J28-e1-gcC" id="7Ki-1P-JNN"/>
</connections>
</command>
<command title="4" propertyListString="4" id="TAe-RC-Isj">
<connections>
<action selector="chooseGridColumns:" destination="J28-e1-gcC" id="8rE-3w-9G0"/>
</connections>
</command>
</children>
</menu>
<menu title="Grid Height" id="YgQ-8j-p4J">
<children>
<command title="Extra Short" propertyListString="xs" id="QkE-4U-qCZ">
<connections>
<action selector="chooseGridHeight:" destination="J28-e1-gcC" id="gM2-NN-oey"/>
</connections>
</command>
<command title="Short" propertyListString="short" id="QiP-55-H7Q">
<connections>
<action selector="chooseGridHeight:" destination="J28-e1-gcC" id="ayB-De-Drm"/>
</connections>
</command>
<command title="Medium" propertyListString="medium" id="Z1h-b3-VUc">
<connections>
<action selector="chooseGridHeight:" destination="J28-e1-gcC" id="2L5-oA-LRA"/>
</connections>
</command>
<command title="Tall" propertyListString="tall" id="nuu-UE-jx7">
<connections>
<action selector="chooseGridHeight:" destination="J28-e1-gcC" id="NWu-Lm-Mcy"/>
</connections>
</command>
<command title="Extra Tall" propertyListString="xl" id="7pm-OP-kNf">
<connections>
<action selector="chooseGridHeight:" destination="J28-e1-gcC" id="rZo-Hs-UjD"/>
</connections>
</command>
</children>
</menu>
<menu title="Inline Menu" id="gSR-Tp-3Cp">
<menuOptions key="menuOptions" displayInline="YES"/>
</menu>
<menu title="Text Size" id="si2-4b-JdU">
<children>
<command title="Extra Small" propertyListString="xs" input="5" id="1J1-HG-ovw">
@ -453,15 +598,14 @@
<children>
<menu title="Manage" id="uU0-yq-BC8">
<children>
<command title="Move to Another Folder…" id="LG6-8T-2ce"/>
<command title="Rename Site…" id="ogl-RU-MAV">
<connections>
<action selector="openRenameSite" destination="J28-e1-gcC" id="aCr-ei-bqw"/>
<action selector="openRenameSite:" destination="J28-e1-gcC" id="uUs-SK-j71"/>
</connections>
</command>
<command title="Mute Site" id="USf-x7-etD">
<command title="Mute Site" id="USf-x7-etD">
<connections>
<action selector="muteSite" destination="J28-e1-gcC" id="v0a-pd-QV6"/>
<action selector="muteSite:" destination="J28-e1-gcC" id="J7R-Wr-qZZ"/>
</connections>
</command>
<menu id="HKb-sW-DLl">
@ -469,6 +613,9 @@
<children>
<command title="Delete Site…" id="RuQ-ea-MNw">
<menuElementAttributes key="attributes" destructive="YES"/>
<connections>
<action selector="deleteSite:" destination="J28-e1-gcC" id="iu8-R6-1oB"/>
</connections>
</command>
</children>
</menu>
@ -479,7 +626,7 @@
</menu>
<command title="Train…" id="hIh-yf-xP8">
<connections>
<action selector="openTrainSite" destination="J28-e1-gcC" id="7OO-UO-3Ro"/>
<action selector="openTrainSite:" destination="J28-e1-gcC" id="5Ka-Ra-khJ"/>
</connections>
</command>
<command title="Notifications…" id="zeT-bO-F72">
@ -498,7 +645,7 @@
<command title="Insta-Fetch Stories" input="r" id="skD-1M-foi">
<keyModifierFlags key="modifierFlags" option="YES" command="YES"/>
<connections>
<action selector="instafetchFeed" destination="J28-e1-gcC" id="kAI-0o-ni8"/>
<action selector="instaFetchFeed:" destination="J28-e1-gcC" id="soI-a3-gDT"/>
</connections>
</command>
<menu id="ze6-Sa-c31">
@ -528,7 +675,11 @@
<action selector="toggleStoryUnread:" destination="J28-e1-gcC" id="iNX-pg-hgT"/>
</connections>
</command>
<command title="Send To…" id="d3Y-Ik-PAB"/>
<command title="Send To…" id="d3Y-Ik-PAB">
<connections>
<action selector="showSendTo:" destination="J28-e1-gcC" id="XJ8-Tz-tG6"/>
</connections>
</command>
<command title="Train This Story…" id="GJC-ae-c80">
<connections>
<action selector="showTrain:" destination="J28-e1-gcC" id="pr3-BS-f2g"/>