Skip to content

Commit

Permalink
Merge branch 'main' into tscriptfunc
Browse files Browse the repository at this point in the history
  • Loading branch information
martijnlaan committed Nov 17, 2024
2 parents 8c1fe5c + 0ca8856 commit 9557730
Show file tree
Hide file tree
Showing 4 changed files with 33 additions and 14 deletions.
2 changes: 2 additions & 0 deletions Components/NewTabSet.pas
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,9 @@ procedure TNewTabSet.CreateWnd;
destructor TNewTabSet.Destroy;
begin
UpdateThemeData(False);
FHints.Free;
FTabs.Free;
FCloseButtons.Free;
inherited;
end;

Expand Down
2 changes: 1 addition & 1 deletion ISHelp/isxfunc.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1849,7 +1849,7 @@ end;</pre>
<p>The archive must not be encrypted.</p>
<p>Set OnExtractionProgress to a function to be informed of progress, or <tt>nil</tt> otherwise.</p></description>
<remarks><p>TOnExtractionProgress is defined as:</p>
<p><tt>TOnExtractionProgress = function(const ArchiveName, FileName: string; const Progress, ProgressMax: Int64): Boolean;</tt></p>
<p><tt>TOnExtractionProgress = function(const ArchiveName, FileName: String; const Progress, ProgressMax: Int64): Boolean;</tt></p>
<p>Return True to allow the extraction to continue, False otherwise.</p>
<p><tt>Extract7ZipArchive</tt> uses an embedded version of the &quot;7z ANSI-C Decoder&quot; from the LZMA SDK by Igor Pavlov, as-is, except that Unicode support and error messages were improved and that it outputs memory requirements.</p>
<p>All output of the decoder is logged if logging is enabled, including error messages but excluding empty lines.</p>
Expand Down
4 changes: 2 additions & 2 deletions Projects/Src/Compiler.ScriptFunc.pas
Original file line number Diff line number Diff line change
Expand Up @@ -140,8 +140,8 @@ procedure ScriptFuncLibraryRegister_C(ScriptCompiler: TPSPascalCompiler;
' SuiteMask: Word;' +
'end');

RegisterType('TOnDownloadProgress', 'function(const Url, FileName: string; const Progress, ProgressMax: Int64): Boolean;');
RegisterType('TOnExtractionProgress', 'function(const ArchiveName, FileName: string; const Progress, ProgressMax: Int64): Boolean;');
RegisterType('TOnDownloadProgress', 'function(const Url, FileName: String; const Progress, ProgressMax: Int64): Boolean;');
RegisterType('TOnExtractionProgress', 'function(const ArchiveName, FileName: String; const Progress, ProgressMax: Int64): Boolean;');
RegisterType('TOnLog', 'procedure(const S: String; const Error, FirstLine: Boolean);');

for var ScriptFuncTable in ScriptFuncTables do
Expand Down
39 changes: 28 additions & 11 deletions Projects/Src/IDE.MainForm.pas
Original file line number Diff line number Diff line change
Expand Up @@ -473,6 +473,7 @@ TMainForm = class(TUIStateForm)
FBuildAnimationFrame: Cardinal;
FLastAnimationTick: DWORD;
FProgress, FProgressMax: Cardinal;
FTaskbarProgressValue: Cardinal;
FProgressThemeData: HTHEME;
FMenuThemeData: HTHEME;
FToolbarThemeData: HTHEME;
Expand Down Expand Up @@ -2312,6 +2313,7 @@ procedure TMainForm.CompileFile(AFilename: String; const ReadFromFile: Boolean);
FBuildAnimationFrame := 0;
FProgress := 0;
FProgressMax := 0;
FTaskbarProgressValue := 0;

FActiveMemo.CancelAutoCompleteAndCallTip;
FActiveMemo.Cursor := crAppStart;
Expand Down Expand Up @@ -7108,16 +7110,15 @@ procedure TMainForm.InvalidateStatusPanel(const Index: Integer);
procedure TMainForm.UpdateCompileStatusPanels(const AProgress,
AProgressMax: Cardinal; const ASecondsRemaining: Integer;
const ABytesCompressedPerSecond: Cardinal);
var
T: DWORD;
begin
{ Icon panel }
T := GetTickCount;
if Cardinal(T - FLastAnimationTick) >= Cardinal(500) then begin
FLastAnimationTick := T;
var CurTick := GetTickCount;
var LastTick := FLastAnimationTick;
FLastAnimationTick := CurTick;

{ Icon and text panels - updated every 500ms }
if CurTick div 500 <> LastTick div 500 then begin
InvalidateStatusPanel(spCompileIcon);
FBuildAnimationFrame := (FBuildAnimationFrame + 1) mod 4;
{ Also update the status text twice a second }
if ASecondsRemaining >= 0 then
StatusBar.Panels[spExtraStatus].Text := Format(
' Estimated time remaining: %.2d%s%.2d%s%.2d Average KB/sec: %.0n',
Expand All @@ -7128,13 +7129,29 @@ procedure TMainForm.UpdateCompileStatusPanels(const AProgress,
StatusBar.Panels[spExtraStatus].Text := '';
end;

{ Progress panel and taskbar progress bar }
if (FProgress <> AProgress) or
(FProgressMax <> AProgressMax) then begin
{ Progress panel and taskbar progress bar - updated every 100ms }
if (CurTick div 100 <> LastTick div 100) and
((FProgress <> AProgress) or (FProgressMax <> AProgressMax)) then begin
FProgress := AProgress;
FProgressMax := AProgressMax;
InvalidateStatusPanel(spCompileProgress);
SetAppTaskbarProgressValue(AProgress, AProgressMax);

{ The taskbar progress updates are slow (on Windows 11). Limiting the
range to 64 instead of 1024 improved compression KB/sec by about 4%
(9000 to 9400) when the rate limit above is disabled. }
var NewValue: Cardinal := 1; { must be at least 1 for progress bar to show }
if AProgressMax > 0 then begin
{ Not using MulDiv here to avoid rounding up }
NewValue := (AProgress * 64) div AProgressMax;
if NewValue = 0 then
NewValue := 1;
end;
{ Don't call the function if the value hasn't changed, just in case there's
a performance penalty. (There doesn't appear to be on Windows 11.) }
if FTaskbarProgressValue <> NewValue then begin
FTaskbarProgressValue := NewValue;
SetAppTaskbarProgressValue(NewValue, 64);
end;
end;
end;

Expand Down

0 comments on commit 9557730

Please sign in to comment.