Browse Source

(Old stuff) Adds sliders. Rewrote some bits.

master
Joshua Moerman 8 years ago
parent
commit
b30e357d08
  1. 5
      CMakeLists.txt
  2. 17
      NSWrapper.hpp
  3. 92
      NSWrapper.mm

5
CMakeLists.txt

@ -11,10 +11,13 @@ find_library(FOUNDATION_LIBRARY Foundation)
find_library(COCOA_LIBRARY Cocoa)
find_library(COREGRAPHICS_LIBRARY CoreGraphics)
find_library(OPENGL_LIBRARY OpenGL)
find_library(QUARTZCORE_LIBRARY QuartzCore)
set(libs ${FOUNDATION_LIBRARY} ${COCOA_LIBRARY} ${COREGRAPHICS_LIBRARY} ${OPENGL_LIBRARY})
set(libs ${FOUNDATION_LIBRARY} ${COCOA_LIBRARY} ${COREGRAPHICS_LIBRARY} ${OPENGL_LIBRARY} ${QUARTZCORE_LIBRARY})
set(${LIBNAME}_LIBRARIES ${LIBNAME} ${libs} CACHE INTERNAL "")
target_link_libraries(${LIBNAME} ${libs})
target_include_directories(${LIBNAME} PUBLIC ".")
install(TARGETS ${LIBNAME} DESTINATION lib)
install(FILES ${headers} DESTINATION include/J)

17
NSWrapper.hpp

@ -10,12 +10,18 @@
#include <memory>
#include <functional>
#include <vector>
#include <string>
#include <CoreGraphics/CoreGraphics.h>
struct GLContext;
struct ContextParameters{
GLContext & context;
// These two functions will be set when invoking the draw_callback (and should be used)
std::function<void(void)> bind_framebuffer; // function to bind the systems framebuffer and set the viewport
std::function<void(void)> flush_drawable; // function to flush the drawable
};
struct GLViewFunctionality {
@ -26,6 +32,16 @@ struct GLViewFunctionality {
std::function<void(ContextParameters, CGFloat, CGFloat)> resize_callback;
};
struct Control {
std::string name = "default";
double start = 0, min = 0, max = 1;
std::function<void(double)> callback;
};
struct ControlFunctionality {
std::vector<Control> sliders;
};
// returns a GLViewFunctionality with only its draw function set.
GLViewFunctionality simple_draw(std::function<void()> f);
@ -35,6 +51,7 @@ struct NSAppWrapper {
void run();
void create_window(GLViewFunctionality const &);
void create_window(ControlFunctionality const &);
std::unique_ptr<struct NSAppWrapperImpl> impl;
};

92
NSWrapper.mm

@ -25,6 +25,26 @@ GLViewFunctionality simple_draw(std::function<void()> f){
@property GLViewFunctionality functionality;
@end
@interface MySlider : NSSlider
- (instancetype) initWithFrame:(NSRect)frame;
- (void)action:(MySlider*)sender;
@property std::function<void(CGFloat)> callback;
@end
@implementation MySlider
- (instancetype) initWithFrame:(NSRect)frame{
if(self = [super initWithFrame: frame]){
self.target = self;
self.action = @selector(action:);
}
return self;
}
- (void)action:(MySlider*)sender{
if(self.callback){
self.callback(sender.doubleValue);
}
}
@end
struct NSAppWrapperImpl {
NSAppWrapperImpl() {
@ -53,7 +73,15 @@ struct NSAppWrapperImpl {
defer:YES];
window.title = appName;
window.collectionBehavior |= NSWindowCollectionBehaviorFullScreenPrimary;
if(windows.empty()){
[window center];
} else {
NSWindow * previous_window = windows.back();
NSPoint top_right = previous_window.frame.origin;
top_right.x += previous_window.frame.size.width;
top_right.y += previous_window.frame.size.height;
[window setFrameTopLeftPoint: top_right];
}
[window makeKeyAndOrderFront:nil];
NSRect frame = [window contentRectForFrameRect:window.frame];
@ -63,7 +91,52 @@ struct NSAppWrapperImpl {
view.functionality = f;
window.contentView = view;
windows.push_back(window);
}
void create_window(ControlFunctionality const & f) {
const CGFloat width = 200;
NSWindow * window = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, width, 500)
styleMask:NSTitledWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask
backing:NSBackingStoreBuffered
defer:YES];
window.title = appName;
if(windows.empty()){
[window center];
} else {
NSWindow * previous_window = windows.back();
NSPoint top_right = previous_window.frame.origin;
top_right.x += previous_window.frame.size.width;
top_right.y += previous_window.frame.size.height;
[window setFrameTopLeftPoint: top_right];
}
[window makeKeyAndOrderFront:nil];
NSRect frame = [window contentRectForFrameRect:window.frame];
frame.origin = {0, 0};
NSView * view = [[NSView alloc] initWithFrame:frame];
CGFloat y = 0;
CGFloat h = 20;
CGFloat padding = 8;
for(auto&& c : f.sliders){
NSTextField * label = [[NSTextField alloc] initWithFrame:{padding, y+padding, 20, h}];
label.editable = NO;
label.bezeled = NO;
label.drawsBackground = NO;
label.stringValue = [NSString stringWithUTF8String: c.name.c_str()];
[view addSubview: label];
MySlider * slider = [[MySlider alloc] initWithFrame:{20+padding, y+padding, width-20-2*padding, h}];
slider.minValue = c.min;
slider.maxValue = c.max;
slider.doubleValue = c.start;
slider.callback = c.callback;
[view addSubview: slider];
y += h;
}
window.contentView = view;
windows.push_back(window);
}
@ -91,6 +164,10 @@ void NSAppWrapper::create_window(GLViewFunctionality const & f){
impl->create_window(f);
}
void NSAppWrapper::create_window(ControlFunctionality const & f){
impl->create_window(f);
}
/*
@ -129,7 +206,7 @@ void NSAppWrapper::create_window(GLViewFunctionality const & f){
[[self openGLContext] setValues:&swapInt forParameter:NSOpenGLCPSwapInterval];
if(functionality.initialize_callback){
functionality.initialize_callback({*context});
functionality.initialize_callback({*context, nullptr, nullptr});
}
// Create a display link capable of being used with all active displays
@ -167,7 +244,7 @@ void NSAppWrapper::create_window(GLViewFunctionality const & f){
NSRect viewRectPixels = [self convertRectToBacking:self.bounds];
if(functionality.resize_callback){
functionality.resize_callback({*context}, viewRectPixels.size.width, viewRectPixels.size.height);
functionality.resize_callback({*context, nullptr, nullptr}, viewRectPixels.size.width, viewRectPixels.size.height);
}
context->unlock();
@ -200,15 +277,18 @@ void NSAppWrapper::create_window(GLViewFunctionality const & f){
context->lock();
NSRect viewRectPixels = [self convertRectToBacking:self.bounds];
auto& ctx = context->ctx;
if(functionality.draw_callback){
functionality.draw_callback({*context, [viewRectPixels]{
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glViewport(0, 0, (int)viewRectPixels.size.width, (int)viewRectPixels.size.height);
if(functionality.draw_callback){
functionality.draw_callback({*context});
}, [&ctx]{
CGLFlushDrawable(ctx);
}
});
}
CGLFlushDrawable(context->ctx);
context->unlock();
}