00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038 #include <gecode/gist/qtgist.hh>
00039
00040 #include <gecode/gist/zoomToFitIcon.hpp>
00041 #include <gecode/gist/nodevisitor.hh>
00042 #include <gecode/gist/nodecursor.hh>
00043
00044 namespace Gecode { namespace Gist {
00045
00046 Gist::Gist(Space* root, bool bab, QWidget* parent,
00047 const Options& opt) : QWidget(parent) {
00048 QGridLayout* layout = new QGridLayout(this);
00049
00050 QAbstractScrollArea* scrollArea = new QAbstractScrollArea(this);
00051
00052 scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
00053 scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);
00054 scrollArea->setAutoFillBackground(true);
00055 QPalette myPalette(scrollArea->palette());
00056 myPalette.setColor(QPalette::Window, Qt::white);
00057 scrollArea->setPalette(myPalette);
00058 canvas = new TreeCanvas(root, bab, scrollArea->viewport(),opt);
00059 canvas->setPalette(myPalette);
00060 canvas->setObjectName("canvas");
00061
00062 connect(scrollArea->horizontalScrollBar(), SIGNAL(valueChanged(int)),
00063 canvas, SLOT(scroll(void)));
00064 connect(scrollArea->verticalScrollBar(), SIGNAL(valueChanged(int)),
00065 canvas, SLOT(scroll(void)));
00066
00067 QVBoxLayout* sa_layout = new QVBoxLayout();
00068 sa_layout->setContentsMargins(0,0,0,0);
00069 sa_layout->addWidget(canvas);
00070 scrollArea->viewport()->setLayout(sa_layout);
00071
00072 connect(canvas, SIGNAL(solution(const Space*)),
00073 this, SIGNAL(solution(const Space*)));
00074
00075 connect(canvas, SIGNAL(searchFinished(void)), this, SIGNAL(searchFinished(void)));
00076
00077 QPixmap myPic;
00078 myPic.loadFromData(zoomToFitIcon, sizeof(zoomToFitIcon));
00079
00080 QToolButton* autoZoomButton = new QToolButton();
00081 autoZoomButton->setCheckable(true);
00082 autoZoomButton->setIcon(myPic);
00083
00084 nodeStatInspector = new NodeStatInspector(this);
00085 connect(canvas, SIGNAL(statusChanged(VisualNode*,const Statistics&, bool)),
00086 nodeStatInspector, SLOT(node(VisualNode*,const Statistics&, bool)));
00087
00088 inspect = new QAction("Inspect", this);
00089 inspect->setShortcut(QKeySequence("Return"));
00090 connect(inspect, SIGNAL(triggered()), canvas,
00091 SLOT(inspectCurrentNode()));
00092
00093 inspectBeforeFP = new QAction("Inspect before fixpoint", this);
00094 inspectBeforeFP->setShortcut(QKeySequence("Ctrl+Return"));
00095 connect(inspectBeforeFP, SIGNAL(triggered()), canvas,
00096 SLOT(inspectBeforeFP(void)));
00097
00098 stop = new QAction("Stop search", this);
00099 stop->setShortcut(QKeySequence("Esc"));
00100 connect(stop, SIGNAL(triggered()), canvas,
00101 SLOT(stopSearch()));
00102
00103 reset = new QAction("Reset", this);
00104 reset->setShortcut(QKeySequence("Ctrl+R"));
00105 connect(reset, SIGNAL(triggered()), canvas,
00106 SLOT(reset()));
00107
00108 navUp = new QAction("Up", this);
00109 navUp->setShortcut(QKeySequence("Up"));
00110 connect(navUp, SIGNAL(triggered()), canvas,
00111 SLOT(navUp()));
00112
00113 navDown = new QAction("Down", this);
00114 navDown->setShortcut(QKeySequence("Down"));
00115 connect(navDown, SIGNAL(triggered()), canvas,
00116 SLOT(navDown()));
00117
00118 navLeft = new QAction("Left", this);
00119 navLeft->setShortcut(QKeySequence("Left"));
00120 connect(navLeft, SIGNAL(triggered()), canvas,
00121 SLOT(navLeft()));
00122
00123 navRight = new QAction("Right", this);
00124 navRight->setShortcut(QKeySequence("Right"));
00125 connect(navRight, SIGNAL(triggered()), canvas,
00126 SLOT(navRight()));
00127
00128 navRoot = new QAction("Root", this);
00129 navRoot->setShortcut(QKeySequence("R"));
00130 connect(navRoot, SIGNAL(triggered()), canvas,
00131 SLOT(navRoot()));
00132
00133 navNextSol = new QAction("To next solution", this);
00134 navNextSol->setShortcut(QKeySequence("Shift+Right"));
00135 connect(navNextSol, SIGNAL(triggered()), canvas,
00136 SLOT(navNextSol()));
00137
00138 navPrevSol = new QAction("To previous solution", this);
00139 navPrevSol->setShortcut(QKeySequence("Shift+Left"));
00140 connect(navPrevSol, SIGNAL(triggered()), canvas,
00141 SLOT(navPrevSol()));
00142
00143 searchNext = new QAction("Next solution", this);
00144 searchNext->setShortcut(QKeySequence("N"));
00145 connect(searchNext, SIGNAL(triggered()), canvas, SLOT(searchOne()));
00146
00147 searchAll = new QAction("All solutions", this);
00148 searchAll->setShortcut(QKeySequence("A"));
00149 connect(searchAll, SIGNAL(triggered()), canvas, SLOT(searchAll()));
00150
00151 toggleHidden = new QAction("Hide/unhide", this);
00152 toggleHidden->setShortcut(QKeySequence("H"));
00153 connect(toggleHidden, SIGNAL(triggered()), canvas, SLOT(toggleHidden()));
00154
00155 hideFailed = new QAction("Hide failed subtrees", this);
00156 hideFailed->setShortcut(QKeySequence("F"));
00157 connect(hideFailed, SIGNAL(triggered()), canvas, SLOT(hideFailed()));
00158
00159 unhideAll = new QAction("Unhide all", this);
00160 unhideAll->setShortcut(QKeySequence("U"));
00161 connect(unhideAll, SIGNAL(triggered()), canvas, SLOT(unhideAll()));
00162
00163 toggleStop = new QAction("Stop/unstop", this);
00164 toggleStop->setShortcut(QKeySequence("X"));
00165 connect(toggleStop, SIGNAL(triggered()), canvas, SLOT(toggleStop()));
00166
00167 unstopAll = new QAction("Do not stop in subtree", this);
00168 unstopAll->setShortcut(QKeySequence("Shift+X"));
00169 connect(unstopAll, SIGNAL(triggered()), canvas, SLOT(unstopAll()));
00170
00171 zoomToFit = new QAction("Zoom to fit", this);
00172 zoomToFit->setShortcut(QKeySequence("Z"));
00173 connect(zoomToFit, SIGNAL(triggered()), canvas, SLOT(zoomToFit()));
00174
00175 center = new QAction("Center current node", this);
00176 center->setShortcut(QKeySequence("C"));
00177 connect(center, SIGNAL(triggered()), canvas, SLOT(centerCurrentNode()));
00178
00179 exportPDF = new QAction("Export subtree PDF...", this);
00180 exportPDF->setShortcut(QKeySequence("P"));
00181 connect(exportPDF, SIGNAL(triggered()), canvas,
00182 SLOT(exportPDF()));
00183
00184 exportWholeTreePDF = new QAction("Export PDF...", this);
00185 exportWholeTreePDF->setShortcut(QKeySequence("Ctrl+Shift+P"));
00186 connect(exportWholeTreePDF, SIGNAL(triggered()), canvas,
00187 SLOT(exportWholeTreePDF()));
00188
00189 print = new QAction("Print...", this);
00190 print->setShortcut(QKeySequence("Ctrl+P"));
00191 connect(print, SIGNAL(triggered()), canvas,
00192 SLOT(print()));
00193
00194 bookmarkNode = new QAction("Add/remove bookmark", this);
00195 bookmarkNode->setShortcut(QKeySequence("Shift+B"));
00196 connect(bookmarkNode, SIGNAL(triggered()), canvas, SLOT(bookmarkNode()));
00197
00198 compareNode = new QAction("Compare", this);
00199 compareNode->setShortcut(QKeySequence("V"));
00200 connect(compareNode, SIGNAL(triggered()),
00201 canvas, SLOT(startCompareNodes()));
00202
00203 compareNodeBeforeFP = new QAction("Compare before fixpoint", this);
00204 compareNodeBeforeFP->setShortcut(QKeySequence("Ctrl+V"));
00205 connect(compareNodeBeforeFP, SIGNAL(triggered()),
00206 canvas, SLOT(startCompareNodesBeforeFP()));
00207
00208 connect(canvas, SIGNAL(addedBookmark(const QString&)),
00209 this, SLOT(addBookmark(const QString&)));
00210 connect(canvas, SIGNAL(removedBookmark(int)),
00211 this, SLOT(removeBookmark(int)));
00212
00213 nullBookmark = new QAction("<none>",this);
00214 nullBookmark->setCheckable(true);
00215 nullBookmark->setChecked(false);
00216 nullBookmark->setEnabled(false);
00217 bookmarksGroup = new QActionGroup(this);
00218 bookmarksGroup->setExclusive(false);
00219 bookmarksGroup->addAction(nullBookmark);
00220 connect(bookmarksGroup, SIGNAL(triggered(QAction*)),
00221 this, SLOT(selectBookmark(QAction*)));
00222
00223 bookmarksMenu = new QMenu("Bookmarks");
00224 connect(bookmarksMenu, SIGNAL(aboutToShow()),
00225 this, SLOT(populateBookmarksMenu()));
00226
00227
00228 setPath = new QAction("Set path", this);
00229 setPath->setShortcut(QKeySequence("Shift+P"));
00230 connect(setPath, SIGNAL(triggered()), canvas, SLOT(setPath()));
00231
00232 inspectPath = new QAction("Inspect path", this);
00233 inspectPath->setShortcut(QKeySequence("Shift+I"));
00234 connect(inspectPath, SIGNAL(triggered()), canvas, SLOT(inspectPath()));
00235
00236 showNodeStats = new QAction("Node statistics", this);
00237 showNodeStats->setShortcut(QKeySequence("S"));
00238 connect(showNodeStats, SIGNAL(triggered()),
00239 this, SLOT(showStats()));
00240
00241 addAction(inspect);
00242 addAction(inspectBeforeFP);
00243 addAction(compareNode);
00244 addAction(compareNodeBeforeFP);
00245 addAction(stop);
00246 addAction(reset);
00247 addAction(navUp);
00248 addAction(navDown);
00249 addAction(navLeft);
00250 addAction(navRight);
00251 addAction(navRoot);
00252 addAction(navNextSol);
00253 addAction(navPrevSol);
00254
00255 addAction(searchNext);
00256 addAction(searchAll);
00257 addAction(toggleHidden);
00258 addAction(hideFailed);
00259 addAction(unhideAll);
00260 addAction(toggleStop);
00261 addAction(unstopAll);
00262 addAction(zoomToFit);
00263 addAction(center);
00264 addAction(exportPDF);
00265 addAction(exportWholeTreePDF);
00266 addAction(print);
00267
00268 addAction(setPath);
00269 addAction(inspectPath);
00270 addAction(showNodeStats);
00271
00272 nullSolutionInspector = new QAction("<none>",this);
00273 nullSolutionInspector->setCheckable(true);
00274 nullSolutionInspector->setChecked(false);
00275 nullSolutionInspector->setEnabled(false);
00276 solutionInspectorGroup = new QActionGroup(this);
00277 solutionInspectorGroup->setExclusive(false);
00278 solutionInspectorGroup->addAction(nullSolutionInspector);
00279 connect(solutionInspectorGroup, SIGNAL(triggered(QAction*)),
00280 this, SLOT(selectSolutionInspector(QAction*)));
00281
00282 nullDoubleClickInspector = new QAction("<none>",this);
00283 nullDoubleClickInspector->setCheckable(true);
00284 nullDoubleClickInspector->setChecked(false);
00285 nullDoubleClickInspector->setEnabled(false);
00286 doubleClickInspectorGroup = new QActionGroup(this);
00287 doubleClickInspectorGroup->setExclusive(false);
00288 doubleClickInspectorGroup->addAction(nullDoubleClickInspector);
00289 connect(doubleClickInspectorGroup, SIGNAL(triggered(QAction*)),
00290 this, SLOT(selectDoubleClickInspector(QAction*)));
00291
00292 nullMoveInspector = new QAction("<none>",this);
00293 nullMoveInspector->setCheckable(true);
00294 nullMoveInspector->setChecked(false);
00295 nullMoveInspector->setEnabled(false);
00296 moveInspectorGroup = new QActionGroup(this);
00297 moveInspectorGroup->setExclusive(false);
00298 moveInspectorGroup->addAction(nullMoveInspector);
00299 connect(moveInspectorGroup, SIGNAL(triggered(QAction*)),
00300 this, SLOT(selectMoveInspector(QAction*)));
00301
00302 nullComparator = new QAction("<none>",this);
00303 nullComparator->setCheckable(true);
00304 nullComparator->setChecked(false);
00305 nullComparator->setEnabled(false);
00306 comparatorGroup = new QActionGroup(this);
00307 comparatorGroup->setExclusive(false);
00308 comparatorGroup->addAction(nullComparator);
00309 connect(comparatorGroup, SIGNAL(triggered(QAction*)),
00310 this, SLOT(selectComparator(QAction*)));
00311
00312 solutionInspectorMenu = new QMenu("Solution inspectors");
00313 solutionInspectorMenu->addActions(solutionInspectorGroup->actions());
00314 doubleClickInspectorMenu = new QMenu("Double click inspectors");
00315 doubleClickInspectorMenu->addActions(
00316 doubleClickInspectorGroup->actions());
00317 moveInspectorMenu = new QMenu("Move inspectors");
00318 moveInspectorMenu->addActions(moveInspectorGroup->actions());
00319 comparatorMenu = new QMenu("Comparators");
00320 comparatorMenu->addActions(comparatorGroup->actions());
00321
00322 inspectGroup = new QActionGroup(this);
00323 connect(inspectGroup, SIGNAL(triggered(QAction*)),
00324 this, SLOT(inspectWithAction(QAction*)));
00325 inspectBeforeFPGroup = new QActionGroup(this);
00326 connect(inspectBeforeFPGroup, SIGNAL(triggered(QAction*)),
00327 this, SLOT(inspectBeforeFPWithAction(QAction*)));
00328
00329 inspectNodeMenu = new QMenu("Inspect");
00330 inspectNodeMenu->addAction(inspect);
00331 connect(inspectNodeMenu, SIGNAL(aboutToShow()),
00332 this, SLOT(populateInspectors()));
00333
00334 inspectNodeBeforeFPMenu = new QMenu("Inspect before fixpoint");
00335 inspectNodeBeforeFPMenu->addAction(inspectBeforeFP);
00336 connect(inspectNodeBeforeFPMenu, SIGNAL(aboutToShow()),
00337 this, SLOT(populateInspectors()));
00338 populateInspectors();
00339
00340 contextMenu = new QMenu(this);
00341 contextMenu->addMenu(inspectNodeMenu);
00342 contextMenu->addMenu(inspectNodeBeforeFPMenu);
00343 contextMenu->addAction(compareNode);
00344 contextMenu->addAction(compareNodeBeforeFP);
00345 contextMenu->addAction(showNodeStats);
00346 contextMenu->addAction(center);
00347
00348 contextMenu->addSeparator();
00349
00350 contextMenu->addAction(searchNext);
00351 contextMenu->addAction(searchAll);
00352
00353 contextMenu->addSeparator();
00354
00355 contextMenu->addAction(toggleHidden);
00356 contextMenu->addAction(hideFailed);
00357 contextMenu->addAction(unhideAll);
00358
00359 contextMenu->addAction(toggleStop);
00360 contextMenu->addAction(unstopAll);
00361
00362 contextMenu->addSeparator();
00363
00364 contextMenu->addMenu(bookmarksMenu);
00365 contextMenu->addAction(setPath);
00366 contextMenu->addAction(inspectPath);
00367
00368 contextMenu->addSeparator();
00369
00370 contextMenu->addMenu(doubleClickInspectorMenu);
00371 contextMenu->addMenu(solutionInspectorMenu);
00372 contextMenu->addMenu(moveInspectorMenu);
00373
00374 connect(autoZoomButton, SIGNAL(toggled(bool)), canvas,
00375 SLOT(setAutoZoom(bool)));
00376
00377 connect(canvas, SIGNAL(autoZoomChanged(bool)),
00378 autoZoomButton, SLOT(setChecked(bool)));
00379
00380 {
00381 unsigned int i = 0;
00382 while (opt.inspect.solution(i)) {
00383 addSolutionInspector(opt.inspect.solution(i++));
00384 }
00385 i = 0;
00386 while (opt.inspect.click(i)) {
00387 addDoubleClickInspector(opt.inspect.click(i++));
00388 }
00389 i = 0;
00390 while (opt.inspect.move(i)) {
00391 addMoveInspector(opt.inspect.move(i++));
00392 }
00393 i = 0;
00394 while (opt.inspect.compare(i)) {
00395 addComparator(opt.inspect.compare(i++));
00396 }
00397 }
00398
00399
00400 layout->addWidget(scrollArea, 0,0,-1,1);
00401 layout->addWidget(canvas->scaleBar, 1,1, Qt::AlignHCenter);
00402 layout->addWidget(autoZoomButton, 0,1, Qt::AlignHCenter);
00403
00404 setLayout(layout);
00405
00406 canvas->show();
00407
00408 resize(500, 400);
00409
00410
00411 QMetaObject::connectSlotsByName(this);
00412 }
00413
00414 void
00415 Gist::resizeEvent(QResizeEvent*) {
00416 canvas->resizeToOuter();
00417 }
00418
00419 void
00420 Gist::addInspector(Inspector* i0, QAction*& nas, QAction*& nad,
00421 QAction*&nam) {
00422 if (doubleClickInspectorGroup->
00423 actions().indexOf(nullDoubleClickInspector) != -1) {
00424 doubleClickInspectorGroup->removeAction(nullDoubleClickInspector);
00425 solutionInspectorGroup->removeAction(nullSolutionInspector);
00426 moveInspectorGroup->removeAction(nullMoveInspector);
00427 }
00428 canvas->addSolutionInspector(i0);
00429 canvas->addDoubleClickInspector(i0);
00430 canvas->addMoveInspector(i0);
00431
00432 nas = new QAction(i0->name().c_str(), this);
00433 nas->setCheckable(true);
00434 solutionInspectorGroup->addAction(nas);
00435 solutionInspectorMenu->clear();
00436 solutionInspectorMenu->addActions(solutionInspectorGroup->actions());
00437
00438 nad = new QAction(i0->name().c_str(), this);
00439 nad->setCheckable(true);
00440 doubleClickInspectorGroup->addAction(nad);
00441 doubleClickInspectorMenu->clear();
00442 doubleClickInspectorMenu->addActions(
00443 doubleClickInspectorGroup->actions());
00444
00445 nam = new QAction(i0->name().c_str(), this);
00446 nam->setCheckable(true);
00447 moveInspectorGroup->addAction(nam);
00448 moveInspectorMenu->clear();
00449 moveInspectorMenu->addActions(
00450 moveInspectorGroup->actions());
00451
00452 QAction* ia = new QAction(i0->name().c_str(), this);
00453 inspectGroup->addAction(ia);
00454 QAction* ibfpa = new QAction(i0->name().c_str(), this);
00455 inspectBeforeFPGroup->addAction(ibfpa);
00456
00457 if (inspectGroup->actions().size() < 10) {
00458 ia->setShortcut(QKeySequence(
00459 QString("").setNum(inspectGroup->actions().size())));
00460 ibfpa->setShortcut(QKeySequence(QString("Ctrl+")+
00461 QString("").setNum(inspectBeforeFPGroup->actions().size())));
00462 }
00463 }
00464
00465 void
00466 Gist::addSolutionInspector(Inspector* ins) {
00467 QAction* nas;
00468 QAction* nad;
00469 QAction* nam;
00470 if (doubleClickInspectorGroup->
00471 actions().indexOf(nullDoubleClickInspector) == -1) {
00472 QList<QAction*> is = solutionInspectorGroup->actions();
00473 for (int i=0; i<is.size(); i++) {
00474 canvas->activateSolutionInspector(i,false);
00475 is[i]->setChecked(false);
00476 }
00477 }
00478 addInspector(ins, nas,nad,nam);
00479 nas->setChecked(true);
00480 selectSolutionInspector(nas);
00481 }
00482
00483 void
00484 Gist::addDoubleClickInspector(Inspector* ins) {
00485 QAction* nas;
00486 QAction* nad;
00487 QAction* nam;
00488 if (doubleClickInspectorGroup->
00489 actions().indexOf(nullDoubleClickInspector) == -1) {
00490 QList<QAction*> is = doubleClickInspectorGroup->actions();
00491 for (int i=0; i<is.size(); i++) {
00492 canvas->activateDoubleClickInspector(i,false);
00493 is[i]->setChecked(false);
00494 }
00495 }
00496 addInspector(ins, nas,nad,nam);
00497 nad->setChecked(true);
00498 selectDoubleClickInspector(nad);
00499 }
00500
00501 void
00502 Gist::addMoveInspector(Inspector* ins) {
00503 QAction* nas;
00504 QAction* nad;
00505 QAction* nam;
00506 if (doubleClickInspectorGroup->
00507 actions().indexOf(nullDoubleClickInspector) == -1) {
00508 QList<QAction*> is = moveInspectorGroup->actions();
00509 for (int i=0; i<is.size(); i++) {
00510 canvas->activateMoveInspector(i,false);
00511 is[i]->setChecked(false);
00512 }
00513 }
00514 addInspector(ins, nas,nad,nam);
00515 nam->setChecked(true);
00516 selectMoveInspector(nam);
00517 }
00518
00519 void
00520 Gist::addComparator(Comparator* c) {
00521 if (comparatorGroup->actions().indexOf(nullComparator) == -1) {
00522 QList<QAction*> is = comparatorGroup->actions();
00523 for (int i=0; i<is.size(); i++) {
00524 canvas->activateComparator(i,false);
00525 is[i]->setChecked(false);
00526 }
00527 } else {
00528 comparatorGroup->removeAction(nullComparator);
00529 }
00530 canvas->addComparator(c);
00531
00532 QAction* ncs = new QAction(c->name().c_str(), this);
00533 ncs->setCheckable(true);
00534 comparatorGroup->addAction(ncs);
00535 comparatorMenu->clear();
00536 comparatorMenu->addActions(comparatorGroup->actions());
00537 ncs->setChecked(true);
00538 selectComparator(ncs);
00539 }
00540
00541 Gist::~Gist(void) { delete canvas; }
00542
00543 void
00544 Gist::on_canvas_contextMenu(QContextMenuEvent* event) {
00545 contextMenu->popup(event->globalPos());
00546 }
00547
00548 void
00549 Gist::on_canvas_statusChanged(VisualNode* n, const Statistics& stats,
00550 bool finished) {
00551 if (!finished) {
00552 inspect->setEnabled(false);
00553 inspectGroup->setEnabled(false);
00554 inspectBeforeFP->setEnabled(false);
00555 inspectBeforeFPGroup->setEnabled(false);
00556 compareNode->setEnabled(false);
00557 compareNodeBeforeFP->setEnabled(false);
00558 stop->setEnabled(true);
00559 reset->setEnabled(false);
00560 navUp->setEnabled(false);
00561 navDown->setEnabled(false);
00562 navLeft->setEnabled(false);
00563 navRight->setEnabled(false);
00564 navRoot->setEnabled(false);
00565 navNextSol->setEnabled(false);
00566 navPrevSol->setEnabled(false);
00567
00568 searchNext->setEnabled(false);
00569 searchAll->setEnabled(false);
00570 toggleHidden->setEnabled(false);
00571 hideFailed->setEnabled(false);
00572 unhideAll->setEnabled(false);
00573
00574 toggleStop->setEnabled(false);
00575 unstopAll->setEnabled(false);
00576
00577 zoomToFit->setEnabled(false);
00578 center->setEnabled(false);
00579 exportPDF->setEnabled(false);
00580 exportWholeTreePDF->setEnabled(false);
00581 print->setEnabled(false);
00582
00583 setPath->setEnabled(false);
00584 inspectPath->setEnabled(false);
00585 bookmarkNode->setEnabled(false);
00586 bookmarksGroup->setEnabled(false);
00587 } else {
00588 stop->setEnabled(false);
00589 reset->setEnabled(true);
00590
00591 if ( (n->isOpen() || n->hasOpenChildren()) && (!n->isHidden()) ) {
00592 searchNext->setEnabled(true);
00593 searchAll->setEnabled(true);
00594 } else {
00595 searchNext->setEnabled(false);
00596 searchAll->setEnabled(false);
00597 }
00598 if (n->getNumberOfChildren() > 0) {
00599 navDown->setEnabled(true);
00600 toggleHidden->setEnabled(true);
00601 hideFailed->setEnabled(true);
00602 unhideAll->setEnabled(true);
00603 unstopAll->setEnabled(true);
00604 } else {
00605 navDown->setEnabled(false);
00606 toggleHidden->setEnabled(false);
00607 hideFailed->setEnabled(false);
00608 unhideAll->setEnabled(false);
00609 unstopAll->setEnabled(false);
00610 }
00611
00612 toggleStop->setEnabled(n->getStatus() == STOP ||
00613 n->getStatus() == UNSTOP);
00614
00615 inspect->setEnabled(true);
00616 if (n->getStatus() == UNDETERMINED) {
00617 inspectGroup->setEnabled(false);
00618 inspectBeforeFP->setEnabled(false);
00619 inspectBeforeFPGroup->setEnabled(false);
00620 compareNode->setEnabled(false);
00621 compareNodeBeforeFP->setEnabled(false);
00622 } else {
00623 inspectGroup->setEnabled(true);
00624 inspectBeforeFP->setEnabled(true);
00625 inspectBeforeFPGroup->setEnabled(true);
00626 compareNode->setEnabled(true);
00627 compareNodeBeforeFP->setEnabled(true);
00628 }
00629
00630 VisualNode* p = n->getParent();
00631 if (p == NULL) {
00632 inspectBeforeFP->setEnabled(false);
00633 inspectBeforeFPGroup->setEnabled(false);
00634 navRoot->setEnabled(false);
00635 navUp->setEnabled(false);
00636 navRight->setEnabled(false);
00637 navLeft->setEnabled(false);
00638 } else {
00639 navRoot->setEnabled(true);
00640 navUp->setEnabled(true);
00641 unsigned int alt = n->getAlternative();
00642 navRight->setEnabled(alt + 1 < p->getNumberOfChildren());
00643 navLeft->setEnabled(alt > 0);
00644 }
00645
00646 VisualNode* root = n;
00647 while (!root->isRoot())
00648 root = root->getParent();
00649 NextSolCursor nsc(n, false);
00650 PreorderNodeVisitor<NextSolCursor> nsv(nsc);
00651 while (nsv.next()) {}
00652 navNextSol->setEnabled(nsv.getCursor().node() != root);
00653
00654 NextSolCursor psc(n, true);
00655 PreorderNodeVisitor<NextSolCursor> psv(psc);
00656 while (psv.next()) {}
00657 navPrevSol->setEnabled(psv.getCursor().node() != root);
00658
00659 zoomToFit->setEnabled(true);
00660 center->setEnabled(true);
00661 exportPDF->setEnabled(true);
00662 exportWholeTreePDF->setEnabled(true);
00663 print->setEnabled(true);
00664
00665 setPath->setEnabled(true);
00666 inspectPath->setEnabled(true);
00667
00668 bookmarkNode->setEnabled(true);
00669 bookmarksGroup->setEnabled(true);
00670 }
00671 emit statusChanged(stats,finished);
00672 }
00673
00674 void
00675 Gist::inspectWithAction(QAction* a) {
00676 canvas->inspectCurrentNode(true,inspectGroup->actions().indexOf(a));
00677 }
00678
00679 void
00680 Gist::inspectBeforeFPWithAction(QAction* a) {
00681 canvas->inspectCurrentNode(false,
00682 inspectBeforeFPGroup->actions().indexOf(a));
00683 }
00684
00685 bool
00686 Gist::finish(void) {
00687 return canvas->finish();
00688 }
00689
00690 void
00691 Gist::selectDoubleClickInspector(QAction* a) {
00692 canvas->activateDoubleClickInspector(
00693 doubleClickInspectorGroup->actions().indexOf(a),
00694 a->isChecked());
00695 }
00696 void
00697 Gist::selectSolutionInspector(QAction* a) {
00698 canvas->activateSolutionInspector(
00699 solutionInspectorGroup->actions().indexOf(a),
00700 a->isChecked());
00701 }
00702 void
00703 Gist::selectMoveInspector(QAction* a) {
00704 canvas->activateMoveInspector(
00705 moveInspectorGroup->actions().indexOf(a),
00706 a->isChecked());
00707 }
00708 void
00709 Gist::selectComparator(QAction* a) {
00710 canvas->activateComparator(comparatorGroup->actions().indexOf(a),
00711 a->isChecked());
00712 }
00713 void
00714 Gist::selectBookmark(QAction* a) {
00715 int idx = bookmarksGroup->actions().indexOf(a);
00716 canvas->setCurrentNode(canvas->bookmarks[idx]);
00717 canvas->centerCurrentNode();
00718 }
00719
00720 void
00721 Gist::addBookmark(const QString& id) {
00722 if (bookmarksGroup->actions().indexOf(nullBookmark) != -1) {
00723 bookmarksGroup->removeAction(nullBookmark);
00724 }
00725
00726 QAction* nb = new QAction(id, this);
00727 nb->setCheckable(true);
00728 bookmarksGroup->addAction(nb);
00729 }
00730
00731 void
00732 Gist::removeBookmark(int idx) {
00733 QAction* a = bookmarksGroup->actions()[idx];
00734 bookmarksGroup->removeAction(a);
00735 if (bookmarksGroup->actions().size() == 0) {
00736 bookmarksGroup->addAction(nullBookmark);
00737 }
00738 }
00739
00740 void
00741 Gist::populateBookmarksMenu(void) {
00742 bookmarksMenu->clear();
00743 bookmarksMenu->addAction(bookmarkNode);
00744 bookmarksMenu->addSeparator();
00745 bookmarksMenu->addActions(bookmarksGroup->actions());
00746 }
00747
00748 void
00749 Gist::populateInspectors(void) {
00750 inspectNodeMenu->clear();
00751 inspectNodeMenu->addAction(inspect);
00752 inspectNodeMenu->addSeparator();
00753 inspectNodeMenu->addActions(inspectGroup->actions());
00754 inspectNodeBeforeFPMenu->clear();
00755 inspectNodeBeforeFPMenu->addAction(inspectBeforeFP);
00756 inspectNodeBeforeFPMenu->addSeparator();
00757 inspectNodeBeforeFPMenu->addActions(inspectBeforeFPGroup->actions());
00758 }
00759
00760 void
00761 Gist::setAutoHideFailed(bool b) { canvas->setAutoHideFailed(b); }
00762 void
00763 Gist::setAutoZoom(bool b) { canvas->setAutoZoom(b); }
00764 bool
00765 Gist::getAutoHideFailed(void) { return canvas->getAutoHideFailed(); }
00766 bool
00767 Gist::getAutoZoom(void) { return canvas->getAutoZoom(); }
00768 void
00769 Gist::setRefresh(int i) { canvas->setRefresh(i); }
00770 bool
00771 Gist::getSmoothScrollAndZoom(void) {
00772 return canvas->getSmoothScrollAndZoom();
00773 }
00774 void
00775 Gist::setSmoothScrollAndZoom(bool b) {
00776 canvas->setSmoothScrollAndZoom(b);
00777 }
00778 void
00779 Gist::setRecompDistances(int c_d, int a_d) {
00780 canvas->setRecompDistances(c_d, a_d);
00781 }
00782
00783 int
00784 Gist::getCd(void) {
00785 return canvas->c_d;
00786 }
00787 int
00788 Gist::getAd(void) {
00789 return canvas->a_d;
00790 }
00791
00792 void
00793 Gist::setShowCopies(bool b) {
00794 canvas->setShowCopies(b);
00795 }
00796 bool
00797 Gist::getShowCopies(void) {
00798 return canvas->getShowCopies();
00799 }
00800
00801 void
00802 Gist::showStats(void) {
00803 nodeStatInspector->showStats();
00804 canvas->emitStatusChanged();
00805 }
00806
00807 }}
00808
00809