diff options
Diffstat (limited to 'works/life/cpp-practicum/Record.cpp')
-rw-r--r-- | works/life/cpp-practicum/Record.cpp | 343 |
1 files changed, 343 insertions, 0 deletions
diff --git a/works/life/cpp-practicum/Record.cpp b/works/life/cpp-practicum/Record.cpp new file mode 100644 index 0000000..bdee28b --- /dev/null +++ b/works/life/cpp-practicum/Record.cpp @@ -0,0 +1,343 @@ +#include "Record.hpp"
+
+#include <algorithm>
+
+void Record::WriteTo(QTextStream &stream) {
+ stream << books_.size() << ' ' << vendors_.size() << '\n';
+ for (const auto &book : books_) {
+ stream << book << '\n';
+ }
+ for (const auto &vendor : vendors_) {
+ stream << vendor << '\n';
+ }
+}
+
+void Record::ReadFrom(QTextStream &stream) {
+ books_.clear();
+ vendors_.clear();
+
+ int book_count, vendor_count;
+ stream >> book_count >> vendor_count;
+ stream.skipWhiteSpace();
+ for (int i = 0; i < book_count; i++) {
+ Book book;
+ stream >> book;
+ books_.push_back(std::move(book));
+ }
+ for (int i = 0; i < vendor_count; i++) {
+ Vendor vendor;
+ stream >> vendor;
+ vendors_.push_back(std::move(vendor));
+ }
+}
+
+int BookModel::rowCount(const QModelIndex &parent) const {
+ if (parent.isValid())
+ return 0;
+ return static_cast<int>(record_->GetBooks().size());
+}
+
+int BookModel::columnCount(const QModelIndex &parent) const {
+ if (parent.isValid())
+ return 0;
+ return 6;
+}
+
+QVariant BookModel::headerData(int section, Qt::Orientation orientation,
+ int role) const {
+ if (role != Qt::DisplayRole)
+ return QVariant();
+ if (orientation == Qt::Horizontal) {
+ switch (section) {
+ case 0:
+ return QStringLiteral("ISBN");
+ case 1:
+ return QStringLiteral("标题");
+ case 2:
+ return QStringLiteral("类型");
+ case 3:
+ return QStringLiteral("作者");
+ case 4:
+ return QStringLiteral("出版社");
+ case 5:
+ return QStringLiteral("库存");
+ default:
+ return QVariant();
+ }
+ }
+ return QVariant();
+}
+
+QVariant BookModel::data(const QModelIndex &index, int role) const {
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= static_cast<int>(record_->GetBooks().size()) ||
+ index.row() < 0)
+ return QVariant();
+
+ int row = index.row();
+ const Book &book = record_->GetBooks()[row];
+
+ int col = index.column();
+ switch (col) {
+ case 0:
+ return QString::fromStdU16String(book.GetIsbn());
+ case 1:
+ return QString::fromStdU16String(book.GetTitle());
+ case 2:
+ return QString::fromStdU16String(book.GetType());
+ case 3:
+ return QString::fromStdU16String(book.GetAuthor());
+ case 4:
+ return QString::fromStdU16String(book.GetPress());
+ case 5:
+ return book.GetStockCount();
+ default:
+ return QVariant();
+ }
+}
+
+bool BookModel::setData(const QModelIndex &index, const QVariant &value,
+ int role) {
+ if (index.isValid() && role == Qt::EditRole) {
+ int row = index.row();
+ Book &book = record_->GetBooks()[row];
+
+ int col = index.column();
+ switch (col) {
+ case 0:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetIsbn(value.toString().toStdU16String());
+ return true;
+ case 1:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetTitle(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 2:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetType(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 3:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetAuthor(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 4:
+ if (!value.canConvert<QString>())
+ return false;
+ book.SetPress(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 5:
+ if (!value.canConvert<int>())
+ return false;
+ book.SetStockCount(value.toInt());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+Qt::ItemFlags BookModel::flags(const QModelIndex &index) const {
+ if (!index.isValid())
+ return Qt::ItemIsEnabled;
+
+ return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
+}
+
+bool BookModel::insertRows(int row, int count, const QModelIndex &parent) {
+ beginInsertRows(parent, row, row + count - 1);
+ for (int i = 0; i < count; i++) {
+ record_->GetBooks().insert(record_->GetBooks().cbegin() + row, Book());
+ }
+ endInsertRows();
+ return true;
+}
+
+bool BookModel::removeRows(int row, int count, const QModelIndex &parent) {
+ beginRemoveRows(parent, row, row + count - 1);
+ record_->GetBooks().erase(record_->GetBooks().cbegin() + row,
+ record_->GetBooks().cbegin() + row + count);
+ endRemoveRows();
+ return true;
+}
+
+void BookModel::sort(int column, Qt::SortOrder order) {
+ if (column == 0) {
+ beginResetModel();
+ if (order == Qt::AscendingOrder) {
+ std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
+ [](const Book &left, const Book &right) {
+ return left.GetIsbn() < right.GetIsbn();
+ });
+ } else {
+ std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
+ [](const Book &left, const Book &right) {
+ return left.GetIsbn() > right.GetIsbn();
+ });
+ }
+ endResetModel();
+ } else if (column == 1) {
+ beginResetModel();
+ if (order == Qt::AscendingOrder) {
+ std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
+ [](const Book &left, const Book &right) {
+ return left.GetTitle() < right.GetTitle();
+ });
+ } else {
+ std::sort(record_->GetBooks().begin(), record_->GetBooks().end(),
+ [](const Book &left, const Book &right) {
+ return left.GetTitle() > right.GetTitle();
+ });
+ }
+ endResetModel();
+ }
+}
+
+int VendorModel::rowCount(const QModelIndex &parent) const {
+ if (parent.isValid())
+ return 0;
+ return static_cast<int>(record_->GetVendors().size());
+}
+
+int VendorModel::columnCount(const QModelIndex &parent) const {
+ if (parent.isValid())
+ return 0;
+ return 5;
+}
+
+QVariant VendorModel::headerData(int section, Qt::Orientation orientation,
+ int role) const {
+ if (role != Qt::DisplayRole)
+ return QVariant();
+ if (orientation == Qt::Horizontal) {
+ switch (section) {
+ case 0:
+ return QStringLiteral("编号");
+ case 1:
+ return QStringLiteral("名称");
+ case 2:
+ return QStringLiteral("类型");
+ case 3:
+ return QStringLiteral("地址");
+ case 4:
+ return QStringLiteral("电话");
+ default:
+ return QVariant();
+ }
+ }
+ return QVariant();
+}
+
+QVariant VendorModel::data(const QModelIndex &index, int role) const {
+ if (role != Qt::DisplayRole)
+ return QVariant();
+
+ if (!index.isValid())
+ return QVariant();
+
+ if (index.row() >= static_cast<int>(record_->GetVendors().size()) ||
+ index.row() < 0)
+ return QVariant();
+
+ int row = index.row();
+ const Vendor &vendor = record_->GetVendors()[row];
+
+ int col = index.column();
+ switch (col) {
+ case 0:
+ return vendor.GetId();
+ case 1:
+ return QString::fromStdU16String(vendor.GetName());
+ case 2:
+ return QString::fromStdU16String(vendor.GetType());
+ case 3:
+ return QString::fromStdU16String(vendor.GetAddress());
+ case 4:
+ return QString::fromStdU16String(vendor.GetPhone());
+ default:
+ return QVariant();
+ }
+}
+
+bool VendorModel::setData(const QModelIndex &index, const QVariant &value,
+ int role) {
+ if (index.isValid() && role == Qt::EditRole) {
+ int row = index.row();
+ Vendor &vendor = record_->GetVendors()[row];
+
+ int col = index.column();
+ switch (col) {
+ case 0:
+ if (!value.canConvert<int>())
+ return false;
+ vendor.SetId(value.toInt());
+ return true;
+ case 1:
+ if (!value.canConvert<QString>())
+ return false;
+ vendor.SetName(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 2:
+ if (!value.canConvert<QString>())
+ return false;
+ vendor.SetType(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 3:
+ if (!value.canConvert<QString>())
+ return false;
+ vendor.SetAddress(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ case 4:
+ if (!value.canConvert<QString>())
+ return false;
+ vendor.SetPhone(value.toString().toStdU16String());
+ emit dataChanged(index, index, {Qt::DisplayRole, Qt::EditRole});
+ return true;
+ default:
+ return false;
+ }
+ }
+ return false;
+}
+
+Qt::ItemFlags VendorModel::flags(const QModelIndex &index) const {
+ if (!index.isValid())
+ return Qt::ItemIsEnabled;
+
+ return QAbstractTableModel::flags(index) | Qt::ItemIsEditable;
+}
+
+bool VendorModel::insertRows(int row, int count, const QModelIndex &parent) {
+ beginInsertRows(parent, row, row + count - 1);
+ for (int i = 0; i < count; i++) {
+ record_->GetVendors().insert(record_->GetVendors().cbegin() + row,
+ Vendor());
+ }
+ endInsertRows();
+ return true;
+}
+
+bool VendorModel::removeRows(int row, int count, const QModelIndex &parent) {
+ beginRemoveRows(parent, row, row + count - 1);
+ record_->GetVendors().erase(record_->GetVendors().cbegin() + row,
+ record_->GetVendors().cbegin() + row + count);
+ endRemoveRows();
+ return true;
+}
|