#include <Core/Log/LOG.h>
#include <Core/Math_Tools/INTERVAL.h>
#include "QT_MAIN_WINDOW.h"
#include "QT_MATH.h"
#include "QT_RENDER_UTILS.h"
#include "QT_SLICE_MODE.h"
#include <QColorDialog>
#include <QDoubleValidator>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <QMetaMethod>
#include <QMetaObject>
#include <QPalette>
#include <QPushButton>
#include <QRadioButton>
#include <QString>

namespace PhysBAM{
//#####################################################################
// Constructor
//#####################################################################
QT_SLICE_MODE::
QT_SLICE_MODE(QT_MAIN_WINDOW& main_window,const GRID<TV>& grid)
    :QDialog(&main_window,Qt::Tool),main_window(main_window),grid(grid)
{
    setWindowTitle(tr("Slice mode"));
    layout=new QGridLayout(this);
    main_window.window.ru->slice_grid=&this->grid;

    layout->addWidget(new QLabel(tr("Axis"),this),0,0);
    axis_x=new QRadioButton(tr("x"),this);
    axis_y=new QRadioButton(tr("y"),this);
    axis_z=new QRadioButton(tr("z"),this);
    axis_x->setFixedWidth(40);
    axis_y->setFixedWidth(40);
    axis_z->setFixedWidth(40);
    layout->addWidget(axis_x,0,1);
    layout->addWidget(axis_y,0,2);
    layout->addWidget(axis_z,0,3);
    axis_x->setChecked(true);

    layout->addWidget(new QLabel(tr("Slice"),this),1,0);
    slice_i=new QLineEdit(QString::number(main_window.window.ru->slice_index),this);
    slice_i->setValidator(new QIntValidator(this));
    slice_i->setFixedWidth(40);
    layout->addWidget(slice_i,1,1);
    slice_m=new QPushButton(tr("-"),this);
    slice_p=new QPushButton(tr("+"),this);
    slice_m->setFixedWidth(40);
    slice_p->setFixedWidth(40);
    layout->addWidget(slice_m,1,2);
    layout->addWidget(slice_p,1,3);
    
    exit_slice_mode=new QPushButton(tr("Exit slice mode"),this);
    layout->addWidget(exit_slice_mode,2,0,1,4);

    connect(this,SIGNAL(finished(int)),this,SLOT(Close()));
    connect(axis_x,&QRadioButton::clicked,this,[this](){Set_Axis(0);});
    connect(axis_y,&QRadioButton::clicked,this,[this](){Set_Axis(1);});
    connect(axis_z,&QRadioButton::clicked,this,[this](){Set_Axis(2);});
    connect(slice_i,&QLineEdit::textEdited,this,[this](){Update_Index();});
    connect(slice_m,&QPushButton::clicked,this,[this](){Set_Index(this->main_window.window.ru->slice_index-1);});
    connect(slice_p,&QPushButton::clicked,this,[this](){Set_Index(this->main_window.window.ru->slice_index+1);});
    connect(exit_slice_mode,&QPushButton::clicked,this,
        [this](){QDialog::done(QDialog::Rejected);});

    Set_Axis(0);
}
//#####################################################################
// Destructor
//#####################################################################
QT_SLICE_MODE::
~QT_SLICE_MODE()
{
}
//#####################################################################
// Function Update_Axis
//#####################################################################
void QT_SLICE_MODE::
Set_Axis(int axis)
{
    main_window.window.ru->slice_axis=axis;
    Set_Index(grid.Cell_Indices().Center()(main_window.window.ru->slice_axis));
}
//#####################################################################
// Function Change_Index
//#####################################################################
void QT_SLICE_MODE::
Change_Index()
{
    main_window.window.ru->Set_Clipping_Planes();
    main_window.window.update();
}
//#####################################################################
// Function Set_Index
//#####################################################################
void QT_SLICE_MODE::
Set_Index(int index)
{
    main_window.window.ru->slice_index=index;
    slice_i->setText(QString::number(main_window.window.ru->slice_index));
    Change_Index();
}
//#####################################################################
// Function Update_Index
//#####################################################################
void QT_SLICE_MODE::
Update_Index()
{
    main_window.window.ru->slice_index=slice_i->text().toInt();
    Change_Index();
}
//#####################################################################
// Function Update_Index
//#####################################################################
void QT_SLICE_MODE::
Close()
{
    main_window.window.ru->slice_grid=nullptr;
    main_window.window.update();
}
}
