#ifndef OKNO_H
#define OKNO_H
#include <QMainWindow>
#include <QTableWidget>
#include <QTreeWidgetItem>
namespace Ui {
class Okno;
}
class Info
{
public:
int len;
int from_line;
int from_col;
Info () : len (-1), from_line (-1), from_col (-1) { }
};
const int n = 8;
class MyItem : public QTreeWidgetItem
{
public:
Info pole [n][n];
int xx, yy;
};
class Okno : public QMainWindow
{
Q_OBJECT
public:
explicit Okno(QWidget *parent = 0);
~Okno();
private slots:
void on_treeWidget_itemClicked(QTreeWidgetItem *item, int column);
void on_tableWidget_cellDoubleClicked(int row, int column);
private:
Info pole [n][n];
void setupTable (QTableWidget *t);
void jump (int i, int j, int level, MyItem * node);
void search (QTreeWidgetItem * item, int i, int j, int level);
private:
Ui::Okno *ui;
};
#endif // OKNO_H
#include "okno.h"
#include "ui_okno.h"
Okno::Okno(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::Okno)
{
ui->setupUi(this);
setupTable (ui->tableWidget);
setupTable (ui->stateTable);
jump (0, 0, 1, NULL);
}
Okno::~Okno()
{
delete ui;
}
void Okno::setupTable (QTableWidget * t)
{
t->setColumnCount (n);
t->setRowCount (n);
int h = t->rowHeight(0);
for (int i = 0; i < n ; i++)
t->setColumnWidth (i, h);
}
QColor color (int level)
{
return QColor::fromHsv ((10*level)%360, 250, 250);
}
void Okno::jump (int i, int j, int level, MyItem *node)
{
if (i>=0 && i<n && j>=0 && j<n && level <= 8)
{
if (pole[i][j].len < 0 || pole[i][j].len > level)
{
pole[i][j].len = level;
QTableWidgetItem * item = new QTableWidgetItem;
item->setText (QString::number (level));
item->setBackgroundColor (color (level));
ui->tableWidget->setItem (i, j, item);
MyItem * above = node;
node = new MyItem;
node->setText (0, QString::number (level) + " : " +
QString::number (i) + " , " +
QString::number (j) );
node->setBackgroundColor (0, color (level));
if (above != NULL)
above->addChild (node);
else
ui->treeWidget->addTopLevelItem (node);
if (above)
{
pole[i][j].from_line = above->xx;
pole[i][j].from_col = above->yy;
item->setToolTip(QString::number (above->xx) + "," +
QString::number (above->yy)
);
}
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
node->pole[x][y] = pole[x][y];
node->xx = i;
node->yy = j;
jump (i+2, j+1, level+1, node);
jump (i+2, j-1, level+1, node);
jump (i-2, j+1, level+1, node);
jump (i-2, j-1, level+1, node);
jump (i+1, j+2, level+1, node);
jump (i+1, j-2, level+1, node);
jump (i-1, j+2, level+1, node);
jump (i-1, j-2, level+1, node);
}
}
}
void Okno::search(QTreeWidgetItem *item, int i, int j, int level)
{
MyItem * node = dynamic_cast <MyItem*> (item);
if (node != NULL)
{
if (node->xx == i && node->yy == j &&
node->pole[i][j].len == level)
{
node->setSelected (true);
on_treeWidget_itemClicked (node, 0);
}
else
{
int k = node->childCount();
for (int t = 0 ; t < k ; t++)
search (node->child(t), i, j, level);
}
}
}
void Okno::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
MyItem * node = dynamic_cast <MyItem*> (item);
if (node != NULL)
{
ui->stateTable->clearContents ();
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
{
Info info = node->pole[x][y];
int level = info.len;
if (level >= 0)
{
QTableWidgetItem * item = new QTableWidgetItem;
item->setText (QString::number (level));
item->setBackgroundColor (color (level));
item->setToolTip(QString::number (info.from_line) + "," +
QString::number (info.from_col) );
ui->stateTable->setItem (x, y, item);
}
}
}
}
void Okno::on_tableWidget_cellDoubleClicked(int row, int column)
{
search (ui->treeWidget->topLevelItem(0),
row, column, pole[row][column].len);
}
const int n = 8;
class MyItem : public QTreeWidgetItem
{
public:
Info pole [n][n];
};
QTableWidgetItem * item = new QTableWidgetItem;
item->setText (QString::number (level));
item->setBackgroundColor (color (level));
ui->tableWidget->setItem (i, j, item);
MyItem * above = node;
node = new MyItem;
node->setText (0, QString::number (level) + " : " +
QString::number (i) + " , " +
QString::number (j) );
node->setBackgroundColor (0, color (level));
if (above != NULL)
above->addChild (node);
else
ui->treeWidget->addTopLevelItem (node);
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
node->pole[x][y] = pole[x][y];
void Okno::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column)
{
MyItem * node = dynamic_cast <MyItem*> (item);
if (node != NULL)
{
ui->stateTable->clearContents ();
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
{
Info info = node->pole[x][y];
int level = info.len;
if (level >= 0)
{
QTableWidgetItem * item = new QTableWidgetItem;
item->setText (QString::number (level));
item->setBackgroundColor (color (level));
ui->stateTable->setItem (x, y, item);
}
}
}
}
if (above)
{
pole[i][j].from_line = above->xx;
pole[i][j].from_col = above->yy;
item->setToolTip(QString::number (above->xx) + "," +
QString::number (above->yy)
);
}
for (int x = 0; x < n; x++)
for (int y = 0; y < n; y++)
node->pole[x][y] = pole[x][y];
node->xx = i;
node->yy = j;