Added Spinner while rooms load

This commit is contained in:
kamathmanu 2021-08-12 09:50:52 -04:00
parent 6a75e5270c
commit 570e5ffde2
3 changed files with 59 additions and 18 deletions

View File

@ -2,6 +2,7 @@
// //
// SPDX-License-Identifier: GPL-3.0-or-later // SPDX-License-Identifier: GPL-3.0-or-later
import "./ui"
import QtQuick 2.9 import QtQuick 2.9
import QtQuick.Controls 2.3 import QtQuick.Controls 2.3
import QtQuick.Layouts 1.3 import QtQuick.Layouts 1.3
@ -11,6 +12,8 @@ ApplicationWindow {
id: roomDirectoryWindow id: roomDirectoryWindow
visible: true visible: true
property RoomDirectoryModel publicRooms : RoomDirectoryModel {}
x: MainWindow.x + (MainWindow.width / 2) - (width / 2) x: MainWindow.x + (MainWindow.width / 2) - (width / 2)
y: MainWindow.y + (MainWindow.height / 2) - (height / 2) y: MainWindow.y + (MainWindow.height / 2) - (height / 2)
minimumWidth: 650 minimumWidth: 650
@ -56,9 +59,7 @@ ApplicationWindow {
ListView { ListView {
id: roomDirView id: roomDirView
anchors.fill: parent anchors.fill: parent
model: RoomDirectoryModel { model: publicRooms
id: roomDir
}
delegate: Rectangle { delegate: Rectangle {
id: roomDirDelegate id: roomDirDelegate
@ -158,16 +159,36 @@ ApplicationWindow {
width: joinRoomButton.width width: joinRoomButton.width
Button { Button {
id: joinRoomButton id: joinRoomButton
visible: roomDir.canJoinRoom(model.roomid) visible: publicRooms.canJoinRoom(model.roomid)
anchors.centerIn: parent anchors.centerIn: parent
width: Math.ceil(0.1 * roomDirectoryWindow.width) width: Math.ceil(0.1 * roomDirectoryWindow.width)
text: "Join" text: "Join"
onClicked: roomDir.joinRoom(model.index) onClicked: publicRooms.joinRoom(model.index)
} }
} }
} }
} }
} }
} }
footer: Item {
anchors.horizontalCenter: parent.horizontalCenter
width: parent.width
visible: (publicRooms.reachedEndOfPagination == false) && publicRooms.loadingMoreRooms
// hacky but works
height: loadingSpinner.height + 2 * Nheko.paddingLarge
anchors.margins: Nheko.paddingLarge
Spinner {
id: loadingSpinner
anchors.centerIn: parent
anchors.margins: Nheko.paddingLarge
running: visible
foreground: Nheko.colors.mid
z: 7
}
}
} }
} }

View File

@ -11,7 +11,6 @@
RoomDirectoryModel::RoomDirectoryModel(QObject *parent, const std::string &s) RoomDirectoryModel::RoomDirectoryModel(QObject *parent, const std::string &s)
: QAbstractListModel(parent) : QAbstractListModel(parent)
, server_(s) , server_(s)
, canFetchMore_(true)
{ {
connect(this, connect(this,
&RoomDirectoryModel::fetchedRoomsBatch, &RoomDirectoryModel::fetchedRoomsBatch,
@ -127,6 +126,8 @@ RoomDirectoryModel::data(const QModelIndex &index, int role) const
void void
RoomDirectoryModel::fetchMore(const QModelIndex &) RoomDirectoryModel::fetchMore(const QModelIndex &)
{ {
if (!canFetchMore_) return;
nhlog::net()->debug("Fetching more rooms from mtxclient..."); nhlog::net()->debug("Fetching more rooms from mtxclient...");
mtx::requests::PublicRooms req; mtx::requests::PublicRooms req;
@ -136,10 +137,19 @@ RoomDirectoryModel::fetchMore(const QModelIndex &)
// req.third_party_instance_id = third_party_instance_id; // req.third_party_instance_id = third_party_instance_id;
auto requested_server = server_; auto requested_server = server_;
reachedEndOfPagination_ = false;
emit reachedEndOfPaginationChanged();
loadingMoreRooms_ = true;
emit loadingMoreRoomsChanged();
http::client()->post_public_rooms( http::client()->post_public_rooms(
req, req,
[requested_server, this, req](const mtx::responses::PublicRooms &res, [requested_server, this, req](const mtx::responses::PublicRooms &res,
mtx::http::RequestErr err) { mtx::http::RequestErr err) {
loadingMoreRooms_ = false;
emit loadingMoreRoomsChanged();
if (err) { if (err) {
nhlog::net()->error( nhlog::net()->error(
"Failed to retrieve rooms from mtxclient - {} - {} - {}", "Failed to retrieve rooms from mtxclient - {} - {} - {}",
@ -149,7 +159,7 @@ RoomDirectoryModel::fetchMore(const QModelIndex &)
} else if (req.filter.generic_search_term == this->userSearchString_ && } else if (req.filter.generic_search_term == this->userSearchString_ &&
req.since == this->prevBatch_ && requested_server == this->server_) { req.since == this->prevBatch_ && requested_server == this->server_) {
nhlog::net()->debug("signalling chunk to GUI thread"); nhlog::net()->debug("signalling chunk to GUI thread");
emit fetchedRoomsBatch(res.chunk, res.prev_batch, res.next_batch); emit fetchedRoomsBatch(res.chunk, res.next_batch);
} }
}, },
requested_server); requested_server);
@ -157,11 +167,9 @@ RoomDirectoryModel::fetchMore(const QModelIndex &)
void void
RoomDirectoryModel::displayRooms(std::vector<mtx::responses::PublicRoomsChunk> fetched_rooms, RoomDirectoryModel::displayRooms(std::vector<mtx::responses::PublicRoomsChunk> fetched_rooms,
const std::string &prev_batch,
const std::string &next_batch) const std::string &next_batch)
{ {
nhlog::net()->debug("Prev batch: {} | Next batch: {}", prevBatch_, nextBatch_); nhlog::net()->debug("Prev batch: {} | Next batch: {}", prevBatch_, next_batch);
nhlog::net()->debug("NP batch: {} | NN batch: {}", prev_batch, next_batch);
if (fetched_rooms.empty()) { if (fetched_rooms.empty()) {
nhlog::net()->error("mtxclient helper thread yielded empty chunk!"); nhlog::net()->error("mtxclient helper thread yielded empty chunk!");
@ -177,7 +185,11 @@ RoomDirectoryModel::displayRooms(std::vector<mtx::responses::PublicRoomsChunk> f
if (next_batch.empty()) { if (next_batch.empty()) {
canFetchMore_ = false; canFetchMore_ = false;
reachedEndOfPagination_ = true;
emit reachedEndOfPaginationChanged();
} }
prevBatch_ = next_batch; prevBatch_ = next_batch;
nhlog::ui()->debug ("Finished loading rooms");
} }

View File

@ -27,6 +27,9 @@ class RoomDirectoryModel : public QAbstractListModel
{ {
Q_OBJECT Q_OBJECT
Q_PROPERTY (bool loadingMoreRooms READ loadingMoreRooms NOTIFY loadingMoreRoomsChanged)
Q_PROPERTY (bool reachedEndOfPagination READ reachedEndOfPagination NOTIFY reachedEndOfPaginationChanged)
public: public:
explicit RoomDirectoryModel(QObject *parent = nullptr, const std::string &s = ""); explicit RoomDirectoryModel(QObject *parent = nullptr, const std::string &s = "");
@ -49,10 +52,15 @@ public:
return static_cast<int>(publicRoomsData_.size()); return static_cast<int>(publicRoomsData_.size());
} }
inline bool canFetchMore(const QModelIndex &) const override bool canFetchMore(const QModelIndex &) const override
{ {
return canFetchMore_; return canFetchMore_;
} }
bool loadingMoreRooms() const { return loadingMoreRooms_; }
bool reachedEndOfPagination() const { return reachedEndOfPagination_; }
void fetchMore(const QModelIndex &) override; void fetchMore(const QModelIndex &) override;
Q_INVOKABLE bool canJoinRoom(const QByteArray &room); Q_INVOKABLE bool canJoinRoom(const QByteArray &room);
@ -60,15 +68,13 @@ public:
signals: signals:
void fetchedRoomsBatch(std::vector<mtx::responses::PublicRoomsChunk> rooms, void fetchedRoomsBatch(std::vector<mtx::responses::PublicRoomsChunk> rooms,
const std::string &prev_batch,
const std::string &next_batch); const std::string &next_batch);
void serverChanged(); void loadingMoreRoomsChanged();
void searchTermEntered(); void reachedEndOfPaginationChanged();
public slots: public slots:
void displayRooms(std::vector<mtx::responses::PublicRoomsChunk> rooms, void displayRooms(std::vector<mtx::responses::PublicRoomsChunk> rooms,
const std::string &prev, const std::string &next_batch);
const std::string &next);
void setMatrixServer(const QString &s = ""); void setMatrixServer(const QString &s = "");
void setSearchTerm(const QString &f); void setSearchTerm(const QString &f);
@ -79,7 +85,9 @@ private:
std::string userSearchString_; std::string userSearchString_;
std::string prevBatch_; std::string prevBatch_;
std::string nextBatch_; std::string nextBatch_;
bool canFetchMore_; bool canFetchMore_ {true};
bool loadingMoreRooms_ {false};
bool reachedEndOfPagination_ {false};
std::vector<mtx::responses::PublicRoomsChunk> publicRoomsData_; std::vector<mtx::responses::PublicRoomsChunk> publicRoomsData_;
std::vector<std::string> getViasForRoom(const std::vector<std::string> &room); std::vector<std::string> getViasForRoom(const std::vector<std::string> &room);