38 #include <QtGui/QPainter>
40 #include <QPrintDialog>
54 namespace Gecode {
namespace Gist {
59 , mutex(QMutex::Recursive)
60 , layoutMutex(QMutex::Recursive)
62 , compareNodes(false), compareNodesBeforeFP(false)
63 , autoHideFailed(true), autoZoom(false)
64 , refresh(500), refreshPause(0), smoothScrollAndZoom(false)
65 , moveDuringSearch(false)
67 , scrollTimeLine(1000), targetX(0), sourceX(0), targetY(0), sourceY(0)
68 , targetW(0), targetH(0), targetScale(0)
69 , layoutDoneTimerId(0) {
70 QMutexLocker locker(&
mutex);
80 int rootIdx =
na->allocate(rootSpace);
81 assert(rootIdx == 0); (void) rootIdx;
89 setAutoFillBackground(
true);
98 Qt::BlockingQueuedConnection);
100 this, SLOT(inspectSolution(
const Space*)));
104 Qt::BlockingQueuedConnection);
112 scaleBar =
new QSlider(Qt::Vertical,
this);
113 scaleBar->setObjectName(
"scaleBar");
117 connect(
scaleBar, SIGNAL(valueChanged(
int)),
127 qRegisterMetaType<Statistics>(
"Statistics");
174 comparators.append(QPair<Comparator*,bool>(c,
false));
187 QSize viewport_size =
size();
188 QAbstractScrollArea* sa =
189 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
192 zoomx = viewport_size.width()/2;
194 zoomy = viewport_size.height()/2;
196 int xoff = (sa->horizontalScrollBar()->value()+zoomx)/
scale;
197 int yoff = (sa->verticalScrollBar()->value()+zoomy)/
scale;
202 scale = (
static_cast<double>(scale0)) / 100.0;
210 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
211 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
212 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
213 sa->verticalScrollBar()->setPageStep(viewport_size.height());
220 sa->horizontalScrollBar()->setValue(xoff-zoomx);
221 sa->verticalScrollBar()->setValue(yoff-zoomy);
229 QMutexLocker locker(&
mutex);
241 QSize viewport_size =
size();
242 QAbstractScrollArea* sa =
243 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
244 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
245 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
246 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
247 sa->verticalScrollBar()->setPageStep(viewport_size.height());
266 QSize viewport_size =
size();
267 QAbstractScrollArea* sa =
268 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
269 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
270 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
299 SearcherThread::updateCanvas(
void) {
325 int scale0 =
static_cast<int>(t->
scale*100);
327 QWidget*
p = t->parentWidget();
330 static_cast<double>(p->width()) / (bb.right - bb.left +
333 static_cast<double>(p->height()) /
336 scale0 =
static_cast<int>(
std::min(newXScale, newYScale)*100);
341 double scale = (
static_cast<double>(scale0)) / 100.0;
364 : n(n0), i(-1), noOfChildren(noOfChildren0) {}
385 std::stack<SearchItem> stck;
389 static_cast<long unsigned int>(depth+stck.size()));
432 static_cast<long unsigned int>(depth+stck.size()));
454 QMutexLocker locker(&
mutex);
460 QMutexLocker locker(&
mutex);
466 QMutexLocker locker(&
mutex);
475 QMutexLocker locker(&
mutex);
484 QMutexLocker locker(&
mutex);
494 QMutexLocker locker(&
mutex);
503 QMutexLocker locker(&
mutex);
518 int zoomCurrent =
static_cast<int>(scale*100);
537 QWidget* p = parentWidget();
540 static_cast<double>(p->width()) / (bb.
right - bb.
left +
546 int scale0 =
static_cast<int>(
std::min(newXScale, newYScale)*100);
556 int zoomCurrent =
static_cast<int>(scale*100);
557 int targetZoom = scale0;
569 QMutexLocker locker(&
mutex);
580 x =
static_cast<int>((
xtrans+
x)*scale); y =
static_cast<int>(y*
scale);
582 QAbstractScrollArea* sa =
583 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
585 x -= sa->viewport()->width() / 2;
586 y -= sa->viewport()->height() / 2;
588 sourceX = sa->horizontalScrollBar()->value();
592 sourceY = sa->verticalScrollBar()->value();
597 sa->horizontalScrollBar()->setValue(targetX);
598 sa->verticalScrollBar()->setValue(targetY);
612 QAbstractScrollArea* sa =
613 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
614 double p =
static_cast<double>(
i)/100.0;
617 sa->horizontalScrollBar()->setValue(
sourceX+static_cast<int>(xdiff));
618 sa->verticalScrollBar()->setValue(
sourceY+static_cast<int>(ydiff));
623 QMutexLocker locker(&
mutex);
630 int failedInspectorType = -1;
631 int failedInspector = -1;
632 bool needCentering =
false;
643 needCentering =
true;
655 failedInspectorType = 0;
668 failedInspectorType = -1;
704 "Something went wrong - probably an incorrect brancher");
714 switch (curSpace->
status()) {
727 if (inspectorNo==-1) {
730 failedInspectorType = 1;
733 failedInspectorType = -1;
737 failedInspectorType = 1;
738 failedInspector = inspectorNo;
740 failedInspectorType = -1;
747 switch (failedInspectorType) {
749 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
750 failedInspector, e.
what());
753 qFatal(
"Exception in double click inspector %d: %s.\n Stopping.",
754 failedInspector, e.
what());
757 qFatal(
"Exception: %s.\n Stopping.", e.
what());
775 QMutexLocker locker(&
mutex);
783 QMutexLocker locker(&
mutex);
791 TreeCanvas::inspectSolution(
const Space* s) {
792 int failedInspectorType = -1;
793 int failedInspector = -1;
800 failedInspectorType = 1;
803 failedInspectorType = -1;
807 }
catch (Exception& e) {
808 switch (failedInspectorType) {
810 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
811 failedInspector, e.what());
814 qFatal(
"Exception in solution inspector %d: %s.\n Stopping.",
815 failedInspector, e.what());
818 qFatal(
"Exception: %s.\n Stopping.", e.what());
832 QMutexLocker locker(&
mutex);
846 int rootIdx =
na->allocate(rootSpace);
847 assert(rootIdx == 0); (void) rootIdx;
865 QMutexLocker locker(&
mutex);
869 QInputDialog::getText(
this,
"Add bookmark",
"Name:",
870 QLineEdit::Normal,
"",&ok);
875 text = QString(
"Node ")+QString().setNum(
bookmarks.size());
890 QMutexLocker locker(&
mutex);
904 QMutexLocker locker(&
mutex);
909 while (nextAlt >= 0) {
920 QMutexLocker locker(&
mutex);
923 setCursor(QCursor(Qt::CrossCursor));
928 QMutexLocker locker(&
mutex);
931 setCursor(QCursor(Qt::CrossCursor));
941 QMutexLocker locker(&
mutex);
954 QMutexLocker locker(&
mutex);
977 QMutexLocker locker(&
mutex);
991 QMutexLocker locker(&
mutex);
1005 QMutexLocker locker(&
mutex);
1012 QMutexLocker locker(&
mutex);
1030 #if QT_VERSION >= 0x040400
1031 QString filename = QFileDialog::getSaveFileName(
this, tr(
"Export tree as pdf"),
"", tr(
"PDF (*.pdf)"));
1032 if (filename !=
"") {
1033 QPrinter printer(QPrinter::ScreenResolution);
1034 QMutexLocker locker(&
mutex);
1037 printer.setFullPage(
true);
1041 printer.setOutputFileName(filename);
1042 QPainter painter(&printer);
1044 painter.setRenderHint(QPainter::Antialiasing);
1046 QRect pageRect = printer.pageRect();
1048 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1051 static_cast<double>(pageRect.height()) /
1054 double printScale =
std::min(newXScale, newYScale);
1055 painter.scale(printScale,printScale);
1060 QRect clip(0,0,0,0);
1073 #if QT_VERSION >= 0x040400
1074 exportNodePDF(
root);
1080 #if QT_VERSION >= 0x040400
1088 if (QPrintDialog(&printer,
this).exec() == QDialog::Accepted) {
1089 QMutexLocker locker(&
mutex);
1092 QRect pageRect = printer.pageRect();
1094 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1097 static_cast<double>(pageRect.height()) /
1100 double printScale =
std::min(newXScale, newYScale)*100;
1103 if (printScale > 400.0)
1105 printScale = printScale / 100.0;
1107 QPainter painter(&printer);
1108 painter.setRenderHint(QPainter::Antialiasing);
1109 painter.scale(printScale,printScale);
1110 painter.translate(
xtrans, 0);
1111 QRect clip(0,0,0,0);
1121 switch (event->type()) {
1122 case QEvent::ToolTip:
1124 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1129 case QEvent::MouseButtonDblClick:
1130 case QEvent::MouseButtonPress:
1131 case QEvent::MouseButtonRelease:
1132 case QEvent::MouseMove:
1134 QMouseEvent* me =
static_cast<QMouseEvent*
>(
event);
1139 case QEvent::ContextMenu:
1141 QContextMenuEvent* ce =
static_cast<QContextMenuEvent*
>(
event);
1149 QAbstractScrollArea* sa =
1150 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1151 int xoff = sa->horizontalScrollBar()->value()/
scale;
1152 int yoff = sa->verticalScrollBar()->value()/
scale;
1157 if (w < sa->viewport()->width())
1158 xoff -= (sa->viewport()->width()-w)/2;
1162 static_cast<int>(x/scale-
xtrans+xoff),
1163 static_cast<int>((y-30)/scale+yoff));
1169 if (
mutex.tryLock()) {
1170 if (event->type() == QEvent::ToolTip) {
1173 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1174 QToolTip::showText(he->globalPos(),
1178 QToolTip::hideText();
1183 return QWidget::event(event);
1195 QPainter painter(
this);
1196 painter.setRenderHint(QPainter::Antialiasing);
1198 QAbstractScrollArea* sa =
1199 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1200 int xoff = sa->horizontalScrollBar()->value()/
scale;
1201 int yoff = sa->verticalScrollBar()->value()/
scale;
1206 if (w < sa->viewport()->width())
1207 xoff -= (sa->viewport()->width()-w)/2;
1209 QRect origClip =
event->rect();
1210 painter.translate(0, 30);
1211 painter.scale(scale,scale);
1212 painter.translate(
xtrans-xoff, -yoff);
1213 QRect clip(static_cast<int>(origClip.x()/scale-
xtrans+xoff),
1214 static_cast<int>(origClip.y()/scale+yoff),
1215 static_cast<int>(origClip.width()/
scale),
1216 static_cast<int>(origClip.height()/
scale));
1233 if (
mutex.tryLock()) {
1234 if(event->button() == Qt::LeftButton) {
1250 if (
mutex.tryLock()) {
1266 QAbstractScrollArea* sa =
1267 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1269 int w = sa->horizontalScrollBar()->maximum()+e->oldSize().width();
1270 int h = sa->verticalScrollBar()->maximum()+e->oldSize().height();
1272 sa->horizontalScrollBar()->setRange(0,w-e->size().width());
1273 sa->verticalScrollBar()->setRange(0,h-e->size().height());
1274 sa->horizontalScrollBar()->setPageStep(e->size().width());
1275 sa->verticalScrollBar()->setPageStep(e->size().height());
1280 if (event->modifiers() & Qt::ShiftModifier) {
1282 if (event->orientation() == Qt::Vertical && !
autoZoom)
1283 scaleTree(scale*100+ceil(static_cast<double>(event->delta())/4.0),
1284 event->x(),
event->y());
1313 Space* curSpace = NULL;
1316 if (curSpace == NULL)
1321 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
1334 setCursor(QCursor(Qt::ArrowCursor));
1344 if (
mutex.tryLock()) {
1345 if (event->button() == Qt::LeftButton) {
1351 Space* curSpace = NULL;
1352 Space* compareSpace = NULL;
1355 if (curSpace == NULL) {
1363 switch (compareSpace->
status()) {
1377 comparators[
i].first->compare(*curSpace,*compareSpace);
1379 qFatal(
"Exception in comparator %d: %s.\n Stopping.",
1389 setCursor(QCursor(Qt::ArrowCursor));
bool isOnPath(void)
Return whether node is on the path.
void search(VisualNode *n, bool all, TreeCanvas *ti)
Node representing stop point.
void setCurrentNode(VisualNode *n, bool finished=true, bool update=true)
Set the selected node to n.
void labelBranches(void)
Label all branches in subtree under current node.
std::string toolTip(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return string that is used as a tool tip.
void toggleStop(void)
Do not stop at selected stop node.
void unhideAll(const NodeAllocator &na)
Unhide all nodes in the subtree of this node.
int right
Right coordinate.
void stopSearch(void)
Stop current search.
Space must be branched (at least one brancher left)
void labelPath(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Create or clear branch labels on path to root.
void exportPDF(void)
Export pdf of the current subtree.
void inspectCurrentNode(bool fix=true, int inspectorNo=-1)
Call the double click inspector for the currently selected node.
void setMarked(bool m)
Set mark of this node.
void unhideAll(void)
Unhide all nodes below selected node.
void solution(const Space *)
Signals that a solution has been found.
void autoZoomChanged(bool)
The auto-zoom state was changed.
Static reference to the currently best space.
bool compareNodesBeforeFP
Whether node comparison action computes fixpoint.
const FloatNum max
Largest allowed float value.
void addMoveInspector(Inspector *i)
Add inspector i.
Node representing a branch.
bool showCopies
Whether to show copies in the tree.
void searchFinished(void)
Signals that Gist is finished.
void addDoubleClickInspector(Inspector *i)
Add inspector i.
~TreeCanvas(void)
Destructor.
void layout(const NodeAllocator &na)
Compute layout for the subtree of this node.
void setSmoothScrollAndZoom(bool b)
Set preference whether to use smooth scrolling and zooming.
void navPrevSol(void)
Move selection to previous solution (in DFS order)
void navDown(void)
Move selection to the first child of the selected node.
Space * clone(bool share=true, CloneStatistics &stat=unused_clone) const
Clone space.
Abstract base class for comparators.
BoundingBox getBoundingBox(void)
Return the bounding box.
void addComparator(Comparator *c)
Add comparator c.
bool isHidden(void)
Return if node is hidden.
QVector< VisualNode * > bookmarks
The bookmarks map.
NodeAllocatorBase< VisualNode > NodeAllocator
void abs(Home home, FloatVar x0, FloatVar x1)
Post propagator for .
const int defScale
Default scale factor.
int sourceX
Source x coordinate after smooth scrolling.
QVector< QPair< Inspector *, bool > > moveInspectors
The registered move inspectors, and whether they are active.
Space * getSpace(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Return working space. Receiver must delete the space.
virtual const char * what(void) const
Return information.
void zoomToFit(void)
Zoom the canvas so that the whole tree fits.
TreeCanvas(Space *rootSpace, bool bab, QWidget *parent, const Options &opt)
Constructor.
void activateComparator(int i, bool active)
Set active comparator.
VisualNode * root
The root node of the tree.
Node representing failure.
void setPath(void)
Set the current node to be the head of the path.
int targetScale
Target scale after layout.
void navRoot(void)
Move selection to the root node.
int targetW
Target width after layout.
unsigned int getNumberOfChildren(void) const
Return the number of children.
QSlider * scaleBar
The scale bar.
void mouseDoubleClickEvent(QMouseEvent *event)
Handle mouse double click event.
void navNextSol(bool back=false)
Move selection to next solution (in DFS order)
void mousePressEvent(QMouseEvent *event)
Handle mouse press event.
void hideFailed(void)
Hide failed subtrees of selected node.
void statusChanged(VisualNode *, const Statistics &, bool)
Status bar update.
const Space * getWorkingSpace(void) const
Return working space (if present).
void toggleStop(const NodeAllocator &na)
Do not stop at this node.
void setBookmarked(bool m)
Set bookmark of this node.
Abstract base class for inspectors.
int xtrans
Offset on the x axis so that the tree is centered.
SearchItem(VisualNode *n0, int noOfChildren0)
Constructor.
Node that has not been explored yet.
int getAlternative(const NodeAllocator &na) const
Return alternative number of this node.
const int minScale
Minimum scale factor.
void inspectPath(void)
Call the double click inspector for all nodes on the path from root to head of the path...
bool finishedFlag
Flag signalling that Gist is ready to be closed.
int i
The currently explored child.
void labelBranches(NodeAllocator &na, BestNode *curBest, int c_d, int a_d)
Create or clear branch labels in subtree.
Gecode::FloatVal c(-8, 8)
void paintEvent(QPaintEvent *event)
Paint the tree.
void unstopAll(const NodeAllocator &na)
Do not stop at any stop node in the subtree of this node.
const Choice * getChoice(void)
Return choice of this node.
int getParent(void) const
Return the parent.
NodeStatus getStatus(void) const
Return current status of the node.
int p
Number of positive literals for node type.
bool isRoot(void) const
Check if this node is the root of a tree.
bool getMoveDuringSearch(void)
Return preference whether to move cursor during search.
const FloatNum min
Smallest allowed float value.
int targetX
Target x coordinate after smooth scrolling.
Gecode::IntArgs i(4, 1, 2, 3, 4)
int n
Number of negative literals for node type.
BestNode * curBest
The currently best solution (for branch-and-bound)
void searchOne(void)
Find next solution below selected node.
Node representing a solution.
double scale
Current scale factor.
void scaleTree(int scale0, int zoomx=-1, int zoomy=-1)
Set scale factor to scale0.
void commit(const Choice &c, unsigned int a, CommitStatistics &stat=unused_commit)
Commit choice c for alternative a.
void labelPath(void)
Label all branches on path to root node.
void setRefreshPause(int i)
Set refresh pause in msec.
bool getAutoHideFailed(void)
Return preference whether to automatically hide failed subtrees.
unsigned int size(I &i)
Size of all ranges of range iterator i.
bool clone
Whether engines create a clone when being initialized.
void activateDoubleClickInspector(int i, bool active)
Set active inspector.
QMutex mutex
Mutex for synchronizing acccess to the tree.
A cursor that draws a tree on a QWidget.
Cursor & getCursor(void)
Return the cursor.
void activateSolutionInspector(int i, bool active)
Set active inspector.
void setRefresh(int i)
Set refresh rate.
int a_d
The adaptive recomputation distance.
A cursor that frees all memory.
QTimeLine scrollTimeLine
Timer for smooth scrolling.
void emitStatusChanged(void)
Re-emit status change information for current node.
VisualNode * pathHead
The head of the currently selected path.
int layoutDoneTimerId
Timer id for delaying the update.
void resizeToOuter(void)
Resize to the outer widget size if auto zoom is enabled.
void navUp(void)
Move selection to the parent of the selected node.
const int maxScale
Maximum scale factor.
T * dfs(T *s, const Search::Options &o)
Invoke depth-first search engine for subclass T of space s with options o.
void unstopAll(void)
Do not stop at any stop node.
void contextMenu(QContextMenuEvent *)
Context menu triggered.
bool autoHideFailed
Whether to hide failed subtrees automatically.
Statistics stats
Statistics about the search tree.
void exportWholeTreePDF(void)
Export pdf of the whole tree.
int getPathAlternative(const NodeAllocator &na)
Return the alternative of the child that is on the path (-1 if none)
QMutex layoutMutex
Mutex for synchronizing layout and drawing.
bool moveDuringSearch
Whether to move cursor during search.
void solution(const Space *)
QVector< QPair< Inspector *, bool > > doubleClickInspectors
The registered click inspectors, and whether they are active.
void inspectBeforeFP(void)
Calls inspectCurrentNode(false)
void scroll(void)
React to scroll events.
Shape * getShape(void)
Return the shape of this node.
void run(void)
Execute visitor.
int targetY
Target y coordinate after smooth scrolling.
int depth(void) const
Return depth of the shape.
bool smoothScrollAndZoom
Whether to use smooth scrolling and zooming.
void scaleChanged(int)
The scale factor has changed.
Exception: Base-class for exceptions
void print(void)
Print the tree.
Node * x
Pointer to corresponding Boolean expression node.
bool getSmoothScrollAndZoom(void)
Return preference whether to use smooth scrolling and zooming.
void dirtyUp(const NodeAllocator &na)
Mark all nodes up the path to the parent as dirty.
Run a cursor over a tree, processing nodes in pre-order.
void setAutoZoom(bool b)
Set preference whether to automatically zoom to fit.
void searchAll(void)
Explore complete subtree of selected node.
void toggleHidden(const NodeAllocator &na)
Toggle whether this node is hidden.
int maxDepth
Maximum depth of the tree.
void addedBookmark(const QString &id)
Signals that a bookmark has been added.
void setShowCopies(bool b)
Set preference whether to show copies in the tree.
bool isBookmarked(void)
Return whether node is bookmarked.
int c_d
The recomputation distance.
void unPathUp(const NodeAllocator &na)
Set all nodes from the node to the root not to be on the path.
const int maxAutoZoomScale
Maximum scale factor for automatic zoom.
int noOfChildren
The number of children.
Node class that supports visual layout
int getOffset(void)
Return offset off this node from its parent.
int bab(Space *root, const Gist::Options &opt)
Create a new stand-alone Gist for branch-and-bound search of root.
void searchFinished(void)
void addSolutionInspector(Inspector *i)
Add inspector i.
VisualNode * findNode(const NodeAllocator &na, int x, int y)
Find a node in this subtree at coordinates x, y.
void resizeEvent(QResizeEvent *event)
Handle resize event.
void setMoveDuringSearch(bool b)
Set preference whether to move cursor during search.
void removedBookmark(int idx)
Signals that a bookmark has been removed.
void setRecompDistances(int c_d, int a_d)
Set recomputation distances.
bool getShowCopies(void)
Return preference whether to show copies in the tree.
SpaceStatus status(StatusStatistics &stat=unused_status)
Query space status.
void startCompareNodes(void)
Wait for click on node to compare with current node.
QVector< QPair< Inspector *, bool > > solutionInspectors
The registered solution inspectors, and whether they are active.
A cursor that finds the next solution.
bool event(QEvent *event)
General event handler, used for displaying tool tips.
SearcherThread searcher
Search engine thread.
int getNumberOfChildNodes(NodeAllocator &na, BestNode *curBest, Statistics &stats, int c_d, int a_d)
Compute and return the number of children.
bool stopSearchFlag
Flag signalling the search to stop.
void centerCurrentNode(void)
Center the view on the currently selected node.
bool autoZoom
Whether to zoom automatically.
Space * snapshot(Space *s, const Options &o, bool share=true)
Clone space s dependening on options o.
VisualNode * eventNode(QEvent *event)
Return the node corresponding to the event position.
int refreshPause
Time (in msec) to pause after each refresh.
void startCompareNodesBeforeFP(void)
Wait for click on node to compare with current node before fixpoint.
void pathUp(const NodeAllocator &na)
Set all nodes from the node to the root to be on the path.
bool getAutoZoom(void)
Return preference whether to automatically zoom to fit.
virtual void timerEvent(QTimerEvent *e)
Timer invoked for smooth zooming and scrolling.
A stack item for depth first search.
void navRight(void)
Move selection to the right sibling of the selected node.
bool compareNodes
Whether node comparison action is running.
void navLeft(void)
Move selection to the left sibling of the selected node.
struct Gecode::@518::NNF::@57::@58 b
For binary nodes (and, or, eqv)
bool hasCopy(void)
Return whether the node has a copy.
Gecode toplevel namespace
void setAutoHideFailed(bool b)
Set preference whether to automatically hide failed subtrees.
int getChild(int n) const
Return index of child no n.
int sourceY
Target y coordinate after smooth scrolling.
void bookmarkNode(void)
Bookmark current node.
bool isOpen(void)
Return whether this node still has open children.
int targetH
Target height after layout.
void moveToNode(VisualNode *n, bool)
QTimeLine zoomTimeLine
Timer for smooth zooming.
void update(int w, int h, int scale0)
void wheelEvent(QWheelEvent *event)
Handle mouse wheel events.
#define GECODE_NEVER
Assert that this command is never executed.
void activateMoveInspector(int i, bool active)
Set active inspector.
void update(void)
Update display.
void toggleHidden(void)
Toggle hidden state of selected node.
Statistics about the search tree
Node::NodeAllocator * na
Allocator for nodes.
bool finish(void)
Stop search and wait for it to finish.
void layoutDone(int w, int h, int scale0)
Layout done.
void hideFailed(const NodeAllocator &na, bool onlyDirty=false)
Hide all failed subtrees of this node.
A canvas that displays the search tree.
QVector< QPair< Comparator *, bool > > comparators
The registered comparators, and whether they are active.
VisualNode * currentNode
The currently selected node.
void contextMenuEvent(QContextMenuEvent *event)
Handle context menu event.
void purge(const NodeAllocator &na)
Clear working space and copy (if present and this is not the root).
Node representing ignored stop point.
Space is solved (no brancher left)