nextcloud-desktop/src/gui/tray/window.qml

440 lines
17 KiB
QML
Raw Normal View History

import QtQml 2.2
import QtQuick 2.9
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3
import QtGraphicalEffects 1.0
Window {
id: trayWindow
visible: true
width: 400
height: 500
color: "transparent"
flags: Qt.FramelessWindowHint
Component.onCompleted: {
/* desktopAvailableWidth and Height doesn't include the system tray bar
but breaks application anyway on windows when using multi monitor setup,
will look for a better solution later, for now just get this thing complete */
//setX(Screen.desktopAvailableWidth - width);
//setY(Screen.desktopAvailableHeight + height);
}
Connections {
target: systrayBackend
onRefreshCurrentUserGui: {
currentAccountAvatar.source = systrayBackend.currentUserAvatar()
currentAccountUser.text = systrayBackend.currentUserName()
currentAccountServer.text = systrayBackend.currentUserServer()
}
}
Rectangle {
id: trayWindowBackground
anchors.fill: parent
radius: 10
Rectangle {
id: trayWindowHeaderBackground
anchors.left: trayWindowBackground.left
anchors.top: trayWindowBackground.top
height: 60
width: parent.width
radius: 9
color: "#0082c9"
Rectangle {
anchors.left: trayWindowHeaderBackground.left
anchors.bottom: trayWindowHeaderBackground.bottom
height: 30
width: parent.width
color: "#0082c9"
}
RowLayout {
id: trayWindowHeaderLayout
spacing: 0
anchors.fill: parent
Button {
id: currentAccountButton
Layout.preferredWidth: 220
Layout.preferredHeight: (trayWindowHeaderBackground.height)
display: AbstractButton.IconOnly
flat: true
MouseArea {
id: accountBtnMouseArea
anchors.fill: parent
hoverEnabled: true
onClicked:
{
accountMenu.open()
}
Menu {
id: accountMenu
x: (currentAccountButton.x + 2)
y: (currentAccountButton.y + currentAccountButton.height + 2)
width: (currentAccountButton.width - 4)
background: Rectangle {
border.color: "#0082c9"
radius: 2
}
Instantiator {
model: systrayBackend
delegate: UserLine {}
onObjectAdded: accountMenu.insertItem(index, object)
onObjectRemoved: accountMenu.removeItem(object)
}
MenuSeparator { id: accountMenuSeparator }
MenuItem {
text: (systrayBackend.isCurrentUserConnected() ? "Logout" : "Login")
onClicked: (systrayBackend.isCurrentUserConnected()
? systrayBackend.logout()
: systrayBackend.login() )
}
MenuItem {
text: "Add Account"
onClicked: systrayBackend.addAccount()
}
MenuItem {
text: "Remove Account"
onClicked: systrayBackend.removeAccount()
}
Component.onCompleted: {
if(systrayBackend.numUsers() === 0) {
accountMenuSeparator.height = 0
} else {
accountMenuSeparator.height = 13
}
}
}
}
background:
Item {
id: leftHoverContainer
height: currentAccountButton.height
width: currentAccountButton.width
Rectangle {
width: currentAccountButton.width / 2
height: currentAccountButton.height / 2
color: "transparent"
clip: true
Rectangle {
width: currentAccountButton.width
height: currentAccountButton.height
radius: 10
color: "white"
opacity: 0.2
visible: accountBtnMouseArea.containsMouse
}
}
Rectangle {
width: currentAccountButton.width / 2
height: currentAccountButton.height / 2
anchors.bottom: leftHoverContainer.bottom
color: "white"
opacity: 0.2
visible: accountBtnMouseArea.containsMouse
}
Rectangle {
width: currentAccountButton.width / 2
height: currentAccountButton.height / 2
anchors.right: leftHoverContainer.right
color: "white"
opacity: 0.2
visible: accountBtnMouseArea.containsMouse
}
Rectangle {
width: currentAccountButton.width / 2
height: currentAccountButton.height / 2
anchors.right: leftHoverContainer.right
anchors.bottom: leftHoverContainer.bottom
color: "white"
opacity: 0.2
visible: accountBtnMouseArea.containsMouse
}
}
RowLayout {
id: accountControlRowLayout
height: currentAccountButton.height
width: currentAccountButton.width
spacing: 0
Image {
id: currentAccountAvatar
Layout.leftMargin: 8
verticalAlignment: Qt.AlignCenter
source: systrayBackend.currentUserAvatar()
Layout.preferredHeight: (trayWindowHeaderBackground.height -16)
Layout.preferredWidth: (trayWindowHeaderBackground.height -16)
}
Column {
id: accountLabels
spacing: 4
Layout.alignment: Qt.AlignLeft
Layout.leftMargin: 6
Label {
id: currentAccountUser
text: systrayBackend.currentUserName()
color: "white"
font.pointSize: 9
font.bold: true
}
Label {
id: currentAccountServer
text: systrayBackend.currentUserServer()
color: "white"
font.pointSize: 8
}
}
Image {
Layout.alignment: Qt.AlignLeft
verticalAlignment: Qt.AlignCenter
Layout.margins: 12
//source: "../../theme/white/caret-down.svg"
source: "qrc:///client/theme/white/caret-down.svg"
}
}
}
Item {
id: trayWindowHeaderSpacer
Layout.fillWidth: true
}
Button {
id: openLocalFolderButton
Layout.alignment: Qt.AlignRight
display: AbstractButton.IconOnly
Layout.preferredWidth: (trayWindowHeaderBackground.height)
Layout.preferredHeight: (trayWindowHeaderBackground.height)
flat: true
//icon.source: "../../theme/white/folder.svg"
icon.source: "qrc:///client/theme/white/folder.svg"
icon.color: "transparent"
MouseArea {
id: folderBtnMouseArea
anchors.fill: parent
hoverEnabled: true
onClicked:
{
}
}
background:
Rectangle {
color: folderBtnMouseArea.containsMouse ? "white" : "transparent"
opacity: 0.2
}
}
Button {
id: trayWindowTalkButton
Layout.alignment: Qt.AlignRight
display: AbstractButton.IconOnly
Layout.preferredWidth: (trayWindowHeaderBackground.height)
Layout.preferredHeight: (trayWindowHeaderBackground.height)
flat: true
//icon.source: "../../theme/white/talk-app.svg"
icon.source: "qrc:///client/theme/white/talk-app.svg"
icon.color: "transparent"
MouseArea {
id: talkBtnMouseArea
anchors.fill: parent
hoverEnabled: true
onClicked:
{
}
}
background:
Rectangle {
color: talkBtnMouseArea.containsMouse ? "white" : "transparent"
opacity: 0.2
}
}
Button {
id: trayWindowAppsButton
Layout.alignment: Qt.AlignRight
display: AbstractButton.IconOnly
Layout.preferredWidth: (trayWindowHeaderBackground.height)
Layout.preferredHeight: (trayWindowHeaderBackground.height)
flat: true
//icon.source: "../../theme/white/more-apps.svg"
icon.source: "qrc:///client/theme/white/more-apps.svg"
icon.color: "transparent"
MouseArea {
id: appsBtnMouseArea
anchors.fill: parent
hoverEnabled: true
onClicked:
{
}
}
background:
Item {
id: rightHoverContainer
height: trayWindowAppsButton.height
width: trayWindowAppsButton.width
Rectangle {
width: trayWindowAppsButton.width / 2
height: trayWindowAppsButton.height / 2
color: "white"
opacity: 0.2
visible: appsBtnMouseArea.containsMouse
}
Rectangle {
width: trayWindowAppsButton.width / 2
height: trayWindowAppsButton.height / 2
anchors.bottom: rightHoverContainer.bottom
color: "white"
opacity: 0.2
visible: appsBtnMouseArea.containsMouse
}
Rectangle {
width: trayWindowAppsButton.width / 2
height: trayWindowAppsButton.height / 2
anchors.bottom: rightHoverContainer.bottom
anchors.right: rightHoverContainer.right
color: "white"
opacity: 0.2
visible: appsBtnMouseArea.containsMouse
}
Rectangle {
id: rightHoverContainerClipper
anchors.right: rightHoverContainer.right
width: trayWindowAppsButton.width / 2
height: trayWindowAppsButton.height / 2
color: "transparent"
clip: true
Rectangle {
width: trayWindowAppsButton.width
height: trayWindowAppsButton.height
anchors.right: rightHoverContainerClipper.right
radius: 10
color: "white"
opacity: 0.2
visible: appsBtnMouseArea.containsMouse
}
}
}
}
}
} // Rectangle trayWindowHeaderBackground
ListModel {
id: activityListModel
}
ListView {
id: activityListView
anchors.top: trayWindowHeaderBackground.bottom
width: trayWindowBackground.width
height: trayWindowBackground.height - trayWindowHeaderBackground.height
clip: true
model: activityListModel
delegate: RowLayout {
id: activityItem
width: activityListView.width
height: trayWindowHeaderLayout.height
spacing: 0
Image {
id: activityIcon
Layout.leftMargin: 6
Layout.preferredWidth: 48
Layout.preferredHeight: 48
verticalAlignment: Qt.AlignCenter
source: "qrc:///client/theme/black/state-sync.svg"
sourceSize.height: 48
sourceSize.width: 48
}
Column {
Layout.leftMargin: 6
spacing: 4
Layout.alignment: Qt.AlignLeft
Text {
id: activityTextTitle
text: name
font.pointSize: 9
}
Text {
id: activityTextInfo
text: "Lorem ipsum dolor sit amet"
font.pointSize: 8
}
}
Item {
id: activityItemFiller
Layout.fillWidth: true
}
Button {
Layout.preferredWidth: activityItem.height
Layout.preferredHeight: activityItem.height
Layout.alignment: Qt.AlignRight
flat: true
display: AbstractButton.IconOnly
icon.source: "qrc:///client/resources/files.svg"
icon.color: "transparent"
}
Button {
Layout.preferredWidth: activityItem.height
Layout.preferredHeight: activityItem.height
Layout.alignment: Qt.AlignRight
flat: true
display: AbstractButton.IconOnly
icon.source: "qrc:///client/resources/public.svg"
icon.color: "transparent"
}
}
add: Transition {
NumberAnimation { properties: "y"; from: -60; duration: 100; easing.type: Easing.Linear }
}
remove: Transition {
NumberAnimation { property: "opacity"; from: 1.0; to: 0; duration: 100 }
}
removeDisplaced: Transition {
SequentialAnimation {
PauseAnimation { duration: 100}
NumberAnimation { properties: "y"; duration: 100; easing.type: Easing.Linear }
}
}
displaced: Transition {
NumberAnimation { properties: "y"; duration: 100; easing.type: Easing.Linear }
}
focus: true
// For interactive ListView/Animation testing only
//Keys.onSpacePressed: model.insert(0, { "name": "Item " + model.count })
//Keys.onTabPressed: model.remove(3)
}
} // Rectangle trayWindowBackground
}