From dbc435e48c44fc7750bdd5b0ccd8b76f685e6dfb Mon Sep 17 00:00:00 2001 From: Denis Defreyne Date: Sun, 18 Dec 2011 21:38:58 +0100 Subject: [PATCH] converted button to c --- include/Monet/MOButton.h | 15 ++++---- src/Monet/MOButton.m | 83 ++++++++++++++++++++++------------------ src/Monet/MOImage.m | 10 ++++- src/Monet/MOView.m | 1 + 4 files changed, 61 insertions(+), 48 deletions(-) diff --git a/include/Monet/MOButton.h b/include/Monet/MOButton.h index 0d39891..235624b 100644 --- a/include/Monet/MOButton.h +++ b/include/Monet/MOButton.h @@ -1,10 +1,9 @@ +#import +#import #import -// @interface MOButton : MOView -// { -// struct MOButtonData *buttonData; -// } -// -// - (void)clicked; -// -// @end +typedef void (*MOButtonClickedCallback)(MOView *self); + +MOView *MOButtonCreate(MORect aFrame, MOApplication *aApplication); + +void MOButtonSetClickedCallback(MOView *self, MOButtonClickedCallback aCallback); diff --git a/src/Monet/MOButton.m b/src/Monet/MOButton.m index e15f36b..fcced8b 100644 --- a/src/Monet/MOButton.m +++ b/src/Monet/MOButton.m @@ -1,63 +1,70 @@ #import +#import + #import #import #import #import -/* - -struct MOButtonData +struct _MOButtonExtra { - BOOL isMouseDown; - BOOL isMouseInside; -}; + COGuts *guts; -@implementation MOButton : MOView + bool isMouseDown; + bool isMouseInside; + + MOButtonClickedCallback clickedCallback; +}; +typedef struct _MOButtonExtra MOButtonExtra; -- (id)initWithFrame: (MORect)aFrame app: (MOApplication *)aApp; +bool _MOButtonIsMousePressed(MOView *self) { - if ((self = [super initWithFrame: aFrame app: aApp])) - { - buttonData = calloc(1, sizeof (struct MOButtonData)); - buttonData->isMouseDown = NO; - buttonData->isMouseInside = NO; - } - - return self; -} + MOButtonExtra *extra = MOViewGetExtra(self); -#pragma mark - + MORect bounds = MOViewGetBounds(self); + MOPoint untranslatedPoint = MOApplicationGetMouseLocation(MOViewGetApplication(self)); + MOPoint point = MOViewConvertPointFromScreen(self, untranslatedPoint); + return extra->isMouseDown && MORectContainsPoint(bounds, point); +} -- (BOOL)isPressed +bool _MOButtonMouseButtonPressed(MOView *self, MOEvent *aEvent) { - return buttonData->isMouseDown && MORectContainsPoint( - [self bounds], - [self convertPointFromScreen: MOApplicationGetMouseLocation([self app])]); -} + MOButtonExtra *extra = MOViewGetExtra(self); -#pragma mark - + extra->isMouseDown = YES; -- (void)mouseDown: (MOEvent *)aEvent -{ - buttonData->isMouseDown = YES; + return true; } -- (void)mouseUp: (MOEvent *)aEvent +bool _MOButtonMouseButtonReleased(MOView *self, MOEvent *aEvent) { - if ([self isPressed]) - [self clicked]; + MOButtonExtra *extra = MOViewGetExtra(self); - buttonData->isMouseDown = NO; -} + if (_MOButtonIsMousePressed(self)) + extra->clickedCallback(self); -#pragma mark - + extra->isMouseDown = NO; -- (void)clicked -{ - ; + return true; } -@end +MOView *MOButtonCreate(MORect aFrame, MOApplication *aApplication) +{ + MOView *view = MOViewCreate(aFrame, aApplication); + + MOButtonExtra *extra = calloc(1, sizeof (MOButtonExtra)); + COInitialize(extra); + MOViewSetExtra(view, extra); + + MOViewSetMouseButtonPressedCallback(view, &_MOButtonMouseButtonPressed); + MOViewSetMouseButtonReleasedCallback(view, &_MOButtonMouseButtonReleased); -*/ + return view; +} + +void MOButtonSetClickedCallback(MOView *self, MOButtonClickedCallback aCallback) +{ + MOButtonExtra *extra = MOViewGetExtra(self); + extra->clickedCallback = aCallback; +} diff --git a/src/Monet/MOImage.m b/src/Monet/MOImage.m index ab54b1b..3000754 100644 --- a/src/Monet/MOImage.m +++ b/src/Monet/MOImage.m @@ -21,7 +21,10 @@ // Load file SDL_Surface *surface = IMG_Load(aFilename); if (!surface) - [NSException raise: @"SDLException" format: @"IMG_Load failed: %s\n", SDL_GetError()]; + { + fprintf(stderr, "IMG_Load failed (%s)\n", SDL_GetError()); + exit(1); + } // Create texture glGenTextures(1, &image->textureName); @@ -47,8 +50,11 @@ textureFormat = GL_BGR; } else + { // TODO handle gracefully - [NSException raise: @"OpenGLException" format: @"glTexImage2D preparation failed: image is not in truecolor (filename = %@)\n", aFilename]; + fprintf(stderr, "glTexImage2D preparation failed: image is not in truecolor (filename = %s)\n", aFilename); + exit(1); + } // Set size image->size = MOSizeMake(surface->w, surface->h); diff --git a/src/Monet/MOView.m b/src/Monet/MOView.m index 6defece..2f013d8 100644 --- a/src/Monet/MOView.m +++ b/src/Monet/MOView.m @@ -1,5 +1,6 @@ #import +#import #import #import