Skip to content

feat: The prompt images for the FLM(support camera switch) have been …#457

Merged
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
lichaofan2008:master
Mar 10, 2026
Merged

feat: The prompt images for the FLM(support camera switch) have been …#457
deepin-bot[bot] merged 1 commit intolinuxdeepin:masterfrom
lichaofan2008:master

Conversation

@lichaofan2008
Copy link
Contributor

@lichaofan2008 lichaofan2008 commented Mar 9, 2026

…optimized.

The prompt images for the FLM(support camera switch) have been optimized, and secondary prompts have also been added.
FLM设备(带有摄像头开关)的提示图片进行了优化,同时增加了二级提示。

Task: https://pms.uniontech.com/task-view-386441.html

v20 BUG 分支合一到v25主线
Task: https://pms.uniontech.com/task-view-383481.html

Summary by Sourcery

Update camera error UI to support optimized prompt images and a secondary hint when devices have a hardware camera switch.

New Features:

  • Add configuration-controlled support for devices with a hardware camera switch and adjust camera error visuals accordingly.

Enhancements:

  • Introduce a secondary camera error text prompt with centered layout and theme-aware styling.
  • Update no-camera and camera-in-use icons and text handling to use new assets when a hardware camera switch is present.
  • Propagate theme changes to both primary and secondary camera error prompts for consistent appearance.

@sourcery-ai
Copy link

sourcery-ai bot commented Mar 9, 2026

Reviewer's Guide

Implements enhanced camera error prompts for devices with a hardware camera switch by adding a secondary guidance text, switching to new SVG icons when camera-switch support is enabled, and wiring this behavior to a configurable DConfig flag via DataManager.

Sequence diagram for startup config and camera switch prompt selection

sequenceDiagram
    participant OS
    participant main
    participant DConfig
    participant DataManager
    participant videowidget

    OS->>main: start application
    main->>DConfig: load config file
    DConfig-->>main: supportCameraSwitch value
    main->>DataManager: instance()
    main->>DataManager: setIsSupportCameraSwitch(supportCameraSwitch)

    OS->>videowidget: construct videowidget
    videowidget->>DataManager: instance()
    videowidget->>DataManager: isSupportCameraSwitch()
    alt supportCameraSwitch is true
        videowidget->>videowidget: set camera_switch_not_on svg
        videowidget->>videowidget: set m_pCamErrItemSub text
    else supportCameraSwitch is false
        videowidget->>videowidget: set Not_connected svg
        videowidget->>videowidget: leave m_pCamErrItemSub empty
    end
Loading

Class diagram for enhanced camera switch prompts

classDiagram
    class DataManager {
        -static DataManager* m_dataManager
        -EncodeEnv m_encodeEnv
        -DeviceStatus m_devStatus
        -bool m_H264EncoderExists
        -bool m_isSupportCameraSwitch
        +static DataManager* instance()
        +EncodeEnv encodeEnv()
        +void setEncodeEnv(EncodeEnv env)
        +void setDevStatus(DeviceStatus status)
        +DeviceStatus getdevStatus()
        +void setEncExists(bool status)
        +bool encExists()
        +void setIsSupportCameraSwitch(bool isTrue)
        +bool isSupportCameraSwitch()
    }

    class videowidget {
        -QGraphicsTextItem* m_pCamErrItem
        -QGraphicsTextItem* m_pCamErrItemSub
        -QGraphicsSvgItem* m_pSvgItem
        -QGraphicsScene* m_pNormalScene
        -QGraphicsView* m_pNormalView
        -QLabel* m_flashLabel
        +videowidget(DWidget* parent)
        +void showNocam()
        +void showCamUsed()
        +void ReceiveOpenGLstatus(bool result)
        +void ReceiveMajorImage(QImage* image, int result)
        +void showCountDownLabel(PREVIEW_ENUM_STATE state)
        +void resizeEvent(QResizeEvent* size)
        +void showCountdown()
        +void onEndBtnClicked()
        +void onTakePic(bool bTrue)
        +void onTakeVideo()
        +void itemPosChange()
        +void stopEverything()
        +void onThemeTypeChanged(DGuiApplicationHelper_ColorType themeType)
    }

    videowidget ..> DataManager : uses
Loading

File-Level Changes

Change Details Files
Add secondary camera error text item and keep it in sync with primary error state and layout.
  • Create m_pCamErrItemSub as a QGraphicsTextItem with fixed text width, centered QTextOption, and z-order matching the primary error item
  • Add secondary text item to the normal scene and position it under the primary error text in itemPosChange()
  • Show/hide the secondary text item alongside the primary error and SVG items across all relevant state methods (no cam, cam used, countdown, resize, capture/record start-stop, OpenGL status, stopEverything)
  • Configure separate font and color for the secondary text, using a smaller font size while matching theme-based color and updates on theme changes
src/src/videowidget.cpp
src/src/videowidget.h
Introduce camera-switch-aware error messaging and icons when no camera is detected.
  • Add logic in showNocam() to check DataManager::isSupportCameraSwitch() and choose new camera_switch_not_on SVGs for light/dark themes when supported, falling back to existing Not connected assets otherwise
  • Populate the new secondary error text with a translated hint about checking the hardware camera switch or keyboard hotkey when camera-switch support is enabled
  • Mirror this camera-switch-specific icon and secondary text selection in onThemeTypeChanged() for theme transitions
src/src/videowidget.cpp
src/translations/deepin-camera_zh_CN.ts
src/assets/images/icons/light/camera_switch_not_on.svg
src/assets/images/icons/dark/camera_switch_not_on_dark.svg
Expose and initialize a global flag for camera-switch support from configuration.
  • Add m_isSupportCameraSwitch boolean member to DataManager with default false and inline getter/setter
  • Read DConfig key supportCameraSwitch in main() when available and set the DataManager flag accordingly so UI can react to hardware-switch-capable devices
src/src/basepub/datamanager.h
src/main.cpp

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

Copy link

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 3 issues, and left some high level feedback:

  • Theme- and camera-switch–dependent SVG/text setup in showNocam() and onThemeTypeChanged() is largely duplicated; consider extracting a helper method that takes the theme/device state and configures m_pSvgItem, m_pCamErrItem, and m_pCamErrItemSub in one place to reduce repetition and potential inconsistencies.
  • The secondary hint string for camera-switch devices is constructed multiple times from the same literal; define it once (e.g., as a constexpr or a static function returning the translated string) to avoid divergence if the text or translation is updated later.
  • Visibility management for m_pCamErrItem and m_pCamErrItemSub is now spread across many branches with near-identical hide/show logic; adding small helpers (e.g., showCameraError(bool showMain, bool showSub)) would make the state transitions easier to follow and less error-prone.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- Theme- and camera-switch–dependent SVG/text setup in `showNocam()` and `onThemeTypeChanged()` is largely duplicated; consider extracting a helper method that takes the theme/device state and configures `m_pSvgItem`, `m_pCamErrItem`, and `m_pCamErrItemSub` in one place to reduce repetition and potential inconsistencies.
- The secondary hint string for camera-switch devices is constructed multiple times from the same literal; define it once (e.g., as a `constexpr` or a static function returning the translated string) to avoid divergence if the text or translation is updated later.
- Visibility management for `m_pCamErrItem` and `m_pCamErrItemSub` is now spread across many branches with near-identical hide/show logic; adding small helpers (e.g., `showCameraError(bool showMain, bool showSub)`) would make the state transitions easier to follow and less error-prone.

## Individual Comments

### Comment 1
<location path="src/src/videowidget.cpp" line_range="330" />
<code_context>
-    if (!m_pCamErrItem->isVisible())
+    if (!m_pCamErrItem->isVisible()) {
         m_pCamErrItem->show();
+        m_pCamErrItemSub->show();
+    }

</code_context>
<issue_to_address>
**issue (bug_risk):** Showing the secondary camera error text during countdown VIDEO state is likely unintended.

In `showCountDownLabel(PREVIEW_ENUM_STATE state)`, for the `VIDEO` case you now show `m_pCamErrItemSub` while hiding `m_pCamErrItem`. Since the secondary label is used for camera error / no-camera states, this will display error-like text during a normal countdown. Please avoid forcing `m_pCamErrItemSub->show()` here (e.g., hide it or leave it controlled solely by the error logic) to prevent conflicting UI signals.
</issue_to_address>

### Comment 2
<location path="src/src/videowidget.cpp" line_range="440-444" />
<code_context>
     if (result && m_openglwidget) {
         qDebug() << "OpenGL status received";
         //Success
-        if (m_pCamErrItem->isVisible())
+        if (m_pCamErrItem->isVisible()) {
             m_pCamErrItem->hide();
+            m_pCamErrItemSub->hide();
</code_context>
<issue_to_address>
**issue (bug_risk):** Hiding the secondary error item only when the primary error item is visible can leave stale text on screen.

In `ReceiveOpenGLstatus`, `m_pCamErrItemSub->hide()` is currently guarded by `if (m_pCamErrItem->isVisible())`, but there are paths (e.g. `showCountDownLabel(VIDEO)`) where `m_pCamErrItem` is hidden while `m_pCamErrItemSub` remains visible. In those cases, a successful OpenGL init won’t clear the secondary text. Please hide `m_pCamErrItemSub` unconditionally when clearing error/placeholder overlays, or at least guard it with its own `isVisible()` check rather than tying it to `m_pCamErrItem`’s state.
</issue_to_address>

### Comment 3
<location path="src/src/videowidget.cpp" line_range="148" />
<code_context>
     // 画布错误提示图元
     m_pCamErrItem = new QGraphicsTextItem;
     m_pCamErrItem->setZValue(2);
+    m_pCamErrItemSub = new QGraphicsTextItem;
+    m_pCamErrItemSub->setTextWidth(370);
+    m_pCamErrItemSub->document()->setDefaultTextOption(QTextOption(Qt::AlignCenter)); // 设置文本居中
</code_context>
<issue_to_address>
**issue (complexity):** Consider extracting shared helpers for error visibility, theming/text, and layout to avoid duplicating `m_pCamErrItem` logic for `m_pCamErrItemSub` across the widget.

You’ve effectively duplicated most of the `m_pCamErrItem` logic for `m_pCamErrItemSub`, which does increase incidental complexity and makes future changes harder (theme updates, visibility rules, layout, fonts).

You can keep all behavior and reduce duplication by centralizing:

1. **Show/hide logic** for both error items.
2. **Theme-dependent styling and text** (main + sub).
3. **Layout** for both items.

### 1. Centralize error visibility

Instead of touching both items in many places, introduce a small helper:

```cpp
// in videowidget.h
private:
    void setErrorVisible(bool visible);

// in videowidget.cpp
void videowidget::setErrorVisible(bool visible)
{
    m_pCamErrItem->setVisible(visible);
    m_pCamErrItemSub->setVisible(visible);
    m_pSvgItem->setVisible(visible);
}
```

Then replace scattered blocks like:

```cpp
if (m_pCamErrItem->isVisible()) {
    m_pCamErrItem->hide();
    m_pCamErrItemSub->hide();
}
if (m_pSvgItem->isVisible())
    m_pSvgItem->hide();
```

with:

```cpp
setErrorVisible(false);
```

and:

```cpp
m_pCamErrItem->show();
m_pCamErrItemSub->show();
m_pSvgItem->show();
```

with:

```cpp
setErrorVisible(true);
```

This affects places like `showNocam`, `showCamUsed`, `ReceiveOpenGLstatus`, `ReceiveMajorImage`, `showCountDownLabel`, `resizeEvent`, `onEndBtnClicked`, `onTakePic`, `onTakeVideo`, `stopEverything`.

### 2. Centralize theme + text selection

The same theme logic and subtext is repeated in `showNocam` and `onThemeTypeChanged`. You can move it into one function that updates *both* items:

```cpp
// in videowidget.h
private:
    void updateErrorAssets(DGuiApplicationHelper::ColorType themeType,
                           DevStatus devStatus); // or exact type of getdevStatus()

// in videowidget.cpp
void videowidget::updateErrorAssets(DGuiApplicationHelper::ColorType themeType,
                                    DevStatus devStatus)
{
    QString mainText;
    QString subText;

    const bool isNoCam = (devStatus == NOCAM);
    const bool supportSwitch = DataManager::instance()->isSupportCameraSwitch();
    const bool isLight = (themeType == DGuiApplicationHelper::LightType);

    if (isNoCam) {
        mainText = tr("No webcam found");
        if (supportSwitch) {
            subText = tr("Your camera might not be turned on. If you need to use it, "
                         "please check whether the hardware switch of the camera or "
                         "the camera hotkey on the keyboard is enabled");
        }

        const char *icon = nullptr;
        if (isLight) {
            icon = supportSwitch
                ? ":/images/icons/light/camera_switch_not_on.svg"
                : ":/images/icons/light/Not connected.svg";
        } else {
            icon = supportSwitch
                ? ":/images/icons/dark/camera_switch_not_on_dark.svg"
                : ":/images/icons/dark/Not connected_dark.svg";
        }
        m_pSvgItem->setSharedRenderer(new QSvgRenderer(icon, this));
    } else { // CAM_CANNOT_USE etc.
        mainText = tr("The webcam is in use");
        const char *icon = isLight
            ? ":/images/icons/light/Take up.svg"
            : ":/images/icons/dark/Take up_dark.svg";
        m_pSvgItem->setSharedRenderer(new QSvgRenderer(icon, this));
        subText.clear();
    }

    QColor clr(Qt::white);
    clr.setAlphaF(isLight ? 0.8 : 0.2);
    m_pCamErrItem->setDefaultTextColor(clr);
    m_pCamErrItemSub->setDefaultTextColor(clr);

    QFont mainFont("SourceHanSansSC");
    mainFont.setWeight(QFont::DemiBold);
    mainFont.setPixelSize(17);
    m_pCamErrItem->setFont(mainFont);
    m_pCamErrItem->setPlainText(mainText);

    QFont subFont("SourceHanSansSC");
    subFont.setPixelSize(12);
    m_pCamErrItemSub->setFont(subFont);
    m_pCamErrItemSub->setPlainText(subText);
}
```

Then:

- `showNocam()` becomes mostly “state wiring”:

```cpp
void videowidget::showNocam()
{
    if (!m_pNormalView->isVisible())
        m_pNormalView->show();

    m_pNormalItem->hide();
    if (m_openglwidget)
        m_openglwidget->hide();

    if (m_GridType != Grid_None) {
        if (!m_pGridLineItem->isVisible())
            m_pGridLineItem->show();
        if (m_gridlinewidget->isVisible())
            m_gridlinewidget->hide();
    }

    emit sigDeviceChange();

    auto theme = DGuiApplicationHelper::instance()->themeType();
    updateErrorAssets(theme, DataManager::instance()->getdevStatus());

    m_pNormalScene->setSceneRect(m_pSvgItem->boundingRect());
    m_flashLabel->hide();

    itemPosChange();
    setErrorVisible(true);

    emit noCam();
    if (getCapStatus())
        onEndBtnClicked();
}
```

- `onThemeTypeChanged()` no longer re‑implements the same branches:

```cpp
void videowidget::onThemeTypeChanged(DGuiApplicationHelper::ColorType themeType)
{
    if (!m_pSvgItem->isVisible())
        return;

    updateErrorAssets(themeType, DataManager::instance()->getdevStatus());
    m_pNormalScene->setSceneRect(m_pSvgItem->boundingRect());
    itemPosChange();
}
```

This keeps the feature (main + sub text, proper icon selection) but removes duplicated conditionals and font/color blocks.

### 3. Layout helper (optional small clean‑up)

`itemPosChange()` already encapsulates positioning; it can be the single place that knows about text layout:

```cpp
void videowidget::itemPosChange()
{
    const auto svgRect = m_pSvgItem->boundingRect();
    const auto mainRect = m_pCamErrItem->boundingRect();
    const auto subRect  = m_pCamErrItemSub->boundingRect();

    m_pCamErrItem->setPos((svgRect.width() - mainRect.width()) / 2, svgRect.height());
    m_pCamErrItemSub->setPos((svgRect.width() - subRect.width()) / 2,
                             svgRect.height() + mainRect.height());

    m_pSvgItem->update();
    m_pCamErrItem->update();
    m_pCamErrItemSub->update();
}
```

Callers should only call `itemPosChange()` after changing text/fonts; they don’t need to know coordinates.

---

Applying these small helpers will keep your new secondary text line behavior while significantly reducing duplication and the chance of future inconsistencies.
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

@lichaofan2008 lichaofan2008 force-pushed the master branch 2 times, most recently from 0f0fed5 to 6a6e3ca Compare March 9, 2026 09:29
…optimized.

The prompt images for the FLM(support camera switch) have been optimized, and secondary prompts have also been added.
FLM设备(带有摄像头开关)的提示图片进行了优化,同时增加了二级提示。

Task: https://pms.uniontech.com/task-view-386441.html

v20 BUG 分支合一到v25主线
Task: https://pms.uniontech.com/task-view-383481.html
@deepin-ci-robot
Copy link

deepin pr auto review

代码审查报告

总体概述

本次代码变更主要是为相机应用添加了对物理摄像头开关的支持功能,包括:

  1. 添加了新的SVG图标资源
  2. 在配置文件中添加了支持摄像头开关的配置项
  3. 修改了UI显示逻辑,在检测到摄像头未连接时,根据配置显示不同的提示信息

详细审查意见

1. 语法逻辑

1.1 SVG资源文件

  • 问题:两个新添加的SVG文件(camera_switch_not_on.svgcamera_switch_not_on_dark.svg)内容完全相同
  • 建议:虽然SVG内部使用了相对颜色,但建议确认这两个文件是否应该有不同的内容以适应不同主题

1.2 配置文件

  • 问题:在org.deepin.camera.encode.json中添加了新的配置项supportCameraSwitch
  • 建议:配置项定义规范,没有问题

1.3 主程序逻辑

  • 问题:在main.cpp中添加了对supportCameraSwitch配置的读取
  • 建议:代码逻辑正确,但建议添加错误处理,以防配置读取失败
// 建议修改
if (dconfig && dconfig->isValid() && dconfig->keyList().contains("supportCameraSwitch")) {
    bool supportSwitch = dconfig->value("supportCameraSwitch").toBool();
    DataManager::instance()->setIsSupportCameraSwitch(supportSwitch);
} else {
    // 添加默认值处理
    DataManager::instance()->setIsSupportCameraSwitch(false);
}

1.4 DataManager类

  • 问题:在datamanager.h中添加了新的成员变量和方法
  • 建议:代码规范,但建议在类定义中添加Q_PROPERTY以便于Qt的属性系统使用
// 建议添加
Q_PROPERTY(bool isSupportCameraSwitch READ isSupportCameraSwitch WRITE setIsSupportCameraSwitch)

1.5 VideoWidget类

  • 问题:在videowidget.cpp中添加了二级提示文本项m_pCamErrItemSub
  • 建议:代码逻辑正确,但有以下几点可以优化:
    1. 在多个地方重复设置m_pCamErrItemSub的文本和样式,建议提取为独立方法
    2. itemPosChange()方法中计算位置时,硬编码了布局逻辑,建议使用相对布局
// 建议添加独立方法
void videowidget::updateErrorMessages(const QString &mainMsg, const QString &subMsg)
{
    m_pCamErrItem->setPlainText(mainMsg);
    m_pCamErrItemSub->setPlainText(subMsg);
    // 更新位置
    itemPosChange();
}

2. 代码质量

2.1 命名规范

  • 问题:变量命名基本规范,但strsub可以更具描述性
  • 建议:改为secondaryMessagesubMessage

2.2 代码重复

  • 问题:在showNocam()onThemeTypeChanged()方法中有大量重复代码
  • 建议:提取公共逻辑到独立方法
// 建议添加
void videowidget::updateCameraErrorDisplay()
{
    QString mainMsg, subMsg;
    if (DataManager::instance()->getdevStatus() == NOCAM) {
        mainMsg = tr("No webcam found");
        if (DataManager::instance()->isSupportCameraSwitch()) {
            subMsg = tr("Your camera might not be turned on...");
        }
    } else {
        mainMsg = tr("The webcam is in use");
    }
    
    updateErrorMessages(mainMsg, subMsg);
}

2.3 注释

  • 问题:部分新增代码缺少注释
  • 建议:为关键逻辑添加注释,特别是与摄像头开关相关的判断逻辑

3. 代码性能

3.1 SVG渲染

  • 问题:每次切换主题或状态都会创建新的QSvgRenderer对象
  • 建议:考虑缓存渲染器对象,避免重复创建
// 建议添加成员变量
QSvgRenderer *m_cameraSwitchRenderer;
QSvgRenderer *m_noCameraRenderer;

// 在构造函数中初始化
m_cameraSwitchRenderer = new QSvgRenderer(QString(":/images/icons/light/camera_switch_not_on.svg"), this);
m_noCameraRenderer = new QSvgRenderer(QString(":/images/icons/light/Not connected.svg"), this);

3.2 文本更新

  • 问题:频繁调用setPlainText可能导致不必要的重绘
  • 建议:在文本内容未变化时避免更新
// 建议添加检查
if (m_pCamErrItem->toPlainText() != newMessage) {
    m_pCamErrItem->setPlainText(newMessage);
}

4. 代码安全

4.1 配置读取

  • 问题:配置读取没有验证值的有效性
  • 建议:添加值验证,确保只接受预期的布尔值
// 建议修改
QVariant switchValue = dconfig->value("supportCameraSwitch");
if (switchValue.isValid() && switchValue.canConvert<bool>()) {
    DataManager::instance()->setIsSupportCameraSwitch(switchValue.toBool());
} else {
    DataManager::instance()->setIsSupportCameraSwitch(false);
}

4.2 翻译字符串

  • 问题:新增的翻译字符串较长,可能在不同语言中显示长度差异大
  • 建议:考虑UI布局是否能适应不同长度的翻译文本

5. 其他建议

  1. 测试建议

    • 测试不同主题切换时的显示效果
    • 测试不同分辨率下的文本显示
    • 测试配置项变化时的行为
  2. 文档更新

    • 更新用户文档,说明新的摄像头开关提示
    • 更新开发者文档,说明新的配置项
  3. 可访问性

    • 考虑为屏幕阅读器添加适当的文本提示

总结

本次代码变更整体实现了摄像头开关支持功能,逻辑基本正确,但存在一些代码重复和性能优化空间。建议按照上述意见进行优化,以提高代码质量和可维护性。

@deepin-ci-robot
Copy link

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: lichaofan2008, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@lichaofan2008
Copy link
Contributor Author

/forcemerge

@deepin-bot
Copy link
Contributor

deepin-bot bot commented Mar 10, 2026

This pr force merged! (status: unstable)

@deepin-bot deepin-bot bot merged commit d4caf2a into linuxdeepin:master Mar 10, 2026
19 of 20 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants