mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-05-23 08:11:24 -04:00
Added new widget to display an avatar with or without the status frame - AvatarWidget.
Changed all existing avatars to AvatarWidget. git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@4589 b45a01b8-16f6-495d-af2f-9b41ad6348cc
This commit is contained in:
parent
0ed60eaf86
commit
62b2de63b7
46 changed files with 730 additions and 595 deletions
282
retroshare-gui/src/gui/common/AvatarWidget.cpp
Normal file
282
retroshare-gui/src/gui/common/AvatarWidget.cpp
Normal file
|
@ -0,0 +1,282 @@
|
|||
/****************************************************************
|
||||
* This file is distributed under the following license:
|
||||
*
|
||||
* Copyright (c) 2010, RetroShare Team
|
||||
*
|
||||
* 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 2
|
||||
* 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, write to the Free Software
|
||||
* Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
||||
* Boston, MA 02110-1301, USA.
|
||||
****************************************************************/
|
||||
|
||||
#include <retroshare/rsstatus.h>
|
||||
#include <retroshare/rspeers.h>
|
||||
#include <retroshare/rsmsgs.h>
|
||||
|
||||
#include "gui/notifyqt.h"
|
||||
#include "gui/common/AvatarDefs.h"
|
||||
#include "util/misc.h"
|
||||
|
||||
#include "AvatarWidget.h"
|
||||
#include "ui_AvatarWidget.h"
|
||||
|
||||
#include <algorithm>
|
||||
|
||||
AvatarWidget::AvatarWidget(QWidget *parent) :
|
||||
QWidget(parent), ui(new Ui::AvatarWidget)
|
||||
{
|
||||
ui->setupUi(this);
|
||||
|
||||
mFlag.isOwnId = false;
|
||||
mFlag.isGpg = false;
|
||||
|
||||
setFrameType(NO_FRAME);
|
||||
|
||||
/* connect signals */
|
||||
connect(NotifyQt::getInstance(), SIGNAL(peerHasNewAvatar(const QString&)), this, SLOT(updateAvatar(const QString&)));
|
||||
connect(NotifyQt::getInstance(), SIGNAL(ownAvatarChanged()), this, SLOT(updateOwnAvatar()));
|
||||
}
|
||||
|
||||
AvatarWidget::~AvatarWidget()
|
||||
{
|
||||
delete ui;
|
||||
}
|
||||
|
||||
static bool isSmall(const QSize &size)
|
||||
{
|
||||
if (size.width() <= 70 && size.height() <= 70) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void AvatarWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (mFrameType == NO_FRAME) {
|
||||
return;
|
||||
}
|
||||
|
||||
QSize widgetSize = size();
|
||||
QSize avatarSize;
|
||||
if (isSmall(widgetSize)) {
|
||||
avatarSize = QSize(widgetSize.width() * 50 / 70, widgetSize.height() * 50 / 70);
|
||||
} else {
|
||||
avatarSize = QSize(widgetSize.width() * 96 / 116, widgetSize.height() * 96 / 116);
|
||||
}
|
||||
int x = (widgetSize.width() - avatarSize.width()) / 2;
|
||||
int y = (widgetSize.height() - avatarSize.height()) / 2;
|
||||
ui->avatarFrameLayout->setContentsMargins(x, y, x, y);
|
||||
|
||||
refreshStatus();
|
||||
}
|
||||
|
||||
void AvatarWidget::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
if (mFlag.isOwnId) {
|
||||
QByteArray ba;
|
||||
if (misc::getOpenAvatarPicture(this, ba)) {
|
||||
rsMsgs->setOwnAvatarData((unsigned char*)(ba.data()), ba.size()); // last char 0 included.
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void AvatarWidget::setFrameType(FrameType type)
|
||||
{
|
||||
mFrameType = type;
|
||||
|
||||
switch (mFrameType) {
|
||||
case NO_FRAME:
|
||||
disconnect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int)));
|
||||
ui->avatarFrameLayout->setContentsMargins(0, 0, 0, 0);
|
||||
break;
|
||||
case NORMAL_FRAME:
|
||||
disconnect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int)));
|
||||
break;
|
||||
case STATUS_FRAME:
|
||||
connect(NotifyQt::getInstance(), SIGNAL(peerStatusChanged(QString,int)), this, SLOT(updateStatus(const QString&, int)));
|
||||
break;
|
||||
}
|
||||
|
||||
refreshStatus();
|
||||
updateAvatar(QString::fromStdString(mId));
|
||||
}
|
||||
|
||||
void AvatarWidget::setId(const std::string &id, bool isGpg)
|
||||
{
|
||||
mId = id;
|
||||
mFlag.isGpg = isGpg;
|
||||
|
||||
if (mId == rsPeers->getOwnId()) {
|
||||
mFlag.isOwnId = true;
|
||||
ui->avatar->setToolTip(tr("Click to change your avatar"));
|
||||
}
|
||||
|
||||
ui->avatar->setPixmap(QPixmap());
|
||||
|
||||
if (mId.empty()) {
|
||||
ui->avatar->setEnabled(false);
|
||||
}
|
||||
|
||||
refreshStatus();
|
||||
updateAvatar(QString::fromStdString(mId));
|
||||
}
|
||||
|
||||
void AvatarWidget::setOwnId()
|
||||
{
|
||||
setId(rsPeers->getOwnId(), false);
|
||||
}
|
||||
|
||||
void AvatarWidget::refreshStatus()
|
||||
{
|
||||
switch (mFrameType) {
|
||||
case NO_FRAME:
|
||||
ui->avatarFrame->setStyleSheet("");
|
||||
break;
|
||||
case NORMAL_FRAME:
|
||||
ui->avatarFrame->setStyleSheet(isSmall(size()) ? "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-70.png); }" : "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-116.png); }");
|
||||
break;
|
||||
case STATUS_FRAME:
|
||||
{
|
||||
StatusInfo statusInfo;
|
||||
|
||||
// No check of return value. Non existing status info is handled as offline.
|
||||
if (mFlag.isOwnId) {
|
||||
rsStatus->getOwnStatus(statusInfo);
|
||||
} else {
|
||||
rsStatus->getStatus(mId, statusInfo);
|
||||
}
|
||||
updateStatus(QString::fromStdString(statusInfo.id), statusInfo.status);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static QString getStatusFrame(bool small, int status)
|
||||
{
|
||||
if (small) {
|
||||
switch (status) {
|
||||
case RS_STATUS_OFFLINE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-offline-70.png); }";
|
||||
case RS_STATUS_INACTIVE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-idle-70.png); }";
|
||||
case RS_STATUS_ONLINE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-online-70.png); }";
|
||||
case RS_STATUS_AWAY:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-70.png); }";
|
||||
case RS_STATUS_BUSY:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-busy-70.png); }";
|
||||
}
|
||||
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-70.png); }";
|
||||
} else {
|
||||
switch (status) {
|
||||
case RS_STATUS_OFFLINE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-offline-116.png); }";
|
||||
case RS_STATUS_INACTIVE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-116.png); }";
|
||||
case RS_STATUS_ONLINE:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-online-116.png); }";
|
||||
case RS_STATUS_AWAY:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-away-116.png); }";
|
||||
case RS_STATUS_BUSY:
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-busy-116.png); }";
|
||||
}
|
||||
|
||||
return "QFrame#avatarFrame{ border-image:url(:/images/avatarstatus-bg-116.png); }";
|
||||
}
|
||||
|
||||
return "";
|
||||
}
|
||||
|
||||
void AvatarWidget::updateStatus(const QString peerId, int status)
|
||||
{
|
||||
if (mFrameType != STATUS_FRAME) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (mId.empty()) {
|
||||
ui->avatarFrame->setStyleSheet(getStatusFrame(isSmall(size()), RS_STATUS_OFFLINE));
|
||||
return;
|
||||
}
|
||||
|
||||
/* set style for status */
|
||||
if (mId == peerId.toStdString()) {
|
||||
// the peers status has changed
|
||||
|
||||
ui->avatarFrame->setStyleSheet(getStatusFrame(isSmall(size()), status));
|
||||
|
||||
ui->avatar->setEnabled(((uint32_t) status == RS_STATUS_OFFLINE) ? false : true);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// ignore status change
|
||||
}
|
||||
|
||||
void AvatarWidget::updateAvatar(const QString &peerId)
|
||||
{
|
||||
QString defaultAvatar = ":/images/no_avatar_background.png";
|
||||
|
||||
if (mId.empty()) {
|
||||
QPixmap avatar(defaultAvatar);
|
||||
ui->avatar->setPixmap(avatar);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mFlag.isOwnId) {
|
||||
QPixmap avatar;
|
||||
AvatarDefs::getOwnAvatar(avatar);
|
||||
ui->avatar->setPixmap(avatar);
|
||||
return;
|
||||
}
|
||||
|
||||
if (mFlag.isGpg) {
|
||||
if (mId == peerId.toStdString()) {
|
||||
/* called from AvatarWidget with gpg id */
|
||||
QPixmap avatar;
|
||||
AvatarDefs::getAvatarFromGpgId(mId, avatar, defaultAvatar);
|
||||
ui->avatar->setPixmap(avatar);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Is this one of the ssl ids of the gpg id ? */
|
||||
std::list<std::string> sslIds;
|
||||
if (rsPeers->getAssociatedSSLIds(mId, sslIds) == false) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (std::find(sslIds.begin(), sslIds.end(), peerId.toStdString()) != sslIds.end()) {
|
||||
/* One of the ssl ids of the gpg id */
|
||||
QPixmap avatar;
|
||||
AvatarDefs::getAvatarFromGpgId(mId, avatar, defaultAvatar);
|
||||
ui->avatar->setPixmap(avatar);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
if (mId == peerId.toStdString()) {
|
||||
QPixmap avatar;
|
||||
AvatarDefs::getAvatarFromSslId(mId, avatar, defaultAvatar);
|
||||
ui->avatar->setPixmap(avatar);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void AvatarWidget::updateOwnAvatar()
|
||||
{
|
||||
if (mFlag.isOwnId) {
|
||||
updateAvatar(QString::fromStdString(mId));
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue