opaque/PortraitRow.qml

159 lines
4.4 KiB
QML
Raw Normal View History

2020-05-19 19:49:52 +00:00
import QtGraphicalEffects 1.0
import QtQuick 2.7
import QtQuick.Controls 2.4
import QtQuick.Controls.Material 2.0
import QtQuick.Layouts 1.3
import CustomQmlTypes 1.0
2020-05-19 20:25:56 +00:00
import "styles"
2020-12-15 01:16:49 +00:00
import "." as Opaque
2020-05-19 20:25:56 +00:00
import "theme"
2020-06-23 23:58:11 +00:00
import "../opaque/fonts"
2020-05-19 19:49:52 +00:00
import QtQuick.Controls 1.4
import QtQuick.Controls.Styles 1.4
Item {
2020-05-19 19:49:52 +00:00
id: crItem
2020-12-15 01:16:49 +00:00
implicitHeight: Math.max(cnMetric.height + onionMetric.height, Theme.contactPortraitSize) + Theme.paddingSmall * 2
height: implicitHeight
2020-05-19 19:49:52 +00:00
property string displayName
property alias image: portrait.source
property string handle
property bool isActive
property bool isHover
property string tag // profile version/type
2020-06-23 23:58:11 +00:00
property color rowColor: Theme.backgroundMainColor
property color rowHilightColor: Theme.backgroundHilightElementColor
2020-05-19 19:49:52 +00:00
property alias portraitBorderColor: portrait.portraitBorderColor
property alias portraitColor: portrait.portraitColor
property alias nameColor: cn.color
property alias onionColor: onion.color
property alias onionVisible: onion.visible
property alias badgeColor: portrait.badgeColor
2020-05-19 19:49:52 +00:00
property alias badgeVisible: portrait.badgeVisible
property alias badgeContent: portrait.badgeContent
2020-05-19 19:49:52 +00:00
property alias hoverEnabled: buttonMA.hoverEnabled
// Ideally read only for icons to match against
property alias color: crRect.color
2020-05-19 19:49:52 +00:00
property alias content: extraMeta.children
property alias portraitOverlayColor: portrait.overlayColor
property alias portraitPerformTransform: portrait.performTransform
2020-05-19 19:49:52 +00:00
signal clicked(string handle)
2020-12-15 01:16:49 +00:00
// Manual columnlayout using anchors!
// Elements on the left are bound left, elements on the right, right
// Center element (contact name/onion) gets whatever space is left
// because it can elide text when it becomes too small :)
// crRect.left <- portrait <- portraitMeta -> extraMeta -> crRect.right
Rectangle {
2020-05-19 19:49:52 +00:00
id: crRect
anchors.left: parent.left
anchors.right: parent.right
height: crItem.height
width: parent.width
2020-12-15 01:16:49 +00:00
// CONTACT ENTRY BACKGROUND COLOR
2020-06-23 23:58:11 +00:00
color: isHover ? crItem.rowHilightColor : (isActive ? crItem.rowHilightColor : crItem.rowColor)
2020-05-19 19:49:52 +00:00
Portrait {
id: portrait
anchors.verticalCenter: parent.verticalCenter
anchors.left: parent.left
2020-12-15 01:16:49 +00:00
anchors.leftMargin: Theme.paddingStandard
2020-05-19 19:49:52 +00:00
}
2020-12-15 01:16:49 +00:00
Column {
2020-05-19 19:49:52 +00:00
id: portraitMeta
anchors.left: portrait.right
2020-12-15 01:16:49 +00:00
anchors.right: extraMeta.left
anchors.leftMargin: Theme.paddingStandard
2020-05-19 19:49:52 +00:00
anchors.verticalCenter: parent.verticalCenter
2020-12-15 01:16:49 +00:00
Opaque.Label { // CONTACT NAME
2020-05-19 19:49:52 +00:00
id: cn
2020-12-15 01:16:49 +00:00
width: parent.width
elide: Text.ElideRight
2020-12-15 01:16:49 +00:00
header: true
2020-05-19 19:49:52 +00:00
text: displayName
2020-12-15 01:16:49 +00:00
wrapMode: Text.NoWrap
2020-05-19 19:49:52 +00:00
}
2020-12-15 01:16:49 +00:00
TextMetrics {
id: cnMetric
font: cn.font
text: cn.text
}
Opaque.Label { // Onion
2020-05-19 19:49:52 +00:00
id: onion
text: handle
2020-12-15 01:16:49 +00:00
width: parent.width
elide: Text.ElideRight
2020-12-15 01:16:49 +00:00
wrapMode: Text.NoWrap
}
2020-05-19 19:49:52 +00:00
2020-12-15 01:16:49 +00:00
TextMetrics {
id: onionMetric
font: onion.font
text: onion.text
2020-05-19 19:49:52 +00:00
}
}
Column {
id: extraMeta
2020-12-15 01:16:49 +00:00
width: Theme.uiIconSizeS + 2 * Theme.paddingMinimal
anchors.right: parent.right
2020-05-19 19:49:52 +00:00
anchors.verticalCenter: parent.verticalCenter
}
}
MouseArea { // Full row mouse area triggering onClick
id: buttonMA
anchors.fill: parent
hoverEnabled: true
onClicked: { crItem.clicked(crItem.handle) }
onEntered: {
isHover = true
}
onExited: {
isHover = false
}
onCanceled: {
isHover = false
}
2020-05-19 19:49:52 +00:00
}
Connections { // UPDATE UNREAD MESSAGES COUNTER
target: gcd
onResetMessagePane: function() {
isActive = false
}
onUpdateContactDisplayName: function(_handle, _displayName) {
if (handle == _handle) {
2020-06-23 23:58:11 +00:00
displayName = _displayName
2020-05-19 19:49:52 +00:00
}
}
onUpdateContactPicture: function(_handle, _image) {
if (handle == _handle) {
image = _image
}
}
}
}