/
pi_coder
/
ByteMachine
Обзор
Документация
Войти
/
pi_coder
/
ByteMachine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/nodes/struct_node.cpp
276 строк
9 KB
pimenov-and
Перенос функциональности из старого проекта, в основном это описания узлов
19 июл 2026, 20:13
19 июл 2026, 20:13
cb3c51b
Код
Авторство
О чём код?
//////////////////////////////////////////////////////////////// // ByteMachine // Узел для наложения структуры на байты //////////////////////////////////////////////////////////////// #include "struct_node.h" #include "node_name_manager.h" #include "undo/undo_change_object_prop_value.h" #include "qt_helper.h" #include "colors.h" #include <QPainter> #include <QDomDocument> #include <QUndoStack> //============================================================== using std::size_t; //============================================================== // Конструктор с параметрами //============================================================== StructNode::StructNode(QUndoStack *undoStack, QObject *parent) : BaseNode{undoStack, parent} { name_ = nodeNameManager()->addName("struct"); Q_ASSERT(!name_.isEmpty()); createInputPin(); createOutputPin(); StructNode::updateStateInfo(); } //============================================================== // Чтение из XML //============================================================== void StructNode::readFromXml(const QDomElement &elem) { Q_ASSERT(!elem.isNull()); const QString name = readNameFromXml(elem); const qint32 left = readLeftFromXml(elem); const qint32 top = readTopFromXml(elem); const qint32 width = readWidthFromXml(elem); const qint32 height = readHeightFromXml(elem); const bool isBypass = readBypassFromXml(elem); const QString comment = readCommentFromXml(elem); setName(name); setLeft(left); setTop(top); setWidth(width); setHeight(height); setBypass(isBypass); setComment(comment); } //============================================================== // Запись в XML //============================================================== void StructNode::writeToXml(QDomDocument &doc, QDomElement &elem) const { Q_ASSERT(!doc.isNull()); Q_ASSERT(!elem.isNull()); writeIdToXml(doc, elem); writeNameToXml(doc, elem); writeLeftToXml(doc, elem); writeTopToXml(doc, elem); writeWidthToXml(doc, elem); writeHeightToXml(doc, elem); writeBypassToXml(doc, elem); writeCommentToXml(doc, elem); } //============================================================== // Вывод узла //============================================================== void StructNode::draw(QPainter *painter, ColorThemes theme) const { Q_ASSERT(painter != nullptr); Q_ASSERT(!isUnknown(theme)); drawHighlight(painter, theme); drawSimpleBody(painter, theme); drawResizebleMarker(painter, theme); drawStateArea(painter, theme); drawComments(painter, theme); } //============================================================== // Получение копии узла //============================================================== ShPtrBaseNode StructNode::clone() const { const auto cloneNode = ShPtrStructNode::create(undoStack(), parent()); cloneNode->setUndo(true); cloneNode->setName(name()); cloneNode->setTopLeft(topLeft()); cloneNode->setFilePath(filePath()); cloneNode->setBypass(isBypass()); cloneNode->setComment(comment()); cloneNode->setUndo(true); return cloneNode; } //============================================================== // Получени текста подсказки для узла //============================================================== QString StructNode::tooltipText() const { QString text{}; text += QString{"%1: \"%2\"\n"}.arg(tr("Name"), name()); text += QString{"%1: \"%2\"\n"}.arg(tr("File path"), filePath()); text += QString{"%1: %2\n"}.arg(tr("Bypass"), boolToStrTr(isBypass())); text += QString{"%1: \"%2\""}.arg(tr("Comment"), comment()); return text; } //============================================================== // Функция получения имени свойства для графического // интерфейса по его системному имени //============================================================== QString StructNode::getUiPropertyName(const QString &systemName) { Q_UNUSED(systemName) return QString{}; } //============================================================== // Функция перевода //============================================================== void StructNode::retranslate() { updateStateInfo(); } //============================================================== // Получение размера данных //============================================================== size_t StructNode::dataSize() const { return 0; } //============================================================== // Получение байта данных //============================================================== quint8 StructNode::dataByte(size_t index) const { Q_UNUSED(index) return 0; } //============================================================== // Получение блока данных //============================================================== ByteList StructNode::dataBlock(size_t index, size_t count) const { Q_UNUSED(index) Q_UNUSED(count) return ByteList{}; } //============================================================== // Функция вызывается при изменении данных //============================================================== void StructNode::dataChanged() { } //============================================================== // Задание пути к файлу //============================================================== void StructNode::setFilePath(const QString &path) { if (filePath() != path) { } } //============================================================== // Сброс пути к файлу //============================================================== void StructNode::resetFilePath() { setFilePath(QString{}); } //============================================================== // Задание признака пропуска //============================================================== void StructNode::setBypass(bool bypass) { if (isBypass_ != bypass) { const bool oldBypass = isBypass_; isBypass_ = bypass; const PropValue value{"bypass", isBypass_}; emit sigChangedProp(value); if (!isUndo_) { Q_ASSERT(undoStack_ != nullptr); const auto undoCmd = new UndoChangeObjectPropValue{this, "bypass", isBypass_, oldBypass}; undoStack_->push(undoCmd); } dataChanged(); } } //============================================================== // Сброс признака пропуска //============================================================== void StructNode::resetBypass() { setBypass(false); } //============================================================== // Создание входного пина //============================================================== void StructNode::createInputPin() { inputPin_ = ShPtrInputPin::create(this, 0); } //============================================================== // Создание выходного пина //============================================================== void StructNode::createOutputPin() { outputPin_ = ShPtrOutputPin::create(this, 0); } //============================================================== // Вывод комментариев //============================================================== void StructNode::drawComments(QPainter *painter, ColorThemes theme) const { Q_ASSERT(painter != nullptr); Q_ASSERT(!isUnknown(theme)); if (isCommentsVisible()) { QString comments{}; comments += QString{" <<< %1: \"%2\"\n"}.arg(tr("Name"), name()); comments += QString{" %1: \"%2\"\n"}.arg(tr("File path"), filePath()); comments += QString{" %1: %2\n"}.arg(tr("Bypass"), boolToStrTr(isBypass())); comments += QString{" %1: \"%2\"\n"}.arg(tr("Comment"), comment()); #ifdef QT_DEBUG comments += " -\n"; comments += QString{" %1: %2\n"}.arg("Id").arg(id()); #endif // QT_DEBUG const int commentsLeft = right(); const int commentsTop = top() + (height() - charHeight()) / 2; const int commentsFlags = Qt::AlignLeft | Qt::AlignTop | Qt::TextDontClip; const QRect commentsRect{commentsLeft, commentsTop, 0, 0}; painter->setPen(Colors::nodeText(theme)); painter->drawText(commentsRect, commentsFlags, comments); } } //============================================================== // Обновление состояния узла //============================================================== void StructNode::updateStateInfo() { }