diff --git a/CMakeLists.txt b/CMakeLists.txt index ed437c0342b50..74935073f0419 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -10,6 +10,7 @@ if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "13.0" CACHE STRING "Minimum OSX deployment version") endif() +set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED 20) @@ -93,6 +94,7 @@ include(KDEInstallDirs) include(KDECMakeSettings) include(ECMMarkNonGuiExecutable) include(ECMSetupVersion) +include(ECMQmlModule) #include(KDECompilerSettings NO_POLICY_SCOPE) include(ECMEnableSanitizers) diff --git a/resources.qrc b/resources.qrc index f26f90192acfe..8f49a0adbf922 100644 --- a/resources.qrc +++ b/resources.qrc @@ -1,64 +1,5 @@ - src/gui/UserStatusMessageView.qml - src/gui/UserStatusSelectorPage.qml - src/gui/EmojiPicker.qml - src/gui/UserStatusSelectorButton.qml - src/gui/UserStatusSetStatusView.qml - src/gui/PredefinedStatusButton.qml - src/gui/ErrorBox.qml - src/gui/filedetails/FileActivityView.qml - src/gui/filedetails/FileDetailsPage.qml - src/gui/filedetails/FileDetailsView.qml - src/gui/filedetails/FileDetailsWindow.qml - src/gui/filedetails/FileTag.qml - src/gui/filedetails/NCInputDateField.qml - src/gui/filedetails/NCInputTextArea.qml - src/gui/filedetails/NCInputTextField.qml - src/gui/filedetails/NCTabButton.qml - src/gui/filedetails/ShareeDelegate.qml - src/gui/filedetails/ShareDelegate.qml - src/gui/filedetails/ShareDetailsPage.qml - src/gui/filedetails/ShareeSearchField.qml - src/gui/filedetails/ShareView.qml - src/gui/tray/MainWindow.qml - src/gui/tray/UserLine.qml - src/gui/tray/HeaderButton.qml - src/gui/tray/SyncStatus.qml - src/gui/tray/ActivityItem.qml - src/gui/tray/AutoSizingMenu.qml - src/gui/tray/ActivityList.qml - src/gui/tray/CurrentAccountHeaderButton.qml - src/gui/tray/TrayWindowHeader.qml - src/gui/tray/UnifiedSearchInputContainer.qml - src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml - src/gui/tray/UnifiedSearchResultItem.qml - src/gui/tray/UnifiedSearchResultItemSkeleton.qml - src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml - src/gui/tray/UnifiedSearchResultItemSkeletonGradientRectangle.qml - src/gui/tray/UnifiedSearchResultListItem.qml - src/gui/tray/UnifiedSearchResultNothingFound.qml - src/gui/tray/UnifiedSearchPlaceholderView.qml - src/gui/tray/UnifiedSearchResultSectionItem.qml - src/gui/tray/ActivityItemContextMenu.qml - src/gui/tray/ActivityItemActions.qml - src/gui/tray/ActivityItemContent.qml - src/gui/tray/TalkReplyTextField.qml - src/gui/tray/CallNotificationDialog.qml - src/gui/tray/EditFileLocallyLoadingDialog.qml - src/gui/tray/EncryptionTokenDiscoveryDialog.qml - src/gui/tray/NCBusyIndicator.qml - src/gui/tray/NCIconWithBackgroundImage.qml - src/gui/tray/NCProgressBar.qml - src/gui/tray/EnforcedPlainTextLabel.qml - theme/Style/Style.qml - theme/Style/qmldir - src/gui/tray/ListItemLineAndSubline.qml - src/gui/tray/TrayFoldersMenuButton.qml - src/gui/tray/TrayFolderListItem.qml - src/gui/ResolveConflictsDialog.qml - src/gui/ConflictDelegate.qml - src/gui/ConflictItemFileInfo.qml src/gui/macOS/ui/FileProviderSettings.qml src/gui/macOS/ui/FileProviderFileDelegate.qml src/gui/integration/FileActionsWindow.qml diff --git a/src/3rdparty/kirigami/wheelhandler.h b/src/3rdparty/kirigami/wheelhandler.h index d921a6c9d7c24..3cfc104d5b0b2 100644 --- a/src/3rdparty/kirigami/wheelhandler.h +++ b/src/3rdparty/kirigami/wheelhandler.h @@ -11,6 +11,7 @@ #include #include #include +#include class QWheelEvent; class WheelHandler; @@ -21,6 +22,7 @@ class WheelHandler; class KirigamiWheelEvent : public QObject { Q_OBJECT + QML_NAMED_ELEMENT(WheelEvent) /** * x: real @@ -167,6 +169,7 @@ class WheelFilterItem : public QQuickItem class WheelHandler : public QObject { Q_OBJECT + QML_NAMED_ELEMENT(WheelHandler) /** * @brief This property holds the Qt Quick Flickable that the WheelHandler will control. diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt index a13ff917823f3..c2c9a795e5f1c 100644 --- a/src/gui/CMakeLists.txt +++ b/src/gui/CMakeLists.txt @@ -182,41 +182,10 @@ set(client_SRCS emojimodel.cpp syncconflictsmodel.h syncconflictsmodel.cpp - fileactivitylistmodel.h - fileactivitylistmodel.cpp - filedetails/datefieldbackend.h - filedetails/datefieldbackend.cpp - filedetails/filedetails.h - filedetails/filedetails.cpp - filedetails/sharemodel.h - filedetails/sharemodel.cpp - filedetails/shareemodel.h - filedetails/shareemodel.cpp - filedetails/sortedsharemodel.h - filedetails/sortedsharemodel.cpp - tray/svgimageprovider.h - tray/svgimageprovider.cpp - tray/syncstatussummary.h - tray/syncstatussummary.cpp - tray/activitydata.h - tray/activitydata.cpp - tray/activitylistmodel.h - tray/activitylistmodel.cpp - tray/unifiedsearchresult.h - tray/asyncimageresponse.cpp - tray/unifiedsearchresult.cpp - tray/unifiedsearchresultslistmodel.h - tray/trayimageprovider.cpp - tray/unifiedsearchresultslistmodel.cpp - tray/usermodel.h - tray/usermodel.cpp - tray/notificationhandler.h - tray/notificationhandler.cpp - tray/sortedactivitylistmodel.h - tray/sortedactivitylistmodel.cpp creds/credentialsfactory.h - tray/talkreply.cpp creds/credentialsfactory.cpp + types.h + types.cpp creds/httpcredentialsgui.h creds/httpcredentialsgui.cpp creds/flow2auth.h @@ -520,29 +489,51 @@ if(CMAKE_SYSTEM_NAME STREQUAL "FreeBSD") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L/usr/local/lib") endif() -add_library(nextcloudCore STATIC ${final_src}) +add_library(nextcloudCore STATIC) + +set_source_files_properties(Style.qml + PROPERTIES QT_QML_SINGLETON_TYPE TRUE) + +ecm_add_qml_module(nextcloudCore + URI com.nextcloud.desktopclient + GENERATE_PLUGIN_SOURCE + IMPORTS + com.nextcloud.desktopclient.tray + com.nextcloud.desktopclient.filedetails + QML_FILES + UserStatusMessageView.qml + UserStatusSelectorPage.qml + EmojiPicker.qml + UserStatusSelectorButton.qml + UserStatusSetStatusView.qml + PredefinedStatusButton.qml + ErrorBox.qml + Style.qml + SOURCES + ${final_src} +) -target_link_libraries(nextcloudCore - PUBLIC - Nextcloud::sync - Qt::Widgets - Qt::Svg - Qt::Network - Qt::Xml - Qt::Qml - Qt::Quick - Qt::QuickControls2 - Qt::QuickWidgets - KF6::Archive - KDAB::kdsingleapplication - ) +target_link_libraries(nextcloudCore PUBLIC + Nextcloud::sync + Qt::Widgets + Qt::Svg + Qt::Network + Qt::Xml + Qt::Qml + Qt::Quick + Qt::QuickControls2 + Qt::QuickWidgets + KF6::Archive + KDAB::kdsingleapplication +) -if(KF6GuiAddons_FOUND) - target_link_libraries(nextcloudCore - PUBLIC - KF6::GuiAddons - ) - add_definitions(-DHAVE_KGUIADDONS) +target_include_directories(nextcloudCore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}) + +if(TARGET KF6::GuiAddons) + target_link_libraries(nextcloudCore PUBLIC + KF6::GuiAddons + ) + add_definitions(-DHAVE_KGUIADDONS) endif() add_subdirectory(socketapi) @@ -575,6 +566,9 @@ target_include_directories(nextcloudCore ${CMAKE_CURRENT_SOURCE_DIR} ) +add_subdirectory(tray) +add_subdirectory(filedetails) + if(NOT BUILD_OWNCLOUD_OSX_BUNDLE) if(NOT WIN32) file(GLOB _icons "${theme_dir}/colored/*-${APPLICATION_ICON_NAME}-icon.png") @@ -638,7 +632,15 @@ set_target_properties(nextcloud PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${BIN_OUTPUT_DIRECTORY} ) -target_link_libraries(nextcloud PRIVATE nextcloudCore) +set_target_properties(nextcloud PROPERTIES POSITION_INDEPENDENT_CODE ON) +target_link_libraries(nextcloud PRIVATE + nextcloudTray + nextcloudTrayplugin + nextcloudFileDetails + nextcloudFileDetailsplugin + nextcloudCore + nextcloudCoreplugin +) if(TARGET PkgConfig::CLOUDPROVIDERS) message("Building with libcloudproviderssupport") diff --git a/src/gui/ConflictDelegate.qml b/src/gui/ConflictDelegate.qml index 09318d46cea0d..24ab21cb51fe9 100644 --- a/src/gui/ConflictDelegate.qml +++ b/src/gui/ConflictDelegate.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Layouts import QtQuick.Controls -import Style import com.nextcloud.desktopclient import "./tray" diff --git a/src/gui/ConflictItemFileInfo.qml b/src/gui/ConflictItemFileInfo.qml index 72ff292da4703..401db9d8d20d3 100644 --- a/src/gui/ConflictItemFileInfo.qml +++ b/src/gui/ConflictItemFileInfo.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Layouts import QtQuick.Controls -import Style import "./tray" Item { diff --git a/src/gui/EmojiPicker.qml b/src/gui/EmojiPicker.qml index f49410d6ea399..8d56bdb85a004 100644 --- a/src/gui/EmojiPicker.qml +++ b/src/gui/EmojiPicker.qml @@ -7,8 +7,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style -import com.nextcloud.desktopclient 1.0 as NC +import com.nextcloud.desktopclient as NC import "./tray" ColumnLayout { diff --git a/src/gui/ErrorBox.qml b/src/gui/ErrorBox.qml index 0a7096dca104b..1b3bd18e4b4a2 100644 --- a/src/gui/ErrorBox.qml +++ b/src/gui/ErrorBox.qml @@ -7,7 +7,6 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls -import Style import "./tray" Item { diff --git a/src/gui/PredefinedStatusButton.qml b/src/gui/PredefinedStatusButton.qml index 67758577b8302..a01c18aaaaae8 100644 --- a/src/gui/PredefinedStatusButton.qml +++ b/src/gui/PredefinedStatusButton.qml @@ -7,7 +7,6 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls -import Style import "./tray" AbstractButton { diff --git a/src/gui/ResolveConflictsDialog.qml b/src/gui/ResolveConflictsDialog.qml index dd55598d86d30..6a4cd769101eb 100644 --- a/src/gui/ResolveConflictsDialog.qml +++ b/src/gui/ResolveConflictsDialog.qml @@ -9,7 +9,6 @@ import QtQuick.Window as QtWindow import QtQuick.Layouts import QtQuick.Controls import QtQml.Models -import Style import com.nextcloud.desktopclient import "./tray" diff --git a/theme/Style/Style.qml b/src/gui/Style.qml similarity index 94% rename from theme/Style/Style.qml rename to src/gui/Style.qml index 07d80f19e53f7..1d1421e1ad329 100644 --- a/theme/Style/Style.qml +++ b/src/gui/Style.qml @@ -4,11 +4,11 @@ pragma Singleton import QtQuick -import com.nextcloud.desktopclient +import com.nextcloud.desktopclient.tray QtObject { readonly property int pixelSize: fontMetrics.font.pixelSize - readonly property bool darkMode: Theme.darkMode + readonly property bool darkMode: Theme ? Theme.darkMode : false // Colors readonly property color ncBlue: Theme.wizardHeaderBackgroundColor @@ -17,7 +17,7 @@ QtObject { readonly property color currentUserHeaderColor: UserModel.currentUser ? UserModel.currentUser.headerColor : ncBlue readonly property color currentUserHeaderTextColor: UserModel.currentUser ? UserModel.currentUser.headerTextColor : ncHeaderTextColor - readonly property color adjustedCurrentUserHeaderColor: Theme.darkMode ? Qt.lighter(currentUserHeaderColor, 2) + readonly property color adjustedCurrentUserHeaderColor: Theme?.darkMode ? Qt.lighter(currentUserHeaderColor, 2) : Qt.darker(currentUserHeaderColor, 1.5) // ErrorBox colors @@ -85,8 +85,8 @@ QtObject { property int slightlyRoundedButtonRadius: 5 property double hoverOpacity: 0.7 - property url stateOnlineImageSource: Theme.stateOnlineImageSource - property url stateOfflineImageSource: Theme.stateOfflineImageSource + property url stateOnlineImageSource: Theme?.stateOnlineImageSource + property url stateOfflineImageSource: Theme?.stateOfflineImageSource property int accountAvatarSize: (trayWindowHeaderHeight - 16) property int accountAvatarStateIndicatorSize: 16 diff --git a/src/gui/UserStatusMessageView.qml b/src/gui/UserStatusMessageView.qml index 965f2fe0e31b3..2def0d701f7e5 100644 --- a/src/gui/UserStatusMessageView.qml +++ b/src/gui/UserStatusMessageView.qml @@ -10,7 +10,6 @@ import QtQuick.Controls import QtQuick.Window import com.nextcloud.desktopclient as NC -import Style import "./tray" diff --git a/src/gui/UserStatusSelectorButton.qml b/src/gui/UserStatusSelectorButton.qml index c7b0bf7350ca7..f5232ece37808 100644 --- a/src/gui/UserStatusSelectorButton.qml +++ b/src/gui/UserStatusSelectorButton.qml @@ -7,7 +7,6 @@ import QtQuick import QtQuick.Layouts import QtQuick.Controls -import Style import "./tray" diff --git a/src/gui/UserStatusSelectorPage.qml b/src/gui/UserStatusSelectorPage.qml index 0f297f9796ea0..d0d135f29315f 100644 --- a/src/gui/UserStatusSelectorPage.qml +++ b/src/gui/UserStatusSelectorPage.qml @@ -6,7 +6,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import com.nextcloud.desktopclient as NC diff --git a/src/gui/UserStatusSetStatusView.qml b/src/gui/UserStatusSetStatusView.qml index abff60d1e16a5..1ea9878c3f07f 100644 --- a/src/gui/UserStatusSetStatusView.qml +++ b/src/gui/UserStatusSetStatusView.qml @@ -8,7 +8,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient as NC -import Style import "./tray" @@ -44,57 +43,57 @@ ColumnLayout { } UserStatusSelectorButton { - checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.userStatus.Online + checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.UserStatus.Online checkable: true icon.source: userStatusSelectorModel ? userStatusSelectorModel.onlineIcon : "" icon.color: "transparent" text: qsTr("Online") Layout.fillWidth: true - onClicked: handleStatusClick(NC.userStatus.Online) + onClicked: handleStatusClick(NC.UserStatus.Online) } UserStatusSelectorButton { - checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.userStatus.Away + checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.UserStatus.Away checkable: true icon.source: userStatusSelectorModel ? userStatusSelectorModel.awayIcon : "" icon.color: "transparent" text: qsTr("Away") Layout.fillWidth: true - onClicked: handleStatusClick(NC.userStatus.Away) + onClicked: handleStatusClick(NC.UserStatus.Away) } UserStatusSelectorButton { visible: userStatusSelectorModel && userStatusSelectorModel.busyStatusSupported - checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.userStatus.Busy + checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.UserStatus.Busy checkable: true icon.source: userStatusSelectorModel ? userStatusSelectorModel.busyIcon : "" icon.color: "transparent" text: qsTr("Busy") Layout.fillWidth: true - onClicked: handleStatusClick(NC.userStatus.Busy) + onClicked: handleStatusClick(NC.UserStatus.Busy) } UserStatusSelectorButton { - checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.userStatus.DoNotDisturb + checked: userStatusSelectorModel && userStatusSelectorModel.onlineStatus === NC.UserStatus.DoNotDisturb checkable: true icon.source: userStatusSelectorModel ? userStatusSelectorModel.dndIcon : "" icon.color: "transparent" text: qsTr("Do not disturb") secondaryText: qsTr("Mute all notifications") Layout.fillWidth: true - onClicked: handleStatusClick(NC.userStatus.DoNotDisturb) + onClicked: handleStatusClick(NC.UserStatus.DoNotDisturb) } UserStatusSelectorButton { - checked: userStatusSelectorModel && (userStatusSelectorModel.onlineStatus === NC.userStatus.Invisible - || userStatusSelectorModel.onlineStatus === NC.userStatus.Offline) + checked: userStatusSelectorModel && (userStatusSelectorModel.onlineStatus === NC.UserStatus.Invisible + || userStatusSelectorModel.onlineStatus === NC.UserStatus.Offline) checkable: true icon.source: userStatusSelectorModel ? userStatusSelectorModel.invisibleIcon : "" icon.color: "transparent" text: qsTr("Invisible") secondaryText: qsTr("Appear offline") Layout.fillWidth: true - onClicked: handleStatusClick(NC.userStatus.Invisible) + onClicked: handleStatusClick(NC.UserStatus.Invisible) } Item { diff --git a/src/gui/accountstate.cpp b/src/gui/accountstate.cpp index d139565a56559..83db3a2673cf6 100644 --- a/src/gui/accountstate.cpp +++ b/src/gui/accountstate.cpp @@ -709,3 +709,6 @@ QUrl AccountApp::iconUrl() const /*-------------------------------------------------------------------------------------*/ } // namespace OCC + +Q_DECLARE_METATYPE(OCC::AccountState *) +Q_DECLARE_METATYPE(OCC::AccountStatePtr) diff --git a/src/gui/accountstate.h b/src/gui/accountstate.h index 8acbee4dcb37c..893958d1b531d 100644 --- a/src/gui/accountstate.h +++ b/src/gui/accountstate.h @@ -284,7 +284,4 @@ class AccountApp : public QObject } -Q_DECLARE_METATYPE(OCC::AccountState *) -Q_DECLARE_METATYPE(OCC::AccountStatePtr) - #endif //ACCOUNTINFO_H diff --git a/src/gui/callstatechecker.h b/src/gui/callstatechecker.h index ac77e2c678da8..a3c1f11e47b76 100644 --- a/src/gui/callstatechecker.h +++ b/src/gui/callstatechecker.h @@ -7,6 +7,7 @@ #include #include +#include #include "networkjobs.h" #include "accountstate.h" @@ -16,6 +17,7 @@ namespace OCC { class CallStateChecker : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(QString token READ token WRITE setToken NOTIFY tokenChanged) Q_PROPERTY(AccountState* accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) Q_PROPERTY(bool checking READ checking WRITE setChecking NOTIFY checkingChanged) diff --git a/src/gui/emojimodel.h b/src/gui/emojimodel.h index dd55abad8804d..cf220050f411b 100644 --- a/src/gui/emojimodel.h +++ b/src/gui/emojimodel.h @@ -75,6 +75,7 @@ class EmojiCategoriesModel : public QAbstractListModel class EmojiModel : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(QVariantList model READ model NOTIFY modelChanged) Q_PROPERTY(QAbstractListModel *emojiCategoriesModel READ emojiCategoriesModel CONSTANT) diff --git a/src/gui/filedetails/CMakeLists.txt b/src/gui/filedetails/CMakeLists.txt new file mode 100644 index 0000000000000..2518a4908afed --- /dev/null +++ b/src/gui/filedetails/CMakeLists.txt @@ -0,0 +1,38 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH +# SPDX-FileContributor: Carl Schwan +# SPDX-License-Identifier: BSD-3-Clause + +add_library(nextcloudFileDetails STATIC) + +ecm_add_qml_module(nextcloudFileDetails + URI com.nextcloud.desktopclient.filedetails + GENERATE_PLUGIN_SOURCE + QML_FILES + FileActivityView.qml + FileDetailsPage.qml + FileDetailsView.qml + FileDetailsWindow.qml + FileTag.qml + NCInputDateField.qml + NCInputTextArea.qml + NCInputTextField.qml + NCTabButton.qml + ShareeDelegate.qml + ShareDelegate.qml + ShareDetailsPage.qml + ShareeSearchField.qml + ShareView.qml + SOURCES + datefieldbackend.h + datefieldbackend.cpp + filedetails.h + filedetails.cpp + sharemodel.h + sharemodel.cpp + shareemodel.h + shareemodel.cpp + sortedsharemodel.h + sortedsharemodel.cpp +) + +target_link_libraries(nextcloudFileDetails PRIVATE nextcloudCore) diff --git a/src/gui/filedetails/FileActivityView.qml b/src/gui/filedetails/FileActivityView.qml index aa866baa9c599..5d1cb9aa96018 100644 --- a/src/gui/filedetails/FileActivityView.qml +++ b/src/gui/filedetails/FileActivityView.qml @@ -8,7 +8,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style import "../tray" ActivityList { diff --git a/src/gui/filedetails/FileDetailsPage.qml b/src/gui/filedetails/FileDetailsPage.qml index c061eff726883..01998e825cdbb 100644 --- a/src/gui/filedetails/FileDetailsPage.qml +++ b/src/gui/filedetails/FileDetailsPage.qml @@ -8,7 +8,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style import "../tray" Page { diff --git a/src/gui/filedetails/FileDetailsView.qml b/src/gui/filedetails/FileDetailsView.qml index b3b8fe83bb36b..a83f1fd0ea8af 100644 --- a/src/gui/filedetails/FileDetailsView.qml +++ b/src/gui/filedetails/FileDetailsView.qml @@ -8,7 +8,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style StackView { id: root diff --git a/src/gui/filedetails/FileDetailsWindow.qml b/src/gui/filedetails/FileDetailsWindow.qml index 915b9871be603..506ec11b76cd5 100644 --- a/src/gui/filedetails/FileDetailsWindow.qml +++ b/src/gui/filedetails/FileDetailsWindow.qml @@ -9,7 +9,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style ApplicationWindow { id: root diff --git a/src/gui/filedetails/FileTag.qml b/src/gui/filedetails/FileTag.qml index a0844d99640d9..3d74fde3653fa 100644 --- a/src/gui/filedetails/FileTag.qml +++ b/src/gui/filedetails/FileTag.qml @@ -5,7 +5,6 @@ import QtQuick -import Style import "../tray" EnforcedPlainTextLabel { diff --git a/src/gui/filedetails/NCInputTextArea.qml b/src/gui/filedetails/NCInputTextArea.qml index da1eb1ca8a413..9d29dcbe8708d 100644 --- a/src/gui/filedetails/NCInputTextArea.qml +++ b/src/gui/filedetails/NCInputTextArea.qml @@ -8,7 +8,6 @@ import QtQuick.Controls import QtQuick.Layouts import com.nextcloud.desktopclient -import Style TextArea { id: root diff --git a/src/gui/filedetails/NCInputTextField.qml b/src/gui/filedetails/NCInputTextField.qml index 45a06b6eb064f..35a10447bf053 100644 --- a/src/gui/filedetails/NCInputTextField.qml +++ b/src/gui/filedetails/NCInputTextField.qml @@ -8,7 +8,6 @@ import QtQuick.Controls import QtQuick.Layouts import com.nextcloud.desktopclient -import Style TextField { id: root diff --git a/src/gui/filedetails/NCTabButton.qml b/src/gui/filedetails/NCTabButton.qml index c68cb91363ad8..8541e6dd4fa3e 100644 --- a/src/gui/filedetails/NCTabButton.qml +++ b/src/gui/filedetails/NCTabButton.qml @@ -9,7 +9,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style import "../tray" TabButton { diff --git a/src/gui/filedetails/ShareDelegate.qml b/src/gui/filedetails/ShareDelegate.qml index 16407e5f323a9..c2531e9af3ba3 100644 --- a/src/gui/filedetails/ShareDelegate.qml +++ b/src/gui/filedetails/ShareDelegate.qml @@ -10,7 +10,6 @@ import QtQuick.Controls import Qt5Compat.GraphicalEffects import com.nextcloud.desktopclient -import Style import "../tray" import "../" diff --git a/src/gui/filedetails/ShareDetailsPage.qml b/src/gui/filedetails/ShareDetailsPage.qml index 39fbae87a22cd..969287aef67ef 100644 --- a/src/gui/filedetails/ShareDetailsPage.qml +++ b/src/gui/filedetails/ShareDetailsPage.qml @@ -10,7 +10,6 @@ import QtQuick.Controls import Qt5Compat.GraphicalEffects import com.nextcloud.desktopclient -import Style import "../tray" import "../" diff --git a/src/gui/filedetails/ShareView.qml b/src/gui/filedetails/ShareView.qml index 9d593b9d295b3..81f7535360f73 100644 --- a/src/gui/filedetails/ShareView.qml +++ b/src/gui/filedetails/ShareView.qml @@ -9,7 +9,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style import "../tray" import "../" diff --git a/src/gui/filedetails/ShareeDelegate.qml b/src/gui/filedetails/ShareeDelegate.qml index 52cf08ee6d423..0a6fa27c31d50 100644 --- a/src/gui/filedetails/ShareeDelegate.qml +++ b/src/gui/filedetails/ShareeDelegate.qml @@ -9,7 +9,6 @@ import QtQuick.Layouts import QtQuick.Controls import com.nextcloud.desktopclient -import Style import "../tray" diff --git a/src/gui/filedetails/ShareeSearchField.qml b/src/gui/filedetails/ShareeSearchField.qml index 8c82ed5abde50..235649ebd3ea7 100644 --- a/src/gui/filedetails/ShareeSearchField.qml +++ b/src/gui/filedetails/ShareeSearchField.qml @@ -10,7 +10,6 @@ import QtQuick.Controls import com.nextcloud.desktopclient import com.nextcloud.desktopclient as NC -import Style import "../tray" TextField { diff --git a/src/gui/filedetails/datefieldbackend.h b/src/gui/filedetails/datefieldbackend.h index 2a5fe57a4440c..e72a30bf23524 100644 --- a/src/gui/filedetails/datefieldbackend.h +++ b/src/gui/filedetails/datefieldbackend.h @@ -7,6 +7,7 @@ #include #include +#include class TestDateFieldBackend; @@ -18,6 +19,7 @@ namespace Quick class DateFieldBackend : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(QDate date READ date WRITE setDate NOTIFY dateChanged) Q_PROPERTY(qint64 dateMsecs READ dateMsecs WRITE setDateMsecs NOTIFY dateMsecsChanged) diff --git a/src/gui/filedetails/filedetails.h b/src/gui/filedetails/filedetails.h index af115735ce19b..061c9ed267736 100644 --- a/src/gui/filedetails/filedetails.h +++ b/src/gui/filedetails/filedetails.h @@ -9,6 +9,7 @@ #include #include #include +#include #include "common/syncjournalfilerecord.h" @@ -21,6 +22,7 @@ class Folder; class FileDetails : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) Q_PROPERTY(QString name READ name NOTIFY fileChanged) Q_PROPERTY(QString sizeString READ sizeString NOTIFY fileChanged) diff --git a/src/gui/filedetails/shareemodel.h b/src/gui/filedetails/shareemodel.h index d57681355434d..6657be645d9f7 100644 --- a/src/gui/filedetails/shareemodel.h +++ b/src/gui/filedetails/shareemodel.h @@ -7,6 +7,7 @@ #include #include +#include #include "accountstate.h" #include "sharee.h" @@ -19,6 +20,7 @@ namespace OCC { class ShareeModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT Q_PROPERTY(AccountState* accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) Q_PROPERTY(bool shareItemIsFolder READ shareItemIsFolder WRITE setShareItemIsFolder NOTIFY shareItemIsFolderChanged) Q_PROPERTY(QString searchString READ searchString WRITE setSearchString NOTIFY searchStringChanged) diff --git a/src/gui/filedetails/sharemodel.h b/src/gui/filedetails/sharemodel.h index a10088257c8bd..ed15270d9d953 100644 --- a/src/gui/filedetails/sharemodel.h +++ b/src/gui/filedetails/sharemodel.h @@ -6,6 +6,7 @@ #pragma once #include +#include #include "accountstate.h" #include "folder.h" @@ -17,6 +18,7 @@ namespace OCC { class ShareModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT Q_PROPERTY(AccountState* accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) Q_PROPERTY(bool accountConnected READ accountConnected NOTIFY accountConnectedChanged) diff --git a/src/gui/filedetails/sortedsharemodel.h b/src/gui/filedetails/sortedsharemodel.h index f8e6eff1efa5c..1b1d7eb27d87d 100644 --- a/src/gui/filedetails/sortedsharemodel.h +++ b/src/gui/filedetails/sortedsharemodel.h @@ -6,6 +6,7 @@ #pragma once #include +#include #include "sharemodel.h" namespace OCC { @@ -13,6 +14,7 @@ namespace OCC { class SortedShareModel : public QSortFilterProxyModel { Q_OBJECT + QML_ELEMENT public: explicit SortedShareModel(QObject *parent = nullptr); diff --git a/src/gui/integration/FileActionsWindow.qml b/src/gui/integration/FileActionsWindow.qml index c90981cafe371..efe0a4795c12d 100644 --- a/src/gui/integration/FileActionsWindow.qml +++ b/src/gui/integration/FileActionsWindow.qml @@ -11,7 +11,6 @@ import QtQuick.Layouts import QtQuick.Controls import Qt5Compat.GraphicalEffects import com.nextcloud.desktopclient -import Style import "./../tray" ApplicationWindow { diff --git a/src/gui/macOS/CMakeLists.txt b/src/gui/macOS/CMakeLists.txt new file mode 100644 index 0000000000000..5ac8b4c9785ea --- /dev/null +++ b/src/gui/macOS/CMakeLists.txt @@ -0,0 +1,12 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH +# SPDX-FileContributor: Carl Schwan +# SPDX-License-Identifier: BSD-3-Clause + +add_library(nextcloudMacOS STATIC) + +qt_add_qml_module(nextcloudMacOS + URI com.nextcloud.desktopclient.nextcloud.macos + QML_FILES + ui/FileProviderSettings.qml + ui/FileProviderFileDelegate.qml +) diff --git a/src/gui/macOS/fileprovidersettingscontroller.h b/src/gui/macOS/fileprovidersettingscontroller.h index a8081f66fc898..7b1cea8bf2515 100644 --- a/src/gui/macOS/fileprovidersettingscontroller.h +++ b/src/gui/macOS/fileprovidersettingscontroller.h @@ -24,6 +24,8 @@ class FileProviderSettingsController : public QObject Q_OBJECT Q_PROPERTY(bool isOperationInProgress READ isOperationInProgress NOTIFY operationInProgressChanged) Q_PROPERTY(QString operationMessage READ operationMessage NOTIFY operationMessageChanged) + QML_ELEMENT + QML_SINGLETON public: static FileProviderSettingsController *instance(); @@ -48,6 +50,13 @@ class FileProviderSettingsController : public QObject void operationMessageChanged(); void vfsEnabledForAccountChanged(const QString &userIdAtHost); + static FileProviderSettingsController *create(QQmlEngine *, QJSEngine *engine) + { + auto _instance = Theme::instance(); + QQmlEngine::setObjectOwnership(_instance, QJSEngine::CppOwnership); + return _instance; + } + public slots: void setVfsEnabledForAccount(const QString &userIdAtHost, const bool setEnabled, const bool showInformationDialog = true); diff --git a/src/gui/macOS/ui/FileProviderFileDelegate.qml b/src/gui/macOS/ui/FileProviderFileDelegate.qml index e0b6f0ed0aabf..578b76752b61a 100644 --- a/src/gui/macOS/ui/FileProviderFileDelegate.qml +++ b/src/gui/macOS/ui/FileProviderFileDelegate.qml @@ -7,7 +7,6 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 -import Style 1.0 import "../../filedetails" import "../../tray" diff --git a/src/gui/macOS/ui/FileProviderSettings.qml b/src/gui/macOS/ui/FileProviderSettings.qml index 9f658fdb001a5..4d265fcba43e1 100644 --- a/src/gui/macOS/ui/FileProviderSettings.qml +++ b/src/gui/macOS/ui/FileProviderSettings.qml @@ -7,7 +7,6 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 -import Style 1.0 import "../../filedetails" import "../../tray" diff --git a/src/gui/main.cpp b/src/gui/main.cpp index fe1089110940f..598125b6fd589 100644 --- a/src/gui/main.cpp +++ b/src/gui/main.cpp @@ -32,6 +32,10 @@ #include #include #include +#include + +Q_IMPORT_QML_PLUGIN(com_nextcloud_desktopclient_trayPlugin) +Q_IMPORT_QML_PLUGIN(com_nextcloud_desktopclient_filedetailsPlugin) using namespace OCC; @@ -111,7 +115,7 @@ int main(int argc, char **argv) } #ifndef Q_OS_WIN - signal(SIGPIPE, SIG_IGN); +// signal(SIGPIPE, SIG_IGN); #endif if (app.giveHelp()) { app.showHelp(); diff --git a/src/gui/owncloudgui.cpp b/src/gui/owncloudgui.cpp index 2f1b3bd0214c8..27c60b61817c1 100644 --- a/src/gui/owncloudgui.cpp +++ b/src/gui/owncloudgui.cpp @@ -11,8 +11,6 @@ #include "accountstate.h" #include "application.h" #include "callstatechecker.h" -#include "emojimodel.h" -#include "fileactivitylistmodel.h" #include "folderman.h" #include "guiutility.h" #include "logbrowser.h" @@ -21,19 +19,8 @@ #include "owncloudsetupwizard.h" #include "progressdispatcher.h" #include "settingsdialog.h" -#include "theme.h" -#include "wheelhandler.h" #include "syncconflictsmodel.h" #include "syncengine.h" -#include "filedetails/datefieldbackend.h" -#include "filedetails/filedetails.h" -#include "filedetails/shareemodel.h" -#include "filedetails/sharemodel.h" -#include "filedetails/sortedsharemodel.h" -#include "tray/sortedactivitylistmodel.h" -#include "tray/syncstatussummary.h" -#include "tray/unifiedsearchresultslistmodel.h" -#include "integration/fileactionsmodel.h" #include "filesystem.h" #ifdef WITH_LIBCLOUDPROVIDERS @@ -122,47 +109,6 @@ ownCloudGui::ownCloudGui(Application *parent) connect(Logger::instance(), &Logger::guiLog, this, &ownCloudGui::slotShowTrayMessage); connect(Logger::instance(), &Logger::guiMessage, this, &ownCloudGui::slotShowGuiMessage); - - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SyncStatusSummary"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "EmojiModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "UserStatusSelectorModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ActivityListModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileActivityListModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SortedActivityListModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "WheelHandler"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "CallStateChecker"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "DateFieldBackend"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileDetails"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ShareModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "ShareeModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SortedShareModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "SyncConflictsModel"); - qmlRegisterType("com.nextcloud.desktopclient", 1, 0, "FileActionsModel"); - - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "QAbstractItemModel", "QAbstractItemModel"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "activity", "Activity"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "talkNotificationData", "TalkNotificationData"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "UnifiedSearchResultsListModel", "UnifiedSearchResultsListModel"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "userStatus", "Access to Status enum"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "sharee", "Access to Type enum"); - qmlRegisterUncreatableType("com.nextcloud.desktopclient", 1, 0, "ClientSideEncryptionTokenSelector", "Access to the certificate selector"); - - qRegisterMetaType("ActivityListModel*"); - qRegisterMetaType("UnifiedSearchResultsListModel*"); - qRegisterMetaType("UserStatus"); - qRegisterMetaType("SharePtr"); - qRegisterMetaType("ShareePtr"); - qRegisterMetaType("Sharee"); - qRegisterMetaType("ActivityList"); - - qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "UserModel", UserModel::instance()); - qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "UserAppsModel", UserAppsModel::instance()); - qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "Theme", Theme::instance()); - qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "Systray", Systray::instance()); - -#ifdef BUILD_FILE_PROVIDER_MODULE - qmlRegisterSingletonInstance("com.nextcloud.desktopclient", 1, 0, "FileProviderSettingsController", Mac::FileProviderSettingsController::instance()); -#endif } void ownCloudGui::createTray() diff --git a/src/gui/syncconflictsmodel.h b/src/gui/syncconflictsmodel.h index d3e2f44495435..7402206208975 100644 --- a/src/gui/syncconflictsmodel.h +++ b/src/gui/syncconflictsmodel.h @@ -12,12 +12,14 @@ #include #include #include +#include namespace OCC { class SyncConflictsModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT Q_PROPERTY(OCC::ActivityList conflictActivities READ conflictActivities WRITE setConflictActivities NOTIFY conflictActivitiesChanged) diff --git a/src/gui/systray.cpp b/src/gui/systray.cpp index 89d07bde3f5fc..3100d6346441d 100644 --- a/src/gui/systray.cpp +++ b/src/gui/systray.cpp @@ -115,10 +115,12 @@ void Systray::create() _trayEngine->rootContext()->setContextProperty("activityModel", &_fakeActivityModel); } - QQmlComponent trayWindowComponent(trayEngine(), QStringLiteral("qrc:/qml/src/gui/tray/MainWindow.qml")); + QQmlComponent trayWindowComponent(trayEngine(), "com.nextcloud.desktopclient.tray", "MainWindow"); + + qWarning() << "has error" << trayWindowComponent.isError(); if(trayWindowComponent.isError()) { - qCWarning(lcSystray) << trayWindowComponent.errorString(); + qWarning() << trayWindowComponent.errorString(); } else { _trayWindow.reset(qobject_cast(trayWindowComponent.create())); } diff --git a/src/gui/systray.h b/src/gui/systray.h index b48d2dbfc3ff1..26b0dd9ab5a3c 100644 --- a/src/gui/systray.h +++ b/src/gui/systray.h @@ -11,6 +11,7 @@ #include "tray/usermodel.h" #include +#include #include #include @@ -18,7 +19,6 @@ class QScreen; class QQmlApplicationEngine; class QQuickWindow; class QWindow; -class QQuickWindow; class QGuiApplication; namespace OCC { @@ -57,6 +57,8 @@ double menuBarThickness(); class Systray : public QSystemTrayIcon { Q_OBJECT + QML_ELEMENT + QML_SINGLETON Q_PROPERTY(QString windowTitle READ windowTitle CONSTANT) Q_PROPERTY(bool useNormalWindow READ useNormalWindow CONSTANT) @@ -69,6 +71,13 @@ class Systray : public QSystemTrayIcon static Systray *instance(); ~Systray() override = default; + static Systray *create(QQmlEngine *, QJSEngine *) + { + auto _instance = instance(); + QQmlEngine::setObjectOwnership(_instance, QJSEngine::CppOwnership); + return _instance; + } + enum class TaskBarPosition { Bottom, Left, Top, Right }; Q_ENUM(TaskBarPosition); diff --git a/src/gui/tray/ActivityItem.qml b/src/gui/tray/ActivityItem.qml index 6af9ec3c16522..07761c8b1dbe9 100644 --- a/src/gui/tray/ActivityItem.qml +++ b/src/gui/tray/ActivityItem.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import com.nextcloud.desktopclient ItemDelegate { diff --git a/src/gui/tray/ActivityItemActions.qml b/src/gui/tray/ActivityItemActions.qml index 3997f9250f6e8..a1f41bddfc495 100644 --- a/src/gui/tray/ActivityItemActions.qml +++ b/src/gui/tray/ActivityItemActions.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import com.nextcloud.desktopclient Repeater { diff --git a/src/gui/tray/ActivityItemContent.qml b/src/gui/tray/ActivityItemContent.qml index f1b09c765e0ef..f74306f618345 100644 --- a/src/gui/tray/ActivityItemContent.qml +++ b/src/gui/tray/ActivityItemContent.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import Qt5Compat.GraphicalEffects import com.nextcloud.desktopclient diff --git a/src/gui/tray/ActivityItemContextMenu.qml b/src/gui/tray/ActivityItemContextMenu.qml index c9be6b0e4bba8..d56f1f1afcbc1 100644 --- a/src/gui/tray/ActivityItemContextMenu.qml +++ b/src/gui/tray/ActivityItemContextMenu.qml @@ -6,7 +6,6 @@ import QtQml import QtQuick import QtQuick.Controls -import Style AutoSizingMenu { id: moreActionsButtonContextMenu diff --git a/src/gui/tray/ActivityList.qml b/src/gui/tray/ActivityList.qml index e2e43c3492707..2758eb943b236 100644 --- a/src/gui/tray/ActivityList.qml +++ b/src/gui/tray/ActivityList.qml @@ -6,7 +6,6 @@ import QtQuick import QtQuick.Controls -import Style import com.nextcloud.desktopclient as NC ScrollView { @@ -15,7 +14,7 @@ ScrollView { property alias count: activityList.count property alias atYBeginning : activityList.atYBeginning property bool isFileActivityList: false - property int iconSize: Style.trayListItemIconSize + property int iconSize: NC.Style.trayListItemIconSize property int delegateHorizontalPadding: 0 property bool scrollingToTop: false @@ -38,8 +37,8 @@ ScrollView { ScrollBar.horizontal.policy: ScrollBar.AlwaysOff ScrollBar.vertical.policy: ScrollBar.AlwaysOn - ScrollBar.vertical.width: Math.max(ScrollBar.vertical.implicitWidth, Style.minimumScrollBarWidth) - ScrollBar.vertical.minimumSize: Style.minimumScrollBarThumbSize + ScrollBar.vertical.width: Math.max(ScrollBar.vertical.implicitWidth, NC.Style.minimumScrollBarWidth) + ScrollBar.vertical.minimumSize: NC.Style.minimumScrollBarThumbSize data: NC.WheelHandler { target: controlRoot.contentItem @@ -62,12 +61,12 @@ ScrollView { Timer { id: repeatUpFlickTimer - interval: Style.activityListScrollToTopTimerInterval + interval: NC.Style.activityListScrollToTopTimerInterval running: controlRoot.scrollingToTop repeat: true onTriggered: { if (!activityList.atYBeginning) { - activityList.flick(0, Style.activityListScrollToTopVelocity) + activityList.flick(0, NC.Style.activityListScrollToTopVelocity) } else { controlRoot.scrollingToTop = false } @@ -78,7 +77,7 @@ ScrollView { id: activityHover anchors.fill: activityList.currentItem color: palette.highlight - radius: Style.mediumRoundedButtonRadius + radius: NC.Style.mediumRoundedButtonRadius visible: activityList.activeFocus } @@ -133,15 +132,15 @@ ScrollView { anchors.right: parent.right hoverEnabled: true - padding: Style.smallSpacing + padding: NC.Style.smallSpacing Accessible.role: Accessible.Button Accessible.name: qsTr("Scroll to top") Accessible.onPressAction: scrollToTopButton.clicked() icon.source: "image://svgimage-custom-color/chevron-double-up.svg/" + palette.buttonText - icon.width: Style.activityListButtonIconSize - icon.height: Style.activityListButtonIconSize + icon.width: NC.Style.activityListButtonIconSize + icon.height: NC.Style.activityListButtonIconSize onClicked: controlRoot.scrollToTop() @@ -153,7 +152,7 @@ ScrollView { width: parent.width * 0.8 anchors.centerIn: parent visible: activityList.count === 0 - spacing: Style.standardSpacing + spacing: NC.Style.standardSpacing Image { width: parent.width diff --git a/src/gui/tray/AutoSizingMenu.qml b/src/gui/tray/AutoSizingMenu.qml index c95355dac5c98..8d4d15a8a90ab 100644 --- a/src/gui/tray/AutoSizingMenu.qml +++ b/src/gui/tray/AutoSizingMenu.qml @@ -5,7 +5,6 @@ import QtQuick import QtQuick.Controls -import Style Menu { width: { diff --git a/src/gui/tray/CMakeLists.txt b/src/gui/tray/CMakeLists.txt new file mode 100644 index 0000000000000..edba447aac89a --- /dev/null +++ b/src/gui/tray/CMakeLists.txt @@ -0,0 +1,70 @@ +# SPDX-FileCopyrightText: 2025 Nextcloud GmbH +# SPDX-FileContributor: Carl Schwan +# SPDX-License-Identifier: BSD-3-Clause + +add_library(nextcloudTray STATIC) + +ecm_add_qml_module(nextcloudTray + URI com.nextcloud.desktopclient.tray + GENERATE_PLUGIN_SOURCE + QML_FILES + MainWindow.qml + UserLine.qml + HeaderButton.qml + SyncStatus.qml + ActivityItem.qml + AutoSizingMenu.qml + ActivityList.qml + CurrentAccountHeaderButton.qml + TrayWindowHeader.qml + UnifiedSearchInputContainer.qml + UnifiedSearchResultFetchMoreTrigger.qml + UnifiedSearchResultItem.qml + UnifiedSearchResultItemSkeleton.qml + UnifiedSearchResultItemSkeletonContainer.qml + UnifiedSearchResultItemSkeletonGradientRectangle.qml + UnifiedSearchResultListItem.qml + UnifiedSearchResultNothingFound.qml + UnifiedSearchPlaceholderView.qml + UnifiedSearchResultSectionItem.qml + ActivityItemContextMenu.qml + ActivityItemActions.qml + ActivityItemContent.qml + TalkReplyTextField.qml + CallNotificationDialog.qml + EditFileLocallyLoadingDialog.qml + EncryptionTokenDiscoveryDialog.qml + NCBusyIndicator.qml + NCIconWithBackgroundImage.qml + NCProgressBar.qml + EnforcedPlainTextLabel.qml + ListItemLineAndSubline.qml + TrayFoldersMenuButton.qml + TrayFolderListItem.qml + SOURCES + activitydata.cpp + activitydata.h + activitylistmodel.cpp + activitylistmodel.h + asyncimageresponse.cpp + fileactivitylistmodel.cpp + fileactivitylistmodel.h + notificationhandler.cpp + notificationhandler.h + sortedactivitylistmodel.cpp + sortedactivitylistmodel.h + svgimageprovider.cpp + svgimageprovider.h + syncstatussummary.cpp + syncstatussummary.h + talkreply.cpp + trayimageprovider.cpp + unifiedsearchresult.cpp + unifiedsearchresult.h + unifiedsearchresultslistmodel.cpp + unifiedsearchresultslistmodel.h + usermodel.cpp + usermodel.h +) + +target_link_libraries(nextcloudTray PRIVATE nextcloudCore Qt::QmlIntegration) diff --git a/src/gui/tray/CallNotificationDialog.qml b/src/gui/tray/CallNotificationDialog.qml index 25b45f3d71519..68c6d0e6222bd 100644 --- a/src/gui/tray/CallNotificationDialog.qml +++ b/src/gui/tray/CallNotificationDialog.qml @@ -5,7 +5,6 @@ import QtQuick import QtQuick.Window -import Style import com.nextcloud.desktopclient import QtQuick.Layouts import QtMultimedia @@ -156,7 +155,7 @@ ApplicationWindow { cache: true source: root.usingUserAvatar ? root.talkNotificationData.userAvatar : - Style.darkMode ? root.talkIcon + palette.windowText : root.talkIcon + Style.ncBlue + Theme.darkMode ? root.talkIcon + palette.windowText : root.talkIcon + Style.ncBlue sourceSize.width: Style.accountAvatarSize sourceSize.height: Style.accountAvatarSize diff --git a/src/gui/tray/CurrentAccountHeaderButton.qml b/src/gui/tray/CurrentAccountHeaderButton.qml index c296c8fbab0d4..09b19656ad44e 100644 --- a/src/gui/tray/CurrentAccountHeaderButton.qml +++ b/src/gui/tray/CurrentAccountHeaderButton.qml @@ -10,7 +10,6 @@ import QtQuick.Layouts import "../" import "../filedetails/" -import Style import com.nextcloud.desktopclient import com.nextcloud.desktopclient as NC @@ -249,8 +248,8 @@ Button { id: currentAccountStatusIndicatorBackground visible: UserModel.currentUser && UserModel.currentUser.isConnected && UserModel.currentUser.serverHasUserStatus - && UserModel.currentUser.status !== NC.userStatus.Invisible - && UserModel.currentUser.status !== NC.userStatus.Offline + && UserModel.currentUser.status !== NC.UserStatus.Invisible + && UserModel.currentUser.status !== NC.UserStatus.Offline width: Style.accountAvatarStateIndicatorSize + Style.trayFolderStatusIndicatorSizeOffset height: width color: "white" @@ -263,8 +262,8 @@ Button { id: currentAccountStatusIndicator visible: UserModel.currentUser && UserModel.currentUser.isConnected && UserModel.currentUser.serverHasUserStatus - && UserModel.currentUser.status !== NC.userStatus.Invisible - && UserModel.currentUser.status !== NC.userStatus.Offline + && UserModel.currentUser.status !== NC.UserStatus.Invisible + && UserModel.currentUser.status !== NC.UserStatus.Offline source: UserModel.currentUser ? UserModel.currentUser.statusIcon : "" cache: false anchors.centerIn: currentAccountStatusIndicatorBackground diff --git a/src/gui/tray/EditFileLocallyLoadingDialog.qml b/src/gui/tray/EditFileLocallyLoadingDialog.qml index 2e4a37e767f0b..b267631f3e44c 100644 --- a/src/gui/tray/EditFileLocallyLoadingDialog.qml +++ b/src/gui/tray/EditFileLocallyLoadingDialog.qml @@ -5,7 +5,6 @@ import QtQuick import QtQuick.Window -import Style import com.nextcloud.desktopclient import QtQuick.Layouts import QtQuick.Controls diff --git a/src/gui/tray/EncryptionTokenDiscoveryDialog.qml b/src/gui/tray/EncryptionTokenDiscoveryDialog.qml index 9213c9da767d3..9737ea4adcd7f 100644 --- a/src/gui/tray/EncryptionTokenDiscoveryDialog.qml +++ b/src/gui/tray/EncryptionTokenDiscoveryDialog.qml @@ -5,7 +5,6 @@ import QtQuick 2.15 import QtQuick.Window 2.15 -import Style 1.0 import com.nextcloud.desktopclient 1.0 import QtQuick.Layouts 1.15 import QtQuick.Controls 2.15 diff --git a/src/gui/tray/HeaderButton.qml b/src/gui/tray/HeaderButton.qml index da920f5f3f088..2e3e1bdca776f 100644 --- a/src/gui/tray/HeaderButton.qml +++ b/src/gui/tray/HeaderButton.qml @@ -11,7 +11,6 @@ import QtQuick.Controls import QtQuick.Layouts // Custom qml modules are in /theme (and included by resources.qrc) -import Style import com.nextcloud.desktopclient Button { diff --git a/src/gui/tray/ListItemLineAndSubline.qml b/src/gui/tray/ListItemLineAndSubline.qml index 6582c7c7e58d2..4a9d03948281f 100644 --- a/src/gui/tray/ListItemLineAndSubline.qml +++ b/src/gui/tray/ListItemLineAndSubline.qml @@ -7,7 +7,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style ColumnLayout { id: root diff --git a/src/gui/tray/MainWindow.qml b/src/gui/tray/MainWindow.qml index 82a20e4f8411b..a52fe811190c0 100644 --- a/src/gui/tray/MainWindow.qml +++ b/src/gui/tray/MainWindow.qml @@ -15,7 +15,6 @@ import "../" import "../filedetails/" // Custom qml modules are in /theme (and included by resources.qrc) -import Style import com.nextcloud.desktopclient diff --git a/src/gui/tray/NCBusyIndicator.qml b/src/gui/tray/NCBusyIndicator.qml index 6252eaaa7d132..1ceeb01595531 100644 --- a/src/gui/tray/NCBusyIndicator.qml +++ b/src/gui/tray/NCBusyIndicator.qml @@ -5,7 +5,6 @@ import QtQuick import QtQuick.Controls -import Style BusyIndicator { id: root diff --git a/src/gui/tray/NCIconWithBackgroundImage.qml b/src/gui/tray/NCIconWithBackgroundImage.qml index 2b572faca6a62..c80fc455718d7 100644 --- a/src/gui/tray/NCIconWithBackgroundImage.qml +++ b/src/gui/tray/NCIconWithBackgroundImage.qml @@ -4,7 +4,6 @@ */ import QtQuick -import Style Image { id: root diff --git a/src/gui/tray/NCProgressBar.qml b/src/gui/tray/NCProgressBar.qml index 839073da4b084..c56bfef7ff204 100644 --- a/src/gui/tray/NCProgressBar.qml +++ b/src/gui/tray/NCProgressBar.qml @@ -6,7 +6,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Controls.Basic as BasicControls -import Style BasicControls.ProgressBar { id: control diff --git a/src/gui/tray/SyncStatus.qml b/src/gui/tray/SyncStatus.qml index dacd84f1f4381..d5fb7010e991b 100644 --- a/src/gui/tray/SyncStatus.qml +++ b/src/gui/tray/SyncStatus.qml @@ -7,7 +7,6 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import com.nextcloud.desktopclient as NC @@ -17,7 +16,7 @@ RowLayout { property alias model: syncStatus property color accentColor: Style.ncBlue - spacing: Style.trayHorizontalMargin + spacing: NC.Style.trayHorizontalMargin NC.SyncStatusSummary { id: syncStatus @@ -25,17 +24,17 @@ RowLayout { NCBusyIndicator { id: syncIcon - property int size: Style.trayListItemIconSize * 0.6 - property int whiteSpace: (Style.trayListItemIconSize - size) + property int size: NC.Style.trayListItemIconSize * 0.6 + property int whiteSpace: (NC.Style.trayListItemIconSize - size) Layout.preferredWidth: size Layout.preferredHeight: size Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter - Layout.topMargin: Style.trayHorizontalMargin - Layout.rightMargin: whiteSpace * (0.5 + Style.thumbnailImageSizeReduction) - Layout.bottomMargin: Style.trayHorizontalMargin - Layout.leftMargin: Style.trayHorizontalMargin + (whiteSpace * (0.5 - Style.thumbnailImageSizeReduction)) + Layout.topMargin: NC.Style.trayHorizontalMargin + Layout.rightMargin: whiteSpace * (0.5 + NC.Style.thumbnailImageSizeReduction) + Layout.bottomMargin: NC.Style.trayHorizontalMargin + Layout.leftMargin: NC.Style.trayHorizontalMargin + (whiteSpace * (0.5 - NC.Style.thumbnailImageSizeReduction)) padding: 0 @@ -48,7 +47,7 @@ RowLayout { Layout.alignment: Qt.AlignVCenter Layout.topMargin: 8 - Layout.rightMargin: Style.trayHorizontalMargin + Layout.rightMargin: NC.Style.trayHorizontalMargin Layout.bottomMargin: 8 Layout.fillWidth: true Layout.fillHeight: true @@ -60,14 +59,14 @@ RowLayout { text: syncStatus.syncStatusString verticalAlignment: Text.AlignVCenter - font.pixelSize: Style.topLinePixelSize + font.pixelSize: NC.Style.topLinePixelSize font.bold: true wrapMode: Text.Wrap } Loader { Layout.fillWidth: true - Layout.preferredHeight: Style.progressBarPreferredHeight + Layout.preferredHeight: NC.Style.progressBarPreferredHeight active: syncStatus.syncing && syncStatus.totalFiles > 0 visible: active @@ -86,7 +85,7 @@ RowLayout { text: syncStatus.syncStatusDetailString visible: syncStatus.syncStatusDetailString !== "" - font.pixelSize: Style.subLinePixelSize + font.pixelSize: NC.Style.subLinePixelSize wrapMode: Text.Wrap } } @@ -94,11 +93,11 @@ RowLayout { Button { id: syncNowButton - Layout.rightMargin: Style.trayHorizontalMargin + Layout.rightMargin: NC.Style.trayHorizontalMargin text: qsTr("Sync now") - padding: Style.smallSpacing + padding: NC.Style.smallSpacing visible: !activityModel.hasSyncConflicts && !syncStatus.syncing && @@ -113,7 +112,7 @@ RowLayout { } Button { - Layout.rightMargin: Style.trayHorizontalMargin + Layout.rightMargin: NC.Style.trayHorizontalMargin text: qsTr("Resolve conflicts") @@ -126,7 +125,7 @@ RowLayout { } Button { - Layout.rightMargin: Style.trayHorizontalMargin + Layout.rightMargin: NC.Style.trayHorizontalMargin text: qsTr("Open browser") diff --git a/src/gui/tray/TalkReplyTextField.qml b/src/gui/tray/TalkReplyTextField.qml index 28e3883633957..9bd5da064cf58 100644 --- a/src/gui/tray/TalkReplyTextField.qml +++ b/src/gui/tray/TalkReplyTextField.qml @@ -8,7 +8,6 @@ import QtQuick.Controls import QtQuick.Layouts import com.nextcloud.desktopclient -import Style TextField { id: replyMessageTextField diff --git a/src/gui/tray/TrayFolderListItem.qml b/src/gui/tray/TrayFolderListItem.qml index feb8303830447..95ab337ec1124 100644 --- a/src/gui/tray/TrayFolderListItem.qml +++ b/src/gui/tray/TrayFolderListItem.qml @@ -6,7 +6,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style MenuItem { id: root diff --git a/src/gui/tray/TrayFoldersMenuButton.qml b/src/gui/tray/TrayFoldersMenuButton.qml index 4ae4d28a58b90..677c28c1c6781 100644 --- a/src/gui/tray/TrayFoldersMenuButton.qml +++ b/src/gui/tray/TrayFoldersMenuButton.qml @@ -7,7 +7,7 @@ import QtQuick import QtQuick.Controls import QtQuick.Layouts import Qt5Compat.GraphicalEffects -import Style +import com.nextcloud.desktopclient HeaderButton { id: root diff --git a/src/gui/tray/TrayWindowHeader.qml b/src/gui/tray/TrayWindowHeader.qml index 508c39e7d2164..e144c430095ee 100644 --- a/src/gui/tray/TrayWindowHeader.qml +++ b/src/gui/tray/TrayWindowHeader.qml @@ -10,7 +10,6 @@ import QtQuick.Layouts import "../" import "../filedetails/" -import Style import com.nextcloud.desktopclient Rectangle { diff --git a/src/gui/tray/UnifiedSearchInputContainer.qml b/src/gui/tray/UnifiedSearchInputContainer.qml index 4fd6ac4f1d927..70e5e2778b593 100644 --- a/src/gui/tray/UnifiedSearchInputContainer.qml +++ b/src/gui/tray/UnifiedSearchInputContainer.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import Qt5Compat.GraphicalEffects -import Style import com.nextcloud.desktopclient diff --git a/src/gui/tray/UnifiedSearchPlaceholderView.qml b/src/gui/tray/UnifiedSearchPlaceholderView.qml index e092363464d95..e01b235602c33 100644 --- a/src/gui/tray/UnifiedSearchPlaceholderView.qml +++ b/src/gui/tray/UnifiedSearchPlaceholderView.qml @@ -7,7 +7,7 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style +import com.nextcloud.desktopclient ColumnLayout { id: root diff --git a/src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml b/src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml index 565db1dd8ad4d..45c227cd0da9c 100644 --- a/src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml +++ b/src/gui/tray/UnifiedSearchResultFetchMoreTrigger.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style ColumnLayout { id: unifiedSearchResultItemFetchMore diff --git a/src/gui/tray/UnifiedSearchResultItem.qml b/src/gui/tray/UnifiedSearchResultItem.qml index 2411034eb47e1..9f61074f85291 100644 --- a/src/gui/tray/UnifiedSearchResultItem.qml +++ b/src/gui/tray/UnifiedSearchResultItem.qml @@ -9,7 +9,6 @@ import QtQuick.Controls import QtQuick.Layouts import Qt5Compat.GraphicalEffects -import Style RowLayout { id: unifiedSearchResultItemDetails diff --git a/src/gui/tray/UnifiedSearchResultItemSkeleton.qml b/src/gui/tray/UnifiedSearchResultItemSkeleton.qml index e63dc01fbdd77..aed36b39e78a3 100644 --- a/src/gui/tray/UnifiedSearchResultItemSkeleton.qml +++ b/src/gui/tray/UnifiedSearchResultItemSkeleton.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Layouts import Qt5Compat.GraphicalEffects -import Style RowLayout { id: unifiedSearchResultSkeletonItemDetails diff --git a/src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml b/src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml index f9b21ac46f5ab..47c003480b019 100644 --- a/src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml +++ b/src/gui/tray/UnifiedSearchResultItemSkeletonContainer.qml @@ -8,7 +8,6 @@ import QtQuick import QtQuick.Layouts import Qt5Compat.GraphicalEffects -import Style ColumnLayout { id: unifiedSearchResultsListViewSkeletonColumn diff --git a/src/gui/tray/UnifiedSearchResultItemSkeletonGradientRectangle.qml b/src/gui/tray/UnifiedSearchResultItemSkeletonGradientRectangle.qml index b4d9229fe4bb6..c591b262f0092 100644 --- a/src/gui/tray/UnifiedSearchResultItemSkeletonGradientRectangle.qml +++ b/src/gui/tray/UnifiedSearchResultItemSkeletonGradientRectangle.qml @@ -8,12 +8,11 @@ import QtQuick import QtQuick.Layouts import Qt5Compat.GraphicalEffects -import Style Rectangle { id: root - property color progressGradientColor: Style.darkMode ? Qt.lighter(palette.light, 1.2) : Qt.darker(palette.light, 1.1) + property color progressGradientColor: Theme.darkMode ? Qt.lighter(palette.light, 1.2) : Qt.darker(palette.light, 1.1) property int animationStartX: -width property int animationEndX: width diff --git a/src/gui/tray/UnifiedSearchResultListItem.qml b/src/gui/tray/UnifiedSearchResultListItem.qml index 6c998598fbd66..7740d30fe3374 100644 --- a/src/gui/tray/UnifiedSearchResultListItem.qml +++ b/src/gui/tray/UnifiedSearchResultListItem.qml @@ -6,7 +6,6 @@ import QtQml import QtQuick import QtQuick.Controls -import Style import com.nextcloud.desktopclient MouseArea { @@ -48,9 +47,9 @@ MouseArea { anchors.fill: parent title: model.resultTitle subline: model.subline - icons: Style.darkMode ? model.darkIcons : model.lightIcons - iconsIsThumbnail: Style.darkMode ? model.darkIconsIsThumbnail : model.lightIconsIsThumbnail - iconPlaceholder: Style.darkMode ? model.darkImagePlaceholder : model.lightImagePlaceholder + icons: Theme.darkMode ? model.darkIcons : model.lightIcons + iconsIsThumbnail: Theme.darkMode ? model.darkIconsIsThumbnail : model.lightIconsIsThumbnail + iconPlaceholder: Theme.darkMode ? model.darkImagePlaceholder : model.lightImagePlaceholder isRounded: model.isRounded && iconsIsThumbnail } } diff --git a/src/gui/tray/UnifiedSearchResultNothingFound.qml b/src/gui/tray/UnifiedSearchResultNothingFound.qml index 93e9fad01d47a..f7cc327604387 100644 --- a/src/gui/tray/UnifiedSearchResultNothingFound.qml +++ b/src/gui/tray/UnifiedSearchResultNothingFound.qml @@ -7,7 +7,8 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style +import QtQuick.Layouts +import com.nextcloud.desktopclient ColumnLayout { id: unifiedSearchResultNothingFoundContainer diff --git a/src/gui/tray/UnifiedSearchResultSectionItem.qml b/src/gui/tray/UnifiedSearchResultSectionItem.qml index 8318a10e75af1..5629e3143599e 100644 --- a/src/gui/tray/UnifiedSearchResultSectionItem.qml +++ b/src/gui/tray/UnifiedSearchResultSectionItem.qml @@ -7,7 +7,6 @@ import QtQml import QtQuick import QtQuick.Controls import QtQuick.Layouts -import Style import com.nextcloud.desktopclient EnforcedPlainTextLabel { diff --git a/src/gui/tray/UserLine.qml b/src/gui/tray/UserLine.qml index 2491fd3c5be79..3bb709bc92e7d 100644 --- a/src/gui/tray/UserLine.qml +++ b/src/gui/tray/UserLine.qml @@ -9,7 +9,6 @@ import QtQuick.Controls import QtQuick.Layouts // Custom qml modules are in /theme (and included by resources.qrc) -import Style import com.nextcloud.desktopclient AbstractButton { @@ -34,7 +33,7 @@ AbstractButton { Layout.leftMargin: Style.accountIconsMenuMargin verticalAlignment: Qt.AlignCenter cache: false - source: model.avatar !== "" ? model.avatar : Style.darkMode ? "image://avatars/fallbackWhite" : "image://avatars/fallbackBlack" + source: model.avatar !== "" ? model.avatar : Theme.darkMode ? "image://avatars/fallbackWhite" : "image://avatars/fallbackBlack" Layout.preferredHeight: Style.accountAvatarSize Layout.preferredWidth: Style.accountAvatarSize diff --git a/src/gui/tray/activitydata.h b/src/gui/tray/activitydata.h index 00cae91de5c10..f67118283d5a4 100644 --- a/src/gui/tray/activitydata.h +++ b/src/gui/tray/activitydata.h @@ -15,6 +15,7 @@ #include #include #include +#include namespace OCC { /** @@ -93,6 +94,7 @@ struct RichSubjectParameter { struct TalkNotificationData { Q_GADGET + QML_ELEMENT Q_PROPERTY(QString conversationToken MEMBER conversationToken) Q_PROPERTY(QString messageId MEMBER messageId) Q_PROPERTY(QString messageSent MEMBER messageSent) @@ -131,6 +133,7 @@ struct TalkNotificationData { class Activity { Q_GADGET + QML_ELEMENT Q_PROPERTY(OCC::Activity::Type type MEMBER _type) Q_PROPERTY(OCC::TalkNotificationData talkNotificationData MEMBER _talkNotificationData) Q_PROPERTY(QVariantMap subjectRichParameters MEMBER _subjectRichParameters) diff --git a/src/gui/tray/activitylistmodel.h b/src/gui/tray/activitylistmodel.h index cd8ad12ad2a62..849e38651f81f 100644 --- a/src/gui/tray/activitylistmodel.h +++ b/src/gui/tray/activitylistmodel.h @@ -8,8 +8,10 @@ #define ACTIVITYLISTMODEL_H #include +#include #include "activitydata.h" +#include "accountstate.h" class QJsonDocument; @@ -21,7 +23,6 @@ namespace OCC { Q_DECLARE_LOGGING_CATEGORY(lcActivity) -class AccountState; class ConflictDialog; class InvalidFilenameDialog; class CaseClashFilenameDialog; @@ -36,6 +37,7 @@ class CaseClashFilenameDialog; class ActivityListModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT Q_PROPERTY(quint32 maxActionButtons READ maxActionButtons CONSTANT) Q_PROPERTY(AccountState *accountState READ accountState WRITE setAccountState NOTIFY accountStateChanged) Q_PROPERTY(bool hasSyncConflicts READ hasSyncConflicts NOTIFY hasSyncConflictsChanged) diff --git a/src/gui/fileactivitylistmodel.cpp b/src/gui/tray/fileactivitylistmodel.cpp similarity index 100% rename from src/gui/fileactivitylistmodel.cpp rename to src/gui/tray/fileactivitylistmodel.cpp diff --git a/src/gui/fileactivitylistmodel.h b/src/gui/tray/fileactivitylistmodel.h similarity index 97% rename from src/gui/fileactivitylistmodel.h rename to src/gui/tray/fileactivitylistmodel.h index c2d6a9c96e135..312cfadc78dab 100644 --- a/src/gui/fileactivitylistmodel.h +++ b/src/gui/tray/fileactivitylistmodel.h @@ -13,6 +13,7 @@ namespace OCC { class FileActivityListModel : public ActivityListModel { Q_OBJECT + QML_ELEMENT Q_PROPERTY(QString localPath READ localPath WRITE setLocalPath NOTIFY localPathChanged) public: diff --git a/src/gui/tray/sortedactivitylistmodel.h b/src/gui/tray/sortedactivitylistmodel.h index 36dd4603c4db4..226e4f7016b94 100644 --- a/src/gui/tray/sortedactivitylistmodel.h +++ b/src/gui/tray/sortedactivitylistmodel.h @@ -6,6 +6,7 @@ #pragma once #include +#include namespace OCC { @@ -14,6 +15,7 @@ class ActivityListModel; class SortedActivityListModel : public QSortFilterProxyModel { Q_OBJECT + QML_ELEMENT public: explicit SortedActivityListModel(QObject *parent = nullptr); diff --git a/src/gui/tray/syncstatussummary.h b/src/gui/tray/syncstatussummary.h index ad95d1ba65cde..f72f6229e06a8 100644 --- a/src/gui/tray/syncstatussummary.h +++ b/src/gui/tray/syncstatussummary.h @@ -14,12 +14,14 @@ #include #include +#include namespace OCC { class SyncStatusSummary : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(double syncProgress READ syncProgress NOTIFY syncProgressChanged) Q_PROPERTY(QUrl syncIcon READ syncIcon NOTIFY syncIconChanged) diff --git a/src/gui/tray/unifiedsearchresultslistmodel.h b/src/gui/tray/unifiedsearchresultslistmodel.h index a2c07eb651fab..56292e4d5e0d5 100644 --- a/src/gui/tray/unifiedsearchresultslistmodel.h +++ b/src/gui/tray/unifiedsearchresultslistmodel.h @@ -10,6 +10,7 @@ #include #include +#include namespace OCC { class AccountState; @@ -23,6 +24,8 @@ class AccountState; class UnifiedSearchResultsListModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT + QML_UNCREATABLE("") Q_PROPERTY(bool isSearchInProgress READ isSearchInProgress NOTIFY isSearchInProgressChanged) Q_PROPERTY(QString currentFetchMoreInProgressProviderId READ currentFetchMoreInProgressProviderId NOTIFY diff --git a/src/gui/tray/usermodel.h b/src/gui/tray/usermodel.h index 91afe8cc556d1..6489e3823bffe 100644 --- a/src/gui/tray/usermodel.h +++ b/src/gui/tray/usermodel.h @@ -16,6 +16,7 @@ #include #include #include +#include #include "accountfwd.h" #include "accountmanager.h" @@ -272,6 +273,8 @@ private slots: class UserModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT + QML_SINGLETON Q_PROPERTY(User* currentUser READ currentUser NOTIFY currentUserChanged) Q_PROPERTY(int currentUserId READ currentUserId WRITE setCurrentUserId NOTIFY currentUserChanged) Q_PROPERTY(bool hasSyncErrors READ hasSyncErrors NOTIFY syncErrorUsersChanged) @@ -283,6 +286,13 @@ class UserModel : public QAbstractListModel static UserModel *instance(); ~UserModel() override = default; + static UserModel *create(QQmlEngine *, QJSEngine *) + { + auto i = instance(); + QQmlEngine::setObjectOwnership(i, QJSEngine::CppOwnership); + return i; + } + void addUser(AccountStatePtr &user, const bool &isCurrent = false); int currentUserIndex(); @@ -381,10 +391,20 @@ class ImageProvider : public QQuickAsyncImageProvider class UserAppsModel : public QAbstractListModel { Q_OBJECT + QML_ELEMENT + QML_SINGLETON + public: static UserAppsModel *instance(); ~UserAppsModel() override = default; + static UserAppsModel *create(QQmlEngine *, QJSEngine *) + { + auto _instance = instance(); + QQmlEngine::setObjectOwnership(_instance, QJSEngine::CppOwnership); + return _instance; + } + [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override; [[nodiscard]] QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; diff --git a/src/gui/types.cpp b/src/gui/types.cpp new file mode 100644 index 0000000000000..28353d4e276d0 --- /dev/null +++ b/src/gui/types.cpp @@ -0,0 +1,3 @@ +// SPDX-FIl + +#include "types.h" diff --git a/src/gui/types.h b/src/gui/types.h new file mode 100644 index 0000000000000..366bedbb73867 --- /dev/null +++ b/src/gui/types.h @@ -0,0 +1,53 @@ +// SPDX-FileCopyrightText: 2025 Nextcloud GmbH +// SPDX-FileContributor: Carl Schwan +// SPDX-License-Identifier: GPL-2.0-or-later + +#pragma once + +#include "userstatusconnector.h" +#include "clientsideencryptiontokenselector.h" +#include "theme.h" +#include "sharee.h" + +#include +#include + +class UserStatusForeign +{ + Q_GADGET + QML_NAMED_ELEMENT(UserStatus) + QML_FOREIGN(OCC::UserStatus) + QML_UNCREATABLE("") +}; + +class ShareeForeign +{ + Q_GADGET + QML_NAMED_ELEMENT(Sharee) + QML_FOREIGN(OCC::Sharee) + QML_UNCREATABLE("") +}; + +class ClientSideEncryptionTokenSelectorForeign : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(ClientSideEncryptionTokenSelector) + QML_FOREIGN(OCC::ClientSideEncryptionTokenSelector) + QML_UNCREATABLE("") +}; + +class ThemeForeign : public QObject +{ + Q_OBJECT + QML_NAMED_ELEMENT(Theme) + QML_FOREIGN(OCC::Theme) + QML_SINGLETON + QML_UNCREATABLE("") + + static OCC::Theme *create(QQmlEngine *, QJSEngine *engine) + { + auto _instance = OCC::Theme::instance(); + QQmlEngine::setObjectOwnership(_instance, QJSEngine::CppOwnership); + return _instance; + } +}; diff --git a/src/gui/userstatusselectormodel.h b/src/gui/userstatusselectormodel.h index 424925f555b12..113ca88509eee 100644 --- a/src/gui/userstatusselectormodel.h +++ b/src/gui/userstatusselectormodel.h @@ -14,6 +14,7 @@ #include #include #include +#include #include #include @@ -24,6 +25,7 @@ namespace OCC { class UserStatusSelectorModel : public QObject { Q_OBJECT + QML_ELEMENT Q_PROPERTY(int userIndex READ userIndex WRITE setUserIndex NOTIFY userIndexChanged) Q_PROPERTY(QString userStatusMessage READ userStatusMessage WRITE setUserStatusMessage NOTIFY userStatusChanged) diff --git a/src/libsync/CMakeLists.txt b/src/libsync/CMakeLists.txt index 10429efe187cb..09234e3839be0 100644 --- a/src/libsync/CMakeLists.txt +++ b/src/libsync/CMakeLists.txt @@ -216,6 +216,7 @@ find_package(Qt${QT_MAJOR_VERSION} REQUIRED COMPONENTS WebSockets Xml Sql Gui Sv add_library(nextcloudsync SHARED ${libsync_SRCS}) add_library(Nextcloud::sync ALIAS nextcloudsync) +qt_extract_metatypes(nextcloudsync) target_link_libraries(nextcloudsync PUBLIC diff --git a/theme/Style/qmldir b/theme/Style/qmldir deleted file mode 100644 index 026b5b9265474..0000000000000 --- a/theme/Style/qmldir +++ /dev/null @@ -1,2 +0,0 @@ -module Style -singleton Style 1.0 Style.qml diff --git a/theme/Style/qmldir.license b/theme/Style/qmldir.license deleted file mode 100644 index 233dfc7409196..0000000000000 --- a/theme/Style/qmldir.license +++ /dev/null @@ -1,2 +0,0 @@ -SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors -SPDX-License-Identifier: GPL-2.0-or-later