diff --git a/importMouser/cimportmouser.cpp b/importMouser/cimportmouser.cpp index 202a439..f992c80 100644 --- a/importMouser/cimportmouser.cpp +++ b/importMouser/cimportmouser.cpp @@ -16,5 +16,8 @@ bool cImportMouser::showSearch(QWidget* parent) { cSearchDialog* searchDialog = new cSearchDialog(parent); searchDialog->show(); + +// doSearchByKeyword("lm741"); +// doSearchByPartNumber("595-NE555P"); return(true); } diff --git a/importMouser/csearchdialog.cpp b/importMouser/csearchdialog.cpp index bb0a01e..31f6c0b 100644 --- a/importMouser/csearchdialog.cpp +++ b/importMouser/csearchdialog.cpp @@ -1,14 +1,265 @@ #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) + 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()); +} diff --git a/importMouser/csearchdialog.h b/importMouser/csearchdialog.h index 54d9bc9..a62902a 100644 --- a/importMouser/csearchdialog.h +++ b/importMouser/csearchdialog.h @@ -1,7 +1,11 @@ #ifndef CSEARCHDIALOG_H #define CSEARCHDIALOG_H + +#include #include +#include + namespace Ui { class cSearchDialog; @@ -11,12 +15,22 @@ class cSearchDialog : public QDialog { Q_OBJECT - public: - explicit cSearchDialog(QWidget *parent = nullptr); +public: + explicit cSearchDialog(QWidget *parent = nullptr); ~cSearchDialog(); + bool doSearchByKeyword(const QString& keyword); + bool doSearchByPartNumber(const QString& partNumber); + private: - Ui::cSearchDialog *ui; + Ui::cSearchDialog* ui; + QStandardItemModel* m_resultListItemModel; + + bool doSearch(const QString& function, const QByteArray& data); + QIcon iconFromUrl(const QString& iconURL); + +private slots: + void searchClicked(); }; #endif // CSEARCHDIALOG_H diff --git a/importMouser/csearchdialog.ui b/importMouser/csearchdialog.ui index 89beab6..b1be4f6 100644 --- a/importMouser/csearchdialog.ui +++ b/importMouser/csearchdialog.ui @@ -6,52 +6,119 @@ 0 0 - 400 - 332 + 509 + 426 Dialog - - - - 30 - 280 - 341 - 32 - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - - - 20 - 20 - 131 - 41 - - - - - - - :/logo/mouserSmall.jpg - - + + + + + + + + + + :/logo/mouserSmall.jpg + + + + + + + + + search by keyword + + + true + + + + + + + search by mouser id + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + + + + + + + + + Search + + + + + + + + + QAbstractItemView::NoEditTriggers + + + true + + + QAbstractItemView::ExtendedSelection + + + + 32 + 32 + + + + false + + + true + + + + + + + Qt::Horizontal + + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok + + + + + + - buttonBox + m_buttonBox accepted() cSearchDialog accept() @@ -67,7 +134,7 @@ - buttonBox + m_buttonBox rejected() cSearchDialog reject() diff --git a/importMouser/importMouser.pro b/importMouser/importMouser.pro index 589a9ef..aa9b420 100644 --- a/importMouser/importMouser.pro +++ b/importMouser/importMouser.pro @@ -1,6 +1,6 @@ TEMPLATE = lib CONFIG += plugin -QT += widgets +QT += widgets network INCLUDEPATH += ../inventryParts HEADERS = \ cimportmouser.h \ diff --git a/inventryParts/cmainwindow.cpp b/inventryParts/cmainwindow.cpp index 41a314b..3dd331e 100644 --- a/inventryParts/cmainwindow.cpp +++ b/inventryParts/cmainwindow.cpp @@ -4,6 +4,8 @@ #include #include +#include + #include @@ -13,6 +15,11 @@ cMainWindow::cMainWindow(QWidget *parent) : { createGUI(); + QSettings settings; + QString url = settings.value("plugins/importMouser/url", "").toString(); + QString apiVersion = settings.value("plugins/importMouser/api_version", "").toString(); + QString apiKey = settings.value("plugins/importMouser/api_key", "").toString(); + if(!loadPlugin()) { QMessageBox::information(this, "Error", "Could not load the plugin"); @@ -33,7 +40,6 @@ bool cMainWindow::loadPlugin() { QDir pluginsDir(QCoreApplication::applicationDirPath()); - qDebug() << pluginsDir.absolutePath(); #if defined(Q_OS_WIN) if(pluginsDir.dirName().toLower() == "debug" || pluginsDir.dirName().toLower() == "release") { @@ -74,7 +80,6 @@ void cMainWindow::on_m_test_clicked() { for(int i = 0;i < m_importInterfaceList.count();i++) { - qDebug() << m_importInterfaceList.at(i)->pluginName(); if(!m_importInterfaceList.at(i)->pluginName().compare("Import Mouser", Qt::CaseSensitive)) { m_importInterfaceList.at(i)->showSearch(this); diff --git a/inventryParts/main.cpp b/inventryParts/main.cpp index 02d019d..3484714 100644 --- a/inventryParts/main.cpp +++ b/inventryParts/main.cpp @@ -6,8 +6,13 @@ int main(int argc, char *argv[]) { - QApplication a(argc, argv); - cMainWindow w; + QApplication a(argc, argv); + + QCoreApplication::setOrganizationName("WIN-DESIGN"); + QCoreApplication::setOrganizationDomain("windesign.at"); + QCoreApplication::setApplicationName("inventryParts"); + + cMainWindow w; w.show(); return a.exec(); }