--- /dev/null
+#import <Cocoa/Cocoa.h>
+#import "ui.h"
+
+@interface Controller : NSObject
+- (instancetype)initWithCallback:(void(*)(int, float))callback;
+- (void)sliderMoved:(id)sender;
+
+@end
+
+@implementation Controller {
+ void (*weightChanged)(int, float);
+}
+
+- (instancetype)initWithCallback:(void(*)(int, float))callback {
+ if (self = [super init]) {
+ self->weightChanged = callback;
+ }
+ return self;
+}
+
+- (void)sliderMoved:(id)sender {
+ NSSlider *slider = (NSSlider*)sender;
+ weightChanged([slider tag], [slider floatValue]);
+}
+@end
+
+void createControlWindow(size_t numBlendshapes, const char **names, void(*weightChanged)(int, float)) {
+ Controller *controller = [[Controller alloc] initWithCallback: weightChanged];
+
+ NSWindowStyleMask mask = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskUtilityWindow;
+ NSWindow *window = [[NSPanel alloc] initWithContentRect: NSMakeRect(20, 20, 340, 420)
+ styleMask:mask backing:NSBackingStoreBuffered defer:NO];
+ [window makeKeyAndOrderFront: nil];
+ [window setTitle: @"Blendshapes"];
+
+ NSMutableArray<NSView *> *sliders = [NSMutableArray arrayWithCapacity: numBlendshapes];
+
+ for (int i = 0; i < numBlendshapes; i++) {
+ NSSlider *slider = [NSSlider sliderWithTarget: controller action:@selector(sliderMoved:)];
+ [slider setTag: i];
+ NSTextField *label = [NSTextField labelWithString: [NSString stringWithUTF8String: names[i]]];
+ NSStackView *stackView = [NSStackView stackViewWithViews: @[label, slider]];
+ sliders[i] = stackView;
+ }
+
+ NSStackView *stackView = [NSStackView stackViewWithViews: sliders];
+ [stackView setOrientation: NSUserInterfaceLayoutOrientationVertical];
+ [stackView setEdgeInsets: NSEdgeInsetsMake(16, 16, 16, 16)];
+ [window setContentView: stackView];
+}