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*)));
102 this, SLOT(inspectSolution(
const Space*)),
103 Qt::BlockingQueuedConnection);
107 Qt::BlockingQueuedConnection);
115 scaleBar =
new QSlider(Qt::Vertical,
this);
116 scaleBar->setObjectName(
"scaleBar");
120 connect(
scaleBar, SIGNAL(valueChanged(
int)),
130 qRegisterMetaType<Statistics>(
"Statistics");
177 comparators.append(QPair<Comparator*,bool>(c,
false));
190 QSize viewport_size =
size();
191 QAbstractScrollArea* sa =
192 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
195 zoomx = viewport_size.width()/2;
197 zoomy = viewport_size.height()/2;
199 int xoff = (sa->horizontalScrollBar()->value()+zoomx)/
scale;
200 int yoff = (sa->verticalScrollBar()->value()+zoomy)/
scale;
205 scale = (
static_cast<double>(scale0)) / 100.0;
213 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
214 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
215 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
216 sa->verticalScrollBar()->setPageStep(viewport_size.height());
223 sa->horizontalScrollBar()->setValue(xoff-zoomx);
224 sa->verticalScrollBar()->setValue(yoff-zoomy);
232 QMutexLocker locker(&
mutex);
244 QSize viewport_size =
size();
245 QAbstractScrollArea* sa =
246 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
247 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
248 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
249 sa->horizontalScrollBar()->setPageStep(viewport_size.width());
250 sa->verticalScrollBar()->setPageStep(viewport_size.height());
269 QSize viewport_size =
size();
270 QAbstractScrollArea* sa =
271 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
272 sa->horizontalScrollBar()->setRange(0,w-viewport_size.width());
273 sa->verticalScrollBar()->setRange(0,h-viewport_size.height());
302 SearcherThread::updateCanvas(
void) {
328 int scale0 =
static_cast<int>(t->
scale*100);
330 QWidget*
p = t->parentWidget();
333 static_cast<double>(p->width()) / (bb.right - bb.left +
336 static_cast<double>(p->height()) /
339 scale0 =
static_cast<int>(
std::min(newXScale, newYScale)*100);
344 double scale = (
static_cast<double>(scale0)) / 100.0;
388 std::stack<SearchItem> stck;
392 static_cast<long unsigned int>(depth+stck.size()));
433 static_cast<long unsigned int>(depth+stck.size()));
457 QMutexLocker locker(&
mutex);
463 QMutexLocker locker(&
mutex);
469 QMutexLocker locker(&
mutex);
478 QMutexLocker locker(&
mutex);
487 QMutexLocker locker(&
mutex);
497 QMutexLocker locker(&
mutex);
506 QMutexLocker locker(&
mutex);
521 int zoomCurrent =
static_cast<int>(scale*100);
540 QWidget* p = parentWidget();
543 static_cast<double>(p->width()) / (bb.
right - bb.
left +
549 int scale0 =
static_cast<int>(
std::min(newXScale, newYScale)*100);
559 int zoomCurrent =
static_cast<int>(scale*100);
560 int targetZoom = scale0;
572 QMutexLocker locker(&
mutex);
583 x =
static_cast<int>((
xtrans+
x)*scale); y =
static_cast<int>(y*
scale);
585 QAbstractScrollArea* sa =
586 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
588 x -= sa->viewport()->width() / 2;
589 y -= sa->viewport()->height() / 2;
591 sourceX = sa->horizontalScrollBar()->value();
595 sourceY = sa->verticalScrollBar()->value();
600 sa->horizontalScrollBar()->setValue(targetX);
601 sa->verticalScrollBar()->setValue(targetY);
615 QAbstractScrollArea* sa =
616 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
617 double p =
static_cast<double>(
i)/100.0;
620 sa->horizontalScrollBar()->setValue(
sourceX+static_cast<int>(xdiff));
621 sa->verticalScrollBar()->setValue(
sourceY+static_cast<int>(ydiff));
626 QMutexLocker locker(&
mutex);
633 int failedInspectorType = -1;
634 int failedInspector = -1;
635 bool needCentering =
false;
646 needCentering =
true;
658 failedInspectorType = 0;
671 failedInspectorType = -1;
707 "Something went wrong - probably an incorrect brancher");
717 switch (curSpace->
status()) {
730 if (inspectorNo==-1) {
733 failedInspectorType = 1;
736 failedInspectorType = -1;
740 failedInspectorType = 1;
741 failedInspector = inspectorNo;
743 failedInspectorType = -1;
750 switch (failedInspectorType) {
752 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
753 failedInspector, e.
what());
756 qFatal(
"Exception in double click inspector %d: %s.\n Stopping.",
757 failedInspector, e.
what());
760 qFatal(
"Exception: %s.\n Stopping.", e.
what());
778 QMutexLocker locker(&
mutex);
786 QMutexLocker locker(&
mutex);
794 TreeCanvas::inspectSolution(
const Space* s) {
795 int failedInspectorType = -1;
796 int failedInspector = -1;
803 failedInspectorType = 1;
806 failedInspectorType = -1;
810 }
catch (Exception& e) {
811 switch (failedInspectorType) {
813 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
814 failedInspector, e.what());
817 qFatal(
"Exception in solution inspector %d: %s.\n Stopping.",
818 failedInspector, e.what());
821 qFatal(
"Exception: %s.\n Stopping.", e.what());
835 QMutexLocker locker(&
mutex);
849 int rootIdx =
na->allocate(rootSpace);
850 assert(rootIdx == 0); (void) rootIdx;
868 QMutexLocker locker(&
mutex);
872 QInputDialog::getText(
this,
"Add bookmark",
"Name:",
873 QLineEdit::Normal,
"",&ok);
878 text = QString(
"Node ")+QString().setNum(
bookmarks.size());
893 QMutexLocker locker(&
mutex);
907 QMutexLocker locker(&
mutex);
912 while (nextAlt >= 0) {
923 QMutexLocker locker(&
mutex);
926 setCursor(QCursor(Qt::CrossCursor));
931 QMutexLocker locker(&
mutex);
934 setCursor(QCursor(Qt::CrossCursor));
944 QMutexLocker locker(&
mutex);
957 QMutexLocker locker(&
mutex);
980 QMutexLocker locker(&
mutex);
994 QMutexLocker locker(&
mutex);
1008 QMutexLocker locker(&
mutex);
1015 QMutexLocker locker(&
mutex);
1033 #if QT_VERSION >= 0x040400
1034 QString filename = QFileDialog::getSaveFileName(
this, tr(
"Export tree as pdf"),
"", tr(
"PDF (*.pdf)"));
1035 if (filename !=
"") {
1036 QPrinter printer(QPrinter::ScreenResolution);
1037 QMutexLocker locker(&
mutex);
1040 printer.setFullPage(
true);
1044 printer.setOutputFileName(filename);
1045 QPainter painter(&printer);
1047 painter.setRenderHint(QPainter::Antialiasing);
1049 QRect pageRect = printer.pageRect();
1051 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1054 static_cast<double>(pageRect.height()) /
1057 double printScale =
std::min(newXScale, newYScale);
1058 painter.scale(printScale,printScale);
1063 QRect clip(0,0,0,0);
1076 #if QT_VERSION >= 0x040400
1077 exportNodePDF(
root);
1083 #if QT_VERSION >= 0x040400
1091 if (QPrintDialog(&printer,
this).exec() == QDialog::Accepted) {
1092 QMutexLocker locker(&
mutex);
1095 QRect pageRect = printer.pageRect();
1097 static_cast<double>(pageRect.width()) / (bb.
right - bb.
left +
1100 static_cast<double>(pageRect.height()) /
1103 double printScale =
std::min(newXScale, newYScale)*100;
1106 if (printScale > 400.0)
1108 printScale = printScale / 100.0;
1110 QPainter painter(&printer);
1111 painter.setRenderHint(QPainter::Antialiasing);
1112 painter.scale(printScale,printScale);
1113 painter.translate(
xtrans, 0);
1114 QRect clip(0,0,0,0);
1124 switch (event->type()) {
1125 case QEvent::ToolTip:
1127 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1132 case QEvent::MouseButtonDblClick:
1133 case QEvent::MouseButtonPress:
1134 case QEvent::MouseButtonRelease:
1135 case QEvent::MouseMove:
1137 QMouseEvent* me =
static_cast<QMouseEvent*
>(
event);
1142 case QEvent::ContextMenu:
1144 QContextMenuEvent* ce =
static_cast<QContextMenuEvent*
>(
event);
1152 QAbstractScrollArea* sa =
1153 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1154 int xoff = sa->horizontalScrollBar()->value()/
scale;
1155 int yoff = sa->verticalScrollBar()->value()/
scale;
1160 if (w < sa->viewport()->width())
1161 xoff -= (sa->viewport()->width()-w)/2;
1165 static_cast<int>(x/scale-
xtrans+xoff),
1166 static_cast<int>((y-30)/scale+yoff));
1172 if (
mutex.tryLock()) {
1173 if (event->type() == QEvent::ToolTip) {
1176 QHelpEvent* he =
static_cast<QHelpEvent*
>(
event);
1177 QToolTip::showText(he->globalPos(),
1181 QToolTip::hideText();
1186 return QWidget::event(event);
1198 QPainter painter(
this);
1199 painter.setRenderHint(QPainter::Antialiasing);
1201 QAbstractScrollArea* sa =
1202 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1203 int xoff = sa->horizontalScrollBar()->value()/
scale;
1204 int yoff = sa->verticalScrollBar()->value()/
scale;
1209 if (w < sa->viewport()->width())
1210 xoff -= (sa->viewport()->width()-w)/2;
1212 QRect origClip =
event->rect();
1213 painter.translate(0, 30);
1214 painter.scale(scale,scale);
1215 painter.translate(
xtrans-xoff, -yoff);
1216 QRect clip(static_cast<int>(origClip.x()/scale-
xtrans+xoff),
1217 static_cast<int>(origClip.y()/scale+yoff),
1218 static_cast<int>(origClip.width()/
scale),
1219 static_cast<int>(origClip.height()/
scale));
1236 if (
mutex.tryLock()) {
1237 if(event->button() == Qt::LeftButton) {
1253 if (
mutex.tryLock()) {
1269 QAbstractScrollArea* sa =
1270 static_cast<QAbstractScrollArea*
>(parentWidget()->parentWidget());
1272 int w = sa->horizontalScrollBar()->maximum()+e->oldSize().width();
1273 int h = sa->verticalScrollBar()->maximum()+e->oldSize().height();
1275 sa->horizontalScrollBar()->setRange(0,w-e->size().width());
1276 sa->verticalScrollBar()->setRange(0,h-e->size().height());
1277 sa->horizontalScrollBar()->setPageStep(e->size().width());
1278 sa->verticalScrollBar()->setPageStep(e->size().height());
1283 if (event->modifiers() & Qt::ShiftModifier) {
1285 if (event->orientation() == Qt::Vertical && !
autoZoom)
1286 scaleTree(scale*100+ceil(static_cast<double>(event->delta())/4.0),
1287 event->x(),
event->y());
1316 Space* curSpace = NULL;
1319 if (curSpace == NULL)
1324 qFatal(
"Exception in move inspector %d: %s.\n Stopping.",
1337 setCursor(QCursor(Qt::ArrowCursor));
1347 if (
mutex.tryLock()) {
1348 if (event->button() == Qt::LeftButton) {
1354 Space* curSpace = NULL;
1355 Space* compareSpace = NULL;
1358 if (curSpace == NULL) {
1366 switch (compareSpace->
status()) {
1380 comparators[
i].first->compare(*curSpace,*compareSpace);
1382 qFatal(
"Exception in comparator %d: %s.\n Stopping.",
1392 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.
struct Gecode::@512::NNF::@54::@55 b
For binary nodes (and, or, eqv)
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.
bool hasCopy(void)
Return whether the node has a copy.
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)