Allow custom wxDataViewCtrl renderers to easily use attributes.
Set up the DC passed to wxDataViewCustomRenderer::Render() to use the font and colour defined by the item attribute by default so that any calls to RenderText() from it will use them automatically. Also added public wxDataViewCustomRenderer::GetAttr() to allow retrieving the attribute explicitly in Render(). The column using custom renderer in the dataview sample now works as expected in the generic version; the native ones will be corrected in the upcoming commits. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@62590 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -109,13 +109,16 @@ public:
|
|||||||
void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; }
|
void SetOwner( wxDataViewColumn *owner ) { m_owner = owner; }
|
||||||
wxDataViewColumn* GetOwner() const { return m_owner; }
|
wxDataViewColumn* GetOwner() const { return m_owner; }
|
||||||
|
|
||||||
// renderer properties:
|
// renderer value and attributes: SetValue() and SetAttr() are called
|
||||||
|
// before a cell is rendered using this renderer
|
||||||
|
virtual bool SetValue(const wxVariant& value) = 0;
|
||||||
|
virtual bool GetValue(wxVariant& value) const = 0;
|
||||||
|
|
||||||
virtual bool SetValue( const wxVariant& WXUNUSED(value) ) = 0;
|
virtual void SetAttr(const wxDataViewItemAttr& WXUNUSED(attr)) { }
|
||||||
virtual bool GetValue( wxVariant& WXUNUSED(value) ) const = 0;
|
|
||||||
|
|
||||||
wxString GetVariantType() const { return m_variantType; }
|
wxString GetVariantType() const { return m_variantType; }
|
||||||
|
|
||||||
|
// renderer properties:
|
||||||
virtual void SetMode( wxDataViewCellMode mode ) = 0;
|
virtual void SetMode( wxDataViewCellMode mode ) = 0;
|
||||||
virtual wxDataViewCellMode GetMode() const = 0;
|
virtual wxDataViewCellMode GetMode() const = 0;
|
||||||
|
|
||||||
@@ -204,6 +207,12 @@ public:
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Render the item using the current value (returned by GetValue()).
|
||||||
|
virtual bool Render(wxRect cell, wxDC *dc, int state) = 0;
|
||||||
|
|
||||||
|
// Return the size of the item appropriate to its current value.
|
||||||
|
virtual wxSize GetSize() const = 0;
|
||||||
|
|
||||||
// Define virtual function which are called when the item is activated
|
// Define virtual function which are called when the item is activated
|
||||||
// (double-clicked or Enter is pressed on it), clicked or the user starts
|
// (double-clicked or Enter is pressed on it), clicked or the user starts
|
||||||
// to drag it: by default they all simply return false indicating that the
|
// to drag it: by default they all simply return false indicating that the
|
||||||
@@ -230,7 +239,34 @@ public:
|
|||||||
{ return false; }
|
{ return false; }
|
||||||
|
|
||||||
|
|
||||||
|
// Helper which can be used by Render() implementation in the derived
|
||||||
|
// classes: it will draw the text in the same manner as the standard
|
||||||
|
// renderers do.
|
||||||
|
virtual void RenderText(const wxString& text,
|
||||||
|
int xoffset,
|
||||||
|
wxRect cell,
|
||||||
|
wxDC *dc,
|
||||||
|
int state);
|
||||||
|
|
||||||
|
|
||||||
|
// Override the base class virtual method to simply store the attribute so
|
||||||
|
// that it can be accessed using GetAttr() from Render() if needed.
|
||||||
|
virtual void SetAttr(const wxDataViewItemAttr& attr) { m_attr = attr; }
|
||||||
|
const wxDataViewItemAttr& GetAttr() const { return m_attr; }
|
||||||
|
|
||||||
|
|
||||||
|
// Implementation only from now on
|
||||||
|
|
||||||
|
// Retrieve the DC to use for drawing. This is implemented in derived
|
||||||
|
// platform-specific classes.
|
||||||
|
virtual wxDC *GetDC() = 0;
|
||||||
|
|
||||||
|
// Prepare DC to use attributes and call Render().
|
||||||
|
void WXCallRender(wxRect rect, wxDC *dc, int state);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
wxDataViewItemAttr m_attr;
|
||||||
|
|
||||||
wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase);
|
wxDECLARE_NO_COPY_CLASS(wxDataViewCustomRendererBase);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@@ -24,43 +24,8 @@ public:
|
|||||||
int align = wxDVR_DEFAULT_ALIGNMENT );
|
int align = wxDVR_DEFAULT_ALIGNMENT );
|
||||||
virtual ~wxDataViewRenderer();
|
virtual ~wxDataViewRenderer();
|
||||||
|
|
||||||
// these methods are used to draw the cell contents, Render() doesn't care
|
|
||||||
// about the attributes while RenderWithAttr() does -- override it if you
|
|
||||||
// want to take the attributes defined for this cell into account, otherwise
|
|
||||||
// overriding Render() is enough
|
|
||||||
virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0;
|
|
||||||
|
|
||||||
// NB: RenderWithAttr() also has more standard parameter order and types
|
|
||||||
virtual bool
|
|
||||||
RenderWithAttr(wxDC& dc,
|
|
||||||
const wxRect& rect,
|
|
||||||
int align, // combination of horizontal and vertical
|
|
||||||
const wxDataViewItemAttr *attr, // may be NULL if none
|
|
||||||
int state);
|
|
||||||
|
|
||||||
virtual wxSize GetSize() const = 0;
|
|
||||||
virtual wxDC *GetDC();
|
virtual wxDC *GetDC();
|
||||||
|
|
||||||
// Draw the text using the provided attributes
|
|
||||||
void RenderText(wxDC& dc,
|
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxString& text,
|
|
||||||
const wxDataViewItemAttr *attr, // may be NULL if none
|
|
||||||
int state,
|
|
||||||
int xoffset = 0);
|
|
||||||
|
|
||||||
// Overload using standard attributes
|
|
||||||
void RenderText(const wxString& text,
|
|
||||||
int xoffset,
|
|
||||||
wxRect cell,
|
|
||||||
wxDC *dc,
|
|
||||||
int state)
|
|
||||||
{
|
|
||||||
RenderText(*dc, cell, wxALIGN_NOT, text, NULL, state, xoffset);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
virtual void SetAlignment( int align );
|
virtual void SetAlignment( int align );
|
||||||
virtual int GetAlignment() const;
|
virtual int GetAlignment() const;
|
||||||
|
|
||||||
@@ -75,7 +40,6 @@ public:
|
|||||||
{ return m_mode; }
|
{ return m_mode; }
|
||||||
|
|
||||||
// implementation
|
// implementation
|
||||||
int CalculateAlignment() const;
|
|
||||||
|
|
||||||
// this is a replacement for dynamic_cast<wxDataViewCustomRenderer> in the
|
// this is a replacement for dynamic_cast<wxDataViewCustomRenderer> in the
|
||||||
// code checking whether the renderer is interested in mouse events, it's
|
// code checking whether the renderer is interested in mouse events, it's
|
||||||
@@ -89,18 +53,6 @@ public:
|
|||||||
// never be called
|
// never be called
|
||||||
virtual wxDataViewCustomRenderer *WXGetAsCustom() { return NULL; }
|
virtual wxDataViewCustomRenderer *WXGetAsCustom() { return NULL; }
|
||||||
|
|
||||||
protected:
|
|
||||||
// This is just a convenience for the derived classes overriding
|
|
||||||
// RenderWithAttr() to avoid repeating the same wxFAIL_MSG() in all of them
|
|
||||||
bool DummyRender(wxRect WXUNUSED(cell),
|
|
||||||
wxDC * WXUNUSED(dc),
|
|
||||||
int WXUNUSED(state))
|
|
||||||
{
|
|
||||||
wxFAIL_MSG("shouldn't be called at all, use RenderWithAttr() instead");
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_align;
|
int m_align;
|
||||||
wxDataViewCellMode m_mode;
|
wxDataViewCellMode m_mode;
|
||||||
|
@@ -44,17 +44,8 @@ public:
|
|||||||
bool SetValue( const wxVariant &value );
|
bool SetValue( const wxVariant &value );
|
||||||
bool GetValue( wxVariant &value ) const;
|
bool GetValue( wxVariant &value ) const;
|
||||||
|
|
||||||
virtual bool RenderWithAttr(wxDC& dc,
|
virtual bool Render(wxRect cell, wxDC *dc, int state);
|
||||||
const wxRect& rect,
|
virtual wxSize GetSize() const;
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state);
|
|
||||||
virtual bool Render(wxRect cell, wxDC *dc, int state)
|
|
||||||
{
|
|
||||||
return DummyRender(cell, dc, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
wxSize GetSize() const;
|
|
||||||
|
|
||||||
// in-place editing
|
// in-place editing
|
||||||
virtual bool HasEditorCtrl() const;
|
virtual bool HasEditorCtrl() const;
|
||||||
@@ -135,15 +126,7 @@ public:
|
|||||||
bool SetValue( const wxVariant &value );
|
bool SetValue( const wxVariant &value );
|
||||||
bool GetValue( wxVariant& value ) const;
|
bool GetValue( wxVariant& value ) const;
|
||||||
|
|
||||||
virtual bool RenderWithAttr(wxDC& dc,
|
virtual bool Render(wxRect cell, wxDC *dc, int state);
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state);
|
|
||||||
virtual bool Render(wxRect cell, wxDC *dc, int state)
|
|
||||||
{
|
|
||||||
return DummyRender(cell, dc, state);
|
|
||||||
}
|
|
||||||
virtual wxSize GetSize() const;
|
virtual wxSize GetSize() const;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -168,15 +151,7 @@ public:
|
|||||||
bool SetValue( const wxVariant &value );
|
bool SetValue( const wxVariant &value );
|
||||||
bool GetValue( wxVariant &value ) const;
|
bool GetValue( wxVariant &value ) const;
|
||||||
|
|
||||||
virtual bool RenderWithAttr(wxDC& dc,
|
virtual bool Render(wxRect cell, wxDC *dc, int state);
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state);
|
|
||||||
virtual bool Render(wxRect cell, wxDC *dc, int state)
|
|
||||||
{
|
|
||||||
return DummyRender(cell, dc, state);
|
|
||||||
}
|
|
||||||
virtual wxSize GetSize() const;
|
virtual wxSize GetSize() const;
|
||||||
|
|
||||||
virtual bool HasEditorCtrl() const { return true; }
|
virtual bool HasEditorCtrl() const { return true; }
|
||||||
|
@@ -100,15 +100,15 @@ public:
|
|||||||
virtual ~wxDataViewCustomRenderer();
|
virtual ~wxDataViewCustomRenderer();
|
||||||
|
|
||||||
|
|
||||||
virtual bool Render( wxRect cell, wxDC *dc, int state ) = 0;
|
|
||||||
|
|
||||||
void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state );
|
|
||||||
|
|
||||||
virtual wxSize GetSize() const = 0;
|
|
||||||
|
|
||||||
// Create DC on request
|
// Create DC on request
|
||||||
virtual wxDC *GetDC();
|
virtual wxDC *GetDC();
|
||||||
|
|
||||||
|
// override the base class function to use GTK text cell renderer
|
||||||
|
virtual void RenderText(const wxString& text,
|
||||||
|
int xoffset,
|
||||||
|
wxRect cell,
|
||||||
|
wxDC *dc,
|
||||||
|
int state);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
@@ -24,12 +24,6 @@ public:
|
|||||||
|
|
||||||
virtual ~wxDataViewCustomRenderer();
|
virtual ~wxDataViewCustomRenderer();
|
||||||
|
|
||||||
void RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state );
|
|
||||||
|
|
||||||
virtual wxSize GetSize() const = 0;
|
|
||||||
|
|
||||||
virtual bool Render(wxRect cell, wxDC* dc, int state) = 0;
|
|
||||||
|
|
||||||
|
|
||||||
// implementation only
|
// implementation only
|
||||||
// -------------------
|
// -------------------
|
||||||
|
@@ -1435,9 +1435,20 @@ public:
|
|||||||
const wxVariant& value);
|
const wxVariant& value);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Create DC on request. Internal.
|
Return the attribute to be used for rendering.
|
||||||
*/
|
|
||||||
virtual wxDC* GetDC();
|
This function may be called from Render() implementation to use the
|
||||||
|
attributes defined for the item if the renderer supports them.
|
||||||
|
|
||||||
|
Notice that when Render() is called, the wxDC object passed to it is
|
||||||
|
already set up to use the correct attributes (e.g. its font is set to
|
||||||
|
bold or italic version if wxDataViewItemAttr::GetBold() or GetItalic()
|
||||||
|
returns true) so it may not be necessary to call it explicitly if you
|
||||||
|
only want to render text using the items attributes.
|
||||||
|
|
||||||
|
@since 2.9.1
|
||||||
|
*/
|
||||||
|
const wxDataViewItemAttr& GetAttr() const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Return size required to show content.
|
Return size required to show content.
|
||||||
|
@@ -694,6 +694,113 @@ bool wxDataViewRendererBase::FinishEditing()
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
// wxDataViewCustomRendererBase
|
||||||
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
|
void
|
||||||
|
wxDataViewCustomRendererBase::WXCallRender(wxRect rectCell, wxDC *dc, int state)
|
||||||
|
{
|
||||||
|
wxCHECK_RET( dc, "no DC to draw on in custom renderer?" );
|
||||||
|
|
||||||
|
// adjust the rectangle ourselves to account for the alignment
|
||||||
|
wxRect rectItem = rectCell;
|
||||||
|
const int align = GetAlignment();
|
||||||
|
if ( align != wxDVR_DEFAULT_ALIGNMENT )
|
||||||
|
{
|
||||||
|
const wxSize size = GetSize();
|
||||||
|
|
||||||
|
// take alignment into account only if there is enough space, otherwise
|
||||||
|
// show as much contents as possible
|
||||||
|
//
|
||||||
|
// notice that many existing renderers (e.g. wxDataViewSpinRenderer)
|
||||||
|
// return hard-coded size which can be more than they need and if we
|
||||||
|
// trusted their GetSize() we'd draw the text out of cell bounds
|
||||||
|
// entirely
|
||||||
|
|
||||||
|
if ( size.x >= 0 && size.x < rectCell.width )
|
||||||
|
{
|
||||||
|
if ( align & wxALIGN_CENTER_HORIZONTAL )
|
||||||
|
rectItem.x += (rectCell.width - size.x)/2;
|
||||||
|
else if ( align & wxALIGN_RIGHT )
|
||||||
|
rectItem.x += rectCell.width - size.x;
|
||||||
|
// else: wxALIGN_LEFT is the default
|
||||||
|
|
||||||
|
rectItem.width = size.x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( size.y >= 0 && size.y < rectCell.height )
|
||||||
|
{
|
||||||
|
if ( align & wxALIGN_CENTER_VERTICAL )
|
||||||
|
rectItem.y += (rectCell.height - size.y)/2;
|
||||||
|
else if ( align & wxALIGN_BOTTOM )
|
||||||
|
rectItem.y += rectCell.height - size.y;
|
||||||
|
// else: wxALIGN_TOP is the default
|
||||||
|
|
||||||
|
rectItem.height = size.y;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// set up the DC attributes
|
||||||
|
|
||||||
|
// override custom foreground with the standard one for the selected items
|
||||||
|
// because we currently don't allow changing the selection background and
|
||||||
|
// custom colours may be unreadable on it
|
||||||
|
wxColour col;
|
||||||
|
if ( state & wxDATAVIEW_CELL_SELECTED )
|
||||||
|
col = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
|
||||||
|
else if ( m_attr.HasColour() )
|
||||||
|
col = m_attr.GetColour();
|
||||||
|
else // use default foreground
|
||||||
|
col = GetOwner()->GetOwner()->GetForegroundColour();
|
||||||
|
|
||||||
|
wxDCTextColourChanger changeFg(*dc, col);
|
||||||
|
|
||||||
|
wxDCFontChanger changeFont(*dc);
|
||||||
|
if ( m_attr.HasFont() )
|
||||||
|
{
|
||||||
|
wxFont font(dc->GetFont());
|
||||||
|
if ( m_attr.GetBold() )
|
||||||
|
font.MakeBold();
|
||||||
|
if ( m_attr.GetItalic() )
|
||||||
|
font.MakeItalic();
|
||||||
|
|
||||||
|
changeFont.Set(font);
|
||||||
|
}
|
||||||
|
|
||||||
|
Render(rectItem, dc, state);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
wxDataViewCustomRendererBase::RenderText(const wxString& text,
|
||||||
|
int xoffset,
|
||||||
|
wxRect rect,
|
||||||
|
wxDC *dc,
|
||||||
|
int WXUNUSED(state))
|
||||||
|
{
|
||||||
|
wxRect rectText = rect;
|
||||||
|
rectText.x += xoffset;
|
||||||
|
rectText.width -= xoffset;
|
||||||
|
|
||||||
|
// check if we want to ellipsize the text if it doesn't fit
|
||||||
|
wxString ellipsizedText;
|
||||||
|
if ( GetEllipsizeMode() != wxELLIPSIZE_NONE )
|
||||||
|
{
|
||||||
|
ellipsizedText = wxControl::Ellipsize
|
||||||
|
(
|
||||||
|
text,
|
||||||
|
*dc,
|
||||||
|
GetEllipsizeMode(),
|
||||||
|
rect.width,
|
||||||
|
wxELLIPSIZE_FLAGS_NONE
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
dc->DrawLabel(ellipsizedText.empty() ? text : ellipsizedText,
|
||||||
|
rectText, GetAlignment());
|
||||||
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// wxDataViewEditorCtrlEvtHandler
|
// wxDataViewEditorCtrlEvtHandler
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
|
@@ -644,123 +644,6 @@ int wxDataViewRenderer::GetAlignment() const
|
|||||||
return m_align;
|
return m_align;
|
||||||
}
|
}
|
||||||
|
|
||||||
int wxDataViewRenderer::CalculateAlignment() const
|
|
||||||
{
|
|
||||||
if (m_align == wxDVR_DEFAULT_ALIGNMENT)
|
|
||||||
{
|
|
||||||
if (GetOwner() == NULL)
|
|
||||||
return wxALIGN_LEFT | wxALIGN_CENTRE_VERTICAL;
|
|
||||||
|
|
||||||
return GetOwner()->GetAlignment() | wxALIGN_CENTRE_VERTICAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return m_align;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
wxDataViewRenderer::RenderWithAttr(wxDC& dc,
|
|
||||||
const wxRect& cell_rect,
|
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *WXUNUSED(attr),
|
|
||||||
int state)
|
|
||||||
{
|
|
||||||
// adjust the rectangle ourselves to account for the alignment
|
|
||||||
|
|
||||||
wxRect item_rect = cell_rect;
|
|
||||||
if ( align )
|
|
||||||
{
|
|
||||||
const wxSize size = GetSize();
|
|
||||||
|
|
||||||
// take alignment into account only if there is enough space, otherwise
|
|
||||||
// show as much contents as possible
|
|
||||||
//
|
|
||||||
// notice that many existing renderers (e.g. wxDataViewSpinRenderer)
|
|
||||||
// return hard-coded size which can be more than they need and if we
|
|
||||||
// trusted their GetSize() we'd draw the text out of cell bounds
|
|
||||||
// entirely
|
|
||||||
|
|
||||||
if ( size.x < cell_rect.width )
|
|
||||||
{
|
|
||||||
if (align & wxALIGN_CENTER_HORIZONTAL)
|
|
||||||
item_rect.x += (cell_rect.width - size.x)/2;
|
|
||||||
else if (align & wxALIGN_RIGHT)
|
|
||||||
item_rect.x += cell_rect.width - size.x;
|
|
||||||
// else: wxALIGN_LEFT is the default
|
|
||||||
|
|
||||||
item_rect.width = size.x;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( size.y < cell_rect.height )
|
|
||||||
{
|
|
||||||
if (align & wxALIGN_CENTER_VERTICAL)
|
|
||||||
item_rect.y += (cell_rect.height - size.y)/2;
|
|
||||||
else if (align & wxALIGN_BOTTOM)
|
|
||||||
item_rect.y += cell_rect.height - size.y;
|
|
||||||
// else: wxALIGN_TOP is the default
|
|
||||||
|
|
||||||
item_rect.height = size.y;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return Render(item_rect, &dc, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
wxDataViewRenderer::RenderText(wxDC& dc,
|
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxString& text,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state,
|
|
||||||
int xoffset)
|
|
||||||
{
|
|
||||||
// override custom foreground with the standard one for the selected items
|
|
||||||
// because we currently don't allow changing the selection background and
|
|
||||||
// custom colours may be unreadable on it
|
|
||||||
wxColour col;
|
|
||||||
if ( state & wxDATAVIEW_CELL_SELECTED )
|
|
||||||
col = wxSystemSettings::GetColour(wxSYS_COLOUR_HIGHLIGHTTEXT);
|
|
||||||
else if ( attr && attr->HasColour() )
|
|
||||||
col = attr->GetColour();
|
|
||||||
else // use default foreground
|
|
||||||
col = GetOwner()->GetOwner()->GetForegroundColour();
|
|
||||||
|
|
||||||
wxDCTextColourChanger changeFg(dc, col);
|
|
||||||
|
|
||||||
wxDCFontChanger changeFont(dc);
|
|
||||||
if ( attr && attr->HasFont() )
|
|
||||||
{
|
|
||||||
wxFont font(dc.GetFont());
|
|
||||||
if ( attr->GetBold() )
|
|
||||||
font.MakeBold();
|
|
||||||
if ( attr->GetItalic() )
|
|
||||||
font.MakeItalic();
|
|
||||||
|
|
||||||
changeFont.Set(font);
|
|
||||||
}
|
|
||||||
|
|
||||||
wxRect rectText = rect;
|
|
||||||
rectText.x += xoffset;
|
|
||||||
rectText.width -= xoffset;
|
|
||||||
|
|
||||||
// check if we want to ellipsize the text if it doesn't fit
|
|
||||||
wxString ellipsizedText;
|
|
||||||
if ( GetEllipsizeMode() != wxELLIPSIZE_NONE )
|
|
||||||
{
|
|
||||||
ellipsizedText = wxControl::Ellipsize
|
|
||||||
(
|
|
||||||
text,
|
|
||||||
dc,
|
|
||||||
GetEllipsizeMode(),
|
|
||||||
rect.width,
|
|
||||||
wxELLIPSIZE_FLAGS_NONE
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
dc.DrawLabel(ellipsizedText.empty() ? text : ellipsizedText,
|
|
||||||
rectText, align);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
// wxDataViewCustomRenderer
|
// wxDataViewCustomRenderer
|
||||||
// ---------------------------------------------------------
|
// ---------------------------------------------------------
|
||||||
@@ -823,14 +706,9 @@ bool wxDataViewTextRenderer::GetValueFromEditorCtrl( wxControl *editor, wxVarian
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool wxDataViewTextRenderer::Render(wxRect rect, wxDC *dc, int state)
|
||||||
wxDataViewTextRenderer::RenderWithAttr(wxDC& dc,
|
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state)
|
|
||||||
{
|
{
|
||||||
RenderText(dc, rect, align, m_text, attr, state);
|
RenderText(m_text, 0, rect, dc, state);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -976,24 +854,23 @@ bool wxDataViewProgressRenderer::GetValue( wxVariant &value ) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool wxDataViewProgressRenderer::RenderWithAttr(wxDC& dc,
|
bool
|
||||||
const wxRect& rect,
|
wxDataViewProgressRenderer::Render(wxRect rect, wxDC *dc, int WXUNUSED(state))
|
||||||
int WXUNUSED(align),
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int WXUNUSED(state))
|
|
||||||
{
|
{
|
||||||
// deflat the rect to leave a small border between bars in adjacent rows
|
// deflate the rect to leave a small border between bars in adjacent rows
|
||||||
wxRect bar = rect.Deflate(0, 1);
|
wxRect bar = rect.Deflate(0, 1);
|
||||||
|
|
||||||
dc.SetBrush( *wxTRANSPARENT_BRUSH );
|
dc->SetBrush( *wxTRANSPARENT_BRUSH );
|
||||||
dc.SetPen( *wxBLACK_PEN );
|
dc->SetPen( *wxBLACK_PEN );
|
||||||
dc.DrawRectangle( bar );
|
dc->DrawRectangle( bar );
|
||||||
|
|
||||||
bar.width = (int)(bar.width * m_value / 100.);
|
bar.width = (int)(bar.width * m_value / 100.);
|
||||||
dc.SetPen( *wxTRANSPARENT_PEN );
|
dc->SetPen( *wxTRANSPARENT_PEN );
|
||||||
dc.SetBrush( attr && attr->HasColour() ? wxBrush(attr->GetColour())
|
|
||||||
: *wxBLUE_BRUSH );
|
const wxDataViewItemAttr& attr = GetAttr();
|
||||||
dc.DrawRectangle( bar );
|
dc->SetBrush( attr.HasColour() ? wxBrush(attr.GetColour())
|
||||||
|
: *wxBLUE_BRUSH );
|
||||||
|
dc->DrawRectangle( bar );
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1138,23 +1015,18 @@ bool wxDataViewIconTextRenderer::GetValue( wxVariant& WXUNUSED(value) ) const
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool
|
bool wxDataViewIconTextRenderer::Render(wxRect rect, wxDC *dc, int state)
|
||||||
wxDataViewIconTextRenderer::RenderWithAttr(wxDC& dc,
|
|
||||||
const wxRect& rect,
|
|
||||||
int align,
|
|
||||||
const wxDataViewItemAttr *attr,
|
|
||||||
int state)
|
|
||||||
{
|
{
|
||||||
int xoffset = 0;
|
int xoffset = 0;
|
||||||
|
|
||||||
const wxIcon& icon = m_value.GetIcon();
|
const wxIcon& icon = m_value.GetIcon();
|
||||||
if ( icon.IsOk() )
|
if ( icon.IsOk() )
|
||||||
{
|
{
|
||||||
dc.DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2);
|
dc->DrawIcon(icon, rect.x, rect.y + (rect.height - icon.GetHeight())/2);
|
||||||
xoffset = icon.GetWidth()+4;
|
xoffset = icon.GetWidth()+4;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderText(dc, rect, align, m_value.GetText(), attr, state, xoffset);
|
RenderText(m_value.GetText(), xoffset, rect, dc, state);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -1640,15 +1512,15 @@ wxBitmap wxDataViewMainWindow::CreateItemBitmap( unsigned int row, int &indent )
|
|||||||
model->GetValue( value, item, column->GetModelColumn());
|
model->GetValue( value, item, column->GetModelColumn());
|
||||||
cell->SetValue( value );
|
cell->SetValue( value );
|
||||||
|
|
||||||
|
wxDataViewItemAttr attr;
|
||||||
|
model->GetAttr(item, column->GetModelColumn(), attr);
|
||||||
|
cell->SetAttr(attr);
|
||||||
|
|
||||||
wxRect item_rect(x, 0, width, height);
|
wxRect item_rect(x, 0, width, height);
|
||||||
item_rect.Deflate(PADDING_RIGHTLEFT, 0);
|
item_rect.Deflate(PADDING_RIGHTLEFT, 0);
|
||||||
|
|
||||||
// dc.SetClippingRegion( item_rect );
|
// dc.SetClippingRegion( item_rect );
|
||||||
wxDataViewItemAttr attr;
|
cell->WXCallRender(item_rect, &dc, 0);
|
||||||
const bool
|
|
||||||
hasAttr = model->GetAttr(item, column->GetModelColumn(), attr);
|
|
||||||
cell->RenderWithAttr(dc, item_rect, cell->CalculateAlignment(),
|
|
||||||
hasAttr ? &attr : NULL, 0);
|
|
||||||
// dc.DestroyClippingRegion();
|
// dc.DestroyClippingRegion();
|
||||||
|
|
||||||
x += width;
|
x += width;
|
||||||
@@ -1840,6 +1712,10 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
model->GetValue( value, dataitem, col->GetModelColumn());
|
model->GetValue( value, dataitem, col->GetModelColumn());
|
||||||
cell->SetValue( value );
|
cell->SetValue( value );
|
||||||
|
|
||||||
|
wxDataViewItemAttr attr;
|
||||||
|
model->GetAttr(dataitem, col->GetModelColumn(), attr);
|
||||||
|
cell->SetAttr(attr);
|
||||||
|
|
||||||
// update cell_rect
|
// update cell_rect
|
||||||
cell_rect.y = GetLineStart( item );
|
cell_rect.y = GetLineStart( item );
|
||||||
cell_rect.height = GetLineHeight( item );
|
cell_rect.height = GetLineHeight( item );
|
||||||
@@ -1910,11 +1786,7 @@ void wxDataViewMainWindow::OnPaint( wxPaintEvent &WXUNUSED(event) )
|
|||||||
// make its own renderer and thus we cannot be sure of that.
|
// make its own renderer and thus we cannot be sure of that.
|
||||||
wxDCClipper clip(dc, item_rect);
|
wxDCClipper clip(dc, item_rect);
|
||||||
|
|
||||||
wxDataViewItemAttr attr;
|
cell->WXCallRender(item_rect, &dc, state);
|
||||||
const bool
|
|
||||||
hasAttr = model->GetAttr(dataitem, col->GetModelColumn(), attr);
|
|
||||||
cell->RenderWithAttr(dc, item_rect, cell->CalculateAlignment(),
|
|
||||||
hasAttr ? &attr : NULL, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cell_rect.x += cell_rect.width;
|
cell_rect.x += cell_rect.width;
|
||||||
|
@@ -1268,7 +1268,7 @@ gtk_wx_cell_renderer_render (GtkCellRenderer *renderer,
|
|||||||
state |= wxDATAVIEW_CELL_INSENSITIVE;
|
state |= wxDATAVIEW_CELL_INSENSITIVE;
|
||||||
if (flags & GTK_CELL_RENDERER_FOCUSED)
|
if (flags & GTK_CELL_RENDERER_FOCUSED)
|
||||||
state |= wxDATAVIEW_CELL_FOCUSED;
|
state |= wxDATAVIEW_CELL_FOCUSED;
|
||||||
cell->Render( renderrect, dc, state );
|
cell->WXCallRender( renderrect, dc, state );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -1701,7 +1701,7 @@ wxMacDataViewDataBrowserListViewControl::DataBrowserDrawItemProc(DataBrowserItem
|
|||||||
{
|
{
|
||||||
// make sure that 'Render' can draw only in the allowed area:
|
// make sure that 'Render' can draw only in the allowed area:
|
||||||
dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
|
dc->SetClippingRegion(content.left,content.top,content.right-content.left+1,content.bottom-content.top+1);
|
||||||
(void) (dataViewCustomRendererPtr->Render( cellrect, dc,
|
(void) (dataViewCustomRendererPtr->WXCallRender( cellrect, dc,
|
||||||
((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
|
((state == kDataBrowserItemIsSelected) ? wxDATAVIEW_CELL_SELECTED : 0)));
|
||||||
dc->DestroyClippingRegion(); // probably not necessary
|
dc->DestroyClippingRegion(); // probably not necessary
|
||||||
}
|
}
|
||||||
|
@@ -1108,8 +1108,8 @@ outlineView:(NSOutlineView*)outlineView
|
|||||||
[[self backgroundColor] set];
|
[[self backgroundColor] set];
|
||||||
NSRectFill(cellFrame);
|
NSRectFill(cellFrame);
|
||||||
|
|
||||||
// TODO: attributes support
|
wxDC * const dc = renderer->GetDC();
|
||||||
renderer->Render(wxFromNSRect(controlView, cellFrame), renderer->GetDC(), 0);
|
renderer->WXCallRender(wxFromNSRect(controlView, cellFrame), dc, 0);
|
||||||
renderer->SetDC(NULL);
|
renderer->SetDC(NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -303,15 +303,6 @@ wxDataViewCustomRenderer::~wxDataViewCustomRenderer()
|
|||||||
delete m_DCPtr;
|
delete m_DCPtr;
|
||||||
}
|
}
|
||||||
|
|
||||||
void wxDataViewCustomRenderer::RenderText( const wxString &text, int xoffset, wxRect cell, wxDC *dc, int state )
|
|
||||||
{
|
|
||||||
wxDataViewCtrl *view = GetOwner()->GetOwner();
|
|
||||||
|
|
||||||
wxColour col = (state & wxDATAVIEW_CELL_SELECTED) ? *wxWHITE : view->GetForegroundColour();
|
|
||||||
dc->SetTextForeground(col);
|
|
||||||
dc->DrawText( text, cell.x + xoffset, cell.y + ((cell.height - dc->GetCharHeight()) / 2));
|
|
||||||
}
|
|
||||||
|
|
||||||
wxDC* wxDataViewCustomRenderer::GetDC()
|
wxDC* wxDataViewCustomRenderer::GetDC()
|
||||||
{
|
{
|
||||||
if ((m_DCPtr == NULL) && (GetOwner() != NULL) && (GetOwner()->GetOwner() != NULL))
|
if ((m_DCPtr == NULL) && (GetOwner() != NULL) && (GetOwner()->GetOwner() != NULL))
|
||||||
|
Reference in New Issue
Block a user