void LocationBar::updatePlaceHolderText() { if (qzSettings->searchFromAddressBar) { setPlaceholderText(tr("Enter address or search with %1").arg(searchEngine().name)); } else setPlaceholderText(tr("Enter address")); }
void PreferencesSearchPageWidget::addSearchEngine(const QString &path, const QString &identifier, bool isReadding) { QFile file(path); if (!file.open(QIODevice::ReadOnly)) { QMessageBox::warning(this, tr("Error"), tr("Failed to open Open Search file.")); return; } SearchEnginesManager::SearchEngineDefinition searchEngine(SearchEnginesManager::loadSearchEngine(&file, identifier, false)); file.close(); if (!searchEngine.isValid() || m_searchEngines.contains(identifier)) { QMessageBox::warning(this, tr("Error"), tr("Failed to open Open Search file.")); return; } const QStringList keywords(getKeywords(m_ui->searchViewWidget->getSourceModel())); if (keywords.contains(searchEngine.keyword)) { QMessageBox messageBox; messageBox.setWindowTitle(tr("Question")); messageBox.setText(tr("Keyword is already in use. Do you want to continue anyway?")); messageBox.setIcon(QMessageBox::Question); messageBox.setStandardButtons(QMessageBox::Yes | QMessageBox::Cancel); messageBox.setDefaultButton(QMessageBox::Cancel); if (messageBox.exec() == QMessageBox::Cancel) { return; } searchEngine.keyword.clear(); } m_searchEngines[identifier] = {false, searchEngine}; m_ui->searchViewWidget->insertRow(createRow(searchEngine)); if (isReadding) { updateReaddSearchEngineMenu(); } emit settingsModified(); }
forAll(sampleCoords_, sampleI) { label cellI = searchEngine().findCell(sampleCoords_[sampleI]); if (cellI != -1) { samplingPts.append(sampleCoords_[sampleI]); samplingCells.append(cellI); samplingFaces.append(-1); samplingSegments.append(0); samplingCurveDist.append(1.0 * sampleI); } }
forAll(points_, i) { const point& pt = points_[i]; const label celli = searchEngine().findCell(pt); if (celli != -1) { samplingPts.append(pt); samplingCells.append(celli); samplingFaces.append(-1); samplingSegments.append(0); samplingCurveDist.append(scalar(i)); } }
QHelpEngineWrapper::QHelpEngineWrapper(const QString &collectionFile) : QHelpEngine(collectionFile) { /* * Otherwise we will waste time if several new docs are found, * because we will start to index them, only to be interrupted * by the next request. Also, there is a nasty SQLITE bug that will * cause the application to hang for minutes in that case. * This call is reverted by initalDocSetupDone(), which must be * called after the new docs have been installed. */ disconnect(this, SIGNAL(setupFinished()), searchEngine(), SLOT(indexDocumentation())); }
void PreferencesSearchPageWidget::editSearchEngine() { const QModelIndex index(m_ui->searchViewWidget->getIndex(m_ui->searchViewWidget->getCurrentRow(), 0)); const QString identifier(index.data(Qt::UserRole).toString()); if (identifier.isEmpty() || !m_searchEngines.contains(identifier)) { return; } QStringList keywords; for (int i = 0; i < m_ui->searchViewWidget->getRowCount(); ++i) { const QString keyword(m_ui->searchViewWidget->getIndex(i, 1).data(Qt::DisplayRole).toString()); if (m_ui->searchViewWidget->getCurrentRow() != i && !keyword.isEmpty()) { keywords.append(keyword); } } SearchEnginePropertiesDialog dialog(m_searchEngines[identifier].second, keywords, (identifier == m_defaultSearchEngine), this); if (dialog.exec() == QDialog::Rejected) { return; } SearchEnginesManager::SearchEngineDefinition searchEngine(dialog.getSearchEngine()); if (keywords.contains(searchEngine.keyword)) { searchEngine.keyword = QString(); } m_searchEngines[identifier] = qMakePair(true, searchEngine); if (dialog.isDefault()) { m_defaultSearchEngine = identifier; } m_ui->searchViewWidget->setData(index, searchEngine.title, Qt::DisplayRole); m_ui->searchViewWidget->setData(index, searchEngine.description, Qt::ToolTipRole); m_ui->searchViewWidget->setData(index, searchEngine.icon, Qt::DecorationRole); m_ui->searchViewWidget->setData(m_ui->searchViewWidget->getIndex(index.row(), 1), searchEngine.keyword, Qt::DisplayRole); emit settingsModified(); }
void Foam::sampledSets::lineUniform::calcSamples ( DynamicList<point>& samplingPts, DynamicList<label>& samplingCells, DynamicList<label>& samplingFaces, DynamicList<label>& samplingSegments, DynamicList<scalar>& samplingCurveDist ) const { label sampleSegmentI = 0, sampleI = 0; scalar sampleT = 0; while (sampleI < nPoints_) { const point pt = (1 - sampleT)*start_ + sampleT*end_; const label sampleCellI = searchEngine().findCell(pt); if (sampleCellI == -1) { if (++ sampleI < nPoints_) { sampleT = scalar(sampleI)/(nPoints_ - 1); } } else { passiveParticle sampleParticle(mesh(), pt, sampleCellI); do { samplingPts.append(sampleParticle.position()); samplingCells.append(sampleParticle.cell()); samplingFaces.append(-1); samplingSegments.append(sampleSegmentI); samplingCurveDist.append(sampleT*mag(end_ - start_)); if (++ sampleI < nPoints_) { sampleT = scalar(sampleI)/(nPoints_ - 1); sampleParticle.track((end_ - start_)/(nPoints_ - 1), 0); } } while (sampleI < nPoints_ && !sampleParticle.onBoundaryFace()); ++ sampleSegmentI; } } }
int main(int argc, char const *argv[]) { if (argc < 3) { PrintUsageAndExit(argc, argv); } NHSE::TSearchEngine searchEngine(argv[1], argv[2]); std::cerr << "Search engine is loaded\n"; std::string query; while (query != "exit") { std::cout << "Query: "; std::getline(std::cin, query); std::vector<std::string> documents = searchEngine.Search(query); PrintSearchResults(documents); } return 0; }
void PreferencesSearchPageWidget::editSearchEngine() { const QModelIndex index(m_ui->searchViewWidget->getIndex(m_ui->searchViewWidget->getCurrentRow(), 0)); const QString identifier(index.data(IdentifierRole).toString()); if (identifier.isEmpty() || !m_searchEngines.contains(identifier)) { return; } const QStringList keywords(getKeywords(m_ui->searchViewWidget->getSourceModel(), m_ui->searchViewWidget->getCurrentRow())); SearchEnginePropertiesDialog dialog(m_searchEngines[identifier].second, keywords, this); if (dialog.exec() == QDialog::Rejected) { return; } SearchEnginesManager::SearchEngineDefinition searchEngine(dialog.getSearchEngine()); if (keywords.contains(searchEngine.keyword)) { searchEngine.keyword.clear(); } m_searchEngines[identifier] = {true, searchEngine}; m_ui->searchViewWidget->setData(index, searchEngine.title, Qt::DisplayRole); m_ui->searchViewWidget->setData(index, searchEngine.title, Qt::ToolTipRole); m_ui->searchViewWidget->setData(m_ui->searchViewWidget->getIndex(index.row(), 1), searchEngine.keyword, Qt::DisplayRole); m_ui->searchViewWidget->setData(m_ui->searchViewWidget->getIndex(index.row(), 1), searchEngine.keyword, Qt::ToolTipRole); if (searchEngine.icon.isNull()) { m_ui->searchViewWidget->setData(index, QColor(Qt::transparent), Qt::DecorationRole); } else { m_ui->searchViewWidget->setData(index, searchEngine.icon, Qt::DecorationRole); } emit settingsModified(); }
void Foam::faceOnlySet::calcSamples ( DynamicList<point>& samplingPts, DynamicList<label>& samplingCells, DynamicList<label>& samplingFaces, DynamicList<label>& samplingSegments, DynamicList<scalar>& samplingCurveDist ) const { // distance vector between sampling points if (mag(end_ - start_) < SMALL) { FatalErrorIn("faceOnlySet::calcSamples()") << "Incorrect sample specification :" << " start equals end point." << endl << " start:" << start_ << " end:" << end_ << exit(FatalError); } const vector offset = (end_ - start_); const vector normOffset = offset/mag(offset); const vector smallVec = tol*offset; const scalar smallDist = mag(smallVec); // Force calculation of minimum-tet decomposition. (void) mesh().tetBasePtIs(); // Get all boundary intersections List<pointIndexHit> bHits = searchEngine().intersections ( start_ - smallVec, end_ + smallVec ); point bPoint(GREAT, GREAT, GREAT); label bFaceI = -1; if (bHits.size()) { bPoint = bHits[0].hitPoint(); bFaceI = bHits[0].index(); } // Get first tracking point. Use bPoint, bFaceI if provided. point trackPt; label trackCellI = -1; label trackFaceI = -1; //Info<< "before getTrackingPoint : bPoint:" << bPoint // << " bFaceI:" << bFaceI << endl; getTrackingPoint ( offset, start_, bPoint, bFaceI, trackPt, trackCellI, trackFaceI ); //Info<< "after getTrackingPoint : " // << " trackPt:" << trackPt // << " trackCellI:" << trackCellI // << " trackFaceI:" << trackFaceI // << endl; if (trackCellI == -1) { // Line start_ - end_ does not intersect domain at all. // (or is along edge) // Set points and cell/face labels to empty lists //Info<< "calcSamples : Both start_ and end_ outside domain" // << endl; return; } if (trackFaceI == -1) { // No boundary face. Check for nearish internal face trackFaceI = findNearFace(trackCellI, trackPt, smallDist); } //Info<< "calcSamples : got first point to track from :" // << " trackPt:" << trackPt // << " trackCell:" << trackCellI // << " trackFace:" << trackFaceI // << endl; // // Track until hit end of all boundary intersections // // current segment number label segmentI = 0; // starting index of current segment in samplePts label startSegmentI = 0; // index in bHits; current boundary intersection label bHitI = 1; while(true) { if (trackFaceI != -1) { //Info<< "trackPt:" << trackPt << " on face so use." << endl; samplingPts.append(trackPt); samplingCells.append(trackCellI); samplingFaces.append(trackFaceI); samplingCurveDist.append(mag(trackPt - start_)); } // Initialize tracking starting from trackPt passiveParticle singleParticle ( mesh(), trackPt, trackCellI ); bool reachedBoundary = trackToBoundary ( singleParticle, samplingPts, samplingCells, samplingFaces, samplingCurveDist ); // fill sampleSegments for (label i = samplingPts.size() - 1; i >= startSegmentI; --i) { samplingSegments.append(segmentI); } if (!reachedBoundary) { //Info<< "calcSamples : Reached end of samples: " // << " samplePt now:" << singleParticle.position() // << endl; break; } // Go past boundary intersection where tracking stopped // Use coordinate comparison instead of face comparison for // accuracy reasons bool foundValidB = false; while (bHitI < bHits.size()) { scalar dist = (bHits[bHitI].hitPoint() - singleParticle.position()) & normOffset; //Info<< "Finding next boundary : " // << "bPoint:" << bHits[bHitI].hitPoint() // << " tracking:" << singleParticle.position() // << " dist:" << dist // << endl; if (dist > smallDist) { // hitpoint is past tracking position foundValidB = true; break; } else { bHitI++; } } if (!foundValidB) { // No valid boundary intersection found beyond tracking position break; } // Update starting point for tracking trackFaceI = bHits[bHitI].index(); trackPt = pushIn(bHits[bHitI].hitPoint(), trackFaceI); trackCellI = getBoundaryCell(trackFaceI); segmentI++; startSegmentI = samplingPts.size(); } }
void QHelpEngineWrapper::initialDocSetupDone() { connect(this, SIGNAL(setupFinished()), searchEngine(), SLOT(indexDocumentation())); setupData(); }
void Foam::polyLineSet::calcSamples ( DynamicList<point>& samplingPts, DynamicList<label>& samplingCells, DynamicList<label>& samplingFaces, DynamicList<label>& samplingSegments, DynamicList<scalar>& samplingCurveDist ) const { // Check sampling points if (sampleCoords_.size() < 2) { FatalErrorInFunction << "Incorrect sample specification. Too few points:" << sampleCoords_ << exit(FatalError); } point oldPoint = sampleCoords_[0]; for (label sampleI = 1; sampleI < sampleCoords_.size(); sampleI++) { if (mag(sampleCoords_[sampleI] - oldPoint) < SMALL) { FatalErrorInFunction << "Incorrect sample specification." << " Point " << sampleCoords_[sampleI-1] << " at position " << sampleI-1 << " and point " << sampleCoords_[sampleI] << " at position " << sampleI << " are too close" << exit(FatalError); } oldPoint = sampleCoords_[sampleI]; } // Force calculation of cloud addressing on all processors const bool oldMoving = const_cast<polyMesh&>(mesh()).moving(false); passiveParticleCloud particleCloud(mesh()); // current segment number label segmentI = 0; // starting index of current segment in samplePts label startSegmentI = 0; label sampleI = 0; point lastSample(GREAT, GREAT, GREAT); while (true) { // Get boundary intersection point trackPt; label trackCelli = -1; label trackFacei = -1; do { const vector offset = sampleCoords_[sampleI+1] - sampleCoords_[sampleI]; const scalar smallDist = mag(tol*offset); // Get all boundary intersections List<pointIndexHit> bHits = searchEngine().intersections ( sampleCoords_[sampleI], sampleCoords_[sampleI+1] ); point bPoint(GREAT, GREAT, GREAT); label bFacei = -1; if (bHits.size()) { bPoint = bHits[0].hitPoint(); bFacei = bHits[0].index(); } // Get tracking point bool isSample = getTrackingPoint ( sampleCoords_[sampleI], bPoint, bFacei, smallDist, trackPt, trackCelli, trackFacei ); if (isSample && (mag(lastSample - trackPt) > smallDist)) { //Info<< "calcSamples : getTrackingPoint returned valid sample " // << " trackPt:" << trackPt // << " trackFacei:" << trackFacei // << " trackCelli:" << trackCelli // << " sampleI:" << sampleI // << " dist:" << dist // << endl; samplingPts.append(trackPt); samplingCells.append(trackCelli); samplingFaces.append(trackFacei); // Convert sampling position to unique curve parameter. Get // fraction of distance between sampleI and sampleI+1. scalar dist = mag(trackPt - sampleCoords_[sampleI]) / mag(sampleCoords_[sampleI+1] - sampleCoords_[sampleI]); samplingCurveDist.append(sampleI + dist); lastSample = trackPt; } if (trackCelli == -1) { // No intersection found. Go to next point sampleI++; } } while ((trackCelli == -1) && (sampleI < sampleCoords_.size() - 1)); if (sampleI == sampleCoords_.size() - 1) { //Info<< "calcSamples : Reached end of samples: " // << " sampleI now:" << sampleI // << endl; break; } // // Segment sampleI .. sampleI+1 intersected by domain // // Initialize tracking starting from sampleI passiveParticle singleParticle ( mesh(), trackPt, trackCelli ); bool bReached = trackToBoundary ( particleCloud, singleParticle, sampleI, samplingPts, samplingCells, samplingFaces, samplingCurveDist ); // fill sampleSegments for (label i = samplingPts.size() - 1; i >= startSegmentI; --i) { samplingSegments.append(segmentI); } if (!bReached) { //Info<< "calcSamples : Reached end of samples: " // << " sampleI now:" << sampleI // << endl; break; } lastSample = singleParticle.position(); // Find next boundary. sampleI++; if (sampleI == sampleCoords_.size() - 1) { //Info<< "calcSamples : Reached end of samples: " // << " sampleI now:" << sampleI // << endl; break; } segmentI++; startSegmentI = samplingPts.size(); } const_cast<polyMesh&>(mesh()).moving(oldMoving); }
void Foam::uniformSet::calcSamples ( DynamicList<point>& samplingPts, dynamicLabelList& samplingCells, dynamicLabelList& samplingFaces, dynamicLabelList& samplingSegments, DynamicList<scalar>& samplingCurveDist ) const { // distance vector between sampling points if ((nPoints_ < 2) || (mag(end_ - start_) < SMALL)) { FatalErrorIn("uniformSet::calcSamples()") << "Incorrect sample specification. Either too few points or" << " start equals end point." << endl << "nPoints:" << nPoints_ << " start:" << start_ << " end:" << end_ << exit(FatalError); } const vector offset = (end_ - start_)/(nPoints_ - 1); const vector normOffset = offset/mag(offset); const vector smallVec = tol*offset; const scalar smallDist = mag(smallVec); // Get all boundary intersections List<pointIndexHit> bHits = searchEngine().intersections ( start_ - smallVec, end_ + smallVec ); point bPoint(GREAT, GREAT, GREAT); label bFaceI = -1; if (bHits.size()) { bPoint = bHits[0].hitPoint(); bFaceI = bHits[0].index(); } // Get first tracking point. Use bPoint, bFaceI if provided. point trackPt; label trackCellI = -1; label trackFaceI = -1; bool isSample = getTrackingPoint ( offset, start_, bPoint, bFaceI, trackPt, trackCellI, trackFaceI ); if (trackCellI == -1) { // Line start_ - end_ does not intersect domain at all. // (or is along edge) // Set points and cell/face labels to empty lists return; } if (isSample) { samplingPts.append(start_); samplingCells.append(trackCellI); samplingFaces.append(trackFaceI); samplingCurveDist.append(0.0); } // // Track until hit end of all boundary intersections // // current segment number label segmentI = 0; // starting index of current segment in samplePts label startSegmentI = 0; label sampleI = 0; point samplePt = start_; // index in bHits; current boundary intersection label bHitI = 1; while(true) { // Initialize tracking starting from trackPt Cloud<passiveParticle> particles(mesh(), IDLList<passiveParticle>()); passiveParticle singleParticle ( particles, trackPt, trackCellI ); bool reachedBoundary = trackToBoundary ( singleParticle, samplePt, sampleI, samplingPts, samplingCells, samplingFaces, samplingCurveDist ); // fill sampleSegments for(label i = samplingPts.size() - 1; i >= startSegmentI; --i) { samplingSegments.append(segmentI); } if (!reachedBoundary) { if (debug) { Info<< "calcSamples : Reached end of samples: " << " samplePt now:" << samplePt << " sampleI now:" << sampleI << endl; } break; } bool foundValidB = false; while (bHitI < bHits.size()) { scalar dist = (bHits[bHitI].hitPoint() - singleParticle.position()) & normOffset; if (debug) { Info<< "Finding next boundary : " << "bPoint:" << bHits[bHitI].hitPoint() << " tracking:" << singleParticle.position() << " dist:" << dist << endl; } if (dist > smallDist) { // hitpoint is past tracking position foundValidB = true; break; } else { bHitI++; } } if (!foundValidB) { // No valid boundary intersection found beyond tracking position break; } // Update starting point for tracking trackFaceI = bFaceI; trackPt = pushIn(bPoint, trackFaceI); trackCellI = getBoundaryCell(trackFaceI); segmentI++; startSegmentI = samplingPts.size(); } }
LocationBar::LoadAction LocationBar::loadAction(const QString &text) { LoadAction action; const QString &t = text.trimmed(); if (t.isEmpty()) { return action; } // Check for Search Engine shortcut const int firstSpacePos = t.indexOf(QLatin1Char(' ')); if (qzSettings->searchFromAddressBar && firstSpacePos != -1) { const QString shortcut = t.left(firstSpacePos); const QString searchedString = t.mid(firstSpacePos).trimmed(); SearchEngine en = mApp->searchEnginesManager()->engineForShortcut(shortcut); if (en.isValid()) { action.type = LoadAction::Search; action.searchEngine = en; action.loadRequest = mApp->searchEnginesManager()->searchResult(en, searchedString); return action; } } // Check for Bookmark keyword const QList<BookmarkItem*> items = mApp->bookmarks()->searchKeyword(t); if (!items.isEmpty()) { BookmarkItem* item = items.at(0); action.type = LoadAction::Bookmark; action.bookmark = item; action.loadRequest.setUrl(item->url()); return action; } if (!qzSettings->searchFromAddressBar) { const QUrl &guessedUrl = QUrl::fromUserInput(t); if (guessedUrl.isValid()) { action.type = LoadAction::Url; action.loadRequest = guessedUrl; } return action; } // Check for one word search if (t != QL1S("localhost") && !QzTools::containsSpace(t) && !t.contains(QL1C('.')) && !t.contains(QL1C(':')) && !t.contains(QL1C('/')) ) { action.type = LoadAction::Search; action.searchEngine = searchEngine(); action.loadRequest = mApp->searchEnginesManager()->searchResult(searchEngine(), t); return action; } // Otherwise load as url const QUrl &guessedUrl = QUrl::fromUserInput(t); if (guessedUrl.isValid()) { // Always allow javascript: to be loaded const bool forceLoad = guessedUrl.scheme() == QL1S("javascript"); // Only allow spaces in query if (forceLoad || !QzTools::containsSpace(guessedUrl.toString(QUrl::RemoveQuery))) { // Only allow whitelisted schemes static const QSet<QString> whitelistedSchemes = { QSL("http"), QSL("https"), QSL("ftp"), QSL("file"), QSL("data"), QSL("about"), QSL("qupzilla") }; if (forceLoad || whitelistedSchemes.contains(guessedUrl.scheme())) { action.type = LoadAction::Url; action.loadRequest = guessedUrl; return action; } } } // Search when creating url failed action.type = LoadAction::Search; action.searchEngine = searchEngine(); action.loadRequest = mApp->searchEnginesManager()->searchResult(searchEngine(), t); return action; }
void Foam::circleSet::calcSamples ( DynamicList<point>& samplingPts, DynamicList<label>& samplingCells, DynamicList<label>& samplingFaces, DynamicList<label>& samplingSegments, DynamicList<scalar>& samplingCurveDist ) const { static const string funcName = ( "void circleSet::calcSamples" "(" "DynamicList<point>&, " "DynamicList<label>&, " "DynamicList<label>&, " "DynamicList<label>&, " "DynamicList<scalar>&" ") const" ); // set start point label cellI = searchEngine().findCell(startPoint_); if (cellI != -1) { samplingPts.append(startPoint_); samplingCells.append(cellI); samplingFaces.append(-1); samplingSegments.append(0); samplingCurveDist.append(0.0); } else { WarningInFunction << "Unable to find cell at point id " << 0 << " at location " << startPoint_ << endl; } // add remaining points const scalar alpha = constant::mathematical::pi/180.0*dTheta_; const scalar sinAlpha = sin(alpha); const scalar cosAlpha = cos(alpha); // first axis vector axis1 = startPoint_ - origin_; const scalar radius = mag(axis1); if (mag(axis1 & circleAxis_) > SMALL) { WarningInFunction << "Vector defined by (startPoint - origin) not orthogonal to " << "circleAxis:" << nl << " startPoint - origin = " << axis1 << nl << " circleAxis = " << circleAxis_ << nl << endl; } axis1 /= mag(axis1); scalar theta = dTheta_; label nPoint = 1; while (theta < 360) { axis1 = axis1*cosAlpha + (axis1^circleAxis_)*sinAlpha; axis1 /= mag(axis1); point pt = origin_ + radius*axis1; label cellI = searchEngine().findCell(pt); if (cellI != -1) { samplingPts.append(pt); samplingCells.append(cellI); samplingFaces.append(-1); samplingSegments.append(nPoint); samplingCurveDist.append ( radius*constant::mathematical::pi/180.0*theta ); nPoint++; } else { WarningInFunction << "Unable to find cell at point id " << nPoint << " at location " << pt << endl; } theta += dTheta_; } }
void PreferencesSearchPageWidget::handleSearchEngineUpdate(bool isSuccess) { SearchEngineFetchJob *job(qobject_cast<SearchEngineFetchJob*>(sender())); if (!job) { return; } SearchEnginesManager::SearchEngineDefinition searchEngine(job->getSearchEngine()); const QString identifier(searchEngine.isValid() ? searchEngine.identifier : m_updateJobs.key(job)); if (!identifier.isEmpty()) { for (int i = 0; i < m_ui->searchViewWidget->getRowCount(); ++i) { const QModelIndex index(m_ui->searchViewWidget->getIndex(i, 0)); if (index.data(IdentifierRole).toString() == identifier) { if (isSuccess) { m_ui->searchViewWidget->setData(index, searchEngine.title, Qt::DisplayRole); m_ui->searchViewWidget->setData(index, searchEngine.title, Qt::ToolTipRole); if (searchEngine.icon.isNull()) { m_ui->searchViewWidget->setData(index, QColor(Qt::transparent), Qt::DecorationRole); } else { m_ui->searchViewWidget->setData(index, searchEngine.icon, Qt::DecorationRole); } } m_ui->searchViewWidget->setData(index, false, IsUpdatingRole); break; } } m_updateJobs.remove(identifier); if (m_updateJobs.isEmpty()) { m_updateAnimation->deleteLater(); m_updateAnimation = nullptr; } } if (!isSuccess) { QMessageBox::warning(this, tr("Error"), tr("Failed to update search engine."), QMessageBox::Close); return; } if (m_searchEngines.contains(identifier)) { searchEngine.keyword = m_searchEngines[identifier].second.keyword; m_searchEngines[identifier] = {true, searchEngine}; } }