// // Created by Jonathan Wight on 09/24/07 // Copyright 2007 Toxic Software. All rights reserved. // #import "CAcornSpaceNavigator.h" #import #import "CConnexionClient.h" #import "Acorn.h" @implementation CAcornSpaceNavigator + (id)plugin { return([[[self alloc] init] autorelease]); } - (void)willRegister:(id )inPluginManager { [[CConnexionClient instance] setDelegate:self]; } - (void)didRegister { NSMenuItem *theLayerMenu = [[NSApp mainMenu] itemAtIndex:4]; [[theLayerMenu submenu] addItem:[NSMenuItem separatorItem]]; NSString *theName = [NSString stringWithFormat:@"Thundercats Ho!"]; NSMenuItem *theMenuItem = [[theLayerMenu submenu] insertItemWithTitle:theName action:@selector(actionEnterTransformMode:) keyEquivalent:@"" atIndex:[[theLayerMenu submenu] numberOfItems]]; [theMenuItem setTarget:self]; } - (IBAction)actionEnterTransformMode:(id)inSender { if (transformMode == NO) { transformMode = YES; id theDocument = [[NSDocumentController sharedDocumentController] currentDocument]; if (theDocument == NULL) return; transform = [[NSAffineTransform transform] retain]; id theCurrentLayer = [theDocument currentLayer]; image = [[theCurrentLayer CIImage] retain]; } else { transformMode = YES; [transform autorelease]; transform = NULL; [image autorelease]; image = NULL; } } - (void)client:(CConnexionClient *)inClient didUpdateAxis:(CConnexionAxis)inAxis { NSEvent *theCurrentEvent = [[NSApplication sharedApplication] currentEvent]; const double X = [inClient xAxisWeighted]; const double Y = [inClient yAxisWeighted]; const double Z = [inClient zAxisWeighted]; const double RX = [inClient rxAxisWeighted]; const double RY = [inClient ryAxisWeighted]; const double RZ = [inClient rzAxisWeighted]; CGEventRef theEvent = CGEventCreate(NULL); CGEventSetType(theEvent, kCGEventScrollWheel); CGEventSetDoubleValueField(theEvent, kCGScrollWheelEventDeltaAxis1, -Y / 10000.0); CGEventSetDoubleValueField(theEvent, kCGScrollWheelEventDeltaAxis2, -X / 10000.0); CGEventPost(kCGHIDEventTap, theEvent); CFRelease(theEvent); id theDocument = [[NSDocumentController sharedDocumentController] currentDocument]; if (theDocument == NULL) return; NSView *theCanvas = [[theDocument windowController] graphicView]; if (theCanvas == NULL) return; double theScale = [theCanvas scale]; theScale += Z / 10.0; [theCanvas setScale:theScale]; if (transformMode == YES) { if (RZ != 0.0) { CIImage *theImage = image; CGRect theImageExtent = [image extent]; [transform translateXBy:theImageExtent.size.width / 2.0 yBy:theImageExtent.size.height / 2.0]; [transform rotateByDegrees:RZ * 10.0]; [transform translateXBy:-theImageExtent.size.width / 2.0 yBy:-theImageExtent.size.height / 2.0]; CIFilter *theFilter = [CIFilter filterWithName:@"CIAffineTransform"]; [theFilter setDefaults]; [theFilter setValue:transform forKey:@"inputTransform"]; [theFilter setValue:theImage forKey:@"inputImage"]; theImage = [theFilter valueForKey:@"outputImage"]; id theCurrentLayer = [theDocument currentLayer]; [theCurrentLayer setCIImage:theImage usingUndo:YES]; } } } @end