X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/f525476870e4baa3e5d303d94d8bc70026603b4c..86ad5903b94d00e7c7625a705f6cd22301607ccd:/src/propgrid/propgridpagestate.cpp diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 8c8d00667e..cf059678a0 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -218,6 +218,9 @@ wxPropertyGridPageState::wxPropertyGridPageState() m_colWidths.push_back( wxPG_DEFAULT_SPLITTERX ); m_fSplitterX = wxPG_DEFAULT_SPLITTERX; + m_columnProportions.push_back(1); + m_columnProportions.push_back(1); + m_isSplitterPreSet = false; m_dontCenterSplitter = false; @@ -1046,47 +1049,85 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange ) } // Auto center splitter - if ( !m_dontCenterSplitter && m_colWidths.size() == 2 ) + if ( !m_dontCenterSplitter ) { - float centerX = (float)(pg->m_width/2); - float splitterX; - - if ( m_fSplitterX < 0.0 ) - { - splitterX = centerX; - } - else if ( widthChange ) + if ( m_colWidths.size() == 2 && + m_columnProportions[0] == m_columnProportions[1] ) { - //float centerX = float(pg->GetSize().x) * 0.5; + // + // When we have two columns of equal proportion, then use this + // code. It will look nicer when the scrollbar visibility is + // toggled on and off. + // + // TODO: Adapt this to generic recenter code. + // + float centerX = (float)(pg->m_width/2); + float splitterX; - // Recenter? - splitterX = m_fSplitterX + (float(widthChange) * 0.5); - float deviation = fabs(centerX - splitterX); + if ( m_fSplitterX < 0.0 ) + { + splitterX = centerX; + } + else if ( widthChange ) + { + //float centerX = float(pg->GetSize().x) * 0.5; - // If deviating from center, adjust towards it - if ( deviation > 20.0 ) + // Recenter? + splitterX = m_fSplitterX + (float(widthChange) * 0.5); + float deviation = fabs(centerX - splitterX); + + // If deviating from center, adjust towards it + if ( deviation > 20.0 ) + { + if ( splitterX > centerX) + splitterX -= 2; + else + splitterX += 2; + } + } + else { - if ( splitterX > centerX) - splitterX -= 2; - else - splitterX += 2; + // No width change, just keep sure we keep splitter position intact + splitterX = m_fSplitterX; + float deviation = fabs(centerX - splitterX); + if ( deviation > 50.0 ) + { + splitterX = centerX; + } } + + DoSetSplitterPosition((int)splitterX, 0, + wxPG_SPLITTER_FROM_AUTO_CENTER); + + m_fSplitterX = splitterX; // needed to retain accuracy } else { - // No width change, just keep sure we keep splitter position intact - splitterX = m_fSplitterX; - float deviation = fabs(centerX - splitterX); - if ( deviation > 50.0 ) - { - splitterX = centerX; - } + // + // Generic re-center code + // + ResetColumnSizes(wxPG_SPLITTER_FROM_AUTO_CENTER); } + } +} - DoSetSplitterPosition((int)splitterX, 0, - wxPG_SPLITTER_FROM_AUTO_CENTER); +void wxPropertyGridPageState::ResetColumnSizes( int setSplitterFlags ) +{ + unsigned int i; + // Calculate sum of proportions + int psum = 0; + for ( i=0; im_width*256) / psum; + int cpos = 0; - m_fSplitterX = splitterX; // needed to retain accuracy + // Convert proportion to splitter positions + for ( i=0; i<(m_colWidths.size() - 1); i++ ) + { + int cwid = (puwid*m_columnProportions[i]) / 256; + cpos += cwid; + DoSetSplitterPosition(cpos, i, + setSplitterFlags); } } @@ -1094,6 +1135,7 @@ void wxPropertyGridPageState::SetColumnCount( int colCount ) { wxASSERT( colCount >= 2 ); m_colWidths.SetCount( colCount, wxPG_DRAG_MARGIN ); + m_columnProportions.SetCount( colCount, 1 ); if ( m_colWidths.size() > (unsigned int)colCount ) m_colWidths.RemoveAt( m_colWidths.size()-1, m_colWidths.size() - colCount ); @@ -1104,6 +1146,21 @@ void wxPropertyGridPageState::SetColumnCount( int colCount ) CheckColumnWidths(); } +void wxPropertyGridPageState::DoSetColumnProportion( unsigned int column, + int proportion ) +{ + wxASSERT_MSG( proportion >= 1, + "Column proportion must 1 or higher" ); + + if ( proportion < 1 ) + proportion = 1; + + while ( m_columnProportions.size() <= column ) + m_columnProportions.push_back(1); + + m_columnProportions[column] = proportion; +} + // Returns column index, -1 for margin int wxPropertyGridPageState::HitTestH( int x, int* pSplitterHit, int* pSplitterHitOffset ) const { @@ -1671,10 +1728,6 @@ bool wxPropertyGridPageState::PrepareToAddItem( wxPGProperty* property, } #endif // wxDEBUG_LEVEL - // Make sure nothing is selected. - if ( propGrid ) - propGrid->ClearSelection(false); - // NULL parent == root parent if ( !scheduledParent ) scheduledParent = DoGetRoot(); @@ -1804,6 +1857,30 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) wxCHECK_RET( item != &m_regularArray && item != m_abcArray, wxT("wxPropertyGrid: Do not attempt to remove the root item.") ); + wxPropertyGrid* pg = GetGrid(); + + // Must defer deletion? Yes, if handling a wxPG event. + if ( pg && pg->m_processedEvent ) + { + if ( doDelete ) + pg->m_deletedProperties.push_back(item); + else + pg->m_removedProperties.push_back(item); + + // Rename the property so it won't remain in the way + // of the user code. + + // Let's trust that no sane property uses prefix like + // this. It would be anyway fairly inconvenient (in + // current code) to check whether a new name is used + // by another property with parent (due to the child + // name notation). + wxString newName = wxS("_&/_%$") + item->GetBaseName(); + DoSetPropertyName(item, newName); + + return; + } + unsigned int indinparent = item->GetIndexInParent(); wxPGProperty* pwc = (wxPGProperty*)item; @@ -1814,8 +1891,6 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) wxASSERT( item->GetParentState() == this ); - wxPropertyGrid* pg = GetGrid(); - if ( DoIsPropertySelected(item) ) { if ( pg && pg->GetState() == this ) @@ -1904,6 +1979,10 @@ void wxPropertyGridPageState::DoDelete( wxPGProperty* item, bool doDelete ) if ( pg && pg->m_propHover == item ) pg->m_propHover = NULL; + // Mark the property as 'unattached' + item->m_parentState = NULL; + item->m_parent = NULL; + // We can actually delete it now if ( doDelete ) delete item;