Кнопки внизу: подсказка не перехватывает щелчок, щелчки не теряются

Две беды у всех кнопок нижней полосы.

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

Второй щелчок подряд виджетсет отдавал как двойной, и кнопка его не
видела: быстрая очередь щелчков срабатывала через раз. У кнопки убран
csDoubleClicks, а на случай, если двойной всё же дойдёт, он считается
за обычный.

Проверено: tests/lfmcheck, раздел «Кнопки нижней панели», и
tests/buttonclicks.sh мышью на невидимом экране — по всем шести
переключателям очереди из 1-5 щелчков отрабатываются полностью.
This commit is contained in:
4aiman 2026-09-30 15:44:29 +03:00
commit aba9bd57e4
5 changed files with 296 additions and 15 deletions

56
tests/buttonclicks.sh Executable file
View file

@ -0,0 +1,56 @@
#!/bin/sh
# Проверка того, что каждый быстрый щелчок по кнопке нижней полосы
# доходит до неё.
#
# Кнопки там — переключатели: щелчок меняет вид полосы. Значит, N щелчков
# подряд должны дать N переключений, и снимки с одинаковой чётностью
# числа щелчков обязаны совпасть, с разной — разойтись. Раньше второй
# щелчок подряд приходил как двойной и пропадал.
#
# Запуск (редактор уже должен идти на невидимом экране :99):
# tests/buttonclicks.sh <окно> <x> <y>
# где окно — из `DISPLAY=:99 xdotool search --name nlve`, а x и y —
# точка внутри кнопки.
set -e
cd "$(dirname "$0")/.."
WIN=$1
X=$2
Y=$3
DISP=${DISP:-:99}
SHOT=${SHOT:-test/кадры-кнопок}
rm -rf "$SHOT"; mkdir -p "$SHOT"
# Снимается низ окна: там и полоса сообщений, и сами кнопки.
H=$(DISPLAY=$DISP xwininfo -id "$WIN" | awk '/Height:/ {print $2}')
W=$(DISPLAY=$DISP xwininfo -id "$WIN" | awk '/Width:/ {print $2}')
CROP="${W}x200+0+$((H - 200))"
# Мышь уводится с кнопки перед снимком: под курсором подсказка идёт в
# строку состояния, и её текст сам по себе отличал бы снимки.
snap() {
DISPLAY=$DISP xdotool mousemove $((W / 2)) $((H / 3))
sleep 0.4
DISPLAY=$DISP import -window "$WIN" -crop "$CROP" +repage "$SHOT/$1.png"
}
same() { compare -metric AE "$SHOT/$1.png" "$SHOT/$2.png" null: 2>&1 | cut -d' ' -f1; }
snap base
TOTAL=0
for N in 1 2 3 4 5; do
I=0
while [ $I -lt $N ]; do
DISPLAY=$DISP xdotool mousemove "$X" "$Y" click 1
I=$((I + 1))
sleep 0.12
done
TOTAL=$((TOTAL + N))
sleep 1.2
snap "после$TOTAL"
echo "залпом $N, всего щелчков $TOTAL: отличий от исходной $(same base "после$TOTAL")"
done
# Полоса сообщений прирастает строками сама по себе, поэтому сверяемся не
# с исходной картинкой, а снимками между собой.
echo " 3 и 15 щелчков (оба нечётные, должны совпасть): $(same после3 после15)"
echo " 6 и 10 щелчков (оба чётные, должны совпасть): $(same после6 после10)"
echo " 6 и 15 щелчков (чётное и нечётное, должны разойтись): $(same после6 после15)"

View file

@ -14,7 +14,7 @@ program lfmcheck;
uses
{ Interfaces нужен, чтобы связалась вся LCL и заработала загрузка
файлов форм. }
Interfaces, Forms, Classes, SysUtils, Math, TypInfo, uTheme,
Interfaces, Forms, Controls, Classes, SysUtils, Math, TypInfo, uTheme,
uMediaProbe, uProject, uTransform, uTimelineCtrl,
uPanCropForm, uDepsForm, uMismatchForm, uProgressForm, uProjectInfoForm,
uRemuxForm;
@ -753,6 +753,63 @@ begin
end;
end;
{ Кнопка нижней панели и быстрые щелчки.
Второй щелчок подряд оконная библиотека отдаёт не как щелчок, а как
двойной — и обработчик кнопки его не видел. Человек нажимал кнопку
дважды, а срабатывало один раз.
Проверяется двумя способами: у кнопки нет csDoubleClicks (тогда
двойных щелчков к ней вообще не приходит), и даже если двойной
придёт, он считается за щелчок. }
type
TButtonProbe = class(TThemedButton)
public
procedure Twice;
end;
procedure TButtonProbe.Twice;
begin
DblClick;
end;
var
ClickCount: Integer = 0;
type
TClickCounter = class
procedure Clicked(Sender: TObject);
end;
procedure TClickCounter.Clicked(Sender: TObject);
begin
Inc(ClickCount);
end;
procedure CheckButtonClicks;
var
Btn: TButtonProbe;
Counter: TClickCounter;
begin
WriteLn;
WriteLn('Кнопки нижней панели');
WriteLn;
Counter := TClickCounter.Create;
Btn := TButtonProbe.Create(nil);
try
Btn.OnClick := @Counter.Clicked;
CheckTrue('двойные щелчки кнопке не приходят',
not (csDoubleClicks in Btn.ControlStyle));
ClickCount := 0;
Btn.Twice;
CheckTrue('двойной щелчок считается за щелчок', ClickCount = 1);
finally
Btn.Free;
Counter.Free;
end;
end;
begin
WriteLn('Свойства из файлов форм');
WriteLn;
@ -788,6 +845,7 @@ begin
CheckSplitAndPlayhead;
CheckSplitAllTracks;
CheckGapTolerance;
CheckButtonClicks;
WriteLn;
if Failed = 0 then