Eine aufbereitete Darstellung der Quelle

 
     
 
 
Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 

Benutzer

Quelle  VLCTimeSelectionPanelController.m  Sprache: unbekannt

 
Spracherkennung für: .m vermutete Sprache: Masm {Masm[58] Cobol[56] ABAP[30]} [Methode: maximale Elemente, drei Dimensionen]

/*****************************************************************************
 * TimeSelectionPanelController.m: Controller for time selection panel
 *****************************************************************************
 * Copyright (C) 2015-2018 VideoLAN and authors
 * Author:       David Fuhrmann <david dot fuhrmann at googlemail dot com>
 *
 * 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 "VLCTimeSelectionPanelController.h"

#import "extensions/NSString+Helpers.h"

@interface VLCTimeSelectionPanelController ()
{
    TimeSelectionCompletionHandler _completionHandler;
    id _keyMonitor;
}
@end

@implementation VLCTimeSelectionPanelController

#pragma mark - object handling

- (id)init
{
    self = [super initWithWindowNibName:@"TimeSelectionPanel"];
    return self;
}

#pragma mark - UI handling

- (void)windowDidLoad
{
    [_cancelButton setTitle:_NS("Cancel")];
    [_okButton setTitle:_NS("OK")];
    [_secsLabel setStringValue:_NS("sec")];
    [_minsLabel setStringValue:_NS("min")];
    [_hoursLabel setStringValue:_NS("hr")];
    [_goToLabel setStringValue:_NS("Jump to Time")];
}

- (void)controlTextDidChange:(NSNotification *)notification
{
    NSTextField *sender = notification.object;
    NSString *stringValue = sender.stringValue;

    if ([stringValue containsString:@":"]) {
        [self applyColonSeparatedDimensions:stringValue startingAtField:sender];
        [self setJumpTotalSecs:[self jumpTotalSecs]];
        return;
    }

    [self setJumpTotalSecs:[self jumpTotalSecs]];
}

- (void)setJumpTotalSecs:(NSInteger)secsPos
{
    if (self.maxTime != VLC_TICK_INVALID) {
        secsPos = MAX(MIN(secsPos, self.maxTime), 0);
    }

    NSInteger minsPos = secsPos / 60;
    secsPos = secsPos % 60;
    const NSInteger hoursPos = minsPos / 60;
    minsPos = minsPos % 60;

    [self setJumpSecsValue:secsPos];
    [self setJumpMinsValue:minsPos];
    [self setJumpHoursValue:hoursPos];
}

- (NSInteger)jumpTotalSecs
{
    NSInteger timeInSec = self.jumpSecsValue;
    timeInSec += self.jumpMinsValue * 60;
    timeInSec += self.jumpHoursValue * 3600;
    return timeInSec;
}

- (IBAction)buttonPressed:(id)sender
{
    [self.window orderOut:sender];
    [NSApp endSheet:self.window];
    int64_t timeInSec = [self jumpTotalSecs];

    if (_completionHandler)
        _completionHandler(sender == _okButton ? NSModalResponseOK : NSModalResponseCancel,
                           timeInSec);
}

- (void)runModalForWindow:(NSWindow *)window
        completionHandler:(TimeSelectionCompletionHandler)handler
{
    __weak typeof(self) weakSelf = self;

    _keyMonitor = [NSEvent addLocalMonitorForEventsMatchingMask:NSEventMaskKeyDown
                                                        handler:^NSEvent *(NSEvent *event) {
                                                            return [weakSelf handleKeyEvent:event];
                                                        }];

    _completionHandler = handler;

    [window beginSheet:self.window
        completionHandler:^(NSModalResponse __unused returnCode) {
            if (self->_keyMonitor) {
                [NSEvent removeMonitor:self->_keyMonitor];
            }
        }];
}

- (NSEvent *)handleKeyEvent:(NSEvent *)event
{
    NSString *const chars = event.characters;
    if (chars.length == 0) {
        return event;
    }

    if ([chars isEqualToString:@":"]) {
        if ([self moveToNextField]) {
            return nil;
        }
        return event;
    }

    unichar key = [chars characterAtIndex:0];

    if (key != NSUpArrowFunctionKey && key != NSDownArrowFunctionKey) {
        return event;
    }

    id responder = self.window.firstResponder;

    if (![responder isKindOfClass:[NSTextView class]]) {
        return event;
    }

    const NSInteger timeDifference = [self getTimeDifference:[responder delegate]];

    if (!timeDifference) {
        return event;
    }

    if (key == NSUpArrowFunctionKey) {
        [self setJumpTotalSecs:[self jumpTotalSecs] + timeDifference];
    } else if (key == NSDownArrowFunctionKey) {
        [self setJumpTotalSecs:[self jumpTotalSecs] - timeDifference];
    }
    return nil;
}

- (NSInteger)getTimeDifference:(NSTextField *)textField
{
    if (textField == self.hoursValueField) {
        return 3600;
    } else if (textField == self.minsValueField) {
        return 60;
    } else if (textField == self.secsValueField) {
        return 1;
    }
    return 0;
}

- (BOOL)moveToNextField
{
    NSWindow *window = self.window;
    id responder = window.firstResponder;

    if (![responder isKindOfClass:[NSTextView class]]) {
        return NO;
    }

    NSTextView *textView = responder;
    id delegate = textView.delegate;

    if (delegate == self.hoursValueField) {
        [window makeFirstResponder:self.minsValueField];
        return YES;
    } else if (delegate == self.minsValueField) {
        [window makeFirstResponder:self.secsValueField];
        return YES;
    } else if (delegate == self.secsValueField) {
        return YES;
    }
    return NO;
}

- (void)applyColonSeparatedDimensions:(NSString *)text startingAtField:(NSTextField *)field
{
    NSArray<NSString *> *parts = [text componentsSeparatedByString:@":"];

    NSInteger startingField = 0;
    NSInteger currentFieldSecs = [self getTimeDifference:field];

    if (currentFieldSecs == 3600) {
        startingField = 0;
    } else if (currentFieldSecs == 60) {
        startingField = 1;
    } else if (currentFieldSecs == 1) {
        startingField = 2;
    } else {
        return;
    }

    const NSUInteger count = MIN(parts.count, (NSUInteger)(3 - startingField));

    NSInteger newPosition = 0;
    NSInteger timeDifference = currentFieldSecs;
    for (NSUInteger i = 0; i < count; i++) {
        NSString *part = [parts[i]
            stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
        newPosition += timeDifference * part.integerValue;
        timeDifference /= 60;
    }

    [self setJumpTotalSecs:newPosition];
    NSInteger currentFieldValue = (self.jumpTotalSecs / currentFieldSecs);
    [field setStringValue:@(currentFieldValue).stringValue];
}

@end

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

                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Open Source Software

     Quellcodebibliothek
     Eigene Quellcodes
     Fremde Quellcodes
     Suchen

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Statistik
#Sources=1104856
#Domains=417799