PrusaSlicer-NonPlainar/src/slic3r/Utils/RetinaHelperImpl.mm
2019-01-24 20:03:12 +01:00

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