BALL  1.4.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
demoTutorialDialog.C
Go to the documentation of this file.
1 // -*- Mode: C++; tab-width: 2; -*-
2 // vi: set ts=2:
3 //
4 
5 #include "demoTutorialDialog.h"
6 #include "mainframe.h"
7 
11 
16 
18 
27 
29 #include <BALL/SYSTEM/path.h>
30 
31 #include <QtGui/QPushButton>
32 #include <QtGui/QMessageBox>
33 #include <QtGui/QTextBrowser>
34 
35 namespace BALL
36 {
37  namespace VIEW
38  {
39 
41 {
51 };
52 
53 
55  : QDialog(parent),
56  Ui_DemoTutorialDialogData(),
57  ModularWidget(name),
58  surface_(0)
59 {
60 #ifdef BALL_VIEW_DEBUG
61  Log.error() << "new DemoTutorialDialog " << this << std::endl;
62 #endif
63 
64  setupUi(this);
65  setObjectName(name);
66 
67  // register the widget with the MainControl
69  hide();
70  connect(next_button, SIGNAL(clicked()), this, SLOT(nextStepClicked()));
71  connect(cancel_button, SIGNAL(clicked()), this, SLOT(hide()));
72 }
73 
75 {
76 #ifdef BALL_VIEW_DEBUG
77  Log.error() << "deleting DemoTutorialDialog " << this << std::endl;
78 #endif
79 
80  delete surface_;
81 }
82 
84 {
85  setWindowTitle(tr("BALLView Demo"));
86 
87  prefix_ = getBaseDir_() + "demo";
88 
89  next_button->setEnabled(true);
90  QDialog::show();
91  raise();
92  move(20,20);
93 
94  // hide some dockwidgets
95  if (LogView::getInstance(0) != 0) LogView::getInstance(0)->hide();
96  if (DatasetControl::getInstance(0) != 0) DatasetControl::getInstance(0)->hide();
97 #ifdef BALL_PYTHON_SUPPORT
98  if (PyWidget::getInstance(0) != 0) PyWidget::getInstance(0)->hide();
99 #endif
100 }
101 
103 {
104  Path p;
105  String dir = p.find( String("..")
107  + "doc"
109  + "internal"
111 
112  return dir;
113 }
114 
116 {
117  setWindowTitle(tr("BALLView Tutorial"));
118 
119  prefix_ = getBaseDir_() + "tutorial";
120 
121  next_button->setEnabled(false);
122 
123  ((Mainframe*)getMainControl())->reset();
124 
125  Scene::getInstance(0)->show();
126  MolecularControl::getInstance(0)->show();
127  MolecularControl::getInstance(0)->setFloating(false);
128  MolecularControl::getInstance(0)->applyPreferences();
129  DatasetControl::getInstance(0)->show();
130  DatasetControl::getInstance(0)->applyPreferences();
131  DatasetControl::getInstance(0)->setFloating(false);
132  GeometricControl::getInstance(0)->show();
133  GeometricControl::getInstance(0)->applyPreferences();
134  GeometricControl::getInstance(0)->setFloating(false);
135 
136  LogView::getInstance(0)->hide();
137 }
138 
140 {
141  current_step_ = 1;
142 
143  if (demo_mode_)
144  {
145  initDemo_();
146  }
147  else
148  {
149  int result = QMessageBox::question(this, tr("Warning"),
150  tr("To start the tutorial, all loaded structures and molecules will be deleted."),
151  QMessageBox::Ok| QMessageBox::Cancel, QMessageBox::Ok);
152  if (result != QMessageBox::Ok) return;
153 
154  initTutorial_();
155  }
156 
157  QUrl qurl = QUrl::fromLocalFile((prefix_ + "01.html").c_str());
158  text_browser->setSource(qurl);
159 
160  QDialog::show();
161  resize(350, 650);
162  raise();
163 }
164 
166 {
167  if (!isVisible()) return;
168 
169  if (demo_mode_)
170  {
171  onNotifyDemo_(message);
172  }
173  else
174  {
175  onNotifyTutorial_(message);
176  }
177 }
178 
180 {
181  RepresentationMessage* rmsg = RTTI::castTo<RepresentationMessage>(*message);
182 
183  if (current_step_ == 13 ||
184  current_step_ == 14)
185  {
186  if (!RTTI::isKindOf<FinishedSimulationMessage>(*message)) return;
187  }
188  else if (current_step_ == 15)
189  {
190  DatasetMessage* msg = RTTI::castTo<DatasetMessage>(*message);
191  if (msg == 0) return;
192 
193  if (msg->getDataset() == 0)
194  {
196  return;
197  }
198 
199  RegularData3DDataset* set = dynamic_cast<RegularData3DDataset*>(msg->getDataset());
200  if (set->getType() != RegularData3DController::type) return;
201 
202  grid_ = (RegularData3D*) set->getData();
203  }
204  else if (current_step_ == 16)
205  {
206  SceneMessage* msg = RTTI::castTo<SceneMessage>(*message);
207  if (msg == 0 || msg->getType() != SceneMessage::REBUILD_DISPLAY_LISTS)
208  {
209  return;
210  }
211  }
212  else if (rmsg == 0 ||
214  {
215  return;
216  }
217 
218  enableNextStep_();
219 }
220 
221 
223 {
224  next_button->setEnabled(true);
225 }
226 
227 
229 {
230  String id = String(current_step_ + 1);
231  if (id.size() == 1) id = "0" + id;
232 
233  id = prefix_ + id + ".html";
234 
235  QUrl qurl = QUrl::fromLocalFile(id.c_str());
236  text_browser->setSource(qurl);
237  next_button->setEnabled(false);
238 
239  current_step_ ++;
240 
241  if (demo_mode_)
242  {
243  if (current_step_ == 18)
244  {
245  showTutorial();
246  return;
247  }
248 
249  nextStepDemo_();
250  }
251  else
252  {
253  if (current_step_ == 9)
254  {
255  next_button->setEnabled(true);
256  }
257  if (current_step_ == 10)
258  {
259  hide();
260  HelpViewer* hv = HelpViewer::getInstance(1);
261  if (hv == 0) return;
262  hv->showHelp();
263  hv->setFloating(true);
264  hv->showMaximized();
265  }
266  }
267 }
268 
269 
271 {
272  // initialisation for first real step
273  if (current_step_ == 2)
274  {
275  DisplayProperties* dp = DisplayProperties::getInstance(0);
277 
278  ((Mainframe*)getMainControl())->reset();
279 
280  // open bpti
281  try
282  {
283  Path path;
284  String file_name = path.find("structures/bpti.pdb");
285 
286  MolecularFileDialog* dialog = MolecularFileDialog::getInstance(0);
287  if (dialog == 0) return;
288 
290  system_ = dialog->openMolecularFile(file_name);
292 
293  if (system_ == 0)
294  {
295  String msg((String)tr("Could not open bpti.pdb. Maybe the file was deleted?")+"\n");
296  msg += (String)tr("It should be found in") + " " + file_name;
297 
298  QMessageBox::critical(0, tr("Error while starting BALLView Demo"), msg.c_str(),
299  QMessageBox::Ok, Qt::NoButton, Qt::NoButton);
300  return;
301  }
302 
303  system_->apply(getFragmentDB().add_hydrogens);
304  system_->apply(getFragmentDB().build_bonds);
305  getMainControl()->update(*system_, true);
306  }
307  catch(Exception::FileNotFound e)
308  {
309  Log.error() << (String)tr("Could not open") << " " << e.getFilename() << std::endl;
310  return;
311  }
312 
313  composites_.clear();
314  composites_.push_back(system_);
315  }
316 
317  if (current_step_ == 18) // last page
318  {
319  hide();
320  return;
321  }
322 
323  MolecularStructure* ms = MolecularStructure::getInstance(0);
324 
325  next_button->setEnabled(current_step_ >= 15);
326 
327  // remove representations
330  std::list<Representation*> reps = pm.getRepresentations();
331 
332  if (surface_ == 0 && nr == 1 && current_step_ == 7)
333  {
334  GeometricObject* go = *(**reps.begin()).getGeometricObjects().begin();
335  Mesh* mesh = dynamic_cast<Mesh*>(go);
336  if (mesh != 0)
337  {
338  surface_ = new Mesh(*mesh);
339  }
340  else
341  {
342  // should not happen
344  surface_ = new Mesh();
345  }
346  }
347 
348  for (Position p = 0; p < nr; p++)
349  {
350  getMainControl()->remove(**reps.begin());
351  reps.pop_front();
352  }
353 
354  if (current_step_ < 9)
355  {
356  ModelType type = (ModelType) (current_step_ - 2);
357  if (type >= MODEL_SA_SURFACE)
358  {
359  type = (ModelType)((Index)type + 1);
360  }
362  }
363  else if (current_step_ == 9)
364  {
367  ms->calculateHBonds();
370 
371  }
372  else if (current_step_ == 10)
373  {
375  }
376  else if (current_step_ == 11)
377  {
379  }
380  else if (current_step_ == 12)
381  {
383  }
384  else if (current_step_ == 13 ||
385  current_step_ == 14)
386  {
390 
391  list<Composite*> composites;
392  composites.push_back(*getMainControl()->getCompositeManager().getComposites().begin());
393  MolecularControl::getInstance(0)->highlight(composites);
394 
395  if (current_step_ == 13)
396  {
398  ms->chooseAmberFF();
402  ms->runMinimization(false);
403  }
404  else
405  {
406  ms->getMDSimulationDialog().setTimeStep(0.002);
408  ms->MDSimulation(false);
409  }
410  }
411  else if (current_step_ == 15) //FDPB
412  {
414  if (!ms->calculateFDPB(false))
415  {
417  }
419  }
420  else if (current_step_ == 16) // SES colored
421  {
422  // Create a new representation containing the contour surface.
425  rep->insert(*new Mesh(*surface_));
426  getMainControl()->insert(*rep);
427 
428  ModifyRepresentationDialog* cdialog = ModifyRepresentationDialog::getInstance(0);
429  cdialog->setMode(0);
430  cdialog->setRepresentation(rep);
431  cdialog->setGrid(grid_);
432  cdialog->setMinValue(-0.7);
433  cdialog->setMaxValue(0.7);
434  cdialog->accept();
435 
436  getMainControl()->update(*rep);
437  }
438  else if (current_step_ == 17)
439  {
443 
445 
446  DatasetController* dc = DatasetControl::getInstance(0)->getController(RegularData3DController::type);
448  vector<Dataset*> grids = rcon.getDatasets();
449  if (grids.size() == 0) return;
450  rcon.computeIsoContourSurface(*grids[0], ColorRGBA(255,0,0), -0.1);
451  rcon.computeIsoContourSurface(*grids[0], ColorRGBA(0,0,255), 0.1);
452 
453  // last entry: we are done
454  }
455 }
456 
458 {
459  demo_mode_ = false;
460  show();
461 }
462 
464 {
465  demo_mode_ = true;
466  show();
467 }
468 
470 {
471  CompositeMessage* cmsg = RTTI::castTo<CompositeMessage>(*message);
472  RepresentationMessage* rmsg = RTTI::castTo<RepresentationMessage>(*message);
473 
474  if (rmsg != 0 && rmsg->getRepresentation() == 0) return;
475 
476  switch (current_step_)
477  {
478  case TUTORIAL_PEPTIDE: // "Building a peptide from a given sequence"
479  {
480  if (cmsg == 0 || cmsg->getType() != CompositeMessage::NEW_MOLECULE) return;
481  break;
482  }
483 
484  case TUTORIAL_ROTATE: // "Rotating"
485  {
486  if (!RTTI::isKindOf<SceneMessage>(*message)) return;
487  break;
488  }
489 
490  case TUTORIAL_HIERARCHY: // "Hierarchy of molecules"
491  {
492  break;
493  }
494 
495  case TUTORIAL_MDS: // "Molecular Dynamics Simulation")
496  {
497  if (!RTTI::isKindOf<DatasetMessage>(*message)) return;
498  DatasetMessage* msg = dynamic_cast<DatasetMessage*>(message);
499  if (msg->getDataset() == 0)
500  {
502  return;
503  }
504 
505  if (msg->getDataset()->getType() != TrajectoryController::type ||
506  msg->getType() != DatasetMessage::ADD)
507  {
508  return;
509  }
510 
511  break;
512  }
513 
514  case TUTORIAL_TRAJECTORY: // "Visualisation of trajectories")
515  {
516  if (cmsg != 0 && cmsg->getType() == CompositeMessage::CHANGED_COMPOSITE)
517  {
518  enableNextStep_();
519  }
520  break;
521  }
522 
523  case TUTORIAL_ES: // "Calculation of electrostatics"
524  {
525  if (!RTTI::isKindOf<DatasetMessage>(*message)) return;
526  DatasetMessage* msg = dynamic_cast<DatasetMessage*>(message);
527  if (msg->getDataset() == 0)
528  {
530  return;
531  }
532 
534  msg->getType() != DatasetMessage::ADD)
535  {
536  return;
537  }
538 
539  break;
540  }
541 
542  case TUTORIAL_SES: // "Creating a Solvent Excluded Surface"
543  {
544  if (rmsg == 0 ||
547  {
548  return;
549  }
550  break;
551  }
552 
553  case TUTORIAL_SES_COLORING: // "Coloring a SES by electrostatics"
554  {
555  if (rmsg == 0 ||
558  {
559  return;
560  }
561  break;
562  }
563 
564  case TUTORIAL_CS: // "Creating a isocontour surface"
565  {
566  if (rmsg == 0 ||
568  {
569  return;
570  }
571  break;
572  }
573 
574  default:
576  Log.error() << (String)tr("Current step") << ": " << current_step_ << std::endl;
577  return;
578  }
579 
580  enableNextStep_();
581 }
582 
584 {
586 
587  String description = "Shortcut|Help|Demo";
588  demo_action_ = insertMenuEntry(MainControl::HELP, (String)tr("Demo"), this, SLOT(showDemo()), description);
589  setMenuHint((String)tr("Show a demonstration of BALLView's features"));
590 
591  description = "Shortcut|Help|Tutorial";
592  tutorial_action_ = insertMenuEntry(MainControl::HELP, (String)tr("Tutorial"), this, SLOT(showTutorial()), description);
593  setMenuHint((String)tr("Perform a step-by-step tutorial"));
595 }
596 
598 {
599  bool busy = main_control.isBusy();
600  demo_action_->setEnabled(!busy);
601  tutorial_action_->setEnabled(!busy);
602 }
603 
604 } } // namespaces