#ifndef MOJEOKNO_H
#define MOJEOKNO_H
#include <QMainWindow>
#include <QTableWidgetItem>
#include <QTreeWidgetItem>
namespace Ui {
class MojeOkno;
}
class MojeOkno : public QMainWindow
{
Q_OBJECT
public:
explicit MojeOkno(QWidget *parent = 0);
~MojeOkno();
private:
int limit;
QTreeWidgetItem * top;
// QTableWidgetItem * v [8][8];
int z [8][8];
void skoc (int x0, int y0, int n, int x, int y);
void hraj (int x0, int y0, int n);
private slots:
void on_treeWidget_itemClicked(QTreeWidgetItem* item, int column);
void on_actionRun_triggered();
private:
Ui::MojeOkno *ui;
};
#endif // MOJEOKNO_H
#include "mojeokno.h"
#include "ui_mojeokno.h"
#include <cassert>
QString sloupec (int x)
{
return QString ('a' + x);
}
QString radka (int y)
{
return QString ('8' - y);
}
QString popis (int x, int y)
{
return sloupec (x) + radka (y);
}
class MyItem : public QTreeWidgetItem
{
public:
MyItem () : QTreeWidgetItem () { }
QTableWidgetItem * pole [8][8];
};
void setupTable (QTableWidget * table)
{
table->setColumnCount (8);
table->setRowCount (8);
int h = table->rowHeight (0);
for (int i = 0; i <= 7; i++)
table->setColumnWidth (i, h);
QStringList list;
for (int i = 0; i <= 7; i++)
list << sloupec (i);
table->setHorizontalHeaderLabels(list);
list.clear();
for (int i = 0; i <= 7; i++)
list << radka (i);
table->setVerticalHeaderLabels(list);
}
MojeOkno::MojeOkno(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MojeOkno)
{
ui->setupUi(this);
setupTable (ui->tableWidget);
setupTable (ui->traceTable);
}
MojeOkno::~MojeOkno()
{
delete ui;
}
void MojeOkno::skoc (int x0, int y0, int n, int x, int y)
{
if (x >= 0 && x <= 7 && y >= 0 && y <= 7 && n <= limit)
{
if (z[x][y] < 0 || z[x][y] > z[x0][y0] + 1)
{
QString s = QString::number (n);
QString t = popis (x0, y0);
if (n == 1) t = "zacatek";
QColor c = QColor::fromHsv((n*20) % 256, 200, 255);
QTableWidgetItem * p = new QTableWidgetItem;
p->setText (s);
p->setToolTip (t);
p->setBackgroundColor (c);
p->setTextColor(QColor ("red"));
ui->tableWidget->setItem(y, x, p);
// v[x][y] = p;
z[x][y] = n;
MyItem * q = new MyItem;
q->setText (0, QString::number (n) + " : " + t + " -> " + popis (x, y));
if (top != NULL)
top->addChild (q);
else
ui->treeWidget->addTopLevelItem (q);
for (int i = 0; i <= 7; i++)
for (int j = 0; j <= 7; j++)
{
QTableWidgetItem * u = ui->tableWidget->item (j,i);
if (u != NULL)
u = u->clone();
else
u = new QTableWidgetItem ();
q->pole[i][j] = u;
}
QTreeWidgetItem * save = top;
top = q;
skoc (x, y, n+1, x+2, y+1);
skoc (x, y, n+1, x-2, y+1);
skoc (x, y, n+1, x+2, y-1);
skoc (x, y, n+1, x-2, y-1);
skoc (x, y, n+1, x+1, y+2);
skoc (x, y, n+1, x-1, y+2);
skoc (x, y, n+1, x+1, y-2);
skoc (x, y, n+1, x-1, y-2);
top = save;
}
}
}
void MojeOkno::hraj (int x0, int y0, int n)
{
limit = n;
top = NULL;
ui->tableWidget->clearContents ();
ui->treeWidget->clear ();
// for (int i = 0; i <= 7; i++)
// for (int j = 0; j <= 7; j++)
// v[i][j] = NULL;
for (int i = 0; i <= 7; i++)
for (int j = 0; j <= 7; j++)
z[i][j] = -1;
skoc (0, 0, 0, x0, y0);
}
void MojeOkno::on_actionRun_triggered()
{
int n = ui->horizontalSlider->sliderPosition ();
int x = ui->spinBoxX->value ();
int y = ui->spinBoxY->value ();
hraj (x, y, n);
}
void MojeOkno::on_treeWidget_itemClicked (QTreeWidgetItem* treeItem, int column)
{
MyItem * item = dynamic_cast <MyItem*> (treeItem);
if (item != NULL)
{
ui->traceTable->clearContents();
for (int i = 0; i <= 7; i++)
for (int j = 0; j <= 7; j++)
ui->traceTable->setItem (j, i, item->pole [i][j]->clone());
}
}