-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtoolbarpropswidget.cpp
More file actions
144 lines (125 loc) · 4.2 KB
/
toolbarpropswidget.cpp
File metadata and controls
144 lines (125 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
#include "toolbarpropswidget.h"
#include "mol3dview.h"
#include "elementselector.h"
#include "element.h"
#include <QHBoxLayout>
ToolbarPropsWidget::ToolbarPropsWidget(QWidget *parent, Mol3dView *v) : QWidget(parent), view(v)
{
auto l = new QHBoxLayout(this);
l->setContentsMargins(0,0,0,0);
l->setSpacing(4);
chargeOrderLabel = new QLabel("Charge:", this);
chargeOrderSpinBox = new QSpinBox(this);
l->addWidget(chargeOrderLabel);
l->addWidget(chargeOrderSpinBox);
selectorLabel = new QLabel("Element:", this);
selector = new ElementSelector(this);
l->addWidget(selectorLabel);
l->addWidget(selector);
setEnabled(false);
atomMode(0, "C");
connect(chargeOrderSpinBox, static_cast<void(QSpinBox::*)(int value)>(&QSpinBox::valueChanged), this, [this](int value) {
auto newStructure = view->getMolStruct();
auto selection = view->getSelection();
if (!selection.atoms.isEmpty())
{
bool modified = false;
for (auto const &a: selection.atoms)
{
if (newStructure.atoms[a].charge != value)
{
modified = true;
newStructure.atoms[a].charge = value;
}
}
if (modified)
{
view->addUndoEvent("Adjust charge");
view->showMolStruct(newStructure);
view->setSelection(selection);
}
}
else if (!selection.bonds.isEmpty())
{
bool modified = false;
for (auto const &b: selection.bonds)
{
if (newStructure.bonds[b].order != value)
{
modified = true;
newStructure.bonds[b].order = value;
}
}
if (modified)
{
view->addUndoEvent("Adjust bond order");
view->showMolStruct(newStructure);
view->setSelection(selection);
}
}
});
connect(selector, &ElementSelector::elementChanged, this, [this](QString abbr){
Element e = Element::fromAbbr(abbr);
if (e.isValid())
{
auto newStructure = view->getMolStruct();
auto selection = view->getSelection();
bool modified = false;
for (auto const &a: selection.atoms)
{
if (newStructure.atoms[a].element != e.abbr)
{
modified = true;
newStructure.atoms[a].element = e.abbr;
}
}
if (modified)
{
view->addUndoEvent("Change element");
view->showMolStruct(newStructure);
view->setSelection(selection);
}
}
});
connect(view, &Mol3dView::selectionChanged, this, [this](Mol3dView::Selection selection) {
// Don't modifying the atom when we update the display values
const QSignalBlocker blockerA(chargeOrderSpinBox);
const QSignalBlocker blockerB(selector);
if (!selection.atoms.isEmpty())
{
setEnabled(true);
int id = selection.atoms.first();
auto const &atom = view->getMolStruct().atoms.at(id);
atomMode(atom.charge, atom.element);
}
else if (!selection.bonds.isEmpty())
{
setEnabled(true);
int id = selection.bonds.first();
auto const &bond = view->getMolStruct().bonds.at(id);
bondMode(bond.order);
}
else
{
setEnabled(false);
atomMode(0, "C");
}
});
}
void ToolbarPropsWidget::atomMode(int charge, QString element)
{
chargeOrderLabel->setText("Charge:");
chargeOrderSpinBox->setRange(-15,15);
chargeOrderSpinBox->setValue(charge);
selectorLabel->setVisible(true);
selector->setSelectedElement(element);
selector->setVisible(true);
}
void ToolbarPropsWidget::bondMode(int order)
{
chargeOrderSpinBox->setRange(1,3);
chargeOrderSpinBox->setValue(order);
chargeOrderLabel->setText("Bond Order:");
selectorLabel->setVisible(false);
selector->setVisible(false);
}