Verify visible copy confirmation, expiry and repeated clicks
This commit is contained in:
1 parent
2cc3451721
commit
be7421e6e2
2 files changed
+31
No files matched your search
@@ -36,6 +36,8 @@ int value = 42;
|
||||
сохраняются. Длинные строки визуально переносятся без изменения копируемого текста.
|
||||
Над каждым блоком находится кнопка Copy: копирует весь код без ограждений и метки языка,
|
||||
включая пробелы, табуляции и пустые строки. Перетаскивание не активирует кнопку.
|
||||
После копирования кнопка на 1,5 секунды подсвечивается и показывает «Скопировано»;
|
||||
повторное нажатие продлевает подтверждение. Размер кнопки при этом не меняется.
|
||||
В шапке слева показано имя указанного/распознанного языка (например, C++ или JavaScript), справа — Copy.
|
||||
Если язык определить не удалось, показано `text`; неизвестная явная метка показывается как написана в ограждении.
|
||||
Внутри кода нет форматирования маркерами, кликабельных ссылок и анимированных emoji.
|
||||
|
||||
@@ -440,6 +440,35 @@ private slots:
|
||||
QVERIFY2(elapsed < 5000, "Message link parsing exceeded the UI regression guard");
|
||||
}
|
||||
|
||||
void codeCopyConfirmation() {
|
||||
QStandardItemModel model(1, 1); const auto index = model.index(0, 0);
|
||||
model.setData(index, "```cpp\nint value = 42;\n```", MsgTextRole);
|
||||
ChatView view; MessageDelegate delegate;
|
||||
view.setModel(&model); view.setItemDelegate(&delegate); view.resize(400, 220); view.show(); QTest::qWait(30);
|
||||
QStyleOptionViewItem option; option.initFrom(&view); option.widget = &view; option.rect = view.visualRect(index);
|
||||
QPoint button; bool found = false;
|
||||
for (int y = 0; y < option.rect.height() && !found; y += 4) for (int x = 0; x < view.viewport()->width(); x += 8) {
|
||||
if (delegate.codeCopyAt(option, index, QPoint(x, y)) != 0) continue;
|
||||
button = QPoint(x, y); found = true; break;
|
||||
}
|
||||
QVERIFY(found);
|
||||
const auto original = view.viewport()->grab().toImage();
|
||||
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, button);
|
||||
QCOMPARE(QApplication::clipboard()->text(), QString("int value = 42;"));
|
||||
const auto copied = view.viewport()->grab().toImage();
|
||||
QVERIFY(copied != original);
|
||||
QVERIFY(view.grab().save(QDir::tempPath() + "/code-copy-confirmation.png"));
|
||||
QTest::qWait(800);
|
||||
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, button);
|
||||
QTest::qWait(800); // Первый timeout уже прошёл, повторное нажатие должно продлить надпись.
|
||||
QCOMPARE(view.viewport()->grab().toImage(), copied);
|
||||
QTRY_COMPARE_WITH_TIMEOUT(view.viewport()->grab().toImage(), original, 2000);
|
||||
// Уничтожение строки и вида во время подтверждения безопасно.
|
||||
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, button);
|
||||
model.clear(); QCoreApplication::processEvents();
|
||||
QCOMPARE(model.rowCount(), 0);
|
||||
}
|
||||
|
||||
void codeBlockCopy_data() {
|
||||
QTest::addColumn<bool>("outgoing"); QTest::addColumn<bool>("dark"); QTest::addColumn<int>("width");
|
||||
for (bool outgoing : {false, true}) for (bool dark : {false, true}) for (int width : {280, 700})
|
||||
|
||||
Reference in new issue
Block a user