1
0
mirror of https://github.com/jaredtao/TaoQuick.git synced 2025-02-06 21:48:24 +08:00
2020-12-08 11:20:55 +08:00

231 lines
6.6 KiB
C++

#include "DeviceAddModel.h"
#include "DeviceAddItem.h"
#include <QCoreApplication>
#include <QEventLoop>
#include <QHostAddress>
#include <chrono>
#include <random>
const static QString nameTemplate("item %1");
const static QString ipTemplate("%1.%2.%3.%4");
const static QString modelTemplate("model %1");
const static QStringList sHeaderRoles = { "name", "address", "modelString" };
class DeviceAddModelPrivate
{
public:
std::default_random_engine randomEngine;
std::uniform_int_distribution<uint32_t> u65535 { 0, 0xffffffff };
};
DeviceAddModel::DeviceAddModel(QObject *parent) : TaoListModel(parent), d(new DeviceAddModelPrivate)
{
setHeaderRoles(sHeaderRoles);
}
DeviceAddModel::~DeviceAddModel()
{
delete d;
}
void DeviceAddModel::sortByRole()
{
if (mDatas.count() <= 1) {
return;
}
int index = sHeaderRoles.indexOf(mSortRole);
switch (index) {
case 0: {
sortByName(mSortOrder);
break;
}
case 1: {
sortByAddress(mSortOrder);
break;
}
case 2: {
sortByModel(mSortOrder);
break;
}
default:
break;
}
updateAlternate();
}
void DeviceAddModel::initData()
{
const int N = 50000;
QList<TaoListItemBase *> objs;
objs.reserve(N);
auto c1 = std::chrono::high_resolution_clock::now();
for (int i = 0; i < N; ++i) {
auto item = genOne(i);
objs.append(item);
// if (i % 5 == 0)
// {
// qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
// }
}
auto c2 = std::chrono::high_resolution_clock::now();
auto micro = std::chrono::duration_cast<std::chrono::milliseconds>(c2 - c1).count();
qWarning() << "general" << N << "cost" << micro << "ms";
quickResetData(objs);
}
void DeviceAddModel::addOne()
{
auto item = genOne(d->u65535(d->randomEngine));
append({ item });
}
void DeviceAddModel::addMulti(int count)
{
QList<TaoListItemBase *> objs;
objs.reserve(count);
for (int i = 0; i < count; ++i) {
auto item = genOne(d->u65535(d->randomEngine));
objs.push_back(item);
// if (i % 5 == 0)
// {
// qApp->processEvents(QEventLoop::ExcludeUserInputEvents);
// }
}
append(objs);
}
void DeviceAddModel::insertBeforeSelected()
{
if (mDatas.count() <= 0) {
auto item = genOne(d->u65535(d->randomEngine));
insert(0, { item });
} else {
int pos = -1;
for (int i = 0; i < mDatas.count(); ++i) {
const auto &obj = mDatas.at(i);
if (obj->isVisible() && obj->isSelected()) {
pos = i;
break;
}
}
if (pos >= 0) {
auto item = genOne(d->u65535(d->randomEngine));
insert(pos, { item });
}
}
}
void DeviceAddModel::insertBeforeRow(int row)
{
auto item = genOne(d->u65535(d->randomEngine));
insert(row, { item });
}
void DeviceAddModel::clearAll()
{
clear();
}
void DeviceAddModel::removeSelected()
{
for (int i = 0; i < mDatas.count();) {
const auto &obj = mDatas.at(i);
if (obj->isVisible() && obj->isSelected()) {
removeAt(i);
} else {
++i;
}
}
}
void DeviceAddModel::removeChecked()
{
for (int i = 0; i < mDatas.count();) {
const auto &obj = mDatas.at(i);
if (obj->isVisible() && obj->isChecked()) {
removeAt(i);
} else {
++i;
}
}
}
void DeviceAddModel::removeRow(int row)
{
removeAt(row);
}
void DeviceAddModel::sortByName(Qt::SortOrder order)
{
QList<TaoListItemBase *> copyObjs = mDatas;
if (order == Qt::SortOrder::AscendingOrder) {
std::sort(copyObjs.begin(), copyObjs.end(), [](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return (static_cast<DeviceAddItem *>(obj1))->name() < (static_cast<DeviceAddItem *>(obj2))->name();
});
} else {
std::sort(copyObjs.begin(), copyObjs.end(), [](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return (static_cast<DeviceAddItem *>(obj1))->name() > (static_cast<DeviceAddItem *>(obj2))->name();
});
}
mDatas = copyObjs;
emit dataChanged(index(0, 0), index(mDatas.count() - 1, 0));
}
void DeviceAddModel::sortByAddress(Qt::SortOrder order)
{
QList<TaoListItemBase *> copyObjs = mDatas;
if (order == Qt::SortOrder::AscendingOrder) {
std::sort(copyObjs.begin(), copyObjs.end(), [=](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return static_cast<DeviceAddItem *>(obj1)->toIPv4Address() < static_cast<DeviceAddItem *>(obj2)->toIPv4Address();
});
} else {
std::sort(copyObjs.begin(), copyObjs.end(), [=](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return static_cast<DeviceAddItem *>(obj1)->toIPv4Address() > static_cast<DeviceAddItem *>(obj2)->toIPv4Address();
});
}
mDatas = copyObjs;
emit dataChanged(index(0, 0), index(mDatas.count() - 1, 0));
}
void DeviceAddModel::sortByModel(Qt::SortOrder order)
{
QList<TaoListItemBase *> copyObjs = mDatas;
if (order == Qt::SortOrder::AscendingOrder) {
std::sort(copyObjs.begin(), copyObjs.end(), [](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return (static_cast<DeviceAddItem *>(obj1))->modelString().toULongLong() < (static_cast<DeviceAddItem *>(obj2))->modelString().toULongLong();
});
} else {
std::sort(copyObjs.begin(), copyObjs.end(), [](TaoListItemBase *obj1, TaoListItemBase *obj2) -> bool {
return (static_cast<DeviceAddItem *>(obj1))->modelString().toULongLong() > (static_cast<DeviceAddItem *>(obj2))->modelString().toULongLong();
});
}
mDatas = copyObjs;
emit dataChanged(index(0, 0), index(mDatas.count() - 1, 0));
}
DeviceAddItem *DeviceAddModel::genOne(uint32_t value)
{
auto item = new DeviceAddItem;
item->set_online(value % 2 == 0);
item->set_name(nameTemplate.arg(value));
int ip4 = value % 256;
int ip3 = value / 256 % 256;
int ip2 = value / 256 / 256 % 256;
int ip1 = value / 256 / 256 / 256 % 256;
item->set_address(ipTemplate.arg(ip1).arg(ip2).arg(ip3).arg(ip4));
item->set_modelString(modelTemplate.arg(value % 2 == 0 ? value : 0xffffffff - value));
return item;
}
void DeviceAddModel::doUpdateName(int row, const QString &name)
{
if (row < 0 || row >= rowCount({})) {
return;
}
const auto &n = name.simplified();
if (n.isEmpty()) {
return;
}
static_cast<DeviceAddItem *>(mDatas.at(row))->set_name(name);
}