-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathPRControlsViewController.m
133 lines (111 loc) · 4.1 KB
/
PRControlsViewController.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#import "PRControlsViewController.h"
#import "NSNotificationCenter+Extensions.h"
#import "PRPlaylists.h"
#import "PRTask.h"
#import "PRBridge_Front.h"
#import "PRConnection.h"
#import "PRControlsView.h"
#import "PRCore.h"
#import "PRItem.h"
#import "PRPlayer.h"
#import "PRPlayerState.h"
#import "PRTimeFormatter.h"
@implementation PRControlsViewController {
PRBridge *_bridge;
PRControlsView *_view;
PRPlayerState *_playerState;
PRMovieState *_movieState;
PRItem *_item;
PRTimeFormatter *_formatter;
}
- (id)initWithBridge:(PRBridge *)bridge {
if ((self = [super init])) {
_bridge = bridge;
_formatter = [[PRTimeFormatter alloc] init];
[[NSNotificationCenter defaultCenter] observeBackendChanged:self sel:@selector(_backendDidChange:)];
}
return self;
}
- (void)loadView {
_view = [[PRControlsView alloc] init];
[self setView:_view];
[[_view playButton] setTarget:self];
[[_view playButton] setAction:@selector(_playButtonAction:)];
[[_view nextButton] setTarget:self];
[[_view nextButton] setAction:@selector(_nextButtonAction:)];
[[_view previousButton] setTarget:self];
[[_view previousButton] setAction:@selector(_previousButtonAction:)];
[[_view volumeSlider] setTarget:self];
[[_view volumeSlider] setAction:@selector(_volumeAction:)];
[[_view progressSlider] setTarget:self];
[[_view progressSlider] setAction:@selector(_progressAction:)];
[[_view repeatButton] setTarget:self];
[[_view repeatButton] setAction:@selector(_repeatAction:)];
[[_view shuffleButton] setTarget:self];
[[_view shuffleButton] setAction:@selector(_shuffleAction:)];
[self _reloadData];
}
#pragma mark - Action
- (void)_playButtonAction:(id)sender {
[_bridge performTask:PRPlayPauseTask()];
}
- (void)_nextButtonAction:(id)sender {
[_bridge performTask:PRPlayNextTask()];
}
- (void)_previousButtonAction:(id)sender {
[_bridge performTask:PRPlayPreviousTask()];
}
- (void)_volumeAction:(id)sender {
[_bridge performTask:PRSetVolumeTask([[_view volumeSlider] floatValue])];
}
- (void)_progressAction:(id)sender {
[_bridge performTask:PRSetTimeTask([[_view progressSlider] integerValue])];
}
- (void)_shuffleAction:(id)sender {
[_bridge performTask:PRToggleShuffleTask()];
}
- (void)_repeatAction:(id)sender {
[_bridge performTask:PRToggleRepeatTask()];
}
#pragma mark - Notifications
- (void)_backendDidChange:(NSNotification *)note {
for (NSObject *i in [[note userInfo][@"changeset"] changes]) {
if ([i isKindOfClass:[PRNowPlayingChange class]]) {
[self _reloadData];
} else if ([i isKindOfClass:[PRMovieChange class]]) {
[self _reloadMovie];
}
}
}
#pragma mark - Internal
- (void)_reloadData {
__block PRPlayerState *player = nil;
__block PRItem *item = nil;
[_bridge performTaskSync:^(PRCore *core){
player = [[core now] playerState];
if ([player currentItem]) {
[[[core conn] library] zItemDescriptionForItem:[player currentItem] out:&item];
}
}];
_playerState = player;
_item = item;
[_view setTitleString:_item ? [NSString stringWithFormat:@"%@ - %@ - %@", [_item title], [_item artist], [_item album]] : @""];
[_view setRepeat:[_playerState repeat]];
[_view setShuffle:[_playerState shuffle]];
[self _reloadMovie];
}
- (void)_reloadMovie {
__block PRMovieState *movDescription = nil;
[_bridge performTaskSync:^(PRCore *core){
movDescription = [[core now] movieState];
}];
_movieState = movDescription;
[[_view volumeSlider] setFloatValue:[_movieState volume]];
[[_view progressSlider] setMaxValue:[_movieState duration]];
[[_view progressSlider] setIntegerValue:[_movieState currentTime]];
[_view setIsPlaying:[_movieState isPlaying]];
NSString *timeStr = [_formatter stringForObjectValue:@([_movieState currentTime])];
NSString *durationStr = [_formatter stringForObjectValue:@([_movieState duration])];
[_view setSubtitleString:(_item && _movieState) ? [NSString stringWithFormat:@"%@ / %@", timeStr, durationStr] : @""];
}
@end