Check desktop call buttons, online changes, drags, and shifted radio mute control

This commit is contained in:
evgeny committed 2026-10-19 14:22:46 +02:00
1 parent cd58903101
commit 9712a0a583
2 files changed
+36 -15

No files matched your search

+32 -11
View File
@@ -1,4 +1,4 @@
/* Проверка реальных координат перенесённых ссылок и кнопки приглашения в строке участника. */
/* Проверка реальных координат ссылок и трёх кнопок действий в строке участника. */
#include "../src/messagedelegate.h"
#include "../src/chatview.h"
#include "../src/accountdelegate.h"
@@ -422,21 +422,41 @@ private slots:
QVERIFY(selection.endChar - selection.startChar < 20);
}
void memberPlusTargetsOtherMembersOnly() {
void memberCallButtonsTargetOnlinePeersOnly() {
QStandardItemModel model;
auto* other = new QStandardItem("other"); other->setData(false, Qt::UserRole + 2); model.appendRow(other);
auto* self = new QStandardItem("self"); self->setData(true, Qt::UserRole + 2); model.appendRow(self);
QListView view; AccountDelegate delegate;
view.setModel(&model); view.setItemDelegate(&delegate); view.resize(240, 140); view.show();
QTest::qWait(30);
QSignalSpy invites(&delegate, &AccountDelegate::inviteRequested);
QSignalSpy radios(&delegate, &AccountDelegate::radioCallRequested);
QSignalSpy calls(&delegate, &AccountDelegate::callRequested);
const QRect row = view.visualRect(model.index(0, 0));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(row.right() - 17, row.center().y()));
QCOMPARE(invites.count(), 1); QCOMPARE(qvariant_cast<QModelIndex>(invites.first().first()).row(), 0);
const QPoint radio(row.right() - 50, row.center().y()), phone(row.right() - 17, row.center().y());
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, radio);
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, phone);
QCOMPARE(radios.count(), 0); QCOMPARE(calls.count(), 0);
other->setData(true, MemberListModel::OnlineRole);
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, radio);
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, phone);
QCOMPARE(radios.count(), 1); QCOMPARE(qvariant_cast<QModelIndex>(radios.first().first()).row(), 0);
QCOMPARE(calls.count(), 1); QCOMPARE(qvariant_cast<QModelIndex>(calls.first().first()).row(), 0);
const QRect own = view.visualRect(model.index(1, 0));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(own.right() - 17, own.center().y()));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(own.right() - 50, own.center().y()));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(60, row.center().y()));
QCOMPARE(invites.count(), 1);
QCOMPARE(radios.count(), 1); QCOMPARE(calls.count(), 1);
QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, radio);
QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, phone);
QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, radio);
QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, radio + QPoint(6, 0));
QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, phone);
other->setData(false, MemberListModel::OnlineRole);
QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, phone);
QCOMPARE(radios.count(), 1); QCOMPARE(calls.count(), 1);
other->setData(true, MemberListModel::OnlineRole);
const QString preview = qEnvironmentVariable("UTUN_MEMBER_ACTION_PREVIEW");
if (!preview.isEmpty()) QVERIFY(view.grab().save(preview));
}
void radioMuteButtonTargetsMemberAndChangesColor() {
@@ -446,20 +466,21 @@ private slots:
QListView view; AccountDelegate delegate;
view.setModel(&model); view.setItemDelegate(&delegate); view.resize(280, 140); view.show(); QTest::qWait(30);
QSignalSpy toggles(&delegate, &AccountDelegate::radioMuteRequested);
QSignalSpy invites(&delegate, &AccountDelegate::inviteRequested);
QSignalSpy radios(&delegate, &AccountDelegate::radioCallRequested);
QSignalSpy calls(&delegate, &AccountDelegate::callRequested);
connect(&delegate, &AccountDelegate::radioMuteRequested, &model, [&](const QModelIndex& index) {
model.setData(index, index.data(Qt::UserRole + 3).toInt() ^ CHAT_MEMBER_FLAG_RADIO_MUTED, Qt::UserRole + 3);
});
const QModelIndex index = model.index(0, 0);
const QRect row = view.visualRect(index);
const QPoint button(row.right() - 50, row.center().y());
const QPoint button(row.right() - 82, row.center().y());
auto colorCount = [&](QRgb color) {
QImage image(view.viewport()->size(), QImage::Format_RGB32); image.fill(Qt::white);
QStyleOptionViewItem option; option.initFrom(&view); option.rect = row;
QPainter painter(&image); delegate.paint(&painter, option, index); painter.end();
int count = 0;
for (int y = row.top(); y <= row.bottom(); ++y)
for (int x = row.right() - 63; x < row.right() - 35; ++x) count += image.pixel(x, y) == color;
for (int x = row.right() - 95; x < row.right() - 67; ++x) count += image.pixel(x, y) == color;
return count;
};
QVERIFY(colorCount(QColor("#9E9E9E").rgb()) > 0); // Молчащий участник серый; зелёный означает передачу.
@@ -471,9 +492,9 @@ private slots:
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, button);
QCOMPARE(toggles.count(), 2); QVERIFY(colorCount(QColor("#4CAF50").rgb()) > 0);
const QRect own = view.visualRect(model.index(1, 0));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(own.right() - 50, own.center().y()));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(own.right() - 17, own.center().y()));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(65, row.center().y()));
QCOMPARE(toggles.count(), 2); QCOMPARE(invites.count(), 0);
QCOMPARE(toggles.count(), 2); QCOMPARE(radios.count(), 0); QCOMPARE(calls.count(), 0);
QTest::mousePress(view.viewport(), Qt::LeftButton, Qt::NoModifier, button);
QTest::mouseRelease(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(65, row.center().y()));
QCOMPARE(toggles.count(), 2);
@@ -128,14 +128,14 @@ private slots:
connect(&delegate, &AccountDelegate::radioMuteRequested, &view, [&](const QModelIndex&) {
accepted = gui_bridge_toggle_member_radio_mute(probe.channel.toUtf8().constData(), 42);
});
const QRect row = view.visualRect(source); const QPoint button(row.right() - 50, row.center().y());
const QRect row = view.visualRect(source); const QPoint button(row.right() - 82, row.center().y());
auto iconImage = [&] {
return view.viewport()->grab().toImage().copy(QRect(row.right() - 63, row.center().y() - 14, 28, 28));
return view.viewport()->grab().toImage().copy(QRect(row.right() - 95, row.center().y() - 14, 28, 28));
};
auto iconHasColor = [&](const QColor& color) {
const QImage image = view.viewport()->grab().toImage();
for (int y = row.top(); y <= row.bottom(); ++y)
for (int x = row.right() - 63; x < row.right() - 35; ++x) if (image.pixelColor(x, y) == color) return true;
for (int x = row.right() - 95; x < row.right() - 67; ++x) if (image.pixelColor(x, y) == color) return true;
return false;
};
QVERIFY(iconHasColor(QColor("#9E9E9E"))); QVERIFY(!iconHasColor(QColor("#4CAF50")));
@@ -186,7 +186,7 @@ private slots:
QVERIFY(self.isValid());
model.setRadioState(group, true, true); QVERIFY(self.data(MemberListModel::RadioSpeakingRole).toBool());
const QRect selfRow = view.visualRect(self);
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(selfRow.right() - 50, selfRow.center().y()));
QTest::mouseClick(view.viewport(), Qt::LeftButton, Qt::NoModifier, QPoint(selfRow.right() - 17, selfRow.center().y()));
QCOMPARE(probe.results.size(), 2); // Собственный динамик не переключает mute.
model.setRadioState(group, true, false); QVERIFY(!self.data(MemberListModel::RadioSpeakingRole).toBool());