|
|
|
@ -117,12 +117,12 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
/* add item to list */ |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
|
|
|
|
if( !p_input ) return; |
|
|
|
if( !p_input ) |
|
|
|
return; |
|
|
|
|
|
|
|
seekpoint_t bookmark; |
|
|
|
|
|
|
|
if( !input_Control( p_input, INPUT_GET_BOOKMARK, &bookmark ) ) |
|
|
|
{ |
|
|
|
if( !input_Control( p_input, INPUT_GET_BOOKMARK, &bookmark ) ) { |
|
|
|
bookmark.psz_name = _("Untitled"); |
|
|
|
input_Control( p_input, INPUT_ADD_BOOKMARK, &bookmark ); |
|
|
|
} |
|
|
|
@ -161,25 +161,23 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
if( !p_input ) |
|
|
|
return; |
|
|
|
|
|
|
|
if( row < 0 ) |
|
|
|
{ |
|
|
|
if( row < 0 ) { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, |
|
|
|
&i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
[o_edit_fld_name setStringValue: [NSString stringWithUTF8String: |
|
|
|
pp_bookmarks[row]->psz_name]]; |
|
|
|
[o_edit_fld_time setStringValue: [[NSNumber numberWithInt: |
|
|
|
(pp_bookmarks[row]->i_time_offset / 1000000)] stringValue]]; |
|
|
|
[o_edit_fld_bytes setStringValue: [[NSNumber numberWithInt: |
|
|
|
pp_bookmarks[row]->i_byte_offset] stringValue]]; |
|
|
|
[o_edit_fld_name setStringValue: [NSString stringWithFormat:@"%s", pp_bookmarks[row]->psz_name]]; |
|
|
|
int total = pp_bookmarks[row]->i_time_offset/ 1000000; |
|
|
|
int hour = total / (60*60); |
|
|
|
int min = (total - hour*60*60) / 60; |
|
|
|
int sec = total - hour*60*60 - min*60; |
|
|
|
[o_edit_fld_time setStringValue: [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min, sec]]; |
|
|
|
[o_edit_fld_bytes setStringValue: [NSString stringWithFormat:@"%lli", pp_bookmarks[row]->i_byte_offset]]; |
|
|
|
|
|
|
|
/* Just keep the pointer value to check if it |
|
|
|
* changes. Note, we don't need to keep a reference to the object. |
|
|
|
@ -187,17 +185,12 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
p_old_input = p_input; |
|
|
|
vlc_object_release( p_input ); |
|
|
|
|
|
|
|
[NSApp beginSheet: o_edit_window |
|
|
|
modalForWindow: o_bookmarks_window |
|
|
|
modalDelegate: o_edit_window |
|
|
|
didEndSelector: nil |
|
|
|
contextInfo: nil]; |
|
|
|
[NSApp beginSheet: o_edit_window modalForWindow: o_bookmarks_window modalDelegate: o_edit_window didEndSelector: nil contextInfo: nil]; |
|
|
|
|
|
|
|
// Clear the bookmark list |
|
|
|
for( int i = 0; i < i_bookmarks; i++) |
|
|
|
vlc_seekpoint_Delete( pp_bookmarks[i] ); |
|
|
|
free( pp_bookmarks ); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
- (IBAction)edit_cancel:(id)sender |
|
|
|
@ -214,28 +207,17 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
int i_bookmarks, i; |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
|
|
|
|
if( !p_input ) |
|
|
|
{ |
|
|
|
NSBeginCriticalAlertSheet(_NS("No input"), _NS("OK"), |
|
|
|
@"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("No " |
|
|
|
"input found. A stream must be playing or paused for " |
|
|
|
"bookmarks to work.")); |
|
|
|
if( !p_input ) { |
|
|
|
NSBeginCriticalAlertSheet(_NS("No input"), _NS("OK"), @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("No input found. A stream must be playing or paused for bookmarks to work.")); |
|
|
|
return; |
|
|
|
} |
|
|
|
if( p_old_input != p_input ) |
|
|
|
{ |
|
|
|
NSBeginCriticalAlertSheet(_NS("Input has changed"), _NS("OK"), |
|
|
|
@"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Input " |
|
|
|
"has changed, unable to save bookmark. Suspending playback with " |
|
|
|
"\"Pause\" while editing bookmarks to ensure to keep the same " |
|
|
|
"input.")); |
|
|
|
if( p_old_input != p_input ) { |
|
|
|
NSBeginCriticalAlertSheet(_NS("Input has changed"), _NS("OK"), @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Input has changed, unable to save bookmark. Suspending playback with \"Pause\" while editing bookmarks to ensure to keep the same input.")); |
|
|
|
vlc_object_release( p_input ); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, |
|
|
|
&i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
return; |
|
|
|
} |
|
|
|
@ -246,11 +228,21 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
|
|
|
|
pp_bookmarks[i]->psz_name = strdup([[o_edit_fld_name stringValue] UTF8String]); |
|
|
|
pp_bookmarks[i]->i_byte_offset = [[o_edit_fld_bytes stringValue] intValue]; |
|
|
|
pp_bookmarks[i]->i_time_offset = ([[o_edit_fld_time stringValue] intValue] * 1000000); |
|
|
|
|
|
|
|
if( input_Control( p_input, INPUT_CHANGE_BOOKMARK, pp_bookmarks[i], i ) |
|
|
|
!= VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
NSArray * components = [[o_edit_fld_time stringValue] componentsSeparatedByString:@":"]; |
|
|
|
NSUInteger componentCount = [components count]; |
|
|
|
if( componentCount == 1 ) |
|
|
|
pp_bookmarks[i]->i_time_offset = 1000000 * ( [[components objectAtIndex:0] intValue] ); |
|
|
|
else if( componentCount == 2 ) |
|
|
|
pp_bookmarks[i]->i_time_offset = 1000000 * ( [[components objectAtIndex:0] intValue] * 60 + [[components objectAtIndex:1] intValue] ); |
|
|
|
else if( componentCount == 3 ) |
|
|
|
pp_bookmarks[i]->i_time_offset = 1000000 * ( [[components objectAtIndex:0] intValue] * 3600 + [[components objectAtIndex:1] intValue] * 60 + [[components objectAtIndex:2] intValue] ); |
|
|
|
else { |
|
|
|
msg_Err( VLCIntf, "Invalid string format for time" ); |
|
|
|
goto clear; |
|
|
|
} |
|
|
|
|
|
|
|
if( input_Control( p_input, INPUT_CHANGE_BOOKMARK, pp_bookmarks[i], i ) != VLC_SUCCESS ) { |
|
|
|
msg_Warn( VLCIntf, "Unable to change the bookmark"); |
|
|
|
goto clear; |
|
|
|
} |
|
|
|
@ -258,7 +250,6 @@ static VLCBookmarks *_o_sharedInstance = nil; |
|
|
|
[o_tbl_dataTable reloadData]; |
|
|
|
vlc_object_release( p_input ); |
|
|
|
|
|
|
|
|
|
|
|
[NSApp endSheet: o_edit_window]; |
|
|
|
[o_edit_window close]; |
|
|
|
|
|
|
|
@ -271,20 +262,13 @@ clear: |
|
|
|
|
|
|
|
- (IBAction)extract:(id)sender |
|
|
|
{ |
|
|
|
/* extract */ |
|
|
|
if( [o_tbl_dataTable numberOfSelectedRows] < 2 ) |
|
|
|
{ |
|
|
|
NSBeginAlertSheet(_NS("Invalid selection"), _NS("OK"), |
|
|
|
@"", @"", o_bookmarks_window, nil, nil, nil, nil, |
|
|
|
_NS("Two bookmarks have to be selected.")); |
|
|
|
if( [o_tbl_dataTable numberOfSelectedRows] < 2 ) { |
|
|
|
NSBeginAlertSheet(_NS("Invalid selection"), _NS("OK"), @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("Two bookmarks have to be selected.")); |
|
|
|
return; |
|
|
|
} |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
if( !p_input ) |
|
|
|
{ |
|
|
|
NSBeginCriticalAlertSheet(_NS("No input found"), _NS("OK"), |
|
|
|
@"", @"", o_bookmarks_window, nil, nil, nil, nil, |
|
|
|
_NS("The stream must be playing or paused for bookmarks to work.")); |
|
|
|
if( !p_input ) { |
|
|
|
NSBeginCriticalAlertSheet(_NS("No input found"), _NS("OK"), @"", @"", o_bookmarks_window, nil, nil, nil, nil, _NS("The stream must be playing or paused for bookmarks to work.")); |
|
|
|
return; |
|
|
|
} |
|
|
|
|
|
|
|
@ -293,44 +277,28 @@ clear: |
|
|
|
int i_first = -1; |
|
|
|
int i_second = -1; |
|
|
|
int c = 0; |
|
|
|
for (NSUInteger x = 0; c != 2; x++) |
|
|
|
{ |
|
|
|
if([o_tbl_dataTable isRowSelected:x]) |
|
|
|
{ |
|
|
|
if (i_first == -1) |
|
|
|
{ |
|
|
|
for (NSUInteger x = 0; c != 2; x++) { |
|
|
|
if([o_tbl_dataTable isRowSelected:x]) { |
|
|
|
if (i_first == -1) { |
|
|
|
i_first = x; |
|
|
|
c = 1; |
|
|
|
} |
|
|
|
else if (i_second == -1) |
|
|
|
{ |
|
|
|
} else if (i_second == -1) { |
|
|
|
i_second = x; |
|
|
|
c = 2; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
msg_Dbg( VLCIntf, "got the bookmark-indexes"); |
|
|
|
|
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, |
|
|
|
&i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
msg_Err( VLCIntf, "already defined bookmarks couldn't be retrieved"); |
|
|
|
return; |
|
|
|
} |
|
|
|
msg_Dbg( VLCIntf, "calling wizard"); |
|
|
|
|
|
|
|
char *psz_uri = input_item_GetURI( input_GetItem( p_input ) ); |
|
|
|
[[[VLCMain sharedInstance] wizard] initWithExtractValuesFrom: |
|
|
|
[[NSNumber numberWithInt: |
|
|
|
(pp_bookmarks[i_first]->i_time_offset/1000000)] stringValue] |
|
|
|
to: [[NSNumber numberWithInt: |
|
|
|
(pp_bookmarks[i_second]->i_time_offset/1000000)] stringValue] |
|
|
|
ofItem: [NSString stringWithUTF8String: psz_uri]]; |
|
|
|
[[[VLCMain sharedInstance] wizard] initWithExtractValuesFrom: [NSString stringWithFormat:@"%lli", pp_bookmarks[i_first]->i_time_offset/1000000] to: [NSString stringWithFormat:@"%lli", pp_bookmarks[i_second]->i_time_offset/1000000] ofItem: [NSString stringWithFormat:@"%s", psz_uri]]; |
|
|
|
free( psz_uri ); |
|
|
|
vlc_object_release( p_input ); |
|
|
|
msg_Dbg( VLCIntf, "released input"); |
|
|
|
|
|
|
|
// Clear the bookmark list |
|
|
|
for( int i = 0; i < i_bookmarks; i++) |
|
|
|
@ -342,7 +310,8 @@ clear: |
|
|
|
{ |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
|
|
|
|
if( !p_input ) return; |
|
|
|
if( !p_input ) |
|
|
|
return; |
|
|
|
|
|
|
|
input_Control( p_input, INPUT_SET_BOOKMARK, [o_tbl_dataTable selectedRow] ); |
|
|
|
|
|
|
|
@ -351,10 +320,10 @@ clear: |
|
|
|
|
|
|
|
- (IBAction)remove:(id)sender |
|
|
|
{ |
|
|
|
/* remove selected item */ |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
|
|
|
|
if( !p_input ) return; |
|
|
|
if( !p_input ) |
|
|
|
return; |
|
|
|
|
|
|
|
int i_focused = [o_tbl_dataTable selectedRow]; |
|
|
|
|
|
|
|
@ -386,14 +355,12 @@ clear: |
|
|
|
seekpoint_t **pp_bookmarks; |
|
|
|
int i_bookmarks; |
|
|
|
|
|
|
|
if( !p_input ) return 0; |
|
|
|
else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, |
|
|
|
&i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
if( !p_input ) |
|
|
|
return 0; |
|
|
|
else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
else { |
|
|
|
} else { |
|
|
|
vlc_object_release( p_input ); |
|
|
|
// Clear the bookmark list |
|
|
|
for( int i = 0; i < i_bookmarks; i++) |
|
|
|
@ -403,48 +370,29 @@ clear: |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
- (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn: |
|
|
|
(NSTableColumn *)theTableColumn row: (NSInteger)row |
|
|
|
- (id)tableView:(NSTableView *)theDataTable objectValueForTableColumn: (NSTableColumn *)theTableColumn row: (NSInteger)row |
|
|
|
{ |
|
|
|
/* return the corresponding data as NSString */ |
|
|
|
input_thread_t * p_input = pl_CurrentInput( VLCIntf ); |
|
|
|
seekpoint_t **pp_bookmarks; |
|
|
|
int i_bookmarks; |
|
|
|
char *toBeReturned; |
|
|
|
int i_toBeReturned = 0; |
|
|
|
id ret; |
|
|
|
|
|
|
|
if( !p_input ) return @""; |
|
|
|
else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, |
|
|
|
&i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
{ |
|
|
|
else if( input_Control( p_input, INPUT_GET_BOOKMARKS, &pp_bookmarks, &i_bookmarks ) != VLC_SUCCESS ) |
|
|
|
ret = @""; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
else { |
|
|
|
NSString * identifier = [theTableColumn identifier]; |
|
|
|
if ([identifier isEqualToString: @"description"]) |
|
|
|
{ |
|
|
|
toBeReturned = pp_bookmarks[row]->psz_name; |
|
|
|
ret = [NSString stringWithUTF8String: toBeReturned]; |
|
|
|
} |
|
|
|
else if ([identifier isEqualToString: @"size_offset"]) |
|
|
|
{ |
|
|
|
i_toBeReturned = pp_bookmarks[row]->i_byte_offset; |
|
|
|
ret = [[NSNumber numberWithInt: i_toBeReturned] stringValue]; |
|
|
|
} |
|
|
|
else if ([identifier isEqualToString: @"time_offset"]) |
|
|
|
{ |
|
|
|
i_toBeReturned = pp_bookmarks[row]->i_time_offset; |
|
|
|
ret = [[NSNumber numberWithInt: (i_toBeReturned / 1000000)] |
|
|
|
stringValue]; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
/* may not happen, just in case */ |
|
|
|
msg_Err( VLCIntf, "unknown table column identifier (%s) while " |
|
|
|
"updating the bookmark table", [identifier UTF8String] ); |
|
|
|
ret = @"unknown identifier"; |
|
|
|
if ([identifier isEqualToString: @"description"]) { |
|
|
|
ret = [NSString stringWithFormat:@"%s", pp_bookmarks[row]->psz_name]; |
|
|
|
} else if ([identifier isEqualToString: @"size_offset"]) { |
|
|
|
ret = [NSString stringWithFormat:@"%lli", pp_bookmarks[row]->i_byte_offset]; |
|
|
|
} else if ([identifier isEqualToString: @"time_offset"]) { |
|
|
|
int total = pp_bookmarks[row]->i_time_offset/ 1000000; |
|
|
|
int hour = total / (60*60); |
|
|
|
int min = (total - hour*60*60) / 60; |
|
|
|
int sec = total - hour*60*60 - min*60; |
|
|
|
ret = [NSString stringWithFormat:@"%02d:%02d:%02d", hour, min, sec]; |
|
|
|
} |
|
|
|
|
|
|
|
// Clear the bookmark list |
|
|
|
@ -463,22 +411,17 @@ clear: |
|
|
|
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification |
|
|
|
{ |
|
|
|
/* check whether a row is selected and en-/disable the edit/remove buttons */ |
|
|
|
if ([o_tbl_dataTable selectedRow] == -1) |
|
|
|
{ |
|
|
|
if ([o_tbl_dataTable selectedRow] == -1) { |
|
|
|
/* no row is selected */ |
|
|
|
[o_btn_edit setEnabled: NO]; |
|
|
|
[o_btn_rm setEnabled: NO]; |
|
|
|
[o_btn_extract setEnabled: NO]; |
|
|
|
} |
|
|
|
else |
|
|
|
{ |
|
|
|
} else { |
|
|
|
/* a row is selected */ |
|
|
|
[o_btn_edit setEnabled: YES]; |
|
|
|
[o_btn_rm setEnabled: YES]; |
|
|
|
if ([o_tbl_dataTable numberOfSelectedRows] == 2) |
|
|
|
{ |
|
|
|
[o_btn_extract setEnabled: YES]; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|