1
0
mirror of https://github.com/qTox/qTox.git synced 2024-03-22 14:00:36 +08:00

MaskablePixmapWidget: auto-detect a suitable background color

This commit is contained in:
krepa098 2014-09-29 20:18:03 +02:00
parent 4d91695169
commit c260a7a100
4 changed files with 61 additions and 8 deletions

View File

@ -202,6 +202,7 @@ void FriendWidget::onAvatarChange(int FriendId, const QPixmap& pic)
isDefaultAvatar = false; isDefaultAvatar = false;
avatar->setPixmap(pic); avatar->setPixmap(pic);
avatar->autopickBackground();
} }
void FriendWidget::onAvatarRemoved(int FriendId) void FriendWidget::onAvatarRemoved(int FriendId)

View File

@ -39,8 +39,8 @@ GroupWidget::GroupWidget(int GroupId, QString Name)
textLayout.setMargin(0); textLayout.setMargin(0);
setLayoutDirection(Qt::LeftToRight); // parent might have set Qt::RightToLeft setLayoutDirection(Qt::LeftToRight); // parent might have set Qt::RightToLeft
avatar = new MaskablePixmapWidget(this, QSize(40,40), QString(), Qt::transparent); avatar = new MaskablePixmapWidget(this, QSize(40,40), ":/img/avatar_mask.png");
avatar->setPixmap(QPixmap(":img/group.png")); avatar->setPixmap(QPixmap(":img/group_dark.png"));
statusPic.setPixmap(QPixmap(":img/status/dot_online.png")); statusPic.setPixmap(QPixmap(":img/status/dot_online.png"));
name.setText(Name); name.setText(Name);
QFont small; QFont small;
@ -139,7 +139,7 @@ void GroupWidget::setAsInactiveChatroom()
QPalette pal3; QPalette pal3;
pal3.setColor(QPalette::Background, QColor(65,65,65,255)); pal3.setColor(QPalette::Background, QColor(65,65,65,255));
this->setPalette(pal3); this->setPalette(pal3);
avatar->setPixmap(QPixmap(":img/group.png")); avatar->setPixmap(QPixmap(":img/group_dark.png"));
} }
void GroupWidget::updateStatusLight() void GroupWidget::updateStatusLight()

View File

@ -17,10 +17,11 @@
#include "maskablepixmapwidget.h" #include "maskablepixmapwidget.h"
#include <QPainter> #include <QPainter>
MaskablePixmapWidget::MaskablePixmapWidget(QWidget *parent, QSize size, QString maskName, QColor background) MaskablePixmapWidget::MaskablePixmapWidget(QWidget *parent, QSize size, QString maskName, bool autopickBackground)
: QWidget(parent) : QWidget(parent)
, backgroundColor(background) , backgroundColor(Qt::white)
, clickable(false) , clickable(false)
, autoBackground(autopickBackground)
{ {
setFixedSize(size); setFixedSize(size);
@ -30,6 +31,47 @@ MaskablePixmapWidget::MaskablePixmapWidget(QWidget *parent, QSize size, QString
mask = QPixmap(maskName).scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); mask = QPixmap(maskName).scaled(size, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
} }
void MaskablePixmapWidget::autopickBackground()
{
QImage pic = pixmap.toImage();
if (pic.isNull())
return;
qreal r = 0.0f;
qreal g = 0.0f;
qreal b = 0.0f;
float weight = 1.0f;
for (int x=0;x<pic.width();++x)
{
for (int y=0;y<pic.height();++y)
{
QRgb color = pic.pixel(x,y);
r += qRed(color) / 255.0f;
g += qGreen(color) / 255.0f;
b += qBlue(color) / 255.0f;
weight += qAlpha(color) / 255.0f;
}
}
r /= weight;
g /= weight;
b /= weight;
QColor color = QColor::fromRgbF(r,g,b);
backgroundColor = QColor::fromRgb(0xFFFFFF ^ color.rgb());
update();
}
void MaskablePixmapWidget::setBackground(QColor color)
{
backgroundColor = color;
update();
}
void MaskablePixmapWidget::setClickable(bool clickable) void MaskablePixmapWidget::setClickable(bool clickable)
{ {
this->clickable = clickable; this->clickable = clickable;
@ -42,8 +84,15 @@ void MaskablePixmapWidget::setClickable(bool clickable)
void MaskablePixmapWidget::setPixmap(const QPixmap &pmap) void MaskablePixmapWidget::setPixmap(const QPixmap &pmap)
{ {
pixmap = pmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation); if (!pmap.isNull())
update(); {
pixmap = pmap.scaled(width(), height(), Qt::KeepAspectRatioByExpanding, Qt::SmoothTransformation);
if (autoBackground)
autopickBackground();
update();
}
} }
QPixmap MaskablePixmapWidget::getPixmap() const QPixmap MaskablePixmapWidget::getPixmap() const

View File

@ -23,8 +23,10 @@ class MaskablePixmapWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
MaskablePixmapWidget(QWidget *parent, QSize size, QString maskName, QColor background = Qt::white); MaskablePixmapWidget(QWidget *parent, QSize size, QString maskName = QString(), bool autopickBackground = true);
void autopickBackground();
void setBackground(QColor color);
void setClickable(bool clickable); void setClickable(bool clickable);
void setPixmap(const QPixmap &pmap); void setPixmap(const QPixmap &pmap);
QPixmap getPixmap() const; QPixmap getPixmap() const;
@ -43,6 +45,7 @@ private:
QString maskName; QString maskName;
QColor backgroundColor; QColor backgroundColor;
bool clickable; bool clickable;
bool autoBackground;
}; };
#endif // MASKABLEPIXMAPWIDGET_H #endif // MASKABLEPIXMAPWIDGET_H