#include "main_window.h"

const int EQ_index = 1; const int EC_index = 2;

void MainWindow::setupTextEdits()
{
    QPixmap pix(14, 14);
    pix.fill(Qt::black);
    tbtnColour->setIcon(pix);
    
    tbtngrpAlign = new QButtonGroup (this);
    tbtngrpAlign->addButton(tbtnAlignLeft);
    tbtngrpAlign->addButton(tbtnAlignCentre);
    tbtngrpAlign->addButton(tbtnAlignRight);
    tbtngrpAlign->addButton(tbtnAlignJustify);
    
    QObject::connect(tbtnItalic, SIGNAL(released()), this, SLOT(textItalic()));
    QObject::connect(tbtnBold, SIGNAL(released()), this, SLOT(textBold()));
    QObject::connect(tbtnUnderlined, SIGNAL(released()), this, SLOT(textUnderline()));
    QObject::connect(tbtnColour, SIGNAL(released()), this, SLOT(textColor()));
    QObject::connect(sizeComboBox, SIGNAL(activated(const QString &)), this, SLOT(textSize(const QString &)));
    QObject::connect(fontComboBox, SIGNAL(activated(const QString &)), this, SLOT(textFamily(const QString &)));
    QObject::connect(tbtngrpAlign, SIGNAL(buttonReleased(QAbstractButton *)), this, SLOT(textAlign(QAbstractButton *)));
    QObject::connect(SQQuestionTextEdit, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)),
            this, SLOT(currentCharFormatChanged(const QTextCharFormat &)));
    QObject::connect(SQQuestionTextEdit, SIGNAL(cursorPositionChanged()),
            this, SLOT(cursorPositionChanged()));
            
    ECtbtnColour->setIcon(pix);
            
    tbtngrpECAlign = new QButtonGroup (this);
    tbtngrpECAlign->addButton(ECtbtnAlignLeft);
    tbtngrpECAlign->addButton(ECtbtnAlignCentre);
    tbtngrpECAlign->addButton(ECtbtnAlignRight);
    tbtngrpECAlign->addButton(ECtbtnAlignJustify);
            
    QObject::connect(ECtbtnItalic, SIGNAL(released()), this, SLOT(textItalic()));
    QObject::connect(ECtbtnBold, SIGNAL(released()), this, SLOT(textBold()));
    QObject::connect(ECtbtnUnderlined, SIGNAL(released()), this, SLOT(textUnderline()));
    QObject::connect(ECtbtnColour, SIGNAL(released()), this, SLOT(textColor()));
    QObject::connect(ECsizeComboBox, SIGNAL(activated(const QString &)), this, SLOT(textSize(const QString &)));
    QObject::connect(ECfontComboBox, SIGNAL(activated(const QString &)), this, SLOT(textFamily(const QString &)));
    QObject::connect(tbtngrpECAlign, SIGNAL(buttonReleased(QAbstractButton *)), this, SLOT(textAlign(QAbstractButton *)));
    QObject::connect(ECTextEdit, SIGNAL(currentCharFormatChanged(const QTextCharFormat &)),
            this, SLOT(currentCharFormatChanged(const QTextCharFormat &)));
    QObject::connect(ECTextEdit, SIGNAL(cursorPositionChanged()),
            this, SLOT(cursorPositionChanged()));
}

void MainWindow::textBold()
{
    QTextCharFormat fmt;
    if (mainStackedWidget->currentIndex() == EQ_index) {
        fmt.setFontWeight(tbtnBold->isChecked() ? QFont::Bold : QFont::Normal);
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        fmt.setFontWeight(ECtbtnBold->isChecked() ? QFont::Bold : QFont::Normal);
    }
    mergeFormatOnWordOrSelection(fmt);
}

void MainWindow::textUnderline()
{
    QTextCharFormat fmt;
    if (mainStackedWidget->currentIndex() == EQ_index) {
        fmt.setFontUnderline(tbtnUnderlined->isChecked());
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        fmt.setFontUnderline(ECtbtnUnderlined->isChecked());
    }
    mergeFormatOnWordOrSelection(fmt);
}

void MainWindow::textItalic()
{
    QTextCharFormat fmt;
    if (mainStackedWidget->currentIndex() == EQ_index) {
        fmt.setFontItalic(tbtnItalic->isChecked());
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        fmt.setFontItalic(ECtbtnItalic->isChecked());
    }
    mergeFormatOnWordOrSelection(fmt);
}

void MainWindow::textFamily(const QString &f)
{
    QTextCharFormat fmt;
    fmt.setFontFamily(f);
    mergeFormatOnWordOrSelection(fmt);
}

void MainWindow::textSize(const QString &p)
{
    QTextCharFormat fmt;
    fmt.setFontPointSize(p.toFloat());
    mergeFormatOnWordOrSelection(fmt);
}

void MainWindow::textColor()
{
    QColor col;
    if (mainStackedWidget->currentIndex() == EQ_index) {
        col = QColorDialog::getColor(SQQuestionTextEdit->textColor(), this);
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        col = QColorDialog::getColor(ECTextEdit->textColor(), this);
    }
    if (!col.isValid())
        return;
    QTextCharFormat fmt;
    fmt.setForeground(col);
    mergeFormatOnWordOrSelection(fmt);
    colorChanged(col);
}

void MainWindow::textAlign(QAbstractButton *b)
{
    if (b == tbtnAlignLeft)
        SQQuestionTextEdit->setAlignment(Qt::AlignLeft);
    else if (b == tbtnAlignCentre)
        SQQuestionTextEdit->setAlignment(Qt::AlignHCenter);
    else if (b == tbtnAlignRight)
        SQQuestionTextEdit->setAlignment(Qt::AlignRight);
    else if (b == tbtnAlignJustify)
        SQQuestionTextEdit->setAlignment(Qt::AlignJustify);
    else if (b == ECtbtnAlignLeft)
        ECTextEdit->setAlignment(Qt::AlignLeft);
    else if (b == ECtbtnAlignCentre)
        ECTextEdit->setAlignment(Qt::AlignHCenter);
    else if (b == ECtbtnAlignRight)
        ECTextEdit->setAlignment(Qt::AlignRight);
    else if (b == ECtbtnAlignJustify)
        ECTextEdit->setAlignment(Qt::AlignJustify);
}

void MainWindow::mergeFormatOnWordOrSelection(const QTextCharFormat &format)
{
    if (mainStackedWidget->currentIndex() == EQ_index) {
        QTextCursor cursor = SQQuestionTextEdit->textCursor();
        if (!cursor.hasSelection())
            cursor.select(QTextCursor::WordUnderCursor);
        cursor.mergeCharFormat(format);
        SQQuestionTextEdit->mergeCurrentCharFormat(format);
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        QTextCursor cursor = ECTextEdit->textCursor();
        if (!cursor.hasSelection())
            cursor.select(QTextCursor::WordUnderCursor);
        cursor.mergeCharFormat(format);
        ECTextEdit->mergeCurrentCharFormat(format);
    }
}

void MainWindow::fontChanged(const QFont &f)
{
    if (mainStackedWidget->currentIndex() == EQ_index) {
        fontComboBox->setCurrentIndex(fontComboBox->findText(QFontInfo(f).family()));
        sizeComboBox->setCurrentIndex(sizeComboBox->findText(QString::number(f.pointSize())));
        tbtnBold->setChecked(f.bold());
        tbtnItalic->setChecked(f.italic());
        tbtnUnderlined->setChecked(f.underline());
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        ECfontComboBox->setCurrentIndex(ECfontComboBox->findText(QFontInfo(f).family()));
        ECsizeComboBox->setCurrentIndex(ECsizeComboBox->findText(QString::number(f.pointSize())));
        ECtbtnBold->setChecked(f.bold());
        ECtbtnItalic->setChecked(f.italic());
        ECtbtnUnderlined->setChecked(f.underline());
    }
}

void MainWindow::colorChanged(const QColor &c)
{
    QPixmap pix(14, 14);
    pix.fill(c);
    if (mainStackedWidget->currentIndex() == EQ_index) {
        tbtnColour->setIcon(pix);
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        ECtbtnColour->setIcon(pix);
    }
}

void MainWindow::alignmentChanged(Qt::Alignment a)
{
    if (mainStackedWidget->currentIndex() == EQ_index) {
        if (a & Qt::AlignLeft) {
            tbtnAlignLeft->setChecked(true);
        } else if (a & Qt::AlignHCenter) {
            tbtnAlignCentre->setChecked(true);
        } else if (a & Qt::AlignRight) {
            tbtnAlignRight->setChecked(true);
        } else if (a & Qt::AlignJustify) {
            tbtnAlignJustify->setChecked(true);
        }
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        if (a & Qt::AlignLeft) {
            ECtbtnAlignLeft->setChecked(true);
        } else if (a & Qt::AlignHCenter) {
            ECtbtnAlignCentre->setChecked(true);
        } else if (a & Qt::AlignRight) {
            ECtbtnAlignRight->setChecked(true);
        } else if (a & Qt::AlignJustify) {
            ECtbtnAlignJustify->setChecked(true);
        }
    }
}

void MainWindow::currentCharFormatChanged(const QTextCharFormat &format)
{
    fontChanged(format.font());
    colorChanged(format.foreground().color());
}

void MainWindow::cursorPositionChanged()
{
    if (mainStackedWidget->currentIndex() == EQ_index) {
        alignmentChanged(SQQuestionTextEdit->alignment());
    } else if (mainStackedWidget->currentIndex() == EC_index) {
        alignmentChanged(ECTextEdit->alignment());
    }
}