From b1ca30f914375ba2085f4708d1e753661a4d2ae3 Mon Sep 17 00:00:00 2001 From: relikd Date: Thu, 11 Dec 2025 15:16:39 +0100 Subject: [PATCH] ref: wrapInScrollView --- baRSS/NSCategories/NSView+Ext.h | 2 +- baRSS/NSCategories/NSView+Ext.m | 16 +++++++++------- baRSS/Preferences/About Tab/SettingsAboutView.m | 2 +- baRSS/Preferences/Feeds Tab/SettingsFeedsView.m | 2 +- baRSS/Regex Editor/RegexConverterView.m | 4 ++-- 5 files changed, 14 insertions(+), 12 deletions(-) diff --git a/baRSS/NSCategories/NSView+Ext.h b/baRSS/NSCategories/NSView+Ext.h index 794e030..cd4393c 100644 --- a/baRSS/NSCategories/NSView+Ext.h +++ b/baRSS/NSCategories/NSView+Ext.h @@ -53,7 +53,7 @@ static inline CGFloat NSMaxWidth(NSView *a, NSView *b) { return Max(NSWidth(a.fr + (nullable NSView*)radioGroup:(NSArray*)entries; // UI: Enclosing Container + (NSPopover*)popover:(NSSize)size; -- (NSScrollView*)wrapContent:(NSView*)content inScrollView:(NSRect)rect; +- (NSScrollView*)wrapInScrollView:(NSSize)size; + (NSView*)wrapView:(NSView*)other withLabel:(NSString*)str padding:(CGFloat)pad; // Insert UI elements in parent view - (instancetype)placeIn:(NSView*)parent x:(CGFloat)x y:(CGFloat)y; diff --git a/baRSS/NSCategories/NSView+Ext.m b/baRSS/NSCategories/NSView+Ext.m index 17ef32e..93ca999 100644 --- a/baRSS/NSCategories/NSView+Ext.m +++ b/baRSS/NSCategories/NSView+Ext.m @@ -180,17 +180,19 @@ return pop; } -/// Insert @c scrollView, remove @c self from current view and set as @c documentView for the newly created scroll view. -- (NSScrollView*)wrapContent:(NSView*)content inScrollView:(NSRect)rect { - NSScrollView *scroll = [[[NSScrollView alloc] initWithFrame:rect] sizableWidthAndHeight]; +/// Removes `self` from current view (if already added) and sets `documentView` content for the newly created scroll view. +/// You are responsible for adding this scroll view to the view hierarchy. +- (NSScrollView*)wrapInScrollView:(NSSize)size { + NSScrollView *scroll = [[[NSScrollView alloc] initWithFrame:CGRectMake(0, 0, size.width, size.height)] sizableWidthAndHeight]; scroll.borderType = NSBezelBorder; scroll.hasVerticalScroller = YES; scroll.horizontalScrollElasticity = NSScrollElasticityNone; - [self addSubview:scroll]; - if (content.superview) [content removeFromSuperview]; // remove if added already (e.g., helper methods above) - content.frame = NSMakeRect(0, 0, scroll.contentSize.width, scroll.contentSize.height); - scroll.documentView = content; + if (self.superview) [self removeFromSuperview]; // remove if added already (e.g., helper methods above) + if (self.frame.size.width == 0 && self.frame.size.height == 0) { + self.frame = NSMakeRect(0, 0, scroll.contentSize.width, scroll.contentSize.height); + } + scroll.documentView = self; return scroll; } diff --git a/baRSS/Preferences/About Tab/SettingsAboutView.m b/baRSS/Preferences/About Tab/SettingsAboutView.m index c921586..66225b6 100644 --- a/baRSS/Preferences/About Tab/SettingsAboutView.m +++ b/baRSS/Preferences/About Tab/SettingsAboutView.m @@ -24,7 +24,7 @@ tv.alignment = NSTextAlignmentCenter; tv.editable = NO; // but selectable [tv.textStorage setAttributedString:[self rtfDocument]]; - [self wrapContent:tv inScrollView:NSMakeRect(-1, 20, NSWidth(self.frame) + 2, NSMinY(lblV.frame) - PAD_M - 20)]; + [[tv wrapInScrollView:NSMakeSize(NSWidth(self.frame) + 2, NSMinY(lblV.frame) - PAD_M - 20)] placeIn:self x:-1 y:20]; return self; } diff --git a/baRSS/Preferences/Feeds Tab/SettingsFeedsView.m b/baRSS/Preferences/Feeds Tab/SettingsFeedsView.m index fde7965..b8f1f02 100644 --- a/baRSS/Preferences/Feeds Tab/SettingsFeedsView.m +++ b/baRSS/Preferences/Feeds Tab/SettingsFeedsView.m @@ -17,7 +17,7 @@ if (self) { self.controller = delegate; // make sure its first self.outline = [self generateOutlineView]; // uses self.controller - [self wrapContent:self.outline inScrollView:NSMakeRect(0, 20, NSWidth(self.frame), NSHeight(self.frame) - 20)]; + [[self.outline wrapInScrollView:NSMakeSize(NSWidth(self.frame), NSHeight(self.frame) - 20)] placeIn:self x:0 y:20]; self.outline.menu = [self generateCommandsMenu]; [self.outline.menu.itemArray makeObjectsPerformSelector:@selector(setTarget:) withObject:delegate]; CGFloat x = [self generateButtons]; // uses self.controller and self.outline diff --git a/baRSS/Regex Editor/RegexConverterView.m b/baRSS/Regex Editor/RegexConverterView.m index a58497a..cbf0c03 100644 --- a/baRSS/Regex Editor/RegexConverterView.m +++ b/baRSS/Regex Editor/RegexConverterView.m @@ -59,7 +59,7 @@ static CGFloat const heightRow = PAD_S + HEIGHT_INPUTFIELD; tv.editable = NO; // but selectable tv.drawsBackground = NO; tv.textContainer.textView.string = NSLocalizedString(@"DIY regex converter. Press enter to confirm. For help, refer to online tools (e.g., regex101 with options: global + single-line)", nil); - NSScrollView *scroll = [self wrapContent:tv inScrollView:NSMakeRect(-1, NSHeight(self.frame) - heightHowTo, NSWidth(self.frame) + 2, heightHowTo)]; + NSScrollView *scroll = [[tv wrapInScrollView:NSMakeSize(NSWidth(self.frame) + 2, heightHowTo)] placeIn:self x:-1 y:NSHeight(self.frame) - heightHowTo]; scroll.drawsBackground = NO; scroll.borderType = NSNoBorder; scroll.verticalScrollElasticity = NSScrollElasticityNone; @@ -71,7 +71,7 @@ static CGFloat const heightRow = PAD_S + HEIGHT_INPUTFIELD; NSTextView *tv = [[NSTextView new] sizableWidthAndHeight]; tv.editable = NO; // but selectable tv.backgroundColor = NSColor.whiteColor; - [self wrapContent:tv inScrollView:NSMakeRect(-1, 0, NSWidth(self.frame) + 2, heightOutput)]; + [[tv wrapInScrollView:NSMakeSize(NSWidth(self.frame) + 2, heightOutput)] placeIn:self x:-1 y:0]; return tv; }