From 449b9be433524251e079fa4f19565a8b89de5180 Mon Sep 17 00:00:00 2001 From: Claudio Cambra Date: Thu, 1 Sep 2022 18:54:04 +0200 Subject: [PATCH] macosx: Add VLCSubScrollView for nested scroll views Signed-off-by: Claudio Cambra --- modules/gui/macosx/Makefile.am | 2 + modules/gui/macosx/views/VLCSubScrollView.h | 37 ++++++++++++ modules/gui/macosx/views/VLCSubScrollView.m | 65 +++++++++++++++++++++ 3 files changed, 104 insertions(+) create mode 100644 modules/gui/macosx/views/VLCSubScrollView.h create mode 100644 modules/gui/macosx/views/VLCSubScrollView.m diff --git a/modules/gui/macosx/Makefile.am b/modules/gui/macosx/Makefile.am index ea91a9890f..67ea1eb112 100644 --- a/modules/gui/macosx/Makefile.am +++ b/modules/gui/macosx/Makefile.am @@ -233,6 +233,8 @@ libmacosx_plugin_la_SOURCES = \ gui/macosx/views/VLCSlider.m \ gui/macosx/views/VLCSliderCell.h \ gui/macosx/views/VLCSliderCell.m \ + gui/macosx/views/VLCSubScrollView.h \ + gui/macosx/views/VLCSubScrollView.m \ gui/macosx/views/VLCTimeField.h \ gui/macosx/views/VLCTimeField.m \ gui/macosx/views/VLCTrackingView.h \ diff --git a/modules/gui/macosx/views/VLCSubScrollView.h b/modules/gui/macosx/views/VLCSubScrollView.h new file mode 100644 index 0000000000..a6933e4633 --- /dev/null +++ b/modules/gui/macosx/views/VLCSubScrollView.h @@ -0,0 +1,37 @@ +/***************************************************************************** + * VLCSubScrollView.h: MacOS X interface module + ***************************************************************************** + * Copyright (C) 2022 VLC authors and VideoLAN + * + * Authors: Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import + +NS_ASSUME_NONNULL_BEGIN + +// Use this scrollview when you are putting a scrollview within another scrollview. + +@interface VLCSubScrollView : NSScrollView + +@property (readwrite, assign) NSScrollView *parentScrollView; +@property (readwrite, assign) BOOL scrollParentY; +@property (readwrite, assign) BOOL scrollParentX; + +@end + +NS_ASSUME_NONNULL_END diff --git a/modules/gui/macosx/views/VLCSubScrollView.m b/modules/gui/macosx/views/VLCSubScrollView.m new file mode 100644 index 0000000000..7cac8ff24d --- /dev/null +++ b/modules/gui/macosx/views/VLCSubScrollView.m @@ -0,0 +1,65 @@ +/***************************************************************************** + * VLCSubScrollView.h: MacOS X interface module + ***************************************************************************** + * + * Copyright (C) 2022 VLC authors and VideoLAN + * + * Authors: Claudio Cambra + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#import "VLCSubScrollView.h" + +@implementation VLCSubScrollView + +- (instancetype)init +{ + self = [super init]; + + if(self) { + _scrollParentX = NO; + _scrollParentY = NO; + } + + return self; +} + +- (void)scrollWheel:(NSEvent *)event +{ + [super scrollWheel:event]; + + if(_parentScrollView == nil || (!_scrollParentX && !_scrollParentY)) { + return; + } + + // Sometimes scroll views initialise with the Y value being almost 0, but not quite (e.g. 0.000824) + const BOOL isViewAtYStartAndScrollUp = self.verticalScroller.floatValue <= 0.01 && event.deltaY > 0; + const BOOL isViewAtYEndAndScrollDown = self.verticalScroller.floatValue >= 1. && event.deltaY < 0; + const BOOL isViewAtXStartAndScrollLeft = self.horizontalScroller.floatValue <= 0.01 && event.deltaX > 0; + const BOOL isViewAtXEndAndScrollRight = self.horizontalScroller.floatValue >= 1 && event.deltaX < 0; + + const BOOL isSubScrollViewScrollableY = self.documentView.frame.size.height > self.documentVisibleRect.size.height; + const BOOL isSubScrollViewScrollableX = self.documentView.frame.size.width > self.documentVisibleRect.size.width; + + const BOOL shouldScrollParentY = _scrollParentY && (!isSubScrollViewScrollableY || isViewAtYStartAndScrollUp || isViewAtYEndAndScrollDown); + const BOOL shouldScrollParentX = _scrollParentX && (!isSubScrollViewScrollableX || isViewAtXStartAndScrollLeft || isViewAtXEndAndScrollRight); + + if(shouldScrollParentY || shouldScrollParentX) { + [_parentScrollView scrollWheel:event]; + } +} + +@end