
/*
 * Copyright (C) 2020 by Savoir-faire Linux
 * Author: Mingrui Zhang <mingrui.zhang@savoirfairelinux.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <https://www.gnu.org/licenses/>.
 */
import QtQuick 2.15
import QtQuick.Controls 2.14
import net.jami.Models 1.0


/*
 * HoverableButton contains the following configurable properties:
 * 1. Color changes on different button state
 * 2. Radius control (rounded)
 * 3. Text content or image content
 * 4. Can use OnClicked slot to implement some click logic
 */
Button {
    id: hoverableButton
    property int fontPointSize: 9
    property int buttonImageHeight: hoverableButtonBackground.height - 10
    property int buttonImageWidth: hoverableButtonBackground.width - 10
    property string backgroundColor: JamiTheme.releaseColor
    property string onPressColor: JamiTheme.pressColor
    property string onReleaseColor: backgroundColor
    property string onEnterColor: JamiTheme.hoverColor
    property string onExitColor: backgroundColor
    property alias radius: hoverableButtonBackground.radius
    property alias source: hoverableButtonImage.source
    property string toolTipText: ""
    radius: height / 2
    function enterBtn(){
        btnMouseArea.entered()
    }
    function exitBtn(){
        btnMouseArea.exited()
    }
    function pressBtn(){
        btnMouseArea.pressed()
    }
    function releaseBtn(){
        btnMouseArea.released()
    }

    ToolTip.delay: Qt.styleHints.mousePressAndHoldInterval
    ToolTip.visible: hovered && (toolTipText.length > 0)
    ToolTip.text: toolTipText

    font.pointSize: fontPointSize
    font.kerning:  true
    hoverEnabled: true
    background: Rectangle {
        id: hoverableButtonBackground
        color: backgroundColor
        Image {
            id: hoverableButtonImage
            anchors.centerIn: hoverableButtonBackground
            height: buttonImageHeight
            width: buttonImageWidth
            fillMode: Image.PreserveAspectFit
            mipmap: true
            asynchronous: true
        }
        MouseArea {
            id: btnMouseArea
            anchors.fill: parent
            hoverEnabled: true
            onPressed: {
                hoverableButtonBackground.color = onPressColor
            }
            onReleased: {
                hoverableButtonBackground.color = onReleaseColor
                hoverableButton.clicked()
            }
            onEntered: {
                hoverableButtonBackground.color = onEnterColor
            }
            onExited: {
                hoverableButtonBackground.color = onExitColor
            }
        }
    }
}
