From f3e37e2a84fa5f6323e6eac079bbbe18cfe95175 Mon Sep 17 00:00:00 2001 From: relikd Date: Sat, 12 Aug 2023 11:50:45 +0200 Subject: [PATCH] feat: allow manual edit of bundle id --- source/AppDelegate.m | 65 ++++++++- source/Info.plist | 4 +- source/MainMenu.xib | 335 +++++++++++++++++++++++++++++++++++++++++-- 3 files changed, 384 insertions(+), 20 deletions(-) diff --git a/source/AppDelegate.m b/source/AppDelegate.m index 61e30f5..ae3fe96 100644 --- a/source/AppDelegate.m +++ b/source/AppDelegate.m @@ -62,12 +62,30 @@ static NSMutableDictionary *nameCache; [s prepareAvailable]; return s; } +- (BOOL)setBundleId:(NSString*)bundleId { + OSStatus s = LSSetDefaultHandlerForURLScheme((__bridge CFStringRef)self.name, (__bridge CFStringRef)bundleId); + return s == 0; +} /// Select app at index and set it default. Checks whether set successful. Ignores setting same id. - (void)setDefault:(NSUInteger)index { AppId *app = self.available[index]; - if (app == self.registered) return; - OSStatus s = LSSetDefaultHandlerForURLScheme((__bridge CFStringRef)self.name, (__bridge CFStringRef)app.bundleId); - if (s == 0) self.registered = app; + if (app != self.registered && [self setBundleId:app.bundleId]) + self.registered = app; +} +/// Add bundle id to available if not already. Then set the default. +- (void)setNewDefault:(NSString*)bundleId { + NSUInteger idx = [self.available indexOfObjectPassingTest:^BOOL(AppId * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + return [obj.bundleId isEqualToString:bundleId]; + }]; + if (idx != NSNotFound) { + [self setDefault:idx]; + } else { + if ([self setBundleId:bundleId]) { + AppId *newApp = [AppId bundleId:bundleId]; + self.available = [self.available arrayByAddingObject:newApp]; + self.registered = newApp; + } + } } /// Gathers all registered application for scheme and inserts to available - (void)prepareAvailable { @@ -87,6 +105,33 @@ static NSMutableDictionary *nameCache; @end +// ################################################################ +// # +// # MARK: - Modal - +// # +// ################################################################ + +@interface ChangeSchemeModal : NSPanel +@property (weak) IBOutlet NSTextField *schemeLabel; +@property (weak) IBOutlet NSTextField *bundleIdField; +@property (weak) Scheme* selectedScheme; +@end + +@implementation ChangeSchemeModal +- (void)setScheme:(Scheme*)scheme { + self.selectedScheme = scheme; + [self.schemeLabel setStringValue:[@"URL scheme: " stringByAppendingString:scheme.name]]; + [self.bundleIdField setStringValue:scheme.registered.bundleId]; +} +- (IBAction)close:(NSButton*)sender { + [self close]; +} +- (IBAction)save:(NSButton*)sender { + [self.selectedScheme setNewDefault: self.bundleIdField.stringValue]; + [self close]; +} +@end + // ################################################################ // # // # MARK: - Main - @@ -96,6 +141,7 @@ static NSMutableDictionary *nameCache; @interface AppDelegate () @property (weak) IBOutlet NSWindow *window; @property (weak) IBOutlet NSTableView *table; +@property (weak) IBOutlet ChangeSchemeModal *modal; @property (strong) NSMutableArray *data; @end @@ -114,8 +160,8 @@ static NSMutableDictionary *nameCache; - (void)applicationDidFinishLaunching:(NSNotification *)aNotification { for (NSString *urlScheme in [self readLaunchServicesSchemes]) { Scheme *s = [Scheme name:urlScheme]; - if (s.available.count > 1) - [self.data addObject:s]; + // if (s.available.count > 1) + [self.data addObject:s]; } [self.data sortUsingDescriptors:@[[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]]; [self.table reloadData]; @@ -151,8 +197,13 @@ static NSMutableDictionary *nameCache; } // table view data source - (void)tableView:(NSTableView *)tableView setObjectValue:(nullable id)object forTableColumn:(nullable NSTableColumn *)tableColumn row:(NSInteger)row { - NSInteger idx = [[tableView selectedCell] indexOfSelectedItem]; - [self.data[row] setDefault:idx]; + if ([tableColumn.identifier isEqualToString:@"colEdit"]) { + [self.modal setScheme:self.data[row]]; + [tableView.window beginSheet:self.modal completionHandler:nil]; + } else if ([tableColumn.identifier isEqualToString:@"colApp"]) { + NSInteger idx = [[tableView selectedCell] indexOfSelectedItem]; + [self.data[row] setDefault:idx]; + } } // combo box data source - (NSInteger)numberOfItemsInComboBoxCell:(NSComboBoxCell *)comboBoxCell { diff --git a/source/Info.plist b/source/Info.plist index 0f28ca1..e67d1ca 100644 --- a/source/Info.plist +++ b/source/Info.plist @@ -17,9 +17,9 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.0.0 + 1.1.0 CFBundleVersion - 189 + 272 LSApplicationCategoryType public.app-category.utilities LSMinimumSystemVersion diff --git a/source/MainMenu.xib b/source/MainMenu.xib index f5afab9..3371083 100644 --- a/source/MainMenu.xib +++ b/source/MainMenu.xib @@ -1,8 +1,8 @@ - + - + @@ -15,6 +15,7 @@ + @@ -65,6 +66,225 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -96,13 +316,13 @@ - + - + @@ -111,13 +331,13 @@ - + - + @@ -125,7 +345,6 @@ - @@ -137,9 +356,8 @@ - + - @@ -154,6 +372,16 @@ + + + + + + + + + + @@ -162,11 +390,11 @@ - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +