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:
@@ -669,6 +669,11 @@ public:
|
|||||||
|
|
||||||
protected:
|
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;
|
int DoGetSplitterPosition( int splitterIndex = 0 ) const;
|
||||||
|
|
||||||
/** Returns column at x coordinate (in GetGrid()->GetPanel()).
|
/** Returns column at x coordinate (in GetGrid()->GetPanel()).
|
||||||
|
@@ -4798,13 +4798,32 @@ bool wxPropertyGrid::HandleMouseMove( int x, unsigned int y, wxMouseEvent &event
|
|||||||
//
|
//
|
||||||
// Multi select by dragging
|
// Multi select by dragging
|
||||||
//
|
//
|
||||||
if ( GetExtraStyle() & wxPG_EX_MULTIPLE_SELECTION &&
|
if ( (GetExtraStyle() & wxPG_EX_MULTIPLE_SELECTION) &&
|
||||||
event.LeftIsDown() &&
|
event.LeftIsDown() &&
|
||||||
m_propHover &&
|
m_propHover &&
|
||||||
GetSelection() &&
|
GetSelection() &&
|
||||||
!state->DoIsPropertySelected(m_propHover) )
|
!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;
|
return true;
|
||||||
|
@@ -1139,6 +1139,29 @@ int wxPropertyGridPageState::HitTestH( int x, int* pSplitterHit, int* pSplitterH
|
|||||||
return col;
|
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
|
// wxPropertyGridPageState property value setting and getting
|
||||||
// -----------------------------------------------------------------------
|
// -----------------------------------------------------------------------
|
||||||
|
Reference in New Issue
Block a user