Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
6ed4073
Add user status and more items to the tray's user menu
Rello Jun 11, 2026
5d235c7
fix(UI): implementing further design improvements
Rello Jun 18, 2026
f9dce87
Merge branch 'master' into feature/trayAccountStatus
Rello Jun 18, 2026
cf88741
Merge branch 'master' into feature/trayAccountStatus
Rello Jun 22, 2026
3eb8ecd
Merge branch 'master' into feature/trayAccountStatus
Rello Jun 22, 2026
965200c
fix(UI): menu auto resizing and alignment
Rello Jun 22, 2026
92d57ef
fix(UI): translations in macOS tray account popup
Rello Jun 23, 2026
024efe9
fix(UI): tray on windows going to old trayWindow
Rello Jun 23, 2026
837ccd7
Merge branch 'master' into feature/trayAccountStatus
Rello Jun 23, 2026
2a9c98b
fix(UI): fix test issues
Rello Jun 23, 2026
607d677
fix(UI): real QML menus on win
Rello Jun 24, 2026
a0d9e39
fix(UI): tray on windows alignment
Rello Jun 24, 2026
bed4d75
fix(UI): tray on windows alignment
Rello Jun 24, 2026
be312d5
fix(UI): test fixes and update
Rello Jun 25, 2026
9b38d3d
fix(UI): test fixes and update
Rello Jun 25, 2026
c9a3f7b
fix(UI): test fixes and update
Rello Jun 25, 2026
8b053ad
fix(UI): test fixes and update
Rello Jun 25, 2026
0f3e51c
fix(UI): test fixes and update
Rello Jun 25, 2026
4b96fbf
Merge branch 'master' into feature/trayAccountStatus
Rello Jun 25, 2026
69eda92
fix(tray): avoid crash when running on Wayland
nilsding Jun 26, 2026
a998e42
fix(UI): change QML menu to QMenu for Win/Linux
Rello Jun 26, 2026
90e27f4
fix(UI): change QML menu to QMenu for Win/Linux
Rello Jun 26, 2026
536c5e0
fix(UI): change QML menu to QMenu for Win/Linux
Rello Jun 26, 2026
2408e4c
fix(UI): change QML menu to QMenu for Win/Linux
Rello Jun 26, 2026
639f7a8
fix(UI): change QML menu to QMenu for Win/Linux
Rello Jun 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion resources.qrc
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
<RCC>
<qresource prefix="/qml">
<file>src/gui/UserStatusMessageView.qml</file>
<file>src/gui/UserStatusWindow.qml</file>
<file>src/gui/WindowAccountHeader.qml</file>
<file>src/gui/ActivitiesWindow.qml</file>
<file>src/gui/AssistantWindow.qml</file>
<file>src/gui/UserStatusWindowStatusRow.qml</file>
<file>src/gui/UserStatusWindowPredefinedStatusRow.qml</file>
<file>src/gui/UserStatusSelectorPage.qml</file>
<file>src/gui/EmojiPicker.qml</file>
<file>src/gui/UserStatusSelectorButton.qml</file>
Expand All @@ -22,7 +28,6 @@
<file>src/gui/filedetails/ShareeSearchField.qml</file>
<file>src/gui/filedetails/ShareView.qml</file>
<file>src/gui/tray/MainWindow.qml</file>
<file>src/gui/tray/TrayAccountPopup.qml</file>
<file>src/gui/tray/UserLine.qml</file>
<file>src/gui/tray/HeaderButton.qml</file>
<file>src/gui/tray/SyncStatus.qml</file>
Expand Down
182 changes: 182 additions & 0 deletions src/gui/ActivitiesWindow.qml
Original file line number Diff line number Diff line change
@@ -0,0 +1,182 @@
/*
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
*/

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts

import Style
import "./tray"

ApplicationWindow {
id: root

property int userIndex: -1
property var currentUser: null
property var activityModel: null
readonly property string headline: qsTr("Activities")

LayoutMirroring.enabled: Application.layoutDirection === Qt.RightToLeft
LayoutMirroring.childrenInherit: true

title: ""
width: Style.activitiesWindowWidth
height: Style.activitiesWindowHeight
minimumWidth: Style.wizardStandaloneWindowMinimumWidth
minimumHeight: Style.wizardStandaloneWindowMinimumHeight
flags: Qt.Window
| Qt.CustomizeWindowHint
| Qt.WindowTitleHint
| Qt.WindowSystemMenuHint
| Qt.WindowCloseButtonHint
color: Style.wizardWindowBackground
palette.window: Style.wizardWindowBackground
palette.windowText: Style.wizardPrimaryText
palette.base: Style.wizardFieldBackground
palette.text: Style.wizardPrimaryText
palette.button: Style.wizardFieldBackground
palette.buttonText: Style.wizardPrimaryText
palette.mid: Style.wizardDisabledText
palette.placeholderText: Style.wizardPlaceholderText

background: Rectangle {
color: Style.wizardWindowBackground
}

function reloadForCurrentUser() {
newActivitiesButtonLoader.active = false
syncStatus.model.loadForUser(root.currentUser)
}

Shortcut {
sequences: [StandardKey.Cancel]
onActivated: root.close()
}

Component.onCompleted: reloadForCurrentUser()

onVisibleChanged: {
if (visible) {
reloadForCurrentUser()
}
}

ColumnLayout {
anchors.fill: parent
anchors.leftMargin: Style.wizardWindowMargin
anchors.rightMargin: Style.wizardWindowMargin
anchors.topMargin: Style.wizardWindowTopMargin
anchors.bottomMargin: Style.wizardWindowMargin
spacing: Style.wizardSectionSpacing

WindowAccountHeader {
Layout.fillWidth: true
title: root.headline
user: root.currentUser
}

Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: Style.normalBorderWidth
color: Style.wizardRowBorder
}

SyncStatus {
id: syncStatus

Layout.fillWidth: true
accentColor: Style.accentColor
user: root.currentUser
activityListModel: root.activityModel
}

Rectangle {
Layout.fillWidth: true
Layout.preferredHeight: Style.normalBorderWidth
color: Style.wizardRowBorder
}

Item {
Layout.fillWidth: true
Layout.fillHeight: true

ActivityList {
id: activityList

anchors.fill: parent
activeFocusOnTab: true
model: root.activityModel
onOpenFile: Qt.openUrlExternally(filePath)
onActivityItemClicked: {
if (root.activityModel) {
root.activityModel.slotTriggerDefaultAction(index)
}
}

Connections {
target: root.activityModel

function onInteractiveActivityReceived() {
if (!activityList.atYBeginning) {
newActivitiesButtonLoader.active = true
}
}
}
}

Loader {
id: newActivitiesButtonLoader

anchors.top: activityList.top
anchors.topMargin: Style.smallSpacing
anchors.horizontalCenter: activityList.horizontalCenter
width: Style.newActivitiesButtonWidth
height: Style.newActivitiesButtonHeight
z: 1
active: false

sourceComponent: Button {
id: newActivitiesButton

anchors.fill: parent
hoverEnabled: true
padding: Style.smallSpacing
text: qsTr("New activities")
icon.source: "image://svgimage-custom-color/expand-less-black.svg/" + Style.currentUserHeaderTextColor
icon.width: Style.activityListButtonIconSize
icon.height: Style.activityListButtonIconSize
Accessible.role: Accessible.Button
Accessible.name: text
Accessible.onPressAction: newActivitiesButton.clicked()
onClicked: {
activityList.scrollToTop()
newActivitiesButtonLoader.active = false
}

Timer {
id: newActivitiesButtonDisappearTimer

interval: Style.newActivityButtonDisappearTimeout
running: newActivitiesButtonLoader.active && !newActivitiesButton.hovered
repeat: false
onTriggered: fadeoutActivitiesButtonDisappear.running = true
}

OpacityAnimator {
id: fadeoutActivitiesButtonDisappear

target: newActivitiesButton
from: 1
to: 0
duration: Style.newActivityButtonDisappearFadeTimeout
loops: 1
running: false
onFinished: newActivitiesButtonLoader.active = false
}
}
}
}
}
}
Loading