File indexing completed on 2024-05-05 03:51:46

0001 /*.
0002     SPDX-FileCopyrightText: 2007 Vladimir Kuznetsov <ks.vladimir@gmail.com>
0003 
0004     SPDX-License-Identifier: GPL-2.0-or-later
0005 */
0006 
0007 #ifndef STEP_JOINTGRAPHICS_H
0008 #define STEP_JOINTGRAPHICS_H
0009 
0010 #include "worldgraphics.h"
0011 #include "stepgraphicsitem.h"
0012 #include <stepcore/joints.h>
0013 
0014 class AnchorCreator: public AttachableItemCreator
0015 {
0016 public:
0017     AnchorCreator(const QString& className, WorldModel* worldModel, WorldScene* worldScene)
0018         : AttachableItemCreator(className, worldModel, worldScene, WorldScene::SnapRigidBody |
0019                         WorldScene::SnapParticle | WorldScene::SnapOnCenter |
0020                         WorldScene::SnapSetPosition | WorldScene::SnapSetAngle, nullptr) {}
0021 };
0022 
0023 class AnchorGraphicsItem : public StepGraphicsItem
0024 {
0025 public:
0026     AnchorGraphicsItem(StepCore::Item* item, WorldModel* worldModel);
0027 
0028     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0029     QPainterPath shape() const override;
0030 
0031     void viewScaleChanged() override;
0032     void worldDataChanged(bool dynamicOnly) override;
0033 
0034 protected:
0035     void mouseSetPos(const QPointF& pos, const QPointF&, MovingState movingState) override;
0036     StepCore::Anchor* anchor() const;
0037 };
0038 
0039 /////////////////////////////////////////////////////////////////////////////////////////
0040 
0041 class PinCreator: public AttachableItemCreator
0042 {
0043 public:
0044     PinCreator(const QString& className, WorldModel* worldModel, WorldScene* worldScene)
0045         : AttachableItemCreator(className, worldModel, worldScene, WorldScene::SnapRigidBody |
0046                             WorldScene::SnapSetPosition | WorldScene::SnapSetLocalPosition, nullptr) {}
0047 };
0048 
0049 class PinGraphicsItem: public StepGraphicsItem
0050 {
0051 public:
0052     PinGraphicsItem(StepCore::Item* item, WorldModel* worldModel);
0053 
0054     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0055     QPainterPath shape() const override;
0056 
0057     void viewScaleChanged() override;
0058     void worldDataChanged(bool dynamicOnly) override;
0059 
0060 protected:
0061     void mouseSetPos(const QPointF& pos, const QPointF&, MovingState movingState) override;
0062     StepCore::Pin* pin() const;
0063 };
0064 
0065 /////////////////////////////////////////////////////////////////////////////////////////
0066 
0067 class StickCreator: public AttachableItemCreator
0068 {
0069 public:
0070     StickCreator(const QString& className, WorldModel* worldModel, WorldScene* worldScene)
0071                 : AttachableItemCreator(className, worldModel, worldScene,
0072                         WorldScene::SnapRigidBody | WorldScene::SnapParticle |
0073                         WorldScene::SnapSetLocalPosition, nullptr, true) {}
0074 };
0075 
0076 class StickHandlerGraphicsItem: public StepGraphicsItem
0077 {
0078 public:
0079     StickHandlerGraphicsItem(StepCore::Item* item, WorldModel* worldModel,
0080                                 QGraphicsItem* parent, int num);
0081     void viewScaleChanged() override;
0082     void worldDataChanged(bool) override;
0083 
0084 protected:
0085     void mouseSetPos(const QPointF& pos, const QPointF& diff, MovingState movingState) override;
0086     int  _num;
0087 };
0088 
0089 class StickGraphicsItem: public StepGraphicsItem
0090 {
0091 public:
0092     StickGraphicsItem(StepCore::Item* item, WorldModel* worldModel);
0093 
0094     void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override;
0095     QPainterPath shape() const override;
0096 
0097     void viewScaleChanged() override;
0098     void stateChanged() override;
0099     void worldDataChanged(bool dynamicOnly) override;
0100 
0101 protected:
0102     void mouseSetPos(const QPointF& pos, const QPointF& diff, MovingState) override;
0103 
0104     StepCore::Stick* stick() const { return static_cast<StepCore::Stick*>(_item); }
0105 
0106     QPainterPath _painterPath;
0107     double       _rnorm;
0108     double       _radius;
0109 
0110     StickHandlerGraphicsItem* _handler1;
0111     StickHandlerGraphicsItem* _handler2;
0112 
0113     static const int RADIUS = 1;
0114 };
0115 
0116 #endif
0117