Skip to content

Commit 2838b3f

Browse files
feat: initial setups for desktop panel and wm registry
1 parent 2f0740c commit 2838b3f

15 files changed

Lines changed: 493 additions & 85 deletions

CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ message("Including Requested CMake Dependencies OK")
1212
include(cmake/check_toolchain.cmake)
1313

1414
project(CFDesktop
15-
VERSION 0.14.0
15+
VERSION 0.14.1
1616
DESCRIPTION "CFDesktop: Given Your Device Portable Desktop Anywhere"
1717
HOMEPAGE_URL "https://github.com/Awesome-Embedded-Learning-Studio/CFDesktop"
1818
LANGUAGES CXX C

desktop/ui/CFDesktop.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
#include "CFDesktop.h"
1212
#include "CFDesktopEntity.h"
1313
#include "cflog.h"
14+
#include "components/PanelManager.h"
15+
16+
#include <QResizeEvent>
1417

1518
namespace cf::desktop {
1619

@@ -28,14 +31,22 @@ CFDesktop::~CFDesktop() {
2831
log::traceftag("CFDesktop Self", "Destroying Self");
2932
};
3033

34+
void CFDesktop::resizeEvent(QResizeEvent* event) {
35+
QWidget::resizeEvent(event);
36+
if (panel_manager_) {
37+
log::trace("CFDesktop Resized, Panel Manager handle the layouts, calling relayout...");
38+
panel_manager_->relayout();
39+
}
40+
}
41+
3142
bool CFDesktop::component_available(const DesktopComponent d) const noexcept {
3243
switch (d) {
3344
case DesktopComponent::Common:
34-
return !panel_manager_ && !shell_layer_;
45+
return panel_manager_ != nullptr && shell_layer_ != nullptr;
3546
case DesktopComponent::PanelManager:
36-
return !panel_manager_;
47+
return panel_manager_ != nullptr;
3748
case DesktopComponent::ShellLayer:
38-
return !shell_layer_;
49+
return shell_layer_ != nullptr;
3950
}
4051
return false;
4152
}

desktop/ui/CFDesktop.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
#include <QWidget>
1818
namespace cf::desktop {
1919
class PanelManager;
20-
class ShellLayer;
20+
class WidgetShellLayer;
2121
class CFDesktopEntity;
2222

2323
/**
@@ -77,11 +77,11 @@ class CF_DESKTOP_EXPORT CFDesktop final : public QWidget {
7777
/* Managed by Resources */
7878
struct InitResources {
7979
PanelManager* panel_manager_{nullptr};
80-
ShellLayer* shell_layer_{nullptr};
80+
WidgetShellLayer* shell_layer_{nullptr};
8181
};
8282

8383
PanelManager* panel_manager_{nullptr};
84-
ShellLayer* shell_layer_{nullptr};
84+
WidgetShellLayer* shell_layer_{nullptr};
8585

8686
private:
8787
CFDesktop(CFDesktopEntity* entity_object); /* pass the entity objects */
@@ -90,6 +90,9 @@ class CF_DESKTOP_EXPORT CFDesktop final : public QWidget {
9090
// register the desktop sources
9191
void register_desktop_resources(InitResources& resources);
9292

93+
protected:
94+
void resizeEvent(QResizeEvent* event) override;
95+
9396
private:
9497
cf::WeakPtrFactory<CFDesktop> weak_ptr_factory_;
9598
};

desktop/ui/CFDesktopEntity.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,9 @@
77
#include "cflog.h"
88
#include "components/DisplayServerBackendFactory.h"
99
#include "components/IDisplayServerBackend.h"
10+
#include "components/PanelManager.h"
11+
#include "components/shell_layer_impl/DefaultShellLayerStrategy.h"
12+
#include "components/shell_layer_impl/WidgetShellLayer.h"
1013
#include "platform/DesktopPropertyStrategyFactory.h"
1114
#include "platform/display_backend_helper.h"
1215
#include <memory>
@@ -79,6 +82,26 @@ CFDesktopEntity::RunsSetupResult CFDesktopEntity::run_init(RunsSetupMethod m) {
7982
}
8083
}
8184

85+
// ── Create PanelManager and ShellLayer ──
86+
auto* panel_mgr = new PanelManager(desktop_entity_, desktop_entity_);
87+
auto* shell = new WidgetShellLayer(desktop_entity_);
88+
89+
// Inject into CFDesktop
90+
CFDesktop::InitResources res;
91+
res.panel_manager_ = panel_mgr;
92+
res.shell_layer_ = shell;
93+
desktop_entity_->register_desktop_resources(res);
94+
95+
// Set shell strategy (solid background fallback)
96+
shell->setStrategy(std::make_unique<DefaultShellLayerStrategy>());
97+
98+
// Connect PanelManager geometry changes to ShellLayer
99+
QObject::connect(panel_mgr, &PanelManager::availableGeometryChanged, shell,
100+
&WidgetShellLayer::onAvailableGeometryChanged);
101+
102+
// Show the desktop full-screen
103+
desktop_entity_->showFullScreen();
104+
82105
log::trace("Entity Init");
83106
return RunsSetupResult::OK;
84107
}

desktop/ui/components/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
# Desktop UI Components
22
# Core component interfaces: IWindow, IWindowBackend, IDisplayServerBackend,
33
# PanelManager, ShellLayer, etc.
4+
log_info("Dekstop UI" "Start UI Components Configurations")
45

6+
add_subdirectory(shell_layer_impl)
57
add_subdirectory(statusbar)
68

79
# Create interface library for convenience
@@ -26,5 +28,6 @@ PUBLIC
2628
cfbase
2729
cf_desktop_render
2830
PRIVATE
31+
cfdesktop_shell_layer_impl
2932
Qt6::Core Qt6::Gui Qt6::Widgets
3033
)

desktop/ui/components/IShellLayerStrategy.h

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@ class IShellLayerStrategy {
4747
*/
4848
virtual void deactivate() = 0;
4949

50-
private:
5150
/**
5251
* @brief Called when the available geometry changes.
5352
*

desktop/ui/components/PanelManager.h

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,10 @@ class PanelManager : public QObject {
8383
*/
8484
virtual const QRect availableGeometry() const;
8585

86+
/**
87+
* @brief Recomputes the layout of all registered panels.
88+
*/
89+
virtual void relayout();
8690
signals:
8791

8892
/**
@@ -92,12 +96,6 @@ class PanelManager : public QObject {
9296
*/
9397
void availableGeometryChanged(const QRect& rect);
9498

95-
protected:
96-
/**
97-
* @brief Recomputes the layout of all registered panels.
98-
*/
99-
virtual void relayout();
100-
10199
protected:
102100
/// Host widget for panel positioning. Ownership: external.
103101
QWidget* host_{nullptr};

desktop/ui/components/ShellLayer.h

Lines changed: 0 additions & 71 deletions
This file was deleted.
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# Shell layer implementations (QWidget-based, Wayland, etc.)
2+
add_library(cfdesktop_shell_layer_impl STATIC
3+
WidgetShellLayer.cpp
4+
DefaultShellLayerStrategy.cpp
5+
)
6+
7+
target_include_directories(cfdesktop_shell_layer_impl PUBLIC
8+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}>
9+
$<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/..>
10+
)
11+
12+
target_link_libraries(
13+
cfdesktop_shell_layer_impl PRIVATE
14+
Qt6::Widgets
15+
cflogger_headers
16+
cfbase
17+
cf_ui_base
18+
)
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#include "DefaultShellLayerStrategy.h"
2+
#include "WidgetShellLayer.h"
3+
#include "cflog.h"
4+
#include "qt_format.h"
5+
6+
namespace cf::desktop {
7+
DefaultShellLayerStrategy::DefaultShellLayerStrategy() {
8+
log::info("Using DefaultShellStrategy");
9+
}
10+
11+
DefaultShellLayerStrategy::~DefaultShellLayerStrategy() = default;
12+
13+
void DefaultShellLayerStrategy::activate(WeakPtr<IShellLayer> layer, WeakPtr<WindowManager> wm) {
14+
log::trace("DefaultShellStrategy activated");
15+
layer_ = layer;
16+
window_manager_ = wm;
17+
}
18+
19+
void DefaultShellLayerStrategy::deactivate() {
20+
log::trace("DefaultShellStrategy deactivated");
21+
layer_.Reset();
22+
window_manager_.Reset();
23+
}
24+
25+
void DefaultShellLayerStrategy::onGeometryChanged(const QRect& r) {
26+
log::traceftag("DefaultShellStrategy", "Geometry changed: {}", r);
27+
// The WidgetShellLayer::onAvailableGeometryChanged() already calls
28+
// setGeometry() and update(), so no additional action needed here.
29+
}
30+
31+
} // namespace cf::desktop

0 commit comments

Comments
 (0)