Fix compilation
This commit is contained in:
@@ -29,6 +29,7 @@ public:
|
|||||||
Deprioritized, /**< The room is set as low priority. */
|
Deprioritized, /**< The room is set as low priority. */
|
||||||
Space, /**< The room is a space. */
|
Space, /**< The room is a space. */
|
||||||
AddDirect, /**< So we can show the add friend delegate. */
|
AddDirect, /**< So we can show the add friend delegate. */
|
||||||
|
TypesCount, /**< Number of different types. */
|
||||||
};
|
};
|
||||||
Q_ENUM(Types);
|
Q_ENUM(Types);
|
||||||
|
|
||||||
|
|||||||
@@ -115,10 +115,10 @@ QVariant TreeItem::data(int role) const
|
|||||||
return room->topic();
|
return room->topic();
|
||||||
case RoomTreeModel::CategoryRole:
|
case RoomTreeModel::CategoryRole:
|
||||||
return NeoChatRoomType::typeForRoom(room);
|
return NeoChatRoomType::typeForRoom(room);
|
||||||
case RoomTreeModel::NotificationCountRole:
|
case RoomTreeModel::ContextNotificationCountRole:
|
||||||
return room->notificationCount();
|
return room->contextAwareNotificationCount();
|
||||||
case RoomTreeModel::HighlightCountRole:
|
case RoomTreeModel::HasHighlightNotificationsRole:
|
||||||
return room->highlightCount();
|
return room->highlightCount() > 0 && room->contextAwareNotificationCount() > 0;
|
||||||
case RoomTreeModel::LastActiveTimeRole:
|
case RoomTreeModel::LastActiveTimeRole:
|
||||||
return room->lastActiveTime();
|
return room->lastActiveTime();
|
||||||
case RoomTreeModel::JoinStateRole:
|
case RoomTreeModel::JoinStateRole:
|
||||||
@@ -159,6 +159,21 @@ TreeItem *TreeItem::parentItem() const
|
|||||||
return m_parentItem;
|
return m_parentItem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::optional<int> TreeItem::position(Quotient::Room *room) const
|
||||||
|
{
|
||||||
|
Q_ASSERT_X(std::holds_alternative<NeoChatRoomType::Types>(m_treeData), __FUNCTION__, "containsRoom only works in category items");
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
for (const auto &child : m_childItems) {
|
||||||
|
if (std::get<NeoChatRoom *>(child->treeData()) == room) {
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::nullopt;
|
||||||
|
}
|
||||||
|
|
||||||
RoomTreeModel::RoomTreeModel(QObject *parent)
|
RoomTreeModel::RoomTreeModel(QObject *parent)
|
||||||
: QAbstractItemModel(parent)
|
: QAbstractItemModel(parent)
|
||||||
{
|
{
|
||||||
@@ -167,15 +182,8 @@ RoomTreeModel::RoomTreeModel(QObject *parent)
|
|||||||
|
|
||||||
void RoomTreeModel::initializeCategories()
|
void RoomTreeModel::initializeCategories()
|
||||||
{
|
{
|
||||||
for (const auto &key : m_rooms.keys()) {
|
|
||||||
for (const auto &room : m_rooms[key]) {
|
|
||||||
room->disconnect(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
m_rooms.clear();
|
|
||||||
|
|
||||||
m_rootItem.reset(new TreeItem(nullptr));
|
m_rootItem.reset(new TreeItem(nullptr));
|
||||||
for (int i = 0; i < 8; i++) {
|
for (int i = 0; i < NeoChatRoomType::TypesCount; i++) {
|
||||||
m_rootItem->appendChild(std::make_unique<TreeItem>(NeoChatRoomType::Types(i), m_rootItem.get()));
|
m_rootItem->appendChild(std::make_unique<TreeItem>(NeoChatRoomType::Types(i), m_rootItem.get()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -225,8 +233,9 @@ void RoomTreeModel::newRoom(Room *r)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
beginInsertRows(index(type, 0), m_rooms[type].size(), m_rooms[type].size());
|
auto categoryItem = m_rootItem->child(type);
|
||||||
m_rooms[type].append(room);
|
beginInsertRows(index(type, 0), categoryItem->childCount(), categoryItem->childCount());
|
||||||
|
categoryItem->appendChild(std::make_unique<TreeItem>(room));
|
||||||
connectRoomSignals(room);
|
connectRoomSignals(room);
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
@@ -240,10 +249,12 @@ void RoomTreeModel::leftRoom(Room *r)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto parentItem = getItem(idx.parent());
|
||||||
|
Q_ASSERT(parentItem);
|
||||||
|
|
||||||
beginRemoveRows(idx.parent(), idx.row(), idx.row());
|
beginRemoveRows(idx.parent(), idx.row(), idx.row());
|
||||||
const bool success = parentItem->removeChildren(position, rows);
|
const bool success = parentItem->removeChildren(idx.row(), 1);
|
||||||
m_rooms[type][row]->disconnect(this);
|
room->disconnect(this);
|
||||||
m_rooms[type].removeAt(row);
|
|
||||||
endRemoveRows();
|
endRemoveRows();
|
||||||
|
|
||||||
if (success) {
|
if (success) {
|
||||||
@@ -257,10 +268,12 @@ void RoomTreeModel::moveRoom(Quotient::Room *room)
|
|||||||
// NeoChatRoomType::typeForRoom doesn't match it's current location. So find the room.
|
// NeoChatRoomType::typeForRoom doesn't match it's current location. So find the room.
|
||||||
NeoChatRoomType::Types oldType;
|
NeoChatRoomType::Types oldType;
|
||||||
int oldRow = -1;
|
int oldRow = -1;
|
||||||
for (const auto &key : m_rooms.keys()) {
|
for (int i = 0; i < NeoChatRoomType::TypesCount; i++) {
|
||||||
if (m_rooms[key].contains(room)) {
|
auto categoryItem = m_rootItem->child(i);
|
||||||
oldType = key;
|
auto position = categoryItem->position(room);
|
||||||
oldRow = m_rooms[key].indexOf(room);
|
if (position) {
|
||||||
|
oldType = static_cast<NeoChatRoomType::Types>(i);
|
||||||
|
oldRow = *position;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -273,14 +286,23 @@ void RoomTreeModel::moveRoom(Quotient::Room *room)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const auto oldParent = index(oldType, 0, {});
|
const auto oldParent = index(oldType, 0, {});
|
||||||
|
auto oldParentItem = getItem(oldParent);
|
||||||
|
Q_ASSERT(oldParentItem);
|
||||||
|
|
||||||
const auto newParent = index(newType, 0, {});
|
const auto newParent = index(newType, 0, {});
|
||||||
|
auto newParentItem = getItem(newParent);
|
||||||
|
Q_ASSERT(newParentItem);
|
||||||
|
|
||||||
// HACK: We're doing this as a remove then insert because moving doesn't work
|
// HACK: We're doing this as a remove then insert because moving doesn't work
|
||||||
// properly with DelegateChooser for whatever reason.
|
// properly with DelegateChooser for whatever reason.
|
||||||
|
|
||||||
beginRemoveRows(oldParent, oldRow, oldRow);
|
beginRemoveRows(oldParent, oldRow, oldRow);
|
||||||
m_rooms[oldType].removeAt(oldRow);
|
const bool success = oldParentItem->removeChildren(oldRow, 1);
|
||||||
|
Q_ASSERT(success);
|
||||||
endRemoveRows();
|
endRemoveRows();
|
||||||
beginInsertRows(newParent, m_rooms[newType].size(), m_rooms[newType].size());
|
|
||||||
m_rooms[newType].append(dynamic_cast<NeoChatRoom *>(room));
|
beginInsertRows(newParent, newParentItem->childCount(), newParentItem->childCount());
|
||||||
|
newParentItem->appendChild(std::make_unique<TreeItem>(room));
|
||||||
endInsertRows();
|
endInsertRows();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ public:
|
|||||||
TreeItem *parentItem() const;
|
TreeItem *parentItem() const;
|
||||||
bool removeChildren(int position, int count);
|
bool removeChildren(int position, int count);
|
||||||
bool removeColumns(int position, int columns);
|
bool removeColumns(int position, int columns);
|
||||||
|
std::optional<int> position(Quotient::Room *room) const;
|
||||||
int row() const;
|
int row() const;
|
||||||
TreeData treeData() const;
|
TreeData treeData() const;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user