Hello,
I'm working on a subclass of NSCell that draws a custom style progress bar.
Everything works fine, it draws correctly and I've made the code to
make indeterminate animation (the method should be called by a timer).
So I've created a NSTimer in my NSCell subclass, but when I try to run
the program itself it only animates the last row of the table. In fact
seems only a timer is created (while I'm pretty sure that each NSCell
displayed is a different subclass because it display correctly
different data).
What's the problem in here?
... However my big question is another. If I can get this method
working I'll have n timers for n cell istances that draw a short
portion of the entire tableview. It seems to be pretty expensive... so
what? What's the correct way to update only "indeterminate" cells with
a single timer? Is there a better way.
The code below is my class.



#define DEFAULT_PROGRESSBAR_LEN 100
#define DEFAULT_PROGRESSBAR_HEG 12

@implementation WGUICell_ProgressBar

- (id) init
{
        self = [super init];
        if (self != nil) {
                [self setIndeterminate: YES];
                _bar_width = DEFAULT_PROGRESSBAR_LEN;
                _bar_height = DEFAULT_PROGRESSBAR_HEG;
                _bar_includeCloseButton = YES;
                _bar_maxValue = 100.0;
                _bar_currentValue = 75.0;
        }
        return self;
}

- (void) setDoubleValue:(double) _val {
        if (_val > _bar_maxValue) _val = _bar_maxValue;
        _bar_currentValue = _val;
}

- (void) setMaxValue:(double) _max {
        _bar_maxValue = _max;
}

- (BOOL) isIndetermimate {
        return _indeterminate;
}

- (void) setIndeterminate:(BOOL) _ind {
        _indeterminate = _ind;
        if (!_ind) {
                [_timer invalidate];
        } else {
                _stepOfIndeterminate = 0;
                _timer = [[NSTimer scheduledTimerWithTimeInterval:2
                                                                                
                   target:self
                                                                                
                 selector:@selector(_updateIndeterminateProgress)
                                                                                
                 userInfo:nil repeats:YES] retain];
                [ ((WGUITorrents_Table*)[self controlView]) 
_changeProgressBarsStyle];
                
        }
}

#define BAR_WIDTH 100

- (NSRect) progressBarRect {
        return _barRect;
}

- (void) _updateIndeterminateProgress {
        NSLog(@"refresh %@",self);
        [[self controlView] setNeedsDisplayInRect: _barRect];
        //      [[self controlView] setNeedsDisplay: YES];
        
        _stepOfIndeterminate++;
}

- (void) setRepresentedObject:(id) _obj forColumn:(NSTableColumn *) _col {
        [_representedObj release];
        _representedObj = [_obj retain];
}


- (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView {
        
        // the point where the progress bar starts
        NSPoint originBar = NSMakePoint(cellFrame.origin.x+75, 
cellFrame.origin.y+19);
        
        // draw bar itself
        NSImage *backgroundStructure = [self _createProgressBarStructure];
        NSRect barRect = NSMakeRect(originBar.x, originBar.y, BAR_WIDTH, 12);
        _barRect = barRect;
        [backgroundStructure drawInRect: barRect fromRect:NSZeroRect
operation:NSCompositeSourceOver fraction:1.0];
        
        if (!_indeterminate) {  
                NSImage *progression_value = [self 
_drawDeterminateProgressBarValue: barRect];
                NSRect _fillRect = NSMakeRect(originBar.x, originBar.y,
[progression_value size].width, _bar_height);
                [progression_value setFlipped:YES];     
                [progression_value drawInRect: _fillRect
                                                         fromRect:NSZeroRect 
operation:NSCompositeSourceOver fraction:1.0];
        } else {
                NSImage *indeterminateProgression = [self _drawIndetermination];
                NSRect _fillRect = NSMakeRect(originBar.x+1, originBar.y+1,
[indeterminateProgression size].width, [indeterminateProgression
size].height);
                [indeterminateProgression setFlipped:YES];      
                [indeterminateProgression drawInRect: _fillRect
                                                                        
fromRect:NSZeroRect operation:NSCompositeSourceOver fraction:1.0];
        }
        
        
}

- (NSImage *) _drawIndetermination {
        NSImage *_double_prog = [[NSImage alloc] initWithSize: NSMakeSize(
(_bar_width*2)-2, _bar_height-2)];
        [_double_prog lockFocus];
        [[NSColor colorWithPatternImage: [NSImage
imageNamed:@"ind_progressbar.png"]] set];
        NSBezierPath *p =[NSBezierPath bezierPathWithRect: NSMakeRect(0, 0,
(_bar_width*2)-2, _bar_height-2)];
        [p fill];
        [_double_prog unlockFocus];
        
        NSImage *_portionVisible = [[NSImage alloc]
initWithSize:NSMakeSize(_bar_width-2, _bar_height-2)];
        [_portionVisible lockFocus];
        
        // back to the start of animation
        if (_stepOfIndeterminate == _bar_width)
                _stepOfIndeterminate = 0;
        
        NSRect _portionsToPutInVisible = NSMakeRect(_stepOfIndeterminate, 0,
_bar_width-2, _bar_height-2);
        [_double_prog setFlipped:YES];
        [_double_prog drawInRect: NSMakeRect(0, 0, _bar_width-2, _bar_height-2)
                                        fromRect:_portionsToPutInVisible 
operation:NSCompositeSourceOver
fraction:1.0];
        [_portionVisible unlockFocus];
        [_double_prog release];
        return [_portionVisible autorelease];
        /*
         NSImage *prog = [[NSImage alloc]
initWithSize:NSMakeSize(_bar_width-2, _bar_height-2)];
         [prog lockFocus];
         NSColor *c = [NSColor colorWithPatternImage:[NSImage
imageNamed:@"ProgressIndeterminate.png"]];
         [c set];
         NSBezierPath *p =[NSBezierPath bezierPathWithRect:
         NSMakeRect(0, 0, _bar_width, _bar_height)];
         [p fill];
         [prog unlockFocus];
         return [prog autorelease];*/
}

- (NSImage *) _drawDeterminateProgressBarValue:(NSRect ) _barRect {
        // x = (valore / valore max) * lungh barra
        // x = (_bar_currentValue / _bar_maxValue)*_bar_width
        double x_progressWidth = (_bar_currentValue/_bar_maxValue)*_bar_width;
        NSImage *prog = [[NSImage alloc]
initWithSize:NSMakeSize(x_progressWidth, _bar_height)];
        [prog lockFocus];
        [[NSColor colorWithPatternImage:[NSImage
imageNamed:@"ProgressBlue12.png"]] set];
        NSBezierPath *p = [NSBezierPath bezierPathWithRect:NSMakeRect(0, 0,
x_progressWidth, _bar_height)];
        [p fill];
        [prog unlockFocus];
        return [prog autorelease];
}

-copyWithZone:(NSZone *)zone
{
        WGUICell_ProgressBar *cell = (WGUICell_ProgressBar *)[super 
copyWithZone:zone];
        cell->_representedObj = [_representedObj retain];
        cell->_timer = [_timer retain];
        cell->_closeButtonRect = _closeButtonRect;
        cell->_bar_currentValue = _bar_currentValue;
        cell->_bar_maxValue =_bar_maxValue;
        cell->_bar_width =_bar_width;
        cell->_bar_height =_bar_height;
        cell->_bar_includeCloseButton =_bar_includeCloseButton;
        //      cell->_indeterminate =_indeterminate;
        //cell->_barRect =_barRect;
        //      cell->_stepOfIndeterminate =_stepOfIndeterminate;
        
        
        return cell;
}

- (NSImage *) _createProgressBarStructure {
        // create offscreen structure
        NSImage *back = [[NSImage alloc] initWithSize:NSMakeSize(_bar_width,
_bar_height)];
        [back lockFocus];
        
        // draw background in the middle
        NSColor *middle_progressbarImg = [NSColor
colorWithPatternImage:[NSImage imageNamed:@"middle_progressbar.png"]];
        [middle_progressbarImg set];
        NSBezierPath *p = [NSBezierPath bezierPathWithRect: NSMakeRect(1, 0,
_bar_width-1, _bar_height)];
        [p fill];
        
        NSImage *lbar = [NSImage imageNamed:@"end_progressbar.png"];
        // left start part
        [lbar setFlipped:YES];
        [lbar drawInRect: NSMakeRect(0,0, 1, _bar_height)
                        fromRect:NSZeroRect operation:NSCompositeSourceOver 
fraction:1.0];
        
        // right end part
        [lbar setFlipped:NO];
        [lbar drawInRect: NSMakeRect(_bar_width-1, 0, 1, _bar_height)
                        fromRect:NSZeroRect operation:NSCompositeSourceOver 
fraction:1.0];
        [back unlockFocus];     
        return [back autorelease];
}


@end
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to arch...@mail-archive.com

Reply via email to