You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
193 lines
4.2 KiB
193 lines
4.2 KiB
#include "exchangedevicesmodel.h"
|
|
#include "exchangedevicesmodel_p.h"
|
|
#include <chrono>
|
|
|
|
#undef logDebug
|
|
#undef logInfo
|
|
#undef logWarning
|
|
#undef logCritical
|
|
#include <QtMvvmCore/private/qtmvvm_logging_p.h>
|
|
|
|
using namespace QtMvvm;
|
|
using namespace QtDataSync;
|
|
using namespace std::chrono;
|
|
|
|
#if QT_HAS_INCLUDE(<chrono>)
|
|
#define chrtime(x) x
|
|
#else
|
|
#define chrtime(x) duration_cast<milliseconds>(x).count()
|
|
#endif
|
|
|
|
ExchangeDevicesModel::ExchangeDevicesModel(QObject *parent) :
|
|
QAbstractListModel(parent),
|
|
d(new ExchangeDevicesModelPrivate())
|
|
{}
|
|
|
|
ExchangeDevicesModel::~ExchangeDevicesModel() {}
|
|
|
|
void ExchangeDevicesModel::setup(QtDataSync::UserExchangeManager *exchangeManager)
|
|
{
|
|
if(d->exchangeManager)
|
|
d->exchangeManager->disconnect(this);
|
|
|
|
beginResetModel();
|
|
d->exchangeManager = exchangeManager;
|
|
d->devices.clear();
|
|
d->devices.reserve(d->exchangeManager->devices().size());
|
|
for(auto device : d->exchangeManager->devices())
|
|
d->devices.append(device);
|
|
endResetModel();
|
|
|
|
connect(d->exchangeManager, &UserExchangeManager::devicesChanged,
|
|
this, &ExchangeDevicesModel::updateDevices);
|
|
}
|
|
|
|
UserInfo ExchangeDevicesModel::infoAt(const QModelIndex &index) const
|
|
{
|
|
if(index.isValid())
|
|
return d->devices.value(index.row());
|
|
else
|
|
return {};
|
|
}
|
|
|
|
QVariant ExchangeDevicesModel::headerData(int section, Qt::Orientation orientation, int role) const
|
|
{
|
|
if(orientation != Qt::Horizontal)
|
|
return {};
|
|
|
|
switch (section) {
|
|
case 0:
|
|
switch(role) {
|
|
case NameRole:
|
|
return tr("Name");
|
|
case HostRole:
|
|
return tr("Host");
|
|
case PortRole:
|
|
return tr("Port");
|
|
case AddressRole:
|
|
return tr("Address");
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case 1:
|
|
if(role == Qt::DisplayRole)
|
|
return tr("Address");
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
int ExchangeDevicesModel::rowCount(const QModelIndex &parent) const
|
|
{
|
|
if (parent.isValid())
|
|
return 0;
|
|
else
|
|
return d->devices.size();
|
|
}
|
|
|
|
int ExchangeDevicesModel::columnCount(const QModelIndex &parent) const
|
|
{
|
|
if (parent.isValid())
|
|
return 0;
|
|
else
|
|
return 2;
|
|
}
|
|
|
|
QVariant ExchangeDevicesModel::data(const QModelIndex &index, int role) const
|
|
{
|
|
if (!index.isValid())
|
|
return QVariant();
|
|
|
|
switch (index.column()) {
|
|
case 0:
|
|
switch(role) {
|
|
case NameRole:
|
|
return d->devices.value(index.row()).name();
|
|
case HostRole:
|
|
return d->devices.value(index.row()).address().toString();
|
|
case PortRole:
|
|
return d->devices.value(index.row()).port();
|
|
case AddressRole:
|
|
return fullAddress(d->devices.value(index.row()));
|
|
default:
|
|
break;
|
|
}
|
|
break;
|
|
case 1:
|
|
if(role == Qt::DisplayRole)
|
|
return fullAddress(d->devices.value(index.row()));
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
return {};
|
|
}
|
|
|
|
QHash<int, QByteArray> ExchangeDevicesModel::roleNames() const
|
|
{
|
|
return {
|
|
{NameRole, "name"},
|
|
{HostRole, "host"},
|
|
{PortRole, "port"},
|
|
{AddressRole, "address"}
|
|
};
|
|
}
|
|
|
|
QString ExchangeDevicesModel::fullAddress(const UserInfo &userInfo)
|
|
{
|
|
return tr("%1:%2")
|
|
.arg(userInfo.address().toString())
|
|
.arg(userInfo.port());
|
|
}
|
|
|
|
void ExchangeDevicesModel::updateDevices(const QList<UserInfo> &devices)
|
|
{
|
|
//find new devices and update existing
|
|
QList<ExchangeDevicesModelPrivate::LimitedUserInfo> addList;
|
|
for(auto device : devices) {
|
|
auto dIndex = d->devices.indexOf(device);
|
|
if(dIndex != -1) {
|
|
if(device.name() != d->devices[dIndex].name()) {
|
|
logDebug() << "Updating name of device" << device;
|
|
d->devices[dIndex] = device;
|
|
emit dataChanged(index(dIndex), index(dIndex, 1));
|
|
} else
|
|
d->devices[dIndex].deadline.setRemainingTime(chrtime(seconds(5)), Qt::VeryCoarseTimer);
|
|
} else {
|
|
logDebug() << "Adding new device" << device;
|
|
addList.append(device);
|
|
}
|
|
}
|
|
|
|
//remove old devices
|
|
for(auto i = 0; i < d->devices.size();) {
|
|
if(d->devices[i].deadline.hasExpired()) {
|
|
logDebug() << "Removing stale device" << d->devices[i];
|
|
beginRemoveRows({}, i, i);
|
|
d->devices.removeAt(i);
|
|
endRemoveRows();
|
|
} else
|
|
i++;
|
|
}
|
|
|
|
//add new devices
|
|
if(addList.isEmpty())
|
|
return;
|
|
beginInsertRows({},
|
|
d->devices.size(),
|
|
d->devices.size() + addList.size() - 1);
|
|
d->devices.append(addList);
|
|
endInsertRows();
|
|
}
|
|
|
|
|
|
|
|
ExchangeDevicesModelPrivate::LimitedUserInfo::LimitedUserInfo(const UserInfo &info) :
|
|
UserInfo(info),
|
|
deadline(chrtime(seconds(5)), Qt::VeryCoarseTimer)
|
|
{}
|
|
|