LibrePCB Developers Documentation
packageeditorstate_select.h
Go to the documentation of this file.
1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef LIBREPCB_EDITOR_PACKAGEEDITORSTATE_SELECT_H
21 #define LIBREPCB_EDITOR_PACKAGEEDITORSTATE_SELECT_H
22 
23 /*******************************************************************************
24  * Includes
25  ******************************************************************************/
26 #include "packageeditorstate.h"
27 
29 
30 #include <QtCore>
31 #include <QtWidgets>
32 
33 #include <memory>
34 #include <optional.hpp>
35 
36 /*******************************************************************************
37  * Namespace / Forward Declarations
38  ******************************************************************************/
39 namespace librepcb {
40 
41 class Angle;
42 class Polygon;
43 class Zone;
44 
45 namespace editor {
46 
47 class CmdDragSelectedFootprintItems;
48 class CmdPolygonEdit;
49 class CmdZoneEdit;
50 class FootprintClipboardData;
51 
52 /*******************************************************************************
53  * Class PackageEditorState_Select
54  ******************************************************************************/
55 
60  Q_OBJECT
61 
62  enum class SubState {
63  IDLE,
64  SELECTING,
65  MOVING,
66  PASTING,
69  };
70 
71 public:
72  // Constructors / Destructor
73  PackageEditorState_Select() = delete;
75  explicit PackageEditorState_Select(Context& context) noexcept;
76  ~PackageEditorState_Select() noexcept;
77 
78  // General Methods
79  bool exit() noexcept override;
80  QSet<EditorWidgetBase::Feature> getAvailableFeatures()
81  const noexcept override;
82 
83  // Event Handlers
85  QGraphicsSceneMouseEvent& e) noexcept override;
87  QGraphicsSceneMouseEvent& e) noexcept override;
89  QGraphicsSceneMouseEvent& e) noexcept override;
91  QGraphicsSceneMouseEvent& e) noexcept override;
93  QGraphicsSceneMouseEvent& e) noexcept override;
94  bool processSelectAll() noexcept override;
95  bool processCut() noexcept override;
96  bool processCopy() noexcept override;
97  bool processPaste() noexcept override;
98  bool processMove(Qt::ArrowType direction) noexcept override;
99  bool processRotate(const Angle& rotation) noexcept override;
100  bool processMirror(Qt::Orientation orientation) noexcept override;
101  bool processFlip(Qt::Orientation orientation) noexcept override;
102  bool processSnapToGrid() noexcept override;
103  bool processRemove() noexcept override;
104  bool processEditProperties() noexcept override;
105  bool processGenerateOutline() noexcept override;
106  bool processGenerateCourtyard() noexcept override;
107  bool processImportDxf() noexcept override;
108  bool processAbortCommand() noexcept override;
109 
110  // Operator Overloadings
112  delete;
113 
114 private: // Methods
115  bool openContextMenuAtPos(const Point& pos) noexcept;
116  bool openPropertiesDialogOfItem(std::shared_ptr<QGraphicsItem> item) noexcept;
117  bool openPropertiesDialogOfItemAtPos(const Point& pos) noexcept;
118  bool copySelectedItemsToClipboard() noexcept;
119  bool startPaste(std::unique_ptr<FootprintClipboardData> data,
120  const tl::optional<Point>& fixedPosition);
121  bool rotateSelectedItems(const Angle& angle) noexcept;
122  bool mirrorSelectedItems(Qt::Orientation orientation,
123  bool flipLayers) noexcept;
124  bool snapSelectedItemsToGrid() noexcept;
125  bool removeSelectedItems() noexcept;
126  bool generateOutline() noexcept;
127  bool generateCourtyard() noexcept;
128  void removePolygonVertices(std::shared_ptr<Polygon> polygon,
129  const QVector<int> vertices) noexcept;
130  void startAddingPolygonVertex(std::shared_ptr<Polygon> polygon, int vertex,
131  const Point& pos) noexcept;
132  void removeZoneVertices(std::shared_ptr<Zone> zone,
133  const QVector<int> vertices) noexcept;
134  void startAddingZoneVertex(std::shared_ptr<Zone> zone, int vertex,
135  const Point& pos) noexcept;
136  void setSelectionRect(const Point& p1, const Point& p2) noexcept;
137  void clearSelectionRect(bool updateItemsSelectionState) noexcept;
138  QList<std::shared_ptr<QGraphicsItem>> findItemsAtPosition(
139  const Point& pos) noexcept;
140  bool findPolygonVerticesAtPosition(const Point& pos) noexcept;
141  bool findZoneVerticesAtPosition(const Point& pos) noexcept;
142  void setState(SubState state) noexcept;
143 
144 private: // Types / Data
147  QScopedPointer<CmdDragSelectedFootprintItems> mCmdDragSelectedItems;
148 
150  std::shared_ptr<Polygon> mSelectedPolygon;
154  QScopedPointer<CmdPolygonEdit> mCmdPolygonEdit;
155 
157  std::shared_ptr<Zone> mSelectedZone;
159  QVector<int> mSelectedZoneVertices;
161  QScopedPointer<CmdZoneEdit> mCmdZoneEdit;
162 };
163 
164 /*******************************************************************************
165  * End of File
166  ******************************************************************************/
167 
168 } // namespace editor
169 } // namespace librepcb
170 
171 #endif
bool copySelectedItemsToClipboard() noexcept
Definition: packageeditorstate_select.cpp:968
Definition: packageeditorfsm.h:89
QList< std::shared_ptr< QGraphicsItem > > findItemsAtPosition(const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:1449
bool findZoneVerticesAtPosition(const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:1481
void setState(SubState state) noexcept
Definition: packageeditorstate_select.cpp:1501
PackageEditorState_Select & operator=(const PackageEditorState_Select &rhs)=delete
bool processRemove() noexcept override
Definition: packageeditorstate_select.cpp:552
bool startPaste(std::unique_ptr< FootprintClipboardData > data, const tl::optional< Point > &fixedPosition)
Definition: packageeditorstate_select.cpp:1022
QSet< EditorWidgetBase::Feature > getAvailableFeatures() const noexcept override
Definition: packageeditorstate_select.cpp:100
bool mirrorSelectedItems(Qt::Orientation orientation, bool flipLayers) noexcept
Definition: packageeditorstate_select.cpp:1082
SubState
Definition: packageeditorstate_select.h:62
Definition: occmodel.cpp:77
bool processCut() noexcept override
Definition: packageeditorstate_select.cpp:398
bool processMirror(Qt::Orientation orientation) noexcept override
Definition: packageeditorstate_select.cpp:511
bool processRotate(const Angle &rotation) noexcept override
Definition: packageeditorstate_select.cpp:498
bool rotateSelectedItems(const Angle &angle) noexcept
Definition: packageeditorstate_select.cpp:1065
QVector< int > mSelectedPolygonVertices
The polygon vertex indices selected for editing (empty if none)
Definition: packageeditorstate_select.h:152
bool processGenerateCourtyard() noexcept override
Definition: packageeditorstate_select.cpp:606
void removeZoneVertices(std::shared_ptr< Zone > zone, const QVector< int > vertices) noexcept
Definition: packageeditorstate_select.cpp:1391
The Angle class is used to represent an angle (for example 12.75 degrees)
Definition: angle.h:78
bool processCopy() noexcept override
Definition: packageeditorstate_select.cpp:413
void clearSelectionRect(bool updateItemsSelectionState) noexcept
Definition: packageeditorstate_select.cpp:1440
bool processFlip(Qt::Orientation orientation) noexcept override
Definition: packageeditorstate_select.cpp:525
bool processSelectAll() noexcept override
Definition: packageeditorstate_select.cpp:378
bool processPaste() noexcept override
Definition: packageeditorstate_select.cpp:424
bool processGraphicsSceneRightMouseButtonReleased(QGraphicsSceneMouseEvent &e) noexcept override
Definition: packageeditorstate_select.cpp:362
bool openContextMenuAtPos(const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:739
bool processGenerateOutline() noexcept override
Definition: packageeditorstate_select.cpp:595
QScopedPointer< CmdPolygonEdit > mCmdPolygonEdit
The polygon edit command (nullptr if not editing)
Definition: packageeditorstate_select.h:154
bool processAbortCommand() noexcept override
Definition: packageeditorstate_select.cpp:700
The Point class is used to represent a point/coordinate/vector, for example (1.2mm; 5...
Definition: point.h:79
bool processImportDxf() noexcept override
Definition: packageeditorstate_select.cpp:617
bool openPropertiesDialogOfItemAtPos(const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:957
void startAddingPolygonVertex(std::shared_ptr< Polygon > polygon, int vertex, const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:1370
QScopedPointer< CmdDragSelectedFootprintItems > mCmdDragSelectedItems
Definition: packageeditorstate_select.h:147
bool removeSelectedItems() noexcept
Definition: packageeditorstate_select.cpp:1117
bool openPropertiesDialogOfItem(std::shared_ptr< QGraphicsItem > item) noexcept
Definition: packageeditorstate_select.cpp:900
void setSelectionRect(const Point &p1, const Point &p2) noexcept
Definition: packageeditorstate_select.cpp:1433
bool processGraphicsSceneLeftMouseButtonPressed(QGraphicsSceneMouseEvent &e) noexcept override
Definition: packageeditorstate_select.cpp:197
The PackageEditorState_Select class.
Definition: packageeditorstate_select.h:59
void startAddingZoneVertex(std::shared_ptr< Zone > zone, int vertex, const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:1412
bool processEditProperties() noexcept override
Definition: packageeditorstate_select.cpp:563
SubState mState
Definition: packageeditorstate_select.h:145
bool processMove(Qt::ArrowType direction) noexcept override
Definition: packageeditorstate_select.cpp:449
bool exit() noexcept override
Definition: packageeditorstate_select.cpp:90
bool processGraphicsSceneLeftMouseButtonReleased(QGraphicsSceneMouseEvent &e) noexcept override
Definition: packageeditorstate_select.cpp:295
bool processSnapToGrid() noexcept override
Definition: packageeditorstate_select.cpp:539
QScopedPointer< CmdZoneEdit > mCmdZoneEdit
The zone edit command (nullptr if not editing)
Definition: packageeditorstate_select.h:161
Point mStartPos
Definition: packageeditorstate_select.h:146
bool findPolygonVerticesAtPosition(const Point &pos) noexcept
Definition: packageeditorstate_select.cpp:1460
bool processGraphicsSceneLeftMouseButtonDoubleClicked(QGraphicsSceneMouseEvent &e) noexcept override
Definition: packageeditorstate_select.cpp:347
bool generateCourtyard() noexcept
Definition: packageeditorstate_select.cpp:1214
std::shared_ptr< Zone > mSelectedZone
The current zone selected for editing (nullptr if none)
Definition: packageeditorstate_select.h:157
~PackageEditorState_Select() noexcept
Definition: packageeditorstate_select.cpp:82
bool processGraphicsSceneMouseMoved(QGraphicsSceneMouseEvent &e) noexcept override
Definition: packageeditorstate_select.cpp:136
bool generateOutline() noexcept
Definition: packageeditorstate_select.cpp:1126
The PackageEditorState class is the base class of all package editor FSM states.
Definition: packageeditorstate.h:52
void removePolygonVertices(std::shared_ptr< Polygon > polygon, const QVector< int > vertices) noexcept
Definition: packageeditorstate_select.cpp:1344
QVector< int > mSelectedZoneVertices
The zone vertex indices selected for editing (empty if none)
Definition: packageeditorstate_select.h:159
bool snapSelectedItemsToGrid() noexcept
Definition: packageeditorstate_select.cpp:1105
std::shared_ptr< Polygon > mSelectedPolygon
The current polygon selected for editing (nullptr if none)
Definition: packageeditorstate_select.h:150