Quellcodebibliothek Statistik Leitseite products/Sources/formale Sprachen/C/VLC/modules/gui/macosx/playqueue/   (VLC Media Plyer ©)  Datei vom 23.9.2026 mit Größe 12 kB image not shown  

Quelle  VLCPlayQueueMenuController.m  Sprache: unbekannt

 
Spracherkennung für: .m vermutete Sprache: Masm {Masm[60] ABAP[52] Cobol[40]} [Methode: maximale Elemente, drei Dimensionen]

/*****************************************************************************
 * VLCPlayQueueMenuController.m: MacOS X interface module
 *****************************************************************************
 * Copyright (C) 2002-2019 VLC authors and VideoLAN
 *
 * Authors: Benjamin Pracht <bigben at videolan dot org>
 *          Felix Paul Kühne <fkuehne at videolan dot org>
 *          David Fuhrmann <dfuhrmann # videolan.org>
 *
 * 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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
 *****************************************************************************/

#import "VLCPlayQueueMenuController.h"

#import "extensions/NSString+Helpers.h"
#import "extensions/NSMenu+VLCAdditions.h"
#import "extensions/NSMenuItem+VLCAdditions.h"
#import "library/VLCLibraryAddToPlaylistMenuController.h"
#import "library/VLCLibraryController.h"
#import "library/VLCLibraryDataTypes.h"
#import "library/VLCInputItem.h"
#import "main/VLCMain.h"
#import "playqueue/VLCPlayQueueController.h"
#import "playqueue/VLCPlayQueueModel.h"
#import "playqueue/VLCPlayQueueItem.h"
#import "playqueue/VLCPlayQueueSortingMenuController.h"
#import "windows/VLCOpenWindowController.h"
#import "panels/VLCInformationWindowController.h"

@interface VLCPlayQueueMenuController ()
{
    VLCPlayQueueController *_playQueueController;
    VLCPlayQueueSortingMenuController *_playQueueSortingMenuController;
    VLCLibraryAddToPlaylistMenuController *_addToPlaylistMenuController;
    VLCInformationWindowController *_informationWindowController;

    NSMenuItem *_playMenuItem;
    NSMenuItem *_removeMenuItem;
    NSMenuItem *_informationMenuItem;
    NSMenuItem *_revealInFinderMenuItem;
    NSMenuItem *_addToPlaylistMenuItem;
    NSMenuItem *_addFilesToPlayQueueMenuItem;
    NSMenuItem *_clearPlayQueueMenuItem;
    NSMenuItem *_sortMenuItem;
    NSMenuItem *_createPlaylistMenuItem;
}

@property (readwrite, atomic) NSArray<NSMenuItem *> *items;
@property (readwrite, atomic) NSArray<NSMenuItem *> *multipleSelectionItems;
@property (readwrite, atomic) NSArray<NSMenuItem *> *backgroundItems;

@end

@implementation VLCPlayQueueMenuController

- (instancetype)init
{
    self = [super init];
    if (self) {
        [self createMenu];
        _playQueueController = VLCMain.sharedInstance.playQueueController;
    }
    return self;
}

- (void)createMenu
{
    _playMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Play") action:@selector(play:) keyEquivalent:@""];
    _playMenuItem.target = self;

    _removeMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Remove from Play Queue") action:@selector(remove:) keyEquivalent:@""];
    _removeMenuItem.target = self;

    _revealInFinderMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Reveal in Finder") action:@selector(revealInFinder:) keyEquivalent:@""];
    _revealInFinderMenuItem.target = self;

    _informationMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Information...") action:@selector(showInformationPanel:) keyEquivalent:@""];
    _informationMenuItem.target = self;

    _addToPlaylistMenuController = [[VLCLibraryAddToPlaylistMenuController alloc] init];
    _addToPlaylistMenuItem = [_addToPlaylistMenuController createAddToPlaylistMenuItem];

    _addFilesToPlayQueueMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Add File...") action:@selector(addFilesToPlayQueue:) keyEquivalent:@""];
    _addFilesToPlayQueueMenuItem.target = self;

    _clearPlayQueueMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Clear Play Queue") action:@selector(clearPlayQueue:) keyEquivalent:@""];
    _clearPlayQueueMenuItem.target = self;

    _createPlaylistMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Create Playlist from Queue") action:@selector(createPlaylistFromQueue:) keyEquivalent:@""];
    _createPlaylistMenuItem.target = self;

    _playQueueSortingMenuController = [[VLCPlayQueueSortingMenuController alloc] init];
    _sortMenuItem = [[NSMenuItem alloc] initWithTitle:_NS("Sort Play Queue") action:nil keyEquivalent:@""];
    [_sortMenuItem setSubmenu:_playQueueSortingMenuController.playQueueSortingMenu];

    [_playMenuItem vlc_setActionImageWithSystemSymbolName:@"play.fill"];
    [_removeMenuItem vlc_setActionImageWithSystemSymbolName:@"minus.circle"];
    [_revealInFinderMenuItem vlc_setActionImageWithSystemSymbolName:@"folder"];
    [_informationMenuItem vlc_setActionImageWithSystemSymbolName:@"info.circle"];
    [_addFilesToPlayQueueMenuItem vlc_setActionImageWithSystemSymbolName:@"plus.circle"];
    [_clearPlayQueueMenuItem vlc_setActionImageWithSystemSymbolName:@"xmark.circle"];
    [_createPlaylistMenuItem vlc_setActionImageWithSystemSymbolName:@"music.note.list"];
    [_sortMenuItem vlc_setActionImageWithSystemSymbolName:@"arrow.up.arrow.down"];

    self.items = @[
        _playMenuItem,
        _removeMenuItem,
        _revealInFinderMenuItem,
        _informationMenuItem,
        _addToPlaylistMenuItem,
        NSMenuItem.separatorItem,
        _addFilesToPlayQueueMenuItem,
        _clearPlayQueueMenuItem,
        _sortMenuItem
    ];

    self.multipleSelectionItems = @[
        _removeMenuItem,
        _addToPlaylistMenuItem,
        NSMenuItem.separatorItem,
        _addFilesToPlayQueueMenuItem,
        _clearPlayQueueMenuItem,
        _sortMenuItem
    ];

    self.backgroundItems = @[
        _addFilesToPlayQueueMenuItem,
        _clearPlayQueueMenuItem,
        _createPlaylistMenuItem,
        _sortMenuItem
    ];

    _playQueueMenu = [[NSMenu alloc] init];
    _playQueueMenu.itemArray = self.items;
}

- (void)setPlayQueueTableView:(NSTableView *)playQueueTableView
{
    NSNotificationCenter * const notificationCenter = NSNotificationCenter.defaultCenter;
    if (self.playQueueTableView != nil) {
        [notificationCenter removeObserver:self
                                      name:NSTableViewSelectionDidChangeNotification
                                    object:self.playQueueTableView];
    }

    _playQueueTableView = playQueueTableView;
    [notificationCenter addObserver:self
                           selector:@selector(tableViewSelectionDidChange:)
                               name:NSTableViewSelectionDidChangeNotification
                             object:self.playQueueTableView];

}

- (NSArray<VLCMediaLibraryMediaItem *> *)selectedMediaLibraryItems
{
    NSIndexSet * const selectedIndexes = self.playQueueTableView.selectedRowIndexes;
    NSMutableArray<VLCMediaLibraryMediaItem *> * const mediaItems =
        [NSMutableArray arrayWithCapacity:selectedIndexes.count];

    [selectedIndexes enumerateIndexesUsingBlock:^(const NSUInteger idx, BOOL * const __unused stop) {
        VLCPlayQueueItem * const item =
            [self->_playQueueController.playQueueModel playQueueItemAtIndex:idx];
        VLCMediaLibraryMediaItem * const mediaLibraryItem = item.mediaLibraryItem;
        if (mediaLibraryItem != nil) {
            [mediaItems addObject:mediaLibraryItem];
        }
    }];

    return mediaItems.copy;
}

- (void)updateAddToPlaylistMenuItem
{
    NSArray<VLCMediaLibraryMediaItem *> * const mediaItems = [self selectedMediaLibraryItems];
    _addToPlaylistMenuController.representedMediaItems = mediaItems;
    _addToPlaylistMenuItem.enabled = mediaItems.count > 0;
}

- (void)updateStreamSpecificMenuItems
{
    NSIndexSet * const selectedIndexes = self.playQueueTableView.selectedRowIndexes;
    __block BOOL hasStream = NO;

    [selectedIndexes enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL *stop) {
        VLCPlayQueueItem * const item =
            [self->_playQueueController.playQueueModel playQueueItemAtIndex:idx];
        if (item.inputItem.isStream) {
            hasStream = YES;
            *stop = YES;
        }
    }];

    _informationMenuItem.hidden = hasStream;
    _revealInFinderMenuItem.hidden = hasStream;
}

- (void)prepareForContextMenuTarget:(VLCPlayQueueContextMenuTarget)target
{
    if (target == VLCPlayQueueContextMenuTargetRow) {
        [self updateAddToPlaylistMenuItem];
        [self updateStreamSpecificMenuItems];
        const BOOL multipleSelection = self.playQueueTableView.selectedRowIndexes.count > 1;
        self.playQueueMenu.itemArray = multipleSelection ? self.multipleSelectionItems : self.items;
    } else {
        _addToPlaylistMenuController.representedMediaItems = nil;
        _informationMenuItem.hidden = NO;
        _revealInFinderMenuItem.hidden = NO;
        self.playQueueMenu.itemArray = self.backgroundItems;
    }
}

- (void)play:(id)sender
{
    NSInteger selectedRow = self.playQueueTableView.selectedRow;

    if (selectedRow != -1) {
        [_playQueueController playItemAtIndex:selectedRow];
    } else {
        [_playQueueController startPlayQueue];
    }
}

- (void)remove:(id)sender
{
    [_playQueueController removeItemsAtIndexes:self.playQueueTableView.selectedRowIndexes];
}

- (void)showInformationPanel:(id)sender
{
    if (!_informationWindowController) {
        _informationWindowController = [[VLCInformationWindowController alloc] init];
    }

    NSMutableArray * const inputItems = NSMutableArray.array;
    NSIndexSet * const selectedIndices = self.playQueueTableView.selectedRowIndexes;

    [selectedIndices enumerateIndexesUsingBlock:^(const NSUInteger idx, BOOL * const __unused stop) {
        VLCPlayQueueItem * const item =
            [self->_playQueueController.playQueueModel playQueueItemAtIndex:idx];
        if (item == nil) {
            return;
        }
        [inputItems addObject:item.inputItem];
    }];

    _informationWindowController.representedInputItems = inputItems.copy;
    [_informationWindowController toggleWindow:sender];
}

- (void)revealInFinder:(id)sender
{
    NSInteger selectedRow = self.playQueueTableView.selectedRow;

    if (selectedRow == -1)
        return;

    VLCPlayQueueItem *item = [_playQueueController.playQueueModel playQueueItemAtIndex:selectedRow];
    if (item == nil)
        return;

    NSString *path = item.path;
    [NSWorkspace.sharedWorkspace selectFile:path inFileViewerRootedAtPath:path];
}

- (void)addFilesToPlayQueue:(id)sender
{
    NSInteger selectedRow = self.playQueueTableView.selectedRow;

    [[VLCMain.sharedInstance open] openFileWithAction:^(NSArray *files) {
        [self->_playQueueController addPlayQueueItems:files
                                           atPosition:selectedRow
                                        startPlayback:NO];
    }];
}

- (void)clearPlayQueue:(id)sender
{
    [_playQueueController clearPlayQueue];
}

- (void)createPlaylistFromQueue:(id)sender
{
    [VLCMain.sharedInstance.libraryController showCreatePlaylistDialogForPlayQueueItems:_playQueueController.playQueueModel.playQueueItems];
}

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
    if (menuItem == _addFilesToPlayQueueMenuItem) {
        return YES;

    } else if (menuItem == _clearPlayQueueMenuItem) {
        return (self.playQueueTableView.numberOfRows > 0);

    } else if (menuItem == _createPlaylistMenuItem) {
        return (self.playQueueTableView.numberOfRows > 0);

    } else if (menuItem == _addToPlaylistMenuItem) {
        return _addToPlaylistMenuController.representedMediaItems.count > 0;

    } else if (menuItem == _removeMenuItem ||
               menuItem == _playMenuItem ||
               menuItem == _informationMenuItem) {
        return (self.playQueueTableView.numberOfSelectedRows > 0);

    } else if (menuItem == _revealInFinderMenuItem) {
        return (self.playQueueTableView.numberOfSelectedRows == 1);
    }

    return NO;
}

- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
    NSTableView * const tableView = notification.object;
    if (tableView != self.playQueueTableView) {
        return;
    }

    const BOOL multipleSelection = tableView.selectedRowIndexes.count > 1;
    if (multipleSelection) {
        self.playQueueMenu.itemArray = self.multipleSelectionItems;
    } else {
        self.playQueueMenu.itemArray = self.items;
    }
    [self updateAddToPlaylistMenuItem];
    [self updateStreamSpecificMenuItems];
}

@end

[Dauer der Verarbeitung: 0.4 Sekunden, vorverarbeitet 2026-10-24]