1 // XDrawChem
2 // Copyright (C) 2004-2005 Bryan Herger <bherger@users.sourceforge.net>
3 // Copyright (C) 2020 Yaman Qalieh <ybq987@gmail.com>
4
5 // This program is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9
10 // This program is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 // GNU General Public License for more details.
14
15 // You should have received a copy of the GNU General Public License
16 // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
18 #include <cerrno>
19 #include <cstdio>
20 #include <cstdlib>
21
22 #include <QBitmap>
23 #include <QtGlobal>
24
25 #include "application.h"
26 #include "chemdata.h"
27 #include "defs.h"
28 #include "prefs.h"
29 #include "render2d.h"
30
31 extern Preferences preferences;
32
33 // canned structure images
34 #include "aa_xpm.h"
35 #include "na_xpm.h"
36 #include "ring_xpm.h"
37 #include "sugar_xpm.h"
38
BuildNewRingMenu()39 QMenu *ApplicationWindow::BuildNewRingMenu() {
40 QMenu *ringSub = new QMenu(this);
41 qInfo() << "BuildNewRingMenu";
42 // make ring list
43 QMenu *genericSub = new QMenu(tr("Rings"), ringSub);
44 ring3Action = genericSub->addAction(QIcon(QPixmap(r_cyclopropane)), tr("[*] Cyclopropane"));
45 ring3Action->setData(QString(":/ring_cml/cyclopropane.cml"));
46
47 ring4Action = genericSub->addAction(QIcon(QPixmap(r_cyclobutane)), tr("[*] Cyclobutane"));
48 ring4Action->setData(QString(":/ring_cml/cyclobutane.cml"));
49
50 ring5Action = genericSub->addAction(QIcon(QPixmap(r_cyclopentane)), tr("[*] Cyclopentane"));
51 ring5Action->setData(QString(":/ring_cml/cyclopentane.cml"));
52
53 ringImidazoleAction = genericSub->addAction(QIcon(QPixmap(r_imidazole)), tr("Imidazole"));
54 ringImidazoleAction->setData(QString(":/ring_cml/imidazole.cml"));
55
56 ringCyclopentadieneAction =
57 genericSub->addAction(QIcon(QPixmap(r_cyclopentadiene)), tr("[*] Cyclopentadiene"));
58 ringCyclopentadieneAction->setData(QString(":/ring_cml/cyclopentadiene.cml"));
59
60 ring6Action = genericSub->addAction(QIcon(QPixmap(r_6flat)), tr("[*] Cyclohexane (flat)"));
61 ring6Action->setData(QString(":/ring_cml/cyclohexane.cml"));
62
63 ring6BoatAction = genericSub->addAction(QIcon(QPixmap(r_6boat)), tr("Cyclohexane (boat)"));
64 ring6BoatAction->setData(QString(":/ring_cml/6ring_boat.cml"));
65
66 ring6ChairAction = genericSub->addAction(QIcon(QPixmap(r_6chair)), tr("Cyclohexane (chair)"));
67 ring6ChairAction->setData(QString(":/ring_cml/6ring_chair.cml"));
68
69 ringBenzeneAction = genericSub->addAction(QIcon(QPixmap(r_benzene)), tr("[*] Benzene"));
70 ringBenzeneAction->setData(QString(":/ring_cml/benzene.cml"));
71
72 ringPyrimidineAction = genericSub->addAction(QIcon(QPixmap(r_pyrimidine)), tr("Pyrimidine"));
73 ringPyrimidineAction->setData(QString(":/ring_cml/pyrimidine.cml"));
74
75 ring7Action = genericSub->addAction(QIcon(QPixmap(ring7)), tr("[*] Cycloheptane"));
76 ring7Action->setData(QString(":/ring_cml/cycloheptane.cml"));
77
78 ring8Action = genericSub->addAction(QIcon(QPixmap(ring8)), tr("[*] Cyclooctane"));
79 ring8Action->setData(QString(":/ring_cml/cyclooctane.cml"));
80
81 ringIndoleAction = genericSub->addAction(QIcon(QPixmap(r_indole)), tr("Indole"));
82 ringIndoleAction->setData(QString(":/ring_cml/indole.cml"));
83
84 ringPurineAction = genericSub->addAction(QIcon(QPixmap(r_purine)), tr("Purine"));
85 ringPurineAction->setData(QString(":/ring_cml/purine.cml"));
86
87 ringNaphAction = genericSub->addAction(QIcon(QPixmap(naphthalene_xpm)), tr("Naphthalene"));
88 ringNaphAction->setData(QString(":/ring_cml/naphthalene.cml"));
89
90 ringBiphenylAction = genericSub->addAction(QIcon(QPixmap(biphenyl_xpm)), tr("Biphenyl"));
91 ringBiphenylAction->setData(QString(":/ring_cml/biphenyl.cml"));
92
93 ringAnthraAction = genericSub->addAction(QIcon(QPixmap(anthracene_xpm)), tr("Anthracene"));
94 ringAnthraAction->setData(QString(":/ring_cml/anthracene.cml"));
95
96 ringSteroidAction =
97 genericSub->addAction(QIcon(QPixmap(r_steroid)), tr("Steroid (fused ring template)"));
98 ringSteroidAction->setData(QString(":/ring_cml/steroid.cml"));
99
100 ringSub->addMenu(genericSub);
101
102 // make amino acid list
103 QAction *aaAction;
104 QMenu *aaSub = new QMenu(tr("Amino acids"), this);
105 aaAction = aaSub->addAction(QIcon(QPixmap(aa_ala)), tr("Alanine"));
106 aaAction->setData(":/ring_cml/alanine.cml");
107 aaAction = aaSub->addAction(QIcon(QPixmap(aa_arg)), tr("Arginine"));
108 aaAction->setData(":/ring_cml/arginine.cml");
109 aaAction = aaSub->addAction(QIcon(QPixmap(aa_asn)), tr("Asparagine"));
110 aaAction->setData(":/ring_cml/asparagine.cml");
111 aaAction = aaSub->addAction(QIcon(QPixmap(aa_asp)), tr("Aspartic acid"));
112 aaAction->setData(":/ring_cml/aspartic_acid.cml");
113 aaAction = aaSub->addAction(QIcon(QPixmap(aa_cys)), tr("Cysteine"));
114 aaAction->setData(":/ring_cml/cysteine.cml");
115 aaAction = aaSub->addAction(QIcon(QPixmap(aa_glu)), tr("Glutamic acid"));
116 aaAction->setData(":/ring_cml/glutamic_acid.cml");
117 aaAction = aaSub->addAction(QIcon(QPixmap(aa_gln)), tr("Glutamine"));
118 aaAction->setData(":/ring_cml/glutamine.cml");
119 aaAction = aaSub->addAction(QIcon(QPixmap(aa_gly)), tr("Glycine"));
120 aaAction->setData(":/ring_cml/glycine.cml");
121 aaAction = aaSub->addAction(QIcon(QPixmap(aa_his)), tr("Histidine"));
122 aaAction->setData(":/ring_cml/histidine.cml");
123 aaAction = aaSub->addAction(QIcon(QPixmap(aa_ile)), tr("Isoleucine"));
124 aaAction->setData(":/ring_cml/isoleucine.cml");
125 aaAction = aaSub->addAction(QIcon(QPixmap(aa_leu)), tr("Leucine"));
126 aaAction->setData(":/ring_cml/leucine.cml");
127 aaAction = aaSub->addAction(QIcon(QPixmap(aa_lys)), tr("Lysine"));
128 aaAction->setData(":/ring_cml/lysine.cml");
129 aaAction = aaSub->addAction(QIcon(QPixmap(aa_met)), tr("Methionine"));
130 aaAction->setData(":/ring_cml/methionine.cml");
131 aaAction = aaSub->addAction(QIcon(QPixmap(aa_nph)), tr("Nitrophenylalanine"));
132 aaAction->setData(":/ring_cml/nitrophenylalanine.cml");
133 aaAction = aaSub->addAction(QIcon(QPixmap(aa_phe)), tr("Phenylalanine"));
134 aaAction->setData(":/ring_cml/phenylalanine.cml");
135 aaAction = aaSub->addAction(QIcon(QPixmap(aa_pro)), tr("Proline"));
136 aaAction->setData(":/ring_cml/proline.cml");
137 aaAction = aaSub->addAction(QIcon(QPixmap(aa_ser)), tr("Serine"));
138 aaAction->setData(":/ring_cml/serine.cml");
139 aaAction = aaSub->addAction(QIcon(QPixmap(aa_statine)), tr("Statine"));
140 aaAction->setData(":/ring_cml/statine.cml");
141 aaAction = aaSub->addAction(QIcon(QPixmap(aa_thr)), tr("Threonine"));
142 aaAction->setData(":/ring_cml/threonine.cml");
143 aaAction = aaSub->addAction(QIcon(QPixmap(aa_trp)), tr("Tryptophan"));
144 aaAction->setData(":/ring_cml/tryptophan.cml");
145 aaAction = aaSub->addAction(QIcon(QPixmap(aa_tyr)), tr("Tyrosine"));
146 aaAction->setData(":/ring_cml/tyrosine.cml");
147 aaAction = aaSub->addAction(QIcon(QPixmap(aa_val)), tr("Valine"));
148 aaAction->setData(":/ring_cml/valine.cml");
149
150 ringSub->addMenu(aaSub);
151
152 // make nucleic acid list
153 QMenu *naSub = new QMenu(tr("Nucleic acids"), this);
154 naAdenineAction = naSub->addAction(QIcon(QPixmap(na_adenine)), tr("Adenine"));
155 naAdenineAction->setData(":/ring_cml/adenine.cml");
156 naCytosineAction = naSub->addAction(QIcon(QPixmap(na_cytosine)), tr("Cytosine"));
157 naCytosineAction->setData(":/ring_cml/cytosine.cml");
158 naGuanineAction = naSub->addAction(QIcon(QPixmap(na_guanine)), tr("Guanine"));
159 naGuanineAction->setData(":/ring_cml/guanine.cml");
160 naThymineAction = naSub->addAction(QIcon(QPixmap(na_thymine)), tr("Thymine"));
161 naThymineAction->setData(":/ring_cml/thymine.cml");
162 naUracilAction = naSub->addAction(QIcon(QPixmap(na_uracil)), tr("Uracil"));
163 naUracilAction->setData(":/ring_cml/uracil.cml");
164
165 ringSub->addMenu(naSub);
166
167 // make sugar list
168 QMenu *sugarSub = new QMenu(tr("Sugars"), this);
169 srAction = sugarSub->addAction(QIcon(QPixmap(s_ribose)), tr("Ribose"));
170 srAction->setData(":/ring_cml/ribose.cml");
171 sdAction = sugarSub->addAction(QIcon(QPixmap(s_deoxyribose)), tr("Deoxyribose"));
172 sdAction->setData(":/ring_cml/deoxyribose.cml");
173 sfAction = sugarSub->addAction(QIcon(QPixmap(s_d_fructose)), tr("D-fructose"));
174 sfAction->setData(":/ring_cml/d-fructose.cml");
175 sgAction = sugarSub->addAction(QIcon(QPixmap(s_d_glucose)), tr("D-glucose"));
176 sgAction->setData(":/ring_cml/d-glucose.cml");
177
178 ringSub->addMenu(sugarSub);
179
180 // make function group list
181 QMenu *fgSub = new QMenu(tr("Useful groups"), this);
182 fgSub->addAction(tr("[*] FMOC"))->setData(":/ring_cml/fmoc.cml");
183 fgSub->addAction(tr("[*] BOC"))->setData(":/ring_cml/boc.cml");
184 fgSub->addAction(tr("[*] DABCYL"))->setData(":/ring_cml/dabcyl.cml");
185 fgSub->addAction(tr("[*] DABSYL"))->setData(":/ring_cml/dabsyl.cml");
186 fgSub->addAction(tr("[*] DANSYL"))->setData(":/ring_cml/dansyl.cml");
187 fgSub->addAction(tr("[*] EDANS"))->setData(":/ring_cml/edans.cml");
188 fgSub->addAction(tr("[*] Biotin"))->setData(":/ring_cml/biotin.cml");
189
190 ringSub->addMenu(fgSub);
191
192 // make user-defined list
193 QMenu *customMenu = BuildCustomRingMenu();
194 ringSub->addMenu(customMenu);
195 customRingMenuAction = customMenu->menuAction();
196
197 return ringSub;
198 }
199
BuildCustomRingMenu()200 QMenu *ApplicationWindow::BuildCustomRingMenu() {
201 QMenu *userDefSub = new QMenu(tr("User-defined"), this);
202 QDir d(preferences.getCustomRingDir(), "*.png");
203
204 ringlist = d.entryList();
205 QAction *customAction;
206 for (int cc = 0; cc < ringlist.count(); cc++) {
207 QPixmap px1(QString(preferences.getCustomRingDir() + ringlist[cc]));
208 QBitmap mask1(px1.width(), px1.height());
209
210 mask1.fill(Qt::color1);
211 px1.setMask(mask1);
212 /*userDefSub->addAction( QPixmap( QString(RingDir + ringlist[cc]) ),
213 ringlist[cc],
214 this, FromRingMenu(int)), 0, cc ); */
215 QString name = ringlist[cc].left(ringlist[cc].length() - 4);
216 customAction = userDefSub->addAction(QIcon(px1), name);
217 customAction->setData(preferences.getCustomRingDir() + name + ".cml");
218 }
219 userDefSub->addAction(tr("Add new..."), this, SLOT(saveCustomRing()));
220
221 return userDefSub;
222 }
223
setRingAction(QAction * action)224 void ApplicationWindow::setRingAction(QAction *action) {
225 qInfo() << "setRingAction() invoked with data " << action->data();
226 if (action->data().isNull())
227 return;
228 drawRingButton->setDefaultAction(action);
229 m_renderer->setMode_DrawRing(action->data().toString(), action->iconText(), 1);
230 }
231