#include "cellsmonitorcheckboxdelegate.h"
#include <QCheckBox>
#include <QApplication>
#include <QPainter>

CheckBoxDelegate::CheckBoxDelegate(QObject *parent)
    :QStyledItemDelegate (parent)
{
    m_circleSize = 15;
}

QWidget *CheckBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(option)
    Q_UNUSED(index)

    //Cоздаем checkbox editor
    QCheckBox *editor = new QCheckBox(parent);
    return editor;
}

void CheckBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
{
    //Установливаем выбрано/не выбрано
    QCheckBox *cb = qobject_cast<QCheckBox *>(editor);
    cb->setStyleSheet("QCheckBox::indicator {\n    width: 20px;\n    height: " + QString::number( m_circleSize ) + "px;\n    border: 1px solid grey;\n    background: white;\n    border-radius:3px;\n}  \n\nQCheckBox::indicator:checked {\n    border-color: green;\n    background: green;\n    color:white;\n	/*image: url(:/res/checkbox_unchecked_hover.png);*/\n}  \n\n\n\nQCheckBox {\n  font-weight:bold;\n  font-size: 14px;\n}");
    cb->setChecked(index.data().toBool());
}

void CheckBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
{
    //Записываем данные в модель
    QCheckBox *cb = static_cast<QCheckBox *>(editor);
    int value = (cb->checkState()==Qt::Checked)? 1 : 0;
    model->setData(index, value, Qt::EditRole);
}

void CheckBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    Q_UNUSED(index);
    QStyleOptionButton checkboxstyle;
    QRect checkbox_rect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxstyle);

    //Центрирование
    checkboxstyle.rect = option.rect;
    checkboxstyle.rect.setLeft(option.rect.x() +
                               option.rect.width()/2 - checkbox_rect.width()/2);

    editor->setGeometry(checkboxstyle.rect);
}




void CheckBoxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
{
    int row = index.row();
    int col = index.column();

    painter->save();

    //Получаем данные
    auto data = index.model()->data(index, Qt::DisplayRole);

    //Создаем стиль CheckBox
    QStyleOptionButton checkboxstyle;
    //Выбрано или не выбрано

    bool isChecked = data.toBool();
    if(data.toBool())
        checkboxstyle.state = QStyle::State_On|QStyle::State_Enabled;
    else
        checkboxstyle.state = QStyle::State_Off|QStyle::State_Enabled;



    if(!index.data().isNull())
    {
        QRect checkbox_rect = QApplication::style()->subElementRect(QStyle::SE_CheckBoxIndicator, &checkboxstyle);

        //Центрирование
        checkboxstyle.rect = option.rect;
        checkboxstyle.rect.setLeft(option.rect.x() +
                                   option.rect.width()/2 - checkbox_rect.width()/2);
        RectangleClass r;
        int centerX = option.rect.width()/2 - m_circleSize/2;
        int centerY = option.rect.height()/2 - m_circleSize/2;


        r.draw
        (
            painter,
            QRectF(
                    option.rect.x() + centerX, //+mx,
                    option.rect.y() + centerY, //+my,
                    m_circleSize,
                    m_circleSize
                    ),
            isChecked ? QColor("#009352") // green
                      : QColor("#dfe0eb"),
            11
        );
        }
        else {
            RectClass r;
            QRectF rectT( option.rect );
            r.draw
            (
                painter,
                rectT
            );
        }


        painter->restore();
}
