diff --git a/runners/places/placesrunner.h b/runners/places/placesrunner.h --- a/runners/places/placesrunner.h +++ b/runners/places/placesrunner.h @@ -35,9 +35,11 @@ public Q_SLOTS: void match(Plasma::RunnerContext *context); + void openDevice(const QString &udi); private: KFilePlacesModel m_places; + QString m_pendingUdi; }; class PlacesRunner : public Plasma::AbstractRunner @@ -55,9 +57,6 @@ Q_SIGNALS: void doMatch(Plasma::RunnerContext *context); -private Q_SLOTS: - void setupComplete(QModelIndex, bool); - private: PlacesRunnerHelper *m_helper; }; diff --git a/runners/places/placesrunner.cpp b/runners/places/placesrunner.cpp --- a/runners/places/placesrunner.cpp +++ b/runners/places/placesrunner.cpp @@ -74,6 +74,13 @@ connect(runner, &PlacesRunner::doMatch, this, &PlacesRunnerHelper::match, Qt::BlockingQueuedConnection); + + connect(&m_places, &KFilePlacesModel::setupDone, this, [this](const QModelIndex &index, bool success) { + if (success && m_pendingUdi == m_places.deviceForIndex(index).udi()) { + new KRun(m_places.url(index), nullptr); + } + m_pendingUdi.clear(); + }); } void PlacesRunnerHelper::match(Plasma::RunnerContext *c) @@ -113,50 +120,45 @@ match.setText(text); //if we have to mount it set the device udi instead of the URL, as we can't open it directly - QUrl url; if (m_places.isDevice(current_index) && m_places.setupNeeded(current_index)) { - url = QUrl(m_places.deviceForIndex(current_index).udi()); + const QString udi = m_places.deviceForIndex(current_index).udi(); + match.setId(udi); + match.setData(udi); } else { - url = m_places.url(current_index); + const QUrl url = m_places.url(current_index); + match.setData(url); + match.setId(url.toDisplayString()); } - match.setData(url); - match.setId(url.toDisplayString()); matches << match; } } context.addMatches(matches); } +void PlacesRunnerHelper::openDevice(const QString &udi) +{ + m_pendingUdi.clear(); + + for (int i = 0; i < m_places.rowCount(); ++i) { + const QModelIndex idx = m_places.index(i, 0); + if (m_places.isDevice(idx) && m_places.deviceForIndex(idx).udi() == udi) { + m_pendingUdi = udi; + m_places.requestSetup(idx); + break; + } + } +} void PlacesRunner::run(const Plasma::RunnerContext &context, const Plasma::QueryMatch &action) { Q_UNUSED(context); //I don't just pass the model index because the list could change before the user clicks on it, which would make everything go wrong. Ideally we don't want things to go wrong. if (action.data().type() == QVariant::Url) { new KRun(action.data().toUrl(), 0); } else if (action.data().canConvert()) { - //search our list for the device with the same udi, then set it up (mount it). - QString deviceUdi = action.data().toString(); - - // gets deleted in setupComplete - KFilePlacesModel *places = new KFilePlacesModel(this); - connect(places, SIGNAL(setupDone(QModelIndex,bool)), SLOT(setupComplete(QModelIndex,bool))); - bool found = false; - - for (int i = 0; i <= places->rowCount();i++) { - QModelIndex current_index = places->index(i, 0); - if (places->isDevice(current_index) && places->deviceForIndex(current_index).udi() == deviceUdi) { - places->requestSetup(current_index); - found = true; - break; - } - } - - if (!found) { - delete places; - } + m_helper->openDevice(action.data().toString()); } } @@ -171,15 +173,4 @@ return nullptr; } -//if a device needed mounting, this slot gets called when it's finished. -void PlacesRunner::setupComplete(QModelIndex index, bool success) -{ - KFilePlacesModel *places = qobject_cast(sender()); - //qDebug() << "setup complete" << places << sender(); - if (success && places) { - new KRun(places->url(index), 0); - places->deleteLater(); - } -} - #include "placesrunner.moc"