Qt::ItemFlags DVRServersModel::flags(const QModelIndex &index) const { if (!index.isValid()) return 0; Qt::ItemFlags re = Qt::ItemIsSelectable; DVRServer *s = 0; DVRCamera *camera = 0; if (index.internalPointer()) { camera = cameraForRow(index); if (camera) s = camera->data().server(); } else s = serverForRow(index); if (!m_offlineDisabled || (s && s->isOnline() && (!camera || !camera->data().disabled()))) re |= Qt::ItemIsEnabled; else return re; if (!index.parent().isValid()) re |= Qt::ItemIsEditable; re |= Qt::ItemIsDragEnabled; return re; }
QVariant DVRServersModel::data(const QModelIndex &index, int role) const { if (!index.isValid()) return QVariant(); DVRServer *server = serverForRow(index); if (server) { if (role == Qt::ToolTipRole) { return tr("<span style='white-space:nowrap'><b>%1</b><br>%3 @ %2</span>", "tooltip") .arg(Qt::escape(server->configuration().displayName())) .arg(Qt::escape(server->configuration().hostname())) .arg(Qt::escape(server->configuration().username())); } else if (role == DVRServerRole) return QVariant::fromValue(server); switch (index.column()) { case 0: if (role == Qt::DisplayRole || role == Qt::EditRole) return server->configuration().displayName(); else if (role == Qt::DecorationRole) { if (server->status() == DVRServer::LoginError) return m_statusErrorIcon; if (!server->statusAlertMessage().isEmpty()) return m_statusAlertIcon; if (m_offlineDisabled) return m_statusIcon; else return m_statusIcon.pixmap(16, server->isOnline() ? QIcon::Normal : QIcon::Disabled); } break; case 1: if (role == Qt::DisplayRole || role == Qt::EditRole) return server->configuration().hostname(); break; case 2: if (role == Qt::DisplayRole || role == Qt::EditRole) return server->configuration().username(); break; } } DVRCamera *camera = cameraForRow(index); if (camera) { switch (role) { case DVRCameraRole: return QVariant::fromValue(camera); case Qt::DisplayRole: return camera->data().displayName(); case Qt::DecorationRole: return QIcon(QLatin1String(":/icons/webcam.png")); } } return QVariant(); }
void DVRServer::updateCamerasReply() { QNetworkReply *reply = qobject_cast<QNetworkReply*>(sender()); if (!reply) return; qDebug() << "DVRServer: Received cameras list reply"; reply->deleteLater(); if (reply->error() != QNetworkReply::NoError) { /* TODO: Handle this well */ qWarning() << "DVRServer: Error from updating cameras:" << reply->errorString(); return; } QByteArray data = reply->readAll(); QXmlStreamReader xml(data); QSet<int> idSet; bool hasDevicesElement = false; bool wasEmpty = m_visibleCameras.isEmpty(); while (xml.readNextStartElement()) { if (xml.name() == QLatin1String("devices")) { hasDevicesElement = true; while (xml.readNext() != QXmlStreamReader::Invalid) { if (xml.tokenType() == QXmlStreamReader::EndElement && xml.name() == QLatin1String("devices")) break; else if (xml.tokenType() != QXmlStreamReader::StartElement) continue; if (xml.name() == QLatin1String("device")) { bool ok = false; QString idv = xml.attributes().value(QLatin1String("id")).toString(); if (idv.isNull()) continue; int deviceId = (int)idv.toUInt(&ok); if (!ok) { xml.raiseError(QLatin1String("Invalid device ID")); continue; } idSet.insert(deviceId); DVRCamera *camera = getCamera(deviceId); if (camera) { camera->setOnline(true); DVRCameraXMLReader xmlReader; if (!xmlReader.readCamera(camera, xml)) { if (!xml.hasError()) xml.raiseError(QLatin1String("Device parsing failed")); continue; } else { DVRCameraSettingsWriter settingsWriter; settingsWriter.writeCamera(camera); } } if (!m_visibleCameras.contains(camera)) { m_visibleCameras.append(camera); emit cameraAdded(camera); } } } break; } else xml.skipCurrentElement(); } if (!hasDevicesElement) xml.raiseError(QLatin1String("Invalid format: no devices element")); if (xml.hasError()) { qWarning() << "DVRServer: Error while parsing camera list:" << xml.errorString(); return; } for (int i = 0; i < m_visibleCameras.size(); ++i) { if (!idSet.contains(m_visibleCameras[i]->data().id())) { DVRCamera *c = m_visibleCameras[i]; m_visibleCameras.removeAt(i); m_camerasMap.remove(c->data().id()); qDebug("DVRServer: camera %d removed", c->data().id()); emit cameraRemoved(c); --i; delete c; } } if (!m_devicesLoaded || (wasEmpty && !m_visibleCameras.isEmpty())) { m_devicesLoaded = true; emit devicesReady(); } }