1 /******************************************************************************
2 
3   This source file is part of the Avogadro project.
4 
5   Copyright 2012-13 Kitware, Inc.
6 
7   This source code is released under the New BSD License, (the "License").
8 
9   Unless required by applicable law or agreed to in writing, software
10   distributed under the License is distributed on an "AS IS" BASIS,
11   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12   See the License for the specific language governing permissions and
13   limitations under the License.
14 
15 ******************************************************************************/
16 
17 #ifndef AVOGADRO_QTPLUGINS_EDITOR_H
18 #define AVOGADRO_QTPLUGINS_EDITOR_H
19 
20 #include <avogadro/qtgui/toolplugin.h>
21 
22 #include <avogadro/core/avogadrocore.h>
23 #include <avogadro/qtgui/molecule.h>
24 #include <avogadro/rendering/primitive.h>
25 
26 #include <QtCore/QPoint>
27 
28 namespace Avogadro {
29 namespace QtPlugins {
30 class EditorToolWidget;
31 
32 /**
33  * @class Editor editor.h <avogadro/qtplugins/editor/editor.h>
34  * @brief The Editor tool extends and modifies molecules.
35  * @author Allison Vacanti
36  */
37 class Editor : public QtGui::ToolPlugin
38 {
39   Q_OBJECT
40 public:
41   explicit Editor(QObject* parent_ = nullptr);
42   ~Editor() override;
43 
name()44   QString name() const override { return tr("Editor tool"); }
description()45   QString description() const override { return tr("Editor tool"); }
priority()46   unsigned char priority() const override { return 20; }
activateAction()47   QAction* activateAction() const override { return m_activateAction; }
48   QWidget* toolWidget() const override;
49 
setMolecule(QtGui::Molecule * mol)50   void setMolecule(QtGui::Molecule* mol) override
51   {
52     if (mol)
53       m_molecule = mol->undoMolecule();
54   }
55 
setEditMolecule(QtGui::RWMolecule * mol)56   void setEditMolecule(QtGui::RWMolecule* mol) override { m_molecule = mol; }
57 
setGLWidget(QtOpenGL::GLWidget * widget)58   void setGLWidget(QtOpenGL::GLWidget* widget) override { m_glWidget = widget; }
59 
setGLRenderer(Rendering::GLRenderer * renderer)60   void setGLRenderer(Rendering::GLRenderer* renderer) override
61   {
62     m_renderer = renderer;
63   }
64 
65   QUndoCommand* mousePressEvent(QMouseEvent* e) override;
66   QUndoCommand* mouseReleaseEvent(QMouseEvent* e) override;
67   QUndoCommand* mouseMoveEvent(QMouseEvent* e) override;
68   QUndoCommand* keyPressEvent(QKeyEvent* e) override;
69 
70   void draw(Rendering::GroupNode& node) override;
71 
72 private slots:
clearKeyPressBuffer()73   void clearKeyPressBuffer() { m_keyPressBuffer.clear(); }
74 
75 private:
76   /**
77    * Update the currently pressed buttons, accounting for modifier keys.
78    * @todo Account for modifier keys.
79    */
80   void updatePressedButtons(QMouseEvent*, bool release);
81 
82   /**
83    * Reset all state for this tool.
84    */
85   void reset();
86 
87   void emptyLeftClick(QMouseEvent* e);
88   void atomLeftClick(QMouseEvent* e);
89   void bondLeftClick(QMouseEvent* e);
90 
91   void atomRightClick(QMouseEvent* e);
92   void bondRightClick(QMouseEvent* e);
93 
94   void atomLeftDrag(QMouseEvent* e);
95 
96   QAction* m_activateAction;
97   QtGui::RWMolecule* m_molecule;
98   QtOpenGL::GLWidget* m_glWidget;
99   Rendering::GLRenderer* m_renderer;
100   EditorToolWidget* m_toolWidget;
101   Rendering::Identifier m_clickedObject;
102   Rendering::Identifier m_newObject;
103   Rendering::Identifier m_bondedAtom;
104   Qt::MouseButtons m_pressedButtons;
105   QPoint m_clickPosition;
106   unsigned char m_clickedAtomicNumber;
107   bool m_bondAdded;
108   bool m_fixValenceLater;
109   QString m_keyPressBuffer;
110 
111   Real m_bondDistance;
112 };
113 
114 } // namespace QtPlugins
115 } // namespace Avogadro
116 
117 #endif // AVOGADRO_QTPLUGINS_NAVIGATOR_H
118