Making pop-up menus in custom Quartz Composer patches is actually surprisingly easy.
This release is only compatible with Tiger (10.4).Please see kineme.net for Leopard-specific informations.
1. Set up a QCIndexPort input. QCIndexPorts provide values from 0 to whatever max you specify using - (void)setMaxIndexValue:(unsigned int)max;.
@interface IndexPortPopUpDemoPatch : QCPatch
{
QCIndexPort *inputPerson;
}
...
@end
2. Add the “menu” key to the port’s input attributes:
<key>inputAttributes</key> <dict> <key>inputPerson</key> <dict> <key>description</key> <string>Person</string> <key>name</key> <string>Person</string> <key>menu</key> <array> <string>Arthur Dent</string> <string>Ford Prefect</string> <string>Zaphod Beeblebrox</string> <string>Marvin</string> <string>Trillian</string> <string>Slartibartfast</string> <string>Agrajag</string> <string>Wonko the Sane</string> </array> </dict> </dict>
3. Make sure you set the max index value in the initWithIdentifier function:
- (id)initWithIdentifier:(id)fp8
{
id z=[super initWithIdentifier:fp8];
[inputPerson setMaxIndexValue:7];
return z;
}
4. Read the value out of the QCIndexPort using - (unsigned int)indexValue;.
can you make and post a screen shot of it working within Quartz Composer itself? Holy cow I’m so excited to give this a shot this weekend :)
By cwright on 07.05.07 13:55 | Permalink
cwright -
The screenshot in the top right corner *is* actually QC itself.
smokris
By smokris on 07.05.07 13:58 | Permalink
Ahh, right you are. I wasn’t familiar with the Inspector window in QC :) I thought that was the Interface Builder’s Inspector guy. My Bad :)
By cwright on 07.05.07 14:18 | Permalink
To generate menu items at runtime, you have to override QCIndexPort’s initWithNode method. it looks like this:
- (id)initWithNode:(id)fp8 arguments:(id)fp12;
Here’s some code to do just that:
- (id)initWithNode:(id)fp8 arguments:(id)fp12
{
NSMutableDictionary *config = [fp12 mutableCopy];
NSMutableDictionary *attr;
NSMutableArray *menu = [[NSMutableArray alloc] init];
[config autorelease];
[menu autorelease];
attr = [config objectForKey:@”attributes”];
[menu addObject:@”foo”];
[menu addObject:@”bar”];
[menu addObject:@”baz”];
[attr setValue:menu forKey:@”menu”];
return [super initWithNode:fp8 arguments:config];
}
By cwright on 07.10.07 11:29 | Permalink