DeviceManager: Move creating device info to main thread

This commit is contained in:
Jonas Kvinge
2025-06-22 17:21:12 +02:00
parent f6b38fecb0
commit 8cea020fac
4 changed files with 68 additions and 57 deletions

View File

@@ -109,7 +109,7 @@ DeviceManager::DeviceManager(const SharedPtr<TaskManager> task_manager,
backend_->moveToThread(database->thread());
backend_->Init(database);
QObject::connect(this, &DeviceManager::DeviceCreatedFromDB, this, &DeviceManager::AddDeviceFromDB);
QObject::connect(this, &DeviceManager::DevicesLoaded, this, &DeviceManager::AddDevicesFromDB);
// This reads from the database and contents on the database mutex, which can be very slow on startup.
(void)QtConcurrent::run(&thread_pool_, &DeviceManager::LoadAllDevices, this);
@@ -237,42 +237,37 @@ void DeviceManager::LoadAllDevices() {
Q_ASSERT(QThread::currentThread() != qApp->thread());
const DeviceDatabaseBackend::DeviceList devices = backend_->GetAllDevices();
for (const DeviceDatabaseBackend::Device &device : devices) {
DeviceInfo *device_info = new DeviceInfo(DeviceInfo::Type::Device, root_);
device_info->InitFromDb(device);
Q_EMIT DeviceCreatedFromDB(device_info);
}
Q_EMIT DevicesLoaded(devices);
// This is done in a concurrent thread so close the unique DB connection.
backend_->Close();
}
void DeviceManager::AddDeviceFromDB(DeviceInfo *device_info) {
void DeviceManager::AddDevicesFromDB(const DeviceDatabaseBackend::DeviceList &devices) {
const QStringList icon_names = device_info->icon_name_.split(u',');
QVariantList icons;
icons.reserve(icon_names.count());
for (const QString &icon_name : icon_names) {
icons << icon_name;
}
device_info->SetIcon(icons, device_info->friendly_name_);
DeviceInfo *existing_device_info = FindEquivalentDevice(device_info);
if (existing_device_info && existing_device_info->database_id_ == -1) {
qLog(Info) << "Found existing device:" << device_info->friendly_name_;
existing_device_info->database_id_ = device_info->database_id_;
existing_device_info->icon_name_ = device_info->icon_name_;
existing_device_info->icon_ = device_info->icon_;
QModelIndex idx = ItemToIndex(existing_device_info);
if (idx.isValid()) Q_EMIT dataChanged(idx, idx);
root_->Delete(device_info->row);
}
else {
qLog(Info) << "Device added from database:" << device_info->friendly_name_;
beginInsertRows(ItemToIndex(root_), static_cast<int>(devices_.count()), static_cast<int>(devices_.count()));
devices_ << device_info;
endInsertRows();
for (const DeviceDatabaseBackend::Device &device : devices) {
const QStringList unique_ids = device.unique_id_.split(u',');
DeviceInfo *device_info = FindEquivalentDevice(unique_ids);
if (device_info && device_info->database_id_ == -1) {
qLog(Info) << "Database device linked to physical device:" << device.friendly_name_;
device_info->database_id_ = device.id_;
device_info->icon_name_ = device.icon_name_;
device_info->InitIcon();
const QModelIndex idx = ItemToIndex(device_info);
if (idx.isValid()) {
Q_EMIT dataChanged(idx, idx);
}
}
else {
qLog(Info) << "Database device:" << device.friendly_name_;
device_info = new DeviceInfo(DeviceInfo::Type::Device, root_);
device_info->InitFromDb(device);
beginInsertRows(ItemToIndex(root_), static_cast<int>(devices_.count()), static_cast<int>(devices_.count()));
devices_ << device_info;
endInsertRows();
}
}
}
@@ -440,10 +435,10 @@ DeviceInfo *DeviceManager::FindDeviceByUrl(const QList<QUrl> &urls) const {
}
DeviceInfo *DeviceManager::FindEquivalentDevice(DeviceInfo *device_info) const {
DeviceInfo *DeviceManager::FindEquivalentDevice(const QStringList &unique_ids) const {
for (const DeviceInfo::Backend &backend : std::as_const(device_info->backends_)) {
DeviceInfo *device_info_match = FindDeviceById(backend.unique_id_);
for (const QString &unique_id : unique_ids) {
DeviceInfo *device_info_match = FindDeviceById(unique_id);
if (device_info_match) {
return device_info_match;
}
@@ -483,7 +478,7 @@ void DeviceManager::PhysicalDeviceAdded(const QString &id) {
if (device_info->database_id_ == -1 && device_info->BestBackend() && device_info->BestBackend()->lister_ == lister) {
device_info->friendly_name_ = lister->MakeFriendlyName(id);
device_info->size_ = lister->DeviceCapacity(id);
device_info->SetIcon(lister->DeviceIcons(id), device_info->friendly_name_);
device_info->LoadIcon(lister->DeviceIcons(id), device_info->friendly_name_);
}
QModelIndex idx = ItemToIndex(device_info);
if (idx.isValid()) Q_EMIT dataChanged(idx, idx);
@@ -494,7 +489,7 @@ void DeviceManager::PhysicalDeviceAdded(const QString &id) {
device_info->backends_ << DeviceInfo::Backend(lister, id);
device_info->friendly_name_ = lister->MakeFriendlyName(id);
device_info->size_ = lister->DeviceCapacity(id);
device_info->SetIcon(lister->DeviceIcons(id), device_info->friendly_name_);
device_info->LoadIcon(lister->DeviceIcons(id), device_info->friendly_name_);
beginInsertRows(ItemToIndex(root_), static_cast<int>(devices_.count()), static_cast<int>(devices_.count()));
devices_ << device_info;
endInsertRows();
@@ -815,7 +810,7 @@ void DeviceManager::RemoveFromDB(DeviceInfo *device_info, const QModelIndex &idx
const QString id = device_info->BestBackend()->unique_id_;
device_info->friendly_name_ = device_info->BestBackend()->lister_->MakeFriendlyName(id);
device_info->SetIcon(device_info->BestBackend()->lister_->DeviceIcons(id), device_info->friendly_name_);
device_info->LoadIcon(device_info->BestBackend()->lister_->DeviceIcons(id), device_info->friendly_name_);
Q_EMIT dataChanged(idx, idx);
}
@@ -829,7 +824,7 @@ void DeviceManager::SetDeviceOptions(const QModelIndex &idx, const QString &frie
if (!device_info) return;
device_info->friendly_name_ = friendly_name;
device_info->SetIcon(QVariantList() << icon_name, friendly_name);
device_info->LoadIcon(QVariantList() << icon_name, friendly_name);
device_info->transcode_mode_ = mode;
device_info->transcode_format_ = format;