Кнопки внизу: подсказка не перехватывает щелчок, щелчки не теряются
Две беды у всех кнопок нижней полосы. Всплывающая подсказка появлялась прямо поверх кнопки, о которой рассказывает, и перехватывала щелчок: нажать кнопку было нельзя. Подсказка переехала в строку состояния — она в той же полосе, ничего не закрывает и меняется сразу после щелчка, не дожидаясь нового наведения. Строка состояния теперь занимает всё свободное место справа, пока рядом не показан ход работы, а самые длинные подсказки укорочены: раньше их обрезало на полуслове. Второй щелчок подряд виджетсет отдавал как двойной, и кнопка его не видела: быстрая очередь щелчков срабатывала через раз. У кнопки убран csDoubleClicks, а на случай, если двойной всё же дойдёт, он считается за обычный. Проверено: tests/lfmcheck, раздел «Кнопки нижней панели», и tests/buttonclicks.sh мышью на невидимом экране — по всем шести переключателям очереди из 1-5 щелчков отрабатываются полностью.
This commit is contained in:
parent
569d0382f7
commit
aba9bd57e4
5 changed files with 296 additions and 15 deletions
56
tests/buttonclicks.sh
Executable file
56
tests/buttonclicks.sh
Executable 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)"
|
||||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue