diff --git a/AppKit/CPMenuItem/CPMenuItem.j b/AppKit/CPMenuItem/CPMenuItem.j index a7a54b511..d7933f4a4 100644 --- a/AppKit/CPMenuItem/CPMenuItem.j +++ b/AppKit/CPMenuItem/CPMenuItem.j @@ -925,6 +925,9 @@ var CPMenuItemIsSeparatorKey = @"CPMenuItemIsSeparatorKey", CPMenuItemImageKey = @"CPMenuItemImageKey", CPMenuItemAlternateImageKey = @"CPMenuItemAlternateImageKey", + CPMenuItemOnStateImageKey = @"CPMenuItemOnStateImageKey", + CPMenuItemOffStateImageKey = @"CPMenuItemOffStateImageKey", + CPMenuItemMixedStateImageKey = @"CPMenuItemMixedStateImageKey", CPMenuItemSubmenuKey = @"CPMenuItemSubmenuKey", CPMenuItemMenuKey = @"CPMenuItemMenuKey", @@ -969,9 +972,9 @@ var CPMenuItemIsSeparatorKey = @"CPMenuItemIsSeparatorKey", _image = [aCoder decodeObjectForKey:CPMenuItemImageKey]; _alternateImage = [aCoder decodeObjectForKey:CPMenuItemAlternateImageKey]; -// CPImage _onStateImage; -// CPImage _offStateImage; -// CPImage _mixedStateImage; + _onStateImage = [aCoder decodeObjectForKey:CPMenuItemOnStateImageKey]; + _offStateImage = [aCoder decodeObjectForKey:CPMenuItemOffStateImageKey]; + _mixedStateImage = [aCoder decodeObjectForKey:CPMenuItemMixedStateImageKey]; // This order matters because setSubmenu: needs _menu to be around. _menu = [aCoder decodeObjectForKey:CPMenuItemMenuKey]; @@ -1017,6 +1020,9 @@ var CPMenuItemIsSeparatorKey = @"CPMenuItemIsSeparatorKey", ENCODE_IFNOT(CPMenuItemImageKey, _image, nil); ENCODE_IFNOT(CPMenuItemAlternateImageKey, _alternateImage, nil); + ENCODE_IFNOT(CPMenuItemOnStateImageKey, _onStateImage, nil); + ENCODE_IFNOT(CPMenuItemOffStateImageKey, _offStateImage, nil); + ENCODE_IFNOT(CPMenuItemMixedStateImageKey, _mixedStateImage, nil); ENCODE_IFNOT(CPMenuItemSubmenuKey, _submenu, nil); ENCODE_IFNOT(CPMenuItemMenuKey, _menu, nil); diff --git a/AppKit/CPMenuItem/_CPMenuItemStandardView.j b/AppKit/CPMenuItem/_CPMenuItemStandardView.j index 0c7a2e5de..a967d5c79 100644 --- a/AppKit/CPMenuItem/_CPMenuItemStandardView.j +++ b/AppKit/CPMenuItem/_CPMenuItemStandardView.j @@ -199,15 +199,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem onStateImage] || [self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem offStateImage] || [self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem mixedStateImage] || [self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -361,15 +361,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem onStateImage] || [self valueForThemeAttribute:@"menu-item-default-on-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem offStateImage] || [self valueForThemeAttribute:@"menu-item-default-off-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem mixedImage] || [self valueForThemeAttribute:@"menu-item-default-mixed-state-highlighted-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: @@ -381,15 +381,15 @@ switch ([_menuItem state]) { case CPOnState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem onStateImage] || [self valueForThemeAttribute:@"menu-item-default-on-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPOffState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem offStateImage] || [self valueForThemeAttribute:@"menu-item-default-off-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; case CPMixedState: - [_stateView setImage:[self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; + [_stateView setImage:[_menuItem mixedImage] || [self valueForThemeAttribute:@"menu-item-default-mixed-state-image" inState:CPControlSizeThemeStates[correspondingControlSize]]]; break; default: diff --git a/AppKit/Cib/_CPCibCustomResource.j b/AppKit/Cib/_CPCibCustomResource.j index 5a0ed43b1..00907e6df 100644 --- a/AppKit/Cib/_CPCibCustomResource.j +++ b/AppKit/Cib/_CPCibCustomResource.j @@ -56,7 +56,9 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", _CPCibCustomResourceTemplateImageMap = @{ "CPAddTemplate": "button-image-plus", "CPRemoveTemplate": "button-image-minus", - "CPActionTemplate": "button-image-action" + "CPActionTemplate": "button-image-action", + "CPMenuCheckmark": [CPNull null], + "CPMenuMixedState": [CPNull null] }; } + (id)imageResourceWithName:(CPString)aResourceName size:(CGSize)aSize @@ -127,10 +129,16 @@ var _CPCibCustomResourceClassNameKey = @"_CPCibCustomResourceClassNameKey", var templateImage = [_CPCibCustomResourceTemplateImageMap objectForKey:_resourceName]; - if (templateImage) - return [[CPTheme defaultTheme] valueForAttributeWithName:templateImage forClass:[CPButtonBar class]]; + // Default checkmarks are handled by the theme so just let it be nil + if (templateImage !== [CPNull null]) + { + if (templateImage) + return [[CPTheme defaultTheme] valueForAttributeWithName:templateImage forClass:[CPButtonBar class]]; + else + return [self imageFromCoder:aCoder]; + } else - return [self imageFromCoder:aCoder]; + return nil; } return self; diff --git a/Tools/nib2cib/NSCustomResource.j b/Tools/nib2cib/NSCustomResource.j index 3889025fb..7b1dd6d70 100644 --- a/Tools/nib2cib/NSCustomResource.j +++ b/Tools/nib2cib/NSCustomResource.j @@ -35,7 +35,9 @@ var FILE = require("file"), "NSAddTemplate": "CPAddTemplate", "NSRemoveTemplate": "CPRemoveTemplate", "NSActionTemplate": "CPActionTemplate", - "NSToolbarShowColors": "CPImageNameColorPanel" + "NSToolbarShowColors": "CPImageNameColorPanel", + "NSMenuCheckmark": "CPMenuCheckmark", + "NSMenuMixedState": "CPMenuMixedState" }; @implementation _CPCibCustomResource (NSCoding) diff --git a/Tools/nib2cib/NSMenuItem.j b/Tools/nib2cib/NSMenuItem.j index 39a4384f5..42863f3fc 100644 --- a/Tools/nib2cib/NSMenuItem.j +++ b/Tools/nib2cib/NSMenuItem.j @@ -50,10 +50,9 @@ _state = [aCoder decodeIntForKey:"NSState"]; _image = [aCoder decodeObjectForKey:"NSImage"]; - // _alternateImage = [aCoder decodeObjectForKey:""]; -// _onStateImage = [aCoder decodeObjectForKey:"NSOnImage"]; -// _offStateImage = [aCoder decodeObjectForKey:"NSOffImage"]; -// _mixedStateImage = [aCoder decodeObjectForKey:"NSMixedImage"]; + _onStateImage = [aCoder decodeObjectForKey:"NSOnImage"]; + _offStateImage = [aCoder decodeObjectForKey:"NSOffImage"]; + _mixedStateImage = [aCoder decodeObjectForKey:"NSMixedImage"]; _submenu = [aCoder decodeObjectForKey:"NSSubmenu"]; _menu = [aCoder decodeObjectForKey:"NSMenu"];