First pass at blendshapes
[opengl.git] / ui.mm
1 #import <Cocoa/Cocoa.h>
2 #import "ui.h"
3
4 @interface Controller : NSObject
5 - (instancetype)initWithCallback:(void(*)(int, float))callback;
6 - (void)sliderMoved:(id)sender;
7
8 @end
9
10 @implementation Controller {
11         void (*weightChanged)(int, float);
12 }
13
14 - (instancetype)initWithCallback:(void(*)(int, float))callback {
15         if (self = [super init]) {
16                 self->weightChanged = callback;
17         }
18         return self;
19 }
20
21 - (void)sliderMoved:(id)sender {
22         NSSlider *slider = (NSSlider*)sender;
23         weightChanged([slider tag], [slider floatValue]);
24 }
25 @end
26
27 void createControlWindow(size_t numBlendshapes, const char **names, void(*weightChanged)(int, float)) {
28         Controller *controller = [[Controller alloc] initWithCallback: weightChanged];
29
30         NSWindowStyleMask mask = NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskResizable | NSWindowStyleMaskUtilityWindow;
31         NSWindow *window = [[NSPanel alloc] initWithContentRect: NSMakeRect(20, 20, 340, 420)
32                                                 styleMask:mask backing:NSBackingStoreBuffered defer:NO];
33         [window makeKeyAndOrderFront: nil];
34         [window setTitle: @"Blendshapes"];
35
36         NSMutableArray<NSView *> *sliders = [NSMutableArray arrayWithCapacity: numBlendshapes];
37
38         for (int i = 0; i < numBlendshapes; i++) {
39                 NSSlider *slider = [NSSlider sliderWithTarget: controller action:@selector(sliderMoved:)];
40                 [slider setTag: i];
41                 NSTextField *label = [NSTextField labelWithString: [NSString stringWithUTF8String: names[i]]];
42                 NSStackView *stackView = [NSStackView stackViewWithViews: @[label, slider]];
43                 sliders[i] = stackView;
44         }
45
46         NSStackView *stackView = [NSStackView stackViewWithViews: sliders];
47         [stackView setOrientation: NSUserInterfaceLayoutOrientationVertical];
48         [stackView setEdgeInsets: NSEdgeInsetsMake(16, 16, 16, 16)];
49         [window setContentView: stackView];
50 }