OSDN Git Service

merge 0.9.4 to jp
[handbrake-jp/handbrake-jp.git] / macosx / HBQueueController.mm
index f1bd261..83fcbb2 100644 (file)
@@ -142,9 +142,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
      */
     
        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
@@ -478,12 +476,14 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
 - (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
@@ -491,7 +491,7 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
        [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];
         
@@ -582,14 +582,20 @@ static NSString*    HBQueuePauseResumeToolbarIdentifier       = @"HBQueuePauseRe
 - (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 -
@@ -743,6 +749,12 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
 {
     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
@@ -750,8 +762,8 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         // 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,
@@ -759,14 +771,114 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         // 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
@@ -855,20 +967,35 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         [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"];
             }
         }
         
@@ -892,10 +1019,10 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         /* 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"]];
@@ -906,7 +1033,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
                             [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"]];
             }
@@ -926,7 +1053,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
                             [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"]];
             }
@@ -946,7 +1073,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
                             [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"]];
             }
@@ -966,7 +1093,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
                             [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"]];
             }
@@ -1039,6 +1166,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         
         NSString * pictureFilters = @"";
         BOOL pictureFiltersPresent = NO;
+       /*
         if( [[item objectForKey:@"VFR"] intValue] == 1)
         {
             pictureFiltersPresent = YES;
@@ -1048,19 +1176,27 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         {
             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)
@@ -1070,14 +1206,50 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
             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)
@@ -1087,14 +1259,38 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
             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];
@@ -1136,7 +1332,10 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         }
         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];
@@ -1151,7 +1350,9 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         }
         
         
+        
         /* Seventh Line Audio Details*/
+       /*
         [finalString appendString: NSLocalizedStringFromTable(@"Audio Track 1: ", @"Queue",@"") withAttributes:detailBoldAttr];
         [finalString appendString: audioDetail1 withAttributes:detailAttr];
         [finalString appendString:@"\n" withAttributes:detailAttr];
@@ -1166,6 +1367,65 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
         
         [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;
     }
@@ -1257,7 +1517,7 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
 - (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;
     }
@@ -1307,18 +1567,13 @@ return ![(HBQueueOutlineView*)outlineView isDragging];
     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.