Compare commits

...

102 Commits

Author SHA1 Message Date
jingshenghao
a90f386ddc feat: Add files generated by qdbusXML2cpp and DCONG2cpp
Add files generated by qdbusXML2cpp and DCONG2cpp

Log: Add files generated by qdbusXML2cpp and DCONG2cpp
2025-01-14 19:32:23 +08:00
deepin-admin-bot
13c4162b5e chore: Sync by 3ab9683b84
sync by github workflow

Log: none
Influence: none
2024-06-19 07:24:54 +00:00
deepin-admin-bot
32140ccf26 chore: Sync by b7b12fd4a9
sync by github workflow

Log: none
Influence: none
2024-06-13 03:00:01 +00:00
Hillwood Yang
697e678587
fix: Need link Xcursor for shutdown plugin (#993)
Log: fix build error on openSUSE
2024-04-17 13:56:34 +08:00
ck
b2da5add21 chore: bump version to 6.0.37
release 6.0.37

Log: bump version to 6.0.37
2024-04-17 09:51:20 +08:00
ck
a15d92c7eb fix: wine app menu obscured by popup widget
remove ToolTip windowflag

Issue: https://github.com/linuxdeepin/developer-center/issues/7612
Bug: https://pms.uniontech.com/bug-view-239173.html
2024-03-28 12:05:23 +08:00
tsic404
00d0f13c1a fix: duplicate tray for some app
some gtk apps use libayatana-appindicator create tray will create xembed and sni duplicate tray
not show sni tray which path contains /org/ayatana/NotificationItem/ created by ayatana-appindicator

log: not show ayatana-appindicator sni tray on xorg
2024-03-26 10:58:44 +08:00
ck
32bd005492 chore: bump version 6.0.36
bump version 6.0.36
2024-03-12 13:10:46 +08:00
ck
3eb95284a0 fix: dcc-dock-plugin icon tweak
控制中心中dock的插件统一混合颜色
暗色主题时填充白色,浅色主题填充黑色

Issue: https://github.com/linuxdeepin/developer-center/issues/6454
2024-03-04 14:52:03 +08:00
ck
1653473ecc fix: bluetooth quick-trays item icon tweak
快捷面板中蓝牙图标和网络插件保持一致
- 大小一致 24x24
- 选中时高亮色填充
- 圆图标

Issue: https://github.com/linuxdeepin/developer-center/issues/7207
2024-02-22 09:34:32 +08:00
zsien
0f940b6579 fix: popup panel cannot be opened when clicking the labels
Issues: linuxdeepin/developer-center#7222
2024-02-02 13:00:44 +08:00
tsic404
72f4286f49 chore: bump version 6.0.35
bump version 6.0.35

log: as title
2024-02-02 10:54:42 +08:00
tsic404
e8e0f3c96f chore: adjust dock ui
1. adjust dock window space to 10
2. make traymainwindow contentsMagins to fixed value
3. make trycontrolpanel background color alpha
4. remove space between fullscreen and dock
5. set border for quick panel items
6. adjust standitem icon and text space
7. adjust sliderContainer icon background color

log: as title
2024-02-02 10:54:42 +08:00
tsic404
48cced00a9 chore: release version 6.0.34
log: as title
2024-01-30 17:34:46 +08:00
tsic404
edea9b860d fix: dock item indicator not update
update dock item position

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/7097
2024-01-30 08:39:06 +00:00
tsic404
710a9f562b fix: dock plugin unable to click when in keep hide
make dock not hide when click plugin and popup show even in keep hide mode

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/7132
2024-01-30 16:26:31 +08:00
chenhongtao
478f564631 fix: dock will not auto hide after set size
Issue: https://github.com/linuxdeepin/developer-center/issues/7129
Log:
2024-01-30 08:21:33 +00:00
chenhongtao
241e668ea2 fix: dock animation broken
Issue: https://github.com/linuxdeepin/developer-center/issues/7143
Log:
2024-01-30 16:08:38 +08:00
tsic404
e6e8995e51 fix: dock plugin calculated to an incorrect size
set minSize only for uosai

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/7127
2024-01-30 08:04:02 +00:00
tsic404
2b81011b7e chore: bump version 6.0.33
bump version 6.0.33

log: as title
2024-01-30 14:07:51 +08:00
tsic404
2bb5e49cac chore: bump version 6.0.32
bump version 6.0.32

log: as title
2024-01-26 14:29:51 +08:00
tsic404
b4ec458dd5 fix: tmp blocked uosai plugin in quickpanel
log: as title
2024-01-26 14:22:12 +08:00
tsic404
572c0c8aad fix: dock theme not follow system
reset dock dapplication palettetype to 0

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/7090
2024-01-25 08:01:44 +00:00
tsic404
c0c909f9e8 fix: dock get max size when positionChanged and KeepHide mode
no one update hideState properties in taskmanager and
not update dockSize when dock is in hide state by resetDragWindow call

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/7040
2024-01-25 14:23:18 +08:00
tsic404
8b04a51b51 fix: dock not remove plugin when fcitx exit
rowCountChanged signal not send

log: send rowCountChanged signal
issue: https://github.com/linuxdeepin/developer-center/issues/7080
2024-01-25 14:04:52 +08:00
tsic404
d1f61330f3 chore: release 6.0.31
release 6.0.31

log: as title
2024-01-24 07:28:21 +00:00
tsic404
7097ae7f3c fix: error datetime tooltip
issue: https://github.com/linuxdeepin/developer-center/issues/7056
log: correct longtimeformat and timeformat str
2024-01-23 09:43:02 +00:00
tsic404
3939ca9c12 fix: unable get docked entriy by soft link path
set canonicalFilePath instead of absoluteFilePath for deskfileinfo
and find it by canonicalFilePath instead of user input path

log: use canonicalFilePath instead of absoluteFilePath
2024-01-23 09:43:02 +00:00
chenhongtao
0300e28332 chore: bump version to 6.0.30
Log:
2024-01-23 07:49:39 +00:00
chenhongtao
13b1e661ea chore: update translations
Log:
2024-01-23 06:51:20 +00:00
chenhongtao
b5399bd0ec chore: bring back display setting button
Log:
2024-01-23 06:37:24 +00:00
chenhongtao
945bb03a27 chore: remove Cooperation in display plugin
Issue: linuxdeepin/developer-center#7023
Log:
2024-01-22 09:26:03 +00:00
chenhongtao
0f93647736 chore: bump version to 6.0.29
Log:
2024-01-22 05:48:38 +00:00
chenhongtao
ca4408c660 fix: when dconfig no value, use system format
Log:
2024-01-19 13:37:21 +00:00
tsic404
ee030a6505 chore: release 6.0.28
release 6.0.28

log: as title
2024-01-18 08:20:53 +00:00
Yixue Wang
326f510e4e fix: disable resize of dock popup window
Use setFixedSize instead of resize so that dock popup window is not
resizable.

Log: disable resize of dock popup window
Issue: https://github.com/linuxdeepin/developer-center/issues/6264
2024-01-18 13:09:15 +08:00
tsic404
27e1493982 fix: no one call bamf
try to call bamf

log: as title
2024-01-18 02:00:46 +00:00
wangfei
3a5438b399 fix: the item that removed is exist yet
undock items that removed

Issus: https://github.com/linuxdeepin/developer-center/issues/4631
2024-01-17 09:41:37 +08:00
Yixue Wang
e47a6dfb80 fix: dock wakeup area not changed
When dock is hidden, position change through DBus will not change
frontend rect, thus not update wakeup area. This is because position
in WindowManager is not changed. Emit positionChanged signal in
MultiScreenWorker.

Log: fix dock wakeup area not changed
Issue: https://github.com/linuxdeepin/developer-center/issues/5831
2024-01-16 16:47:11 +08:00
tsic404
b74544aa23 fix: onboard not to show on first click
tray to call show when onboard not launched

log: as title
issue: https://github.com/linuxdeepin/developer-center/issues/6675
2024-01-15 13:32:58 +08:00
Yixue Wang
3b567d096e feat: add dbus property window margin
Add dbus property WindowMargin for other application to calculate
the real exclusiveArea.

Log: add dbus property window margin
2024-01-12 17:56:26 +08:00
dengbo
6b0fec0426 fix: timedate tips show error
timedate tips should bind region format

Log:
2024-01-12 17:24:58 +08:00
chenhongtao
f4a40f36b8 fix: quickpanel icon not follow theme
update quickItem when theme changed

Log:
2024-01-12 06:01:25 +00:00
tsic404
556ea5acf8 chore: release 6.0.27
bump version 6.0.27

log: as title
2024-01-11 17:38:37 +08:00
tsic404
31e149d3d2 fix: dock get stucked when launching
org.ayatana.bamf dbus will get into stucked, so only call it when it's ready

log: only call org.ayatana.bamf when it's ready
issue: https://github.com/linuxdeepin/developer-center/issues/6657
2024-01-10 17:37:06 +08:00
Yixue Wang
a222173da6 fix: item menu may be empty due to error
Parsing item context menu may fail, always check context menu in
mousePressEvent.

Log: fix item menu may be empty due to error
2024-01-10 16:17:20 +08:00
Yixue Wang
01e2377d86 fix: notification tips label and context menu
Add notification settings action. Notification tips label will display
notification count.

Log: fix notification tips label and context menu
2024-01-10 14:01:36 +08:00
ck
263e5a4358 chore: uosai default show on dock (#6486)
Issue: https://github.com/linuxdeepin/developer-center/issues/6486
2024-01-09 17:31:30 +08:00
Yixue Wang
12d346a2c9 fix: cross-thread parenting failure
Cannot create a child in another thread. Do not use object tree, use
QScopedPointer to manage life scope.

Log: fix cross-thread parenting failure
2024-01-09 03:25:28 +00:00
tsic404
bce2a49971 feat: open deepin-calendar instead of dde-widgets when click timedate
call com.deepin.Calendar dbus instead org.deepin.dde.Widgets1

log: as title
2024-01-09 03:17:46 +00:00
Yixue Wang
2a5a1e0efb fix: item context menu not updated
Item context menu is not updated when plugin item request update.

Log: fix item context menu not updated
2024-01-08 16:01:15 +08:00
Yixue Wang
4eecd92395 feat: add plugin notification
Add plugin notification to show notification center. Notification is a
fixed plugin.

Log: add plugin notification
Issue: https://github.com/linuxdeepin/developer-center/issues/6695
2024-01-08 13:41:32 +08:00
Yixue Wang
cf909cd4d7 fix: mainwindow hide when popup opens
MainWindow should not hide when popup opens and the focus is still
on dock even if HideMode is AlwaysHide. Let popup block hiding of
mainwindow.

Log: fix mainwindow hide when popup opens
Issue: https://github.com/linuxdeepin/developer-center/issues/4970
2024-01-04 18:16:11 +08:00
Yixue Wang
107e7427d6 chore: correct indentation
Correct indentation to 4 spaces.

Log: correct indentation
2024-01-04 16:49:51 +08:00
Yixue Wang
79efd518a9 chore: correct typo
Correct typo founded to found.

Log: correct typo
2024-01-04 16:49:51 +08:00
Yixue Wang
6c492486a5 optimize: use invokeMethod instead of singleShot
Use invokeMethod to invoke method in event loop later.

Log: use invokeMethod instead of singleShot
2024-01-04 16:49:51 +08:00
ck
a3499fcf34 chore: bump version to 6.0.26
Relase 6.0.26
2024-01-04 14:29:18 +08:00
ck
e0ac1f9562 chore: update translations
unknown
2024-01-04 14:29:18 +08:00
ck
e02ff1ac53 chore: add fallback media info
如果没有提供默认专辑和歌手信息图标等返回一个默认的图标和文字
如 firefox 播放酷狗音乐只有一个title,其他歌曲信息都没的

Issue: https://github.com/linuxdeepin/developer-center/issues/5786,https://github.com/linuxdeepin/developer-center/issues/4331
2023-12-28 16:38:19 +08:00
ck
d765d60b22 fix: 任务栏媒体播放插件异常
关闭一个播放器后无法再次控制剩余的播放器
记录所有的播放器控制接口,退出一个后回退到上一个播放器控制

Issue: https://github.com/linuxdeepin/developer-center/issues/5719
2023-12-28 16:38:19 +08:00
ck
dab0083dcd fix: item hight error when turn off bluetooth
关闭蓝牙后还会收到上一个操作的设备扫描的新增信号
解决方案是关闭后不再响应这个信号

Issue: https://github.com/linuxdeepin/developer-center/issues/6033
2023-12-28 09:06:11 +08:00
chenhongtao
4e69cb7b68 chore: bump version to 6.0.25
Log:
2023-12-14 07:30:08 +00:00
ck
442a98cb70 fix: turn on bluetooth loading animation not start
change loading animation when bluetooth switch

Issue: https://github.com/linuxdeepin/developer-center/issues/6033
2023-12-12 16:33:37 +08:00
ck
971cd92007 fix: dcc dock plugin icon pixelated again
- 部分图片路径写错
- 资源图片直接加到qicon中,qicon.availableSizes[0]={0, 0}
- 部分插件没有适配主题颜色

Issue: https://github.com/linuxdeepin/developer-center/issues/5682
2023-12-08 16:42:36 +08:00
chenhongtao
c76dcb4361 chore: publish new tag 6.0.24
Log:
2023-11-30 11:43:03 +00:00
chenhongtao
2459613b69 chore: link to dtkgui
Log:
2023-11-28 09:41:08 +00:00
chenhongtao
d2e724b83e Revert "fix: dcc dock plugin icon pixelated"
This reverts commit 58547b091d4a5baea4352d88ff1ad21d8116a980.
2023-11-28 09:41:08 +00:00
chenhongtao
3365365b56 chore: fix use system icon first
Log:
2023-11-23 07:39:51 +00:00
ck
58547b091d fix: dcc dock plugin icon pixelated
use svg format instead of png to support scaling on DPR>1.0

Issue: https://github.com/linuxdeepin/developer-center/issues/5682
2023-11-22 13:06:34 +08:00
chenhongtao
85deffe309 chore: xid is drop in debug, cause coredump
it should use copy

Log:
2023-11-22 03:32:15 +00:00
chenhongtao
919a2b5a49 feat: use system battery icon first
Log:
2023-11-22 03:22:23 +00:00
ck
c2aedfe052 chore: get dconfig value with fallback value
Fallback to default value if dconfig::value failed
if not specify a fallback, default is QVariant()
2023-11-21 14:51:50 +08:00
chenhongtao
70d73662ec chore: when debug open this log
it fursh too much

Log:
2023-11-21 05:30:19 +00:00
chenhongtao
3573bb258b fix: brightness silder cannot scroll when is 28
double 0.29 * 100 then cast to init, it is 28

Log:
Issue: https://github.com/linuxdeepin/developer-center/issues/6077
2023-11-21 03:53:06 +00:00
wangfei
afa0494067 chore: update version to 6.0.23
bump version to 6.0.23

Log: update version to 6.0.23
2023-11-06 09:47:43 +08:00
wangfei
f771da5bdb chore: Adapt time format feature
Adapt time format feature from dcc

Issue: https://github.com/linuxdeepin/developer-center/issues/5902
2023-10-26 11:39:57 +08:00
tsic404
f6019f900d chore: remove unused dbus
log: as title
2023-10-09 16:33:11 +08:00
tsic404
7f148d257a fix: double tray show afeter drag into expandTray and drag back
tray show on dock signal name is quickTrayNameChanged

log: connect right signal name
2023-10-09 16:16:32 +08:00
tsic404
67df42b8a4 fix: tray disappear when drag finished
editor auto close when drag finished, but on one reopen

log: reopen editor when drag finished
2023-10-08 06:14:26 +00:00
tsic404
7cd0cddf44 fix: displayplugin disappear when monitor count changed
changedProps.vale get a empty monitors list, and BrightnessAdjWidget
not update  monitor SliderContainer count

log: fix displayplugin disappear
2023-10-07 05:11:56 +00:00
tsic404
f408bd89f4 chore: release version 6.0.22
log: as title
2023-09-14 05:24:18 +00:00
tsic404
25194dbf13 fix: tool appAreaWidget visible
layout->count() > 0 do not mean it contains tool plugins

log: call updateToolArea instead of using layout->count() > 0 when updateWidgetStatus
2023-09-11 05:12:20 +00:00
tsic404
00369b053b fix: datetime size error
datetimedisplayer get a wrong suitableSize during position changing,
when finished reupdate suitableSize

log: update suitableSize
2023-09-11 05:12:20 +00:00
YeShanShan
0f59177248 fix: Can't hide when DockPopupWindow deactivate
We hide the popupwindow when receiving QEvent::WindowDeactivate.

Issue: https://github.com/linuxdeepin/developer-center/issues/5405
2023-09-11 10:59:58 +08:00
tsic404
f6b2044bea fix: coredump empty tray when switch postion
Fashion mode and Efficent mode has same one tray, when tray is empty and
update orientation will cause endless reseize event which case dock stack boom

log: move TrayGridView Orientation update into TrayGridView
2023-09-11 01:56:27 +00:00
tsic404
111fb6c518 fix: tray get a wrong postion after displaymode changed
log: as title
2023-09-08 03:46:29 +00:00
tsic404
38871e8b0d fix: a space on tray without trash show
the m_mainBoxLayout last call addStretch, so tary show insert into second last

log: make tray insert into second last
2023-09-07 09:43:48 +00:00
tsic404
d24429904c chore: remove useless plugin
log: as title
2023-09-07 09:42:06 +00:00
tsic404
914ddce850 chore: bump version 6.0.21
log: as title
2023-09-07 09:41:32 +00:00
tsic404
7ed222aadb fix: datetime font size error
make font size adjusted by height or width not follow system font size

log: as title
2023-09-06 06:17:24 +00:00
tsic404
3cbb828863 feat: make unrecongnized application not dock on dde-dock
some unrecongnized app like electron app will unable to start when next click.
and custom desktopfile will not be supported by new applicationmanager1

log: not dock unrecongnized application
2023-09-06 05:04:50 +00:00
tsic404
4b9b283e5c fix: dock coredump when update recentApp invisible
itemRemove signal connect direct to taskmanager thread, and it will update recentApp visible status
which access qwidget in non-main thread.

log: make recentApp visible status update in main thread.
2023-09-06 05:04:50 +00:00
tsic404
e3c3dfe94d feat: when new am avaliable do not load custom desktopfile
log: as title
2023-09-06 05:04:50 +00:00
tsic404
75ebd8a0f2 feat: use new am dbus interface
log: as title
2023-09-06 05:04:50 +00:00
YeShanShan
e14b877696 feat: Remove dock-hotspot-plugin by Conflicts
To remove dock-hotspot-plugin.

Issue: https://github.com/linuxdeepin/developer-center/issues/5415
2023-09-06 10:07:53 +08:00
YeShanShan
406c5d8539 Revert "chore: update dependencies"
This reverts commit 9f092c2d01ad64ae6ee1458ae36f937f952034d7.
2023-09-06 10:07:53 +08:00
chenhongtao
5aa27ee40f fix: click preview container not active window
it connect to a empty signal

Log:
2023-09-05 07:59:21 +00:00
tsic404
e78be366bc chore: make trash not display in default
log: as title
2023-09-05 07:59:01 +00:00
chenhongtao
2ccf74dd35 chore: support qCDebug
Log:
2023-09-04 15:19:20 +08:00
chenhongtao
41d27c5ad7 chore: commit unused qdebug, and update log format
Log:
2023-09-04 15:19:20 +08:00
chenhongtao
bdb0dc3b86 fix: brightness update, update main view slider
Log:
2023-09-04 15:19:20 +08:00
tsic404
d1b37b045a fix: add lost windowSizeChanged Signal
log: as title
2023-08-29 02:04:27 +00:00
356 changed files with 14289 additions and 14151 deletions

12
.github/workflows/call-api-check.yml vendored Normal file
View 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
View 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
View 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

View File

@ -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

View File

@ -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)

View File

@ -174,7 +174,7 @@
"visibility":"public"
},
"Dock_Quick_Plugins": {
"value": ["power", "network", "shutdown", "trash", "show-desktop", "multitasking"],
"value": ["power", "network", "shutdown", "show-desktop", "multitasking", "notification", "uosai"],
"serial": 0,
"flags": [],
"name": "Quick Plugins show on dock",

147
debian/changelog vendored
View File

@ -1,3 +1,150 @@
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
* fix: brightness update, update main view slider
* chore: make trash not display in default
* fix: click preview container not active window
* feat: Remove dock-hotspot-plugin by Conflicts
* feat: use new am dbus interface
* feat: when new am avaliable do not load custom desktopfile
* fix: dock coredump when update recentApp invisible
* feat: make unrecongnized application not dock on dde-dock
* fix: datetime font size error
-- tsic404 <liuheng@deepin.org> Wed, 06 Sep 2023 14:20:11 +0800
dde-dock (6.0.20) unstable; urgency=medium
* fix: xebmbedtary click get no response in Efficient mode

81
debian/control vendored
View File

@ -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,
dock-network-plugin,
dde-network-dialog,
dock-hotspot-plugin
dock-network-plugin,
Conflicts:
dde-workspace (<< 2.90.5),
dde-dock-applets,
dde-trash-plugin
dde-trash-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

View File

@ -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/

View File

@ -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)

View File

@ -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
}

View File

@ -20,6 +20,7 @@ RecentAppHelper::RecentAppHelper(QWidget *appWidget, QWidget *recentWidget, QObj
{
m_appWidget->installEventFilter(this);
m_recentWidget->installEventFilter(this);
connect(this, &RecentAppHelper::requestUpdateRecentVisible, this, &RecentAppHelper::updateRecentVisible, Qt::QueuedConnection);
}
void RecentAppHelper::setDisplayMode(Dock::DisplayMode displayMode)
@ -170,7 +171,7 @@ void RecentAppHelper::removeRecentAreaItem(DockItem *wdg)
{
QBoxLayout *recentLayout = static_cast<QBoxLayout *>(m_recentWidget->layout());
recentLayout->removeWidget(wdg);
updateRecentVisible();
Q_EMIT requestUpdateRecentVisible();
}
void RecentAppHelper::removeAppAreaItem(DockItem *wdg)

View File

@ -36,6 +36,7 @@ Q_SIGNALS:
void requestUpdate();
void recentVisibleChanged(bool); // 最近区域是否可见发生变化的信号
void dockAppVisibleChanged(bool); // 驻留应用区域是否可见发生变化的信号
void requestUpdateRecentVisible();
protected:
bool eventFilter(QObject *watched, QEvent *event) override;
@ -44,7 +45,6 @@ private:
bool appInRecent(DockItem *item) const;
void addAppAreaItem(int index, DockItem *wdg);
void addRecentAreaItem(int index, DockItem *wdg);
void updateRecentVisible();
void updateDockAppVisible(bool lastVisible);
void removeRecentAreaItem(DockItem *wdg);
@ -56,6 +56,7 @@ private:
private Q_SLOTS:
void onModeChanged(int mode);
void updateRecentVisible();
private:
QWidget *m_appWidget;

View File

@ -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)

View File

@ -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;
}
// 如果插件中没有设置图标,则根据插件的类型,获取其他的图标

View File

@ -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()
{
}

View File

@ -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

View File

@ -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()
{
}

View File

@ -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

View File

@ -17,9 +17,12 @@ 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);
connect(DockSettings::instance(), &DockSettings::windowSizeEfficientChanged, this, &DockDaemonDBusAdaptor::WindowSizeEfficientChanged);
connect(DockSettings::instance(), &DockSettings::windowSizeFashionChanged, this, &DockDaemonDBusAdaptor::WindowSizeFashionChanged);
}
DockDaemonDBusAdaptor::~DockDaemonDBusAdaptor()
@ -102,6 +105,11 @@ void DockDaemonDBusAdaptor::setWindowSizeFashion(uint value)
}
}
uint DockDaemonDBusAdaptor::windowMargin() const
{
return TaskManager::instance()->windowMargin();
}
QRect DockDaemonDBusAdaptor::frontendWindowRect() const
{
return TaskManager::instance()->getFrontendWindowRect();

View File

@ -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;
};
};

View File

@ -755,7 +755,7 @@ void AppItem::showPreview()
m_appPreviewTips->setWindowInfos(m_windowInfos, m_itemEntry->getAllowedClosedWindowIds().toList());
m_appPreviewTips->updateLayoutDirection(DockPosition);
connect(m_appPreviewTips, &PreviewContainer::requestActivateWindow, this, &AppItem::requestActivateWindow, Qt::QueuedConnection);
connect(m_appPreviewTips, &PreviewContainer::requestActivateWindow, this, &AppItem::activeWindow, Qt::QueuedConnection);
connect(m_appPreviewTips, &PreviewContainer::requestPreviewWindow, this, &AppItem::requestPreviewWindow, Qt::QueuedConnection);
connect(m_appPreviewTips, &PreviewContainer::requestCancelPreviewWindow, this, &AppItem::requestCancelPreview);
connect(m_appPreviewTips, &PreviewContainer::requestHidePopup, this, &AppItem::hidePopup);

View File

@ -255,7 +255,7 @@ void PreviewContainer::onSnapshotClicked(const WId wid)
Q_EMIT requestActivateWindow(wid);
m_needActivate = true;
m_waitForShowPreviewTimer->stop();
requestHidePopup();
Q_EMIT requestHidePopup();
}
void PreviewContainer::previewEntered(const WId wid)

View File

@ -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);
@ -174,7 +178,7 @@ int main(int argc, char *argv[])
app.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
// 设置日志输出到控制台以及文件
DLogManager::setLogFormat("%{time}{yyyyMMdd.HH:mm:ss.zzz}[%{type:1}][%{function:-35} %{line:-4}] %{message}\n");
DLogManager::setLogFormat("%{time}{yyMMdd.HH:mm:ss.zzz}[%{type:1}] [%{category}] [%{function:-25} %{line:-4}] %{message}");
DLogManager::registerConsoleAppender();
DLogManager::registerFileAppender();

View File

@ -10,7 +10,8 @@
#include <QCryptographicHash>
AppInfo::AppInfo(DesktopInfo &info)
: m_isValid(true)
: m_installed(false)
, m_isValid(true)
{
init(info);
}

View File

@ -30,6 +30,10 @@ const QString keyWindowSizeFashion = "Window_Size_Fashion";
const QString keyWindowSizeEfficient = "Window_Size_Efficient";
const QString keyWinIconPreferredApps = "Win_Icon_Preferred_Apps";
constexpr auto DesktopFileActionKey = u8"Desktop Action ";
constexpr auto DDEApplicationManager1ObjectPath = u8"/org/desktopspec/ApplicationManager1";
constexpr auto ApplicationManager1DBusName= u8"org.desktopspec.ApplicationManager1";
static const QString scratchDir = QStandardPaths::writableLocation(QStandardPaths::GenericDataLocation).append("/deepin/dde-dock/scratch/");
const QString desktopHashPrefix = "d:";

View File

@ -9,6 +9,10 @@
#include "entry.h"
#include "windowinfok.h"
#include <DDBusSender>
#include <QtConcurrent>
DBusHandler::DBusHandler(TaskManager *taskmanager, QObject *parent)
: QObject(parent)
, m_taskmanager(taskmanager)
@ -18,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);
@ -29,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()
@ -61,16 +82,50 @@ QString DBusHandler::getCurrentWM()
void DBusHandler::launchApp(QString desktopFile, uint32_t timestamp, QStringList files)
{
QDBusInterface interface = QDBusInterface("org.deepin.dde.Application1.Manager", "/org/deepin/dde/Application1/Manager", "org.deepin.dde.Application1.Manager");
interface.call("LaunchApp", desktopFile, timestamp, files);
if (newStartManagerAvaliable()) {
auto objPath = desktopEscapeToObjectPath(desktopFile);
launchAppUsingApplicationManager1(QString{DDEApplicationManager1ObjectPath} + '/' + objPath, timestamp, files);
} else {
launchAppUsingApplication1Manager(desktopFile, timestamp, files);
}
}
void DBusHandler::launchAppAction(QString desktopFile, QString action, uint32_t timestamp)
{
if (newStartManagerAvaliable()) {
auto objPath = desktopEscapeToObjectPath(desktopFile);
launchAppActionUsingApplicationManager1(QString{DDEApplicationManager1ObjectPath} + '/' + objPath, action, timestamp);
} else {
launchAppActionUsingApplication1Manager(desktopFile, action, timestamp);
}
}
void DBusHandler::launchAppUsingApplication1Manager(QString desktopFile, uint32_t timestamp, QStringList files)
{
QDBusInterface interface = QDBusInterface("org.deepin.dde.Application1.Manager", "/org/deepin/dde/Application1/Manager", "org.deepin.dde.Application1.Manager");
interface.call("LaunchApp", desktopFile, timestamp, files);
}
void DBusHandler::launchAppActionUsingApplication1Manager(QString desktopFile, QString action, uint32_t timestamp)
{
QDBusInterface interface = QDBusInterface("org.deepin.dde.Application1.Manager", "/org/deepin/dde/Application1/Manager", "org.deepin.dde.Application1.Manager");
interface.call("LaunchAppAction", desktopFile, action, timestamp);
}
// 新AM启动接口
void DBusHandler::launchAppUsingApplicationManager1(QString dbusObjectPath, uint32_t timestamp, QStringList files)
{
QDBusInterface interface = QDBusInterface(ApplicationManager1DBusName, dbusObjectPath, "org.desktopspec.ApplicationManager1.Application");
interface.call("Launch", "", QStringList(), QMap<QString, QVariant>());
}
void DBusHandler::launchAppActionUsingApplicationManager1(QString dbusObjectPath, QString action, uint32_t timestamp)
{
action = action.right(action.size() - strlen(DesktopFileActionKey));
QDBusInterface interface = QDBusInterface(ApplicationManager1DBusName, dbusObjectPath, "org.desktopspec.ApplicationManager1.Application");
interface.call("Launch", action, QStringList(), QMap<QString, QVariant>());
}
void DBusHandler::markAppLaunched(const QString &filePath)
{
QDBusInterface interface = QDBusInterface("org.deepin.dde.AlRecorder1", "/org/deepin/dde/AlRecorder1", "org.deepin.dde.AlRecorder1");
@ -216,3 +271,73 @@ QString DBusHandler::getDesktopFromWindowByBamf(XWindow windowId)
return "";
}
// 新的AM调用
QString DBusHandler::desktopEscapeToObjectPath(QString desktopFilePath)
{
// to desktop id
QString objectPath;
decltype(auto) desktopSuffix = ".desktop";
auto tmp = desktopFilePath.chopped(sizeof(desktopSuffix) - 1);
auto components = tmp.split(QDir::separator());
auto it = std::find(components.cbegin(), components.cend(), "applications");
if (it == components.cend()) return "_";
QString FileId;
++it;
while (it != components.cend()) {
FileId += (*(it++) + "-");
}
objectPath = FileId.chopped(1);
if (objectPath.isEmpty()) {
return "_";
}
// desktop id to objectPath
QRegularExpression re{R"([^a-zA-Z0-9])"};
auto matcher = re.globalMatch(objectPath);
while (matcher.hasNext()) {
auto replaceList = matcher.next().capturedTexts();
replaceList.removeDuplicates();
for (const auto &c : replaceList) {
auto hexStr = QString::number(static_cast<uint>(c.front().toLatin1()), 16);
objectPath.replace(c, QString{R"(_%1)"}.arg(hexStr));
}
}
return objectPath;
}
bool DBusHandler::newStartManagerAvaliable()
{
static bool isAvaiable = false;
std::call_once(m_isNewStartManagerAvaliableInited, [=](){
auto services = QDBusConnection::sessionBus().interface()->registeredServiceNames().value();
isAvaiable = std::any_of(services.begin(), services.end(), [=](const QString &name){
return name == ApplicationManager1DBusName;
});
});
return isAvaiable;
}
void DBusHandler::sendFailedDockNotification(const QString &appName)
{
QtConcurrent::run(QThreadPool::globalInstance(), [ = ] {
DDBusSender()
.service(notificationService)
.path(notificationPath)
.interface(notificationInterface)
.method(QString("Notify"))
.arg(QString("dde-control-center")) // appname
.arg(static_cast<uint>(0)) // id
.arg(QString("preferences-system")) // icon
.arg(QString(tr("failed to dock ") + appName)) // summary
.arg(QString(tr("Unrecognized application, unable to dock"))) // content
.arg(QStringList()) // actions
.arg(QVariantMap()) // hints
.arg(5000) // timeout
.call();
});
qInfo() << "unsupported app: " + appName;
}

View File

@ -40,6 +40,10 @@ public:
/************************* StartManager ***************************/
void launchApp(QString desktopFile, uint32_t timestamp, QStringList files);
void launchAppAction(QString desktopFile, QString action, uint32_t timestamp);
void launchAppUsingApplication1Manager(QString desktopFile, uint32_t timestamp, QStringList files);
void launchAppActionUsingApplication1Manager(QString desktopFile, QString action, uint32_t timestamp);
void launchAppUsingApplicationManager1(QString desktopFile, uint32_t timestamp, QStringList files);
void launchAppActionUsingApplicationManager1(QString desktopFile, QString action, uint32_t timestamp);
/************************* AlRecorder1 ***************************/
void markAppLaunched(const QString &filePath);
@ -59,10 +63,19 @@ public:
// XWindow -> desktopFile
QString getDesktopFromWindowByBamf(XWindow windowId);
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);
private:
QString desktopEscapeToObjectPath(QString desktopFilePath);
private:
QString m_activeWindowMonitorKey;
TaskManager *m_taskmanager;
@ -72,6 +85,8 @@ private:
org::deepin::dde::kwayland1::WindowManager *m_kwaylandManager;
org::deepin::dde::XEventMonitor1 *m_xEventMonitor;
org::deepin::dde::Launcher1 *m_launcher;
std::once_flag m_isNewStartManagerAvaliableInited;
};
#endif // DBUSHANDLER_H

View File

@ -4,6 +4,7 @@
#include "desktopinfo.h"
#include "locale.h"
#include "taskmanager/common.h"
#include "unistd.h"
#include <QDebug>
@ -13,13 +14,14 @@
#include <QSettings>
#include <QStandardPaths>
#include <QVector>
#include <qlocale.h>
#include <QLocale>
QStringList DesktopInfo::currentDesktops;
static QString desktopFileSuffix = ".desktop";
DesktopInfo::DesktopInfo(const QString &desktopfile)
: m_isValid(true)
, m_isInstalled(false)
{
QString desktopfilepath(desktopfile);
QFileInfo desktopFileInfo(desktopfilepath);
@ -28,16 +30,17 @@ DesktopInfo::DesktopInfo(const QString &desktopfile)
desktopFileInfo.setFile(desktopfilepath);
}
if (!desktopFileInfo.isAbsolute()) {
for (auto dir: QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation)) {
QString path = dir.append("/").append(desktopfilepath);
if (QFile::exists(path)){
desktopFileInfo.setFile(path);
}
auto desktopFileName = desktopFileInfo.fileName();
// 优先加载系统中的desktopfile而不是用户传递过来的
for (auto dir: QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation)) {
QString path = dir.append("/").append(desktopFileName);
if (QFile::exists(path)){
desktopFileInfo.setFile(path);
m_isInstalled = true;
}
}
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");
@ -77,12 +80,7 @@ bool DesktopInfo::isValidDesktop()
bool DesktopInfo::isInstalled()
{
QFileInfo desktopFileInfo(m_desktopFilePath);
QString desktopFileName = desktopFileInfo.fileName();
static auto applicationDirs = QStandardPaths::standardLocations(QStandardPaths::ApplicationsLocation);
return std::any_of(applicationDirs.begin(), applicationDirs.end(), [&desktopFileName](auto applicationDir){
return QFile::exists(applicationDir+ '/' + desktopFileName);
});
return m_isInstalled;
}
/** if return true, item is shown
@ -162,8 +160,7 @@ QList<DesktopAction> DesktopInfo::getActions()
{
QList<DesktopAction> actions;
for (const auto &mainKey : m_desktopFile->childGroups()) {
if (mainKey.startsWith("Desktop Action")
|| mainKey.endsWith("Shortcut Group")) {
if (mainKey.startsWith(DesktopFileActionKey)) {
DesktopAction action;
action.name = getLocaleStr(mainKey, KeyName);
action.exec = m_desktopFile->value(mainKey + '/' + KeyExec).toString();

View File

@ -95,6 +95,7 @@ private:
static QStringList currentDesktops;
bool m_isValid;
bool m_isInstalled;
QString m_id;
QString m_name;

View File

@ -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;
}

View File

@ -127,7 +127,7 @@ AppInfo *Entry::getAppInfo()
void Entry::setAppInfo(AppInfo *appinfo)
{
if (m_appInfo.data() == appinfo) {
if (m_appInfo.data() == appinfo || appinfo == nullptr) {
return;
}

View File

@ -16,19 +16,25 @@
#include "windowidentify.h"
#include "waylandmanager.h"
#include "windowinfobase.h"
#include "dbusutil.h"
#include "org_deepin_dde_kwayland_plasmawindow.h"
#include <QDir>
#include <QMap>
#include <QTimer>
#include <QList>
#include <QPixmap>
#include <cstdint>
#include <dtkcore_global.h>
#include <functional>
#include <iterator>
#include <memory>
#include <algorithm>
#include <qpixmap.h>
#include <dutil.h>
DCORE_USE_NAMESPACE
#define SETTING DockSettings::instance()
#define XCB XCBUtils::instance()
@ -49,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))
@ -89,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()
@ -118,57 +139,13 @@ bool TaskManager::dockEntry(Entry *entry, bool moveToEnd)
return false;
}
if (appInfo->getFileName().contains(scratchDir)) {
qInfo() << "needScratchDesktop: no, desktop in scratchDir";
return false;
}
return true;
};
if (needScratchDesktop()) {
// 创建scratch Desktop file
QDir dir;
if (!dir.mkpath(scratchDir)) {
qWarning() << "create scratch Desktopfile failed";
return false;
}
QFile file;
QString newDesktopFile;
if (appInfo) {
QString newFile = scratchDir + appInfo->getInnerId() + ".desktop";
// 在目标文件存在的情况下,先删除,防止出现驻留不成功的情况
if (QFile::exists(newFile)) QFile::remove(newFile);
if (file.copy(appInfo->getFileName(), newFile))
newDesktopFile = newFile;
} else {
WindowInfoBase *current = entry->getCurrentWindowInfo();
if (current) {
QString appId = current->getInnerId();
QString title = current->getDisplayName();
QString icon = current->getIcon();
if (icon.isEmpty()) icon = "application-default-icon";
QString cmd = entry->getCmdLine() + "%U";
QString fileNmae = scratchDir + appId + ".desktop";
QString desktopContent = QString(dockedItemTemplate).arg(title).arg(cmd).arg(icon);
file.setFileName(fileNmae);
if (file.open(QIODevice::WriteOnly | QIODevice::Text)) {
file.write(desktopContent.toStdString().c_str(), desktopContent.size());
file.close();
newDesktopFile = fileNmae;
}
}
}
if (newDesktopFile.isEmpty())
return false;
appInfo = new AppInfo(newDesktopFile);
entry->setAppInfo(appInfo);
entry->updateIcon();
entry->setInnerId(appInfo->getInnerId());
m_dbusHandler->sendFailedDockNotification(entry->getName());
return false;
}
// 如果是最近打开应用通过右键菜单的方式驻留且当前是时尚模式那么就让entry驻留到末尾
@ -291,7 +268,7 @@ bool TaskManager::shouldShowOnDock(WindowInfoBase *info)
*/
void TaskManager::setDdeLauncherVisible(bool visible)
{
m_trayGridWidgetVisible = visible;
m_ddeLauncherVisible = visible;
}
/**
@ -300,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;
}
/**
@ -408,7 +390,7 @@ void TaskManager::doActiveWindow(XWindow xid)
}
XCB->changeActiveWindow(xid);
QTimer::singleShot(50, [&] {
QTimer::singleShot(50, [xid] {
XCB->restackWindow(xid);
});
}
@ -520,6 +502,11 @@ bool TaskManager::requestDock(QString desktopFile, int index)
return false;
}
if (m_dbusHandler->newStartManagerAvaliable() && !app->isInstalled()) {
m_dbusHandler->sendFailedDockNotification(app->getName());
return false;
}
Entry *entry = m_entries->getByInnerId(app->getInnerId());
if (!entry)
entry = new Entry(this, app, app->getInnerId());
@ -667,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());
});
}
/**
@ -691,6 +681,10 @@ void TaskManager::loadAppInfos()
if (!info.isValidDesktop())
continue;
// 新AM接口导致用户自定义的desktopfile不再加载
if (m_dbusHandler->newStartManagerAvaliable() && !info.isInstalled())
continue;
AppInfo *appInfo = new AppInfo(info);
Entry *entryObj = new Entry(this, appInfo, appInfo->getInnerId());
entryObj->setIsDocked(isDocked);
@ -883,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) {
@ -983,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;
}
@ -1172,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));
}
/**
@ -1539,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
@ -1606,4 +1605,9 @@ void TaskManager::cancelPreviewWindow()
bool TaskManager::showMultiWindow() const
{
return m_showMultiWindow;
}
}
bool TaskManager::preventDockAutoHide() const
{
return m_ddeLauncherVisible || m_popupVisible || m_trayGridWidgetVisible;
}

View File

@ -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窗口管理

View File

@ -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)

View File

@ -121,7 +121,7 @@ void X11Manager::listenXEventUseXlib()
break;
}
default:
qDebug() << "unused event type " << event.type;
//qDebug() << "unused event type " << event.type;
break;
}
}

View File

@ -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)

View File

@ -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;

View File

@ -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;
}

View File

@ -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 &currentScreen = DOCK_SCREEN->current();
if (isCursorOut(mousePos.x(), mousePos.y())) {
Q_EMIT requestPlayAnimation(currentScreen, m_position, Dock::AniAction::Hide);
}
}

View File

@ -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();

View File

@ -59,7 +59,7 @@ void PluginLoader::run()
}
for (auto plugin : plugins) {
emit pluginFounded(pluginsDir.absoluteFilePath(plugin));
emit pluginFound(pluginsDir.absoluteFilePath(plugin));
}
emit finished();

View File

@ -17,7 +17,7 @@ public:
signals:
void finished() const;
void pluginFounded(const QString &pluginFile) const;
void pluginFound(const QString &pluginFile) const;
protected:
void run();

View File

@ -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>
@ -19,6 +20,7 @@
#include <QMenu>
#include <QPainterPath>
#include <QMouseEvent>
#include <QFontMetrics>
DWIDGET_USE_NAMESPACE
DGUI_USE_NAMESPACE
@ -30,18 +32,25 @@ 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))
, m_position(Dock::Position::Bottom)
, m_dateFont(DFontSizeManager::instance()->t10())
, m_timeFont(timeFont())
, m_dateFont(QFont())
, m_timeFont(QFont())
, m_tipsWidget(new Dock::TipsWidget(this))
, m_menu(new QMenu(this))
, m_tipsTimer(new QTimer(this))
, 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);
// 日期格式变化的时候,需要重绘
@ -62,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()
@ -133,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
@ -144,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
@ -165,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)) {
@ -177,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
@ -189,16 +252,15 @@ 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();
info.m_timeRect = QRect(0, 0, textWidth, DATETIMESIZE / 2);
info.m_dateRect = QRect(0, DATETIMESIZE / 2 + 1, textWidth, DATETIMESIZE / 2);
int timeHeight = QFontMetrics(m_timeFont).boundingRect(info.m_time).height() * (info.m_time.count('\n') + 1);
int dateHeight = QFontMetrics(m_dateFont).boundingRect(info.m_date).height();
info.m_timeRect = QRect(0, 0, textWidth, timeHeight);
info.m_dateRect = QRect(0, timeHeight, textWidth, dateHeight);
return info;
}
int timeWidth = QFontMetrics(m_timeFont).boundingRect(info.m_time).width() + 2;
@ -233,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())
@ -247,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)
@ -265,7 +317,6 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(QPen(palette().brightText(), 1));
int timeAlignFlag = Qt::AlignCenter;
int dateAlignFlag = Qt::AlignCenter;
@ -273,16 +324,14 @@ void DateTimeDisplayer::paintEvent(QPaintEvent *e)
if (m_showMultiRow) {
timeAlignFlag = Qt::AlignHCenter | Qt::AlignBottom;
dateAlignFlag = Qt::AlignHCenter | Qt::AlignTop;
} else {
if (m_timeFont.pixelSize() >= rect().height()) {
m_timeFont.setPixelSize(rect().height() - 2);
m_dateFont.setPixelSize(rect().height() - 2);
}
}
painter.setFont(m_timeFont);
painter.setPen(QPen(palette().brightText(), 2));
painter.drawText(textRect(info.m_timeRect), timeAlignFlag, info.m_time);
painter.setFont(m_dateFont);
painter.setPen(QPen(palette().brightText(), 1));
painter.drawText(textRect(info.m_dateRect), dateAlignFlag, info.m_date);
updateLastData(info);
@ -316,41 +365,40 @@ QPoint DateTimeDisplayer::tipsPoint() const
return window()->mapToGlobal(pointInTopWidget);
}
QFont DateTimeDisplayer::timeFont() const
void DateTimeDisplayer::updateFont() const
{
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right)
return DFontSizeManager::instance()->t6();
static constexpr int MINHEIGHT = 40;
// 如果是上下方向,且当前只有一行,则始终显示小号字体
if (m_oneRow && ( Dock::Position::Top == m_position || Dock::Position::Bottom == m_position )) {
return DFontSizeManager::instance()->t10();
auto info = getTimeString(m_position);
// "xx:xx\nAP" 获取到前 xx:xx 部分
info = info.left(info.indexOf('\n'));
if (m_position == Dock::Position::Left || m_position == Dock::Position::Right) {
auto f = QFont();
bool caled = false;
f.setPixelSize(100);
// 左右时根据获取可以全部显示文本的最小的宽度, 且最大只到40
while(width() > 0 && f.pixelSize() > 2 &&
(QFontMetrics(f).boundingRect(info).width() > qMin(DATETIMESIZE, width()) - 4)) {
f.setPixelSize(f.pixelSize() - 1);
caled = true;
}
// 经过正确的计算后才能更新字体大小
if (caled) {
m_timeFont.setPixelSize(f.pixelSize());
m_dateFont.setPixelSize(f.pixelSize() - 2);
}
return;
}
QList<QFont> dateFontSize = { DFontSizeManager::instance()->t8(),
DFontSizeManager::instance()->t7(),
DFontSizeManager::instance()->t6(),
DFontSizeManager::instance()->t5() };
// dock size >= 70 get max font(t5) size
int index = qMin(qMax(((rect().height() - MINHEIGHT) / 10), 0), dateFontSize.size() - 1);
return dateFontSize[index];
if ((Dock::Position::Top == m_position || Dock::Position::Bottom == m_position )) {
// 单行时保持高度的一半双行时尽量和高度一致但最大只到12。
auto s = height() / (m_oneRow ? 2 : 1) - 2;
m_timeFont.setPixelSize(std::min(s, 12));
// 双行时日期比时间字体小两个像素。
m_dateFont.setPixelSize(std::min(s, 12) - (m_oneRow ? 0 : 2));
}
}
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, [ = ] {
@ -396,8 +444,14 @@ void DateTimeDisplayer::leaveEvent(QEvent *event)
m_tipPopupWindow->hide();
}
QString DateTimeDisplayer::getTimeString() const
{
return getTimeString(m_position);
}
void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
{
int lastSize = m_currentSize;
m_lastDateString = info.m_date;
m_lastTimeString = info.m_time;
QSize dateTimeSize = suitableSize();
@ -405,22 +459,15 @@ void DateTimeDisplayer::updateLastData(const DateTimeInfo &info)
m_currentSize = dateTimeSize.width();
else
m_currentSize = dateTimeSize.height();
}
QString DateTimeDisplayer::getTimeString() const
{
return getTimeString(m_position);
// 如果日期时间的格式发生了变化,需要通知外部来调整日期时间的尺寸
if (lastSize != m_currentSize)
Q_EMIT requestUpdate();
}
bool DateTimeDisplayer::event(QEvent *event)
{
if (event->type() == QEvent::FontChange) {
m_dateFont = DFontSizeManager::instance()->t10();
m_timeFont = timeFont();
Q_EMIT requestUpdate();
} else if (event->type() == QEvent::Resize) {
m_dateFont = DFontSizeManager::instance()->t10();
m_timeFont = timeFont();
if (event->type() == QEvent::Resize) {
updateFont();
}
return QWidget::event(event);
}

View File

@ -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;
@ -57,16 +62,17 @@ private:
DateTimeInfo dateTimeInfo(const Dock::Position &position) const;
void updateLastData(const DateTimeInfo &info);
QString getTimeString() const;
inline QString getTimeString() const;
QString getTimeString(const Dock::Position &position) const;
QString getDateString() const;
inline QString getDateString() const;
QString getDateString(const Dock::Position &position) const;
QPoint tipsPoint() const;
QFont timeFont() const;
void updateFont() const;
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

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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的值在40100
* 1dockSize为39dock的mainwindow高度变成9939
* 2dockSize的值在这里不应该为39
*
*/
dockSize = qBound(DOCK_MIN_SIZE, dockSize, DOCK_MAX_SIZE);
// 通知窗管和后端更新数据
m_multiScreenWorker->updateDaemonDockSize(dockSize); // 1.先更新任务栏高度
}
/** FIX ME
* dockSize的值在40100
* 1dockSize为39dock的mainwindow高度变成9939
* 2dockSize的值在这里不应该为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坐标

View File

@ -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);
}

View File

@ -95,6 +95,7 @@ public:
bool canInsert() const;
bool canMove() const;
void hideToolTip();
void updateContextMenu();
QSize suitableSize() const;

View File

@ -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);

View File

@ -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);

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -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;
};

View File

@ -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);

View File

@ -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);

View File

@ -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;
}

View File

@ -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;

View File

@ -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);
@ -182,7 +177,7 @@ int TrayManagerWindow::appDatetimeSize(const Dock::Position &position) const
int trayHeight = m_trayView->suitableSize(position).height();
int traypluginHeight = trayHeight + m_quickIconWidget->suitableSize(position).height() + m_appPluginLayout->spacing();
return traypluginHeight + m_dateTimeWidget->suitableSize(position).height() + 10;
return traypluginHeight + m_dateTimeWidget->suitableSize(position).height() + 2;
}
QSize TrayManagerWindow::suitableSize() const
@ -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();

View File

@ -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
}

View File

@ -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")

View File

@ -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();
}

View File

@ -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;

View File

@ -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) {

View File

@ -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>

View File

@ -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)

View File

@ -1,4 +0,0 @@
{
"api": "2.0.0",
"depends-daemon-dbus-service": "org.deepin.dde.Timedate1"
}

View File

@ -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>

View File

@ -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;
}

View File

@ -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

View File

@ -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);
}

View File

@ -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

View File

@ -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>();
}

View File

@ -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

View File

@ -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>

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

Some files were not shown because too many files have changed in this diff Show More