266 lines
8.4 KiB
C++
266 lines
8.4 KiB
C++
#include "csearchdialog.h"
|
|
#include "ui_csearchdialog.h"
|
|
|
|
#include <QJsonDocument>
|
|
#include <QJsonObject>
|
|
#include <QJsonArray>
|
|
|
|
#include <QByteArray>
|
|
|
|
#include <QNetworkAccessManager>
|
|
#include <QUrl>
|
|
#include <QNetworkRequest>
|
|
#include <QNetworkReply>
|
|
|
|
#include <QEventLoop>
|
|
|
|
#include <QSettings>
|
|
|
|
|
|
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<QString, QString> 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<QString, qint32> 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<QString, QString> 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<QStandardItem*>() << 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());
|
|
}
|