/* * 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; UI::Omemo::Omemo(QWidget* parent): QWidget(parent), m_ui(new Ui::Omemo()), deviceKeyDelegate(), keysDelegate(), unusedKeysDelegate(), deviceKeyModel(), keysModel(), unusedKeysModel(), contextMenu(new QMenu()) { m_ui->setupUi(this); m_ui->deviceKeyView->setItemDelegate(&deviceKeyDelegate); m_ui->deviceKeyView->setModel(&deviceKeyModel); m_ui->keysView->setItemDelegate(&keysDelegate); m_ui->keysView->setModel(&keysModel); m_ui->unusedKeysView->setItemDelegate(&unusedKeysDelegate); m_ui->unusedKeysView->setModel(&unusedKeysModel); unusedVisibility(false); deviceKeyVisibility(false); m_ui->keysView->setContextMenuPolicy(Qt::CustomContextMenu); connect(m_ui->keysView, &QWidget::customContextMenuRequested, this, &Omemo::onActiveKeysContextMenu); } UI::Omemo::~Omemo() { contextMenu->deleteLater(); } void UI::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 UI::Omemo::setData(const std::list& keys) { keysModel.clear(); unusedKeysModel.clear(); deviceKeyModel.clear(); for (const Shared::KeyInfo& key : keys) { if (key.currentDevice) deviceKeyModel.addKey(key); else keysModel.addKey(key); } unusedVisibility(unusedKeysModel.rowCount() > 0); deviceKeyVisibility(deviceKeyModel.rowCount() > 0); } void UI::Omemo::fillData(std::list& out) { deviceKeyModel.finalKeys(out); keysModel.finalKeys(out); unusedKeysModel.finalKeys(out); } const QString UI::Omemo::title() const { return m_ui->OMEMOHeading->text(); } void UI::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)); } void UI::Omemo::deviceKeyVisibility(bool visible) { m_ui->deviceKeyHeading->setVisible(visible); m_ui->deviceKeyline->setVisible(visible); m_ui->deviceKeyView->setVisible(visible); } void UI::Omemo::unusedVisibility(bool visible) { m_ui->unusedKeysView->setVisible(visible); m_ui->unusedKeysHeading->setVisible(visible); m_ui->line->setVisible(visible); }