void ContactDropFilter::CollectDataFilters (QStringList& choiceItems, QList<std::function<void ()>>& functions, const QImage& image) { const auto& imageVar = QVariant::fromValue (image); const auto& entity = Util::MakeEntity (imageVar, {}, TaskParameter::NoParameters, "x-leechcraft/data-filter-request"); auto prevChoices = choiceItems; choiceItems.clear (); auto prevFunctions = functions; functions.clear (); auto em = Core::Instance ().GetProxy ()->GetEntityManager (); for (const auto obj : em->GetPossibleHandlers (entity)) { const auto idf = qobject_cast<IDataFilter*> (obj); const auto& verb = idf->GetFilterVerb (); for (const auto& var : idf->GetFilterVariants (imageVar)) { auto thisEnt = entity; thisEnt.Additional_ ["DataFilter"] = var.Name_; choiceItems << verb + ": " + var.Name_; thisEnt.Additional_ ["DataFilterCallback"] = QVariant::fromValue<DataFilterCallback_f> ( [this] (const QVariant& var) { const auto& url = var.toUrl (); if (url.isEmpty ()) return; ChatTab_->insertMessageText (url.toEncoded ()); }); functions.append ([thisEnt, obj] { qobject_cast<IEntityHandler*> (obj)->Handle (thisEnt); }); } } choiceItems << prevChoices; functions << prevFunctions; }
StdDataFilterMenuCreator::StdDataFilterMenuCreator (const QVariant& dataVar, IEntityManager *em, QMenu *menu) : QObject (menu) , EntityMgr_ (em) { auto entity = MakeEntity (dataVar, QString (), FromUserInitiated | OnlyHandle, "x-leechcraft/data-filter-request"); for (auto plugin : em->GetPossibleHandlers (entity)) { auto ii = qobject_cast<IInfo*> (plugin); auto idf = qobject_cast<IDataFilter*> (plugin); if (!idf) continue; const auto& vars = idf->GetFilterVariants (dataVar); if (vars.isEmpty ()) continue; const auto actor = [this, entity, plugin] (const IDataFilter::FilterVariant& var) mutable { entity.Additional_ ["DataFilter"] = var.ID_; EntityMgr_->HandleEntity (entity, plugin); ChosenPlugin_ = qobject_cast<IInfo*> (plugin)->GetUniqueID (); ChosenVariant_ = var.ID_; }; if (vars.size () == 1) AddDatafilterMenuItem (vars.value (0), menu, actor); else { auto searchMenu = menu->addMenu (ii->GetIcon (), idf->GetFilterVerb ()); for (const auto& var : vars) AddDatafilterMenuItem (var, searchMenu, actor); } } }
void ShooterDialog::SetScreenshot (const QPixmap& px) { CurrentScreenshot_ = px; RescaleLabel (); Ui_.ActionBox_->clear (); Filters_.clear (); const auto& image = px.toImage (); const auto& filters = Util::GetDataFilters (image, Proxy_->GetEntityManager ()); for (auto filter : filters) { auto idf = qobject_cast<IDataFilter*> (filter); const auto& verb = idf->GetFilterVerb (); for (const auto& var : idf->GetFilterVariants ()) { Filters_.append ({ filter, var.ID_ }); Ui_.ActionBox_->addItem (QString ("%1: %2").arg (verb).arg (var.Name_)); } } Ui_.ActionBox_->addItem (tr ("save")); }