Показатель работы внизу: ход, участок на монтаже, переключатель журнала

Полоска выполнения теперь показывает всё, что делается в стороне от
окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она
знала только про звук и миниатюры, а самое долгое — пересборку участков
с прозрачностью — не показывала вовсе.

Как она растёт. Настоящая доля известна только вехами: вставка готова,
файл разобран. Между вехами не происходит ничего видимого, и полоска,
стоящая на месте, выглядит как зависшая программа. Поэтому между вехами
она ползёт сама — к следующей вехе, но никогда её не достигая: каждый
шаг покрывает малую долю оставшегося расстояния. Работа идёт как
задумано — веха приходит быстро и полоска прыгает к ней; затянулась —
шаги мельчают, и заполнение само собой замедляется. Назад не идёт
никогда, полной без настоящего конца не становится.

Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его
можно было прогнать числами, и прогоняется: проверки в
tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути
десять шагов таймера, до трёх четвертей — ещё десять.

Участок монтажа, который сейчас пересобирается, помечается косой
штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а
рамка на узком участке была бы неразличима; штрих наклонный, чтобы его
не спутать с курсором и границами клипов — те все вертикальные.

Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями,
состояние переживает перезапуск.

Системный TStatusBar не взят намеренно: его рисует система, и под
Windows он остался бы светлой полосой — ровно та беда, из-за которой уже
переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей
нижней панели, теми же средствами.
This commit is contained in:
4aiman 2026-08-22 00:52:09 +03:00
commit fd34e71f49
9 changed files with 401 additions and 15 deletions

110
tests/progress/progtest.lpr Normal file
View file

@ -0,0 +1,110 @@
{
Проверка того, как ползёт полоска выполнения.
Проверяется не картинка, а поведение: назад не идёт, между вехами
замедляется, при затянувшейся работе не упирается в конец.
Отдельная программа, а не проверка внутри редактора: расчёт вынесен в
uAppTypes именно затем, чтобы его можно было прогнать числами.
}
program progtest;
{$mode objfpc}{$H+}
uses
SysUtils, uAppTypes;
const
Step = 0.07;
var
Failed: Integer = 0;
procedure Check(const AName: string; ACondition: Boolean);
begin
if ACondition then
WriteLn(' ok ', AName)
else
begin
WriteLn(' ПЛОХО ', AName);
Inc(Failed);
end;
end;
{ Сколько шагов таймера пройдёт, пока полоска идёт от одного значения к
другому при неизменных вехах. }
function StepsFrom(AShown, AReal, ANext, ATarget: Double): Integer;
var
V: Double;
begin
Result := 0;
V := AShown;
while (V < ATarget) and (Result < 100000) do
begin
V := AdvanceProgress(V, AReal, ANext, Step);
Inc(Result);
end;
end;
var
V, Prev: Double;
I, N1, N2: Integer;
begin
WriteLn('Ход полоски выполнения');
WriteLn;
{ 1. Назад не идёт никогда, даже если настоящая доля вдруг меньше.
Сравнение с запасом: константа в исходнике считается в расширенной
точности, а значение хранится как Double, и точное равенство между
ними не выполняется никогда. }
V := AdvanceProgress(0.6, 0.2, 0.25, Step);
Check('назад не идёт', V >= 0.6 - 1E-9);
{ 2. Веха достигнута — прыгаем к ней сразу. }
V := AdvanceProgress(0.1, 0.5, 0.75, Step);
Check('до настоящей доли догоняет сразу', V >= 0.5);
{ 3. Между вехами ползёт, но следующей не достигает. }
V := 0;
for I := 1 to 200 do
V := AdvanceProgress(V, 0, 0.25, Step);
Check('между вехами движется', V > 0.2);
Check('следующую веху не переступает', V < 0.25);
{ 4. Замедление: вторая половина пути до вехи занимает столько же шагов,
сколько первая. Это и значит «чем дольше, тем медленнее». }
N1 := StepsFrom(0, 0, 1, 0.5);
N2 := StepsFrom(0.5, 0, 1, 0.75);
Check('вторая половина пути не быстрее первой', N2 >= N1);
WriteLn(Format(' шагов до половины: %d, до трёх четвертей: %d',
[N1, N1 + N2]));
{ 5. В конец не упирается, сколько ни жди. }
V := 0;
for I := 1 to 100000 do
V := AdvanceProgress(V, 0, 1, Step);
Check('полной не становится без настоящего конца', V <= 0.999);
{ 6. Ход монотонный. }
V := 0;
Prev := -1;
for I := 1 to 500 do
begin
V := AdvanceProgress(V, 0, 1, Step);
if V < Prev then
Break;
Prev := V;
end;
Check('ход монотонный', V >= Prev);
WriteLn;
if Failed = 0 then
WriteLn('ВЕРДИКТ: все проверки пройдены')
else
begin
WriteLn('ВЕРДИКТ: не пройдено проверок: ', Failed);
Halt(1);
end;
end.