Показатель работы внизу: ход, участок на монтаже, переключатель журнала
Полоска выполнения теперь показывает всё, что делается в стороне от окна: сборку наложений и затуханий, разбор звука, миниатюры. Раньше она знала только про звук и миниатюры, а самое долгое — пересборку участков с прозрачностью — не показывала вовсе. Как она растёт. Настоящая доля известна только вехами: вставка готова, файл разобран. Между вехами не происходит ничего видимого, и полоска, стоящая на месте, выглядит как зависшая программа. Поэтому между вехами она ползёт сама — к следующей вехе, но никогда её не достигая: каждый шаг покрывает малую долю оставшегося расстояния. Работа идёт как задумано — веха приходит быстро и полоска прыгает к ней; затянулась — шаги мельчают, и заполнение само собой замедляется. Назад не идёт никогда, полной без настоящего конца не становится. Расчёт вынесен в uAppTypes отдельной функцией именно затем, чтобы его можно было прогнать числами, и прогоняется: проверки в tests/progress/progtest.lpr включены в build.sh. Замер: до половины пути десять шагов таймера, до трёх четвертей — ещё десять. Участок монтажа, который сейчас пересобирается, помечается косой штриховкой во всю высоту дорожек. Сплошная заливка закрыла бы клипы, а рамка на узком участке была бы неразличима; штрих наклонный, чтобы его не спутать с курсором и границами клипов — те все вертикальные. Кнопка «Журнал» прячет и показывает нижнюю полосу с сообщениями, состояние переживает перезапуск. Системный TStatusBar не взят намеренно: его рисует система, и под Windows он остался бы светлой полосой — ровно та беда, из-за которой уже переписаны кнопки, полосы прокрутки, журнал и меню. Всё сделано на своей нижней панели, теми же средствами.
This commit is contained in:
parent
1e00cd9f44
commit
fd34e71f49
9 changed files with 401 additions and 15 deletions
110
tests/progress/progtest.lpr
Normal file
110
tests/progress/progtest.lpr
Normal 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.
|
||||
Loading…
Add table
Add a link
Reference in a new issue