/* (c) Copyright 2012 - 2018 Anton Sviridenko https://picapica.im 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 "contactlistwidget.h" #include "globals.h" #include "dialogs/viewcertdialog.h" #include "dialogs/showpicaiddialog.h" #include "dialogs/filetransferdialog.h" #include "msguirouter.h" #include "filetransfercontroller.h" #include #include #include #include #include ContactListWidget::ContactListWidget(QWidget *parent) : QListWidget(parent) { addcontactAct = new QAction(tr("&Add Contact..."), this); addcontactAct->setStatusTip(tr("add new contact")); connect(addcontactAct, SIGNAL(triggered()), this, SLOT(add_contact())); delcontactAct = new QAction(tr("&Delete Contact"), this); connect(delcontactAct, SIGNAL(triggered()), this, SLOT(del_contact())); startchatAct = new QAction(tr("Start &Chat"), this); connect(startchatAct, SIGNAL(triggered()), this, SLOT(start_chat())); viewcertAct = new QAction(tr("&View Certificate"), this); connect(viewcertAct, SIGNAL(triggered()), this, SLOT(view_cert())); showidAct = new QAction(tr("Show Pica Pica &ID"), this); connect(showidAct, SIGNAL(triggered()), this, SLOT(show_id())); sendfileAct = new QAction(tr("Send &File"), this); connect(sendfileAct, SIGNAL(triggered()), this, SLOT(send_file())); connect(this, SIGNAL(itemDoubleClicked(QListWidgetItem*)), this, SLOT(start_chat())); setContactsStorage(new Contacts(config_dbname, Accounts::GetCurrentAccount().id)); } ContactListWidget::~ContactListWidget() { delete storage; } void ContactListWidget::contextMenuEvent(QContextMenuEvent *event) { QMenu menu(this); if (this->itemAt(event->pos())) menu.addAction(delcontactAct); menu.addAction(addcontactAct); if (this->itemAt(event->pos())) { menu.addAction(startchatAct); menu.addAction(viewcertAct); menu.addAction(showidAct); menu.addAction(sendfileAct); } menu.exec(event->globalPos()); } void ContactListWidget::setContactsStorage(Contacts *ct) { clear(); // this->addItems(ct->GetContacts()); storage = ct; contact_records = ct->GetContacts(); for (int i = 0; i < contact_records.size(); i++) { addItem(QString("(%1...) %2").arg(contact_records[i].id.toBase64().left(8).constData()).arg(contact_records[i].name)); wgitem_to_recs[this->item(i)] = &contact_records[i]; this->item(i)->setStatusTip(contact_records[i].id.toBase64()); this->item(i)->setToolTip(contact_records[i].id.toBase64().constData()); } } void ContactListWidget::add_contact() { bool ok; QString input = QInputDialog::getText(this, tr("Add New Contact"), tr("Pica Pica ID: "), QLineEdit::Normal, NULL, &ok); if (ok && !input.isEmpty()) { QByteArray user_id = QByteArray::fromBase64(input.toAscii()).left(PICA_ID_SIZE); if (user_id.size() != PICA_ID_SIZE) { QMessageBox mbx; mbx.setIcon(QMessageBox::Warning); mbx.setText(tr("Invalid user ID")); mbx.exec(); return; } for(int i = 0; i < contact_records.size(); i++) if (contact_records[i].id == user_id) { QMessageBox mbx; mbx.setIcon(QMessageBox::Warning); mbx.setText(tr("User \"(%1) %2\" already exists").arg(user_id.toBase64().constData()).arg(contact_records[i].name)); mbx.exec(); return; } Contacts::ContactRecord r; r.id = user_id; r.name = ""; storage->Add(user_id); if (!storage->isOK()) { QMessageBox mbx; mbx.setIcon(QMessageBox::Warning); mbx.setText(storage->GetLastError()); mbx.exec(); return; } addItem(QString("(%1) ").arg(user_id.toBase64().constData())); contact_records.append(r); wgitem_to_recs[this->item(this->count() - 1)] = &contact_records.last(); } } void ContactListWidget::del_contact() { QMessageBox mbx; mbx.setText(QString(tr("Are you sure you want to remove user \"%1\" from your contact list?")).arg(currentItem()->text())); mbx.setIcon(QMessageBox::Question); mbx.addButton(QMessageBox::Yes); mbx.addButton(QMessageBox::No); mbx.setDefaultButton(QMessageBox::No); if (QMessageBox::Yes == mbx.exec()) { QByteArray rm_id; QListWidgetItem *rm_ptr; storage->Delete(rm_id = wgitem_to_recs[currentItem()]->id); delete (rm_ptr = takeItem(currentRow())); for(int i = 0; i < contact_records.size(); i++) { if (contact_records[i].id == rm_id) { contact_records.removeAt(i); break; } } wgitem_to_recs.remove(rm_ptr); } } void ContactListWidget::start_chat() { msguirouter->start_chat(wgitem_to_recs[currentItem()]->id); } void ContactListWidget::view_cert() { QString cert_pem = storage->GetContactCert(wgitem_to_recs[currentItem()]->id); if (!storage->isOK()) { QMessageBox mbx; mbx.setText(storage->GetLastError()); mbx.exec(); } if (!cert_pem.isEmpty()) { ViewCertDialog vcd; vcd.SetCert(cert_pem); vcd.exec(); } else { QMessageBox mbx; mbx.setText(tr("Certificate is not stored for this contact yet")); mbx.exec(); } } void ContactListWidget::show_id() { ShowPicaIdDialog d(wgitem_to_recs[currentItem()]->name, wgitem_to_recs[currentItem()]->id, tr("Contact's ID")); d.exec(); } void ContactListWidget::Reload() { setContactsStorage(storage); } void ContactListWidget::send_file() { ftctrl->send_file(wgitem_to_recs[currentItem()]->id); }