Revision: 15058
          http://sourceforge.net/p/skim-app/code/15058
Author:   hofman
Date:     2025-03-31 14:52:02 +0000 (Mon, 31 Mar 2025)
Log Message:
-----------
Convenience method to do KVC part of binding for custom cuntrols. Set the 
actual values we have set rather then retrieving it back using valueForKey, it 
may have been changed due to KVO.

Modified Paths:
--------------
    trunk/NSObject_SKExtensions.h
    trunk/NSObject_SKExtensions.m
    trunk/SKColorSwatch.m
    trunk/SKFontWell.m
    trunk/SKLineWell.m

Modified: trunk/NSObject_SKExtensions.h
===================================================================
--- trunk/NSObject_SKExtensions.h       2025-03-30 14:59:44 UTC (rev 15057)
+++ trunk/NSObject_SKExtensions.h       2025-03-31 14:52:02 UTC (rev 15058)
@@ -50,6 +50,8 @@
 
 - (nullable id)handleFormatScriptCommand:(NSScriptCommand *)command;
 
+- (void)propagateValue:(nullable id)value forBinding:(NSString *)binding;
+
 @end
 
 NS_ASSUME_NONNULL_END

Modified: trunk/NSObject_SKExtensions.m
===================================================================
--- trunk/NSObject_SKExtensions.m       2025-03-30 14:59:44 UTC (rev 15057)
+++ trunk/NSObject_SKExtensions.m       2025-03-31 14:52:02 UTC (rev 15058)
@@ -116,4 +116,22 @@
     return text;
 }
 
+- (void)propagateValue:(id)value forBinding:(NSString *)binding {
+    NSDictionary *info = [self infoForBinding:binding];
+    id observedObject = [info objectForKey:NSObservedObjectKey];
+    NSString *observedKeyPath = [info objectForKey:NSObservedKeyPathKey];
+    if (observedObject && observedKeyPath) {
+        NSValueTransformer *valueTransformer = [[info 
objectForKey:NSOptionsKey] objectForKey:NSValueTransformerBindingOption];
+        if (valueTransformer == nil || [valueTransformer isEqual:[NSNull 
null]]) {
+            NSString *transformerName = [[info objectForKey:NSOptionsKey] 
objectForKey:NSValueTransformerNameBindingOption];
+            if (transformerName && [transformerName isEqual:[NSNull null]] == 
NO)
+                valueTransformer = [NSValueTransformer 
valueTransformerForName:transformerName];
+        }
+        if (valueTransformer && [valueTransformer isEqual:[NSNull null]] == NO 
&&
+            [[valueTransformer class] allowsReverseTransformation])
+            value = [valueTransformer reverseTransformedValue:value];
+        [observedObject setValue:value forKeyPath:observedKeyPath];
+    }
+}
+
 @end

Modified: trunk/SKColorSwatch.m
===================================================================
--- trunk/SKColorSwatch.m       2025-03-30 14:59:44 UTC (rev 15057)
+++ trunk/SKColorSwatch.m       2025-03-31 14:52:02 UTC (rev 15058)
@@ -44,6 +44,7 @@
 #import "NSView_SKExtensions.h"
 #import "NSGraphics_SKExtensions.h"
 #import "NSShadow_SKExtensions.h"
+#import "NSObject_SKExtensions.h"
 
 NSString *SKColorSwatchOrWellWillActivateNotification = 
@"SKColorSwatchOrWellWillActivateNotification";
 
@@ -571,23 +572,7 @@
 
 - (void)didChangeColors {
     [self didChangeValueForKey:COLORS_KEY];
-    
-    NSDictionary *info = [self infoForBinding:COLORS_KEY];
-    id observedObject = [info objectForKey:NSObservedObjectKey];
-    NSString *observedKeyPath = [info objectForKey:NSObservedKeyPathKey];
-    if (observedObject && observedKeyPath) {
-        id value = [self colors];
-        NSValueTransformer *valueTransformer = [[info 
objectForKey:NSOptionsKey] objectForKey:NSValueTransformerBindingOption];
-        if (valueTransformer == nil || [valueTransformer isEqual:[NSNull 
null]]) {
-            NSString *transformerName = [[info objectForKey:NSOptionsKey] 
objectForKey:NSValueTransformerNameBindingOption];
-            if (transformerName && [transformerName isEqual:[NSNull null]] == 
NO)
-                valueTransformer = [NSValueTransformer 
valueTransformerForName:transformerName];
-        }
-        if (valueTransformer && [valueTransformer isEqual:[NSNull null]] == NO 
&&
-            [[valueTransformer class] allowsReverseTransformation])
-            value = [valueTransformer reverseTransformedValue:value];
-        [observedObject setValue:value forKeyPath:observedKeyPath];
-    }
+    [self propagateValue:[self colors] forBinding:COLORS_KEY];
 }
 
 - (void)_setColor:(NSColor *)color atIndex:(NSInteger)i {

Modified: trunk/SKFontWell.m
===================================================================
--- trunk/SKFontWell.m  2025-03-30 14:59:44 UTC (rev 15057)
+++ trunk/SKFontWell.m  2025-03-31 14:52:02 UTC (rev 15058)
@@ -39,6 +39,7 @@
 #import "SKFontWell.h"
 #import "NSGraphics_SKExtensions.h"
 #import "NSColor_SKExtensions.h"
+#import "NSObject_SKExtensions.h"
 
 #define SKNSFontPanelDescriptorsPboardType @"NSFontPanelDescriptorsPboardType"
 #define SKNSFontPanelFamiliesPboardType @"NSFontPanelFamiliesPboardType"
@@ -164,28 +165,12 @@
     [self setNeedsDisplay:YES];
 }
 
-- (void)notifyBinding:(NSString *)binding {
-    NSDictionary *info = [self infoForBinding:binding];
-    if (info) {
-        id value = [self valueForKey:binding];
-        NSValueTransformer *valueTransformer = [[info 
objectForKey:NSOptionsKey] objectForKey:NSValueTransformerBindingOption];
-        if (valueTransformer == nil || [valueTransformer isEqual:[NSNull 
null]]) {
-            NSString *transformerName = [[info objectForKey:NSOptionsKey] 
objectForKey:NSValueTransformerNameBindingOption];
-            if (transformerName && [transformerName isEqual:[NSNull null]] == 
NO)
-                valueTransformer = [NSValueTransformer 
valueTransformerForName:transformerName];
-        }
-        if (valueTransformer && [valueTransformer isEqual:[NSNull null]] == NO 
&&
-            [[valueTransformer class] allowsReverseTransformation])
-            value = [valueTransformer reverseTransformedValue:value];
-        [[info objectForKey:NSObservedObjectKey] setValue:value 
forKeyPath:[info objectForKey:NSObservedKeyPathKey]];
-    }
-}
-
 - (void)changeFontFromFontManager:(id)sender {
     if ([self isActive]) {
-        [self setFont:[sender convertFont:[self font]]];
-        [self notifyBinding:FONTNAME_KEY];
-        [self notifyBinding:FONTSIZE_KEY];
+        NSFont *font = [sender convertFont:[self font]];
+        [self setFont:font];
+        [self propagateValue:[font fontName] forBinding:FONTNAME_KEY];
+        [self propagateValue:[NSNumber numberWithDouble:[font pointSize]] 
forBinding:FONTSIZE_KEY];
         [self sendAction:[self action] to:[self target]];
     }
 }
@@ -192,8 +177,9 @@
 
 - (void)changeAttributesFromFontManager:(id)sender {
     if ([self isActive] && [self hasTextColor]) {
-        [self setTextColor:[[sender 
convertAttributes:@{NSForegroundColorAttributeName:[self textColor] ?: [NSColor 
blackColor]}] valueForKey:NSForegroundColorAttributeName]];
-        [self notifyBinding:TEXTCOLOR_KEY];
+        NSColor *color = [[sender 
convertAttributes:@{NSForegroundColorAttributeName:[self textColor] ?: [NSColor 
blackColor]}] valueForKey:NSForegroundColorAttributeName];
+        [self setTextColor:color];
+        [self propagateValue:color forBinding:TEXTCOLOR_KEY];
         [self sendAction:[self action] to:[self target]];
     }
 }
@@ -419,13 +405,13 @@
     
     if (droppedFont) {
         [self setFont:droppedFont];
-        [self notifyBinding:FONTNAME_KEY];
-        [self notifyBinding:FONTSIZE_KEY];
+        [self propagateValue:[droppedFont fontName] forBinding:FONTNAME_KEY];
+        [self propagateValue:[NSNumber numberWithDouble:[droppedFont 
pointSize]] forBinding:FONTSIZE_KEY];
         [self sendAction:[self action] to:[self target]];
     }
     if (droppedColor) {
         [self setTextColor:droppedColor];
-        [self notifyBinding:TEXTCOLOR_KEY];
+        [self propagateValue:droppedColor forBinding:TEXTCOLOR_KEY];
         [self sendAction:[self action] to:[self target]];
     }
     

Modified: trunk/SKLineWell.m
===================================================================
--- trunk/SKLineWell.m  2025-03-30 14:59:44 UTC (rev 15057)
+++ trunk/SKLineWell.m  2025-03-31 14:52:02 UTC (rev 15058)
@@ -41,6 +41,7 @@
 #import "NSGraphics_SKExtensions.h"
 #import "NSBezierPath_SKExtensions.h"
 #import "NSView_SKExtensions.h"
+#import "NSObject_SKExtensions.h"
 
 NSString *SKPasteboardTypeLineStyle = 
@"net.sourceforge.skim-app.pasteboard.line-style";
 
@@ -312,9 +313,9 @@
 }
 
 - (void)takeValueForKey:(NSString *)key from:(id)object {
-    [self setValue:[object valueForKey:key] forKey:key];
-    NSDictionary *info = [self infoForBinding:key];
-    [[info objectForKey:NSObservedObjectKey] setValue:[self valueForKey:key] 
forKeyPath:[info objectForKey:NSObservedKeyPathKey]];
+    id value = [object valueForKey:key];
+    [self setValue:value forKey:key];
+    [self propagateValue:value forBinding:key];
 }
 
 - (void)mouseDown:(NSEvent *)theEvent {

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