diff options
-rw-r--r-- | catalog.cxx | 62 | ||||
m--------- | libicclient | 10 | ||||
-rw-r--r-- | qicclient.pro | 2 | ||||
-rw-r--r-- | qicclient/catalog.hxx | 81 |
4 files changed, 150 insertions, 5 deletions
diff --git a/catalog.cxx b/catalog.cxx new file mode 100644 index 0000000..17702bc --- /dev/null +++ b/catalog.cxx @@ -0,0 +1,62 @@ +#include "qicclient/catalog.hxx" + +namespace ICClient { + + int Catalog::rowCount(QModelIndex const& parent) const + { + Q_UNUSED(parent) + return products.count(); + } + + QVariant Catalog::data(QModelIndex const& index, int role) const + { + auto row = index.row(); + + if (row < 0 || row >= products.count()) return QVariant(); + + auto product = products[row]; + switch (role) { + case SkuRole: + return product.sku(); + case DescriptionRole: + return product.description(); + case CommentRole: + return product.comment(); + case ImageRole: + return product.image(); + case PriceRole: + return product.price(); + default: + return QVariant(); + } + } + + QHash<int, QByteArray> Catalog::roleNames() const + { + return QHash<int, QByteArray>{ + {SkuRole, "sku"} + , {DescriptionRole, "description"} + , {CommentRole, "comment"} + , {ImageRole, "image"} + , {PriceRole, "price"} + }; + } + + void Catalog::addProduct(Product const& product) + { + beginInsertRows(QModelIndex(), rowCount(), rowCount()); + products << product; + endInsertRows(); + } + + void Catalog::update(icclient_catalog* catalog) + { + if (catalog) { + for (size_t i = 0; i < catalog->length; i++) + addProduct(Product{catalog->products[i]}); + icclient_product_freecatalog(catalog); + } + emit updated(); + } + +} diff --git a/libicclient b/libicclient -Subproject 212608669c44c24462d803dc238ed21e899c2b9 +Subproject 8b8fcdd17bf243440f52bd74e447afcface8b10 diff --git a/qicclient.pro b/qicclient.pro index 35d02f8..7adb82e 100644 --- a/qicclient.pro +++ b/qicclient.pro @@ -3,8 +3,10 @@ TEMPLATE = lib CONFIG += staticlib HEADERS += \ + qicclient/catalog.hxx \ qicclient/client.hxx SOURCES += \ + catalog.cxx \ client.cxx INCLUDEPATH += $$PWD/libicclient LIBS += $$PWD/libicclient/libicclient.a diff --git a/qicclient/catalog.hxx b/qicclient/catalog.hxx new file mode 100644 index 0000000..07b4c81 --- /dev/null +++ b/qicclient/catalog.hxx @@ -0,0 +1,81 @@ +#ifndef QICCLIENT_CATALOG_HXX +#define QICCLIENT_CATALOG_HXX + +#include <QAbstractListModel> +#include <QLocale> +#include <icclient/product.h> + +struct icclient_catalog; + +namespace ICClient { + + class Product + { + public: + Product(icclient_product* product) : m_sku{product->sku} + { + if (product->description) + m_description + = QString{product->description}; + if (product->comment) + m_comment = QString{product->comment}; + if (product->image) + m_image = QString{product->image}; + QLocale locale; + if (product->price) + m_price = locale.toCurrencyString + (product->price, "Rp"); + } + QString const& sku() const { return m_sku; } + QString const& description() const { return m_description; } + QString const& comment() const { return m_comment; } + QString const& image() const { return m_image; } + QString const& price() const { return m_price; } + + private: + QString m_sku; + QString m_description; + QString m_comment; + QString m_image; + QString m_price; + }; + + class Catalog : public QAbstractListModel + { + Q_OBJECT + + public: + enum ProductRoles { + SkuRole = Qt::UserRole + 1, + DescriptionRole, + CommentRole, + ImageRole, + PriceRole + }; + + explicit Catalog(QObject* parent = nullptr) + : QAbstractListModel{parent} {} + + int rowCount(QModelIndex const& parent + = QModelIndex()) const Q_DECL_OVERRIDE; + QVariant data(const QModelIndex& index + , int role = Qt::DisplayRole + ) const Q_DECL_OVERRIDE; + + signals: + void updated(); + + protected: + QHash<int, QByteArray> roleNames() const Q_DECL_OVERRIDE; + + private slots: + void update(icclient_catalog* catalog); + + private: + QList<Product> products; + void addProduct(Product const& product); + }; + +} + +#endif // QICCLIENT_CATALOG_HXX |