diff options
-rw-r--r-- | macosx/MVMenuButton.h | 22 | ||||
-rw-r--r-- | macosx/MVMenuButton.m | 164 | ||||
-rw-r--r-- | macosx/icons/actionWidget.png | bin | 0 -> 730 bytes | |||
-rw-r--r-- | macosx/icons/actionWidgetPressed.png | bin | 0 -> 704 bytes |
4 files changed, 186 insertions, 0 deletions
diff --git a/macosx/MVMenuButton.h b/macosx/MVMenuButton.h new file mode 100644 index 000000000..777642d67 --- /dev/null +++ b/macosx/MVMenuButton.h @@ -0,0 +1,22 @@ +#import <Cocoa/Cocoa.h> + +@interface MVMenuButton : NSButton <NSCoding> { +@protected + BOOL _drawsArrow; + NSImage *_orgImage; + NSImage *_smallImage; + NSControlSize _size; + NSToolbarItem *_toolbarItem; +} +- (NSControlSize) controlSize; +- (void) setControlSize:(NSControlSize) controlSize; + +- (NSImage *) smallImage; +- (void) setSmallImage:(NSImage *) image; + +- (NSToolbarItem *) toolbarItem; +- (void) setToolbarItem:(NSToolbarItem *) item; + +- (BOOL) drawsArrow; +- (void) setDrawsArrow:(BOOL) arrow; +@end diff --git a/macosx/MVMenuButton.m b/macosx/MVMenuButton.m new file mode 100644 index 000000000..ea6b2efc6 --- /dev/null +++ b/macosx/MVMenuButton.m @@ -0,0 +1,164 @@ +#import "MVMenuButton.h" + +@implementation MVMenuButton +- (void) encodeWithCoder:(NSCoder *) coder { + [super encodeWithCoder:coder]; +} + +- (id) initWithFrame:(NSRect) frame { + if( ( self = [super initWithFrame:frame] ) ) { + [self setBordered:NO]; + [self setButtonType:NSMomentaryChangeButton]; + } + return self; +} + +- (id) initWithCoder:(NSCoder *) coder { + if( ( self = [super initWithCoder:coder] ) ) { + _size = NSRegularControlSize; + _drawsArrow = NO; + _orgImage = [[self image] copy]; + _smallImage = nil; + _toolbarItem = nil; + } + return self; +} + +- (void) dealloc { + [_orgImage release]; + [_smallImage release]; + + _orgImage = nil; + _smallImage = nil; + _toolbarItem = nil; + + [super dealloc]; +} + +- (void) drawRect:(NSRect) rect { + [super drawRect:rect]; + + if( [self drawsArrow] ) { + NSBezierPath *path = [NSBezierPath bezierPath]; + + if( _size == NSRegularControlSize ) { + [path moveToPoint:NSMakePoint( NSWidth( [self frame] ) - 6, NSHeight( [self frame] ) - 3 )]; + [path relativeLineToPoint:NSMakePoint( 6, 0 )]; + [path relativeLineToPoint:NSMakePoint( -3, 3 )]; + } else if( _size == NSSmallControlSize ) { + [path moveToPoint:NSMakePoint( NSWidth( [self frame] ) - 4, NSHeight( [self frame] ) - 3 )]; + [path relativeLineToPoint:NSMakePoint( 4, 0 )]; + [path relativeLineToPoint:NSMakePoint( -2, 3 )]; + } + + [path closePath]; + [[[NSColor blackColor] colorWithAlphaComponent:0.75] set]; + [path fill]; + } +} + +- (void) mouseDown:(NSEvent *) theEvent { + if( ! [self isEnabled] ) return; + if( ! [self menu] ) { + [super mouseDown:theEvent]; + return; + } + + [self highlight:YES]; + + NSPoint point = [self convertPoint:[self bounds].origin toView:nil]; + point.y -= NSHeight( [self frame] ) + 2.; + point.x -= 1.; + + NSEvent *event = [NSEvent mouseEventWithType:[theEvent type] location:point modifierFlags:[theEvent modifierFlags] timestamp:[theEvent timestamp] windowNumber:[[theEvent window] windowNumber] context:[theEvent context] eventNumber:[theEvent eventNumber] clickCount:[theEvent clickCount] pressure:[theEvent pressure]]; + [NSMenu popUpContextMenu:[self menu] withEvent:event forView:self]; + + [self mouseUp:[[NSApplication sharedApplication] currentEvent]]; +} + +- (void) mouseUp:(NSEvent *) theEvent { + [self highlight:NO]; + [super mouseUp:theEvent]; +} + +- (void) mouseDragged:(NSEvent *) theEvent { + return; +} + +- (NSControlSize) controlSize { + return ( _size ? _size : NSRegularControlSize ); +} + +- (void) setControlSize:(NSControlSize) controlSize { + if( ! _orgImage ) _orgImage = [[self image] copy]; + if( controlSize == NSRegularControlSize ) { + [super setImage:_orgImage]; + [_toolbarItem setMinSize:NSMakeSize( 32., 32. )]; + [_toolbarItem setMaxSize:NSMakeSize( 32., 32. )]; + } else if( controlSize == NSSmallControlSize ) { + if( ! _smallImage ) { + NSImageRep *sourceImageRep = [_orgImage bestRepresentationForDevice:nil]; + _smallImage = [[NSImage alloc] initWithSize:NSMakeSize( 24., 24. )]; + [_smallImage lockFocus]; + [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; + [sourceImageRep drawInRect:NSMakeRect( 0., 0., 24., 24. )]; + [_smallImage unlockFocus]; + } + [super setImage:_smallImage]; + [_toolbarItem setMinSize:NSMakeSize( 24., 24. )]; + [_toolbarItem setMaxSize:NSMakeSize( 24., 24. )]; + } + _size = controlSize; +} + +- (void) setImage:(NSImage *) image { + [_orgImage autorelease]; + _orgImage = [[self image] copy]; + + NSImageRep *sourceImageRep = [image bestRepresentationForDevice:nil]; + [_smallImage autorelease]; + _smallImage = [[NSImage alloc] initWithSize:NSMakeSize( 24., 24. )]; + [_smallImage lockFocus]; + [[NSGraphicsContext currentContext] setImageInterpolation:NSImageInterpolationHigh]; + [sourceImageRep drawInRect:NSMakeRect( 0., 0., 24., 24. )]; + [_smallImage unlockFocus]; + + if( _size == NSRegularControlSize ) [super setImage:image]; + else if( _size == NSSmallControlSize ) [super setImage:_smallImage]; +} + +- (NSImage *) smallImage { + return _smallImage; +} + +- (void) setSmallImage:(NSImage *) image { + [_smallImage autorelease]; + _smallImage = [image copy]; +} + +- (NSToolbarItem *) toolbarItem { + return _toolbarItem; +} + +- (void) setToolbarItem:(NSToolbarItem *) item { + _toolbarItem = item; +} + +- (BOOL) drawsArrow { + return _drawsArrow; +} + +- (void) setDrawsArrow:(BOOL) arrow { + _drawsArrow = arrow; +} + +- (id) accessibilityAttributeValue:(NSString *) attribute { + if( [attribute isEqualToString:NSAccessibilityTitleAttribute] ) + return [_toolbarItem label]; + if( [attribute isEqualToString:NSAccessibilityHelpAttribute] ) + return [_toolbarItem toolTip]; + if( [attribute isEqualToString:NSAccessibilityToolbarButtonAttribute] ) + return _toolbarItem; + return [super accessibilityAttributeValue:attribute]; +} +@end diff --git a/macosx/icons/actionWidget.png b/macosx/icons/actionWidget.png Binary files differnew file mode 100644 index 000000000..d4e18cb36 --- /dev/null +++ b/macosx/icons/actionWidget.png diff --git a/macosx/icons/actionWidgetPressed.png b/macosx/icons/actionWidgetPressed.png Binary files differnew file mode 100644 index 000000000..ba98f62ab --- /dev/null +++ b/macosx/icons/actionWidgetPressed.png |