mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-27 21:48:48 +03:00
add narrow layout
This commit is contained in:
parent
b599f5c0c6
commit
39d7390092
4 changed files with 66 additions and 27 deletions
|
@ -17,15 +17,16 @@ ApplicationWindow {
|
|||
property InviteesModel invitees
|
||||
property var friendsCompleter
|
||||
property var profile
|
||||
minimumWidth: 500
|
||||
minimumWidth: 300
|
||||
|
||||
Component.onCompleted: {
|
||||
friendsCompleter = TimelineManager.completerFor("user", "friends")
|
||||
width = 600
|
||||
}
|
||||
|
||||
function addInvite(mxid) {
|
||||
function addInvite(mxid, displayName, avatarUrl) {
|
||||
if (mxid.match("@.+?:.{3,}")) {
|
||||
invitees.addUser(mxid);
|
||||
invitees.addUser(mxid, displayName, avatarUrl);
|
||||
if (mxid == inviteeEntry.text)
|
||||
inviteeEntry.clear();
|
||||
} else
|
||||
|
@ -34,7 +35,7 @@ ApplicationWindow {
|
|||
|
||||
function cleanUpAndClose() {
|
||||
if (inviteeEntry.isValidMxid)
|
||||
addInvite(inviteeEntry.text);
|
||||
addInvite(inviteeEntry.text, "", "");
|
||||
|
||||
invitees.accept();
|
||||
close();
|
||||
|
@ -61,13 +62,40 @@ ApplicationWindow {
|
|||
anchors.fill: parent
|
||||
anchors.margins: Nheko.paddingMedium
|
||||
spacing: Nheko.paddingMedium
|
||||
Flow {
|
||||
layoutDirection: Qt.LeftToRight
|
||||
Layout.fillWidth: true
|
||||
Layout.preferredHeight: implicitHeight
|
||||
spacing: 4
|
||||
Repeater {
|
||||
id: inviteesRepeater
|
||||
model: invitees
|
||||
delegate: ItemDelegate {
|
||||
onClicked: invitees.removeUser(model.mxid)
|
||||
id: inviteeButton
|
||||
visible: !inviteesList.visible
|
||||
contentItem: Label {
|
||||
anchors.centerIn: parent
|
||||
id: inviteeUserid
|
||||
text: model.displayName
|
||||
color: inviteeButton.hovered ? Nheko.colors.highlightedText: Nheko.colors.text
|
||||
maximumLineCount: 1
|
||||
}
|
||||
background: Rectangle {
|
||||
border.color: Nheko.colors.text
|
||||
color: inviteeButton.hovered ? Nheko.colors.highlight : Nheko.colors.window
|
||||
border.width: 1
|
||||
radius: inviteeButton.height / 2
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Label {
|
||||
text: qsTr("User ID to invite")
|
||||
text: qsTr("User to invite")
|
||||
Layout.fillWidth: true
|
||||
color: Nheko.colors.text
|
||||
}
|
||||
|
||||
RowLayout {
|
||||
spacing: Nheko.paddingMedium
|
||||
|
||||
|
@ -81,7 +109,7 @@ ApplicationWindow {
|
|||
Layout.fillWidth: true
|
||||
onAccepted: {
|
||||
if (isValidMxid)
|
||||
addInvite(text);
|
||||
addInvite(text, "", "");
|
||||
|
||||
}
|
||||
Component.onCompleted: forceActiveFocus()
|
||||
|
@ -123,7 +151,7 @@ ApplicationWindow {
|
|||
Layout.preferredWidth: inviteDialogRoot.width/2
|
||||
Layout.alignment: Qt.AlignTop
|
||||
Layout.preferredHeight: layout3.implicitHeight + Nheko.paddingSmall * 2
|
||||
onClicked: addInvite(inviteeEntry.text)
|
||||
onClicked: addInvite(inviteeEntry.text, profile? profile.displayName : "", profile? profile.avatarUrl : "")
|
||||
background: Rectangle {
|
||||
color: del3.hovered ? Nheko.colors.dark : inviteDialogRoot.color
|
||||
clip: true
|
||||
|
@ -174,7 +202,7 @@ ApplicationWindow {
|
|||
id: del2
|
||||
width: ListView.view.width
|
||||
height: layout2.implicitHeight + Nheko.paddingSmall * 2
|
||||
onClicked: addInvite(model.userid)
|
||||
onClicked: addInvite(model.userid, model.displayName, model.avatarUrl)
|
||||
background: Rectangle {
|
||||
color: del2.hovered ? Nheko.colors.dark : inviteDialogRoot.color
|
||||
}
|
||||
|
@ -221,6 +249,7 @@ ApplicationWindow {
|
|||
Layout.fillHeight: true
|
||||
model: invitees
|
||||
clip: true
|
||||
visible: inviteDialogRoot.width >= 500
|
||||
|
||||
delegate: ItemDelegate {
|
||||
id: del
|
||||
|
|
|
@ -16,7 +16,7 @@ InviteesModel::InviteesModel(QObject *parent)
|
|||
}
|
||||
|
||||
void
|
||||
InviteesModel::addUser(QString mxid)
|
||||
InviteesModel::addUser(QString mxid, QString displayName, QString avatarUrl)
|
||||
{
|
||||
for (const auto &invitee : qAsConst(invitees_))
|
||||
if (invitee->mxid_ == mxid)
|
||||
|
@ -24,7 +24,7 @@ InviteesModel::addUser(QString mxid)
|
|||
|
||||
beginInsertRows(QModelIndex(), invitees_.count(), invitees_.count());
|
||||
|
||||
auto invitee = new Invitee{mxid, this};
|
||||
auto invitee = new Invitee{mxid, displayName, avatarUrl, this};
|
||||
auto indexOfInvitee = invitees_.count();
|
||||
connect(invitee, &Invitee::userInfoLoaded, this, [this, indexOfInvitee]() {
|
||||
emit dataChanged(index(indexOfInvitee), index(indexOfInvitee));
|
||||
|
@ -84,21 +84,28 @@ InviteesModel::mxids()
|
|||
return mxidList;
|
||||
}
|
||||
|
||||
Invitee::Invitee(QString mxid, QObject *parent)
|
||||
Invitee::Invitee(QString mxid, QString displayName, QString avatarUrl, QObject *parent)
|
||||
: QObject{parent}
|
||||
, mxid_{std::move(mxid)}
|
||||
{
|
||||
http::client()->get_profile(
|
||||
mxid_.toStdString(), [this](const mtx::responses::Profile &res, mtx::http::RequestErr err) {
|
||||
if (err) {
|
||||
nhlog::net()->warn("failed to retrieve profile info");
|
||||
if (displayName == "" || avatarUrl == "") {
|
||||
http::client()->get_profile(
|
||||
mxid_.toStdString(),
|
||||
[this](const mtx::responses::Profile &res, mtx::http::RequestErr err) {
|
||||
if (err) {
|
||||
nhlog::net()->warn("failed to retrieve profile info");
|
||||
emit userInfoLoaded();
|
||||
return;
|
||||
}
|
||||
|
||||
displayName_ = QString::fromStdString(res.display_name);
|
||||
avatarUrl_ = QString::fromStdString(res.avatar_url);
|
||||
|
||||
emit userInfoLoaded();
|
||||
return;
|
||||
}
|
||||
|
||||
displayName_ = QString::fromStdString(res.display_name);
|
||||
avatarUrl_ = QString::fromStdString(res.avatar_url);
|
||||
|
||||
emit userInfoLoaded();
|
||||
});
|
||||
});
|
||||
} else {
|
||||
displayName_ = displayName;
|
||||
avatarUrl_ = avatarUrl;
|
||||
emit userInfoLoaded();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,7 +14,10 @@ class Invitee final : public QObject
|
|||
Q_OBJECT
|
||||
|
||||
public:
|
||||
Invitee(QString mxid, QObject *parent = nullptr);
|
||||
Invitee(QString mxid,
|
||||
QString displayName = "",
|
||||
QString avatarUrl = "",
|
||||
QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
void userInfoLoaded();
|
||||
|
@ -43,7 +46,7 @@ public:
|
|||
|
||||
InviteesModel(QObject *parent = nullptr);
|
||||
|
||||
Q_INVOKABLE void addUser(QString mxid);
|
||||
Q_INVOKABLE void addUser(QString mxid, QString displayName = "", QString avatarUrl = "");
|
||||
Q_INVOKABLE void removeUser(QString mxid);
|
||||
|
||||
[[nodiscard]] QHash<int, QByteArray> roleNames() const override;
|
||||
|
|
|
@ -77,11 +77,11 @@ UserDirectoryModel::data(const QModelIndex &index, int role) const
|
|||
void
|
||||
UserDirectoryModel::displaySearchResults(std::vector<mtx::responses::User> results)
|
||||
{
|
||||
results_ = results;
|
||||
if (results_.empty()) {
|
||||
nhlog::net()->error("mtxclient helper thread yielded empty chunk!");
|
||||
return;
|
||||
}
|
||||
beginInsertRows(QModelIndex(), 0, static_cast<int>(results_.size()) - 1);
|
||||
results_ = results;
|
||||
endInsertRows();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue