LibrePCB Developers Documentation
Loading...
Searching...
No Matches
partinformationprovider.h
Go to the documentation of this file.
1/*
2 * LibrePCB - Professional EDA for everyone!
3 * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4 * https://librepcb.org/
5 *
6 * This program is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20#ifndef LIBREPCB_EDITOR_PARTINFORMATIONPROVIDER_H
21#define LIBREPCB_EDITOR_PARTINFORMATIONPROVIDER_H
22
23/*******************************************************************************
24 * Includes
25 ******************************************************************************/
27
28#include <QtCore>
29#include <QtGui>
30
31#include <optional>
32
33/*******************************************************************************
34 * Namespace / Forward Declarations
35 ******************************************************************************/
36namespace librepcb {
37
38class ApiEndpoint;
39class SExpression;
40
41namespace editor {
42
43/*******************************************************************************
44 * Class PartInformationProvider
45 ******************************************************************************/
46
53class PartInformationProvider final : public QObject {
54 Q_OBJECT
55
56public:
57 // Types
58 struct Part {
59 QString mpn;
60 QString manufacturer;
61 inline bool operator==(const Part& rhs) const noexcept {
62 return (mpn == rhs.mpn) && (manufacturer == rhs.manufacturer);
63 }
64 inline bool operator<(const Part& rhs) const noexcept {
65 if (mpn != rhs.mpn) {
66 return mpn < rhs.mpn;
67 } else {
68 return manufacturer < rhs.manufacturer;
69 }
70 }
71 };
72 struct PartResource {
73 QString name;
74 QString mediaType;
75 QUrl url;
76 };
78 QString source; // API server URL; Empty for entries from LibrePCB < 2.0
79 qint64 timestamp; // Seconds since epoch
80 QString mpn;
81 QString manufacturer;
83 QUrl productUrl; // Empty if N/A
84 QUrl pictureUrl; // Empty if N/A
85 QUrl pricingUrl; // Empty if N/A
86 QString status; // Empty if N/A
87 std::optional<int> availability; // nullopt if N/A
88 QMap<int, qreal> prices; // Empty if N/A
89 QVector<PartResource> resources; // Empty if N/A
90
91 QString getStatusTr() const noexcept;
92 QString getStatusColorName() const noexcept;
93 QString getAvailabilityTr() const noexcept;
94 QString getAvailabilityColorName() const noexcept;
95 qreal getPrice(int quantity = 1) const noexcept;
96 QString getPriceStr(int quantity = 1, const char* prefix = "$ ",
97 const char* suffix = "") const noexcept;
98 static QString formatQuantity(const QLocale& locale, int qty) noexcept;
99
105 void serialize(SExpression& root) const;
106
107 void load(const SExpression& node);
108 };
109
110 // Constructors / Destructor
112 delete;
113 explicit PartInformationProvider(QObject* parent = nullptr) noexcept;
114 ~PartInformationProvider() noexcept;
115
116 // Getters
117 bool isOperational() const noexcept;
118 const QString& getProviderName() const noexcept { return mProviderName; }
119 const QUrl& getProviderUrl() const noexcept { return mProviderUrl; }
120 const QUrl& getProviderLogoUrl() const noexcept { return mProviderLogoUrl; }
121 const QPixmap getProviderLogo() const noexcept { return mProviderLogo; }
122 const QUrl& getInfoUrl() const noexcept { return mInfoUrl; }
123
124 // Setters
125 void setCacheDir(const FilePath& dir) noexcept;
126 void setApiEndpoint(const QUrl& url) noexcept;
127
128 // General Methods
129 bool startOperation(int timeoutMs = 0) noexcept;
130 std::shared_ptr<PartInformation> getPartInfo(const Part& part) noexcept;
131 std::shared_ptr<PartInformation> waitForPartInfo(const Part& part,
132 int timeoutMs) noexcept;
133 bool isOngoing(const Part& part) const noexcept;
134 void scheduleRequest(const Part& part) noexcept;
135 void requestScheduledParts() noexcept;
136
137 // Static Methods
139 static PartInformationProvider obj;
140 return obj;
141 }
142
143 // Operator Overloadings
145 const PartInformationProvider& rhs) noexcept = delete;
146
147signals:
151
152private: // Methods
153 void reset() noexcept;
154 void requestStatus() noexcept;
155 void statusReceived(const QJsonObject& json) noexcept;
156 void errorWhileFetchingStatus(const QString& errorMsg) noexcept;
157 void partsInformationReceived(const QJsonObject& json) noexcept;
158 void errorWhileFetchingPartsInformation(const QString& errorMsg) noexcept;
159 void removeOutdatedInformation() noexcept;
160 void loadCacheFromDisk() noexcept;
161 void saveCacheToDisk() noexcept;
162
163private: // Data
164 // Configuration
166 QScopedPointer<ApiEndpoint> mEndpoint;
167 QString mSource;
168
169 // Error handling
172
173 // Status request state
180 QUrl mInfoUrl;
183
184 // Query request state
187
188 // Cache (Sorted for file I/O!)
189 QMap<Part, QMap<QString, std::shared_ptr<PartInformation>>> mCache;
191};
192
193/*******************************************************************************
194 * Non-Member Functions
195 ******************************************************************************/
196
197inline uint qHash(const PartInformationProvider::Part& key,
198 uint seed = 0) noexcept {
199 return ::qHash(qMakePair(key.mpn, key.manufacturer), seed);
200}
201
202/*******************************************************************************
203 * End of File
204 ******************************************************************************/
205
206} // namespace editor
207} // namespace librepcb
208
210
211#endif
Access to a LibrePCB API endpoint.
Definition apiendpoint.h:45
This class represents absolute, well-formatted paths to files or directories.
Definition filepath.h:127
The Part class.
Definition part.h:46
The SExpression class.
Definition sexpression.h:69
Parts information provider & cache.
Definition partinformationprovider.h:53
bool isOngoing(const Part &part) const noexcept
Definition partinformationprovider.cpp:356
QString mProviderName
Valid only if mStatusReceived is true
Definition partinformationprovider.h:176
void reset() noexcept
Definition partinformationprovider.cpp:391
const QString & getProviderName() const noexcept
Definition partinformationprovider.h:118
qint64 mStatusRequestedTimestamp
Definition partinformationprovider.h:174
const QUrl & getInfoUrl() const noexcept
Definition partinformationprovider.h:122
bool mStatusReceived
Definition partinformationprovider.h:175
static PartInformationProvider & instance() noexcept
Definition partinformationprovider.h:138
bool startOperation(int timeoutMs=0) noexcept
Definition partinformationprovider.cpp:328
std::shared_ptr< PartInformation > waitForPartInfo(const Part &part, int timeoutMs) noexcept
Definition partinformationprovider.cpp:345
void requestScheduledParts() noexcept
Definition partinformationprovider.cpp:366
int mErrorCounter
Definition partinformationprovider.h:170
void errorWhileFetchingPartsInformation(const QString &errorMsg) noexcept
Definition partinformationprovider.cpp:515
const QUrl & getProviderUrl() const noexcept
Definition partinformationprovider.h:119
QUrl mQueryUrl
Valid only if mStatusReceived is true
Definition partinformationprovider.h:181
bool mCacheModified
Definition partinformationprovider.h:190
void errorWhileFetchingStatus(const QString &errorMsg) noexcept
Definition partinformationprovider.cpp:454
void loadCacheFromDisk() noexcept
Definition partinformationprovider.cpp:548
void scheduleRequest(const Part &part) noexcept
Definition partinformationprovider.cpp:360
const QPixmap getProviderLogo() const noexcept
Definition partinformationprovider.h:121
void setCacheDir(const FilePath &dir) noexcept
Definition partinformationprovider.cpp:296
QUrl mInfoUrl
Valid only if mStatusReceived is true
Definition partinformationprovider.h:180
QPixmap mProviderLogo
Requested asynchronously.
Definition partinformationprovider.h:179
QUrl mProviderLogoUrl
Valid only if mStatusReceived is true
Definition partinformationprovider.h:178
void partsInformationReceived(const QJsonObject &json) noexcept
Definition partinformationprovider.cpp:466
void requestStatus() noexcept
Definition partinformationprovider.cpp:408
void setApiEndpoint(const QUrl &url) noexcept
Definition partinformationprovider.cpp:301
void saveCacheToDisk() noexcept
Definition partinformationprovider.cpp:575
const QUrl & getProviderLogoUrl() const noexcept
Definition partinformationprovider.h:120
QUrl mProviderUrl
Valid only if mStatusReceived is true
Definition partinformationprovider.h:177
void statusReceived(const QJsonObject &json) noexcept
Definition partinformationprovider.cpp:417
bool mDisabledDueToErrors
Definition partinformationprovider.h:171
QScopedPointer< ApiEndpoint > mEndpoint
Definition partinformationprovider.h:166
bool isOperational() const noexcept
Definition partinformationprovider.cpp:287
PartInformationProvider & operator=(const PartInformationProvider &rhs) noexcept=delete
QMap< Part, QMap< QString, std::shared_ptr< PartInformation > > > mCache
Definition partinformationprovider.h:189
FilePath mCacheFp
Definition partinformationprovider.h:165
std::shared_ptr< PartInformation > getPartInfo(const Part &part) noexcept
Definition partinformationprovider.cpp:340
QSet< Part > mRequestedParts
Definition partinformationprovider.h:186
int mQueryMaxPartCount
Valid only if mStatusReceived is true
Definition partinformationprovider.h:182
QVector< Part > mScheduledParts
Definition partinformationprovider.h:185
void removeOutdatedInformation() noexcept
Definition partinformationprovider.cpp:527
QString mSource
URL of mEndpoint.
Definition partinformationprovider.h:167
uint qHash(const PartInformationProvider::Part &key, uint seed=0) noexcept
Definition partinformationprovider.h:197
Definition occmodel.cpp:77
Definition uuid.h:186
Definition partinformationprovider.h:58
QString mpn
Definition partinformationprovider.h:59
bool operator==(const Part &rhs) const noexcept
Definition partinformationprovider.h:61
QString manufacturer
Definition partinformationprovider.h:60
bool operator<(const Part &rhs) const noexcept
Definition partinformationprovider.h:64
Definition partinformationprovider.h:77
QString mpn
Definition partinformationprovider.h:80
QVector< PartResource > resources
Definition partinformationprovider.h:89
std::optional< int > availability
Definition partinformationprovider.h:87
QString getPriceStr(int quantity=1, const char *prefix="$ ", const char *suffix="") const noexcept
Definition partinformationprovider.cpp:125
QString getAvailabilityColorName() const noexcept
Definition partinformationprovider.cpp:95
qint64 timestamp
Definition partinformationprovider.h:79
QUrl pricingUrl
Definition partinformationprovider.h:85
QUrl pictureUrl
Definition partinformationprovider.h:84
int results
Definition partinformationprovider.h:82
void load(const SExpression &node)
Definition partinformationprovider.cpp:198
QString manufacturer
Definition partinformationprovider.h:81
static QString formatQuantity(const QLocale &locale, int qty) noexcept
Definition partinformationprovider.cpp:136
void serialize(SExpression &root) const
Serialize into librepcb::SExpression node.
Definition partinformationprovider.cpp:151
qreal getPrice(int quantity=1) const noexcept
Definition partinformationprovider.cpp:114
QString getStatusTr() const noexcept
Definition partinformationprovider.cpp:44
QString source
Definition partinformationprovider.h:78
QString status
Definition partinformationprovider.h:86
QString getAvailabilityTr() const noexcept
Definition partinformationprovider.cpp:71
QMap< int, qreal > prices
Definition partinformationprovider.h:88
QUrl productUrl
Definition partinformationprovider.h:83
QString getStatusColorName() const noexcept
Definition partinformationprovider.cpp:60
Definition partinformationprovider.h:72
QUrl url
Definition partinformationprovider.h:75
QString name
Definition partinformationprovider.h:73
QString mediaType
Definition partinformationprovider.h:74