]> git.saurik.com Git - wxWidgets.git/commitdiff
Added wxPropertyGridInterface::SetColumnProportion(); wxPG_SPLITTER_AUTO_CENTER windo...
authorJaakko Salli <jaakko.salli@dnainternet.net>
Sun, 14 Feb 2010 14:09:06 +0000 (14:09 +0000)
committerJaakko Salli <jaakko.salli@dnainternet.net>
Sun, 14 Feb 2010 14:09:06 +0000 (14:09 +0000)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@63481 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775

docs/doxygen/overviews/propgrid.h
include/wx/propgrid/propgrid.h
include/wx/propgrid/propgridiface.h
include/wx/propgrid/propgridpagestate.h
interface/wx/propgrid/propgridiface.h
samples/propgrid/propgrid.cpp
src/propgrid/propgridiface.cpp
src/propgrid/propgridpagestate.cpp

index ad0916d8e8fc57f29608a7977c36605f6225548b..51ff911337fbcb25162d681ceb662929a0153900 100644 (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
index 1132f46dcbd94e2362b1f4ec75f19ab3ba9dbfbe..13ff03b8b53cff75a68f8ac65ccd26b084fcda26 100644 (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,
 
index f6c4bc3c74780f8c7e65cbd2b7591cdec93f50de..f69a0729f02a75e7dd317634b045d97990db99a6 100644 (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.
index 2decf551bb31866a08f39d21853511dbfee03251..1f7d15fab7b308e66688d62f2b0d85204a962689 100644 (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. */
index 35b7debea37b400f8d435b22a015c7b8b5183688..2014a6f08654ae701cf4a5607d2f50dc5b3c2420 100644 (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.
 
index 18a3584628475c76270cb5f0aef35f3fc599c9af..37bcde4bd8a77f3b7952cf9289aa466f908ef7e3 100644 (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);
index 9ea84d5b42a9565f7bde13ad9f9e3f0ae9310cad..99bf2dd80ca95f16a20fd1dec179628b6b68cc65 100644 (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
 // -----------------------------------------------------------------------
index 80da0f9388b375b2ccd6d5c6090d2ee36c737148..81135d64d858b5607884bdab4ffed850647e0292 100644 (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,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; 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++ )
             {
-                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
 {