New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OS X impl update #601

Merged
merged 10 commits into from May 23, 2014

Improved style of Cocoa example

  • Loading branch information...
mantognini committed May 17, 2014
commit 6e01d1fde759caa18e35c97a35934524ae5b306c
@@ -28,34 +28,35 @@
/*
* NB : We need pointers for C++ objects fields in Obj-C interface !
* The recomanded way is to use PIMP idiom.
* The recommended way is to use PIMP idiom.
*
* It's elegant. Moreover, we do no constrain
* other file including this one to be Obj-C++.
*/
struct SFMLmainWindow;
@interface CocoaAppDelegate : NSObject <NSApplicationDelegate> {
@interface CocoaAppDelegate : NSObject <NSApplicationDelegate>
{
@private
NSWindow *m_window;
NSView *m_sfmlView;
NSTextField *m_textField;
SFMLmainWindow *m_mainWindow;
NSTimer *m_renderTimer;
BOOL m_visible;
BOOL m_initialized;
NSWindow* m_window;
NSView* m_sfmlView;
NSTextField* m_textField;
SFMLmainWindow* m_mainWindow;
NSTimer* m_renderTimer;
BOOL m_visible;
BOOL m_initialized;
}
@property (retain) IBOutlet NSWindow *window;
@property (assign) IBOutlet NSView *sfmlView;
@property (assign) IBOutlet NSTextField *textField;
@property (retain) IBOutlet NSWindow* window;
@property (assign) IBOutlet NSView* sfmlView;
@property (assign) IBOutlet NSTextField* textField;
-(IBAction)colorChanged:(NSPopUpButton *)sender;
-(IBAction)rotationChanged:(NSSlider *)sender;
-(IBAction)visibleChanged:(NSButton *)sender;
-(IBAction)textChanged:(NSTextField *)sender;
-(IBAction)updateText:(NSButton *)sender;
-(IBAction)colorChanged:(NSPopUpButton*)sender;
-(IBAction)rotationChanged:(NSSlider*)sender;
-(IBAction)visibleChanged:(NSButton*)sender;
-(IBAction)textChanged:(NSTextField*)sender;
-(IBAction)updateText:(NSButton*)sender;
@end
@@ -65,6 +66,6 @@ struct SFMLmainWindow;
*/
@interface SilentWindow : NSWindow
-(void)keyDown:(NSEvent *)theEvent;
-(void)keyDown:(NSEvent*)theEvent;
@end
@@ -34,14 +34,13 @@
// Our PIMPL
struct SFMLmainWindow
{
SFMLmainWindow(sf::WindowHandle win)
: renderWindow(win)
, background(sf::Color::Blue)
SFMLmainWindow(sf::WindowHandle win) :
renderWindow(win),
background(sf::Color::Blue)
{
std::string resPath = [[[NSBundle mainBundle] resourcePath] tostdstring];
if (!logo.loadFromFile(resPath + "/logo.png")) {
if (!logo.loadFromFile(resPath + "/logo.png"))
NSLog(@"Couldn't load the logo image");
}
logo.setSmooth(true);
@@ -55,9 +54,8 @@
unsigned int wh = renderWindow.getSize().y;
sprite.setPosition(sf::Vector2f(ww, wh) / 2.f);
if (!font.loadFromFile(resPath + "/sansation.ttf")) {
if (!font.loadFromFile(resPath + "/sansation.ttf"))
NSLog(@"Couldn't load the font");
}
text.setColor(sf::Color::White);
text.setFont(font);
@@ -74,13 +72,13 @@
// Private stuff
@interface CocoaAppDelegate ()
@property (assign) SFMLmainWindow *mainWindow;
@property (retain) NSTimer *renderTimer;
@property (assign) BOOL visible;
@property (assign) SFMLmainWindow* mainWindow;
@property (retain) NSTimer* renderTimer;
@property (assign) BOOL visible;
@property (assign) BOOL initialized;
@property (assign) BOOL initialized;
-(void)renderMainWindow:(NSTimer *)aTimer;
-(void)renderMainWindow:(NSTimer*)aTimer;
@end
@@ -98,15 +96,16 @@ @implementation CocoaAppDelegate
@synthesize initialized = m_initialized;
- (id)init {
- (id)init
{
self = [super init];
if (self) {
if (self)
self.initialized = NO;
}
return self;
}
-(void)applicationDidFinishLaunching:(NSNotification *)aNotification
-(void)applicationDidFinishLaunching:(NSNotification*)aNotification
{
(void)aNotification;
@@ -149,64 +148,53 @@ -(void)dealloc
self.sfmlView = nil;
self.textField = nil;
delete (SFMLmainWindow *) self.mainWindow;
delete (SFMLmainWindow*) self.mainWindow;
self.mainWindow = 0;
self.renderTimer = nil;
[super dealloc];
}
-(void)renderMainWindow:(NSTimer *)aTimer
-(void)renderMainWindow:(NSTimer*)aTimer
{
(void)aTimer;
// Scaling
/* /!\ we do this at 60fps so choose low scaling factor! /!\ */
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Up))
{
self.mainWindow->sprite.scale(1.01f, 1.01f);
}
if (sf::Keyboard::isKeyPressed(sf::Keyboard::Down))
{
self.mainWindow->sprite.scale(0.99f, 0.99f);
}
// Clear the window, display some stuff and display it into our view.
self.mainWindow->renderWindow.clear(self.mainWindow->background);
if (self.visible)
{
self.mainWindow->renderWindow.draw(self.mainWindow->sprite);
}
self.mainWindow->renderWindow.draw(self.mainWindow->text);
self.mainWindow->renderWindow.display();
}
-(IBAction)colorChanged:(NSPopUpButton *)sender
-(IBAction)colorChanged:(NSPopUpButton*)sender
{
if (self.initialized)
{
// Convert title to color
NSString *color = [[sender selectedItem] title];
NSString* color = [[sender selectedItem] title];
if ([color isEqualToString:BLUE])
{
self.mainWindow->background = sf::Color::Blue;
}
else if ([color isEqualToString:GREEN])
{
self.mainWindow->background = sf::Color::Green;
}
else
{
self.mainWindow->background = sf::Color::Red;
}
}
}
-(IBAction)rotationChanged:(NSSlider *)sender
-(IBAction)rotationChanged:(NSSlider*)sender
{
if (self.initialized)
{
@@ -215,31 +203,31 @@ -(IBAction)rotationChanged:(NSSlider *)sender
}
}
-(IBAction)visibleChanged:(NSButton *)sender
-(IBAction)visibleChanged:(NSButton*)sender
{
if (self.initialized)
self.visible = [sender state] == NSOnState;
}
-(IBAction)textChanged:(NSTextField *)sender
-(IBAction)textChanged:(NSTextField*)sender
{
if (self.initialized)
self.mainWindow->text.setString([[sender stringValue] tostdwstring]);
}
- (IBAction)updateText:(NSButton *)sender
- (IBAction)updateText:(NSButton*)sender
{
(void)sender;
// Simply simulate textChanged :
// Simply simulate textChanged:
[self textChanged:self.textField];
}
@end
@implementation SilentWindow
-(void)keyDown:(NSEvent *)theEvent
-(void)keyDown:(NSEvent*)theEvent
{
(void)theEvent;
// Do nothing except preventing this alert.
@@ -28,9 +28,9 @@
@interface NSString (NSString_stdstring)
+(id)stringWithstdstring:(std::string const &)string;
+(id)stringWithstdstring:(const std::string&)string;
+(id)stringWithstdwstring:(std::wstring const &)string;
+(id)stringWithstdwstring:(const std::wstring&)string;
-(std::string)tostdstring;
@@ -28,51 +28,46 @@
@implementation NSString (NSString_stdstring)
+(id)stringWithstdstring:(std::string const &)string
+(id)stringWithstdstring:(const std::string&)string
{
std::string utf8;
utf8.reserve(string.size() + 1);
sf::Utf8::fromAnsi(string.begin(), string.end(), std::back_inserter(utf8));
NSString *str = [NSString stringWithCString:utf8.c_str()
NSString* str = [NSString stringWithCString:utf8.c_str()
encoding:NSUTF8StringEncoding];
return str;
}
+(id)stringWithstdwstring:(const std::wstring&)string
{
char* data = (char*)string.data();
unsigned size = string.size() * sizeof(wchar_t);
NSString* str = [[[NSString alloc] initWithBytes:data length:size
encoding:NSUTF32LittleEndianStringEncoding] autorelease];
return str;
}
-(std::string)tostdstring
{
// Not sure about the encoding to use. Using [self UTF8String] doesn't
// work for characters like é or à.
const char *cstr = [self cStringUsingEncoding:NSISOLatin1StringEncoding];
if (cstr != NULL)
{
std::string str(cstr);
return str;
}
return std::string(cstr);
else
{
return "";
}
}
+(id)stringWithstdwstring:(std::wstring const &)string
{
char* data = (char *)string.data();
unsigned size = string.size() * sizeof(wchar_t);
NSString *str = [[[NSString alloc] initWithBytes:data length:size
encoding:NSUTF32LittleEndianStringEncoding] autorelease];
return str;
}
-(std::wstring)tostdwstring
{
// According to wikipedia, Mac OS X is Little Endian on x86 and x86-64
// http://en.wikipedia.org/wiki/Endianness
NSData* asData = [self dataUsingEncoding:NSUTF32LittleEndianStringEncoding];
return std::wstring((wchar_t *)[asData bytes], [asData length] / sizeof(wchar_t));
return std::wstring((wchar_t*)[asData bytes], [asData length] / sizeof(wchar_t));
}
@end
ProTip! Use n and p to navigate between commits in a pull request.