Commit 31df6323 authored by Felix Paul Kühne's avatar Felix Paul Kühne

playback: add chapter and title support (closes #11560)

parent 26f894a7
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
<outlet property="brightnessLabel" destination="148" id="165"/> <outlet property="brightnessLabel" destination="148" id="165"/>
<outlet property="brightnessSlider" destination="147" id="163"/> <outlet property="brightnessSlider" destination="147" id="163"/>
<outlet property="bwdButton" destination="276" id="284"/> <outlet property="bwdButton" destination="276" id="284"/>
<outlet property="chapterButton" destination="D3O-Bo-TYi" id="o5p-gI-ydF"/>
<outlet property="contrastLabel" destination="146" id="160"/> <outlet property="contrastLabel" destination="146" id="160"/>
<outlet property="contrastSlider" destination="145" id="161"/> <outlet property="contrastSlider" destination="145" id="161"/>
<outlet property="controllerPanel" destination="272" id="298"/> <outlet property="controllerPanel" destination="272" id="298"/>
...@@ -428,7 +429,7 @@ ...@@ -428,7 +429,7 @@
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="o2q-eo-cnU"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="o2q-eo-cnU">
<rect key="frame" x="552" y="5" width="32" height="40"/> <rect key="frame" x="541" y="5" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="22"/> <fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
...@@ -438,6 +439,17 @@ ...@@ -438,6 +439,17 @@
<action selector="lock:" destination="-1" eventType="touchUpInside" id="QFm-Re-ySf"/> <action selector="lock:" destination="-1" eventType="touchUpInside" id="QFm-Re-ySf"/>
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="D3O-Bo-TYi">
<rect key="frame" x="577" y="6" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
<inset key="contentEdgeInsets" minX="0.0" minY="4" maxX="0.0" maxY="4"/>
<state key="normal" title="C"/>
<connections>
<action selector="switchChapter:" destination="-1" eventType="touchUpInside" id="NHE-kB-Qpz"/>
</connections>
</button>
</subviews> </subviews>
</view> </view>
<view contentMode="scaleToFill" id="141" userLabel="Controls panel" customClass="VLCFrostedGlasView"> <view contentMode="scaleToFill" id="141" userLabel="Controls panel" customClass="VLCFrostedGlasView">
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
<outlet property="brightnessSlider" destination="128" id="232"/> <outlet property="brightnessSlider" destination="128" id="232"/>
<outlet property="bwdButton" destination="77" id="100"/> <outlet property="bwdButton" destination="77" id="100"/>
<outlet property="bwdButtonLandscape" destination="pQj-0t-OnU" id="U8k-IC-a6H"/> <outlet property="bwdButtonLandscape" destination="pQj-0t-OnU" id="U8k-IC-a6H"/>
<outlet property="chapterButtonLandscape" destination="aJZ-AB-35L" id="d8c-zI-Ipo"/>
<outlet property="contrastLabel" destination="132" id="141"/> <outlet property="contrastLabel" destination="132" id="141"/>
<outlet property="contrastSlider" destination="131" id="142"/> <outlet property="contrastSlider" destination="131" id="142"/>
<outlet property="controllerPanel" destination="92" id="104"/> <outlet property="controllerPanel" destination="92" id="104"/>
...@@ -629,7 +630,7 @@ ...@@ -629,7 +630,7 @@
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</view> </view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="lib-Hc-4qn"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="lib-Hc-4qn">
<rect key="frame" x="314" y="5" width="32" height="40"/> <rect key="frame" x="311" y="5" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<fontDescription key="fontDescription" type="system" pointSize="18"/> <fontDescription key="fontDescription" type="system" pointSize="18"/>
<state key="normal" image="repeat.png"> <state key="normal" image="repeat.png">
...@@ -663,7 +664,7 @@ ...@@ -663,7 +664,7 @@
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
</view> </view>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="awR-Dt-S0B"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="awR-Dt-S0B">
<rect key="frame" x="355" y="6" width="32" height="40"/> <rect key="frame" x="345" y="6" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="15"/> <fontDescription key="fontDescription" type="boldSystem" pointSize="15"/>
...@@ -680,7 +681,7 @@ ...@@ -680,7 +681,7 @@
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="5Ty-RA-fET"> <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="5Ty-RA-fET">
<rect key="frame" x="398" y="6" width="32" height="40"/> <rect key="frame" x="378" y="6" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/> <autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/> <color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="22"/> <fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
...@@ -690,6 +691,17 @@ ...@@ -690,6 +691,17 @@
<action selector="lock:" destination="-1" eventType="touchUpInside" id="58H-Ih-9tk"/> <action selector="lock:" destination="-1" eventType="touchUpInside" id="58H-Ih-9tk"/>
</connections> </connections>
</button> </button>
<button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" lineBreakMode="middleTruncation" id="aJZ-AB-35L">
<rect key="frame" x="409" y="7" width="32" height="40"/>
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxX="YES" flexibleMaxY="YES"/>
<color key="backgroundColor" white="0.0" alpha="0.0" colorSpace="calibratedWhite"/>
<fontDescription key="fontDescription" type="boldSystem" pointSize="22"/>
<inset key="contentEdgeInsets" minX="0.0" minY="4" maxX="0.0" maxY="4"/>
<state key="normal" title="C"/>
<connections>
<action selector="switchChapter:" destination="-1" eventType="touchUpInside" id="t1w-mV-9wH"/>
</connections>
</button>
</subviews> </subviews>
<color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/> <color key="backgroundColor" red="0.1215686275" green="0.1215686275" blue="0.1215686275" alpha="1" colorSpace="calibratedRGB"/>
<freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/> <freeformSimulatedSizeMetrics key="simulatedDestinationMetrics"/>
......
...@@ -37,6 +37,8 @@ ...@@ -37,6 +37,8 @@
@property (nonatomic, strong) IBOutlet UIButton *repeatButtonLandscape; @property (nonatomic, strong) IBOutlet UIButton *repeatButtonLandscape;
@property (nonatomic, strong) IBOutlet UIButton *lockButton; @property (nonatomic, strong) IBOutlet UIButton *lockButton;
@property (nonatomic, strong) IBOutlet UIButton *lockButtonLandscape; @property (nonatomic, strong) IBOutlet UIButton *lockButtonLandscape;
@property (nonatomic, strong) IBOutlet UIButton *chapterButton;
@property (nonatomic, strong) IBOutlet UIButton *chapterButtonLandscape;
@property (nonatomic, strong) IBOutlet UINavigationBar *toolbar; @property (nonatomic, strong) IBOutlet UINavigationBar *toolbar;
@property (nonatomic, strong) IBOutlet VLCFrostedGlasView *controllerPanel; @property (nonatomic, strong) IBOutlet VLCFrostedGlasView *controllerPanel;
@property (nonatomic, strong) IBOutlet VLCFrostedGlasView *controllerPanelLandscape; @property (nonatomic, strong) IBOutlet VLCFrostedGlasView *controllerPanelLandscape;
...@@ -107,6 +109,7 @@ ...@@ -107,6 +109,7 @@
- (IBAction)toggleRepeatMode:(id)sender; - (IBAction)toggleRepeatMode:(id)sender;
- (IBAction)switchTrack:(id)sender; - (IBAction)switchTrack:(id)sender;
- (IBAction)lock:(id)sender; - (IBAction)lock:(id)sender;
- (IBAction)switchChapter:(id)sender;
- (IBAction)videoFilterToggle:(id)sender; - (IBAction)videoFilterToggle:(id)sender;
- (IBAction)videoFilterSliderAction:(id)sender; - (IBAction)videoFilterSliderAction:(id)sender;
......
...@@ -64,6 +64,7 @@ return ...@@ -64,6 +64,7 @@ return
BOOL _playerIsSetup; BOOL _playerIsSetup;
BOOL _isScrubbing; BOOL _isScrubbing;
BOOL _interfaceIsLocked; BOOL _interfaceIsLocked;
BOOL _switchingTracksNotChapters;
BOOL _swipeGesturesEnabled; BOOL _swipeGesturesEnabled;
UIPinchGestureRecognizer *_pinchRecognizer; UIPinchGestureRecognizer *_pinchRecognizer;
...@@ -191,6 +192,10 @@ return ...@@ -191,6 +192,10 @@ return
_trackSwitcherButton.isAccessibilityElement = YES; _trackSwitcherButton.isAccessibilityElement = YES;
_trackSwitcherButtonLandscape.accessibilityLabel = NSLocalizedString(@"OPEN_TRACK_PANEL", nil); _trackSwitcherButtonLandscape.accessibilityLabel = NSLocalizedString(@"OPEN_TRACK_PANEL", nil);
_trackSwitcherButtonLandscape.isAccessibilityElement = YES; _trackSwitcherButtonLandscape.isAccessibilityElement = YES;
_chapterButton.accessibilityLabel = NSLocalizedString(@"JUMP_TO_TITLE_OR_CHAPTER", nil);
_chapterButton.isAccessibilityElement = YES;
_chapterButtonLandscape.accessibilityLabel = NSLocalizedString(@"JUMP_TO_TITLE_OR_CHAPTER", nil);
_chapterButtonLandscape.isAccessibilityElement = YES;
_playbackSpeedButton.accessibilityLabel = _playbackSpeedLabel.text; _playbackSpeedButton.accessibilityLabel = _playbackSpeedLabel.text;
_playbackSpeedButton.isAccessibilityElement = YES; _playbackSpeedButton.isAccessibilityElement = YES;
_playbackSpeedButtonLandscape.accessibilityLabel = _playbackSpeedLabel.text; _playbackSpeedButtonLandscape.accessibilityLabel = _playbackSpeedLabel.text;
...@@ -1081,6 +1086,14 @@ return ...@@ -1081,6 +1086,14 @@ return
self.trackSwitcherButton.hidden = YES; self.trackSwitcherButton.hidden = YES;
self.trackSwitcherButtonLandscape.hidden = YES; self.trackSwitcherButtonLandscape.hidden = YES;
} }
if (_mediaPlayer.titles.count > 1 || [_mediaPlayer chaptersForTitleIndex:_mediaPlayer.currentTitleIndex].count > 1) {
self.chapterButton.hidden = NO;
self.chapterButtonLandscape.hidden = NO;
} else {
self.chapterButton.hidden = YES;
self.chapterButtonLandscape.hidden = YES;
}
} }
- (IBAction)playPause - (IBAction)playPause
...@@ -1130,7 +1143,37 @@ return ...@@ -1130,7 +1143,37 @@ return
{ {
LOCKCHECK; LOCKCHECK;
if (_trackSelectorContainer.hidden == YES) { if (_trackSelectorContainer.hidden == YES || _switchingTracksNotChapters == NO) {
_switchingTracksNotChapters = YES;
[_trackSelectorTableView reloadData];
_trackSelectorContainer.hidden = NO;
_trackSelectorContainer.alpha = 1.;
if (!_playbackSpeedViewHidden)
self.playbackSpeedView.hidden = _playbackSpeedViewHidden = YES;
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
if (!_controlsHidden) {
self.controllerPanel.hidden = _controlsHidden = YES;
self.controllerPanelLandscape.hidden = YES;
}
}
self.videoFilterView.hidden = _videoFiltersHidden = YES;
} else {
_trackSelectorContainer.hidden = YES;
_switchingTracksNotChapters = NO;
}
}
- (IBAction)switchChapter:(id)sender
{
LOCKCHECK;
if (_trackSelectorContainer.hidden == YES || _switchingTracksNotChapters == YES) {
_switchingTracksNotChapters = NO;
[_trackSelectorTableView reloadData]; [_trackSelectorTableView reloadData];
_trackSelectorContainer.hidden = NO; _trackSelectorContainer.hidden = NO;
_trackSelectorContainer.alpha = 1.; _trackSelectorContainer.alpha = 1.;
...@@ -1169,11 +1212,20 @@ return ...@@ -1169,11 +1212,20 @@ return
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{ {
NSInteger ret = 0; NSInteger ret = 0;
if (_mediaPlayer.audioTrackIndexes.count > 2)
ret++;
if (_mediaPlayer.videoSubTitlesIndexes.count > 1) if (_switchingTracksNotChapters == YES) {
ret++; if (_mediaPlayer.audioTrackIndexes.count > 2)
ret++;
if (_mediaPlayer.videoSubTitlesIndexes.count > 1)
ret++;
} else {
if (_mediaPlayer.titles.count > 1)
ret++;
if ([_mediaPlayer chaptersForTitleIndex:_mediaPlayer.currentTitleIndex].count > 1)
ret++;
}
return ret; return ret;
} }
...@@ -1190,11 +1242,20 @@ return ...@@ -1190,11 +1242,20 @@ return
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section - (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{ {
if (_mediaPlayer.audioTrackIndexes.count > 2 && section == 0) if (_switchingTracksNotChapters == YES) {
return NSLocalizedString(@"CHOOSE_AUDIO_TRACK", nil); if (_mediaPlayer.audioTrackIndexes.count > 2 && section == 0)
return NSLocalizedString(@"CHOOSE_AUDIO_TRACK", nil);
if (_mediaPlayer.videoSubTitlesIndexes.count > 1)
return NSLocalizedString(@"CHOOSE_SUBTITLE_TRACK", nil);
} else {
if (_mediaPlayer.titles.count > 1 && section == 0)
return NSLocalizedString(@"CHOOSE_TITLE", nil);
if ([_mediaPlayer chaptersForTitleIndex:_mediaPlayer.currentTitleIndex].count > 1)
return NSLocalizedString(@"CHOOSE_CHAPTER", nil);
}
if (_mediaPlayer.videoSubTitlesIndexes.count > 1)
return NSLocalizedString(@"CHOOSE_SUBTITLE_TRACK", nil);
return @"unknown track type"; return @"unknown track type";
} }
...@@ -1205,26 +1266,45 @@ return ...@@ -1205,26 +1266,45 @@ return
if (!cell) if (!cell)
cell = [[VLCTrackSelectorTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TRACK_SELECTOR_TABLEVIEW_CELL]; cell = [[VLCTrackSelectorTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TRACK_SELECTOR_TABLEVIEW_CELL];
NSString *itemSelectionIndicator = @""; NSInteger row = indexPath.row;
NSArray *indexArray;
if (_mediaPlayer.audioTrackIndexes.count > 2 && indexPath.section == 0) {
indexArray = _mediaPlayer.audioTrackIndexes;
if ([indexArray indexOfObjectIdenticalTo:[NSNumber numberWithInt:_mediaPlayer.currentAudioTrackIndex]] == indexPath.row) if (_switchingTracksNotChapters == YES) {
[cell setShowsCurrentTrack:YES]; NSArray *indexArray;
else if (_mediaPlayer.audioTrackIndexes.count > 2 && indexPath.section == 0) {
[cell setShowsCurrentTrack:NO]; indexArray = _mediaPlayer.audioTrackIndexes;
if ([indexArray indexOfObjectIdenticalTo:[NSNumber numberWithInt:_mediaPlayer.currentAudioTrackIndex]] == row)
[cell setShowsCurrentTrack:YES];
else
[cell setShowsCurrentTrack:NO];
cell.textLabel.text = [NSString stringWithFormat:@"%@", _mediaPlayer.audioTrackNames[row]];
} else {
indexArray = _mediaPlayer.videoSubTitlesIndexes;
if ([indexArray indexOfObjectIdenticalTo:[NSNumber numberWithInt:_mediaPlayer.currentVideoSubTitleIndex]] == row)
[cell setShowsCurrentTrack:YES];
else
[cell setShowsCurrentTrack:NO];
cell.textLabel.text = [NSString stringWithFormat:@"%@%@", itemSelectionIndicator, _mediaPlayer.audioTrackNames[indexPath.row]]; cell.textLabel.text = [NSString stringWithFormat:@"%@", _mediaPlayer.videoSubTitlesNames[row]];
}
} else { } else {
indexArray = _mediaPlayer.videoSubTitlesIndexes; if (_mediaPlayer.titles.count > 1 && indexPath.section == 0) {
cell.textLabel.text = _mediaPlayer.titles[row];
if ([indexArray indexOfObjectIdenticalTo:[NSNumber numberWithInt:_mediaPlayer.currentVideoSubTitleIndex]] == indexPath.row) if (row == _mediaPlayer.currentTitleIndex)
[cell setShowsCurrentTrack:YES]; [cell setShowsCurrentTrack:YES];
else else
[cell setShowsCurrentTrack:NO]; [cell setShowsCurrentTrack:NO];
} else {
cell.textLabel.text = [_mediaPlayer chaptersForTitleIndex:_mediaPlayer.currentTitleIndex][row];
cell.textLabel.text = [NSString stringWithFormat:@"%@%@", itemSelectionIndicator, _mediaPlayer.videoSubTitlesNames[indexPath.row]]; if (row == _mediaPlayer.currentChapterIndex)
[cell setShowsCurrentTrack:YES];
else
[cell setShowsCurrentTrack:NO];
}
} }
return cell; return cell;
...@@ -1245,16 +1325,23 @@ return ...@@ -1245,16 +1325,23 @@ return
[tableView deselectRowAtIndexPath:indexPath animated:NO]; [tableView deselectRowAtIndexPath:indexPath animated:NO];
NSInteger index = indexPath.row; NSInteger index = indexPath.row;
NSArray *indexArray; if (_switchingTracksNotChapters == YES) {
if (_mediaPlayer.audioTrackIndexes.count > 2 && indexPath.section == 0) { NSArray *indexArray;
indexArray = _mediaPlayer.audioTrackIndexes; if (_mediaPlayer.audioTrackIndexes.count > 2 && indexPath.section == 0) {
if (index <= indexArray.count) indexArray = _mediaPlayer.audioTrackIndexes;
_mediaPlayer.currentAudioTrackIndex = [indexArray[index] intValue]; if (index <= indexArray.count)
_mediaPlayer.currentAudioTrackIndex = [indexArray[index] intValue];
} else {
indexArray = _mediaPlayer.videoSubTitlesIndexes;
if (index <= indexArray.count)
_mediaPlayer.currentVideoSubTitleIndex = [indexArray[index] intValue];
}
} else { } else {
indexArray = _mediaPlayer.videoSubTitlesIndexes; if (_mediaPlayer.titles.count > 1 && indexPath.section == 0)
if (index <= indexArray.count) _mediaPlayer.currentTitleIndex = index;
_mediaPlayer.currentVideoSubTitleIndex = [indexArray[index] intValue]; else
_mediaPlayer.currentChapterIndex = index;
} }
CGFloat alpha = 0.0f; CGFloat alpha = 0.0f;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment