/
pi_coder
/
ByteMachine
Обзор
Документация
Войти
/
pi_coder
/
ByteMachine
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/nodes/forms/form_node_panel_item.cpp
164 строки
5 KB
pimenov-and
Восстановление функционала старой версии
28 июл 2026, 20:04
28 июл 2026, 20:04
98412d0
Код
Авторство
О чём код?
//////////////////////////////////////////////////////////////// // ByteMachine // Виджет узла на панели узлов //////////////////////////////////////////////////////////////// #include "form_node_panel_item.h" #include "global_settings.h" #include "icons.h" #include "colors.h" #include <QPainter> #include <QDrag> #include <QMimeData> #include <QApplication> #include <QMouseEvent> //============================================================== // Конструктор с параметром //============================================================== FormNodePanelItem::FormNodePanelItem(NodeTypes nodeType, QWidget *parent) : QWidget{parent} { Q_ASSERT(!isUnknown(nodeType)); setFixedHeight(28); nodeType_ = nodeType; } //============================================================== // Деструктор //============================================================== FormNodePanelItem::~FormNodePanelItem() { } //============================================================== // Функция перерисовки //============================================================== void FormNodePanelItem::paintEvent(QPaintEvent *event) { QPainter painter{this}; if (underMouse() && isEnabled()) { const ColorThemes theme = globalSettings()->colorTheme(); painter.fillRect(rect(), Colors::nodePanelItemBack(theme)); } // Вывод иконки узла const ColorThemes theme = globalSettings()->colorTheme(); const QPixmap image = isEnabled() ? Icons::standardNode(theme) : Icons::standardNodeDisable(theme); painter.drawPixmap(0, height() / 2 - image.height() / 2 + 1, image); const QString nodeTypeStr = nodeTypeToStr(nodeType_); #ifdef Q_OS_WASM QFont font{"Segoe UI", 10}; painter.setFont(font); #endif // Q_OS_WASM painter.drawText(23, 0, width(), height(), Qt::AlignLeft | Qt::AlignVCenter, nodeTypeStr); QWidget::paintEvent(event); } //============================================================== // Функция вызывается при заходе мыши на виджет //============================================================== #if QT_VERSION < QT_VERSION_CHECK(6, 0, 0) void FormNodePanelItem::enterEvent(QEvent *event) { update(); QWidget::enterEvent(event); } #else void FormNodePanelItem::enterEvent(QEnterEvent *event) { update(); QWidget::enterEvent(event); } #endif // QT_VERSION < QT_VERSION_CHECK(6, 0, 0) //============================================================== // Функция вызывается при покидании виджета мышью //============================================================== void FormNodePanelItem::leaveEvent(QEvent *event) { update(); QWidget::leaveEvent(event); } //============================================================== // Функция вызывается при нажатии кнопки мыши //============================================================== void FormNodePanelItem::mousePressEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { beginDragPos_ = event->pos(); } QWidget::mousePressEvent(event); } //============================================================== // Функция вызывается при перемещении мыши //============================================================== void FormNodePanelItem::mouseMoveEvent(QMouseEvent *event) { if (event->buttons() & Qt::LeftButton) { const int distance = (event->pos() - beginDragPos_).manhattanLength(); if (distance > QApplication::startDragDistance()) { #ifndef Q_OS_WASM startDrag(); #else emit sigDragNode(nodeType_, mapToGlobal(event->pos())); #endif // Q_OS_WASM } } QWidget::mousePressEvent(event); } //============================================================== // Функция вызывается при отпускании кнопки мыши //============================================================== void FormNodePanelItem::mouseReleaseEvent(QMouseEvent *event) { if (event->button() == Qt::LeftButton) { if (rect().contains(event->pos())) { emit sigClicked(nodeType_); } #ifdef Q_OS_WASM else { emit sigDropNode(nodeType_, mapToGlobal(event->pos())); } #endif // Q_OS_WASM } QWidget::mousePressEvent(event); } //============================================================== // Начало перетаскивания //============================================================== void FormNodePanelItem::startDrag() { const auto mimeData = new QMimeData{}; const QString nodeTypeStr = nodeTypeToStr(nodeType_); mimeData->setText(nodeTypeStr); const auto drag = new QDrag{this}; drag->setMimeData(mimeData); drag->setPixmap(QPixmap(":/res_images/images/drag_node_light.png")); drag->exec(); }