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
This commit is contained in:
Jaakko Salli
2010-02-14 14:09:06 +00:00
parent a7b9865d30
commit fe01f16e53
8 changed files with 138 additions and 34 deletions

View File

@@ -878,6 +878,11 @@ wxPropertyGrid::CenterSplitter() method. <b>However, be sure to call it after
the sizer setup and SetSize calls!</b> (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

View File

@@ -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,

View File

@@ -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.

View File

@@ -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. */

View File

@@ -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.

View File

@@ -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);

View File

@@ -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
// -----------------------------------------------------------------------

View File

@@ -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,8 +1049,18 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange )
}
// Auto center splitter
if ( !m_dontCenterSplitter && m_colWidths.size() == 2 )
if ( !m_dontCenterSplitter )
{
if ( m_colWidths.size() == 2 &&
m_columnProportions[0] == m_columnProportions[1] )
{
//
// 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;
@@ -1088,12 +1101,35 @@ void wxPropertyGridPageState::CheckColumnWidths( int widthChange )
m_fSplitterX = splitterX; // needed to retain accuracy
}
else
{
//
// Generic re-center code
//
// Calculate sum of proportions
int psum = 0;
for ( i=0; i<m_colWidths.size(); i++ )
psum += m_columnProportions[i];
int puwid = (pg->m_width*256) / psum;
int cpos = 0;
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);
}
}
}
}
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
{