#include "csearchdialog.h" #include "ui_csearchdialog.h" #include #include #include #include #include #include #include #include #include #include cSearchDialog::cSearchDialog(QWidget *parent) : QDialog(parent), ui(new Ui::cSearchDialog), m_resultListItemModel(nullptr) { ui->setupUi(this); m_resultListItemModel = new QStandardItemModel(ui->m_resultList); ui->m_resultList->setModel(m_resultListItemModel); connect(ui->m_search, &QPushButton::clicked, this, &cSearchDialog::searchClicked); } cSearchDialog::~cSearchDialog() { delete ui; } void cSearchDialog::searchClicked() { QString searchText = ui->m_searchText->text(); bool keywordSearch = ui->m_searchByKeyword->isChecked(); if(searchText.isEmpty()) return; m_resultListItemModel->clear(); QStringList header; header << "MouserPartNumber" << "Manufacturer" << "ManufacturerPartNumber" << "description" << "Category"; m_resultListItemModel->setHorizontalHeaderLabels(header); if(keywordSearch) doSearchByKeyword(searchText); else doSearchByPartNumber(searchText); } bool cSearchDialog::doSearchByKeyword(const QString& keyword) { QSettings settings; QJsonObject keywordRequest; keywordRequest["keyword"] = keyword; keywordRequest["records"] = 0; keywordRequest["startingRecord"] = 0; keywordRequest["searchOptions"] = "string"; keywordRequest["searchWithYourSignUpLanguage"] = "string"; QJsonObject obj; obj["SearchByKeywordRequest"] = keywordRequest; QJsonDocument doc(obj); QByteArray data = doc.toJson(QJsonDocument::Compact); if(!doSearch("/search/keyword", data)) return(false); return(true); } bool cSearchDialog::doSearchByPartNumber(const QString& partNumber) { QSettings settings; QJsonObject keywordRequest; keywordRequest["mouserPartNumber"] = partNumber; keywordRequest["searchOptions"] = "string"; QJsonObject obj; obj["SearchByPartRequest"] = keywordRequest; QJsonDocument doc(obj); QByteArray data = doc.toJson(QJsonDocument::Compact); if(!doSearch("/search/partnumber", data)) return(false); return(true); } bool cSearchDialog::doSearch(const QString& function, const QByteArray& data) { QSettings settings; QString requestUrl = QString(settings.value("plugins/importMouser/url", "").toString()) + "/v" + settings.value("plugins/importMouser/api_version", "").toString() + function + "?apiKey=" + settings.value("plugins/importMouser/api_key", "").toString(); QNetworkAccessManager* networkAccessManager = new QNetworkAccessManager(this); const QUrl url(requestUrl); QNetworkRequest request(url); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/json"); QNetworkReply* reply = networkAccessManager->post(request, data); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); if(reply->error() == QNetworkReply::NoError) { QString strReply = (QString)reply->readAll(); QJsonDocument jsonResponse = QJsonDocument::fromJson(strReply.toUtf8()); QJsonObject jsonObj = jsonResponse.object(); QJsonObject searchResults = jsonObj["SearchResults"].toObject(); qint32 numberOfResults = searchResults["NumberOfResult"].toInt(); if(numberOfResults) { QJsonArray parts = searchResults["Parts"].toArray(); for(int z = 0;z < parts.count();z++) { QJsonObject part = parts[z].toObject(); QString availability = part["availability"].toString(); QString dataSheetUrl = part["DataSheetUrl"].toString(); QString description = part["Description"].toString(); QString factoryStock = part["FactoryStock"].toString(); QString imagePath = part["ImagePath"].toString(); QString category = part["Category"].toString(); QString leadTime = part["LeadTime"].toString(); QString lifecycleStatus = part["LifecycleStatus"].toString(); QString manufacturer = part["Manufacturer"].toString(); QString manufacturerPartNumber = part["ManufacturerPartNumber"].toString(); QString min = part["Min"].toString(); QString mult = part["Mult"].toString(); QString mouserPartNumber = part["MouserPartNumber"].toString(); QString productDetailUrl = part["ProductDetailUrl"].toString(); QString reeling = part["Reeling"].toString(); QString rohsStatus = part["ROHSStatus"].toString(); QString suggestedReplacement = part["SuggestedReplacement"].toString(); qint32 multiSimBlue = part["MultiSimBlue"].toInt(); QString isDiscontinued = part["IsDiscontinued"].toString(); QString rtm = part["RTM"].toString(); QString mouserProductCategory = part["MouserProductCategory"].toString(); QString ipcCode = part["IPCCode"].toString(); QString sField = part["SField"].toString(); QString vNum = part["VNum"].toString(); QString actualMfrName = part["ActualMfrName"].toString(); QString availableOnOrder = part["AvailableOnOrder"].toString(); QString availabilityInStock = part["AvailabilityInStock"].toString(); QString salesMaximumOrderQty = part["SalesMaximumOrderQty"].toString(); QString restrictionMessage = part["RestrictionMessage"].toString(); QString pid = part["PID"].toString(); QJsonArray ProductAttributes = part["ProductAttributes"].toArray(); QHash productAttributes; for(int x = 0;x < ProductAttributes.count();x++) { QJsonObject attribute = ProductAttributes[x].toObject(); productAttributes.insert(attribute["AttributeName"].toString(), attribute["AttributeValue"].toString()); } QJsonArray AvailabilityOnOrder = part["AvailabilityOnOrder"].toArray(); QHash availabilityOnOrder; for(int x = 0;x < AvailabilityOnOrder.count();x++) { QJsonObject availability = AvailabilityOnOrder[x].toObject(); availabilityOnOrder.insert(availability["Date"].toString(), availability["Quantity"].toInt()); } QJsonArray ProductCompliance = part["ProductCompliance"].toArray(); QHash productCompliance; for(int x = 0;x < ProductCompliance.count();x++) { QJsonObject compliance = ProductCompliance[x].toObject(); productCompliance.insert(compliance["ComplianceName"].toString(), compliance["ComplianceValue"].toString()); } /* "PriceBreaks": [ { "Quantity": 0, "Price": "string", "Currency": "string" } ], "AlternatePackagings": [ { "APMfrPN": "string" } ], "UnitWeightKg": { "UnitWeight": 0 }, "StandardCost": { "Standardcost": 0 }, "InfoMessages": [ "string" ], */ QStandardItem* mouserPartNumberItem = new QStandardItem(mouserPartNumber); QStandardItem* manufacturerItem = new QStandardItem(manufacturer); QStandardItem* manufacturerPartNumberItem = new QStandardItem(manufacturerPartNumber); QStandardItem* descriptionItem = new QStandardItem(description); QStandardItem* categoryItem = new QStandardItem(category); QIcon icon = iconFromUrl(imagePath); if(!icon.isNull()) mouserPartNumberItem->setIcon(icon); m_resultListItemModel->appendRow(QList() << mouserPartNumberItem << manufacturerItem << manufacturerPartNumberItem << descriptionItem << categoryItem); } for(int i = 0;i < m_resultListItemModel->columnCount();i++) ui->m_resultList->resizeColumnToContents(i); } delete reply; } else { qDebug() << reply->errorString(); delete reply; } delete networkAccessManager; return(true); } QIcon cSearchDialog::iconFromUrl(const QString& iconURL) { QNetworkAccessManager* networkAccessManager = new QNetworkAccessManager(this); const QUrl url(iconURL); QNetworkRequest request(url); QNetworkReply* reply = networkAccessManager->get(request); QEventLoop loop; QObject::connect(reply, SIGNAL(finished()), &loop, SLOT(quit())); loop.exec(); if(reply->error() == QNetworkReply::NoError) { QByteArray data = reply->readAll(); QPixmap pixmap; pixmap.loadFromData(data); QIcon icon(pixmap); return(icon); } return(QIcon()); }