some sorting in roster

This commit is contained in:
Blue 2019-09-24 12:21:29 +03:00
parent 100b2e8943
commit e4d1e21ea0
7 changed files with 89 additions and 5 deletions

View File

@ -313,3 +313,13 @@ void Models::Contact::toOfflineState()
emit childRemoved(); emit childRemoved();
refresh(); refresh();
} }
QString Models::Contact::getDisplayedName() const
{
return getContactName();
}
bool Models::Contact::columnInvolvedInDisplay(int col)
{
return Item::columnInvolvedInDisplay(col) && col == 1;
}

View File

@ -57,9 +57,11 @@ public:
unsigned int getMessagesCount() const; unsigned int getMessagesCount() const;
void dropMessages(); void dropMessages();
void getMessages(Messages& container) const; void getMessages(Messages& container) const;
QString getDisplayedName() const override;
protected: protected:
void _removeChild(int index) override; void _removeChild(int index) override;
bool columnInvolvedInDisplay(int col) override;
protected slots: protected slots:
void refresh(); void refresh();

View File

@ -55,16 +55,28 @@ void Models::Item::setName(const QString& p_name)
void Models::Item::appendChild(Models::Item* child) void Models::Item::appendChild(Models::Item* child)
{ {
bool moving = false; bool moving = false;
int oldRow = child->row(); int newRow = 0;
int newRow = this->childCount(); std::deque<Item*>::const_iterator before = childItems.begin();
while (before != childItems.end()) {
Item* bfr = *before;
if (bfr->type > child->type) {
break;
} else if (bfr->type == child->type && bfr->getDisplayedName() > child->getDisplayedName()) {
break;
}
newRow++;
before++;
}
if (child->parent != 0) { if (child->parent != 0) {
int oldRow = child->row();
moving = true; moving = true;
emit childIsAboutToBeMoved(child->parent, oldRow, oldRow, this, newRow); emit childIsAboutToBeMoved(child->parent, oldRow, oldRow, this, newRow);
child->parent->_removeChild(oldRow); child->parent->_removeChild(oldRow);
} else { } else {
emit childIsAboutToBeInserted(this, newRow, newRow); emit childIsAboutToBeInserted(this, newRow, newRow);
} }
childItems.push_back(child); childItems.insert(before, child);
child->parent = this; child->parent = this;
QObject::connect(child, SIGNAL(childChanged(Models::Item*, int, int)), this, SIGNAL(childChanged(Models::Item*, int, int))); QObject::connect(child, SIGNAL(childChanged(Models::Item*, int, int)), this, SIGNAL(childChanged(Models::Item*, int, int)));
@ -147,7 +159,7 @@ void Models::Item::_removeChild(int index)
{ {
Item* child = childItems[index]; Item* child = childItems[index];
QObject::disconnect(child, SIGNAL(childChanged(Models::Item*, int, int)), this, SIGNAL(childChanged(Models::Item*, int, int))); QObject::disconnect(child, SIGNAL(childChanged(Models::Item*, int, int)), this, SLOT(onChildChanged(Models::Item*, int, int)));
QObject::disconnect(child, SIGNAL(childIsAboutToBeInserted(Item*, int, int)), this, SIGNAL(childIsAboutToBeInserted(Item*, int, int))); QObject::disconnect(child, SIGNAL(childIsAboutToBeInserted(Item*, int, int)), this, SIGNAL(childIsAboutToBeInserted(Item*, int, int)));
QObject::disconnect(child, SIGNAL(childInserted()), this, SIGNAL(childInserted())); QObject::disconnect(child, SIGNAL(childInserted()), this, SIGNAL(childInserted()));
QObject::disconnect(child, SIGNAL(childIsAboutToBeRemoved(Item*, int, int)), this, SIGNAL(childIsAboutToBeRemoved(Item*, int, int))); QObject::disconnect(child, SIGNAL(childIsAboutToBeRemoved(Item*, int, int)), this, SIGNAL(childIsAboutToBeRemoved(Item*, int, int)));
@ -212,3 +224,44 @@ QString Models::Item::getAccountName() const
} }
return acc->getName(); return acc->getName();
} }
QString Models::Item::getDisplayedName() const
{
return name;
}
void Models::Item::onChildChanged(Models::Item* item, int row, int col)
{
Item* parent = item->parentItem();
if (parent != 0 && parent == this) {
if (item->columnInvolvedInDisplay(col)) {
int newRow = 0;
std::deque<Item*>::const_iterator before = childItems.begin();
while (before != childItems.end()) {
Item* bfr = *before;
if (bfr->type > item->type) {
break;
} else if (bfr->type == item->type && bfr->getDisplayedName() > item->getDisplayedName()) {
break;
}
newRow++;
before++;
}
if (newRow != row || (before != childItems.end() && *before != item)) {
emit childIsAboutToBeMoved(this, row, row, this, newRow);
std::deque<Item*>::const_iterator old = childItems.begin();
old += row;
childItems.erase(old);
childItems.insert(before, item);
emit childMoved();
}
}
}
emit childChanged(item, row, col);
}
bool Models::Item::columnInvolvedInDisplay(int col)
{
return col == 0;
}

View File

@ -55,6 +55,7 @@ class Item : public QObject{
public: public:
virtual void appendChild(Item *child); virtual void appendChild(Item *child);
virtual void removeChild(int index); virtual void removeChild(int index);
virtual QString getDisplayedName() const;
QString getName() const; QString getName() const;
void setName(const QString& name); void setName(const QString& name);
@ -76,8 +77,12 @@ class Item : public QObject{
protected: protected:
virtual void changed(int col); virtual void changed(int col);
virtual void _removeChild(int index); virtual void _removeChild(int index);
virtual bool columnInvolvedInDisplay(int col);
const Item* getParentAccount() const; const Item* getParentAccount() const;
protected slots:
void onChildChanged(Models::Item* item, int row, int col);
protected: protected:
QString name; QString name;
std::deque<Item*> childItems; std::deque<Item*> childItems;

View File

@ -309,3 +309,13 @@ void Models::Room::setSubject(const QString& sub)
changed(6); changed(6);
} }
} }
QString Models::Room::getDisplayedName() const
{
return getRoomName();
}
bool Models::Room::columnInvolvedInDisplay(int col)
{
return Item::columnInvolvedInDisplay(col) && col == 1;
}

View File

@ -68,10 +68,14 @@ public:
void removeParticipant(const QString& name); void removeParticipant(const QString& name);
void toOfflineState() override; void toOfflineState() override;
QString getDisplayedName() const override;
private: private:
void handleParticipantUpdate(std::map<QString, Participant*>::const_iterator itr, const QMap<QString, QVariant>& data); void handleParticipantUpdate(std::map<QString, Participant*>::const_iterator itr, const QMap<QString, QVariant>& data);
protected:
bool columnInvolvedInDisplay(int col) override;
private: private:
bool autoJoin; bool autoJoin;
bool joined; bool joined;

View File

@ -738,7 +738,7 @@ QString Models::Roster::getContactName(const QString& account, const QString& ji
if (rItr == rooms.end()) { if (rItr == rooms.end()) {
qDebug() << "An attempt to get a name of non existing contact/room " << account << ":" << jid << ", skipping"; qDebug() << "An attempt to get a name of non existing contact/room " << account << ":" << jid << ", skipping";
} else { } else {
name = rItr->second->getName(); name = rItr->second->getRoomName();
} }
} else { } else {
name = cItr->second->getContactName(); name = cItr->second->getContactName();