Property value images are no longer shrinked horizontally

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@59374 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Jaakko Salli 2009-03-06 17:32:28 +00:00
parent a3281dbc1c
commit 4aee83345e
5 changed files with 63 additions and 24 deletions

View File

@ -2093,6 +2093,11 @@ public:
// Puts correct indexes to children
void FixIndicesOfChildren( unsigned int starthere = 0 );
/**
Converts image width into full image offset, with margins.
*/
int GetImageOffset( int imageWidth ) const;
#ifndef SWIG
// Returns wxPropertyGridPageState in which this property resides.
wxPropertyGridPageState* GetParentState() const { return m_parentState; }

View File

@ -201,6 +201,9 @@
#define wxCC_CUSTOM_IMAGE_MARGIN1 4 // before image
#define wxCC_CUSTOM_IMAGE_MARGIN2 5 // after image
#define DEFAULT_IMAGE_OFFSET_INCREMENT \
(wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2)
#define wxPG_DRAG_MARGIN 30
#if wxPG_NO_CHILD_EVT_MOTION

View File

@ -1531,6 +1531,21 @@ void FormMain::PopulateWithExamples ()
// Set value after limiting so that it will be applied
pg->SetPropertyValue( wxT("StringProperty"), wxT("some text") );
// Add string property with arbitrarily wide bitmap in front of it. We
// intentionally lower-than-typical row height here so that the ugly
// scaling code wont't be run.
pg->Append( new wxStringProperty( wxT("StringPropertyWithBitmap"),
wxPG_LABEL,
wxT("Test Text")) );
wxBitmap myTestBitmap(60, 15, 32);
wxMemoryDC mdc;
mdc.SelectObject(myTestBitmap);
mdc.Clear();
mdc.SetPen(*wxBLACK);
mdc.DrawLine(0, 0, 60, 15);
mdc.SelectObject(wxNullBitmap);
pg->SetPropertyImage( wxT("StringPropertyWithBitmap"), myTestBitmap );
// this value array would be optional if values matched string indexes
//long flags_prop_values[] = { wxICONIZE, wxCAPTION, wxMINIMIZE_BOX, wxMAXIMIZE_BOX };

View File

@ -94,8 +94,6 @@ wxSize wxPGCellRenderer::GetImageSize( const wxPGProperty* WXUNUSED(property),
void wxPGCellRenderer::DrawText( wxDC& dc, const wxRect& rect,
int xOffset, const wxString& text ) const
{
if ( xOffset )
xOffset += wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2;
dc.DrawText( text,
rect.x+xOffset+wxPG_XBEFORETEXT,
rect.y+((rect.height-dc.GetCharHeight())/2) );
@ -106,9 +104,6 @@ void wxPGCellRenderer::DrawEditorValue( wxDC& dc, const wxRect& rect,
wxPGProperty* property,
const wxPGEditor* editor ) const
{
if ( xOffset )
xOffset += wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2;
int yOffset = ((rect.height-dc.GetCharHeight())/2);
if ( editor )
@ -135,7 +130,7 @@ void wxPGCellRenderer::DrawCaptionSelectionRect( wxDC& dc, int x, int y, int w,
int wxPGCellRenderer::PreDrawCell( wxDC& dc, const wxRect& rect, const wxPGCell& cell, int flags ) const
{
int imageOffset = 0;
int imageWidth = 0;
// If possible, use cell colours
if ( !(flags & DontUseCellBgCol) )
@ -164,10 +159,10 @@ int wxPGCellRenderer::PreDrawCell( wxDC& dc, const wxRect& rect, const wxPGCell&
rect.x + wxPG_CONTROL_MARGIN + wxCC_CUSTOM_IMAGE_MARGIN1,
rect.y + wxPG_CUSTOM_IMAGE_SPACINGY,
true );
imageOffset = bmp.GetWidth();
imageWidth = bmp.GetWidth();
}
return imageOffset;
return imageWidth;
}
// -----------------------------------------------------------------------
@ -196,12 +191,12 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect,
const wxPGCell* cell = NULL;
wxString text;
int imageOffset = 0;
int imageWidth = 0;
int preDrawFlags = flags;
property->GetDisplayInfo(column, item, flags, &text, &cell);
imageOffset = PreDrawCell( dc, rect, *cell, preDrawFlags );
imageWidth = PreDrawCell( dc, rect, *cell, preDrawFlags );
if ( column == 1 )
{
@ -231,7 +226,7 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect,
property->OnCustomPaint( dc, imageRect, paintdata );
imageOffset = paintdata.m_drawnWidth;
imageWidth = paintdata.m_drawnWidth;
}
text = property->GetValueAsString();
@ -257,6 +252,8 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect,
}
}
int imageOffset = property->GetImageOffset(imageWidth);
DrawEditorValue( dc, rect, imageOffset, text, property, editor );
// active caption gets nice dotted rectangle
@ -264,8 +261,11 @@ void wxPGDefaultRenderer::Render( wxDC& dc, const wxRect& rect,
{
if ( flags & Selected )
{
if ( imageOffset > 0 )
imageOffset += wxCC_CUSTOM_IMAGE_MARGIN2 + 4;
if ( imageWidth > 0 )
{
imageOffset -= DEFAULT_IMAGE_OFFSET_INCREMENT;
imageWidth += wxCC_CUSTOM_IMAGE_MARGIN2 + 4;
}
DrawCaptionSelectionRect( dc,
rect.x+wxPG_XBEFORETEXT-wxPG_CAPRECTXMARGIN+imageOffset,
@ -1170,6 +1170,22 @@ wxSize wxPGProperty::OnMeasureImage( int WXUNUSED(item) ) const
return wxSize(0,0);
}
int wxPGProperty::GetImageOffset( int imageWidth ) const
{
int imageOffset = 0;
if ( imageWidth )
{
// Do not increment offset too much for wide images
if ( imageWidth <= (wxPG_CUSTOM_IMAGE_WIDTH+5) )
imageOffset = imageWidth + DEFAULT_IMAGE_OFFSET_INCREMENT;
else
imageOffset = imageWidth + 1;
}
return imageOffset;
}
wxPGCellRenderer* wxPGProperty::GetCellRenderer( int WXUNUSED(column) ) const
{
return wxPGGlobalVars->m_defaultRenderer;
@ -1903,7 +1919,7 @@ void wxPGProperty::SetValueImage( wxBitmap& bmp )
wxSize maxSz = GetGrid()->GetImageSize();
wxSize imSz(bmp.GetWidth(),bmp.GetHeight());
if ( imSz.x != maxSz.x || imSz.y != maxSz.y )
if ( imSz.y != maxSz.y )
{
// Create a memory DC
wxBitmap* bmpNew = new wxBitmap(maxSz.x,maxSz.y,bmp.GetDepth());
@ -1913,12 +1929,11 @@ void wxPGProperty::SetValueImage( wxBitmap& bmp )
// Scale
// FIXME: This is ugly - use image or wait for scaling patch.
double scaleX = (double)maxSz.x / (double)imSz.x;
double scaleY = (double)maxSz.y / (double)imSz.y;
dc.SetUserScale(scaleX,scaleY);
dc.SetUserScale(scaleY, scaleY);
dc.DrawBitmap( bmp, 0, 0 );
dc.DrawBitmap(bmp, 0, 0);
m_valueBitmap = bmpNew;
}

View File

@ -2978,24 +2978,25 @@ wxRect wxPropertyGrid::GetEditorWidgetRect( wxPGProperty* p, int column ) const
{
int itemy = p->GetY2(m_lineHeight);
int vy = 0;
int cust_img_space = 0;
int splitterX = m_pState->DoGetSplitterPosition(column-1);
int colEnd = splitterX + m_pState->m_colWidths[column];
int imageOffset = 0;
// TODO: If custom image detection changes from current, change this.
if ( m_iFlags & wxPG_FL_CUR_USES_CUSTOM_IMAGE /*p->m_flags & wxPG_PROP_CUSTOMIMAGE*/ )
if ( m_iFlags & wxPG_FL_CUR_USES_CUSTOM_IMAGE )
{
//m_iFlags |= wxPG_FL_CUR_USES_CUSTOM_IMAGE;
int imwid = p->OnMeasureImage().x;
if ( imwid < 1 ) imwid = wxPG_CUSTOM_IMAGE_WIDTH;
cust_img_space = imwid + wxCC_CUSTOM_IMAGE_MARGIN1 + wxCC_CUSTOM_IMAGE_MARGIN2;
int iw = p->OnMeasureImage().x;
if ( iw < 1 )
iw = wxPG_CUSTOM_IMAGE_WIDTH;
imageOffset = p->GetImageOffset(iw);
}
return wxRect
(
splitterX+cust_img_space+wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1,
splitterX+imageOffset+wxPG_XBEFOREWIDGET+wxPG_CONTROL_MARGIN+1,
itemy-vy,
colEnd-splitterX-wxPG_XBEFOREWIDGET-wxPG_CONTROL_MARGIN-cust_img_space-1,
colEnd-splitterX-wxPG_XBEFOREWIDGET-wxPG_CONTROL_MARGIN-imageOffset-1,
m_lineHeight-1
);
}