From 257f95ec9771ca7cb313fa81ffa087bbaf4b819f Mon Sep 17 00:00:00 2001 From: juha Date: Sat, 16 May 2020 08:23:09 +0000 Subject: [PATCH] LCL: Never trigger click events on TreeView's fold-arrow. Issue #37051, patch from CudaText man. git-svn-id: trunk@63171 - --- lcl/comctrls.pp | 5 +++-- lcl/include/treeview.inc | 32 +++++++++++++++++++++++--------- 2 files changed, 26 insertions(+), 11 deletions(-) diff --git a/lcl/comctrls.pp b/lcl/comctrls.pp index 4516f79849..e96bff1871 100644 --- a/lcl/comctrls.pp +++ b/lcl/comctrls.pp @@ -3341,6 +3341,7 @@ type FMaxRight: integer; // maximum text width of all nodes (needed for horizontal scrolling) FMouseDownPos: TPoint; FMouseDownNodeSelected: Boolean; + FMouseDownOnFoldingSign: Boolean; FMultiSelectStyle: TMultiSelectStyle; FHotTrackColor: TColor; FDisabledFontColor: TColor; @@ -3520,8 +3521,8 @@ type procedure CreateWnd; override; procedure Click; override; procedure DblClick; override; - //procedure TripleClick; override; - Are these needed? - //procedure QuadClick; override; + procedure TripleClick; override; + procedure QuadClick; override; procedure Delete(Node: TTreeNode); virtual; procedure DestroyWnd; override; procedure DoCreateNodeClass(var NewNodeClass: TTreeNodeClass); virtual; diff --git a/lcl/include/treeview.inc b/lcl/include/treeview.inc index 7cebd42f1c..1fb5603641 100644 --- a/lcl/include/treeview.inc +++ b/lcl/include/treeview.inc @@ -3317,13 +3317,25 @@ end; procedure TCustomTreeView.Click; begin - if FMouseDownNodeSelected then + if not FMouseDownOnFoldingSign then inherited; end; procedure TCustomTreeView.DblClick; begin - if FMouseDownNodeSelected then + if not FMouseDownOnFoldingSign then + inherited; +end; + +procedure TCustomTreeView.TripleClick; +begin + if not FMouseDownOnFoldingSign then + inherited; +end; + +procedure TCustomTreeView.QuadClick; +begin + if not FMouseDownOnFoldingSign then inherited; end; @@ -5566,7 +5578,7 @@ function TCustomTreeView.MouseDownNode(X, Y: Integer): TTreeNode; begin Result := GetNodeAt(X, Y); // Update the NodeSelected flag. - FMouseDownNodeSelected := (Result<>nil) and + FMouseDownNodeSelected := Assigned(Result) and (Result.Selected or ((tvoAllowMultiselect in Options) and Result.MultiSelected)); end; @@ -5608,18 +5620,20 @@ begin //CursorNode must be reassigned again - e.g. in OnMouseDown the node can be deleted or moved. CursorNode := MouseDownNode(X, Y); + //Flag is used for DblClick/TripleClick/QuadClick, so set it before testing ShiftState + FMouseDownOnFoldingSign := + Assigned(CursorNode) and CursorNode.HasChildren and ShowButtons and + (LogicalX >= CursorNode.DisplayExpandSignLeft) and + (LogicalX < CursorNode.DisplayExpandSignRight); + //change selection on left click if (Button = mbLeft) and//left click (([ssDouble, ssTriple, ssQuad] * Shift) = []) and//single or first of a multi click (CursorNode <> nil) then begin - if CursorNode.HasChildren and ShowButtons and - (LogicalX >= CursorNode.DisplayExpandSignLeft) and - (LogicalX < CursorNode.DisplayExpandSignRight) then - begin + if FMouseDownOnFoldingSign then // mousedown occured on expand sign -> expand/collapse - CursorNode.Expanded := not CursorNode.Expanded; - end + CursorNode.Expanded := not CursorNode.Expanded else if LogicalX >= CursorNode.DisplayStateIconLeft then begin // mousedown occured in text or icon -> select node and begin drag operation