On 31 Aug 2010, at 17:03, Patrick Mau wrote:

> Hallo Fritz
> 
> Thanks a lot for your comments. I just have a few remarks to clarify what I 
> meant.
> Please see below.
> 
> On 31.08.2010, at 17:26, Fritz Anderson wrote:
> 
>> On 31 Aug 2010, at 4:59 AM, Patrick Mau wrote:
>> 
>>> Let's assume I have a custom NSView that will use to custom NSCell 
>>> instances to render its contents.
>>> Now, if "drawRect:" is called on the NSView, I get the dirty rect that 
>>> needs to be redrawn.
>>> 
>>> The NSCell class on the other hands uses:
>>> 
>>> - (void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
>>> 
>>> Where "cellFrame" is the complete frame the NSCell should use to draw 
>>> itself into.
>>> 
>>> Should I intersect the dirty region of the NSView and somehow add additional
>>> functionality to the NSCell to maintain the dirty region?
>>> 
>>> Or should I ask the "controlView" for the region and maintain it there?
>>> 
>>> How do people implement NSCell subclasses when the goal is to minimize
>>> the redraw code needed when the cell is drawn?
>> 
>> I'm not sure if this fully answers your question, but cells are extremely 
>> lightweight things that know how to draw themselves, receive mouse events, 
>> and keep a limited amount of state about appearance and value. They are 
>> owned by NSViews, which squirt the cells onto the screen wherever they are 
>> wanted. Cells don't know anything about view management, such as dirty 
>> rects. They don't know anything about their positions or sizes. They don't 
>> even know what views own them. 
> 
> I understand that. But by the time the they should redraw, they know the 
> NSView they belong to and the cellSize they need to
> layout themeselves in. If a NSView decides to draw them inside "drawRect:", 
> it would call the NSCell's drawing code passing
> the frame and possible itself as the control view.
> 
>> The rectangle passed into the NSCell draw… methods is the full frame of the 
>> cell; it's the only way the cell has of knowing how to lay itself out. It 
>> shouldn't have to know about its dirty region. That imports view-management 
>> behavior into the cell, and not doing view-management is the whole point of 
>> having a cell. Do what you like, but you'd be fighting the framework.
> 
>> I don't know what you mean by "should I intersect…." Do you mean whether you 
>> should _calculate_ an intersection rectangle and pass that into the API? No. 
>> The cell can't use that information. Do you mean whether you should take the 
>> rectangle passed into drawRect:, iterate through the cell frames (a list 
>> _your view_ keeps), and draw only the ones that intersect the dirty rect, 
>> however little? Yes, you should.
> 
> Let's just assume that when my NSView calculates that only halve of the 
> NSCell's frame intersects the dirty rect,
> it should somehow share that information with the NSCell's implementation of 
> the actual drawing code.
> 
> So, my question was trying to focus on best practices of how to tell the 
> NSCell's "drawWithFrame" that
> it should draw itself in the cellFrame, but also reduce the drawing 
> complexity by having access to the NSViews's
> dirty region that triggered the call in the first place.
> 
> I could just provide a property of type NSRect in the controlView and set 
> this to the intersecting
> rectangle of the dirty area and the cellFrame.
> 
> The cell would than use that property inside "drawWithFrame" for optimization.
> 
> But this seems ugly to me, because every NSView that would use any of my cells
> would have to provide that property. This is wrong, in my opinion.
> 
> I also know that I can clip drawing regions, but what I really want to do is 
> minimize draw calls.
> 
> By the way, my NSCell draws parts of a bar chart and therefore it would be 
> great to know which
> bars are affected by the dirtied region that needs redrawing. It would reduce 
> a lot of elements
> I would otherwise at to an NSBezierPath.
> 
> I'm not asking for code here, I have most of it working already, but it 
> always redraws the complete cell.
> Any comments or sharing of ideas would be greatly appreciated.

I think you want to look at -controlView/-setControlView. The default NSCell 
implementation of these methods does nothing, but you can override to store a 
reference to the control view, and get dirty rect etc. info out of that.

Mike._______________________________________________

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