diff --git a/src/kcmodule/devices/devices.h b/src/kcmodule/devices/devices.h --- a/src/kcmodule/devices/devices.h +++ b/src/kcmodule/devices/devices.h @@ -71,7 +71,9 @@ void addDevice(); void removeDevice(); - void currentChanged(); + void removeCurrentDevice(); + void removeDevices(); + void selectionChanged(); void deviceAdded(); void deviceRemoved(); @@ -83,6 +85,7 @@ void showNoDevicesMessage(); bool showingDeviceDetails() const; + bool multipleDevicesSelected() const; BluezQt::DevicePtr currentDevice() const; Ui::Devices *m_ui; diff --git a/src/kcmodule/devices/devices.cpp b/src/kcmodule/devices/devices.cpp --- a/src/kcmodule/devices/devices.cpp +++ b/src/kcmodule/devices/devices.cpp @@ -187,6 +187,8 @@ m_proxyModel->setSourceModel(m_devicesModel); m_ui->deviceList->setModel(m_proxyModel); + m_ui->deviceList->setSelectionMode(QAbstractItemView::ExtendedSelection); + if (m_manager->devices().isEmpty()) { showNoDevicesMessage(); m_ui->deviceListWidget->hide(); @@ -196,15 +198,24 @@ connect(m_manager, &BluezQt::Manager::bluetoothOperationalChanged, this, &KCMBlueDevilDevices::bluetoothOperationalChanged); connect(m_manager, &BluezQt::Manager::deviceAdded, this, &KCMBlueDevilDevices::deviceAdded); connect(m_manager, &BluezQt::Manager::deviceRemoved, this, &KCMBlueDevilDevices::deviceRemoved); - connect(m_ui->deviceList->selectionModel(), &QItemSelectionModel::currentChanged, this, &KCMBlueDevilDevices::currentChanged); + connect(m_ui->deviceList->selectionModel(), &QItemSelectionModel::selectionChanged, this, &KCMBlueDevilDevices::selectionChanged); } void KCMBlueDevilDevices::addDevice() { QProcess::startDetached(QStringLiteral("bluedevil-wizard")); } void KCMBlueDevilDevices::removeDevice() +{ + if (multipleDevicesSelected()) { + removeDevices(); + } else { + removeCurrentDevice(); + } +} + +void KCMBlueDevilDevices::removeCurrentDevice() { BluezQt::DevicePtr device = currentDevice(); if (!device) { @@ -220,9 +231,30 @@ } } -void KCMBlueDevilDevices::currentChanged() +void KCMBlueDevilDevices::removeDevices() +{ + const QModelIndexList indexes = m_ui->deviceList->selectionModel()->selectedIndexes(); + if (KMessageBox::warningContinueCancel(this, i18n("Are you sure that you want to remove %1 devices from the list of known devices?", indexes.size()), + i18nc("Title of window that asks for confirmation when removing a device", "Device removal"), + KStandardGuiItem::remove(), + KStandardGuiItem::cancel() + ) == KMessageBox::Continue) { + for (QModelIndex index : indexes) { + BluezQt::DevicePtr device = m_devicesModel->device(m_proxyModel->mapToSource(index)); + if (device) { + device->adapter()->removeDevice(device); + } + } + } +} + +void KCMBlueDevilDevices::selectionChanged() { - if (currentDevice()) { + if (multipleDevicesSelected()) { + showConfigureMessage(); + m_ui->removeButton->setEnabled(true); + } + else if (currentDevice()) { showDeviceDetails(); m_ui->removeButton->setEnabled(true); } else { @@ -308,6 +340,11 @@ return m_contentLayout->currentWidget() == m_deviceDetails; } +bool KCMBlueDevilDevices::multipleDevicesSelected() const +{ + return m_ui->deviceList->selectionModel()->selectedIndexes().size() > 1; +} + BluezQt::DevicePtr KCMBlueDevilDevices::currentDevice() const { const QModelIndex index = m_proxyModel->mapToSource(m_ui->deviceList->currentIndex());