/******************************************************************************* * retroshare-gui/src/gui/People/CircleWidget.cpp * * * * Copyright (C) 2018 by Retroshare Team * * * * This program is free software: you can redistribute it and/or modify * * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * * * You should have received a copy of the GNU Affero General Public License * * along with this program. If not, see . * * * *******************************************************************************/ #include "gui/gxs/GxsIdDetails.h" #include "gui/People/CircleWidget.h" #include "ui_CircleWidget.h" #include #include #include #include #include CircleWidget::CircleWidget(QString name/*=QString()*/ , QWidget *parent/*=0*/) : FlowLayoutItem(name, parent), ui(new Ui::CircleWidget) { ui->setupUi(this); m_myName = name; ui->label->setText(m_myName); ui->label->setToolTip(m_myName); _scene = new QGraphicsScene(this); _scene->addText(tr("Empty Circle")); ui->graphicsView->setScene(_scene); //To grab events ui->graphicsView->setEnabled(false); ui->graphicsView->setAlignment(Qt::AlignLeft | Qt::AlignTop); ui->graphicsView->setRenderHints( QPainter::Antialiasing | QPainter::SmoothPixmapTransform ); setIsCurrent(false); setIsSelected(false); setAcceptDrops(true); } CircleWidget::~CircleWidget() { delete _scene; delete ui; } static bool same_RsGxsCircleDetails(const RsGxsCircleDetails& d1,const RsGxsCircleDetails& d2) { return ( d1.mCircleId == d2.mCircleId && d1.mCircleName == d2.mCircleName && d1.mCircleType == d2.mCircleType && d1.mSubscriptionFlags == d2.mSubscriptionFlags && d1.mAllowedGxsIds== d2.mAllowedGxsIds && d1.mAllowedNodes == d2.mAllowedNodes ); } void CircleWidget::updateData(const RsGroupMetaData& gxs_group_info , const RsGxsCircleDetails& details) { //if (_group_info != gxs_group_info) { _group_info=gxs_group_info; std::string desc_string = _group_info.mGroupName ; QString cirName = QString::fromUtf8(desc_string.c_str()); m_myName = cirName; ui->label->setText(m_myName); ui->label->setToolTip(m_myName); update(); //} if(!same_RsGxsCircleDetails(_circle_details , details)) { _circle_details=details; typedef std::set::iterator itUnknownPeers; for (itUnknownPeers it = _circle_details.mAllowedGxsIds.begin() ; it != _circle_details.mAllowedGxsIds.end() ; ++it) { RsGxsId gxs_id = *it; if(!gxs_id.isNull()) { emit askForGXSIdentityWidget(gxs_id); } } typedef std::set::const_iterator itAllowedPeers; for (itAllowedPeers it = _circle_details.mAllowedNodes.begin() ; it != _circle_details.mAllowedNodes.end() ; ++it ) { RsPgpId pgp_id = *it; emit askForPGPIdentityWidget(pgp_id); // std::set gxs_id_list = it->second; // typedef std::set::const_iterator itGxsId; // for (itGxsId curs=gxs_id_list.begin(); curs != gxs_id_list.end(); ++curs) // { // RsGxsId gxs_id = *curs; // if(!gxs_id.isNull()) // emit askForGXSIdentityWidget(gxs_id); // } // } } update(); } } QSize CircleWidget::sizeHint() const { QSize size; size.setHeight(ui->graphicsView->size().height() + ui->label->size().height()); size.setWidth(ui->graphicsView->size().width() > ui->label->size().width() ?ui->graphicsView->size().width() : ui->label->size().width()); return size; } const QPixmap CircleWidget::getImage() { #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) //return ui->graphicsView->grab(); //QT5 return this->grab(); //QT5 #else //return QPixmap::grabWidget(ui->graphicsView); return QPixmap::grabWidget(this); #endif } const QPixmap CircleWidget::getDragImage() { #if QT_VERSION >= QT_VERSION_CHECK (5, 0, 0) return ui->graphicsView->grab(); //return this->grab(); //QT5 #else return QPixmap::grabWidget(ui->graphicsView); //return QPixmap::grabWidget(this); #endif } void CircleWidget::addIdent(IdentityWidget *item) { if (item){ std::string id; if (item->haveGXSId()) { id =item->groupInfo().mMeta.mGroupId.toStdString(); } else {//if (item->haveGXSId()) id =item->keyId().toStdString(); }//else (item->haveGXSId()) if (!_list.contains(id)){ _list[id] = item; connect(item,SIGNAL(imageUpdated()), this, SLOT(updateIdImage())); updateScene(); }//if (!_list.contains(id)) }//if (item) } void CircleWidget::updateIdImage() { updateScene(); } void CircleWidget::updateScene() { const qreal PI = qAtan(1.0)*4; int count=_list.size(); qreal pitch = (2*PI) / count; _scene->clear(); QRect r = ui->graphicsView->geometry(); QBrush b = QBrush(QColor(Qt::black)); QPen p = QPen(b, 4.0); qreal topleftX = r.width()/8; qreal topleftY = r.height()/8; qreal radiusX = 3*topleftX; qreal radiusY = 3*topleftY; QGraphicsEllipseItem* ellipse = _scene->addEllipse(0, 0, radiusX*2, radiusY*2, p); ellipse->setPos(topleftX, topleftY); qreal sizeX = topleftX*2; qreal sizeY = topleftY*2; int curs = 0; typedef QMap::const_iterator itList; for (itList it=_list.constBegin(); it!=_list.constEnd(); ++it){ QPixmap pix = it.value()->getImage(); pix = pix.scaled(sizeX, sizeY); QGraphicsPixmapItem* item = _scene->addPixmap(pix); qreal x = (qCos(curs*pitch)*radiusX)-(sizeX/2)+topleftX+radiusX; qreal y = (qSin(curs*pitch)*radiusY)-(sizeY/2)+topleftY+radiusY; item->setPos(QPointF(x, y)); QString name = it.value()->getName(); QString idKey = it.value()->keyId(); QString gxsId = it.value()->gxsId(); if (idKey == gxsId) gxsId.clear(); item->setToolTip(name.append("\n") .append(idKey).append(gxsId.isEmpty()?"":"\n") .append(gxsId)); ++curs; }//for (itList it=_list.constBegin(); it!=_list.constEnd(); ++it) emit imageUpdated(); }