Revision: 15071
          http://sourceforge.net/p/skim-app/code/15071
Author:   hofman
Date:     2025-04-02 16:37:46 +0000 (Wed, 02 Apr 2025)
Log Message:
-----------
Support draging font from font well

Modified Paths:
--------------
    trunk/SKFontWell.m

Modified: trunk/SKFontWell.m
===================================================================
--- trunk/SKFontWell.m  2025-04-02 14:34:27 UTC (rev 15070)
+++ trunk/SKFontWell.m  2025-04-02 16:37:46 UTC (rev 15071)
@@ -40,6 +40,7 @@
 #import "NSGraphics_SKExtensions.h"
 #import "NSColor_SKExtensions.h"
 #import "NSObject_SKExtensions.h"
+#import "NSImage_SKExtensions.h"
 
 #define SKNSFontPanelDescriptorsPboardType @"NSFontPanelDescriptorsPboardType"
 #define SKNSFontPanelFamiliesPboardType @"NSFontPanelFamiliesPboardType"
@@ -257,6 +258,12 @@
     }
 }
 
+#pragma mark NSDraggingSource protocol
+
+- (NSDragOperation)draggingSession:(NSDraggingSession *)session 
sourceOperationMaskForDraggingContext:(NSDraggingContext)context {
+    return NSDragOperationGeneric;
+}
+
 #pragma mark NSDraggingDestination protocol 
 
 - (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender {
@@ -287,7 +294,7 @@
     
     @try {
         if ([type isEqualToString:SKNSFontPanelDescriptorsPboardType]) {
-            NSData *data = [pboard dataForType:type];
+            NSData *data = [pboard dataForType:type] ?: [pboard 
dataForType:CFBridgingRelease(UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType,
 (__bridge CFStringRef)type, NULL))];
             NSDictionary *dict = [data isKindOfClass:[NSData class]] ? 
[NSKeyedUnarchiver unarchiveObjectWithData:data] : nil;
             if ([dict isKindOfClass:[NSDictionary class]]) {
                 NSArray *fontDescriptors = [dict 
objectForKey:SKNSFontCollectionFontDescriptors];
@@ -299,7 +306,7 @@
                 }
             }
         } else if ([type isEqualToString:SKNSFontPanelFamiliesPboardType]) {
-            NSArray *families = [pboard propertyListForType:type];
+            NSArray *families = [pboard propertyListForType:type] ?: [pboard 
propertyListForType:CFBridgingRelease(UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType,
 (__bridge CFStringRef)type, NULL))];
             NSString *family = ([families isKindOfClass:[NSArray class]] && 
[families count]) ? [families objectAtIndex:0] : nil;
             if ([family isKindOfClass:[NSString class]])
                 droppedFont = [[NSFontManager sharedFontManager] 
convertFont:[self font] toFamily:family];
@@ -412,6 +419,28 @@
     }
 }
 
+- (BOOL)trackMouse:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView 
*)controlView untilMouseUp:(BOOL)flag {
+    BOOL didTrack = [super trackMouse:event inRect:cellFrame 
ofView:controlView untilMouseUp:flag];
+    if (didTrack == NO) {
+        NSRect bounds = [controlView bounds];
+        
+        NSImage *dragImage = [NSImage bitmapImageWithSize:bounds.size 
forView:controlView drawingHandler:^(NSRect rect){
+            [self drawInteriorWithFrame:rect inView:controlView];
+        }];
+        
+        NSDictionary *dict = @{SKNSFontCollectionFontDescriptors: @[[[self 
font] fontDescriptor]], NSFontSizeAttribute: [NSNumber numberWithDouble:[[self 
font] pointSize]]};
+        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:dict];
+        NSPasteboardItem *item = [[NSPasteboardItem alloc] init];
+        [item setData:data 
forType:CFBridgingRelease(UTTypeCreatePreferredIdentifierForTag(kUTTagClassNSPboardType,
 (__bridge CFStringRef)SKNSFontPanelDescriptorsPboardType, NULL))];
+        
+        NSDraggingItem *dragItem = [[NSDraggingItem alloc] 
initWithPasteboardWriter:item];
+        [dragItem setDraggingFrame:bounds contents:dragImage];
+        
+        [controlView beginDraggingSessionWithItems:@[dragItem] event:event 
source:(id<NSDraggingSource>)controlView];
+    }
+    return YES;
+}
+
 - (NSString *)accessibilitySubrole {
     return @"AXFontWell";
 }

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



_______________________________________________
Skim-app-commit mailing list
Skim-app-commit@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/skim-app-commit

Reply via email to