Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
1 change: 1 addition & 0 deletions src/gui/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -241,6 +241,7 @@ set(client_SRCS
tray/asyncimageresponse.cpp
tray/trayimageprovider.cpp
tray/trayaccountmenupolicy.h
tray/trayactivationpolicy.h
tray/trayaccountappsmodel.h
tray/trayaccountappsmodel.cpp
tray/usermodel.h
Expand Down
3 changes: 2 additions & 1 deletion src/gui/owncloudgui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@
#include "filedetails/sortedsharemodel.h"
#include "activity/sortedactivitylistmodel.h"
#include "activity/syncstatussummary.h"
#include "tray/trayactivationpolicy.h"
#include "tray/trayaccountappsmodel.h"
#include "search/unifiedsearchresultslistmodel.h"
#include "integration/fileactionsmodel.h"
Expand Down Expand Up @@ -244,7 +245,7 @@ void ownCloudGui::slotTrayClicked(QSystemTrayIcon::ActivationReason reason)
const auto currentUser = UserModel::instance()->currentUser();
if (reason == QSystemTrayIcon::DoubleClick && currentUser && currentUser->hasLocalFolder()) {
currentUser->openLocalFolder();
} else if (reason == QSystemTrayIcon::Trigger) {
} else if (TrayActivationPolicy::opensPrimaryPopup(reason)) {
if (AccountManager::instance()->accounts().isEmpty()) {
// Without a configured account the tray icon drives the setup wizard
// directly: open it, or bring the existing one back to front instead
Expand Down
31 changes: 31 additions & 0 deletions src/gui/tray/trayactivationpolicy.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
/*
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: GPL-2.0-or-later
*/

Check warning on line 4 in src/gui/tray/trayactivationpolicy.h

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Edit this comment to use the C++ format, i.e. "//".

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZ_OiznGFD1aNffG5_rQ&open=AZ_OiznGFD1aNffG5_rQ&pullRequest=10532

#pragma once

#include <QSystemTrayIcon>

Check failure on line 8 in src/gui/tray/trayactivationpolicy.h

View workflow job for this annotation

GitHub Actions / build

src/gui/tray/trayactivationpolicy.h:8:10 [clang-diagnostic-error]

'QSystemTrayIcon' file not found

namespace OCC {

Check warning on line 10 in src/gui/tray/trayactivationpolicy.h

View workflow job for this annotation

GitHub Actions / build

src/gui/tray/trayactivationpolicy.h:10:11 [cppcoreguidelines-avoid-non-const-global-variables]

variable 'OCC' is non-const and globally accessible, consider making it const

/** @brief Defines which tray-icon activations open the primary tray popup. */

Check warning on line 12 in src/gui/tray/trayactivationpolicy.h

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Edit this comment to use the C++ format, i.e. "//".

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZ_OiznGFD1aNffG5_rR&open=AZ_OiznGFD1aNffG5_rR&pullRequest=10532
class TrayActivationPolicy
{
public:
/** @brief Whether the activation should open or toggle the primary tray popup. */

Check warning on line 16 in src/gui/tray/trayactivationpolicy.h

View check run for this annotation

SonarQubeCloud / SonarCloud Code Analysis

Edit this comment to use the C++ format, i.e. "//".

See more on https://sonarcloud.io/project/issues?id=nextcloud_desktop&issues=AZ_OiznGFD1aNffG5_rS&open=AZ_OiznGFD1aNffG5_rS&pullRequest=10532
[[nodiscard]] static constexpr bool opensPrimaryPopup(const QSystemTrayIcon::ActivationReason reason)
{
if (reason == QSystemTrayIcon::Trigger) {
return true;
}

#ifdef Q_OS_MACOS
return reason == QSystemTrayIcon::Context;
#else
return false;
#endif
}
};

}
1 change: 1 addition & 0 deletions test/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,7 @@ nextcloud_add_test(IconUtils)
nextcloud_add_test(NotificationSoundPlayer)
nextcloud_add_test(SetUserStatusDialog)
nextcloud_add_test(TrayAccountMenuPolicy)
nextcloud_add_test(TrayActivationPolicy)
nextcloud_add_test(UnifiedSearchListmodel)
nextcloud_add_test(ActivityListModel)
nextcloud_add_test(SortedActivityListModel)
Expand Down
44 changes: 44 additions & 0 deletions test/testtrayactivationpolicy.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*
* SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: CC0-1.0
*
* This software is in the public domain, furnished "as is", without technical
* support, and with no warranty, express or implied, as to its usefulness for
* any purpose.
*/

#include "tray/trayactivationpolicy.h"

Check failure on line 10 in test/testtrayactivationpolicy.cpp

View workflow job for this annotation

GitHub Actions / build

test/testtrayactivationpolicy.cpp:10:10 [clang-diagnostic-error]

'tray/trayactivationpolicy.h' file not found

#include <QtTest>

using namespace OCC;

class TestTrayActivationPolicy : public QObject
{
Q_OBJECT

private slots:
void testPrimaryClickOpensPopup()
{
QVERIFY(TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::Trigger));
}

void testContextClickBehaviorIsPlatformSpecific()
{
#ifdef Q_OS_MACOS
QVERIFY(TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::Context));
#else
QVERIFY(!TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::Context));
#endif
}

void testOtherActivationsDoNotOpenPopup()
{
QVERIFY(!TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::Unknown));
QVERIFY(!TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::DoubleClick));
QVERIFY(!TrayActivationPolicy::opensPrimaryPopup(QSystemTrayIcon::MiddleClick));
}
};

QTEST_APPLESS_MAIN(TestTrayActivationPolicy)

Check warning on line 43 in test/testtrayactivationpolicy.cpp

View workflow job for this annotation

GitHub Actions / build

test/testtrayactivationpolicy.cpp:43:20 [cppcoreguidelines-avoid-non-const-global-variables]

variable 'TestTrayActivationPolicy' is non-const and globally accessible, consider making it const
#include "testtrayactivationpolicy.moc"
Loading