refactor: migrate to non-deprecated allowedContentTypes on macOS (#46646)
		
	refactor: migrated to non-deprecated allowedContentTypes on macOS Co-authored-by: trop[bot] <37223003+trop[bot]@users.noreply.github.com> Co-authored-by: Shelley Vohr <shelley.vohr@gmail.com>
This commit is contained in:
		
					parent
					
						
							
								c785b40703
							
						
					
				
			
			
				commit
				
					
						f8a55100cc
					
				
			
		
					 1 changed files with 42 additions and 27 deletions
				
			
		| 
						 | 
				
			
			@ -11,6 +11,7 @@
 | 
			
		|||
 | 
			
		||||
#import <Cocoa/Cocoa.h>
 | 
			
		||||
#import <CoreServices/CoreServices.h>
 | 
			
		||||
#import <UniformTypeIdentifiers/UniformTypeIdentifiers.h>
 | 
			
		||||
 | 
			
		||||
#include "base/apple/foundation_util.h"
 | 
			
		||||
#include "base/apple/scoped_cftyperef.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +30,7 @@
 | 
			
		|||
@interface PopUpButtonHandler : NSObject
 | 
			
		||||
 | 
			
		||||
@property(nonatomic, assign) NSSavePanel* savePanel;
 | 
			
		||||
@property(nonatomic, strong) NSArray* fileTypesList;
 | 
			
		||||
@property(nonatomic, strong) NSArray* contentTypesList;
 | 
			
		||||
 | 
			
		||||
- (instancetype)initWithPanel:(NSSavePanel*)panel
 | 
			
		||||
                 andTypesList:(NSArray*)typesList;
 | 
			
		||||
| 
						 | 
				
			
			@ -40,14 +41,14 @@
 | 
			
		|||
@implementation PopUpButtonHandler
 | 
			
		||||
 | 
			
		||||
@synthesize savePanel;
 | 
			
		||||
@synthesize fileTypesList;
 | 
			
		||||
@synthesize contentTypesList;
 | 
			
		||||
 | 
			
		||||
- (instancetype)initWithPanel:(NSSavePanel*)panel
 | 
			
		||||
                 andTypesList:(NSArray*)typesList {
 | 
			
		||||
  self = [super init];
 | 
			
		||||
  if (self) {
 | 
			
		||||
    [self setSavePanel:panel];
 | 
			
		||||
    [self setFileTypesList:typesList];
 | 
			
		||||
    [self setContentTypesList:typesList];
 | 
			
		||||
  }
 | 
			
		||||
  return self;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -55,15 +56,19 @@
 | 
			
		|||
- (void)selectFormat:(id)sender {
 | 
			
		||||
  NSPopUpButton* button = (NSPopUpButton*)sender;
 | 
			
		||||
  NSInteger selectedItemIndex = [button indexOfSelectedItem];
 | 
			
		||||
  NSArray* list = [self fileTypesList];
 | 
			
		||||
  NSArray* fileTypes = [list objectAtIndex:selectedItemIndex];
 | 
			
		||||
  NSArray* list = [self contentTypesList];
 | 
			
		||||
  NSArray* content_types = [list objectAtIndex:selectedItemIndex];
 | 
			
		||||
 | 
			
		||||
  // If we meet a '*' file extension, we allow all the file types and no
 | 
			
		||||
  // need to set the specified file types.
 | 
			
		||||
  if ([fileTypes count] == 0 || [fileTypes containsObject:@"*"])
 | 
			
		||||
    [[self savePanel] setAllowedFileTypes:nil];
 | 
			
		||||
  else
 | 
			
		||||
    [[self savePanel] setAllowedFileTypes:fileTypes];
 | 
			
		||||
  __block BOOL allowAllFiles = NO;
 | 
			
		||||
  [content_types
 | 
			
		||||
      enumerateObjectsUsingBlock:^(UTType* type, NSUInteger idx, BOOL* stop) {
 | 
			
		||||
        if ([[type preferredFilenameExtension] isEqual:@"*"]) {
 | 
			
		||||
          allowAllFiles = YES;
 | 
			
		||||
          *stop = YES;
 | 
			
		||||
        }
 | 
			
		||||
      }];
 | 
			
		||||
 | 
			
		||||
  [[self savePanel] setAllowedContentTypes:allowAllFiles ? @[] : content_types];
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@end
 | 
			
		||||
| 
						 | 
				
			
			@ -100,9 +105,10 @@ void SetAllowedFileTypes(NSSavePanel* dialog, const Filters& filters) {
 | 
			
		|||
 | 
			
		||||
  // Create array to keep file types and their name.
 | 
			
		||||
  for (const Filter& filter : filters) {
 | 
			
		||||
    NSMutableOrderedSet* file_type_set =
 | 
			
		||||
    NSMutableOrderedSet* content_types_set =
 | 
			
		||||
        [NSMutableOrderedSet orderedSetWithCapacity:filters.size()];
 | 
			
		||||
    [filter_names addObject:@(filter.first.c_str())];
 | 
			
		||||
 | 
			
		||||
    for (std::string ext : filter.second) {
 | 
			
		||||
      // macOS is incapable of understanding multiple file extensions,
 | 
			
		||||
      // so we need to tokenize the extension that's been passed in.
 | 
			
		||||
| 
						 | 
				
			
			@ -113,25 +119,34 @@ void SetAllowedFileTypes(NSSavePanel* dialog, const Filters& filters) {
 | 
			
		|||
        ext.erase(0, pos + 1);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      [file_type_set addObject:@(ext.c_str())];
 | 
			
		||||
      if (ext == "*") {
 | 
			
		||||
        [content_types_set addObject:[UTType typeWithFilenameExtension:@"*"]];
 | 
			
		||||
        break;
 | 
			
		||||
      } else {
 | 
			
		||||
        if (UTType* utt = [UTType typeWithFilenameExtension:@(ext.c_str())])
 | 
			
		||||
          [content_types_set addObject:utt];
 | 
			
		||||
      }
 | 
			
		||||
    [file_types_list addObject:[file_type_set array]];
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
  // Passing empty array to setAllowedFileTypes will cause exception.
 | 
			
		||||
  NSArray* file_types = nil;
 | 
			
		||||
  NSUInteger count = [file_types_list count];
 | 
			
		||||
  if (count > 0) {
 | 
			
		||||
    file_types = [[file_types_list objectAtIndex:0] allObjects];
 | 
			
		||||
    // If we meet a '*' file extension, we allow all the file types and no
 | 
			
		||||
    // need to set the specified file types.
 | 
			
		||||
    if ([file_types count] == 0 || [file_types containsObject:@"*"])
 | 
			
		||||
      file_types = nil;
 | 
			
		||||
    [file_types_list addObject:content_types_set];
 | 
			
		||||
  }
 | 
			
		||||
  [dialog setAllowedFileTypes:file_types];
 | 
			
		||||
 | 
			
		||||
  if (count <= 1)
 | 
			
		||||
    return;  // don't add file format picker
 | 
			
		||||
  // Don't add file format picker.
 | 
			
		||||
  if ([file_types_list count] <= 1)
 | 
			
		||||
    return;
 | 
			
		||||
 | 
			
		||||
  NSArray* content_types = [file_types_list objectAtIndex:0];
 | 
			
		||||
 | 
			
		||||
  __block BOOL allowAllFiles = NO;
 | 
			
		||||
  [content_types
 | 
			
		||||
      enumerateObjectsUsingBlock:^(UTType* type, NSUInteger idx, BOOL* stop) {
 | 
			
		||||
        if ([[type preferredFilenameExtension] isEqual:@"*"]) {
 | 
			
		||||
          allowAllFiles = YES;
 | 
			
		||||
          *stop = YES;
 | 
			
		||||
        }
 | 
			
		||||
      }];
 | 
			
		||||
 | 
			
		||||
  [dialog setAllowedContentTypes:allowAllFiles ? @[] : content_types];
 | 
			
		||||
 | 
			
		||||
  // Add file format picker.
 | 
			
		||||
  ElectronAccessoryView* accessoryView = [[ElectronAccessoryView alloc]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue