X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/84fc95da58864be4b0558cc0da99f51901a990b8..0738b901b17340f09766524b8d9d79e9ed1268e7:/src/generic/datavgen.cpp diff --git a/src/generic/datavgen.cpp b/src/generic/datavgen.cpp index 7eccd27682..04924b89dd 100644 --- a/src/generic/datavgen.cpp +++ b/src/generic/datavgen.cpp @@ -612,6 +612,7 @@ wxDataViewRenderer::wxDataViewRenderer( const wxString &varianttype, m_dc = NULL; m_align = align; m_mode = mode; + m_ellipsizeMode = wxELLIPSIZE_MIDDLE; } wxDataViewRenderer::~wxDataViewRenderer() @@ -634,22 +635,35 @@ wxDataViewRenderer::RenderWithAttr(wxDC& dc, { const wxSize size = GetSize(); - // horizontal alignment: - if (align & wxALIGN_CENTER_HORIZONTAL) - item_rect.x = cell_rect.x + (cell_rect.width / 2) - (size.x / 2); - else if (align & wxALIGN_RIGHT) - item_rect.x = cell_rect.x + cell_rect.width - size.x; - // else: wxALIGN_LEFT is the default + // 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 - // vertical alignment: - item_rect.y = cell_rect.y; - if (align & wxALIGN_CENTER_VERTICAL) - item_rect.y = cell_rect.y + (cell_rect.height / 2) - (size.y / 2); - else if (align & wxALIGN_BOTTOM) - item_rect.y = cell_rect.y + cell_rect.height - size.y; - // else: wxALIGN_TOP is the default + 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; + } - item_rect.SetSize(size); + 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); @@ -713,11 +727,14 @@ wxDataViewCustomRenderer::RenderText(wxDC& dc, 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 ( attr && attr->HasColour() ) - col = attr->GetColour(); - else if ( state & wxDATAVIEW_CELL_SELECTED ) + 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(); @@ -739,7 +756,22 @@ wxDataViewCustomRenderer::RenderText(wxDC& dc, rectText.x += xoffset; rectText.width -= xoffset; - dc.DrawLabel(text, rectText, align); + // 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); } // --------------------------------------------------------- @@ -904,10 +936,7 @@ bool wxDataViewToggleRenderer::Activate( wxRect WXUNUSED(cell), wxDataViewModel *model, const wxDataViewItem & item, unsigned int col) { - bool value = !m_toggle; - wxVariant variant = value; - model->SetValue( variant, item, col); - model->ValueChanged( item, col ); + model->ChangeValue(!m_toggle, item, col); return true; } @@ -1022,10 +1051,7 @@ END_EVENT_TABLE() void wxDataViewDateRendererPopupTransient::OnCalendar( wxCalendarEvent &event ) { - wxDateTime date = event.GetDate(); - wxVariant value = date; - m_model->SetValue( value, m_item, m_col ); - m_model->ValueChanged( m_item, m_col ); + m_model->ChangeValue( event.GetDate(), m_item, m_col ); DismissAndNotify(); }