From fe01f16e5324c456d48aeb438acefc723f295acf Mon Sep 17 00:00:00 2001 From: Jaakko Salli Date: Sun, 14 Feb 2010 14:09:06 +0000 Subject: [PATCH] Added wxPropertyGridInterface::SetColumnProportion(); wxPG_SPLITTER_AUTO_CENTER window style now supports column counts higher than two. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63481 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- docs/doxygen/overviews/propgrid.h | 5 ++ include/wx/propgrid/propgrid.h | 8 +- include/wx/propgrid/propgridiface.h | 12 +++ include/wx/propgrid/propgridpagestate.h | 5 ++ interface/wx/propgrid/propgridiface.h | 12 +++ samples/propgrid/propgrid.cpp | 4 + src/propgrid/propgridiface.cpp | 11 +++ src/propgrid/propgridpagestate.cpp | 109 +++++++++++++++++------- 8 files changed, 135 insertions(+), 31 deletions(-) diff --git a/docs/doxygen/overviews/propgrid.h b/docs/doxygen/overviews/propgrid.h index ad0916d8e8..51ff911337 100644 --- a/docs/doxygen/overviews/propgrid.h +++ b/docs/doxygen/overviews/propgrid.h @@ -878,6 +878,11 @@ wxPropertyGrid::CenterSplitter() method. However, be sure to call it after the sizer setup and SetSize calls! (ie. usually at the end of the frame/dialog constructor) + Splitter centering behavior can be customized using +wxPropertyGridInterface::SetColumnProportion(). Usually it is used to set +non-equal column proportions, which in essence stops the splitter(s) from +being 'centered' as such, and instead just auto-resized. + @subsection propgrid_splittersetting Setting Splitter Position When Creating Property Grid Splitter position cannot exceed grid size, and therefore setting it during diff --git a/include/wx/propgrid/propgrid.h b/include/wx/propgrid/propgrid.h index 1132f46dcb..13ff03b8b5 100644 --- a/include/wx/propgrid/propgrid.h +++ b/include/wx/propgrid/propgrid.h @@ -150,8 +150,12 @@ wxPG_ALPHABETIC_MODE = (wxPG_HIDE_CATEGORIES|wxPG_AUTO_SORT), */ wxPG_BOLD_MODIFIED = 0x00000040, -/** When wxPropertyGrid is resized, splitter moves to the center. This - behavior stops once the user manually moves the splitter. +/** Using this style, the column splitters move automatically based on column + proportions (default is equal proportion for every column). This behavior + stops once the user manually moves a splitter, and returns when a + splitter is double-clicked. + + @see wxPropertyGridInterface::SetColumnProportion(). */ wxPG_SPLITTER_AUTO_CENTER = 0x00000080, diff --git a/include/wx/propgrid/propgridiface.h b/include/wx/propgrid/propgridiface.h index f6c4bc3c74..f69a0729f0 100644 --- a/include/wx/propgrid/propgridiface.h +++ b/include/wx/propgrid/propgridiface.h @@ -861,6 +861,18 @@ public: static void SetBoolChoices( const wxString& trueChoice, const wxString& falseChoice ); + /** + Set proportion of a auto-stretchable column. wxPG_SPLITTER_AUTO_CENTER + window style needs to be used to indicate that columns are auto- + resizeable. + + @returns Returns @false on failure. + + @remarks You should call this for individual pages of + wxPropertyGridManager (if used). + */ + bool SetColumnProportion( unsigned int column, int proportion ); + /** Sets an attribute for this property. @param name Text identifier of attribute. See @ref propgrid_property_attributes. diff --git a/include/wx/propgrid/propgridpagestate.h b/include/wx/propgrid/propgridpagestate.h index 2decf551bb..1f7d15fab7 100644 --- a/include/wx/propgrid/propgridpagestate.h +++ b/include/wx/propgrid/propgridpagestate.h @@ -547,6 +547,8 @@ public: void DoRemoveFromSelection( wxPGProperty* prop ); + void DoSetColumnProportion( unsigned int column, int proportion ); + wxPropertyCategory* GetPropertyCategory( const wxPGProperty* p ) const; wxPGProperty* GetPropertyByLabel( const wxString& name, @@ -704,6 +706,9 @@ protected: /** List of indices of columns the user can edit by clicking it. */ wxArrayInt m_editableColumns; + /** Column proportions */ + wxArrayInt m_columnProportions; + double m_fSplitterX; /** Most recently added category. */ diff --git a/interface/wx/propgrid/propgridiface.h b/interface/wx/propgrid/propgridiface.h index 35b7debea3..2014a6f086 100644 --- a/interface/wx/propgrid/propgridiface.h +++ b/interface/wx/propgrid/propgridiface.h @@ -678,6 +678,18 @@ public: static void SetBoolChoices( const wxString& trueChoice, const wxString& falseChoice ); + /** + Set proportion of a auto-stretchable column. wxPG_SPLITTER_AUTO_CENTER + window style needs to be used to indicate that columns are auto- + resizeable. + + @returns Returns @false on failure. + + @remarks You should call this for individual pages of + wxPropertyGridManager (if used). + */ + bool SetColumnProportion( unsigned int column, int proportion ); + /** Sets an attribute for this property. diff --git a/samples/propgrid/propgrid.cpp b/samples/propgrid/propgrid.cpp index 18a3584628..37bcde4bd8 100644 --- a/samples/propgrid/propgrid.cpp +++ b/samples/propgrid/propgrid.cpp @@ -1845,6 +1845,10 @@ void FormMain::PopulateWithLibraryConfig () wxPropertyGridManager* pgman = m_pPropGridManager; wxPropertyGridPage* pg = pgman->GetPage(wxT("wxWidgets Library Config")); + // Set custom column proportions + pg->SetColumnProportion(0, 3); + pg->SetColumnProportion(1, 1); + wxPGProperty* cat; wxBitmap bmp = wxArtProvider::GetBitmap(wxART_REPORT_VIEW); diff --git a/src/propgrid/propgridiface.cpp b/src/propgrid/propgridiface.cpp index 9ea84d5b42..99bf2dd80c 100644 --- a/src/propgrid/propgridiface.cpp +++ b/src/propgrid/propgridiface.cpp @@ -359,6 +359,17 @@ void wxPropertyGridInterface::ClearModifiedStatus() GetPropertyGrid()->RefreshEditor(); } +bool wxPropertyGridInterface::SetColumnProportion( unsigned int column, + int proportion ) +{ + wxCHECK(m_pState, false); + wxPropertyGrid* pg = m_pState->GetGrid(); + wxCHECK(pg, false); + wxCHECK(pg->HasFlag(wxPG_SPLITTER_AUTO_CENTER), false); + m_pState->DoSetColumnProportion(column, proportion); + return true; +} + // ----------------------------------------------------------------------- // wxPropertyGridInterface property value setting and getting // ----------------------------------------------------------------------- diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index 80da0f9388..81135d64d8 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,79 @@ 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 ) + if ( m_colWidths.size() == 2 && + m_columnProportions[0] == m_columnProportions[1] ) { - splitterX = centerX; - } - else if ( widthChange ) - { - //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; + + if ( m_fSplitterX < 0.0 ) + { + splitterX = centerX; + } + else if ( widthChange ) + { + //float centerX = float(pg->GetSize().x) * 0.5; - // Recenter? - splitterX = m_fSplitterX + (float(widthChange) * 0.5); - float deviation = fabs(centerX - splitterX); + // 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 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 ) + // + // Generic re-center code + // + + // Calculate sum of proportions + int psum = 0; + for ( i=0; im_width*256) / psum; + int cpos = 0; + + for ( i=0; i<(m_colWidths.size() - 1); i++ ) { - splitterX = centerX; + int cwid = (puwid*m_columnProportions[i]) / 256; + cpos += cwid; + DoSetSplitterPosition(cpos, i, + wxPG_SPLITTER_FROM_AUTO_CENTER); } } - - DoSetSplitterPosition((int)splitterX, 0, - wxPG_SPLITTER_FROM_AUTO_CENTER); - - m_fSplitterX = splitterX; // needed to retain accuracy } } @@ -1094,6 +1129,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 +1140,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 { -- 2.47.2