From 699e4bb62df2e5b70a4f08c179686af1369a1a21 Mon Sep 17 00:00:00 2001 From: Derk-Jan Hartman Date: Thu, 20 Jan 2005 20:51:36 +0000 Subject: [PATCH] OS X intf work - don't use bool. it's BOOL - use GNU style C and hungarian notation - fix the issue with GUI crashes in playlistview - default is now category view (for experimentation until we have a SD menu) - experiment with NSViews to fix the 'drawer' issue (not working though) --- .../English.lproj/MainMenu.nib/classes.nib | 1 + .../English.lproj/MainMenu.nib/info.nib | 9 +- .../English.lproj/MainMenu.nib/objects.nib | Bin 33568 -> 33324 bytes modules/gui/macosx/intf.h | 5 + modules/gui/macosx/intf.m | 28 ++ modules/gui/macosx/playlist.h | 14 +- modules/gui/macosx/playlist.m | 317 ++++++++++-------- modules/gui/macosx/playlistinfo.m | 3 +- modules/gui/macosx/vout.h | 4 +- modules/gui/macosx/vout.m | 4 +- 10 files changed, 219 insertions(+), 166 deletions(-) diff --git a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/classes.nib b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/classes.nib index 4bfb9ca845..ae36c854b5 100644 --- a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/classes.nib +++ b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/classes.nib @@ -125,6 +125,7 @@ "o_btn_prev" = id; "o_btn_rewind" = id; "o_btn_stop" = id; + "o_clip_view" = id; "o_controls" = id; "o_dmi_mute" = id; "o_dmi_next" = id; diff --git a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/info.nib b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/info.nib index ae25b06180..b4641d6652 100644 --- a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/info.nib +++ b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/info.nib @@ -9,9 +9,9 @@ 1617 542 480 104 149 0 0 1024 746 2197 - 91 300 596 367 0 0 1024 746 + 195 211 596 367 0 0 1280 938 29 - 163 439 419 44 0 0 800 578 + 132 749 419 44 0 0 1280 938 915 731 416 165 180 0 0 1024 746 @@ -22,11 +22,6 @@ 2203 2208 2206 - 2199 - - IBOpenObjects - - 29 IBSystem Version 7S215 diff --git a/extras/MacOSX/Resources/English.lproj/MainMenu.nib/objects.nib b/extras/MacOSX/Resources/English.lproj/MainMenu.nib/objects.nib index 7c690c8c3264b952541d2ce268723409b165770d..5159d5eb0c4e6fe45996f7e6797204945e131392 100644 GIT binary patch literal 33324 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 literal 33568 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 TJ1-eYhMVxg$|!%vHJ|@K(G6wC diff --git a/modules/gui/macosx/intf.h b/modules/gui/macosx/intf.h index 6bf31894f7..094be51cd9 100644 --- a/modules/gui/macosx/intf.h +++ b/modules/gui/macosx/intf.h @@ -87,6 +87,7 @@ struct intf_sys_t BOOL nib_open_loaded; /* reference to the open-nib */ IBOutlet id o_window; /* main window */ + IBOutlet id o_clip_view; /* playlist clipview */ IBOutlet id o_scrollfield; /* info field */ IBOutlet id o_timefield; /* time field */ IBOutlet id o_timeslider; /* time slider */ @@ -232,6 +233,10 @@ struct intf_sys_t IBOutlet id o_dmi_next; IBOutlet id o_dmi_previous; IBOutlet id o_dmi_mute; + + /* stupid outline views .... */ + NSRect rect_remember; + NSView *o_document_view; } + (VLCMain *)sharedInstance; diff --git a/modules/gui/macosx/intf.m b/modules/gui/macosx/intf.m index 6d76c752af..80680ff95f 100644 --- a/modules/gui/macosx/intf.m +++ b/modules/gui/macosx/intf.m @@ -377,6 +377,7 @@ static VLCMain *_o_sharedMainInstance = nil; [self setSubmenusEnabled: FALSE]; [self manageVolumeSlider]; + [o_window setDelegate: self]; p_playlist = (playlist_t *) vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); @@ -1437,6 +1438,33 @@ static VLCMain *_o_sharedMainInstance = nil; } } +- (NSSize)windowWillResize:(NSWindow *)sender toSize:(NSSize)proposedFrameSize +{ + if( proposedFrameSize.height <= 200 ) + { + if( [sender frame].size.height > 200 ) + { + //rect_remember = [[o_playlist playlistView] frame]; + o_document_view = [o_clip_view documentView]; + [o_document_view retain]; + [o_clip_view setDocumentView: NULL]; + } + return NSMakeSize( proposedFrameSize.width, 95 ); + } + else + { + if( [sender frame].size.height <= 200 ) + { + [o_clip_view setDocumentView: o_document_view]; + [o_document_view release]; + [o_document_view setFrameSize: NSMakeSize( proposedFrameSize.width - 22, proposedFrameSize.height - 120 )]; + //[[o_playlist playlistView] setFrame: rect_remember]; + } + return proposedFrameSize; + } + return proposedFrameSize; +} + @end @implementation VLCMain (NSMenuValidation) diff --git a/modules/gui/macosx/playlist.h b/modules/gui/macosx/playlist.h index e771893b3d..d843b68c4d 100644 --- a/modules/gui/macosx/playlist.h +++ b/modules/gui/macosx/playlist.h @@ -60,18 +60,20 @@ NSImage *o_descendingSortingImage; NSImage *o_ascendingSortingImage; - NSMutableDictionary * o_outline_dict; + NSMutableDictionary *o_outline_dict; - bool b_selected_item_met; - bool b_isSortDescending; + BOOL b_selected_item_met; + BOOL b_isSortDescending; + int i_current_view; id o_tc_sortColumn; } -- (IBAction)handlePopUp:(id)sender; -- (IBAction)searchItem:(id)sender; - - (void)initStrings; - (NSMenu *)menuForEvent:(NSEvent *)o_event; +- (NSOutlineView *)playlistView; + +- (IBAction)handlePopUp:(id)sender; +- (IBAction)searchItem:(id)sender; - (void)updateTogglePlaylistState; - (void)playlistUpdated; diff --git a/modules/gui/macosx/playlist.m b/modules/gui/macosx/playlist.m index fc354a0803..296c1f3c71 100644 --- a/modules/gui/macosx/playlist.m +++ b/modules/gui/macosx/playlist.m @@ -35,7 +35,6 @@ */ - /***************************************************************************** * Preamble *****************************************************************************/ @@ -99,8 +98,9 @@ - (id)init { self = [super init]; - if ( self !=nil ) + if ( self != nil ) { + o_outline_dict = [[NSMutableDictionary alloc] init]; //i_moveRow = -1; } return self; @@ -108,6 +108,10 @@ - (void)awakeFromNib { + playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + i_current_view = VIEW_CATEGORY; + playlist_ViewUpdate( p_playlist, i_current_view ); [o_outline_view setTarget: self]; [o_outline_view setDelegate: self]; [o_outline_view setDataSource: self]; @@ -139,7 +143,6 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ o_descendingSortingImage = nil; } - o_outline_dict = [[NSMutableDictionary alloc] init]; o_tc_sortColumn = nil; [self initStrings]; @@ -171,6 +174,11 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [[o_loop_popup itemAtIndex:2] setTitle: _NS("Repeat All")]; } +- (NSOutlineView *)playlistView +{ + return o_outline_view; +} + - (IBAction)toggleWindow:(id)sender { NSRect o_rect; @@ -242,14 +250,16 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [o_outline_view setHighlightedTableColumn:nil]; o_tc_sortColumn = nil; - [o_outline_dict removeAllObjects]; + // TODO Find a way to keep the dict size to a minimum + //[o_outline_dict removeAllObjects]; [o_outline_view reloadData]; } + - (void)updateTogglePlaylistState { - if ([o_controller getSizeWithPlaylist].height == - [o_controller minSize].height) + if( [o_controller getSizeWithPlaylist].height == + [o_controller minSize].height ) { [o_btn_playlist setState: NO]; } @@ -261,25 +271,26 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (void)updateRowSelection { - playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - playlist_item_t * p_item, * p_temp_item; - NSMutableArray * o_array = [NSMutableArray array]; int i,i_row; unsigned int j; + + playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + playlist_item_t *p_item, *p_temp_item; + NSMutableArray *o_array = [NSMutableArray array]; - if (p_playlist == NULL) + if( p_playlist == NULL ) return; p_item = p_playlist->status.p_item; p_temp_item = p_item; - while (p_temp_item->i_parents > 0) + while( p_temp_item->i_parents > 0 ) { [o_array insertObject: [NSValue valueWithPointer: p_temp_item] atIndex: 0]; for (i = 0 ; i < p_temp_item->i_parents ; i++) { - if (p_temp_item->pp_parents[i]->i_view == VIEW_SIMPLE) + if( p_temp_item->pp_parents[i]->i_view == i_current_view ) { p_temp_item = p_temp_item->pp_parents[i]->p_parent; break; @@ -304,27 +315,28 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ vlc_object_release(p_playlist); } -- (bool)isItem:(playlist_item_t *)p_item inNode:(playlist_item_t *)p_node + +- (BOOL)isItem: (playlist_item_t *)p_item inNode: (playlist_item_t *)p_node { playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - playlist_item_t * p_temp_item = p_item; + playlist_item_t *p_temp_item = p_item; - if ( p_playlist == NULL ) + if( p_playlist == NULL ) { return NO; } - while ( p_temp_item->i_parents > 0 ) + while( p_temp_item->i_parents > 0 ) { int i; - for (i = 0; i < p_temp_item->i_parents ; i++) + for( i = 0; i < p_temp_item->i_parents ; i++ ) { - if (p_temp_item->pp_parents[i]->i_view == VIEW_SIMPLE) + if( p_temp_item->pp_parents[i]->i_view == i_current_view ) { - if (p_temp_item->pp_parents[i]->p_parent == p_node) + if( p_temp_item->pp_parents[i]->p_parent == p_node ) { - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); return YES; } else @@ -336,11 +348,12 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } } - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); return NO; } +/* When called retrieves the selected outlineview row and plays that node or item */ - (IBAction)playItem:(id)sender { intf_thread_t * p_intf = VLCIntf; @@ -357,11 +370,11 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ if( p_item ) { - if (p_item->i_children == -1) + if( p_item->i_children == -1 ) { - for (i = 0 ; i < p_item->i_parents ; i++) + for( i = 0 ; i < p_item->i_parents ; i++ ) { - if (p_item->pp_parents[i]->i_view == VIEW_SIMPLE) + if( p_item->pp_parents[i]->i_view == i_current_view ) { p_node = p_item->pp_parents[i]->p_parent; } @@ -370,8 +383,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ else { p_node = p_item; - if (p_node->pp_children[0]->i_children == -1 && - p_node->i_children > 0) + if( p_node->i_children > 0 && p_node->pp_children[0]->i_children == -1 ) { p_item = p_node->pp_children[0]; } @@ -381,11 +393,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } } -// p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); - - - playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VIEW_SIMPLE, p_node, p_item ); -// playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, VIEW_SIMPLE, p_view ? p_view->p_root : NULL, p_item ); + playlist_Control( p_playlist, PLAYLIST_VIEWPLAY, i_current_view, p_node, p_item ); } vlc_object_release( p_playlist ); } @@ -398,7 +406,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (IBAction)deleteItem:(id)sender { - int i, c, i_row; + int i, i_count, i_row; NSMutableArray *o_to_delete; NSNumber *o_number; @@ -413,39 +421,41 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ return; } o_to_delete = [NSMutableArray arrayWithArray:[[o_outline_view selectedRowEnumerator] allObjects]]; - c = [o_to_delete count]; + i_count = [o_to_delete count]; - for( i = 0; i < c; i++ ) { + for( i = 0; i < i_count; i++ ) + { playlist_item_t * p_item; o_number = [o_to_delete lastObject]; i_row = [o_number intValue]; [o_to_delete removeObject: o_number]; [o_outline_view deselectRow: i_row]; - p_item = (playlist_item_t *)[[o_outline_view itemAtRow: i_row]pointerValue]; - if (p_item->i_children > -1) + + p_item = (playlist_item_t *)[[o_outline_view itemAtRow: i_row] pointerValue]; + + if( p_item->i_children > -1 ) //is a node and not an item { - if (p_playlist->status.i_status) + if( p_playlist->status.i_status != PLAYLIST_STOPPED && + [self isItem: p_playlist->status.p_item inNode: p_item] == YES ) { - if ([self isItem:p_playlist->status.p_item inNode: p_item] - == YES && p_playlist->status.i_status) - { - playlist_Stop( p_playlist ); - } + // if current item is in selected node and is playing then stop playlist + playlist_Stop( p_playlist ); } playlist_NodeDelete( p_playlist, p_item, VLC_TRUE); } else { - if( p_playlist->status.p_item == [[o_outline_view itemAtRow: i_row] - pointerValue] && p_playlist->status.i_status ) + if( p_playlist->status.i_status != PLAYLIST_STOPPED && + p_playlist->status.p_item == [[o_outline_view itemAtRow: i_row] pointerValue] ) { playlist_Stop( p_playlist ); } playlist_LockDelete( p_playlist, p_item->input.i_id ); } - [self playlistUpdated]; } + [self playlistUpdated]; + vlc_object_release( p_playlist ); } - (IBAction)sortNodeByName:(id)sender @@ -469,7 +479,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ return; } - if ([o_outline_view selectedRow] > -1) + if( [o_outline_view selectedRow] > -1 ) { p_item = [[o_outline_view itemAtRow: [o_outline_view selectedRow]] pointerValue]; @@ -477,33 +487,33 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ else /*If no item is selected, sort the whole playlist*/ { - playlist_view_t * p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); + playlist_view_t * p_view = playlist_ViewFind( p_playlist, i_current_view ); p_item = p_view->p_root; } - if (p_item->i_children > -1) + if( p_item->i_children > -1 ) // the item is a node { - vlc_mutex_lock(&p_playlist->object_lock ); + vlc_mutex_lock( &p_playlist->object_lock ); playlist_RecursiveNodeSort( p_playlist, p_item, i_mode, ORDER_NORMAL ); - vlc_mutex_unlock(&p_playlist->object_lock ); + vlc_mutex_unlock( &p_playlist->object_lock ); } else { int i; - for (i = 0 ; i < p_item->i_parents ; i++) + for( i = 0 ; i < p_item->i_parents ; i++ ) { - if (p_item->pp_parents[i]->i_view == VIEW_SIMPLE) + if( p_item->pp_parents[i]->i_view == i_current_view ) { - vlc_mutex_lock(&p_playlist->object_lock ); + vlc_mutex_lock( &p_playlist->object_lock ); playlist_RecursiveNodeSort( p_playlist, p_item->pp_parents[i]->p_parent, i_mode, ORDER_NORMAL ); - vlc_mutex_unlock(&p_playlist->object_lock ); + vlc_mutex_unlock( &p_playlist->object_lock ); break; } } } - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); [self playlistUpdated]; } @@ -519,7 +529,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ return; } - for ( i_item = 0; i_item < (int)[o_array count]; i_item++ ) + for( i_item = 0; i_item < (int)[o_array count]; i_item++ ) { /* One item */ NSDictionary *o_one_item; @@ -575,11 +585,6 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ i_position == -1 ? PLAYLIST_END : i_position + i_item, 0, (ppsz_options != NULL ) ? (const char **)ppsz_options : 0, i_total_options ); - /* clean up - for( j = 0; j < i_total_options; j++ ) - free( ppsz_options[j] ); - if( ppsz_options ) free( ppsz_options ); */ - /* Recent documents menu */ o_true_file = [NSURL fileURLWithPath: o_uri]; if( o_true_file != nil ) @@ -601,16 +606,16 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (IBAction)handlePopUp:(id)sender { - intf_thread_t * p_intf = VLCIntf; - vlc_value_t val1,val2; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - if( p_playlist == NULL ) - { - return; - } + intf_thread_t * p_intf = VLCIntf; + vlc_value_t val1,val2; + playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); + if( p_playlist == NULL ) + { + return; + } - switch ([o_loop_popup indexOfSelectedItem]) + switch( [o_loop_popup indexOfSelectedItem] ) { case 1: @@ -632,7 +637,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ default: var_Get( p_playlist, "repeat", &val1 ); var_Get( p_playlist, "loop", &val2 ); - if (val1.b_bool || val2.b_bool) + if( val1.b_bool || val2.b_bool ) { val1.b_bool = 0; var_Set( p_playlist, "repeat", val1 ); @@ -647,12 +652,12 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (NSMutableArray *)subSearchItem:(playlist_item_t *)p_item { - playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, + playlist_t *p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - playlist_item_t * p_selected_item; + playlist_item_t *p_selected_item; int i_current, i_selected_row; - if (!p_playlist) + if( !p_playlist ) return NULL; i_selected_row = [o_outline_view selectedRow]; @@ -662,57 +667,57 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ p_selected_item = (playlist_item_t *)[[o_outline_view itemAtRow: i_selected_row] pointerValue]; - for (i_current = 0; i_current < p_item->i_children ; i_current++) + for( i_current = 0; i_current < p_item->i_children ; i_current++ ) { - char * psz_temp; - NSString * o_current_name, * o_current_author; + char *psz_temp; + NSString *o_current_name, *o_current_author; vlc_mutex_lock( &p_playlist->object_lock ); o_current_name = [NSString stringWithUTF8String: p_item->pp_children[i_current]->input.psz_name]; - psz_temp = vlc_input_item_GetInfo(&p_item->input , + psz_temp = vlc_input_item_GetInfo( &p_item->input , _("Meta-information"),_("Author") ); o_current_author = [NSString stringWithUTF8String: psz_temp]; free( psz_temp); vlc_mutex_unlock( &p_playlist->object_lock ); - if (p_selected_item == p_item->pp_children[i_current] && - b_selected_item_met == NO) + if( p_selected_item == p_item->pp_children[i_current] && + b_selected_item_met == NO ) { b_selected_item_met = YES; } - else if (p_selected_item == p_item->pp_children[i_current] && - b_selected_item_met == YES) + else if( p_selected_item == p_item->pp_children[i_current] && + b_selected_item_met == YES ) { - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); return NULL; } - else if (b_selected_item_met == YES && - ([o_current_name rangeOfString:[o_search_field + else if( b_selected_item_met == YES && + ( [o_current_name rangeOfString:[o_search_field stringValue] options:NSCaseInsensitiveSearch ].length || - [o_current_author rangeOfString:[o_search_field - stringValue] options:NSCaseInsensitiveSearch ].length)) + [o_current_author rangeOfString:[o_search_field + stringValue] options:NSCaseInsensitiveSearch ].length ) ) { - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); /*Adds the parent items in the result array as well, so that we can expand the tree*/ return [NSMutableArray arrayWithObject: [NSValue valueWithPointer: p_item->pp_children[i_current]]]; } - if (p_item->pp_children[i_current]->i_children > 0) + if( p_item->pp_children[i_current]->i_children > 0 ) { id o_result = [self subSearchItem: p_item->pp_children[i_current]]; - if (o_result != NULL) + if( o_result != NULL ) { - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); [o_result insertObject: [NSValue valueWithPointer: p_item->pp_children[i_current]] atIndex:0]; return o_result; } } } - vlc_object_release(p_playlist); + vlc_object_release( p_playlist ); return NULL; } @@ -731,21 +736,21 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ if( p_playlist == NULL ) return; - p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); + p_view = playlist_ViewFind( p_playlist, i_current_view ); - if (p_view) + if( p_view ) { /*First, only search after the selected item:* *(b_selected_item_met = NO) */ o_result = [self subSearchItem:p_view->p_root]; - if (o_result == NULL) + if( o_result == NULL ) { /* If the first search failed, search again from the beginning */ o_result = [self subSearchItem:p_view->p_root]; } - if (o_result != NULL) + if( o_result != NULL ) { - for (i = 0 ; i < [o_result count] - 1 ; i++) + for( i = 0 ; i < [o_result count] - 1 ; i++ ) { [o_outline_view expandItem: [o_outline_dict objectForKey: [NSString stringWithFormat: @"%p", @@ -756,14 +761,13 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ [[o_result objectAtIndex: [o_result count] - 1 ] pointerValue]]]]; } - if (i_row > -1) + if( i_row > -1 ) { [o_outline_view selectRow:i_row byExtendingSelection: NO]; [o_outline_view scrollRowToVisible: i_row]; } } - vlc_object_release(p_playlist); - + vlc_object_release( p_playlist ); } - (NSMenu *)menuForEvent:(NSEvent *)o_event @@ -792,28 +796,30 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ pointerValue]; } -- (void) outlineView:(NSTableView*)o_tv +- (void)outlineView: (NSTableView*)o_tv didClickTableColumn:(NSTableColumn *)o_tc { - intf_thread_t * p_intf = VLCIntf; - playlist_t *p_playlist = - (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, - FIND_ANYWHERE ); - playlist_view_t * p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); int i_mode = 0, i_type; + intf_thread_t *p_intf = VLCIntf; + playlist_view_t *p_view; + playlist_t *p_playlist = (playlist_t *)vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + FIND_ANYWHERE ); if( p_playlist == NULL ) { return; } - + /* Check whether the selected table column header corresponds to a sortable table column*/ - if ( !(o_tc == o_tc_name || o_tc == o_tc_author)) + if( !( o_tc == o_tc_name || o_tc == o_tc_author ) ) { + vlc_object_release( p_playlist ); return; } + p_view = playlist_ViewFind( p_playlist, i_current_view ); + if( o_tc_sortColumn == o_tc ) { b_isSortDescending = !b_isSortDescending; @@ -823,16 +829,16 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ b_isSortDescending = VLC_FALSE; } - if (o_tc == o_tc_name) + if( o_tc == o_tc_name ) { i_mode = SORT_TITLE; } - else if (o_tc == o_tc_author) + else if( o_tc == o_tc_author ) { i_mode = SORT_AUTHOR; } - if (b_isSortDescending) + if( b_isSortDescending ) { i_type = ORDER_REVERSE; } @@ -841,9 +847,9 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ i_type = ORDER_NORMAL; } - vlc_mutex_lock(&p_playlist->object_lock ); - playlist_RecursiveNodeSort(p_playlist, p_view->p_root, i_mode, i_type); - vlc_mutex_unlock(&p_playlist->object_lock ); + vlc_mutex_lock( &p_playlist->object_lock ); + playlist_RecursiveNodeSort( p_playlist, p_view->p_root, i_mode, i_type ); + vlc_mutex_unlock( &p_playlist->object_lock ); vlc_object_release( p_playlist ); [self playlistUpdated]; @@ -851,7 +857,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ o_tc_sortColumn = o_tc; [o_outline_view setHighlightedTableColumn:o_tc]; - if (b_isSortDescending) + if( b_isSortDescending ) { [o_outline_view setIndicatorImage:o_descendingSortingImage inTableColumn:o_tc]; @@ -873,14 +879,14 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ int i_return = 0; playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - if( p_playlist == NULL ) + if( p_playlist == NULL || outlineView != o_outline_view ) return 0; if( item == nil ) { /* root object */ playlist_view_t *p_view; - p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); + p_view = playlist_ViewFind( p_playlist, i_current_view ); if( p_view && p_view->p_root ) i_return = p_view->p_root->i_children; } @@ -891,8 +897,10 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ i_return = p_item->i_children; } vlc_object_release( p_playlist ); - if( i_return == -1 ) i_return = 0; - msg_Dbg( p_playlist, "I have %d children", i_return ); + + if( i_return <= 0 ) + i_return = 0; + return i_return; } @@ -902,7 +910,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ playlist_item_t *p_return = NULL; playlist_t * p_playlist = vlc_object_find( VLCIntf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - NSValue * o_value; + NSValue *o_value; if( p_playlist == NULL ) return nil; @@ -911,40 +919,45 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { /* root object */ playlist_view_t *p_view; - p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); - if( p_view && index < p_view->p_root->i_children ) + p_view = playlist_ViewFind( p_playlist, i_current_view ); + if( p_view && index < p_view->p_root->i_children && index >= 0 ) p_return = p_view->p_root->pp_children[index]; } else { playlist_item_t *p_item = (playlist_item_t *)[item pointerValue]; - if( p_item && index < p_item->i_children ) - { + if( p_item && index < p_item->i_children && index >= 0 ) p_return = p_item->pp_children[index]; - } } if( p_playlist->i_size >= 2 ) + { + [o_status_field setStringValue: [NSString stringWithFormat: + _NS("%i items in playlist"), p_playlist->i_size]]; + } + else + { + if( p_playlist->i_size == 0 ) { [o_status_field setStringValue: [NSString stringWithFormat: - _NS("%i items in playlist"), p_playlist->i_size]]; - } else { - if( p_playlist->i_size == 0 ) - { - [o_status_field setStringValue: [NSString stringWithFormat: - _NS("no items in playlist"), p_playlist->i_size]]; - } else { - [o_status_field setStringValue: [NSString stringWithFormat: - _NS("1 item in playlist"), p_playlist->i_size]]; - } + _NS("no items in playlist"), p_playlist->i_size]]; + } + else + { + [o_status_field setStringValue: [NSString stringWithFormat: + _NS("1 item in playlist"), p_playlist->i_size]]; + } } vlc_object_release( p_playlist ); - msg_Dbg( p_playlist, "childitem with index %d", index ); + - o_value = [NSValue valueWithPointer: p_return]; + o_value = [[NSValue valueWithPointer: p_return] retain]; - [o_outline_dict setObject:o_value forKey:[NSString stringWithFormat:@"%p", p_return]]; + if( [o_outline_dict objectForKey: [NSString stringWithFormat:@"%p", p_return]] == nil ) + { + [o_outline_dict setObject:o_value forKey:[NSString stringWithFormat:@"%p", p_return]]; + } return o_value; } @@ -961,7 +974,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ { /* root object */ playlist_view_t *p_view; - p_view = playlist_ViewFind( p_playlist, VIEW_SIMPLE ); + p_view = playlist_ViewFind( p_playlist, i_current_view ); if( p_view && p_view->p_root ) i_return = p_view->p_root->i_children; } @@ -973,7 +986,7 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ } vlc_object_release( p_playlist ); - if( i_return == -1 || i_return == 0 ) + if( i_return <= 0 ) return NO; else return YES; @@ -983,15 +996,26 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ - (id)outlineView:(NSOutlineView *)outlineView objectValueForTableColumn:(NSTableColumn *)o_tc byItem:(id)item { id o_value = nil; - intf_thread_t * p_intf = VLCIntf; - playlist_t * p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, + intf_thread_t *p_intf = VLCIntf; + playlist_t *p_playlist; + playlist_item_t *p_item; + + if( item == nil || ![item isKindOfClass: [NSValue class]] ) return( @"error" ); + + p_playlist = vlc_object_find( p_intf, VLC_OBJECT_PLAYLIST, FIND_ANYWHERE ); - playlist_item_t *p_item = (playlist_item_t *)[item pointerValue]; - - if( p_playlist == NULL || p_item == NULL ) + if( p_playlist == NULL ) { return( @"error" ); } + + p_item = (playlist_item_t *)[item pointerValue]; + + if( p_item == NULL ) + { + vlc_object_release( p_playlist ); + return( @"error"); + } if( [[o_tc identifier] isEqualToString:@"1"] ) { @@ -1032,7 +1056,6 @@ belongs to an Apple hidden private API, and then can "disapear" at any time*/ o_value = @"-:--:--"; } } - vlc_object_release( p_playlist ); return( o_value ); diff --git a/modules/gui/macosx/playlistinfo.m b/modules/gui/macosx/playlistinfo.m index 249abaaf05..f9ce5ada4e 100644 --- a/modules/gui/macosx/playlistinfo.m +++ b/modules/gui/macosx/playlistinfo.m @@ -97,7 +97,6 @@ char *psz_temp; vlc_mutex_lock( &p_item->input.lock ); - /*fill uri / title / author info */ if( p_item->input.psz_uri ) { @@ -115,7 +114,7 @@ [NSString stringWithUTF8String:p_item->input.psz_name]]; } vlc_mutex_unlock( &p_item->input.lock ); - + psz_temp = vlc_input_item_GetInfo( &p_item->input, _("Meta-information"), _("Artist") ); if( psz_temp ) diff --git a/modules/gui/macosx/vout.h b/modules/gui/macosx/vout.h index 418bf73ac0..de8588124a 100644 --- a/modules/gui/macosx/vout.h +++ b/modules/gui/macosx/vout.h @@ -39,9 +39,9 @@ - (id)initWithVout:(vout_thread_t *)_p_vout frame:(NSRect *)s_frame; - (void)close; -- (void)setOnTop:(bool)b_on_top; +- (void)setOnTop:(BOOL)b_on_top; -- (void)hideMouse:(bool)b_hide; +- (void)hideMouse:(BOOL)b_hide; - (void)manage; - (void)scaleWindowWithFactor: (float)factor; diff --git a/modules/gui/macosx/vout.m b/modules/gui/macosx/vout.m index e809402f1f..484f8cb63a 100644 --- a/modules/gui/macosx/vout.m +++ b/modules/gui/macosx/vout.m @@ -220,7 +220,7 @@ [super close]; } -- (void)setOnTop:(bool)b_on_top +- (void)setOnTop:(BOOL)b_on_top { if( b_on_top ) { @@ -232,7 +232,7 @@ } } -- (void)hideMouse:(bool)b_hide +- (void)hideMouse:(BOOL)b_hide { BOOL b_inside; NSPoint ml; -- 2.39.2