First pass at blendshapes
[opengl.git] / ui.mm
diff --git a/ui.mm b/ui.mm
new file mode 100644 (file)
index 0000000..c2a0c6f
--- /dev/null
+++ b/ui.mm
@@ -0,0 +1,50 @@
+#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];
+}