*/
int i = 0;
- NSEnumerator *enumerator = [fJobGroups objectEnumerator];
- id tempObject;
- while (tempObject = [enumerator nextObject])
+ for(id tempObject in fJobGroups)
{
NSDictionary *thisQueueDict = tempObject;
if ([[thisQueueDict objectForKey:@"Status"] intValue] == 0) // Completed
- (IBAction)removeSelectedQueueItem: (id)sender
{
NSIndexSet * selectedRows = [fOutlineView selectedRowIndexes];
- int row = [selectedRows firstIndex];
+ NSUInteger row = [selectedRows firstIndex];
+ if( row == NSNotFound )
+ return;
/* if this is a currently encoding job, we need to be sure to alert the user,
* to let them decide to cancel it first, then if they do, we can come back and
* remove it */
- if ([[[fJobGroups objectAtIndex:row] objectForKey:@"Status"] intValue] == 1)
+ if ([[[fJobGroups objectAtIndex:row] objectForKey:@"Status"] integerValue] == 1)
{
/* We pause the encode here so that it doesn't finish right after and then
* screw up the sync while the window is open
[fHBController Pause:NULL];
NSString * alertTitle = [NSString stringWithFormat:NSLocalizedStringFromTable(@"Stop This Encode and Remove It ?", @"Queue", nil)];
// Which window to attach the sheet to?
- NSWindow * docWindow;
+ NSWindow * docWindow = nil;
if ([sender respondsToSelector: @selector(window)])
docWindow = [sender window];
- (IBAction)togglePauseResume: (id)sender
{
if (!fQueueEncodeLibhb) return;
-
+
hb_state_t s;
hb_get_state2 (fQueueEncodeLibhb, &s);
-
+
if (s.state == HB_STATE_PAUSED)
+ {
hb_resume (fQueueEncodeLibhb);
+ [self startAnimatingCurrentWorkingEncodeInQueue];
+ }
else if ((s.state == HB_STATE_WORKING) || (s.state == HB_STATE_MUXING))
+ {
hb_pause (fQueueEncodeLibhb);
+ [self stopAnimatingCurrentJobGroupInQueue];
+ }
}
#pragma mark -
{
if ([outlineView isItemExpanded: item])
{
+ /* Below is the original code to accommodate a live resize,
+ * however as stated in travistex's comments it's very buggy.
+ * For now I will leave it here ... commented out and use
+ * the code below to determine the row height based on each
+ * encodes optional parameters and how they are displayed. */
+
// Short-circuit here if in a live resize primarily to fix a bug but also to
// increase resposivness during a resize. There's a bug in NSTableView that
// causes row heights to get messed up if you try to change them during a live
// height. The row heights will get fixed up after the resize because we have
// implemented viewDidEndLiveResize to force all of them to be recalculated.
// if ([outlineView inLiveResize] && [item lastDescriptionHeight] > 0)
- // return [item lastDescriptionHeight];
-
+ // return [item lastDescriptionHeight];
+
// CGFloat width = [[outlineView tableColumnWithIdentifier: @"desc"] width];
// Column width is NOT what is ultimately used. I can't quite figure out what
// width to use for calculating text metrics. No matter how I tweak this value,
// of the row cell. In previous versions, which ran under Tiger, I was
// reducing width by 47 pixles.
// width -= 2; // (?) for intercell spacing
-
+
// CGFloat height = [item heightOfDescriptionForWidth: width];
// return height;
- return HB_ROW_HEIGHT_FULL_DESCRIPTION;
+ /* So, we know several rows of text that are in all queue items for display.
+ * These are the title line, Preset, Format, Destination, Picture, and Video Lines
+ */
+ CGFloat rowHeightNonTitle = 15.0;
+ /* Add the title line height, then the non title line height for Preset, Format, Destination
+ * Picture and Video
+ */
+ CGFloat itemHeightForDisplay = HB_ROW_HEIGHT_TITLE_ONLY + (rowHeightNonTitle * 5);
+
+ /* get our item row number so we an use it to calc how many lines we have to display based
+ * on MP4 Options, Filter Options, X264 Options, Audio Tracks and Subtitles from our queue array */
+ int itemRowNum = [outlineView rowForItem: item];
+ NSMutableDictionary *queueItemToCheck = [outlineView itemAtRow: itemRowNum];
+
+ /* Check to see if we need to allow for mp4 opts */
+ BOOL mp4OptsPresent = NO;
+ if ([[queueItemToCheck objectForKey:@"FileFormat"] isEqualToString: @"MP4 file"])
+ {
+
+ if( [[queueItemToCheck objectForKey:@"Mp4LargeFile"] intValue] == 1)
+ {
+ mp4OptsPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"Mp4HttpOptimize"] intValue] == 1)
+ {
+ mp4OptsPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"Mp4iPodCompatible"] intValue] == 1)
+ {
+ mp4OptsPresent = YES;
+ }
+ }
+
+ if (mp4OptsPresent == YES)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+
+ /* check to see if we need to allow for the Picture Filters row */
+ BOOL pictureFiltersPresent = NO;
+ if( [[queueItemToCheck objectForKey:@"PictureDetelecine"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"PictureDecomb"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"PictureDeinterlace"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"PictureDenoise"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"PictureDeblock"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+ if( [[queueItemToCheck objectForKey:@"VideoGrayScale"] intValue] > 0)
+ {
+ pictureFiltersPresent = YES;
+ }
+
+ if (pictureFiltersPresent == YES)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+
+ /* check to see if we need a line to display x264 options */
+ if ([[queueItemToCheck objectForKey:@"VideoEncoder"] isEqualToString: @"H.264 (x264)"])
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+
+ /* check to see how many audio track lines to allow for */
+ if ([[queueItemToCheck objectForKey:@"Audio1Track"] intValue] > 0)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+ if ([[queueItemToCheck objectForKey:@"Audio2Track"] intValue] > 0)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+ if ([[queueItemToCheck objectForKey:@"Audio3Track"] intValue] > 0)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+ if ([[queueItemToCheck objectForKey:@"Audio4Track"] intValue] > 0)
+ {
+ itemHeightForDisplay += rowHeightNonTitle;
+ }
+
+ /* add in subtitle lines for each subtitle in the SubtitleList array */
+ itemHeightForDisplay += rowHeightNonTitle * [[queueItemToCheck objectForKey:@"SubtitleList"] count];
+
+ return itemHeightForDisplay;
+
}
else
+ {
return HB_ROW_HEIGHT_TITLE_ONLY;
+ }
}
- (CGFloat) heightOfDescriptionForWidth:(CGFloat)width
[NSString stringWithFormat:NSLocalizedStringFromTable(@"Chapter %d", @"Queue",@""), [[item objectForKey:@"ChapterStart"] intValue]] :
[NSString stringWithFormat:NSLocalizedStringFromTable(@"Chapters %d through %d", @"Queue",@""), [[item objectForKey:@"ChapterStart"] intValue], [[item objectForKey:@"ChapterEnd"] intValue]];
- NSString * passesString;
+ NSString * passesString = @"";
+ /* check to see if our first subtitle track is Foreign Language Search, in which case there is an in depth scan */
+ if ([item objectForKey:@"SubtitleList"] && [[[[item objectForKey:@"SubtitleList"] objectAtIndex:0] objectForKey:@"subtitleSourceTrackNum"] intValue] == 1)
+ {
+ passesString = [passesString stringByAppendingString:@"1 Foreign Language Search Pass - "];
+ }
if ([[item objectForKey:@"VideoTwoPass"] intValue] == 0)
{
+ /*
passesString = [NSString stringWithFormat:NSLocalizedStringFromTable(@"1 Video Pass", @"Queue",@"")];
+ */
+ passesString = [passesString stringByAppendingString:@"1 Video Pass"];
}
else
{
if ([[item objectForKey:@"VideoTurboTwoPass"] intValue] == 1)
{
+ /*
passesString = [NSString stringWithFormat:NSLocalizedStringFromTable(@"2 Video Passes Turbo", @"Queue",@"")];
}
else
{
passesString = [NSString stringWithFormat:NSLocalizedStringFromTable(@"2 Video Passes", @"Queue",@"")];
+ */
+ passesString = [passesString stringByAppendingString:@"2 Video Passes First Turbo"];
+ }
+ else
+ {
+ passesString = [passesString stringByAppendingString:@"2 Video Passes"];
}
}
/* Third Line (Format Summary) */
NSString * audioCodecSummary = @"";
/* Lets also get our audio track detail since we are going through the logic for use later */
- NSString * audioDetail1 = @"None";
- NSString * audioDetail2 = @"None";
- NSString * audioDetail3 = @"None";
- NSString * audioDetail4 = @"None";
+ NSString * audioDetail1 = @"";
+ NSString * audioDetail2 = @"";
+ NSString * audioDetail3 = @"";
+ NSString * audioDetail4 = @"";
if ([[item objectForKey:@"Audio1Track"] intValue] > 0)
{
audioCodecSummary = [NSString stringWithFormat:@"%@", [item objectForKey:@"Audio1Encoder"]];
[item objectForKey:@"Audio1Samplerate"],
[item objectForKey:@"Audio1Bitrate"]];
- if ([[item objectForKey:@"Audio1TrackDRCSlider"] floatValue] > 1.00)
+ if ([[item objectForKey:@"Audio1TrackDRCSlider"] floatValue] > 0.00)
{
audioDetail1 = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@, DRC: %@", @"Queue",@""),audioDetail1,[item objectForKey:@"Audio1TrackDRCSlider"]];
}
[item objectForKey:@"Audio2Samplerate"],
[item objectForKey:@"Audio2Bitrate"]];
- if ([[item objectForKey:@"Audio2TrackDRCSlider"] floatValue] > 1.00)
+ if ([[item objectForKey:@"Audio2TrackDRCSlider"] floatValue] > 0.00)
{
audioDetail2 = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@, DRC: %@", @"Queue",@""),audioDetail2,[item objectForKey:@"Audio2TrackDRCSlider"]];
}
[item objectForKey:@"Audio3Samplerate"],
[item objectForKey:@"Audio3Bitrate"]];
- if ([[item objectForKey:@"Audio3TrackDRCSlider"] floatValue] > 1.00)
+ if ([[item objectForKey:@"Audio3TrackDRCSlider"] floatValue] > 0.00)
{
audioDetail3 = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@, DRC: %@", @"Queue",@""),audioDetail3,[item objectForKey:@"Audio3TrackDRCSlider"]];
}
[item objectForKey:@"Audio4Samplerate"],
[item objectForKey:@"Audio4Bitrate"]];
- if ([[item objectForKey:@"Audio4TrackDRCSlider"] floatValue] > 1.00)
+ if ([[item objectForKey:@"Audio4TrackDRCSlider"] floatValue] > 0.00)
{
audioDetail4 = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@, DRC: %@", @"Queue",@""),audioDetail4,[item objectForKey:@"Audio4TrackDRCSlider"]];
}
NSString * pictureFilters = @"";
BOOL pictureFiltersPresent = NO;
+ /*
if( [[item objectForKey:@"VFR"] intValue] == 1)
{
pictureFiltersPresent = YES;
{
pictureFiltersPresent = YES;
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Detelecine", @"Queue",@"")];
- }
+ */
- if( [[item objectForKey:@"PictureDecomb"] intValue] == 1)
+ if( [[item objectForKey:@"PictureDetelecine"] intValue] == 1)
+ {
+ pictureFiltersPresent = YES;
+ pictureFilters = [pictureFilters stringByAppendingString:[NSString stringWithFormat:@" - Detelecine (%@)",[item objectForKey:@"PictureDetelecineCustom"]]];
+ }
+ else if( [[item objectForKey:@"PictureDetelecine"] intValue] == 2)
{
pictureFiltersPresent = YES;
+ /*
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Decomb ", @"Queue",@"")];
+ */
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Detelecine (Default)"];
}
- if ([[item objectForKey:@"PictureDeinterlace"] intValue] != 0)
+ if( [[item objectForKey:@"PictureDecombDeinterlace"] intValue] == 1)
{
- pictureFiltersPresent = YES;
- if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 1)
+ if ([[item objectForKey:@"PictureDecomb"] intValue] != 0)
{
+ /*
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Deinterlace: Fast ", @"Queue",@"")];
}
else if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 2)
else if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 3)
{
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Deinterlace: Slower ", @"Queue",@"")];
+ */
+ pictureFiltersPresent = YES;
+ if( [[item objectForKey:@"PictureDecomb"] intValue] == 1)
+ {
+ pictureFiltersPresent = YES;
+ pictureFilters = [pictureFilters stringByAppendingString:[NSString stringWithFormat:@" - Decomb (%@)",[item objectForKey:@"PictureDecombCustom"]]];
+ }
+ else if( [[item objectForKey:@"PictureDecomb"] intValue] == 2)
+ {
+ pictureFiltersPresent = YES;
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Decomb (Default)"];
+ }
+ }
+ }
+ else
+ {
+ if ([[item objectForKey:@"PictureDeinterlace"] intValue] != 0)
+ {
+ pictureFiltersPresent = YES;
+ if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 1)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:[NSString stringWithFormat:@" - Deinterlace (%@)",[item objectForKey:@"PictureDeinterlaceCustom"]]];
+ }
+ else if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 2)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Deinterlace (Fast)"];
+ }
+ else if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 3)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Deinterlace (Slow)"];
+ }
+ else if ([[item objectForKey:@"PictureDeinterlace"] intValue] == 4)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Deinterlace (Slower)"];
+ }
+
}
-
}
if ([[item objectForKey:@"PictureDenoise"] intValue] != 0)
{
pictureFiltersPresent = YES;
if ([[item objectForKey:@"PictureDenoise"] intValue] == 1)
{
+ /*
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Denoise: Weak ", @"Queue",@"")];
}
else if ([[item objectForKey:@"PictureDenoise"] intValue] == 2)
else if ([[item objectForKey:@"PictureDenoise"] intValue] == 3)
{
pictureFilters = [pictureFilters stringByAppendingString:NSLocalizedStringFromTable(@" - Denoise: Strong ", @"Queue",@"")];
+ */
+ pictureFilters = [pictureFilters stringByAppendingString:[NSString stringWithFormat:@" - Denoise (%@)",[item objectForKey:@"PictureDenoiseCustom"]]];
+ }
+ else if ([[item objectForKey:@"PictureDenoise"] intValue] == 2)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Denoise (Weak)"];
+ }
+ else if ([[item objectForKey:@"PictureDenoise"] intValue] == 3)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Denoise (Medium)"];
+ }
+ else if ([[item objectForKey:@"PictureDenoise"] intValue] == 4)
+ {
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Denoise (Strong)"];
}
}
if ([[item objectForKey:@"PictureDeblock"] intValue] != 0)
{
pictureFiltersPresent = YES;
+ /*
pictureFilters = [pictureFilters stringByAppendingString: [NSString stringWithFormat:NSLocalizedStringFromTable(@" - Deblock (pp7) (%d) ", @"Queue",@""),[[item objectForKey:@"PictureDeblock"] intValue]]];
+ */
+ pictureFilters = [pictureFilters stringByAppendingString: [NSString stringWithFormat:@" - Deblock (pp7) (%d)",[[item objectForKey:@"PictureDeblock"] intValue]]];
+ }
+
+ if ([[item objectForKey:@"VideoGrayScale"] intValue] == 1)
+ {
+ pictureFiltersPresent = YES;
+ pictureFilters = [pictureFilters stringByAppendingString:@" - Grayscale"];
}
+
if (pictureFiltersPresent == YES)
{
[finalString appendString: NSLocalizedStringFromTable(@"Filters: ", @"Queue",@"") withAttributes:detailBoldAttr];
}
else // CRF
{
+ /*
videoInfo = [NSString stringWithFormat:NSLocalizedStringFromTable(@"%@ Constant Quality: %.0f %%", @"Queue",@""), videoInfo ,[[item objectForKey:@"VideoQualitySlider"] floatValue] * 100];
+ */
+ videoInfo = [NSString stringWithFormat:@"%@ Constant Quality: %.2f", videoInfo ,[[item objectForKey:@"VideoQualitySlider"] floatValue]];
}
[finalString appendString: NSLocalizedStringFromTable(@"Video: ", @"Queue",@"") withAttributes:detailBoldAttr];
}
+
/* Seventh Line Audio Details*/
+ /*
[finalString appendString: NSLocalizedStringFromTable(@"Audio Track 1: ", @"Queue",@"") withAttributes:detailBoldAttr];
[finalString appendString: audioDetail1 withAttributes:detailAttr];
[finalString appendString:@"\n" withAttributes:detailAttr];
[finalString appendString: NSLocalizedStringFromTable(@"Audio Track 4: ", @"Queue",@"") withAttributes:detailBoldAttr];
[finalString appendString: audioDetail4 withAttributes:detailAttr];
+ */
+ if ([audioDetail1 length] != 0)
+ {
+ [finalString appendString: @"Audio Track 1: " withAttributes:detailBoldAttr];
+ [finalString appendString: audioDetail1 withAttributes:detailAttr];
+ [finalString appendString:@"\n" withAttributes:detailAttr];
+ }
+
+ if ([audioDetail2 length] != 0)
+ {
+ [finalString appendString: @"Audio Track 2: " withAttributes:detailBoldAttr];
+ [finalString appendString: audioDetail2 withAttributes:detailAttr];
+ [finalString appendString:@"\n" withAttributes:detailAttr];
+ }
+
+ if ([audioDetail3 length] != 0)
+ {
+ [finalString appendString: @"Audio Track 3: " withAttributes:detailBoldAttr];
+ [finalString appendString: audioDetail3 withAttributes:detailAttr];
+ [finalString appendString:@"\n" withAttributes:detailAttr];
+ }
+
+ if ([audioDetail4 length] != 0)
+ {
+ [finalString appendString: @"Audio Track 4: " withAttributes:detailBoldAttr];
+ [finalString appendString: audioDetail4 withAttributes:detailAttr];
+ [finalString appendString:@"\n" withAttributes:detailAttr];
+ }
+ /* Eighth Line Subtitle Details */
+
+ int i = 0;
+ NSEnumerator *enumerator = [[item objectForKey:@"SubtitleList"] objectEnumerator];
+ id tempObject;
+ while (tempObject = [enumerator nextObject])
+ {
+ /* since the subtitleSourceTrackNum 0 is "None" in our array of the subtitle popups,
+ * we want to ignore it for display as well as encoding.
+ */
+ if ([[tempObject objectForKey:@"subtitleSourceTrackNum"] intValue] > 0)
+ {
+ /* remember that index 0 of Subtitles can contain "Foreign Audio Search*/
+ [finalString appendString: @"Subtitle: " withAttributes:detailBoldAttr];
+ [finalString appendString: [tempObject objectForKey:@"subtitleSourceTrackName"] withAttributes:detailAttr];
+ if ([[tempObject objectForKey:@"subtitleTrackForced"] intValue] == 1)
+ {
+ [finalString appendString: @" - Forced Only" withAttributes:detailAttr];
+ }
+ if ([[tempObject objectForKey:@"subtitleTrackBurned"] intValue] == 1)
+ {
+ [finalString appendString: @" - Burned In" withAttributes:detailAttr];
+ }
+ if ([[tempObject objectForKey:@"subtitleTrackDefault"] intValue] == 1)
+ {
+ [finalString appendString: @" - Default" withAttributes:detailAttr];
+ }
+ [finalString appendString:@"\n" withAttributes:detailAttr];
+ }
+ i++;
+ }
return finalString;
}
- (BOOL)outlineView:(NSOutlineView *)outlineView writeItems:(NSArray *)items toPasteboard:(NSPasteboard *)pboard
{
// Dragging is only allowed of the pending items.
- if ([[[fJobGroups objectAtIndex:[outlineView selectedRow]] objectForKey:@"Status"] intValue] != 2) // 2 is pending
+ if ([[[items objectAtIndex:0] objectForKey:@"Status"] integerValue] != 2) // 2 is pending
{
return NO;
}
return NSDragOperationGeneric;
}
-
-
- (BOOL)outlineView:(NSOutlineView *)outlineView acceptDrop:(id <NSDraggingInfo>)info item:(id)item childIndex:(NSInteger)index
{
- NSMutableIndexSet *moveItems = [NSMutableIndexSet indexSet];
-
- id obj;
- NSEnumerator *enumerator = [fDraggedNodes objectEnumerator];
- while (obj = [enumerator nextObject])
- {
+ NSMutableIndexSet *moveItems = [NSMutableIndexSet indexSet];
+
+ for( id obj in fDraggedNodes )
[moveItems addIndex:[fJobGroups indexOfObject:obj]];
- }
+
// Successful drop, we use moveObjectsInQueueArray:... in fHBController
// to properly rearrange the queue array, save it to plist and then send it back here.
// since Controller.mm is handling all queue array manipulation.