112 lines
3.1 KiB
Plaintext
112 lines
3.1 KiB
Plaintext
// The RetinaHelper was originally written by Andreas Stahl, 2013
|
|
|
|
#import "RetinaHelper.hpp"
|
|
#import "RetinaHelperImpl.hmm"
|
|
#import <OpenGL/OpenGL.h>
|
|
|
|
#import "wx/window.h"
|
|
|
|
@implementation RetinaHelperImpl
|
|
|
|
namespace Slic3r {
|
|
namespace GUI {
|
|
|
|
RetinaHelper::RetinaHelper(wxWindow* window) :
|
|
m_window(window)
|
|
{
|
|
m_self = nullptr;
|
|
m_self = [[RetinaHelperImpl alloc] initWithView:window->GetHandle() handler:window->GetEventHandler()];
|
|
}
|
|
|
|
RetinaHelper::~RetinaHelper()
|
|
{
|
|
[m_self release];
|
|
}
|
|
|
|
void RetinaHelper::set_use_retina(bool aValue)
|
|
{
|
|
[(id)m_self setViewWantsBestResolutionOpenGLSurface:aValue];
|
|
}
|
|
|
|
bool RetinaHelper::get_use_retina()
|
|
{
|
|
return [(id)m_self getViewWantsBestResolutionOpenGLSurface];
|
|
}
|
|
|
|
float RetinaHelper::get_scale_factor()
|
|
{
|
|
return [(id)m_self getViewWantsBestResolutionOpenGLSurface] ? [(id)m_self getBackingScaleFactor] : 1.0f;
|
|
}
|
|
|
|
} // namespace GUI
|
|
} // namespace Slic3r
|
|
|
|
|
|
-(id)initWithView:(NSView *)aView handler:(wxEvtHandler *)aHandler
|
|
{
|
|
self = [super init];
|
|
if (self) {
|
|
handler = aHandler;
|
|
view = aView;
|
|
// register for backing change notifications
|
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
|
if (nc) {
|
|
[nc addObserver:self selector:@selector(windowDidChangeBackingProperties:)
|
|
name:NSWindowDidChangeBackingPropertiesNotification object:nil];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
-(void) dealloc
|
|
{
|
|
// unregister from all notifications
|
|
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
|
|
if (nc) {
|
|
[nc removeObserver:self];
|
|
}
|
|
[super dealloc];
|
|
}
|
|
|
|
-(void)setViewWantsBestResolutionOpenGLSurface:(BOOL)value
|
|
{
|
|
[view setWantsBestResolutionOpenGLSurface:value];
|
|
}
|
|
|
|
-(BOOL)getViewWantsBestResolutionOpenGLSurface
|
|
{
|
|
return [view wantsBestResolutionOpenGLSurface];
|
|
}
|
|
|
|
-(float)getBackingScaleFactor
|
|
{
|
|
return [[view window] backingScaleFactor];
|
|
}
|
|
|
|
- (void)windowDidChangeBackingProperties:(NSNotification *)notification
|
|
{
|
|
NSWindow *theWindow = (NSWindow *)[notification object];
|
|
|
|
if (theWindow == [view window]) {
|
|
CGFloat newBackingScaleFactor = [theWindow backingScaleFactor];
|
|
CGFloat oldBackingScaleFactor = [[[notification userInfo]
|
|
objectForKey:@"NSBackingPropertyOldScaleFactorKey"]
|
|
doubleValue];
|
|
|
|
if (newBackingScaleFactor != oldBackingScaleFactor) {
|
|
// generate a wx resize event and pass it to the handler's queue
|
|
wxSizeEvent *event = new wxSizeEvent();
|
|
// use the following line if this resize event should have the physical pixel resolution
|
|
// but that is not recommended, because ordinary resize events won't do so either
|
|
// which would necessitate a case-by-case switch in the resize handler method.
|
|
// NSRect nsrect = [view convertRectToBacking:[view bounds]];
|
|
NSRect nsrect = [view bounds];
|
|
wxRect rect = wxRect(nsrect.origin.x, nsrect.origin.y, nsrect.size.width, nsrect.size.height);
|
|
event->SetRect(rect);
|
|
event->SetSize(rect.GetSize());
|
|
handler->QueueEvent(event);
|
|
}
|
|
}
|
|
}
|
|
@end
|