From 415518de9afd158cc5090a1b602049fed8b6637f Mon Sep 17 00:00:00 2001 From: Derk-Jan Hartman Date: Wed, 21 Dec 2005 01:18:40 +0000 Subject: [PATCH] Preliminary interaction framework for Mac OS X. Not finished, since core changes should be made to better match wxwidgets vs. Mac OS X style dialogs and concepts. part-2 --- modules/gui/macosx/interaction.h | 55 ++++++++ modules/gui/macosx/interaction.m | 213 +++++++++++++++++++++++++++++++ 2 files changed, 268 insertions(+) create mode 100644 modules/gui/macosx/interaction.h create mode 100644 modules/gui/macosx/interaction.m diff --git a/modules/gui/macosx/interaction.h b/modules/gui/macosx/interaction.h new file mode 100644 index 0000000000..585a492e50 --- /dev/null +++ b/modules/gui/macosx/interaction.h @@ -0,0 +1,55 @@ +/***************************************************************************** + * interaction.h: Mac OS X interaction dialogs + ***************************************************************************** + * Copyright (C) 2001-2005 the VideoLAN team + * $Id: vout.h 13803 2005-12-18 18:54:28Z bigben $ + * + * Authors: Derk-Jan Hartman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + *****************************************************************************/ +#include +#include +#include + +/***************************************************************************** + * VLCInteraction interface + *****************************************************************************/ +@interface VLCInteraction : NSObject +{ + interaction_dialog_t *p_dialog; +} + +-(id)initDialog: (interaction_dialog_t *)_p_dialog; +-(void)runDialog; +-(void)updateDialog; +-(void)hideDialog; +-(void)destroyDialog; + +@end + +/***************************************************************************** + * VLCInteractionList interface + *****************************************************************************/ +@interface VLCInteractionList : NSObject +{ + NSMutableArray *o_interaction_list; +} + +-(void)newInteractionEvent: (NSNotification *)o_notification; +-(void)addInteraction: (interaction_dialog_t *)p_dialog; +-(void)removeInteraction: (VLCInteraction *)p_interaction; + +@end diff --git a/modules/gui/macosx/interaction.m b/modules/gui/macosx/interaction.m new file mode 100644 index 0000000000..48ad4ea7c4 --- /dev/null +++ b/modules/gui/macosx/interaction.m @@ -0,0 +1,213 @@ +/***************************************************************************** + * interaction.h: Mac OS X interaction dialogs + ***************************************************************************** + * Copyright (C) 2001-2005 the VideoLAN team + * $Id: vout.h 13803 2005-12-18 18:54:28Z bigben $ + * + * Authors: Derk-Jan Hartman + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. + *****************************************************************************/ + +#include "intf.h" +#import + +/***************************************************************************** + * VLCInteractionList implementation + *****************************************************************************/ +@implementation VLCInteractionList + +-(id)init +{ + [super init]; + o_interaction_list = [[NSMutableArray alloc] initWithCapacity:1]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(newInteractionEvent:) + name: @"VLCNewInteractionEventNotification" + object:self]; + + return self; +} + +-(void)newInteractionEvent: (NSNotification *)o_notification +{ + VLCInteraction *o_interaction; + NSValue *o_value = [[o_notification userInfo] objectForKey:@"VLCDialogPointer"]; + interaction_dialog_t *p_dialog = [o_value pointerValue]; + + switch( p_dialog->i_action ) + { + case INTERACT_NEW: + [self addInteraction: p_dialog]; + break; + case INTERACT_UPDATE: + o_interaction = (VLCInteraction *)p_dialog->p_private; + [o_interaction updateDialog]; + break; + case INTERACT_HIDE: + o_interaction = (VLCInteraction *)p_dialog->p_private; + [o_interaction hideDialog]; + break; + case INTERACT_DESTROY: + o_interaction = (VLCInteraction *)p_dialog->p_private; + [o_interaction destroyDialog]; + [self removeInteraction:o_interaction]; + p_dialog->i_status = DESTROYED_DIALOG; + break; + } +} + +-(void)addInteraction: (interaction_dialog_t *)p_dialog +{ + + VLCInteraction *o_interaction = [[VLCInteraction alloc] initDialog: p_dialog]; + + p_dialog->p_private = (void *)o_interaction; + [o_interaction_list addObject:[o_interaction autorelease]]; + [o_interaction runDialog]; +} + +-(void)removeInteraction: (VLCInteraction *)o_interaction +{ + [o_interaction_list removeObject:o_interaction]; +} + +-(void)dealloc +{ + [[NSNotificationCenter defaultCenter] removeObserver:self]; + [o_interaction_list removeAllObjects]; + [o_interaction_list release]; + [super dealloc]; +} + +@end + +/***************************************************************************** + * VLCInteraction implementation + *****************************************************************************/ +@implementation VLCInteraction + +-(id)initDialog: (interaction_dialog_t *)_p_dialog +{ + [super init]; + p_dialog = _p_dialog; + return self; +} + +-(void)runDialog +{ + int i = 0; + id o_window = NULL; + if( !p_dialog ) + NSLog( @"serious issue" ); + + NSString *o_title = [NSString stringWithUTF8String:p_dialog->psz_title ? p_dialog->psz_title : "title"]; + NSString *o_description = [NSString stringWithUTF8String:p_dialog->psz_description ? p_dialog->psz_description : "desc"]; + + vout_thread_t *p_vout = vlc_object_find( VLCIntf, VLC_OBJECT_VOUT, FIND_ANYWHERE ); + if( p_vout != NULL ) + { + NSEnumerator * o_enum = [[NSApp orderedWindows] objectEnumerator]; + + while( ( o_window = [o_enum nextObject] ) ) + { + if( [[o_window className] isEqualToString: @"VLCWindow"] ) + { + vlc_object_release( (vlc_object_t *)p_vout ); + break; + } + } + vlc_object_release( (vlc_object_t *)p_vout ); + } + else + { + o_window = [NSApp mainWindow]; + } + + NSLog( @"Title: %@", o_title ); + NSLog( @"Description: %@", o_description ); + if( p_dialog->i_id == DIALOG_ERRORS ) + { + for( i = 0; i < p_dialog->i_widgets; i++ ) + { + NSLog( @"Error: %@", [NSString stringWithUTF8String: p_dialog->pp_widgets[i]->psz_text] ); + } + } + else + { + for( i = 0; i < p_dialog->i_widgets; i++ ) + { + NSLog( @"widget: %@", [NSString stringWithUTF8String: p_dialog->pp_widgets[i]->psz_text] ); + } + if( p_dialog->i_flags & DIALOG_OK_CANCEL ) + { + NSBeginInformationalAlertSheet( o_title, @"OK" , @"Cancel", nil, o_window, self, + @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil, o_description ); + } + else if( p_dialog->i_flags & DIALOG_YES_NO_CANCEL ) + { + NSBeginInformationalAlertSheet( o_title, @"Yes" , @"No", @"Cancel", o_window, self, + @selector(sheetDidEnd: returnCode: contextInfo:), NULL, nil, o_description ); + } + else + NSLog( @"not implemented yet" ); + } +} + +- (void)sheetDidEnd:(NSWindow *)o_sheet returnCode:(int)i_return + contextInfo:(void *)o_context +{ + vlc_mutex_lock( &p_dialog->p_interaction->object_lock ); + if( i_return == NSAlertDefaultReturn ) + { + p_dialog->i_return = DIALOG_OK_YES; + } + else if( i_return == NSAlertAlternateReturn && ( p_dialog->i_flags & DIALOG_OK_CANCEL ) ) + { + p_dialog->i_return = DIALOG_CANCELLED; + } + else if( i_return == NSAlertAlternateReturn ) + { + p_dialog->i_return = DIALOG_NO; + } + else if( i_return == NSAlertOtherReturn ) + { + p_dialog->i_return = DIALOG_CANCELLED; + } + p_dialog->i_status = ANSWERED_DIALOG; + vlc_mutex_unlock( &p_dialog->p_interaction->object_lock ); +} + +-(void)updateDialog +{ + NSLog( @"update event" ); +} + +-(void)hideDialog +{ + NSLog( @"hide event" ); +} + +-(void)destroyDialog +{ + NSLog( @"destroy event" ); +} + +-(void)dealloc +{ + [super dealloc]; +} + +@end \ No newline at end of file -- 2.39.2