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