#include "qipedit.h"

#include "qalgorithms.h"

#include <QBoxLayout>
#include <QIntValidator>
#include <QLabel>
#include <QLineEdit>


QIPEdit::QIPEdit(QWidget * parent, const QString & ip): QWidget(parent) {
	layout = new QBoxLayout(QBoxLayout::LeftToRight, this);
	layout->setContentsMargins(0, 0, 0, 0);
	layout->setSpacing(1);
	QIntValidator * validator = new QIntValidator(0, 255, this);
	for (int i = 0; i < 4; i++) {
		edits.push_back(new QLineEdit(this));
		edits.back()->setAlignment(Qt::AlignHCenter);
		edits.back()->setMaxLength(3);
		edits.back()->setValidator(validator);
		edits.back()->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed);
		layout->addWidget(edits.back());
		if (i < 3) {
			dots.push_back(new QLabel(this));
			dots.back()->setText(".");
			dots.back()->adjustSize();
			layout->addWidget(dots.back());
		}
	}
	connect(edits[0], &QLineEdit::returnPressed, this, &QIPEdit::returnPressed0);
	connect(edits[1], &QLineEdit::returnPressed, this, &QIPEdit::returnPressed1);
	connect(edits[2], &QLineEdit::returnPressed, this, &QIPEdit::returnPressed2);
	connect(edits[3], &QLineEdit::returnPressed, this, &QIPEdit::returnPressed3);
	connect(edits[0], &QLineEdit::textChanged, this, &QIPEdit::textChanged0);
	connect(edits[1], &QLineEdit::textChanged, this, &QIPEdit::textChanged1);
	connect(edits[2], &QLineEdit::textChanged, this, &QIPEdit::textChanged2);
	connect(edits[3], &QLineEdit::textChanged, this, &QIPEdit::textChanged3);
	setLayout(layout);
	setIP(ip);
	cind = 0;
}


void QIPEdit::setIP(const QString & text) {
	QString s, str = text;
	s = str.left(str.indexOf('.'));
	edits[0]->setText(s == "" ? "0" : s);
	str = str.right(str.length() - s.length() - 1);
	s   = str.left(str.indexOf('.'));
	edits[1]->setText(s == "" ? "0" : s);
	str = str.right(str.length() - s.length() - 1);
	s   = str.left(str.indexOf('.'));
	edits[2]->setText(s == "" ? "0" : s);
	str = str.right(str.length() - s.length() - 1);
	edits[3]->setText(str == "" ? "0" : str);
}


QString QIPEdit::IP() {
	QString s;
	if (edits[0]->text() == "")
		s = "0.";
	else
		s = edits[0]->text() + ".";
	if (edits[1]->text() == "")
		s += "0.";
	else
		s += edits[1]->text() + ".";
	if (edits[2]->text() == "")
		s += "0.";
	else
		s += edits[2]->text() + ".";
	if (edits[3]->text() == "")
		s += "0";
	else
		s += edits[3]->text();
	return s;
}


void QIPEdit::returnPress(int index) {
	if (index < 3) {
		edits[index + 1]->setFocus();
		edits[index + 1]->setSelection(0, 3);
	}
}


void QIPEdit::textChange(int index, const QString & text) {
	if (text.length() == 3 && isVisible()) {
		returnPress(index);
	}
	emit valueChanged(IP());
}
