Compare commits
88 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a90f386ddc | ||
![]() |
13c4162b5e | ||
![]() |
32140ccf26 | ||
![]() |
697e678587 | ||
![]() |
b2da5add21 | ||
![]() |
a15d92c7eb | ||
![]() |
00d0f13c1a | ||
![]() |
32bd005492 | ||
![]() |
3eb95284a0 | ||
![]() |
1653473ecc | ||
![]() |
0f940b6579 | ||
![]() |
72f4286f49 | ||
![]() |
e8e0f3c96f | ||
![]() |
48cced00a9 | ||
![]() |
edea9b860d | ||
![]() |
710a9f562b | ||
![]() |
478f564631 | ||
![]() |
241e668ea2 | ||
![]() |
e6e8995e51 | ||
![]() |
2b81011b7e | ||
![]() |
2bb5e49cac | ||
![]() |
b4ec458dd5 | ||
![]() |
572c0c8aad | ||
![]() |
c0c909f9e8 | ||
![]() |
8b04a51b51 | ||
![]() |
d1f61330f3 | ||
![]() |
7097ae7f3c | ||
![]() |
3939ca9c12 | ||
![]() |
0300e28332 | ||
![]() |
13b1e661ea | ||
![]() |
b5399bd0ec | ||
![]() |
945bb03a27 | ||
![]() |
0f93647736 | ||
![]() |
ca4408c660 | ||
![]() |
ee030a6505 | ||
![]() |
326f510e4e | ||
![]() |
27e1493982 | ||
![]() |
3a5438b399 | ||
![]() |
e47a6dfb80 | ||
![]() |
b74544aa23 | ||
![]() |
3b567d096e | ||
![]() |
6b0fec0426 | ||
![]() |
f4a40f36b8 | ||
![]() |
556ea5acf8 | ||
![]() |
31e149d3d2 | ||
![]() |
a222173da6 | ||
![]() |
01e2377d86 | ||
![]() |
263e5a4358 | ||
![]() |
12d346a2c9 | ||
![]() |
bce2a49971 | ||
![]() |
2a5a1e0efb | ||
![]() |
4eecd92395 | ||
![]() |
cf909cd4d7 | ||
![]() |
107e7427d6 | ||
![]() |
79efd518a9 | ||
![]() |
6c492486a5 | ||
![]() |
a3499fcf34 | ||
![]() |
e0ac1f9562 | ||
![]() |
e02ff1ac53 | ||
![]() |
d765d60b22 | ||
![]() |
dab0083dcd | ||
![]() |
4e69cb7b68 | ||
![]() |
442a98cb70 | ||
![]() |
971cd92007 | ||
![]() |
c76dcb4361 | ||
![]() |
2459613b69 | ||
![]() |
d2e724b83e | ||
![]() |
3365365b56 | ||
![]() |
58547b091d | ||
![]() |
85deffe309 | ||
![]() |
919a2b5a49 | ||
![]() |
c2aedfe052 | ||
![]() |
70d73662ec | ||
![]() |
3573bb258b | ||
![]() |
afa0494067 | ||
![]() |
f771da5bdb | ||
![]() |
f6019f900d | ||
![]() |
7f148d257a | ||
![]() |
67df42b8a4 | ||
![]() |
7cd0cddf44 | ||
![]() |
f408bd89f4 | ||
![]() |
25194dbf13 | ||
![]() |
00369b053b | ||
![]() |
0f59177248 | ||
![]() |
f6b2044bea | ||
![]() |
111fb6c518 | ||
![]() |
38871e8b0d | ||
![]() |
d24429904c |
12
.github/workflows/call-api-check.yml
vendored
Normal file
@ -0,0 +1,12 @@
|
||||
name: apiCheck
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
api-check:
|
||||
uses: linuxdeepin/.github/.github/workflows/api-check.yml@master
|
20
.github/workflows/call-debian-check.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
||||
name: debianCheck
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
permissions:
|
||||
pull-requests: write
|
||||
contents: read
|
||||
checks: read
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
debian-check:
|
||||
uses: linuxdeepin/.github/.github/workflows/debian-check.yml@master
|
||||
with:
|
||||
job_name: "debian-check"
|
||||
|
17
.github/workflows/call-static-check.yml
vendored
Normal file
@ -0,0 +1,17 @@
|
||||
name: staticCheck
|
||||
on:
|
||||
pull_request_target:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
checks: write
|
||||
|
||||
concurrency:
|
||||
group: ${{ github.workflow }}-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
static-check:
|
||||
uses: linuxdeepin/.github/.github/workflows/static-check.yml@master
|
@ -63,3 +63,8 @@ License: CC0-1.0
|
||||
Files: plugins/overlay-warning/org.deepin.dde.dock.overlay.policy
|
||||
Copyright: UnionTech Software Technology Co., Ltd.
|
||||
License: LGPL-3.0-or-later
|
||||
|
||||
Files: toolGenerate/**/*
|
||||
Copyright: None
|
||||
License: CC0-1.0
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
cmake_minimum_required(VERSION 3.16)
|
||||
|
||||
if (NOT DEFINED VERSION)
|
||||
set(VERSION 6.0.20)
|
||||
set(VERSION 6.0.37)
|
||||
endif()
|
||||
|
||||
project(dde-dock)
|
||||
|
@ -174,7 +174,7 @@
|
||||
"visibility":"public"
|
||||
},
|
||||
"Dock_Quick_Plugins": {
|
||||
"value": ["power", "network", "shutdown", "show-desktop", "multitasking"],
|
||||
"value": ["power", "network", "shutdown", "show-desktop", "multitasking", "notification", "uosai"],
|
||||
"serial": 0,
|
||||
"flags": [],
|
||||
"name": "Quick Plugins show on dock",
|
||||
|
132
debian/changelog
vendored
@ -1,3 +1,135 @@
|
||||
dde-dock (6.0.37) unstable; urgency=medium
|
||||
|
||||
* release 6.0.37
|
||||
* fix linuxdeepin/developer-center#7612
|
||||
|
||||
-- Mike Chen <chenke@deepin.org> Wed, 03 Apr 2024 10:22:29 +0800
|
||||
|
||||
dde-dock (6.0.36) unstable; urgency=medium
|
||||
|
||||
* release 6.0.36
|
||||
* fix linuxdeepin/developer-center#7222
|
||||
* fix linuxdeepin/developer-center#7207
|
||||
* fix linuxdeepin/developer-center#6454
|
||||
|
||||
-- Mike Chen <chenke@deepin.org> Wed, 06 Mar 2024 16:50:36 +0800
|
||||
|
||||
dde-dock (6.0.35) unstable; urgency=medium
|
||||
|
||||
* feat: adjust dock ui
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Thu, 01 Feb 2024 10:58:27 +0800
|
||||
|
||||
dde-dock (6.0.34) unstable; urgency=medium
|
||||
|
||||
* fix: dock animation broken (https://github.com/linuxdeepin/developer-center/issues/7143)
|
||||
* fix: dock plugin calculated to an incorrect size (https://github.com/linuxdeepin/developer-center/issues/7127)
|
||||
* fix: dock will not auto hide after set size (https://github.com/linuxdeepin/developer-center/issues/7129)
|
||||
* fix: dock plugin unable to click when in keep hide (https://github.com/linuxdeepin/developer-center/issues/7132)
|
||||
* fix: dock item indicator not update (https://github.com/linuxdeepin/developer-center/issues/7097)
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Tue, 30 Jan 2024 16:17:59 +0800
|
||||
|
||||
dde-dock (6.0.33) unstable; urgency=medium
|
||||
|
||||
* fix: tmp block uosai in quickpanel
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Fri, 26 Jan 2024 14:38:06 +0800
|
||||
|
||||
dde-dock (6.0.32) unstable; urgency=medium
|
||||
|
||||
* fix: dock get max size when positionChanged and KeepHide mode (https://github.com/linuxdeepin/developer-center/issues/7040)
|
||||
* fix: dock not remove plugin when fcitx exit (https://github.com/linuxdeepin/developer-center/issues/7080)
|
||||
* fix: dock theme not follow system (https://github.com/linuxdeepin/developer-center/issues/7090)
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Thu, 25 Jan 2024 14:30:26 +0800
|
||||
|
||||
dde-dock (6.0.31) unstable; urgency=medium
|
||||
|
||||
* fix: error datetime tooltip (https://github.com/linuxdeepin/developer-center/issues/7056)
|
||||
* fix: unable get docked entriy by soft link path (https://github.com/linuxdeepin/developer-center/issues/7033)
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Tue, 23 Jan 2024 17:43:44 +0800
|
||||
|
||||
dde-dock (6.0.30) unstable; urgency=medium
|
||||
|
||||
* chore: remove Cooperation in display plugin (https://github.com/linuxdeepin/developer-center/issues/7023)
|
||||
|
||||
-- chenhongtao <chenhongtao@deepin.org> Mon, 22 Jan 2024 17:27:34 +0800
|
||||
|
||||
dde-dock (6.0.29) unstable; urgency=medium
|
||||
|
||||
* fix: when no timeformat, tooltip is empty
|
||||
|
||||
-- chenhongtao <chenhongtao@deepin.org> Mon, 22 Jan 2024 09:47:21 +0800
|
||||
|
||||
dde-dock (6.0.28) unstable; urgency=medium
|
||||
|
||||
* fix: the item that removed is exist yet (https://github.com/linuxdeepin/developer-center/issues/4631)
|
||||
* fix: dock wakeup area not changed (https://github.com/linuxdeepin/developer-center/issues/5831)
|
||||
* fix: onboard not to show on first click (https://github.com/linuxdeepin/developer-center/issues/6675)
|
||||
* fix: timedate tips show error (https://github.com/linuxdeepin/developer-center/issues/6674)
|
||||
* fix: quickpanel icon not follow theme (https://github.com/linuxdeepin/developer-center/issues/6263)
|
||||
* fix: disable resize of dock popup window (https://github.com/linuxdeepin/developer-center/issues/6264)
|
||||
* feat: add dbus property window margin
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Thu, 18 Jan 2024 09:57:27 +0800
|
||||
|
||||
dde-dock (6.0.27) unstable; urgency=medium
|
||||
|
||||
* fix: dock get stucked when launching (https://github.com/linuxdeepin/developer-center/issues/6657)
|
||||
* chore: make uosai default on dock (https://github.com/linuxdeepin/developer-center/issues/6486)
|
||||
* chore: open deepin-calendar instead of dde-widgets when click timedate (https://github.com/linuxdeepin/developer-center/issues/6696)
|
||||
* fix: item context menu not updated
|
||||
* feat: add plugin notification (https://github.com/linuxdeepin/developer-center/issues/6695)
|
||||
* fix: mainwindow hide when popup opens (https://github.com/linuxdeepin/developer-center/issues/4970)
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Tue, 09 Jan 2024 13:33:18 +0800
|
||||
|
||||
dde-dock (6.0.26) unstable; urgency=medium
|
||||
|
||||
* release 6.0.26
|
||||
* fix #6033 #5719 #5786 #4331
|
||||
|
||||
-- mike <chenke@deepin.org> Fri, 29 Dec 2023 11:27:59 +0800
|
||||
|
||||
dde-dock (6.0.25) unstable; urgency=medium
|
||||
|
||||
* chore: turn on bluetooth loading animation when not start
|
||||
* fix: fix again set dcc dock plugin icon pixelated
|
||||
|
||||
-- chenhongtao <chenhongtao@deepin.org> Wed, 13 Dec 2023 15:31:57 +0800
|
||||
|
||||
dde-dock (6.0.24) unstable; urgency=medium
|
||||
|
||||
* chore: use system icon first
|
||||
* fix: dcc dock plugin icon pixelated
|
||||
* fix some coredump issue
|
||||
* fix: brightness silder cannot sroll when is 28
|
||||
* tidy up some log
|
||||
|
||||
-- chenhongtao <chenhongtao@deepin.org> Tue, 28 Nov 2023 10:51:52 +0800
|
||||
|
||||
dde-dock (6.0.23) unstable; urgency=medium
|
||||
|
||||
* fix: displayplugin disappear when monitor count changed
|
||||
* fix: tray disappear when drag finished
|
||||
* fix: double tray show afeter drag into expandTray and drag back
|
||||
* chore: remove unused dbus
|
||||
* chore: Adapt time format feature(Issue: https://github.com/linuxdeepin/developer-center/issues/5902)
|
||||
|
||||
-- Deepin Packages Builder <packages@deepin.org> Thu, 26 Oct 2023 17:25:38 +0800
|
||||
|
||||
dde-dock (6.0.22) unstable; urgency=medium
|
||||
|
||||
* fix: a space on tray without trash show
|
||||
* fix: coredump empty tray when switch postion
|
||||
* fix: Can't hide when DockPopupWindow deactivate(Issue: https://github.com/linuxdeepin/developer-center/issues/5405)
|
||||
* fix: datetime size error
|
||||
* fix: tool appAreaWidget visible
|
||||
|
||||
-- tsic404 <liuheng@deepin.org> Mon, 11 Sep 2023 13:14:25 +0800
|
||||
|
||||
dde-dock (6.0.21) unstable; urgency=medium
|
||||
|
||||
* fix: add lost windowSizeChanged Signal
|
||||
|
79
debian/control
vendored
@ -2,73 +2,80 @@ Source: dde-dock
|
||||
Section: x11
|
||||
Priority: optional
|
||||
Maintainer: Deepin Packages Builder <packages@deepin.com>
|
||||
Build-Depends: debhelper-compat (= 10),
|
||||
pkg-config,
|
||||
Build-Depends:
|
||||
cmake,
|
||||
qt5-qmake,
|
||||
libxcb-image0-dev,
|
||||
libxcb-composite0-dev,
|
||||
libxcb-ewmh-dev,
|
||||
libxtst-dev,
|
||||
qttools5-dev-tools,
|
||||
qtbase5-private-dev,
|
||||
libxcb-icccm4-dev,
|
||||
libqt5x11extras5-dev,
|
||||
libxcb-damage0-dev,
|
||||
libqt5svg5-dev,
|
||||
libdtkwidget-dev (>=5.4.19),
|
||||
debhelper-compat (= 10),
|
||||
extra-cmake-modules,
|
||||
libdbusmenu-qt5-dev,
|
||||
libdtkcore-dev (>=5.4.14),
|
||||
libdtkcore5-bin (>=5.4.14),
|
||||
libdtkgui-dev (>=5.4.13),
|
||||
libgsettings-qt-dev,
|
||||
libdbusmenu-qt5-dev,
|
||||
libgtest-dev,
|
||||
libgmock-dev,
|
||||
qttools5-dev,
|
||||
libxcursor-dev,
|
||||
libxres-dev,
|
||||
libqt5waylandclient5-dev,
|
||||
qtwayland5-private-dev,
|
||||
libxdamage-dev,
|
||||
libdtkwidget-dev (>=5.4.19),
|
||||
libdwayland-dev,
|
||||
extra-cmake-modules
|
||||
libgmock-dev,
|
||||
libgsettings-qt-dev,
|
||||
libgtest-dev,
|
||||
libqt5svg5-dev,
|
||||
libqt5waylandclient5-dev,
|
||||
libqt5x11extras5-dev,
|
||||
libxcb-composite0-dev,
|
||||
libxcb-damage0-dev,
|
||||
libxcb-ewmh-dev,
|
||||
libxcb-icccm4-dev,
|
||||
libxcb-image0-dev,
|
||||
libxcursor-dev,
|
||||
libxdamage-dev,
|
||||
libxres-dev,
|
||||
libxtst-dev,
|
||||
pkg-config,
|
||||
qt5-qmake,
|
||||
qtbase5-private-dev,
|
||||
qttools5-dev,
|
||||
qttools5-dev-tools,
|
||||
qtwayland5-private-dev,
|
||||
Standards-Version: 3.9.8
|
||||
Homepage: http://www.deepin.org/
|
||||
|
||||
Package: dde-dock
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends},
|
||||
deepin-desktop-schemas (>=5.9.14),
|
||||
dde-qt5xcb-plugin (>=5.0.25),
|
||||
Depends:
|
||||
dbus-bin,
|
||||
dde-daemon (>=5.13.12),
|
||||
startdde (>=5.8.9),
|
||||
dde-qt5xcb-plugin (>=5.0.25),
|
||||
deepin-desktop-schemas (>=5.9.14),
|
||||
lastore-daemon (>=5.2.9),
|
||||
qtxdg-dev-tools,
|
||||
dbus-bin
|
||||
startdde (>=5.8.9),
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Recommends:
|
||||
dde-disk-mount-plugin,
|
||||
dde-dock-onboard-plugin,
|
||||
dde-network-dialog,
|
||||
dock-network-plugin,
|
||||
dde-network-dialog
|
||||
Conflicts:
|
||||
dde-workspace (<< 2.90.5),
|
||||
dde-dock-applets,
|
||||
dde-trash-plugin,
|
||||
dock-hotspot-plugin
|
||||
dde-workspace (<< 2.90.5),
|
||||
dock-hotspot-plugin,
|
||||
Replaces:
|
||||
dde-dock-applets,
|
||||
dde-trash-plugin
|
||||
dde-trash-plugin,
|
||||
Description: deepin desktop-environment - dock module
|
||||
Dock module of deepin desktop-environment
|
||||
|
||||
Package: dde-dock-dev
|
||||
Architecture: any
|
||||
Depends: ${misc:Depends}
|
||||
Depends:
|
||||
${misc:Depends},
|
||||
Description: deepin desktop-environment - dock module development files
|
||||
Dock module development files of deepin desktop-environment
|
||||
|
||||
Package: dde-dock-onboard-plugin
|
||||
Architecture: any
|
||||
Depends: ${shlibs:Depends}, ${misc:Depends}, onboard
|
||||
Depends:
|
||||
onboard,
|
||||
${misc:Depends},
|
||||
${shlibs:Depends},
|
||||
Description: deepin desktop-environment - dock plugin for onboard
|
||||
Dock plugin for onboard of deepin desktop-environment
|
||||
|
1
debian/dde-dock.install
vendored
@ -9,4 +9,5 @@ usr/lib/dde-dock/plugins/quick-trays
|
||||
usr/lib/dde-dock/plugins/libmultitasking.so
|
||||
usr/lib/dde-dock/plugins/libshow-desktop.so
|
||||
usr/lib/dde-dock/plugins/libkeyboard-layout.so
|
||||
usr/lib/dde-dock/plugins/libnotification.so
|
||||
usr/share/dsg/configs/dde-dock/
|
||||
|
@ -84,7 +84,7 @@ DockItemManager::DockItemManager(QObject *parent)
|
||||
}
|
||||
|
||||
// 刷新图标
|
||||
QMetaObject::invokeMethod(this, "refreshItemsIcon", Qt::QueuedConnection);
|
||||
QMetaObject::invokeMethod(this, &DockItemManager::refreshItemsIcon, Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
DockItemManager *DockItemManager::instance(QObject *parent)
|
||||
|
@ -36,9 +36,9 @@ bool QuickSettingController::eventFilter(QObject *watched, QEvent *event)
|
||||
void QuickSettingController::startLoader()
|
||||
{
|
||||
#ifdef QT_DEBUG
|
||||
AbstractPluginsController::startLoader(new PluginLoader(QString("%1/..%2").arg(qApp->applicationDirPath()).arg("/plugins/loader"), this));
|
||||
AbstractPluginsController::startLoader(new PluginLoader(QString("%1/..%2").arg(qApp->applicationDirPath()).arg("/plugins/loader"), this));
|
||||
#else
|
||||
AbstractPluginsController::startLoader(new PluginLoader("/usr/lib/dde-dock/plugins/loader", this));
|
||||
AbstractPluginsController::startLoader(new PluginLoader("/usr/lib/dde-dock/plugins/loader", this));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -45,6 +45,7 @@ void ToolAppHelper::setPosition(Position position)
|
||||
{
|
||||
m_toolAreaWidget->setFixedSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX);
|
||||
m_position = position;
|
||||
updateWidgetStatus();
|
||||
}
|
||||
|
||||
bool ToolAppHelper::toolIsVisible() const
|
||||
@ -140,7 +141,7 @@ void ToolAppHelper::updateWidgetStatus()
|
||||
m_toolAreaWidget->setVisible(false);
|
||||
} else {
|
||||
// 时尚模式
|
||||
m_toolAreaWidget->setVisible(m_toolAreaWidget->layout()->count() > 0);
|
||||
updateToolArea();
|
||||
}
|
||||
bool visible = toolIsVisible();
|
||||
if (oldVisible != visible)
|
||||
|
@ -326,7 +326,7 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm
|
||||
{
|
||||
auto iconSize = [](const QIcon &icon) {
|
||||
QList<QSize> iconSizes = icon.availableSizes();
|
||||
if (iconSizes.size() > 0)
|
||||
if (iconSizes.size() > 0 && !iconSizes[0].isNull() )
|
||||
return iconSizes[0];
|
||||
|
||||
return defaultIconSize;
|
||||
@ -335,7 +335,14 @@ QIcon DBusDockAdaptors::getSettingIcon(PluginsItemInterface *plugin, QSize &pixm
|
||||
QIcon icon = plugin->icon(DockPart::DCCSetting, colorType);
|
||||
if (!icon.isNull()) {
|
||||
pixmapSize = iconSize(icon);
|
||||
return icon;
|
||||
|
||||
QColor c = colorType == DGuiApplicationHelper::LightType ? Qt::black :Qt::white;
|
||||
QPixmap pixmap = icon.pixmap(pixmapSize);
|
||||
QPainter pa(&pixmap);
|
||||
pa.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||
pa.fillRect(pixmap.rect(), c);
|
||||
|
||||
return pixmap;
|
||||
}
|
||||
|
||||
// 如果插件中没有设置图标,则根据插件的类型,获取其他的图标
|
||||
|
@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 ~ 2018 Deepin Technology Co., Ltd.
|
||||
*
|
||||
* Author: sbw <sbw@sbw.so>
|
||||
*
|
||||
* Maintainer: sbw <sbw@sbw.so>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was generated by qdbusxml2cpp version 0.8
|
||||
* Command line was: qdbusxml2cpp -c DBusMenu -p dbusmenu com.deepin.menu.Menu.xml
|
||||
*
|
||||
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||
*
|
||||
* This is an auto-generated file.
|
||||
* This file may have been hand-edited. Look for HAND-EDIT comments
|
||||
* before re-generating it.
|
||||
*/
|
||||
|
||||
#include "dbusmenu.h"
|
||||
|
||||
/*
|
||||
* Implementation of interface class DBusMenu
|
||||
*/
|
||||
|
||||
DBusMenu::DBusMenu(const QString &path, QObject *parent)
|
||||
: QDBusAbstractInterface(staticServerPath(), path, staticInterfaceName(), QDBusConnection::sessionBus(), parent)
|
||||
{
|
||||
}
|
||||
|
||||
DBusMenu::~DBusMenu()
|
||||
{
|
||||
}
|
||||
|
@ -1,102 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 ~ 2018 Deepin Technology Co., Ltd.
|
||||
*
|
||||
* Author: sbw <sbw@sbw.so>
|
||||
*
|
||||
* Maintainer: sbw <sbw@sbw.so>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was generated by qdbusxml2cpp version 0.8
|
||||
* Command line was: qdbusxml2cpp -c DBusMenu -p dbusmenu com.deepin.menu.Menu.xml
|
||||
*
|
||||
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||
*
|
||||
* This is an auto-generated file.
|
||||
* Do not edit! All changes made to it will be lost.
|
||||
*/
|
||||
|
||||
#ifndef DBUSMENU_H_1436158836
|
||||
#define DBUSMENU_H_1436158836
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QByteArray>
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QMap>
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QVariant>
|
||||
#include <QtDBus/QtDBus>
|
||||
|
||||
/*
|
||||
* Proxy class for interface com.deepin.menu.Menu
|
||||
*/
|
||||
class DBusMenu: public QDBusAbstractInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static inline const char *staticServerPath()
|
||||
{ return "com.deepin.menu"; }
|
||||
static inline const char *staticInterfaceName()
|
||||
{ return "com.deepin.menu.Menu"; }
|
||||
|
||||
public:
|
||||
DBusMenu(const QString &path,QObject *parent = 0);
|
||||
|
||||
~DBusMenu();
|
||||
|
||||
public Q_SLOTS: // METHODS
|
||||
inline QDBusPendingReply<> SetItemActivity(const QString &itemId, bool isActive)
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(isActive);
|
||||
return asyncCallWithArgumentList(QStringLiteral("SetItemActivity"), argumentList);
|
||||
}
|
||||
|
||||
inline QDBusPendingReply<> SetItemChecked(const QString &itemId, bool checked)
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(checked);
|
||||
return asyncCallWithArgumentList(QStringLiteral("SetItemChecked"), argumentList);
|
||||
}
|
||||
|
||||
inline QDBusPendingReply<> SetItemText(const QString &itemId, const QString &text)
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
argumentList << QVariant::fromValue(itemId) << QVariant::fromValue(text);
|
||||
return asyncCallWithArgumentList(QStringLiteral("SetItemText"), argumentList);
|
||||
}
|
||||
|
||||
inline QDBusPendingReply<> ShowMenu(const QString &menuJsonContent)
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
argumentList << QVariant::fromValue(menuJsonContent);
|
||||
return asyncCallWithArgumentList(QStringLiteral("ShowMenu"), argumentList);
|
||||
}
|
||||
|
||||
Q_SIGNALS: // SIGNALS
|
||||
void ItemInvoked(const QString &itemId, bool checked);
|
||||
void MenuUnregistered();
|
||||
};
|
||||
|
||||
namespace com {
|
||||
namespace deepin {
|
||||
namespace menu {
|
||||
typedef ::DBusMenu Menu;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
@ -1,47 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 ~ 2018 Deepin Technology Co., Ltd.
|
||||
*
|
||||
* Author: sbw <sbw@sbw.so>
|
||||
*
|
||||
* Maintainer: sbw <sbw@sbw.so>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was generated by qdbusxml2cpp version 0.8
|
||||
* Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml
|
||||
*
|
||||
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||
*
|
||||
* This is an auto-generated file.
|
||||
* This file may have been hand-edited. Look for HAND-EDIT comments
|
||||
* before re-generating it.
|
||||
*/
|
||||
|
||||
#include "dbusmenumanager.h"
|
||||
|
||||
/*
|
||||
* Implementation of interface class DBusMenuManager
|
||||
*/
|
||||
|
||||
DBusMenuManager::DBusMenuManager(QObject *parent)
|
||||
: QDBusAbstractInterface(staticServerPath(), staticInterfacePath(), staticInterfaceName(), QDBusConnection::sessionBus(), parent)
|
||||
{
|
||||
}
|
||||
|
||||
DBusMenuManager::~DBusMenuManager()
|
||||
{
|
||||
}
|
||||
|
@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2015 ~ 2018 Deepin Technology Co., Ltd.
|
||||
*
|
||||
* Author: sbw <sbw@sbw.so>
|
||||
*
|
||||
* Maintainer: sbw <sbw@sbw.so>
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file was generated by qdbusxml2cpp version 0.8
|
||||
* Command line was: qdbusxml2cpp -c DBusMenuManager -p dbusmenumanager com.deepin.menu.Manager.xml
|
||||
*
|
||||
* qdbusxml2cpp is Copyright (C) 2015 Digia Plc and/or its subsidiary(-ies).
|
||||
*
|
||||
* This is an auto-generated file.
|
||||
* Do not edit! All changes made to it will be lost.
|
||||
*/
|
||||
|
||||
#ifndef DBUSMENUMANAGER_H_1436158928
|
||||
#define DBUSMENUMANAGER_H_1436158928
|
||||
|
||||
#include <QtCore/QObject>
|
||||
#include <QtCore/QByteArray>
|
||||
#include <QtCore/QList>
|
||||
#include <QtCore/QMap>
|
||||
#include <QtCore/QString>
|
||||
#include <QtCore/QStringList>
|
||||
#include <QtCore/QVariant>
|
||||
#include <QtDBus/QtDBus>
|
||||
|
||||
/*
|
||||
* Proxy class for interface com.deepin.menu.Manager
|
||||
*/
|
||||
class DBusMenuManager: public QDBusAbstractInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
static inline const char *staticServerPath()
|
||||
{ return "com.deepin.menu"; }
|
||||
static inline const char *staticInterfacePath()
|
||||
{ return "/com/deepin/menu"; }
|
||||
static inline const char *staticInterfaceName()
|
||||
{ return "com.deepin.menu.Manager"; }
|
||||
|
||||
public:
|
||||
explicit DBusMenuManager(QObject *parent = 0);
|
||||
|
||||
~DBusMenuManager();
|
||||
|
||||
public Q_SLOTS: // METHODS
|
||||
inline QDBusPendingReply<QDBusObjectPath> RegisterMenu()
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
return asyncCallWithArgumentList(QStringLiteral("RegisterMenu"), argumentList);
|
||||
}
|
||||
|
||||
inline QDBusPendingReply<> UnregisterMenu(const QString &menuObjectPath)
|
||||
{
|
||||
QList<QVariant> argumentList;
|
||||
argumentList << QVariant::fromValue(menuObjectPath);
|
||||
return asyncCallWithArgumentList(QStringLiteral("UnregisterMenu"), argumentList);
|
||||
}
|
||||
|
||||
Q_SIGNALS: // SIGNALS
|
||||
};
|
||||
|
||||
namespace com {
|
||||
namespace deepin {
|
||||
namespace menu {
|
||||
typedef ::DBusMenuManager Manager;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
@ -17,6 +17,7 @@ DockDaemonDBusAdaptor::DockDaemonDBusAdaptor(QObject *parent)
|
||||
connect(TaskManager::instance(), &TaskManager::frontendWindowRectChanged, this, &DockDaemonDBusAdaptor::FrontendWindowRectChanged);
|
||||
connect(TaskManager::instance(), &TaskManager::showRecentChanged, this, &DockDaemonDBusAdaptor::showRecentChanged);
|
||||
connect(TaskManager::instance(), &TaskManager::showMultiWindowChanged, this, &DockDaemonDBusAdaptor::ShowMultiWindowChanged);
|
||||
connect(TaskManager::instance(), &TaskManager::windowMarginChanged, this, &DockDaemonDBusAdaptor::WindowMarginChanged);
|
||||
connect(DockSettings::instance(), &DockSettings::positionModeChanged, this, &DockDaemonDBusAdaptor::PositionChanged);
|
||||
connect(DockSettings::instance(), &DockSettings::hideModeChanged, this, &DockDaemonDBusAdaptor::HideModeChanged);
|
||||
connect(DockSettings::instance(), &DockSettings::displayModeChanged, this, &DockDaemonDBusAdaptor::DisplayModeChanged);
|
||||
@ -104,6 +105,11 @@ void DockDaemonDBusAdaptor::setWindowSizeFashion(uint value)
|
||||
}
|
||||
}
|
||||
|
||||
uint DockDaemonDBusAdaptor::windowMargin() const
|
||||
{
|
||||
return TaskManager::instance()->windowMargin();
|
||||
}
|
||||
|
||||
QRect DockDaemonDBusAdaptor::frontendWindowRect() const
|
||||
{
|
||||
return TaskManager::instance()->getFrontendWindowRect();
|
||||
|
@ -100,6 +100,7 @@ class DockDaemonDBusAdaptor: public QDBusAbstractAdaptor
|
||||
" <property access=\"readwrite\" type=\"u\" name=\"HideTimeout\"/>\n"
|
||||
" <property access=\"readwrite\" type=\"u\" name=\"WindowSizeEfficient\"/>\n"
|
||||
" <property access=\"readwrite\" type=\"u\" name=\"WindowSizeFashion\"/>\n"
|
||||
" <property access=\"read\" type=\"u\" name=\"WindowMargin\"/>\n"
|
||||
" <property access=\"read\" type=\"(iiii)\" name=\"FrontendWindowRect\"/>\n"
|
||||
" <property access=\"readwrite\" type=\"i\" name=\"HideMode\"/>\n"
|
||||
" <property access=\"readwrite\" type=\"i\" name=\"DisplayMode\"/>\n"
|
||||
@ -142,6 +143,9 @@ public: // PROPERTIES
|
||||
uint windowSizeFashion() const;
|
||||
void setWindowSizeFashion(uint value);
|
||||
|
||||
Q_PROPERTY(uint WindowMargin READ windowMargin NOTIFY WindowMarginChanged)
|
||||
uint windowMargin() const;
|
||||
|
||||
Q_PROPERTY(QRect FrontendWindowRect READ frontendWindowRect NOTIFY FrontendWindowRectChanged)
|
||||
QRect frontendWindowRect() const;
|
||||
|
||||
@ -198,6 +202,7 @@ Q_SIGNALS: // SIGNALS
|
||||
void ShowTimeoutChanged(uint value) const;
|
||||
void WindowSizeEfficientChanged(uint value) const;
|
||||
void WindowSizeFashionChanged(uint value) const;
|
||||
void WindowMarginChanged(uint value) const;
|
||||
void showRecentChanged(bool) const;
|
||||
void ShowMultiWindowChanged(bool) const;
|
||||
};
|
||||
};
|
||||
|
@ -159,6 +159,10 @@ int main(int argc, char *argv[])
|
||||
DockApplication::setAttribute(Qt::AA_EnableHighDpiScaling, true);
|
||||
DockApplication app(argc, argv);
|
||||
|
||||
// NOTE: dde-shell load dde-dock plugins and mark loader program DS_APP_ID as dde-dock
|
||||
// so need reset DGuiApplication pallette to follow system
|
||||
DGuiApplicationHelper::instance()->setPaletteType(DGuiApplicationHelper::ColorType::UnknownType);
|
||||
|
||||
//崩溃信号
|
||||
signal(SIGSEGV, sig_crash);
|
||||
signal(SIGILL, sig_crash);
|
||||
|
@ -22,6 +22,13 @@ DBusHandler::DBusHandler(TaskManager *taskmanager, QObject *parent)
|
||||
, m_xEventMonitor(nullptr)
|
||||
, m_launcher(new org::deepin::dde::Launcher1(launcherService, launcherPath, QDBusConnection::sessionBus(), this))
|
||||
{
|
||||
QDBusInterface *interAM = new QDBusInterface(ApplicationManager1DBusName, "/org/desktopspec/ApplicationManager1", "org.desktopspec.DBus.ObjectManager", QDBusConnection::sessionBus(), this);
|
||||
if (interAM->isValid()) {
|
||||
connect(interAM, SIGNAL(InterfacesRemoved(const QDBusObjectPath &, const QStringList &)), this, SIGNAL(appUninstalled(const QDBusObjectPath &, const QStringList &)));
|
||||
} else {
|
||||
qWarning() << "The interface of AM is invalid:" << interAM->lastError();
|
||||
}
|
||||
|
||||
connect(m_wmSwitcher, &org::deepin::dde::WMSwitcher1::WMChanged, this, [&](QString name) {m_taskmanager->setWMName(name);});
|
||||
if (!isWaylandSession()) {
|
||||
m_xEventMonitor = new org::deepin::dde::XEventMonitor1("org.deepin.dde.XEventMonitor1", "/org/deepin/dde/XEventMonitor1", QDBusConnection::sessionBus(), this);
|
||||
@ -33,6 +40,16 @@ DBusHandler::DBusHandler(TaskManager *taskmanager, QObject *parent)
|
||||
m_taskmanager->setDdeLauncherVisible(visible);
|
||||
m_taskmanager->updateHideState(true);
|
||||
});
|
||||
|
||||
// try to active bamf in another thread
|
||||
QtConcurrent::run([ = ] {
|
||||
QDBusInterface bamfInterface(
|
||||
QStringLiteral("org.ayatana.bamf"),
|
||||
QStringLiteral("/org/ayatana/bamf/matcher"),
|
||||
QStringLiteral("org.ayatana.bamf.matcher"),
|
||||
QDBusConnection::sessionBus()
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
void DBusHandler::listenWaylandWMSignals()
|
||||
|
@ -66,6 +66,9 @@ public:
|
||||
bool newStartManagerAvaliable();
|
||||
void sendFailedDockNotification(const QString &appName);
|
||||
|
||||
Q_SIGNALS:
|
||||
void appUninstalled(const QDBusObjectPath &objectPath, const QStringList &interfaces);
|
||||
|
||||
private Q_SLOTS:
|
||||
void handleWlActiveWindowChange();
|
||||
void onActiveWindowButtonRelease(int type, int x, int y, const QString &key);
|
||||
|
@ -40,7 +40,7 @@ DesktopInfo::DesktopInfo(const QString &desktopfile)
|
||||
}
|
||||
}
|
||||
|
||||
m_desktopFilePath = desktopFileInfo.absoluteFilePath();
|
||||
m_desktopFilePath = desktopFileInfo.canonicalFilePath();
|
||||
m_isValid = desktopFileInfo.isAbsolute() && QFile::exists(desktopFileInfo.absoluteFilePath());
|
||||
m_desktopFile.reset(new QSettings(m_desktopFilePath, QSettings::IniFormat));
|
||||
m_desktopFile->setIniCodec("utf-8");
|
||||
|
@ -162,9 +162,11 @@ QList<Entry*> Entries::getEntries()
|
||||
|
||||
Entry *Entries::getDockedEntryByDesktopFile(const QString &desktopFile)
|
||||
{
|
||||
QFileInfo desktopFileInfo(desktopFile);
|
||||
|
||||
Entry *ret = nullptr;
|
||||
for (auto entry : filterDockedEntries()) {
|
||||
if ((entry->isValid()) && desktopFile == entry->getFileName()) {
|
||||
if ((entry->isValid()) && desktopFileInfo.canonicalFilePath() == entry->getFileName()) {
|
||||
ret = entry;
|
||||
break;
|
||||
}
|
||||
|
@ -17,7 +17,6 @@
|
||||
#include "waylandmanager.h"
|
||||
#include "windowinfobase.h"
|
||||
#include "dbusutil.h"
|
||||
|
||||
#include "org_deepin_dde_kwayland_plasmawindow.h"
|
||||
|
||||
#include <QDir>
|
||||
@ -27,10 +26,16 @@
|
||||
#include <QPixmap>
|
||||
|
||||
#include <cstdint>
|
||||
#include <dtkcore_global.h>
|
||||
#include <functional>
|
||||
#include <iterator>
|
||||
#include <memory>
|
||||
#include <algorithm>
|
||||
|
||||
#include <dutil.h>
|
||||
|
||||
DCORE_USE_NAMESPACE
|
||||
|
||||
#define SETTING DockSettings::instance()
|
||||
#define XCB XCBUtils::instance()
|
||||
bool shouldShowEntry(Entry *entry)
|
||||
@ -50,6 +55,7 @@ TaskManager::TaskManager(QObject *parent)
|
||||
, m_hideState(HideState::Unknown)
|
||||
, m_ddeLauncherVisible(false)
|
||||
, m_trayGridWidgetVisible(false)
|
||||
, m_popupVisible(false)
|
||||
, m_entries(new Entries(this))
|
||||
, m_windowIdentify(new WindowIdentify(this))
|
||||
, m_dbusHandler(new DBusHandler(this))
|
||||
@ -90,6 +96,20 @@ TaskManager::TaskManager(QObject *parent)
|
||||
connect(m_x11Manager, &X11Manager::requestHandleActiveWindowChange, this, &TaskManager::handleActiveWindowChanged);
|
||||
connect(m_x11Manager, &X11Manager::requestAttachOrDetachWindow, this, &TaskManager::attachOrDetachWindow);
|
||||
}
|
||||
connect(m_dbusHandler, &DBusHandler::appUninstalled, this, [this] (const QDBusObjectPath &objectPath, const QStringList &interfaces) {
|
||||
Q_UNUSED(interfaces)
|
||||
QString desktopFile = DUtil::unescapeFromObjectPath(objectPath.path());
|
||||
QString desktopName = desktopFile.split('/').last();
|
||||
QList<Entry *> entries = m_entries->getEntries();
|
||||
auto desktopEntryIter = std::find_if(entries.begin(), entries.end(), [desktopName] (Entry *entry) {
|
||||
return entry->getDesktopFile().contains(desktopName);
|
||||
});
|
||||
if (desktopEntryIter != entries.end()) {
|
||||
undockEntry(*desktopEntryIter);
|
||||
} else {
|
||||
qWarning() << "The entry which is to be removed is not found!";
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
TaskManager::~TaskManager()
|
||||
@ -248,7 +268,7 @@ bool TaskManager::shouldShowOnDock(WindowInfoBase *info)
|
||||
*/
|
||||
void TaskManager::setDdeLauncherVisible(bool visible)
|
||||
{
|
||||
m_trayGridWidgetVisible = visible;
|
||||
m_ddeLauncherVisible = visible;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -257,7 +277,12 @@ void TaskManager::setDdeLauncherVisible(bool visible)
|
||||
*/
|
||||
void TaskManager::setTrayGridWidgetVisible(bool visible)
|
||||
{
|
||||
m_ddeLauncherVisible = visible;
|
||||
m_trayGridWidgetVisible = visible;
|
||||
}
|
||||
|
||||
void TaskManager::setPopupVisible(bool visible)
|
||||
{
|
||||
m_popupVisible = visible;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -365,7 +390,7 @@ void TaskManager::doActiveWindow(XWindow xid)
|
||||
}
|
||||
|
||||
XCB->changeActiveWindow(xid);
|
||||
QTimer::singleShot(50, [&] {
|
||||
QTimer::singleShot(50, [xid] {
|
||||
XCB->restackWindow(xid);
|
||||
});
|
||||
}
|
||||
@ -629,6 +654,9 @@ void TaskManager::initSettings()
|
||||
connect(SETTING, &DockSettings::showRecentChanged, this, &TaskManager::onShowRecentChanged);
|
||||
connect(SETTING, &DockSettings::showMultiWindowChanged, this, &TaskManager::onShowMultiWindowChanged);
|
||||
connect(SETTING, &DockSettings::displayModeChanged, this, &TaskManager::setDisplayMode);
|
||||
connect(SETTING, &DockSettings::displayModeChanged, this, [this]() {
|
||||
Q_EMIT windowMarginChanged(windowMargin());
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
@ -849,7 +877,7 @@ Entry *TaskManager::getDockedEntryByDesktopFile(const QString &desktopFile)
|
||||
*/
|
||||
bool TaskManager::shouldHideOnSmartHideMode()
|
||||
{
|
||||
if (!m_activeWindow || m_ddeLauncherVisible || m_trayGridWidgetVisible)
|
||||
if (!m_activeWindow || m_ddeLauncherVisible || m_trayGridWidgetVisible || m_popupVisible)
|
||||
return false;
|
||||
|
||||
if (!m_isWayland) {
|
||||
@ -949,7 +977,7 @@ QVector<XWindow> TaskManager::getActiveWinGroup(XWindow xid)
|
||||
*/
|
||||
void TaskManager::updateHideState(bool delay)
|
||||
{
|
||||
if (m_ddeLauncherVisible || m_trayGridWidgetVisible) {
|
||||
if (preventDockAutoHide()) {
|
||||
setPropHideState(HideState::Show);
|
||||
return;
|
||||
}
|
||||
@ -1138,7 +1166,7 @@ void TaskManager::handleActiveWindowChanged(WindowInfoBase *info)
|
||||
m_activeWindow = info;
|
||||
XWindow winId = m_activeWindow->getXid();
|
||||
m_entries->handleActiveWindowChanged(winId);
|
||||
updateHideState(true);
|
||||
QTimer::singleShot(200, std::bind(&TaskManager::updateHideState, this, true));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1505,6 +1533,11 @@ void TaskManager::setPosition(int position)
|
||||
SETTING->setPositionMode(Position(position));
|
||||
}
|
||||
|
||||
uint TaskManager::windowMargin() const
|
||||
{
|
||||
return SETTING->getDisplayMode() == Dock::Efficient ? 0 : 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief TaskManager::getShowTimeout 获取显示超时接口
|
||||
* @return
|
||||
@ -1572,4 +1605,9 @@ void TaskManager::cancelPreviewWindow()
|
||||
bool TaskManager::showMultiWindow() const
|
||||
{
|
||||
return m_showMultiWindow;
|
||||
}
|
||||
}
|
||||
|
||||
bool TaskManager::preventDockAutoHide() const
|
||||
{
|
||||
return m_ddeLauncherVisible || m_popupVisible || m_trayGridWidgetVisible;
|
||||
}
|
||||
|
@ -41,6 +41,7 @@ public:
|
||||
bool shouldShowOnDock(WindowInfoBase *info);
|
||||
void setDdeLauncherVisible(bool visible);
|
||||
void setTrayGridWidgetVisible(bool visible);
|
||||
void setPopupVisible(bool visible);
|
||||
QString getWMName();
|
||||
void setWMName(QString name);
|
||||
void setPropHideState(HideState state);
|
||||
@ -86,6 +87,7 @@ public:
|
||||
void setIconSize(uint size);
|
||||
int getPosition();
|
||||
void setPosition(int position);
|
||||
uint windowMargin() const;
|
||||
uint getShowTimeout();
|
||||
void setShowTimeout(uint timeout);
|
||||
uint getWindowSizeEfficient();
|
||||
@ -127,6 +129,7 @@ public:
|
||||
|
||||
void previewWindow(uint xid);
|
||||
void cancelPreviewWindow();
|
||||
bool preventDockAutoHide() const;
|
||||
|
||||
Q_SIGNALS:
|
||||
void serviceRestarted();
|
||||
@ -136,6 +139,7 @@ Q_SIGNALS:
|
||||
void frontendWindowRectChanged(const QRect &dockRect);
|
||||
void showRecentChanged(bool);
|
||||
void showMultiWindowChanged(bool);
|
||||
void windowMarginChanged(uint);
|
||||
|
||||
public Q_SLOTS:
|
||||
void updateHideState(bool delay);
|
||||
@ -177,6 +181,7 @@ private:
|
||||
ForceQuitAppMode m_forceQuitAppStatus; // 强制退出应用状态
|
||||
bool m_ddeLauncherVisible;
|
||||
bool m_trayGridWidgetVisible;
|
||||
bool m_popupVisible;
|
||||
|
||||
Entries *m_entries; // 所有应用实例
|
||||
X11Manager *m_x11Manager; // X11窗口管理
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
#include <QDebug>
|
||||
#include <QThread>
|
||||
#include <qstandardpaths.h>
|
||||
#include <QDBusConnection>
|
||||
|
||||
#define XCB XCBUtils::instance()
|
||||
|
||||
@ -74,11 +74,28 @@ WindowIdentify::WindowIdentify(TaskManager *_taskmanager, QObject *parent)
|
||||
m_identifyWindowFuns << qMakePair(QString("FlatpakAppID"), &identifyWindowByFlatpakAppID);
|
||||
m_identifyWindowFuns << qMakePair(QString("CrxId"), &identifyWindowByCrxId);
|
||||
m_identifyWindowFuns << qMakePair(QString("Rule"), &identifyWindowByRule);
|
||||
m_identifyWindowFuns << qMakePair(QString("Bamf"), &identifyWindowByBamf);
|
||||
m_identifyWindowFuns << qMakePair(QString("Pid"), &identifyWindowByPid);
|
||||
m_identifyWindowFuns << qMakePair(QString("Scratch"), &identifyWindowByScratch);
|
||||
m_identifyWindowFuns << qMakePair(QString("GtkAppId"), &identifyWindowByGtkAppId);
|
||||
m_identifyWindowFuns << qMakePair(QString("WmClass"), &identifyWindowByWmClass);
|
||||
|
||||
// should remove bamf identify and turn to new AM
|
||||
auto *dbusWatcher = new QDBusServiceWatcher(QStringLiteral("org.ayatana.bamf"), QDBusConnection::sessionBus(),
|
||||
QDBusServiceWatcher::WatchForOwnerChange, this);
|
||||
|
||||
auto ifc = QDBusConnection::sessionBus().interface();
|
||||
|
||||
if (ifc->isServiceRegistered(QStringLiteral("org.ayatana.bamf"))) {
|
||||
m_identifyWindowFuns << qMakePair(QString("Bamf"), &identifyWindowByBamf);
|
||||
}
|
||||
|
||||
connect(dbusWatcher, &QDBusServiceWatcher::serviceRegistered, this, [this](){
|
||||
m_identifyWindowFuns << qMakePair(QString("Bamf"), &identifyWindowByBamf);
|
||||
});
|
||||
|
||||
connect(dbusWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this](){
|
||||
m_identifyWindowFuns.removeAll(qMakePair(QString("Bamf"), &identifyWindowByBamf));
|
||||
});
|
||||
}
|
||||
|
||||
AppInfo *WindowIdentify::identifyWindow(WindowInfoBase *winInfo, QString &innerId)
|
||||
|
@ -44,13 +44,13 @@ AbstractPluginsController::~AbstractPluginsController()
|
||||
void AbstractPluginsController::startLoader(PluginLoader *loader)
|
||||
{
|
||||
connect(loader, &PluginLoader::finished, loader, &PluginLoader::deleteLater, Qt::QueuedConnection);
|
||||
connect(loader, &PluginLoader::pluginFounded, this, [ = ](const QString &pluginFile) {
|
||||
connect(loader, &PluginLoader::pluginFound, this, [ = ](const QString &pluginFile) {
|
||||
QPair<QString, PluginsItemInterface *> pair;
|
||||
pair.first = pluginFile;
|
||||
pair.second = nullptr;
|
||||
m_pluginLoadMap.insert(pair, false);
|
||||
});
|
||||
connect(loader, &PluginLoader::pluginFounded, this, &AbstractPluginsController::loadPlugin, Qt::QueuedConnection);
|
||||
connect(loader, &PluginLoader::pluginFound, this, &AbstractPluginsController::loadPlugin, Qt::QueuedConnection);
|
||||
|
||||
int delay = Utils::SettingValue("com.deepin.dde.dock", "/com/deepin/dde/dock/", "delay-plugins-time", 0).toInt();
|
||||
QTimer::singleShot(delay, loader, [ = ] { loader->start(QThread::LowestPriority); });
|
||||
@ -137,9 +137,7 @@ void AbstractPluginsController::loadPlugin(const QString &pluginFile)
|
||||
// NOTE(justforlxz): 插件的所有初始化工作都在init函数中进行,
|
||||
// loadPlugin函数是按队列执行的,initPlugin函数会有可能导致
|
||||
// 函数执行被阻塞。
|
||||
QTimer::singleShot(1, this, [ = ] {
|
||||
initPlugin(interface);
|
||||
});
|
||||
QMetaObject::invokeMethod(this, std::bind(&AbstractPluginsController::initPlugin, this, interface), Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
void AbstractPluginsController::initPlugin(PluginsItemInterface *interface)
|
||||
|
@ -9,6 +9,7 @@
|
||||
#include "dbusutil.h"
|
||||
#include "dockscreen.h"
|
||||
#include "displaymanager.h"
|
||||
#include "taskmanager/taskmanager.h"
|
||||
|
||||
#include <QScreen>
|
||||
#include <QApplication>
|
||||
@ -77,7 +78,7 @@ void DockPopupWindow::setContent(QWidget *content)
|
||||
m_lastWidget = content;
|
||||
content->setParent(this);
|
||||
content->show();
|
||||
resize(content->sizeHint());
|
||||
setFixedSize(content->sizeHint());
|
||||
}
|
||||
|
||||
void DockPopupWindow::setExtendWidget(QWidget *widget)
|
||||
@ -141,7 +142,7 @@ void DockPopupWindow::show(const int x, const int y)
|
||||
displayPoint.setX(qMin(screenRect.x() + screenRect.width() - getContent()->width(), displayPoint.x()));
|
||||
}
|
||||
move(displayPoint);
|
||||
resize(m_lastWidget->size());
|
||||
setFixedSize(m_lastWidget->size());
|
||||
DBlurEffectWidget::show();
|
||||
activateWindow();
|
||||
}
|
||||
@ -172,12 +173,14 @@ void DockPopupWindow::showEvent(QShowEvent *e)
|
||||
Utils::updateCursor(this);
|
||||
}
|
||||
|
||||
TaskManager::instance()->setPopupVisible(true);
|
||||
QTimer::singleShot(1, this, &DockPopupWindow::ensureRaised);
|
||||
}
|
||||
|
||||
void DockPopupWindow::hideEvent(QHideEvent *event)
|
||||
{
|
||||
m_extendWidget = nullptr;
|
||||
TaskManager::instance()->setPopupVisible(false);
|
||||
Dtk::Widget::DBlurEffectWidget::hideEvent(event);
|
||||
}
|
||||
|
||||
@ -208,6 +211,7 @@ bool DockPopupWindow::eventFilter(QObject *o, QEvent *e)
|
||||
}
|
||||
break;
|
||||
}
|
||||
case QEvent::WindowDeactivate:
|
||||
case QEvent::Hide: {
|
||||
this->hide();
|
||||
break;
|
||||
@ -248,7 +252,7 @@ void DockPopupWindow::onButtonPress(int type, int x, int y, const QString &key)
|
||||
// if there is something focus on widget, return
|
||||
if (auto focus = qApp->focusWidget()) {
|
||||
auto className = QString(focus->metaObject()->className());
|
||||
qDebug() << "Find focused widget, focus className is" << className;
|
||||
//qDebug() << "Find focused widget, focus className is" << className;
|
||||
if (className == "QLineEdit") {
|
||||
qDebug() << "PopupWindow window will not be hidden";
|
||||
return;
|
||||
|
@ -46,9 +46,9 @@ void DockSettings::init()
|
||||
} else if ( key == keyQuickPlugins) {
|
||||
Q_EMIT quickPluginsChanged(m_dockSettings->value(keyQuickPlugins).toStringList());
|
||||
} else if ( key == keyWindowSizeFashion) {
|
||||
Q_EMIT windowSizeFashionChanged(m_dockSettings->value(keyWindowSizeFashion).toUInt());
|
||||
Q_EMIT windowSizeFashionChanged(m_dockSettings->value(keyWindowSizeFashion, 48).toUInt());
|
||||
} else if ( key == keyWindowSizeEfficient) {
|
||||
Q_EMIT windowSizeEfficientChanged(m_dockSettings->value(keyWindowSizeEfficient).toUInt());
|
||||
Q_EMIT windowSizeEfficientChanged(m_dockSettings->value(keyWindowSizeEfficient, 40).toUInt());
|
||||
}
|
||||
});
|
||||
}
|
||||
@ -176,7 +176,7 @@ uint DockSettings::getWindowSizeEfficient()
|
||||
{
|
||||
uint size = 40;
|
||||
if (m_dockSettings) {
|
||||
size = m_dockSettings->value(keyWindowSizeEfficient).toUInt();
|
||||
size = m_dockSettings->value(keyWindowSizeEfficient, size).toUInt();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
@ -192,7 +192,7 @@ uint DockSettings::getWindowSizeFashion()
|
||||
{
|
||||
uint size = 48;
|
||||
if (m_dockSettings) {
|
||||
size = m_dockSettings->value(keyWindowSizeFashion).toUInt();
|
||||
size = m_dockSettings->value(keyWindowSizeFashion, size).toUInt();
|
||||
}
|
||||
return size;
|
||||
}
|
||||
|
@ -4,7 +4,9 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "multiscreenworker.h"
|
||||
#include "constants.h"
|
||||
#include "mainwindow.h"
|
||||
#include "taskmanager/taskmanager.h"
|
||||
#include "utils.h"
|
||||
#include "displaymanager.h"
|
||||
#include "traymainwindow.h"
|
||||
@ -102,6 +104,10 @@ void MultiScreenWorker::onRegionMonitorChanged(int x, int y, const QString &key)
|
||||
if (m_registerKey != key || testState(MousePress))
|
||||
return;
|
||||
|
||||
if (m_hideMode == HideMode::KeepHidden) {
|
||||
TaskManager::instance()->setPropHideState(HideState::Show);
|
||||
}
|
||||
|
||||
tryToShowDock(x, y);
|
||||
}
|
||||
|
||||
@ -122,6 +128,10 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString
|
||||
// 鼠标移动到任务栏界面之外,停止计时器(延时2秒改变任务栏所在屏幕)
|
||||
m_delayWakeTimer->stop();
|
||||
|
||||
if (m_hideMode == HideMode::KeepHidden && !TaskManager::instance()->preventDockAutoHide()) {
|
||||
TaskManager::instance()->setPropHideState(HideState::Hide);
|
||||
}
|
||||
|
||||
if (m_hideMode == HideMode::KeepShowing
|
||||
|| ((m_hideMode == HideMode::KeepHidden || m_hideMode == HideMode::SmartHide) && m_hideState == HideState::Show)) {
|
||||
Q_EMIT requestPlayAnimation(DOCK_SCREEN->current(), m_position, Dock::AniAction::Show);
|
||||
@ -132,6 +142,7 @@ void MultiScreenWorker::onExtralRegionMonitorChanged(int x, int y, const QString
|
||||
|
||||
void MultiScreenWorker::updateDisplay()
|
||||
{
|
||||
tryToHideDock();
|
||||
//1、屏幕停靠信息,
|
||||
//2、任务栏当前显示在哪个屏幕也需要更新
|
||||
//3、任务栏高度或宽度调整的拖拽区域,
|
||||
@ -181,6 +192,7 @@ void MultiScreenWorker::onPositionChanged(int position)
|
||||
qDebug() << "position change from: " << lastPos << " to: " << position;
|
||||
#endif
|
||||
m_position = static_cast<Position>(position);
|
||||
DockItem::setDockPosition(m_position);
|
||||
|
||||
if (m_hideMode == HideMode::KeepHidden || (m_hideMode == HideMode::SmartHide && m_hideState == HideState::Hide)) {
|
||||
// 这种情况切换位置,任务栏不需要显示
|
||||
@ -192,10 +204,11 @@ void MultiScreenWorker::onPositionChanged(int position)
|
||||
// 更新当前屏幕信息,下次显示从目标屏幕显示
|
||||
DOCK_SCREEN->updateDockedScreen(getValidScreen(m_position));
|
||||
// 需要更新frontendWindowRect接口数据,否则会造成HideState属性值不变
|
||||
emit requestUpdateFrontendGeometry();
|
||||
Q_EMIT requestUpdateFrontendGeometry();
|
||||
Q_EMIT positionChanged(m_position);
|
||||
} else {
|
||||
// 一直显示的模式才需要显示
|
||||
emit requestUpdatePosition(lastPos, m_position);
|
||||
Q_EMIT requestUpdatePosition(lastPos, m_position);
|
||||
}
|
||||
}
|
||||
|
||||
@ -409,7 +422,7 @@ void MultiScreenWorker::onRequestUpdateRegionMonitor()
|
||||
}
|
||||
|
||||
// 触屏监控高度固定调整为最大任务栏高度100+任务栏与屏幕边缘间距
|
||||
const int monitHeight = 100 + WINDOWMARGIN;
|
||||
const int monitHeight = 100 + WINDOWMARGIN * qApp->devicePixelRatio();
|
||||
|
||||
// 任务栏触屏唤起区域
|
||||
m_touchRectList.clear();
|
||||
@ -537,7 +550,7 @@ void MultiScreenWorker::onRequestDelayShowDock()
|
||||
|
||||
void MultiScreenWorker::initMembers()
|
||||
{
|
||||
m_monitorUpdateTimer->setInterval(100);
|
||||
m_monitorUpdateTimer->setInterval(1000);
|
||||
m_monitorUpdateTimer->setSingleShot(true);
|
||||
|
||||
m_delayWakeTimer->setSingleShot(true);
|
||||
@ -891,7 +904,6 @@ void MultiScreenWorker::onDelayAutoHideChanged()
|
||||
*/
|
||||
void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
|
||||
{
|
||||
DockItem::setDockPosition(m_position);
|
||||
if (qApp->property("DRAG_STATE").toBool() || testState(ChangePositionAnimationStart)) {
|
||||
qWarning() << "dock is draging or animation is running";
|
||||
return;
|
||||
@ -946,3 +958,16 @@ void MultiScreenWorker::tryToShowDock(int eventX, int eventY)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MultiScreenWorker::tryToHideDock()
|
||||
{
|
||||
if (hideMode() == HideMode::KeepShowing) {
|
||||
return;
|
||||
}
|
||||
|
||||
auto mousePos = QCursor::pos();
|
||||
const QString ¤tScreen = DOCK_SCREEN->current();
|
||||
if (isCursorOut(mousePos.x(), mousePos.y())) {
|
||||
Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Hide);
|
||||
}
|
||||
}
|
||||
|
@ -21,7 +21,7 @@
|
||||
#include <QObject>
|
||||
#include <QFlag>
|
||||
|
||||
#define WINDOWMARGIN ((m_displayMode == Dock::Efficient) ? 0 : 10)
|
||||
#define WINDOWMARGIN ((m_displayMode == Dock::Efficient) ? 0 : 5)
|
||||
#define ANIMATIONTIME 300
|
||||
#define FREE_POINT(p) if (p) {\
|
||||
delete p;\
|
||||
@ -153,6 +153,7 @@ private:
|
||||
void reInitDisplayData();
|
||||
|
||||
void tryToShowDock(int eventX, int eventY);
|
||||
void tryToHideDock();
|
||||
void changeDockPosition(QString fromScreen, QString toScreen, const Position &fromPos, const Position &toPos);
|
||||
|
||||
void resetDockScreen();
|
||||
|
@ -59,7 +59,7 @@ void PluginLoader::run()
|
||||
}
|
||||
|
||||
for (auto plugin : plugins) {
|
||||
emit pluginFounded(pluginsDir.absoluteFilePath(plugin));
|
||||
emit pluginFound(pluginsDir.absoluteFilePath(plugin));
|
||||
}
|
||||
|
||||
emit finished();
|
||||
|
@ -17,7 +17,7 @@ public:
|
||||
|
||||
signals:
|
||||
void finished() const;
|
||||
void pluginFounded(const QString &pluginFile) const;
|
||||
void pluginFound(const QString &pluginFile) const;
|
||||
|
||||
protected:
|
||||
void run();
|
||||
|
@ -1,4 +1,4 @@
|
||||
// Copyright (C) 2022 ~ 2022 Deepin Technology Co., Ltd.
|
||||
// Copyright (C) 2022 ~ 2023 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
@ -12,6 +12,7 @@
|
||||
#include <DFontSizeManager>
|
||||
#include <DDBusSender>
|
||||
#include <DGuiApplicationHelper>
|
||||
#include <DConfig>
|
||||
|
||||
#include <QHBoxLayout>
|
||||
#include <QPainter>
|
||||
@ -31,6 +32,12 @@ static QMap<int, QString> dateFormat{{ 0,"yyyy/M/d" }, { 1,"yyyy-M-d" }, { 2,"yy
|
||||
{ 4,"yyyy-MM-dd" }, { 5,"yyyy.MM.dd" }, { 6,"yy/M/d" }, { 7,"yy-M-d" }, { 8,"yy.M.d" }};
|
||||
static QMap<int, QString> timeFormat{{0, "h:mm"}, {1, "hh:mm"}};
|
||||
|
||||
const QString localeName_key = "localeName";
|
||||
const QString shortDateFormat_key = "shortDateFormat";
|
||||
const QString shortTimeFormat_key = "shortTimeFormat";
|
||||
const QString longDateFormat_key = "longDateFormat";
|
||||
const QString longTimeFormat_key = "longTimeFormat";
|
||||
|
||||
DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent)
|
||||
: QWidget (parent)
|
||||
, m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this))
|
||||
@ -43,6 +50,7 @@ DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent)
|
||||
, m_currentSize(0)
|
||||
, m_oneRow(false)
|
||||
, m_showMultiRow(showMultiRow)
|
||||
, m_config(DTK_CORE_NAMESPACE::DConfig::createGeneric("org.deepin.region-format", QString(), this))
|
||||
{
|
||||
m_tipPopupWindow.reset(new DockPopupWindow);
|
||||
// 日期格式变化的时候,需要重绘
|
||||
@ -63,6 +71,62 @@ DateTimeDisplayer::DateTimeDisplayer(bool showMultiRow, QWidget *parent)
|
||||
if (Utils::IS_WAYLAND_DISPLAY)
|
||||
m_tipPopupWindow->setWindowFlags(m_tipPopupWindow->windowFlags() | Qt::FramelessWindowHint);
|
||||
m_tipPopupWindow->hide();
|
||||
|
||||
m_locale = QLocale::system();
|
||||
initDConfig();
|
||||
}
|
||||
|
||||
void DateTimeDisplayer::initDConfig()
|
||||
{
|
||||
QLocale currentLocale = QLocale::system();
|
||||
if (!m_config->isValid())
|
||||
return;
|
||||
|
||||
if (!m_config->isDefaultValue(localeName_key)) {
|
||||
m_locale = QLocale(m_config->value(localeName_key).toString());
|
||||
} else {
|
||||
m_locale = currentLocale;
|
||||
}
|
||||
|
||||
if (!m_config->isDefaultValue(shortDateFormat_key)) {
|
||||
m_shortDateFormatStr = m_config->value(shortDateFormat_key).toString();
|
||||
} else {
|
||||
m_shortDateFormatStr = currentLocale.dateFormat(QLocale::ShortFormat);
|
||||
}
|
||||
|
||||
if (!m_config->isDefaultValue(shortDateFormat_key)) {
|
||||
m_longDateFormatStr = m_config->value(longDateFormat_key).toString();
|
||||
} else {
|
||||
m_longDateFormatStr = currentLocale.dateFormat(QLocale::LongFormat);
|
||||
}
|
||||
|
||||
if (!m_config->isDefaultValue(shortTimeFormat_key)) {
|
||||
m_shortTimeFormatStr = m_config->value(shortTimeFormat_key).toString();
|
||||
} else {
|
||||
m_shortTimeFormatStr = currentLocale.timeFormat(QLocale::ShortFormat);
|
||||
}
|
||||
|
||||
if (!m_config->isDefaultValue(longTimeFormat_key)) {
|
||||
m_longTimeFormatStr = m_config->value(longTimeFormat_key).toString();
|
||||
} else {
|
||||
m_longTimeFormatStr = currentLocale.timeFormat(QLocale::LongFormat);
|
||||
}
|
||||
|
||||
connect(m_config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this] (const QString &key) {
|
||||
if (key == shortDateFormat_key) {
|
||||
m_shortDateFormatStr = m_config->value(key).toString();
|
||||
} else if (key == shortTimeFormat_key) {
|
||||
m_shortTimeFormatStr = m_config->value(key).toString();
|
||||
} else if (key == localeName_key) {
|
||||
m_locale = QLocale(m_config->value(key).toString());
|
||||
} else if (key == longDateFormat_key) {
|
||||
m_longDateFormatStr = m_config->value(key).toString();
|
||||
} else if (key == longTimeFormat_key) {
|
||||
m_longTimeFormatStr = m_config->value(key).toString();
|
||||
}
|
||||
|
||||
update();
|
||||
});
|
||||
}
|
||||
|
||||
DateTimeDisplayer::~DateTimeDisplayer()
|
||||
@ -134,10 +198,10 @@ void DateTimeDisplayer::mouseReleaseEvent(QMouseEvent *event)
|
||||
{
|
||||
Q_UNUSED(event);
|
||||
|
||||
DDBusSender().service("org.deepin.dde.Widgets1")
|
||||
.path("/org/deepin/dde/Widgets1")
|
||||
.interface("org.deepin.dde.Widgets1")
|
||||
.method("Toggle").call();
|
||||
DDBusSender().service("com.deepin.Calendar")
|
||||
.path("/com/deepin/Calendar")
|
||||
.interface("com.deepin.Calendar")
|
||||
.method("RaiseWindow").call();
|
||||
}
|
||||
|
||||
QString DateTimeDisplayer::getTimeString(const Dock::Position &position) const
|
||||
@ -145,15 +209,10 @@ QString DateTimeDisplayer::getTimeString(const Dock::Position &position) const
|
||||
QString tFormat = QString("hh:mm");
|
||||
if (timeFormat.contains(m_shortDateFormat))
|
||||
tFormat = timeFormat[m_shortDateFormat];
|
||||
if (!m_shortTimeFormatStr.isEmpty())
|
||||
tFormat = m_shortTimeFormatStr;
|
||||
|
||||
if (!m_use24HourFormat) {
|
||||
if (position == Dock::Top || position == Dock::Bottom)
|
||||
tFormat = tFormat.append(" AP");
|
||||
else
|
||||
tFormat = tFormat.append("\nAP");
|
||||
}
|
||||
|
||||
return QDateTime::currentDateTime().toString(tFormat);
|
||||
return m_locale.toString(QDateTime::currentDateTime(), tFormat);
|
||||
}
|
||||
|
||||
QString DateTimeDisplayer::getDateString() const
|
||||
@ -166,9 +225,12 @@ QString DateTimeDisplayer::getDateString(const Dock::Position &position) const
|
||||
QString shortDateFormat = "yyyy-MM-dd";
|
||||
if (dateFormat.contains(m_shortDateFormat))
|
||||
shortDateFormat = dateFormat.value(m_shortDateFormat);
|
||||
if (!m_shortDateFormatStr.isEmpty())
|
||||
shortDateFormat = m_shortDateFormatStr;
|
||||
// 如果是左右方向,则不显示年份
|
||||
if (position == Dock::Position::Left || position == Dock::Position::Right) {
|
||||
static QStringList yearStrList{"yyyy/", "yyyy-", "yyyy.", "yy/", "yy-", "yy."};
|
||||
static QStringList yearStrList{"yyyy/", "/yyyy", "yyyy-", "-yyyy", "yyyy.", ".yyyy",
|
||||
"yy/", "/yy", "yy-", "-yy", "yy.", ".yy"};
|
||||
for (int i = 0; i < yearStrList.size() ; i++) {
|
||||
const QString &yearStr = yearStrList[i];
|
||||
if (shortDateFormat.contains(yearStr)) {
|
||||
@ -178,7 +240,7 @@ QString DateTimeDisplayer::getDateString(const Dock::Position &position) const
|
||||
}
|
||||
}
|
||||
|
||||
return QDateTime::currentDateTime().toString(shortDateFormat);
|
||||
return m_locale.toString(QDateTime::currentDateTime(), shortDateFormat);
|
||||
}
|
||||
|
||||
DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Position &position) const
|
||||
@ -190,11 +252,6 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi
|
||||
info.m_time = getTimeString(position);
|
||||
info.m_date = getDateString(position);
|
||||
|
||||
if (m_showMultiRow && m_dateFont.pixelSize() + m_timeFont.pixelSize() > height() - 8) {
|
||||
m_dateFont.setPixelSize(height() / 2 - 5);
|
||||
m_timeFont.setPixelSize(height() / 2 - 3);
|
||||
}
|
||||
|
||||
// 如果是左右方向
|
||||
if (position == Dock::Position::Left || position == Dock::Position::Right) {
|
||||
int textWidth = rect().width();
|
||||
@ -238,12 +295,7 @@ DateTimeDisplayer::DateTimeInfo DateTimeDisplayer::dateTimeInfo(const Dock::Posi
|
||||
|
||||
void DateTimeDisplayer::onTimeChanged()
|
||||
{
|
||||
const QDateTime currentDateTime = QDateTime::currentDateTime();
|
||||
|
||||
if (m_use24HourFormat)
|
||||
m_tipsWidget->setText(QLocale().toString(currentDateTime.date()) + currentDateTime.toString(" HH:mm:ss"));
|
||||
else
|
||||
m_tipsWidget->setText(QLocale().toString(currentDateTime.date()) + currentDateTime.toString(" hh:mm:ss AP"));
|
||||
m_tipsWidget->setText(m_locale.toString(QDate::currentDate(), m_longDateFormatStr) + QString(" ") + m_locale.toString(QTime::currentTime(), m_longTimeFormatStr));
|
||||
|
||||
// 如果时间和日期有一个不等,则实时刷新界面
|
||||
if (m_lastDateString != getDateString() || m_lastTimeString != getTimeString())
|
||||
@ -252,14 +304,9 @@ void DateTimeDisplayer::onTimeChanged()
|
||||
|
||||
void DateTimeDisplayer::onDateTimeFormatChanged()
|
||||
{
|
||||
int lastSize = m_currentSize;
|
||||
m_shortDateFormat = m_timedateInter->shortDateFormat();
|
||||
m_use24HourFormat = m_timedateInter->use24HourFormat();
|
||||
// 此处需要强制重绘,因为在重绘过程中才会改变m_currentSize信息,方便在后面判断是否需要调整尺寸
|
||||
repaint();
|
||||
// 如果日期时间的格式发生了变化,需要通知外部来调整日期时间的尺寸
|
||||
if (lastSize != m_currentSize)
|
||||
Q_EMIT requestUpdate();
|
||||
}
|
||||
|
||||
void DateTimeDisplayer::paintEvent(QPaintEvent *e)
|
||||
@ -270,7 +317,6 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
|
||||
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
|
||||
|
||||
int timeAlignFlag = Qt::AlignCenter;
|
||||
int dateAlignFlag = Qt::AlignCenter;
|
||||
@ -353,17 +399,6 @@ void DateTimeDisplayer::updateFont() const
|
||||
|
||||
void DateTimeDisplayer::createMenuItem()
|
||||
{
|
||||
QAction *timeFormatAction = new QAction(this);
|
||||
timeFormatAction->setText(m_use24HourFormat ? tr("12-hour time"): tr("24-hour time"));
|
||||
|
||||
connect(timeFormatAction, &QAction::triggered, this, [ = ] {
|
||||
bool use24hourformat = !m_use24HourFormat;
|
||||
// 此时调用 dbus 更新时间格式但是本地 m_use24HourFormat 未更新,所以需要使用新变量,设置新格式
|
||||
m_timedateInter->setUse24HourFormat(use24hourformat);
|
||||
timeFormatAction->setText(use24hourformat ? tr("12-hour time") : tr("24-hour time"));
|
||||
});
|
||||
m_menu->addAction(timeFormatAction);
|
||||
|
||||
if (!QFile::exists(ICBC_CONF_FILE)) {
|
||||
QAction *timeSettingAction = new QAction(tr("Time settings"), this);
|
||||
connect(timeSettingAction, &QAction::triggered, this, [ = ] {
|
||||
@ -416,6 +451,7 @@ QString DateTimeDisplayer::getTimeString() const
|
||||
|
||||
void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
|
||||
{
|
||||
int lastSize = m_currentSize;
|
||||
m_lastDateString = info.m_date;
|
||||
m_lastTimeString = info.m_time;
|
||||
QSize dateTimeSize = suitableSize();
|
||||
@ -423,6 +459,9 @@ void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
|
||||
m_currentSize = dateTimeSize.width();
|
||||
else
|
||||
m_currentSize = dateTimeSize.height();
|
||||
// 如果日期时间的格式发生了变化,需要通知外部来调整日期时间的尺寸
|
||||
if (lastSize != m_currentSize)
|
||||
Q_EMIT requestUpdate();
|
||||
}
|
||||
|
||||
bool DateTimeDisplayer::event(QEvent *event)
|
||||
|
@ -13,10 +13,15 @@
|
||||
#include <QWidget>
|
||||
#include <QFont>
|
||||
|
||||
#include <dtkcore_global.h>
|
||||
|
||||
namespace Dock { class TipsWidget; }
|
||||
|
||||
class DockPopupWindow;
|
||||
class QMenu;
|
||||
DCORE_BEGIN_NAMESPACE
|
||||
class DConfig;
|
||||
DCORE_END_NAMESPACE
|
||||
|
||||
using Timedate = org::deepin::dde::Timedate1;
|
||||
|
||||
@ -67,6 +72,7 @@ private:
|
||||
|
||||
void createMenuItem();
|
||||
QRect textRect(const QRect &sourceRect) const;
|
||||
void initDConfig();
|
||||
|
||||
private Q_SLOTS:
|
||||
void onTimeChanged();
|
||||
@ -87,7 +93,12 @@ private:
|
||||
bool m_oneRow;
|
||||
bool m_showMultiRow;
|
||||
int m_shortDateFormat;
|
||||
bool m_use24HourFormat;
|
||||
DTK_CORE_NAMESPACE::DConfig *m_config;
|
||||
QString m_shortDateFormatStr;
|
||||
QString m_shortTimeFormatStr;
|
||||
QString m_longDateFormatStr;
|
||||
QString m_longTimeFormatStr;
|
||||
QLocale m_locale;
|
||||
};
|
||||
|
||||
#endif // DATETIMEDISPLAYER_H
|
||||
|
@ -73,9 +73,11 @@ void DockTrayWindow::setDisplayMode(const Dock::DisplayMode &displayMode)
|
||||
if (displayMode == Dock::DisplayMode::Efficient) {
|
||||
ExpandIconWidget::popupTrayView()->setReferGridView(m_trayView);
|
||||
// TODO: reuse QuickPluginWindow, SystemPluginWindow
|
||||
m_mainBoxLayout->addWidget(TrayGridView::getDockTrayGridView());
|
||||
auto stretch = m_mainBoxLayout->takeAt(m_mainBoxLayout->count()-1);
|
||||
m_mainBoxLayout->addWidget(m_trayView);
|
||||
m_mainBoxLayout->addItem(stretch);
|
||||
} else {
|
||||
m_mainBoxLayout->removeWidget(TrayGridView::getDockTrayGridView());
|
||||
m_mainBoxLayout->removeWidget(m_trayView);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1097,7 +1097,7 @@ int MainPanelControl::trayAreaSize(qreal ratio) const
|
||||
length += (m_position == Dock::Position::Top || m_position == Dock::Position::Bottom ? topWindow->width() * ratio : topWindow->height() * ratio);
|
||||
}
|
||||
|
||||
length += topWindow->dockSpace() * ratio;
|
||||
length += topWindow->dockSpace();
|
||||
}
|
||||
|
||||
return length;
|
||||
|
@ -4,6 +4,7 @@
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "mainwindowbase.h"
|
||||
#include "constants.h"
|
||||
#include "dragwidget.h"
|
||||
#include "multiscreenworker.h"
|
||||
#include "dockscreen.h"
|
||||
@ -270,27 +271,30 @@ void MainWindowBase::resetDragWindow()
|
||||
if (!screen)
|
||||
return;
|
||||
|
||||
QRect currentRect = getDockGeometry(screen, position(), displayMode(), Dock::HideState::Show);
|
||||
if (m_multiScreenWorker->hideState() == Dock::HideState::Show) {
|
||||
QRect currentRect = getDockGeometry(screen, position(), displayMode(), Dock::HideState::Show);
|
||||
|
||||
// 这个时候屏幕有可能是隐藏的,不能直接使用this->width()这种去设置任务栏的高度,而应该保证原值
|
||||
int dockSize = 0;
|
||||
if (m_multiScreenWorker->position() == Position::Left
|
||||
|| m_multiScreenWorker->position() == Position::Right) {
|
||||
dockSize = this->width() == 0 ? currentRect.width() : this->width();
|
||||
} else {
|
||||
dockSize = this->height() == 0 ? currentRect.height() : this->height();
|
||||
// 这个时候屏幕有可能是隐藏的,不能直接使用this->width()这种去设置任务栏的高度,而应该保证原值
|
||||
int dockSize = 0;
|
||||
if (m_multiScreenWorker->position() == Position::Left
|
||||
|| m_multiScreenWorker->position() == Position::Right) {
|
||||
dockSize = this->width() == 0 ? currentRect.width() : this->width();
|
||||
} else {
|
||||
dockSize = this->height() == 0 ? currentRect.height() : this->height();
|
||||
}
|
||||
|
||||
/** FIX ME
|
||||
* 作用:限制dockSize的值在40~100之间。
|
||||
* 问题1:如果dockSize为39,会导致dock的mainwindow高度变成99,显示的内容高度却是39。
|
||||
* 问题2:dockSize的值在这里不应该为39,但在高分屏上开启缩放后,拉高任务栏操作会概率出现。
|
||||
* 暂时未分析出原因,后面再修改。
|
||||
*/
|
||||
dockSize = qBound(DOCK_MIN_SIZE, dockSize, DOCK_MAX_SIZE);
|
||||
|
||||
// 通知窗管和后端更新数据
|
||||
m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度
|
||||
}
|
||||
|
||||
/** FIX ME
|
||||
* 作用:限制dockSize的值在40~100之间。
|
||||
* 问题1:如果dockSize为39,会导致dock的mainwindow高度变成99,显示的内容高度却是39。
|
||||
* 问题2:dockSize的值在这里不应该为39,但在高分屏上开启缩放后,拉高任务栏操作会概率出现。
|
||||
* 暂时未分析出原因,后面再修改。
|
||||
*/
|
||||
dockSize = qBound(DOCK_MIN_SIZE, dockSize, DOCK_MAX_SIZE);
|
||||
|
||||
// 通知窗管和后端更新数据
|
||||
m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度
|
||||
m_multiScreenWorker->requestUpdateFrontendGeometry(); // 2.再更新任务栏位置,保证先1再2
|
||||
m_multiScreenWorker->requestNotifyWindowManager();
|
||||
m_multiScreenWorker->requestUpdateRegionMonitor(); // 界面发生变化,应更新监控区域
|
||||
@ -427,9 +431,9 @@ QRect MainWindowBase::getDockGeometry(QScreen *screen, const Dock::Position &pos
|
||||
}
|
||||
int y = 0;
|
||||
if (pos == Dock::Position::Top)
|
||||
y = (screenRect.y() + static_cast<int>(margin / ratio));
|
||||
y = (screenRect.y() + static_cast<int>(margin));
|
||||
else
|
||||
y = (screenRect.y() + static_cast<int>(screenRect.height() / ratio - margin / ratio)) - dockSize;
|
||||
y = (screenRect.y() + static_cast<int>(screenRect.height() / ratio - margin)) - dockSize;
|
||||
rect.setX(x);
|
||||
rect.setY(y);
|
||||
rect.setWidth(width);
|
||||
@ -447,9 +451,9 @@ QRect MainWindowBase::getDockGeometry(QScreen *screen, const Dock::Position &pos
|
||||
}
|
||||
int x = 0;
|
||||
if (pos == Dock::Position::Left)
|
||||
x = screenRect.x() + static_cast<int>(margin / ratio);
|
||||
x = screenRect.x() + static_cast<int>(margin);
|
||||
else
|
||||
x = screenRect.x() + static_cast<int>(screenRect.width() /ratio - margin / ratio) - dockSize;
|
||||
x = screenRect.x() + static_cast<int>(screenRect.width() /ratio - margin) - dockSize;
|
||||
|
||||
int y = screenRect.y() + static_cast<int>(((screenRect.height() / ratio) - totalSize) / 2);
|
||||
// 计算y坐标
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include <QGuiApplication>
|
||||
#include <QMenu>
|
||||
#include <QDragLeaveEvent>
|
||||
#include <algorithm>
|
||||
#include <QSize>
|
||||
|
||||
#define ITEMSIZE 22
|
||||
#define STARTSPACE 6
|
||||
@ -434,6 +436,7 @@ void QuickPluginWindow::onUpdatePlugin(PluginsItemInterface *itemInter, const Do
|
||||
|
||||
QuickDockItem *quickDockItem = getDockItemByPlugin(itemInter);
|
||||
if (quickDockItem) {
|
||||
quickDockItem->updateContextMenu();
|
||||
updateDockItemSize(quickDockItem);
|
||||
quickDockItem->update();
|
||||
}
|
||||
@ -706,7 +709,12 @@ void QuickDockItem::setPosition(Dock::Position position)
|
||||
if (m_mainLayout) {
|
||||
QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey);
|
||||
if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) {
|
||||
itemWidget->setFixedSize(suitableSize());
|
||||
auto size= suitableSize();
|
||||
if (pluginItem()->pluginName() == QStringLiteral("uosai")) {
|
||||
auto minSize = std::min(size.height(), size.width());
|
||||
size = QSize(minSize, minSize);
|
||||
}
|
||||
itemWidget->setFixedSize(size);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -829,29 +837,12 @@ void QuickDockItem::mousePressEvent(QMouseEvent *event)
|
||||
return QWidget::mousePressEvent(event);
|
||||
|
||||
if (m_contextMenu->actions().isEmpty()) {
|
||||
const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey);
|
||||
if (menuJson.isEmpty())
|
||||
return;
|
||||
|
||||
QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data());
|
||||
if (jsonDocument.isNull())
|
||||
return;
|
||||
|
||||
QJsonObject jsonMenu = jsonDocument.object();
|
||||
|
||||
QJsonArray jsonMenuItems = jsonMenu.value("items").toArray();
|
||||
for (auto item : jsonMenuItems) {
|
||||
QJsonObject itemObj = item.toObject();
|
||||
QAction *action = new QAction(itemObj.value("itemText").toString());
|
||||
action->setCheckable(itemObj.value("isCheckable").toBool());
|
||||
action->setChecked(itemObj.value("checked").toBool());
|
||||
action->setData(itemObj.value("itemId").toString());
|
||||
action->setEnabled(itemObj.value("isActive").toBool());
|
||||
m_contextMenu->addAction(action);
|
||||
}
|
||||
updateContextMenu();
|
||||
}
|
||||
|
||||
m_contextMenu->exec(QCursor::pos());
|
||||
if (!m_contextMenu->actions().isEmpty()) {
|
||||
m_contextMenu->exec(QCursor::pos());
|
||||
}
|
||||
}
|
||||
|
||||
void QuickDockItem::enterEvent(QEvent *event)
|
||||
@ -893,7 +884,13 @@ void QuickDockItem::showEvent(QShowEvent *event)
|
||||
QWidget *itemWidget = m_pluginItem->itemWidget(m_itemKey);
|
||||
if (itemWidget && m_mainLayout->indexOf(itemWidget) < 0) {
|
||||
itemWidget->show();
|
||||
itemWidget->setFixedSize(suitableSize());
|
||||
auto size= suitableSize();
|
||||
if (pluginItem()->pluginName() == QStringLiteral("uosai")) {
|
||||
auto minSize = std::min(size.height(), size.width());
|
||||
size = QSize(minSize, minSize);
|
||||
}
|
||||
itemWidget->setFixedSize(size);
|
||||
itemWidget->setFixedSize(size);
|
||||
m_mainLayout->addWidget(itemWidget);
|
||||
}
|
||||
}
|
||||
@ -1017,6 +1014,31 @@ int QuickDockItem::iconSize() const
|
||||
return 30;
|
||||
}
|
||||
|
||||
void QuickDockItem::updateContextMenu()
|
||||
{
|
||||
m_contextMenu->clear();
|
||||
const QString menuJson = m_pluginItem->itemContextMenu(m_itemKey);
|
||||
if (menuJson.isEmpty())
|
||||
return;
|
||||
|
||||
QJsonDocument jsonDocument = QJsonDocument::fromJson(menuJson.toLocal8Bit().data());
|
||||
if (jsonDocument.isNull())
|
||||
return;
|
||||
|
||||
QJsonObject jsonMenu = jsonDocument.object();
|
||||
|
||||
QJsonArray jsonMenuItems = jsonMenu.value("items").toArray();
|
||||
for (auto item : jsonMenuItems) {
|
||||
QJsonObject itemObj = item.toObject();
|
||||
QAction *action = new QAction(itemObj.value("itemText").toString());
|
||||
action->setCheckable(itemObj.value("isCheckable").toBool());
|
||||
action->setChecked(itemObj.value("checked").toBool());
|
||||
action->setData(itemObj.value("itemId").toString());
|
||||
action->setEnabled(itemObj.value("isActive").toBool());
|
||||
m_contextMenu->addAction(action);
|
||||
}
|
||||
}
|
||||
|
||||
QPoint QuickDockItem::topleftPoint() const
|
||||
{
|
||||
QPoint p = this->pos();
|
||||
@ -1068,5 +1090,5 @@ QPoint QuickDockItem::popupMarkPoint() const
|
||||
|
||||
void QuickDockItem::onMenuActionClicked(QAction *action)
|
||||
{
|
||||
m_pluginItem->invokedMenuItem(m_itemKey, action->data().toString(), true);
|
||||
m_pluginItem->invokedMenuItem(m_itemKey, action->data().toString(), action->isCheckable() ? action->isChecked() : true);
|
||||
}
|
||||
|
@ -95,6 +95,7 @@ public:
|
||||
bool canInsert() const;
|
||||
bool canMove() const;
|
||||
void hideToolTip();
|
||||
void updateContextMenu();
|
||||
|
||||
QSize suitableSize() const;
|
||||
|
||||
|
@ -19,7 +19,6 @@
|
||||
#include <QApplication>
|
||||
#include <QDebug>
|
||||
#include <QTimer>
|
||||
#include <qwidget.h>
|
||||
|
||||
TrayGridView *TrayGridView::getDockTrayGridView(QWidget *parent)
|
||||
{
|
||||
@ -52,7 +51,12 @@ TrayGridView::TrayGridView(QWidget *parent)
|
||||
|
||||
void TrayGridView::setPosition(Dock::Position position)
|
||||
{
|
||||
if (m_positon == position) {
|
||||
return;
|
||||
}
|
||||
m_positon = position;
|
||||
setOrientation(m_positon == Dock::Position::Top || m_positon == Dock::Position::Bottom ?
|
||||
QListView::Flow::LeftToRight : QListView::Flow::TopToBottom, false);
|
||||
}
|
||||
|
||||
Dock::Position TrayGridView::position() const
|
||||
@ -325,7 +329,7 @@ void TrayGridView::dragLeaveEvent(QDragLeaveEvent *e)
|
||||
{
|
||||
m_aniStartTime->stop();
|
||||
e->accept();
|
||||
dragLeaved();
|
||||
Q_EMIT dragLeaved();
|
||||
}
|
||||
|
||||
void TrayGridView::dragMoveEvent(QDragMoveEvent *e)
|
||||
@ -450,6 +454,15 @@ void TrayGridView::handleDropEvent(QDropEvent *e)
|
||||
e->ignore();
|
||||
DListView::dropEvent(e);
|
||||
}
|
||||
// 拖拽行为后会自动关闭Edtor,导致托盘图标消失
|
||||
QMetaObject::invokeMethod(this, [&] {
|
||||
for (int i = 0; i < model()->rowCount(); i++) {
|
||||
QModelIndex index = model()->index(i, 0);
|
||||
if(!isPersistentEditorOpen(index)) {
|
||||
openPersistentEditor(index);
|
||||
}
|
||||
}
|
||||
}, Qt::QueuedConnection);
|
||||
}
|
||||
|
||||
void TrayGridView::onUpdateEditorView()
|
||||
@ -462,7 +475,7 @@ void TrayGridView::onUpdateEditorView()
|
||||
// 因为closePersistentEditor后,异步删除QWidget,在关闭后,如果立即调用openPersistentEditor,在删除的时候,会把
|
||||
// 通过openPersistentEditor新建的QWidget给删除,引起bug,因此,在所有的都closePersistentEditor后,异步来调用
|
||||
// openPersistentEditor就不会出现这种问题
|
||||
QMetaObject::invokeMethod(this, [ = ] {
|
||||
QMetaObject::invokeMethod(this, [&] {
|
||||
for (int i = 0; i < model()->rowCount(); i++) {
|
||||
QModelIndex index = model()->index(i, 0);
|
||||
openPersistentEditor(index);
|
||||
|
@ -67,7 +67,7 @@ TrayModel::TrayModel(bool isIconTray, QObject *parent)
|
||||
connect(m_monitor, &TrayMonitor::systemTrayRemoved, this, &TrayModel::onSystemTrayRemoved);
|
||||
|
||||
connect(m_monitor, &TrayMonitor::requestUpdateIcon, this, &TrayModel::requestUpdateIcon);
|
||||
connect(DockSettings::instance(), &DockSettings::quickPluginsChanged, this, &TrayModel::onSettingChanged);
|
||||
connect(DockSettings::instance(), &DockSettings::quickTrayNameChanged, this, &TrayModel::onSettingChanged);
|
||||
|
||||
m_fixedTrayNames = DockSettings::instance()->getTrayItemsOnDock();
|
||||
m_fixedTrayNames.removeDuplicates();
|
||||
@ -449,7 +449,7 @@ void TrayModel::removeWinInfo(WinInfo winInfo)
|
||||
}
|
||||
}
|
||||
|
||||
bool TrayModel::inTrayConfig(const QString itemKey) const
|
||||
bool TrayModel::inTrayConfig(const QString &itemKey) const
|
||||
{
|
||||
if (m_isTrayIcon) {
|
||||
// 如果是托盘区域,显示所有不在配置中的应用
|
||||
@ -575,15 +575,13 @@ void TrayModel::onSniTrayRemoved(const QString &servicePath)
|
||||
|
||||
// 如果为输入法,则无需立刻删除,等100毫秒后再观察是否会删除输入法(因为在100毫秒内如果是切换输入法,就会很快发送add信号)
|
||||
if (info.isTypeWriting) {
|
||||
QTimer::singleShot(100, this, [ servicePath, this ] {
|
||||
for (WinInfo info : m_winInfos) {
|
||||
if (info.servicePath == servicePath) {
|
||||
int index = m_winInfos.indexOf(info);
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
m_winInfos.removeOne(info);
|
||||
endRemoveRows();
|
||||
}
|
||||
}
|
||||
QTimer::singleShot(100, this, [ info, this ] {
|
||||
int index = m_winInfos.indexOf(info);
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
m_winInfos.removeOne(info);
|
||||
endRemoveRows();
|
||||
|
||||
Q_EMIT rowCountChanged();
|
||||
});
|
||||
} else {
|
||||
beginRemoveRows(QModelIndex(), index, index);
|
||||
|
@ -141,7 +141,7 @@ private:
|
||||
QString fileNameByServiceName(const QString &serviceName) const;
|
||||
bool isTypeWriting(const QString &servicePath) const;
|
||||
|
||||
bool inTrayConfig(const QString itemKey) const;
|
||||
bool inTrayConfig(const QString &itemKey) const;
|
||||
QString xembedItemKey(quint32 winId) const;
|
||||
bool xembedCanExport(quint32 winId) const;
|
||||
QString sniItemKey(const QString &servicePath) const;
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "tray_monitor.h"
|
||||
#include "quicksettingcontroller.h"
|
||||
#include "pluginsiteminterface.h"
|
||||
#include "utils.h"
|
||||
|
||||
TrayMonitor::TrayMonitor(QObject *parent)
|
||||
: QObject(parent)
|
||||
@ -110,6 +111,12 @@ void TrayMonitor::onSniItemsChanged()
|
||||
qWarning() << __FUNCTION__ << "invalid sni service" << s;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (!Utils::IS_WAYLAND_DISPLAY && s.contains("/org/ayatana/NotificationItem/")) {
|
||||
qDebug() << "SNI service path created by libayatana-appindicator, duplicate tray with legacy tray";
|
||||
continue;
|
||||
}
|
||||
|
||||
Q_EMIT sniTrayAdded(s);
|
||||
}
|
||||
}
|
||||
|
@ -13,7 +13,6 @@
|
||||
BaseTrayWidget::BaseTrayWidget(QWidget *parent, Qt::WindowFlags f)
|
||||
: QWidget(parent, f)
|
||||
, m_handleMouseReleaseTimer(new QTimer(this))
|
||||
, m_ownerPID(0)
|
||||
, m_needShow(true)
|
||||
{
|
||||
m_handleMouseReleaseTimer->setSingleShot(true);
|
||||
@ -116,11 +115,6 @@ void BaseTrayWidget::resizeEvent(QResizeEvent *event)
|
||||
}
|
||||
}
|
||||
|
||||
uint BaseTrayWidget::getOwnerPID()
|
||||
{
|
||||
return this->m_ownerPID;
|
||||
}
|
||||
|
||||
bool BaseTrayWidget::needShow()
|
||||
{
|
||||
return m_needShow;
|
||||
@ -139,8 +133,3 @@ void BaseTrayWidget::setNeedShow(bool needShow)
|
||||
|
||||
update();
|
||||
}
|
||||
|
||||
void BaseTrayWidget::setOwnerPID(uint PID)
|
||||
{
|
||||
this->m_ownerPID = PID;
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ public:
|
||||
virtual void sendClick(uint8_t mouseButton, int x, int y) = 0;
|
||||
virtual inline TrayType trayType() const { return TrayType::ApplicationTray; } // default is ApplicationTray
|
||||
virtual bool isValid() {return true;}
|
||||
uint getOwnerPID();
|
||||
virtual bool needShow();
|
||||
virtual void setNeedShow(bool needShow);
|
||||
virtual QPixmap icon() = 0;
|
||||
@ -48,14 +47,12 @@ protected:
|
||||
void handleMouseRelease();
|
||||
const QRect perfectIconRect() const;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
void setOwnerPID(uint PID);
|
||||
|
||||
private:
|
||||
QTimer *m_handleMouseReleaseTimer;
|
||||
|
||||
QPair<QPoint, Qt::MouseButton> m_lastMouseReleaseData;
|
||||
|
||||
uint m_ownerPID;
|
||||
bool m_needShow;
|
||||
};
|
||||
|
||||
|
@ -135,7 +135,7 @@ TrayGridWidget *ExpandIconWidget::popupTrayView()
|
||||
TrayModel *trayModel = TrayModel::getIconModel();
|
||||
gridParentView->setTrayGridView(trayView);
|
||||
|
||||
gridParentView->setWindowFlags(Qt::FramelessWindowHint | Qt::ToolTip | Qt::WindowStaysOnTopHint | Qt::WindowDoesNotAcceptFocus);
|
||||
gridParentView->setWindowFlags(Qt::WindowDoesNotAcceptFocus);
|
||||
trayView->setModel(trayModel);
|
||||
trayView->setItemDelegate(trayDelegate);
|
||||
trayView->setSpacing(ITEM_SPACING);
|
||||
|
@ -73,7 +73,6 @@ SNITrayItemWidget::SNITrayItemWidget(const QString &sniServicePath, QWidget *par
|
||||
m_dbusPath = pair.second;
|
||||
|
||||
QDBusConnection conn = QDBusConnection::sessionBus();
|
||||
setOwnerPID(conn.interface()->servicePid(m_dbusService));
|
||||
|
||||
m_sniInter = new StatusNotifierItem(m_dbusService, m_dbusPath, QDBusConnection::sessionBus(), this);
|
||||
m_sniInter->setSync(false);
|
||||
|
@ -76,7 +76,6 @@ XEmbedTrayItemWidget::XEmbedTrayItemWidget(quint32 winId, xcb_connection_t *cnn,
|
||||
, m_display(disp)
|
||||
{
|
||||
wrapWindow();
|
||||
setOwnerPID(getWindowPID(winId));
|
||||
|
||||
m_updateTimer = new QTimer(this);
|
||||
m_updateTimer->setInterval(100);
|
||||
@ -521,32 +520,3 @@ bool XEmbedTrayItemWidget::isBadWindow()
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
uint XEmbedTrayItemWidget::getWindowPID(uint winId)
|
||||
{
|
||||
const auto display = IS_WAYLAND_DISPLAY ? XOpenDisplay(nullptr) : QX11Info::display();
|
||||
if (!display) {
|
||||
qWarning() << "QX11Info::connection() is " << display;
|
||||
return 0;
|
||||
}
|
||||
|
||||
Atom nameAtom = XInternAtom(display, "_NET_WM_PID", 1);
|
||||
Atom type;
|
||||
int format, status;
|
||||
|
||||
unsigned long nitems, after;
|
||||
unsigned char *data;
|
||||
unsigned int pid = 0;
|
||||
|
||||
status = XGetWindowProperty(display, winId, nameAtom, 0, 1024, 0,
|
||||
XInternAtom(display, "CARDINAL", 0), &type, &format, &nitems, &after, &data);
|
||||
if (status == Success && data) {
|
||||
pid = *((uint*)data);
|
||||
XFree(data);
|
||||
}
|
||||
|
||||
if (IS_WAYLAND_DISPLAY)
|
||||
XCloseDisplay(display);
|
||||
|
||||
return pid;
|
||||
}
|
||||
|
@ -28,7 +28,6 @@ public:
|
||||
void sendClick(uint8_t mouseButton, int x, int y) override;
|
||||
|
||||
static QString toXEmbedKey(quint32 winId);
|
||||
static uint getWindowPID(quint32 winId);
|
||||
static bool isXEmbedKey(const QString &itemKey);
|
||||
virtual bool isValid() override {return m_valid;}
|
||||
QPixmap icon() override;
|
||||
|
@ -128,11 +128,6 @@ void TrayManagerWindow::setPositon(Dock::Position position)
|
||||
|
||||
m_position = position;
|
||||
|
||||
if (position == Dock::Position::Top || position == Dock::Position::Bottom)
|
||||
m_trayView->setOrientation(QListView::Flow::LeftToRight, false);
|
||||
else
|
||||
m_trayView->setOrientation(QListView::Flow::TopToBottom, false);
|
||||
|
||||
TrayDelegate *delegate = static_cast<TrayDelegate *>(m_trayView->itemDelegate());
|
||||
delegate->setPositon(position);
|
||||
|
||||
@ -398,9 +393,8 @@ void TrayManagerWindow::resetChildWidgetSize()
|
||||
int dateTimeHeight = m_appPluginDatetimeWidget->height() - - m.top() - m.bottom() - trayHeight;
|
||||
m_dateTimeWidget->setFixedSize(dateTimeWidth, dateTimeHeight);
|
||||
m_systemPluginWidget->setFixedSize(m_systemPluginWidget->suitableSize());
|
||||
int contentSpace = qMin(MAXDIFF, qMax(((Utils::isDraging() ? height() : (int)m_windowFashionSize) - MINHIGHT), 0)) + MINSPACE;
|
||||
m_mainLayout->setContentsMargins(contentSpace, contentSpace, contentSpace, contentSpace);
|
||||
m_mainLayout->setSpacing(contentSpace);
|
||||
m_mainLayout->setContentsMargins(SINGLEROWSPACE, SINGLEROWSPACE, SINGLEROWSPACE, SINGLEROWSPACE);
|
||||
m_mainLayout->setSpacing(SINGLEROWSPACE);
|
||||
|
||||
// 调整插件和日期窗体的位置显示,这里没有用到布局,是因为在调整任务栏位置的时候,
|
||||
// 随着布局方向的改变,显示有很大的问题
|
||||
@ -542,8 +536,8 @@ void TrayManagerWindow::paintEvent(QPaintEvent *event)
|
||||
painter.save();
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
painter.setClipPath(path);
|
||||
painter.fillRect(rect().adjusted(1, 1, -1, -1), maskColor(102));
|
||||
painter.setPen(maskColor(110));
|
||||
painter.fillRect(rect().adjusted(1, 1, -1, -1), maskColor(255 * 0.1));
|
||||
painter.setPen(maskColor(255 * 0.15));
|
||||
painter.drawPath(path);
|
||||
painter.restore();
|
||||
|
||||
|
@ -816,7 +816,7 @@ void WindowManager::onRequestNotifyWindowManager()
|
||||
}
|
||||
|
||||
XcbMisc::instance()->set_strut_partial(static_cast<xcb_window_t>(mainWindow->winId()), orientation,
|
||||
static_cast<uint>(strut + WINDOWMARGIN * ratio), // 设置窗口与屏幕边缘距离,需要乘缩放
|
||||
static_cast<uint>(strut), // 设置窗口与屏幕边缘距离,需要乘缩放
|
||||
static_cast<uint>(strutStart), // 设置任务栏起点坐标(上下为x,左右为y)
|
||||
static_cast<uint>(strutEnd)); // 设置任务栏终点坐标(上下为x,左右为y)
|
||||
}
|
||||
|
@ -1,4 +1,3 @@
|
||||
#add_subdirectory("datetime")
|
||||
add_subdirectory("shutdown")
|
||||
add_subdirectory("power")
|
||||
add_subdirectory("sound")
|
||||
@ -13,3 +12,4 @@ add_subdirectory("show-desktop")
|
||||
add_subdirectory("multitasking")
|
||||
add_subdirectory("bluetooth")
|
||||
add_subdirectory("airplane-mode")
|
||||
add_subdirectory("notification")
|
||||
|
@ -24,7 +24,7 @@ DWIDGET_USE_NAMESPACE
|
||||
BluetoothMainWidget::BluetoothMainWidget(AdaptersManager *adapterManager, QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_adapterManager(adapterManager)
|
||||
, m_iconWidget(new QWidget(this))
|
||||
, m_iconButton(new DIconButton(this))
|
||||
, m_nameLabel(new QLabel(this))
|
||||
, m_stateLabel(new QLabel(this))
|
||||
, m_expandLabel(new QLabel(this))
|
||||
@ -40,63 +40,7 @@ BluetoothMainWidget::~BluetoothMainWidget()
|
||||
|
||||
bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event)
|
||||
{
|
||||
if (watcher == m_iconWidget) {
|
||||
switch (event->type()) {
|
||||
case QEvent::Paint: {
|
||||
QPainter painter(m_iconWidget);
|
||||
// 在区域最中间绘制
|
||||
QRect iconRect = m_iconWidget->rect();
|
||||
int size = qMin(iconRect.height(), iconRect.width());
|
||||
QPoint ptCenter(iconRect.center());
|
||||
painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform);
|
||||
// 填充原型路径
|
||||
QPainterPath path;
|
||||
path.addEllipse(ptCenter, size / 2 - 1, size / 2 - 1);
|
||||
// 设置黑色背景色
|
||||
QColor backColor = (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType ? Qt::black : Qt::white);
|
||||
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::ColorType::LightType)
|
||||
backColor.setAlphaF(m_mouseEnter ? 0.2 : 0.1);
|
||||
else
|
||||
backColor.setAlphaF(m_mouseEnter ? 0.1 : 0.2);
|
||||
painter.setBrush(backColor);
|
||||
painter.fillPath(path, backColor);
|
||||
// 添加图标
|
||||
bool blueStatus = isOpen();
|
||||
QPixmap pixmap(bluetoothIcon(blueStatus));
|
||||
if (blueStatus) {
|
||||
QPainter pa(&pixmap);
|
||||
pa.setCompositionMode(QPainter::CompositionMode_SourceIn);
|
||||
pa.fillRect(pixmap.rect(), qApp->palette().highlight());
|
||||
}
|
||||
painter.drawPixmap(QPoint(ptCenter.x() - pixmap.size().width() / 2, ptCenter.y() - pixmap.size().height() / 2), pixmap);
|
||||
return true;
|
||||
}
|
||||
case QEvent::Enter: {
|
||||
m_mouseEnter = true;
|
||||
m_iconWidget->update();
|
||||
break;
|
||||
}
|
||||
case QEvent::Leave: {
|
||||
m_mouseEnter = false;
|
||||
m_iconWidget->update();
|
||||
break;
|
||||
}
|
||||
case QEvent::MouseButtonRelease: {
|
||||
QMouseEvent *mouseevent = static_cast<QMouseEvent *>(event);
|
||||
if (mouseevent->button() != Qt::LeftButton) {
|
||||
return QWidget::eventFilter(watcher, event);
|
||||
}
|
||||
bool status = !(isOpen());
|
||||
for (const Adapter *adapter : m_adapterManager->adapters())
|
||||
m_adapterManager->setAdapterPowered(adapter, status);
|
||||
|
||||
return true;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (watcher == m_expandLabel && event->type() == QEvent::MouseButtonRelease) {
|
||||
if (watcher != m_iconButton && event->type() == QEvent::MouseButtonRelease) {
|
||||
Q_EMIT requestExpand();
|
||||
return true;
|
||||
}
|
||||
@ -106,6 +50,9 @@ bool BluetoothMainWidget::eventFilter(QObject *watcher, QEvent *event)
|
||||
if (watcher == m_stateLabel && event->type() == QEvent::Resize) {
|
||||
m_stateLabel->setText(QFontMetrics(m_stateLabel->font()).elidedText(m_stateLabel->text(), Qt::TextElideMode::ElideRight, m_stateLabel->width()));
|
||||
}
|
||||
if (watcher == m_iconButton && event->type() == QEvent::PaletteChange) {
|
||||
onPaletteChanged();
|
||||
}
|
||||
return QWidget::eventFilter(watcher, event);
|
||||
}
|
||||
|
||||
@ -113,7 +60,15 @@ void BluetoothMainWidget::initUi()
|
||||
{
|
||||
QHBoxLayout *mainLayout = new QHBoxLayout(this);
|
||||
// 添加左侧的图标
|
||||
m_iconWidget->setFixedWidth(36);
|
||||
m_iconButton->setEnabledCircle(true);
|
||||
m_iconButton->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
|
||||
m_iconButton->setFocusPolicy(Qt::FocusPolicy::TabFocus);
|
||||
m_iconButton->setIconSize({24, 24});
|
||||
m_iconButton->setIcon(QIcon::fromTheme("bluetooth"));
|
||||
m_iconButton->setCheckable(true);
|
||||
m_iconButton->setChecked(isOpen());
|
||||
onPaletteChanged();
|
||||
|
||||
// 添加中间的文本
|
||||
QWidget *textWidget = new QWidget(this);
|
||||
QVBoxLayout *textLayout = new QVBoxLayout(textWidget);
|
||||
@ -146,15 +101,15 @@ void BluetoothMainWidget::initUi()
|
||||
// 将所有的窗体都添加到主布局中
|
||||
mainLayout->setContentsMargins(10, 0, 10, 0);
|
||||
mainLayout->setSpacing(0);
|
||||
mainLayout->addWidget(m_iconWidget);
|
||||
mainLayout->addWidget(m_iconButton);
|
||||
mainLayout->addSpacing(10);
|
||||
mainLayout->addWidget(textWidget);
|
||||
mainLayout->addStretch();
|
||||
mainLayout->addWidget(expandWidget);
|
||||
|
||||
m_iconWidget->installEventFilter(this);
|
||||
m_expandLabel->installEventFilter(this);
|
||||
m_nameLabel->installEventFilter(this);
|
||||
m_iconButton->installEventFilter(this);
|
||||
}
|
||||
|
||||
void BluetoothMainWidget::initConnection()
|
||||
@ -168,6 +123,12 @@ void BluetoothMainWidget::initConnection()
|
||||
for (const Adapter *adapter : m_adapterManager->adapters())
|
||||
connect(adapter, &Adapter::poweredChanged, this, &BluetoothMainWidget::onAdapterChanged);
|
||||
|
||||
connect(m_iconButton, &DIconButton::clicked, this, [this](){
|
||||
bool status = !(isOpen());
|
||||
for (const Adapter *adapter : m_adapterManager->adapters())
|
||||
m_adapterManager->setAdapterPowered(adapter, status);
|
||||
});
|
||||
|
||||
onAdapterChanged();
|
||||
}
|
||||
|
||||
@ -202,5 +163,16 @@ void BluetoothMainWidget::onAdapterChanged()
|
||||
const QString& text = bluetoothIsOpen ? tr("Turn on") : tr("Turn off");
|
||||
QFontMetrics fmt{m_stateLabel->font()};
|
||||
m_stateLabel->setText(fmt.elidedText(text, Qt::TextElideMode::ElideRight,m_stateLabel->width()));
|
||||
m_iconWidget->update();
|
||||
m_iconButton->setChecked(bluetoothIsOpen);
|
||||
}
|
||||
|
||||
void BluetoothMainWidget::onPaletteChanged()
|
||||
{
|
||||
if (!m_iconButton)
|
||||
return;
|
||||
|
||||
auto pa = m_iconButton->palette();
|
||||
pa.setColor(QPalette::HighlightedText, pa.color(QPalette::Highlight));
|
||||
m_iconButton->setPalette(pa);
|
||||
m_iconButton->update();
|
||||
}
|
||||
|
@ -6,12 +6,16 @@
|
||||
#ifndef BLUETOOTHMAINWIDGET_H
|
||||
#define BLUETOOTHMAINWIDGET_H
|
||||
|
||||
#include <DIconButton>
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
class AdaptersManager;
|
||||
class QLabel;
|
||||
class Adapter;
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
class BluetoothMainWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
@ -37,10 +41,11 @@ private:
|
||||
|
||||
private Q_SLOTS:
|
||||
void onAdapterChanged();
|
||||
void onPaletteChanged();
|
||||
|
||||
private:
|
||||
AdaptersManager *m_adapterManager;
|
||||
QWidget *m_iconWidget;
|
||||
DIconButton *m_iconButton;
|
||||
QLabel *m_nameLabel;
|
||||
QLabel *m_stateLabel;
|
||||
QLabel *m_expandLabel;
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include <DListView>
|
||||
#include <DSpinner>
|
||||
#include <DGuiApplicationHelper>
|
||||
#include <DIconTheme>
|
||||
|
||||
#include <QBoxLayout>
|
||||
#include <QStandardItemModel>
|
||||
@ -115,7 +116,13 @@ QIcon BluetoothDeviceItem::getBatteryIcon(int percentage)
|
||||
percentageStr = "unknow";
|
||||
}
|
||||
|
||||
return QIcon::fromTheme(QString("battery-%1-symbolic").arg(percentageStr));
|
||||
QString iconName = QString("battery-%1-symbolic").arg(percentageStr);
|
||||
|
||||
auto themeType = DGuiApplicationHelper::instance()->themeType();
|
||||
bool isDarkTheme = themeType == DGuiApplicationHelper::DarkType;
|
||||
QString iconNameFallback = isDarkTheme ? iconName + "-dark" : iconName;
|
||||
QIcon qrcIcon = DIconTheme::findQIcon(iconName, DIconTheme::DontFallbackToQIconFromTheme);
|
||||
return DIconTheme::findQIcon(iconNameFallback, qrcIcon, DIconTheme::IgnoreBuiltinIcons);
|
||||
|
||||
}
|
||||
|
||||
@ -230,6 +237,10 @@ void BluetoothAdapterItem::updateIconTheme(DGuiApplicationHelper::ColorType type
|
||||
|
||||
QSize BluetoothAdapterItem::sizeHint() const
|
||||
{
|
||||
// 没有 item 就不去做一些无效的计算了,包括分割线的高度
|
||||
if (m_deviceListview->count() < 1)
|
||||
return QSize(ItemWidth, m_adapterLabel->height());
|
||||
|
||||
int visualHeight = 0;
|
||||
for (int i = 0; i < m_deviceListview->count(); i++)
|
||||
visualHeight += m_deviceListview->visualRect(m_deviceModel->index(i, 0)).height();
|
||||
@ -269,6 +280,10 @@ void BluetoothAdapterItem::initData()
|
||||
|
||||
void BluetoothAdapterItem::onDeviceAdded(const Device *device)
|
||||
{
|
||||
// 关闭蓝牙设备时,不再响应上一个扫描操作的新增的 device
|
||||
if (!m_adapterStateBtn->isChecked())
|
||||
return;
|
||||
|
||||
int insertRow = 0;
|
||||
foreach (const auto item, m_deviceItems) {
|
||||
if (item->device()->connectState()) {
|
||||
@ -407,6 +422,8 @@ void BluetoothAdapterItem::initConnect()
|
||||
m_seperator->setVisible(false);
|
||||
m_adapterStateBtn->setEnabled(false);
|
||||
m_refreshBtn->setVisible(state);
|
||||
// FIX #6033 开启蓝牙就开始转动,关闭就停止转动
|
||||
state ? m_refreshBtn->startRotate() : m_refreshBtn->stopRotate();
|
||||
emit requestSetAdapterPower(m_adapter, state);
|
||||
});
|
||||
connect(m_bluetoothInter, &DBusBluetooth::DisplaySwitchChanged, this, [ = ](bool value) {
|
||||
|
@ -46,5 +46,7 @@
|
||||
<file>light/icons/battery-090-symbolic_20px.svg</file>
|
||||
<file>light/icons/battery-100-symbolic_20px.svg</file>
|
||||
<file>light/icons/battery-unknow-symbolic_20px.svg</file>
|
||||
<file alias="light/texts/bluetooth_16px.svg">light/buletooth_other_light.svg</file>
|
||||
<file alias="dark/texts/bluetooth_16px.svg">dark/buletooth_other_dark.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
||||
|
@ -1,41 +0,0 @@
|
||||
|
||||
set(PLUGIN_NAME "datetime")
|
||||
|
||||
project(${PLUGIN_NAME})
|
||||
|
||||
generation_dbus_interface(${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/xml ${CMAKE_CURRENT_SOURCE_DIR}/dbusinterface/generation_dbus_interface)
|
||||
|
||||
# Sources files
|
||||
file(GLOB_RECURSE SRCS "*.h"
|
||||
"*.cpp"
|
||||
"../../widgets/*.h"
|
||||
"../../widgets/*.cpp"
|
||||
"../../frame/qtdbusextended/*.h"
|
||||
"../../frame/qtdbusextended/*.cpp" "")
|
||||
|
||||
find_package(PkgConfig REQUIRED)
|
||||
find_package(Qt5Widgets REQUIRED)
|
||||
find_package(Qt5Svg REQUIRED)
|
||||
find_package(Qt5DBus REQUIRED)
|
||||
find_package(DtkWidget REQUIRED)
|
||||
|
||||
pkg_check_modules(QGSettings REQUIRED gsettings-qt)
|
||||
|
||||
add_definitions("${QT_DEFINITIONS} -DQT_PLUGIN")
|
||||
add_library(${PLUGIN_NAME} SHARED ${SRCS} datetime.qrc)
|
||||
set_target_properties(${PLUGIN_NAME} PROPERTIES LIBRARY_OUTPUT_DIRECTORY ../)
|
||||
target_include_directories(${PLUGIN_NAME} PUBLIC
|
||||
${DtkWidget_INCLUDE_DIRS}
|
||||
../../interfaces
|
||||
../../frame/qtdbusextended
|
||||
./dbusinterface/
|
||||
./dbusinterface/generation_dbus_interface)
|
||||
|
||||
target_link_libraries(${PLUGIN_NAME} PRIVATE
|
||||
${DtkWidget_LIBRARIES}
|
||||
PkgConfig::QGSettings
|
||||
Qt5::Widgets
|
||||
Qt5::DBus
|
||||
Qt5::Svg)
|
||||
|
||||
install(TARGETS ${PLUGIN_NAME} LIBRARY DESTINATION lib/dde-dock/plugins)
|
@ -1,4 +0,0 @@
|
||||
{
|
||||
"api": "2.0.0",
|
||||
"depends-daemon-dbus-service": "org.deepin.dde.Timedate1"
|
||||
}
|
@ -1,27 +0,0 @@
|
||||
<RCC>
|
||||
<qresource prefix="/icons">
|
||||
<file>resources/icons/background.svg</file>
|
||||
<file>resources/icons/big0.svg</file>
|
||||
<file>resources/icons/big1.svg</file>
|
||||
<file>resources/icons/big2.svg</file>
|
||||
<file>resources/icons/big3.svg</file>
|
||||
<file>resources/icons/big4.svg</file>
|
||||
<file>resources/icons/big5.svg</file>
|
||||
<file>resources/icons/big6.svg</file>
|
||||
<file>resources/icons/big7.svg</file>
|
||||
<file>resources/icons/big8.svg</file>
|
||||
<file>resources/icons/big9.svg</file>
|
||||
<file>resources/icons/small0.svg</file>
|
||||
<file>resources/icons/small1.svg</file>
|
||||
<file>resources/icons/small2.svg</file>
|
||||
<file>resources/icons/small3.svg</file>
|
||||
<file>resources/icons/small4.svg</file>
|
||||
<file>resources/icons/small5.svg</file>
|
||||
<file>resources/icons/small6.svg</file>
|
||||
<file>resources/icons/small7.svg</file>
|
||||
<file>resources/icons/small8.svg</file>
|
||||
<file>resources/icons/small9.svg</file>
|
||||
<file>resources/icons/tips-am.svg</file>
|
||||
<file>resources/icons/tips-pm.svg</file>
|
||||
</qresource>
|
||||
</RCC>
|
@ -1,256 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "datetimeplugin.h"
|
||||
#include "../../widgets/tipswidget.h"
|
||||
#include "../../frame/util/utils.h"
|
||||
|
||||
#include <DDBusSender>
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDBusConnectionInterface>
|
||||
|
||||
#include <unistd.h>
|
||||
|
||||
#define PLUGIN_STATE_KEY "enable"
|
||||
#define TIME_FORMAT_KEY "Use24HourFormat"
|
||||
using namespace Dock;
|
||||
DatetimePlugin::DatetimePlugin(QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_centralWidget(nullptr)
|
||||
, m_dateTipsLabel(nullptr)
|
||||
, m_refershTimer(nullptr)
|
||||
, m_interface(nullptr)
|
||||
, m_pluginLoaded(false)
|
||||
{
|
||||
QDBusConnection sessionBus = QDBusConnection::sessionBus();
|
||||
sessionBus.connect("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", "org.freedesktop.DBus.Properties", "PropertiesChanged", this, SLOT(propertiesChanged()));
|
||||
}
|
||||
|
||||
PluginsItemInterface::PluginSizePolicy DatetimePlugin::pluginSizePolicy() const
|
||||
{
|
||||
return PluginsItemInterface::Custom;
|
||||
}
|
||||
|
||||
const QString DatetimePlugin::pluginName() const
|
||||
{
|
||||
return "datetime";
|
||||
}
|
||||
|
||||
const QString DatetimePlugin::pluginDisplayName() const
|
||||
{
|
||||
return tr("Datetime");
|
||||
}
|
||||
|
||||
void DatetimePlugin::init(PluginProxyInterface *proxyInter)
|
||||
{
|
||||
m_proxyInter = proxyInter;
|
||||
|
||||
// transfer config
|
||||
QSettings settings("deepin", "dde-dock-datetime");
|
||||
if (QFile::exists(settings.fileName())) {
|
||||
Dock::DisplayMode mode = displayMode();
|
||||
const QString key = QString("pos_%1_%2").arg(pluginName()).arg(mode);
|
||||
proxyInter->saveValue(this, key, settings.value(key, mode == Dock::DisplayMode::Fashion ? 6 : -1));
|
||||
QFile::remove(settings.fileName());
|
||||
}
|
||||
|
||||
if (pluginIsDisable()) {
|
||||
return;
|
||||
}
|
||||
|
||||
loadPlugin();
|
||||
}
|
||||
|
||||
void DatetimePlugin::loadPlugin()
|
||||
{
|
||||
if (m_pluginLoaded)
|
||||
return;
|
||||
|
||||
m_pluginLoaded = true;
|
||||
m_dateTipsLabel.reset(new TipsWidget);
|
||||
m_refershTimer = new QTimer(this);
|
||||
m_dateTipsLabel->setObjectName("datetime");
|
||||
|
||||
m_refershTimer->setInterval(1000);
|
||||
m_refershTimer->start();
|
||||
|
||||
m_centralWidget.reset(new DatetimeWidget);
|
||||
|
||||
connect(m_centralWidget.data(), &DatetimeWidget::requestUpdateGeometry, [this] { m_proxyInter->itemUpdate(this, pluginName()); });
|
||||
connect(m_refershTimer, &QTimer::timeout, this, &DatetimePlugin::updateCurrentTimeString);
|
||||
|
||||
m_proxyInter->itemAdded(this, pluginName());
|
||||
|
||||
pluginSettingsChanged();
|
||||
}
|
||||
|
||||
void DatetimePlugin::pluginStateSwitched()
|
||||
{
|
||||
m_proxyInter->saveValue(this, PLUGIN_STATE_KEY, pluginIsDisable());
|
||||
|
||||
refreshPluginItemsVisible();
|
||||
}
|
||||
|
||||
bool DatetimePlugin::pluginIsDisable()
|
||||
{
|
||||
return !(m_proxyInter->getValue(this, PLUGIN_STATE_KEY, true).toBool());
|
||||
}
|
||||
|
||||
int DatetimePlugin::itemSortKey(const QString &itemKey)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
const QString key = QString("pos_%1_%2").arg(itemKey).arg(Dock::Efficient);
|
||||
return m_proxyInter->getValue(this, key, 6).toInt();
|
||||
}
|
||||
|
||||
void DatetimePlugin::setSortKey(const QString &itemKey, const int order)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
const QString key = QString("pos_%1_%2").arg(itemKey).arg(Dock::Efficient);
|
||||
m_proxyInter->saveValue(this, key, order);
|
||||
}
|
||||
|
||||
QWidget *DatetimePlugin::itemWidget(const QString &itemKey)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
return m_centralWidget.data();
|
||||
}
|
||||
|
||||
QWidget *DatetimePlugin::itemTipsWidget(const QString &itemKey)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
return m_dateTipsLabel.data();
|
||||
}
|
||||
|
||||
const QString DatetimePlugin::itemCommand(const QString &itemKey)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
return "dbus-send --print-reply --dest=org.deepin.dde.Widgets1 /org/deepin/dde/Widgets1 org.deepin.dde.Widgets1.Toggle";
|
||||
}
|
||||
|
||||
const QString DatetimePlugin::itemContextMenu(const QString &itemKey)
|
||||
{
|
||||
Q_UNUSED(itemKey);
|
||||
|
||||
QList<QVariant> items;
|
||||
items.reserve(1);
|
||||
|
||||
QMap<QString, QVariant> settings;
|
||||
settings["itemId"] = "settings";
|
||||
if (m_centralWidget->is24HourFormat())
|
||||
settings["itemText"] = tr("12-hour time");
|
||||
else
|
||||
settings["itemText"] = tr("24-hour time");
|
||||
settings["isActive"] = true;
|
||||
items.push_back(settings);
|
||||
|
||||
if (!QFile::exists(ICBC_CONF_FILE)) {
|
||||
QMap<QString, QVariant> open;
|
||||
open["itemId"] = "open";
|
||||
open["itemText"] = tr("Time settings");
|
||||
open["isActive"] = true;
|
||||
items.push_back(open);
|
||||
}
|
||||
|
||||
QMap<QString, QVariant> menu;
|
||||
menu["items"] = items;
|
||||
menu["checkableMenu"] = false;
|
||||
menu["singleCheck"] = false;
|
||||
|
||||
return QJsonDocument::fromVariant(menu).toJson();
|
||||
}
|
||||
|
||||
void DatetimePlugin::invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked)
|
||||
{
|
||||
Q_UNUSED(itemKey)
|
||||
Q_UNUSED(checked)
|
||||
|
||||
if (menuId == "open") {
|
||||
DDBusSender()
|
||||
.service("org.deepin.dde.ControlCenter1")
|
||||
.interface("org.deepin.dde.ControlCenter1")
|
||||
.path("/org/deepin/dde/ControlCenter1")
|
||||
.method(QString("ShowPage"))
|
||||
.arg(QString("datetime"))
|
||||
.call();
|
||||
} else {
|
||||
const bool value = timedateInterface()->property(TIME_FORMAT_KEY).toBool();
|
||||
timedateInterface()->setProperty(TIME_FORMAT_KEY, !value);
|
||||
m_centralWidget->set24HourFormat(!value);
|
||||
}
|
||||
}
|
||||
|
||||
void DatetimePlugin::pluginSettingsChanged()
|
||||
{
|
||||
if (!m_pluginLoaded)
|
||||
return;
|
||||
|
||||
const bool value = timedateInterface()->property(TIME_FORMAT_KEY).toBool();
|
||||
|
||||
m_proxyInter->saveValue(this, TIME_FORMAT_KEY, value);
|
||||
m_centralWidget->set24HourFormat(value);
|
||||
|
||||
refreshPluginItemsVisible();
|
||||
}
|
||||
|
||||
void DatetimePlugin::updateCurrentTimeString()
|
||||
{
|
||||
const QDateTime currentDateTime = QDateTime::currentDateTime();
|
||||
|
||||
if (m_centralWidget->is24HourFormat())
|
||||
m_dateTipsLabel->setText(currentDateTime.date().toString(Qt::SystemLocaleLongDate) + currentDateTime.toString(" HH:mm:ss"));
|
||||
else
|
||||
m_dateTipsLabel->setText(currentDateTime.date().toString(Qt::SystemLocaleLongDate) + currentDateTime.toString(" hh:mm:ss A"));
|
||||
|
||||
const QString currentString = currentDateTime.toString("yyyy/MM/dd hh:mm");
|
||||
|
||||
if (currentString == m_currentTimeString)
|
||||
return;
|
||||
|
||||
m_currentTimeString = currentString;
|
||||
//当时间显示格式为12小时制且格式为0:00时,当从9:59变到10:00时,插件宽度需要变化
|
||||
m_centralWidget->requestUpdateGeometry();
|
||||
}
|
||||
|
||||
void DatetimePlugin::refreshPluginItemsVisible()
|
||||
{
|
||||
if (!pluginIsDisable()) {
|
||||
|
||||
if (!m_pluginLoaded) {
|
||||
loadPlugin();
|
||||
return;
|
||||
}
|
||||
m_proxyInter->itemAdded(this, pluginName());
|
||||
} else {
|
||||
m_proxyInter->itemRemoved(this, pluginName());
|
||||
}
|
||||
}
|
||||
|
||||
void DatetimePlugin::propertiesChanged()
|
||||
{
|
||||
pluginSettingsChanged();
|
||||
}
|
||||
|
||||
QDBusInterface* DatetimePlugin::timedateInterface()
|
||||
{
|
||||
if (!m_interface) {
|
||||
if (QDBusConnection::sessionBus().interface()->isServiceRegistered("org.deepin.dde.Timedate1")) {
|
||||
m_interface = new QDBusInterface("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", "org.deepin.dde.Timedate1", QDBusConnection::sessionBus(), this);
|
||||
} else {
|
||||
const QString path = QString("/org/deepin/dde/Accounts1/User%1").arg(QString::number(getuid()));
|
||||
QDBusInterface * systemInterface = new QDBusInterface("org.deepin.dde.Accounts1", path, "org.deepin.dde.Accounts1.User",
|
||||
QDBusConnection::systemBus(), this);
|
||||
return systemInterface;
|
||||
}
|
||||
}
|
||||
|
||||
return m_interface;
|
||||
}
|
@ -1,70 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#ifndef DATETIMEPLUGIN_H
|
||||
#define DATETIMEPLUGIN_H
|
||||
|
||||
#include "pluginsiteminterface.h"
|
||||
#include "datetimewidget.h"
|
||||
|
||||
#include <QTimer>
|
||||
#include <QLabel>
|
||||
#include <QSettings>
|
||||
|
||||
namespace Dock{
|
||||
class TipsWidget;
|
||||
}
|
||||
class QDBusInterface;
|
||||
class DatetimePlugin : public QObject, PluginsItemInterface
|
||||
{
|
||||
Q_OBJECT
|
||||
Q_INTERFACES(PluginsItemInterface)
|
||||
Q_PLUGIN_METADATA(IID "com.deepin.dock.PluginsItemInterface" FILE "datetime.json")
|
||||
|
||||
public:
|
||||
explicit DatetimePlugin(QObject *parent = nullptr);
|
||||
|
||||
PluginSizePolicy pluginSizePolicy() const override;
|
||||
|
||||
const QString pluginName() const override;
|
||||
const QString pluginDisplayName() const override;
|
||||
void init(PluginProxyInterface *proxyInter) override;
|
||||
|
||||
void pluginStateSwitched() override;
|
||||
bool pluginIsAllowDisable() override { return true; }
|
||||
bool pluginIsDisable() override;
|
||||
|
||||
int itemSortKey(const QString &itemKey) override;
|
||||
void setSortKey(const QString &itemKey, const int order) override;
|
||||
|
||||
QWidget *itemWidget(const QString &itemKey) override;
|
||||
QWidget *itemTipsWidget(const QString &itemKey) override;
|
||||
|
||||
const QString itemCommand(const QString &itemKey) override;
|
||||
const QString itemContextMenu(const QString &itemKey) override;
|
||||
|
||||
void invokedMenuItem(const QString &itemKey, const QString &menuId, const bool checked) override;
|
||||
|
||||
void pluginSettingsChanged() override;
|
||||
|
||||
private slots:
|
||||
void updateCurrentTimeString();
|
||||
void refreshPluginItemsVisible();
|
||||
void propertiesChanged();
|
||||
|
||||
private:
|
||||
void loadPlugin();
|
||||
QDBusInterface *timedateInterface();
|
||||
|
||||
private:
|
||||
QScopedPointer<DatetimeWidget> m_centralWidget;
|
||||
QScopedPointer<Dock::TipsWidget> m_dateTipsLabel;
|
||||
QTimer *m_refershTimer;
|
||||
QString m_currentTimeString;
|
||||
QDBusInterface *m_interface;
|
||||
bool m_pluginLoaded;
|
||||
};
|
||||
|
||||
#endif // DATETIMEPLUGIN_H
|
@ -1,242 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "datetimewidget.h"
|
||||
#include "constants.h"
|
||||
|
||||
#include <QApplication>
|
||||
#include <QPainter>
|
||||
#include <QDebug>
|
||||
#include <QSvgRenderer>
|
||||
#include <QMouseEvent>
|
||||
#include <DFontSizeManager>
|
||||
#include <DGuiApplicationHelper>
|
||||
|
||||
#define PLUGIN_STATE_KEY "enable"
|
||||
#define TIME_FONT DFontSizeManager::instance()->t4()
|
||||
#define DATE_FONT DFontSizeManager::instance()->t10()
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
DatetimeWidget::DatetimeWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_24HourFormat(false)
|
||||
, m_timeOffset(false)
|
||||
, m_timedateInter(new Timedate("org.deepin.dde.Timedate1", "/org/deepin/dde/Timedate1", QDBusConnection::sessionBus(), this))
|
||||
, m_shortDateFormat("yyyy-MM-dd")
|
||||
, m_shortTimeFormat("hh:mm")
|
||||
{
|
||||
setMinimumSize(PLUGIN_BACKGROUND_MIN_SIZE, PLUGIN_BACKGROUND_MIN_SIZE);
|
||||
setShortDateFormat(m_timedateInter->shortDateFormat());
|
||||
setShortTimeFormat(m_timedateInter->shortTimeFormat());
|
||||
|
||||
connect(m_timedateInter, &Timedate::ShortDateFormatChanged, this, &DatetimeWidget::setShortDateFormat);
|
||||
connect(m_timedateInter, &Timedate::ShortTimeFormatChanged, this, &DatetimeWidget::setShortTimeFormat);
|
||||
//连接日期时间修改信号,更新日期时间插件的布局
|
||||
connect(m_timedateInter, &Timedate::TimeUpdate, this, [ = ]{
|
||||
if (isVisible()) {
|
||||
emit requestUpdateGeometry();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void DatetimeWidget::set24HourFormat(const bool value)
|
||||
{
|
||||
if (m_24HourFormat == value) {
|
||||
return;
|
||||
}
|
||||
|
||||
m_24HourFormat = value;
|
||||
update();
|
||||
|
||||
if (isVisible()) {
|
||||
emit requestUpdateGeometry();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DatetimeWidget::setShortDateFormat 根据类型设置时间显示格式
|
||||
* @param type 自定义类型
|
||||
*/
|
||||
void DatetimeWidget::setShortDateFormat(int type)
|
||||
{
|
||||
switch (type) {
|
||||
case 0: m_shortDateFormat = "yyyy/M/d"; break;
|
||||
case 1: m_shortDateFormat = "yyyy-M-d"; break;
|
||||
case 2: m_shortDateFormat = "yyyy.M.d"; break;
|
||||
case 3: m_shortDateFormat = "yyyy/MM/dd"; break;
|
||||
case 4: m_shortDateFormat = "yyyy-MM-dd"; break;
|
||||
case 5: m_shortDateFormat = "yyyy.MM.dd"; break;
|
||||
case 6: m_shortDateFormat = "yy/M/d"; break;
|
||||
case 7: m_shortDateFormat = "yy-M-d"; break;
|
||||
case 8: m_shortDateFormat = "yy.M.d"; break;
|
||||
default: m_shortDateFormat = "yyyy-MM-dd"; break;
|
||||
}
|
||||
update();
|
||||
|
||||
if (isVisible()) {
|
||||
emit requestUpdateGeometry();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DatetimeWidget::setShortTimeFormat 根据类型设置短时间显示格式
|
||||
* @param type 自定义类型
|
||||
*/
|
||||
void DatetimeWidget::setShortTimeFormat(int type)
|
||||
{
|
||||
switch (type) {
|
||||
case 0: m_shortTimeFormat = "h:mm"; break;
|
||||
case 1: m_shortTimeFormat = "hh:mm"; break;
|
||||
default: m_shortTimeFormat = "hh:mm"; break;
|
||||
}
|
||||
update();
|
||||
|
||||
if (isVisible()) {
|
||||
emit requestUpdateGeometry();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DatetimeWidget::curTimeSize 调整时间日期字体大小
|
||||
* @return 返回时间和日期绘制的区域大小
|
||||
*/
|
||||
QSize DatetimeWidget::curTimeSize() const
|
||||
{
|
||||
const Dock::Position position = qApp->property(PROP_POSITION).value<Dock::Position>();
|
||||
|
||||
m_timeFont = TIME_FONT;
|
||||
m_dateFont = DATE_FONT;
|
||||
QString timeFormat = m_shortTimeFormat;
|
||||
QString dateFormat = m_shortDateFormat;
|
||||
if (!m_24HourFormat) {
|
||||
if (position == Dock::Top || position == Dock::Bottom)
|
||||
timeFormat = timeFormat.append(" AP");
|
||||
else
|
||||
timeFormat = timeFormat.append("\nAP");
|
||||
}
|
||||
|
||||
QString timeString = QDateTime::currentDateTime().toString(timeFormat);
|
||||
QString dateString = QDateTime::currentDateTime().toString(dateFormat);
|
||||
|
||||
QSize timeSize = QFontMetrics(m_timeFont).boundingRect(timeString).size();
|
||||
int maxWidth = std::max(QFontMetrics(m_timeFont).boundingRect(timeString).size().width(), QFontMetrics(m_timeFont).horizontalAdvance(timeString));
|
||||
timeSize.setWidth(maxWidth);
|
||||
|
||||
if (timeString.contains("\n")) {
|
||||
QStringList SL = timeString.split("\n");
|
||||
maxWidth = std::max(QFontMetrics(m_timeFont).boundingRect(SL.at(0)).size().width(), QFontMetrics(m_timeFont).horizontalAdvance(SL.at(0)));
|
||||
timeSize = QSize(maxWidth, QFontMetrics(m_timeFont).boundingRect(SL.at(0)).height() + QFontMetrics(m_timeFont).boundingRect(SL.at(1)).height());
|
||||
}
|
||||
|
||||
QSize dateSize = QFontMetrics(m_dateFont).boundingRect(dateString).size();
|
||||
maxWidth = std::max(QFontMetrics(m_dateFont).boundingRect(dateString).size().width(), QFontMetrics(m_dateFont).horizontalAdvance(dateString));
|
||||
dateSize.setWidth(maxWidth);
|
||||
|
||||
if (position == Dock::Bottom || position == Dock::Top) {
|
||||
while (QFontMetrics(m_timeFont).boundingRect(timeString).height() + QFontMetrics(m_dateFont).boundingRect(dateString).height() > height()) {
|
||||
m_timeFont.setPixelSize(m_timeFont.pixelSize() - 1);
|
||||
maxWidth = std::max(QFontMetrics(m_timeFont).boundingRect(timeString).size().width(), QFontMetrics(m_timeFont).horizontalAdvance(timeString));
|
||||
timeSize.setWidth(maxWidth);
|
||||
if (m_timeFont.pixelSize() - m_dateFont.pixelSize() == 1) {
|
||||
m_dateFont.setPixelSize(m_dateFont.pixelSize() - 1);
|
||||
maxWidth = std::max(QFontMetrics(m_dateFont).boundingRect(dateString).size().width(), QFontMetrics(m_dateFont).horizontalAdvance(dateString));
|
||||
dateSize.setWidth(maxWidth);
|
||||
}
|
||||
}
|
||||
return QSize(std::max(timeSize.width(), dateSize.width()), timeSize.height() + dateSize.height());
|
||||
} else {
|
||||
while (std::max(QFontMetrics(m_timeFont).boundingRect(timeString).size().width(), QFontMetrics(m_dateFont).boundingRect(dateString).size().width()) > (width() - 4)) {
|
||||
m_timeFont.setPixelSize(m_timeFont.pixelSize() - 1);
|
||||
if (m_24HourFormat) {
|
||||
timeSize.setHeight(QFontMetrics(m_timeFont).boundingRect(timeString).size().height());
|
||||
} else {
|
||||
timeSize.setHeight(QFontMetrics(m_timeFont).boundingRect(timeString).size().height() * 2);
|
||||
}
|
||||
if (m_timeFont.pixelSize() - m_dateFont.pixelSize() == 1) {
|
||||
m_dateFont.setPixelSize(m_dateFont.pixelSize() - 1);
|
||||
dateSize.setWidth(QFontMetrics(m_dateFont).boundingRect(dateString).size().height());
|
||||
}
|
||||
}
|
||||
m_timeOffset = (timeSize.height() - dateSize.height()) / 2 ;
|
||||
return QSize(std::max(timeSize.width(), dateSize.width()), timeSize.height() + dateSize.height());
|
||||
}
|
||||
}
|
||||
|
||||
QSize DatetimeWidget::sizeHint() const
|
||||
{
|
||||
return curTimeSize();
|
||||
}
|
||||
|
||||
void DatetimeWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
if (isVisible())
|
||||
emit requestUpdateGeometry();
|
||||
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief DatetimeWidget::paintEvent 绘制任务栏时间日期
|
||||
* @param e
|
||||
*/
|
||||
void DatetimeWidget::paintEvent(QPaintEvent *e)
|
||||
{
|
||||
Q_UNUSED(e);
|
||||
const QDateTime current = QDateTime::currentDateTime();
|
||||
|
||||
const Dock::Position position = qApp->property(PROP_POSITION).value<Dock::Position>();
|
||||
QPainter painter(this);
|
||||
painter.setRenderHint(QPainter::Antialiasing);
|
||||
painter.setPen(QPen(palette().brightText(), 1));
|
||||
|
||||
QRect timeRect = rect();
|
||||
QRect dateRect = rect();
|
||||
|
||||
QString format = m_shortTimeFormat;
|
||||
if (!m_24HourFormat) {
|
||||
if (position == Dock::Top || position == Dock::Bottom)
|
||||
format = format.append(" AP");
|
||||
else
|
||||
format = format.append("\nAP");
|
||||
}
|
||||
QString timeStr = current.toString(format);
|
||||
|
||||
format = m_shortDateFormat;
|
||||
QString dateStr = current.toString(format);
|
||||
|
||||
if (position == Dock::Top || position == Dock::Bottom) {
|
||||
// 只处理上下位置的,特殊处理一下藏文,其他的语言如果有问题也可以类似特殊处理一下
|
||||
// Unifont字体有点特殊
|
||||
// 以下的0.23 0.18 0.2 0.13数值是测试过程中微调时间跟日期之间的间距系数,不是特别计算的精确值
|
||||
QLocale locale;
|
||||
int timeHeight = QFontMetrics(m_timeFont).boundingRect(timeStr).height() + 2; // +2只是防止显示在边界的几个像素被截断
|
||||
int dateHeight = QFontMetrics(m_dateFont).boundingRect(dateStr).height() + 2;
|
||||
int marginH = (height() - timeHeight - dateHeight) / 2;
|
||||
|
||||
if (locale.language() == QLocale::Tibetan) {
|
||||
if (m_timeFont.family() == "Noto Serif Tibetan")
|
||||
marginH = marginH + 0.23 * timeHeight;
|
||||
else if (m_timeFont.family() == "Noto Sans Tibetan")
|
||||
marginH = marginH + 0.18 * timeHeight;
|
||||
else if (m_timeFont.family() == "Tibetan Machine Uni")
|
||||
marginH = marginH + 0.2 * timeHeight;
|
||||
} else {
|
||||
if (m_timeFont.family() != "Unifont")
|
||||
marginH = marginH + 0.13 * timeHeight;
|
||||
}
|
||||
|
||||
timeRect = QRect(0, marginH, width(), timeHeight);
|
||||
dateRect = QRect(0, height() - dateHeight - marginH, width(), dateHeight);
|
||||
} else {
|
||||
timeRect.setBottom(rect().center().y() + m_timeOffset);
|
||||
dateRect.setTop(timeRect.bottom());
|
||||
}
|
||||
painter.setFont(m_timeFont);
|
||||
painter.drawText(timeRect, Qt::AlignCenter, timeStr);
|
||||
|
||||
painter.setFont(m_dateFont);
|
||||
painter.drawText(dateRect, Qt::AlignCenter, dateStr);
|
||||
}
|
@ -1,52 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2018 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#ifndef DATETIMEWIDGET_H
|
||||
#define DATETIMEWIDGET_H
|
||||
|
||||
#include "org_deepin_dde_timedate1.h"
|
||||
|
||||
#include <QWidget>
|
||||
|
||||
using Timedate = org::deepin::dde::Timedate1;
|
||||
|
||||
class DatetimeWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
|
||||
public:
|
||||
explicit DatetimeWidget(QWidget *parent = 0);
|
||||
|
||||
bool is24HourFormat() const { return m_24HourFormat; }
|
||||
QSize sizeHint() const;
|
||||
|
||||
protected:
|
||||
void resizeEvent(QResizeEvent *event);
|
||||
void paintEvent(QPaintEvent *e);
|
||||
|
||||
signals:
|
||||
void requestUpdateGeometry() const;
|
||||
|
||||
public slots:
|
||||
void set24HourFormat(const bool value);
|
||||
|
||||
private Q_SLOTS:
|
||||
void setShortDateFormat(int type);
|
||||
void setShortTimeFormat(int type);
|
||||
|
||||
private:
|
||||
QSize curTimeSize() const;
|
||||
|
||||
private:
|
||||
bool m_24HourFormat;
|
||||
mutable QFont m_timeFont;
|
||||
mutable QFont m_dateFont;
|
||||
mutable int m_timeOffset;
|
||||
Timedate *m_timedateInter;
|
||||
QString m_shortDateFormat;
|
||||
QString m_shortTimeFormat;
|
||||
};
|
||||
|
||||
#endif // DATETIMEWIDGET_H
|
@ -1,72 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "zoneinfo.h"
|
||||
|
||||
ZoneInfo::ZoneInfo()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
bool ZoneInfo::operator ==(const ZoneInfo &what) const
|
||||
{
|
||||
// TODO: 这里只判断这两个成员应该就可以了
|
||||
return m_zoneName == what.m_zoneName &&
|
||||
m_utcOffset == what.m_utcOffset;
|
||||
}
|
||||
|
||||
QDebug operator<<(QDebug argument, const ZoneInfo & info)
|
||||
{
|
||||
argument << info.m_zoneName << ',' << info.m_zoneCity << ',' << info.m_utcOffset << ',';
|
||||
argument << info.i2 << ',' << info.i3 << ',' << info.i4 << endl;
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
QDBusArgument &operator<<(QDBusArgument & argument, const ZoneInfo & info)
|
||||
{
|
||||
argument.beginStructure();
|
||||
argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset;
|
||||
argument.beginStructure();
|
||||
argument << info.i2 << info.i3 << info.i4;
|
||||
argument.endStructure();
|
||||
argument.endStructure();
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
QDataStream &operator<<(QDataStream & argument, const ZoneInfo & info)
|
||||
{
|
||||
argument << info.m_zoneName << info.m_zoneCity << info.m_utcOffset;
|
||||
argument << info.i2 << info.i3 << info.i4;
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
const QDBusArgument &operator>>(const QDBusArgument & argument, ZoneInfo & info)
|
||||
{
|
||||
argument.beginStructure();
|
||||
argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset;
|
||||
argument.beginStructure();
|
||||
argument >> info.i2 >> info.i3 >> info.i4;
|
||||
argument.endStructure();
|
||||
argument.endStructure();
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
const QDataStream &operator>>(QDataStream & argument, ZoneInfo & info)
|
||||
{
|
||||
argument >> info.m_zoneName >> info.m_zoneCity >> info.m_utcOffset;
|
||||
argument >> info.i2 >> info.i3 >> info.i4;
|
||||
|
||||
return argument;
|
||||
}
|
||||
|
||||
void registerZoneInfoMetaType()
|
||||
{
|
||||
qRegisterMetaType<ZoneInfo>("ZoneInfo");
|
||||
qDBusRegisterMetaType<ZoneInfo>();
|
||||
}
|
@ -1,46 +0,0 @@
|
||||
// Copyright (C) 2011 ~ 2017 Deepin Technology Co., Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#ifndef ZONEINFO_H
|
||||
#define ZONEINFO_H
|
||||
|
||||
#include <QDebug>
|
||||
#include <QDataStream>
|
||||
#include <QString>
|
||||
#include <QDBusArgument>
|
||||
#include <QDBusMetaType>
|
||||
|
||||
class ZoneInfo
|
||||
{
|
||||
public:
|
||||
ZoneInfo();
|
||||
|
||||
friend QDebug operator<<(QDebug argument, const ZoneInfo &info);
|
||||
friend QDBusArgument &operator<<(QDBusArgument &argument, const ZoneInfo &info);
|
||||
friend QDataStream &operator<<(QDataStream &argument, const ZoneInfo &info);
|
||||
friend const QDBusArgument &operator>>(const QDBusArgument &argument, ZoneInfo &info);
|
||||
friend const QDataStream &operator>>(QDataStream &argument, ZoneInfo &info);
|
||||
|
||||
bool operator==(const ZoneInfo &what) const;
|
||||
|
||||
public:
|
||||
inline QString getZoneName() const {return m_zoneName;}
|
||||
inline QString getZoneCity() const {return m_zoneCity;}
|
||||
inline int getUTCOffset() const {return m_utcOffset;}
|
||||
|
||||
private:
|
||||
QString m_zoneName;
|
||||
QString m_zoneCity;
|
||||
int m_utcOffset;
|
||||
qint64 i2;
|
||||
qint64 i3;
|
||||
int i4;
|
||||
};
|
||||
|
||||
Q_DECLARE_METATYPE(ZoneInfo)
|
||||
|
||||
void registerZoneInfoMetaType();
|
||||
|
||||
#endif // ZONEINFO_H
|
@ -1,62 +0,0 @@
|
||||
<interface name="org.deepin.dde.Timedate1">
|
||||
<signal name="TimeUpdate">
|
||||
</signal>
|
||||
<method name="AddUserTimezone">
|
||||
<arg type="s" direction="in"></arg>
|
||||
</method>
|
||||
<method name="DeleteUserTimezone">
|
||||
<arg type="s" direction="in"></arg>
|
||||
</method>
|
||||
<method name="GetZoneInfo">
|
||||
<arg type="s" direction="in"></arg>
|
||||
<arg type="(ssi(xxi))" direction="out"></arg>
|
||||
<annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value ="ZoneInfo"/>
|
||||
</method>
|
||||
<method name="GetZoneList">
|
||||
<arg type="as" direction="out"></arg>
|
||||
</method>
|
||||
<method name="GetSampleNTPServers">
|
||||
<arg type="as" direction="out"></arg>
|
||||
</method>
|
||||
<method name="SetDate">
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
<arg type="i" direction="in"></arg>
|
||||
</method>
|
||||
<method name="SetLocalRTC">
|
||||
<arg type="b" direction="in"></arg>
|
||||
<arg type="b" direction="in"></arg>
|
||||
</method>
|
||||
<method name="SetNTP">
|
||||
<arg type="b" direction="in"></arg>
|
||||
</method>
|
||||
<method name="SetNTPServer">
|
||||
<arg type="s" direction="in"></arg>
|
||||
</method>
|
||||
<method name="SetTime">
|
||||
<arg type="x" direction="in"></arg>
|
||||
<arg type="b" direction="in"></arg>
|
||||
</method>
|
||||
<method name="SetTimezone">
|
||||
<arg type="s" direction="in"></arg>
|
||||
</method>
|
||||
<property name="CanNTP" type="b" access="read"></property>
|
||||
<property name="NTP" type="b" access="read"></property>
|
||||
<property name="LocalRTC" type="b" access="read"></property>
|
||||
<property name="Timezone" type="s" access="read"></property>
|
||||
<property name="Use24HourFormat" type="b" access="readwrite"></property>
|
||||
<property name="DSTOffset" type="i" access="readwrite"></property>
|
||||
<property name="UserTimezones" type="as" access="read"></property>
|
||||
<property name="NTPServer" type="s" access="read"></property>
|
||||
<property name="WeekdayFormat" type="i" access="readwrite"></property>
|
||||
<property name="ShortDateFormat" type="i" access="readwrite"></property>
|
||||
<property name="LongDateFormat" type="i" access="readwrite"></property>
|
||||
<property name="ShortTimeFormat" type="i" access="readwrite"></property>
|
||||
<property name="LongTimeFormat" type="i" access="readwrite"></property>
|
||||
<property name="WeekBegins" type="i" access="readwrite"></property>
|
||||
</interface>
|
||||
|
@ -1,25 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>时钟底板</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs>
|
||||
<circle id="path-1" cx="21" cy="21" r="21"></circle>
|
||||
<filter x="-50%" y="-50%" width="200%" height="200%" filterUnits="objectBoundingBox" id="filter-2">
|
||||
<feOffset dx="0" dy="1" in="SourceAlpha" result="shadowOffsetOuter1"></feOffset>
|
||||
<feGaussianBlur stdDeviation="1" in="shadowOffsetOuter1" result="shadowBlurOuter1"></feGaussianBlur>
|
||||
<feColorMatrix values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.2 0" type="matrix" in="shadowBlurOuter1"></feColorMatrix>
|
||||
</filter>
|
||||
</defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="时钟底板">
|
||||
<g id="Group-3" transform="translate(3.000000, 3.000000)">
|
||||
<g id="Oval-2">
|
||||
<use fill="black" fill-opacity="1" filter="url(#filter-2)" xlink:href="#path-1"></use>
|
||||
<use fill="#F9AF15" fill-rule="evenodd" xlink:href="#path-1"></use>
|
||||
</g>
|
||||
<circle id="Oval-2" fill="#FFFFFF" cx="21" cy="21" r="18.5"></circle>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.4 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大0</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大0" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,2.5749 L1,1.5039 L2,2.5749 L2,7.5079 Z M2,15.6395 L1,16.5515 L0,15.4805 L0,9.3015 L2,10.3725 L2,15.6395 Z M6.3906,1.002 L5.5296,2.002 L2.4836,2.002 L1.5786,1.002 L2.4836,0.002 L5.5296,0.002 L6.3906,1.002 Z M2.4843,16.0022 L1.5163,17.0022 L2.4843,18.0022 L5.7193,18.0022 L6.5153,17.0022 L5.5303,16.0022 L2.4843,16.0022 Z M5.9997,2.5751 L5.9997,7.5081 L8.0007,8.7531 L8.0007,2.5751 L6.9997,1.5041 L5.9997,2.5751 Z M5.9997,10.3727 L5.9997,15.5827 L6.9997,16.5517 L8.0007,15.4797 L8.0007,9.3007 L5.9997,10.3727 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大1</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大1" fill="#002422">
|
||||
<path d="M3,2.0018 L3,7.5078 L5,8.7538 L5,0.0018 L3,2.0018 Z M3,10.3727 L3,16.1047 L5,18.0017 L5,9.3007 L3,10.3727 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 680 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大2" fill="#002422">
|
||||
<path d="M2,15.6395 L1,16.5515 L0,15.4805 L0,9.3015 L2,10.3725 L2,15.6395 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M6.3906,1.002 L5.5296,2.002 L-0.0004,2.002 L1.9996,0.002 L5.5296,0.002 L6.3906,1.002 Z M2.4842,16.0022 L1.5162,17.0022 L2.4842,18.0022 L8.0002,18.0022 L5.8112,16.0022 L2.4842,16.0022 Z M8,8.7538 L6,7.5078 L6,2.5748 L7,1.5038 L8,2.5748 L8,8.7538 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 968 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大3</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大3" fill="#002422">
|
||||
<path d="M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M6.3906,1.002 L5.5296,2.002 L1.9996,2.002 L-0.0004,0.002 L5.5296,0.002 L6.3906,1.002 Z M1.9999,16.0022 L-0.0001,18.0022 L5.7189,18.0022 L6.5149,17.0022 L5.5299,16.0022 L1.9999,16.0022 Z M8,8.7538 L6,7.5078 L6,2.5748 L7,1.5038 L8,2.5748 L8,8.7538 Z M8,15.4801 L7,16.5521 L6,15.5831 L6,10.3731 L8,9.3011 L8,15.4801 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 969 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大4</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大4" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,0.0019 L2,2.0019 L2,7.5079 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M8,8.7538 L6,7.5078 L6,2.0018 L8,0.0018 L8,8.7538 Z M6.0003,10.3727 L6.0003,16.1047 L8.0003,18.0017 L8.0003,9.3007 L6.0003,10.3727 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 839 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大5</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大5" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,2.5749 L1,1.5039 L2,2.5749 L2,7.5079 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M5.5299,2.002 L2.4839,2.002 L1.5779,1.002 L2.4839,0.002 L7.5299,0.002 L5.5299,2.002 Z M2.4839,16.0022 L0.4839,18.0022 L5.7189,18.0022 L6.5159,17.0022 L5.5299,16.0022 L2.4839,16.0022 Z M8,15.4801 L7,16.5521 L6,15.5831 L6,10.3731 L8,9.3011 L8,15.4801 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 967 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大6</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大6" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,2.5749 L1,1.5039 L2,2.5749 L2,7.5079 Z M2,15.6395 L1,16.5515 L0,15.4805 L0,9.3015 L2,10.3725 L2,15.6395 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M5.5299,2.002 L2.4839,2.002 L1.5779,1.002 L2.4839,0.002 L7.5299,0.002 L5.5299,2.002 Z M2.4838,16.0022 L1.5158,17.0022 L2.4838,18.0022 L5.7188,18.0022 L6.5158,17.0022 L5.5308,16.0022 L2.4838,16.0022 Z M8,15.4801 L7,16.5521 L6,15.5831 L6,10.3731 L8,9.3011 L8,15.4801 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大7</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大7" fill="#002422">
|
||||
<path d="M5.5299,2.002 L1.9999,2.002 L-0.0001,0.002 L7.5299,0.002 L5.5299,2.002 Z M8,8.7538 L6,7.5078 L6,2.5748 L8,0.5748 L8,8.7538 Z M6,10.3727 L6,16.0537 L8,17.9507 L8,9.3007 L6,10.3727 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 753 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大8</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大8" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,2.5749 L1,1.5039 L2,2.5749 L2,7.5079 L2,7.5079 Z M2,15.6395 L1,16.5515 L0,15.4805 L0,9.3015 L2,10.3725 L2,15.6395 L2,15.6395 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 L7,9.002 Z M6.3906,1.002 L5.5296,2.002 L2.4836,2.002 L1.5786,1.002 L2.4836,0.002 L5.5296,0.002 L6.3906,1.002 L6.3906,1.002 Z M2.4836,16.0022 L1.5156,17.0022 L2.4836,18.0022 L5.7196,18.0022 L6.5156,17.0022 L5.5306,16.0022 L2.4836,16.0022 L2.4836,16.0022 Z M8,8.7538 L6,7.5078 L6,2.5748 L7,1.5038 L8,2.5748 L8,8.7538 L8,8.7538 Z M8,15.4801 L7,16.5521 L6,15.5831 L6,10.3731 L8,9.3011 L8,15.4801 L8,15.4801 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="8px" height="18px" viewBox="0 0 8 18" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字大9</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字大9" fill="#002422">
|
||||
<path d="M2,7.5079 L0,8.7539 L0,2.5749 L1,1.5039 L2,2.5749 L2,7.5079 Z M7,9.002 L5.406,10.002 L2.578,10.002 L1,9.007 L2.484,8.002 L5.53,8.002 L7,9.002 Z M6.3906,1.002 L5.5296,2.002 L2.4836,2.002 L1.5786,1.002 L2.4836,0.002 L5.5296,0.002 L6.3906,1.002 Z M2.4835,16.0022 L0.4835,18.0022 L5.7195,18.0022 L6.5155,17.0022 L5.5295,16.0022 L2.4835,16.0022 Z M8,8.7538 L6,7.5078 L6,2.5748 L7,1.5038 L8,2.5748 L8,8.7538 Z M8,15.4801 L7,16.5521 L6,15.5831 L6,10.3731 L8,9.3011 L8,15.4801 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小0</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小0" fill="#002422">
|
||||
<path d="M-0.0003,1.2581 L-0.0003,4.3581 L0.9997,3.7331 L0.9997,1.2581 L0.4997,0.7201 L-0.0003,1.2581 Z M-0.0003,7.7336 L0.4997,8.2716 L0.9997,7.7336 L0.9997,5.1716 L-0.0003,4.6336 L-0.0003,7.7336 Z M1.2516,0.0017 L0.7246,0.5137 L1.2516,1.0017 L3.7596,1.0017 L4.2886,0.5137 L3.7596,0.0017 L1.2516,0.0017 Z M1.2516,8.0018 L0.7246,8.4908 L1.2516,9.0018 L3.7596,9.0018 L4.2886,8.4908 L3.7596,8.0018 L1.2516,8.0018 Z M4.0002,1.2581 L4.0002,3.7331 L5.0002,4.3581 L5.0002,1.2581 L4.4992,0.7201 L4.0002,1.2581 Z M4.0002,5.1713 L4.0002,7.7333 L4.4992,8.2723 L5.0002,7.7333 L5.0002,4.6333 L4.0002,5.1713 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小1</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小1" fill="#002422">
|
||||
<path d="M2.0004,1.0781 L2.0004,3.7361 L3.0004,4.3591 L3.0004,0.0051 L2.0004,1.0781 Z M2.0004,5.1722 L2.0004,7.9232 L3.0004,9.0002 L3.0004,4.6342 L2.0004,5.1722 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 724 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小2</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小2" fill="#002422">
|
||||
<path d="M1.2519,0.0017 L0.0399,1.0017 L3.7599,1.0017 L4.2889,0.5137 L3.7599,0.0017 L1.2519,0.0017 Z M0,7.7336 L0.5,8.2716 L1,7.7336 L1,5.2746 L0,4.7366 L0,7.7336 Z M1.2519,4.0022 L0.2799,4.5452 L1.2519,5.0022 L3.7599,5.0022 L4.7319,4.5452 L3.7599,4.0022 L1.2519,4.0022 Z M1.2519,8.0018 L0.7249,8.4908 L1.2519,9.0018 L4.9599,9.0018 L3.9759,8.0018 L1.2519,8.0018 Z M3.9996,1.2581 L3.9996,3.7331 L5.0006,4.2681 L5.0006,1.2581 L4.4996,0.7201 L3.9996,1.2581 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1017 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小3</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小3" fill="#002422">
|
||||
<path d="M0.0174,0.0017 L1.0054,1.0017 L3.7384,1.0017 L4.2614,0.5137 L3.7384,0.0017 L0.0174,0.0017 Z M1.0056,8.0018 L0.0176,9.0018 L3.4926,9.0018 L4.0156,8.4908 L3.4926,8.0018 L1.0056,8.0018 Z M1.0056,4.0022 L0.0416,4.5452 L1.0056,5.0022 L3.4926,5.0022 L4.4566,4.5642 L3.4926,4.0022 L1.0056,4.0022 Z M3.9999,1.3058 L3.9999,3.7818 L4.9999,4.4058 L4.9999,1.3058 L4.4999,0.7678 L3.9999,1.3058 Z M3.9999,5.219 L3.9999,7.781 L4.4999,8.32 L4.9999,7.781 L4.9999,4.681 L3.9999,5.219 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.0 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小4</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小4" fill="#002422">
|
||||
<path d="M-0.0003,-0.0001 L-0.0003,4.2679 L0.9997,3.7389 L0.9997,1.0019 L-0.0003,-0.0001 Z M1.2516,4.0022 L0.2796,4.5452 L1.2516,5.0022 L3.7596,5.0022 L4.7316,4.5642 L3.7596,4.0022 L1.2516,4.0022 Z M4.0002,1.0016 L4.0002,3.7396 L5.0002,4.3626 L5.0002,0.0086 L4.0002,1.0016 Z M4.0002,5.3207 L4.0002,8.0017 L5.0002,9.0047 L5.0002,4.7827 L4.0002,5.3207 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 913 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小5</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小5" fill="#002422">
|
||||
<path d="M0,1.2581 L0,4.3581 L1,3.7331 L1,1.2581 L0.5,0.7201 L0,1.2581 Z M1.0503,8.0018 L0.0543,9.0018 L3.7733,9.0018 L4.3023,8.4908 L3.7733,8.0018 L1.0503,8.0018 Z M1.2663,4.0022 L0.2943,4.5452 L1.2663,5.0022 L3.7733,5.0022 L4.7453,4.5452 L3.7733,4.0022 L1.2663,4.0022 Z M1.2663,0.0017 L0.7383,0.5137 L1.2663,1.0017 L3.7733,1.0017 L4.7583,0.0017 L1.2663,0.0017 Z M3.9996,5.3207 L3.9996,7.7337 L4.4996,8.2717 L5.0006,7.7337 L5.0006,4.7827 L3.9996,5.3207 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1017 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小6</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小6" fill="#002422">
|
||||
<path d="M0.0003,1.2581 L0.0003,4.3581 L1.0003,3.7331 L1.0003,1.2581 L0.4993,0.7201 L0.0003,1.2581 Z M0.0003,7.7336 L0.4993,8.2716 L1.0003,7.7336 L1.0003,5.3206 L0.0003,4.7826 L0.0003,7.7336 Z M1.2063,4.0022 L0.2343,4.5452 L1.2063,5.0022 L3.7133,5.0022 L4.6853,4.5642 L3.7133,4.0022 L1.2063,4.0022 Z M1.2063,0.0017 L0.6783,0.5137 L1.2063,1.0017 L3.7133,1.0017 L4.6983,0.0017 L1.2063,0.0017 Z M1.2063,8.0018 L0.6783,8.4908 L1.2063,9.0018 L3.7133,9.0018 L4.2423,8.4908 L3.7133,8.0018 L1.2063,8.0018 Z M3.9999,5.3207 L3.9999,7.7337 L4.4999,8.2717 L4.9999,7.7337 L4.9999,4.7827 L3.9999,5.3207 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小7</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小7" fill="#002422">
|
||||
<path d="M0.2481,0.0017 L1.2731,1.0017 L3.7621,1.0017 L4.8161,0.0017 L0.2481,0.0017 Z M4.0002,1.2572 L4.0002,3.7322 L5.0002,4.3572 L5.0002,0.3452 L4.0002,1.2572 Z M4.0002,5.1704 L4.0002,8.0014 L5.0002,8.9984 L5.0002,4.6324 L4.0002,5.1704 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 801 B |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小8</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小8" fill="#002422">
|
||||
<path d="M0,1.2563 L0,4.3563 L1,3.7313 L1,1.2563 L0.5,0.7183 L0,1.2563 Z M1,7.7315 L0.5,8.2695 L0,7.7315 L0.006,4.7325 L1.006,5.2705 L1,7.7315 Z M1.2519,4.0022 L0.2799,4.5452 L1.2519,5.0022 L3.7599,5.0022 L4.7319,4.5642 L3.7599,4.0022 L1.2519,4.0022 Z M1.2519,0.0017 L0.7249,0.5137 L1.2519,1.0017 L3.7599,1.0017 L4.2889,0.5137 L3.7599,0.0017 L1.2519,0.0017 Z M1.2519,8.0018 L0.7249,8.4908 L1.2519,9.0018 L3.7599,9.0018 L4.2889,8.4908 L3.7599,8.0018 L1.2519,8.0018 Z M3.9996,1.2563 L3.9996,3.7313 L5.0006,4.3563 L5.0006,1.2563 L4.4996,0.7183 L3.9996,1.2563 Z M5,7.7315 L4.5,8.2695 L4,7.7315 L4.006,5.2705 L5.006,4.7325 L5,7.7315 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.2 KiB |
@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg width="5px" height="9px" viewBox="0 0 5 9" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 3.8.3 (29802) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>数字小9</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<defs></defs>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="数字小9" fill="#002422">
|
||||
<path d="M0.0003,1.2563 L0.0003,4.3563 L1.0003,3.8183 L1.0003,1.2563 L0.4993,0.7183 L0.0003,1.2563 Z M1.2522,8.0018 L0.2562,9.0018 L3.7592,9.0018 L4.2882,8.4908 L3.7592,8.0018 L1.2522,8.0018 Z M1.2522,4.0022 L0.2802,4.5452 L1.2522,5.0022 L3.7592,5.0022 L4.7312,4.5642 L3.7592,4.0022 L1.2522,4.0022 Z M1.2522,0.0017 L0.7242,0.5137 L1.2522,1.0017 L3.7592,1.0017 L4.2882,0.5137 L3.7592,0.0017 L1.2522,0.0017 Z M3.9999,1.2563 L3.9999,3.8183 L4.9999,4.3563 L4.9999,1.2563 L4.4999,0.7183 L3.9999,1.2563 Z M3.9999,5.2559 L3.9999,7.7319 L4.4999,8.2699 L4.9999,7.7319 L4.9999,4.6309 L3.9999,5.2559 Z" id="Combined-Shape"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.1 KiB |
@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 10 5" style="enable-background:new 0 0 10 5;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.3;fill:#2EA7E0;}
|
||||
.st1{fill:url(#SVGID_1_);}
|
||||
.st2{opacity:0.5;fill:url(#SVGID_2_);}
|
||||
.st3{fill:#FFFFFF;}
|
||||
.st4{opacity:0.4;}
|
||||
.st5{opacity:0.2;}
|
||||
.st6{fill:#0C0C0C;}
|
||||
.st7{fill:url(#SVGID_3_);}
|
||||
.st8{fill:#002422;}
|
||||
.st9{fill:url(#SVGID_4_);}
|
||||
.st10{fill:url(#SVGID_5_);}
|
||||
.st11{fill:url(#SVGID_6_);}
|
||||
.st12{fill:url(#SVGID_7_);}
|
||||
.st13{fill:#FFBC00;}
|
||||
.st14{fill:url(#SVGID_8_);}
|
||||
.st15{opacity:0.5;fill:url(#SVGID_9_);}
|
||||
.st16{fill:url(#SVGID_10_);}
|
||||
.st17{fill:url(#SVGID_11_);}
|
||||
.st18{fill:url(#SVGID_12_);}
|
||||
.st19{fill:url(#SVGID_13_);}
|
||||
.st20{fill:url(#SVGID_14_);}
|
||||
.st21{opacity:0.5;fill:#231815;}
|
||||
.st22{opacity:0.4;fill:#231815;}
|
||||
.st23{fill:#47E700;}
|
||||
.st24{fill:url(#SVGID_15_);}
|
||||
.st25{opacity:0.4;fill:#47E700;}
|
||||
.st26{opacity:0.7;fill:#2EA7E0;}
|
||||
.st27{opacity:0.48;}
|
||||
.st28{opacity:0.33;}
|
||||
.st29{opacity:0.38;}
|
||||
.st30{opacity:0.5;}
|
||||
.st31{fill:#CF9111;}
|
||||
.st32{fill:#F9AF15;}
|
||||
.st33{fill:#95A6A4;}
|
||||
.st34{opacity:0.5;fill:#00A0E9;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st33" d="M0,0v5h1V3h2v2h1V0H0z M3,2H1V1h2V2z"/>
|
||||
<polygon class="st33" points="8,0 7,0 6,0 5,0 5,1 5,5 6,5 6,1 7,1 7,5 8,5 8,1 9,1 9,5 10,5 10,1 10,0 9,0 "/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
@ -1,46 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- Generator: Adobe Illustrator 21.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||
<svg version="1.1" id="图层_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||
viewBox="0 0 10 5" style="enable-background:new 0 0 10 5;" xml:space="preserve">
|
||||
<style type="text/css">
|
||||
.st0{opacity:0.3;fill:#2EA7E0;}
|
||||
.st1{fill:url(#SVGID_1_);}
|
||||
.st2{opacity:0.5;fill:url(#SVGID_2_);}
|
||||
.st3{fill:#FFFFFF;}
|
||||
.st4{opacity:0.4;}
|
||||
.st5{opacity:0.2;}
|
||||
.st6{fill:#0C0C0C;}
|
||||
.st7{fill:url(#SVGID_3_);}
|
||||
.st8{fill:#002422;}
|
||||
.st9{fill:url(#SVGID_4_);}
|
||||
.st10{fill:url(#SVGID_5_);}
|
||||
.st11{fill:url(#SVGID_6_);}
|
||||
.st12{fill:url(#SVGID_7_);}
|
||||
.st13{fill:#FFBC00;}
|
||||
.st14{fill:url(#SVGID_8_);}
|
||||
.st15{opacity:0.5;fill:url(#SVGID_9_);}
|
||||
.st16{fill:url(#SVGID_10_);}
|
||||
.st17{fill:url(#SVGID_11_);}
|
||||
.st18{fill:url(#SVGID_12_);}
|
||||
.st19{fill:url(#SVGID_13_);}
|
||||
.st20{fill:url(#SVGID_14_);}
|
||||
.st21{opacity:0.5;fill:#231815;}
|
||||
.st22{opacity:0.4;fill:#231815;}
|
||||
.st23{fill:#47E700;}
|
||||
.st24{fill:url(#SVGID_15_);}
|
||||
.st25{opacity:0.4;fill:#47E700;}
|
||||
.st26{opacity:0.7;fill:#2EA7E0;}
|
||||
.st27{opacity:0.48;}
|
||||
.st28{opacity:0.33;}
|
||||
.st29{opacity:0.38;}
|
||||
.st30{opacity:0.5;}
|
||||
.st31{fill:#CF9111;}
|
||||
.st32{fill:#F9AF15;}
|
||||
.st33{fill:#95A6A4;}
|
||||
.st34{opacity:0.5;fill:#00A0E9;}
|
||||
</style>
|
||||
<g>
|
||||
<path class="st33" d="M0,5h1V3h3V0H0V5z M1,1h2v1H1V1z"/>
|
||||
<polygon class="st33" points="9,0 8,0 7,0 6,0 5,0 5,1 5,5 6,5 6,1 7,1 7,5 8,5 8,1 9,1 9,5 10,5 10,1 10,0 "/>
|
||||
</g>
|
||||
</svg>
|
Before Width: | Height: | Size: 1.5 KiB |
@ -12,13 +12,14 @@
|
||||
|
||||
const int ItemSpacing = 5;
|
||||
|
||||
BrightnessAdjWidget::BrightnessAdjWidget(QWidget *parent)
|
||||
BrightnessAdjWidget::BrightnessAdjWidget(BrightnessModel *model, QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_mainLayout(new QVBoxLayout(this))
|
||||
, m_brightnessModel(new BrightnessModel(this))
|
||||
, m_brightnessModel(model)
|
||||
{
|
||||
m_mainLayout->setMargin(0);
|
||||
m_mainLayout->setSpacing(ItemSpacing);
|
||||
connect(m_brightnessModel, &BrightnessModel::monitorChanged, this, &BrightnessAdjWidget::loadBrightnessItem);
|
||||
|
||||
loadBrightnessItem();
|
||||
}
|
||||
@ -28,6 +29,11 @@ void BrightnessAdjWidget::loadBrightnessItem()
|
||||
QList<BrightMonitor *> monitors = m_brightnessModel->monitors();
|
||||
int itemHeight = monitors.count() > 1 ? 56 : 30;
|
||||
|
||||
// 清理之前的widget
|
||||
while(m_mainLayout->count() > 0) {
|
||||
m_mainLayout->takeAt(0)->widget()->deleteLater();
|
||||
}
|
||||
|
||||
for (BrightMonitor *monitor : monitors) {
|
||||
SliderContainer *sliderContainer = new SliderContainer(this);
|
||||
if (monitors.count() > 1)
|
||||
@ -54,5 +60,6 @@ void BrightnessAdjWidget::loadBrightnessItem()
|
||||
|
||||
QMargins margins = this->contentsMargins();
|
||||
setFixedHeight(margins.top() + margins.bottom() + monitors.count() * itemHeight + monitors.count() * ItemSpacing);
|
||||
Q_EMIT sizeChanged();
|
||||
}
|
||||
|
||||
|
@ -19,9 +19,12 @@ class BrightnessAdjWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit BrightnessAdjWidget(QWidget *parent = nullptr);
|
||||
explicit BrightnessAdjWidget(BrightnessModel *model, QWidget *parent = nullptr);
|
||||
|
||||
private:
|
||||
Q_SIGNALS:
|
||||
void sizeChanged();
|
||||
|
||||
private Q_SLOTS:
|
||||
void loadBrightnessItem();
|
||||
|
||||
private:
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include <QDebug>
|
||||
#include <QApplication>
|
||||
#include <QScreen>
|
||||
#include <qobjectdefs.h>
|
||||
|
||||
static const QString serviceName("org.deepin.dde.Display1");
|
||||
static const QString servicePath("/org/deepin/dde/Display1");
|
||||
@ -88,14 +89,10 @@ void BrightnessModel::onPropertyChanged(const QDBusMessage &msg)
|
||||
if (defaultMonitor)
|
||||
Q_EMIT primaryChanged(defaultMonitor);
|
||||
} else if (changedProps.contains("Monitors")) {
|
||||
int oldSize = m_monitor.size();
|
||||
qDeleteAll(m_monitor);
|
||||
m_monitor = readMonitors(changedProps.value("Monitors").value<QList<QDBusObjectPath>>());
|
||||
if (oldSize == 1 && m_monitor.size() == 0) {
|
||||
Q_EMIT screenVisibleChanged(false);
|
||||
} else if (oldSize == 0 && m_monitor.size() == 1) {
|
||||
Q_EMIT screenVisibleChanged(true);
|
||||
}
|
||||
QDBusInterface dbusInter(serviceName, servicePath, serviceInterface, QDBusConnection::sessionBus());
|
||||
m_monitor = readMonitors(dbusInter.property("Monitors").value<QList<QDBusObjectPath>>());
|
||||
Q_EMIT monitorChanged();
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,7 +175,7 @@ void BrightMonitor::onPropertyChanged(const QDBusMessage &msg)
|
||||
|
||||
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||
if (changedProps.contains("Brightness")) {
|
||||
int brightness = static_cast<int>(changedProps.value("Brightness").value<double>() * 100);
|
||||
int brightness = QVariant(changedProps.value("Brightness").value<double>() * 100).toInt();
|
||||
if (brightness != m_brightness) {
|
||||
m_brightness = brightness;
|
||||
Q_EMIT brightnessChanged(brightness);
|
||||
|
@ -26,7 +26,7 @@ public:
|
||||
|
||||
Q_SIGNALS:
|
||||
void primaryChanged(BrightMonitor *);
|
||||
void screenVisibleChanged(bool);
|
||||
void monitorChanged();
|
||||
void monitorLightChanged();
|
||||
|
||||
protected Q_SLOTS:
|
||||
|
@ -1,267 +0,0 @@
|
||||
// Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "collaborationdevmodel.h"
|
||||
|
||||
#include <QIcon>
|
||||
#include <QTimer>
|
||||
#include <QDebug>
|
||||
#include <QDBusArgument>
|
||||
#include <QDBusInterface>
|
||||
#include <QDBusPendingCall>
|
||||
#include <QDBusServiceWatcher>
|
||||
|
||||
#include <DGuiApplicationHelper>
|
||||
|
||||
DGUI_USE_NAMESPACE
|
||||
DCORE_USE_NAMESPACE
|
||||
|
||||
static const QString CollaborationService = "org.deepin.dde.Cooperation1";
|
||||
static const QString CollaborationPath = "/org/deepin/dde/Cooperation1";
|
||||
static const QString CollaborationInterface = "org.deepin.dde.Cooperation1";
|
||||
static const QString ColPropertiesInterface = "org.freedesktop.DBus.Properties";
|
||||
|
||||
CollaborationDevModel::CollaborationDevModel(QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_colDbusInter(new QDBusInterface(CollaborationService, CollaborationPath, CollaborationInterface, QDBusConnection::sessionBus(), this))
|
||||
{
|
||||
if (m_colDbusInter->isValid()) {
|
||||
QList<QDBusObjectPath> paths = m_colDbusInter->property("Machines").value<QList<QDBusObjectPath>>();
|
||||
for (const QDBusObjectPath& path : paths) {
|
||||
CollaborationDevice *device = new CollaborationDevice(path.path(), this);
|
||||
if (device->isValid())
|
||||
m_devices[path.path()] = device;
|
||||
else
|
||||
device->deleteLater();
|
||||
}
|
||||
} else {
|
||||
qWarning() << CollaborationService << " is invalid";
|
||||
}
|
||||
|
||||
m_colDbusInter->connection().connect(CollaborationService, CollaborationPath, ColPropertiesInterface,
|
||||
"PropertiesChanged", "sa{sv}as", this, SLOT(onPropertyChanged(QDBusMessage)));
|
||||
|
||||
auto *dbusWatcher = new QDBusServiceWatcher(CollaborationService, m_colDbusInter->connection(),
|
||||
QDBusServiceWatcher::WatchForUnregistration, this);
|
||||
connect(dbusWatcher, &QDBusServiceWatcher::serviceUnregistered, this, [this](){
|
||||
qWarning() << CollaborationService << "unregistered";
|
||||
clear();
|
||||
});
|
||||
}
|
||||
|
||||
void CollaborationDevModel::checkServiceValid()
|
||||
{
|
||||
if (!m_colDbusInter->isValid()) {
|
||||
clear();
|
||||
}
|
||||
}
|
||||
|
||||
QList<CollaborationDevice *> CollaborationDevModel::devices() const
|
||||
{
|
||||
return m_devices.values();
|
||||
}
|
||||
|
||||
void CollaborationDevModel::onPropertyChanged(const QDBusMessage &msg)
|
||||
{
|
||||
QList<QVariant> arguments = msg.arguments();
|
||||
if (3 != arguments.count())
|
||||
return;
|
||||
|
||||
QString interfaceName = msg.arguments().at(0).toString();
|
||||
if (interfaceName != CollaborationInterface)
|
||||
return;
|
||||
|
||||
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||
if (changedProps.contains("Machines")) {
|
||||
QList<QDBusObjectPath> paths = m_colDbusInter->property("Machines").value<QList<QDBusObjectPath>>();
|
||||
QStringList devPaths;
|
||||
for (const QDBusObjectPath& path : paths) {
|
||||
devPaths << path.path();
|
||||
}
|
||||
updateDevice(devPaths);
|
||||
}
|
||||
}
|
||||
|
||||
void CollaborationDevModel::updateDevice(const QStringList &devPaths)
|
||||
{
|
||||
if (devPaths.isEmpty()) {
|
||||
qDeleteAll(m_devices);
|
||||
m_devices.clear();
|
||||
} else {
|
||||
// 清除已不存在的设备
|
||||
QMapIterator<QString, CollaborationDevice *> it(m_devices);
|
||||
while (it.hasNext()) {
|
||||
it.next();
|
||||
if (!devPaths.contains(it.key())) {
|
||||
it.value()->deleteLater();
|
||||
m_devices.remove(it.key());
|
||||
}
|
||||
}
|
||||
|
||||
// 添加新增设备
|
||||
for (const QString &path : devPaths) {
|
||||
if (!m_devices.contains(path)) {
|
||||
CollaborationDevice *device = new CollaborationDevice(path, this);
|
||||
if (device->isValid())
|
||||
m_devices[path] = device;
|
||||
else
|
||||
device->deleteLater();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
emit devicesChanged();
|
||||
}
|
||||
|
||||
void CollaborationDevModel::clear()
|
||||
{
|
||||
for (CollaborationDevice *device : m_devices) {
|
||||
device->deleteLater();
|
||||
}
|
||||
m_devices.clear();
|
||||
|
||||
Q_EMIT devicesChanged();
|
||||
}
|
||||
|
||||
CollaborationDevice *CollaborationDevModel::getDevice(const QString &machinePath)
|
||||
{
|
||||
return m_devices.value(machinePath, nullptr);
|
||||
}
|
||||
|
||||
CollaborationDevice::CollaborationDevice(const QString &devPath, QObject *parent)
|
||||
: QObject(parent)
|
||||
, m_path(devPath)
|
||||
, m_OS(-1)
|
||||
, m_isConnected(false)
|
||||
, m_isCooperated(false)
|
||||
, m_isValid(false)
|
||||
, m_isCooperating(false)
|
||||
, m_devDbusInter(new QDBusInterface(CollaborationService, devPath, CollaborationInterface + QString(".Machine"),
|
||||
QDBusConnection::sessionBus(), this))
|
||||
{
|
||||
if (m_devDbusInter->isValid()) {
|
||||
m_name = m_devDbusInter->property("Name").toString();
|
||||
m_OS = m_devDbusInter->property("OS").toInt();
|
||||
m_isConnected = m_devDbusInter->property("Connected").toBool();
|
||||
m_isCooperated = m_devDbusInter->property("DeviceSharing").toBool();
|
||||
m_uuid = m_devDbusInter->property("UUID").toString();
|
||||
m_isValid = true;
|
||||
} else {
|
||||
qWarning() << "CollaborationDevice devPath:" << devPath << " is invalid and get properties failed";
|
||||
}
|
||||
|
||||
m_devDbusInter->connection().connect(CollaborationService, m_path, ColPropertiesInterface, "PropertiesChanged",
|
||||
this, SLOT(onPropertyChanged(QDBusMessage)));
|
||||
}
|
||||
|
||||
bool CollaborationDevice::isValid() const
|
||||
{
|
||||
// not show android device
|
||||
return m_isValid && m_OS != Android;
|
||||
}
|
||||
|
||||
QString CollaborationDevice::name() const
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
QString CollaborationDevice::uuid() const
|
||||
{
|
||||
return m_uuid;
|
||||
}
|
||||
|
||||
QString CollaborationDevice::machinePath() const
|
||||
{
|
||||
return m_path;
|
||||
}
|
||||
|
||||
QString CollaborationDevice::deviceIcon() const
|
||||
{
|
||||
switch (m_OS) {
|
||||
case DeviceType::Android: {
|
||||
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType)
|
||||
return QString(":/ICON_Device_Headphone_dark.svg");
|
||||
|
||||
return QString(":/ICON_Device_Headphone.svg");
|
||||
}
|
||||
default: {
|
||||
if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType)
|
||||
return QString(":/ICON_Device_Laptop_dark.svg");
|
||||
|
||||
return QString(":/ICON_Device_Laptop.svg");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool CollaborationDevice::isConnected() const
|
||||
{
|
||||
return m_isConnected;
|
||||
}
|
||||
|
||||
bool CollaborationDevice::isCooperated() const
|
||||
{
|
||||
return m_isCooperated;
|
||||
}
|
||||
|
||||
void CollaborationDevice::setDeviceIsCooperating(bool isCooperating)
|
||||
{
|
||||
m_isCooperating = isCooperating;
|
||||
}
|
||||
|
||||
void CollaborationDevice::onPropertyChanged(const QDBusMessage &msg)
|
||||
{
|
||||
QList<QVariant> arguments = msg.arguments();
|
||||
if (3 != arguments.count())
|
||||
return;
|
||||
|
||||
QString interfaceName = msg.arguments().at(0).toString();
|
||||
if (interfaceName != QString("%1.Machine").arg(CollaborationInterface))
|
||||
return;
|
||||
|
||||
QVariantMap changedProps = qdbus_cast<QVariantMap>(arguments.at(1).value<QDBusArgument>());
|
||||
if (changedProps.contains("Connected")) {
|
||||
bool isConnected = changedProps.value("Connected").value<bool>();
|
||||
m_isConnected = isConnected;
|
||||
if (isConnected && m_isCooperating) {
|
||||
// paired 成功之后再去请求cooperate
|
||||
requestCooperate();
|
||||
}
|
||||
|
||||
if (!isConnected){
|
||||
Q_EMIT pairedStateChanged(false);
|
||||
}
|
||||
} else if (changedProps.contains("DeviceSharing")) {
|
||||
m_isCooperated = changedProps.value("DeviceSharing").value<bool>();
|
||||
|
||||
Q_EMIT pairedStateChanged(m_isCooperated);
|
||||
}
|
||||
}
|
||||
|
||||
void CollaborationDevice::requestCooperate() const
|
||||
{
|
||||
callMethod("RequestDeviceSharing");
|
||||
}
|
||||
|
||||
void CollaborationDevice::disconnectDevice() const
|
||||
{
|
||||
callMethod("Disconnect");
|
||||
}
|
||||
|
||||
void CollaborationDevice::connect() const
|
||||
{
|
||||
callMethod("Connect");
|
||||
}
|
||||
|
||||
QDBusMessage CollaborationDevice::callMethod(const QString &methodName) const
|
||||
{
|
||||
if (m_devDbusInter->isValid()) {
|
||||
QDBusMessage msg = m_devDbusInter->call(methodName);
|
||||
qInfo() << "CollaborationDevice callMethod:" << methodName << " " << msg.errorMessage();
|
||||
return msg;
|
||||
}
|
||||
|
||||
qWarning() << "CollaborationDevice callMethod: " << methodName << " failed";
|
||||
return QDBusMessage();
|
||||
}
|
@ -1,108 +0,0 @@
|
||||
// Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#ifndef COLLABORATION_DEV_MODEL_H
|
||||
#define COLLABORATION_DEV_MODEL_H
|
||||
|
||||
#include <QMap>
|
||||
#include <QObject>
|
||||
|
||||
class QTimer;
|
||||
class QDBusInterface;
|
||||
class QDBusMessage;
|
||||
class CollaborationDevice;
|
||||
|
||||
/*!
|
||||
* \brief The CollaborationDevModel class
|
||||
* 协同设备model
|
||||
*/
|
||||
class CollaborationDevModel : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CollaborationDevModel(QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
void devicesChanged();
|
||||
|
||||
public:
|
||||
void checkServiceValid();
|
||||
|
||||
QList<CollaborationDevice *> devices() const;
|
||||
CollaborationDevice *getDevice(const QString &machinePath);
|
||||
|
||||
private slots:
|
||||
void onPropertyChanged(const QDBusMessage &msg);
|
||||
|
||||
private:
|
||||
void updateDevice(const QStringList &devPaths);
|
||||
void clear();
|
||||
|
||||
private:
|
||||
QDBusInterface *m_colDbusInter;
|
||||
// machine path : device object
|
||||
QMap<QString, CollaborationDevice *> m_devices;
|
||||
|
||||
};
|
||||
|
||||
/*!
|
||||
* \brief The CollaborationDevice class
|
||||
* 协同设备类
|
||||
*/
|
||||
class CollaborationDevice : public QObject
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit CollaborationDevice(const QString &devPath, QObject *parent = nullptr);
|
||||
|
||||
signals:
|
||||
void pairedStateChanged(bool);
|
||||
|
||||
public:
|
||||
bool isValid() const;
|
||||
void connect() const;
|
||||
void requestCooperate() const;
|
||||
void disconnectDevice() const;
|
||||
|
||||
QString name() const;
|
||||
QString uuid() const;
|
||||
QString machinePath() const;
|
||||
QString deviceIcon() const;
|
||||
bool isConnected() const;
|
||||
bool isCooperated() const;
|
||||
void setDeviceIsCooperating(bool isCooperating);
|
||||
|
||||
private slots:
|
||||
void onPropertyChanged(const QDBusMessage &msg);
|
||||
|
||||
private:
|
||||
QDBusMessage callMethod(const QString &methodName) const;
|
||||
|
||||
private:
|
||||
enum DeviceType {
|
||||
Other = 0,
|
||||
UOS,
|
||||
Linux,
|
||||
Windows,
|
||||
MacOS,
|
||||
Android
|
||||
};
|
||||
|
||||
QString m_path;
|
||||
QString m_name;
|
||||
QString m_uuid;
|
||||
int m_OS;
|
||||
|
||||
bool m_isConnected;
|
||||
bool m_isCooperated;
|
||||
bool m_isValid;
|
||||
|
||||
// 标记任务栏点击触发协同连接
|
||||
bool m_isCooperating;
|
||||
|
||||
QDBusInterface *m_devDbusInter;
|
||||
};
|
||||
|
||||
#endif // COLLABORATION_DEV_MODEL_H
|
@ -1,241 +0,0 @@
|
||||
// Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "devcollaborationwidget.h"
|
||||
#include "collaborationdevmodel.h"
|
||||
#include "devitemdelegate.h"
|
||||
|
||||
#include <DStyle>
|
||||
|
||||
#include <QMap>
|
||||
#include <QTimer>
|
||||
#include <QLabel>
|
||||
#include <QVBoxLayout>
|
||||
#include <QStandardItemModel>
|
||||
|
||||
#define TITLE_HEIGHT 30
|
||||
#define ITEM_WIDTH 310
|
||||
#define ITEM_HEIGHT 36
|
||||
#define LISTVIEW_ITEM_SPACE 5
|
||||
#define PER_DEGREE 14
|
||||
|
||||
DevCollaborationWidget::DevCollaborationWidget(QWidget *parent)
|
||||
: QWidget(parent)
|
||||
, m_deviceModel(new CollaborationDevModel(this))
|
||||
, m_deviceListView(new DListView(this))
|
||||
, m_viewItemModel(new QStandardItemModel(m_deviceListView))
|
||||
, m_refreshTimer(new QTimer(this))
|
||||
{
|
||||
initUI();
|
||||
loadDevice();
|
||||
|
||||
connect(m_deviceModel, &CollaborationDevModel::devicesChanged, this, &DevCollaborationWidget::loadDevice);
|
||||
connect(m_deviceListView, &DListView::clicked, this, &DevCollaborationWidget::itemClicked);
|
||||
connect(m_refreshTimer, &QTimer::timeout, this, &DevCollaborationWidget::refreshViewItem);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::showEvent(QShowEvent *event)
|
||||
{
|
||||
m_deviceModel->checkServiceValid();
|
||||
|
||||
QWidget::showEvent(event);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::resizeEvent(QResizeEvent *event)
|
||||
{
|
||||
Q_EMIT sizeChanged();
|
||||
|
||||
QWidget::resizeEvent(event);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::initUI()
|
||||
{
|
||||
m_deviceListView->setModel(m_viewItemModel);
|
||||
|
||||
QLabel *title = new QLabel(tr("PC collaboration"), this);
|
||||
title->setFixedHeight(TITLE_HEIGHT);
|
||||
|
||||
QHBoxLayout *hLayout = new QHBoxLayout();
|
||||
hLayout->setContentsMargins(10, 0, 0, 0);
|
||||
hLayout->addWidget(title);
|
||||
|
||||
QVBoxLayout *mainLayout = new QVBoxLayout();
|
||||
mainLayout->setMargin(0);
|
||||
mainLayout->setContentsMargins(0, 0, 0, 0);
|
||||
mainLayout->setSpacing(0);
|
||||
mainLayout->addLayout(hLayout);
|
||||
mainLayout->addWidget(m_deviceListView);
|
||||
|
||||
setLayout(mainLayout);
|
||||
|
||||
m_deviceListView->setContentsMargins(0, 0, 0, 0);
|
||||
m_deviceListView->setFrameShape(QFrame::NoFrame);
|
||||
m_deviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded);
|
||||
m_deviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
|
||||
m_deviceListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
|
||||
m_deviceListView->setResizeMode(QListView::Adjust);
|
||||
m_deviceListView->setViewportMargins(0, 0, 0, 0);
|
||||
m_deviceListView->setSpacing(LISTVIEW_ITEM_SPACE);
|
||||
m_deviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers);
|
||||
m_deviceListView->setItemDelegate(new DevItemDelegate(this));
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::loadDevice()
|
||||
{
|
||||
if (!m_deviceListView->count()) {
|
||||
for (CollaborationDevice *device : m_deviceModel->devices()) {
|
||||
addItem(device);
|
||||
}
|
||||
} else {
|
||||
updateDeviceListView();
|
||||
}
|
||||
|
||||
if(!m_deviceListView->count()) {
|
||||
m_deviceListView->hide();
|
||||
} else {
|
||||
if (!m_deviceListView->isVisible())
|
||||
m_deviceListView->setVisible(true);
|
||||
|
||||
m_deviceListView->setFixedSize(ITEM_WIDTH, m_deviceListView->count() * ITEM_HEIGHT + LISTVIEW_ITEM_SPACE * (m_deviceListView->count() * 2));
|
||||
}
|
||||
|
||||
resetWidgetSize();
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::addItem(const CollaborationDevice *device)
|
||||
{
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
QStandardItem *item = new QStandardItem();
|
||||
DevItemDelegate::DevItemData data;
|
||||
data.checkedIconPath = device->deviceIcon(); // TODO
|
||||
data.text = device->name();
|
||||
data.iconPath = device->deviceIcon();
|
||||
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
|
||||
|
||||
item->setData(QVariant::fromValue(data), DevItemDelegate::StaticDataRole);
|
||||
item->setData(device->machinePath(), DevItemDelegate::MachinePathDataRole);
|
||||
item->setData(0, DevItemDelegate::DegreeDataRole);
|
||||
item->setData(resultState, DevItemDelegate::ResultDataRole);
|
||||
|
||||
m_viewItemModel->appendRow(item);
|
||||
m_deviceItemMap[device->machinePath()] = item;
|
||||
|
||||
connect(device, &CollaborationDevice::pairedStateChanged, this, &DevCollaborationWidget::itemStatusChanged);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::updateDeviceListView()
|
||||
{
|
||||
QList<CollaborationDevice *> devices = m_deviceModel->devices();
|
||||
if (devices.isEmpty()) {
|
||||
m_deviceListView->removeItems(0, m_deviceListView->count());
|
||||
m_deviceItemMap.clear();
|
||||
m_connectingDevices.clear();
|
||||
return;
|
||||
}
|
||||
|
||||
// 删除不存在设备
|
||||
for (int row = 0; row < m_deviceListView->count(); row++) {
|
||||
QStandardItem *item = m_viewItemModel->item(row);
|
||||
if (!item)
|
||||
continue;
|
||||
|
||||
QString machinePath = item->data(DevItemDelegate::MachinePathDataRole).toString();
|
||||
if (m_deviceModel->getDevice(machinePath))
|
||||
continue;
|
||||
|
||||
m_deviceListView->removeItem(row);
|
||||
|
||||
if (m_deviceItemMap.contains(machinePath)) {
|
||||
m_deviceItemMap.remove(machinePath);
|
||||
}
|
||||
|
||||
if (m_connectingDevices.contains(machinePath)) {
|
||||
m_connectingDevices.removeAll(machinePath);
|
||||
}
|
||||
}
|
||||
|
||||
// 处理新增
|
||||
for (CollaborationDevice *device : devices) {
|
||||
if (!m_deviceItemMap.contains(device->machinePath())) {
|
||||
addItem(device);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::resetWidgetSize()
|
||||
{
|
||||
int height = TITLE_HEIGHT + (m_deviceListView->count() ? m_deviceListView->height() : 0);
|
||||
|
||||
setFixedSize(ITEM_WIDTH, height);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::itemClicked(const QModelIndex &index)
|
||||
{
|
||||
QString machinePath = index.data(DevItemDelegate::MachinePathDataRole).toString();
|
||||
CollaborationDevice *device = m_deviceModel->getDevice(machinePath);
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
if (!device->isConnected()) {
|
||||
device->setDeviceIsCooperating(true);
|
||||
device->connect();
|
||||
if (!m_connectingDevices.contains(machinePath))
|
||||
m_connectingDevices.append(machinePath);
|
||||
} else if (!device->isCooperated()) {
|
||||
device->requestCooperate();
|
||||
if (!m_connectingDevices.contains(machinePath))
|
||||
m_connectingDevices.append(machinePath);
|
||||
} else if (device->isCooperated()) {
|
||||
device->disconnectDevice();
|
||||
if (m_connectingDevices.contains(machinePath))
|
||||
m_connectingDevices.removeOne(machinePath);
|
||||
}
|
||||
|
||||
if (!m_connectingDevices.isEmpty() && !m_refreshTimer->isActive())
|
||||
m_refreshTimer->start(80);
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::itemStatusChanged()
|
||||
{
|
||||
CollaborationDevice *device = qobject_cast<CollaborationDevice *>(sender());
|
||||
if (!device)
|
||||
return;
|
||||
|
||||
device->setDeviceIsCooperating(false);
|
||||
QString machinePath = device->machinePath();
|
||||
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
|
||||
// 更新item的连接状态
|
||||
int resultState = device->isCooperated() ? DevItemDelegate::Connected : DevItemDelegate::None;
|
||||
m_deviceItemMap[machinePath]->setData(resultState, DevItemDelegate::ResultDataRole);
|
||||
if (device->isCooperated() || !device->isConnected())
|
||||
m_deviceItemMap[machinePath]->setData(0, DevItemDelegate::DegreeDataRole);
|
||||
|
||||
m_deviceListView->update(m_deviceItemMap[machinePath]->index());
|
||||
|
||||
if ((resultState == DevItemDelegate::Connected || !device->isConnected()) && m_connectingDevices.contains(machinePath)) {
|
||||
m_connectingDevices.removeAll(machinePath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DevCollaborationWidget::refreshViewItem()
|
||||
{
|
||||
if (m_connectingDevices.isEmpty()) {
|
||||
m_refreshTimer->stop();
|
||||
return;
|
||||
}
|
||||
|
||||
for (const QString &machinePath : m_connectingDevices) {
|
||||
if (m_deviceItemMap.contains(machinePath) && m_deviceItemMap[machinePath]) {
|
||||
int degree = m_deviceItemMap[machinePath]->data(DevItemDelegate::DegreeDataRole).toInt();
|
||||
degree += PER_DEGREE; // 递进值
|
||||
m_deviceItemMap[machinePath]->setData(DevItemDelegate::Connecting, DevItemDelegate::ResultDataRole);
|
||||
m_deviceItemMap[machinePath]->setData(degree, DevItemDelegate::DegreeDataRole);
|
||||
m_deviceListView->update(m_deviceItemMap[machinePath]->index());
|
||||
}
|
||||
}
|
||||
}
|
@ -1,57 +0,0 @@
|
||||
// Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#ifndef DEVICE_COLLABORATION_WIDGET_H
|
||||
#define DEVICE_COLLABORATION_WIDGET_H
|
||||
|
||||
#include <QWidget>
|
||||
#include <DListView>
|
||||
|
||||
DWIDGET_USE_NAMESPACE
|
||||
|
||||
class CollaborationDevice;
|
||||
class CollaborationDevModel;
|
||||
|
||||
/*!
|
||||
* \brief The DevCollaborationWidget class
|
||||
* 设备跨端协同子页面
|
||||
*/
|
||||
class DevCollaborationWidget : public QWidget
|
||||
{
|
||||
Q_OBJECT
|
||||
public:
|
||||
explicit DevCollaborationWidget(QWidget *parent = nullptr);
|
||||
|
||||
signals:
|
||||
void sizeChanged();
|
||||
|
||||
protected:
|
||||
void showEvent(QShowEvent *event) override;
|
||||
void resizeEvent(QResizeEvent *event) override;
|
||||
|
||||
private slots:
|
||||
void loadDevice();
|
||||
void itemClicked(const QModelIndex &index);
|
||||
void itemStatusChanged();
|
||||
void refreshViewItem();
|
||||
|
||||
private:
|
||||
void initUI();
|
||||
void updateDeviceListView();
|
||||
|
||||
void addItem(const CollaborationDevice *device);
|
||||
void resetWidgetSize();
|
||||
|
||||
private:
|
||||
CollaborationDevModel *m_deviceModel;
|
||||
DListView *m_deviceListView;
|
||||
QStandardItemModel *m_viewItemModel;
|
||||
QMap<QString, QStandardItem *> m_deviceItemMap;
|
||||
QStringList m_connectingDevices;
|
||||
|
||||
QTimer *m_refreshTimer;
|
||||
};
|
||||
|
||||
#endif // DEVICE_COLLABORATION_WIDGET_H
|
@ -1,164 +0,0 @@
|
||||
// Copyright (C) 2021 ~ 2022 Uniontech Software Technology Co.,Ltd.
|
||||
// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd.
|
||||
//
|
||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||
|
||||
#include "devitemdelegate.h"
|
||||
|
||||
#include <QtMath>
|
||||
#include <QPainter>
|
||||
#include <QPainterPath>
|
||||
|
||||
#include <DFontSizeManager>
|
||||
|
||||
#define RADIUS_VALUE 10
|
||||
#define ITEM_SPACE 20
|
||||
#define ICON_WIDTH 16
|
||||
#define ICON_HEIGHT 16
|
||||
#define TEXT_RECT_HEIGHT 20
|
||||
#define ITEM_HEIGHT 36
|
||||
#define INDICATOR_SHADOW_OFFSET 10
|
||||
|
||||
DevItemDelegate::DevItemDelegate(QObject *parent)
|
||||
: QStyledItemDelegate(parent)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void DevItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||
{
|
||||
if (!index.isValid())
|
||||
return;
|
||||
|
||||
painter->setRenderHint(QPainter::Antialiasing);
|
||||
QVariant var = index.data(StaticDataRole);
|
||||
DevItemData itemData = var.value<DevItemData>();
|
||||
QRect rect = option.rect;
|
||||
QPen pen;
|
||||
pen.setWidth(2);
|
||||
|
||||
// 鼠标悬停
|
||||
if (option.state.testFlag(QStyle::State_MouseOver)) {
|
||||
pen.setColor(QColor("#EBECED"));
|
||||
painter->setPen(pen);
|
||||
painter->setBrush(QColor("#EBECED"));
|
||||
painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE);
|
||||
}
|
||||
|
||||
// 选中背景(连接上和选中)
|
||||
int result = index.data(ResultDataRole).toInt();
|
||||
if (option.state.testFlag(QStyle::State_Selected) && result == Connected) {
|
||||
pen.setColor(QColor("#0081FF"));
|
||||
painter->setPen(pen);
|
||||
painter->setBrush(QColor("#0081FF"));
|
||||
painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE);
|
||||
} else {
|
||||
// 绘制默认背景
|
||||
pen.setColor(QColor("#EBECED"));
|
||||
painter->setPen(pen);
|
||||
painter->setBrush(QColor("#EBECED"));
|
||||
painter->drawRoundedRect(rect, RADIUS_VALUE, RADIUS_VALUE);
|
||||
}
|
||||
|
||||
bool selected = (option.state.testFlag(QStyle::State_Selected) && result == Connected);
|
||||
|
||||
// 绘制Icon
|
||||
QString imagePath = selected ? itemData.checkedIconPath : itemData.iconPath;
|
||||
QRect iconRect = QRect(rect.left() + ITEM_SPACE, rect.top() + rect.height() / 2 - ICON_HEIGHT / 2,
|
||||
ICON_WIDTH, ICON_HEIGHT);
|
||||
painter->drawImage(iconRect, QImage(imagePath));
|
||||
|
||||
// 绘制text
|
||||
QFont font = Dtk::Widget::DFontSizeManager::instance()->t4();
|
||||
painter->setFont(font);
|
||||
pen.setColor(selected ? Qt::white : Qt::black);
|
||||
painter->setPen(pen);
|
||||
|
||||
int textRectWidth = rect.width() - ITEM_SPACE - iconRect.width() - iconRect.width() - ITEM_SPACE;
|
||||
QRect textRect = QRect(iconRect.right() + ITEM_SPACE, rect.top() + 2,
|
||||
textRectWidth, rect.height());
|
||||
|
||||
QFontMetrics fm(font);
|
||||
QString itemText = fm.elidedText(itemData.text, Qt::ElideRight, textRectWidth);
|
||||
painter->drawText(textRect, itemText);
|
||||
|
||||
switch (result) {
|
||||
case ResultState::Connected:
|
||||
drawResultState(painter, rect);
|
||||
break;
|
||||
case ResultState::Connecting:
|
||||
drawWaitingState(painter, rect, index.data(DegreeDataRole).toInt());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
QSize DevItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const
|
||||
{
|
||||
Q_UNUSED(index)
|
||||
return QSize(option.rect.width(), ITEM_HEIGHT);
|
||||
}
|
||||
|
||||
void DevItemDelegate::drawWaitingState(QPainter *painter, const QRect &rect, int degree) const
|
||||
{
|
||||
int left = rect.width() - ITEM_SPACE;
|
||||
int top = rect.top() + rect.height() / 2 - ICON_HEIGHT / 2;
|
||||
QRect newRect(left, top, ICON_WIDTH, ICON_HEIGHT);
|
||||
|
||||
painter->setRenderHint(QPainter::Antialiasing, true);
|
||||
QList<QList<QColor>> indicatorColors;
|
||||
for (int i = 0; i < 3; i++)
|
||||
indicatorColors << createDefaultIndicatorColorList(QColor("#0081FF"));
|
||||
|
||||
double radius = 16 * 0.66;
|
||||
auto center = QRectF(newRect).center();
|
||||
auto indicatorRadius = radius / 2 / 2 * 1.1;
|
||||
auto indicatorDegreeDelta = 360 / indicatorColors.count();
|
||||
|
||||
for (int i = 0; i < indicatorColors.count(); ++i) {
|
||||
QList<QColor> colors = indicatorColors.value(i);
|
||||
for (int j = 0; j < colors.count(); ++j) {
|
||||
double degreeCurrent = degree - j * INDICATOR_SHADOW_OFFSET + indicatorDegreeDelta * i;
|
||||
auto x = (radius - indicatorRadius) * qCos(qDegreesToRadians(degreeCurrent));
|
||||
auto y = (radius - indicatorRadius) * qSin(qDegreesToRadians(degreeCurrent));
|
||||
|
||||
x = center.x() + x;
|
||||
y = center.y() + y;
|
||||
auto tl = QPointF(x - 1 * indicatorRadius, y - 1 * indicatorRadius);
|
||||
QRectF rf(tl.x(), tl.y(), indicatorRadius * 2, indicatorRadius * 2);
|
||||
|
||||
QPainterPath path;
|
||||
path.addEllipse(rf);
|
||||
|
||||
painter->fillPath(path, colors.value(j));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void DevItemDelegate::drawResultState(QPainter *painter, const QRect &rect) const
|
||||
{
|
||||
// 绘制对勾,14x12
|
||||
int left = rect.width() - ITEM_SPACE;
|
||||
int top = rect.top() + rect.height() / 2 - 6;
|
||||
|
||||
QPainterPath path;
|
||||
path.moveTo(left, top + 6);
|
||||
path.lineTo(left + 4, top + 11);
|
||||
path.lineTo(left + 12, top + 1);
|
||||
|
||||
painter->drawPath(path);
|
||||
}
|
||||
|
||||
QList<QColor> DevItemDelegate::createDefaultIndicatorColorList(QColor color) const
|
||||
{
|
||||
QList<QColor> colors;
|
||||
QList<int> opacitys;
|
||||
opacitys << 100 << 30 << 15 << 10 << 5 << 4 << 3 << 2 << 1;
|
||||
for (int i = 0; i < opacitys.count(); ++i) {
|
||||
color.setAlpha(255 * opacitys.value(i) / 100);
|
||||
colors << color;
|
||||
}
|
||||
|
||||
return colors;
|
||||
}
|