Re-order spaces by dragging and dropping
Title
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include <Quotient/room.h>
|
||||
|
||||
#include "neochatconnection.h"
|
||||
#include "neochatroom.h"
|
||||
|
||||
SpaceChildrenModel::SpaceChildrenModel(QObject *parent)
|
||||
: QAbstractItemModel(parent)
|
||||
@@ -32,7 +33,8 @@ void SpaceChildrenModel::setSpace(NeoChatRoom *space)
|
||||
}
|
||||
// disconnect the new room signal from the old connection in case it is different.
|
||||
if (m_space != nullptr) {
|
||||
disconnect(m_space->connection(), &Quotient::Connection::loadedRoomState, this, nullptr);
|
||||
m_space->connection()->disconnect(this);
|
||||
m_space->disconnect(this);
|
||||
}
|
||||
|
||||
m_space = space;
|
||||
@@ -116,6 +118,11 @@ void SpaceChildrenModel::insertChildren(std::vector<Quotient::GetSpaceHierarchyJ
|
||||
if (!successorId.isEmpty()) {
|
||||
m_replacedRooms += successorId;
|
||||
}
|
||||
if (dynamic_cast<NeoChatRoom *>(room)->isSpace()) {
|
||||
connect(room, &Quotient::Room::changed, this, [this]() {
|
||||
refreshModel();
|
||||
});
|
||||
}
|
||||
}
|
||||
if (children[i].childrenState.size() > 0) {
|
||||
auto job = m_space->connection()->callApi<Quotient::GetSpaceHierarchyJob>(children[i].roomId, Quotient::none, Quotient::none, 1);
|
||||
|
||||
@@ -60,4 +60,65 @@ bool SpaceChildSortFilterModel::filterAcceptsRow(int sourceRow, const QModelInde
|
||||
return true;
|
||||
}
|
||||
|
||||
void SpaceChildSortFilterModel::move(const QModelIndex ¤tIndex, const QModelIndex &targetIndex)
|
||||
{
|
||||
const auto rootSpace = dynamic_cast<SpaceChildrenModel *>(sourceModel())->space();
|
||||
if (rootSpace == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto connection = rootSpace->connection();
|
||||
|
||||
const auto currentParent = currentIndex.parent();
|
||||
auto targetParent = targetIndex.parent();
|
||||
NeoChatRoom *currentParentSpace = nullptr;
|
||||
if (!currentParent.isValid()) {
|
||||
currentParentSpace = rootSpace;
|
||||
} else {
|
||||
currentParentSpace = static_cast<NeoChatRoom *>(connection->room(currentParent.data(SpaceChildrenModel::RoomIDRole).toString()));
|
||||
}
|
||||
NeoChatRoom *targetParentSpace = nullptr;
|
||||
if (!targetParent.isValid()) {
|
||||
targetParentSpace = rootSpace;
|
||||
} else {
|
||||
targetParentSpace = static_cast<NeoChatRoom *>(connection->room(targetParent.data(SpaceChildrenModel::RoomIDRole).toString()));
|
||||
}
|
||||
// If both parents are not resolvable to a room object we don't have the permissions
|
||||
// required for this action.
|
||||
if (currentParentSpace == nullptr || targetParentSpace == nullptr) {
|
||||
return;
|
||||
}
|
||||
|
||||
const auto currentRow = currentIndex.row();
|
||||
auto targetRow = targetIndex.row();
|
||||
|
||||
const auto moveRoomId = currentIndex.data(SpaceChildrenModel::RoomIDRole).toString();
|
||||
auto targetRoom = static_cast<NeoChatRoom *>(connection->room(targetIndex.data(SpaceChildrenModel::RoomIDRole).toString()));
|
||||
// If the target room is a space, assume we want to drop the room into it.
|
||||
if (targetRoom != nullptr && targetRoom->isSpace()) {
|
||||
targetParent = targetIndex;
|
||||
targetParentSpace = targetRoom;
|
||||
targetRow = rowCount(targetParent);
|
||||
}
|
||||
|
||||
const auto newRowCount = rowCount(targetParent) + (currentParentSpace != targetParentSpace ? 1 : 0);
|
||||
for (int i = 0; i < newRowCount; i++) {
|
||||
if (currentParentSpace == targetParentSpace && i == currentRow) {
|
||||
continue;
|
||||
}
|
||||
|
||||
targetParentSpace->setChildOrder(index(i, 0, targetParent).data(SpaceChildrenModel::RoomIDRole).toString(),
|
||||
QString::number(i > targetRow ? i + 1 : i, 36));
|
||||
|
||||
if (i == targetRow) {
|
||||
if (currentParentSpace != targetParentSpace) {
|
||||
currentParentSpace->removeChild(moveRoomId, true);
|
||||
targetParentSpace->addChild(moveRoomId, true, false, false, QString::number(i + 1, 36));
|
||||
} else {
|
||||
targetParentSpace->setChildOrder(currentIndex.data(SpaceChildrenModel::RoomIDRole).toString(), QString::number(i + 1, 36));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#include "moc_spacechildsortfiltermodel.cpp"
|
||||
|
||||
@@ -46,6 +46,8 @@ protected:
|
||||
*/
|
||||
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
|
||||
|
||||
Q_INVOKABLE void move(const QModelIndex ¤tIndex, const QModelIndex &targetIndex);
|
||||
|
||||
Q_SIGNALS:
|
||||
void filterTextChanged();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user