1+ #include " projectwindownavigatoraddon.h"
2+
3+ #include < ranges>
4+ #include < algorithm>
5+
6+ #include < QQmlComponent>
7+ #include < QLoggingCategory>
8+ #include < QStandardItemModel>
9+
10+ #include < CoreApi/runtimeinterface.h>
11+ #include < CoreApi/windowsystem.h>
12+
13+ #include < SVSCraftCore/SVSCraftNamespace.h>
14+
15+ #include < coreplugin/coreinterface.h>
16+ #include < coreplugin/projectwindowinterface.h>
17+
18+ namespace Core ::Internal {
19+
20+ Q_STATIC_LOGGING_CATEGORY (lcProjectWindowNavigatorAddOn, " diffscope.core.projectwindownavigatoraddon" )
21+
22+ ProjectWindowNavigatorAddOn::ProjectWindowNavigatorAddOn (QObject *parent) : WindowInterfaceAddOn(parent) {
23+ m_quickPickCommandModel = new QStandardItemModel (this );
24+ }
25+
26+ ProjectWindowNavigatorAddOn::~ProjectWindowNavigatorAddOn () = default ;
27+
28+ void ProjectWindowNavigatorAddOn::initialize () {
29+ auto windowInterface = windowHandle ()->cast <ActionWindowInterfaceBase>();
30+ QQmlComponent component (RuntimeInterface::qmlEngine (), " DiffScope.Core" , " ProjectWindowNavigatorAddOnActions" );
31+ if (component.isError ()) {
32+ qFatal () << component.errorString ();
33+ }
34+ auto o = component.createWithInitialProperties ({
35+ {" addOn" , QVariant::fromValue (this )},
36+ });
37+ o->setParent (this );
38+ QMetaObject::invokeMethod (o, " registerToContext" , windowInterface->actionContext ());
39+ }
40+
41+ void ProjectWindowNavigatorAddOn::extensionsInitialized () {
42+ auto windowSystem = CoreInterface::windowSystem ();
43+
44+ // Connect to window creation and destruction signals
45+ connect (windowSystem, &WindowSystem::windowCreated, this , [this ](WindowInterface *windowInterface) {
46+ if (qobject_cast<ProjectWindowInterface *>(windowInterface)) {
47+ updateProjectWindows ();
48+ }
49+ });
50+
51+ connect (windowSystem, &WindowSystem::windowAboutToDestroy, this , [this ](WindowInterface *windowInterface) {
52+ if (qobject_cast<ProjectWindowInterface *>(windowInterface)) {
53+ updateProjectWindows ();
54+ }
55+ });
56+
57+ // Initialize the list with current windows
58+ updateProjectWindows ();
59+ }
60+
61+ bool ProjectWindowNavigatorAddOn::delayedInitialize () {
62+ return WindowInterfaceAddOn::delayedInitialize ();
63+ }
64+
65+ QList<ProjectWindowInterface *> ProjectWindowNavigatorAddOn::projectWindows () const {
66+ return m_projectWindows;
67+ }
68+
69+ void ProjectWindowNavigatorAddOn::raiseWindow (ProjectWindowInterface *windowInterface) {
70+ qCDebug (lcProjectWindowNavigatorAddOn) << " Raising project window" << windowInterface;
71+ auto window = windowInterface->window ();
72+ if (window->visibility () == QWindow::Minimized) {
73+ window->showNormal ();
74+ }
75+ window->raise (); // TODO: what does the previous QMView::raiseWindow do to the window?
76+ window->requestActivate ();
77+ }
78+
79+ void ProjectWindowNavigatorAddOn::navigateToWindow (int step) const {
80+ if (auto windowInterface = qobject_cast<ProjectWindowInterface *>(windowHandle ())) {
81+ auto index = m_projectWindows.indexOf (windowInterface);
82+ if (index == -1 )
83+ return ;
84+ index = (index + step + m_projectWindows.size ()) % m_projectWindows.size ();
85+ auto target = m_projectWindows[index];
86+ raiseWindow (target);
87+ } else if (!m_projectWindows.isEmpty ()) {
88+ auto target = m_projectWindows.first ();
89+ raiseWindow (target);
90+ }
91+ }
92+
93+ void ProjectWindowNavigatorAddOn::showSwitchToProjectWindowCommand () const {
94+ auto windowInterface = windowHandle ()->cast <ActionWindowInterfaceBase>();
95+ auto index = windowInterface->execQuickPick (m_quickPickCommandModel, " Switch to project window" , 0 );
96+ if (index == -1 )
97+ return ;
98+ raiseWindow (m_projectWindows.at (index));
99+ }
100+
101+ void ProjectWindowNavigatorAddOn::updateProjectWindows () {
102+ m_projectWindows.clear ();
103+ auto windows = CoreInterface::windowSystem ()->windows ();
104+ std::ranges::transform (
105+ windows | std::views::filter ([](auto w) { return qobject_cast<ProjectWindowInterface *>(w); }),
106+ std::back_inserter (m_projectWindows),
107+ [](auto w) { return qobject_cast<ProjectWindowInterface *>(w); }
108+ );
109+ m_quickPickCommandModel->clear ();
110+ for (auto windowInterface : m_projectWindows) {
111+ auto item = new QStandardItem;
112+ item->setData (windowInterface->window ()->property (" documentName" ), SVS ::SVSCraft::CP_TitleRole);
113+ m_quickPickCommandModel->appendRow (item);
114+ }
115+ Q_EMIT projectWindowsChanged ();
116+ }
117+
118+ }
119+
120+ #include " moc_projectwindownavigatoraddon.cpp"
0 commit comments