fpvectorial: Classification the visualtest results as "pass"/"fail".

This commit is contained in:
wp_xyz 2023-01-20 23:46:29 +01:00
parent 117df60bf4
commit 1d5178fc7b
6 changed files with 390 additions and 58 deletions

View File

@ -4612,7 +4612,7 @@ end;
procedure TvEntityWithPenBrushAndFont.Rotate(AAngle: Double; ABase: T3DPoint);
begin
inherited Rotate(AAngle, ABase);
Font.Orientation := -RadToDeg(AAngle);
Font.Orientation := -RadToDeg(AAngle); // wp: - added for svg text rotation which has CW orientation. Maybe wrong for others???
end;
procedure TvEntityWithPenBrushAndFont.Scale(ADeltaScaleX, ADeltaScaleY: Double);

View File

@ -3230,6 +3230,7 @@ begin
else if IsAttributeFromStyle(lNodeName) then
begin
ReadSVGFontStyleWithKeyAndValue(lNodeName, lNodeValue, nil, lCurStyle);
// ReadSVGGeneralStyleWithKeyAndValue(AData, lNodeName, lNodeValue, lParagraph);
end;
end;

View File

@ -73,11 +73,6 @@
<DebugInfoType Value="dsDwarf3"/>
<UseExternalDbgSyms Value="True"/>
</Debugging>
<Options>
<Win32>
<GraphicApplication Value="True"/>
</Win32>
</Options>
</Linking>
</CompilerOptions>
<Debugging>

View File

@ -39,24 +39,10 @@ Tree.Items.AddChildObject(node, 'rotated around (10,10) by 30deg CW',
// Polygon
node := Tree.Items.AddChild(mainnode, 'Polygon (solid) - moved up');
Tree.Items.AddChildObject(node, 'rotated around (10,10) by 30deg CCW',
TRenderParams.Create(@Render_Shape, 'polygon_solid_rot30ccw.png', $000100500));
TRenderParams.Create(@Render_Shape, 'polygon_solid_rot30ccw.png', $00010500));
Tree.Items.AddChildObject(node, 'normal',
TRenderParams.Create(@Render_Shape, 'polygon_solid.png', $0500));
Tree.Items.AddChildObject(node, 'rotated around (10,10) by 30deg CW',
TRenderParams.Create(@Render_Shape, 'polygon_solid_rot30cw.png', $000200500));
(*
TRenderParams.Create(@Render_Shape, 'polygon_solid_rot30cw.png', $00020500));
node := Tree.Items.AddChild(node0, 'normal');
Tree.Items.AddChildObject(node, 'Circle (solid) - moved up',
TRenderParams.Create(@Render_Shape, 'circle_solid.png', $0100));
Tree.Items.AddChildObject(node, 'Ellipse (solid) - moved up',
TRenderParams.Create(@Render_Shape, 'ellipse_solid.png', $0200));
Tree.Items.AddChildObject(node, 'Rectangle(solid) - moved up',
TRenderParams.Create(@Render_Shape, 'rect_solid.png', $0300));
Tree.Items.AddChildObject(node, 'Rounded rectangle (solid) - moved up',
TRenderParams.Create(@Render_Shape, 'rounded_rect_solid.png', $0400));
Tree.Items.AddChildObject(node, 'Polygon (solid) - moved up',
TRenderParams.Create(@Render_Shape, 'polygon_solid.png', $0500));
*)

View File

@ -1,66 +1,70 @@
object MainForm: TMainForm
Left = 307
Height = 694
Top = 164
Width = 852
Left = 324
Height = 690
Top = 125
Width = 900
Caption = 'Visual fpvectorial test'
ClientHeight = 694
ClientWidth = 852
ClientHeight = 690
ClientWidth = 900
OnCreate = FormCreate
OnDestroy = FormDestroy
ShowHint = True
LCLVersion = '2.3.0.0'
object GbTree: TGroupBox
Left = 4
Height = 686
Height = 682
Top = 4
Width = 296
Width = 344
Align = alClient
BorderSpacing.Around = 4
Caption = 'Test shapes and objects'
ClientHeight = 666
ClientWidth = 292
ClientHeight = 662
ClientWidth = 340
Font.Style = [fsBold]
ParentFont = False
TabOrder = 0
object Tree: TTreeView
Left = 4
Height = 654
Height = 650
Top = 4
Width = 284
Width = 332
Align = alClient
BorderSpacing.Bottom = 4
BorderSpacing.Around = 4
HideSelection = False
Images = ImageList
ParentFont = False
ReadOnly = True
StateImages = ImageList
TabOrder = 0
OnCustomDrawItem = TreeCustomDrawItem
OnGetImageIndex = TreeGetImageIndex
OnGetSelectedIndex = TreeGetSelectedIndex
OnSelectionChanged = TreeSelectionChanged
Options = [tvoAutoItemHeight, tvoKeepCollapsedNodes, tvoReadOnly, tvoShowButtons, tvoShowLines, tvoShowRoot, tvoToolTips, tvoThemedDraw]
end
end
object ScrollBox1: TScrollBox
Left = 304
Height = 694
Left = 352
Height = 690
Top = 0
Width = 548
HorzScrollBar.Increment = 54
HorzScrollBar.Page = 543
HorzScrollBar.Smooth = True
HorzScrollBar.Tracking = True
VertScrollBar.Increment = 62
VertScrollBar.Page = 627
VertScrollBar.Increment = 69
VertScrollBar.Page = 690
VertScrollBar.Smooth = True
VertScrollBar.Tracking = True
Align = alRight
BorderStyle = bsNone
ClientHeight = 694
ClientHeight = 690
ClientWidth = 548
TabOrder = 1
object AllTestsPanel: TPanel
Left = 4
Height = 619
Height = 682
Top = 4
Width = 536
Align = alTop
@ -68,7 +72,7 @@ object MainForm: TMainForm
BorderSpacing.Right = 4
BorderSpacing.Around = 4
BevelOuter = bvNone
ClientHeight = 619
ClientHeight = 682
ClientWidth = 536
TabOrder = 0
object gbRenderTest: TGroupBox
@ -330,11 +334,11 @@ object MainForm: TMainForm
AnchorSideRight.Side = asrBottom
Left = 0
Height = 313
Top = 306
Top = 298
Width = 536
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 24
BorderSpacing.Top = 16
Caption = 'Read/write test'
ClientHeight = 293
ClientWidth = 532
@ -551,6 +555,175 @@ object MainForm: TMainForm
end
end
end
object gbResults: TGroupBox
AnchorSideLeft.Control = gbReadWriteTest
AnchorSideTop.Control = gbReadWriteTest
AnchorSideTop.Side = asrBottom
AnchorSideRight.Control = gbReadWriteTest
AnchorSideRight.Side = asrBottom
Left = 0
Height = 55
Top = 627
Width = 536
Anchors = [akTop, akLeft, akRight]
AutoSize = True
BorderSpacing.Top = 16
Caption = 'Test results'
ClientHeight = 35
ClientWidth = 532
Font.Style = [fsBold]
ParentFont = False
TabOrder = 3
object rbUnknown: TRadioButton
AnchorSideLeft.Control = gbResults
AnchorSideTop.Control = gbResults
Left = 16
Height = 19
Top = 8
Width = 68
BorderSpacing.Left = 16
BorderSpacing.Top = 8
BorderSpacing.Bottom = 8
Caption = 'unknown'
Checked = True
OnChange = ResultStateChange
ParentFont = False
TabOrder = 2
TabStop = True
end
object imgUnknown: TImage
AnchorSideLeft.Control = rbUnknown
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbUnknown
AnchorSideTop.Side = asrCenter
Left = 92
Height = 16
Top = 9
Width = 16
BorderSpacing.Left = 8
Constraints.MaxHeight = 16
Constraints.MaxWidth = 16
Images = ImageList
end
object rbPassed: TRadioButton
Tag = 1
AnchorSideLeft.Control = imgUnknown
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbUnknown
AnchorSideTop.Side = asrCenter
Left = 140
Height = 19
Top = 8
Width = 54
BorderSpacing.Left = 32
Caption = 'passed'
OnChange = ResultStateChange
ParentFont = False
TabOrder = 0
end
object ImgPassed: TImage
AnchorSideLeft.Control = rbPassed
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbPassed
AnchorSideTop.Side = asrCenter
Left = 202
Height = 16
Top = 9
Width = 16
BorderSpacing.Left = 8
Constraints.MaxHeight = 16
Constraints.MaxWidth = 16
ImageIndex = 1
Images = ImageList
end
object rbFailed: TRadioButton
Tag = 2
AnchorSideLeft.Control = ImgPassed
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = rbUnknown
AnchorSideTop.Side = asrCenter
Left = 250
Height = 19
Top = 8
Width = 47
BorderSpacing.Left = 32
Caption = 'failed'
OnChange = ResultStateChange
ParentFont = False
TabOrder = 1
end
object ImgFailed: TImage
AnchorSideLeft.Control = rbFailed
AnchorSideLeft.Side = asrBottom
AnchorSideTop.Control = imgUnknown
AnchorSideTop.Side = asrCenter
Left = 305
Height = 16
Top = 9
Width = 16
BorderSpacing.Left = 8
Constraints.MaxHeight = 16
Constraints.MaxWidth = 16
ImageIndex = 2
Images = ImageList
end
end
end
end
object ImageList: TImageList
Scaled = True
Left = 174
Top = 242
Bitmap = {
4C7A0300000010000000100000004A0100000000000078DAED94B14EC3301086
2F091203232A22AF81C41B30B2F12C8C3C0213132B5362A48E6C4C5107A20C6D
1D124147261606604A07F35F02520037F205A1AA85E1931CFB3EDB97B36D8C21
B3864C86B493C774C4DC2ADA95B8454C07B9A267F0081EC0ABBEA443575F2BD2
706E6657B4A91405685F833B57BF1CD236EFBFCEE382B6E04E4021FE078D3B02
4F45447B521FDE2978C923DAEF5303B8E7E06C5967006B2760DCD7471D8F717E
4ECC9ADE91BF06E14E79B19781A4A7AB8101A9C855348033ADDDC82B49F01EB9
BA9C13E746EFEF8665CFBA3D66F1D3769CC4B5AD257117CC21722D35CEA4EE3F
AB4D105409C888CCB7BA731F8F714C879FFA41657CBFD2ED39B8CD7D3CC6310B
CF1E9901E2A6F51C1B5589EFD0D2D779F73FC7CFEFD12E5CDD2F73345EC3CCD5
EDF04381FB912FF63F6FEF3F14B875BEB67FFA5BF5FBE9F95945DE0015281489
}
BitmapAdv = {
4C69020000004C7A030000001800000018000000E10100000000000078DAED96
4D2B446114C7FF776E91A484A2585092A521165616F6D68AC857B0F00DF8086C
50163373EF0C52B2B1B791306F97344AB1F1D29492CCE63A4777A669DEC73D0F
3177F1EF3E3DF739BF73EE39E73933B66DC3F6D4D03ADF477BDCC042DCC45ACC
C06AC2C4A2B5874E0936B126488FC4B60B948E8531E5867D75803662DF3BBCD3
4418334903D3B477E8EC3DC502E8FE76ECC473386FD7017465F76F8ED04C7BAF
FC8EF2B5E422374DA4C14404FEFC7D8E99D8EF5FBE0DCC4AD6DA0AA29FB896F3
5DA9CB1DB44AB1A3110C13F3C161DF59210C49C61E3371968B7B177D926CAA43
4FB637A326C6A4EF18C74BF11FB34E4CB4FCB51941F9E9A05E5C615D98E895E6
73AF64F34F7361523CFF2606B86F58C91046BDB9EFC9D3FF11E877140696F929
CEA679A119DA0BC9D6425A4A195B985FC4A63584661FE5798478CF79EC34B1C7
7F935D4B0FB8C909D7A6928DDB7CE7F18B6C256A598E21D927A558D23D58C287
7C7F2BBC3B391F41F8897BCBE2B537C73D796AF0FF31B0355DFF9863F15AFABC
AE67E67D7AC676B44936BE0A6C1F9FC99E67DB3AF9657D14B26BE597B22BF451
CB996A39A5F3EB05F65B6C5FE95DBD752EC5216DB86557F121C2AEC1C7B65BB6
6ABECAFCA8ACAFCAFE547DBF54CF07D5F34DF57CF6F4B3FA0419C450694C7A03
00000020000000200000006C0200000000000078DAED97B16FD34014875F6B81
2AC1C4C04207A4AE6C956082B5035D421B65A8072A75E0AF6040428C8CA813A2
038D1DE8C2D4B9A8430552D324CD805025482406040C4828D895FBBB28754FA9
5DDB89EFB955DFF00D39E7DEF7FCEEDDD90E82800241102E0407AF69AAE5D2E3
668DDE365DFA08B69A0EADE3F74A7D8DAE9974EF57E90E7C5F4010C3B7D63BBA
67C25DDFA09B88FF4373FD051F800BBAC7E3A8CD9F469566F2F6A3C62F35F7D7
FA7B9A0E7343DD31B6A9E5B096BBDFA5F671FC864B0F87AFB76A745FCBEFC044
FD715F77E1297F5AA52BC3D7915349F3B739F7C4A02FBF87F5AFD17336B7430F
E0FCADADCD67D3FB50EBC93938FF6975DF51EBC4E1462FDC80EFA7E6DEC4D875
AEBA638D97B5FDB60DAE72F61CCEDB67E19A3BF484FB39D0A8D123B857156A5F
CAB39117D4FC296AFF4B815E7CC5ED87F745B8F71C7A73D9FCBB2EDDDA736956
D15EA7DBD293822008C27982F05D34E14C741554A5796677055E0F04033A05BA
D9FC316E4FAD85717795CA116E1FE34BE23EFF6EB547C3FDEAD0C218BD5619E5
5ED41E491B276F77843F369E09773F2E6A9E14D7945B8BBF18D94F0ED95C7D1E
778F26EF3B650E2CEE143918779FD10F2CE75AEC7B448A73491004411084EC58
963F3F69795D8565F516B2CFEF954EE6FB99BFFB31AF3369FD0F06788857C9E0
AEA83927F3BDCE98FED4399C768FE657353F1DE7EC1CA2DDFD39A5D17AA0B718
11CFC7B81DF1DF72CC7F97C6EBC3E41C4CB9D3E460DA9D90C3A172997627E4C0
E21ECAC18F701F9A766BBD16E7B719DC49F5B719DD71FD6733B8FBBD96E58CCA
DB3DCA3999B7DB540E453F7F8A7EFE16FDFE51F4FB97205C068E001D7C88C2
}
end
end

View File

@ -10,19 +10,21 @@ unit vtmain;
interface
uses
uses lazlogger,
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls,
ExtCtrls, ComCtrls, EditBtn, fpimage, fpvectorial, Types;
ExtCtrls, ComCtrls, EditBtn, Buttons, fpimage, fpvectorial, Types;
type
TRenderEvent = procedure(APage: TvVectorialPage;
AIntParam: Integer = MaxInt) of object;
TRenderEvent = procedure(APage: TvVectorialPage; AIntParam: Integer = MaxInt) of object;
TRenderState = (rsUnknown, rsPassed, rsFailed);
TRenderParams = class
RefFile: String;
IntParam: Integer;
OnRender: TRenderEvent;
RenderState: array[0..1] of TRenderState; // 0 = svg, 1 = wmf
constructor Create(ARenderEvent: TRenderEvent; ARefFilename: String;
AIntParam: Integer = MaxInt);
end;
@ -46,9 +48,17 @@ type
GroupBox1: TGroupBox;
gbReadWriteTest: TGroupBox;
GbTree: TGroupBox;
gbResults: TGroupBox;
imgUnknown: TImage;
ImgPassed: TImage;
ImgFailed: TImage;
ImageList: TImageList;
Label1: TLabel;
Label14: TLabel;
LblBothImagesMustMatch1: TLabel;
rbUnknown: TRadioButton;
rbPassed: TRadioButton;
rbFailed: TRadioButton;
RefImage: TImage;
Label10: TLabel;
Label11: TLabel;
@ -73,8 +83,12 @@ type
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure PaintBoxPaint(Sender: TObject);
procedure ResultStateChange(Sender: TObject);
procedure rgTestResultsSelectionChanged(Sender: TObject);
procedure TreeCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
procedure TreeGetImageIndex(Sender: TObject; Node: TTreeNode);
procedure TreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
procedure TreeSelectionChanged(Sender: TObject);
private
@ -82,6 +96,7 @@ type
FDoc: array[TRenderCoords] of TvVectorialDocument;
FDocFromWMF: array[TRenderCoords] of TvVectorialDocument;
FDocFromSVG: array[TRenderCoords] of TvVectorialDocument;
FLockResults: Integer;
function GetFileFormat: TvVectorialFormat;
function GetFileFormatExt: String;
procedure Populate;
@ -94,6 +109,8 @@ type
procedure ShowRenderTestImages;
procedure ShowWriteReadTestImages;
procedure UpdateCmdStates;
procedure UpdateResultStates;
procedure UpdateTestResults;
procedure WriteIni;
// Simple shapes, solid fills and gradients
@ -130,7 +147,7 @@ implementation
{$R *.lfm}
uses
Math, FPCanvas, IniFiles, LazFileUtils, LCLIntf,
Math, TypInfo, FPCanvas, IniFiles, LazFileUtils, LCLIntf,
fpvutils, vtprimitives;
const
@ -138,6 +155,24 @@ const
REFIMG_FOLDER = IMG_FOLDER + 'ref' + PathDelim;
NOT_SAVED = '(not saved)';
function RenderStateToStr(AState: TRenderState): String;
begin
Result := GetEnumName(TypeInfo(TRenderState), ord(AState));
Delete(Result, 1, 2);
end;
function StrToRenderState(s: String): TRenderState;
var
n: Integer;
p: Integer;
begin
p := pos(':', s);
if p > 0 then
s := Copy(s, p+1);
n := GetEnumValue(TypeInfo(TRenderState), 'rs' + s);
Result := TRenderState(n);
end;
{ TRenderParams }
@ -255,6 +290,7 @@ procedure TMainForm.CbFileFormatChange(Sender: TObject);
begin
ShowWriteReadTestImages;
UpdateCmdStates;
UpdateResultStates;
end;
procedure TMainForm.PrepareDoc(var ADoc: TvVectorialDocument;
@ -292,8 +328,8 @@ begin
WRBottomLeftPaintbox.Hint := NOT_SAVED;
WRTopLeftPaintbox.Hint := NOT_SAVED;
ReadIni;
Populate;
ReadIni;
TreeSelectionChanged(nil);
end;
@ -389,10 +425,46 @@ begin
page.Render(TPaintbox(Sender).Canvas, 0, h, 1.0, -1.0);
end;
procedure TMainForm.ResultStateChange(Sender: TObject);
var
renderParams: TRenderParams;
begin
if FLockResults > 0 then
exit;
if (Tree.Selected <> nil) and (Tree.Selected.Data <> nil) then
begin
renderParams := TRenderParams(Tree.Selected.Data);
if rbUnknown.Checked then
renderParams.RenderState[cbFileFormat.ItemIndex] := rsUnknown
else if rbPassed.Checked then
renderParams.RenderState[cbFileFormat.ItemIndex] := rsPassed
else if rbFailed.Checked then
renderParams.RenderState[cbFileFormat.ItemIndex] := rsFailed;
TreeGetImageIndex(nil, Tree.Selected);
Tree.Invalidate;
end;
end;
procedure TMainForm.rgTestResultsSelectionChanged(Sender: TObject);
var
renderParams: TRenderParams;
begin
if FLockResults > 0 then
exit;
if (Tree.Selected <> nil) and (Tree.Selected.Data <> nil) then
begin
renderParams := TRenderParams(Tree.Selected.Data);
//renderParams.RenderState[CbFileFormat.ItemIndex] := TRenderState(rgTestResults.ItemIndex);
TreeGetImageIndex(nil, Tree.Selected);
Tree.Invalidate;
end;
end;
procedure TMainForm.Populate;
var
mainNode: TTreeNode;
node, node0, node1, node2: TTreeNode; // needed by include files
node, node1, node2: TTreeNode; // needed by include files
begin
Tree.Items.Clear;
@ -853,6 +925,11 @@ var
ini: TCustomIniFile;
L, T, W, H: Integer;
rct: TRect;
i: Integer;
List: TStrings;
node: TTreeNode;
s: String;
sa: TStringArray;
begin
ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
@ -866,6 +943,23 @@ begin
if T + H > rct.Bottom - rct.Top then T := rct.Bottom - H;
if T < 0 then T := rct.Top;
SetBounds(L, T, W, H);
List := TStringList.Create;
try
ini.ReadSection('Results', List);
for i := 0 to List.Count-1 do begin
s := List[i];
s := ini.ReadString('Results', List[i], '');
node := Tree.Items.FindNodeWithTextPath(List[i]);
if (s = '') or (node = nil) or (node.Data = nil) then
Continue;
sa := s.Split(';');
TRenderParams(node.Data).RenderState[0] := StrToRenderState(sa[0]);
//TRenderParams(node.Data).RenderState[1] := StrToRenderState(sa[1]);
end;
finally
List.Free;
end;
finally
ini.Free;
end;
@ -874,6 +968,29 @@ end;
procedure TMainForm.WriteIni;
var
ini: TCustomIniFile;
procedure WriteTestState(ANode: TTreeNode);
var
renderParams: TRenderParams;
s: String;
begin
if ANode = nil then
exit;
renderParams := TRenderParams(ANode.Data);
if Assigned(renderParams) then
begin
if (renderParams.RenderState[0] <> rsUnknown) or (renderParams.RenderState[1] <> rsUnknown) then
begin
s := 'svg:' + RenderStateToStr(renderParams.RenderState[0]) + ';' +
'wmf:' + RenderStateToStr(renderParams.RenderState[1]);
ini.WriteString('Results', ANode.GetTextPath, s);
end;
end;
if ANode.HasChildren then
WriteTestState(ANode.GetFirstChild);
WriteTestState(ANode.GetNextSibling);
end;
begin
ini := TMemIniFile.Create(ChangeFileExt(Application.ExeName, '.ini'));
try
@ -884,6 +1001,10 @@ begin
ini.WriteInteger('MainForm', 'Width', Width);
ini.WriteInteger('MainForm', 'Height', Height);
end;
ini.EraseSection('Results');
WriteTestState(Tree.Items.GetFirstNode);
finally
ini.Free;
end;
@ -1012,22 +1133,45 @@ begin
ShowFileImage(fn, true, WRTopLeftPaintbox);
end;
procedure TMainForm.TreeCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.HasChildren then
Sender.Canvas.Font.Style := [fsBold]
else
Sender.Canvas.Font.Style := [];
DefaultDraw := true;
end;
procedure TMainForm.TreeGetImageIndex(Sender: TObject; Node: TTreeNode);
var
renderParams: TRenderParams;
begin
if Node.HasChildren then
Node.ImageIndex := -1
else begin
renderParams := TRenderParams(Node.Data);
if renderParams = nil then
Node.ImageIndex := 0
else
Node.ImageIndex := ord(renderParams.RenderState[CbFileFormat.ItemIndex]);
end;
end;
procedure TMainForm.TreeGetSelectedIndex(Sender: TObject; Node: TTreeNode);
begin
Node.SelectedIndex := Node.ImageIndex;
end;
procedure TMainForm.TreeSelectionChanged(Sender: TObject);
begin
ShowRenderTestImages;
ShowRefImageTest;
ShowWriteReadTestImages;
UpdateTestResults;
UpdateCmdStates;
end;
procedure TMainForm.TreeCustomDrawItem(Sender: TCustomTreeView; Node: TTreeNode;
State: TCustomDrawState; var DefaultDraw: Boolean);
begin
if Node.HasChildren then
Sender.Canvas.Font.Style := [fsBold] else
Sender.Canvas.Font.Style := [];
end;
procedure TMainForm.UpdateCmdStates;
var
fn: String;
@ -1057,5 +1201,38 @@ begin
BtnViewTopLeft.Enabled := rcOK[rcTopLeftCoords];
end;
procedure TMainForm.UpdateResultStates;
procedure UpdateImageIndex(ANode: TTreeNode);
begin
if ANode = nil then
exit;
TreeGetImageIndex(nil, ANode);
ANode.SelectedIndex := ANode.ImageIndex;
if ANode.HasChildren then
UpdateImageIndex(ANode.GetFirstChild);
UpdateImageIndex(ANode.GetNextSibling);
end;
begin
UpdateImageIndex(Tree.Items.GetFirstNode);
end;
procedure TMainForm.UpdateTestResults;
var
renderParams: TRenderParams;
begin
if not Assigned(Tree.Selected) or not Assigned(Tree.Selected.Data) then
exit;
inc(FLockResults);
renderParams := TRenderParams(Tree.Selected.Data);
case renderParams.RenderState[cbFileFormat.ItemIndex] of
rsUnknown: rbUnknown.Checked := true;
rsPassed: rbPassed.Checked := true;
rsFailed: rbFailed.Checked := true;
end;
dec(FLockResults);
end;
end.