/************************************************************************ ** ** @file vtoolsinglepoint.cpp ** @author Roman Telezhynskyi ** @date November 15, 2013 ** ** @brief ** @copyright ** This source code is part of the Valentina project, a pattern making ** program, whose allow create and modeling patterns of clothing. ** Copyright (C) 2013-2015 Valentina project ** All Rights Reserved. ** ** Valentina 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 3 of the License, or ** (at your option) any later version. ** ** Valentina 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 Valentina. If not, see . ** *************************************************************************/ #include "vtoolsinglepoint.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "../../../../undocommands/label/movelabel.h" #include "../../../../undocommands/label/showlabel.h" #include "../ifc/exception/vexception.h" #include "../ifc/exception/vexceptionbadid.h" #include "../ifc/ifcdef.h" #include "../ifc/xml/vabstractpattern.h" #include "../vmisc/diagnostic.h" #include "../vgeometry/vgobject.h" #include "../vgeometry/vpointf.h" #include "../vmisc/vabstractapplication.h" #include "../vpatterndb/vcontainer.h" #include "../vwidgets/vgraphicssimpletextitem.h" #include "../vwidgets/scalesceneitems.h" #include "../../../vabstracttool.h" #include "../../vdrawtool.h" #include "../vabstractpoint.h" QT_WARNING_PUSH QT_WARNING_DISABLE_CLANG("-Wmissing-prototypes") QT_WARNING_DISABLE_INTEL(1418) Q_LOGGING_CATEGORY(vToolSinglePoint, "v.toolSinglePoint") QT_WARNING_POP //--------------------------------------------------------------------------------------------------------------------- /** * @brief VToolSinglePoint constructor. * @param doc dom document container. * @param data container with variables. * @param id object id in container. * @param parent parent object. */ VToolSinglePoint::VToolSinglePoint(VAbstractPattern *doc, VContainer *data, quint32 id, const QString ¬es, QGraphicsItem *parent) : VAbstractPoint(doc, data, id, notes), VScenePoint(parent) { connect(m_namePoint, &VGraphicsSimpleTextItem::ShowContextMenu, this, &VToolSinglePoint::contextMenuEvent); connect(m_namePoint, &VGraphicsSimpleTextItem::DeleteTool, this, &VToolSinglePoint::DeleteFromLabel); connect(m_namePoint, &VGraphicsSimpleTextItem::PointChoosed, this, &VToolSinglePoint::PointChoosed); connect(m_namePoint, &VGraphicsSimpleTextItem::PointSelected, this, &VToolSinglePoint::PointSelected); connect(m_namePoint, &VGraphicsSimpleTextItem::NameChangePosition, this, &VToolSinglePoint::NameChangePosition); RefreshPointGeometry(*VAbstractTool::data.GeometricObject(id)); } //--------------------------------------------------------------------------------------------------------------------- QString VToolSinglePoint::name() const { return ObjectName(m_id); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::setName(const QString &name) { SetPointName(m_id, name); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::SetEnabled(bool enabled) { setEnabled(enabled); m_lineName->setEnabled(enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::GroupVisibility(quint32 object, bool visible) { Q_UNUSED(object) setVisible(visible); } //--------------------------------------------------------------------------------------------------------------------- bool VToolSinglePoint::IsLabelVisible(quint32 id) const { if (m_id == id) { const QSharedPointer point = VAbstractTool::data.GeometricObject(id); return point->IsShowLabel(); } else { return false; } } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::SetLabelVisible(quint32 id, bool visible) { if (m_id == id) { const QSharedPointer point = VAbstractTool::data.GeometricObject(id); point->SetShowLabel(visible); RefreshPointGeometry(*point); if (QGraphicsScene *sc = scene()) { VMainGraphicsView::NewSceneRect(sc, qApp->getSceneView(), this); } } } //--------------------------------------------------------------------------------------------------------------------- /** * @brief NameChangePosition handle change posion point label. * @param pos new position. */ void VToolSinglePoint::NameChangePosition(const QPointF &pos) { UpdateNamePosition(m_id, pos - this->pos()); } //--------------------------------------------------------------------------------------------------------------------- /** * @brief UpdateNamePosition save new position label to the pattern file. */ void VToolSinglePoint::UpdateNamePosition(quint32 id, const QPointF &pos) { if (id == m_id) { qApp->getUndoStack()->push(new MoveLabel(doc, pos, id)); } } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::mousePressEvent(QGraphicsSceneMouseEvent *event) { // Special for not selectable item first need to call standard mousePressEvent then accept event VScenePoint::mousePressEvent(event); // Somehow clicking on notselectable object do not clean previous selections. if (not (flags() & ItemIsSelectable) && scene()) { scene()->clearSelection(); } if (selectionType == SelectionType::ByMouseRelease) { event->accept();// Special for not selectable item first need to call standard mousePressEvent then accept event } else { if (event->button() == Qt::LeftButton && event->type() != QEvent::GraphicsSceneMouseDoubleClick) { PointChoosed(); event->accept(); } } } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::Disable(bool disable, const QString &namePP) { const bool enabled = !CorrectDisable(disable, namePP); SetEnabled(enabled); m_namePoint->setEnabled(enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::EnableToolMove(bool move) { m_namePoint->setFlag(QGraphicsItem::ItemIsMovable, move); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::PointChoosed() { emit ChoosedTool(m_id, SceneObject::Point); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::PointSelected(bool selected) { m_selectedFromChild = true; setSelected(selected); m_selectedFromChild = false; } //--------------------------------------------------------------------------------------------------------------------- /** * @brief FullUpdateFromFile update tool data form file. */ void VToolSinglePoint::FullUpdateFromFile() { ReadAttributes(); RefreshPointGeometry(*VAbstractTool::data.GeometricObject(m_id)); SetVisualization(); } //--------------------------------------------------------------------------------------------------------------------- /** * @brief mouseReleaseEvent handle mouse release events. * @param event mouse release event. */ void VToolSinglePoint::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) { if (selectionType == SelectionType::ByMouseRelease) { if (IsSelectedByReleaseEvent(this, event)) { PointChoosed(); } } VScenePoint::mouseReleaseEvent(event); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { setToolTip(MakeToolTip()); VScenePoint::hoverEnterEvent(event); } //--------------------------------------------------------------------------------------------------------------------- /** * @brief itemChange hadle item change. * @param change change. * @param value value. * @return value. */ QVariant VToolSinglePoint::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) { if (change == QGraphicsItem::ItemSelectedHasChanged) { if (not m_selectedFromChild) { m_namePoint->blockSignals(true); m_namePoint->setSelected(value.toBool()); m_namePoint->blockSignals(false); } emit ChangedToolSelection(value.toBool(), m_id, m_id); } return VScenePoint::itemChange(change, value); } //--------------------------------------------------------------------------------------------------------------------- /** * @brief keyReleaseEvent handle key release events. * @param event key release event. */ void VToolSinglePoint::keyReleaseEvent(QKeyEvent *event) { switch (event->key()) { case Qt::Key_Delete: try { DeleteToolWithConfirm(); } catch(const VExceptionToolWasDeleted &e) { Q_UNUSED(e) return;//Leave this method immediately!!! } break; default: break; } VScenePoint::keyReleaseEvent ( event ); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::contextMenuEvent(QGraphicsSceneContextMenuEvent *event) { ShowContextMenu(event, m_id); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::SaveOptions(QDomElement &tag, QSharedPointer &obj) { VDrawTool::SaveOptions(tag, obj); QSharedPointer point = qSharedPointerDynamicCast(obj); SCASSERT(point.isNull() == false) doc->SetAttribute(tag, AttrName, point->name()); doc->SetAttribute(tag, AttrMx, qApp->fromPixel(point->mx())); doc->SetAttribute(tag, AttrMy, qApp->fromPixel(point->my())); doc->SetAttribute(tag, AttrShowLabel, point->IsShowLabel()); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::ChangeLabelVisibility(quint32 id, bool visible) { if (id == m_id) { qApp->getUndoStack()->push(new ShowLabel(doc, id, visible)); } } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::ChangeLabelPosition(quint32 id, const QPointF &pos) { if (id == m_id) { QSharedPointer point = VAbstractTool::data.GeometricObject(id); point->setMx(pos.x()); point->setMy(pos.y()); m_namePoint->SetRealPos(pos); RefreshLine(); if (QGraphicsScene *sc = scene()) { VMainGraphicsView::NewSceneRect(sc, qApp->getSceneView(), this); } } } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::AllowHover(bool enabled) { setAcceptHoverEvents(enabled); AllowLabelHover(enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::AllowSelecting(bool enabled) { setFlag(QGraphicsItem::ItemIsSelectable, enabled); AllowLabelSelecting(enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::AllowLabelHover(bool enabled) { m_namePoint->setAcceptHoverEvents(enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::AllowLabelSelecting(bool enabled) { m_namePoint->setFlag(QGraphicsItem::ItemIsSelectable, enabled); } //--------------------------------------------------------------------------------------------------------------------- void VToolSinglePoint::ToolSelectionType(const SelectionType &type) { VAbstractTool::ToolSelectionType(type); m_namePoint->LabelSelectionType(type); }