Revision: 28667
          http://sourceforge.net/p/bibdesk/svn/28667
Author:   hofman
Date:     2024-01-24 15:56:33 +0000 (Wed, 24 Jan 2024)
Log Message:
-----------
use subview to draw rubber band

Modified Paths:
--------------
    trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h
    trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m

Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h
===================================================================
--- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h      2024-01-24 
10:39:04 UTC (rev 28666)
+++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.h      2024-01-24 
15:56:33 UTC (rev 28667)
@@ -222,7 +222,7 @@
     CGLayerRef                      _selectionOverlay;
     NSUInteger                      _lastClickedIndex;
     NSUInteger                      _dropIndex;
-    NSRect                          _rubberBandRect;
+    NSView                         *_rubberBandView;
     struct __fvFlags {
         unsigned int displayMode:2;
         unsigned int dropOperation:2;

Modified: trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m
===================================================================
--- trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m      2024-01-24 
10:39:04 UTC (rev 28666)
+++ trunk/bibdesk_vendorsrc/amaxwell/FileView/FVFileView.m      2024-01-24 
15:56:33 UTC (rev 28667)
@@ -141,6 +141,13 @@
 
 static void FVFillBackgroundColorOrGradient(NSColor *backgroundColor, NSRect 
rect, NSRect bounds, NSWindow *window);
 
+#pragma mark -
+
+@interface FVRubberBandView : NSView
+@end
+
+static void FVFillBackgroundColorOrGradient(NSColor *backgroundColor, NSRect 
rect, NSRect bounds, NSWindow *window);
+
 #import <Quartz/Quartz.h>
 
 @interface FVFileView (FVDelegateDeclarations) <FVDownloadDelegate, 
QLPreviewPanelDataSource, QLPreviewPanelDelegate>
@@ -323,7 +330,7 @@
     _fvFlags.controllingQLPreviewPanel = NO;
     _selectionIndexes = [[NSIndexSet alloc] init];
     _lastClickedIndex = NSNotFound;
-    _rubberBandRect = NSZeroRect;
+    _rubberBandView = nil;
     _fvFlags.isMouseDown = NO;
     _fvFlags.isEditable = NO;
     [self setBackgroundColor:[[self class] defaultBackgroundColor]];
@@ -2115,17 +2122,6 @@
     CGContextRestoreGState(drawingContext);
 }
 
-- (void)_drawRubberbandRect
-{
-    // @@ Dark mode
-   [[NSColor colorWithCalibratedWhite:1.0 alpha:0.3] setFill];
-    NSRect r = [self centerScanRect:NSInsetRect(_rubberBandRect, 0.5, 0.5)];
-    NSRectFillUsingOperation(r, NSCompositingOperationSourceOver);
-    // NSFrameRect doesn't respect setStroke
-    [[NSColor lightGrayColor] setFill];
-    NSFrameRectWithWidth(r, 1.0);
-}
-
 #define DROP_MESSAGE_MIN_FONTSIZE ((CGFloat) 8.0)
 #define DROP_MESSAGE_MAX_INSET    ((CGFloat) 20.0)
 
@@ -2598,9 +2594,6 @@
         if (_dropIndex != NSNotFound || _fvFlags.dropOperation == FVDropOn) {
             [self _drawDropHighlight];
         }
-        else if (NSIsEmptyRect(_rubberBandRect) == NO) {
-            [self _drawRubberbandRect];
-        }
     }
 #if DEBUG_GRID 
     [[NSColor grayColor] set];
@@ -3335,13 +3328,13 @@
     return rect;
 }
 
-- (NSIndexSet *)_allIndexesInRubberBandRect
+- (NSIndexSet *)_allIndexesInRubberBandRect:(NSRect)rect
 {
     NSMutableIndexSet *indexSet = [NSMutableIndexSet indexSet];
     
     // do a fast check to avoid hit testing every icon in the grid
     NSRange rowRange, columnRange;
-    [self _getRangeOfRows:&rowRange columns:&columnRange 
inRect:_rubberBandRect];
+    [self _getRangeOfRows:&rowRange columns:&columnRange inRect:rect];
             
     // this is a useful test to see exactly what 
_getRangeOfRows:columns:inRect: is giving us
     /*
@@ -3368,7 +3361,7 @@
     {
         for (c = columnRange.location; c < cMax; c++) 
         {    
-            if (NSIntersectsRect([self _rectOfIconInRow:r column:c], 
_rubberBandRect)) {
+            if (NSIntersectsRect([self _rectOfIconInRow:r column:c], rect)) {
                 idx = [self _indexForGridRow:r column:c];
                 if (NSNotFound != idx)
                     [indexSet addIndex:idx];
@@ -3382,9 +3375,9 @@
 - (void)mouseUp:(NSEvent *)event
 {
     _fvFlags.isMouseDown = NO;
-    if (NO == NSIsEmptyRect(_rubberBandRect)) {
-        [self setNeedsDisplayInRect:_rubberBandRect];
-        _rubberBandRect = NSZeroRect;
+    if (_rubberBandView) {
+        [_rubberBandView removeFromSuperview];
+        _rubberBandView = nil;
     }
 }
 
@@ -3397,7 +3390,7 @@
     
     // _fvFlags.isMouseDown tells us if the mouseDown: event originated in 
this view; if not, just ignore it
     
-    if (NSEqualRects(_rubberBandRect, NSZeroRect) && NSNotFound != i && 
_fvFlags.isMouseDown) {
+    if (nil == _rubberBandView && NSNotFound != i && _fvFlags.isMouseDown) {
         // No previous rubber band selection, so check to see if we're 
dragging an icon at this point.
         // The condition is also false when we're getting a repeated call to 
mouseDragged: for rubber band drawing.
         
@@ -3432,9 +3425,12 @@
     else if (_fvFlags.isMouseDown) {   
         
         // no icons to drag, so we must draw the rubber band rectangle
-        _rubberBandRect = 
NSIntersectionRect(_rectWithCorners(_lastMouseDownLocInView, p), [self bounds]);
-        [self _setSelectionIndexes:[self _allIndexesInRubberBandRect]];
-        [self setNeedsDisplayInRect:_rubberBandRect];
+        NSRect rubberBandRect = 
NSIntersectionRect(_rectWithCorners(_lastMouseDownLocInView, p), [self bounds]);
+        [self _setSelectionIndexes:[self 
_allIndexesInRubberBandRect:rubberBandRect]];
+        if (_rubberBandView == nil)
+            _rubberBandView = [[FVRubberBandView alloc] 
initWithFrame:NSZeroRect];
+        [_rubberBandView setFrame:[self 
centerScanRect:NSInsetRect(rubberBandRect, 0.5, 0.5)]];
+        [self addSubview:_rubberBandView];
         [self autoscroll:event];
         [super mouseDragged:event];
     }
@@ -5004,3 +5000,22 @@
         CGColorSpaceRelease(cspace);
     }
 }
+
+#pragma mark
+
+@implementation FVRubberBandView
+
+- (BOOL)isFlipped {
+    return YES;
+}
+
+- (void)drawRect:(NSRect)dirtyRect {
+    NSRect rect = [self bounds];
+    [[NSColor colorWithCalibratedWhite:1.0 alpha:0.3] setFill];
+    NSRect r = [self centerScanRect:NSInsetRect(rect, 1.0, 1.0)];
+    NSRectFillUsingOperation(r, NSCompositingOperationSourceOver);
+    // NSFrameRect doesn't respect setStroke
+    [[NSColor lightGrayColor] setFill];
+    NSFrameRectWithWidth(r, 1.0);}
+
+@end

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
Bibdesk-commit mailing list
Bibdesk-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/bibdesk-commit

Reply via email to