diff --git a/include/Cache.h b/include/Cache.h
index 1be56620..0f6e5cd2 100644
--- a/include/Cache.h
+++ b/include/Cache.h
@@ -37,6 +37,8 @@ public:
inline void unmount();
inline QString memberDbName(const QString &roomid);
+ void removeRoom(const QString &roomid);
+
private:
void setNextBatchToken(lmdb::txn &txn, const QString &token);
void insertRoomState(lmdb::txn &txn, const QString &roomid, const RoomState &state);
diff --git a/include/ChatPage.h b/include/ChatPage.h
index 0ea7ea38..8becc17f 100644
--- a/include/ChatPage.h
+++ b/include/ChatPage.h
@@ -61,6 +61,8 @@ private slots:
void changeTopRoomInfo(const QString &room_id);
void startSync();
void logout();
+ void addRoom(const QString &room_id);
+ void removeRoom(const QString &room_id);
protected:
void keyPressEvent(QKeyEvent *event) override;
diff --git a/include/JoinRoomDialog.h b/include/JoinRoomDialog.h
new file mode 100644
index 00000000..6c3fbdcf
--- /dev/null
+++ b/include/JoinRoomDialog.h
@@ -0,0 +1,22 @@
+#pragma once
+
+#include <QFrame>
+#include <QLineEdit>
+
+#include "FlatButton.h"
+
+class JoinRoomDialog : public QFrame
+{
+ Q_OBJECT
+public:
+ JoinRoomDialog(QWidget *parent = nullptr);
+
+signals:
+ void closing(bool isJoining, QString roomAlias);
+
+private:
+ FlatButton *confirmBtn_;
+ FlatButton *cancelBtn_;
+
+ QLineEdit *roomAliasEdit_;
+};
diff --git a/include/LeaveRoomDialog.h b/include/LeaveRoomDialog.h
new file mode 100644
index 00000000..1639a578
--- /dev/null
+++ b/include/LeaveRoomDialog.h
@@ -0,0 +1,19 @@
+#pragma once
+
+#include <QFrame>
+
+#include "FlatButton.h"
+
+class LeaveRoomDialog : public QFrame
+{
+ Q_OBJECT
+public:
+ explicit LeaveRoomDialog(QWidget *parent = nullptr);
+
+signals:
+ void closing(bool isLeaving);
+
+private:
+ FlatButton *confirmBtn_;
+ FlatButton *cancelBtn_;
+};
diff --git a/include/MatrixClient.h b/include/MatrixClient.h
index 8d6c60a7..cd023650 100644
--- a/include/MatrixClient.h
+++ b/include/MatrixClient.h
@@ -52,6 +52,8 @@ public:
void downloadImage(const QString &event_id, const QUrl &url);
void messages(const QString &room_id, const QString &from_token, int limit = 20) noexcept;
void uploadImage(const QString &roomid, const QString &filename);
+ void joinRoom(const QString &roomIdOrAlias);
+ void leaveRoom(const QString &roomId);
inline QUrl getHomeServer();
inline int transactionId();
@@ -94,6 +96,8 @@ signals:
void messageSent(const QString &event_id, const QString &roomid, const int txn_id);
void emoteSent(const QString &event_id, const QString &roomid, const int txn_id);
void messagesRetrieved(const QString &room_id, const RoomMessages &msgs);
+ void joinedRoom(const QString &room_id);
+ void leftRoom(const QString &room_id);
private slots:
void onResponse(QNetworkReply *reply);
@@ -115,6 +119,8 @@ private:
Sync,
UserAvatar,
Versions,
+ JoinRoom,
+ LeaveRoom,
};
// Response handlers.
@@ -132,6 +138,8 @@ private:
void onSyncResponse(QNetworkReply *reply);
void onUserAvatarResponse(QNetworkReply *reply);
void onVersionsResponse(QNetworkReply *reply);
+ void onJoinRoomResponse(QNetworkReply *reply);
+ void onLeaveRoomResponse(QNetworkReply *reply);
// Client API prefix.
QString clientApiUrl_;
diff --git a/include/RoomInfoListItem.h b/include/RoomInfoListItem.h
index 8947ee8e..03023038 100644
--- a/include/RoomInfoListItem.h
+++ b/include/RoomInfoListItem.h
@@ -57,6 +57,7 @@ public:
signals:
void clicked(const QString &room_id);
+ void leaveRoom(const QString &room_id);
public slots:
void setPressedState(bool state);
@@ -86,6 +87,7 @@ private:
Menu *menu_;
QAction *toggleNotifications_;
+ QAction *leaveRoom_;
QSharedPointer<RoomSettings> roomSettings_;
diff --git a/include/RoomList.h b/include/RoomList.h
index 573f43a8..c2f4255d 100644
--- a/include/RoomList.h
+++ b/include/RoomList.h
@@ -17,12 +17,16 @@
#pragma once
+#include <QPushButton>
#include <QScrollArea>
#include <QSharedPointer>
#include <QVBoxLayout>
#include <QWidget>
+#include "JoinRoomDialog.h"
+#include "LeaveRoomDialog.h"
#include "MatrixClient.h"
+#include "OverlayModal.h"
#include "RoomInfoListItem.h"
#include "RoomState.h"
#include "Sync.h"
@@ -41,6 +45,11 @@ public:
void clear();
+ void addRoom(const QSharedPointer<RoomSettings> &settings,
+ const RoomState &state,
+ const QString &room_id);
+ void removeRoom(const QString &room_id, bool reset);
+
signals:
void roomChanged(const QString &room_id);
void totalUnreadMessageCountUpdated(int count);
@@ -50,6 +59,9 @@ public slots:
void highlightSelectedRoom(const QString &room_id);
void updateUnreadMessageCount(const QString &roomid, int count);
void updateRoomDescription(const QString &roomid, const DescInfo &info);
+ void closeJoinRoomDialog(bool isJoining, QString roomAlias);
+ void openLeaveRoomDialog(const QString &room_id);
+ void closeLeaveRoomDialog(bool leaving, const QString &room_id);
private:
void calculateUnreadMessageCount();
@@ -59,6 +71,14 @@ private:
QScrollArea *scrollArea_;
QWidget *scrollAreaContents_;
+ QPushButton *joinRoomButton_;
+
+ OverlayModal *joinRoomModal_;
+ JoinRoomDialog *joinRoomDialog_;
+
+ OverlayModal *leaveRoomModal;
+ LeaveRoomDialog *leaveRoomDialog_;
+
QMap<QString, QSharedPointer<RoomInfoListItem>> rooms_;
QSharedPointer<MatrixClient> client_;
diff --git a/include/Sync.h b/include/Sync.h
index 420c9b6c..a9caf473 100644
--- a/include/Sync.h
+++ b/include/Sync.h
@@ -171,15 +171,42 @@ JoinedRoom::timeline() const
return timeline_;
}
+class LeftRoom : public Deserializable
+{
+public:
+ inline State state() const;
+ inline Timeline timeline() const;
+
+ void deserialize(const QJsonValue &data) override;
+
+private:
+ State state_;
+ Timeline timeline_;
+};
+
+inline State
+LeftRoom::state() const
+{
+ return state_;
+}
+
+inline Timeline
+LeftRoom::timeline() const
+{
+ return timeline_;
+}
+
// TODO: Add support for invited and left rooms.
class Rooms : public Deserializable
{
public:
inline QMap<QString, JoinedRoom> join() const;
+ inline QMap<QString, LeftRoom> leave() const;
void deserialize(const QJsonValue &data) override;
private:
QMap<QString, JoinedRoom> join_;
+ QMap<QString, LeftRoom> leave_;
};
inline QMap<QString, JoinedRoom>
@@ -188,6 +215,12 @@ Rooms::join() const
return join_;
}
+inline QMap<QString, LeftRoom>
+Rooms::leave() const
+{
+ return leave_;
+}
+
class SyncResponse : public Deserializable
{
public:
diff --git a/include/TimelineViewManager.h b/include/TimelineViewManager.h
index 14f47928..35dcac5a 100644
--- a/include/TimelineViewManager.h
+++ b/include/TimelineViewManager.h
@@ -40,6 +40,10 @@ public:
void initialize(const Rooms &rooms);
// Empty initialization.
void initialize(const QList<QString> &rooms);
+
+ void addRoom(const JoinedRoom &room, const QString &room_id);
+ void addRoom(const QString &room_id);
+
void sync(const Rooms &rooms);
void clearAll();
diff --git a/include/TopRoomBar.h b/include/TopRoomBar.h
index 6b24cbef..5d8b394e 100644
--- a/include/TopRoomBar.h
+++ b/include/TopRoomBar.h
@@ -29,7 +29,9 @@
#include "Avatar.h"
#include "FlatButton.h"
+#include "LeaveRoomDialog.h"
#include "Menu.h"
+#include "OverlayModal.h"
#include "RoomSettings.h"
static const QString URL_HTML = "<a href=\"\\1\" style=\"color: #333333\">\\1</a>";
@@ -51,9 +53,15 @@ public:
void reset();
+signals:
+ void leaveRoom();
+
protected:
void paintEvent(QPaintEvent *event) override;
+private slots:
+ void closeLeaveRoomDialog(bool leaving);
+
private:
QHBoxLayout *topLayout_;
QVBoxLayout *textLayout_;
@@ -65,9 +73,13 @@ private:
QMenu *menu_;
QAction *toggleNotifications_;
+ QAction *leaveRoom_;
FlatButton *settingsBtn_;
+ OverlayModal *leaveRoomModal;
+ LeaveRoomDialog *leaveRoomDialog_;
+
Avatar *avatar_;
int buttonSize_;
|