Add support for custom attributes to wxOSX/Cocoa wxDataViewCustomRenderer.
Virtualize applying the attributes in a new OSXApplyAttr() function and simply store the attribute in its wxDataViewCustomRenderer version so that it could be reused later in Render(). The attributes now work correctly in wxOSX/Cocoa dataview sample too. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62599 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -83,6 +83,10 @@ public:
|
|||||||
virtual void OSXOnCellChanged(NSObject *value,
|
virtual void OSXOnCellChanged(NSObject *value,
|
||||||
const wxDataViewItem& item,
|
const wxDataViewItem& item,
|
||||||
unsigned col);
|
unsigned col);
|
||||||
|
|
||||||
|
// called to ensure that the given attribute will be used for rendering the
|
||||||
|
// next cell (which had been already associated with this renderer before)
|
||||||
|
virtual void OSXApplyAttr(const wxDataViewItemAttr& attr);
|
||||||
#endif // Cocoa
|
#endif // Cocoa
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@@ -30,6 +30,8 @@ public:
|
|||||||
|
|
||||||
virtual bool MacRender();
|
virtual bool MacRender();
|
||||||
|
|
||||||
|
virtual void OSXApplyAttr(const wxDataViewItemAttr& attr);
|
||||||
|
|
||||||
virtual wxDC* GetDC(); // creates a device context and keeps it
|
virtual wxDC* GetDC(); // creates a device context and keeps it
|
||||||
void SetDC(wxDC* newDCPtr); // this method takes ownership of the pointer
|
void SetDC(wxDC* newDCPtr); // this method takes ownership of the pointer
|
||||||
|
|
||||||
|
@@ -1592,9 +1592,9 @@ outlineView:(NSOutlineView*)outlineView
|
|||||||
}
|
}
|
||||||
|
|
||||||
-(void) outlineView:(wxCocoaOutlineView*)outlineView
|
-(void) outlineView:(wxCocoaOutlineView*)outlineView
|
||||||
willDisplayCell:(id)cell
|
willDisplayCell:(id)cell
|
||||||
forTableColumn:(NSTableColumn*)tableColumn
|
forTableColumn:(NSTableColumn*)tableColumn
|
||||||
item:(id)item
|
item:(id)item
|
||||||
{
|
{
|
||||||
wxDataViewCtrl * const dvc = implementation->GetDataViewCtrl();
|
wxDataViewCtrl * const dvc = implementation->GetDataViewCtrl();
|
||||||
wxDataViewModel * const model = dvc->GetModel();
|
wxDataViewModel * const model = dvc->GetModel();
|
||||||
@@ -1614,77 +1614,19 @@ item:(id)item
|
|||||||
wxDataViewRenderer * const renderer = dvCol->GetRenderer();
|
wxDataViewRenderer * const renderer = dvCol->GetRenderer();
|
||||||
wxDataViewRendererNativeData * const data = renderer->GetNativeData();
|
wxDataViewRendererNativeData * const data = renderer->GetNativeData();
|
||||||
|
|
||||||
// set the font and text colour to use: we need to do it if we had ever
|
// let the renderer know about what it's going to render next
|
||||||
// changed them before, even if this item itself doesn't have any special
|
|
||||||
// attributes as otherwise it would reuse the attributes from the previous
|
|
||||||
// cell rendered using the same renderer
|
|
||||||
NSFont *font = NULL;
|
|
||||||
NSColor *colText = NULL;
|
|
||||||
|
|
||||||
wxDataViewItemAttr attr;
|
|
||||||
if ( model && model->GetAttr(dvItem, colIdx, attr) )
|
|
||||||
{
|
|
||||||
if ( attr.HasFont() )
|
|
||||||
{
|
|
||||||
font = data->GetOriginalFont();
|
|
||||||
if ( !font )
|
|
||||||
{
|
|
||||||
// this is the first time we're setting the font, remember the
|
|
||||||
// original one before changing it
|
|
||||||
font = [cell font];
|
|
||||||
data->SaveOriginalFont(font);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( font )
|
|
||||||
{
|
|
||||||
// FIXME: using wxFont methods here doesn't work for some reason
|
|
||||||
NSFontManager * const fm = [NSFontManager sharedFontManager];
|
|
||||||
if ( attr.GetBold() )
|
|
||||||
font = [fm convertFont:font toHaveTrait:NSBoldFontMask];
|
|
||||||
if ( attr.GetItalic() )
|
|
||||||
font = [fm convertFont:font toHaveTrait:NSItalicFontMask];
|
|
||||||
}
|
|
||||||
//else: can't change font if the cell doesn't have any
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( attr.HasColour() )
|
|
||||||
{
|
|
||||||
// we can set font for any cell but only NSTextFieldCell provides
|
|
||||||
// a method for setting text colour so check that this method is
|
|
||||||
// available before using it
|
|
||||||
if ( [cell respondsToSelector:@selector(setTextColor:)] &&
|
|
||||||
[cell respondsToSelector:@selector(textColor)] )
|
|
||||||
{
|
|
||||||
if ( !data->GetOriginalTextColour() )
|
|
||||||
{
|
|
||||||
data->SaveOriginalTextColour([cell textColor]);
|
|
||||||
}
|
|
||||||
|
|
||||||
const wxColour& c = attr.GetColour();
|
|
||||||
colText = [NSColor colorWithDeviceRed:c.Red() / 255.
|
|
||||||
green:c.Green() / 255.
|
|
||||||
blue:c.Blue() / 255.
|
|
||||||
alpha:c.Alpha() / 255.];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( !font )
|
|
||||||
font = data->GetOriginalFont();
|
|
||||||
if ( !colText )
|
|
||||||
colText = data->GetOriginalTextColour();
|
|
||||||
|
|
||||||
if ( font )
|
|
||||||
[cell setFont:font];
|
|
||||||
|
|
||||||
if ( colText )
|
|
||||||
[cell setTextColor:colText];
|
|
||||||
|
|
||||||
|
|
||||||
data->SetColumnPtr(tableColumn);
|
data->SetColumnPtr(tableColumn);
|
||||||
data->SetItem(item);
|
data->SetItem(item);
|
||||||
data->SetItemCell(cell);
|
data->SetItemCell(cell);
|
||||||
|
|
||||||
|
// use the attributes: notice that we need to do this whether we have them
|
||||||
|
// or not as even if this cell doesn't have any attributes, the previous
|
||||||
|
// one might have had some and then we need to reset them back to default
|
||||||
|
wxDataViewItemAttr attr;
|
||||||
|
model->GetAttr(dvItem, colIdx, attr);
|
||||||
|
renderer->OSXApplyAttr(attr);
|
||||||
|
|
||||||
|
// and finally do draw it
|
||||||
renderer->MacRender();
|
renderer->MacRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2377,6 +2319,75 @@ wxDataViewRenderer::OSXOnCellChanged(NSObject *object,
|
|||||||
model->ChangeValue(value, item, col);
|
model->ChangeValue(value, item, col);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewRenderer::OSXApplyAttr(const wxDataViewItemAttr& attr)
|
||||||
|
{
|
||||||
|
wxDataViewRendererNativeData * const data = GetNativeData();
|
||||||
|
NSCell * const cell = data->GetItemCell();
|
||||||
|
|
||||||
|
// set the font and text colour to use: we need to do it if we had ever
|
||||||
|
// changed them before, even if this item itself doesn't have any special
|
||||||
|
// attributes as otherwise it would reuse the attributes from the previous
|
||||||
|
// cell rendered using the same renderer
|
||||||
|
NSFont *font = NULL;
|
||||||
|
NSColor *colText = NULL;
|
||||||
|
|
||||||
|
if ( attr.HasFont() )
|
||||||
|
{
|
||||||
|
font = data->GetOriginalFont();
|
||||||
|
if ( !font )
|
||||||
|
{
|
||||||
|
// this is the first time we're setting the font, remember the
|
||||||
|
// original one before changing it
|
||||||
|
font = [cell font];
|
||||||
|
data->SaveOriginalFont(font);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( font )
|
||||||
|
{
|
||||||
|
// FIXME: using wxFont methods here doesn't work for some reason
|
||||||
|
NSFontManager * const fm = [NSFontManager sharedFontManager];
|
||||||
|
if ( attr.GetBold() )
|
||||||
|
font = [fm convertFont:font toHaveTrait:NSBoldFontMask];
|
||||||
|
if ( attr.GetItalic() )
|
||||||
|
font = [fm convertFont:font toHaveTrait:NSItalicFontMask];
|
||||||
|
}
|
||||||
|
//else: can't change font if the cell doesn't have any
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( attr.HasColour() )
|
||||||
|
{
|
||||||
|
// we can set font for any cell but only NSTextFieldCell provides
|
||||||
|
// a method for setting text colour so check that this method is
|
||||||
|
// available before using it
|
||||||
|
if ( [cell respondsToSelector:@selector(setTextColor:)] &&
|
||||||
|
[cell respondsToSelector:@selector(textColor)] )
|
||||||
|
{
|
||||||
|
if ( !data->GetOriginalTextColour() )
|
||||||
|
{
|
||||||
|
// the cast to (untyped) id is safe because of the check above
|
||||||
|
data->SaveOriginalTextColour([(id)cell textColor]);
|
||||||
|
}
|
||||||
|
|
||||||
|
const wxColour& c = attr.GetColour();
|
||||||
|
colText = [NSColor colorWithDeviceRed:c.Red() / 255.
|
||||||
|
green:c.Green() / 255.
|
||||||
|
blue:c.Blue() / 255.
|
||||||
|
alpha:c.Alpha() / 255.];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( !font )
|
||||||
|
font = data->GetOriginalFont();
|
||||||
|
if ( !colText )
|
||||||
|
colText = data->GetOriginalTextColour();
|
||||||
|
|
||||||
|
if ( font )
|
||||||
|
[cell setFont:font];
|
||||||
|
|
||||||
|
if ( colText )
|
||||||
|
[(id)cell setTextColor:colText];
|
||||||
|
}
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
|
IMPLEMENT_ABSTRACT_CLASS(wxDataViewRenderer,wxDataViewRendererBase)
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
@@ -2398,6 +2409,18 @@ bool wxDataViewCustomRenderer::MacRender()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void wxDataViewCustomRenderer::OSXApplyAttr(const wxDataViewItemAttr& attr)
|
||||||
|
{
|
||||||
|
// simply save the attribute so that it could be reused from our Render()
|
||||||
|
SetAttr(attr);
|
||||||
|
|
||||||
|
// it's not necessary to call the base class version which sets the cell
|
||||||
|
// properties to correspond to this attribute because we currently don't
|
||||||
|
// use any NSCell methods in custom renderers anyhow but if we ever start
|
||||||
|
// doing this (e.g. override RenderText() here to use NSTextFieldCell
|
||||||
|
// methods), then we should pass it on to wxDataViewRenderer here
|
||||||
|
}
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
|
IMPLEMENT_ABSTRACT_CLASS(wxDataViewCustomRenderer, wxDataViewRenderer)
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user