Split HButton components, add HMenu/HMenuItem
This commit is contained in:
		@@ -9,65 +9,29 @@ Button {
 | 
			
		||||
    rightPadding: spacing / 1.5
 | 
			
		||||
    topPadding: spacing / 2
 | 
			
		||||
    bottomPadding: spacing / 2
 | 
			
		||||
    opacity: enabled ? 1 : theme.disabledElementsOpacity
 | 
			
		||||
    iconItem.svgName: loading ? "hourglass" : icon.name
 | 
			
		||||
 | 
			
		||||
    onVisibleChanged: if (! visible) loading = false
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    readonly property alias ico: ico
 | 
			
		||||
    readonly property alias label: label
 | 
			
		||||
    readonly property alias iconItem: contentItem.icon
 | 
			
		||||
    readonly property alias label: contentItem.label
 | 
			
		||||
 | 
			
		||||
    property string iconName: ""
 | 
			
		||||
    property color backgroundColor: theme.controls.button.background
 | 
			
		||||
    property bool loading: false
 | 
			
		||||
    property bool circle: false
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Behavior on opacity { HNumberAnimation {} }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    background: HRectangle {
 | 
			
		||||
    background: HButtonBackground {
 | 
			
		||||
        button: button
 | 
			
		||||
        buttonTheme: theme.controls.button
 | 
			
		||||
        radius: circle ? height : 0
 | 
			
		||||
        color: backgroundColor
 | 
			
		||||
 | 
			
		||||
        HRectangle {
 | 
			
		||||
            anchors.fill: parent
 | 
			
		||||
            radius: parent.radius
 | 
			
		||||
            color: button.checked ?
 | 
			
		||||
                   theme.controls.button.checkedOverlay :
 | 
			
		||||
 | 
			
		||||
                   button.enabled && button.pressed ?
 | 
			
		||||
                   theme.controls.button.pressedOverlay :
 | 
			
		||||
 | 
			
		||||
                   (button.enabled && button.hovered) || button.visualFocus ?
 | 
			
		||||
                   theme.controls.button.hoveredOverlay :
 | 
			
		||||
 | 
			
		||||
                   "transparent"
 | 
			
		||||
 | 
			
		||||
            Behavior on color { HColorAnimation { factor: 0.5 } }
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    contentItem: HRowLayout {
 | 
			
		||||
        spacing: button.spacing
 | 
			
		||||
 | 
			
		||||
        HIcon {
 | 
			
		||||
            id: ico
 | 
			
		||||
            svgName: loading ? "hourglass" : iconName
 | 
			
		||||
 | 
			
		||||
            Layout.fillHeight: true
 | 
			
		||||
            Layout.alignment: Qt.AlignCenter
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        HLabel {
 | 
			
		||||
            id: label
 | 
			
		||||
            text: button.text
 | 
			
		||||
            visible: Boolean(text)
 | 
			
		||||
            color: theme.controls.button.text
 | 
			
		||||
            horizontalAlignment: Text.AlignHCenter
 | 
			
		||||
            verticalAlignment: Text.AlignVCenter
 | 
			
		||||
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
            Layout.fillHeight: true
 | 
			
		||||
        }
 | 
			
		||||
    contentItem: HButtonContent {
 | 
			
		||||
        id: contentItem
 | 
			
		||||
        button: button
 | 
			
		||||
        buttonTheme: theme.controls.button
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										29
									
								
								src/qml/Base/HButtonBackground.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/qml/Base/HButtonBackground.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
import QtQuick 2.12
 | 
			
		||||
import QtQuick.Controls 2.12
 | 
			
		||||
 | 
			
		||||
HRectangle {
 | 
			
		||||
    opacity: enabled ? 1 : theme.disabledElementsOpacity
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    property AbstractButton button
 | 
			
		||||
    property QtObject buttonTheme
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Behavior on opacity { HNumberAnimation {} }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    HRectangle {
 | 
			
		||||
        anchors.fill: parent
 | 
			
		||||
        radius: parent.radius
 | 
			
		||||
        color: button.checked ? buttonTheme.checkedOverlay :
 | 
			
		||||
 | 
			
		||||
               button.enabled && button.pressed ? buttonTheme.pressedOverlay :
 | 
			
		||||
 | 
			
		||||
               (button.enabled && button.hovered) || button.visualFocus ?
 | 
			
		||||
               buttonTheme.hoveredOverlay :
 | 
			
		||||
 | 
			
		||||
               "transparent"
 | 
			
		||||
 | 
			
		||||
        Behavior on color { HColorAnimation { factor: 0.5 } }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										41
									
								
								src/qml/Base/HButtonContent.qml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/qml/Base/HButtonContent.qml
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,41 @@
 | 
			
		||||
import QtQuick 2.12
 | 
			
		||||
import QtQuick.Controls 2.12
 | 
			
		||||
import QtQuick.Layouts 1.12
 | 
			
		||||
 | 
			
		||||
HRowLayout {
 | 
			
		||||
    spacing: button.spacing
 | 
			
		||||
    opacity: enabled ? 1 : theme.disabledElementsOpacity
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    property AbstractButton button
 | 
			
		||||
    property QtObject buttonTheme
 | 
			
		||||
 | 
			
		||||
    readonly property alias icon: icon
 | 
			
		||||
    readonly property alias label: label
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    Behavior on opacity { HNumberAnimation {} }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    HIcon {
 | 
			
		||||
        id: icon
 | 
			
		||||
        svgName: button.icon.name
 | 
			
		||||
        colorize: button.icon.color
 | 
			
		||||
        cache: button.icon.cache
 | 
			
		||||
 | 
			
		||||
        Layout.fillHeight: true
 | 
			
		||||
        Layout.alignment: Qt.AlignCenter
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    HLabel {
 | 
			
		||||
        id: label
 | 
			
		||||
        text: button.text
 | 
			
		||||
        visible: Boolean(text)
 | 
			
		||||
        color: buttonTheme.text
 | 
			
		||||
        horizontalAlignment: Text.AlignHCenter
 | 
			
		||||
        verticalAlignment: Text.AlignVCenter
 | 
			
		||||
 | 
			
		||||
        Layout.fillWidth: true
 | 
			
		||||
        Layout.fillHeight: true
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -73,7 +73,7 @@ HRectangle {
 | 
			
		||||
 | 
			
		||||
                    id: button
 | 
			
		||||
                    text: modelData.text
 | 
			
		||||
                    iconName: modelData.iconName || ""
 | 
			
		||||
                    icon.name: modelData.iconName || ""
 | 
			
		||||
                    enabled: modelData.enabled
 | 
			
		||||
                    onClicked: buttonCallbacks[modelData.name](button)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,4 +2,26 @@ import QtQuick 2.12
 | 
			
		||||
import QtQuick.Controls 2.12
 | 
			
		||||
 | 
			
		||||
MenuItem {
 | 
			
		||||
    id: menuItem
 | 
			
		||||
    spacing: theme.spacing
 | 
			
		||||
    leftPadding: spacing / 1.5
 | 
			
		||||
    rightPadding: spacing / 1.5
 | 
			
		||||
    topPadding: spacing / 2
 | 
			
		||||
    bottomPadding: spacing / 2
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    readonly property alias iconItem: contentItem.icon
 | 
			
		||||
    readonly property alias label: contentItem.label
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    background: HButtonBackground {
 | 
			
		||||
        button: menuItem
 | 
			
		||||
        buttonTheme: theme.controls.menuItem
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    contentItem: HButtonContent {
 | 
			
		||||
        id: contentItem
 | 
			
		||||
        button: menuItem
 | 
			
		||||
        buttonTheme: theme.controls.menuItem
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -71,7 +71,7 @@ HRectangle {
 | 
			
		||||
                    HButton {
 | 
			
		||||
                        id: button
 | 
			
		||||
                        text: modelData.text
 | 
			
		||||
                        iconName: modelData.iconName
 | 
			
		||||
                        icon.name: modelData.iconName
 | 
			
		||||
                        onClicked: buttonCallbacks[modelData.name](button)
 | 
			
		||||
 | 
			
		||||
                        Layout.preferredHeight: theme.baseElementsHeight
 | 
			
		||||
 
 | 
			
		||||
@@ -75,8 +75,8 @@ HRectangle {
 | 
			
		||||
                ]
 | 
			
		||||
                HButton {
 | 
			
		||||
                    backgroundColor: "transparent"
 | 
			
		||||
                    iconName: "room-view-" + modelData
 | 
			
		||||
                    ico.dimension: 22
 | 
			
		||||
                    icon.name: "room-view-" + modelData
 | 
			
		||||
                    iconItem.dimension: 22
 | 
			
		||||
                    height: parent.height
 | 
			
		||||
                    autoExclusive: true
 | 
			
		||||
                    checked: activeButton == modelData
 | 
			
		||||
@@ -101,7 +101,7 @@ HRectangle {
 | 
			
		||||
        visible: opacity > 0
 | 
			
		||||
 | 
			
		||||
        backgroundColor: "transparent"
 | 
			
		||||
        iconName: "reduced-room-buttons"
 | 
			
		||||
        icon.name: "reduced-room-buttons"
 | 
			
		||||
 | 
			
		||||
        Behavior on opacity {
 | 
			
		||||
            HNumberAnimation { duration: buttonsAnimation.duration * 2 }
 | 
			
		||||
 
 | 
			
		||||
@@ -33,7 +33,7 @@ HColumnLayout {
 | 
			
		||||
    HRowLayout {
 | 
			
		||||
        HButton {
 | 
			
		||||
            id: exportButton
 | 
			
		||||
            iconName: "export-keys"
 | 
			
		||||
            icon.name: "export-keys"
 | 
			
		||||
            text: qsTr("Export")
 | 
			
		||||
            enabled: false
 | 
			
		||||
 | 
			
		||||
@@ -43,7 +43,7 @@ HColumnLayout {
 | 
			
		||||
 | 
			
		||||
        HButton {
 | 
			
		||||
            id: importButton
 | 
			
		||||
            iconName: "import-keys"
 | 
			
		||||
            icon.name: "import-keys"
 | 
			
		||||
            text: qsTr("Import")
 | 
			
		||||
 | 
			
		||||
            Layout.fillWidth: true
 | 
			
		||||
 
 | 
			
		||||
@@ -178,7 +178,7 @@ HGridLayout {
 | 
			
		||||
                property bool avatarChangeRunning: false
 | 
			
		||||
 | 
			
		||||
                id: saveButton
 | 
			
		||||
                iconName: "apply"
 | 
			
		||||
                icon.name: "apply"
 | 
			
		||||
                text: qsTr("Apply")
 | 
			
		||||
                loading: nameChangeRunning || avatarChangeRunning
 | 
			
		||||
                enabled:
 | 
			
		||||
@@ -190,7 +190,7 @@ HGridLayout {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            HButton {
 | 
			
		||||
                iconName: "cancel"
 | 
			
		||||
                icon.name: "cancel"
 | 
			
		||||
                text: qsTr("Cancel")
 | 
			
		||||
                enabled: saveButton.enabled && ! saveButton.loading
 | 
			
		||||
                onClicked: cancelChanges()
 | 
			
		||||
 
 | 
			
		||||
@@ -63,8 +63,8 @@ HPage {
 | 
			
		||||
                model: ["username", "email", "phone"]
 | 
			
		||||
 | 
			
		||||
                HButton {
 | 
			
		||||
                    iconName: modelData
 | 
			
		||||
                    ico.dimension: 24
 | 
			
		||||
                    icon.name: modelData
 | 
			
		||||
                    iconItem.dimension: 24
 | 
			
		||||
                    circle: true
 | 
			
		||||
                    checked: loginWith == modelData
 | 
			
		||||
                    enabled: modelData == "username"
 | 
			
		||||
 
 | 
			
		||||
@@ -51,7 +51,7 @@ HTileDelegate {
 | 
			
		||||
 | 
			
		||||
    HButton {
 | 
			
		||||
        id: expand
 | 
			
		||||
        iconName: "expand"
 | 
			
		||||
        icon.name: "expand"
 | 
			
		||||
        backgroundColor: "transparent"
 | 
			
		||||
        padding: sidePane.currentSpacing / 1.5
 | 
			
		||||
        rightPadding: leftPadding
 | 
			
		||||
@@ -60,9 +60,9 @@ HTileDelegate {
 | 
			
		||||
        visible: opacity > 0
 | 
			
		||||
        opacity: accountDelegate.forceExpand ? 0 : 1
 | 
			
		||||
 | 
			
		||||
        ico.transform: Rotation {
 | 
			
		||||
            origin.x: expand.ico.dimension / 2
 | 
			
		||||
            origin.y: expand.ico.dimension / 2
 | 
			
		||||
        iconItem.transform: Rotation {
 | 
			
		||||
            origin.x: expand.iconItem.dimension / 2
 | 
			
		||||
            origin.y: expand.iconItem.dimension / 2
 | 
			
		||||
 | 
			
		||||
            angle: collapsed ? 180 : 90
 | 
			
		||||
            Behavior on angle { HNumberAnimation {} }
 | 
			
		||||
 
 | 
			
		||||
@@ -12,7 +12,7 @@ HRowLayout {
 | 
			
		||||
    Layout.preferredHeight: theme.baseElementsHeight
 | 
			
		||||
 | 
			
		||||
    HButton {
 | 
			
		||||
        iconName: "add-account"
 | 
			
		||||
        icon.name: "add-account"
 | 
			
		||||
        backgroundColor: theme.sidePane.settingsButton.background
 | 
			
		||||
        onClicked: pageLoader.showPage("SignIn")
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -96,15 +96,23 @@ controls:
 | 
			
		||||
        color pressedOverlay: hsluv(0, 0, 50, 0.6)
 | 
			
		||||
        color checkedOverlay: colors.accentBackground
 | 
			
		||||
 | 
			
		||||
    menuItem:
 | 
			
		||||
        color background: controls.button.background
 | 
			
		||||
        color text:       controls.button.text
 | 
			
		||||
 | 
			
		||||
        color hoveredOverlay: controls.button.hoveredOverlay
 | 
			
		||||
        color pressedOverlay: controls.button.hoveredOverlay
 | 
			
		||||
        color checkedOverlay: controls.button.hoveredOverlay
 | 
			
		||||
 | 
			
		||||
    checkBox:
 | 
			
		||||
        color checkIconColor: colors.strongAccentBackground
 | 
			
		||||
        color boxBackground:  colors.inputBackground
 | 
			
		||||
        color boxBackground:  controls.button.background
 | 
			
		||||
 | 
			
		||||
        color boxBorder:        hsluv(0, 0, 50, 0.3)
 | 
			
		||||
        color boxHoveredBorder: colors.accentBackground
 | 
			
		||||
        color boxPressedBorder: colors.strongAccentBackground
 | 
			
		||||
 | 
			
		||||
        color text:             colors.text
 | 
			
		||||
        color text: controls.button.text
 | 
			
		||||
 | 
			
		||||
    listView:
 | 
			
		||||
        color highlight: hsluv(0, 0, 50, 0.3)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user