From 132de4e453befd10a7821dffe61aaad82d52e7bc Mon Sep 17 00:00:00 2001 From: James Power Date: Thu, 12 Mar 2026 23:17:24 -0400 Subject: [PATCH 1/3] Replace deprecated UITableViewCellAccessoryDetailDisclosureButton with DetailButton. --- Vendored/QuickDialog/Sources/QLabelElement.m | 2 +- Vendored/QuickDialog/Sources/QRootBuilder.m | 2 +- .../Vendor/CMTextStylePicker/CMFontSelectTableViewController.m | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Vendored/QuickDialog/Sources/QLabelElement.m b/Vendored/QuickDialog/Sources/QLabelElement.m index 02db3a0..6e432cd 100644 --- a/Vendored/QuickDialog/Sources/QLabelElement.m +++ b/Vendored/QuickDialog/Sources/QLabelElement.m @@ -62,7 +62,7 @@ - (UITableViewCell *)getCellForTableView:(QuickDialogTableView *)tableView contr cell.textLabel.text = _title; cell.detailTextLabel.text = [_value description]; cell.imageView.image = _image; - cell.accessoryType = _accessoryType != UITableViewCellAccessoryNone ? _accessoryType : self.controllerAccessoryAction != nil ? UITableViewCellAccessoryDetailDisclosureButton : ( self.sections!= nil || self.controllerAction!=nil ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone); + cell.accessoryType = _accessoryType != UITableViewCellAccessoryNone ? _accessoryType : self.controllerAccessoryAction != nil ? UITableViewCellAccessoryDetailButton : ( self.sections!= nil || self.controllerAction!=nil ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone); cell.selectionStyle = self.sections!= nil || self.controllerAction!=nil || self.onSelected!=nil ? UITableViewCellSelectionStyleBlue: UITableViewCellSelectionStyleNone; return cell; } diff --git a/Vendored/QuickDialog/Sources/QRootBuilder.m b/Vendored/QuickDialog/Sources/QRootBuilder.m index f8685d7..0832267 100644 --- a/Vendored/QuickDialog/Sources/QRootBuilder.m +++ b/Vendored/QuickDialog/Sources/QRootBuilder.m @@ -195,7 +195,7 @@ - (void)initializeMappings { nil], @"indicatorViewStyle", [[NSDictionary alloc] initWithObjectsAndKeys: - [NSNumber numberWithInt:UITableViewCellAccessoryDetailDisclosureButton], @"DetailDisclosureButton", + [NSNumber numberWithInt:UITableViewCellAccessoryDetailButton], @"DetailDisclosureButton", [NSNumber numberWithInt:UITableViewCellAccessoryCheckmark], @"Checkmark", [NSNumber numberWithInt:UITableViewCellAccessoryDisclosureIndicator], @"DisclosureIndicator", [NSNumber numberWithInt:UITableViewCellAccessoryNone], @"None", diff --git a/src/Mudrammer/Vendor/CMTextStylePicker/CMFontSelectTableViewController.m b/src/Mudrammer/Vendor/CMTextStylePicker/CMFontSelectTableViewController.m index b43113d..a82cf35 100644 --- a/src/Mudrammer/Vendor/CMTextStylePicker/CMFontSelectTableViewController.m +++ b/src/Mudrammer/Vendor/CMTextStylePicker/CMFontSelectTableViewController.m @@ -118,7 +118,7 @@ - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(N fontNameLabel.font = [UIFont fontWithName:fontFamilyName size:18.0]; if ([[UIFont fontNamesForFamilyName:fontFamilyName] count] > 1) { - cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton; + cell.accessoryType = UITableViewCellAccessoryDetailButton; } else { cell.accessoryType = UITableViewCellAccessoryNone; From 5d3fa77fe232c4ad6633865ed855a15c87fc2045 Mon Sep 17 00:00:00 2001 From: James Power Date: Thu, 12 Mar 2026 23:28:51 -0400 Subject: [PATCH 2/3] Replace isIPad device checks with horizontalSizeClass trait collection checks. --- .../Controllers/Client/SPLMSSPViewController.m | 2 +- .../Controllers/Client/SSClientViewController.m | 8 ++++---- .../Client/SSWorldDisplayController.m | 4 ++-- .../Controllers/Settings/SPLFXWorldEditor.m | 2 +- .../Settings/SSSettingsViewController.m | 12 ++++++------ src/Mudrammer/Controllers/Settings/SSTGAEditor.m | 2 +- .../Settings/SSWorldEditViewController.m | 16 ++++++++++------ src/Mudrammer/SSThemes.m | 6 ++---- src/Mudrammer/Views/Cells/SSThemeCell.m | 2 +- src/Mudrammer/Views/SSMudView.m | 2 +- 10 files changed, 29 insertions(+), 27 deletions(-) diff --git a/src/Mudrammer/Controllers/Client/SPLMSSPViewController.m b/src/Mudrammer/Controllers/Client/SPLMSSPViewController.m index 2c52049..46b8311 100644 --- a/src/Mudrammer/Controllers/Client/SPLMSSPViewController.m +++ b/src/Mudrammer/Controllers/Client/SPLMSSPViewController.m @@ -36,7 +36,7 @@ - (void)configureCell { [self.contentView addSubview:self.label]; [self.label mas_makeConstraints:^(MASConstraintMaker *make) { make.top.and.right.and.bottom.equalTo(self.contentView); - make.left.equalTo(self.contentView).offset([[UIDevice currentDevice] isIPad] ? 20 : 16); + make.left.equalTo(self.contentView).offset(16); }]; } diff --git a/src/Mudrammer/Controllers/Client/SSClientViewController.m b/src/Mudrammer/Controllers/Client/SSClientViewController.m index c60acac..281754e 100644 --- a/src/Mudrammer/Controllers/Client/SSClientViewController.m +++ b/src/Mudrammer/Controllers/Client/SSClientViewController.m @@ -117,7 +117,7 @@ - (SSClientViewController *) init { _readParsingQueue = [NSOperationQueue ss_serialOperationQueueNamed:@"Read Queue"]; _writeQueue = [NSOperationQueue ss_serialOperationQueueNamed:@"Write Queue"]; - _titleView = [[SPLMUDTitleView alloc] initWithFrame:CGRectMake(0, 0, ([[UIDevice currentDevice] isIPad] ? 320 : 200), 44)]; + _titleView = [[SPLMUDTitleView alloc] initWithFrame:CGRectMake(0, 0, (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ? 320 : 200), 44)]; [self updateTitle:NSLocalizedString(@"DISCONNECTED", @"Disconnected")]; @weakify(self); @@ -485,7 +485,7 @@ - (void)tappedSettings:(id)sender { UINavigationController *settingsNav = [settings wrappedNavigationController]; settingsNav.delegate = self; - if ([[UIDevice currentDevice] isIPad]) { + if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { settingsNav.modalPresentationStyle = UIModalPresentationPopover; settingsNav.preferredContentSize = CGSizeMake([UIDevice preferredPopoverWidth], 600); UIPopoverPresentationController *popover = settingsNav.popoverPresentationController; @@ -533,7 +533,7 @@ - (void)editCurrentWorld:(id)sender { nav.modalPresentationStyle = UIModalPresentationFormSheet; [self presentViewController:nav animated:YES completion:nil]; #else - if( [[UIDevice currentDevice] isIPad] ) { + if( self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ) { nav.modalPresentationStyle = UIModalPresentationPopover; UIPopoverPresentationController *popover = nav.popoverPresentationController; popover.barButtonItem = self.editWorldButton; @@ -585,7 +585,7 @@ - (void)tappedMusic:(id)sender { picker.currentWorldIdentifier = currentWorldIdentifier; UINavigationController *nav = [picker wrappedNavigationController]; - if ([[UIDevice currentDevice] isIPad]) { + if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { nav.modalPresentationStyle = UIModalPresentationPopover; nav.preferredContentSize = CGSizeMake([UIDevice preferredPopoverWidth], 400); UIPopoverPresentationController *popover = nav.popoverPresentationController; diff --git a/src/Mudrammer/Controllers/Client/SSWorldDisplayController.m b/src/Mudrammer/Controllers/Client/SSWorldDisplayController.m index d4bac38..62e94d5 100644 --- a/src/Mudrammer/Controllers/Client/SSWorldDisplayController.m +++ b/src/Mudrammer/Controllers/Client/SSWorldDisplayController.m @@ -260,7 +260,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath WorldPickerSelectionBlock pickblock = ^(NSString *pickedWorldIdentifier) { @strongify(self); - if ([[UIDevice currentDevice] isIPad]) { + if (self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular) { [self.popoverPresenter dismissViewControllerAnimated:YES completion:nil]; [self addClientWithWorld:pickedWorldIdentifier]; } else { @@ -275,7 +275,7 @@ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath UINavigationController *nav = [picker wrappedNavigationController]; //nav.delegate = self; - if( [[UIDevice currentDevice] isIPad] ) { + if( self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ) { nav.modalPresentationStyle = UIModalPresentationPopover; nav.preferredContentSize = [picker preferredContentSize]; UIPopoverPresentationController *popover = nav.popoverPresentationController; diff --git a/src/Mudrammer/Controllers/Settings/SPLFXWorldEditor.m b/src/Mudrammer/Controllers/Settings/SPLFXWorldEditor.m index 547c79a..bba7ef0 100644 --- a/src/Mudrammer/Controllers/Settings/SPLFXWorldEditor.m +++ b/src/Mudrammer/Controllers/Settings/SPLFXWorldEditor.m @@ -56,7 +56,7 @@ - (void)viewDidLoad { [SSThemes configureTable:self.tableView]; - if (![[UIDevice currentDevice] isIPad]) { + if (self.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular) { self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelEditing:)]; diff --git a/src/Mudrammer/Controllers/Settings/SSSettingsViewController.m b/src/Mudrammer/Controllers/Settings/SSSettingsViewController.m index c9926ba..dda8dd3 100644 --- a/src/Mudrammer/Controllers/Settings/SSSettingsViewController.m +++ b/src/Mudrammer/Controllers/Settings/SSSettingsViewController.m @@ -49,12 +49,6 @@ - (SSSettingsViewController *) init { [SSThemes configureTable:self.tableView]; - if( ![[UIDevice currentDevice] isIPad] ) { - self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self - action:@selector(closeSettings:)]; - } - _kvoController = [FBKVOController controllerWithObserver:self]; for( NSString *key in OBS ) { @@ -85,6 +79,12 @@ - (void)dealloc { - (void)viewDidLoad { [super viewDidLoad]; + if (self.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular) { + self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone + target:self + action:@selector(closeSettings:)]; + } + @weakify(self); _dataSource = [[SSSectionedDataSource alloc] initWithItems:nil]; diff --git a/src/Mudrammer/Controllers/Settings/SSTGAEditor.m b/src/Mudrammer/Controllers/Settings/SSTGAEditor.m index cda788b..8f044dd 100644 --- a/src/Mudrammer/Controllers/Settings/SSTGAEditor.m +++ b/src/Mudrammer/Controllers/Settings/SSTGAEditor.m @@ -119,7 +119,7 @@ - (void)commonSetup { - (void)viewDidLoad { [super viewDidLoad]; - if(![[UIDevice currentDevice] isIPad] || self.navigationController.SPLNavigationIsAtRoot) { + if(self.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular || self.navigationController.SPLNavigationIsAtRoot) { self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelEditing:)]; diff --git a/src/Mudrammer/Controllers/Settings/SSWorldEditViewController.m b/src/Mudrammer/Controllers/Settings/SSWorldEditViewController.m index 63d7c34..3c2e636 100644 --- a/src/Mudrammer/Controllers/Settings/SSWorldEditViewController.m +++ b/src/Mudrammer/Controllers/Settings/SSWorldEditViewController.m @@ -42,12 +42,6 @@ - (SSWorldEditViewController *) initWithWorldIdentifier:(NSString *)identifier { target:self action:@selector(saveWorld:)]; - if( ![[UIDevice currentDevice] isIPad] ) { - self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel - target:self - action:@selector(cancelEditing:)]; - } - self.navigationItem.rightBarButtonItem = saveButton; } @@ -58,6 +52,16 @@ + (instancetype)editorForWorldIdentifier:(NSString *)worldIdentifier { return [[SSWorldEditViewController alloc] initWithWorldIdentifier:worldIdentifier]; } +- (void)viewDidLoad { + [super viewDidLoad]; + + if (self.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular) { + self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(cancelEditing:)]; + } +} + - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; diff --git a/src/Mudrammer/SSThemes.m b/src/Mudrammer/SSThemes.m index 699a977..323dd5e 100644 --- a/src/Mudrammer/SSThemes.m +++ b/src/Mudrammer/SSThemes.m @@ -256,9 +256,7 @@ - (void)applyAppThemes { navAppearance.backgroundColor = [self valueForThemeKey:kThemeBackgroundColor]; navAppearance.titleTextAttributes = @{ NSForegroundColorAttributeName : [self valueForThemeKey:kThemeFontColor], - NSFontAttributeName : [UIFont boldSystemFontOfSize:([[UIDevice currentDevice] isIPad] - ? 18.0f - : 16.0f)] + NSFontAttributeName : [UIFont boldSystemFontOfSize:17.0f] }; [[UINavigationBar appearance] setStandardAppearance:navAppearance]; [[UINavigationBar appearance] setCompactAppearance:navAppearance]; @@ -497,7 +495,7 @@ + (void)configureTable:(UITableView *)tableView { if (tableView.style == UITableViewStylePlain) { tableView.backgroundColor = bgColor; - if (![[UIDevice currentDevice] isIPad]) { + if (tableView.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular) { [tableView addCenteredFooterWithImage:([[self sharedThemer] isUsingDarkTheme] ? [SPLImagesCatalog tildeWhiteImage] : [SPLImagesCatalog tildeDarkImage]) diff --git a/src/Mudrammer/Views/Cells/SSThemeCell.m b/src/Mudrammer/Views/Cells/SSThemeCell.m index b86d5e6..9f9ca42 100644 --- a/src/Mudrammer/Views/Cells/SSThemeCell.m +++ b/src/Mudrammer/Views/Cells/SSThemeCell.m @@ -69,7 +69,7 @@ - (void)configureCell { action:@selector(fontSizeChanged:) forControlEvents:UIControlEventValueChanged]; - CGFloat sizerWidth = [UIDevice currentDevice].isIPad ? 150 : 120; + CGFloat sizerWidth = self.traitCollection.horizontalSizeClass == UIUserInterfaceSizeClassRegular ? 150 : 120; [sizer setFrame:CGRectMake(0, 0, sizerWidth, 60)]; self.accessoryView = sizer; diff --git a/src/Mudrammer/Views/SSMudView.m b/src/Mudrammer/Views/SSMudView.m index 6e0c28c..f74fe5c 100644 --- a/src/Mudrammer/Views/SSMudView.m +++ b/src/Mudrammer/Views/SSMudView.m @@ -568,7 +568,7 @@ - (BOOL)canBecomeFirstResponder { #pragma mark - UIScrollViewDelegate - (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView { - if (![[UIDevice currentDevice] isIPad]) { + if (self.traitCollection.horizontalSizeClass != UIUserInterfaceSizeClassRegular) { [self endEditing:YES]; } From 30061b95e1b73578dc408c682059312926c5dbda Mon Sep 17 00:00:00 2001 From: James Power Date: Thu, 12 Mar 2026 23:31:16 -0400 Subject: [PATCH 3/3] Update CHANGELOG for deprecated API and trait collection changes. --- CHANGELOG.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4849e65..df9e438 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,11 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). ## [Unreleased] ### Added +- Replace isIPad device checks with size classes and trait collections (#24) +- Replace deprecated UITableViewCellAccessoryDetailDisclosureButton in SSWorldCell (#19) +- Replace hardcoded 320pt popover widths with adaptive sizing (#18) +- UI modernization for iPad and Mac Catalyst (#17) +- Scale SSRadialControl size adaptively for iPad and Mac (#21) - Keep sent command in input field with select-all for easy resend (#28) - Add GMCP support to telnet stack (#104) - Implement Client.Media.Play/Stop audio playback via GMCP (#107) @@ -28,6 +33,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/). - Fix libtelnet missing HAVE_ZLIB define causing MCCP2 gibberish (#56) ### Changed +- Audit UISwitch tint color across all themes (#26) +- Verify swiftlint passes (#27) +- Add visionOS app icon to asset catalog for App Store submission (#29) - Restore historical update notes in updates.txt (#3) - Add mudrammer and rammer back to keywords (#2) - Update App Store text for MUDWammer rebrand (#1)