// Copyright (c) 2017 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher.

import QtQuick 2.7
import QtQuick.Controls 2.0

import UM 1.1 as UM
import Cura 1.0 as Cura

Button
{
    id: base
    anchors.left: parent.left
    anchors.right: parent.right
    anchors.leftMargin: UM.Theme.getSize("sidebar_margin").width
    anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width
    background: Rectangle
    {
        implicitHeight: UM.Theme.getSize("section").height
        color: {
            if (base.color) {
                return base.color;
            } else if (!base.enabled) {
                return UM.Theme.getColor("setting_category_disabled");
            } else if (base.hovered && base.checkable && base.checked) {
                return UM.Theme.getColor("setting_category_active_hover");
            } else if (base.pressed || (base.checkable && base.checked)) {
                return UM.Theme.getColor("setting_category_active");
            } else if (base.hovered) {
                return UM.Theme.getColor("setting_category_hover");
            } else {
                return UM.Theme.getColor("setting_category");
            }
        }
        Behavior on color { ColorAnimation { duration: 50; } }
        Rectangle
        {
            height: UM.Theme.getSize("default_lining").height
            width: parent.width
            anchors.bottom: parent.bottom
            color: {
                if (!base.enabled) {
                    return UM.Theme.getColor("setting_category_disabled_border");
                } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
                    return UM.Theme.getColor("setting_category_active_hover_border");
                } else if (base.pressed || (base.checkable && base.checked)) {
                    return UM.Theme.getColor("setting_category_active_border");
                } else if (base.hovered || base.activeFocus) {
                    return UM.Theme.getColor("setting_category_hover_border");
                } else {
                    return UM.Theme.getColor("setting_category_border");
                }
            }
        }
    }

    signal showTooltip(string text)
    signal hideTooltip()
    signal contextMenuRequested()
    signal showAllHiddenInheritedSettings(string category_id)
    signal focusReceived()
    signal setActiveFocusToNextSetting(bool forward)

    property var focusItem: base

    //text: definition.label

    contentItem: Item {
        anchors.fill: parent
        anchors.left: parent.left

        Label {
            anchors
            {
                left: parent.left
                leftMargin: 2 * UM.Theme.getSize("default_margin").width + UM.Theme.getSize("section_icon").width
                right: parent.right;
                verticalCenter: parent.verticalCenter;
            }
            text: definition.label
            font: UM.Theme.getFont("setting_category")
            color:
            {
                if (!base.enabled) {
                    return UM.Theme.getColor("setting_category_disabled_text");
                } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
                    return UM.Theme.getColor("setting_category_active_hover_text");
                } else if (base.pressed || (base.checkable && base.checked)) {
                    return UM.Theme.getColor("setting_category_active_text");
                } else if (base.hovered || base.activeFocus) {
                    return UM.Theme.getColor("setting_category_hover_text");
                } else {
                    return UM.Theme.getColor("setting_category_text");
                }
            }
            fontSizeMode: Text.HorizontalFit
            minimumPointSize: 8
        }
        UM.RecolorImage
        {
            id: category_arrow
            anchors.verticalCenter: parent.verticalCenter
            anchors.right: parent.right
            anchors.rightMargin: UM.Theme.getSize("default_margin").width
            width: UM.Theme.getSize("standard_arrow").width
            height: UM.Theme.getSize("standard_arrow").height
            sourceSize.width: width
            sourceSize.height: width
            color:
            {
                if (!base.enabled) {
                    return UM.Theme.getColor("setting_category_disabled_text");
                } else if ((base.hovered || base.activeFocus) && base.checkable && base.checked) {
                    return UM.Theme.getColor("setting_category_active_hover_text");
                } else if (base.pressed || (base.checkable && base.checked)) {
                    return UM.Theme.getColor("setting_category_active_text");
                } else if (base.hovered || base.activeFocus) {
                    return UM.Theme.getColor("setting_category_hover_text");
                } else {
                    return UM.Theme.getColor("setting_category_text");
                }
            }
            source: base.checked ? UM.Theme.getIcon("arrow_bottom") : UM.Theme.getIcon("arrow_left")
        }
    }

    UM.RecolorImage
    {
        id: icon
        anchors.verticalCenter: parent.verticalCenter
        anchors.left: parent.left
        anchors.leftMargin: UM.Theme.getSize("default_margin").width
        color:
        {
            if (!base.enabled) {
                return UM.Theme.getColor("setting_category_disabled_text");
            } else if((base.hovered || base.activeFocus) && base.checkable && base.checked) {
                return UM.Theme.getColor("setting_category_active_hover_text");
            } else if(base.pressed || (base.checkable && base.checked)) {
                return UM.Theme.getColor("setting_category_active_text");
            } else if(base.hovered || base.activeFocus) {
                return UM.Theme.getColor("setting_category_hover_text");
            } else {
                return UM.Theme.getColor("setting_category_text");
            }
        }
        source: UM.Theme.getIcon(definition.icon)
        width: UM.Theme.getSize("section_icon").width;
        height: UM.Theme.getSize("section_icon").height;
        sourceSize.width: width + 15 * screenScaleFactor
        sourceSize.height: width + 15 * screenScaleFactor
    }

    checkable: true
    checked: definition.expanded

    onClicked:
    {
        if (definition.expanded) {
            settingDefinitionsModel.collapse(definition.key);
        } else {
            settingDefinitionsModel.expandAll(definition.key);
        }
        //Set focus so that tab navigation continues from this point on.
        //NB: This must be set AFTER collapsing/expanding the category so that the scroll position is correct.
        forceActiveFocus();
    }
    onActiveFocusChanged:
    {
        if(activeFocus)
        {
            base.focusReceived();
        }
    }

    Keys.onTabPressed:
    {
        base.setActiveFocusToNextSetting(true)
    }
    Keys.onBacktabPressed:
    {
        base.setActiveFocusToNextSetting(false)
    }

    UM.SimpleButton
    {
        id: settingsButton

        visible: base.hovered || settingsButton.hovered
        height: base.height * 0.6
        width: base.height * 0.6

        anchors {
            right: inheritButton.visible ? inheritButton.left : parent.right
            // use 1.9 as the factor because there is a 0.1 difference between the settings and inheritance warning icons
            rightMargin: inheritButton.visible ? UM.Theme.getSize("default_margin").width / 2 : category_arrow.width + UM.Theme.getSize("default_margin").width * 1.9
            verticalCenter: parent.verticalCenter
        }

        color: UM.Theme.getColor("setting_control_button")
        hoverColor: UM.Theme.getColor("setting_control_button_hover")
        iconSource: UM.Theme.getIcon("settings")

        onClicked: {
            Cura.Actions.configureSettingVisibility.trigger(definition)
        }
    }

    UM.SimpleButton
    {
        id: inheritButton

        anchors.verticalCenter: parent.verticalCenter
        anchors.right: parent.right
        anchors.rightMargin: category_arrow.width + UM.Theme.getSize("default_margin").width * 2

        visible:
        {
            if (Cura.SettingInheritanceManager.settingsWithInheritanceWarning.indexOf(definition.key) >= 0)
            {
                var children_with_override = Cura.SettingInheritanceManager.getChildrenKeysWithOverride(definition.key)
                for (var i = 0; i < children_with_override.length; i++)
                {
                    if (!settingDefinitionsModel.getVisible(children_with_override[i]))
                    {
                        return true
                    }
                }
                return false
            }
            return false
        }

        height: parent.height / 2
        width: height

        onClicked:
        {
            settingDefinitionsModel.expandAll(definition.key);
            base.checked = true;
            base.showAllHiddenInheritedSettings(definition.key);
        }

        color: UM.Theme.getColor("setting_control_button")
        hoverColor: UM.Theme.getColor("setting_control_button_hover")
        iconSource: UM.Theme.getIcon("notice")

        onEntered:
        {
            base.showTooltip(catalog.i18nc("@label","Some hidden settings use values different from their normal calculated value.\n\nClick to make these settings visible."))
        }

        onExited:
        {
            base.hideTooltip();
        }

        UM.I18nCatalog { id: catalog; name: "cura" }
    }
}
