#include <QtWidgets>
#include "nodeframe.h"
#include "netnode.h"
#include <iostream>
using namespace std;
NodeFrame::NodeFrame(QWidget *parent) :
QGraphicsView(parent)
{
setGeometry(0,0,5000,5000);
m_scene = new QGraphicsScene(0, 0, this->width(), this->height());
this->setScene(m_scene);
QScrollBar *horBar = this->horizontalScrollBar();
QScrollBar *verBar = this->verticalScrollBar();
horBar->setValue(horBar->maximum());
verBar->setValue(verBar->maximum());
m_pHead = NULL;
m_headNode = NULL;
initNodeList();
m_netNode = new NetNode(false, "", m_scene);
setupTopo(m_netNode);
}
NodeFrame::~NodeFrame()
{
delete m_scene;
while (this->m_pHead) {
PNODE pTemp = m_pHead->pNext;
delete m_pHead;
m_pHead = pTemp;
}
}
void NodeFrame::initNodeList()
{
PNODE pTail,pNew;
pTail = NULL;
for (int i = 0; i < 10; i++) {
if (!m_pHead) {
m_pHead = new NODE;
m_pHead->key = i;
m_pHead->value = i;
m_pHead->hops = i;
m_pHead->pNext = NULL;
pTail = m_pHead;
}
else {
while(pTail->pNext)
pTail = pTail->pNext;
pNew = new NODE;
pNew->key = i;
pNew->value = i;
pNew->hops = i;
pNew->pNext = NULL;
pTail->pNext = pNew;
pTail = pTail->pNext;
}
}
}
void NodeFrame::refresh()
{
this->destroyed(m_scene);
m_seqPerLvl.clear();
m_scene = new QGraphicsScene(0, 0, this->width(), this->height());
this->setScene(m_scene);
m_netNode = new NetNode(false, "", m_scene);
setupTopo(m_netNode);
}
void NodeFrame::setupTopo(NetNode *netNode)
{
m_seqPerLvl.clear();
if (!netNode)
return;
for(int i = 0; i <10; i++) {
m_seqPerLvl.append(0);
}
PNODE pTemp = this->m_pHead;
for(; pTemp; pTemp=pTemp->pNext) {
int hops = pTemp->hops;
int key = pTemp->key;
if (key == 0) {
netNode->drawPixmap(0, 0, 0, 10, 10);
m_netNodeList << netNode;
m_headNode = netNode;
}
else {
m_seqPerLvl[hops]++;
NetNode *subNetNode = new NetNode(true, "", m_scene);
subNetNode->drawPixmap(key, hops, m_seqPerLvl[hops], 10, 10);
m_netNodeList << subNetNode;
NodeLink *link = new NodeLink(m_netNodeList.at(0), m_netNodeList.at(key));
if (link) {
// link->trackNodes();
m_scene->addItem(link);
}
}
}
}
void NodeFrame::refreshFrame()
{
refresh();
}