[[NSNotificationCenter defaultCenter] removeObserver: self];
[o_sidebaritems release];
+ [o_fspanel release];
[super dealloc];
}
SideBarItem *internetItem = [SideBarItem itemWithTitle:_NS("INTERNET") identifier:@"internet"];
/* SD subnodes, inspired by the Qt4 intf */
- char **ppsz_longnames;
- int *p_categories;
+ char **ppsz_longnames = NULL;
+ int *p_categories = NULL;
char **ppsz_names = vlc_sd_GetNames(pl_Get(VLCIntf), &ppsz_longnames, &p_categories);
if (!ppsz_names)
msg_Err(VLCIntf, "no sd item found"); //TODO
NSMutableArray *lanItems = [[NSMutableArray alloc] init];
NSMutableArray *mycompItems = [[NSMutableArray alloc] init];
NSString *o_identifier;
- for (; *ppsz_name; ppsz_name++, ppsz_longname++, p_category++) {
+ for (; ppsz_name && *ppsz_name; ppsz_name++, ppsz_longname++, p_category++) {
o_identifier = [NSString stringWithCString: *ppsz_name encoding: NSUTF8StringEncoding];
switch (*p_category) {
case SD_CAT_INTERNET:
else
[[internetItems lastObject] setIcon: [NSImage imageNamed:@"NSApplicationIcon"]];
[[internetItems lastObject] setSdtype: SD_CAT_INTERNET];
- [[internetItems lastObject] setUntranslatedTitle: @(*ppsz_longname)];
+ [[internetItems lastObject] setUntranslatedTitle: [NSString stringWithUTF8String:*ppsz_longname]];
break;
case SD_CAT_DEVICES:
[devicesItems addObject: [SideBarItem itemWithTitle: _NS(*ppsz_longname) identifier: o_identifier]];
[[devicesItems lastObject] setIcon: [NSImage imageNamed:@"NSApplicationIcon"]];
[[devicesItems lastObject] setSdtype: SD_CAT_DEVICES];
- [[devicesItems lastObject] setUntranslatedTitle: @(*ppsz_longname)];
+ [[devicesItems lastObject] setUntranslatedTitle: [NSString stringWithUTF8String:*ppsz_longname]];
break;
case SD_CAT_LAN:
[lanItems addObject: [SideBarItem itemWithTitle: _NS(*ppsz_longname) identifier: o_identifier]];
[[lanItems lastObject] setIcon: [NSImage imageNamed:@"sidebar-local"]];
[[lanItems lastObject] setSdtype: SD_CAT_LAN];
- [[lanItems lastObject] setUntranslatedTitle: @(*ppsz_longname)];
+ [[lanItems lastObject] setUntranslatedTitle: [NSString stringWithUTF8String:*ppsz_longname]];
break;
case SD_CAT_MYCOMPUTER:
[mycompItems addObject: [SideBarItem itemWithTitle: _NS(*ppsz_longname) identifier: o_identifier]];
[[mycompItems lastObject] setIcon: [NSImage imageNamed:@"sidebar-pictures"]];
else
[[mycompItems lastObject] setIcon: [NSImage imageNamed:@"NSApplicationIcon"]];
- [[mycompItems lastObject] setUntranslatedTitle: @(*ppsz_longname)];
+ [[mycompItems lastObject] setUntranslatedTitle: [NSString stringWithUTF8String:*ppsz_longname]];
[[mycompItems lastObject] setSdtype: SD_CAT_MYCOMPUTER];
break;
default:
free(ppsz_longnames);
free(p_categories);
- [libraryItem setChildren: @[playlistItem, medialibraryItem]];
+ [libraryItem setChildren: [NSArray arrayWithObjects:playlistItem, medialibraryItem, nil]];
[o_sidebaritems addObject: libraryItem];
if ([mycompItem hasChildren])
[o_sidebaritems addObject: mycompItem];
[o_sidebaritems addObject: internetItem];
[o_sidebar_view reloadData];
- [o_sidebar_view selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
[o_sidebar_view setDropItem:playlistItem dropChildIndex:NSOutlineViewDropOnItemIndex];
- [o_sidebar_view registerForDraggedTypes:@[NSFilenamesPboardType, @"VLCPlaylistItemPboardType"]];
+ [o_sidebar_view registerForDraggedTypes:[NSArray arrayWithObjects:NSFilenamesPboardType, @"VLCPlaylistItemPboardType", nil]];
[o_sidebar_view setAutosaveName:@"mainwindow-sidebar"];
[(PXSourceList *)o_sidebar_view setDataSource:self];
[o_sidebar_view expandItem: libraryItem expandChildren: YES];
+ o_fspanel = [[VLCFSPanel alloc] initWithContentRect:NSMakeRect(110.,267.,549.,87.)
+ styleMask:NSTexturedBackgroundWindowMask
+ backing:NSBackingStoreBuffered
+ defer:YES];
+
/* make sure we display the desired default appearance when VLC launches for the first time */
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (![defaults objectForKey:@"VLCFirstRun"]) {
NSUInteger i_sidebaritem_count = [o_sidebaritems count];
for (NSUInteger x = 0; x < i_sidebaritem_count; x++)
- [o_sidebar_view expandItem: [o_sidebaritems objectAtIndex: x] expandChildren: YES];
+ [o_sidebar_view expandItem: [o_sidebaritems objectAtIndex:x] expandChildren: YES];
[o_fspanel center];
}
+ // select playlist item by default
+ [o_sidebar_view selectRowIndexes:[NSIndexSet indexSetWithIndex:1] byExtendingSelection:NO];
+
if (b_dark_interface) {
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(windowResizedOrMoved:) name: NSWindowDidResizeNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(windowResizedOrMoved:) name: NSWindowDidMoveNotification object: nil];
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(mainSplitViewDidResizeSubviews:) name: NSSplitViewDidResizeSubviewsNotification object:o_split_view];
if (b_splitviewShouldBeHidden) {
- [self hideSplitView];
+ [self hideSplitView: YES];
i_lastSplitViewHeight = 300;
}
- (void)resizePlaylistAfterCollapse
{
+ // no animation here since we might be in the middle of another resize animation
NSRect plrect;
plrect = [o_playlist_table frame];
- plrect.size.height = i_lastSplitViewHeight - 20.0; // actual pl top bar height, which differs from its frame
- [[o_playlist_table animator] setFrame: plrect];
+ plrect.size.height = [o_split_view frame].size.height - 20.0; // actual pl top bar height, which differs from its frame
+ [o_playlist_table setFrame: plrect];
+ [o_playlist_table setNeedsDisplay: YES];
NSRect rightSplitRect;
rightSplitRect = [o_right_split_view frame];
plrect = [o_dropzone_box frame];
plrect.origin.x = (rightSplitRect.size.width - plrect.size.width) / 2;
plrect.origin.y = (rightSplitRect.size.height - plrect.size.height) / 2;
- [[o_dropzone_box animator] setFrame: plrect];
+ [o_dropzone_view setFrame: [o_playlist_table frame]];
+ [o_dropzone_box setFrame: plrect];
+ [o_dropzone_view setNeedsDisplay: YES];
}
- (void)makeSplitViewVisible
[self makeFirstResponder: [[o_video_view subviews] objectAtIndex:0]];
}
-// only exception for an controls bar button action
-- (IBAction)togglePlaylist:(id)sender
+
+- (void)changePlaylistState:(VLCPlaylistStateEvent)event
{
- if (![self isVisible] && sender != nil) {
- [self makeKeyAndOrderFront: sender];
+ // Beware, this code is really ugly
+
+ msg_Dbg(VLCIntf, "toggle playlist from state: removed splitview %i, minimized view %i. Event %i", b_splitview_removed, b_minimized_view, event);
+ if (![self isVisible] && event == psUserMenuEvent) {
+ [self makeKeyAndOrderFront: nil];
return;
}
BOOL b_activeVideo = [[VLCMain sharedInstance] activeVideoPlayback];
BOOL b_restored = NO;
+ // ignore alt if triggered through main menu shortcut
BOOL b_have_alt_key = ([[NSApp currentEvent] modifierFlags] & NSAlternateKeyMask) != 0;
- if (sender && [sender isKindOfClass: [NSMenuItem class]])
+ if (event == psUserMenuEvent)
b_have_alt_key = NO;
+ // eUserMenuEvent is now handled same as eUserEvent
+ if(event == psUserMenuEvent)
+ event = psUserEvent;
+
if (b_dropzone_active && b_have_alt_key) {
[self hideDropZone];
return;
}
if (!(b_nativeFullscreenMode && b_fullscreen) && !b_splitview_removed && ((b_have_alt_key && b_activeVideo)
- || (b_nonembedded && sender != nil)
- || (!b_activeVideo && sender != nil)
- || b_minimized_view))
- [self hideSplitView];
- else {
+ || (b_nonembedded && event == psUserEvent)
+ || (!b_activeVideo && event == psUserEvent)
+ || (b_minimized_view && event == psVideoStartedOrStoppedEvent))) {
+ // for starting playback, window is resized through resized events
+ // for stopping playback, resize through reset to previous frame
+ [self hideSplitView: event != psVideoStartedOrStoppedEvent];
+ b_minimized_view = NO;
+ } else {
if (b_splitview_removed) {
- if (!b_nonembedded || (sender != nil && b_nonembedded))
- [self showSplitView];
+ if (!b_nonembedded || (event == psUserEvent && b_nonembedded))
+ [self showSplitView: event != psVideoStartedOrStoppedEvent];
- if (sender == nil)
+ if (event != psUserEvent)
b_minimized_view = YES;
else
b_minimized_view = NO;
}
if (!b_nonembedded) {
- if (([o_video_view isHidden] && b_activeVideo) || b_restored || (b_activeVideo && sender == nil))
+ if (([o_video_view isHidden] && b_activeVideo) || b_restored || (b_activeVideo && event != psUserEvent))
[self makeSplitViewHidden];
else
[self makeSplitViewVisible];
[o_video_view setHidden: YES];
}
}
+
+ msg_Dbg(VLCIntf, "toggle playlist to state: removed splitview %i, minimized view %i", b_splitview_removed, b_minimized_view);
}
- (IBAction)dropzoneButtonAction:(id)sender
[[o_playlist_table animator] setHidden: NO];
}
-- (void)hideSplitView
+- (void)hideSplitView:(BOOL)b_with_resize
{
- NSRect winrect = [self frame];
- i_lastSplitViewHeight = [o_split_view frame].size.height;
- winrect.size.height = winrect.size.height - i_lastSplitViewHeight;
- winrect.origin.y = winrect.origin.y + i_lastSplitViewHeight;
- [self setFrame: winrect display: YES animate: YES];
+ if (b_with_resize) {
+ NSRect winrect = [self frame];
+ i_lastSplitViewHeight = [o_split_view frame].size.height;
+ winrect.size.height = winrect.size.height - i_lastSplitViewHeight;
+ winrect.origin.y = winrect.origin.y + i_lastSplitViewHeight;
+ [self setFrame: winrect display: YES animate: YES];
+ }
+
[self performSelector:@selector(hideDropZone) withObject:nil afterDelay:0.1];
if (b_dark_interface) {
[self setContentMinSize: NSMakeSize(604., [o_controls_bar height] + [o_titlebar_view frame].size.height)];
b_splitview_removed = YES;
}
-- (void)showSplitView
+- (void)showSplitView:(BOOL)b_with_resize
{
[self updateWindow];
if (b_dark_interface)
[self setContentMinSize:NSMakeSize(604., 288.)];
[self setContentMaxSize: NSMakeSize(FLT_MAX, FLT_MAX)];
- NSRect winrect;
- winrect = [self frame];
- winrect.size.height = winrect.size.height + i_lastSplitViewHeight;
- winrect.origin.y = winrect.origin.y - i_lastSplitViewHeight;
- [self setFrame: winrect display: YES animate: YES];
+ if (b_with_resize) {
+ NSRect winrect;
+ winrect = [self frame];
+ winrect.size.height = winrect.size.height + i_lastSplitViewHeight;
+ winrect.origin.y = winrect.origin.y - i_lastSplitViewHeight;
+ [self setFrame: winrect display: YES animate: YES];
+ }
[self performSelector:@selector(resizePlaylistAfterCollapse) withObject: nil afterDelay:0.75];
if (!config_GetPsz(VLCIntf, "video-title")) {
char *format = var_InheritString(VLCIntf, "input-title-format");
- char *formated = str_format_meta(pl_Get(VLCIntf), format);
+ char *formated = str_format_meta(p_input, format);
free(format);
- aString = @(formated);
+ aString = [NSString stringWithUTF8String:formated];
free(formated);
} else
- aString = @(config_GetPsz(VLCIntf, "video-title"));
+ aString = [NSString stringWithUTF8String:config_GetPsz(VLCIntf, "video-title")];
char *uri = input_item_GetURI(input_GetItem(p_input));
- NSURL * o_url = [NSURL URLWithString: @(uri)];
+ NSURL * o_url = [NSURL URLWithString:[NSString stringWithUTF8String:uri]];
if ([o_url isFileURL]) {
[self setRepresentedURL: o_url];
[[[VLCMain sharedInstance] voutController] updateWindowsUsingBlock:^(VLCVideoWindowCommon *o_window) {
[o_fspanel setPlay];
[[[VLCMain sharedInstance] voutController] updateWindowsControlsBarWithSelector:@selector(setPlay)];
-
}
- (void)updateVolumeSlider
#pragma mark -
#pragma mark Video Output handling
+- (void)videoplayWillBeStarted
+{
+ if (!b_fullscreen)
+ frameBeforePlayback = [self frame];
+}
+
- (void)setVideoplayEnabled
{
BOOL b_videoPlayback = [[VLCMain sharedInstance] activeVideoPlayback];
+
+ if (!b_videoPlayback) {
+ if (!b_nonembedded && (!b_nativeFullscreenMode || (b_nativeFullscreenMode && !b_fullscreen)) && frameBeforePlayback.size.width > 0 && frameBeforePlayback.size.height > 0) {
+
+ // only resize back to minimum view of this is still desired final state
+ float f_threshold_height = f_min_video_height + [o_controls_bar height];
+ if(frameBeforePlayback.size.height > f_threshold_height || b_minimized_view)
+ [[self animator] setFrame:frameBeforePlayback display:YES];
+ }
- if (b_videoPlayback) {
- if (!b_fullscreen)
- frameBeforePlayback = [self frame];
- } else {
- if (!b_nonembedded && !b_fullscreen && frameBeforePlayback.size.width > 0 && frameBeforePlayback.size.height > 0)
- [[self animator] setFrame:frameBeforePlayback display:YES];
+ frameBeforePlayback = NSMakeRect(0, 0, 0, 0);
// update fs button to reflect state for next startup
- if (var_InheritBool(pl_Get(VLCIntf), "fullscreen")) {
+ if (var_InheritBool(VLCIntf, "fullscreen") || var_GetBool(pl_Get(VLCIntf), "fullscreen")) {
[o_controls_bar setFullscreenState:YES];
}
[o_fspanel setNonActive: nil];
}
}
+
+ [self changePlaylistState: psVideoStartedOrStoppedEvent];
}
#pragma mark -
- (void)showFullscreenController
{
-
id currentWindow = [NSApp keyWindow];
if ([currentWindow respondsToSelector:@selector(hasActiveVideo)] && [currentWindow hasActiveVideo]) {
if ([currentWindow respondsToSelector:@selector(fullscreen)] && [currentWindow fullscreen] && ![[currentWindow videoView] isHidden]) {
if ([[VLCMain sharedInstance] activeVideoPlayback])
[o_fspanel fadeIn];
}
-
- }
-
-
-}
-
-- (void)makeKeyAndOrderFront: (id)sender
-{
- /* Hack
- * when we exit fullscreen and fade out, we may endup in
- * having a window that is faded. We can't have it fade in unless we
- * animate again. */
-
- if (!b_window_is_invisible) {
- /* Make sure we don't do it too much */
- [super makeKeyAndOrderFront: sender];
- return;
}
- [super setAlphaValue:0.0f];
- [super makeKeyAndOrderFront: sender];
-
- NSMutableDictionary * dict = [[NSMutableDictionary alloc] initWithCapacity:2];
- [dict setObject:self forKey:NSViewAnimationTargetKey];
- [dict setObject:NSViewAnimationFadeInEffect forKey:NSViewAnimationEffectKey];
-
- o_makekey_anim = [[NSViewAnimation alloc] initWithViewAnimations:@[dict]];
- [dict release];
-
- [o_makekey_anim setAnimationBlockingMode: NSAnimationNonblocking];
- [o_makekey_anim setDuration: 0.1];
- [o_makekey_anim setFrameRate: 30];
- [o_makekey_anim setDelegate: self];
-
- [o_makekey_anim startAnimation];
- b_window_is_invisible = NO;
-
- /* fullscreenAnimation will be unlocked when animation ends */
}
#pragma mark -
- (NSInteger)sourceList:(PXSourceList*)aSourceList badgeValueForItem:(id)item
{
playlist_t * p_playlist = pl_Get(VLCIntf);
- NSInteger i_playlist_size;
+ NSInteger i_playlist_size = 0;
if ([[item identifier] isEqualToString: @"playlist"]) {
PL_LOCK;
}
if ([[item identifier] isEqualToString: @"medialibrary"]) {
PL_LOCK;
- i_playlist_size = p_playlist->p_ml_category->i_children;
+ if (p_playlist->p_ml_category)
+ i_playlist_size = p_playlist->p_ml_category->i_children;
PL_UNLOCK;
return i_playlist_size;
if ([[item identifier] isEqualToString:@"playlist"]) {
[[[VLCMain sharedInstance] playlist] setPlaylistRoot:p_playlist->p_local_category];
} else if ([[item identifier] isEqualToString:@"medialibrary"]) {
- [[[VLCMain sharedInstance] playlist] setPlaylistRoot:p_playlist->p_ml_category];
+ if (p_playlist->p_ml_category)
+ [[[VLCMain sharedInstance] playlist] setPlaylistRoot:p_playlist->p_ml_category];
} else {
playlist_item_t * pl_item;
PL_LOCK;
return nil;
for (NSUInteger x = 0; x < count; x++) {
- id item = [array objectAtIndex: x]; // save one objc selector call
+ id item = [array objectAtIndex:x]; // save one objc selector call
if ([[item identifier] isEqualToString:object])
return item;
}
{
if (config_GetPsz(VLCIntf, "podcast-urls") != NULL) {
[o_podcast_unsubscribe_pop removeAllItems];
- [o_podcast_unsubscribe_pop addItemsWithTitles:[@(config_GetPsz(VLCIntf, "podcast-urls")) componentsSeparatedByString:@"|"]];
+ [o_podcast_unsubscribe_pop addItemsWithTitles:[[NSString stringWithUTF8String:config_GetPsz(VLCIntf, "podcast-urls")] componentsSeparatedByString:@"|"]];
[NSApp beginSheet:o_podcast_unsubscribe_window modalForWindow:self modalDelegate:self didEndSelector:NULL contextInfo:nil];
}
}
[NSApp endSheet: o_podcast_unsubscribe_window];
if (sender == o_podcast_unsubscribe_ok_btn) {
- NSMutableArray * urls = [[NSMutableArray alloc] initWithArray:[@(config_GetPsz(VLCIntf, "podcast-urls")) componentsSeparatedByString:@"|"]];
+ NSMutableArray * urls = [[NSMutableArray alloc] initWithArray:[[NSString stringWithUTF8String:config_GetPsz(VLCIntf, "podcast-urls")] componentsSeparatedByString:@"|"]];
[urls removeObjectAtIndex: [o_podcast_unsubscribe_pop indexOfSelectedItem]];
config_PutPsz(VLCIntf, "podcast-urls", [[urls componentsJoinedByString:@"|"] UTF8String]);
var_SetString(pl_Get(VLCIntf), "podcast-urls", config_GetPsz(VLCIntf, "podcast-urls"));
if (playlist_IsServicesDiscoveryLoaded(p_playlist, "podcast{longname=\"Podcasts\"}")) {
playlist_ServicesDiscoveryRemove(p_playlist, "podcast{longname=\"Podcasts\"}");
playlist_ServicesDiscoveryAdd(p_playlist, "podcast{longname=\"Podcasts\"}");
- [o_playlist_table reloadData];
+ [[[VLCMain sharedInstance] playlist] playlistUpdated];
}
-
}
}