[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[sc-dev] Announcement: Cocoa Bridge



Hi,
I've been working on a project that I expect many of you will be interested in and recently got the core functionality implemented. The project is a full Objective-C bridge in the style of PyObjC or RubyCocoa. My motivation for writing it is so that users can create GUIs in Interface Builder that work seamlessly with SuperCollider. I'm hoping to release it towards the end of December.

It supports:
	1- Subclassing Objective-C classes inside of SuperCollider.
2- Calling Objective-C objects with the same syntax you use to call Supercollider objects. 3- Connecting actions and outlets in Interface Builder to SuperCollider objects.
	4- Bindings.

As an example, lets say you wanted to build a simple UI that called a method upon pressing a button. First, you would drag a button into a window in Interface Builder. Then, still in Interface Builder, you instantiate an object named TestClass. You create an action in TestClass named test: and connect the button to the action. In SuperCollider you create a new class like so:

TestClass : NSObject {
	test_ { arg sender;
		"You hit the test button".postln;
	}
}

Note that the colons in Objective-C are replaced with underscores in SuperCollider. You recompile the class library, call a function to load the NIB and your UI pops up. Using things like a table view is similarly easy; you just implement two more methods: tableView_objectValueForTableColumn_row_ and numberOfRowsInTableView_. Doing an NSView subclass that draws a string and random color looks like:

CustomViewTest : NSView {
	initWithFrame_ { arg frameRect;
		^super.initWithFrame_(frameRect);
	}
	
	drawRect_ { arg rect;
NSColor.colorWithCalibratedRed_green_blue_alpha_(rrand(0, 1.0), rrand(0, 1.0), rrand(0, 1.0), 0.6).set;
		NSBezierPath.fillRect_(rect);
		rect = rect.moveBy(1, -2.2);
"I'm an NSView subclass running inside of SuperCollider".asNSString.drawInRect_withAttributes_(rect, nil);
	}
}

Some things to note: you call Objective-C methods by giving the method/argument names first and then the arguments in that order. NSRect (a C structure) is transparently bridged with the SuperCollider Rect class. As a convenience you can create an NSString by calling .asNSString on a SuperCollider string.

Those of you that are familiar with Jan's bridge might be thinking, "but hasn't this already been done?". Jan's bridge only supports one way communication with Cocoa. You can instantiate Cocoa objects and send them messages, but you can't have Cocoa call SuperCollider (which essential if you want to use NIB files or create delegates). Although I had to rewrite most of his code, my bridge is the next step in what he was doing.

Best,
Ryan