Ticket #2352: PiecesView.diff

File PiecesView.diff, 5.9 KB (added by mortennorby, 13 years ago)
  • PiecesView.h

     
    2828
    2929@interface PiecesView : NSImageView
    3030{
    31     int8_t  * fPieces;
     31    int8_t  * fPieces, * fPercentProgressFlashes;
     32       
     33        float   * fPrevPiecesPercent;
    3234   
    3335    NSImage * fBack;
    34     NSColor * fGreenAvailabilityColor, * fBluePieceColor;
     36    NSColor * fGreenAvailabilityColor, * fBluePieceColor, * fPercentProgressColor1, * fPercentProgressColor2;
    3537   
    3638    Torrent * fTorrent;
    3739    NSInteger fNumPieces, fAcross, fWidth, fExtraBorder;
     40       
     41        BOOL prevShowAvailability;
    3842}
    3943
    4044- (void) setTorrent: (Torrent *) torrent;
  • PiecesView.m

     
    5555    //store box colors
    5656    fGreenAvailabilityColor = [[NSColor colorWithCalibratedRed: 0.0f green: 1.0f blue: 0.4f alpha: 1.0f] retain];
    5757    fBluePieceColor = [[NSColor colorWithCalibratedRed: 0.0f green: 0.4f blue: 0.8f alpha: 1.0f] retain];
    58            
     58               
     59        fPercentProgressColor1 = [[NSColor colorWithCalibratedRed: 0.925f green: 0.925f blue: 0.170f alpha: 1.0f] retain];
     60        fPercentProgressColor2 = [[NSColor colorWithCalibratedRed: 0.95f green: 0.95f blue: 0.176f alpha: 1.0f] retain];       
     61       
    5962    //actually draw the box
    6063    [self setTorrent: nil];
    6164}
     
    6366- (void) dealloc
    6467{
    6568    tr_free(fPieces);
    66    
     69        tr_free(fPrevPiecesPercent);
     70               
    6771    [fBack release];
    6872   
    6973    [fGreenAvailabilityColor release];
    7074    [fBluePieceColor release];
     75    [fPercentProgressColor1 release];
     76    [fPercentProgressColor2 release];
    7177   
    7278    [super dealloc];
    7379}
     
    99105- (void) clearView
    100106{
    101107    tr_free(fPieces);
     108        tr_free(fPrevPiecesPercent);
     109       
    102110    fPieces = NULL;
     111        fPrevPiecesPercent = NULL;
    103112}
    104113
    105114- (void) updateView
    106115{
    107116    if (!fTorrent)
    108117        return;
     118           
     119    int8_t * pieces = NULL;
     120    float * piecesPercent = NULL;
     121           
     122    BOOL showAvailablity = [[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"];
     123       
     124        if (showAvailablity)
     125    {   
     126                pieces = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t));
     127                [fTorrent getAvailability: pieces size: fNumPieces];
     128    }
     129    else
     130    {   
     131                piecesPercent = (float *)tr_malloc(fNumPieces * sizeof(float));
     132                [fTorrent getAmountFinished: piecesPercent size: fNumPieces];
     133    }
    109134   
    110135    //determine if first time
    111136    BOOL first = NO;
    112137    if (!fPieces)
    113138    {
    114139        fPieces = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t));
     140        fPercentProgressFlashes = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t));
     141                fPrevPiecesPercent = (float *)tr_malloc(fNumPieces * sizeof(float));
     142               
    115143        first = YES;
    116144    }
    117145
    118     int8_t * pieces = NULL;
    119     float * piecesPercent = NULL;
    120    
    121     BOOL showAvailablity = [[NSUserDefaults standardUserDefaults] boolForKey: @"PiecesViewShowAvailability"];
    122     if (showAvailablity)
    123     {   
    124         pieces = (int8_t *)tr_malloc(fNumPieces * sizeof(int8_t));
    125         [fTorrent getAvailability: pieces size: fNumPieces];
    126     }
    127     else
    128     {   
    129         piecesPercent = (float *)tr_malloc(fNumPieces * sizeof(float));
    130         [fTorrent getAmountFinished: piecesPercent size: fNumPieces];
    131     }
    132    
     146        if ( first || !showAvailablity && prevShowAvailability  ) {
     147                // First run after switching view from availability to progress
     148                // (or first run altogether) so previous pieces are set to 100%
     149                // to avoid a huge flash of yellow.
     150                for ( int i = 0; i < fNumPieces; i++ ) {
     151                        fPrevPiecesPercent[i] = 1.0f;
     152                }
     153        }
     154       
    133155    NSImage * image = [self image];
    134156   
    135157    NSInteger index = -1;
    136158    NSRect rect = NSMakeRect(0, 0, fWidth, fWidth);
     159
    137160    BOOL change = NO;
    138    
     161       
    139162    for (NSInteger i = 0; i < fAcross; i++)
    140163        for (NSInteger j = 0; j < fAcross; j++)
    141164        {
     
    147170            }
    148171           
    149172            NSColor * pieceColor = nil;
     173                        NSColor * percentProgressColor = nil;
    150174           
    151175            if (showAvailablity ? pieces[index] == -1 : piecesPercent[index] == 1.0f)
    152176            {
     
    188212                pieceColor = [[NSColor whiteColor] blendedColorWithFraction: percent ofColor: fullColor];
    189213                fPieces[index] = PIECE_SOME;
    190214            }
     215                       
     216                        // Determine if there is progress compared to the previous run
     217                        if ( !showAvailablity && ( piecesPercent[index] > fPrevPiecesPercent[index] ) )
     218                        {
     219                                if ( ++fPercentProgressFlashes[index] % 2 ) {
     220                                        percentProgressColor = fPercentProgressColor1;
     221                                }
     222                                else {
     223                                        percentProgressColor = fPercentProgressColor2;
     224                                }                               
     225                        }
     226                        else {
     227                                fPercentProgressFlashes[index] = 0;
     228                        }
    191229           
    192230            if (pieceColor)
    193231            {
     
    197235                    change = YES;
    198236                    [image lockFocus];
    199237                }
     238                               
     239                                rect.origin = NSMakePoint(j * (fWidth + BETWEEN) + BETWEEN + fExtraBorder,
     240                                                                                  [image size].width - (i + 1) * (fWidth + BETWEEN) - fExtraBorder);
    200241               
    201                 rect.origin = NSMakePoint(j * (fWidth + BETWEEN) + BETWEEN + fExtraBorder,
    202                                         [image size].width - (i + 1) * (fWidth + BETWEEN) - fExtraBorder);
    203                
    204                 [pieceColor set];
    205                 NSRectFill(rect);
     242                                [pieceColor set];
     243                                NSRectFill(rect);
     244                               
     245                                if ( percentProgressColor && fPieces[index] != PIECE_FLASHING )
     246                                {
     247                                        [percentProgressColor set];
     248                                        NSRectFill(rect);
     249                                }
    206250            }
    207251        }
    208252   
     
    211255        [image unlockFocus];
    212256        [self setNeedsDisplay];
    213257    }
    214    
     258       
     259        if ( !showAvailablity ) {
     260                memcpy(fPrevPiecesPercent,  piecesPercent, fNumPieces * sizeof(float));
     261        }
     262
    215263    tr_free(pieces);
    216264    tr_free(piecesPercent);
     265       
     266        prevShowAvailability = showAvailablity;
    217267}
    218268
    219269- (BOOL) acceptsFirstMouse: (NSEvent *) event