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