123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313 |
- #include "WindowAppBlockPortOld.h"
- #include "WindowAppItemInterface.h"
- #include "WindowAppPouManager.h"
- extern WindowAppPouManager pouManager;
- WindowAppBlockPortOld::WindowAppBlockPortOld(const TOOL_EX* pTool, QGraphicsItem* parent)
- : QGraphicsTextItem(parent)
- {
- setFlag(QGraphicsItem::ItemIsMovable);
- setFlag(QGraphicsItem::ItemIsSelectable);
- setFlag(QGraphicsItem::ItemSendsGeometryChanges);
- toolInfo = pTool;
- editAction = new QAction(tr("&Edit Value"), this);
- editAction->setStatusTip(tr("Edit value"));
- connect(editAction, &QAction::triggered, this, &WindowAppBlockPortOld::onMenuEdit);
- setFont(FONT_PBD);
- setTextInteractionFlags(Qt::TextEditorInteraction);
- setDefaultTextColor(COLOR_TEXT);
- UpdateRect();
- }
- /////////////////////////////////////////////////////////
- // 返回功能块图形的总体矩形区域
- QRectF WindowAppBlockPortOld::boundingRect() const
- {
- return blockBoundingRect;
- }
- ///////////////////////////////////////////////////
- // 根据用户的输入实时更新矩形区域的尺寸
- void WindowAppBlockPortOld::UpdateRect()
- {
- // 计算高度
- int blockHeight = PBD_BASIC_HEIGHT;
- // 计算宽度
- int blocWidth = PBD_BASIC_WIDTH;
- // TODO : 根据工具名字字符的宽度计算实际需要的宽度
- // 主体矩形区域
- blockRect.setRect(
- 0,
- 0,
- blocWidth,
- blockHeight
- );
- // 序号矩形区域
- blockIndexRect.setRect(
- blockRect.right() - TBD_INDEX_WIDTH,
- blockRect.top() - TBD_INDEX_HEIGHT / 2,
- TBD_INDEX_WIDTH,
- TBD_INDEX_HEIGHT
- );
- //// 总体矩形边界(双接口)
- //blockBoundingRect.setRect(
- // blockRect.left() - TBD_INF_LINE,
- // blockRect.top() - TBD_INDEX_HEIGHT / 2,
- // blockRect.width() + TBD_INF_LINE + TBD_INF_LINE,
- // blockRect.height() + TBD_INDEX_HEIGHT + TBD_SHADOW_COUNT * PEN_LINE_WIDTH
- //);
- //// 总体矩形边界(单接口)
- //blockBoundingRect.setRect(
- // blockRect.left(),
- // blockRect.top() - TBD_INDEX_HEIGHT / 2,
- // blockRect.width() + TBD_INF_LINE,
- // blockRect.height() + TBD_INDEX_HEIGHT + TBD_SHADOW_COUNT * PEN_LINE_WIDTH
- //);
- // 总体矩形边界(未计算Interface的范围)
- blockBoundingRect.setRect(
- blockRect.left(),
- blockRect.top() - TBD_INDEX_HEIGHT / 2,
- blockRect.width() + TBD_SHADOW_COUNT * PEN_LINE_WIDTH,
- blockRect.height() + TBD_INDEX_HEIGHT / 2 + TBD_SHADOW_COUNT * PEN_LINE_WIDTH
- );
- }
- void WindowAppBlockPortOld::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
- {
- //if (option->state & QStyle::State_Selected)
- //{
- // isSelected = true;
- //}
- //else
- //{
- // isSelected = false;
- //}
- bSel = isSelected();
- Q_UNUSED(widget);
- painter->save();
- //// 每次绘制之前都更新一下矩形区域
- //UpdateRect();
- // 绘制外框
- DrawBlock(painter);
- // 绘制阴影
- DrawBlockShadow(painter);
- // 绘制序号
- DrawIndex(painter);
- //// 绘制接口
- //DrawInterface(painter);
- painter->restore();
- QGraphicsTextItem::paint(painter, option, widget);
- }
- ///////////////////////////////////////////////////////
- // 显示右键菜单
- void WindowAppBlockPortOld::contextMenuEvent(QGraphicsSceneContextMenuEvent* event)
- {
- scene()->clearSelection();
- setSelected(true);
- //blockMenu->exec(event->screenPos());
- }
- /// <summary>
- /// 获得焦点时
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockPortOld::focusInEvent(QFocusEvent* event)
- {
- if (event->reason() != Qt::PopupFocusReason)
- {
- // 保存原始文本
- // 注意右键菜单再次进入焦点时不保存原始文本
- m_strInput = toPlainText();
- }
- QGraphicsTextItem::focusInEvent(event);
- }
- /// <summary>
- /// 焦点移除时
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockPortOld::focusOutEvent(QFocusEvent* event)
- {
- // 右键点击其他地方失去焦点,定义为取消操作
- if (event->reason() == Qt::MouseFocusReason && QApplication::mouseButtons() == Qt::RightButton)
- {
- // 恢复原始文本
- setPlainText(m_strInput);
- // 恢复不能编辑状态
- setTextInteractionFlags(Qt::NoTextInteraction);
- }
- //右键弹出菜单时不做处理
- else if (event->reason() == Qt::PopupFocusReason)
- {
- }
- // 其他情况,例如键盘输入回车等,表示编辑成功,发送信号给父对象
- else
- {
- setTextInteractionFlags(Qt::NoTextInteraction);
- // TODO:本信号暂未用到
- emit inputOverSignal(toPlainText());
- }
- QGraphicsTextItem::focusOutEvent(event);
- }
- /// <summary>
- /// 鼠标双击时进入可编辑状态并打开焦点
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockPortOld::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event)
- {
- if (event->button() == Qt::LeftButton)
- {
- setTextInteractionFlags(Qt::TextEditorInteraction);
- setFocus();
- QGraphicsTextItem::mouseDoubleClickEvent(event);
- }
- }
- /// <summary>
- /// 鼠标单击时
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockPortOld::mousePressEvent(QGraphicsSceneMouseEvent* event)
- {
- // 左键点击是可编辑状态的话响应单击事件
- if (event->button() == Qt::LeftButton)
- {
- // 是不可编辑状态的话,也就是未双击进入编辑状态时不响应,一遍产生双击事件
- if (textInteractionFlags() != Qt::NoTextInteraction)
- {
- QGraphicsTextItem::mousePressEvent(event);
- }
- //return;
- }
- QGraphicsTextItem::mousePressEvent(event);
- }
- /// <summary>
- /// 键盘按下时
- /// </summary>
- /// <param name="event"></param>
- void WindowAppBlockPortOld::keyPressEvent(QKeyEvent* event)
- {
- // 点击回车失去焦点,编辑完成,后续给FocusOutEvent处理
- if (event->key() == Qt::Key_Return || event->key() == Qt::Key_Enter)
- {
- clearFocus();
- return;
- }
- QGraphicsTextItem::keyPressEvent(event);
- }
- /// <summary>
- /// 添加接口
- /// </summary>
- void WindowAppBlockPortOld::addItemInterfaces()
- {
- // 为本Block添加新的ItemInterface
- for (TOOL_INTERFACE_EX* pInf : qAsConst(toolInfo->Interfaces))
- {
- WindowAppItemInterface* pNewItemInf = new WindowAppItemInterface(pInf, this);
- //// 输入接口(Port类型基本没有输入接口,所以此处应该不会执行)
- //if (pInf->infDirection == INF_DIRECTION::INF_IN)
- //{
- // pNewItemInf->bInfOut = false;
- //}
- pouManager.AddRunningInterface(pNewItemInf, pInf);
- // 保存接口Item信息
- itemInterfaces.append(pNewItemInf);
- // 界面中添加此Interface(设置为从属关系之后,都不需要手工添加此Item了,真是方便啊)
- // scene()->addItem(pNewItemInf);
- }
- // 更新Interface的位置(注意此处坐标系需要转换一下)
- QPointF pt = mapToScene(0, 0);
- QRectF rcBlock = blockRect;
- rcBlock.translate(pt);
- __super::updateAllInterfacesPostion(rcBlock);
- }
- /// <summary>
- /// 功能块移动时,通知对应的Interface同步移动
- /// </summary>
- /// <param name="change"></param>
- /// <param name="value"></param>
- /// <returns></returns>
- QVariant WindowAppBlockPortOld::itemChange(GraphicsItemChange change, const QVariant& value)
- {
- if (change == QGraphicsItem::ItemSelectedHasChanged)
- {
- emit selectedChange(this);
- }
- else if (change == QGraphicsItem::ItemPositionChange)
- {
- // 更新Interface的位置(此处Qt自动处理了,不需要额外处理)
- // __super::updateAllInterfacesPostion(blockRect, true);
- emit blockMoveSignal(this);
- }
- else if (change == QGraphicsItem::ItemSelectedChange)
- {
- // 如果选中状态变更的话,就重绘所有的Interface
- __super::redrawAllInterface();
- }
- return value;
- }
- ///////////////////////////////////////////////////////////////////
- // 菜单 - Edit
- void WindowAppBlockPortOld::onMenuEdit()
- {
- QMessageBox::information(nullptr, "Vision Plus", "onMenuEdit");
- //// 获取当前选中的Block
- //QGraphicsItem* activeBlock = this->selectedItems().first();
- //pouManager.ToolExecuteSub(activeBlock);
- }
|