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
This commit is contained in:
Jaakko Salli 2009-09-06 07:51:35 +00:00
parent 6c254c5203
commit 169dc97542
3 changed files with 49 additions and 2 deletions

View File

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

View File

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

View File

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