diff --git a/CMakeLists.txt b/CMakeLists.txt
index cc53ccf1452f1..92e18908327c6 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -93,6 +93,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 711cb8dbea766..fd796e2fc20c3 100644
--- a/resources.qrc
+++ b/resources.qrc
@@ -6,7 +6,6 @@
src/gui/WindowAccountHeader.qml
src/gui/ActivitiesWindow.qml
src/gui/AssistantWindow.qml
- src/gui/search/qml/SearchWindow.qml
src/gui/UserStatusWindowStatusRow.qml
src/gui/UserStatusWindowPredefinedStatusRow.qml
src/gui/UserStatusSelectorPage.qml
@@ -38,16 +37,6 @@
src/gui/tray/ActivityList.qml
src/gui/tray/CurrentAccountHeaderButton.qml
src/gui/tray/TrayWindowHeader.qml
- src/gui/search/qml/UnifiedSearchInputContainer.qml
- src/gui/search/qml/UnifiedSearchResultFetchMoreTrigger.qml
- src/gui/search/qml/UnifiedSearchResultItem.qml
- src/gui/search/qml/UnifiedSearchResultItemSkeleton.qml
- src/gui/search/qml/UnifiedSearchResultItemSkeletonContainer.qml
- src/gui/search/qml/UnifiedSearchResultItemSkeletonGradientRectangle.qml
- src/gui/search/qml/UnifiedSearchResultListItem.qml
- src/gui/search/qml/UnifiedSearchResultNothingFound.qml
- src/gui/search/qml/UnifiedSearchPlaceholderView.qml
- src/gui/search/qml/UnifiedSearchResultSectionItem.qml
src/gui/tray/ActivityItemContextMenu.qml
src/gui/tray/ActivityItemActions.qml
src/gui/tray/ActivityItemContent.qml
diff --git a/src/gui/CMakeLists.txt b/src/gui/CMakeLists.txt
index cd90eb3fb2005..a6bf4ec2d829d 100644
--- a/src/gui/CMakeLists.txt
+++ b/src/gui/CMakeLists.txt
@@ -237,14 +237,10 @@ set(client_SRCS
tray/activitydata.cpp
tray/activitylistmodel.h
tray/activitylistmodel.cpp
- search/unifiedsearchresult.h
tray/asyncimageresponse.cpp
- search/unifiedsearchresult.cpp
- search/unifiedsearchresultslistmodel.h
tray/trayimageprovider.cpp
tray/trayaccountappsmodel.h
tray/trayaccountappsmodel.cpp
- search/unifiedsearchresultslistmodel.cpp
tray/usermodel.h
tray/usermodel.cpp
tray/notificationhandler.h
@@ -292,6 +288,8 @@ IF(BUILD_UPDATER)
)
endif()
+add_subdirectory(search)
+
IF( APPLE )
list(APPEND client_SRCS cocoainitializer_mac.mm)
list(APPEND client_SRCS systray_mac_common.mm)
@@ -579,6 +577,9 @@ target_link_libraries(nextcloudCore
Qt::QuickWidgets
KF6::Archive
KDAB::kdsingleapplication
+
+ nextcloudGuiSearch
+ nextcloudGuiSearchplugin
)
if(KF6GuiAddons_FOUND)
diff --git a/src/gui/search/CMakeLists.txt b/src/gui/search/CMakeLists.txt
new file mode 100644
index 0000000000000..19894e5589b5c
--- /dev/null
+++ b/src/gui/search/CMakeLists.txt
@@ -0,0 +1,31 @@
+# SPDX-FileCopyrightText: 2026 Nextcloud GmbH and Nextcloud contributors
+# SPDX-License-Identifier: GPL-2.0-or-later
+
+add_library(nextcloudGuiSearch STATIC)
+
+target_sources(nextcloudGuiSearch
+ PRIVATE
+ unifiedsearchresult.h
+ unifiedsearchresult.cpp
+ unifiedsearchresultslistmodel.h
+ unifiedsearchresultslistmodel.cpp
+)
+
+ecm_add_qml_module(nextcloudGuiSearch
+ URI com.nextcloud.desktopclient.search
+ GENERATE_PLUGIN_SOURCE
+ QML_FILES
+ SearchWindow.qml
+ UnifiedSearchInputContainer.qml
+ UnifiedSearchResultFetchMoreTrigger.qml
+ UnifiedSearchResultItem.qml
+ UnifiedSearchResultItemSkeleton.qml
+ UnifiedSearchResultItemSkeletonContainer.qml
+ UnifiedSearchResultItemSkeletonGradientRectangle.qml
+ UnifiedSearchResultListItem.qml
+ UnifiedSearchResultNothingFound.qml
+ UnifiedSearchPlaceholderView.qml
+ UnifiedSearchResultSectionItem.qml
+)
+
+target_link_libraries(nextcloudGuiSearch PRIVATE nextcloudCore)
diff --git a/src/gui/search/qml/SearchWindow.qml b/src/gui/search/SearchWindow.qml
similarity index 99%
rename from src/gui/search/qml/SearchWindow.qml
rename to src/gui/search/SearchWindow.qml
index d051c76cca4a4..c953b391081b6 100644
--- a/src/gui/search/qml/SearchWindow.qml
+++ b/src/gui/search/SearchWindow.qml
@@ -9,7 +9,7 @@ import QtQuick.Layouts
import Style
import com.nextcloud.desktopclient
-import "../.."
+import "qrc:/qml/src/gui"
WizardStyledWindow {
id: root
diff --git a/src/gui/search/qml/UnifiedSearchInputContainer.qml b/src/gui/search/UnifiedSearchInputContainer.qml
similarity index 98%
rename from src/gui/search/qml/UnifiedSearchInputContainer.qml
rename to src/gui/search/UnifiedSearchInputContainer.qml
index 37a77c6925698..7a1ed241535dc 100644
--- a/src/gui/search/qml/UnifiedSearchInputContainer.qml
+++ b/src/gui/search/UnifiedSearchInputContainer.qml
@@ -10,7 +10,7 @@ import Qt5Compat.GraphicalEffects
import Style
import com.nextcloud.desktopclient
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
TextField {
id: root
diff --git a/src/gui/search/qml/UnifiedSearchPlaceholderView.qml b/src/gui/search/UnifiedSearchPlaceholderView.qml
similarity index 96%
rename from src/gui/search/qml/UnifiedSearchPlaceholderView.qml
rename to src/gui/search/UnifiedSearchPlaceholderView.qml
index eaf6803e54105..2df48489197e7 100644
--- a/src/gui/search/qml/UnifiedSearchPlaceholderView.qml
+++ b/src/gui/search/UnifiedSearchPlaceholderView.qml
@@ -8,7 +8,7 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
ColumnLayout {
id: root
diff --git a/src/gui/search/qml/UnifiedSearchResultFetchMoreTrigger.qml b/src/gui/search/UnifiedSearchResultFetchMoreTrigger.qml
similarity index 98%
rename from src/gui/search/qml/UnifiedSearchResultFetchMoreTrigger.qml
rename to src/gui/search/UnifiedSearchResultFetchMoreTrigger.qml
index 46de97d8ecf19..c613f4529915a 100644
--- a/src/gui/search/qml/UnifiedSearchResultFetchMoreTrigger.qml
+++ b/src/gui/search/UnifiedSearchResultFetchMoreTrigger.qml
@@ -8,7 +8,7 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
ColumnLayout {
id: unifiedSearchResultItemFetchMore
diff --git a/src/gui/search/qml/UnifiedSearchResultItem.qml b/src/gui/search/UnifiedSearchResultItem.qml
similarity index 99%
rename from src/gui/search/qml/UnifiedSearchResultItem.qml
rename to src/gui/search/UnifiedSearchResultItem.qml
index 477f290632e49..fae127653b466 100644
--- a/src/gui/search/qml/UnifiedSearchResultItem.qml
+++ b/src/gui/search/UnifiedSearchResultItem.qml
@@ -10,7 +10,7 @@ import QtQuick.Layouts
import Qt5Compat.GraphicalEffects
import Style
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
RowLayout {
id: unifiedSearchResultItemDetails
diff --git a/src/gui/search/qml/UnifiedSearchResultItemSkeleton.qml b/src/gui/search/UnifiedSearchResultItemSkeleton.qml
similarity index 100%
rename from src/gui/search/qml/UnifiedSearchResultItemSkeleton.qml
rename to src/gui/search/UnifiedSearchResultItemSkeleton.qml
diff --git a/src/gui/search/qml/UnifiedSearchResultItemSkeletonContainer.qml b/src/gui/search/UnifiedSearchResultItemSkeletonContainer.qml
similarity index 100%
rename from src/gui/search/qml/UnifiedSearchResultItemSkeletonContainer.qml
rename to src/gui/search/UnifiedSearchResultItemSkeletonContainer.qml
diff --git a/src/gui/search/qml/UnifiedSearchResultItemSkeletonGradientRectangle.qml b/src/gui/search/UnifiedSearchResultItemSkeletonGradientRectangle.qml
similarity index 100%
rename from src/gui/search/qml/UnifiedSearchResultItemSkeletonGradientRectangle.qml
rename to src/gui/search/UnifiedSearchResultItemSkeletonGradientRectangle.qml
diff --git a/src/gui/search/qml/UnifiedSearchResultListItem.qml b/src/gui/search/UnifiedSearchResultListItem.qml
similarity index 100%
rename from src/gui/search/qml/UnifiedSearchResultListItem.qml
rename to src/gui/search/UnifiedSearchResultListItem.qml
diff --git a/src/gui/search/qml/UnifiedSearchResultNothingFound.qml b/src/gui/search/UnifiedSearchResultNothingFound.qml
similarity index 98%
rename from src/gui/search/qml/UnifiedSearchResultNothingFound.qml
rename to src/gui/search/UnifiedSearchResultNothingFound.qml
index baf1a26695380..fe61aa1149127 100644
--- a/src/gui/search/qml/UnifiedSearchResultNothingFound.qml
+++ b/src/gui/search/UnifiedSearchResultNothingFound.qml
@@ -8,7 +8,7 @@ import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Style
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
ColumnLayout {
id: unifiedSearchResultNothingFoundContainer
diff --git a/src/gui/search/qml/UnifiedSearchResultSectionItem.qml b/src/gui/search/UnifiedSearchResultSectionItem.qml
similarity index 95%
rename from src/gui/search/qml/UnifiedSearchResultSectionItem.qml
rename to src/gui/search/UnifiedSearchResultSectionItem.qml
index 547d909bf7fd3..ac763ecf2c797 100644
--- a/src/gui/search/qml/UnifiedSearchResultSectionItem.qml
+++ b/src/gui/search/UnifiedSearchResultSectionItem.qml
@@ -9,7 +9,7 @@ import QtQuick.Controls
import QtQuick.Layouts
import Style
import com.nextcloud.desktopclient
-import "../../tray"
+import "qrc:/qml/src/gui/tray"
EnforcedPlainTextLabel {
required property string section
diff --git a/src/gui/systray.cpp b/src/gui/systray.cpp
index f1ac5d5d3109f..7fc19a3af5b5e 100644
--- a/src/gui/systray.cpp
+++ b/src/gui/systray.cpp
@@ -46,6 +46,8 @@
#define NOTIFICATIONS_IFACE "org.freedesktop.Notifications"
#endif
+using namespace Qt::StringLiterals;
+
namespace OCC {
Q_LOGGING_CATEGORY(lcSystray, "nextcloud.gui.systray")
@@ -428,7 +430,7 @@ void Systray::showSearchWindow(int userIndex)
return;
}
- QQmlComponent searchWindowComponent(trayEngine(), QStringLiteral("qrc:/qml/src/gui/search/qml/SearchWindow.qml"));
+ QQmlComponent searchWindowComponent(trayEngine(), "com.nextcloud.desktopclient.search"_L1, "SearchWindow"_L1);
if (searchWindowComponent.isError()) {
qCWarning(lcSystray) << searchWindowComponent.errorString();