//
// Created by Alone on 2022-4-18.
//
#include "UserButton.h"
#include <QFile>
#include <QByteArray>
#include <utility>
#include <QDir>
#include <config_path.h>
#include <iostream>
#include <QPainter>
//方便进行测试的信shared_info快速创建
UserButton::shared_info UserButton::ButtonInfo::getDefaultButtonInfo(const QString &name,
const QString &text,
const QString &iconPath) {
auto* src = new UserButton::ButtonInfo;
src->_name = name;
src->_text = text;
src->_iconPath = iconPath;
return std::shared_ptr<UserButton::ButtonInfo>(src);
}
//qss样式
inline QString My_StyleSheet(QString const& icon_path){
return
QString(R"(
QPushButton{
border:none;
image: url(%1);
image-position:left;
min-width:120px;
padding-top:7px;
padding-left:10px;
padding-bottom:7px;
background:rgb(248, 249, 249);
}
QPushButton:hover{
border:none;
background:rgb(242, 242, 242);
}
QPushButton:checked{
border:none;
background:rgb(235, 235, 235);
}
)").arg(icon_path);
}
UserButton::UserButton(QWidget *parent): QPushButton(parent) {
setCheckable(true);
setAutoExclusive(true);
}
UserButton::~UserButton() {
}
UserButton* UserButton::fromButtonInfo(shared_info const& info,QWidget* parent){
auto* btn = new UserButton(parent);
btn->m_info_ = info;
btn->setStyleSheet(My_StyleSheet(btn->getMIconPath()));
return btn;
}
//调整内容显示
QRect UserButton::adjustSize(QString &dest){
assert(m_info_!=nullptr);
// 三档调节
int num_width = 0;
int span = 13;
if(m_info_->_unread<10){
dest = QString::number(m_info_->_unread);
num_width = span;
}else if(m_info_->_unread<99){
dest = QString::number(m_info_->_unread);
num_width = span*2;
}else{
dest.append("99+");
num_width = span*3;
}
return {this->width()-10-num_width,this->height()/2+5,num_width,13};
}
//根据不同的按钮进行不同的绘制
void UserButton::paintEvent(QPaintEvent *e) {
assert(m_info_!=nullptr);
QPushButton::paintEvent(e);
switch (m_info_->_type) {
case Type::User_Btn:
PainUserBtn();
break;
case Type::Meg_Btn:
PainMessageBtn();
break;
}
}
//持久化二进制数据到本地(主要是图片)
std::optional<QString> UserButton::StorageIcon(QByteArray const& imageSrc,QString const& name) {
QString base_path = QDir::homePath()+DirName_Base;
QString user_icon_path = base_path +DirName_Icon;
//如果两级文件夹不存在,则先创建文件夹
QDir dir(base_path);
if(!dir.exists()){
qDebug()<<"base_dir not exists,being created";
if(!dir.mkdir(base_path) )
return {};
}
dir.setPath(user_icon_path);
if(!dir.exists() ) {
qDebug()<<"icon_dir not exists,being created";
if(!dir.mkdir(user_icon_path))
return {};
}
//开始写入本地持久化
QString user_icon = user_icon_path+"/"+name;
qDebug()<<user_icon;
QFile file(user_icon);
file.open(QIODevice::WriteOnly);
file.write(imageSrc);
return user_icon;
}
QString UserButton::getName() {
assert(m_info_!=nullptr);
return m_info_->_name;
}
void UserButton::setName(QString name) {
assert(m_info_!=nullptr);
m_info_->_name = std::move(name);
}
int UserButton::getNumUnread() const {
assert(m_info_!=nullptr);
return m_info_->_unread;
}
void UserButton::setNumUnread(int numUnread) {
assert(m_info_!=nullptr);
m_info_->_unread = numUnread;
}
State UserButton::getMState() const {
assert(m_info_!=nullptr);
return m_info_->_state;
}
void UserButton::setMState(State mState) {
assert(m_info_!=nullptr);
m_info_->_state = mState;
}
const QString &UserButton::getMIconPath() const {
assert(m_info_!=nullptr);
return m_info_->_iconPath;
}
void UserButton::setMIconPath(const QString &mIconPath) {
assert(m_info_!=nullptr);
m_info_->_iconPath = mIconPath;
}
UserButton::Type UserButton::getMType() const {
assert(m_info_!=nullptr);
return m_info_->_type;
}
void UserButton::setMType(UserButton::Type mType) {
assert(m_info_!=nullptr);
m_info_->_type = mType;
}
void UserButton::setHideMsgStyle(bool isHide) {
assert(m_info_!=nullptr);
m_info_->_hide = isHide;
}
int UserButton::getUid() const {
assert(m_info_!=nullptr);
return m_info_->_uid;
}
void UserButton::setUid(int uid) {
assert(m_info_!= nullptr);
m_info_->_uid = uid;
}
void UserButton::setContent(const QString &text) {
assert(m_info_!=nullptr);
m_info_->_text = text;
}
QString UserButton::getContent() {
assert(m_info_!=nullptr);
return m_info_->_text;
}
int UserButton::getMisHide() {
assert(m_info_!=nullptr);
return m_info_->_hide;
}
UserButton::shared_info UserButton::getSharedInfo() {
return m_info_;
}
void UserButton::PainMessageBtn() {
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);//消锯齿
QRect pos_round(this->width()-25,this->height()/2+5,12,12);
QRect pos_time(this->width()-50,this->height()/2-15,40,10);
QRect pos_name(65,0,this->width()-pos_time.width()-5,28);
QRect pos_content(65,28,this->width()-pos_time.width()-5,15);
QColor color_time(134, 139, 152);
QFont font_time("微软雅黑", 9);
QString time_cur = QDateTime::currentDateTime().toString("hh:mm");
QString m_name = getName();
if(!m_name.isEmpty()){
//画名字
int max_size = 6;
QPen pen;
pen.setColor(QColor(4, 8, 26));
painter.setPen(pen);
painter.setFont(QFont("微软雅黑",14));
QString name;
name.reserve(max_size);
if(m_name.size()>max_size){
std::copy(m_name.begin(), m_name.begin()+max_size, std::back_inserter(name));
name.append("...");
}else{
name = m_name;
}
painter.drawText(pos_name,name,QTextOption(Qt::AlignLeft));
//画内容
max_size = 10;
pen.setColor(QColor(164, 176, 190));
painter.setPen(pen);
painter.setFont(QFont("微软雅黑",10));
QString content;
content.reserve(max_size);
QString m_Content = getContent();
if(m_Content.size()>max_size){
std::copy(m_Content.begin(), m_Content.begin()+max_size, std::back_inserter(content));
content.append("...");
}else{
content = std::move(m_Content);
}
painter.drawText(pos_content,content,QTextOption(Qt::AlignLeft | Qt::AlignVCenter));
}
//画右边的提示消息,以及对应颜色提示小球
State m_state = getMState();
int m_isHide = getMisHide();
if(m_state == State::MegTip){
//TODO 注意根据未读消息的多少调整区域的大小
QString text_unreadNum;
if(m_info_->_unread>0){
pos_round = adjustSize(text_unreadNum);
}
QColor color_tmp(246, 75, 49);
painter.setBrush(QBrush(color_tmp));
painter.setPen(Qt::NoPen);
painter.drawRoundedRect(pos_round,6,6);
if(!text_unreadNum.isEmpty()){
//画未读信息数目
QPen pen(QColor(255,255,255));
painter.setPen(pen);
painter.setFont(QFont("微软雅黑",8,550));
painter.drawText(pos_round,text_unreadNum,QTextOption(Qt::AlignHCenter | Qt::AlignVCenter));
}
}else if(m_state == State::OffLine && !m_isHide){
QColor color_tmp(186, 183, 180);
painter.setBrush(QBrush(color_tmp));
painter.setPen(Qt::NoPen);
painter.drawRoundedRect(pos_round,6,6);
}else if(m_state == State::OnLine && !m_isHide){
QColor color_tmp(75, 209, 102);
painter.setBrush(QBrush(color_tmp));
painter.setPen(Qt::NoPen);
painter.drawRoundedRect(pos_round,6,6);
}
//画时间
QPen pen(color_time);
painter.setPen(pen);
QTextOption option(Qt::AlignRight | Qt::AlignVCenter);
option.setWrapMode(QTextOption::WrapAtWordBoundaryOrAnywhere);
painter.setFont(font_time);
painter.drawText(pos_time,time_cur,option);
}
void UserButton::PainUserBtn() {
QPainter painter(this);
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);//消锯齿
QRect pos_round(this->width()-25,this->height()/2+5,12,12);
QRect pos_name(65,0,this->width()-pos_round.width()-5,50);
QFont font_time("微软雅黑", 9);
QString m_name = getName();
if(!m_name.isEmpty()){
//画名字
int max_size = 6;
QPen pen;
pen.setColor(QColor(4, 8, 26));
painter.setPen(pen);
painter.setFont(QFont("微软雅黑",14));
QString name;
name.reserve(max_size);
if(m_name.size()>max_size){
std::copy(m_name.begin(), m_name.begin()+max_size, std::back_inserter(name));
name.append("...");
}else{
name = m_name;
}
painter.drawText(pos_name,name,QTextOption(Qt::AlignLeft | Qt::AlignVCenter));
}
State m_state = getMState();
//好友列表中不需要画时间
if(m_state == State::OffLine){
QColor color_tmp(186, 183, 180);
painter.setBrush(QBrush(color_tmp));
painter.setPen(Qt::NoPen);
painter.drawRoundedRect(pos_round,6,6);
}else if(m_state == State::OnLine){
QColor color_tmp(75, 209, 102);
painter.setBrush(QBrush(color_tmp));
painter.setPen(Qt::NoPen);
painter.drawRoundedRect(pos_round,6,6);
}
}
void UserButton::updateContent(QString const& text){
if(m_info_){
m_info_->_text = text;
}
}
|