/* Copyright 2006-2025 The QElectroTech Team This file is part of QElectroTech. QElectroTech is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. QElectroTech is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with QElectroTech. If not, see . */ #include "qetgraphicsitem.h" #include "../diagram.h" /** @brief QetGraphicsItem::QetGraphicsItem Default constructor @param parent : Parent Item */ QetGraphicsItem::QetGraphicsItem(QGraphicsItem *parent): QGraphicsObject(parent), is_movable_(true), m_first_move(true), snap_to_grid_(true) {} QetGraphicsItem::~QetGraphicsItem() {} /** @brief QetGraphicsItem::diagram *return the diagram of this item */ Diagram* QetGraphicsItem::diagram() const{ return(qobject_cast(scene())); } /** @brief QetGraphicsItem::setPos *set the position of the item to p @param p the new position of item */ void QetGraphicsItem::setPos(const QPointF &p) { QPointF pp = Diagram::snapToGrid(p); if (pp == pos() || !is_movable_) return; QGraphicsItem::setPos(pp); } /** @brief QetGraphicsItem::setPos *set the position of the item @param x new abscisse of item @param y new ordonne of item */ void QetGraphicsItem::setPos(qreal x, qreal y) { setPos(QPointF(x, y)); } bool QetGraphicsItem::isHovered() const { return m_hovered; } /** @brief QetGraphicsItem::state @return the current state of this item */ QET::GraphicsItemState QetGraphicsItem::state() const { return m_state; } /** @brief QetGraphicsItem::mousePressEvent *handle the mouse click @param event */ void QetGraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { if (event->button() == Qt::LeftButton) { m_first_move = true; if (event->modifiers() & Qt::ControlModifier) { setSelected(!isSelected()); } } QGraphicsItem::mousePressEvent(event); } /** @brief QetGraphicsItem::mouseDoubleClickEvent *handle the mouse double click @param event */ void QetGraphicsItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { editProperty(); event->accept(); } /** @brief QetGraphicsItem::mouseMoveEvent *handle mouse movement @param event */ void QetGraphicsItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if (isSelected() && event->buttons() & Qt::LeftButton) { //Item is moving if(diagram() && m_first_move) { //It's the first movement, we signal it to parent diagram diagram()->elementsMover().beginMovement(diagram(), this); } //we apply the mouse movement QPointF old_pos = pos(); if (m_first_move) { m_mouse_to_origin_movement = old_pos - event -> buttonDownScenePos(Qt::LeftButton); } QPointF expected_pos = event->scenePos() + m_mouse_to_origin_movement; setPos(expected_pos); // setPos() will snap the expected position to the grid //we calcul the real movement apply by setPos() QPointF effective_movement = pos() - old_pos; if (diagram()) { //we signal the real movement apply to diagram, //who he apply to other selected item diagram()->elementsMover().continueMovement(effective_movement); } event->accept(); } else { event->ignore(); } if (m_first_move) { m_first_move = false; } } /** @brief QetGraphicsItem::mouseReleaseEvent handle mouse release click @param event */ void QetGraphicsItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (diagram()) { diagram()->elementsMover().endMovement(); event->accept(); } } void QetGraphicsItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { m_hovered = true; QGraphicsObject::hoverEnterEvent(event); } void QetGraphicsItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { m_hovered = false; QGraphicsObject::hoverLeaveEvent(event); }