scar-chat7/client/ui/user_list_widget.cpp
2025-12-07 12:00:44 -07:00

83 lines
2.1 KiB
C++

#include "user_list_widget.h"
#include <QVBoxLayout>
#include <QListWidgetItem>
#include <QPainter>
#include <QFont>
namespace scar {
UserListWidget::UserListWidget(QWidget* parent)
: QWidget(parent) {
auto* layout = new QVBoxLayout(this);
layout->setContentsMargins(0, 0, 0, 0);
auto* titleLabel = new QLabel("Users", this);
titleLabel->setStyleSheet("font-weight: bold; padding: 5px;");
layout->addWidget(titleLabel);
listWidget_ = new QListWidget(this);
listWidget_->setStyleSheet("QListWidget { border: none; }");
layout->addWidget(listWidget_);
}
void UserListWidget::addUser(const UserInfo& user) {
auto* item = new QListWidgetItem(listWidget_);
// Use avatar if available, otherwise create "SC" placeholder
QPixmap avatar = user.avatar.isNull() ? createDefaultAvatar() : user.avatar;
item->setIcon(QIcon(avatar));
item->setText(user.username);
item->setToolTip(user.status);
listWidget_->addItem(item);
}
void UserListWidget::removeUser(const QString& username) {
for (int i = 0; i < listWidget_->count(); ++i) {
if (listWidget_->item(i)->text() == username) {
delete listWidget_->takeItem(i);
break;
}
}
}
void UserListWidget::updateUserStatus(const QString& username, const QString& status) {
for (int i = 0; i < listWidget_->count(); ++i) {
auto* item = listWidget_->item(i);
if (item->text() == username) {
item->setToolTip(status);
break;
}
}
}
void UserListWidget::clear() {
listWidget_->clear();
}
int UserListWidget::userCount() const {
return listWidget_->count();
}
QPixmap UserListWidget::createDefaultAvatar() {
QPixmap pixmap(48, 48);
pixmap.fill(QColor("#5865F2")); // Discord-like blue
QPainter painter(&pixmap);
painter.setRenderHint(QPainter::Antialiasing);
QFont font;
font.setPixelSize(20);
font.setBold(true);
painter.setFont(font);
painter.setPen(Qt::white);
painter.drawText(pixmap.rect(), Qt::AlignCenter, "SC");
return pixmap;
}
} // namespace scar