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;
- // 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
- {
- // No width change, just keep sure we keep splitter position intact
- splitterX = m_fSplitterX;
- float deviation = fabs(centerX - splitterX);
- if ( deviation > 50.0 )
+ 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);
+
+ // If deviating from center, adjust towards it
+ if ( deviation > 20.0 )
+ {
+ if ( splitterX > centerX)
+ splitterX -= 2;
+ else
+ splitterX += 2;
+ }
+ }
+ 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;
+ }
+ }
+
+ DoSetSplitterPosition((int)splitterX, 0,
+ wxPG_SPLITTER_FROM_AUTO_CENTER);
+
+ m_fSplitterX = splitterX; // needed to retain accuracy
}
+ else
+ {
+ //
+ // Generic re-center code
+ //
- DoSetSplitterPosition((int)splitterX, 0,
- wxPG_SPLITTER_FROM_AUTO_CENTER);
+ // Calculate sum of proportions
+ int psum = 0;
+ for ( i=0; im_width*256) / psum;
+ int cpos = 0;
- m_fSplitterX = splitterX; // needed to retain accuracy
+ for ( i=0; i<(m_colWidths.size() - 1); i++ )
+ {
+ int cwid = (puwid*m_columnProportions[i]) / 256;
+ cpos += cwid;
+ DoSetSplitterPosition(cpos, i,
+ wxPG_SPLITTER_FROM_AUTO_CENTER);
+ }
+ }
}
}
@@ -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
{