mirror of
https://github.com/transmission/transmission
synced 2024-12-22 07:42:37 +00:00
feat: support multiple URL objects from pasteboard (#6467)
This commit is contained in:
parent
376d806b2e
commit
6647df9be6
3 changed files with 44 additions and 33 deletions
|
@ -46,6 +46,8 @@ typedef NS_ENUM(NSUInteger, AddType) { //
|
||||||
- (void)openURL:(NSString*)urlString;
|
- (void)openURL:(NSString*)urlString;
|
||||||
- (IBAction)openURLShowSheet:(id)sender;
|
- (IBAction)openURLShowSheet:(id)sender;
|
||||||
|
|
||||||
|
- (void)openPasteboard;
|
||||||
|
|
||||||
@property(nonatomic, readonly) tr_session* sessionHandle;
|
@property(nonatomic, readonly) tr_session* sessionHandle;
|
||||||
|
|
||||||
- (IBAction)createFile:(id)sender;
|
- (IBAction)createFile:(id)sender;
|
||||||
|
|
|
@ -1680,6 +1680,47 @@ void onTorrentCompletenessChanged(tr_torrent* tor, tr_completeness status, bool
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)openPasteboard
|
||||||
|
{
|
||||||
|
// 1. If Pasteboard contains URL objects, we treat those and only those
|
||||||
|
NSArray<NSURL*>* arrayOfURLs = [NSPasteboard.generalPasteboard readObjectsForClasses:@[ [NSURL class] ] options:nil];
|
||||||
|
|
||||||
|
if (arrayOfURLs.count > 0)
|
||||||
|
{
|
||||||
|
for (NSURL* url in arrayOfURLs)
|
||||||
|
{
|
||||||
|
[self openURL:url.absoluteString];
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. If Pasteboard contains String objects, we'll search for magnet or links
|
||||||
|
NSArray<NSString*>* arrayOfStrings = [NSPasteboard.generalPasteboard readObjectsForClasses:@[ [NSString class] ] options:nil];
|
||||||
|
if (arrayOfStrings.count == 0)
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
|
||||||
|
for (NSString* itemString in arrayOfStrings)
|
||||||
|
{
|
||||||
|
NSArray<NSString*>* itemLines = [itemString componentsSeparatedByCharactersInSet:NSCharacterSet.newlineCharacterSet];
|
||||||
|
for (__strong NSString* pbItem in itemLines)
|
||||||
|
{
|
||||||
|
pbItem = [pbItem stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
|
||||||
|
if ([pbItem rangeOfString:@"magnet:" options:(NSAnchoredSearch | NSCaseInsensitiveSearch)].location != NSNotFound)
|
||||||
|
{
|
||||||
|
[self openURL:pbItem];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
#warning only accept full text?
|
||||||
|
for (NSTextCheckingResult* result in [detector matchesInString:pbItem options:0 range:NSMakeRange(0, pbItem.length)])
|
||||||
|
[self openURL:result.URL.absoluteString];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
- (void)createFile:(id)sender
|
- (void)createFile:(id)sender
|
||||||
{
|
{
|
||||||
[CreatorWindowController createTorrentFile:self.fLib];
|
[CreatorWindowController createTorrentFile:self.fLib];
|
||||||
|
|
|
@ -661,39 +661,7 @@ static NSTimeInterval const kToggleProgressSeconds = 0.175;
|
||||||
|
|
||||||
- (void)paste:(id)sender
|
- (void)paste:(id)sender
|
||||||
{
|
{
|
||||||
NSURL* url;
|
[self.fController openPasteboard];
|
||||||
if ((url = [NSURL URLFromPasteboard:NSPasteboard.generalPasteboard]))
|
|
||||||
{
|
|
||||||
[self.fController openURL:url.absoluteString];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NSArray<NSString*>* items = [NSPasteboard.generalPasteboard readObjectsForClasses:@[ [NSString class] ] options:nil];
|
|
||||||
if (!items)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
NSDataDetector* detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeLink error:nil];
|
|
||||||
for (NSString* itemString in items)
|
|
||||||
{
|
|
||||||
NSArray<NSString*>* itemLines = [itemString componentsSeparatedByCharactersInSet:NSCharacterSet.newlineCharacterSet];
|
|
||||||
for (__strong NSString* pbItem in itemLines)
|
|
||||||
{
|
|
||||||
pbItem = [pbItem stringByTrimmingCharactersInSet:NSCharacterSet.whitespaceAndNewlineCharacterSet];
|
|
||||||
if ([pbItem rangeOfString:@"magnet:" options:(NSAnchoredSearch | NSCaseInsensitiveSearch)].location != NSNotFound)
|
|
||||||
{
|
|
||||||
[self.fController openURL:pbItem];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
#warning only accept full text?
|
|
||||||
for (NSTextCheckingResult* result in [detector matchesInString:pbItem options:0
|
|
||||||
range:NSMakeRange(0, pbItem.length)])
|
|
||||||
[self.fController openURL:result.URL.absoluteString];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)validateMenuItem:(NSMenuItem*)menuItem
|
- (BOOL)validateMenuItem:(NSMenuItem*)menuItem
|
||||||
|
|
Loading…
Reference in a new issue