diff -Nru dtkwidget-5.5.37/debian/changelog dtkwidget-5.5.46/debian/changelog --- dtkwidget-5.5.37/debian/changelog 2022-03-19 14:56:40.000000000 +0000 +++ dtkwidget-5.5.46/debian/changelog 2022-07-30 16:40:45.000000000 +0000 @@ -1,8 +1,30 @@ -dtkwidget (5.5.37-1build1) jammy; urgency=medium +dtkwidget (5.5.46-1ubuntu1) jammy; urgency=medium - * No-change rebuild against Qt 5.15.3. + * Upload to jammy udde. - -- Dmitry Shachnev Sat, 19 Mar 2022 17:56:40 +0300 + -- Arun Kumar Pariyar Sat, 30 Jul 2022 22:25:45 +0545 + +dtkwidget (5.5.46-1) unstable; urgency=medium + + * New upstream release. + + -- Boyuan Yang Wed, 13 Jul 2022 22:53:23 -0400 + +dtkwidget (5.5.45-1) unstable; urgency=medium + + * New upstream release. + + -- Boyuan Yang Wed, 25 May 2022 12:25:12 -0400 + +dtkwidget (5.5.44-1) unstable; urgency=medium + + * New upstream release. + * debian/libdtkwidget5.shlibs: update to version 5.5.44. + * debian/libdtkwidget5.install{amd64,i386}: Dropped, useless. + * debian/control: Drop useless hard dependency libqt5widgets5, + use dh_shlibdeps to automatically infer this dependency. + + -- Boyuan Yang Wed, 13 Apr 2022 19:12:47 -0400 dtkwidget (5.5.37-1) unstable; urgency=medium diff -Nru dtkwidget-5.5.37/debian/control dtkwidget-5.5.46/debian/control --- dtkwidget-5.5.37/debian/control 2022-02-24 06:14:04.000000000 +0000 +++ dtkwidget-5.5.46/debian/control 2022-05-25 16:25:00.000000000 +0000 @@ -32,10 +32,11 @@ libxrender-dev, pkg-config, qtbase5-private-dev, + qttools5-dev, qttools5-dev-tools, x11proto-xext-dev, Rules-Requires-Root: no -Standards-Version: 4.6.0 +Standards-Version: 4.6.1 Homepage: https://github.com/linuxdeepin/dtkwidget Vcs-Git: https://salsa.debian.org/pkg-deepin-team/dtkwidget.git Vcs-Browser: https://salsa.debian.org/pkg-deepin-team/dtkwidget @@ -79,7 +80,6 @@ libdtkcommon, ${misc:Depends}, ${shlibs:Depends}, - libqt5widgets5, Recommends: dde-qt5integration, Multi-Arch: same diff -Nru dtkwidget-5.5.37/debian/libdtkwidget5.install.amd64 dtkwidget-5.5.46/debian/libdtkwidget5.install.amd64 --- dtkwidget-5.5.37/debian/libdtkwidget5.install.amd64 2021-04-27 05:51:52.000000000 +0000 +++ dtkwidget-5.5.46/debian/libdtkwidget5.install.amd64 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -usr/lib/*/lib*.so.* -#usr/lib/*/libmsc.so -usr/share/*/DWidget/translations/* diff -Nru dtkwidget-5.5.37/debian/libdtkwidget5.install.i386 dtkwidget-5.5.46/debian/libdtkwidget5.install.i386 --- dtkwidget-5.5.37/debian/libdtkwidget5.install.i386 2021-04-27 05:51:52.000000000 +0000 +++ dtkwidget-5.5.46/debian/libdtkwidget5.install.i386 1970-01-01 00:00:00.000000000 +0000 @@ -1,3 +0,0 @@ -usr/lib/*/lib*.so.* -#usr/lib/*/libmsc.so -usr/share/*/DWidget/translations/* diff -Nru dtkwidget-5.5.37/debian/libdtkwidget5.shlibs dtkwidget-5.5.46/debian/libdtkwidget5.shlibs --- dtkwidget-5.5.37/debian/libdtkwidget5.shlibs 2022-02-24 06:14:04.000000000 +0000 +++ dtkwidget-5.5.46/debian/libdtkwidget5.shlibs 2022-07-14 02:53:23.000000000 +0000 @@ -1 +1 @@ -libdtkwidget 5 libdtkwidget5 (>= 5.5.37) +libdtkwidget 5 libdtkwidget5 (>= 5.5.46) diff -Nru dtkwidget-5.5.37/examples/dwidget-examples/collections/buttonexample.cpp dtkwidget-5.5.46/examples/dwidget-examples/collections/buttonexample.cpp --- dtkwidget-5.5.37/examples/dwidget-examples/collections/buttonexample.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/examples/dwidget-examples/collections/buttonexample.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -959,10 +959,10 @@ pHBoxLayout_1->setSpacing(0); DSearchComboBox *pComboBox_1 = new DSearchComboBox(this); - pComboBox_1->setEditable(true); - pComboBox_1->addItem("手动选择驱动方案"); - pComboBox_1->addItem("手动选择驱动方案"); - pComboBox_1->addItem("手动选择驱动方案"); + pComboBox_1->setEditable(false); + for (int i = 0; i < 16; ++i) { + pComboBox_1->addItem(QString("手动选择驱动方案%1").arg(i + 1)); + } pComboBox_1->setFixedSize(240, 36); pHBoxLayout_1->addWidget(pComboBox_1); diff -Nru dtkwidget-5.5.37/.github/workflows/backup-to-gitlab.yml dtkwidget-5.5.46/.github/workflows/backup-to-gitlab.yml --- dtkwidget-5.5.37/.github/workflows/backup-to-gitlab.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/backup-to-gitlab.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,52 @@ +name: backup to gitlab +on: [push] + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +jobs: + backup-to-gitlab: + if: github.repository_owner == 'linuxdeepin' + name: backup-to-gitlab + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + repository: "linuxdeepin/jenkins-bridge-client" + path: jenkins-bridge-client + + - name: Install Client + run: | + cd $GITHUB_WORKSPACE/jenkins-bridge-client + go build . + sudo install -Dvm755 jenkins-bridge-client -t /usr/bin/ + - name: Trigger sync + id: generate-runid + run: | + echo "::set-output name=RUN_ID::$(jenkins-bridge-client -triggerSync -token '${{ secrets.BRIDGETOKEN }}')" + - name: Print log + run: | + jenkins-bridge-client -printlog -token "${{ secrets.BRIDGETOKEN }}" -runid "${{ steps.generate-runid.outputs.RUN_ID }}" + + backup-to-gitee: + if: github.repository_owner == 'linuxdeepin' + runs-on: ubuntu-latest + steps: + - name: create-repo + run: | + repo=${{ github.event.repository.name }} + homepage="https://github.com/linuxdeepin/${repo}" + description="mirror of ${homepage}" + # remove '.' prefix + repo=${repo#"."} + curl -X POST --header 'Content-Type: application/json;charset=UTF-8' 'https://gitee.com/api/v5/enterprises/linuxdeepin/repos' -d '{"private": 1,"access_token":"${{ secrets.GITEE_SYNC_TOKEN }}","name":"'"$repo"'","description":"'"$description"'","homepage":"'"$homepage"'","has_issues":"false","has_wiki":"false","can_comment":"false"}' || true + - name: push + run: | + git clone --bare https://github.com/linuxdeepin/${{ github.event.repository.name }}.git .git + repo=${{ github.event.repository.name }} + # remove '.' prefix + repo=${repo#"."} + git remote set-url origin https://myml:${{ secrets.GITEE_SYNC_TOKEN }}@gitee.com/linuxdeepin/${repo}.git + git push -f --all --prune origin + git push --tags origin diff -Nru dtkwidget-5.5.37/.github/workflows/call-build-deb.yml dtkwidget-5.5.46/.github/workflows/call-build-deb.yml --- dtkwidget-5.5.37/.github/workflows/call-build-deb.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/call-build-deb.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,15 @@ +name: Call build-deb +on: + pull_request_target: + paths-ignore: + - ".github/workflows/**" + +concurrency: + group: ${{ github.workflow }}-pull/${{ github.event.number }} + cancel-in-progress: true + +jobs: + check_job: + uses: linuxdeepin/.github/.github/workflows/build-deb.yml@master + secrets: + BridgeToken: ${{ secrets.BridgeToken }} diff -Nru dtkwidget-5.5.37/.github/workflows/call-build-distribution.yml dtkwidget-5.5.46/.github/workflows/call-build-distribution.yml --- dtkwidget-5.5.37/.github/workflows/call-build-distribution.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/call-build-distribution.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,17 @@ +name: Call build-distribution +on: + push: + paths-ignore: + - ".github/workflows/**" + pull_request_target: + paths-ignore: + - ".github/workflows/**" + +jobs: + check_job: + uses: linuxdeepin/.github/.github/workflows/build-distribution.yml@master + secrets: + BUILD_GPG_PRIVATE_KEY: ${{ secrets.BUILD_GPG_PRIVATE_KEY }} + BUILD_SSH_PRIVATE_KEY: ${{ secrets.BUILD_SSH_PRIVATE_KEY }} + WEBDAV_PASSWD: ${{ secrets.WEBDAV_PASSWD }} + WEBDAV_USER: ${{ secrets.WEBDAV_USER }} diff -Nru dtkwidget-5.5.37/.github/workflows/call-chatOps.yml dtkwidget-5.5.46/.github/workflows/call-chatOps.yml --- dtkwidget-5.5.37/.github/workflows/call-chatOps.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/call-chatOps.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,10 @@ +name: chatOps +on: + issue_comment: + types: [created] + +jobs: + chatopt: + uses: linuxdeepin/.github/.github/workflows/chatOps.yml@master + secrets: + APP_PRIVATE_KEY: ${{ secrets.APP_PRIVATE_KEY }} diff -Nru dtkwidget-5.5.37/.github/workflows/call-commitlint.yml dtkwidget-5.5.46/.github/workflows/call-commitlint.yml --- dtkwidget-5.5.37/.github/workflows/call-commitlint.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/call-commitlint.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,11 @@ +name: Call commitlint +on: + pull_request_target: + +concurrency: + group: ${{ github.workflow }}-pull/${{ github.event.number }} + cancel-in-progress: true + +jobs: + check_job: + uses: linuxdeepin/.github/.github/workflows/commitlint.yml@master diff -Nru dtkwidget-5.5.37/.github/workflows/cppcheck.yml dtkwidget-5.5.46/.github/workflows/cppcheck.yml --- dtkwidget-5.5.37/.github/workflows/cppcheck.yml 1970-01-01 00:00:00.000000000 +0000 +++ dtkwidget-5.5.46/.github/workflows/cppcheck.yml 2022-05-27 02:58:09.000000000 +0000 @@ -0,0 +1,26 @@ +name: cppcheck +on: + pull_request_target: + paths-ignore: + - ".github/workflows/**" + +concurrency: + group: ${{ github.workflow }}-pull/${{ github.event.number }} + cancel-in-progress: true + +jobs: + cppchceck: + name: cppcheck + runs-on: ubuntu-latest + steps: + - run: export + - uses: actions/checkout@v2 + with: + ref: ${{ github.event.pull_request.head.sha }} + persist-credentials: false + - uses: linuxdeepin/action-cppcheck@main + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + repository: ${{ github.repository }} + pull_request_id: ${{ github.event.pull_request.number }} + allow_approve: false diff -Nru dtkwidget-5.5.37/README.md dtkwidget-5.5.46/README.md --- dtkwidget-5.5.37/README.md 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/README.md 2022-05-27 02:58:09.000000000 +0000 @@ -13,7 +13,13 @@ ### Build from source code 1. Make sure you have installed all dependencies. - +```` +sudo apt build-dep . +```` +If you need to use the designer plugin, you should also install: +```` +sudo apt install qttools5-dev +```` 2. Build: ```` diff -Nru dtkwidget-5.5.37/src/widgets/assets/icons/dark/actions/splitscreen_showmaximize_36px.svg dtkwidget-5.5.46/src/widgets/assets/icons/dark/actions/splitscreen_showmaximize_36px.svg --- dtkwidget-5.5.37/src/widgets/assets/icons/dark/actions/splitscreen_showmaximize_36px.svg 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/assets/icons/dark/actions/splitscreen_showmaximize_36px.svg 2022-05-27 02:58:09.000000000 +0000 @@ -1,6 +1,6 @@ - 还原_normal_dark + 最大化_normal_dark @@ -11,7 +11,7 @@ - + diff -Nru dtkwidget-5.5.37/src/widgets/assets/icons/dark/actions/splitscreen_shownormal_36px.svg dtkwidget-5.5.46/src/widgets/assets/icons/dark/actions/splitscreen_shownormal_36px.svg --- dtkwidget-5.5.37/src/widgets/assets/icons/dark/actions/splitscreen_shownormal_36px.svg 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/assets/icons/dark/actions/splitscreen_shownormal_36px.svg 2022-05-27 02:58:09.000000000 +0000 @@ -1,6 +1,6 @@ - 最大化_normal_dark + 还原_normal_dark @@ -11,7 +11,7 @@ - + diff -Nru dtkwidget-5.5.37/src/widgets/assets/icons/dark/icons/splitscreen_showmaximize_36px.svg dtkwidget-5.5.46/src/widgets/assets/icons/dark/icons/splitscreen_showmaximize_36px.svg --- dtkwidget-5.5.37/src/widgets/assets/icons/dark/icons/splitscreen_showmaximize_36px.svg 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/assets/icons/dark/icons/splitscreen_showmaximize_36px.svg 2022-05-27 02:58:09.000000000 +0000 @@ -1,6 +1,6 @@ - 还原_normal_dark + 最大化_normal_dark @@ -11,7 +11,7 @@ - + diff -Nru dtkwidget-5.5.37/src/widgets/assets/icons/dark/icons/splitscreen_shownormal_36px.svg dtkwidget-5.5.46/src/widgets/assets/icons/dark/icons/splitscreen_shownormal_36px.svg --- dtkwidget-5.5.37/src/widgets/assets/icons/dark/icons/splitscreen_shownormal_36px.svg 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/assets/icons/dark/icons/splitscreen_shownormal_36px.svg 2022-05-27 02:58:09.000000000 +0000 @@ -1,6 +1,6 @@ - 最大化_normal_dark + 还原_normal_dark @@ -11,7 +11,7 @@ - + diff -Nru dtkwidget-5.5.37/src/widgets/dabstractdialog.cpp dtkwidget-5.5.46/src/widgets/dabstractdialog.cpp --- dtkwidget-5.5.37/src/widgets/dabstractdialog.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dabstractdialog.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -48,6 +48,14 @@ void DAbstractDialogPrivate::init(bool blurIfPossible) { D_Q(DAbstractDialog); + // TODO: 这里对dialog特殊处理,dialog不需要设置固定的位置,否则里面的坐标会发生偏移导致点击偏移 + // 但是这不是问题的根本原因,还需要进一步分析。该属性在插件中做了特殊处理 + q->QDialog::setProperty("DAbstractDialog", true); + auto noTitlebarEnabled = []{ + QFunctionPointer enableNoTitlebar = qApp->platformFunction("_d_isEnableNoTitlebar"); + bool enabled = qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool(); + return enabled && enableNoTitlebar != nullptr; + }; if (qApp->isDXcbPlatform()) { handle = new DPlatformWindowHandle(q, q); @@ -70,7 +78,7 @@ bgBlurWidget->setBlurEnabled(blurIfPossible); q->setAttribute(Qt::WA_TranslucentBackground, blurIfPossible); - } else if (qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool()) { + } else if (noTitlebarEnabled()) { handle = new DPlatformWindowHandle(q, q); // fix wayland no titlebar //q->setWindowFlags(q->windowFlags() | Qt::FramelessWindowHint); diff -Nru dtkwidget-5.5.37/src/widgets/dalertcontrol.cpp dtkwidget-5.5.46/src/widgets/dalertcontrol.cpp --- dtkwidget-5.5.37/src/widgets/dalertcontrol.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dalertcontrol.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -294,7 +294,7 @@ } if (d->follower && watched == d->follower->topLevelWidget()) { - if (event->type() == QEvent::HoverMove) + if (event->type() == QEvent::HoverMove || event->type() == QEvent::UpdateRequest) d->updateTooltipPos(); if (d->timer.isActive()) diff -Nru dtkwidget-5.5.37/src/widgets/darrowrectangle.cpp dtkwidget-5.5.46/src/widgets/darrowrectangle.cpp --- dtkwidget-5.5.37/src/widgets/darrowrectangle.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/darrowrectangle.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -1112,10 +1112,6 @@ { D_Q(DArrowRectangle); - if (!m_handle) { - return; - } - QPainterPath path; switch (m_arrowDirection) { @@ -1135,7 +1131,20 @@ path = getRightCornerPath(); } - m_handle->setClipPath(path); + if (m_handle) { + m_handle->setClipPath(path); + } else { + // clipPath without handle + QPainterPathStroker stroker; + stroker.setCapStyle(Qt::RoundCap); + stroker.setJoinStyle(Qt::RoundJoin); + stroker.setWidth(2); + QPainterPath outPath = stroker.createStroke(path); + QPolygon polygon = outPath.united(path).toFillPolygon().toPolygon(); + + q->clearMask(); + q->setMask(polygon); + } } bool DArrowRectanglePrivate::radiusEnabled() @@ -1195,15 +1204,11 @@ m_wmHelper = DWindowManagerHelper::instance(); - q->connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, q, static_cast(&DArrowRectangle::update), Qt::QueuedConnection); + q->connect(m_wmHelper, &DWindowManagerHelper::hasCompositeChanged, q, [q, this](){ + q->update(); + this->updateClipPath(); + }, Qt::QueuedConnection); } else { - DGraphicsGlowEffect *glowEffect = new DGraphicsGlowEffect; - glowEffect->setBlurRadius(q->shadowBlurRadius()); - glowEffect->setDistance(m_shadowDistance); - glowEffect->setXOffset(q->shadowXOffset()); - glowEffect->setYOffset(q->shadowYOffset()); - q->setGraphicsEffect(glowEffect); - m_wmHelper = nullptr; } } diff -Nru dtkwidget-5.5.37/src/widgets/dfilechooseredit.cpp dtkwidget-5.5.46/src/widgets/dfilechooseredit.cpp --- dtkwidget-5.5.37/src/widgets/dfilechooseredit.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dfilechooseredit.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -23,7 +23,8 @@ #include #include - +#include +#include DWIDGET_BEGIN_NAMESPACE /*! @@ -275,6 +276,15 @@ q->dialogOpened(); + if (!dialog) { + qWarning("init filedialog failed!!"); + return; + } + + // 多次打开时有时会出现 filedialog 不显示的问题 exec 前确保没显示否则不调用 helper->show + if (dialog->isVisible()) + dialog->setVisible(false); + int code = dialog->exec(); if (code == QDialog::Accepted && !dialog->selectedFiles().isEmpty()) { @@ -284,6 +294,10 @@ Q_EMIT q->fileChoosed(fileName); } + // exec 后如果 filedialog 还阻塞了应用就要隐藏掉 + if (qApp->modalWindow() == dialog->windowHandle()) + QGuiApplicationPrivate::hideModalWindow(dialog->windowHandle()); + q->dialogClosed(code); } diff -Nru dtkwidget-5.5.37/src/widgets/dkeysequenceedit.cpp dtkwidget-5.5.46/src/widgets/dkeysequenceedit.cpp --- dtkwidget-5.5.37/src/widgets/dkeysequenceedit.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dkeysequenceedit.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -29,7 +29,7 @@ QVBoxLayout *layout = new QVBoxLayout(this); layout->setContentsMargins(layout->contentsMargins().left(), 0, layout->contentsMargins().right(), 0); layout->setSpacing(0); - label->setForegroundRole(QPalette::Highlight); + label->setForegroundRole(QPalette::ButtonText); layout->addWidget(label); } @@ -48,7 +48,13 @@ if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { p.setBackground(QColor(255, 255, 255)); } else { - p.setBackground(QColor(109, 109, 109)); + QColor bgColor(109, 109, 109); + if ((opt.state & QStyle::State_Active) == 0) { + auto inactive_mask_color = dp.color(QPalette::Window); + inactive_mask_color.setAlphaF(0.6); + bgColor = DGuiApplicationHelper::blendColor(bgColor, inactive_mask_color); + } + p.setBackground(bgColor); } p.setPen(QPen(dp.frameBorder(), opt.lineWidth)); diff -Nru dtkwidget-5.5.37/src/widgets/dmainwindow.cpp dtkwidget-5.5.46/src/widgets/dmainwindow.cpp --- dtkwidget-5.5.37/src/widgets/dmainwindow.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dmainwindow.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -45,7 +45,12 @@ { titlebar = new DTitlebar(qq); titlebar->setAccessibleName("DMainWindowTitlebar"); - if (DApplication::isDXcbPlatform() || (qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool())) { + auto noTitlebarEnabled = []{ + QFunctionPointer enableNoTitlebar = qApp->platformFunction("_d_isEnableNoTitlebar"); + bool enabled = qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool(); + return enabled && enableNoTitlebar != nullptr; + }; + if (DApplication::isDXcbPlatform() || noTitlebarEnabled()) { handle = new DPlatformWindowHandle(qq, qq); qq->setMenuWidget(titlebar); } else { diff -Nru dtkwidget-5.5.37/src/widgets/dprintpreviewdialog.cpp dtkwidget-5.5.46/src/widgets/dprintpreviewdialog.cpp --- dtkwidget-5.5.37/src/widgets/dprintpreviewdialog.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dprintpreviewdialog.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -1151,7 +1151,14 @@ QObject::connect(marginRightSpin, SIGNAL(editingFinished()), q, SLOT(_q_marginEditFinished())); QObject::connect(marginLeftSpin, SIGNAL(editingFinished()), q, SLOT(_q_marginEditFinished())); QObject::connect(marginBottomSpin, SIGNAL(editingFinished()), q, SLOT(_q_marginEditFinished())); - QObject::connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, q, [this](DGuiApplicationHelper::ColorType themeType) { this->themeTypeChange(themeType); }); + QObject::connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, + q, [this, q](DGuiApplicationHelper::ColorType themeType) { + DTitlebar *titlebar = q->findChild(); + DPalette pa = DPaletteHelper::instance()->palette(titlebar); + pa.setBrush(DPalette::Background, pa.base()); + DPaletteHelper::instance()->setPalette(titlebar, pa); + this->themeTypeChange(themeType); + }); QObject::connect(marginTopSpin->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); QObject::connect(marginRightSpin->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); QObject::connect(marginLeftSpin->lineEdit(), SIGNAL(textEdited(const QString &)), q, SLOT(_q_spinboxValueEmptyChecked(const QString &))); @@ -1279,8 +1286,12 @@ QPrinterInfo updateinfo(*printer); QStringList pageSizeList; + int index = -1; for (int i = 0; i < updateinfo.supportedPageSizes().size(); i++) { pageSizeList.append(updateinfo.supportedPageSizes().at(i).key()); + if (index == -1 && updateinfo.supportedPageSizes().at(i).id() == QPageSize::PageSizeId::A4) { + index = i; + } } paperSizeCombo->addItems(pageSizeList); if (pageSizeList.contains(lastPaperSize)) { @@ -1288,7 +1299,7 @@ } else { //调用绘制预览 paperSizeCombo->blockSignals(false); - paperSizeCombo->setCurrentText("A4"); + paperSizeCombo->setCurrentIndex(index == - 1 ? 0 : index); } //判断当前打印机是否支持双面打印,不支持禁用双面打印按钮,pdf不做判断 diff -Nru dtkwidget-5.5.37/src/widgets/dsearchcombobox.cpp dtkwidget-5.5.46/src/widgets/dsearchcombobox.cpp --- dtkwidget-5.5.37/src/widgets/dsearchcombobox.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dsearchcombobox.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -68,8 +68,7 @@ { Q_D(DSearchComboBox); QComboBoxPrivate *dd = reinterpret_cast(qGetPtrHelper(d_ptr)); - QComboBox::showPopup(); - + DComboBox::showPopup(); if(auto layout = static_cast(dd->container->layout())) { if (!isEditable() && !d->searchEdit) { //因为dd->container容器在QComboBox::showPopup() @@ -83,7 +82,8 @@ layout->setSpacing(0); searlayout->addWidget(d->searchEdit); layout->insertLayout(0, searlayout); - + dd->container->setFixedHeight(dd->container->height() + d->searchEdit->height() + + layout->spacing() + layout->margin() + layoutMargin); d->proxyModel = new QSortFilterProxyModel(this); d->proxyModel->setSourceModel(model()); diff -Nru dtkwidget-5.5.37/src/widgets/dtextedit.cpp dtkwidget-5.5.46/src/widgets/dtextedit.cpp --- dtkwidget-5.5.37/src/widgets/dtextedit.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dtextedit.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -84,7 +84,7 @@ return true; } else if (e->type() == QEvent::Polish) { DStyleHelper dstyle(style()); - int frame_radius = dstyle.pixelMetric(DStyle::PM_FrameRadius, nullptr, this); + int frame_radius = dstyle.pixelMetric(DStyle::PM_FrameRadius, nullptr, this) / 2; setViewportMargins(frame_radius, 0, frame_radius, 0); d->widgetTop->setFixedHeight(frame_radius); @@ -171,6 +171,9 @@ } QMenu *menu = createStandardContextMenu(); + if (!menu) + return QTextEdit::contextMenuEvent(e); + menu->addSeparator(); connect(menu, &QMenu::triggered, this, [this](QAction *pAction) { diff -Nru dtkwidget-5.5.37/src/widgets/dtitlebar.cpp dtkwidget-5.5.46/src/widgets/dtitlebar.cpp --- dtkwidget-5.5.37/src/widgets/dtitlebar.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dtitlebar.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -148,7 +148,7 @@ bool autoHideOnFullscreen = false; bool fullScreenButtonVisible = true; bool splitScreenWidgetEnable = true; - + QTimer *maxButtonPressAndHoldTimer = nullptr; Q_DECLARE_PUBLIC(DTitlebar) }; @@ -177,7 +177,7 @@ QColor iconForeColor = Qt::white; if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { backgroundBrush = DStyle::adjustColor(backgroundBrush, 0, 0, 0, 0, 0, 0, 3); - iconForeColor = dpal.textTiele().color(); + iconForeColor = dpal.brush(DPalette::TextTitle).color(); } pal.setBrush(QPalette::Light, backgroundBrush); @@ -211,10 +211,10 @@ void DSplitScreenWidget::updateMaximizeButtonIcon(bool isMaximized) { if (isMaximized) { - this->maximizeButton->setIcon(DStyle::SP_Title_SS_ShowMaximizeButton); + this->maximizeButton->setIcon(DStyle::SP_Title_SS_ShowNormalButton); this->maximizeButton->setToolTip(qApp->translate("DSplitScreenWidget", "Unmaximize")); } else { - this->maximizeButton->setIcon(DStyle::SP_Title_SS_ShowNormalButton); + this->maximizeButton->setIcon(DStyle::SP_Title_SS_ShowMaximizeButton); this->maximizeButton->setToolTip(qApp->translate("DSplitScreenWidget", "Maximize")); } } @@ -313,11 +313,15 @@ case QEvent::WindowDeactivate: case QEvent::FocusIn: case QEvent::FocusOut: - case QEvent::MouseButtonRelease: case QEvent::MouseButtonDblClick: case QEvent::Wheel: hideImmediately(); break; + case QEvent::MouseButtonRelease: + if (!isMaxButtonPressAndHold) { + hideImmediately(); + } + break; default: break; } @@ -375,6 +379,8 @@ minButton = new DWindowMinButton; maxButton = new DWindowMaxButton; closeButton = new DWindowCloseButton; + maxButtonPressAndHoldTimer = new QTimer(q); + maxButtonPressAndHoldTimer->setSingleShot(true); if (DGuiApplicationHelper::isTabletEnvironment()) { optionButton = new DTabletWindowOptionButton; @@ -409,6 +415,7 @@ iconLabel->setIconSize(QSize(DefaultIconWidth, DefaultIconHeight)); iconLabel->setWindowFlags(Qt::WindowTransparentForInput); + iconLabel->setAttribute( Qt::WA_TransparentForMouseEvents, true); iconLabel->setFocusPolicy(Qt::NoFocus); iconLabel->setAccessibleName("DTitlebarIconLabel"); iconLabel->setFlat(true); @@ -494,6 +501,11 @@ q->connect(DGuiApplicationHelper::instance()->systemTheme(), &DPlatformTheme::iconThemeNameChanged, q, [ = ]() { iconLabel->update(); }); + q->connect(maxButtonPressAndHoldTimer, &QTimer::timeout, q, [this]() { + showSplitScreenWidget(); + if (splitWidget && splitWidget->isVisible()) + splitWidget->isMaxButtonPressAndHold = true; + }); // 默认需要构造一个空的选项菜单 q->setMenu(new QMenu(q)); @@ -505,8 +517,13 @@ // 另外,让标题栏接收焦点,还是为了避免一个focus控件隐藏时,会把焦点转移给标题栏上的按钮控件 q->setFocusPolicy(Qt::StrongFocus); + auto noTitlebarEnabled = []{ + QFunctionPointer enableNoTitlebar = qApp->platformFunction("_d_isEnableNoTitlebar"); + bool enabled = qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool(); + return enabled && enableNoTitlebar != nullptr; + }; // fix wayland 下显示了两个应用图标,系统标题栏 和 dtk标题栏 均显示应用图标 - q->setEmbedMode(!(DApplication::isDXcbPlatform()|| (qApp->platformName() == "dwayland" || qApp->property("_d_isDwayland").toBool()))); + q->setEmbedMode(!(DApplication::isDXcbPlatform()|| noTitlebarEnabled())); } QWidget *DTitlebarPrivate::targetWindow() @@ -627,7 +644,11 @@ void DTitlebarPrivate::updateButtonsFunc() { // TASK-18145 (bug-17474) do not setMotifFunctions on wayland - if (!targetWindowHandle || !qgetenv("WAYLAND_DISPLAY").isEmpty()) { + if (!targetWindowHandle) { + return; + } + if (!qgetenv("WAYLAND_DISPLAY").isEmpty()) { + closeButton->setEnabled(!disableFlags.testFlag(Qt::WindowCloseButtonHint)); return; } @@ -666,7 +687,7 @@ void DTitlebarPrivate::handleParentWindowStateChange() { - maxButton->setMaximized(targetWindow()->windowState() == Qt::WindowMaximized); + maxButton->setMaximized(targetWindow()->windowState().testFlag(Qt::WindowMaximized)); updateFullscreen(); updateButtonsState(targetWindow()->windowFlags()); } @@ -689,6 +710,11 @@ void DTitlebarPrivate::_q_toggleWindowState() { + if (splitWidget && splitWidget->isMaxButtonPressAndHold) { + splitWidget->isMaxButtonPressAndHold = false; + return; + } + QWidget *parentWindow = targetWindow(); if (!parentWindow || disableFlags.testFlag(Qt::WindowMaximizeButtonHint)) { @@ -744,7 +770,11 @@ minButton->setEnabled(functions_hints.testFlag(DWindowManagerHelper::FUNC_MINIMIZE)); maxButton->setEnabled(functions_hints.testFlag(DWindowManagerHelper::FUNC_MAXIMIZE) && functions_hints.testFlag(DWindowManagerHelper::FUNC_RESIZE)); - closeButton->setEnabled(functions_hints.testFlag(DWindowManagerHelper::FUNC_CLOSE)); + if (!qgetenv("WAYLAND_DISPLAY").isEmpty()) { + closeButton->setEnabled(!disableFlags.testFlag(Qt::WindowCloseButtonHint)); + } else { + closeButton->setEnabled(functions_hints.testFlag(DWindowManagerHelper::FUNC_CLOSE)); + } // sync button state #if QT_VERSION >= QT_VERSION_CHECK(5, 7, 0) disableFlags.setFlag(Qt::WindowMinimizeButtonHint, !minButton->isEnabled()); @@ -986,10 +1016,14 @@ void DTitlebarPrivate::changeWindowSplitedState(quint32 type) { - //### 目前接口尚不公开在 dtkgui 中,等待获取后续接口稳定再做移植 + if (splitWidget && splitWidget->isVisible()) { + splitWidget->isMaxButtonPressAndHold = false; + splitWidget->hideImmediately(); + } D_Q(DTitlebar); QFunctionPointer splitWindowOnScreen = Q_NULLPTR; + //### 目前接口尚不公开在 dtkgui 中,等待获取后续接口稳定再做移植 splitWindowOnScreen = qApp->platformFunction(CHANGESPLITWINDOW_VAR); const QWindow *windowHandle = nullptr; @@ -1276,6 +1310,14 @@ d->hideSplitScreenWidget(); break; } + case QEvent::MouseButtonPress: { + d->maxButtonPressAndHoldTimer->start(300); + break; + } + case QEvent::MouseButtonRelease: { + d->maxButtonPressAndHoldTimer->stop(); + break; + } default: break; diff -Nru dtkwidget-5.5.37/src/widgets/dwindowclosebutton.cpp dtkwidget-5.5.46/src/widgets/dwindowclosebutton.cpp --- dtkwidget-5.5.37/src/widgets/dwindowclosebutton.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dwindowclosebutton.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -35,8 +35,11 @@ \a parent 为创建对象的父控件。 */ DWindowCloseButton::DWindowCloseButton(QWidget * parent) - : DIconButton(QStyle::SP_TitleBarCloseButton, parent) + : DIconButton(parent) { + //QStyle::SP_TitleBarCloseButton + auto iconEngine = new DStyledIconEngine(DDrawUtils::drawTitleBarCloseButton, QStringLiteral("TitleBarCloseButton")); + setIcon(QIcon(iconEngine)); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); setFlat(true); } diff -Nru dtkwidget-5.5.37/src/widgets/dwindowmaxbutton.cpp dtkwidget-5.5.46/src/widgets/dwindowmaxbutton.cpp --- dtkwidget-5.5.37/src/widgets/dwindowmaxbutton.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dwindowmaxbutton.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -26,11 +26,30 @@ DWindowMaxButtonPrivate(DWindowMaxButton* qq) : DIconButtonPrivate(qq) { - m_isMaximized = false; + } + + void setMaximized(bool isMaximized) + { + if (isMaximized == m_isMaximized) + return; + + m_isMaximized = isMaximized; + + updateIcon(); + + Q_EMIT q_func()->maximizedChanged(isMaximized); + } + + void updateIcon() + { + auto drawFun = !m_isMaximized ? DDrawUtils::drawTitleBarMaxButton : DDrawUtils::drawTitleBarNormalButton; + QString iconName = !m_isMaximized ? QStringLiteral("TitleBarMaxButton") : QStringLiteral("TitleBarNormalButton"); + + q_func()->setIcon(QIcon (new DStyledIconEngine(drawFun, iconName))); } private: - bool m_isMaximized; + bool m_isMaximized = false; Q_DECLARE_PUBLIC(DWindowMaxButton) }; @@ -56,7 +75,7 @@ DIconButton(*new DWindowMaxButtonPrivate(this), parent) { setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); - setIcon(QStyle::SP_TitleBarMaxButton); + d_func()->updateIcon(); setFlat(true); } @@ -93,18 +112,7 @@ { D_D(DWindowMaxButton); - if (d->m_isMaximized == isMaximized) - return; - - d->m_isMaximized = isMaximized; - - if (isMaximized) { - setIcon(QStyle::SP_TitleBarNormalButton); - } else { - setIcon(QStyle::SP_TitleBarMaxButton); - } - - Q_EMIT maximizedChanged(isMaximized); + d->setMaximized(isMaximized); } void DWindowMaxButton::initStyleOption(DStyleOptionButton *option) const diff -Nru dtkwidget-5.5.37/src/widgets/dwindowminbutton.cpp dtkwidget-5.5.46/src/widgets/dwindowminbutton.cpp --- dtkwidget-5.5.37/src/widgets/dwindowminbutton.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dwindowminbutton.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -40,6 +40,9 @@ DWindowMinButton::DWindowMinButton(QWidget * parent) : DIconButton(QStyle::SP_TitleBarMinButton, parent) { + //QStyle::SP_TitleBarMinButton + auto iconEngine = new DStyledIconEngine(DDrawUtils::drawTitleBarMinButton, QStringLiteral("TitleBarMinButton")); + setIcon(QIcon(iconEngine)); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); setFlat(true); } diff -Nru dtkwidget-5.5.37/src/widgets/dwindowoptionbutton.cpp dtkwidget-5.5.46/src/widgets/dwindowoptionbutton.cpp --- dtkwidget-5.5.37/src/widgets/dwindowoptionbutton.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dwindowoptionbutton.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -36,8 +36,11 @@ \a parent 为创建对象的父控件。 */ DWindowOptionButton::DWindowOptionButton(QWidget * parent) - : DIconButton(QStyle::SP_TitleBarMenuButton, parent) + : DIconButton(parent) { + //QStyle::SP_TitleBarMenuButton + auto iconEngine = new DStyledIconEngine(DDrawUtils::drawTitleBarMenuButton, QStringLiteral("TitleBarMenuButton")); + setIcon(QIcon(iconEngine)); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); setFlat(true); } diff -Nru dtkwidget-5.5.37/src/widgets/dwindowquitfullbutton.cpp dtkwidget-5.5.46/src/widgets/dwindowquitfullbutton.cpp --- dtkwidget-5.5.37/src/widgets/dwindowquitfullbutton.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/dwindowquitfullbutton.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -26,8 +26,11 @@ DWIDGET_BEGIN_NAMESPACE DWindowQuitFullButton::DWindowQuitFullButton(QWidget * parent) - : DIconButton(DStyle::SP_TitleQuitFullButton ,parent) + : DIconButton(parent) { + //DStyle::SP_TitleQuitFullButton + auto iconEngine = new DStyledIconEngine(DDrawUtils::drawTitleQuitFullButton, QStringLiteral("TitleQuitFullButton")); + setIcon(QIcon(iconEngine)); setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Expanding); setFlat(true); } diff -Nru dtkwidget-5.5.37/src/widgets/private/dsplitscreen_p.h dtkwidget-5.5.46/src/widgets/private/dsplitscreen_p.h --- dtkwidget-5.5.37/src/widgets/private/dsplitscreen_p.h 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/private/dsplitscreen_p.h 2022-05-27 02:58:09.000000000 +0000 @@ -81,6 +81,10 @@ QWidget *contentWidget = nullptr; QBasicTimer hideTimer; DArrowRectangle::FloatMode floatMode; + bool isMaxButtonPressAndHold = false; + + friend class DTitlebarPrivate; + friend class DTitlebar; }; DWIDGET_END_NAMESPACE diff -Nru dtkwidget-5.5.37/src/widgets/private/settings/content.cpp dtkwidget-5.5.46/src/widgets/private/settings/content.cpp --- dtkwidget-5.5.37/src/widgets/private/settings/content.cpp 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/src/widgets/private/settings/content.cpp 2022-05-27 02:58:09.000000000 +0000 @@ -302,6 +302,8 @@ if (widget.first) { QWidget *container = new QWidget; QHBoxLayout *hLayout = new QHBoxLayout(container); + hLayout->setSpacing(0); + hLayout->setMargin(0); hLayout->addWidget(widget.first); hLayout->addStretch(1); hLay->addWidget(container, 2); diff -Nru dtkwidget-5.5.37/tests/test-recoverage.sh dtkwidget-5.5.46/tests/test-recoverage.sh --- dtkwidget-5.5.37/tests/test-recoverage.sh 2022-01-10 06:31:04.000000000 +0000 +++ dtkwidget-5.5.46/tests/test-recoverage.sh 2022-05-27 02:58:09.000000000 +0000 @@ -1,7 +1,8 @@ #!/bin/bash -BUILD_DIR=build -REPORT_DIR=report +BUILD_DIR=`pwd`/../build-ut +HTML_DIR=${BUILD_DIR}/html +XML_DIR=${BUILD_DIR}/report cd ../ #rm -rf $BUILD_DIR @@ -24,7 +25,7 @@ cd $BUILD_DIR qmake ../ CONFIG+=debug export ASAN_OPTIONS=halt_on_error=0 -TESTARGS="--gtest_output=xml:dde_test_report_dtkwidget.xml" make check -j$(nproc) +TESTARGS="--gtest_output=xml:${XML_DIR}/report_dtkwidget.xml" make check -j$(nproc) lcov -d ./ -c -o coverage_all.info lcov --extract coverage_all.info $EXTRACT_ARGS --output-file coverage.info @@ -54,8 +55,7 @@ "*/dbusinterface.*" "*/ddesktopservices_linux.cpp" ) -lcov --remove coverage_all.info "*/tests/*" "*/usr/include*" "*build/src*" ${filter_files[*]} --output-file coverage.info -genhtml -o ../../tests/$REPORT_DIR coverage.info +lcov --remove coverage_all.info "*/tests/*" "*/usr/include*" "*build-ut/src*" ${filter_files[*]} --output-file coverage.info +genhtml -o $HTML_DIR $BUILD_DIR/coverage.info && mv ${BUILD_DIR}/html/index.html ${BUILD_DIR}/html/cov_dtkwidget.html -cd .. -test -e ./build/asan.log* && mv ./build/asan.log* ./build/asan_dtkwidget.log || touch ./build/asan.log +test -e ${BUILD_DIR}/asan.log* && mv ${BUILD_DIR}/asan.log* ${BUILD_DIR}/asan_dtkwidget.log || touch ${BUILD_DIR}/asan_dtkwidget.log