source: src/UIElements/QT4/QTDialog.cpp@ e4decc

Action_Thermostats Add_AtomRandomPerturbation Add_FitFragmentPartialChargesAction Add_RotateAroundBondAction Add_SelectAtomByNameAction Added_ParseSaveFragmentResults AddingActions_SaveParseParticleParameters Adding_Graph_to_ChangeBondActions Adding_MD_integration_tests Adding_ParticleName_to_Atom Adding_StructOpt_integration_tests AtomFragments Automaking_mpqc_open AutomationFragmentation_failures Candidate_v1.5.4 Candidate_v1.6.0 Candidate_v1.6.1 ChangeBugEmailaddress ChangingTestPorts ChemicalSpaceEvaluator CombiningParticlePotentialParsing Combining_Subpackages Debian_Package_split Debian_package_split_molecuildergui_only Disabling_MemDebug Docu_Python_wait EmpiricalPotential_contain_HomologyGraph EmpiricalPotential_contain_HomologyGraph_documentation Enable_parallel_make_install Enhance_userguide Enhanced_StructuralOptimization Enhanced_StructuralOptimization_continued Example_ManyWaysToTranslateAtom Exclude_Hydrogens_annealWithBondGraph FitPartialCharges_GlobalError Fix_BoundInBox_CenterInBox_MoleculeActions Fix_ChargeSampling_PBC Fix_ChronosMutex Fix_FitPartialCharges Fix_FitPotential_needs_atomicnumbers Fix_ForceAnnealing Fix_IndependentFragmentGrids Fix_ParseParticles Fix_ParseParticles_split_forward_backward_Actions Fix_PopActions Fix_QtFragmentList_sorted_selection Fix_Restrictedkeyset_FragmentMolecule Fix_StatusMsg Fix_StepWorldTime_single_argument Fix_Verbose_Codepatterns Fix_fitting_potentials Fixes ForceAnnealing_goodresults ForceAnnealing_oldresults ForceAnnealing_tocheck ForceAnnealing_with_BondGraph ForceAnnealing_with_BondGraph_continued ForceAnnealing_with_BondGraph_continued_betteresults ForceAnnealing_with_BondGraph_contraction-expansion FragmentAction_writes_AtomFragments FragmentMolecule_checks_bonddegrees GeometryObjects Gui_Fixes Gui_displays_atomic_force_velocity ImplicitCharges IndependentFragmentGrids IndependentFragmentGrids_IndividualZeroInstances IndependentFragmentGrids_IntegrationTest IndependentFragmentGrids_Sole_NN_Calculation JobMarket_RobustOnKillsSegFaults JobMarket_StableWorkerPool JobMarket_unresolvable_hostname_fix MoreRobust_FragmentAutomation ODR_violation_mpqc_open PartialCharges_OrthogonalSummation PdbParser_setsAtomName PythonUI_with_named_parameters QtGui_reactivate_TimeChanged_changes Recreated_GuiChecks Rewrite_FitPartialCharges RotateToPrincipalAxisSystem_UndoRedo SaturateAtoms_findBestMatching SaturateAtoms_singleDegree StoppableMakroAction Subpackage_CodePatterns Subpackage_JobMarket Subpackage_LinearAlgebra Subpackage_levmar Subpackage_mpqc_open Subpackage_vmg Switchable_LogView ThirdParty_MPQC_rebuilt_buildsystem TrajectoryDependenant_MaxOrder TremoloParser_IncreasedPrecision TremoloParser_MultipleTimesteps TremoloParser_setsAtomName Ubuntu_1604_changes stable
Last change on this file since e4decc was 9ee38b, checked in by Frederik Heber <heber@…>, 15 years ago

Extended macro framework.

Extensions:

  • all central definitions reside in .def files
    • This if file is necessary because we need the definitions at two places: hpp and cpp
    • And as we always use the same define names, we have to undefine them at the end of both (otherwise we get compiler warnings and are prone to dumb mistakes of forgotten defines seeming present)
  • the .hpp is just a very tiny header, that should be possible to batch- construct inside Makefile as well
  • .cpp includes some Action_...hpp files and implements the function

For later (i.e. when ActionRegistry becomes prototype copier)

  • instead of waiting for clone(), for now we simply call the prototype.
  • in the action command we must not yet prefix paramreferences with "params."

Changes:

  • Dialog::query<> is a template which is specialized for every present query...() function. We need it to automatize fillDialog()
  • all AnalysisAction's are now converted, i.e. framework is functional with parameters and queries (MolecularVolume had none).
  • Property mode set to 100644
File size: 24.0 KB
Line 
1/*
2 * Project: MoleCuilder
3 * Description: creates and alters molecular systems
4 * Copyright (C) 2010 University of Bonn. All rights reserved.
5 * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
6 */
7
8/*
9 * QTDialog.cpp
10 *
11 * Created on: Jan 18, 2010
12 * Author: crueger
13 */
14
15// include config.h
16#ifdef HAVE_CONFIG_H
17#include <config.h>
18#endif
19
20#include "UIElements/QT4/QTDialog.hpp"
21
22#include <boost/lexical_cast.hpp>
23
24#include <string>
25#include <sstream>
26#include <limits>
27
28#include <Qt/qboxlayout.h>
29#include <Qt/qlabel.h>
30#include <Qt/qspinbox.h>
31#include <QtGui/QDoubleSpinBox>
32#include <Qt/qlineedit.h>
33#include <Qt/qlistwidget.h>
34#include <Qt/qdialogbuttonbox.h>
35#include <Qt/qpushbutton.h>
36#include <Qt/qcombobox.h>
37
38#include <boost/lexical_cast.hpp>
39
40#include "Helpers/MemDebug.hpp"
41
42#include "World.hpp"
43#include "periodentafel.hpp"
44#include "atom.hpp"
45#include "element.hpp"
46#include "molecule.hpp"
47#include "Descriptors/AtomIdDescriptor.hpp"
48#include "Descriptors/MoleculeIdDescriptor.hpp"
49#include "LinearAlgebra/Matrix.hpp"
50#include "Box.hpp"
51
52
53using namespace std;
54
55QTDialog::QTDialog() :
56 QDialog(0)
57{
58 // creating and filling of the Dialog window
59 mainLayout = new QVBoxLayout();
60 inputLayout = new QVBoxLayout();
61 buttonLayout = new QVBoxLayout();
62 setLayout(mainLayout);
63 mainLayout->addLayout(inputLayout);
64 mainLayout->addLayout(buttonLayout);
65 buttons = new QDialogButtonBox(QDialogButtonBox::Ok| QDialogButtonBox::Cancel);
66 buttonLayout->addWidget(buttons);
67
68 // Disable the ok button until something was entered
69 buttons->button(QDialogButtonBox::Ok)->setEnabled(false);
70
71 // connect the buttons to their appropriate slots
72 connect(buttons, SIGNAL(accepted()), this, SLOT(accept()));
73 connect(buttons, SIGNAL(rejected()), this, SLOT(reject()));
74}
75
76QTDialog::~QTDialog()
77{
78}
79
80bool QTDialog::display(){
81 // Button state might have changed by some update that
82 // was done during query construction. To make sure
83 // the state is correct, we just call update one more time.
84 update();
85 if(exec()) {
86 setAll();
87 return true;
88 }
89 else {
90 return false;
91 }
92}
93
94void QTDialog::update(){
95 buttons->button(QDialogButtonBox::Ok)->setEnabled(checkAll());
96}
97
98/************************** Query Infrastructure ************************/
99
100void QTDialog::queryEmpty(const char*, std::string){
101 // TODO
102 ASSERT(false, "Not implemented yet");
103}
104
105void QTDialog::queryBoolean(const char*,string){
106 // TODO
107 ASSERT(false, "Not implemented yet");
108}
109
110void QTDialog::queryAtom(const char*, std::string){
111 // TODO
112 ASSERT(false, "Not implemented yet");
113}
114
115void QTDialog::queryAtoms(const char*, std::string){
116 // TODO
117 ASSERT(false, "Not implemented yet");
118}
119
120void QTDialog::queryBox(const char*, std::string){
121 // TODO
122 ASSERT(false, "Not implemented yet");
123}
124
125
126void QTDialog::queryInt(const char *title,string)
127{
128 registerQuery(new IntQTQuery(title,inputLayout,this));
129}
130
131void QTDialog::queryInts(const char *title,string)
132{
133 registerQuery(new IntsQTQuery(title,inputLayout,this));
134}
135
136void QTDialog::queryDouble(const char* title,string){
137 registerQuery(new DoubleQTQuery(title,inputLayout,this));
138}
139
140void QTDialog::queryDoubles(const char* title,string){
141 registerQuery(new DoublesQTQuery(title,inputLayout,this));
142}
143
144void QTDialog::queryString(const char* title,string)
145{
146 registerQuery(new StringQTQuery(title,inputLayout,this));
147}
148
149void QTDialog::queryStrings(const char* title,string)
150{
151 registerQuery(new StringsQTQuery(title,inputLayout,this));
152}
153
154void QTDialog::queryMolecule(const char *title,string)
155{
156 registerQuery(new MoleculeQTQuery(title,inputLayout,this));
157}
158
159void QTDialog::queryMolecules(const char *title,string)
160{
161 // TODO
162 ASSERT(false, "Not implemented yet");
163}
164
165void QTDialog::queryVector(const char* title, bool check,string) {
166 registerQuery(new VectorQTQuery(title,check,inputLayout,this));
167}
168
169void QTDialog::queryVectors(const char* title, bool check,string) {
170 // TODO
171 ASSERT(false, "Not implemented yet");
172}
173
174void QTDialog::queryElement(const char* title, std::string){
175 registerQuery(new ElementQTQuery(title,inputLayout,this));
176}
177
178void QTDialog::queryElements(const char* title, std::string){
179 // TODO
180 ASSERT(false, "Not implemented yet");
181}
182
183/************************** Query Objects *******************************/
184
185QTDialog::IntQTQuery::IntQTQuery(string _title,QBoxLayout *_parent,QTDialog *_dialog) :
186 Dialog::IntQuery(_title),
187 parent(_parent)
188{
189 thisLayout = new QHBoxLayout();
190 titleLabel = new QLabel(QString(getTitle().c_str()));
191 inputBox = new QSpinBox();
192 inputBox->setValue(0);
193 parent->addLayout(thisLayout);
194 thisLayout->addWidget(titleLabel);
195 thisLayout->addWidget(inputBox);
196
197 pipe = new IntQTQueryPipe(&tmp,_dialog);
198 pipe->update(inputBox->value());
199 connect(inputBox,SIGNAL(valueChanged(int)),pipe,SLOT(update(int)));
200}
201
202QTDialog::IntQTQuery::~IntQTQuery()
203{
204 delete pipe;
205}
206
207bool QTDialog::IntQTQuery::handle() {
208 return true;
209}
210
211
212QTDialog::IntsQTQuery::IntsQTQuery(string _title,QBoxLayout *_parent,QTDialog *_dialog) :
213 Dialog::IntsQuery(_title),
214 parent(_parent)
215{
216 QHBoxLayout * thisHLayout = new QHBoxLayout();
217 QVBoxLayout * thisV1Layout = new QVBoxLayout();
218 QVBoxLayout * thisV2Layout = new QVBoxLayout();
219
220 QLabel *titleLabel = new QLabel(QString(getTitle().c_str()));
221 QLabel *inputLabel = new QLabel("Enter to add");
222 QListWidget* inputList = new QListWidget();
223 inputList->setSelectionMode(QAbstractItemView::ExtendedSelection);
224 QLineEdit* inputBox = new QLineEdit();
225 inputLabel->setBuddy(inputBox);
226 titleLabel->setBuddy(inputList);
227 QPushButton* AddButton = new QPushButton("Add");
228 AddButton->setEnabled(false);
229 QPushButton* RemoveButton = new QPushButton("Remove");
230 RemoveButton->setEnabled(false);
231
232 thisV1Layout->addWidget(titleLabel);
233 thisV1Layout->addWidget(inputList);
234 thisV2Layout->addWidget(inputLabel);
235 thisV2Layout->addWidget(inputBox);
236 thisV2Layout->addWidget(AddButton);
237 thisV2Layout->addWidget(RemoveButton);
238 parent->addLayout(thisHLayout);
239 thisHLayout->addLayout(thisV1Layout);
240 thisHLayout->addLayout(thisV2Layout);
241
242 pipe = new QTQueryListPipe<int>(&tmp,_dialog,inputBox,inputList,AddButton,RemoveButton);
243 connect(inputBox,SIGNAL(textChanged(const QString&)),pipe,SLOT(IntegerEntered(const QString&)));
244 connect(inputList,SIGNAL(itemSelectionChanged()),pipe,SLOT(IntegerSelected()));
245 connect(AddButton,SIGNAL(Clicked()),pipe,SLOT(AddValue()));
246 connect(RemoveButton,SIGNAL(Clicked()),pipe,SLOT(RemoveRow()));
247}
248
249QTDialog::IntsQTQuery::~IntsQTQuery()
250{
251 delete pipe;
252}
253
254bool QTDialog::IntsQTQuery::handle() {
255 return true;
256}
257
258
259QTDialog::DoubleQTQuery::DoubleQTQuery(string title,QBoxLayout *_parent,QTDialog *_dialog) :
260 Dialog::DoubleQuery(title),
261 parent(_parent)
262{
263 thisLayout = new QHBoxLayout();
264 titleLabel = new QLabel(QString(getTitle().c_str()));
265 inputBox = new QDoubleSpinBox();
266 inputBox->setValue(0);
267 inputBox->setRange(-numeric_limits<double>::max(),numeric_limits<double>::max());
268 inputBox->setDecimals(3);
269 parent->addLayout(thisLayout);
270 thisLayout->addWidget(titleLabel);
271 thisLayout->addWidget(inputBox);
272
273 pipe = new DoubleQTQueryPipe(&tmp,_dialog);
274 pipe->update(inputBox->value());
275 connect(inputBox,SIGNAL(valueChanged(double)),pipe,SLOT(update(double)));
276}
277
278QTDialog::DoubleQTQuery::~DoubleQTQuery()
279{
280 delete pipe;
281}
282
283bool QTDialog::DoubleQTQuery::handle() {
284 return true;
285}
286
287
288QTDialog::DoublesQTQuery::DoublesQTQuery(string title,QBoxLayout *_parent,QTDialog *_dialog) :
289 Dialog::DoublesQuery(title),
290 parent(_parent)
291{
292 QHBoxLayout * thisHLayout = new QHBoxLayout();
293 QVBoxLayout * thisV1Layout = new QVBoxLayout();
294 QVBoxLayout * thisV2Layout = new QVBoxLayout();
295
296 QLabel *titleLabel = new QLabel(QString(getTitle().c_str()));
297 QLabel *inputLabel = new QLabel("Enter to add");
298 QListWidget* inputList = new QListWidget();
299 inputList->setSelectionMode(QAbstractItemView::ExtendedSelection);
300 QLineEdit* inputBox = new QLineEdit();
301 inputLabel->setBuddy(inputBox);
302 titleLabel->setBuddy(inputList);
303 QPushButton* AddButton = new QPushButton("Add");
304 AddButton->setEnabled(false);
305 QPushButton* RemoveButton = new QPushButton("Remove");
306 RemoveButton->setEnabled(false);
307
308 thisV1Layout->addWidget(titleLabel);
309 thisV1Layout->addWidget(inputList);
310 thisV2Layout->addWidget(inputLabel);
311 thisV2Layout->addWidget(inputBox);
312 thisV2Layout->addWidget(AddButton);
313 thisV2Layout->addWidget(RemoveButton);
314 parent->addLayout(thisHLayout);
315 thisHLayout->addLayout(thisV1Layout);
316 thisHLayout->addLayout(thisV2Layout);
317
318 pipe = new QTQueryListPipe<double>(&tmp,_dialog,inputBox,inputList,AddButton,RemoveButton);
319 connect(inputBox,SIGNAL(textChanged(const QString&)),pipe,SLOT(IntegerEntered(const QString&)));
320 connect(inputList,SIGNAL(itemSelectionChanged()),pipe,SLOT(IntegerSelected()));
321 connect(AddButton,SIGNAL(Clicked()),pipe,SLOT(AddValue()));
322 connect(RemoveButton,SIGNAL(Clicked()),pipe,SLOT(RemoveRow()));}
323
324QTDialog::DoublesQTQuery::~DoublesQTQuery()
325{
326 delete pipe;
327}
328
329bool QTDialog::DoublesQTQuery::handle() {
330 return true;
331}
332
333
334QTDialog::StringQTQuery::StringQTQuery(string _title,QBoxLayout *_parent,QTDialog *_dialog) :
335 Dialog::StringQuery(_title),
336 parent(_parent)
337{
338 thisLayout = new QHBoxLayout();
339 titleLabel = new QLabel(QString(getTitle().c_str()));
340 inputBox = new QLineEdit();
341 parent->addLayout(thisLayout);
342 thisLayout->addWidget(titleLabel);
343 thisLayout->addWidget(inputBox);
344
345 pipe = new StringQTQueryPipe(&tmp,_dialog);
346 pipe->update(inputBox->text());
347 connect(inputBox,SIGNAL(textChanged(const QString&)),pipe,SLOT(update(const QString&)));
348}
349
350QTDialog::StringQTQuery::~StringQTQuery()
351{
352 delete pipe;
353}
354
355// All values besides the empty std::string are valid
356bool QTDialog::StringQTQuery::handle()
357{
358 return tmp!="";
359}
360
361QTDialog::StringsQTQuery::StringsQTQuery(string _title,QBoxLayout *_parent,QTDialog *_dialog) :
362 Dialog::StringsQuery(_title),
363 parent(_parent)
364{
365 QHBoxLayout * thisHLayout = new QHBoxLayout();
366 QVBoxLayout * thisV1Layout = new QVBoxLayout();
367 QVBoxLayout * thisV2Layout = new QVBoxLayout();
368
369 QLabel *titleLabel = new QLabel(QString(getTitle().c_str()));
370 QLabel *inputLabel = new QLabel("Enter to add");
371 QListWidget* inputList = new QListWidget();
372 inputList->setSelectionMode(QAbstractItemView::ExtendedSelection);
373 QLineEdit* inputBox = new QLineEdit();
374 inputLabel->setBuddy(inputBox);
375 titleLabel->setBuddy(inputList);
376 QPushButton* AddButton = new QPushButton("Add");
377 AddButton->setEnabled(false);
378 QPushButton* RemoveButton = new QPushButton("Remove");
379 RemoveButton->setEnabled(false);
380
381 thisV1Layout->addWidget(titleLabel);
382 thisV1Layout->addWidget(inputList);
383 thisV2Layout->addWidget(inputLabel);
384 thisV2Layout->addWidget(inputBox);
385 thisV2Layout->addWidget(AddButton);
386 thisV2Layout->addWidget(RemoveButton);
387 parent->addLayout(thisHLayout);
388 thisHLayout->addLayout(thisV1Layout);
389 thisHLayout->addLayout(thisV2Layout);
390
391 pipe = new QTQueryListPipe<std::string>(&tmp,_dialog,inputBox,inputList,AddButton,RemoveButton);
392 connect(inputBox,SIGNAL(textChanged(const QString&)),pipe,SLOT(IntegerEntered(const QString&)));
393 connect(inputList,SIGNAL(itemSelectionChanged()),pipe,SLOT(IntegerSelected()));
394 connect(AddButton,SIGNAL(Clicked()),pipe,SLOT(AddValue()));
395 connect(RemoveButton,SIGNAL(Clicked()),pipe,SLOT(RemoveRow()));}
396
397QTDialog::StringsQTQuery::~StringsQTQuery()
398{
399 delete pipe;
400}
401
402// All values besides the empty std::string are valid
403bool QTDialog::StringsQTQuery::handle()
404{
405 // dissect by ","
406 std::string::iterator olditer = temp.begin();
407 for(string::iterator iter = temp.begin(); iter != temp.end(); ++iter) {
408 if (*iter == ' ') {
409 tmp.push_back(string(iter, olditer));
410 olditer = iter;
411 }
412 }
413 if (olditer != temp.begin()) // insert last part also
414 tmp.push_back(string(olditer, temp.end()));
415
416 return temp!="";
417}
418
419QTDialog::MoleculeQTQuery::MoleculeQTQuery(string _title, QBoxLayout *_parent,QTDialog *_dialog) :
420 Dialog::MoleculeQuery(_title),
421 parent(_parent)
422{
423 thisLayout = new QHBoxLayout();
424 titleLabel = new QLabel(QString(getTitle().c_str()));
425 inputBox = new QComboBox();
426 // add all molecules to the combo box
427 vector<molecule*> molecules = World::getInstance().getAllMolecules();
428 for(vector<molecule*>::iterator iter = molecules.begin();
429 iter != molecules.end();
430 ++iter) {
431 std::stringstream sstr;
432 sstr << (*iter)->IndexNr << "\t" << (*iter)->getName();
433 inputBox->addItem(QString(sstr.str().c_str()),QVariant((*iter)->IndexNr));
434 }
435 parent->addLayout(thisLayout);
436 thisLayout->addWidget(titleLabel);
437 thisLayout->addWidget(inputBox);
438
439 pipe = new MoleculeQTQueryPipe(&tmp,_dialog,inputBox);
440 pipe->update(inputBox->currentIndex());
441 connect(inputBox,SIGNAL(currentIndexChanged(int)),pipe,SLOT(update(int)));
442}
443
444QTDialog::MoleculeQTQuery::~MoleculeQTQuery()
445{
446 delete pipe;
447}
448
449// Handling is easy, since the GUI makes it impossible to select invalid values
450bool QTDialog::MoleculeQTQuery::handle()
451{
452 return true;
453}
454
455QTDialog::MoleculesQTQuery::MoleculesQTQuery(string _title, QBoxLayout *_parent,QTDialog *_dialog) :
456 Dialog::MoleculesQuery(_title),
457 parent(_parent)
458{
459 thisLayout = new QHBoxLayout();
460 titleLabel = new QLabel(QString(getTitle().c_str()));
461 inputBox = new QComboBox();
462 // add all molecules to the combo box
463 vector<molecule*> molecules = World::getInstance().getAllMolecules();
464 for(vector<molecule*>::iterator iter = molecules.begin();
465 iter != molecules.end();
466 ++iter) {
467 std::stringstream sstr;
468 sstr << (*iter)->IndexNr << "\t" << (*iter)->getName();
469 inputBox->addItem(QString(sstr.str().c_str()),QVariant((*iter)->IndexNr));
470 }
471 parent->addLayout(thisLayout);
472 thisLayout->addWidget(titleLabel);
473 thisLayout->addWidget(inputBox);
474
475 pipe = new MoleculesQTQueryPipe(&tmp,_dialog,inputBox);
476 pipe->update(inputBox->currentIndex());
477 connect(inputBox,SIGNAL(currentIndexChanged(int)),pipe,SLOT(update(int)));
478}
479
480QTDialog::MoleculesQTQuery::~MoleculesQTQuery()
481{
482 delete pipe;
483}
484
485// Handling is easy, since the GUI makes it impossible to select invalid values
486bool QTDialog::MoleculesQTQuery::handle()
487{
488 return true;
489}
490
491QTDialog::VectorQTQuery::VectorQTQuery(std::string title, bool _check,QBoxLayout *_parent,QTDialog *_dialog) :
492 Dialog::VectorQuery(title,_check),
493 parent(_parent)
494{
495 mainLayout= new QHBoxLayout();
496 titleLabel = new QLabel(QString(getTitle().c_str()));
497 mainLayout->addWidget(titleLabel);
498 subLayout = new QVBoxLayout();
499 mainLayout->addLayout(subLayout);
500 QComboBox* inputBox = new QComboBox();
501 coordLayout = new QHBoxLayout();
502 subLayout->addLayout(coordLayout);
503 coordLabel = new QLabel(QString("x,y,z"));
504 coordLayout->addWidget(coordLabel);
505 coordInput = new QDoubleSpinBox();
506// coordInput->setRange(0,M.at(i,i));
507 coordInput->setDecimals(3);
508 coordLayout->addWidget(coordInput);
509 pipe = new VectorQTQueryPipe(&(tmp),_dialog,inputBox);
510 //pipe->update(coordInput->value());
511 connect(coordInput,SIGNAL(valueChanged(double)),pipe,SLOT(update(double)));
512 parent->addLayout(mainLayout);
513}
514
515QTDialog::VectorQTQuery::~VectorQTQuery()
516{}
517
518bool QTDialog::VectorQTQuery::handle() {
519 return true;
520}
521
522
523QTDialog::VectorsQTQuery::VectorsQTQuery(std::string title, bool _check,QBoxLayout *_parent,QTDialog *_dialog) :
524 Dialog::VectorsQuery(title,_check),
525 parent(_parent)
526{
527 mainLayout= new QHBoxLayout();
528 titleLabel = new QLabel(QString(getTitle().c_str()));
529 mainLayout->addWidget(titleLabel);
530 subLayout = new QVBoxLayout();
531 mainLayout->addLayout(subLayout);
532 QComboBox* inputBox = new QComboBox();
533 coordLayout = new QHBoxLayout();
534 subLayout->addLayout(coordLayout);
535 coordLabel = new QLabel(QString("x,y,z"));
536 coordLayout->addWidget(coordLabel);
537 coordInput = new QDoubleSpinBox();
538// coordInput->setRange(0,M.at(i,i));
539 coordInput->setDecimals(3);
540 coordLayout->addWidget(coordInput);
541 pipe = new VectorsQTQueryPipe(&(tmp),_dialog,inputBox);
542 //pipe->update(coordInput->value());
543 connect(coordInput,SIGNAL(valueChanged(double)),pipe,SLOT(update(double)));
544 parent->addLayout(mainLayout);
545}
546
547QTDialog::VectorsQTQuery::~VectorsQTQuery()
548{}
549
550bool QTDialog::VectorsQTQuery::handle() {
551 return true;
552}
553
554
555QTDialog::ElementQTQuery::ElementQTQuery(std::string _title, QBoxLayout *_parent, QTDialog *_dialog) :
556 Dialog::ElementQuery(_title),
557 parent(_parent)
558{
559 periodentafel *periode = World::getInstance().getPeriode();
560 thisLayout = new QHBoxLayout();
561 titleLabel = new QLabel(QString(getTitle().c_str()));
562 inputBox = new QComboBox();
563 for(periodentafel::const_iterator iter = periode->begin();
564 iter!=periode->end();
565 ++iter)
566 {
567 std::stringstream sstr;
568 sstr << (*iter).first << "\t" << (*iter).second->getName();
569 inputBox->addItem(QString(sstr.str().c_str()),QVariant((*iter).first));
570 }
571 parent->addLayout(thisLayout);
572 thisLayout->addWidget(titleLabel);
573 thisLayout->addWidget(inputBox);
574
575 pipe = new ElementQTQueryPipe(&tmp,_dialog,inputBox);
576 pipe->update(inputBox->currentIndex());
577 connect(inputBox,SIGNAL(currentIndexChanged(int)),pipe,SLOT(update(int)));
578}
579
580QTDialog::ElementQTQuery::~ElementQTQuery()
581{
582 delete pipe;
583}
584
585bool QTDialog::ElementQTQuery::handle(){
586 return true;
587}
588
589
590QTDialog::ElementsQTQuery::ElementsQTQuery(std::string _title, QBoxLayout *_parent, QTDialog *_dialog) :
591 Dialog::ElementsQuery(_title),
592 parent(_parent)
593{
594 periodentafel *periode = World::getInstance().getPeriode();
595 thisLayout = new QHBoxLayout();
596 titleLabel = new QLabel(QString(getTitle().c_str()));
597 inputBox = new QComboBox();
598 for(periodentafel::const_iterator iter = periode->begin();
599 iter!=periode->end();
600 ++iter)
601 {
602 std::stringstream sstr;
603 sstr << (*iter).first << "\t" << (*iter).second->getName();
604 inputBox->addItem(QString(sstr.str().c_str()),QVariant((*iter).first));
605 }
606 parent->addLayout(thisLayout);
607 thisLayout->addWidget(titleLabel);
608 thisLayout->addWidget(inputBox);
609
610 pipe = new ElementsQTQueryPipe(&tmp,_dialog,inputBox);
611 pipe->update(inputBox->currentIndex());
612 connect(inputBox,SIGNAL(currentIndexChanged(int)),pipe,SLOT(update(int)));
613}
614
615QTDialog::ElementsQTQuery::~ElementsQTQuery()
616{
617 delete pipe;
618}
619
620bool QTDialog::ElementsQTQuery::handle(){
621 return true;
622}
623
624/*************************** Plumbing *******************************/
625
626
627template<typename T> QTQueryListPipe<T>::QTQueryListPipe(std::vector<T> *_content, QTDialog *_dialog, QLineEdit *_inputBox, QListWidget *_inputList, QPushButton *_AddButton, QPushButton *_RemoveButton) :
628 content(_content),
629 dialog(_dialog),
630 inputBox(_inputBox),
631 inputList(_inputList),
632 AddButton(_AddButton),
633 RemoveButton(_RemoveButton)
634{}
635
636template<typename T> QTQueryListPipe<T>::~QTQueryListPipe()
637{}
638
639template<typename T> void QTQueryListPipe<T>::IntegerEntered(const QString&)
640{
641 AddButton->setEnabled(true);
642}
643
644template<typename T> void QTQueryListPipe<T>::IntegerSelected()
645{
646 if (inputList->selectedItems().empty())
647 RemoveButton->setEnabled(false);
648 else
649 RemoveButton->setEnabled(true);
650}
651
652template<typename T> void QTQueryListPipe<T>::AddInteger() {
653 // type-check
654 std::string text = inputBox->text().toStdString();
655 int number = 0;
656 try {
657 number = boost::lexical_cast<int>(text);
658 } catch (boost::bad_lexical_cast&) {
659 return;
660 };
661 // add item to both
662 inputList->addItem(QString(number));
663 AddValue(number);
664}
665
666template<typename T> void QTQueryListPipe<T>::AddValue(T item) {
667 content->push_back(item);
668
669 dialog->update();
670}
671
672template<typename T> void QTQueryListPipe<T>::RemoveInteger() {
673 QList<QListWidgetItem *> items = inputList->selectedItems();
674 for (QList<QListWidgetItem *>::iterator iter = items.begin(); !items.empty(); iter = items.begin()) {
675 // obtain which position item has (by making it current item)
676 inputList->setCurrentItem(*iter);
677 // remove
678 QTQueryListPipe<T>::RemoteRow(inputList->currentRow()); // template parameters needs to be known, such that compiler knows which to call
679 inputList->removeItemWidget(*iter);
680 }
681}
682
683template<typename T> void QTQueryListPipe<T>::RemoveRow(int row) {
684 int counter = 0;
685 typename std::vector<T>::iterator iter = content->begin();
686 for (; iter != content->end(); ++iter)
687 if (counter++ == row)
688 break;
689 if (iter != content->end())
690 content->erase(iter);
691}
692
693
694StringQTQueryPipe::StringQTQueryPipe(string *_content, QTDialog *_dialog) :
695 content(_content),
696 dialog(_dialog)
697{}
698
699StringQTQueryPipe::~StringQTQueryPipe()
700{}
701
702void StringQTQueryPipe::update(const QString& newText) {
703 content->assign(newText.toStdString());
704 dialog->update();
705}
706
707IntQTQueryPipe::IntQTQueryPipe(int *_content, QTDialog *_dialog) :
708 content(_content),
709 dialog(_dialog)
710{}
711
712IntQTQueryPipe::~IntQTQueryPipe()
713{}
714
715void IntQTQueryPipe::update(int newInt) {
716 (*content) = newInt;
717 dialog->update();
718}
719
720DoubleQTQueryPipe::DoubleQTQueryPipe(double *_content, QTDialog *_dialog) :
721 content(_content),
722 dialog(_dialog)
723{}
724
725DoubleQTQueryPipe::~DoubleQTQueryPipe()
726{}
727
728void DoubleQTQueryPipe::update(double newDbl) {
729 (*content) = newDbl;
730 dialog->update();
731}
732
733VectorQTQueryPipe::VectorQTQueryPipe(Vector *_content, QTDialog *_dialog, QComboBox *_theBox) :
734 content(_content),
735 dialog(_dialog),
736 theBox(_theBox)
737{}
738
739VectorQTQueryPipe::~VectorQTQueryPipe()
740{}
741
742void VectorQTQueryPipe::update() {
743 dialog->update();
744}
745
746VectorsQTQueryPipe::VectorsQTQueryPipe(std::vector<Vector> *_content, QTDialog *_dialog, QComboBox *_theBox) :
747 content(_content),
748 dialog(_dialog),
749 theBox(_theBox)
750{}
751
752VectorsQTQueryPipe::~VectorsQTQueryPipe()
753{}
754
755void VectorsQTQueryPipe::update() {
756 dialog->update();
757}
758
759AtomQTQueryPipe::AtomQTQueryPipe(atom **_content, QTDialog *_dialog, QComboBox *_theBox) :
760 content(_content),
761 dialog(_dialog),
762 theBox(_theBox)
763{}
764
765AtomQTQueryPipe::~AtomQTQueryPipe()
766{}
767
768void AtomQTQueryPipe::update(int newIndex) {
769 QVariant data = theBox->itemData(newIndex);
770 int idx = data.toInt();
771 (*content) = World::getInstance().getAtom(AtomById(idx));
772 dialog->update();
773}
774
775
776AtomsQTQueryPipe::AtomsQTQueryPipe(std::vector<atom *>*_content, QTDialog *_dialog, QComboBox *_theBox) :
777 content(_content),
778 dialog(_dialog),
779 theBox(_theBox)
780{}
781
782AtomsQTQueryPipe::~AtomsQTQueryPipe()
783{}
784
785void AtomsQTQueryPipe::update(int newIndex) {
786 QVariant data = theBox->itemData(newIndex);
787 int idx = data.toInt();
788 atom *Walker = World::getInstance().getAtom(AtomById(idx));
789 if (Walker)
790 (*content).push_back(Walker) ;
791 dialog->update();
792}
793
794
795MoleculeQTQueryPipe::MoleculeQTQueryPipe(molecule **_content, QTDialog *_dialog, QComboBox *_theBox) :
796 content(_content),
797 dialog(_dialog),
798 theBox(_theBox)
799{}
800
801MoleculeQTQueryPipe::~MoleculeQTQueryPipe()
802{}
803
804void MoleculeQTQueryPipe::update(int newIndex) {
805 QVariant data = theBox->itemData(newIndex);
806 int idx = data.toInt();
807 (*content) = World::getInstance().getMolecule(MoleculeById(idx));
808 dialog->update();
809}
810
811
812MoleculesQTQueryPipe::MoleculesQTQueryPipe(std::vector<molecule *>*_content, QTDialog *_dialog, QComboBox *_theBox) :
813 content(_content),
814 dialog(_dialog),
815 theBox(_theBox)
816{}
817
818MoleculesQTQueryPipe::~MoleculesQTQueryPipe()
819{}
820
821void MoleculesQTQueryPipe::update(int newIndex) {
822 QVariant data = theBox->itemData(newIndex);
823 int idx = data.toInt();
824 molecule *mol = World::getInstance().getMolecule(MoleculeById(idx));
825 if (mol)
826 (*content).push_back(mol);
827 dialog->update();
828}
829
830ElementQTQueryPipe::ElementQTQueryPipe(const element **_content, QTDialog *_dialog, QComboBox *_theBox) :
831 content(_content),
832 dialog(_dialog),
833 theBox(_theBox)
834{}
835
836ElementQTQueryPipe::~ElementQTQueryPipe()
837{}
838
839void ElementQTQueryPipe::update(int newIndex) {
840 QVariant data = theBox->itemData(newIndex);
841 int idx = data.toInt();
842 *content = World::getInstance().getPeriode()->FindElement(idx);
843 dialog->update();
844}
845
846ElementsQTQueryPipe::ElementsQTQueryPipe(std::vector<const element *>*_content, QTDialog *_dialog, QComboBox *_theBox) :
847 content(_content),
848 dialog(_dialog),
849 theBox(_theBox)
850{}
851
852ElementsQTQueryPipe::~ElementsQTQueryPipe()
853{}
854
855void ElementsQTQueryPipe::update(int newIndex) {
856 QVariant data = theBox->itemData(newIndex);
857 int idx = data.toInt();
858 const element *elemental = World::getInstance().getPeriode()->FindElement(idx);
859 if(elemental)
860 (*content).push_back(elemental);
861 dialog->update();
862}
863
864
Note: See TracBrowser for help on using the repository browser.