forked from blue/squawk
fix bug when everything was treated as animation, bug with not working group amount of messages, handled the situation when preview is painted but the file was lost
This commit is contained in:
parent
0d584c5aba
commit
721f6daa36
@ -31,7 +31,8 @@ Models::Account::Account(const QMap<QString, QVariant>& data, Models::Item* pare
|
|||||||
avatarPath(data.value("avatarPath").toString()),
|
avatarPath(data.value("avatarPath").toString()),
|
||||||
state(Shared::ConnectionState::disconnected),
|
state(Shared::ConnectionState::disconnected),
|
||||||
availability(Shared::Availability::offline),
|
availability(Shared::Availability::offline),
|
||||||
passwordType(Shared::AccountPassword::plain)
|
passwordType(Shared::AccountPassword::plain),
|
||||||
|
wasEverConnected(false)
|
||||||
{
|
{
|
||||||
QMap<QString, QVariant>::const_iterator sItr = data.find("state");
|
QMap<QString, QVariant>::const_iterator sItr = data.find("state");
|
||||||
if (sItr != data.end()) {
|
if (sItr != data.end()) {
|
||||||
@ -56,8 +57,19 @@ void Models::Account::setState(Shared::ConnectionState p_state)
|
|||||||
if (state != p_state) {
|
if (state != p_state) {
|
||||||
state = p_state;
|
state = p_state;
|
||||||
changed(2);
|
changed(2);
|
||||||
if (state == Shared::ConnectionState::disconnected) {
|
switch (state) {
|
||||||
|
case Shared::ConnectionState::disconnected:
|
||||||
toOfflineState();
|
toOfflineState();
|
||||||
|
break;
|
||||||
|
case Shared::ConnectionState::connected:
|
||||||
|
if (wasEverConnected) {
|
||||||
|
emit reconnected();
|
||||||
|
} else {
|
||||||
|
wasEverConnected = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -77,6 +77,9 @@ namespace Models {
|
|||||||
QString getBareJid() const;
|
QString getBareJid() const;
|
||||||
QString getFullJid() const;
|
QString getFullJid() const;
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void reconnected();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QString login;
|
QString login;
|
||||||
QString password;
|
QString password;
|
||||||
@ -87,6 +90,7 @@ namespace Models {
|
|||||||
Shared::ConnectionState state;
|
Shared::ConnectionState state;
|
||||||
Shared::Availability availability;
|
Shared::Availability availability;
|
||||||
Shared::AccountPassword passwordType;
|
Shared::AccountPassword passwordType;
|
||||||
|
bool wasEverConnected;
|
||||||
|
|
||||||
protected slots:
|
protected slots:
|
||||||
void toOfflineState() override;
|
void toOfflineState() override;
|
||||||
|
@ -240,3 +240,9 @@ QString Models::Contact::getDisplayedName() const
|
|||||||
return getContactName();
|
return getContactName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Models::Contact::handleRecconnect()
|
||||||
|
{
|
||||||
|
if (getMessagesCount() > 0) {
|
||||||
|
feed->requestLatestMessages();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -56,6 +56,8 @@ public:
|
|||||||
QString getStatus() const;
|
QString getStatus() const;
|
||||||
QString getDisplayedName() const override;
|
QString getDisplayedName() const override;
|
||||||
|
|
||||||
|
void handleRecconnect(); //this is a special method Models::Roster calls when reconnect happens
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void _removeChild(int index) override;
|
void _removeChild(int index) override;
|
||||||
void _appendChild(Models::Item * child) override;
|
void _appendChild(Models::Item * child) override;
|
||||||
|
@ -104,6 +104,8 @@ void Models::Reference::onChildChanged(Models::Item* item, int row, int col)
|
|||||||
{
|
{
|
||||||
if (item == original) {
|
if (item == original) {
|
||||||
emit childChanged(this, row, col);
|
emit childChanged(this, row, col);
|
||||||
|
} else {
|
||||||
|
emit childChanged(item, row, col);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -48,6 +48,7 @@ Models::Roster::~Roster()
|
|||||||
void Models::Roster::addAccount(const QMap<QString, QVariant>& data)
|
void Models::Roster::addAccount(const QMap<QString, QVariant>& data)
|
||||||
{
|
{
|
||||||
Account* acc = new Account(data);
|
Account* acc = new Account(data);
|
||||||
|
connect(acc, &Account::reconnected, this, &Roster::onAccountReconnected);
|
||||||
root->appendChild(acc);
|
root->appendChild(acc);
|
||||||
accounts.insert(std::make_pair(acc->getName(), acc));
|
accounts.insert(std::make_pair(acc->getName(), acc));
|
||||||
accountsModel->addAccount(acc);
|
accountsModel->addAccount(acc);
|
||||||
@ -744,6 +745,7 @@ void Models::Roster::removeAccount(const QString& account)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
disconnect(acc, &Account::reconnected, this, &Roster::onAccountReconnected);
|
||||||
acc->deleteLater();
|
acc->deleteLater();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1003,3 +1005,15 @@ Models::Element * Models::Roster::getElement(const Models::Roster::ElId& id)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Models::Roster::onAccountReconnected()
|
||||||
|
{
|
||||||
|
Account* acc = static_cast<Account*>(sender());
|
||||||
|
|
||||||
|
QString accName = acc->getName();
|
||||||
|
for (const std::pair<const ElId, Contact*>& pair : contacts) {
|
||||||
|
if (pair.first.account == accName) {
|
||||||
|
pair.second->handleRecconnect();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -100,6 +100,7 @@ private:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void onAccountDataChanged(const QModelIndex& tl, const QModelIndex& br, const QVector<int>& roles);
|
void onAccountDataChanged(const QModelIndex& tl, const QModelIndex& br, const QVector<int>& roles);
|
||||||
|
void onAccountReconnected();
|
||||||
void onChildChanged(Models::Item* item, int row, int col);
|
void onChildChanged(Models::Item* item, int row, int col);
|
||||||
void onChildIsAboutToBeInserted(Item* parent, int first, int last);
|
void onChildIsAboutToBeInserted(Item* parent, int first, int last);
|
||||||
void onChildInserted();
|
void onChildInserted();
|
||||||
|
@ -353,6 +353,10 @@ void MessageDelegate::paintPreview(const Models::FeedItem& data, QPainter* paint
|
|||||||
previews->insert(std::make_pair(data.id, preview));
|
previews->insert(std::make_pair(data.id, preview));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!preview->isFileReachable()) { //this is the situation when the file preview couldn't be painted because the file was moved
|
||||||
|
emit invalidPath(data.id); //or deleted. This signal notifies the model, and the model notifies the core, preview can
|
||||||
|
} //handle being invalid for as long as I need and can be even become valid again with a new path
|
||||||
|
|
||||||
option.rect.adjust(0, preview->size().height() + textMargin, 0, 0);
|
option.rect.adjust(0, preview->size().height() + textMargin, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -304,7 +304,7 @@ QVariant Models::MessageFeed::data(const QModelIndex& index, int role) const
|
|||||||
std::set<QString>::const_iterator umi = unreadMessages->find(item.id);
|
std::set<QString>::const_iterator umi = unreadMessages->find(item.id);
|
||||||
if (umi != unreadMessages->end()) {
|
if (umi != unreadMessages->end()) {
|
||||||
unreadMessages->erase(umi);
|
unreadMessages->erase(umi);
|
||||||
emit unreadMessagesCount();
|
emit unreadMessagesCountChanged();
|
||||||
}
|
}
|
||||||
|
|
||||||
item.sentByMe = sentByMe(*msg);
|
item.sentByMe = sentByMe(*msg);
|
||||||
@ -370,7 +370,6 @@ void Models::MessageFeed::fetchMore(const QModelIndex& parent)
|
|||||||
if (syncState == incomplete) {
|
if (syncState == incomplete) {
|
||||||
syncState = syncing;
|
syncState = syncing;
|
||||||
emit syncStateChange(syncState);
|
emit syncStateChange(syncState);
|
||||||
emit requestStateChange(true);
|
|
||||||
|
|
||||||
if (storage.size() == 0) {
|
if (storage.size() == 0) {
|
||||||
emit requestArchive("");
|
emit requestArchive("");
|
||||||
@ -398,7 +397,6 @@ void Models::MessageFeed::responseArchive(const std::list<Shared::Message> list,
|
|||||||
syncState = incomplete;
|
syncState = incomplete;
|
||||||
}
|
}
|
||||||
emit syncStateChange(syncState);
|
emit syncStateChange(syncState);
|
||||||
emit requestStateChange(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -656,3 +654,13 @@ Models::MessageFeed::SyncState Models::MessageFeed::getSyncState() const
|
|||||||
{
|
{
|
||||||
return syncState;
|
return syncState;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Models::MessageFeed::requestLatestMessages()
|
||||||
|
{
|
||||||
|
if (syncState != syncing) {
|
||||||
|
syncState = syncing;
|
||||||
|
emit syncStateChange(syncState);
|
||||||
|
|
||||||
|
emit requestArchive("");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -77,11 +77,12 @@ public:
|
|||||||
void decrementObservers();
|
void decrementObservers();
|
||||||
SyncState getSyncState() const;
|
SyncState getSyncState() const;
|
||||||
|
|
||||||
|
void requestLatestMessages(); //this method is used by Models::Contact to request latest messages after reconnection
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void requestArchive(const QString& before);
|
void requestArchive(const QString& before);
|
||||||
void requestStateChange(bool requesting);
|
|
||||||
void fileDownloadRequest(const QString& url);
|
void fileDownloadRequest(const QString& url);
|
||||||
void unreadMessagesCountChanged();
|
void unreadMessagesCountChanged() const;
|
||||||
void newMessage(const Shared::Message& msg);
|
void newMessage(const Shared::Message& msg);
|
||||||
void unnoticedMessage(const Shared::Message& msg);
|
void unnoticedMessage(const Shared::Message& msg);
|
||||||
void localPathInvalid(const QString& path);
|
void localPathInvalid(const QString& path);
|
||||||
|
Loading…
Reference in New Issue
Block a user