// Squawk messenger. // Copyright (C) 2019 Yury Gubich // // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with this program. If not, see . #include "omemo.h" #include "ui_omemo.h" #include constexpr uint8_t fingerprintLength = 32; Omemo::Omemo(QWidget* parent): QWidget(parent), m_ui(new Ui::Omemo()), keysDelegate(), unusedKeysDelegate(), keysModel(), unusedKeysModel(), contextMenu(new QMenu()) { m_ui->setupUi(this); generateMockData(); m_ui->keysView->setItemDelegate(&keysDelegate); m_ui->keysView->setModel(&keysModel); m_ui->unusedKeysView->setItemDelegate(&unusedKeysDelegate); m_ui->unusedKeysView->setModel(&unusedKeysModel); m_ui->keysView->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_ui->keysView, &QWidget::customContextMenuRequested, this, &Omemo::onActiveKeysContextMenu); } Omemo::~Omemo() { contextMenu->deleteLater(); } void Omemo::generateMockData() { std::random_device rd; std::uniform_int_distribution dist(CHAR_MIN, CHAR_MAX); for (int i = 0; i < 5; ++i) { QByteArray fp(fingerprintLength, 0); for (int i = 0; i < fingerprintLength; ++i) { fp[i] = dist(rd); } Shared::KeyInfo info; info.id = i; if (i % 3 == 0) info.label = QString("test_") + std::to_string(i).c_str(); info.fingerPrint = fp; if (i % 2 == 0) info.lastInteraction = QDateTime::currentDateTime(); keysModel.addKey(info); } } void Omemo::onActiveKeysContextMenu(const QPoint& pos) { contextMenu->clear(); QModelIndex index = m_ui->keysView->indexAt(pos); if (index.isValid()) { QVariant dirtyV = index.data(Models::Keys::Dirty); if (dirtyV.isValid() && dirtyV.toBool()) { QAction* rev = contextMenu->addAction(Shared::icon("clean"), tr("Revert changes")); connect(rev, &QAction::triggered, std::bind(&Models::Keys::revertKey, &keysModel, index.row())); } QVariant levelV = index.data(Models::Keys::TrustLevel); if (levelV.isValid()) { Shared::TrustLevel level = static_cast(levelV.toUInt()); if (level == Shared::TrustLevel::undecided || level == Shared::TrustLevel::automaticallyDistrusted || level == Shared::TrustLevel::manuallyDistrusted ) { QAction* rev = contextMenu->addAction(Shared::icon("favorite"), tr("Trust")); connect(rev, &QAction::triggered, std::bind(&Models::Keys::setTrustLevel, &keysModel, index.row(), Shared::TrustLevel::manuallyTrusted ) ); } if (level == Shared::TrustLevel::undecided || level == Shared::TrustLevel::automaticallyTrusted || level == Shared::TrustLevel::manuallyTrusted || level == Shared::TrustLevel::authenticated ) { QAction* rev = contextMenu->addAction(Shared::icon("unfavorite"), tr("Distrust")); connect(rev, &QAction::triggered, std::bind(&Models::Keys::setTrustLevel, &keysModel, index.row(), Shared::TrustLevel::manuallyDistrusted ) ); } } } contextMenu->popup(m_ui->keysView->viewport()->mapToGlobal(pos)); }