mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-06-11 12:58:15 +02:00
LCL, TreeView: Improve scrollbar update when some nodes have Visible=False
git-svn-id: trunk@35283 -
This commit is contained in:
parent
75be46b024
commit
8cbd938dd7
@ -2361,7 +2361,7 @@ type
|
|||||||
FText: string;
|
FText: string;
|
||||||
FTop: integer; // top coordinate
|
FTop: integer; // top coordinate
|
||||||
FVisible: Boolean;
|
FVisible: Boolean;
|
||||||
function AreParentsExpanded: Boolean;
|
function AreParentsExpandedAndVisible: Boolean;
|
||||||
procedure BindToMultiSelected;
|
procedure BindToMultiSelected;
|
||||||
function CompareCount(CompareMe: Integer): Boolean;
|
function CompareCount(CompareMe: Integer): Boolean;
|
||||||
function DoCanExpand(ExpandIt: Boolean): Boolean;
|
function DoCanExpand(ExpandIt: Boolean): Boolean;
|
||||||
|
@ -516,7 +516,8 @@ begin
|
|||||||
FVisible := AValue;
|
FVisible := AValue;
|
||||||
Selected := False;
|
Selected := False;
|
||||||
if TreeView<>nil then
|
if TreeView<>nil then
|
||||||
TreeView.FStates:=TreeView.FStates+[tvsScrollbarChanged,tvsTopsNeedsUpdate,tvsBottomItemNeedsUpdate, tvsTopItemNeedsUpdate];
|
TreeView.FStates:=TreeView.FStates+[tvsScrollbarChanged,tvsTopsNeedsUpdate,
|
||||||
|
tvsTopItemNeedsUpdate,tvsBottomItemNeedsUpdate,tvsMaxLvlNeedsUpdate,tvsMaxRightNeedsUpdate];
|
||||||
Update;
|
Update;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -534,13 +535,14 @@ begin
|
|||||||
Update;
|
Update;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTreeNode.AreParentsExpanded: Boolean;
|
function TTreeNode.AreParentsExpandedAndVisible: Boolean;
|
||||||
var ANode: TTreeNode;
|
var
|
||||||
|
ANode: TTreeNode;
|
||||||
begin
|
begin
|
||||||
Result:=false;
|
Result:=false;
|
||||||
ANode:=Parent;
|
ANode:=Parent;
|
||||||
while ANode<>nil do begin
|
while ANode<>nil do begin
|
||||||
if not ANode.Expanded then exit;
|
if not (ANode.Expanded and ANode.Visible) then exit;
|
||||||
ANode:=ANode.Parent;
|
ANode:=ANode.Parent;
|
||||||
end;
|
end;
|
||||||
Result:=true;
|
Result:=true;
|
||||||
@ -906,8 +908,11 @@ begin
|
|||||||
if ANode=nil then break;
|
if ANode=nil then break;
|
||||||
Result:=ANode;
|
Result:=ANode;
|
||||||
end;
|
end;
|
||||||
end else
|
end
|
||||||
|
else begin
|
||||||
|
Assert(Parent.Visible, 'TTreeNode.GetPrevVisible: Parent is not Visible');
|
||||||
Result := Parent;
|
Result := Parent;
|
||||||
|
end;
|
||||||
if (Result<>nil) and (TreeView<>nil) and (not TreeView.IsNodeVisible(Result))
|
if (Result<>nil) and (TreeView<>nil) and (not TreeView.IsNodeVisible(Result))
|
||||||
then
|
then
|
||||||
Result:=nil;
|
Result:=nil;
|
||||||
@ -1574,7 +1579,7 @@ begin
|
|||||||
if Assigned(TreeView) then
|
if Assigned(TreeView) then
|
||||||
Result := TreeView.IsNodeVisible(Self)
|
Result := TreeView.IsNodeVisible(Self)
|
||||||
else
|
else
|
||||||
Result := AreParentsExpanded;
|
Result := AreParentsExpandedAndVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TTreeNode.IsNodeHeightFullVisible: Boolean;
|
function TTreeNode.IsNodeHeightFullVisible: Boolean;
|
||||||
@ -1582,7 +1587,7 @@ begin
|
|||||||
if Assigned(TreeView) then
|
if Assigned(TreeView) then
|
||||||
Result := TreeView.IsNodeHeightFullVisible(Self)
|
Result := TreeView.IsNodeHeightFullVisible(Self)
|
||||||
else
|
else
|
||||||
Result := AreParentsExpanded;
|
Result := AreParentsExpandedAndVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TTreeNode.Update;
|
procedure TTreeNode.Update;
|
||||||
@ -2331,10 +2336,10 @@ function TTreeNodes.GetLastExpandedSubNode: TTreeNode;
|
|||||||
var
|
var
|
||||||
Node: TTreeNode;
|
Node: TTreeNode;
|
||||||
begin
|
begin
|
||||||
Result := GetLastNode;
|
Result := GetLastVisibleNode;
|
||||||
while Assigned(Result) and (Result.Expanded) do
|
while Assigned(Result) and (Result.Expanded) do
|
||||||
begin
|
begin
|
||||||
Node := Result.GetLastChild;
|
Node := Result.GetLastVisibleChild;
|
||||||
if Assigned(Node) then
|
if Assigned(Node) then
|
||||||
Result := Node
|
Result := Node
|
||||||
else
|
else
|
||||||
@ -3419,7 +3424,7 @@ begin
|
|||||||
Cnt := 0;
|
Cnt := 0;
|
||||||
while Node <> nil do
|
while Node <> nil do
|
||||||
begin
|
begin
|
||||||
if not Node.AreParentsExpanded then
|
if not Node.AreParentsExpandedAndVisible then
|
||||||
begin
|
begin
|
||||||
Node := Node.GetNext;
|
Node := Node.GetNext;
|
||||||
Continue;
|
Continue;
|
||||||
@ -3828,9 +3833,7 @@ end;
|
|||||||
|
|
||||||
function TCustomTreeView.IsNodeVisible(ANode: TTreeNode): Boolean;
|
function TCustomTreeView.IsNodeVisible(ANode: TTreeNode): Boolean;
|
||||||
begin
|
begin
|
||||||
Result:=(ANode<>nil) and (ANode.Visible) and (ANode.AreParentsExpanded);
|
Result:=(ANode<>nil) and (ANode.Visible) and (ANode.AreParentsExpandedAndVisible);
|
||||||
//DebugLn('[TCustomTreeView.IsNodeVisible] A Node=',DbgS(ANode),
|
|
||||||
//' ANode.AreParentsExpanded=',ANode.AreParentsExpanded);
|
|
||||||
if Result then begin
|
if Result then begin
|
||||||
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
|
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
|
||||||
// ' ',dbgs(FScrolledTop)+'>=',dbgs(ANode.Top+ANode.Height)+' or =',dbgs(FScrolledTop),'+'+dbgs(ClientHeight)+'<',dbgs(ANode.Top));
|
// ' ',dbgs(FScrolledTop)+'>=',dbgs(ANode.Top+ANode.Height)+' or =',dbgs(FScrolledTop),'+'+dbgs(ClientHeight)+'<',dbgs(ANode.Top));
|
||||||
@ -3845,9 +3848,7 @@ end;
|
|||||||
|
|
||||||
function TCustomTreeView.IsNodeHeightFullVisible(ANode: TTreeNode): Boolean;
|
function TCustomTreeView.IsNodeHeightFullVisible(ANode: TTreeNode): Boolean;
|
||||||
begin
|
begin
|
||||||
Result:=(ANode<>nil) and (ANode.AreParentsExpanded);
|
Result:=(ANode<>nil) and (ANode.AreParentsExpandedAndVisible);
|
||||||
//DebugLn('[TCustomTreeView.IsNodeVisible] A Node=',DbgS(ANode),
|
|
||||||
//' ANode.AreParentsExpanded=',ANode.AreParentsExpanded);
|
|
||||||
if Result then begin
|
if Result then begin
|
||||||
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
|
//DebugLn('[TCustomTreeView.IsNodeVisible] B Node=',DbgS(ANode),
|
||||||
//' ',FScrolledTop,'>=',ANode.Top,'+',ANode.Height,' or ',FScrolledTop,'+',ClientHeight,'<',ANode.Top);
|
//' ',FScrolledTop,'>=',ANode.Top,'+',ANode.Height,' or ',FScrolledTop,'+',ClientHeight,'<',ANode.Top);
|
||||||
|
Loading…
Reference in New Issue
Block a user