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/mainwindow.hh>
00039 #include <gecode/gist/preferences.hh>
00040 #include <gecode/gist/nodewidget.hh>
00041 #include <gecode/gist/drawingcursor.hh>
00042
00043 #include <gecode/gist/gecodelogo.hh>
00044
00045 namespace Gecode { namespace Gist {
00046
00047 AboutGist::AboutGist(QWidget* parent) : QDialog(parent) {
00048
00049 Logos logos;
00050 QPixmap myPic;
00051 myPic.loadFromData(logos.logo, logos.logoSize);
00052
00053 QPixmap myPic2;
00054 myPic2.loadFromData(logos.gistLogo, logos.gistLogoSize);
00055 setWindowIcon(myPic2);
00056
00057
00058 setMinimumSize(300, 240);
00059 setMaximumSize(300, 240);
00060 QVBoxLayout* layout = new QVBoxLayout();
00061 QLabel* logo = new QLabel();
00062 logo->setPixmap(myPic);
00063 layout->addWidget(logo, 0, Qt::AlignCenter);
00064 QLabel* aboutLabel =
00065 new QLabel(tr("<h2>Gist</h2>"
00066 "<p><b>The Gecode Interactive Search Tool</b</p> "
00067 "<p>You can find more information about Gecode and Gist "
00068 "at</p>"
00069 "<p><a href='http://www.gecode.org'>www.gecode.org</a>"
00070 "</p"));
00071 aboutLabel->setOpenExternalLinks(true);
00072 aboutLabel->setWordWrap(true);
00073 aboutLabel->setAlignment(Qt::AlignCenter);
00074 layout->addWidget(aboutLabel);
00075 setLayout(layout);
00076 setWindowTitle(tr("About Gist"));
00077 setAttribute(Qt::WA_QuitOnClose, false);
00078 setAttribute(Qt::WA_DeleteOnClose, false);
00079 }
00080
00081 GistMainWindow::GistMainWindow(Space* root, bool bab,
00082 const Options& opt0)
00083 : opt(opt0), aboutGist(this) {
00084 c = new Gist(root,bab,this,opt);
00085 setCentralWidget(c);
00086 setWindowTitle(tr("Gist"));
00087
00088 Logos logos;
00089 QPixmap myPic;
00090 myPic.loadFromData(logos.gistLogo, logos.gistLogoSize);
00091 setWindowIcon(myPic);
00092
00093 resize(500,500);
00094 setMinimumSize(400, 200);
00095
00096 menuBar = new QMenuBar(0);
00097
00098 QMenu* fileMenu = menuBar->addMenu(tr("&File"));
00099 fileMenu->addAction(c->print);
00100 #if QT_VERSION >= 0x040400
00101 fileMenu->addAction(c->exportWholeTreePDF);
00102 #endif
00103 QAction* quitAction = fileMenu->addAction(tr("Quit"));
00104 quitAction->setShortcut(QKeySequence("Ctrl+Q"));
00105 connect(quitAction, SIGNAL(triggered()),
00106 this, SLOT(close()));
00107 prefAction = fileMenu->addAction(tr("Preferences"));
00108 connect(prefAction, SIGNAL(triggered()), this, SLOT(preferences()));
00109
00110 QMenu* nodeMenu = menuBar->addMenu(tr("&Node"));
00111
00112 inspectNodeMenu = new QMenu("Inspect");
00113 inspectNodeMenu->addAction(c->inspect);
00114 connect(inspectNodeMenu, SIGNAL(aboutToShow()),
00115 this, SLOT(populateInspectors()));
00116
00117 inspectNodeBeforeFPMenu = new QMenu("Inspect before fixpoint");
00118 inspectNodeBeforeFPMenu->addAction(c->inspectBeforeFP);
00119 connect(inspectNodeBeforeFPMenu, SIGNAL(aboutToShow()),
00120 this, SLOT(populateInspectors()));
00121 populateInspectors();
00122
00123 nodeMenu->addMenu(inspectNodeMenu);
00124 nodeMenu->addMenu(inspectNodeBeforeFPMenu);
00125 nodeMenu->addAction(c->compareNode);
00126 nodeMenu->addAction(c->compareNodeBeforeFP);
00127 nodeMenu->addAction(c->setPath);
00128 nodeMenu->addAction(c->inspectPath);
00129 nodeMenu->addAction(c->showNodeStats);
00130 bookmarksMenu = new QMenu("Bookmarks");
00131 bookmarksMenu->addAction(c->bookmarkNode);
00132 connect(bookmarksMenu, SIGNAL(aboutToShow()),
00133 this, SLOT(populateBookmarks()));
00134 nodeMenu->addMenu(bookmarksMenu);
00135 nodeMenu->addSeparator();
00136 nodeMenu->addAction(c->navUp);
00137 nodeMenu->addAction(c->navDown);
00138 nodeMenu->addAction(c->navLeft);
00139 nodeMenu->addAction(c->navRight);
00140 nodeMenu->addAction(c->navRoot);
00141 nodeMenu->addAction(c->navNextSol);
00142 nodeMenu->addAction(c->navPrevSol);
00143 nodeMenu->addSeparator();
00144 nodeMenu->addAction(c->toggleHidden);
00145 nodeMenu->addAction(c->hideFailed);
00146 nodeMenu->addAction(c->unhideAll);
00147 nodeMenu->addAction(c->toggleStop);
00148 nodeMenu->addAction(c->unstopAll);
00149 nodeMenu->addSeparator();
00150 nodeMenu->addAction(c->zoomToFit);
00151 nodeMenu->addAction(c->center);
00152 #if QT_VERSION >= 0x040400
00153 nodeMenu->addAction(c->exportPDF);
00154 #endif
00155
00156 QMenu* searchMenu = menuBar->addMenu(tr("&Search"));
00157 searchMenu->addAction(c->searchNext);
00158 searchMenu->addAction(c->searchAll);
00159 searchMenu->addSeparator();
00160 searchMenu->addAction(c->stop);
00161 searchMenu->addSeparator();
00162 searchMenu->addAction(c->reset);
00163
00164 QMenu* toolsMenu = menuBar->addMenu(tr("&Tools"));
00165 doubleClickInspectorsMenu = new QMenu("Double click Inspectors");
00166 connect(doubleClickInspectorsMenu, SIGNAL(aboutToShow()),
00167 this, SLOT(populateInspectorSelection()));
00168 toolsMenu->addMenu(doubleClickInspectorsMenu);
00169 solutionInspectorsMenu = new QMenu("Solution inspectors");
00170 connect(solutionInspectorsMenu, SIGNAL(aboutToShow()),
00171 this, SLOT(populateInspectorSelection()));
00172 toolsMenu->addMenu(solutionInspectorsMenu);
00173 moveInspectorsMenu = new QMenu("Move inspectors");
00174 connect(moveInspectorsMenu, SIGNAL(aboutToShow()),
00175 this, SLOT(populateInspectorSelection()));
00176 toolsMenu->addMenu(moveInspectorsMenu);
00177 comparatorsMenu = new QMenu("Comparators");
00178 connect(comparatorsMenu, SIGNAL(aboutToShow()),
00179 this, SLOT(populateInspectorSelection()));
00180 toolsMenu->addMenu(comparatorsMenu);
00181
00182 QMenu* helpMenu = menuBar->addMenu(tr("&Help"));
00183 QAction* aboutAction = helpMenu->addAction(tr("About"));
00184 connect(aboutAction, SIGNAL(triggered()),
00185 this, SLOT(about()));
00186
00187
00188 #ifndef Q_WS_MAC
00189 setMenuBar(menuBar);
00190 #endif
00191
00192
00193 QWidget* stw = new QWidget();
00194 QHBoxLayout* hbl = new QHBoxLayout();
00195 hbl->setContentsMargins(0,0,0,0);
00196 wmpLabel = new QLabel("");
00197 hbl->addWidget(wmpLabel);
00198 hbl->addWidget(new QLabel("Depth:"));
00199 depthLabel = new QLabel("0");
00200 hbl->addWidget(depthLabel);
00201 hbl->addWidget(new NodeWidget(SOLVED));
00202 solvedLabel = new QLabel("0");
00203 hbl->addWidget(solvedLabel);
00204 hbl->addWidget(new NodeWidget(FAILED));
00205 failedLabel = new QLabel("0");
00206 hbl->addWidget(failedLabel);
00207 hbl->addWidget(new NodeWidget(BRANCH));
00208 choicesLabel = new QLabel("0");
00209 hbl->addWidget(choicesLabel);
00210 hbl->addWidget(new NodeWidget(UNDETERMINED));
00211 openLabel = new QLabel(" 0");
00212 hbl->addWidget(openLabel);
00213 stw->setLayout(hbl);
00214 statusBar()->addPermanentWidget(stw);
00215
00216 isSearching = false;
00217 statusBar()->showMessage("Ready");
00218
00219 connect(c,SIGNAL(statusChanged(const Statistics&,bool)),
00220 this,SLOT(statusChanged(const Statistics&,bool)));
00221
00222 connect(c,SIGNAL(searchFinished(void)),this,SLOT(close(void)));
00223
00224 preferences(true);
00225 show();
00226 c->reset->trigger();
00227 }
00228
00229 void
00230 GistMainWindow::closeEvent(QCloseEvent* event) {
00231 if (c->finish())
00232 event->accept();
00233 else
00234 event->ignore();
00235 }
00236
00237 void
00238 GistMainWindow::statusChanged(const Statistics& stats, bool finished) {
00239 if (stats.maxDepth==0) {
00240 isSearching = false;
00241 statusBar()->showMessage("Ready");
00242 prefAction->setEnabled(true);
00243 } else if (isSearching && finished) {
00244 isSearching = false;
00245 double ms = searchTimer.stop();
00246 double s = std::floor(ms / 1000.0);
00247 ms -= s*1000.0;
00248 double m = std::floor(s / 60.0);
00249 s -= m*60.0;
00250 double h = std::floor(m / 60.0);
00251 m -= h*60.0;
00252
00253
00254
00255
00256
00257
00258
00259
00260
00261
00262
00263
00264 statusBar()->showMessage("Ready");
00265 prefAction->setEnabled(true);
00266 } else if (!isSearching && !finished) {
00267 prefAction->setEnabled(false);
00268 statusBar()->showMessage("Searching");
00269 isSearching = true;
00270 searchTimer.start();
00271 }
00272 depthLabel->setNum(stats.maxDepth);
00273 solvedLabel->setNum(stats.solutions);
00274 failedLabel->setNum(stats.failures);
00275 choicesLabel->setNum(stats.choices);
00276 openLabel->setNum(stats.undetermined);
00277 if (stats.wmp)
00278 wmpLabel->setText("WMP");
00279 else
00280 wmpLabel->setText("");
00281 }
00282
00283 void
00284 GistMainWindow::about(void) {
00285 aboutGist.show();
00286 }
00287
00288 void
00289 GistMainWindow::preferences(bool setup) {
00290 PreferencesDialog pd(opt, this);
00291 if (setup) {
00292 c->setAutoZoom(pd.zoom);
00293 }
00294 if (setup || pd.exec() == QDialog::Accepted) {
00295 c->setAutoHideFailed(pd.hideFailed);
00296 c->setRefresh(pd.refresh);
00297 c->setRefreshPause(pd.refreshPause);
00298 c->setSmoothScrollAndZoom(pd.smoothScrollAndZoom);
00299 c->setRecompDistances(pd.c_d,pd.a_d);
00300 opt.c_d = pd.c_d;
00301 opt.a_d = pd.a_d;
00302 c->setShowCopies(pd.copies);
00303 }
00304 }
00305
00306 void
00307 GistMainWindow::populateInspectorSelection(void) {
00308 doubleClickInspectorsMenu->clear();
00309 doubleClickInspectorsMenu->addActions(
00310 c->doubleClickInspectorGroup->actions());
00311 solutionInspectorsMenu->clear();
00312 solutionInspectorsMenu->addActions(c->solutionInspectorGroup->actions());
00313 moveInspectorsMenu->clear();
00314 moveInspectorsMenu->addActions(c->moveInspectorGroup->actions());
00315 comparatorsMenu->clear();
00316 comparatorsMenu->addActions(c->comparatorGroup->actions());
00317 }
00318
00319 void
00320 GistMainWindow::populateBookmarks(void) {
00321 bookmarksMenu->clear();
00322 bookmarksMenu->addAction(c->bookmarkNode);
00323 bookmarksMenu->addSeparator();
00324 bookmarksMenu->addActions(c->bookmarksGroup->actions());
00325 }
00326
00327 void
00328 GistMainWindow::populateInspectors(void) {
00329 inspectNodeMenu->clear();
00330 inspectNodeMenu->addAction(c->inspect);
00331 inspectNodeMenu->addSeparator();
00332 inspectNodeMenu->addActions(c->inspectGroup->actions());
00333 inspectNodeBeforeFPMenu->clear();
00334 inspectNodeBeforeFPMenu->addAction(c->inspectBeforeFP);
00335 inspectNodeBeforeFPMenu->addSeparator();
00336 inspectNodeBeforeFPMenu->addActions(c->inspectBeforeFPGroup->actions());
00337 }
00338
00339 }}
00340
00341