source: src/UIElements/Dialog.hpp@ 311137

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 311137 was 2c5765, checked in by Frederik Heber <heber@…>, 13 years ago

Added Query for File_s_, i.e. vector of boost::filesystem::path.

  • Property mode set to 100644
File size: 17.3 KB
Line 
1/*
2 * Dialog.hpp
3 *
4 * Created on: Jan 5, 2010
5 * Author: crueger
6 */
7
8#ifndef DIALOG_HPP_
9#define DIALOG_HPP_
10
11// include config.h
12#ifdef HAVE_CONFIG_H
13#include <config.h>
14#endif
15
16
17#include<string>
18#include<list>
19#include<vector>
20
21#include <boost/filesystem.hpp>
22#include "Box.hpp"
23#include "LinearAlgebra/Vector.hpp"
24#include "RandomNumbers/RandomNumberDistribution_Parameters.hpp"
25
26class atom;
27class Box;
28class element;
29class molecule;
30
31
32/** Dialog is one of the two main classes of the UIFactory base class.
33 *
34 * The Dialog is meant for asking the user for information needed to perform
35 * actions he desires, such as asking for a position in space or a length.
36 *
37 * For this purpose there is the base class Query and numerous specializations
38 * for each of the types to be asked. There are primitives integer, doubles and
39 * string, but also advanced types such as element, molecule or Vector. There
40 * is also an empty query for displaying text.
41 *
42 * Note that the templatization of Dialog::query() allows for easy implementation
43 * of new types that correspond to/are derived from old ones.
44 *
45 * <H3>How do Dialogs operate?</H3>
46 *
47 * Dialogs are initiated by Action::FillDialog() function calls. Within Action::Call()
48 * a dialog is created and passed on to FillDialog(), which is specialized in each
49 * specific Action to ask for the specific parameter it needs.
50 *
51 * Dialogs are derived for each of the UI types
52 * -# CommandLineDialog
53 * -# QtDialog
54 * -# TextDialog
55 *
56 * This "asking" for parameters is done via the Query class. There are four types
57 * of Query types:
58 * -# Query, members in class Dialog
59 * -# CommandLineQuery, members in class CommandLineDialog
60 * -# QtQuery, members in class QtDialog
61 * -# TextQuery, members in class TextDialog
62 * Each embodies a certain way of asking the user for the specific type of parameter
63 * needed, e.g. a file via the TextMenu interface would be done in member functions of
64 * TextDialog::FileTextQuery.
65 *
66 *
67 * Generally, the sequence of events is as follows:
68 * -# Action::fillDialog() calls upon Dialog::query<T> for some type T, let's say T
69 * stands for double
70 * -# Dialog::query<double> call a function queryDouble()
71 * -# depending on the currently used UIFactory, the Dialog above is actually either
72 * of the three specialized types, let's say CommandLine. And we see that within
73 * CommandLineDialog we have the respective method ueryDouble() that registers
74 * a new instance of the class CommandLineDialog::DoubleCommandLineQuery.
75 * -# The Query's are first registered, as multiple parameters may be needed for
76 * a single Action and we don't want the popping up of a dialog window for each
77 * alone. Rather, we want to merge the Query's into a single Dialog. Therefore,
78 * they are first registered and then executed in sequence. This is done in
79 * Dialog::display(), i.e. when the dialog is finally shown to the user.
80 * -# Then each of the registered Query's, here our CommandLineDialog::
81 * DoubleCommandLineQuery, constructor is called.
82 * -# This will call the constructor of its base class, where the actual value
83 * is stored and later stored into the ValueStorage class by
84 * Dialog::Query::setResult().
85 * -# Also, e.g. for the Qt interface, the buttons, labels and so forth are
86 * created and added to the dialog.
87 * -# Now the users enters information for each UI something different happens:
88 * -# CommandLine: The actual value retrieval is done by the CommandLineParser and
89 * the boost::program_options library, the value is stored therein for the moment.
90 * (see here: http://www.boost.org/doc/libs/1_44_0/doc/html/program_options/)
91 * -# TextMenu: The value is requested via std::cin from the user.
92 * -# QtMenu: The users enters the value in a Dialog. Due to Qt necessities a
93 * Pipe class obtains the value from the Dialog with Qt's signal/slot mechanism
94 * and put it into Dialog::...Query value.
95 * -# in our case DoubleCommandLineQuery::handle() will be called. The value is
96 * retrieved and put into Dialog::DoubleQuery::tmp
97 * -# Finally, for each Query, also Dialog::DoubleQuery, setResult() is called which
98 * puts the value as a string into the ValueStorage under a given token that is
99 * associated with a type (and thereby we assure type-safety).
100 *
101 * <H3>Regarding derived types of types with already present queries</H3>
102 *
103 * Example: We have got a derived Vector class, called BoxVector, that is by any means
104 * a Vector but with one difference: it is always bound to lie within the current domain.
105 * With regards to type-casting it to and from a string however, nothing is different
106 * between Vector and BoxVector.
107 *
108 * So, do we need a new Query for this?
109 * No.
110 *
111 * We just have to do this:
112 * -# add a specialization of Dialog::query<BoxVector> where queryVector()is used.
113 * @code
114 * template <> void Dialog::query<BoxVector>(const char *token, std::string description) {
115 * queryVector(token, false, description);
116 * }
117 * @endcode
118 * -# make sure that
119 * -# ValueStorage::setCurrentValue() the specialization for class Vector has an
120 * if case also for BoxVector and does something appropriate.
121 * -# ValueStorage::queryCurrentValue() has another specialization doing the same
122 * as for Vector but for BoxVector in its signature.
123 *
124 * And that's all.
125 *
126 *
127 * <H3>Adding new queries</H3>
128 *
129 * Check first whether you really need a new query or whether we can derive it and re-use
130 * one of the present ones.
131 *
132 * Due to the three present UI interfaces we have to add a specific Query for each, here
133 * is a list:
134 * -# add ValueStorage::setCurrentValue() and ValueStorage::queryCurrentValue() for
135 * both types
136 * -# add Dialog::query...()
137 * -# add Dialog::query<>() specialization calling the above function
138 * -# add CommandLineDialog::query...(), TextDialog::query...(), and QtDialog::query...(),
139 * i.e. for each of the three interface
140 * -# add empty definition DummyDialog::query...() to the stub for Action unittests in DummUI.hpp.
141 * -# add Dialog::...Query class with tmp value of desired type
142 * -# add CommandLineDialog::...Query, TextDialog::...Query, QtDialog::...Query
143 * -# you probably also need a QtDialog::...QueryPipe() to handle the signal/slot stuff,
144 * Qt's moc does not like nested classes. Hence, this has to go extra.
145 * -# TypeEnumContainer add new type to query
146 * -# CommandLineParser::AddOptionToParser() add new type to query
147 * -# CommandLineParser_valdiates.[ch]pp: If given above as a new type
148 * program_options::value, define and implement a validate() function here.
149 *
150 */
151class Dialog
152{
153public:
154 Dialog();
155 virtual ~Dialog();
156
157 template <class T> void query(const char *, std::string = "");
158
159 virtual void queryEmpty(const char *, std::string = "")=0;
160 virtual void queryBoolean(const char *, std::string = "")=0;
161 virtual void queryInt(const char *, std::string = "")=0;
162 virtual void queryInts(const char *, std::string = "")=0;
163 virtual void queryUnsignedInt(const char *, std::string = "")=0;
164 virtual void queryUnsignedInts(const char *, std::string = "")=0;
165 virtual void queryDouble(const char*, std::string = "")=0;
166 virtual void queryDoubles(const char*, std::string = "")=0;
167 virtual void queryString(const char*, std::string = "")=0;
168 virtual void queryStrings(const char*, std::string = "")=0;
169 virtual void queryAtom(const char*,std::string = "")=0;
170 virtual void queryAtoms(const char*,std::string = "")=0;
171 virtual void queryMolecule(const char*, std::string = "")=0;
172 virtual void queryMolecules(const char*, std::string = "")=0;
173 virtual void queryVector(const char*,bool, std::string = "")=0;
174 virtual void queryVectors(const char*,bool, std::string = "")=0;
175 virtual void queryBox(const char*, std::string = "")=0;
176 virtual void queryElement(const char*, std::string = "")=0;
177 virtual void queryElements(const char*, std::string = "")=0;
178 virtual void queryFile(const char*, std::string = "")=0;
179 virtual void queryFiles(const char*, std::string = "")=0;
180 virtual void queryRandomNumberDistribution_Parameters(const char*, std::string = "")=0;
181
182 virtual bool display();
183
184 virtual bool checkAll();
185 virtual void setAll();
186
187 virtual bool hasQueries();
188
189protected:
190 // methodology for handling queries
191 // all queries are stored and then performed at appropriate times
192
193 //these queries can be handled by this dialog
194
195 //TODO: Find a way to reduce complexity...
196 //needs O(N*M) query classes, where N is the number of query types and M is the number of GUIs
197 //usual approach for reducing inheritance complexity (strategy pattern) does not work,
198 //due to lack of common code for query types as well as GUI-Types (all subtypes differ a lot)
199
200 /** Base class for all queries.
201 *
202 * A query is request to the user for a value of a specific type.
203 * E.g. All \ref Action's need parameters to perform a specific function.
204 * These are obtained from the user at run-time via a Query regardless
205 * of the interface that the user is using.
206 *
207 * A Query always contains a protected member variable of the specific type.
208 * For each type there is a derived class, e.g. for a boolean there is
209 * \ref BooleanQuery deriving from \ref Query. Each specific UI derives
210 * again from a specific Query, e.g. for the \link userinterfaces-textmenu
211 * textmenu \endlink we have \ref BooleanTextQuery that derives from
212 * \ref BooleanQuery. This derived class has to implement the Query::handle
213 * function that actually sets the protected member variable to something
214 * the user has entered. Also it implements Query::setResult that actually
215 * places the obtained value in the \ref ValueStorage.
216 *
217 * \section query-howto How to add another query?
218 *
219 * Let's say we want to query for a type called \a Value.
220 *
221 * Then, we do the following:
222 * -# Add a class ValueQuery inside class Dialog, the class contains
223 * -# constructor/destructor (latter virtual! because of derived class)
224 * -# virtual bool handle() and virtual void setResult()
225 * -# a protected member tmp of type Value (NOTE: herein the result is stored)
226 * -# if temporaries for conversion are needed put them in here
227 * -# add a function queryValue
228 * -# now, for each of the GUIs we basically have to repeat the above, i.e.
229 * add the class and the function that implement the virtual ones above.
230 * -# QT: an extra class called ValueQtQueryPipe that actually handles
231 * showing dialogs to obtain the value and placing it into the \a tmp
232 * variable (via a given pointer to it as reference). handle() will
233 * simply return true. This is needed because of a restriction of Qt4:
234 * its meta-object-compiler does not like nested classes.
235 * -# CommandLine: nothing special, handle() imports value from \a
236 * CommandLineParser and sets the tmp variable.
237 * -# Text: nothing special, handle() queries the user and sets the tmp
238 * variable
239 */
240 class Query {
241 friend class Dialog;
242 public:
243 Query(std::string _title, std::string _description = "");
244 virtual ~Query();
245 virtual bool handle()=0;
246 virtual void setResult()=0;
247 protected:
248 const std::string getTitle() const;
249 const std::string getDescription() const;
250 private:
251 std::string title; //!< short title of the query
252 std::string description; //!< longer description for tooltips or for help
253 };
254
255 // Empty Query is just meant for showing text, such as version, help, initial message or alike
256 class EmptyQuery : public Query {
257 public:
258 EmptyQuery(std::string title, std::string _description = "");
259 virtual ~EmptyQuery();
260 virtual bool handle()=0;
261 virtual void setResult();
262 };
263
264 //Specialized classes for certain types. GUI-Types are not specialized at this time
265 class BooleanQuery : public Query {
266 public:
267 BooleanQuery(std::string title, std::string _description = "");
268 virtual ~BooleanQuery();
269 virtual bool handle()=0;
270 virtual void setResult();
271 protected:
272 bool tmp;
273 };
274
275 class IntQuery : public Query {
276 public:
277 IntQuery(std::string title, std::string _description = "");
278 virtual ~IntQuery();
279 virtual bool handle()=0;
280 virtual void setResult();
281 protected:
282 int tmp;
283 };
284
285 class IntsQuery : public Query {
286 public:
287 IntsQuery(std::string title, std::string _description = "");
288 virtual ~IntsQuery();
289 virtual bool handle()=0;
290 virtual void setResult();
291 protected:
292 int temp;
293 std::vector<int> tmp;
294 };
295
296 class UnsignedIntQuery : public Query {
297 public:
298 UnsignedIntQuery(std::string title, std::string _description = "");
299 virtual ~UnsignedIntQuery();
300 virtual bool handle()=0;
301 virtual void setResult();
302 protected:
303 unsigned int tmp;
304 };
305
306 class UnsignedIntsQuery : public Query {
307 public:
308 UnsignedIntsQuery(std::string title, std::string _description = "");
309 virtual ~UnsignedIntsQuery();
310 virtual bool handle()=0;
311 virtual void setResult();
312 protected:
313 unsigned int temp;
314 std::vector<unsigned int> tmp;
315 };
316
317 class DoubleQuery : public Query {
318 public:
319 DoubleQuery(std::string title, std::string _description = "");
320 virtual ~DoubleQuery();
321 virtual bool handle()=0;
322 virtual void setResult();
323 protected:
324 double tmp;
325 };
326
327 class DoublesQuery : public Query {
328 public:
329 DoublesQuery(std::string title, std::string _description = "");
330 virtual ~DoublesQuery();
331 virtual bool handle()=0;
332 virtual void setResult();
333 protected:
334 double temp;
335 std::vector<double> tmp;
336 };
337
338 class StringQuery : public Query {
339 public:
340 StringQuery(std::string title, std::string _description = "");
341 virtual ~StringQuery();
342 virtual bool handle()=0;
343 virtual void setResult();
344 protected:
345 std::string tmp;
346 };
347
348 class StringsQuery : public Query {
349 public:
350 StringsQuery(std::string title, std::string _description = "");
351 virtual ~StringsQuery();
352 virtual bool handle()=0;
353 virtual void setResult();
354 protected:
355 std::string temp;
356 std::vector<std::string> tmp;
357 };
358
359 class MoleculeQuery : public Query {
360 public:
361 MoleculeQuery(std::string title, std::string _description = "");
362 virtual ~MoleculeQuery();
363 virtual bool handle()=0;
364 virtual void setResult();
365 protected:
366 const molecule *tmp;
367 };
368
369 class MoleculesQuery : public Query {
370 public:
371 MoleculesQuery(std::string title, std::string _description = "");
372 virtual ~MoleculesQuery();
373 virtual bool handle()=0;
374 virtual void setResult();
375 protected:
376 const molecule * temp;
377 std::vector<const molecule *> tmp;
378 };
379
380 class AtomQuery : public Query {
381 public:
382 AtomQuery(std::string title, std::string _description = "");
383 virtual ~AtomQuery();
384 virtual bool handle()=0;
385 virtual void setResult();
386 protected:
387 const atom *tmp;
388 };
389
390 class AtomsQuery : public Query {
391 public:
392 AtomsQuery(std::string title, std::string _description = "");
393 virtual ~AtomsQuery();
394 virtual bool handle()=0;
395 virtual void setResult();
396 protected:
397 const atom *temp;
398 std::vector<const atom *> tmp;
399 };
400
401 class VectorQuery : public Query {
402 public:
403 VectorQuery(std::string title,bool _check, std::string _description = "");
404 virtual ~VectorQuery();
405 virtual bool handle()=0;
406 virtual void setResult();
407 protected:
408 Vector tmp;
409 bool check;
410 };
411
412 class VectorsQuery : public Query {
413 public:
414 VectorsQuery(std::string title,bool _check, std::string _description = "");
415 virtual ~VectorsQuery();
416 virtual bool handle()=0;
417 virtual void setResult();
418 protected:
419 Vector temp;
420 std::vector<Vector> tmp;
421 bool check;
422 };
423
424 class BoxQuery : public Query {
425 public:
426 BoxQuery(std::string title, std::string _description = "");
427 virtual ~BoxQuery();
428 virtual bool handle()=0;
429 virtual void setResult();
430 protected:
431 Box tmp;
432 };
433
434 class ElementQuery : public Query {
435 public:
436 ElementQuery(std::string title, std::string _description = "");
437 virtual ~ElementQuery();
438 virtual bool handle()=0;
439 virtual void setResult();
440 protected:
441 const element * tmp;
442 };
443
444 class ElementsQuery : public Query {
445 public:
446 ElementsQuery(std::string title, std::string _description = "");
447 virtual ~ElementsQuery();
448 virtual bool handle()=0;
449 virtual void setResult();
450 protected:
451 const element *temp;
452 std::vector<const element *> tmp;
453 };
454
455 class FileQuery : public Query {
456 public:
457 FileQuery(std::string title, std::string _description = "");
458 virtual ~FileQuery();
459 virtual bool handle()=0;
460 virtual void setResult();
461 protected:
462 boost::filesystem::path tmp;
463 };
464
465 class FilesQuery : public Query {
466 public:
467 FilesQuery(std::string title, std::string _description = "");
468 virtual ~FilesQuery();
469 virtual bool handle()=0;
470 virtual void setResult();
471 protected:
472 std::vector<boost::filesystem::path> tmp;
473 };
474
475 class RandomNumberDistribution_ParametersQuery : public Query {
476 public:
477 RandomNumberDistribution_ParametersQuery(std::string title, std::string _description = "");
478 virtual ~RandomNumberDistribution_ParametersQuery();
479 virtual bool handle()=0;
480 virtual void setResult();
481 protected:
482 RandomNumberDistribution_Parameters tmp;
483 };
484
485void registerQuery(Query* query);
486
487private:
488 std::list<Query*> queries;
489
490};
491
492
493#endif /* DIALOG_HPP_ */
Note: See TracBrowser for help on using the repository browser.