From 2ac0d0cd8b94bd1e53b8e63816c8504f897d67a1 Mon Sep 17 00:00:00 2001 From: Black Hat Date: Thu, 1 Mar 2018 19:15:04 +0800 Subject: [PATCH] Change SwipeView to StackView and clean code. --- matrix/controller.cpp | 1 - matrix/controller.h | 8 +++-- matrix/roomlistmodel.cpp | 48 ++++++++++----------------- matrix/roomlistmodel.h | 8 ++--- qml/Login.qml | 1 - qml/component/ButtonDelegate.qml | 15 ++++++--- qml/main.qml | 56 ++++++++++---------------------- 7 files changed, 54 insertions(+), 83 deletions(-) diff --git a/matrix/controller.cpp b/matrix/controller.cpp index 41800ad..b647585 100644 --- a/matrix/controller.cpp +++ b/matrix/controller.cpp @@ -40,7 +40,6 @@ void Controller::logout() { void Controller::connected() { setUserID(m_connection->userId()); setToken(m_connection->accessToken()); - roomListModel->init(m_connection); resync(); setIsLogin(true); } diff --git a/matrix/controller.h b/matrix/controller.h index 4b7157f..a6563e9 100644 --- a/matrix/controller.h +++ b/matrix/controller.h @@ -18,6 +18,10 @@ class Controller : public QObject Q_PROPERTY(bool isLogin READ getIsLogin WRITE setIsLogin NOTIFY isLoginChanged) Q_PROPERTY(QString userID READ getUserID WRITE setUserID NOTIFY userIDChanged) Q_PROPERTY(QByteArray token READ getToken WRITE setToken NOTIFY tokenChanged) + +private: + QMatrixClient::Connection* m_connection = new QMatrixClient::Connection(); + public: explicit Controller(QObject *parent = nullptr); ~Controller(); @@ -29,7 +33,7 @@ public: // All the non-Q_INVOKABLE functions. // All the Q_PROPERTYs. - RoomListModel *roomListModel = new RoomListModel(); + RoomListModel* roomListModel = new RoomListModel(m_connection); RoomListModel* getRoomListModel() { return roomListModel; } bool isLogin = false; @@ -60,8 +64,6 @@ public: } private: - QMatrixClient::Connection *m_connection = new QMatrixClient::Connection(); - void connected(); void resync(); void reconnect(); diff --git a/matrix/roomlistmodel.cpp b/matrix/roomlistmodel.cpp index d574079..905a932 100644 --- a/matrix/roomlistmodel.cpp +++ b/matrix/roomlistmodel.cpp @@ -5,19 +5,8 @@ #include "controller.h" -RoomListModel::RoomListModel(QObject *parent) -{ - -} - -RoomListModel::~RoomListModel() { - -} - -void RoomListModel::init(QMatrixClient::Connection *conn) { - qDebug() << "Registering connection."; +RoomListModel::RoomListModel(QMatrixClient::Connection* m_connection) : m_connection(m_connection) { beginResetModel(); - m_connection = conn; m_rooms.clear(); connect(m_connection, &QMatrixClient::Connection::newRoom, this, &RoomListModel::addRoom); for(QMatrixClient::Room* room: m_connection->roomMap().values()) { @@ -27,13 +16,15 @@ void RoomListModel::init(QMatrixClient::Connection *conn) { endResetModel(); } -QMatrixClient::Room* RoomListModel::roomAt(int row) -{ +RoomListModel::~RoomListModel() { + +} + +QMatrixClient::Room* RoomListModel::roomAt(int row) { return m_rooms.at(row); } -void RoomListModel::addRoom(QMatrixClient::Room* room) -{ +void RoomListModel::addRoom(QMatrixClient::Room* room) { qDebug() << "Adding room."; beginInsertRows(QModelIndex(), m_rooms.count(), m_rooms.count()); connect(room, &QMatrixClient::Room::namesChanged, this, &RoomListModel::namesChanged ); @@ -41,32 +32,30 @@ void RoomListModel::addRoom(QMatrixClient::Room* room) endInsertRows(); } -int RoomListModel::rowCount(const QModelIndex& parent) const -{ +int RoomListModel::rowCount(const QModelIndex& parent) const { if( parent.isValid() ) return 0; return m_rooms.count(); } -QVariant RoomListModel::data(const QModelIndex& index, int role) const -{ +QVariant RoomListModel::data(const QModelIndex& index, int role) const { if(!index.isValid()) return QVariant(); - if(index.row() >= m_rooms.count()) - { + if(index.row() >= m_rooms.count()) { qDebug() << "UserListModel: something wrong here..."; return QVariant(); } QMatrixClient::Room* room = m_rooms.at(index.row()); - if( role == NameRole ) - { + if(role == NameRole) { return room->displayName(); } - if( role == ValueRole ) - { + if(role == ValueRole) { return room->topic(); } + if(role == IconRole) { + return room->avatar(48); + } return QVariant(); } @@ -74,17 +63,16 @@ QHash RoomListModel::roleNames() const { QHash roles; roles[NameRole] = "name"; roles[ValueRole] = "value"; + roles[IconRole] = "icon"; return roles; } -void RoomListModel::namesChanged(QMatrixClient::Room* room) -{ +void RoomListModel::namesChanged(QMatrixClient::Room* room) { int row = m_rooms.indexOf(room); emit dataChanged(index(row), index(row)); } -void RoomListModel::unreadMessagesChanged(QMatrixClient::Room* room) -{ +void RoomListModel::unreadMessagesChanged(QMatrixClient::Room* room) { } diff --git a/matrix/roomlistmodel.h b/matrix/roomlistmodel.h index 21d85ea..e25fbe6 100644 --- a/matrix/roomlistmodel.h +++ b/matrix/roomlistmodel.h @@ -39,17 +39,15 @@ class RoomListModel : public QAbstractListModel Q_OBJECT public: - explicit RoomListModel(QObject *parent = nullptr); + explicit RoomListModel(QMatrixClient::Connection* m_connection = 0); ~RoomListModel(); enum RoomModelRoles { - NameRole, ValueRole + NameRole, ValueRole, IconRole }; QHash roleNames() const; - void init(QMatrixClient::Connection*); - Q_INVOKABLE QMatrixClient::Room* roomAt(int row); QVariant data(const QModelIndex& index, int role) const override; @@ -65,7 +63,7 @@ private slots: void addRoom(QMatrixClient::Room* room); private: - QMatrixClient::Connection *m_connection; + QMatrixClient::Connection* m_connection; QList m_rooms; }; diff --git a/qml/Login.qml b/qml/Login.qml index c21b0d2..20b9a52 100644 --- a/qml/Login.qml +++ b/qml/Login.qml @@ -7,7 +7,6 @@ import Qt.labs.settings 1.0 import "qrc:/qml/component" Page { - property var window property var controller property alias homeserver: settings.server diff --git a/qml/component/ButtonDelegate.qml b/qml/component/ButtonDelegate.qml index ae766de..13c23f0 100644 --- a/qml/component/ButtonDelegate.qml +++ b/qml/component/ButtonDelegate.qml @@ -4,7 +4,7 @@ import QtQuick.Layouts 1.3 import QtQuick.Controls.Material 2.3 Item { - property int index + property Item page property alias contentItem: itemDelegate.contentItem signal clicked @@ -14,13 +14,13 @@ Item { Layout.preferredHeight: width Rectangle { - width: swipeView.currentIndex === index ? parent.width : 0 + width: stackView.currentItem === page ? parent.width : 0 height: parent.height anchors.bottom: itemDelegate.bottom color: Qt.lighter(Material.accent) Behavior on width { - PropertyAnimation { easing.type: Easing.InOutQuad; duration: 200 } + PropertyAnimation { easing.type: Easing.InOutCubic; duration: 200 } } } @@ -29,7 +29,14 @@ Item { anchors.fill: parent onClicked: { - swipeView.currentIndex = index + if(page != null) { + if(stackView.depth === 1) { + stackView.replace(page) + } else { + stackView.clear() + stackView.push(page) + } + } buttonDelegate.clicked() } } diff --git a/qml/main.qml b/qml/main.qml index d79fe3d..ad91ffb 100644 --- a/qml/main.qml +++ b/qml/main.qml @@ -42,14 +42,17 @@ ApplicationWindow { spacing: 0 ButtonDelegate { - index: 0 - contentItem: ImageStatus { width: parent.width height: parent.width source: "qrc:/asset/img/avatar.png" anchors.horizontalCenter: parent.horizontalCenter } + + page: Room { + id: roomPage + roomListModel: controller.roomListModel + } } Rectangle { @@ -58,8 +61,6 @@ ApplicationWindow { } ButtonDelegate { - index: 1 - contentItem: Text { text: "\ue853" font.pointSize: 16 @@ -68,24 +69,14 @@ ApplicationWindow { horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } + + page: Login { + id: loginPage + controller: controller + } } -// ButtonDelegate { -// index: 2 - -// contentItem: Text { -// text: "\ue5d2" -// font.pointSize: 16 -// font.family: materialFont.name -// color: "white" -// horizontalAlignment: Text.AlignHCenter -// verticalAlignment: Text.AlignVCenter -// } -// } - ButtonDelegate { - index: 2 - contentItem: Text { text: "\ue8b8" font.pointSize: 16 @@ -94,11 +85,13 @@ ApplicationWindow { horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter } + + page: Setting { + + } } ButtonDelegate { - index: 3 - contentItem: Text { text: "\ue879" font.pointSize: 16 @@ -113,25 +106,10 @@ ApplicationWindow { } } - SwipeView { - id: swipeView + StackView { + id: stackView anchors.fill: parent anchors.leftMargin: sideNav.width - interactive: false - orientation: Qt.Vertical - - Room { - roomListModel: controller.roomListModel - } - - Login { - id: loginPage - window: window - controller: controller - } - - Setting { - - } + initialItem: roomPage } }