From: Jaakko Salli Date: Sun, 6 Sep 2009 07:51:35 +0000 (+0000) Subject: Added check to allow multiple selection by dragging only if property under mouse... X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/169dc97542bcf418ad8244bdba45014e2337d9a6 Added check to allow multiple selection by dragging only if property under mouse was adjacent to a property already in the selection. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@61838 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/propgrid/propgridpagestate.h b/include/wx/propgrid/propgridpagestate.h index c38413477e..86e1c4a4e0 100644 --- a/include/wx/propgrid/propgridpagestate.h +++ b/include/wx/propgrid/propgridpagestate.h @@ -669,6 +669,11 @@ public: protected: + // Utility to check if two properties are visibly next to each other + bool ArePropertiesAdjacent( wxPGProperty* prop1, + wxPGProperty* prop2, + int iterFlags = wxPG_ITERATE_VISIBLE ) const; + int DoGetSplitterPosition( int splitterIndex = 0 ) const; /** Returns column at x coordinate (in GetGrid()->GetPanel()). diff --git a/src/propgrid/propgrid.cpp b/src/propgrid/propgrid.cpp index 09ada8704b..e3e2d584fe 100644 --- a/src/propgrid/propgrid.cpp +++ b/src/propgrid/propgrid.cpp @@ -4798,13 +4798,32 @@ bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y, wxMouseEvent &event // // Multi select by dragging // - if ( GetExtraStyle() & wxPG_EX_MULTIPLE_SELECTION && + if ( (GetExtraStyle() & wxPG_EX_MULTIPLE_SELECTION) && event.LeftIsDown() && m_propHover && GetSelection() && !state->DoIsPropertySelected(m_propHover) ) { - DoAddToSelection(m_propHover); + // Additional requirement is that the hovered property + // is adjacent to edges of selection. + const wxArrayPGProperty& selection = GetSelectedProperties(); + + // Since categories cannot be selected along with 'other' + // properties, exclude them from iterator flags. + int iterFlags = wxPG_ITERATE_VISIBLE & (~wxPG_PROP_CATEGORY); + + for ( int i=(selection.size()-1); i>=0; i-- ) + { + // TODO: This could be optimized by keeping track of + // which properties are at the edges of selection. + wxPGProperty* selProp = selection[i]; + if ( state->ArePropertiesAdjacent(m_propHover, selProp, + iterFlags) ) + { + DoAddToSelection(m_propHover); + break; + } + } } } return true; diff --git a/src/propgrid/propgridpagestate.cpp b/src/propgrid/propgridpagestate.cpp index d95efe3fb9..91fe89e6f9 100644 --- a/src/propgrid/propgridpagestate.cpp +++ b/src/propgrid/propgridpagestate.cpp @@ -1139,6 +1139,29 @@ int wxPropertyGridPageState::HitTestH( int x, int* pSplitterHit, int* pSplitterH return col; } +bool wxPropertyGridPageState::ArePropertiesAdjacent( wxPGProperty* prop1, + wxPGProperty* prop2, + int iterFlags ) const +{ + const wxPGProperty* ap1 = + wxPropertyGridConstIterator::OneStep(this, + iterFlags, + prop1, + 1); + if ( ap1 && ap1 == prop2 ) + return true; + + const wxPGProperty* ap2 = + wxPropertyGridConstIterator::OneStep(this, + iterFlags, + prop1, + -1); + if ( ap2 && ap2 == prop2 ) + return true; + + return false; +} + // ----------------------------------------------------------------------- // wxPropertyGridPageState property value setting and getting // -----------------------------------------------------------------------