LCL: TTreeView: mouse click without Shift/Ctrl: single select only if mouse up on mouse down node

git-svn-id: trunk@45971 -
This commit is contained in:
mattias 2014-07-25 15:44:14 +00:00
parent 162fe350f3
commit 0062df6edc
2 changed files with 34 additions and 9 deletions

View File

@ -3011,7 +3011,8 @@ type
tvsTripleClicked, tvsTripleClicked,
tvsQuadClicked, tvsQuadClicked,
tvsSelectionChanged, tvsSelectionChanged,
tvsEditOnMouseUp tvsEditOnMouseUp, // if mouse up occurs on mouse down node: activate editing
tvsSingleSelectOnMouseUp // if mouse up occurs on mouse down node: single select this node
); );
TTreeViewStates = set of TTreeViewState; TTreeViewStates = set of TTreeViewState;
@ -3239,6 +3240,7 @@ type
procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseMove(Shift: TShiftState; X, Y: Integer); override; procedure MouseMove(Shift: TShiftState; X, Y: Integer); override;
procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override; procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: Integer); override;
procedure MouseLeave; override;
procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure Notification(AComponent: TComponent; Operation: TOperation); override;
procedure Paint; override; procedure Paint; override;
procedure SetDragMode(Value: TDragMode); override; procedure SetDragMode(Value: TDragMode); override;

View File

@ -5140,12 +5140,13 @@ procedure TCustomTreeView.MouseDown(Button: TMouseButton; Shift: TShiftState;
var var
CursorNode: TTreeNode; CursorNode: TTreeNode;
LogicalX: Integer; LogicalX: Integer;
CursorNodeSelected: Boolean;
begin begin
{$IFDEF VerboseDrag} {$IFDEF VerboseDrag}
DebugLn('TCustomTreeView.MouseDown A ',Name,':',ClassName,' '); DebugLn('TCustomTreeView.MouseDown A ',Name,':',ClassName,' ');
{$ENDIF} {$ENDIF}
fMouseDownPos := Point(X,Y); fMouseDownPos := Point(X,Y);
Exclude(FStates,tvsEditOnMouseUp); FStates:=FStates-[tvsEditOnMouseUp,tvsSingleSelectOnMouseUp];
if Button=mbRight then begin if Button=mbRight then begin
if RightClickSelect then begin if RightClickSelect then begin
Selected:=GetNodeAt(X,Y); Selected:=GetNodeAt(X,Y);
@ -5158,6 +5159,9 @@ begin
inherited MouseDown(Button, Shift, X, Y); inherited MouseDown(Button, Shift, X, Y);
CursorNode := GetNodeAt(X, Y); CursorNode := GetNodeAt(X, Y);
CursorNodeSelected := (CursorNode<>nil)
and (CursorNode.Selected
or ((tvoAllowMultiselect in Options) and CursorNode.MultiSelected));
LogicalX:=X; LogicalX:=X;
if ([ssDouble, ssTriple, ssQuad] * Shift) = [] then if ([ssDouble, ssTriple, ssQuad] * Shift) = [] then
begin begin
@ -5202,8 +5206,10 @@ begin
end end
else else
begin begin
if (Selected <> CursorNode) or Items.IsMultiSelection then if not CursorNodeSelected then
Items.SelectOnlyThis(CursorNode); Items.SelectOnlyThis(CursorNode)
else
Include(FStates, tvsSingleSelectOnMouseUp);
end; end;
end; end;
end; end;
@ -5223,6 +5229,8 @@ end;
procedure TCustomTreeView.MouseUp(Button: TMouseButton; Shift: TShiftState; procedure TCustomTreeView.MouseUp(Button: TMouseButton; Shift: TShiftState;
X, Y: Integer); X, Y: Integer);
var
aMouseDownNode, aMouseUpNode: TTreeNode;
begin begin
inherited MouseUp(Button, Shift, X, Y); inherited MouseUp(Button, Shift, X, Y);
if (Button = mbRight) and (Shift = [ssRight]) and Assigned(PopupMenu) then if (Button = mbRight) and (Shift = [ssRight]) and Assigned(PopupMenu) then
@ -5233,12 +5241,27 @@ begin
and (FStates * [tvsDblClicked, tvsTripleClicked, tvsQuadClicked] = []) and (FStates * [tvsDblClicked, tvsTripleClicked, tvsQuadClicked] = [])
then begin then begin
//AquirePrimarySelection; //AquirePrimarySelection;
if (tvsEditOnMouseUp in FStates) and (not ReadOnly) aMouseDownNode:=GetNodeAt(fMouseDownPos.X,fMouseDownPos.Y);
and (abs(fMouseDownPos.X-X)+abs(fMouseDownPos.Y-Y)<10) aMouseUpNode:=GetNodeAt(X,Y);
and (GetNodeAt(fMouseDownPos.X,fMouseDownPos.Y)=GetNodeAt(X,Y)) then if (abs(fMouseDownPos.X-X)+abs(fMouseDownPos.Y-Y)<10)
BeginEditing(Selected); and (aMouseDownNode=aMouseUpNode) then
begin
// mouse up on mouse-down node
if (tvsEditOnMouseUp in FStates) and (not ReadOnly) then
BeginEditing(Selected)
else if (tvsSingleSelectOnMouseUp in FStates) then
Items.SelectOnlyThis(aMouseUpNode);
end;
end; end;
FStates:=FStates-[tvsDblClicked,tvsTripleClicked,tvsQuadClicked,tvsEditOnMouseUp]; FStates:=FStates-[tvsDblClicked,tvsTripleClicked,tvsQuadClicked,
tvsEditOnMouseUp,tvsSingleSelectOnMouseUp];
end;
procedure TCustomTreeView.MouseLeave;
begin
FStates:=FStates-[tvsDblClicked,tvsTripleClicked,tvsQuadClicked,
tvsEditOnMouseUp,tvsSingleSelectOnMouseUp];
inherited MouseLeave;
end; end;
procedure TCustomTreeView.Notification(AComponent: TComponent; Operation: TOperation); procedure TCustomTreeView.Notification(AComponent: TComponent; Operation: TOperation);