mirror of https://github.com/Nheko-Reborn/nheko
parent
19bae2a2e6
commit
ef0b0f6879
@ -0,0 +1,27 @@ |
||||
#pragma once |
||||
|
||||
#include <QLabel> |
||||
#include <QWidget> |
||||
|
||||
#include "mtx.hpp" |
||||
|
||||
class FlatButton; |
||||
|
||||
class InviteeItem : public QWidget |
||||
{ |
||||
Q_OBJECT |
||||
|
||||
public: |
||||
InviteeItem(mtx::identifiers::User user, QWidget *parent = nullptr); |
||||
|
||||
QString userID() { return user_; } |
||||
|
||||
signals: |
||||
void removeItem(); |
||||
|
||||
private: |
||||
QString user_; |
||||
|
||||
QLabel *name_; |
||||
FlatButton *removeUserBtn_; |
||||
}; |
@ -0,0 +1,41 @@ |
||||
#pragma once |
||||
|
||||
#include <QFrame> |
||||
#include <QLabel> |
||||
#include <QListWidgetItem> |
||||
#include <QStringList> |
||||
|
||||
class FlatButton; |
||||
class TextField; |
||||
class QListWidget; |
||||
|
||||
namespace dialogs { |
||||
|
||||
class InviteUsers : public QFrame |
||||
{ |
||||
Q_OBJECT |
||||
public: |
||||
explicit InviteUsers(QWidget *parent = nullptr); |
||||
|
||||
protected: |
||||
void paintEvent(QPaintEvent *event) override; |
||||
|
||||
signals: |
||||
void closing(bool isLeaving, QStringList invitees); |
||||
|
||||
private slots: |
||||
void removeInvitee(QListWidgetItem *item); |
||||
|
||||
private: |
||||
void addUser(); |
||||
QStringList invitedUsers() const; |
||||
|
||||
FlatButton *confirmBtn_; |
||||
FlatButton *cancelBtn_; |
||||
|
||||
TextField *inviteeInput_; |
||||
QLabel *errorLabel_; |
||||
|
||||
QListWidget *inviteeList_; |
||||
}; |
||||
} // dialogs
|
After Width: | Height: | Size: 533 B |
After Width: | Height: | Size: 699 B |
@ -0,0 +1,37 @@ |
||||
#include <QHBoxLayout> |
||||
|
||||
#include "FlatButton.h" |
||||
#include "InviteeItem.h" |
||||
#include "Theme.h" |
||||
|
||||
constexpr int SidePadding = 10; |
||||
constexpr int IconSize = 13; |
||||
|
||||
InviteeItem::InviteeItem(mtx::identifiers::User user, QWidget *parent) |
||||
: QWidget{parent} |
||||
, user_{QString::fromStdString(user.toString())} |
||||
{ |
||||
auto topLayout_ = new QHBoxLayout(this); |
||||
topLayout_->setSpacing(0); |
||||
topLayout_->setContentsMargins(SidePadding, 0, 3 * SidePadding, 0); |
||||
|
||||
QFont font; |
||||
font.setPixelSize(15); |
||||
|
||||
name_ = new QLabel(user_, this); |
||||
name_->setFont(font); |
||||
|
||||
QIcon removeUserIcon; |
||||
removeUserIcon.addFile(":/icons/icons/ui/remove-symbol.png"); |
||||
|
||||
removeUserBtn_ = new FlatButton(this); |
||||
removeUserBtn_->setIcon(removeUserIcon); |
||||
removeUserBtn_->setIconSize(QSize(IconSize, IconSize)); |
||||
removeUserBtn_->setFixedSize(QSize(IconSize, IconSize)); |
||||
removeUserBtn_->setRippleStyle(ui::RippleStyle::NoRipple); |
||||
|
||||
topLayout_->addWidget(name_); |
||||
topLayout_->addWidget(removeUserBtn_); |
||||
|
||||
connect(removeUserBtn_, &FlatButton::clicked, this, &InviteeItem::removeItem); |
||||
} |
@ -0,0 +1,149 @@ |
||||
#include <QDebug> |
||||
#include <QIcon> |
||||
#include <QListWidget> |
||||
#include <QListWidgetItem> |
||||
#include <QStyleOption> |
||||
#include <QTimer> |
||||
#include <QVBoxLayout> |
||||
|
||||
#include "Config.h" |
||||
#include "FlatButton.h" |
||||
#include "TextField.h" |
||||
|
||||
#include "InviteeItem.h" |
||||
#include "dialogs/InviteUsers.h" |
||||
|
||||
#include "mtx.hpp" |
||||
|
||||
using namespace dialogs; |
||||
|
||||
InviteUsers::InviteUsers(QWidget *parent) |
||||
: QFrame(parent) |
||||
{ |
||||
setMaximumSize(400, 350); |
||||
|
||||
auto layout = new QVBoxLayout(this); |
||||
layout->setSpacing(30); |
||||
layout->setMargin(20); |
||||
|
||||
auto buttonLayout = new QHBoxLayout(); |
||||
buttonLayout->setSpacing(0); |
||||
buttonLayout->setMargin(0); |
||||
|
||||
confirmBtn_ = new FlatButton("INVITE", this); |
||||
confirmBtn_->setFontSize(conf::btn::fontSize); |
||||
|
||||
cancelBtn_ = new FlatButton(tr("CANCEL"), this); |
||||
cancelBtn_->setFontSize(conf::btn::fontSize); |
||||
|
||||
buttonLayout->addStretch(1); |
||||
buttonLayout->addWidget(confirmBtn_); |
||||
buttonLayout->addWidget(cancelBtn_); |
||||
|
||||
QFont font; |
||||
font.setPixelSize(conf::headerFontSize); |
||||
|
||||
inviteeInput_ = new TextField(this); |
||||
inviteeInput_->setLabel(tr("User ID to invite")); |
||||
|
||||
inviteeList_ = new QListWidget; |
||||
inviteeList_->setFrameStyle(QFrame::NoFrame); |
||||
inviteeList_->setSelectionMode(QAbstractItemView::NoSelection); |
||||
inviteeList_->setAttribute(Qt::WA_MacShowFocusRect, 0); |
||||
inviteeList_->setSpacing(5); |
||||
|
||||
errorLabel_ = new QLabel(this); |
||||
errorLabel_->setAlignment(Qt::AlignCenter); |
||||
font.setPixelSize(12); |
||||
errorLabel_->setFont(font); |
||||
|
||||
layout->addWidget(inviteeInput_); |
||||
layout->addWidget(errorLabel_); |
||||
layout->addWidget(inviteeList_); |
||||
layout->addLayout(buttonLayout); |
||||
|
||||
connect(inviteeInput_, &TextField::returnPressed, this, &InviteUsers::addUser); |
||||
connect(confirmBtn_, &QPushButton::clicked, [=]() { |
||||
emit closing(true, invitedUsers()); |
||||
|
||||
inviteeInput_->clear(); |
||||
inviteeList_->clear(); |
||||
errorLabel_->hide(); |
||||
}); |
||||
|
||||
connect(cancelBtn_, &QPushButton::clicked, [=]() { |
||||
QStringList emptyList; |
||||
emit closing(false, emptyList); |
||||
|
||||
inviteeInput_->clear(); |
||||
inviteeList_->clear(); |
||||
errorLabel_->hide(); |
||||
}); |
||||
} |
||||
|
||||
void |
||||
InviteUsers::addUser() |
||||
{ |
||||
auto user_id = inviteeInput_->text(); |
||||
|
||||
try { |
||||
namespace ids = mtx::identifiers; |
||||
auto user = ids::parse<ids::User>(user_id.toStdString()); |
||||
|
||||
auto item = new QListWidgetItem(inviteeList_); |
||||
auto invitee = new InviteeItem(user, this); |
||||
|
||||
item->setSizeHint(invitee->minimumSizeHint()); |
||||
item->setFlags(Qt::NoItemFlags); |
||||
item->setTextAlignment(Qt::AlignCenter); |
||||
|
||||
inviteeList_->setItemWidget(item, invitee); |
||||
|
||||
connect(invitee, &InviteeItem::removeItem, this, [this, item]() { |
||||
emit removeInvitee(item); |
||||
}); |
||||
|
||||
errorLabel_->hide(); |
||||
inviteeInput_->clear(); |
||||
} catch (std::exception &e) { |
||||
errorLabel_->setText(e.what()); |
||||
errorLabel_->show(); |
||||
} |
||||
} |
||||
|
||||
void |
||||
InviteUsers::removeInvitee(QListWidgetItem *item) |
||||
{ |
||||
int row = inviteeList_->row(item); |
||||
auto widget = inviteeList_->takeItem(row); |
||||
|
||||
inviteeList_->removeItemWidget(widget); |
||||
} |
||||
|
||||
void |
||||
InviteUsers::paintEvent(QPaintEvent *) |
||||
{ |
||||
QStyleOption opt; |
||||
opt.init(this); |
||||
QPainter p(this); |
||||
style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this); |
||||
} |
||||
|
||||
QStringList |
||||
InviteUsers::invitedUsers() const |
||||
{ |
||||
QStringList users; |
||||
|
||||
for (int ii = 0; ii < inviteeList_->count(); ++ii) { |
||||
auto item = inviteeList_->item(ii); |
||||
auto widget = inviteeList_->itemWidget(item); |
||||
auto invitee = qobject_cast<InviteeItem *>(widget); |
||||
|
||||
if (invitee) |
||||
users << invitee->userID(); |
||||
else |
||||
qDebug() << "Cast InviteeItem failed"; |
||||
} |
||||
|
||||
return users; |
||||
} |
Loading…
Reference in new issue