tests: update dss-network-plugin test example#494
tests: update dss-network-plugin test example#494deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
Conversation
Reviewer's GuideRefactors the dss_example test app to integrate the real dss-network-plugin NetworkPlugin, add reusable popup window UI for content and tips, manage one test widget per screen, and update licensing headers and build configuration accordingly. Sequence diagram for NetworkPlugin popup interaction on button clicksequenceDiagram
actor User
participant DssTestWidget
participant FloatingButton
participant PopupWindow as ContentPopupWindow
participant NetworkPlugin
User->>FloatingButton: click()
FloatingButton-->>DssTestWidget: clicked()
DssTestWidget->>DssTestWidget: onClickButton()
DssTestWidget->>NetworkPlugin: content()
alt content is null
DssTestWidget-->>User: return without popup
else content exists
alt first time popup created
DssTestWidget->>ContentPopupWindow: new PopupWindow(this)
DssTestWidget->>NetworkPlugin: content()
DssTestWidget->>ContentPopupWindow: setContent(netlistWidget)
DssTestWidget->>ContentPopupWindow: resizeWithContent()
DssTestWidget->>ContentPopupWindow: setArrowX(width/2)
else popup already exists
DssTestWidget->>ContentPopupWindow: setContent(netlistWidget)
DssTestWidget->>ContentPopupWindow: resizeWithContent()
end
alt popup currently visible
DssTestWidget->>ContentPopupWindow: hide()
opt tip popup exists
DssTestWidget->>PopupWindow: toggle()
end
else popup hidden
opt tip popup exists
DssTestWidget->>PopupWindow: hide()
end
DssTestWidget->>ContentPopupWindow: resizeWithContent()
DssTestWidget->>ContentPopupWindow: show(centerPoint)
end
end
Sequence diagram for multi-screen DssTestWidget managementsequenceDiagram
participant main as main
participant QApplication
participant DssScreenManager
participant QGuiApplication
participant QScreen
participant DssTestWidget
participant NetworkPlugin
main->>QApplication: QApplication(argc, argv)
main->>DssScreenManager: new DssScreenManager()
DssScreenManager->>NetworkPlugin: new NetworkPlugin(this)
DssScreenManager->>DssScreenManager: initConnection()
DssScreenManager->>QGuiApplication: connect(screenAdded, onScreenAdded)
DssScreenManager->>QGuiApplication: connect(screenRemoved, onScreenRemoved)
DssScreenManager->>DssScreenManager: initScreen()
DssScreenManager->>QGuiApplication: screens()
loop for each screen
QGuiApplication-->>DssScreenManager: QScreen *screen
DssScreenManager->>DssTestWidget: new DssTestWidget(m_netModule)
DssScreenManager->>DssScreenManager: m_screenWidget[screen] = testWidget
end
main->>DssScreenManager: showWindow()
loop for each screen in m_screenWidget
DssScreenManager->>DssScreenManager: showWindow(screen, testWidget)
DssScreenManager->>QScreen: geometry()
DssScreenManager->>DssTestWidget: resize(330, 800)
DssScreenManager->>DssTestWidget: move(centerOnScreen)
DssScreenManager->>DssTestWidget: show()
end
QGuiApplication-->>DssScreenManager: screenAdded(newScreen)
DssScreenManager->>DssTestWidget: new DssTestWidget(m_netModule)
DssScreenManager->>DssScreenManager: m_screenWidget[newScreen] = testWidget
DssScreenManager->>DssScreenManager: showWindow(newScreen, testWidget)
QGuiApplication-->>DssScreenManager: screenRemoved(removedScreen)
DssScreenManager->>DssScreenManager: lookup testWidget
DssScreenManager->>DssScreenManager: m_screenWidget.remove(removedScreen)
DssScreenManager->>DssTestWidget: deleteLater()
Class diagram for updated dss_example test application structureclassDiagram
class DssTestWidget {
+DssTestWidget(NetworkPlugin *networkPlugin, QWidget *parent)
+~DssTestWidget()
+bool eventFilter(QObject *watched, QEvent *event)
+void resizeEvent(QResizeEvent *event)
+void mousePressEvent(QMouseEvent *event)
+void onClickButton()
-NetworkPlugin *m_pModule
-FloatingButton *m_iconButton
-PopupWindow *m_container
-PopupWindow *m_tipContainer
}
class FloatingButton {
+FloatingButton(QWidget *parent)
}
class PopupWindow {
+PopupWindow(QWidget *parent)
+~PopupWindow()
+bool model() const
+void setContent(QWidget *content)
+void show(const QPoint &pos)
+void toggle()
+void toggle(const QPoint &pos)
+void hide()
+void showEvent(QShowEvent *e)
+void enterEvent(QEnterEvent *e)
+bool eventFilter(QObject *o, QEvent *e)
+void ensureRaised()
-QPoint m_lastPoint
}
class DssScreenManager {
+DssScreenManager(QObject *parent)
+void showWindow()
-void initConnection()
-void initScreen()
-void showWindow(QScreen *screen, DssTestWidget *testWidget)
-void onScreenAdded(QScreen *screen)
-void onScreenRemoved(QScreen *screen)
-QMap~QScreen*,DssTestWidget*~ m_screenWidget
-NetworkPlugin *m_netModule
}
class NetworkPlugin {
+NetworkPlugin(QObject *parent)
+void init()
+QWidget *itemWidget()
+QWidget *itemTipsWidget()
+QWidget *content()
}
class DArrowRectangle {
}
class QWidget {
}
class QObject {
}
class QScreen {
}
class DFloatingButton {
}
DssTestWidget --> NetworkPlugin : uses
DssTestWidget --> FloatingButton : owns
DssTestWidget --> PopupWindow : owns
FloatingButton --|> DFloatingButton
PopupWindow --|> DArrowRectangle
DssScreenManager --> DssTestWidget : manages per screen
DssScreenManager --> NetworkPlugin : owns shared
DssScreenManager --|> QObject
DssTestWidget --|> QWidget
PopupWindow --|> QWidget
FloatingButton --|> QWidget
QScreen --> DssScreenManager
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 4 issues, and left some high level feedback:
- In
DssTestWidgettheNetworkPluginpointer is owned and deleted byDssScreenManager, but the widget destructor also callsm_pModule->deleteLater(), which risks double-deletion; the widget should not delete a plugin it didn’t create. - The
static QWidget *netlistWidgetinDssTestWidget::onClickButtoncauses allDssTestWidgetinstances to share a single content widget, which can break when multiple screens/widgets are involved; consider making this an instance member instead of a function-static. - In
popupwindow.hthebool model() const;method is declared but never defined or used, which will lead to a link error or dead code; either implement it or remove the declaration.
Prompt for AI Agents
Please address the comments from this code review:
## Overall Comments
- In `DssTestWidget` the `NetworkPlugin` pointer is owned and deleted by `DssScreenManager`, but the widget destructor also calls `m_pModule->deleteLater()`, which risks double-deletion; the widget should not delete a plugin it didn’t create.
- The `static QWidget *netlistWidget` in `DssTestWidget::onClickButton` causes all `DssTestWidget` instances to share a single content widget, which can break when multiple screens/widgets are involved; consider making this an instance member instead of a function-static.
- In `popupwindow.h` the `bool model() const;` method is declared but never defined or used, which will lead to a link error or dead code; either implement it or remove the declaration.
## Individual Comments
### Comment 1
<location> `dss_example/dsstestwidget.cpp:63-65` </location>
<code_context>
+ m_iconButton->installEventFilter(this);
}
DssTestWidget::~DssTestWidget()
{
+ m_pModule->deleteLater();
}
</code_context>
<issue_to_address>
**issue (bug_risk):** NetworkPlugin lifetime management is inconsistent with DssScreenManager and can cause double-deletion
`DssScreenManager` creates a single `dde::network::NetworkPlugin` (`m_netModule`) and shares that pointer with multiple `DssTestWidget` instances, but each widget calls `m_pModule->deleteLater()` in its destructor. This schedules the same `QObject` for deletion multiple times and can crash. Either remove `deleteLater()` here and clearly document that `DssScreenManager` owns the plugin, or give each widget its own plugin instance so ownership is clear and singular.
</issue_to_address>
### Comment 2
<location> `dss_example/dsstestwidget.cpp:84-85` </location>
<code_context>
+ m_tipContainer->raise();
+ m_tipContainer->show(QPoint(rect().center().x(), m_iconButton->parentWidget()->y()));
+ } break;
+ case QEvent::Leave: {
+ m_tipContainer->hide();
break;
- case QEvent::Enter:
</code_context>
<issue_to_address>
**issue (bug_risk):** Potential null dereference when hiding m_tipContainer on Leave event
In the `QEvent::Leave` case you call `m_tipContainer->hide()` even though `m_tipContainer` is only set up in the `Enter` path. If `Leave` occurs before the popup is constructed, this will dereference a null pointer. Add a null check (e.g. `if (m_tipContainer) m_tipContainer->hide();`) to avoid a crash.
</issue_to_address>
### Comment 3
<location> `dss_example/dsstestwidget.h:21` </location>
<code_context>
+} // namespace dde
class QPushButton;
+class FloatingButton;
+using namespace Dtk::Widget;
</code_context>
<issue_to_address>
**issue (complexity):** Consider replacing the trivial FloatingButton subclass with a type alias and removing the using-namespace directive from the header to simplify the public interface and reduce indirection.
You can simplify the header and reduce indirection by removing the trivial `FloatingButton` subclass and the `using namespace` in the header.
### 1. Drop the trivial `FloatingButton` subclass
`FloatingButton` adds no behavior beyond a forwarding constructor. You can keep the short name while avoiding an extra type and Q_OBJECT class by using a type alias:
```cpp
#include <DFloatingButton>
#include <QWidget>
namespace dde {
namespace network {
class NetworkPlugin;
} // namespace network
} // namespace dde
class PopupWindow;
class QPushButton;
// Avoid using namespace in headers; just define an alias:
using FloatingButton = Dtk::Widget::DFloatingButton;
class DssTestWidget : public QWidget
{
Q_OBJECT
public:
explicit DssTestWidget(dde::network::NetworkPlugin *networkPlugin,
QWidget *parent = Q_NULLPTR);
~DssTestWidget() override;
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
protected slots:
void onClickButton();
private:
dde::network::NetworkPlugin *m_pModule;
FloatingButton *m_iconButton;
PopupWindow *m_container;
PopupWindow *m_tipContainer;
};
```
Then remove the subclass entirely:
```cpp
// Remove this from the header:
class FloatingButton : public DFloatingButton
{
Q_OBJECT
public:
explicit FloatingButton(QWidget *parent = nullptr);
};
```
If the constructor had any non-trivial initialization logic in the `.cpp`, you can move that into a small helper function instead:
```cpp
inline FloatingButton *createFloatingButton(QWidget *parent)
{
auto *btn = new FloatingButton(parent);
// apply any customization here (icon, style, etc.)
return btn;
}
```
Use `createFloatingButton` where you currently construct `FloatingButton` directly.
### 2. Avoid `using namespace` in a header
Headers should not introduce `using namespace` because they leak names into every translation unit that includes them. You already fix that by switching to the alias above; just remove this line:
```cpp
// Remove from header:
using namespace Dtk::Widget;
```
This keeps the public interface thinner and the types easier to reason about without changing any functionality.
</issue_to_address>
### Comment 4
<location> `dss_example/dsstestwidget.cpp:153` </location>
<code_context>
+ }
+}
+
+FloatingButton::FloatingButton(QWidget *parent)
+ : DFloatingButton(parent)
+{
</code_context>
<issue_to_address>
**issue (complexity):** Consider simplifying the widget logic by removing the trivial FloatingButton wrapper, using an instance member instead of a static netlist pointer, and extracting popup/tip show–hide helpers to reduce duplication and coupling.
You can simplify a few spots without changing behavior:
### 1) Remove the `FloatingButton` wrapper
`FloatingButton` adds no behavior over `DFloatingButton` and just adds a new type to track.
**Current:**
```cpp
class FloatingButton : public DFloatingButton {
Q_OBJECT
public:
explicit FloatingButton(QWidget *parent = nullptr);
};
FloatingButton::FloatingButton(QWidget *parent)
: DFloatingButton(parent)
{
}
```
**Simpler:**
- Delete `FloatingButton` and use `DFloatingButton` directly:
```cpp
// in dssTestWidget.h
private:
Dtk::Widget::DFloatingButton *m_iconButton = nullptr;
```
```cpp
// in constructor
m_iconButton = new Dtk::Widget::DFloatingButton(iconWidget);
```
No functionality changes, but one less class to understand.
---
### 2) Replace the `static QWidget *netlistWidget` with a member
The static pointer couples all `DssTestWidget` instances and makes lifetime harder to reason about. Fetch and cache the content per instance instead.
**Current:**
```cpp
void DssTestWidget::onClickButton()
{
...
static QWidget *netlistWidget = nullptr;
if (!netlistWidget) {
netlistWidget = m_pModule->content();
}
netlistWidget->setParent(m_container);
netlistWidget->adjustSize();
m_container->setContent(netlistWidget);
...
}
```
**Suggested change:**
```cpp
// dssTestWidget.h
private:
QWidget *m_netlistWidget = nullptr;
```
```cpp
// dssTestWidget.cpp
void DssTestWidget::onClickButton()
{
if (!m_pModule->content())
return;
if (!m_container) {
m_container = new PopupWindow(this);
connect(m_container, &PopupWindow::contentDetach, this, [this] {
m_container->setContent(nullptr);
m_container->hide();
});
}
if (!m_netlistWidget) {
m_netlistWidget = m_pModule->content();
}
m_netlistWidget->setParent(m_container);
m_netlistWidget->adjustSize();
m_container->setContent(m_netlistWidget);
m_container->resizeWithContent();
m_container->setArrowX(m_container->width() / 2);
...
}
```
This keeps the “fetch once, reuse later” behavior but confines it to the instance.
---
### 3) Centralize popup/tip show/hide logic into small helpers
Right now `eventFilter`, `mousePressEvent`, `resizeEvent`, and `onClickButton` all directly manipulate `m_container` and `m_tipContainer`. You can reduce branching and duplication with local helper methods, without introducing a whole new class.
**Add helpers:**
```cpp
// dssTestWidget.h
private:
void showTipAtButton();
void hideTip();
void showContentAtCenter();
void hideContent();
```
```cpp
// dssTestWidget.cpp
void DssTestWidget::showTipAtButton()
{
if (!m_tipContainer) {
QWidget *tipWidget = m_pModule->itemTipsWidget();
m_tipContainer = new PopupWindow(this);
m_tipContainer->setContent(tipWidget);
m_tipContainer->resizeWithContent();
m_tipContainer->setArrowX(tipWidget->width() / 2);
}
m_tipContainer->raise();
m_tipContainer->show(QPoint(rect().center().x(), m_iconButton->parentWidget()->y()));
}
void DssTestWidget::hideTip()
{
if (m_tipContainer)
m_tipContainer->hide();
}
void DssTestWidget::showContentAtCenter()
{
if (!m_container || !m_container->getContent())
return;
QWidget *content = m_container->getContent();
content->adjustSize();
m_container->resizeWithContent();
m_container->setArrowX(m_container->width() / 2);
m_container->show(QPoint(rect().width() / 2, m_iconButton->parentWidget()->y()));
}
void DssTestWidget::hideContent()
{
if (m_container)
m_container->hide();
}
```
**Then simplify callers:**
```cpp
bool DssTestWidget::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_iconButton) {
switch (event->type()) {
case QEvent::Enter:
showTipAtButton();
break;
case QEvent::Leave:
hideTip();
break;
default:
break;
}
}
return QWidget::eventFilter(watched, event);
}
void DssTestWidget::mousePressEvent(QMouseEvent *event)
{
hideTip();
hideContent();
QWidget::mousePressEvent(event);
}
void DssTestWidget::resizeEvent(QResizeEvent *event)
{
if (m_container && m_container->isVisible())
showContentAtCenter();
QWidget::resizeEvent(event);
}
void DssTestWidget::onClickButton()
{
...
if (m_container->isVisible()) {
hideContent();
if (m_tipContainer)
m_tipContainer->toggle();
} else {
hideTip();
showContentAtCenter();
}
}
```
This keeps all existing behavior but puts the popup lifecycle in a few clear functions, making the control flow easier to follow.
</issue_to_address>Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.
dss_example/dsstestwidget.cpp
Outdated
| DssTestWidget::~DssTestWidget() | ||
| { | ||
| m_pModule->deleteLater(); |
There was a problem hiding this comment.
issue (bug_risk): NetworkPlugin lifetime management is inconsistent with DssScreenManager and can cause double-deletion
DssScreenManager creates a single dde::network::NetworkPlugin (m_netModule) and shares that pointer with multiple DssTestWidget instances, but each widget calls m_pModule->deleteLater() in its destructor. This schedules the same QObject for deletion multiple times and can crash. Either remove deleteLater() here and clearly document that DssScreenManager owns the plugin, or give each widget its own plugin instance so ownership is clear and singular.
| case QEvent::Leave: { | ||
| m_tipContainer->hide(); |
There was a problem hiding this comment.
issue (bug_risk): Potential null dereference when hiding m_tipContainer on Leave event
In the QEvent::Leave case you call m_tipContainer->hide() even though m_tipContainer is only set up in the Enter path. If Leave occurs before the popup is constructed, this will dereference a null pointer. Add a null check (e.g. if (m_tipContainer) m_tipContainer->hide();) to avoid a crash.
dss_example/dsstestwidget.h
Outdated
| } // namespace dde | ||
|
|
||
| class QPushButton; | ||
| class FloatingButton; |
There was a problem hiding this comment.
issue (complexity): Consider replacing the trivial FloatingButton subclass with a type alias and removing the using-namespace directive from the header to simplify the public interface and reduce indirection.
You can simplify the header and reduce indirection by removing the trivial FloatingButton subclass and the using namespace in the header.
1. Drop the trivial FloatingButton subclass
FloatingButton adds no behavior beyond a forwarding constructor. You can keep the short name while avoiding an extra type and Q_OBJECT class by using a type alias:
#include <DFloatingButton>
#include <QWidget>
namespace dde {
namespace network {
class NetworkPlugin;
} // namespace network
} // namespace dde
class PopupWindow;
class QPushButton;
// Avoid using namespace in headers; just define an alias:
using FloatingButton = Dtk::Widget::DFloatingButton;
class DssTestWidget : public QWidget
{
Q_OBJECT
public:
explicit DssTestWidget(dde::network::NetworkPlugin *networkPlugin,
QWidget *parent = Q_NULLPTR);
~DssTestWidget() override;
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
void resizeEvent(QResizeEvent *event) override;
void mousePressEvent(QMouseEvent *event) override;
protected slots:
void onClickButton();
private:
dde::network::NetworkPlugin *m_pModule;
FloatingButton *m_iconButton;
PopupWindow *m_container;
PopupWindow *m_tipContainer;
};Then remove the subclass entirely:
// Remove this from the header:
class FloatingButton : public DFloatingButton
{
Q_OBJECT
public:
explicit FloatingButton(QWidget *parent = nullptr);
};If the constructor had any non-trivial initialization logic in the .cpp, you can move that into a small helper function instead:
inline FloatingButton *createFloatingButton(QWidget *parent)
{
auto *btn = new FloatingButton(parent);
// apply any customization here (icon, style, etc.)
return btn;
}Use createFloatingButton where you currently construct FloatingButton directly.
2. Avoid using namespace in a header
Headers should not introduce using namespace because they leak names into every translation unit that includes them. You already fix that by switching to the alias above; just remove this line:
// Remove from header:
using namespace Dtk::Widget;This keeps the public interface thinner and the types easier to reason about without changing any functionality.
dss_example/dsstestwidget.cpp
Outdated
| } | ||
| } | ||
|
|
||
| FloatingButton::FloatingButton(QWidget *parent) |
There was a problem hiding this comment.
issue (complexity): Consider simplifying the widget logic by removing the trivial FloatingButton wrapper, using an instance member instead of a static netlist pointer, and extracting popup/tip show–hide helpers to reduce duplication and coupling.
You can simplify a few spots without changing behavior:
1) Remove the FloatingButton wrapper
FloatingButton adds no behavior over DFloatingButton and just adds a new type to track.
Current:
class FloatingButton : public DFloatingButton {
Q_OBJECT
public:
explicit FloatingButton(QWidget *parent = nullptr);
};
FloatingButton::FloatingButton(QWidget *parent)
: DFloatingButton(parent)
{
}Simpler:
- Delete
FloatingButtonand useDFloatingButtondirectly:
// in dssTestWidget.h
private:
Dtk::Widget::DFloatingButton *m_iconButton = nullptr;// in constructor
m_iconButton = new Dtk::Widget::DFloatingButton(iconWidget);No functionality changes, but one less class to understand.
2) Replace the static QWidget *netlistWidget with a member
The static pointer couples all DssTestWidget instances and makes lifetime harder to reason about. Fetch and cache the content per instance instead.
Current:
void DssTestWidget::onClickButton()
{
...
static QWidget *netlistWidget = nullptr;
if (!netlistWidget) {
netlistWidget = m_pModule->content();
}
netlistWidget->setParent(m_container);
netlistWidget->adjustSize();
m_container->setContent(netlistWidget);
...
}Suggested change:
// dssTestWidget.h
private:
QWidget *m_netlistWidget = nullptr;// dssTestWidget.cpp
void DssTestWidget::onClickButton()
{
if (!m_pModule->content())
return;
if (!m_container) {
m_container = new PopupWindow(this);
connect(m_container, &PopupWindow::contentDetach, this, [this] {
m_container->setContent(nullptr);
m_container->hide();
});
}
if (!m_netlistWidget) {
m_netlistWidget = m_pModule->content();
}
m_netlistWidget->setParent(m_container);
m_netlistWidget->adjustSize();
m_container->setContent(m_netlistWidget);
m_container->resizeWithContent();
m_container->setArrowX(m_container->width() / 2);
...
}This keeps the “fetch once, reuse later” behavior but confines it to the instance.
3) Centralize popup/tip show/hide logic into small helpers
Right now eventFilter, mousePressEvent, resizeEvent, and onClickButton all directly manipulate m_container and m_tipContainer. You can reduce branching and duplication with local helper methods, without introducing a whole new class.
Add helpers:
// dssTestWidget.h
private:
void showTipAtButton();
void hideTip();
void showContentAtCenter();
void hideContent();// dssTestWidget.cpp
void DssTestWidget::showTipAtButton()
{
if (!m_tipContainer) {
QWidget *tipWidget = m_pModule->itemTipsWidget();
m_tipContainer = new PopupWindow(this);
m_tipContainer->setContent(tipWidget);
m_tipContainer->resizeWithContent();
m_tipContainer->setArrowX(tipWidget->width() / 2);
}
m_tipContainer->raise();
m_tipContainer->show(QPoint(rect().center().x(), m_iconButton->parentWidget()->y()));
}
void DssTestWidget::hideTip()
{
if (m_tipContainer)
m_tipContainer->hide();
}
void DssTestWidget::showContentAtCenter()
{
if (!m_container || !m_container->getContent())
return;
QWidget *content = m_container->getContent();
content->adjustSize();
m_container->resizeWithContent();
m_container->setArrowX(m_container->width() / 2);
m_container->show(QPoint(rect().width() / 2, m_iconButton->parentWidget()->y()));
}
void DssTestWidget::hideContent()
{
if (m_container)
m_container->hide();
}Then simplify callers:
bool DssTestWidget::eventFilter(QObject *watched, QEvent *event)
{
if (watched == m_iconButton) {
switch (event->type()) {
case QEvent::Enter:
showTipAtButton();
break;
case QEvent::Leave:
hideTip();
break;
default:
break;
}
}
return QWidget::eventFilter(watched, event);
}
void DssTestWidget::mousePressEvent(QMouseEvent *event)
{
hideTip();
hideContent();
QWidget::mousePressEvent(event);
}
void DssTestWidget::resizeEvent(QResizeEvent *event)
{
if (m_container && m_container->isVisible())
showContentAtCenter();
QWidget::resizeEvent(event);
}
void DssTestWidget::onClickButton()
{
...
if (m_container->isVisible()) {
hideContent();
if (m_tipContainer)
m_tipContainer->toggle();
} else {
hideTip();
showContentAtCenter();
}
}This keeps all existing behavior but puts the popup lifecycle in a few clear functions, making the control flow easier to follow.
dss_example/dsstestwidget.cpp
Outdated
| @@ -1,65 +1,156 @@ | |||
| // SPDX-FileCopyrightText: 2018 - 2026 UnionTech Software Technology Co., Ltd. | |||
| // SPDX-FileCopyrightText: 2018 - 2022 UnionTech Software Technology Co., Ltd. | |||
997cc35 to
6419eec
Compare
update dss-network-plugin test example Log: update dss-network-plugin test example
deepin pr auto reviewGit Diff 代码审查报告经过对提供的 git diff 内容的仔细审查,我从语法逻辑、代码质量、代码性能和代码安全四个方面提出以下改进意见: 1. 语法逻辑问题1.1
|
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: caixr23, ut003640 The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/forcemerge |
|
This pr force merged! (status: unstable) |
update dss-network-plugin test example
Log: update dss-network-plugin test example
Summary by Sourcery
Update the dss example application to integrate the real dss-network-plugin UI with per-screen management and popup windows instead of a simple test button.
New Features:
Enhancements:
Build: