23 #include <solid/devicenotifier.h>
24 #include <solid/device.h>
25 #include <solid/deviceinterface.h>
33 class KDeviceListModel::Private
37 ~Private() {
delete rootItem; }
44 Solid::Predicate predicate;
47 void initialize(
const Solid::Predicate &p);
49 void addDevice(
const Solid::Device &device);
50 void removeBranch(
const QString &udi);
53 void _k_initDeviceList();
54 void _k_deviceAdded(
const QString &udi);
55 void _k_deviceRemoved(
const QString &udi);
61 d->deviceItems[
QString()] = d->rootItem;
62 d->initialize(Solid::Predicate());
68 d->initialize(Solid::Predicate::fromString(predicate));
74 d->initialize(predicate);
82 void KDeviceListModel::Private::initialize(
const Solid::Predicate &p)
87 QTimer::singleShot( 0, q, SLOT(_k_initDeviceList()) );
92 if( !index.isValid() )
96 Solid::Device device = deviceItem->
device();
99 if (role == Qt::DisplayRole) {
100 returnData = device.product();
103 else if (role == Qt::DecorationRole && index.column() == 0) {
104 returnData =
KIcon(device.icon());
114 if (orientation == Qt::Horizontal && role == Qt::DisplayRole)
116 return i18n(
"Device name");
124 if (row<0 || column!=0)
125 return QModelIndex();
128 if (parent.isValid()) {
131 parentItem = d->rootItem;
137 return createIndex(row, column, childItem);
139 return QModelIndex();
145 return d->indexForItem(d->rootItem);
150 if (!child.isValid())
151 return QModelIndex();
157 return QModelIndex();
159 return d->indexForItem(parentItem);
164 if( !parent.isValid() )
165 return d->rootItem->childCount();
182 return deviceItem->
device();
185 void KDeviceListModel::Private::_k_initDeviceList()
187 Solid::DeviceNotifier *notifier = Solid::DeviceNotifier::instance();
189 connect(notifier, SIGNAL(deviceAdded(
QString)),
190 q, SLOT(_k_deviceAdded(
QString)));
191 connect(notifier, SIGNAL(deviceRemoved(
QString)),
192 q, SLOT(_k_deviceRemoved(
QString)));
197 Solid::Device::listFromQuery(predicate)
198 : Solid::Device::allDevices();
200 foreach(
const Solid::Device &device, deviceList)
205 emit q->modelInitialized();
208 void KDeviceListModel::Private::addDevice(
const Solid::Device &device)
211 if (!device.isValid())
return;
215 if (!device.parentUdi().isEmpty()
216 && predicate.isValid() && !predicate.matches(device)) {
221 if (deviceItems.contains(device.udi())) {
222 item = deviceItems[device.udi()];
225 deviceItems[device.udi()] = item;
231 if (!deviceItems.contains(device.parentUdi()) )
232 addDevice( Solid::Device(device.parentUdi()) );
234 if (deviceItems.contains(device.parentUdi()))
235 parent = deviceItems[device.parentUdi()];
237 if (item->
parent()!=parent) {
244 void KDeviceListModel::Private::removeBranch(
const QString &udi)
246 if (!deviceItems.contains(udi))
return;
254 removeBranch(child->
device().udi());
257 q->beginRemoveRows(indexForItem(parent),
258 item->
row(), item->
row());
261 deviceItems.remove(udi);
267 void KDeviceListModel::Private::_k_deviceAdded(
const QString &udi)
269 Solid::Device device(udi);
273 void KDeviceListModel::Private::_k_deviceRemoved(
const QString &udi)
278 QModelIndex KDeviceListModel::Private::indexForItem(
KDeviceListItem *item)
const
280 if (item==rootItem) {
281 return QModelIndex();
283 return q->createIndex(item->
row(), 0, item);
287 #include "kdevicelistmodel.moc"