Skip to content

Commit

Permalink
Merge pull request #806 from fireundubh/issue804
Browse files Browse the repository at this point in the history
#804: fixed issue where previously merged fix for #798 introduced node selection issues
  • Loading branch information
ElminsterAU committed Apr 3, 2020
2 parents ca9cd1a + ce0606f commit 4e2c4a1
Show file tree
Hide file tree
Showing 2 changed files with 34 additions and 44 deletions.
2 changes: 0 additions & 2 deletions xEdit/xeMainForm.dfm
Original file line number Diff line number Diff line change
Expand Up @@ -2034,8 +2034,6 @@ object frmMain: TfrmMain
OnInitNode = vstNavInitNode
OnKeyDown = vstNavKeyDown
OnKeyPress = vstNavKeyPress
OnKeyUp = vstNavKeyUp
OnNodeClick = vstNavNodeClick
Columns = <
item
Position = 0
Expand Down
76 changes: 34 additions & 42 deletions xEdit/xeMainForm.pas
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ TfrmMain = class(TForm)
{--- actions ---}
function GetFocusedElementSafely: IwbElement;

procedure TryViewOrCompareSelectedRecords(aFocusedNode: PVirtualNode);
procedure TryViewOrCompareSelectedRecords(aElement: IwbElement);

procedure acBackUpdate(Sender: TObject);
procedure acBackExecute(Sender: TObject);
Expand Down Expand Up @@ -715,8 +715,6 @@ TfrmMain = class(TForm)
procedure mniCopyShortNameToClipboardClick(Sender: TObject);
procedure mniCopySignatureToClipboardClick(Sender: TObject);
procedure mniCopyPathNameToClipboardClick(Sender: TObject);
procedure vstNavNodeClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo);
procedure vstNavKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);

protected
function IsViewNodeFiltered(aNode: PVirtualNode): Boolean;
Expand Down Expand Up @@ -15348,9 +15346,8 @@ procedure TfrmMain.DoSetActiveContainer(const aContainer: IwbDataContainer);
lvReferencedBy.Items.EndUpdate;
end;
end;

procedure TfrmMain.DoSetActiveRecord(const aMainRecords: TDynMainRecords);
var
i : Integer;
begin
PendingContainer := nil;
PendingMainRecords := nil;
Expand All @@ -15366,6 +15363,23 @@ procedure TfrmMain.DoSetActiveRecord(const aMainRecords: TDynMainRecords);
Exit;
end;

if Length(aMainRecords) = Length(ActiveRecords) then
begin
var FoundDifferent: Boolean := False;

for var i := Low(ActiveRecords) to High(ActiveRecords) do
with ActiveRecords[i] do
begin
FoundDifferent := (Assigned(Element) <> Assigned(aMainRecords[i])) or
(Assigned(Element) and not Element.Equals(aMainRecords[i]));
if FoundDifferent then
Break;
end;

if not FoundDifferent then
Exit;
end;

ComparingSiblings := True;
CompareRecords := aMainRecords;
lvReferencedBy.Items.BeginUpdate;
Expand All @@ -15381,7 +15395,7 @@ procedure TfrmMain.DoSetActiveRecord(const aMainRecords: TDynMainRecords);
ActiveIndex := NoColumn;

SetLength(ActiveRecords, Length(aMainRecords));
for i := Low(ActiveRecords) to High(ActiveRecords) do
for var i := Low(ActiveRecords) to High(ActiveRecords) do
with ActiveRecords[i] do begin
Element := aMainRecords[i];
Container := aMainRecords[i] as IwbContainerElementRef;
Expand All @@ -15399,7 +15413,7 @@ procedure TfrmMain.DoSetActiveRecord(const aMainRecords: TDynMainRecords);
Options := Options - [coDraggable, coShowDropMark];
Options := Options + [coFixed];
end;
for I := Low(ActiveRecords) to High(ActiveRecords) do
for var i := Low(ActiveRecords) to High(ActiveRecords) do
with Add do begin
Text := (ActiveRecords[i].Element as IwbMainRecord).EditorID;
Hint := (ActiveRecords[i].Element as IwbMainRecord).EditorID;
Expand Down Expand Up @@ -18029,6 +18043,8 @@ procedure TfrmMain.vstNavChange(Sender: TBaseVirtualTree; Node: PVirtualNode);
lblPath.Visible := False;
end;

TryViewOrCompareSelectedRecords(Element);

if not wbShowGroupRecordCount then
if HeaderType = etGroupRecord then
HeaderType := etValue;
Expand Down Expand Up @@ -18793,35 +18809,14 @@ procedure TfrmMain.vstNavKeyPress(Sender: TObject; var Key: Char);
end;
end;

procedure TfrmMain.vstNavKeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
begin
if wbLoaderDone then
case Key of
VK_UP: begin
TryViewOrCompareSelectedRecords(vstNav.FocusedNode);
end;
VK_DOWN: begin
TryViewOrCompareSelectedRecords(vstNav.FocusedNode);
end;
end;
end;

procedure TfrmMain.TryViewOrCompareSelectedRecords(aFocusedNode: PVirtualNode);
procedure TfrmMain.TryViewOrCompareSelectedRecords(aElement: IwbElement);
var
_File : IwbFile;
MainRecord : IwbMainRecord;
begin
var NodeData: PNavNodeData := vstNav.GetNodeData(aFocusedNode);
if not Assigned(NodeData) then
Exit;

var Element: IwbElement := NodeData.Element;
if Assigned(Element) and not (Element.ElementType in [etFile, etMainRecord, etStructChapter]) and not Element.TreeHead then
Element := nil;

var MainRecords: TDynMainRecords := nil;
var SelectedNodes: TNodeArray := vstNav.GetSortedSelection(True);

var SelectedNodes: TNodeArray := vstNav.GetSortedSelection(True);
var SelectedNodesCount: Integer := Length(SelectedNodes);

var Ctrl: Boolean := GetAsyncKeyState(VK_CONTROL) < 0;
Expand All @@ -18835,17 +18830,19 @@ procedure TfrmMain.TryViewOrCompareSelectedRecords(aFocusedNode: PVirtualNode);

for var i := Low(SelectedNodes) to High(SelectedNodes) do
begin
NodeData := vstNav.GetNodeData(SelectedNodes[i]);
var NodeData: PNavNodeData := vstNav.GetNodeData(SelectedNodes[i]);

if not Assigned(NodeData.Element) or not (NodeData.Element.ElementType = etMainRecord) then
Continue;

MainRecords[j] := NodeData.Element as IwbMainRecord;

if not Assigned(FirstNode) then
begin
FirstNode := SelectedNodes[i];

if not Assigned(FirstNode) or (FirstNode.Parent = SelectedNodes[i].Parent) then
Inc(j);
end
else if FirstNode.Parent = SelectedNodes[i].Parent then
Inc(j);
end;

Expand All @@ -18854,21 +18851,16 @@ procedure TfrmMain.TryViewOrCompareSelectedRecords(aFocusedNode: PVirtualNode);

if Length(MainRecords) > 1 then
SetActiveRecord(MainRecords)
else if Supports(Element, IwbMainRecord, MainRecord) then
else if Supports(aElement, IwbMainRecord, MainRecord) then
SetActiveRecord(MainRecord)
else if Supports(Element, IwbFile, _File) and (_File.ElementCount > 0) and Supports(_File.Elements[0], IwbMainRecord, MainRecord) then
else if Supports(aElement, IwbFile, _File) and (_File.ElementCount > 0) and Supports(_File.Elements[0], IwbMainRecord, MainRecord) then
SetActiveRecord(MainRecord)
else if Supports(Element, IwbDataContainer) then
SetActiveContainer(Element as IwbDataContainer)
else if Supports(aElement, IwbDataContainer) then
SetActiveContainer(aElement as IwbDataContainer)
else
ClearActiveContainer;
end;

procedure TfrmMain.vstNavNodeClick(Sender: TBaseVirtualTree; const HitInfo: THitInfo);
begin
TryViewOrCompareSelectedRecords(Sender.FocusedNode);
end;

procedure TfrmMain.vstNavPaintText(Sender: TBaseVirtualTree;
const TargetCanvas: TCanvas; Node: PVirtualNode; Column: TColumnIndex;
TextType: TVSTTextType);
Expand Down

0 comments on commit 4e2c4a1

Please sign in to comment.