
import QtQuick 2.14
import QtQuick.Controls 2.14
import QtQuick.Layouts 1.14
import QtQuick.Scene3D 2.14
import Qt3D.Core 2.14
import Qt3D.Render 2.14
import Qt3D.Input 2.14
import Qt3D.Extras 2.14

import QtQuick 2.14 as QQ2
import QtQuick.Dialogs 1.3
import QtQuick.Window 2.2
import QtQuick.Controls 2.5
import Qt.labs.settings 1.0

Window {
    id: filterWindow
    title : "Points Filter"
    width: columns.width + 40
    height: columns.height
    flags:  Qt.Dialog 
            | Qt.WindowSystemMenuHint | Qt.WindowTitleHint 
            | Qt.WindowCloseButtonHint | Qt.WindowOkButtonHint 
            | Qt.FrameWindowHint

    visible: true
    // modality: Qt.ApplicationModal 
    color: activePalette.window
    function setFilter(flag) {
        if (flag) {
            var float_list = [minAngle.value / 100, maxAngle.value / 100, minDistance.value / 100, maxDistance.value / 100, 
                    minX.value / 100, maxX.value / 100, minY.value / 100, maxY.value / 100, minZ.value / 100, maxZ.value / 100]
            var int_list = [minIntensity.value, maxIntensity.value, minConfidence.value, maxConfidence.value]
            filterButton.checked = true
            modelData.filterModel.setFilter(true, float_list, int_list)
            modelData.filterModel.filterEnabledChanged()
            modelData.renderStateChanged()
        }
        else {
            var float_list = [minAngle.value / 100, maxAngle.value / 100, minDistance.value / 100, maxDistance.value / 100, 
                    minX.value / 100, maxX.value / 100, minY.value / 100, maxY.value / 100, minZ.value / 100, maxZ.value / 100]
            var int_list = [minIntensity.value, maxIntensity.value, minConfidence.value, maxConfidence.value]
            filterButton.checked = false
            modelData.filterModel.setFilter(false, float_list, int_list)
            modelData.filterModel.filterEnabledChanged()
            modelData.renderStateChanged()
        }
    }
    ColumnLayout {
        id: columns
        x: 20
        spacing: 10
        Rectangle {
            height: 10
        }
        Text {
            color: activePalette.text
            
            text: "Azimuth (deg) Range"
        }
        RowLayout {
            id: rowItem
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            DoubleSpinBox {
                id: minAngle
                value: -36000
                from: -36000
                to: 36000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            DoubleSpinBox {
                id: maxAngle
                value: 36000
                from: -36000
                to: 36000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "Polar Distance (m) Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            DoubleSpinBox {
                id: minDistance
                value: 0
                from: 0
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            DoubleSpinBox {
                id: maxDistance
                value: 100000
                from: 0
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }

        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "X (m) Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            DoubleSpinBox {
                id: minX
                value: -100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            DoubleSpinBox {
                id: maxX
                value: 100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "Y (m) Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            DoubleSpinBox {
                id: minY
                value: -100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            DoubleSpinBox {
                id: maxY
                value: 100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "Z (m) Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            DoubleSpinBox {
                id: minZ
                value: -100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            DoubleSpinBox {
                id: maxZ
                value: 100000
                from: -100000
                to: 100000
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "Intensity Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            FilterSpinBox {
                id: minIntensity
                editable: true
                value: 0
                from: 0
                to: 256
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            FilterSpinBox {
                id: maxIntensity
                editable: true
                value: 256
                from: 0
                to: 256
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }   
        }
        Rectangle {
            width: rowItem.width
            height: 2
            color: activePalette.button
        }
        Text {
            color: activePalette.text
            
            text: "Confidence Range"
        }
        RowLayout {
            Text {
                color: activePalette.text
                
                text: "Min."
            }
            FilterSpinBox {
                id: minConfidence
                editable: true
                value: 0
                from: 0
                to: 256
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }
            Rectangle {
                width: 50
            }
            Text {
                color: activePalette.text
                
                text: "Max."
            }
            FilterSpinBox {
                id: maxConfidence
                editable: true
                value: 256
                from: 0
                to: 256
                onValueModified: {
                    if (modelData.filterModel.filterEnabled) {
                        setFilter(true)
                    }
                }
            }   
        }
        Rectangle {
            height: 10
        }
        RowLayout {
            spacing: 20
            Rectangle {
                width: 180
                height: 40
                color: "transparent" 
            }

            // DefaultButton {
            //     focusPolicy: Qt.ClickFocus
            //     text: modelData.filterModel.filterMode == 0 ? "&&" : "||"
            //     implicitWidth: 70
            //     implicitHeight: 30
            //     onClicked: {
            //         modelData.filterModel.filterMode = (modelData.filterModel.filterMode + 1) % 2
            //         modelData.filterModel.filterModeChanged()
            //         modelData.renderStateChanged()
            //     }
            // }

            DefaultButton {
                focusPolicy: Qt.ClickFocus
                text: "Reset" 
                implicitWidth: 70
                implicitHeight: 30
                onClicked: {
                    minAngle.value = -36000
                    maxAngle.value = 36000
                    minDistance.value = 0
                    maxDistance.value = 100000
                    minX.value = -100000
                    maxX.value = 100000
                    minY.value = -100000
                    maxY.value = 100000
                    minZ.value = -100000
                    maxZ.value = 100000
                    minIntensity.value = 0
                    maxIntensity.value = 256
                    minConfidence.value = 0
                    maxConfidence.value = 256

                    filterButton.checked = false
                    modelData.filterModel.reset()
                    modelData.filterModel.filterEnabledChanged()
                    modelData.renderStateChanged()
                }
            }
            DefaultButton {
                focusPolicy: Qt.ClickFocus
                text: modelData.filterModel.filterEnabled? "OFF" : "ON"
                implicitWidth: 70
                implicitHeight: 30
                onClicked: {
                    setFilter(!modelData.filterModel.filterEnabled)
                }
            }
        }
        Rectangle {
            height: 10
        }
    }
    Settings {
        property alias minAngleValue: minAngle.value
        property alias maxAngleValue: maxAngle.value
        property alias minDistanceValue: minDistance.value
        property alias maxDistanceValue: maxDistance.value
        property alias minXValue: minX.value
        property alias maxXValue: maxX.value
        property alias minYValue: minY.value
        property alias maxYValue: maxY.value
        property alias minZValue: minZ.value
        property alias maxZValue: maxZ.value
        property alias minIntensityValue: minIntensity.value
        property alias maxIntensityValue: maxIntensity.value
        property alias minConfidenceValue: minConfidence.value
        property alias maxConfidenceValue: maxConfidence.value
    }
}