From 48d89acbfa70ed652abe6db068c151b1784ca96a Mon Sep 17 00:00:00 2001 From: caixiangrong Date: Tue, 23 Dec 2025 14:21:49 +0800 Subject: [PATCH] feat: Remove old code MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Remove old code feat: 移除旧代码 移除不用的旧代码 --- CMakeLists.txt | 5 - dcc-old/CMakeLists.txt | 1424 ------ dcc-old/include/interface/hlistmodule.h | 60 - dcc-old/include/interface/moduleobject.h | 330 -- dcc-old/include/interface/namespace.h | 24 - dcc-old/include/interface/pagemodule.h | 93 - dcc-old/include/interface/plugininterface.h | 54 - dcc-old/include/interface/vlistmodule.h | 61 - dcc-old/include/widgets/accessibleinterface.h | 531 --- dcc-old/include/widgets/buttontuple.h | 48 - dcc-old/include/widgets/comboxwidget.h | 78 - dcc-old/include/widgets/dccdbusinterface.h | 44 - dcc-old/include/widgets/dcclistview.h | 21 - dcc-old/include/widgets/dccslider.h | 45 - dcc-old/include/widgets/detailinfoitem.h | 51 - dcc-old/include/widgets/horizontalmodule.h | 42 - dcc-old/include/widgets/itemmodule.h | 90 - dcc-old/include/widgets/lineeditwidget.h | 76 - dcc-old/include/widgets/listviewmodule.h | 26 - dcc-old/include/widgets/modulelistmodel.h | 32 - dcc-old/include/widgets/moduleobjectitem.h | 38 - dcc-old/include/widgets/settingsgroup.h | 65 - dcc-old/include/widgets/settingsgroupmodule.h | 30 - dcc-old/include/widgets/settingshead.h | 52 - dcc-old/include/widgets/settingsheaderitem.h | 32 - dcc-old/include/widgets/settingsitem.h | 44 - dcc-old/include/widgets/switchwidget.h | 73 - dcc-old/include/widgets/titledslideritem.h | 45 - dcc-old/include/widgets/titlelabel.h | 23 - dcc-old/include/widgets/titlevalueitem.h | 93 - dcc-old/include/widgets/utils.h | 80 - dcc-old/include/widgets/widgetmodule.h | 57 - dcc-old/misc/translate_desktop2ts.sh | 6 - dcc-old/misc/translate_generation.sh | 11 - dcc-old/src/dcc-agent/main.c | 56 - dcc-old/src/frame/accessible.h | 75 - dcc-old/src/frame/completerview.cpp | 39 - dcc-old/src/frame/completerview.h | 24 - .../src/frame/controlcenterdbusadaptor.cpp | 134 - dcc-old/src/frame/controlcenterdbusadaptor.h | 74 - dcc-old/src/frame/listitemdelegate.cpp | 266 -- dcc-old/src/frame/listitemdelegate.h | 31 - dcc-old/src/frame/listview.cpp | 635 --- dcc-old/src/frame/listview.h | 78 - dcc-old/src/frame/main.cpp | 179 - dcc-old/src/frame/mainmodule.cpp | 234 - dcc-old/src/frame/mainmodule.h | 25 - dcc-old/src/frame/mainwindow.cpp | 586 --- dcc-old/src/frame/mainwindow.h | 106 - dcc-old/src/frame/pluginmanager.cpp | 331 -- dcc-old/src/frame/pluginmanager.h | 60 - dcc-old/src/frame/searchwidget.cpp | 397 -- dcc-old/src/frame/searchwidget.h | 76 - dcc-old/src/frame/utils.cpp | 81 - dcc-old/src/frame/utils.h | 27 - dcc-old/src/interface/hlistmodule.cpp | 160 - dcc-old/src/interface/moduledatamodel.cpp | 171 - dcc-old/src/interface/moduledatamodel.h | 50 - dcc-old/src/interface/moduleobject.cpp | 564 --- dcc-old/src/interface/pagemodule.cpp | 439 -- dcc-old/src/interface/tabitemdelegate.cpp | 161 - dcc-old/src/interface/tabitemdelegate.h | 30 - dcc-old/src/interface/tabview.cpp | 526 --- dcc-old/src/interface/tabview.h | 66 - dcc-old/src/interface/vlistmodule.cpp | 253 - .../operation/accountsdbusproxy.cpp | 103 - .../operation/accountsdbusproxy.h | 58 - .../operation/accountsworker.cpp | 821 ---- .../operation/accountsworker.h | 111 - .../operation/creationresult.cpp | 32 - .../operation/creationresult.h | 41 - .../operation/qrc/accounts.qrc | 23 - .../operation/qrc/icons/dcc_avatar_12px.svg | 3 - .../dcc_deepin_password_strength_high.svg | 21 - .../dcc_deepin_password_strength_low.svg | 23 - .../dcc_deepin_password_strength_middle.svg | 23 - ...n_password_strength_unactive_deep_mode.svg | 7 - ..._password_strength_unactive_light_mode.svg | 21 - .../qrc/icons/dcc_nav_accounts_42px.svg | 150 - .../qrc/icons/dcc_nav_accounts_84px.svg | 178 - .../operation/qrc/icons/dcc_user_add_icon.dci | Bin 7167 -> 0 bytes .../operation/qrc/icons/dcc_user_animal.dci | Bin 1127 -> 0 bytes .../operation/qrc/icons/dcc_user_custom.dci | Bin 709 -> 0 bytes .../operation/qrc/icons/dcc_user_emoji.dci | Bin 921 -> 0 bytes .../operation/qrc/icons/dcc_user_funny.dci | Bin 1211 -> 0 bytes .../operation/qrc/icons/dcc_user_human.dci | Bin 947 -> 0 bytes .../operation/qrc/icons/dcc_user_scenery.dci | Bin 1325 -> 0 bytes .../operation/securitydbusproxy.cpp | 57 - .../operation/securitydbusproxy.h | 33 - .../operation/syncdbusproxy.cpp | 59 - .../plugin-accounts/operation/syncdbusproxy.h | 30 - .../src/plugin-accounts/operation/user.cpp | 222 - dcc-old/src/plugin-accounts/operation/user.h | 149 - .../operation/userdbusproxy.cpp | 314 -- .../plugin-accounts/operation/userdbusproxy.h | 198 - .../plugin-accounts/operation/usermodel.cpp | 162 - .../src/plugin-accounts/operation/usermodel.h | 87 - .../window/AccountsPlugin.json | 3 - .../window/accountslistview.cpp | 502 -- .../plugin-accounts/window/accountslistview.h | 46 - .../plugin-accounts/window/accountsmodel.cpp | 244 - .../plugin-accounts/window/accountsmodel.h | 70 - .../plugin-accounts/window/accountsmodule.cpp | 884 ---- .../plugin-accounts/window/accountsmodule.h | 144 - .../plugin-accounts/window/avatarcropbox.cpp | 49 - .../plugin-accounts/window/avatarcropbox.h | 30 - .../window/avataritemdelegate.cpp | 135 - .../window/avataritemdelegate.h | 47 - .../window/avatarlistframe.cpp | 673 --- .../plugin-accounts/window/avatarlistframe.h | 172 - .../plugin-accounts/window/avatarlistview.cpp | 428 -- .../plugin-accounts/window/avatarlistview.h | 102 - .../window/avatarlistwidget.cpp | 298 -- .../plugin-accounts/window/avatarlistwidget.h | 80 - .../plugin-accounts/window/avatarwidget.cpp | 222 - .../src/plugin-accounts/window/avatarwidget.h | 57 - .../window/createaccountpage.cpp | 650 --- .../window/createaccountpage.h | 104 - .../src/plugin-accounts/window/groupitem.h | 26 - .../window/modifypasswdpage.cpp | 409 -- .../plugin-accounts/window/modifypasswdpage.h | 91 - .../window/pwqualitymanager.cpp | 90 - .../plugin-accounts/window/pwqualitymanager.h | 50 - .../window/removeuserdialog.cpp | 62 - .../plugin-accounts/window/removeuserdialog.h | 29 - .../window/securitylevelitem.cpp | 211 - .../window/securitylevelitem.h | 67 - .../window/securityquestionspage.cpp | 350 -- .../window/securityquestionspage.h | 70 - .../window/unionidbindreminderdialog.cpp | 34 - .../window/unionidbindreminderdialog.h | 20 - .../adapterv20tov23module.cpp | 110 - .../adapterv20tov23module.h | 50 - .../adapterv20tov23plugin.cpp | 185 - .../adapterv20tov23plugin.h | 68 - .../frameproxyinterface.h | 52 - .../plugin-adapterv20tov23/frameproxyv20.cpp | 185 - .../plugin-adapterv20tov23/frameproxyv20.h | 58 - .../plugin-adapterv20tov23/moduleinterface.h | 190 - .../plugin-adapterv20tov23.json | 3 - .../pluginmanagerv20.cpp | 68 - .../plugin-adapterv20tov23/pluginmanagerv20.h | 24 - .../operation/charamangerdbusproxy.cpp | 148 - .../operation/charamangerdbusproxy.h | 64 - .../operation/charamangermodel.cpp | 372 -- .../operation/charamangermodel.h | 238 - .../operation/charamangerworker.cpp | 413 -- .../operation/charamangerworker.h | 100 - .../operation/qrc/authentication.qrc | 116 - .../finger/fingerprint_animation_light_1.svg | 11 - .../finger/fingerprint_animation_light_10.svg | 11 - .../finger/fingerprint_animation_light_11.svg | 11 - .../finger/fingerprint_animation_light_12.svg | 11 - .../finger/fingerprint_animation_light_13.svg | 11 - .../finger/fingerprint_animation_light_14.svg | 11 - .../finger/fingerprint_animation_light_15.svg | 11 - .../finger/fingerprint_animation_light_16.svg | 11 - .../finger/fingerprint_animation_light_17.svg | 11 - .../finger/fingerprint_animation_light_18.svg | 11 - .../finger/fingerprint_animation_light_19.svg | 11 - .../finger/fingerprint_animation_light_2.svg | 11 - .../finger/fingerprint_animation_light_20.svg | 11 - .../finger/fingerprint_animation_light_21.svg | 11 - .../finger/fingerprint_animation_light_22.svg | 11 - .../finger/fingerprint_animation_light_23.svg | 11 - .../finger/fingerprint_animation_light_24.svg | 11 - .../finger/fingerprint_animation_light_25.svg | 11 - .../finger/fingerprint_animation_light_26.svg | 11 - .../finger/fingerprint_animation_light_27.svg | 11 - .../finger/fingerprint_animation_light_28.svg | 11 - .../finger/fingerprint_animation_light_29.svg | 11 - .../finger/fingerprint_animation_light_3.svg | 11 - .../finger/fingerprint_animation_light_30.svg | 11 - .../finger/fingerprint_animation_light_31.svg | 11 - .../finger/fingerprint_animation_light_32.svg | 11 - .../finger/fingerprint_animation_light_33.svg | 11 - .../finger/fingerprint_animation_light_34.svg | 11 - .../finger/fingerprint_animation_light_35.svg | 11 - .../finger/fingerprint_animation_light_36.svg | 11 - .../finger/fingerprint_animation_light_37.svg | 11 - .../finger/fingerprint_animation_light_38.svg | 11 - .../finger/fingerprint_animation_light_39.svg | 11 - .../finger/fingerprint_animation_light_4.svg | 11 - .../finger/fingerprint_animation_light_40.svg | 11 - .../finger/fingerprint_animation_light_41.svg | 11 - .../finger/fingerprint_animation_light_42.svg | 11 - .../finger/fingerprint_animation_light_43.svg | 11 - .../finger/fingerprint_animation_light_44.svg | 11 - .../finger/fingerprint_animation_light_45.svg | 11 - .../finger/fingerprint_animation_light_46.svg | 11 - .../finger/fingerprint_animation_light_47.svg | 11 - .../finger/fingerprint_animation_light_48.svg | 11 - .../finger/fingerprint_animation_light_49.svg | 11 - .../finger/fingerprint_animation_light_5.svg | 11 - .../finger/fingerprint_animation_light_50.svg | 11 - .../finger/fingerprint_animation_light_6.svg | 11 - .../finger/fingerprint_animation_light_7.svg | 11 - .../finger/fingerprint_animation_light_8.svg | 11 - .../finger/fingerprint_animation_light_9.svg | 11 - .../dark/icons/finger/fingerprint_light.svg | 3 - .../qrc/icons/dark/icons/icon_face-fail.svg | 25 - .../qrc/icons/dark/icons/icon_face-start.svg | 6 - .../icons/dark/icons/icon_face-success.svg | 42 - .../icons/dark/icons/icon_unknown_device.svg | 6 - .../qrc/icons/dcc_nav_authentication_42px.svg | 61 - .../qrc/icons/dcc_nav_authentication_84px.svg | 61 - .../finger/fingerprint_animation_light_1.svg | 11 - .../finger/fingerprint_animation_light_10.svg | 11 - .../finger/fingerprint_animation_light_11.svg | 11 - .../finger/fingerprint_animation_light_12.svg | 11 - .../finger/fingerprint_animation_light_13.svg | 11 - .../finger/fingerprint_animation_light_14.svg | 11 - .../finger/fingerprint_animation_light_15.svg | 11 - .../finger/fingerprint_animation_light_16.svg | 11 - .../finger/fingerprint_animation_light_17.svg | 11 - .../finger/fingerprint_animation_light_18.svg | 11 - .../finger/fingerprint_animation_light_19.svg | 11 - .../finger/fingerprint_animation_light_2.svg | 11 - .../finger/fingerprint_animation_light_20.svg | 11 - .../finger/fingerprint_animation_light_21.svg | 11 - .../finger/fingerprint_animation_light_22.svg | 11 - .../finger/fingerprint_animation_light_23.svg | 11 - .../finger/fingerprint_animation_light_24.svg | 11 - .../finger/fingerprint_animation_light_25.svg | 11 - .../finger/fingerprint_animation_light_26.svg | 11 - .../finger/fingerprint_animation_light_27.svg | 11 - .../finger/fingerprint_animation_light_28.svg | 11 - .../finger/fingerprint_animation_light_29.svg | 11 - .../finger/fingerprint_animation_light_3.svg | 11 - .../finger/fingerprint_animation_light_30.svg | 11 - .../finger/fingerprint_animation_light_31.svg | 11 - .../finger/fingerprint_animation_light_32.svg | 11 - .../finger/fingerprint_animation_light_33.svg | 11 - .../finger/fingerprint_animation_light_34.svg | 11 - .../finger/fingerprint_animation_light_35.svg | 11 - .../finger/fingerprint_animation_light_36.svg | 11 - .../finger/fingerprint_animation_light_37.svg | 11 - .../finger/fingerprint_animation_light_38.svg | 11 - .../finger/fingerprint_animation_light_39.svg | 11 - .../finger/fingerprint_animation_light_4.svg | 11 - .../finger/fingerprint_animation_light_40.svg | 11 - .../finger/fingerprint_animation_light_41.svg | 11 - .../finger/fingerprint_animation_light_42.svg | 11 - .../finger/fingerprint_animation_light_43.svg | 11 - .../finger/fingerprint_animation_light_44.svg | 11 - .../finger/fingerprint_animation_light_45.svg | 11 - .../finger/fingerprint_animation_light_46.svg | 11 - .../finger/fingerprint_animation_light_47.svg | 11 - .../finger/fingerprint_animation_light_48.svg | 11 - .../finger/fingerprint_animation_light_49.svg | 11 - .../finger/fingerprint_animation_light_5.svg | 11 - .../finger/fingerprint_animation_light_50.svg | 11 - .../finger/fingerprint_animation_light_6.svg | 11 - .../finger/fingerprint_animation_light_7.svg | 11 - .../finger/fingerprint_animation_light_8.svg | 11 - .../finger/fingerprint_animation_light_9.svg | 11 - .../light/icons/finger/fingerprint_light.svg | 3 - .../qrc/icons/light/icons/icon_face-fail.svg | 25 - .../qrc/icons/light/icons/icon_face-start.svg | 6 - .../icons/light/icons/icon_face-success.svg | 44 - .../icons/light/icons/icon_unknown_device.svg | 6 - .../window/authentication.json | 3 - .../window/authenticationplugin.cpp | 117 - .../window/authenticationplugin.h | 90 - .../window/faceiddetailwidget.cpp | 150 - .../window/faceiddetailwidget.h | 58 - .../window/fingerdetailwidget.cpp | 195 - .../window/fingerdetailwidget.h | 52 - .../window/irisdetailwidget.cpp | 126 - .../window/irisdetailwidget.h | 50 - .../window/widgets/authenticationinfoitem.cpp | 232 - .../window/widgets/authenticationinfoitem.h | 96 - .../window/widgets/disclaimersdialog.cpp | 116 - .../window/widgets/disclaimersdialog.h | 79 - .../window/widgets/disclaimersitem.cpp | 60 - .../window/widgets/disclaimersitem.h | 40 - .../window/widgets/face/addfaceinfodialog.cpp | 217 - .../window/widgets/face/addfaceinfodialog.h | 70 - .../window/widgets/face/faceinfodialog.cpp | 90 - .../window/widgets/face/faceinfodialog.h | 55 - .../window/widgets/face/faceinfowidget.cpp | 122 - .../window/widgets/face/faceinfowidget.h | 42 - .../window/widgets/face/facewidget.cpp | 193 - .../window/widgets/face/facewidget.h | 45 - .../window/widgets/finger/addfingerdialog.cpp | 274 -- .../window/widgets/finger/addfingerdialog.h | 72 - .../widgets/finger/fingerdisclaimer.cpp | 153 - .../window/widgets/finger/fingerdisclaimer.h | 59 - .../widgets/finger/fingerinfowidget.cpp | 166 - .../window/widgets/finger/fingerinfowidget.h | 49 - .../window/widgets/finger/fingeritem.cpp | 43 - .../window/widgets/finger/fingeritem.h | 42 - .../window/widgets/finger/fingerwidget.cpp | 198 - .../window/widgets/finger/fingerwidget.h | 45 - .../window/widgets/iris/addirisinfodialog.cpp | 184 - .../window/widgets/iris/addirisinfodialog.h | 66 - .../window/widgets/iris/irisinfowidget.cpp | 94 - .../window/widgets/iris/irisinfowidget.h | 34 - .../window/widgets/iris/iriswidget.cpp | 194 - .../window/widgets/iris/iriswidget.h | 44 - .../operation/bluetoothadapter.cpp | 204 - .../operation/bluetoothadapter.h | 74 - .../operation/bluetoothdbusproxy.cpp | 156 - .../operation/bluetoothdbusproxy.h | 89 - .../operation/bluetoothdevice.cpp | 104 - .../operation/bluetoothdevice.h | 98 - .../operation/bluetoothmodel.cpp | 126 - .../operation/bluetoothmodel.h | 63 - .../operation/bluetoothworker.cpp | 330 -- .../operation/bluetoothworker.h | 73 - .../qrc/actions/dcc_battery_32px.svg | 3 - .../qrc/actions/dcc_general_purpose_32px.svg | 3 - .../qrc/actions/dcc_using_electric_32px.svg | 3 - .../operation/qrc/bluetooth.qrc | 53 - .../dark/icons/battery-000-symbolic_20px.svg | 3 - .../dark/icons/battery-010-symbolic_20px.svg | 6 - .../dark/icons/battery-020-symbolic_20px.svg | 6 - .../dark/icons/battery-030-symbolic_20px.svg | 6 - .../dark/icons/battery-040-symbolic_20px.svg | 6 - .../dark/icons/battery-050-symbolic_20px.svg | 6 - .../dark/icons/battery-060-symbolic_20px.svg | 6 - .../dark/icons/battery-070-symbolic_20px.svg | 6 - .../dark/icons/battery-080-symbolic_20px.svg | 6 - .../dark/icons/battery-090-symbolic_20px.svg | 6 - .../dark/icons/battery-100-symbolic_20px.svg | 6 - .../icons/battery-unknow-symbolic_20px.svg | 6 - .../qrc/icons/dcc_nav_bluetooth_42px.svg | 43 - .../qrc/icons/dcc_nav_bluetooth_84px.svg | 54 - .../light/icons/battery-000-symbolic_20px.svg | 3 - .../light/icons/battery-010-symbolic_20px.svg | 6 - .../light/icons/battery-020-symbolic_20px.svg | 6 - .../light/icons/battery-030-symbolic_20px.svg | 6 - .../light/icons/battery-040-symbolic_20px.svg | 6 - .../light/icons/battery-050-symbolic_20px.svg | 6 - .../light/icons/battery-060-symbolic_20px.svg | 6 - .../light/icons/battery-070-symbolic_20px.svg | 6 - .../light/icons/battery-080-symbolic_20px.svg | 6 - .../light/icons/battery-090-symbolic_20px.svg | 6 - .../light/icons/battery-100-symbolic_20px.svg | 6 - .../icons/battery-unknow-symbolic_20px.svg | 6 - .../qrc/texts/bluetooth_camera_16px.svg | 9 - .../qrc/texts/bluetooth_clang_16px.svg | 9 - .../qrc/texts/bluetooth_keyboard_16px.svg | 9 - .../qrc/texts/bluetooth_lan_16px.svg | 9 - .../qrc/texts/bluetooth_laptop_16px.svg | 9 - .../qrc/texts/bluetooth_microphone_16px.svg | 9 - .../qrc/texts/bluetooth_mouse_16px.svg | 9 - .../qrc/texts/bluetooth_other_16px.svg | 9 - .../qrc/texts/bluetooth_pad_16px.svg | 9 - .../operation/qrc/texts/bluetooth_pc_16px.svg | 9 - .../qrc/texts/bluetooth_pen_16px.svg | 9 - .../qrc/texts/bluetooth_pheadset_16px.svg | 9 - .../qrc/texts/bluetooth_phone_16px.svg | 9 - .../qrc/texts/bluetooth_print_16px.svg | 9 - .../qrc/texts/bluetooth_scaner_16px.svg | 9 - .../qrc/texts/bluetooth_touchpad_16px.svg | 9 - .../operation/qrc/texts/bluetooth_tv_16px.svg | 9 - .../qrc/texts/bluetooth_video_16px.svg | 11 - .../qrc/texts/bluetooth_vidicon_16px.svg | 7 - .../operation/qrc/texts/dcc_edit_12px.svg | 3 - .../operation/qrc/texts/dcc_refresh_12px.svg | 3 - .../plugin-bluetooth/window/adaptermodule.cpp | 381 -- .../plugin-bluetooth/window/adaptermodule.h | 87 - .../window/bluetoothdevicemodel.cpp | 447 -- .../window/bluetoothdevicemodel.h | 74 - .../window/bluetoothmodule.cpp | 146 - .../plugin-bluetooth/window/bluetoothmodule.h | 60 - .../window/bluetoothplugin.cpp | 38 - .../plugin-bluetooth/window/bluetoothplugin.h | 28 - .../plugin-bluetooth/window/pincodedialog.cpp | 67 - .../plugin-bluetooth/window/pincodedialog.h | 28 - .../window/plugin-bluetooth.json | 3 - .../src/plugin-bluetooth/window/titleedit.cpp | 93 - .../src/plugin-bluetooth/window/titleedit.h | 37 - .../operation/commoninfomodel.cpp | 147 - .../operation/commoninfomodel.h | 79 - .../operation/commoninfoproxy.cpp | 201 - .../operation/commoninfoproxy.h | 100 - .../operation/commoninfowork.cpp | 421 -- .../operation/commoninfowork.h | 56 - .../operation/qrc/commoninfo.qrc | 6 - .../qrc/icons/dcc_nav_commoninfo_42px.svg | 32 - .../qrc/icons/dcc_nav_commoninfo_84px.svg | 42 - .../window/CommonInfoPlugin.json | 3 - .../plugin-commoninfo/window/bootwidget.cpp | 435 -- .../src/plugin-commoninfo/window/bootwidget.h | 71 - .../window/commonbackgrounditem.cpp | 173 - .../window/commonbackgrounditem.h | 37 - .../window/commoninfolistview.cpp | 33 - .../window/commoninfolistview.h | 24 - .../window/commoninfomodule.cpp | 231 - .../window/commoninfomodule.h | 121 - .../window/developermodedialog.cpp | 280 -- .../window/developermodedialog.h | 169 - .../window/developermodewidget.cpp | 187 - .../window/developermodewidget.h | 45 - .../window/plymouthdisplay.cpp | 46 - .../window/plymouthdisplay.h | 28 - .../window/pwqualitymanager.cpp | 90 - .../window/pwqualitymanager.h | 50 - .../window/userexperienceprogramwidget.cpp | 85 - .../window/userexperienceprogramwidget.h | 28 - .../operation/datetimedbusproxy.cpp | 247 - .../operation/datetimedbusproxy.h | 151 - .../operation/datetimemodel.cpp | 226 - .../plugin-datetime/operation/datetimemodel.h | 148 - .../operation/datetimeworker.cpp | 401 -- .../operation/datetimeworker.h | 92 - .../operation/qrc/datetime.qrc | 18 - .../qrc/icons/dcc_nav_datetime_42px.svg | 57 - .../qrc/icons/dcc_nav_datetime_84px.svg | 49 - .../operation/qrc/images/indicator_active.png | Bin 272 -> 0 bytes .../operation/qrc/images/popup_menu.css | 27 - .../operation/qrc/images/timezone_map_big.png | Bin 106965 -> 0 bytes .../qrc/images/timezone_map_big2.png | Bin 65327 -> 0 bytes .../qrc/images/timezone_map_big@1x.svg | 354 -- .../qrc/images/timezone_map_big@2x.png | Bin 269633 -> 0 bytes .../resource/deepindigitaltimes-Regular.ttf | Bin 3104 -> 0 bytes .../qrc/texts/dcc_clock_black_16px.svg | 50 - .../qrc/texts/dcc_clock_white_16px.svg | 43 - .../qrc/texts/dcc_noun_hour_16px.svg | 3 - .../qrc/texts/dcc_noun_minute_16px.svg | 3 - .../qrc/texts/dcc_noun_second_16px.svg | 3 - .../plugin-datetime/operation/regionproxy.cpp | 376 -- .../plugin-datetime/operation/regionproxy.h | 121 - .../plugin-datetime/operation/zoneinfo.cpp | 74 - .../src/plugin-datetime/operation/zoneinfo.h | 44 - .../plugin-datetime/window/datetimeplugin.cpp | 60 - .../plugin-datetime/window/datetimeplugin.h | 47 - .../window/plugin-datetime.json | 3 - .../plugin-datetime/window/regionmodule.cpp | 360 -- .../src/plugin-datetime/window/regionmodule.h | 82 - .../window/timesettingmodule.cpp | 446 -- .../window/timesettingmodule.h | 71 - .../plugin-datetime/window/timezonemodule.cpp | 122 - .../plugin-datetime/window/timezonemodule.h | 48 - .../window/widgets/basiclistdelegate.cpp | 70 - .../window/widgets/basiclistdelegate.h | 27 - .../window/widgets/basiclistmodel.cpp | 72 - .../window/widgets/basiclistmodel.h | 43 - .../plugin-datetime/window/widgets/clock.cpp | 148 - .../plugin-datetime/window/widgets/clock.h | 39 - .../plugin-datetime/window/widgets/consts.h | 22 - .../widgets/customregionformatdialog.cpp | 179 - .../window/widgets/customregionformatdialog.h | 49 - .../window/widgets/datewidget.cpp | 198 - .../window/widgets/datewidget.h | 59 - .../window/widgets/file_util.cpp | 240 - .../window/widgets/file_util.h | 69 - .../window/widgets/popup_menu.cpp | 198 - .../window/widgets/popup_menu.h | 68 - .../window/widgets/popup_menu_delegate.cpp | 47 - .../window/widgets/popup_menu_delegate.h | 28 - .../window/widgets/regionformatdialog.cpp | 234 - .../window/widgets/regionformatdialog.h | 71 - .../window/widgets/searchinput.cpp | 69 - .../window/widgets/searchinput.h | 32 - .../window/widgets/timezone.cpp | 225 - .../plugin-datetime/window/widgets/timezone.h | 67 - .../window/widgets/timezone_map.cpp | 244 - .../window/widgets/timezone_map.h | 77 - .../window/widgets/timezone_map_util.cpp | 69 - .../window/widgets/timezone_map_util.h | 22 - .../window/widgets/timezonechooser.cpp | 311 -- .../window/widgets/timezonechooser.h | 76 - .../window/widgets/timezoneclock.cpp | 116 - .../window/widgets/timezoneclock.h | 37 - .../window/widgets/timezoneitem.cpp | 136 - .../window/widgets/timezoneitem.h | 52 - .../window/widgets/tooltip_pin.cpp | 109 - .../window/widgets/tooltip_pin.h | 35 - .../operation/defappmodel.cpp | 29 - .../plugin-defaultapp/operation/defappmodel.h | 35 - .../operation/defappworker.cpp | 452 -- .../operation/defappworker.h | 68 - .../operation/defappworkerold.cpp | 318 -- .../operation/defappworkerold.h | 59 - .../operation/mimedbusproxy.cpp | 95 - .../operation/mimedbusproxy.h | 45 - .../operation/mimedbusproxyold.cpp | 63 - .../operation/mimedbusproxyold.h | 36 - .../qrc/actions/dcc_browser_32px.svg | 6 - .../operation/qrc/actions/dcc_mail_32px.svg | 3 - .../operation/qrc/actions/dcc_music_32px.svg | 6 - .../operation/qrc/actions/dcc_photo_32px.svg | 3 - .../qrc/actions/dcc_terminal_32px.svg | 3 - .../operation/qrc/actions/dcc_text_32px.svg | 3 - .../operation/qrc/actions/dcc_video_32px.svg | 3 - .../operation/qrc/defapp.qrc | 15 - .../qrc/icons/dcc_nav_defapp_42px.svg | 47 - .../qrc/icons/dcc_nav_defapp_84px.svg | 54 - .../qrc/themes/dark/icons/nav_defapp.svg | 12 - .../themes/dark/icons/nav_defapp_normal.svg | 12 - .../window/defappdetailwidget.cpp | 325 -- .../window/defappdetailwidget.h | 84 - .../plugin-defaultapp/window/defappplugin.cpp | 163 - .../plugin-defaultapp/window/defappplugin.h | 56 - .../plugin-defaultapp/window/defaultapp.json | 3 - .../window/widgets/addbuttonwidget.cpp | 103 - .../window/widgets/addbuttonwidget.h | 41 - .../window/widgets/category.cpp | 74 - .../window/widgets/category.h | 65 - .../operation/displaydbusproxy.cpp | 315 -- .../operation/displaydbusproxy.h | 151 - .../plugin-display/operation/displaymodel.cpp | 241 - .../plugin-display/operation/displaymodel.h | 153 - .../operation/displayworker.cpp | 915 ---- .../plugin-display/operation/displayworker.h | 113 - .../src/plugin-display/operation/monitor.cpp | 294 -- .../src/plugin-display/operation/monitor.h | 151 - .../operation/monitordbusproxy.cpp | 216 - .../operation/monitordbusproxy.h | 140 - .../operation/qrc/actions/dcc_break_32px.svg | 20 - .../qrc/actions/dcc_brightnesshigh_32px.svg | 3 - .../qrc/actions/dcc_brightnesslow_32px.svg | 3 - .../qrc/built-in-icons/dcc_display_bottom.dci | Bin 795 -> 0 bytes .../qrc/built-in-icons/dcc_display_left.dci | Bin 789 -> 0 bytes .../qrc/built-in-icons/dcc_display_right.dci | Bin 795 -> 0 bytes .../qrc/built-in-icons/dcc_display_top.dci | Bin 787 -> 0 bytes .../plugin-display/operation/qrc/display.qrc | 45 - .../qrc/icons/dark/icons/dark/Center.svg | 6 - .../qrc/icons/dark/icons/dark/Default.svg | 12 - .../qrc/icons/dark/icons/dark/Fit.svg | 6 - .../qrc/icons/dark/icons/dark/Stretch.svg | 6 - .../qrc/icons/dark/icons/hover/Center.svg | 12 - .../qrc/icons/dark/icons/hover/Default.svg | 12 - .../qrc/icons/dark/icons/hover/Fit.svg | 12 - .../qrc/icons/dark/icons/hover/Stretch.svg | 12 - .../qrc/icons/dark/icons/white/Center.svg | 6 - .../qrc/icons/dark/icons/white/Default.svg | 12 - .../qrc/icons/dark/icons/white/Fit.svg | 6 - .../qrc/icons/dark/icons/white/Stretch.svg | 6 - .../qrc/icons/dcc_nav_display_42px.svg | 32 - .../qrc/icons/dcc_nav_display_84px.svg | 32 - .../qrc/icons/light/icon/black/Center.svg | 6 - .../qrc/icons/light/icon/black/Default.svg | 12 - .../qrc/icons/light/icon/black/Fit.svg | 6 - .../qrc/icons/light/icon/black/Stretch.svg | 6 - .../qrc/icons/light/icon/hover/Center.svg | 12 - .../qrc/icons/light/icon/hover/Default.svg | 12 - .../qrc/icons/light/icon/hover/Fit.svg | 12 - .../qrc/icons/light/icon/hover/Stretch.svg | 12 - .../qrc/icons/light/icon/light/Center.svg | 6 - .../qrc/icons/light/icon/light/Default.svg | 12 - .../qrc/icons/light/icon/light/Fit.svg | 6 - .../qrc/icons/light/icon/light/Stretch.svg | 6 - .../qrc/icons/light/icon/white/Center.svg | 6 - .../qrc/icons/light/icon/white/Default.svg | 12 - .../qrc/icons/light/icon/white/Fit.svg | 6 - .../qrc/icons/light/icon/white/Stretch.svg | 6 - .../operation/types/brightnessmap.cpp | 10 - .../operation/types/brightnessmap.h | 14 - .../operation/types/reflectlist.cpp | 10 - .../operation/types/reflectlist.h | 14 - .../operation/types/resolution.cpp | 54 - .../operation/types/resolution.h | 38 - .../operation/types/resolutionlist.cpp | 12 - .../operation/types/resolutionlist.h | 15 - .../operation/types/rotationlist.cpp | 10 - .../operation/types/rotationlist.h | 14 - .../operation/types/screenrect.cpp | 52 - .../operation/types/screenrect.h | 33 - .../operation/types/touchscreeninfolist.cpp | 41 - .../operation/types/touchscreeninfolist.h | 30 - .../types/touchscreeninfolist_v2.cpp | 40 - .../operation/types/touchscreeninfolist_v2.h | 31 - .../operation/types/touchscreenmap.cpp | 10 - .../operation/types/touchscreenmap.h | 14 - .../wayland/libwayqt/Output.cpp | 182 - .../wayland/libwayqt/Output.hpp | 128 - .../wayland/libwayqt/OutputManager.cpp | 515 --- .../wayland/libwayqt/OutputManager.hpp | 268 -- .../wayland/libwayqt/Registry.cpp | 318 -- .../wayland/libwayqt/Registry.hpp | 197 - .../libwayqt/TreeLandOutputManager.cpp | 45 - .../libwayqt/TreeLandOutputManager.hpp | 47 - .../wayland/libwayqt/WayQtUtils.cpp | 187 - .../wayland/libwayqt/WayQtUtils.hpp | 61 - .../protocols/treeland-output-management.xml | 31 - .../wlr-output-management-unstable-v1.xml | 554 --- .../plugin-display/window/DisplayPlugin.json | 3 - .../window/brightnesswidget.cpp | 344 -- .../plugin-display/window/brightnesswidget.h | 81 - .../window/cooperationsettingsdialog.cpp | 183 - .../window/cooperationsettingsdialog.h | 71 - .../plugin-display/window/displaymodule.cpp | 488 -- .../src/plugin-display/window/displaymodule.h | 67 - .../window/filechoosewidget.cpp | 41 - .../plugin-display/window/filechoosewidget.h | 32 - .../window/monitorcontrolwidget.cpp | 90 - .../window/monitorcontrolwidget.h | 55 - .../window/monitorindicator.cpp | 69 - .../plugin-display/window/monitorindicator.h | 40 - .../window/monitorproxywidget.cpp | 196 - .../window/monitorproxywidget.h | 105 - .../plugin-display/window/monitorsground.cpp | 1749 ------- .../plugin-display/window/monitorsground.h | 102 - .../window/multiscreenwidget.cpp | 493 -- .../plugin-display/window/multiscreenwidget.h | 115 - .../plugin-display/window/recognizewidget.cpp | 82 - .../plugin-display/window/recognizewidget.h | 43 - .../window/refreshratewidget.cpp | 167 - .../plugin-display/window/refreshratewidget.h | 67 - .../window/resolutionwidget.cpp | 512 --- .../plugin-display/window/resolutionwidget.h | 115 - .../plugin-display/window/rotatewidget.cpp | 87 - .../src/plugin-display/window/rotatewidget.h | 49 - .../plugin-display/window/scalingwidget.cpp | 144 - .../src/plugin-display/window/scalingwidget.h | 61 - .../window/secondaryscreendialog.cpp | 275 -- .../window/secondaryscreendialog.h | 68 - .../plugin-display/window/timeoutdialog.cpp | 75 - .../src/plugin-display/window/timeoutdialog.h | 39 - .../src/plugin-display/window/treecombox.cpp | 130 - .../src/plugin-display/window/treecombox.h | 63 - .../operation/keyboarddbusproxy.cpp | 349 -- .../operation/keyboarddbusproxy.h | 207 - .../operation/keyboardmodel.cpp | 222 - .../plugin-keyboard/operation/keyboardmodel.h | 100 - .../operation/keyboardwork.cpp | 812 ---- .../plugin-keyboard/operation/keyboardwork.h | 124 - .../plugin-keyboard/operation/metadata.cpp | 84 - .../src/plugin-keyboard/operation/metadata.h | 46 - .../qrc/icons/dcc_nav_keyboard_42px.svg | 63 - .../qrc/icons/dcc_nav_keyboard_84px.svg | 59 - .../operation/qrc/icons/list_select.png | Bin 508 -> 0 bytes .../operation/qrc/icons/list_select@2x.png | Bin 1176 -> 0 bytes .../operation/qrc/keyboard.qrc | 10 - .../operation/shortcutmodel.cpp | 367 -- .../plugin-keyboard/operation/shortcutmodel.h | 104 - .../window/KeyboardPlugin.json | 3 - .../window/customcontentdialog.cpp | 216 - .../window/customcontentdialog.h | 55 - .../src/plugin-keyboard/window/customedit.cpp | 179 - .../src/plugin-keyboard/window/customedit.h | 51 - .../src/plugin-keyboard/window/customitem.cpp | 110 - .../src/plugin-keyboard/window/customitem.h | 47 - .../window/generalkbsettingwidget.cpp | 131 - .../window/generalkbsettingwidget.h | 48 - .../src/plugin-keyboard/window/indexmodel.cpp | 66 - .../src/plugin-keyboard/window/indexmodel.h | 47 - .../src/plugin-keyboard/window/indexview.cpp | 50 - .../src/plugin-keyboard/window/indexview.h | 32 - .../window/kblayoutsettingwidget.cpp | 263 -- .../window/kblayoutsettingwidget.h | 83 - .../window/keyboardlayoutdialog.cpp | 229 - .../window/keyboardlayoutdialog.h | 60 - .../plugin-keyboard/window/keyboardmodule.cpp | 281 -- .../plugin-keyboard/window/keyboardmodule.h | 135 - .../src/plugin-keyboard/window/keylabel.cpp | 63 - dcc-old/src/plugin-keyboard/window/keylabel.h | 26 - .../plugin-keyboard/window/searchinput.cpp | 96 - .../src/plugin-keyboard/window/searchinput.h | 35 - .../window/shortcutcontentdialog.cpp | 159 - .../window/shortcutcontentdialog.h | 52 - .../plugin-keyboard/window/shortcutitem.cpp | 230 - .../src/plugin-keyboard/window/shortcutitem.h | 67 - .../plugin-keyboard/window/shortcutkey.cpp | 53 - .../src/plugin-keyboard/window/shortcutkey.h | 30 - .../window/shortcutsettingwidget.cpp | 475 -- .../window/shortcutsettingwidget.h | 99 - .../window/systemlanguagesettingdialog.cpp | 179 - .../window/systemlanguagesettingdialog.h | 69 - .../window/systemlanguagewidget.cpp | 209 - .../window/systemlanguagewidget.h | 66 - .../window/titlebuttonItem.cpp | 45 - .../plugin-keyboard/window/titlebuttonItem.h | 33 - .../plugin-mouse/operation/mousedbusproxy.cpp | 353 -- .../plugin-mouse/operation/mousedbusproxy.h | 73 - .../src/plugin-mouse/operation/mousemodel.cpp | 224 - .../src/plugin-mouse/operation/mousemodel.h | 125 - .../plugin-mouse/operation/mouseworker.cpp | 243 - .../src/plugin-mouse/operation/mouseworker.h | 92 - .../double_test/bow_head/bow_head_00001.png | Bin 6214 -> 0 bytes .../bow_head/bow_head_00001@2x.png | Bin 14947 -> 0 bytes .../double_test/bow_head/bow_head_00002.png | Bin 6204 -> 0 bytes .../bow_head/bow_head_00002@2x.png | Bin 14874 -> 0 bytes .../double_test/bow_head/bow_head_00003.png | Bin 6136 -> 0 bytes .../bow_head/bow_head_00003@2x.png | Bin 14943 -> 0 bytes .../double_test/bow_head/bow_head_00004.png | Bin 6167 -> 0 bytes .../bow_head/bow_head_00004@2x.png | Bin 14972 -> 0 bytes .../double_test/bow_head/bow_head_00005.png | Bin 6261 -> 0 bytes .../bow_head/bow_head_00005@2x.png | Bin 15122 -> 0 bytes .../double_test/bow_head/bow_head_00006.png | Bin 6223 -> 0 bytes .../bow_head/bow_head_00006@2x.png | Bin 15043 -> 0 bytes .../double_test/bow_head/bow_head_00007.png | Bin 6276 -> 0 bytes .../bow_head/bow_head_00007@2x.png | Bin 15082 -> 0 bytes .../double_test/bow_head/bow_head_00008.png | Bin 6131 -> 0 bytes .../bow_head/bow_head_00008@2x.png | Bin 14685 -> 0 bytes .../double_test/bow_head/bow_head_00009.png | Bin 5697 -> 0 bytes .../bow_head/bow_head_00009@2x.png | Bin 13610 -> 0 bytes .../double_test/bow_head/bow_head_00010.png | Bin 5373 -> 0 bytes .../bow_head/bow_head_00010@2x.png | Bin 12636 -> 0 bytes .../double_test/bow_head/bow_head_00011.png | Bin 4844 -> 0 bytes .../bow_head/bow_head_00011@2x.png | Bin 11683 -> 0 bytes .../double_test/bow_head/bow_head_00012.png | Bin 4491 -> 0 bytes .../bow_head/bow_head_00012@2x.png | Bin 10713 -> 0 bytes .../double_test/bow_head/bow_head_00013.png | Bin 3923 -> 0 bytes .../bow_head/bow_head_00013@2x.png | Bin 9678 -> 0 bytes .../double_test/bow_head/bow_head_00014.png | Bin 3520 -> 0 bytes .../bow_head/bow_head_00014@2x.png | Bin 8870 -> 0 bytes .../double_test/bow_head/bow_head_00015.png | Bin 3391 -> 0 bytes .../bow_head/bow_head_00015@2x.png | Bin 8440 -> 0 bytes .../double_test/bow_head/bow_head_00016.png | Bin 3269 -> 0 bytes .../bow_head/bow_head_00016@2x.png | Bin 8200 -> 0 bytes .../double_test/bow_head/bow_head_00017.png | Bin 3223 -> 0 bytes .../bow_head/bow_head_00017@2x.png | Bin 7932 -> 0 bytes .../double_test/bow_head/bow_head_00018.png | Bin 3235 -> 0 bytes .../bow_head/bow_head_00018@2x.png | Bin 8062 -> 0 bytes .../double_test/bow_head/bow_head_00019.png | Bin 3251 -> 0 bytes .../bow_head/bow_head_00019@2x.png | Bin 8026 -> 0 bytes .../bow_head_ears/bow_head_ears_00001.png | Bin 3258 -> 0 bytes .../bow_head_ears/bow_head_ears_00001@2x.png | Bin 8052 -> 0 bytes .../bow_head_ears/bow_head_ears_00002.png | Bin 3304 -> 0 bytes .../bow_head_ears/bow_head_ears_00002@2x.png | Bin 8225 -> 0 bytes .../bow_head_ears/bow_head_ears_00003.png | Bin 3263 -> 0 bytes .../bow_head_ears/bow_head_ears_00003@2x.png | Bin 8103 -> 0 bytes .../bow_head_ears/bow_head_ears_00004.png | Bin 3260 -> 0 bytes .../bow_head_ears/bow_head_ears_00004@2x.png | Bin 8091 -> 0 bytes .../bow_head_ears/bow_head_ears_00005.png | Bin 3231 -> 0 bytes .../bow_head_ears/bow_head_ears_00005@2x.png | Bin 8088 -> 0 bytes .../bow_head_ears/bow_head_ears_00006.png | Bin 3274 -> 0 bytes .../bow_head_ears/bow_head_ears_00006@2x.png | Bin 8075 -> 0 bytes .../bow_head_ears/bow_head_ears_00007.png | Bin 3242 -> 0 bytes .../bow_head_ears/bow_head_ears_00007@2x.png | Bin 8155 -> 0 bytes .../bow_head_ears/bow_head_ears_00008.png | Bin 3292 -> 0 bytes .../bow_head_ears/bow_head_ears_00008@2x.png | Bin 8267 -> 0 bytes .../bow_head_ears/bow_head_ears_00009.png | Bin 3251 -> 0 bytes .../bow_head_ears/bow_head_ears_00009@2x.png | Bin 8026 -> 0 bytes .../raise_head/raise_head_00001.png | Bin 3251 -> 0 bytes .../raise_head/raise_head_00001@2x.png | Bin 8026 -> 0 bytes .../raise_head/raise_head_00002.png | Bin 3290 -> 0 bytes .../raise_head/raise_head_00002@2x.png | Bin 8141 -> 0 bytes .../raise_head/raise_head_00003.png | Bin 3491 -> 0 bytes .../raise_head/raise_head_00003@2x.png | Bin 8624 -> 0 bytes .../raise_head/raise_head_00004.png | Bin 4766 -> 0 bytes .../raise_head/raise_head_00004@2x.png | Bin 11404 -> 0 bytes .../raise_head/raise_head_00005.png | Bin 5468 -> 0 bytes .../raise_head/raise_head_00005@2x.png | Bin 12701 -> 0 bytes .../raise_head/raise_head_00006.png | Bin 4874 -> 0 bytes .../raise_head/raise_head_00006@2x.png | Bin 11866 -> 0 bytes .../raise_head/raise_head_00007.png | Bin 4709 -> 0 bytes .../raise_head/raise_head_00007@2x.png | Bin 11545 -> 0 bytes .../raise_head/raise_head_00008.png | Bin 5218 -> 0 bytes .../raise_head/raise_head_00008@2x.png | Bin 12830 -> 0 bytes .../raise_head/raise_head_00009.png | Bin 5999 -> 0 bytes .../raise_head/raise_head_00009@2x.png | Bin 14642 -> 0 bytes .../raise_head/raise_head_00010.png | Bin 6133 -> 0 bytes .../raise_head/raise_head_00010@2x.png | Bin 14740 -> 0 bytes .../raise_head/raise_head_00011.png | Bin 6139 -> 0 bytes .../raise_head/raise_head_00011@2x.png | Bin 14736 -> 0 bytes .../raise_head/raise_head_00012.png | Bin 6155 -> 0 bytes .../raise_head/raise_head_00012@2x.png | Bin 14786 -> 0 bytes .../raise_head/raise_head_00013.png | Bin 6105 -> 0 bytes .../raise_head/raise_head_00013@2x.png | Bin 14722 -> 0 bytes .../raise_head/raise_head_00014.png | Bin 6105 -> 0 bytes .../raise_head/raise_head_00014@2x.png | Bin 14722 -> 0 bytes .../raise_head/raise_head_00015.png | Bin 6105 -> 0 bytes .../raise_head/raise_head_00015@2x.png | Bin 14722 -> 0 bytes .../raise_head/raise_head_00016.png | Bin 6105 -> 0 bytes .../raise_head/raise_head_00016@2x.png | Bin 14722 -> 0 bytes .../raise_head/raise_head_00017.png | Bin 6173 -> 0 bytes .../raise_head/raise_head_00017@2x.png | Bin 14724 -> 0 bytes .../raise_head/raise_head_00018.png | Bin 6165 -> 0 bytes .../raise_head/raise_head_00018@2x.png | Bin 14801 -> 0 bytes .../raise_head/raise_head_00019.png | Bin 6149 -> 0 bytes .../raise_head/raise_head_00019@2x.png | Bin 14768 -> 0 bytes .../raise_head/raise_head_00020.png | Bin 6129 -> 0 bytes .../raise_head/raise_head_00020@2x.png | Bin 14736 -> 0 bytes .../raise_head/raise_head_00021.png | Bin 6167 -> 0 bytes .../raise_head/raise_head_00021@2x.png | Bin 14723 -> 0 bytes .../raise_head/raise_head_00022.png | Bin 6167 -> 0 bytes .../raise_head/raise_head_00022@2x.png | Bin 14723 -> 0 bytes .../raise_head/raise_head_00023.png | Bin 6167 -> 0 bytes .../raise_head/raise_head_00023@2x.png | Bin 14723 -> 0 bytes .../raise_head/raise_head_00024.png | Bin 6167 -> 0 bytes .../raise_head/raise_head_00024@2x.png | Bin 14723 -> 0 bytes .../raise_head/raise_head_00025.png | Bin 6110 -> 0 bytes .../raise_head/raise_head_00025@2x.png | Bin 14744 -> 0 bytes .../raise_head/raise_head_00026.png | Bin 6151 -> 0 bytes .../raise_head/raise_head_00026@2x.png | Bin 14833 -> 0 bytes .../raise_head/raise_head_00027.png | Bin 6156 -> 0 bytes .../raise_head/raise_head_00027@2x.png | Bin 14799 -> 0 bytes .../raise_head/raise_head_00028.png | Bin 5558 -> 0 bytes .../raise_head/raise_head_00028@2x.png | Bin 13624 -> 0 bytes .../raise_head/raise_head_00029.png | Bin 5128 -> 0 bytes .../raise_head/raise_head_00029@2x.png | Bin 12939 -> 0 bytes .../raise_head/raise_head_00030.png | Bin 5253 -> 0 bytes .../raise_head/raise_head_00030@2x.png | Bin 13081 -> 0 bytes .../raise_head/raise_head_00031.png | Bin 5681 -> 0 bytes .../raise_head/raise_head_00031@2x.png | Bin 13923 -> 0 bytes .../raise_head/raise_head_00032.png | Bin 6184 -> 0 bytes .../raise_head/raise_head_00032@2x.png | Bin 14903 -> 0 bytes .../raise_head/raise_head_00033.png | Bin 5427 -> 0 bytes .../raise_head/raise_head_00033@2x.png | Bin 13354 -> 0 bytes .../raise_head/raise_head_00034.png | Bin 5005 -> 0 bytes .../raise_head/raise_head_00034@2x.png | Bin 12701 -> 0 bytes .../raise_head/raise_head_00035.png | Bin 5317 -> 0 bytes .../raise_head/raise_head_00035@2x.png | Bin 13224 -> 0 bytes .../raise_head/raise_head_00036.png | Bin 5857 -> 0 bytes .../raise_head/raise_head_00036@2x.png | Bin 14280 -> 0 bytes .../raise_head/raise_head_00037.png | Bin 6214 -> 0 bytes .../raise_head/raise_head_00037@2x.png | Bin 14947 -> 0 bytes .../raise_head_ears/raise_head_ears_00001.png | Bin 6225 -> 0 bytes .../raise_head_ears_00001@2x.png | Bin 14982 -> 0 bytes .../raise_head_ears/raise_head_ears_00002.png | Bin 6240 -> 0 bytes .../raise_head_ears_00002@2x.png | Bin 15003 -> 0 bytes .../raise_head_ears/raise_head_ears_00003.png | Bin 6187 -> 0 bytes .../raise_head_ears_00003@2x.png | Bin 14990 -> 0 bytes .../raise_head_ears/raise_head_ears_00004.png | Bin 6246 -> 0 bytes .../raise_head_ears_00004@2x.png | Bin 14953 -> 0 bytes .../raise_head_ears/raise_head_ears_00005.png | Bin 6206 -> 0 bytes .../raise_head_ears_00005@2x.png | Bin 14994 -> 0 bytes .../raise_head_ears/raise_head_ears_00006.png | Bin 6210 -> 0 bytes .../raise_head_ears_00006@2x.png | Bin 15025 -> 0 bytes .../raise_head_ears/raise_head_ears_00007.png | Bin 6236 -> 0 bytes .../raise_head_ears_00007@2x.png | Bin 15065 -> 0 bytes .../raise_head_ears/raise_head_ears_00008.png | Bin 6228 -> 0 bytes .../raise_head_ears_00008@2x.png | Bin 15054 -> 0 bytes .../raise_head_ears/raise_head_ears_00009.png | Bin 6214 -> 0 bytes .../raise_head_ears_00009@2x.png | Bin 14947 -> 0 bytes .../qrc/icons/dcc_nav_mouse_42px.svg | 52 - .../qrc/icons/dcc_nav_mouse_84px.svg | 61 - .../src/plugin-mouse/operation/qrc/mouse.qrc | 156 - .../src/plugin-mouse/window/MousePlugin.json | 3 - .../src/plugin-mouse/window/doutestwidget.cpp | 106 - .../src/plugin-mouse/window/doutestwidget.h | 48 - .../window/generalsettingwidget.cpp | 144 - .../window/generalsettingwidget.h | 52 - .../src/plugin-mouse/window/mousemodule.cpp | 143 - dcc-old/src/plugin-mouse/window/mousemodule.h | 100 - .../window/mousesettingwidget.cpp | 87 - .../plugin-mouse/window/mousesettingwidget.h | 47 - .../plugin-mouse/window/palmdetectsetting.cpp | 120 - .../plugin-mouse/window/palmdetectsetting.h | 42 - .../window/touchpadsettingwidget.cpp | 95 - .../window/touchpadsettingwidget.h | 53 - .../window/trackpointsettingwidget.cpp | 51 - .../window/trackpointsettingwidget.h | 38 - .../operation/model/appitemmodel.cpp | 112 - .../operation/model/appitemmodel.h | 79 - .../operation/model/sysitemmodel.cpp | 78 - .../operation/model/sysitemmodel.h | 65 - .../operation/notificationdbusproxy.cpp | 233 - .../operation/notificationdbusproxy.h | 79 - .../operation/notificationmodel.cpp | 54 - .../operation/notificationmodel.h | 44 - .../operation/notificationworker.cpp | 98 - .../operation/notificationworker.h | 37 - .../qrc/icons/dcc_nav_notification_42px.svg | 77 - .../qrc/icons/dcc_nav_notification_84px.svg | 77 - .../operation/qrc/notification.qrc | 6 - .../window/NotificationPlugin.json | 3 - .../window/appnotifywidget.cpp | 141 - .../window/appnotifywidget.h | 47 - .../window/multiselectlistview.cpp | 70 - .../window/multiselectlistview.h | 32 - .../window/notificationitem.cpp | 51 - .../window/notificationitem.h | 35 - .../window/notificationmodule.cpp | 130 - .../window/notificationmodule.h | 54 - .../window/systemnotifywidget.cpp | 133 - .../window/systemnotifywidget.h | 55 - .../window/timeslotitem.cpp | 92 - .../plugin-notification/window/timeslotitem.h | 43 - .../operation/dockdbusproxy.cpp | 187 - .../operation/dockdbusproxy.h | 96 - .../operation/qrc/resources.qrc | 16 - .../qrc/texts/dcc_dock_assistant_16px.svg | 15 - .../qrc/texts/dcc_dock_desktop_16px.svg | 7 - .../qrc/texts/dcc_dock_grandsearch_16px.svg | 9 - .../qrc/texts/dcc_dock_keyboard_16px.svg | 7 - .../qrc/texts/dcc_dock_notify_16px.svg | 7 - .../qrc/texts/dcc_dock_plug_in_16px.svg | 7 - .../qrc/texts/dcc_dock_power_16px.svg | 7 - .../texts/dcc_dock_shot_start_plugin_16px.svg | 7 - .../qrc/texts/dcc_dock_systemmonitor_16px.svg | 9 - .../qrc/texts/dcc_dock_task_16px.svg | 7 - .../qrc/texts/dcc_dock_time_16px.svg | 9 - .../qrc/texts/dcc_dock_trash_16px.svg | 9 - .../window/dockplugin.cpp | 513 --- .../window/dockplugin.h | 84 - .../window/plugin-dock.json | 3 - .../operation/model/fontmodel.cpp | 24 - .../operation/model/fontmodel.h | 32 - .../operation/model/fontsizemodel.cpp | 20 - .../operation/model/fontsizemodel.h | 24 - .../operation/model/thememodel.cpp | 50 - .../operation/model/thememodel.h | 43 - .../operation/personalizationdbusproxy.cpp | 293 -- .../operation/personalizationdbusproxy.h | 138 - .../operation/personalizationmodel.cpp | 101 - .../operation/personalizationmodel.h | 75 - .../operation/personalizationworker.cpp | 443 -- .../operation/personalizationworker.h | 99 - .../icons/dcc_nav_personalization_42px.svg | 108 - .../icons/dcc_nav_personalization_84px.svg | 132 - .../operation/qrc/personalization.qrc | 13 - .../qrc/texts/fontsize_decrease_16px.svg | 8 - .../qrc/texts/fontsize_increase_16px.svg | 8 - .../operation/qrc/texts/help_16px.svg | 16 - .../operation/qrc/texts/round_high_16px.svg | 35 - .../operation/qrc/texts/round_low_16px.svg | 35 - .../qrc/texts/transparency_high_16px.svg | 6 - .../qrc/texts/transparency_low_16px.svg | 6 - .../window/personalizationdesktopmodule.cpp | 228 - .../window/personalizationdesktopmodule.h | 31 - .../window/personalizationplugin.cpp | 79 - .../window/personalizationplugin.h | 51 - .../window/personalizationthememodule.cpp | 573 --- .../window/personalizationthememodule.h | 61 - .../window/plugin-personalization.json | 3 - .../window/widgets/globalthemelistview.cpp | 807 ---- .../window/widgets/globalthemelistview.h | 98 - .../widgets/personalizationthemelist.cpp | 193 - .../window/widgets/personalizationthemelist.h | 50 - .../widgets/personalizationthemewidget.cpp | 145 - .../widgets/personalizationthemewidget.h | 38 - .../window/widgets/ringcolorwidget.cpp | 46 - .../window/widgets/ringcolorwidget.h | 32 - .../window/widgets/roundcolorwidget.cpp | 103 - .../window/widgets/roundcolorwidget.h | 40 - .../window/widgets/themeitem.cpp | 77 - .../window/widgets/themeitem.h | 45 - .../window/widgets/themeitempic.cpp | 104 - .../window/widgets/themeitempic.h | 34 - .../plugin-power/operation/powerdbusproxy.cpp | 364 -- .../plugin-power/operation/powerdbusproxy.h | 163 - .../src/plugin-power/operation/powermodel.cpp | 375 -- .../src/plugin-power/operation/powermodel.h | 227 - .../plugin-power/operation/powerworker.cpp | 368 -- .../src/plugin-power/operation/powerworker.h | 72 - .../qrc/actions/dcc_battery_32px.svg | 3 - .../qrc/actions/dcc_general_purpose_32px.svg | 3 - .../qrc/actions/dcc_using_electric_32px.svg | 3 - .../qrc/icons/dcc_nav_power_42px.svg | 44 - .../qrc/icons/dcc_nav_power_84px.svg | 44 - .../src/plugin-power/operation/qrc/power.qrc | 9 - .../src/plugin-power/window/generalmodule.cpp | 496 -- .../src/plugin-power/window/generalmodule.h | 57 - .../src/plugin-power/window/plugin-power.json | 3 - .../src/plugin-power/window/powerplugin.cpp | 148 - dcc-old/src/plugin-power/window/powerplugin.h | 50 - .../src/plugin-power/window/titlemodule.cpp | 25 - dcc-old/src/plugin-power/window/titlemodule.h | 18 - .../plugin-power/window/usebatterymodule.cpp | 406 -- .../plugin-power/window/usebatterymodule.h | 56 - .../plugin-power/window/useelectricmodule.cpp | 255 -- .../plugin-power/window/useelectricmodule.h | 40 - dcc-old/src/plugin-power/window/utils.h | 14 - .../operation/privacyplugin.cpp | 62 - .../plugin-privacy/operation/privacyplugin.h | 49 - .../operation/privacysecuritydbusproxy.cpp | 72 - .../operation/privacysecuritydbusproxy.h | 44 - .../operation/privacysecuritymodel.cpp | 86 - .../operation/privacysecuritymodel.h | 65 - .../operation/privacysecurityworker.cpp | 158 - .../operation/privacysecurityworker.h | 47 - .../qrc/icons/dark/dcc_none_dark.svg | 64 - .../operation/qrc/icons/dcc_camera_32px.svg | 64 - .../qrc/icons/dcc_microphone_32px.svg | 66 - .../qrc/icons/dcc_nav_privacy_42px.svg | 79 - .../qrc/icons/dcc_nav_privacy_84px.svg | 79 - .../qrc/icons/light/dcc_none_light.svg | 64 - .../plugin-privacy/operation/qrc/privacy.qrc | 10 - .../plugin-privacy/window/PrivacyPlugin.json | 3 - .../window/servicesettingsmodule.cpp | 232 - .../window/servicesettingsmodule.h | 56 - .../window/widgets/servicecontrolitems.cpp | 69 - .../window/widgets/servicecontrolitems.h | 73 - .../qrc/actions/dcc_volume1_32px.svg | 3 - .../qrc/actions/dcc_volume2_32px.svg | 3 - .../qrc/actions/dcc_volume3_32px.svg | 3 - .../qrc/icons/dcc_nav_sound_42px.svg | 72 - .../qrc/icons/dcc_nav_sound_84px.svg | 72 - .../src/plugin-sound/operation/qrc/sound.qrc | 9 - .../plugin-sound/operation/sounddbusproxy.cpp | 335 -- .../plugin-sound/operation/sounddbusproxy.h | 188 - .../src/plugin-sound/operation/soundmodel.cpp | 512 --- .../src/plugin-sound/operation/soundmodel.h | 286 -- .../plugin-sound/operation/soundworker.cpp | 372 -- .../src/plugin-sound/operation/soundworker.h | 82 - .../window/advancedsettingmodule.cpp | 109 - .../window/advancedsettingmodule.h | 63 - dcc-old/src/plugin-sound/window/audioport.h | 56 - .../plugin-sound/window/devicemanagespage.cpp | 109 - .../plugin-sound/window/devicemanagespage.h | 60 - .../plugin-sound/window/microphonepage.cpp | 400 -- .../src/plugin-sound/window/microphonepage.h | 88 - dcc-old/src/plugin-sound/window/sound.json | 3 - .../plugin-sound/window/soundeffectspage.cpp | 189 - .../plugin-sound/window/soundeffectspage.h | 64 - .../src/plugin-sound/window/soundplugin.cpp | 226 - dcc-old/src/plugin-sound/window/soundplugin.h | 130 - .../src/plugin-sound/window/speakerpage.cpp | 455 -- dcc-old/src/plugin-sound/window/speakerpage.h | 125 - .../qrc/actions/dcc_privacy_policy_32px.svg | 10 - .../qrc/actions/dcc_protocol_32px.svg | 3 - .../qrc/actions/dcc_version_32px.svg | 3 - .../dark/icons/icon_about_laptop_128px.svg | 84 - .../qrc/dark/icons/icon_about_pc_128px.svg | 89 - .../operation/qrc/gpl/gpl-3.0-en_US-body.txt | 216 - .../operation/qrc/gpl/gpl-3.0-en_US-title.txt | 3 - .../operation/qrc/gpl/gpl-3.0-zh_CN-body.txt | 171 - .../operation/qrc/gpl/gpl-3.0-zh_CN-title.txt | 2 - .../operation/qrc/gpl/gpl-3.0-zh_TW-body.txt | 268 -- .../operation/qrc/gpl/gpl-3.0-zh_TW-title.txt | 2 - .../qrc/icons/dcc_nav_systeminfo_42px.svg | 59 - .../qrc/icons/dcc_nav_systeminfo_84px.svg | 60 - ...user-license-agreement_community_en_US.txt | 244 - ...user-license-agreement_community_zh_CN.txt | 240 - ...se-agreement_developer_community_en_US.txt | 3 - ...se-agreement_developer_community_zh_CN.txt | 3 - ...se-agreement_developer_community_zh_HK.txt | 3 - ...se-agreement_developer_community_zh_TW.txt | 3 - ...eepin-end-user-license-agreement_en_US.txt | 49 - ...eepin-end-user-license-agreement_zh_CN.txt | 51 - .../light/icons/icon_about_laptop_128px.svg | 86 - .../qrc/light/icons/icon_about_pc_128px.svg | 93 - .../operation/qrc/systeminfo.qrc | 31 - .../operation/qrc/texts/dcc_edit_12px.svg | 3 - .../operation/systeminfodbusproxy.cpp | 69 - .../operation/systeminfodbusproxy.h | 43 - .../operation/systeminfomodel.cpp | 139 - .../operation/systeminfomodel.h | 87 - .../operation/systeminfowork.cpp | 98 - .../operation/systeminfowork.h | 45 - .../window/SystemInfoPlugin.json | 3 - .../plugin-systeminfo/window/hostnameitem.cpp | 269 -- .../plugin-systeminfo/window/hostnameitem.h | 60 - .../src/plugin-systeminfo/window/logoitem.cpp | 60 - .../src/plugin-systeminfo/window/logoitem.h | 31 - .../window/privacypolicywidget.cpp | 61 - .../window/privacypolicywidget.h | 22 - .../window/systeminfomodule.cpp | 326 -- .../window/systeminfomodule.h | 72 - .../window/userlicensewidget.cpp | 33 - .../window/userlicensewidget.h | 27 - dcc-old/src/plugin-systeminfo/window/utils.h | 254 - .../window/versionprotocolwidget.cpp | 40 - .../window/versionprotocolwidget.h | 33 - .../operation/monitordbusproxy.cpp | 28 - .../operation/monitordbusproxy.h | 38 - .../qrc/icons/dcc_nav_touchscreen_42px.svg | 61 - .../qrc/icons/dcc_nav_touchscreen_84px.svg | 61 - .../operation/qrc/touchscreen.qrc | 6 - .../operation/touchscreenmodel.cpp | 90 - .../operation/touchscreenmodel.h | 44 - .../operation/touchscreenmodel_p.h | 76 - .../operation/touchscreenproxy.cpp | 40 - .../operation/touchscreenproxy.h | 50 - .../types/touchscreeninfolist_v2.cpp | 42 - .../operation/types/touchscreeninfolist_v2.h | 31 - .../operation/types/touchscreenmap.cpp | 10 - .../operation/types/touchscreenmap.h | 14 - .../window/TouchScreenPlugin.json | 3 - .../window/touchscreenmodule.cpp | 148 - .../window/touchscreenmodule.h | 56 - .../operation/appupdateinfolist.cpp | 54 - .../operation/appupdateinfolist.h | 36 - dcc-old/src/plugin-update/operation/common.h | 196 - .../operation/mirrorsourceitem.cpp | 98 - .../operation/mirrorsourceitem.h | 49 - .../operation/qrc/config/mirrors.json | 68 - .../operation/qrc/icons/dcc_all_updated.svg | 37 - .../operation/qrc/icons/dcc_app_update.svg | 43 - .../qrc/icons/dcc_checking_update.svg | 6 - .../qrc/icons/dcc_nav_update_42px.svg | 21 - .../qrc/icons/dcc_nav_update_84px.svg | 21 - .../operation/qrc/icons/dcc_safe_update.svg | 43 - .../operation/qrc/icons/dcc_system_update.svg | 49 - .../qrc/icons/dcc_unknown_update.svg | 55 - .../operation/qrc/icons/failed.svg | 19 - .../operation/qrc/icons/noactive.svg | 10 - .../operation/qrc/icons/success.svg | 19 - .../plugin-update/operation/qrc/update.qrc | 18 - .../operation/updatedbusproxy.cpp | 320 -- .../plugin-update/operation/updatedbusproxy.h | 131 - .../operation/updatejobdbusproxy.cpp | 99 - .../operation/updatejobdbusproxy.h | 79 - .../plugin-update/operation/updatemodel.cpp | 724 --- .../src/plugin-update/operation/updatemodel.h | 347 -- .../plugin-update/operation/updatework.cpp | 2241 --------- .../src/plugin-update/operation/updatework.h | 237 - .../plugin-update/window/mirrorinfolist.cpp | 49 - .../src/plugin-update/window/mirrorinfolist.h | 33 - .../plugin-update/window/mirrorswidget.cpp | 210 - .../src/plugin-update/window/mirrorswidget.h | 81 - dcc-old/src/plugin-update/window/update.json | 3 - .../plugin-update/window/updatectrlwidget.cpp | 786 ---- .../plugin-update/window/updatectrlwidget.h | 154 - .../src/plugin-update/window/updateplugin.cpp | 148 - .../src/plugin-update/window/updateplugin.h | 82 - .../window/updatesettingsmodule.cpp | 525 --- .../window/updatesettingsmodule.h | 106 - .../src/plugin-update/window/updatewidget.cpp | 171 - .../src/plugin-update/window/updatewidget.h | 77 - .../window/widgets/downloadprogressbar.cpp | 51 - .../window/widgets/downloadprogressbar.h | 35 - .../window/widgets/internalbuttonitem.cpp | 83 - .../window/widgets/internalbuttonitem.h | 43 - .../window/widgets/loadingitem.cpp | 107 - .../window/widgets/loadingitem.h | 30 - .../window/widgets/resultitem.cpp | 65 - .../plugin-update/window/widgets/resultitem.h | 29 - .../window/widgets/safeupdateitem.cpp | 28 - .../window/widgets/safeupdateitem.h | 20 - .../window/widgets/summaryitem.cpp | 42 - .../window/widgets/summaryitem.h | 25 - .../window/widgets/systemupdateitem.cpp | 154 - .../window/widgets/systemupdateitem.h | 31 - .../window/widgets/unknownupdateitem.cpp | 49 - .../window/widgets/unknownupdateitem.h | 20 - .../window/widgets/updatecontrolpanel.cpp | 382 -- .../window/widgets/updatecontrolpanel.h | 112 - .../window/widgets/updateiteminfo.cpp | 120 - .../window/widgets/updateiteminfo.h | 78 - .../window/widgets/updatesettingitem.cpp | 346 -- .../window/widgets/updatesettingitem.h | 103 - .../qrc/icons/dcc_nav_wacom_42px.svg | 43 - .../qrc/icons/dcc_nav_wacom_84px.svg | 54 - .../src/plugin-wacom/operation/qrc/wacom.qrc | 6 - .../plugin-wacom/operation/wacomdbusproxy.cpp | 58 - .../plugin-wacom/operation/wacomdbusproxy.h | 50 - .../src/plugin-wacom/operation/wacommodel.cpp | 54 - .../src/plugin-wacom/operation/wacommodel.h | 38 - .../operation/wacommodelprivate_p.h | 81 - .../src/plugin-wacom/window/WacomPlugin.json | 3 - .../src/plugin-wacom/window/wacommodule.cpp | 97 - dcc-old/src/plugin-wacom/window/wacommodule.h | 26 - .../src/plugin-wacom/window/wacomplugin.cpp | 44 - dcc-old/src/plugin-wacom/window/wacomplugin.h | 32 - .../src/widgets/accessiblefactoryinterface.h | 16 - dcc-old/src/widgets/accessibleinterface.cpp | 45 - dcc-old/src/widgets/buttontuple.cpp | 83 - dcc-old/src/widgets/comboxwidget.cpp | 184 - dcc-old/src/widgets/dccdbusinterface.cpp | 214 - dcc-old/src/widgets/dccdbusinterface_p.h | 43 - dcc-old/src/widgets/dcclistview.cpp | 28 - dcc-old/src/widgets/dccslider.cpp | 156 - dcc-old/src/widgets/detailinfoitem.cpp | 128 - dcc-old/src/widgets/horizontalmodule.cpp | 206 - dcc-old/src/widgets/itemmodule.cpp | 152 - dcc-old/src/widgets/lineeditwidget.cpp | 172 - dcc-old/src/widgets/listviewmodule.cpp | 56 - dcc-old/src/widgets/modulelistmodel.cpp | 165 - dcc-old/src/widgets/moduleobjectitem.cpp | 167 - dcc-old/src/widgets/settingsgroup.cpp | 181 - dcc-old/src/widgets/settingsgroupmodule.cpp | 156 - dcc-old/src/widgets/settingshead.cpp | 86 - dcc-old/src/widgets/settingsheaderitem.cpp | 41 - dcc-old/src/widgets/settingsitem.cpp | 103 - dcc-old/src/widgets/switchwidget.cpp | 135 - dcc-old/src/widgets/titledslideritem.cpp | 104 - dcc-old/src/widgets/titlelabel.cpp | 42 - dcc-old/src/widgets/titlevalueitem.cpp | 205 - .../translations/dde-control-center_ady.ts | 4004 ---------------- dcc-old/translations/dde-control-center_af.ts | 3969 ---------------- .../translations/dde-control-center_af_ZA.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ak.ts | 3969 ---------------- dcc-old/translations/dde-control-center_am.ts | 3969 ---------------- .../translations/dde-control-center_am_ET.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ar.ts | 3969 ---------------- .../translations/dde-control-center_ar_EG.ts | 3969 ---------------- .../translations/dde-control-center_ast.ts | 3969 ---------------- dcc-old/translations/dde-control-center_az.ts | 3997 ---------------- dcc-old/translations/dde-control-center_bg.ts | 3969 ---------------- dcc-old/translations/dde-control-center_bn.ts | 3969 ---------------- dcc-old/translations/dde-control-center_bo.ts | 3999 ---------------- .../translations/dde-control-center_bqi.ts | 3969 ---------------- dcc-old/translations/dde-control-center_br.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ca.ts | 3997 ---------------- .../translations/dde-control-center_cgg.ts | 4004 ---------------- dcc-old/translations/dde-control-center_cs.ts | 3998 ---------------- dcc-old/translations/dde-control-center_da.ts | 3982 ---------------- dcc-old/translations/dde-control-center_de.ts | 3969 ---------------- dcc-old/translations/dde-control-center_el.ts | 3969 ---------------- .../translations/dde-control-center_el_GR.ts | 3969 ---------------- dcc-old/translations/dde-control-center_en.ts | 3987 ---------------- .../translations/dde-control-center_en_AU.ts | 3969 ---------------- .../translations/dde-control-center_en_GB.ts | 3969 ---------------- .../translations/dde-control-center_en_NO.ts | 3969 ---------------- .../translations/dde-control-center_en_US.ts | 3983 ---------------- dcc-old/translations/dde-control-center_eo.ts | 3969 ---------------- dcc-old/translations/dde-control-center_es.ts | 3981 ---------------- dcc-old/translations/dde-control-center_et.ts | 3969 ---------------- dcc-old/translations/dde-control-center_eu.ts | 4004 ---------------- dcc-old/translations/dde-control-center_fa.ts | 3969 ---------------- dcc-old/translations/dde-control-center_fi.ts | 3983 ---------------- .../translations/dde-control-center_fil.ts | 4004 ---------------- dcc-old/translations/dde-control-center_fr.ts | 3981 ---------------- dcc-old/translations/dde-control-center_gl.ts | 3969 ---------------- .../translations/dde-control-center_gl_ES.ts | 3969 ---------------- dcc-old/translations/dde-control-center_he.ts | 3969 ---------------- .../translations/dde-control-center_hi_IN.ts | 3969 ---------------- dcc-old/translations/dde-control-center_hr.ts | 3969 ---------------- dcc-old/translations/dde-control-center_hu.ts | 4012 ---------------- dcc-old/translations/dde-control-center_hy.ts | 3969 ---------------- dcc-old/translations/dde-control-center_id.ts | 3969 ---------------- .../translations/dde-control-center_id_ID.ts | 3969 ---------------- dcc-old/translations/dde-control-center_it.ts | 3998 ---------------- dcc-old/translations/dde-control-center_ja.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ka.ts | 3969 ---------------- .../translations/dde-control-center_kab.ts | 3969 ---------------- dcc-old/translations/dde-control-center_kk.ts | 3969 ---------------- .../translations/dde-control-center_km_KH.ts | 3969 ---------------- .../translations/dde-control-center_kn_IN.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ko.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ku.ts | 3969 ---------------- .../translations/dde-control-center_ku_IQ.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ky.ts | 3969 ---------------- .../dde-control-center_ky@Arab.ts | 3969 ---------------- dcc-old/translations/dde-control-center_la.ts | 4004 ---------------- dcc-old/translations/dde-control-center_lo.ts | 3969 ---------------- dcc-old/translations/dde-control-center_lt.ts | 3969 ---------------- dcc-old/translations/dde-control-center_lv.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ml.ts | 3969 ---------------- dcc-old/translations/dde-control-center_mn.ts | 3969 ---------------- dcc-old/translations/dde-control-center_mr.ts | 4004 ---------------- dcc-old/translations/dde-control-center_ms.ts | 3969 ---------------- dcc-old/translations/dde-control-center_nb.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ne.ts | 3969 ---------------- dcc-old/translations/dde-control-center_nl.ts | 3988 ---------------- dcc-old/translations/dde-control-center_pa.ts | 3969 ---------------- .../translations/dde-control-center_pam.ts | 3969 ---------------- dcc-old/translations/dde-control-center_pl.ts | 3983 ---------------- dcc-old/translations/dde-control-center_ps.ts | 3969 ---------------- dcc-old/translations/dde-control-center_pt.ts | 3983 ---------------- .../translations/dde-control-center_pt_BR.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ro.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ru.ts | 3969 ---------------- .../translations/dde-control-center_ru_UA.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sc.ts | 4004 ---------------- dcc-old/translations/dde-control-center_si.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sk.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sl.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sq.ts | 3997 ---------------- dcc-old/translations/dde-control-center_sr.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sv.ts | 3969 ---------------- .../translations/dde-control-center_sv_SE.ts | 3969 ---------------- dcc-old/translations/dde-control-center_sw.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ta.ts | 3969 ---------------- dcc-old/translations/dde-control-center_te.ts | 4004 ---------------- dcc-old/translations/dde-control-center_th.ts | 3969 ---------------- dcc-old/translations/dde-control-center_tr.ts | 3983 ---------------- .../translations/dde-control-center_tzm.ts | 3969 ---------------- dcc-old/translations/dde-control-center_ug.ts | 3984 ---------------- dcc-old/translations/dde-control-center_uk.ts | 3998 ---------------- dcc-old/translations/dde-control-center_ur.ts | 4004 ---------------- dcc-old/translations/dde-control-center_uz.ts | 3969 ---------------- dcc-old/translations/dde-control-center_vi.ts | 3969 ---------------- .../translations/dde-control-center_zh_CN.ts | 4067 ----------------- .../translations/dde-control-center_zh_HK.ts | 3995 ---------------- .../translations/dde-control-center_zh_TW.ts | 3995 ---------------- dcc-old/translations/desktop/desktop.ts | 3 - dcc-old/translations/desktop/desktop_ady.ts | 1 - dcc-old/translations/desktop/desktop_af.ts | 1 - dcc-old/translations/desktop/desktop_af_ZA.ts | 1 - dcc-old/translations/desktop/desktop_ak.ts | 1 - dcc-old/translations/desktop/desktop_am.ts | 1 - dcc-old/translations/desktop/desktop_am_ET.ts | 1 - dcc-old/translations/desktop/desktop_ar.ts | 1 - dcc-old/translations/desktop/desktop_ar_EG.ts | 1 - dcc-old/translations/desktop/desktop_ast.ts | 1 - dcc-old/translations/desktop/desktop_az.ts | 1 - dcc-old/translations/desktop/desktop_bg.ts | 1 - dcc-old/translations/desktop/desktop_bn.ts | 1 - dcc-old/translations/desktop/desktop_bo.ts | 1 - dcc-old/translations/desktop/desktop_bqi.ts | 1 - dcc-old/translations/desktop/desktop_br.ts | 1 - dcc-old/translations/desktop/desktop_ca.ts | 1 - dcc-old/translations/desktop/desktop_cgg.ts | 1 - dcc-old/translations/desktop/desktop_cs.ts | 1 - dcc-old/translations/desktop/desktop_da.ts | 1 - dcc-old/translations/desktop/desktop_de.ts | 1 - dcc-old/translations/desktop/desktop_el.ts | 1 - dcc-old/translations/desktop/desktop_el_GR.ts | 1 - dcc-old/translations/desktop/desktop_en.ts | 1 - dcc-old/translations/desktop/desktop_en_AU.ts | 1 - dcc-old/translations/desktop/desktop_en_GB.ts | 1 - dcc-old/translations/desktop/desktop_en_NO.ts | 1 - dcc-old/translations/desktop/desktop_en_US.ts | 1 - dcc-old/translations/desktop/desktop_eo.ts | 1 - dcc-old/translations/desktop/desktop_es.ts | 1 - dcc-old/translations/desktop/desktop_et.ts | 1 - dcc-old/translations/desktop/desktop_eu.ts | 1 - dcc-old/translations/desktop/desktop_fa.ts | 1 - dcc-old/translations/desktop/desktop_fi.ts | 1 - dcc-old/translations/desktop/desktop_fil.ts | 1 - dcc-old/translations/desktop/desktop_fr.ts | 1 - dcc-old/translations/desktop/desktop_gl.ts | 1 - dcc-old/translations/desktop/desktop_gl_ES.ts | 1 - dcc-old/translations/desktop/desktop_he.ts | 1 - dcc-old/translations/desktop/desktop_hi_IN.ts | 1 - dcc-old/translations/desktop/desktop_hr.ts | 1 - dcc-old/translations/desktop/desktop_hu.ts | 1 - dcc-old/translations/desktop/desktop_hy.ts | 1 - dcc-old/translations/desktop/desktop_id.ts | 1 - dcc-old/translations/desktop/desktop_id_ID.ts | 1 - dcc-old/translations/desktop/desktop_it.ts | 1 - dcc-old/translations/desktop/desktop_ja.ts | 1 - dcc-old/translations/desktop/desktop_ka.ts | 1 - dcc-old/translations/desktop/desktop_kab.ts | 1 - dcc-old/translations/desktop/desktop_kk.ts | 1 - dcc-old/translations/desktop/desktop_km_KH.ts | 1 - dcc-old/translations/desktop/desktop_kn_IN.ts | 1 - dcc-old/translations/desktop/desktop_ko.ts | 1 - dcc-old/translations/desktop/desktop_ku.ts | 1 - dcc-old/translations/desktop/desktop_ku_IQ.ts | 1 - dcc-old/translations/desktop/desktop_ky.ts | 1 - .../translations/desktop/desktop_ky@Arab.ts | 1 - dcc-old/translations/desktop/desktop_la.ts | 1 - dcc-old/translations/desktop/desktop_lo.ts | 1 - dcc-old/translations/desktop/desktop_lt.ts | 1 - dcc-old/translations/desktop/desktop_lv.ts | 1 - dcc-old/translations/desktop/desktop_ml.ts | 1 - dcc-old/translations/desktop/desktop_mn.ts | 1 - dcc-old/translations/desktop/desktop_mr.ts | 1 - dcc-old/translations/desktop/desktop_ms.ts | 1 - dcc-old/translations/desktop/desktop_nb.ts | 1 - dcc-old/translations/desktop/desktop_ne.ts | 1 - dcc-old/translations/desktop/desktop_nl.ts | 1 - dcc-old/translations/desktop/desktop_pa.ts | 1 - dcc-old/translations/desktop/desktop_pam.ts | 1 - dcc-old/translations/desktop/desktop_pl.ts | 1 - dcc-old/translations/desktop/desktop_ps.ts | 1 - dcc-old/translations/desktop/desktop_pt.ts | 1 - dcc-old/translations/desktop/desktop_pt_BR.ts | 1 - dcc-old/translations/desktop/desktop_ro.ts | 1 - dcc-old/translations/desktop/desktop_ru.ts | 1 - dcc-old/translations/desktop/desktop_ru_UA.ts | 1 - dcc-old/translations/desktop/desktop_sc.ts | 1 - dcc-old/translations/desktop/desktop_si.ts | 1 - dcc-old/translations/desktop/desktop_sk.ts | 1 - dcc-old/translations/desktop/desktop_sl.ts | 1 - dcc-old/translations/desktop/desktop_sq.ts | 1 - dcc-old/translations/desktop/desktop_sr.ts | 1 - dcc-old/translations/desktop/desktop_sv.ts | 1 - dcc-old/translations/desktop/desktop_sv_SE.ts | 1 - dcc-old/translations/desktop/desktop_sw.ts | 1 - dcc-old/translations/desktop/desktop_ta.ts | 1 - dcc-old/translations/desktop/desktop_te.ts | 1 - dcc-old/translations/desktop/desktop_th.ts | 1 - dcc-old/translations/desktop/desktop_tr.ts | 1 - dcc-old/translations/desktop/desktop_tzm.ts | 1 - dcc-old/translations/desktop/desktop_ug.ts | 1 - dcc-old/translations/desktop/desktop_uk.ts | 1 - dcc-old/translations/desktop/desktop_ur.ts | 1 - dcc-old/translations/desktop/desktop_uz.ts | 1 - dcc-old/translations/desktop/desktop_vi.ts | 1 - dcc-old/translations/desktop/desktop_zh_CN.ts | 1 - dcc-old/translations/desktop/desktop_zh_HK.ts | 1 - dcc-old/translations/desktop/desktop_zh_TW.ts | 1 - src/dde-control-center/CMakeLists.txt | 43 +- 1354 files changed, 11 insertions(+), 487792 deletions(-) delete mode 100644 dcc-old/CMakeLists.txt delete mode 100644 dcc-old/include/interface/hlistmodule.h delete mode 100644 dcc-old/include/interface/moduleobject.h delete mode 100644 dcc-old/include/interface/namespace.h delete mode 100644 dcc-old/include/interface/pagemodule.h delete mode 100644 dcc-old/include/interface/plugininterface.h delete mode 100644 dcc-old/include/interface/vlistmodule.h delete mode 100644 dcc-old/include/widgets/accessibleinterface.h delete mode 100644 dcc-old/include/widgets/buttontuple.h delete mode 100644 dcc-old/include/widgets/comboxwidget.h delete mode 100644 dcc-old/include/widgets/dccdbusinterface.h delete mode 100644 dcc-old/include/widgets/dcclistview.h delete mode 100644 dcc-old/include/widgets/dccslider.h delete mode 100644 dcc-old/include/widgets/detailinfoitem.h delete mode 100644 dcc-old/include/widgets/horizontalmodule.h delete mode 100644 dcc-old/include/widgets/itemmodule.h delete mode 100644 dcc-old/include/widgets/lineeditwidget.h delete mode 100644 dcc-old/include/widgets/listviewmodule.h delete mode 100644 dcc-old/include/widgets/modulelistmodel.h delete mode 100644 dcc-old/include/widgets/moduleobjectitem.h delete mode 100644 dcc-old/include/widgets/settingsgroup.h delete mode 100644 dcc-old/include/widgets/settingsgroupmodule.h delete mode 100644 dcc-old/include/widgets/settingshead.h delete mode 100644 dcc-old/include/widgets/settingsheaderitem.h delete mode 100644 dcc-old/include/widgets/settingsitem.h delete mode 100644 dcc-old/include/widgets/switchwidget.h delete mode 100644 dcc-old/include/widgets/titledslideritem.h delete mode 100644 dcc-old/include/widgets/titlelabel.h delete mode 100644 dcc-old/include/widgets/titlevalueitem.h delete mode 100644 dcc-old/include/widgets/utils.h delete mode 100644 dcc-old/include/widgets/widgetmodule.h delete mode 100755 dcc-old/misc/translate_desktop2ts.sh delete mode 100755 dcc-old/misc/translate_generation.sh delete mode 100644 dcc-old/src/dcc-agent/main.c delete mode 100644 dcc-old/src/frame/accessible.h delete mode 100644 dcc-old/src/frame/completerview.cpp delete mode 100644 dcc-old/src/frame/completerview.h delete mode 100644 dcc-old/src/frame/controlcenterdbusadaptor.cpp delete mode 100644 dcc-old/src/frame/controlcenterdbusadaptor.h delete mode 100644 dcc-old/src/frame/listitemdelegate.cpp delete mode 100644 dcc-old/src/frame/listitemdelegate.h delete mode 100644 dcc-old/src/frame/listview.cpp delete mode 100644 dcc-old/src/frame/listview.h delete mode 100644 dcc-old/src/frame/main.cpp delete mode 100644 dcc-old/src/frame/mainmodule.cpp delete mode 100644 dcc-old/src/frame/mainmodule.h delete mode 100644 dcc-old/src/frame/mainwindow.cpp delete mode 100644 dcc-old/src/frame/mainwindow.h delete mode 100644 dcc-old/src/frame/pluginmanager.cpp delete mode 100644 dcc-old/src/frame/pluginmanager.h delete mode 100644 dcc-old/src/frame/searchwidget.cpp delete mode 100644 dcc-old/src/frame/searchwidget.h delete mode 100644 dcc-old/src/frame/utils.cpp delete mode 100644 dcc-old/src/frame/utils.h delete mode 100644 dcc-old/src/interface/hlistmodule.cpp delete mode 100644 dcc-old/src/interface/moduledatamodel.cpp delete mode 100644 dcc-old/src/interface/moduledatamodel.h delete mode 100644 dcc-old/src/interface/moduleobject.cpp delete mode 100644 dcc-old/src/interface/pagemodule.cpp delete mode 100644 dcc-old/src/interface/tabitemdelegate.cpp delete mode 100644 dcc-old/src/interface/tabitemdelegate.h delete mode 100644 dcc-old/src/interface/tabview.cpp delete mode 100644 dcc-old/src/interface/tabview.h delete mode 100644 dcc-old/src/interface/vlistmodule.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/accountsdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/accountsdbusproxy.h delete mode 100644 dcc-old/src/plugin-accounts/operation/accountsworker.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/accountsworker.h delete mode 100644 dcc-old/src/plugin-accounts/operation/creationresult.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/creationresult.h delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/accounts.qrc delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_avatar_12px.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_high.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_low.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_middle.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_deep_mode.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_light_mode.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_42px.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_84px.svg delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_add_icon.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_animal.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_custom.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_emoji.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_funny.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_human.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_scenery.dci delete mode 100644 dcc-old/src/plugin-accounts/operation/securitydbusproxy.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/securitydbusproxy.h delete mode 100644 dcc-old/src/plugin-accounts/operation/syncdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/syncdbusproxy.h delete mode 100644 dcc-old/src/plugin-accounts/operation/user.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/user.h delete mode 100644 dcc-old/src/plugin-accounts/operation/userdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/userdbusproxy.h delete mode 100644 dcc-old/src/plugin-accounts/operation/usermodel.cpp delete mode 100644 dcc-old/src/plugin-accounts/operation/usermodel.h delete mode 100644 dcc-old/src/plugin-accounts/window/AccountsPlugin.json delete mode 100644 dcc-old/src/plugin-accounts/window/accountslistview.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/accountslistview.h delete mode 100644 dcc-old/src/plugin-accounts/window/accountsmodel.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/accountsmodel.h delete mode 100644 dcc-old/src/plugin-accounts/window/accountsmodule.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/accountsmodule.h delete mode 100644 dcc-old/src/plugin-accounts/window/avatarcropbox.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avatarcropbox.h delete mode 100644 dcc-old/src/plugin-accounts/window/avataritemdelegate.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avataritemdelegate.h delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistframe.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistframe.h delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistview.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistview.h delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistwidget.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avatarlistwidget.h delete mode 100644 dcc-old/src/plugin-accounts/window/avatarwidget.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/avatarwidget.h delete mode 100644 dcc-old/src/plugin-accounts/window/createaccountpage.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/createaccountpage.h delete mode 100644 dcc-old/src/plugin-accounts/window/groupitem.h delete mode 100644 dcc-old/src/plugin-accounts/window/modifypasswdpage.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/modifypasswdpage.h delete mode 100644 dcc-old/src/plugin-accounts/window/pwqualitymanager.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/pwqualitymanager.h delete mode 100644 dcc-old/src/plugin-accounts/window/removeuserdialog.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/removeuserdialog.h delete mode 100644 dcc-old/src/plugin-accounts/window/securitylevelitem.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/securitylevelitem.h delete mode 100644 dcc-old/src/plugin-accounts/window/securityquestionspage.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/securityquestionspage.h delete mode 100644 dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.cpp delete mode 100644 dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.cpp delete mode 100644 dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.cpp delete mode 100644 dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/frameproxyinterface.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/frameproxyv20.cpp delete mode 100644 dcc-old/src/plugin-adapterv20tov23/frameproxyv20.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/moduleinterface.h delete mode 100644 dcc-old/src/plugin-adapterv20tov23/plugin-adapterv20tov23.json delete mode 100644 dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.cpp delete mode 100644 dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.h delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.h delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangermodel.cpp delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangermodel.h delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangerworker.cpp delete mode 100644 dcc-old/src/plugin-authentication/operation/charamangerworker.h delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/authentication.qrc delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_1.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_10.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_11.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_12.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_13.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_14.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_15.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_16.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_17.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_18.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_19.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_2.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_20.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_21.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_22.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_23.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_24.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_25.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_26.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_27.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_28.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_29.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_3.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_30.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_31.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_32.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_33.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_34.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_35.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_36.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_37.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_38.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_39.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_4.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_40.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_41.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_42.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_43.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_44.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_45.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_46.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_47.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_48.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_49.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_5.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_50.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_6.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_7.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_8.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_9.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_light.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-fail.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-start.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-success.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_unknown_device.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_42px.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_84px.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_1.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_10.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_11.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_12.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_13.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_14.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_15.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_16.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_17.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_18.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_19.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_2.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_20.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_21.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_22.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_23.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_24.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_25.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_26.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_27.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_28.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_29.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_3.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_30.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_31.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_32.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_33.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_34.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_35.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_36.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_37.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_38.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_39.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_4.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_40.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_41.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_42.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_43.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_44.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_45.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_46.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_47.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_48.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_49.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_5.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_50.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_6.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_7.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_8.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_9.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_light.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-fail.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-start.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-success.svg delete mode 100644 dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_unknown_device.svg delete mode 100644 dcc-old/src/plugin-authentication/window/authentication.json delete mode 100644 dcc-old/src/plugin-authentication/window/authenticationplugin.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/authenticationplugin.h delete mode 100644 dcc-old/src/plugin-authentication/window/faceiddetailwidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/faceiddetailwidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/fingerdetailwidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/fingerdetailwidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/irisdetailwidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/irisdetailwidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/facewidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/face/facewidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.h delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.cpp delete mode 100644 dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothworker.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/operation/bluetoothworker.h delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_battery_32px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_general_purpose_32px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_using_electric_32px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/bluetooth.qrc delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-000-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-010-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-020-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-030-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-040-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-050-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-060-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-070-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-080-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-090-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-100-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-unknow-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_42px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_84px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-000-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-010-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-020-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-030-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-040-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-050-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-060-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-070-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-080-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-090-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-100-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-unknow-symbolic_20px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_camera_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_clang_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_keyboard_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_lan_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_laptop_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_microphone_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_mouse_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_other_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pad_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pc_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pen_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pheadset_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_phone_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_print_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_scaner_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_touchpad_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_tv_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_video_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_vidicon_16px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_edit_12px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_refresh_12px.svg delete mode 100644 dcc-old/src/plugin-bluetooth/window/adaptermodule.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/adaptermodule.h delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.h delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothmodule.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothmodule.h delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothplugin.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/bluetoothplugin.h delete mode 100644 dcc-old/src/plugin-bluetooth/window/pincodedialog.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/pincodedialog.h delete mode 100644 dcc-old/src/plugin-bluetooth/window/plugin-bluetooth.json delete mode 100644 dcc-old/src/plugin-bluetooth/window/titleedit.cpp delete mode 100644 dcc-old/src/plugin-bluetooth/window/titleedit.h delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfomodel.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfomodel.h delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.h delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfowork.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/operation/commoninfowork.h delete mode 100644 dcc-old/src/plugin-commoninfo/operation/qrc/commoninfo.qrc delete mode 100644 dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_42px.svg delete mode 100644 dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_84px.svg delete mode 100644 dcc-old/src/plugin-commoninfo/window/CommonInfoPlugin.json delete mode 100644 dcc-old/src/plugin-commoninfo/window/bootwidget.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/bootwidget.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/commoninfolistview.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/commoninfolistview.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/commoninfomodule.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/commoninfomodule.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/developermodedialog.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/developermodedialog.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/developermodewidget.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/developermodewidget.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/plymouthdisplay.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/plymouthdisplay.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/pwqualitymanager.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/pwqualitymanager.h delete mode 100644 dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.cpp delete mode 100644 dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.h delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimedbusproxy.cpp delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimedbusproxy.h delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimemodel.cpp delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimemodel.h delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimeworker.cpp delete mode 100644 dcc-old/src/plugin-datetime/operation/datetimeworker.h delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/datetime.qrc delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_42px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_84px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/indicator_active.png delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/popup_menu.css delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big.png delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big2.png delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big@1x.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big@2x.png delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/resource/deepindigitaltimes-Regular.ttf delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_black_16px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_white_16px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_hour_16px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_minute_16px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_second_16px.svg delete mode 100644 dcc-old/src/plugin-datetime/operation/regionproxy.cpp delete mode 100644 dcc-old/src/plugin-datetime/operation/regionproxy.h delete mode 100644 dcc-old/src/plugin-datetime/operation/zoneinfo.cpp delete mode 100644 dcc-old/src/plugin-datetime/operation/zoneinfo.h delete mode 100644 dcc-old/src/plugin-datetime/window/datetimeplugin.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/datetimeplugin.h delete mode 100644 dcc-old/src/plugin-datetime/window/plugin-datetime.json delete mode 100644 dcc-old/src/plugin-datetime/window/regionmodule.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/regionmodule.h delete mode 100644 dcc-old/src/plugin-datetime/window/timesettingmodule.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/timesettingmodule.h delete mode 100644 dcc-old/src/plugin-datetime/window/timezonemodule.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/timezonemodule.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/clock.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/clock.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/consts.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/datewidget.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/datewidget.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/file_util.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/file_util.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/popup_menu.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/popup_menu.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/searchinput.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/searchinput.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone_map.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone_map.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezonechooser.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezonechooser.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezoneclock.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezoneclock.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezoneitem.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/timezoneitem.h delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.cpp delete mode 100644 dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappmodel.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappmodel.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappworker.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappworker.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappworkerold.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/operation/defappworkerold.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.h delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_browser_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_mail_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_music_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_photo_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_terminal_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_text_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_video_32px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/defapp.qrc delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_42px.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_84px.svg delete mode 100755 dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp.svg delete mode 100644 dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp_normal.svg delete mode 100644 dcc-old/src/plugin-defaultapp/window/defappdetailwidget.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/window/defappdetailwidget.h delete mode 100644 dcc-old/src/plugin-defaultapp/window/defappplugin.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/window/defappplugin.h delete mode 100644 dcc-old/src/plugin-defaultapp/window/defaultapp.json delete mode 100644 dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.h delete mode 100644 dcc-old/src/plugin-defaultapp/window/widgets/category.cpp delete mode 100644 dcc-old/src/plugin-defaultapp/window/widgets/category.h delete mode 100644 dcc-old/src/plugin-display/operation/displaydbusproxy.cpp delete mode 100644 dcc-old/src/plugin-display/operation/displaydbusproxy.h delete mode 100644 dcc-old/src/plugin-display/operation/displaymodel.cpp delete mode 100644 dcc-old/src/plugin-display/operation/displaymodel.h delete mode 100644 dcc-old/src/plugin-display/operation/displayworker.cpp delete mode 100644 dcc-old/src/plugin-display/operation/displayworker.h delete mode 100644 dcc-old/src/plugin-display/operation/monitor.cpp delete mode 100644 dcc-old/src/plugin-display/operation/monitor.h delete mode 100644 dcc-old/src/plugin-display/operation/monitordbusproxy.cpp delete mode 100644 dcc-old/src/plugin-display/operation/monitordbusproxy.h delete mode 100644 dcc-old/src/plugin-display/operation/qrc/actions/dcc_break_32px.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesshigh_32px.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesslow_32px.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_bottom.dci delete mode 100644 dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_left.dci delete mode 100644 dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_right.dci delete mode 100644 dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_top.dci delete mode 100644 dcc-old/src/plugin-display/operation/qrc/display.qrc delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_42px.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_84px.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Center.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Default.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Fit.svg delete mode 100644 dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Stretch.svg delete mode 100644 dcc-old/src/plugin-display/operation/types/brightnessmap.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/brightnessmap.h delete mode 100644 dcc-old/src/plugin-display/operation/types/reflectlist.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/reflectlist.h delete mode 100644 dcc-old/src/plugin-display/operation/types/resolution.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/resolution.h delete mode 100644 dcc-old/src/plugin-display/operation/types/resolutionlist.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/resolutionlist.h delete mode 100644 dcc-old/src/plugin-display/operation/types/rotationlist.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/rotationlist.h delete mode 100644 dcc-old/src/plugin-display/operation/types/screenrect.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/screenrect.h delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreeninfolist.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreeninfolist.h delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.h delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreenmap.cpp delete mode 100644 dcc-old/src/plugin-display/operation/types/touchscreenmap.h delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/Output.cpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/Output.hpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.cpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.hpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/Registry.cpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/Registry.hpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.cpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.hpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.cpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.hpp delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/protocols/treeland-output-management.xml delete mode 100644 dcc-old/src/plugin-display/wayland/libwayqt/protocols/wlr-output-management-unstable-v1.xml delete mode 100644 dcc-old/src/plugin-display/window/DisplayPlugin.json delete mode 100644 dcc-old/src/plugin-display/window/brightnesswidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/brightnesswidget.h delete mode 100644 dcc-old/src/plugin-display/window/cooperationsettingsdialog.cpp delete mode 100644 dcc-old/src/plugin-display/window/cooperationsettingsdialog.h delete mode 100644 dcc-old/src/plugin-display/window/displaymodule.cpp delete mode 100644 dcc-old/src/plugin-display/window/displaymodule.h delete mode 100644 dcc-old/src/plugin-display/window/filechoosewidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/filechoosewidget.h delete mode 100644 dcc-old/src/plugin-display/window/monitorcontrolwidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/monitorcontrolwidget.h delete mode 100644 dcc-old/src/plugin-display/window/monitorindicator.cpp delete mode 100644 dcc-old/src/plugin-display/window/monitorindicator.h delete mode 100644 dcc-old/src/plugin-display/window/monitorproxywidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/monitorproxywidget.h delete mode 100644 dcc-old/src/plugin-display/window/monitorsground.cpp delete mode 100644 dcc-old/src/plugin-display/window/monitorsground.h delete mode 100644 dcc-old/src/plugin-display/window/multiscreenwidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/multiscreenwidget.h delete mode 100644 dcc-old/src/plugin-display/window/recognizewidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/recognizewidget.h delete mode 100644 dcc-old/src/plugin-display/window/refreshratewidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/refreshratewidget.h delete mode 100644 dcc-old/src/plugin-display/window/resolutionwidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/resolutionwidget.h delete mode 100644 dcc-old/src/plugin-display/window/rotatewidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/rotatewidget.h delete mode 100644 dcc-old/src/plugin-display/window/scalingwidget.cpp delete mode 100644 dcc-old/src/plugin-display/window/scalingwidget.h delete mode 100644 dcc-old/src/plugin-display/window/secondaryscreendialog.cpp delete mode 100644 dcc-old/src/plugin-display/window/secondaryscreendialog.h delete mode 100644 dcc-old/src/plugin-display/window/timeoutdialog.cpp delete mode 100644 dcc-old/src/plugin-display/window/timeoutdialog.h delete mode 100644 dcc-old/src/plugin-display/window/treecombox.cpp delete mode 100644 dcc-old/src/plugin-display/window/treecombox.h delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.cpp delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.h delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboardmodel.cpp delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboardmodel.h delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboardwork.cpp delete mode 100644 dcc-old/src/plugin-keyboard/operation/keyboardwork.h delete mode 100644 dcc-old/src/plugin-keyboard/operation/metadata.cpp delete mode 100644 dcc-old/src/plugin-keyboard/operation/metadata.h delete mode 100644 dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_42px.svg delete mode 100644 dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_84px.svg delete mode 100644 dcc-old/src/plugin-keyboard/operation/qrc/icons/list_select.png delete mode 100644 dcc-old/src/plugin-keyboard/operation/qrc/icons/list_select@2x.png delete mode 100644 dcc-old/src/plugin-keyboard/operation/qrc/keyboard.qrc delete mode 100644 dcc-old/src/plugin-keyboard/operation/shortcutmodel.cpp delete mode 100644 dcc-old/src/plugin-keyboard/operation/shortcutmodel.h delete mode 100644 dcc-old/src/plugin-keyboard/window/KeyboardPlugin.json delete mode 100644 dcc-old/src/plugin-keyboard/window/customcontentdialog.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/customcontentdialog.h delete mode 100644 dcc-old/src/plugin-keyboard/window/customedit.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/customedit.h delete mode 100644 dcc-old/src/plugin-keyboard/window/customitem.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/customitem.h delete mode 100644 dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.h delete mode 100644 dcc-old/src/plugin-keyboard/window/indexmodel.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/indexmodel.h delete mode 100644 dcc-old/src/plugin-keyboard/window/indexview.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/indexview.h delete mode 100644 dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.h delete mode 100644 dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.h delete mode 100644 dcc-old/src/plugin-keyboard/window/keyboardmodule.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/keyboardmodule.h delete mode 100644 dcc-old/src/plugin-keyboard/window/keylabel.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/keylabel.h delete mode 100644 dcc-old/src/plugin-keyboard/window/searchinput.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/searchinput.h delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.h delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutitem.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutitem.h delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutkey.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutkey.h delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.h delete mode 100644 dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.h delete mode 100644 dcc-old/src/plugin-keyboard/window/systemlanguagewidget.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/systemlanguagewidget.h delete mode 100644 dcc-old/src/plugin-keyboard/window/titlebuttonItem.cpp delete mode 100644 dcc-old/src/plugin-keyboard/window/titlebuttonItem.h delete mode 100644 dcc-old/src/plugin-mouse/operation/mousedbusproxy.cpp delete mode 100644 dcc-old/src/plugin-mouse/operation/mousedbusproxy.h delete mode 100644 dcc-old/src/plugin-mouse/operation/mousemodel.cpp delete mode 100644 dcc-old/src/plugin-mouse/operation/mousemodel.h delete mode 100644 dcc-old/src/plugin-mouse/operation/mouseworker.cpp delete mode 100644 dcc-old/src/plugin-mouse/operation/mouseworker.h delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00001.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00001@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00007.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00007@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00014.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00014@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00015.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00015@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00016.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00016@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00019.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00019@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00002.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00002@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00003.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00003@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00004.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00004@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00006.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00006@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00008.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00008@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00003.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00003@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00007.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00007@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00009.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00009@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00010.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00010@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00011.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00011@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00017.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00017@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00019.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00019@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00020.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00020@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00021.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00021@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00026.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00026@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00027.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00027@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00030.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00030@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00033.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00033@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00035.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00035@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00037.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00037@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00004.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00004@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00005.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00005@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00006.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00006@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00007.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00007@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00008.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00008@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00009.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00009@2x.png delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/icons/dcc_nav_mouse_42px.svg delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/icons/dcc_nav_mouse_84px.svg delete mode 100644 dcc-old/src/plugin-mouse/operation/qrc/mouse.qrc delete mode 100644 dcc-old/src/plugin-mouse/window/MousePlugin.json delete mode 100644 dcc-old/src/plugin-mouse/window/doutestwidget.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/doutestwidget.h delete mode 100644 dcc-old/src/plugin-mouse/window/generalsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/generalsettingwidget.h delete mode 100644 dcc-old/src/plugin-mouse/window/mousemodule.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/mousemodule.h delete mode 100644 dcc-old/src/plugin-mouse/window/mousesettingwidget.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/mousesettingwidget.h delete mode 100644 dcc-old/src/plugin-mouse/window/palmdetectsetting.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/palmdetectsetting.h delete mode 100644 dcc-old/src/plugin-mouse/window/touchpadsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/touchpadsettingwidget.h delete mode 100644 dcc-old/src/plugin-mouse/window/trackpointsettingwidget.cpp delete mode 100644 dcc-old/src/plugin-mouse/window/trackpointsettingwidget.h delete mode 100644 dcc-old/src/plugin-notification/operation/model/appitemmodel.cpp delete mode 100644 dcc-old/src/plugin-notification/operation/model/appitemmodel.h delete mode 100644 dcc-old/src/plugin-notification/operation/model/sysitemmodel.cpp delete mode 100644 dcc-old/src/plugin-notification/operation/model/sysitemmodel.h delete mode 100644 dcc-old/src/plugin-notification/operation/notificationdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-notification/operation/notificationdbusproxy.h delete mode 100644 dcc-old/src/plugin-notification/operation/notificationmodel.cpp delete mode 100644 dcc-old/src/plugin-notification/operation/notificationmodel.h delete mode 100644 dcc-old/src/plugin-notification/operation/notificationworker.cpp delete mode 100644 dcc-old/src/plugin-notification/operation/notificationworker.h delete mode 100644 dcc-old/src/plugin-notification/operation/qrc/icons/dcc_nav_notification_42px.svg delete mode 100644 dcc-old/src/plugin-notification/operation/qrc/icons/dcc_nav_notification_84px.svg delete mode 100644 dcc-old/src/plugin-notification/operation/qrc/notification.qrc delete mode 100644 dcc-old/src/plugin-notification/window/NotificationPlugin.json delete mode 100644 dcc-old/src/plugin-notification/window/appnotifywidget.cpp delete mode 100644 dcc-old/src/plugin-notification/window/appnotifywidget.h delete mode 100644 dcc-old/src/plugin-notification/window/multiselectlistview.cpp delete mode 100644 dcc-old/src/plugin-notification/window/multiselectlistview.h delete mode 100644 dcc-old/src/plugin-notification/window/notificationitem.cpp delete mode 100644 dcc-old/src/plugin-notification/window/notificationitem.h delete mode 100644 dcc-old/src/plugin-notification/window/notificationmodule.cpp delete mode 100644 dcc-old/src/plugin-notification/window/notificationmodule.h delete mode 100644 dcc-old/src/plugin-notification/window/systemnotifywidget.cpp delete mode 100644 dcc-old/src/plugin-notification/window/systemnotifywidget.h delete mode 100644 dcc-old/src/plugin-notification/window/timeslotitem.cpp delete mode 100644 dcc-old/src/plugin-notification/window/timeslotitem.h delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/dockdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/dockdbusproxy.h delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/resources.qrc delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_assistant_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_desktop_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_grandsearch_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_keyboard_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_notify_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_plug_in_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_power_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_shot_start_plugin_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_systemmonitor_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_task_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_time_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/operation/qrc/texts/dcc_dock_trash_16px.svg delete mode 100644 dcc-old/src/plugin-personalization-dock/window/dockplugin.cpp delete mode 100644 dcc-old/src/plugin-personalization-dock/window/dockplugin.h delete mode 100644 dcc-old/src/plugin-personalization-dock/window/plugin-dock.json delete mode 100644 dcc-old/src/plugin-personalization/operation/model/fontmodel.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/model/fontmodel.h delete mode 100644 dcc-old/src/plugin-personalization/operation/model/fontsizemodel.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/model/fontsizemodel.h delete mode 100644 dcc-old/src/plugin-personalization/operation/model/thememodel.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/model/thememodel.h delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationdbusproxy.h delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationmodel.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationmodel.h delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationworker.cpp delete mode 100644 dcc-old/src/plugin-personalization/operation/personalizationworker.h delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/icons/dcc_nav_personalization_42px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/icons/dcc_nav_personalization_84px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/personalization.qrc delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/fontsize_decrease_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/fontsize_increase_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/help_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/round_high_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/round_low_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/transparency_high_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/operation/qrc/texts/transparency_low_16px.svg delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationdesktopmodule.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationdesktopmodule.h delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationplugin.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationplugin.h delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationthememodule.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/personalizationthememodule.h delete mode 100644 dcc-old/src/plugin-personalization/window/plugin-personalization.json delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/globalthemelistview.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/globalthemelistview.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/personalizationthemelist.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/personalizationthemelist.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/personalizationthemewidget.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/personalizationthemewidget.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/ringcolorwidget.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/ringcolorwidget.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/roundcolorwidget.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/roundcolorwidget.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/themeitem.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/themeitem.h delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/themeitempic.cpp delete mode 100644 dcc-old/src/plugin-personalization/window/widgets/themeitempic.h delete mode 100644 dcc-old/src/plugin-power/operation/powerdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-power/operation/powerdbusproxy.h delete mode 100644 dcc-old/src/plugin-power/operation/powermodel.cpp delete mode 100644 dcc-old/src/plugin-power/operation/powermodel.h delete mode 100644 dcc-old/src/plugin-power/operation/powerworker.cpp delete mode 100644 dcc-old/src/plugin-power/operation/powerworker.h delete mode 100644 dcc-old/src/plugin-power/operation/qrc/actions/dcc_battery_32px.svg delete mode 100644 dcc-old/src/plugin-power/operation/qrc/actions/dcc_general_purpose_32px.svg delete mode 100644 dcc-old/src/plugin-power/operation/qrc/actions/dcc_using_electric_32px.svg delete mode 100644 dcc-old/src/plugin-power/operation/qrc/icons/dcc_nav_power_42px.svg delete mode 100644 dcc-old/src/plugin-power/operation/qrc/icons/dcc_nav_power_84px.svg delete mode 100644 dcc-old/src/plugin-power/operation/qrc/power.qrc delete mode 100644 dcc-old/src/plugin-power/window/generalmodule.cpp delete mode 100644 dcc-old/src/plugin-power/window/generalmodule.h delete mode 100644 dcc-old/src/plugin-power/window/plugin-power.json delete mode 100644 dcc-old/src/plugin-power/window/powerplugin.cpp delete mode 100644 dcc-old/src/plugin-power/window/powerplugin.h delete mode 100644 dcc-old/src/plugin-power/window/titlemodule.cpp delete mode 100644 dcc-old/src/plugin-power/window/titlemodule.h delete mode 100644 dcc-old/src/plugin-power/window/usebatterymodule.cpp delete mode 100644 dcc-old/src/plugin-power/window/usebatterymodule.h delete mode 100644 dcc-old/src/plugin-power/window/useelectricmodule.cpp delete mode 100644 dcc-old/src/plugin-power/window/useelectricmodule.h delete mode 100644 dcc-old/src/plugin-power/window/utils.h delete mode 100644 dcc-old/src/plugin-privacy/operation/privacyplugin.cpp delete mode 100644 dcc-old/src/plugin-privacy/operation/privacyplugin.h delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecuritydbusproxy.cpp delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecuritydbusproxy.h delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecuritymodel.cpp delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecuritymodel.h delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecurityworker.cpp delete mode 100644 dcc-old/src/plugin-privacy/operation/privacysecurityworker.h delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/dark/dcc_none_dark.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/dcc_camera_32px.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/dcc_microphone_32px.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/dcc_nav_privacy_42px.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/dcc_nav_privacy_84px.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/icons/light/dcc_none_light.svg delete mode 100644 dcc-old/src/plugin-privacy/operation/qrc/privacy.qrc delete mode 100644 dcc-old/src/plugin-privacy/window/PrivacyPlugin.json delete mode 100644 dcc-old/src/plugin-privacy/window/servicesettingsmodule.cpp delete mode 100644 dcc-old/src/plugin-privacy/window/servicesettingsmodule.h delete mode 100644 dcc-old/src/plugin-privacy/window/widgets/servicecontrolitems.cpp delete mode 100644 dcc-old/src/plugin-privacy/window/widgets/servicecontrolitems.h delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/actions/dcc_volume1_32px.svg delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/actions/dcc_volume2_32px.svg delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/actions/dcc_volume3_32px.svg delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/icons/dcc_nav_sound_42px.svg delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/icons/dcc_nav_sound_84px.svg delete mode 100644 dcc-old/src/plugin-sound/operation/qrc/sound.qrc delete mode 100644 dcc-old/src/plugin-sound/operation/sounddbusproxy.cpp delete mode 100644 dcc-old/src/plugin-sound/operation/sounddbusproxy.h delete mode 100644 dcc-old/src/plugin-sound/operation/soundmodel.cpp delete mode 100644 dcc-old/src/plugin-sound/operation/soundmodel.h delete mode 100644 dcc-old/src/plugin-sound/operation/soundworker.cpp delete mode 100644 dcc-old/src/plugin-sound/operation/soundworker.h delete mode 100644 dcc-old/src/plugin-sound/window/advancedsettingmodule.cpp delete mode 100644 dcc-old/src/plugin-sound/window/advancedsettingmodule.h delete mode 100644 dcc-old/src/plugin-sound/window/audioport.h delete mode 100644 dcc-old/src/plugin-sound/window/devicemanagespage.cpp delete mode 100644 dcc-old/src/plugin-sound/window/devicemanagespage.h delete mode 100644 dcc-old/src/plugin-sound/window/microphonepage.cpp delete mode 100644 dcc-old/src/plugin-sound/window/microphonepage.h delete mode 100644 dcc-old/src/plugin-sound/window/sound.json delete mode 100644 dcc-old/src/plugin-sound/window/soundeffectspage.cpp delete mode 100644 dcc-old/src/plugin-sound/window/soundeffectspage.h delete mode 100644 dcc-old/src/plugin-sound/window/soundplugin.cpp delete mode 100644 dcc-old/src/plugin-sound/window/soundplugin.h delete mode 100644 dcc-old/src/plugin-sound/window/speakerpage.cpp delete mode 100644 dcc-old/src/plugin-sound/window/speakerpage.h delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/actions/dcc_privacy_policy_32px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/actions/dcc_protocol_32px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/actions/dcc_version_32px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/dark/icons/icon_about_laptop_128px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/dark/icons/icon_about_pc_128px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-en_US-body.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-en_US-title.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-zh_CN-body.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-zh_CN-title.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-zh_TW-body.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/gpl/gpl-3.0-zh_TW-title.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/icons/dcc_nav_systeminfo_42px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/icons/dcc_nav_systeminfo_84px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_community_en_US.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_community_zh_CN.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_developer_community_en_US.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_developer_community_zh_CN.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_developer_community_zh_HK.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_developer_community_zh_TW.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_en_US.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/license/deepin-end-user-license-agreement_zh_CN.txt delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/light/icons/icon_about_laptop_128px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/light/icons/icon_about_pc_128px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/systeminfo.qrc delete mode 100644 dcc-old/src/plugin-systeminfo/operation/qrc/texts/dcc_edit_12px.svg delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfodbusproxy.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfodbusproxy.h delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfomodel.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfomodel.h delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfowork.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/operation/systeminfowork.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/SystemInfoPlugin.json delete mode 100644 dcc-old/src/plugin-systeminfo/window/hostnameitem.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/hostnameitem.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/logoitem.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/logoitem.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/privacypolicywidget.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/privacypolicywidget.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/systeminfomodule.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/systeminfomodule.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/userlicensewidget.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/userlicensewidget.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/utils.h delete mode 100644 dcc-old/src/plugin-systeminfo/window/versionprotocolwidget.cpp delete mode 100644 dcc-old/src/plugin-systeminfo/window/versionprotocolwidget.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/monitordbusproxy.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/operation/monitordbusproxy.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/qrc/icons/dcc_nav_touchscreen_42px.svg delete mode 100644 dcc-old/src/plugin-touchscreen/operation/qrc/icons/dcc_nav_touchscreen_84px.svg delete mode 100644 dcc-old/src/plugin-touchscreen/operation/qrc/touchscreen.qrc delete mode 100644 dcc-old/src/plugin-touchscreen/operation/touchscreenmodel.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/operation/touchscreenmodel.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/touchscreenmodel_p.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/touchscreenproxy.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/operation/touchscreenproxy.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/types/touchscreeninfolist_v2.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/operation/types/touchscreeninfolist_v2.h delete mode 100644 dcc-old/src/plugin-touchscreen/operation/types/touchscreenmap.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/operation/types/touchscreenmap.h delete mode 100644 dcc-old/src/plugin-touchscreen/window/TouchScreenPlugin.json delete mode 100644 dcc-old/src/plugin-touchscreen/window/touchscreenmodule.cpp delete mode 100644 dcc-old/src/plugin-touchscreen/window/touchscreenmodule.h delete mode 100644 dcc-old/src/plugin-update/operation/appupdateinfolist.cpp delete mode 100644 dcc-old/src/plugin-update/operation/appupdateinfolist.h delete mode 100644 dcc-old/src/plugin-update/operation/common.h delete mode 100644 dcc-old/src/plugin-update/operation/mirrorsourceitem.cpp delete mode 100644 dcc-old/src/plugin-update/operation/mirrorsourceitem.h delete mode 100644 dcc-old/src/plugin-update/operation/qrc/config/mirrors.json delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_all_updated.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_app_update.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_checking_update.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_nav_update_42px.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_nav_update_84px.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_safe_update.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_system_update.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/dcc_unknown_update.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/failed.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/noactive.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/icons/success.svg delete mode 100644 dcc-old/src/plugin-update/operation/qrc/update.qrc delete mode 100644 dcc-old/src/plugin-update/operation/updatedbusproxy.cpp delete mode 100644 dcc-old/src/plugin-update/operation/updatedbusproxy.h delete mode 100644 dcc-old/src/plugin-update/operation/updatejobdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-update/operation/updatejobdbusproxy.h delete mode 100644 dcc-old/src/plugin-update/operation/updatemodel.cpp delete mode 100644 dcc-old/src/plugin-update/operation/updatemodel.h delete mode 100644 dcc-old/src/plugin-update/operation/updatework.cpp delete mode 100644 dcc-old/src/plugin-update/operation/updatework.h delete mode 100644 dcc-old/src/plugin-update/window/mirrorinfolist.cpp delete mode 100644 dcc-old/src/plugin-update/window/mirrorinfolist.h delete mode 100644 dcc-old/src/plugin-update/window/mirrorswidget.cpp delete mode 100644 dcc-old/src/plugin-update/window/mirrorswidget.h delete mode 100644 dcc-old/src/plugin-update/window/update.json delete mode 100644 dcc-old/src/plugin-update/window/updatectrlwidget.cpp delete mode 100644 dcc-old/src/plugin-update/window/updatectrlwidget.h delete mode 100644 dcc-old/src/plugin-update/window/updateplugin.cpp delete mode 100644 dcc-old/src/plugin-update/window/updateplugin.h delete mode 100644 dcc-old/src/plugin-update/window/updatesettingsmodule.cpp delete mode 100644 dcc-old/src/plugin-update/window/updatesettingsmodule.h delete mode 100644 dcc-old/src/plugin-update/window/updatewidget.cpp delete mode 100644 dcc-old/src/plugin-update/window/updatewidget.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/downloadprogressbar.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/downloadprogressbar.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/internalbuttonitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/internalbuttonitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/loadingitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/loadingitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/resultitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/resultitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/safeupdateitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/safeupdateitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/summaryitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/summaryitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/systemupdateitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/systemupdateitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/unknownupdateitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/unknownupdateitem.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/updatecontrolpanel.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/updatecontrolpanel.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/updateiteminfo.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/updateiteminfo.h delete mode 100644 dcc-old/src/plugin-update/window/widgets/updatesettingitem.cpp delete mode 100644 dcc-old/src/plugin-update/window/widgets/updatesettingitem.h delete mode 100644 dcc-old/src/plugin-wacom/operation/qrc/icons/dcc_nav_wacom_42px.svg delete mode 100644 dcc-old/src/plugin-wacom/operation/qrc/icons/dcc_nav_wacom_84px.svg delete mode 100644 dcc-old/src/plugin-wacom/operation/qrc/wacom.qrc delete mode 100644 dcc-old/src/plugin-wacom/operation/wacomdbusproxy.cpp delete mode 100644 dcc-old/src/plugin-wacom/operation/wacomdbusproxy.h delete mode 100644 dcc-old/src/plugin-wacom/operation/wacommodel.cpp delete mode 100644 dcc-old/src/plugin-wacom/operation/wacommodel.h delete mode 100644 dcc-old/src/plugin-wacom/operation/wacommodelprivate_p.h delete mode 100644 dcc-old/src/plugin-wacom/window/WacomPlugin.json delete mode 100644 dcc-old/src/plugin-wacom/window/wacommodule.cpp delete mode 100644 dcc-old/src/plugin-wacom/window/wacommodule.h delete mode 100644 dcc-old/src/plugin-wacom/window/wacomplugin.cpp delete mode 100644 dcc-old/src/plugin-wacom/window/wacomplugin.h delete mode 100644 dcc-old/src/widgets/accessiblefactoryinterface.h delete mode 100644 dcc-old/src/widgets/accessibleinterface.cpp delete mode 100644 dcc-old/src/widgets/buttontuple.cpp delete mode 100644 dcc-old/src/widgets/comboxwidget.cpp delete mode 100644 dcc-old/src/widgets/dccdbusinterface.cpp delete mode 100644 dcc-old/src/widgets/dccdbusinterface_p.h delete mode 100644 dcc-old/src/widgets/dcclistview.cpp delete mode 100644 dcc-old/src/widgets/dccslider.cpp delete mode 100644 dcc-old/src/widgets/detailinfoitem.cpp delete mode 100644 dcc-old/src/widgets/horizontalmodule.cpp delete mode 100644 dcc-old/src/widgets/itemmodule.cpp delete mode 100644 dcc-old/src/widgets/lineeditwidget.cpp delete mode 100644 dcc-old/src/widgets/listviewmodule.cpp delete mode 100644 dcc-old/src/widgets/modulelistmodel.cpp delete mode 100644 dcc-old/src/widgets/moduleobjectitem.cpp delete mode 100644 dcc-old/src/widgets/settingsgroup.cpp delete mode 100644 dcc-old/src/widgets/settingsgroupmodule.cpp delete mode 100644 dcc-old/src/widgets/settingshead.cpp delete mode 100644 dcc-old/src/widgets/settingsheaderitem.cpp delete mode 100644 dcc-old/src/widgets/settingsitem.cpp delete mode 100644 dcc-old/src/widgets/switchwidget.cpp delete mode 100644 dcc-old/src/widgets/titledslideritem.cpp delete mode 100644 dcc-old/src/widgets/titlelabel.cpp delete mode 100644 dcc-old/src/widgets/titlevalueitem.cpp delete mode 100644 dcc-old/translations/dde-control-center_ady.ts delete mode 100644 dcc-old/translations/dde-control-center_af.ts delete mode 100644 dcc-old/translations/dde-control-center_af_ZA.ts delete mode 100644 dcc-old/translations/dde-control-center_ak.ts delete mode 100644 dcc-old/translations/dde-control-center_am.ts delete mode 100644 dcc-old/translations/dde-control-center_am_ET.ts delete mode 100644 dcc-old/translations/dde-control-center_ar.ts delete mode 100644 dcc-old/translations/dde-control-center_ar_EG.ts delete mode 100644 dcc-old/translations/dde-control-center_ast.ts delete mode 100644 dcc-old/translations/dde-control-center_az.ts delete mode 100644 dcc-old/translations/dde-control-center_bg.ts delete mode 100644 dcc-old/translations/dde-control-center_bn.ts delete mode 100644 dcc-old/translations/dde-control-center_bo.ts delete mode 100644 dcc-old/translations/dde-control-center_bqi.ts delete mode 100644 dcc-old/translations/dde-control-center_br.ts delete mode 100644 dcc-old/translations/dde-control-center_ca.ts delete mode 100644 dcc-old/translations/dde-control-center_cgg.ts delete mode 100644 dcc-old/translations/dde-control-center_cs.ts delete mode 100644 dcc-old/translations/dde-control-center_da.ts delete mode 100644 dcc-old/translations/dde-control-center_de.ts delete mode 100644 dcc-old/translations/dde-control-center_el.ts delete mode 100644 dcc-old/translations/dde-control-center_el_GR.ts delete mode 100644 dcc-old/translations/dde-control-center_en.ts delete mode 100644 dcc-old/translations/dde-control-center_en_AU.ts delete mode 100644 dcc-old/translations/dde-control-center_en_GB.ts delete mode 100644 dcc-old/translations/dde-control-center_en_NO.ts delete mode 100644 dcc-old/translations/dde-control-center_en_US.ts delete mode 100644 dcc-old/translations/dde-control-center_eo.ts delete mode 100644 dcc-old/translations/dde-control-center_es.ts delete mode 100644 dcc-old/translations/dde-control-center_et.ts delete mode 100644 dcc-old/translations/dde-control-center_eu.ts delete mode 100644 dcc-old/translations/dde-control-center_fa.ts delete mode 100644 dcc-old/translations/dde-control-center_fi.ts delete mode 100644 dcc-old/translations/dde-control-center_fil.ts delete mode 100644 dcc-old/translations/dde-control-center_fr.ts delete mode 100644 dcc-old/translations/dde-control-center_gl.ts delete mode 100644 dcc-old/translations/dde-control-center_gl_ES.ts delete mode 100644 dcc-old/translations/dde-control-center_he.ts delete mode 100644 dcc-old/translations/dde-control-center_hi_IN.ts delete mode 100644 dcc-old/translations/dde-control-center_hr.ts delete mode 100644 dcc-old/translations/dde-control-center_hu.ts delete mode 100644 dcc-old/translations/dde-control-center_hy.ts delete mode 100644 dcc-old/translations/dde-control-center_id.ts delete mode 100644 dcc-old/translations/dde-control-center_id_ID.ts delete mode 100644 dcc-old/translations/dde-control-center_it.ts delete mode 100644 dcc-old/translations/dde-control-center_ja.ts delete mode 100644 dcc-old/translations/dde-control-center_ka.ts delete mode 100644 dcc-old/translations/dde-control-center_kab.ts delete mode 100644 dcc-old/translations/dde-control-center_kk.ts delete mode 100644 dcc-old/translations/dde-control-center_km_KH.ts delete mode 100644 dcc-old/translations/dde-control-center_kn_IN.ts delete mode 100644 dcc-old/translations/dde-control-center_ko.ts delete mode 100644 dcc-old/translations/dde-control-center_ku.ts delete mode 100644 dcc-old/translations/dde-control-center_ku_IQ.ts delete mode 100644 dcc-old/translations/dde-control-center_ky.ts delete mode 100644 dcc-old/translations/dde-control-center_ky@Arab.ts delete mode 100644 dcc-old/translations/dde-control-center_la.ts delete mode 100644 dcc-old/translations/dde-control-center_lo.ts delete mode 100644 dcc-old/translations/dde-control-center_lt.ts delete mode 100644 dcc-old/translations/dde-control-center_lv.ts delete mode 100644 dcc-old/translations/dde-control-center_ml.ts delete mode 100644 dcc-old/translations/dde-control-center_mn.ts delete mode 100644 dcc-old/translations/dde-control-center_mr.ts delete mode 100644 dcc-old/translations/dde-control-center_ms.ts delete mode 100644 dcc-old/translations/dde-control-center_nb.ts delete mode 100644 dcc-old/translations/dde-control-center_ne.ts delete mode 100644 dcc-old/translations/dde-control-center_nl.ts delete mode 100644 dcc-old/translations/dde-control-center_pa.ts delete mode 100644 dcc-old/translations/dde-control-center_pam.ts delete mode 100644 dcc-old/translations/dde-control-center_pl.ts delete mode 100644 dcc-old/translations/dde-control-center_ps.ts delete mode 100644 dcc-old/translations/dde-control-center_pt.ts delete mode 100644 dcc-old/translations/dde-control-center_pt_BR.ts delete mode 100644 dcc-old/translations/dde-control-center_ro.ts delete mode 100644 dcc-old/translations/dde-control-center_ru.ts delete mode 100644 dcc-old/translations/dde-control-center_ru_UA.ts delete mode 100644 dcc-old/translations/dde-control-center_sc.ts delete mode 100644 dcc-old/translations/dde-control-center_si.ts delete mode 100644 dcc-old/translations/dde-control-center_sk.ts delete mode 100644 dcc-old/translations/dde-control-center_sl.ts delete mode 100644 dcc-old/translations/dde-control-center_sq.ts delete mode 100644 dcc-old/translations/dde-control-center_sr.ts delete mode 100644 dcc-old/translations/dde-control-center_sv.ts delete mode 100644 dcc-old/translations/dde-control-center_sv_SE.ts delete mode 100644 dcc-old/translations/dde-control-center_sw.ts delete mode 100644 dcc-old/translations/dde-control-center_ta.ts delete mode 100644 dcc-old/translations/dde-control-center_te.ts delete mode 100644 dcc-old/translations/dde-control-center_th.ts delete mode 100644 dcc-old/translations/dde-control-center_tr.ts delete mode 100644 dcc-old/translations/dde-control-center_tzm.ts delete mode 100644 dcc-old/translations/dde-control-center_ug.ts delete mode 100644 dcc-old/translations/dde-control-center_uk.ts delete mode 100644 dcc-old/translations/dde-control-center_ur.ts delete mode 100644 dcc-old/translations/dde-control-center_uz.ts delete mode 100644 dcc-old/translations/dde-control-center_vi.ts delete mode 100644 dcc-old/translations/dde-control-center_zh_CN.ts delete mode 100644 dcc-old/translations/dde-control-center_zh_HK.ts delete mode 100644 dcc-old/translations/dde-control-center_zh_TW.ts delete mode 100644 dcc-old/translations/desktop/desktop.ts delete mode 100644 dcc-old/translations/desktop/desktop_ady.ts delete mode 100644 dcc-old/translations/desktop/desktop_af.ts delete mode 100644 dcc-old/translations/desktop/desktop_af_ZA.ts delete mode 100644 dcc-old/translations/desktop/desktop_ak.ts delete mode 100644 dcc-old/translations/desktop/desktop_am.ts delete mode 100644 dcc-old/translations/desktop/desktop_am_ET.ts delete mode 100644 dcc-old/translations/desktop/desktop_ar.ts delete mode 100644 dcc-old/translations/desktop/desktop_ar_EG.ts delete mode 100644 dcc-old/translations/desktop/desktop_ast.ts delete mode 100644 dcc-old/translations/desktop/desktop_az.ts delete mode 100644 dcc-old/translations/desktop/desktop_bg.ts delete mode 100644 dcc-old/translations/desktop/desktop_bn.ts delete mode 100644 dcc-old/translations/desktop/desktop_bo.ts delete mode 100644 dcc-old/translations/desktop/desktop_bqi.ts delete mode 100644 dcc-old/translations/desktop/desktop_br.ts delete mode 100644 dcc-old/translations/desktop/desktop_ca.ts delete mode 100644 dcc-old/translations/desktop/desktop_cgg.ts delete mode 100644 dcc-old/translations/desktop/desktop_cs.ts delete mode 100644 dcc-old/translations/desktop/desktop_da.ts delete mode 100644 dcc-old/translations/desktop/desktop_de.ts delete mode 100644 dcc-old/translations/desktop/desktop_el.ts delete mode 100644 dcc-old/translations/desktop/desktop_el_GR.ts delete mode 100644 dcc-old/translations/desktop/desktop_en.ts delete mode 100644 dcc-old/translations/desktop/desktop_en_AU.ts delete mode 100644 dcc-old/translations/desktop/desktop_en_GB.ts delete mode 100644 dcc-old/translations/desktop/desktop_en_NO.ts delete mode 100644 dcc-old/translations/desktop/desktop_en_US.ts delete mode 100644 dcc-old/translations/desktop/desktop_eo.ts delete mode 100644 dcc-old/translations/desktop/desktop_es.ts delete mode 100644 dcc-old/translations/desktop/desktop_et.ts delete mode 100644 dcc-old/translations/desktop/desktop_eu.ts delete mode 100644 dcc-old/translations/desktop/desktop_fa.ts delete mode 100644 dcc-old/translations/desktop/desktop_fi.ts delete mode 100644 dcc-old/translations/desktop/desktop_fil.ts delete mode 100644 dcc-old/translations/desktop/desktop_fr.ts delete mode 100644 dcc-old/translations/desktop/desktop_gl.ts delete mode 100644 dcc-old/translations/desktop/desktop_gl_ES.ts delete mode 100644 dcc-old/translations/desktop/desktop_he.ts delete mode 100644 dcc-old/translations/desktop/desktop_hi_IN.ts delete mode 100644 dcc-old/translations/desktop/desktop_hr.ts delete mode 100644 dcc-old/translations/desktop/desktop_hu.ts delete mode 100644 dcc-old/translations/desktop/desktop_hy.ts delete mode 100644 dcc-old/translations/desktop/desktop_id.ts delete mode 100644 dcc-old/translations/desktop/desktop_id_ID.ts delete mode 100644 dcc-old/translations/desktop/desktop_it.ts delete mode 100644 dcc-old/translations/desktop/desktop_ja.ts delete mode 100644 dcc-old/translations/desktop/desktop_ka.ts delete mode 100644 dcc-old/translations/desktop/desktop_kab.ts delete mode 100644 dcc-old/translations/desktop/desktop_kk.ts delete mode 100644 dcc-old/translations/desktop/desktop_km_KH.ts delete mode 100644 dcc-old/translations/desktop/desktop_kn_IN.ts delete mode 100644 dcc-old/translations/desktop/desktop_ko.ts delete mode 100644 dcc-old/translations/desktop/desktop_ku.ts delete mode 100644 dcc-old/translations/desktop/desktop_ku_IQ.ts delete mode 100644 dcc-old/translations/desktop/desktop_ky.ts delete mode 100644 dcc-old/translations/desktop/desktop_ky@Arab.ts delete mode 100644 dcc-old/translations/desktop/desktop_la.ts delete mode 100644 dcc-old/translations/desktop/desktop_lo.ts delete mode 100644 dcc-old/translations/desktop/desktop_lt.ts delete mode 100644 dcc-old/translations/desktop/desktop_lv.ts delete mode 100644 dcc-old/translations/desktop/desktop_ml.ts delete mode 100644 dcc-old/translations/desktop/desktop_mn.ts delete mode 100644 dcc-old/translations/desktop/desktop_mr.ts delete mode 100644 dcc-old/translations/desktop/desktop_ms.ts delete mode 100644 dcc-old/translations/desktop/desktop_nb.ts delete mode 100644 dcc-old/translations/desktop/desktop_ne.ts delete mode 100644 dcc-old/translations/desktop/desktop_nl.ts delete mode 100644 dcc-old/translations/desktop/desktop_pa.ts delete mode 100644 dcc-old/translations/desktop/desktop_pam.ts delete mode 100644 dcc-old/translations/desktop/desktop_pl.ts delete mode 100644 dcc-old/translations/desktop/desktop_ps.ts delete mode 100644 dcc-old/translations/desktop/desktop_pt.ts delete mode 100644 dcc-old/translations/desktop/desktop_pt_BR.ts delete mode 100644 dcc-old/translations/desktop/desktop_ro.ts delete mode 100644 dcc-old/translations/desktop/desktop_ru.ts delete mode 100644 dcc-old/translations/desktop/desktop_ru_UA.ts delete mode 100644 dcc-old/translations/desktop/desktop_sc.ts delete mode 100644 dcc-old/translations/desktop/desktop_si.ts delete mode 100644 dcc-old/translations/desktop/desktop_sk.ts delete mode 100644 dcc-old/translations/desktop/desktop_sl.ts delete mode 100644 dcc-old/translations/desktop/desktop_sq.ts delete mode 100644 dcc-old/translations/desktop/desktop_sr.ts delete mode 100644 dcc-old/translations/desktop/desktop_sv.ts delete mode 100644 dcc-old/translations/desktop/desktop_sv_SE.ts delete mode 100644 dcc-old/translations/desktop/desktop_sw.ts delete mode 100644 dcc-old/translations/desktop/desktop_ta.ts delete mode 100644 dcc-old/translations/desktop/desktop_te.ts delete mode 100644 dcc-old/translations/desktop/desktop_th.ts delete mode 100644 dcc-old/translations/desktop/desktop_tr.ts delete mode 100644 dcc-old/translations/desktop/desktop_tzm.ts delete mode 100644 dcc-old/translations/desktop/desktop_ug.ts delete mode 100644 dcc-old/translations/desktop/desktop_uk.ts delete mode 100644 dcc-old/translations/desktop/desktop_ur.ts delete mode 100644 dcc-old/translations/desktop/desktop_uz.ts delete mode 100644 dcc-old/translations/desktop/desktop_vi.ts delete mode 100644 dcc-old/translations/desktop/desktop_zh_CN.ts delete mode 100644 dcc-old/translations/desktop/desktop_zh_HK.ts delete mode 100644 dcc-old/translations/desktop/desktop_zh_TW.ts diff --git a/CMakeLists.txt b/CMakeLists.txt index eb33fde8c5..d7928ea3e9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,11 +21,6 @@ option(BUILD_TESTING "UNIT test" OFF) set(BUILD_EXAMPLES OFF) set(DCC_ENABLE_MEMORY_MANAGEMENT ON) -# dcc-v23 -set(BUILD_DCC_OLD OFF) -if (BUILD_DCC_OLD) - add_subdirectory(dcc-old) -endif() set(QT_NS Qt6) set(DTK_NS Dtk6) diff --git a/dcc-old/CMakeLists.txt b/dcc-old/CMakeLists.txt deleted file mode 100644 index a49dbe5181..0000000000 --- a/dcc-old/CMakeLists.txt +++ /dev/null @@ -1,1424 +0,0 @@ -cmake_minimum_required(VERSION 3.13) - -set(DVERSION "6.0.44" CACHE STRING "define project version") -set(BUILD_DOCS ON CACHE BOOL "Generate doxygen-based documentation") - -set(PROJECT_NAME dde-control-center-old) -project(${PROJECT_NAME} - VERSION ${DVERSION} - DESCRIPTION "Deepin Control Center" - HOMEPAGE_URL "https://github.com/linuxdeepin/dde-control-center" - LANGUAGES CXX C -) - -set(CMAKE_CXX_STANDARD 17) -set(CMAKE_INCLUDE_CURRENT_DIR ON) -set(CMAKE_AUTOMOC ON) -set(CMAKE_AUTORCC ON) -option(BUILD_TESTING "UNIT test" OFF) - -# INFO: -# plugins can be disabled and their options -# plugin-authentication : DISABLE_AUTHENTICATION -# plugin-update : DISABLE_UPDATE -# plugin-keyboard: DISABLE_LANGUAGE to disable language panel - -option(DISABLE_AUTHENTICATION "disable build authentication plugins" OFF) -option(DISABLE_UPDATE "disable build update plugins" OFF) -option(DISABLE_LANGUAGE "disable lanugage settings in control center" OFF) -option(USE_DEEPIN_ZONE "enable special timezone file on deepin" OFF) -option(DISABLE_SOUND_ADVANCED "disable sound advanced settings" OFF) -set(DEEPIN_TIME_ZONE_PATH "/usr/share/dde/zoneinfo/zone1970.tab" CACHE STRING "deepin timezone path") -set(LOCALE_I18N_PATH "/usr/share/i18n/SUPPORTED" CACHE STRING "Supported locale path") - -# asan 自己有内存泄露,暂不使用 -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - # set(UNITTEST ON) - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -Wall -Werror=return-type -fno-omit-frame-pointer -Wextra") - if(ENABLE_ASAN) - if (CMAKE_CXX_COMPILER_ID MATCHES "GNU" OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address -g") - set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fsanitize=address -g") - set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address") - set(CMAKE_LINKER_FLAGS "${CMAKE_LINKER_FLAGS} -fsanitize=address") - set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address") - add_definitions(-DUSE_ASAN) - endif() - endif() -else() - # generate qm - execute_process(COMMAND bash "misc/translate_generation.sh" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) - # generate desktop translate - execute_process(COMMAND bash "misc/translate_ts2desktop.sh" - WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}) -endif() - -if (BUILD_TESTING) - set(UNITTEST ON) -endif() - -set(BUILD_PLUGIN ON) - -if (NOT BUILD_PLUGIN) - set(UNITTEST OFF) -endif() -# GNU 默认 - -if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU") - set(UT_COMPILER -fprofile-arcs -ftest-coverage) -elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") - set(UT_COMPILER -fprofile-instr-generate -ftest-coverage) -endif() - -if (USE_DEEPIN_ZONE) - add_definitions(-DUSE_DEEPIN_ZONE) - add_definitions(-DDEEPIN_TIME_ZONE_PATH="${DEEPIN_TIME_ZONE_PATH}") -endif () - -add_definitions(-DLOCALE_I18N_PATH="${LOCALE_I18N_PATH}") - -# Install settings -if (CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) - set(CMAKE_INSTALL_PREFIX /usr) -endif () -include(GNUInstallDirs) -include(CMakePackageConfigHelpers) -include(GoogleTest) - -if(BUILD_DOCS) - add_subdirectory(docs) -endif() - -set(TRANSLATE_INSTALL_DIR "${CMAKE_INSTALL_DATAROOTDIR}/dde-control-center/translations" CACHE STRING "Install dir for dde-control-center translate files") - -add_definitions(-DTRANSLATE_READ_DIR="${CMAKE_INSTALL_PREFIX}/${TRANSLATE_INSTALL_DIR}") -set(MODULE_INSTALL_DIR "${CMAKE_INSTALL_FULL_LIBDIR}/dde-control-center/modules" CACHE STRING "Install dir for dde-control-center modules") - -set(DCC_MODULE_READ_DIR "${MODULE_INSTALL_DIR}" CACHE STRING "Dir to find dde-control-center modules") -add_definitions(-DDCC_DefaultModuleDirectory="${DCC_MODULE_READ_DIR}") - -set(LOCALSTATE_READ_DIR "${CMAKE_INSTALL_FULL_LOCALSTATEDIR}" CACHE STRING "Dir to find modifiable single-machine data") -add_definitions(-DVARDIRECTORY="${LOCALSTATE_READ_DIR}") -# Find the library -find_package(PkgConfig REQUIRED) -find_package(Dtk COMPONENTS Core Widget DConfig REQUIRED) -find_package(Qt5 COMPONENTS Widgets Network DBus Concurrent Multimedia Svg Test REQUIRED) -find_package(GTest REQUIRED) -find_package(Threads REQUIRED) -# pkg_check_modules(DFrameworkDBus REQUIRED dframeworkdbus) - -if (${CMAKE_SYSTEM_PROCESSOR} STREQUAL "sw_64") - set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -mieee") -endif() - -# dconfig -# file(GLOB DCONFIG_FILES "misc/configs/*.json") -# dtk_add_config_meta_files(APPID org.deepin.dde.control-center BASE misc/configs FILES ${DCONFIG_FILES}) -# file(GLOB DCONFIG_FILE_REGION_FORMAT "misc/configs/common/org.deepin.region-format.json") -# dtk_add_config_meta_files(COMMONID true FILES ${DCONFIG_FILE_REGION_FORMAT}) - -include_directories( - include -) - -set(Test_Libraries - -lgcov - Threads::Threads - GTest::gtest - Qt::Test -) - -#--------------------------interface-------------------------- -set(Interface_Name dcc-interface) -file(GLOB_RECURSE Interface_SRCS - "include/interface/*.h" - "src/interface/*.cpp" -) -add_library(${Interface_Name} SHARED - ${Interface_SRCS} -) - -set(Interface_Libraries - Qt::Widgets - Dtk::Widget -) - -target_include_directories(${Interface_Name} PUBLIC - $ -) - -target_include_directories(${Interface_Name} INTERFACE - $ -) - -target_link_libraries(${Interface_Name} PUBLIC - ${Interface_Libraries} -) - -set_target_properties(${Interface_Name} PROPERTIES - VERSION 6 - SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} - EXPORT_NAME DCCInterface -) - -# so -install(TARGETS ${Interface_Name} - EXPORT DdeControlCenterInterfaceTargets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - -install(EXPORT DdeControlCenterInterfaceTargets - FILE DdeControlCenterInterfaceTargets.cmake - NAMESPACE Dde:: - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DdeControlCenter -) - - -#--------------------------dccwidgets library---------------------------- -set(Dcc_Widgets_Name dcc-widgets) -file(GLOB_RECURSE Dcc_Widgets_SRCS - "include/widgets/*.h" - "src/widgets/*.cpp" -) -add_library(${Dcc_Widgets_Name} SHARED - ${Dcc_Widgets_SRCS} -) -set(Dcc_Widgets_Includes - include/widgets -) - -set(Dcc_Widgets_Libraries_public - Dtk::Widget - Qt::Widgets - ${Interface_Name} -) - -set(Dcc_Widgets_Libraries_private - Qt::Svg - Qt::DBus -) - -set(Dcc_Widgets_Libraries - ${Dcc_Widgets_Libraries_public} - ${Dcc_Widgets_Libraries_private} -) - -target_include_directories(${Dcc_Widgets_Name} PUBLIC - $ -) - -target_include_directories(${Dcc_Widgets_Name} INTERFACE - $ -) - -target_link_libraries(${Dcc_Widgets_Name} PUBLIC - ${Dcc_Widgets_Libraries_public} -) - -target_link_libraries(${Dcc_Widgets_Name} PRIVATE - ${Dcc_Widgets_Libraries_private} -) - -set_target_properties(${Dcc_Widgets_Name} PROPERTIES - VERSION 6 - SOVERSION ${CMAKE_PROJECT_VERSION_MAJOR} - EXPORT_NAME DCCWidget -) - -# so -install(TARGETS ${Dcc_Widgets_Name} - EXPORT DdeControlCenterWidgetTargets - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - -install(EXPORT DdeControlCenterWidgetTargets - FILE DdeControlCenterWidgetTargets.cmake - NAMESPACE Dde:: - DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DdeControlCenter -) - - -#------------------------dccwidgets library test-------------------------- -if (UNITTEST) - set(UT_Dcc_Widgets_Name ut-dcc-widgets) - file(GLOB_RECURSE UT_Dcc_Widgets_SRCS - "tests/widgets/*.cpp" - ) - add_executable(${UT_Dcc_Widgets_Name} - ${Dcc_Widgets_SRCS} - ${UT_Dcc_Widgets_SRCS} - ) - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_Dcc_Widgets_Name} PRIVATE ${UT_COMPILER}) - target_include_directories(${UT_Dcc_Widgets_Name} PUBLIC - ${Dcc_Widgets_Includes} - ) - target_link_libraries(${UT_Dcc_Widgets_Name} PRIVATE - ${Dcc_Widgets_Libraries} - ${Test_Libraries} - ) - gtest_discover_tests(${UT_Dcc_Widgets_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() - -#--------------------------dde-control-center-Agent-------------------------- -set(DCC_AGENT_PREFIX "") -if (CMAKE_BUILD_TYPE STREQUAL "Debug") - set(OLD_DCC_SO_PATH ${PROJECT_BINARY_DIR}/../dcc-old/libdcc-widgets.so) - set(NEW_DCC_SO_PATH ${PROJECT_BINARY_DIR}/../lib/libdde-control-center.so) - set(OLD_DCC_PATH ${PROJECT_BINARY_DIR}/../dcc-old/libdde-control-center-old.so) - set(NEW_DCC_PATH ${PROJECT_BINARY_DIR}/../lib/libdde-control-center-lib.so) -else() - set(DCC_AGENT_PREFIX "/usr/") - set(OLD_DCC_SO_PATH ${CMAKE_INSTALL_LIBDIR}/libdcc-widgets.so) - set(NEW_DCC_SO_PATH ${CMAKE_INSTALL_LIBDIR}/libdde-control-center.so) - set(OLD_DCC_PATH ${CMAKE_INSTALL_LIBDIR}/dde-control-center/libdde-control-center-old.so) - set(NEW_DCC_PATH ${CMAKE_INSTALL_LIBDIR}/dde-control-center/libdde-control-center-lib.so) - set(DCC_TRANSLATE_READ_DIR ${CMAKE_INSTALL_PREFIX}/${DCC_TRANSLATION_INSTALL_DIR}) -endif() -add_definitions(-DOLD_DCC_SO_PATH="${DCC_AGENT_PREFIX}${OLD_DCC_SO_PATH}") -add_definitions(-DNEW_DCC_SO_PATH="${DCC_AGENT_PREFIX}${NEW_DCC_SO_PATH}") -add_definitions(-DOLD_DCC_PATH="${DCC_AGENT_PREFIX}${OLD_DCC_PATH}") -add_definitions(-DNEW_DCC_PATH="${DCC_AGENT_PREFIX}${NEW_DCC_PATH}") - - -set(DCC_Agent dde-control-center-agent) -set(DCCAgent_Name ${DCC_Agent}) -file(GLOB DCCAgent_SRCS - "src/dcc-agent/*.c" -) - -add_executable(${DCCAgent_Name} - ${DCCAgent_SRCS} -) - -set_target_properties(${DCCAgent_Name} PROPERTIES - OUTPUT_NAME dde-control-center -) - -install(TARGETS ${DCCAgent_Name} DESTINATION ${CMAKE_INSTALL_BINDIR}) - -#--------------------------dde-control-center-------------------------- -set(Control_Center_Name dde-control-center-old) -file(GLOB_RECURSE Control_Center_SRCS - "src/frame/*.h" - "src/frame/*.cpp" -) -list(REMOVE_ITEM Control_Center_SRCS "${CMAKE_CURRENT_SOURCE_DIR}/src/frame/main.cpp") - -add_library(${Control_Center_Name} SHARED - ${Control_Center_SRCS} - src/frame/main.cpp -) - -target_compile_definitions(${Control_Center_Name} PRIVATE CVERSION="${CVERSION}") - -set(Control_Center_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent -) - -target_link_libraries(${Control_Center_Name} PRIVATE - ${Control_Center_Libraries} -) - -# bin -install(TARGETS ${Control_Center_Name} DESTINATION ${CMAKE_INSTALL_LIBDIR}/dde-control-center/) - -#----------------------------install config------------------------------ -# qm files -file(GLOB QM_FILES "translations/*.qm") -install(FILES ${QM_FILES} DESTINATION ${TRANSLATE_INSTALL_DIR}) - -#desktop -# install(FILES misc/org.deepin.dde.control-center.desktop DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/applications) - -#service -# configure_file( -# ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.dde.ControlCenter1.service.in -# ${CMAKE_CURRENT_BINARY_DIR}/org.deepin.dde.ControlCenter1.service -# @ONLY) -# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.deepin.dde.ControlCenter1.service -# DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/dbus-1/services) - -# systemd service -if (NOT DEFINED SYSTEMD_USER_UNIT_DIR) - find_package(PkgConfig REQUIRED) - pkg_check_modules(Systemd REQUIRED systemd) - pkg_get_variable(SYSTEMD_USER_UNIT_DIR systemd systemduserunitdir) -endif() - -# configure_file( -# ${CMAKE_SOURCE_DIR}/misc/systemd/dde-control-center.service.in -# ${CMAKE_CURRENT_BINARY_DIR}/org.deepin.dde.control-center.service -# @ONLY) - -# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/org.deepin.dde.control-center.service -# DESTINATION ${SYSTEMD_USER_UNIT_DIR}) - -# dev files -file(GLOB HEADERS "include/*") -set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/dde-control-center) -install(DIRECTORY ${HEADERS} DESTINATION ${INCLUDE_INSTALL_DIR}) - -# configure_package_config_file(misc/DdeControlCenterConfig.cmake.in -# ${CMAKE_CURRENT_BINARY_DIR}/DdeControlCenterConfig.cmake -# INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DdeControlCenter -# PATH_VARS INCLUDE_INSTALL_DIR -# INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) - -# write_basic_package_version_file( -# "${CMAKE_CURRENT_BINARY_DIR}/DdeControlCenterConfigVersion.cmake" -# VERSION ${PROJECT_VERSION} -# COMPATIBILITY SameMajorVersion -# ) - -# install(FILES ${CMAKE_CURRENT_BINARY_DIR}/DdeControlCenterConfig.cmake -# ${CMAKE_CURRENT_BINARY_DIR}/DdeControlCenterConfigVersion.cmake -# DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/DdeControlCenter) - -# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.dde.controlcenter.metainfo.xml -# DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo) - -#dde-grand-search-daemon conf -# install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/misc/org.deepin.dde-grand-search.dde-control-center-setting.conf -# DESTINATION ${CMAKE_INSTALL_LIBDIR}/dde-grand-search-daemon/plugins/searcher) -#-------------------------ut-dcc-interface------------------------- -if (UNITTEST) - set(UT_Interface_Name ut-dcc-interface) - file(GLOB_RECURSE UT_Interface_SRCS - "tests/interface/*.cpp" - ) - - set(Interface_Includes - include/interface - ) - - add_executable(${UT_Interface_Name} - ${Interface_SRCS} - ${UT_Interface_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_Interface_Name} PRIVATE ${UT_COMPILER}) - - target_include_directories(${UT_Interface_Name} PUBLIC - ${Interface_Includes} - ) - - target_link_libraries(${UT_Interface_Name} PRIVATE - ${Interface_Libraries} - ${Test_Libraries} - ) -endif() -#-------------------------ut-dcc-frame------------------------- -if (UNITTEST) - set(UT_Frame_Name ut-dcc-frame) - file(GLOB_RECURSE UT_Frame_SRCS - "tests/frame/*.cpp" - ) - - add_executable(${UT_Frame_Name} - ${Control_Center_SRCS} - ${UT_Frame_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_Frame_Name} PRIVATE ${UT_COMPILER}) - - target_link_libraries(${UT_Frame_Name} PRIVATE - ${Control_Center_Libraries} - ${Test_Libraries} - ) -endif() -#--------------------------plugin-test1-------------------------- -if (UNITTEST) - set(Plugin_Test1_Name plugin-test1) - file(GLOB_RECURSE Plugin_Test1_SRCS - "tests/plugin-test1/*.h" - "tests/plugin-test1/*.cpp" - ) - - add_library(${Plugin_Test1_Name} MODULE - ${Plugin_Test1_SRCS} - ) - - set(Plugin_Test1_Libraries - ${Interface_Name} - Qt::Widgets - Qt::DBus - Dtk::Widget - ) - - target_link_libraries(${Plugin_Test1_Name} PRIVATE - ${Plugin_Test1_Libraries} - ) -endif() - -#--------------------------plugin-test2-------------------------- -if (UNITTEST) - set(Plugin_Test2_Name plugin-test2) - file(GLOB_RECURSE Plugin_Test2_SRCS - "tests/plugin-test2/*.h" - "tests/plugin-test2/*.cpp" - ) - - add_library(${Plugin_Test2_Name} MODULE - ${Plugin_Test2_SRCS} - ) - - set(Plugin_Test2_Includes - Qt5::Widgets - Qt5::DBus - ) - set(Plugin_Test2_Libraries - ${Interface_Name} - Qt5::Widgets - Qt5::DBus - ) - target_include_directories(${Plugin_Test2_Name} PUBLIC - ${Plugin_Test2_Includes} - ) - - target_link_libraries(${Plugin_Test2_Name} PRIVATE - ${Plugin_Test2_Libraries} - ) -endif() - -#--------------------------plugin-systeminfo-------------------------- -if (BUILD_PLUGIN) - set(SystemInfo_Name dcc-systeminfo-plugin) - file(GLOB_RECURSE SYSTEMINFO_SRCS - "src/plugin-systeminfo/window/*.cpp" - "src/plugin-systeminfo/operation/*.cpp" - "src/plugin-systeminfo/operation/qrc/systeminfo.qrc" - ) - - add_library(${SystemInfo_Name} MODULE - ${SYSTEMINFO_SRCS} - ) - - set(SystemInfo_Includes - src/plugin-systeminfo - - ) - set(SystemInfo_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ) - - - target_include_directories(${SystemInfo_Name} PUBLIC - ${SystemInfo_Includes} - ) - - target_link_libraries(${SystemInfo_Name} PRIVATE - ${SystemInfo_Libraries} - ) - - install(TARGETS ${SystemInfo_Name} DESTINATION ${CMAKE_INSTALL_LIBDIR}/dde-control-center/modules) -endif() -#-------------------------ut-dcc-systeminfo-plugin------------------------- -if (UNITTEST) - set(UT_SystemInfo_Name ut-dcc-systeminfo-plugin) - file(GLOB_RECURSE UT_SYSTEMINFO_SRCS - "tests/plugin-systeminfo/*.cpp" - ) - - add_executable(${UT_SystemInfo_Name} - ${SYSTEMINFO_SRCS} - ${UT_SYSTEMINFO_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_SystemInfo_Name} PRIVATE ${UT_COMPILER}) - - target_include_directories(${UT_SystemInfo_Name} PUBLIC - ${SystemInfo_Includes} - ) - - target_link_libraries(${UT_SystemInfo_Name} PRIVATE - ${SystemInfo_Libraries} - ${Test_Libraries} - ) - gtest_discover_tests(${UT_SystemInfo_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() -#--------------------------dcc-power-plugin-------------------------- -if (BUILD_PLUGIN) - set(Power_Name dcc-power-plugin) - file(GLOB_RECURSE Power_SRCS - "src/plugin-power/window/*.cpp" - "src/plugin-power/operation/*.cpp" - "src/plugin-power/operation/qrc/power.qrc" - ) - - add_library(${Power_Name} MODULE - ${Power_SRCS} - ) - - set(Power_Includes - src/plugin-power/window - src/plugin-power/operation - ) - set(Power_Libraries - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ${Dcc_Widgets_Name} - ) - target_include_directories(${Power_Name} PRIVATE - ${Power_Includes} - ) - - target_link_libraries(${Power_Name} PRIVATE - ${Power_Libraries} - ) - - install(TARGETS ${Power_Name} DESTINATION ${CMAKE_INSTALL_LIBDIR}/dde-control-center/modules) -endif() -#--------------------------plugin-mouse-------------------------- -if (BUILD_PLUGIN) - set(Mouse_Name dcc-mouse-plugin) - file(GLOB_RECURSE MOUSE_SRCS - "src/plugin-mouse/window/*.cpp" - "src/plugin-mouse/operation/*.cpp" - "src/plugin-mouse/operation/qrc/mouse.qrc" - ) - - add_library(${Mouse_Name} MODULE - ${MOUSE_SRCS} - ) - - set(Mouse_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ) - - target_include_directories(${Mouse_Name} PUBLIC - ${Mouse_Includes} - ) - - target_link_libraries(${Mouse_Name} PRIVATE - ${Mouse_Libraries} - ) - - install(TARGETS ${Mouse_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#-------------------------ut-dcc-mouse-plugin------------------------- -if (UNITTEST) - set(UT_Mouse_Name ut-dcc-mouse-plugin) - file(GLOB_RECURSE UT_MOUSE_SRCS - "tests/plugin-mouse/*.cpp" - ) - - add_executable(${UT_Mouse_Name} - ${MOUSE_SRCS} - ${UT_MOUSE_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_Mouse_Name} PRIVATE ${UT_COMPILER}) - - - target_link_libraries(${UT_Mouse_Name} PRIVATE - ${Mouse_Libraries} - ${Test_Libraries} - ) - gtest_discover_tests(${UT_Mouse_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() -#--------------------------plugin-commoninfo-------------------------- -if (BUILD_PLUGIN) - set(CommonInfo_Name dcc-commoninfo-plugin) - pkg_check_modules(DEEPIN_PW_CHECK REQUIRED libdeepin_pw_check) - file(GLOB_RECURSE COMMONINFO_SRCS - "src/plugin-commoninfo/window/*.cpp" - "src/plugin-commoninfo/operation/*.cpp" - "src/plugin-commoninfo/operation/qrc/commoninfo.qrc" - ) - - add_library(${CommonInfo_Name} MODULE - ${COMMONINFO_SRCS} - ) - set(CommonInfo_Includes - ${DEEPIN_PW_CHECK_INCLUDE_DIRS} - ) - set(CommonInfo_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - ${DEEPIN_PW_CHECK_LIBRARIES} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ) - - - target_include_directories(${CommonInfo_Name} PUBLIC - ${CommonInfo_Includes} - ) - - target_link_libraries(${CommonInfo_Name} PRIVATE - ${CommonInfo_Libraries} - ) - - install(TARGETS ${CommonInfo_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#-------------------------ut-dcc-commoninfo-plugin------------------------- -if (UNITTEST) - set(UT_CommonInfo_Name ut-dcc-commoninfo-plugin) - file(GLOB_RECURSE UT_COMMONINFO_SRCS - "tests/plugin-commoninfo/*.cpp" - ) - - add_executable(${UT_CommonInfo_Name} - ${COMMONINFO_SRCS} - ${UT_COMMONINFO_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_CommonInfo_Name} PRIVATE ${UT_COMPILER}) - - target_include_directories(${UT_CommonInfo_Name} PUBLIC - ${CommonInfo_Includes} - ) - - target_link_libraries(${UT_CommonInfo_Name} PRIVATE - ${CommonInfo_Libraries} - ${Test_Libraries} - ) - gtest_discover_tests(${UT_Dcc_Widgets_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() - -#--------------------------dcc-bluetooth-plugin-------------------------- -if (BUILD_PLUGIN) - set(Bluetooth_Name dcc-bluetooth-plugin) - file(GLOB_RECURSE Bluetooth_SRCS - "src/plugin-bluetooth/window/*.cpp" - "src/plugin-bluetooth/operation/*.cpp" - "src/plugin-bluetooth/operation/qrc/bluetooth.qrc" - ) - - add_library(${Bluetooth_Name} MODULE - ${Bluetooth_SRCS} - ) - - set(Bluetooth_Includes - src/plugin-bluetooth/window - src/plugin-bluetooth/operation - ) - set(Bluetooth_Libraries - ${Interface_Name} - Qt::Widgets - Qt::DBus - Qt::Concurrent - Dtk::Widget - ${Dcc_Widgets_Name} - ) - target_include_directories(${Bluetooth_Name} PRIVATE - ${Bluetooth_Includes} - ) - - target_link_libraries(${Bluetooth_Name} PRIVATE - ${Bluetooth_Libraries} - ) - - install(TARGETS ${Bluetooth_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------dcc-defaultapp-plugin-------------------------- -if (BUILD_PLUGIN) - set(DefaultApp_Name dcc-defaultapp-plugin) - file(GLOB_RECURSE DefaultApp_SRCS - "src/plugin-defaultapp/window/*.cpp" - "src/plugin-defaultapp/window/widgets/*.cpp" - "src/plugin-defaultapp/operation/*.cpp" - "src/plugin-defaultapp/operation/qrc/defapp.qrc" - ) - pkg_check_modules(QGSettings REQUIRED IMPORTED_TARGET gsettings-qt) - - add_library(${DefaultApp_Name} MODULE - ${DefaultApp_SRCS} - ) - - set(DefaultApp_Includes - src/plugin-defaultapp/window/widgets - src/plugin-defaultapp/operation - ) - set(DefaultApp_Libraries - ${Dcc_Widgets_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - PkgConfig::QGSettings - ${Dcc_Widgets_Name} - ) - target_include_directories(${DefaultApp_Name} PUBLIC - ${DefaultApp_Includes} - ) - - target_link_libraries(${DefaultApp_Name} PRIVATE - ${DefaultApp_Libraries} - ) - - install(TARGETS ${DefaultApp_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------dcc-datetime-plugin-------------------------- -if (BUILD_PLUGIN) - set(Datetime_Name dcc-datetime-plugin) - file(GLOB_RECURSE Datetime_SRCS - "src/plugin-datetime/window/*.cpp" - "src/plugin-datetime/operation/*.cpp" - "src/plugin-datetime/operation/qrc/datetime.qrc" - ) - - find_package(ICU COMPONENTS i18n uc) - - add_library(${Datetime_Name} MODULE - ${Datetime_SRCS} - ) - - set(Datetime_Includes - src/plugin-datetime/window - src/plugin-datetime/window/widgets - src/plugin-datetime/operation - ) - - set(Datetime_Libraries - ${Interface_Name} - Qt::Widgets - Qt::DBus - Qt::Concurrent - Dtk::Widget - ${Dcc_Widgets_Name} - ICU::i18n - ICU::uc - ) - - target_include_directories(${Datetime_Name} PRIVATE - ${Datetime_Includes} - ) - - target_link_libraries(${Datetime_Name} PRIVATE - ${Datetime_Libraries} - ) - - install(TARGETS ${Datetime_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-keyboard-------------------------- -if (BUILD_PLUGIN) - set(KeyBoard_Name dcc-keyboard-plugin) - file(GLOB_RECURSE KEYBOARD_SRCS - "src/plugin-keyboard/window/*.cpp" - "src/plugin-keyboard/operation/*.cpp" - "src/plugin-keyboard/operation/qrc/keyboard.qrc" - ) - if (DISABLE_LANGUAGE) - add_definitions(-DDCC_DISABLE_LANUGAGE) - endif() - add_library(${KeyBoard_Name} MODULE - ${KEYBOARD_SRCS} - ) - set(KeyBoard_Includes - src/plugin-keyboard - ) - set(KeyBoard_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Qt::Widgets - Qt::DBus - Qt::Concurrent - Dtk::Widget - ) - - target_include_directories(${KeyBoard_Name} PUBLIC - ${KeyBoard_Includes} - ) - - target_link_libraries(${KeyBoard_Name} PRIVATE - ${KeyBoard_Libraries} - ) - - install(TARGETS ${KeyBoard_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#-------------------------ut-dcc-keyboard-plugin------------------------- -if (UNITTEST) - set(UT_KeyBoard_Name ut-dcc-keyboard-plugin) - file(GLOB_RECURSE UT_KEYBOARD_SRCS - "tests/plugin-keyboard/*.cpp" - ) - - add_executable(${UT_KeyBoard_Name} - ${KEYBOARD_SRCS} - ${UT_KEYBOARD_SRCS} - ) - - # 用于测试覆盖率的编译条件 - target_compile_options(${UT_KeyBoard_Name} PRIVATE ${UT_COMPILER}) - - target_include_directories(${UT_KeyBoard_Name} PUBLIC - ${KeyBoard_Includes} - ) - - target_link_libraries(${UT_KeyBoard_Name} PRIVATE - ${KeyBoard_Libraries} - ${Test_Libraries} - ) - - gtest_discover_tests(${UT_KeyBoard_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -endif() -#--------------------------plugin-sound-------------------------- -if (BUILD_PLUGIN) - set(Sound_Name dcc-sound-plugin) - file(GLOB_RECURSE Sound_SRCS - "src/plugin-sound/window/*.cpp" - "src/plugin-sound/operation/*.cpp" - "src/plugin-sound/operation/qrc/sound.qrc" - ) - - add_library(${Sound_Name} MODULE - ${Sound_SRCS} - ) - - if (DISABLE_SOUND_ADVANCED) - target_compile_definitions(${Sound_Name} PUBLIC -DDCC_DISABLE_SOUND_ADVANCED) - endif() - - set(Sound_Includes - src/plugin-sound/operation - src/plugin-sound/window - ) - set(Sound_Libraries - ${Dcc_Widgets_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - Qt::Multimedia - ${Dcc_Widgets_Name} - ) - target_include_directories(${Sound_Name} PUBLIC - ${Sound_Includes} - ) - - target_link_libraries(${Sound_Name} PRIVATE - ${Sound_Libraries} - ) - - install(TARGETS ${Sound_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-authentication-------------------------- -if (BUILD_PLUGIN AND NOT DISABLE_AUTHENTICATION) - message(STATUS "===================================") - message(STATUS "") - message(STATUS "WILL BUILD dcc-authentication-plugin") - message(STATUS "") - message(STATUS "WILL BUILD dcc-authentication-plugin") - set(Authentication_Name dcc-authentication-plugin) - pkg_check_modules(DaReader REQUIRED dareader) - - file(GLOB_RECURSE Authentication_SRCS - "src/plugin-authentication/window/*.cpp" - "src/plugin-authentication/operation/*.cpp" - "src/plugin-authentication/operation/qrc/authentication.qrc" - ) - - add_library(${Authentication_Name} MODULE - ${Authentication_SRCS} - ) - - set(Authentication_Includes - ${DaReader_INCLUDE_DIRS} - src/plugin-authentication/operation - src/plugin-authentication/window - ) - set(Authentication_Libraries - ${Dcc_Widgets_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ${Dcc_Widgets_Name} - ${DaReader_LIBRARIES} - ) - target_include_directories(${Authentication_Name} PUBLIC - ${Authentication_Includes} - ) - - target_link_libraries(${Authentication_Name} PRIVATE - ${Authentication_Libraries} - ) - - install(TARGETS ${Authentication_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-accounts-------------------------- -if (BUILD_PLUGIN) - find_package(PolkitQt5-1) - set(Accounts_Name dcc-accounts-plugin) - pkg_check_modules(DEEPIN_PW_CHECK libdeepin_pw_check) - file(GLOB_RECURSE ACCOUNTS_SRCS - "src/plugin-accounts/window/*.cpp" - "src/plugin-accounts/operation/*.cpp" - "src/plugin-accounts/operation/qrc/accounts.qrc" - ) - - add_library(${Accounts_Name} MODULE - ${ACCOUNTS_SRCS} - ) - set(Accounts_Includes - ${DEEPIN_PW_CHECK_INCLUDE_DIRS} - - src/plugin-accounts/ - ) - set(Accounts_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - ${DEEPIN_PW_CHECK_LIBRARIES} - Dtk::Widget - Qt::Svg - Qt::Widgets - Qt::DBus - Qt::Concurrent - PolkitQt5-1::Agent - ) - - target_include_directories(${Accounts_Name} PUBLIC - ${Accounts_Includes} - ) - - target_link_libraries(${Accounts_Name} PRIVATE - ${Accounts_Libraries} - ) - - install(TARGETS ${Accounts_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-display-------------------------- -if (BUILD_PLUGIN) - - function(ws_generate_local type input_file output_name) - pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner) - execute_process(COMMAND ${WAYLAND_SCANNER} - ${type}-header - ${input_file} - ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.h - ) - - execute_process(COMMAND ${WAYLAND_SCANNER} - public-code - ${input_file} - ${CMAKE_CURRENT_BINARY_DIR}/${output_name}.c - ) - endfunction() - - find_package(PkgConfig REQUIRED) - pkg_check_modules(WaylandClient REQUIRED IMPORTED_TARGET wayland-client) - - ws_generate_local(client - ${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-display/wayland/libwayqt/protocols/wlr-output-management-unstable-v1.xml - wlr-output-management-unstable-v1-client-protocol) - - ws_generate_local(client - ${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-display/wayland/libwayqt/protocols/treeland-output-management.xml - treeland-output-management-client-protocol) - - file(GLOB_RECURSE LIBWAYQT_SRCS - "src/plugin-display/wayland/libwayqt/*.cpp" - "src/plugin-display/wayland/libwayqt/*.hpp" - ) - - add_library(libwayqt - OBJECT - ${LIBWAYQT_SRCS} - wlr-output-management-unstable-v1-client-protocol.c - treeland-output-management-client-protocol.c - ) - - target_include_directories(libwayqt - PUBLIC - "${CMAKE_CURRENT_SOURCE_DIR}/src/plugin-display/wayland/libwayqt" - PRIVATE - ${Qt5Gui_PRIVATE_INCLUDE_DIRS} - ) - - target_link_libraries(libwayqt - PUBLIC - Qt${QT_VERSION_MAJOR}::Core - Qt${QT_VERSION_MAJOR}::Gui - PkgConfig::WaylandClient - ) - - set(Display_Name dcc-display-plugin) - file(GLOB_RECURSE DISPLAY_SRCS - "src/plugin-display/window/*.cpp" - "src/plugin-display/operation/*.cpp" - "src/plugin-display/operation/qrc/display.qrc" - ) - - add_library(${Display_Name} MODULE - ${DISPLAY_SRCS} - ) - - set(Display_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Svg - Qt::Widgets - Qt::DBus - Qt::Concurrent - $ - PkgConfig::WaylandClient - ) - - target_include_directories(${Display_Name} PUBLIC - src/plugin-display - ${Display_Includes} - $ - ) - - target_link_libraries(${Display_Name} PRIVATE - ${Display_Libraries} - ) - - install(TARGETS ${Display_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------dcc-personalization-plugin-------------------------- -if (BUILD_PLUGIN) - set(Personalization_Name dcc-personalization-plugin) - file(GLOB_RECURSE Personalization_SRCS - "src/plugin-personalization/window/*.cpp" - "src/plugin-personalization/operation/*.cpp" - "src/plugin-personalization/operation/qrc/personalization.qrc" - ) - - add_library(${Personalization_Name} MODULE - ${Personalization_SRCS} - ) - set(Personalization_Includes - src/plugin-personalization/window - src/plugin-personalization/operation - ) - set(Personalization_Libraries - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ${Dcc_Widgets_Name} - ) - target_include_directories(${Personalization_Name} PRIVATE - ${Personalization_Includes} - ) - - target_link_libraries(${Personalization_Name} PRIVATE - ${Personalization_Libraries} - ) - - install(TARGETS ${Personalization_Name} DESTINATION ${MODULE_INSTALL_DIR}) - # install(FILES misc/developdocument.html DESTINATION ${CMAKE_INSTALL_DATAROOTDIR}/dde-control-center) -endif() -#--------------------------dcc-personalization-dock-plugin-------------------------- -if (BUILD_PLUGIN) - set(Plugin_Personalization_Dock_Name dcc-personalization-dock-plugin) - file(GLOB_RECURSE Plugin_Personalization_Dock_SRCS - "src/plugin-personalization-dock/window/*.cpp" - "src/plugin-personalization-dock/operation/*.cpp" - "src/plugin-personalization-dock/operation/qrc/resources.qrc" - ) - - add_library(${Plugin_Personalization_Dock_Name} MODULE - ${Plugin_Personalization_Dock_SRCS} - ) - - set(Plugin_Personalization_Dock_Includes - - src/plugin-personalization-dock/operation - ) - set(Plugin_Personalization_Dock_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - ) - target_include_directories(${Plugin_Personalization_Dock_Name} PUBLIC - ${Plugin_Personalization_Dock_Includes} - ) - - target_link_libraries(${Plugin_Personalization_Dock_Name} PRIVATE - ${Plugin_Personalization_Dock_Libraries} - ) - - install(TARGETS ${Plugin_Personalization_Dock_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-Update-------------------------- -if (BUILD_PLUGIN AND NOT DISABLE_UPDATE) - set(Update_Name dcc-update-plugin) - file(GLOB_RECURSE Update_SRCS - "src/plugin-update/window/*.cpp" - "src/plugin-update/operation/*.cpp" - "src/plugin-update/operation/qrc/update.qrc" - ) - - add_library(${Update_Name} MODULE - ${Update_SRCS} - ) - - set(Update_Includes - src/plugin-update/operation - src/plugin-update/window - ) - - set(Update_Libraries - ${Dcc_Widgets_Name} - Qt::Network - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - Qt::Multimedia - ${Dcc_Widgets_Name} - ) - - target_include_directories(${Update_Name} PUBLIC - ${Update_Includes} - ) - - target_link_libraries(${Update_Name} PRIVATE - ${Update_Libraries} - ) - - install(TARGETS ${Update_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() - -if (UNITTEST AND NOT DISABLE_UPDATE) - set(UT_Update_Name ut-dcc-update-plugin) - file(GLOB_RECURSE UT_UPDATE_SRC - "tests/plugin-update/*.cpp" - ) - - add_executable(${UT_Update_Name} - ${Update_SRCS} - ${UT_UPDATE_SRC} - ) - - target_compile_options(${UT_Update_Name} PRIVATE ${UT_COMPILER}) - - target_include_directories(${UT_Update_Name} PUBLIC - ${Update_Includes} - ) - - target_link_libraries(${UT_Update_Name} PRIVATE - ${Update_Libraries} - ${Test_Libraries} - ) - - gtest_discover_tests(${UT_Update_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) - -endif() -#--------------------------plugin-notification-------------------------- -if (BUILD_PLUGIN) - set(Notification_Name dcc-notification-plugin) - file(GLOB_RECURSE NOTIFICATION_SRCS - "src/plugin-notification/window/*.cpp" - "src/plugin-notification/operation/*.cpp" - "src/plugin-notification/operation/qrc/notification.qrc" - ) - - add_library(${Notification_Name} MODULE - ${NOTIFICATION_SRCS} - ) - - set(Notification_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Svg - Qt::Widgets - Qt::DBus - Qt::Concurrent - ) - - - target_link_libraries(${Notification_Name} PRIVATE - ${Notification_Libraries} - ) - - install(TARGETS ${Notification_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#-------------------------ut-dcc-notification-plugin------------------------- - -# FIXME: this ut is wrong!! -# if (UNITTEST) -# set(UT_Notification_Name ut-dcc-notification-plugin) -# file(GLOB_RECURSE UT_NOTIFICATION_SRCS -# "tests/plugin-notification/*.cpp" -# ) -# -# add_executable(${UT_Notification_Name} -# ${NOTIFICATION_SRCS} -# ${UT_NOTIFICATION_SRCS} -# ) -# -# # 用于测试覆盖率的编译条件 -# target_compile_options(${UT_Notification_Name} PRIVATE ${UT_COMPILER}) -# -# target_include_directories(${UT_Notification_Name} PUBLIC -# ${Notification_Includes} -# ) -# -# target_link_libraries(${UT_Notification_Name} PRIVATE -# ${Notification_Libraries} -# ${Test_Libraries} -# ) -# -# gtest_discover_tests(${UT_Notification_Name} WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) -# endif() - -#--------------------------plugin-privacy-------------------------- -#if (BUILD_PLUGIN) -# set(Privacy_Name dcc-privacy-plugin) -# file(GLOB_RECURSE Privacy_SRCS -# "src/plugin-privacy/window/*.cpp" -# "src/plugin-privacy/operation/*.cpp" -# "src/plugin-privacy/operation/qrc/privacy.qrc" -# ) - -# add_library(${Privacy_Name} MODULE -# ${Privacy_SRCS} -# ) - -# set(Pricacy_Includes -# ${DtkWidget_INCLUDE_DIRS} -# Qt5::Widgets -# Qt5::DBus -# Qt5::Concurrent -# src/plugin-privacy/operation -# src/plugin-privacy/window -# ) -# set(Privacy_Libraries -# ${Dcc_Widgets_Name} -# ${DtkWidget_LIBRARIES} -# Qt5::Widgets -# Qt5::DBus -# Qt5::Concurrent -# ${Dcc_Widgets_Name} -# ) -# target_include_directories(${Privacy_Name} PUBLIC -# ${Pricacy_Includes} -# ) - -# target_link_libraries(${Privacy_Name} PRIVATE -# ${Privacy_Libraries} -# ) - -# install(TARGETS ${Privacy_Name} DESTINATION ${MODULE_INSTALL_DIR}) -#endif() -#--------------------------plugin-touchscreen-------------------------- -if (BUILD_PLUGIN) - set(Touchscreen_Name dcc-touchscreen-plugin) - file(GLOB_RECURSE TOUCHSCREEN_SRCS - "src/plugin-touchscreen/*.cpp" - "src/plugin-touchscreen/operation/qrc/touchscreen.qrc" - ) - - add_library(${Touchscreen_Name} MODULE - ${TOUCHSCREEN_SRCS} - ) - - set(Touchscreen_Includes - src/plugin-touchscreen/window - src/plugin-touchscreen/operation - ) - - set(Touchscreen_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Qt::Widgets - Qt::DBus - Qt::Concurrent - Dtk::Widget - ) - - target_include_directories(${Touchscreen_Name} PUBLIC - ${Touchscreen_Includes} - ) - - target_link_libraries(${Touchscreen_Name} PRIVATE - ${Touchscreen_Libraries} - ) - - install(TARGETS ${Touchscreen_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-wacom-------------------------- -if (BUILD_PLUGIN) - set(Wacom_Name dcc-wacom-plugin) - file(GLOB_RECURSE Wacom_SRCS - "src/plugin-wacom/window/*.cpp" - "src/plugin-wacom/operation/*.cpp" - "src/plugin-wacom/operation/qrc/wacom.qrc" - ) - - add_library(${Wacom_Name} MODULE - ${Wacom_SRCS} - ) - - set(Pricacy_Includes - src/plugin-wacom/operation - src/plugin-wacom/window - ) - set(Wacom_Libraries - ${Dcc_Widgets_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - Qt::Concurrent - ${Dcc_Widgets_Name} - ) - target_include_directories(${Wacom_Name} PUBLIC - ${Pricacy_Includes} - ) - - target_link_libraries(${Wacom_Name} PRIVATE - ${Wacom_Libraries} - ) - - install(TARGETS ${Wacom_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() -#--------------------------plugin-adapterv20tov23-------------------------- -if (BUILD_PLUGIN) - set(AdapterV20toV23_Name dcc-adapterv20tov23-plugin) - file(GLOB_RECURSE ADAPTERV20TOV23_SRCS - "src/plugin-adapterv20tov23/*.cpp" - ) - - add_library(${AdapterV20toV23_Name} MODULE - ${ADAPTERV20TOV23_SRCS} - ) - - set(AdapterV20toV23_Libraries - ${Dcc_Widgets_Name} - ${Interface_Name} - Dtk::Widget - Qt::Widgets - Qt::DBus - ) - - - target_link_libraries(${AdapterV20toV23_Name} PRIVATE - ${AdapterV20toV23_Libraries} - ) - - install(TARGETS ${AdapterV20toV23_Name} DESTINATION ${MODULE_INSTALL_DIR}) -endif() diff --git a/dcc-old/include/interface/hlistmodule.h b/dcc-old/include/interface/hlistmodule.h deleted file mode 100644 index 96297e043b..0000000000 --- a/dcc-old/include/interface/hlistmodule.h +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef HLISTMODULE_H -#define HLISTMODULE_H -#include "interface/moduleobject.h" - -namespace DCC_NAMESPACE { -class HListModulePrivate; - -class HListModule : public ModuleObject -{ - Q_OBJECT -public: - explicit HListModule(QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName = {}, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QStringList &contentText, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QStringList &contentText, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QVariant &icon, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QString &description, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QString &description, - const QVariant &icon, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QString &description, - const QIcon &icon, - QObject *parent = nullptr); - explicit HListModule(const QString &name, - const QString &displayName, - const QString &description, - const QStringList &contentText, - const QVariant &icon, - QObject *parent = nullptr); - explicit HListModule(const ModuleInitContext &message, QObject *parent = nullptr); - ~HListModule() override; - - QWidget *page() override; - - inline DCC_MODULE_TYPE getClassID() const override { return HLISTLAYOUT; } - - DCC_DECLARE_PRIVATE(HListModule) -}; -} // namespace DCC_NAMESPACE -#endif // HLISTMODULE_H diff --git a/dcc-old/include/interface/moduleobject.h b/dcc-old/include/interface/moduleobject.h deleted file mode 100644 index 4c8539f86e..0000000000 --- a/dcc-old/include/interface/moduleobject.h +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_MODULEOBJECT_H -#define DCC_MODULEOBJECT_H - -#include "namespace.h" - -#include -#include -#include - -using DCC_MODULE_TYPE = uint32_t; - -#define DCC_MODULE_HIERARCHY_BIT 0x80000000 -#define DCC_MODULE_GROUP_BIT 0x40000000 -#define DCC_MODULE_LEAF_BIT 0x20000000 -#define DCC_MODULE_LAYOUT_BIT 0x10000000 - -#define DCC_MODULE_LISTVIEW_BIT 0x08000000 -#define DCC_MODULE_ITEM_BIT 0x04000000 -#define DCC_MODULE_SETTINGSGROUP_BIT 0x02000000 -#define DCC_MODULE_HORIZONTAL_BIT 0x01000000 -#define DCC_MODULE_VERTICAL_BIT 0x00800000 - -#define DCC_MODULE_MAIN_BIT 0x00040000 -#define DCC_MODULE_CUSTOM_BIT 0x00020000 - -namespace DCC_NAMESPACE { -enum : DCC_MODULE_TYPE { - HIERARCHY_OBJECT = DCC_MODULE_HIERARCHY_BIT, - LEAF_OBJECT = DCC_MODULE_LEAF_BIT, - LISTVIEW = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_LISTVIEW_BIT, - ITEM = DCC_MODULE_LEAF_BIT | DCC_MODULE_ITEM_BIT, - SETTINGSGROUP = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_SETTINGSGROUP_BIT, - HORIZONTAL = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_HORIZONTAL_BIT, - MAINLAYOUT = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_MAIN_BIT, - HLISTLAYOUT = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_HORIZONTAL_BIT - | DCC_MODULE_LISTVIEW_BIT, - VLISTLAYOUT = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_VERTICAL_BIT - | DCC_MODULE_LISTVIEW_BIT, - PAGELAYOUT = DCC_MODULE_GROUP_BIT | DCC_MODULE_LAYOUT_BIT | DCC_MODULE_VERTICAL_BIT, - CUSTOM_OBJECT = DCC_MODULE_CUSTOM_BIT, -}; - -class ModuleObjectPrivate; - -/** - * @brief ModuleInitContext 作为初始化传入的结构体,其中name和displayName 必须有数值 - * 这个结构体保存了所有初始化的信息 - */ - -struct ModuleInitContext -{ - QString name; - QString displayName; - QStringList contentText; - QVariant icon; - QString description; -}; - -/** - * @brief ModuleObject作为规范每个Module的接口,每个Module必须提供其基本的信息 - */ -class ModuleObject : public QObject -{ - Q_OBJECT - Q_PROPERTY(QString name READ name WRITE setName NOTIFY moduleDataChanged) - Q_PROPERTY(QString displayName READ displayName WRITE setDisplayName NOTIFY displayNameChanged) - Q_PROPERTY(QString description READ description WRITE setDescription NOTIFY moduleDataChanged) - Q_PROPERTY( - QStringList contentText READ contentText WRITE setContentText NOTIFY moduleDataChanged) - Q_PROPERTY(QVariant icon READ icon WRITE setIcon NOTIFY moduleDataChanged) - Q_PROPERTY(int badge READ badge WRITE setBadge NOTIFY moduleDataChanged) - - Q_PROPERTY(bool hidden READ isHidden WRITE setHidden NOTIFY stateChanged) - Q_PROPERTY(bool disabled READ isDisabled WRITE setDisabled NOTIFY stateChanged) - -public: - explicit ModuleObject(QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName = {}, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QStringList &contentText, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QStringList &contentText, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QVariant &icon, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QString &description, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QString &description, - const QVariant &icon, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QString &description, - const QIcon &icon, - QObject *parent = nullptr); - explicit ModuleObject(const QString &name, - const QString &displayName, - const QString &description, - const QStringList &contentText, - const QVariant &icon, - QObject *parent = nullptr); - explicit ModuleObject(const ModuleInitContext &message, QObject *parent = nullptr); - virtual ~ModuleObject(); - /** - * @brief activePage 激活并返回page - * @param autoActive 是否自动调用active - * @return ModuleObject隐藏时返回nullptr,否则返回page返回的QWidget * - */ - virtual QWidget *activePage(bool autoActive = true); - -public Q_SLOTS: - /** - * @brief 当进入模块时,active会被调用,如无需通知则可不实现 - */ - virtual void active(); - /** - * @brief 每次被调均需new新的QWidget - * @return 返回自定义页面 - * @warning - * page返回的widget生命周期只是对应窗口显示的时候,即模块切换时就会被析构。ModuleObject的生命周期是从控制中心启动到关闭 - */ - virtual QWidget *page(); - /** - * @brief 当离开模块时,deactive会被调用,如无需通知则可不实现 - */ - virtual void deactive(); - -public: - QString name() const; - QString displayName() const; - QString description() const; - QStringList contentText() const; - QVariant icon() const; - int badge() const; - - bool isHidden() const; - bool isVisible() const; - bool isDisabled() const; - bool isEnabled() const; - /** - * @brief 获取状态标志 - * @return 对应状态位是否 - */ - bool getFlagState(uint32_t flag) const; - uint32_t getFlag() const; - - // 扩展标志,在VList和Page布局中放在最下面,横向排列 - bool extra() const; - void setExtra(bool value = true); - - // 是否参与搜索,默认参与搜索 - bool noSearch() const; - void setNoSearch(bool noSearch = true); - - /** - * @brief currentModule 当前active的子项 - * 当前active的子项变化时会触发currentModuleChanged信号, - * page与子项相关时需要处理currentModuleChanged信号 - * @return 当前active的子项 - */ - ModuleObject *currentModule() const; - /** - * @brief defultModule 默认active的子项 - * 当某个页面被active时,会通过defultModule去active子项 - * 当返回为nullptr时,不再递归active子项 - * ModuleObject类默认处理为返回第一个未隐藏的子项 - * @return 默认active的子项 - */ - virtual ModuleObject *defultModule(); - -public Q_SLOTS: - void setHidden(bool hidden); - void setVisible(bool visible); - void setDisabled(bool disabled); - void setEnabled(bool enabled); - void trigger(); - - // 名称,作为每个模块的唯一标识,不可为空 - virtual void setName(const QString &name); - // 显示名称,如菜单的名称,页面的标题等,为空则不显示 - virtual void setDisplayName(const QString &displayName); - // 描述,如主菜单的描述信息 - virtual void setDescription(const QString &description); - // 上下文数据,参与搜索,只可用于终结点:DisplayName -> ContentText(one of it) - virtual void setContentText(const QStringList &contentText); - virtual void addContentText(const QString &contentText); - virtual void addContentText(const QStringList &contentText); - // 图标,如主菜单的图标 - // 字符串类型,支持DDciIcon\QVariant,优先作为DDciIcon处理 - virtual void setIcon(const QVariant &icon); - virtual void setIcon(const QIcon &icon); - // 主菜单中的角标, 默认为0不显示,大于0显示 - virtual void setBadge(int badge); - /** - * @brief setFlagState 设置状态标志,状态标志共32位,高16位为预留,低16位可根据需要设置 - * @param flag 需要设置的状态位 - * @param state true 置位 false 复位 - */ - virtual void setFlagState(uint32_t flag, bool state); - /** - * @brief setCurrentModule 设置当前active的子项 - * @param child 当前active的子项 - */ - void setCurrentModule(ModuleObject *child); - -Q_SIGNALS: - /** - * @brief 基本信息改变后发送此信号 - */ - void moduleDataChanged(); - /** - * @brief displayName改变后发送此信号 - */ - void displayNameChanged(const QString &displayName); - /** - * @brief stateChanged 状态标志变化 (可见、禁用等) - * @param flag - * @param state - */ - void stateChanged(uint32_t flag, bool state); - /** - * @brief childStateChanged 子项状态标志变化 (可见、禁用等) - * @param child 子项 - * @param flag 标志 - * @param state 变化后值 - */ - void childStateChanged(ModuleObject *const child, uint32_t flag, bool state); - /** - * @brief 删除child前触发 - */ - void removedChild(ModuleObject *const module); - /** - * @brief 插入child后触发 - */ - void insertedChild(ModuleObject *const module); - /** - * @brief childrens() 改变后必须发送此信号 - */ - void childrenSizeChanged(const int size); - /** - * @brief trigger触发该信号,框架收到信号会切换到该ModuleObject页 - */ - void triggered(); - /** - * @brief currentModuleChanged 当前激活的子项改变时会触发此信号 - * @param currentModule 当前激活的子项 - */ - void currentModuleChanged(ModuleObject *currentModule); - - void visibleChanged(); - -public: - ModuleObject *getParent(); - /** - * @brief 搜索子项,使用广度搜索 - * @param child 子项 - * @return 子项所在的层数,返回0表示module自己,-1表示未搜索到 - */ - int findChild(ModuleObject *const child); - - static int findChild(ModuleObject *const module, ModuleObject *const child); - - inline bool hasChildrens() { return !childrens().isEmpty(); } - - /** - * @brief 子项,不可直接使用QList进行增删改操作,应使用appendChild、removeChild、insertChild - * @return 子项列表 - */ - const QList &childrens(); - ModuleObject *children(const int index) const; - int getChildrenSize() const; - - virtual void appendChild(ModuleObject *const module); - virtual void removeChild(ModuleObject *const module); - virtual void removeChild(const int index); - virtual void insertChild(QList::iterator before, ModuleObject *const module); - virtual void insertChild(const int index, ModuleObject *const module); - - //! Returns current ModuleObject version - static unsigned GetCurrentVersion(); - /** - * @brief IsVisible 返回module是否显示,判断了配置项和程序设置项 - * @param module - * @return - */ - static bool IsVisible(DCC_NAMESPACE::ModuleObject *const module); - static bool IsHidden(DCC_NAMESPACE::ModuleObject *const module); - /** - * @brief IsHiddenFlag 判断标志是否为隐藏标志 - * @param flag 标志 - * @return true 有隐藏标志位 false 没有隐藏标志位 - */ - static bool IsHiddenFlag(uint32_t flag); - /** - * @brief IsEnabled 返回module是否可用,判断了配置项和程序设置项 - * @param module - * @return - */ - static bool IsEnabled(DCC_NAMESPACE::ModuleObject *const module); - static bool IsDisabled(DCC_NAMESPACE::ModuleObject *const module); - /** - * @brief IsDisabledFlag 判断标志是否为禁用标志 - * @param flag 标志 - * @return true 有禁用标志位 false 没有禁用标志位 - */ - static bool IsDisabledFlag(uint32_t flag); - - inline virtual DCC_MODULE_TYPE getClassID() const { return HIERARCHY_OBJECT; } - -private: - static int findChild(ModuleObject *const module, ModuleObject *const child, const int num); - DCC_DECLARE_PRIVATE(ModuleObject) -}; - -} // namespace DCC_NAMESPACE - -#endif // DCC_MODULEOBJECT_H diff --git a/dcc-old/include/interface/namespace.h b/dcc-old/include/interface/namespace.h deleted file mode 100644 index 119eb4a040..0000000000 --- a/dcc-old/include/interface/namespace.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -// clang-format off -#ifndef DCC_NAMESPACE_H -#define DCC_NAMESPACE_H - -#define DCC_NAMESPACE dccV23 - -//#define } using namespace DCC_NAMESPACE; - -//#define namespace DCC_NAMESPACE { namespace DCC_NAMESPACE { -//#define } } -//////////////////////////////// -#define DCC_DECLARE_PRIVATE(Class) \ -private: \ - QScopedPointer d_ptr##Class; \ - Q_DECLARE_PRIVATE_D(d_ptr##Class, Class)\ - Q_DISABLE_COPY(Class) - -#define DCC_INIT_PRIVATE(Class) d_ptr##Class(new Class##Private(this)) - -#endif // DCC_NAMESPACE_H -// clang-format on diff --git a/dcc-old/include/interface/pagemodule.h b/dcc-old/include/interface/pagemodule.h deleted file mode 100644 index b359a28ba0..0000000000 --- a/dcc-old/include/interface/pagemodule.h +++ /dev/null @@ -1,93 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef PAGEMODULE_H -#define PAGEMODULE_H -#include "interface/moduleobject.h" - -#define DCC_PAGEMODULE_MAX_WIDTH 1120 - -namespace DCC_NAMESPACE { -class PageModulePrivate; - -class PageModule : public ModuleObject -{ - Q_OBJECT -public: - explicit PageModule(QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName = {}, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QStringList &contentText, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QStringList &contentText, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QVariant &icon, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QString &description, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QString &description, - const QVariant &icon, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QString &description, - const QIcon &icon, - QObject *parent = nullptr); - explicit PageModule(const QString &name, - const QString &displayName, - const QString &description, - const QStringList &contentText, - const QVariant &icon, - QObject *parent = nullptr); - explicit PageModule(const ModuleInitContext &message, QObject *parent = nullptr); - ~PageModule() override; - - int spacing() const; - void setSpacing(const int spacing); - void getContentsMargins(int *left, int *top, int *right, int *bottom) const; - void setContentsMargins(int left, int top, int right, int bottom); - int maximumWidth() const; - void setMaximumWidth(int maxw); - int minimumWidth() const; - void setMinimumWidth(int minw); - // 无滚动条 - bool noScroll(); - void setNoScroll(bool value = true); - // 无下方弹簧 - bool noStretch(); - void setNoStretch(bool value = true); - - void appendChild(ModuleObject *const module) override; - void insertChild(QList::iterator before, ModuleObject *const module) override; - void insertChild(const int index, ModuleObject *const module) override; - void removeChild(ModuleObject *const module) override; - void removeChild(const int index) override; - - void appendChild(ModuleObject *const module, - int stretch, - Qt::Alignment alignment = Qt::Alignment()); - void insertChild(QList::iterator before, - ModuleObject *const module, - int stretch, - Qt::Alignment alignment = Qt::Alignment()); - void insertChild(const int index, - ModuleObject *const module, - int stretch, - Qt::Alignment alignment = Qt::Alignment()); - - QWidget *page() override; - - DCC_DECLARE_PRIVATE(PageModule) -}; -} // namespace DCC_NAMESPACE -#endif // PAGEMODULE_H diff --git a/dcc-old/include/interface/plugininterface.h b/dcc-old/include/interface/plugininterface.h deleted file mode 100644 index 06531edb62..0000000000 --- a/dcc-old/include/interface/plugininterface.h +++ /dev/null @@ -1,54 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_PLUGININTERFACE_H -#define DCC_PLUGININTERFACE_H - -#include "namespace.h" - -#include - -namespace DCC_NAMESPACE { -class ModuleObject; - -class PluginInterface : public QObject -{ - Q_OBJECT -public: - PluginInterface(QObject *parent = nullptr) - : QObject(parent) - { - } - - virtual ~PluginInterface() { } - - /** - * @brief 插件最基本的元素由 ModuleObject 组成,所以最少有一个 ModuleObject - * @brief 插件子项列表 - */ - virtual ModuleObject *module() = 0; - - /** - * @brief 标识插件信息 - * @return 插件名称 - */ - virtual QString name() const { return QString(); } - - /** - * @brief 插件必须知道其需要跟随的父ModuleObject的url ,默认为空则为一级插件 - * @return 跟随的父ModuleObject的url - */ - virtual QString follow() const { return QString(); } - - /** - * @brief 插件位置索引,相同索引则按加载顺序进行排序,先加载的往后顺延,默认追加到最后 - * @return 位置索引或前一个name - */ - virtual QString location() const { return QString(); } -}; - -} // namespace DCC_NAMESPACE - -Q_DECLARE_INTERFACE(DCC_NAMESPACE::PluginInterface, "org.deepin.dde.ControlCenter.Plugin/1.4") - -#endif // DCC_PLUGININTERFACE_H diff --git a/dcc-old/include/interface/vlistmodule.h b/dcc-old/include/interface/vlistmodule.h deleted file mode 100644 index 5f7d0b6937..0000000000 --- a/dcc-old/include/interface/vlistmodule.h +++ /dev/null @@ -1,61 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef VLISTMODULE_H -#define VLISTMODULE_H -#include "interface/moduleobject.h" - -namespace DCC_NAMESPACE { -class VListModulePrivate; - -class VListModule : public ModuleObject -{ - Q_OBJECT -public: - explicit VListModule(QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName = {}, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QStringList &contentText, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QStringList &contentText, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QVariant &icon, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QString &description, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QString &description, - const QVariant &icon, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QString &description, - const QIcon &icon, - QObject *parent = nullptr); - explicit VListModule(const QString &name, - const QString &displayName, - const QString &description, - const QStringList &contentText, - const QVariant &icon, - QObject *parent = nullptr); - explicit VListModule(const ModuleInitContext &message, QObject *parent = nullptr); - - ~VListModule() override; - - QWidget *page() override; - - inline DCC_MODULE_TYPE getClassID() const override { return VLISTLAYOUT; } - - DCC_DECLARE_PRIVATE(VListModule) -}; -} // namespace DCC_NAMESPACE -#endif // VLISTMODULE_H diff --git a/dcc-old/include/widgets/accessibleinterface.h b/dcc-old/include/widgets/accessibleinterface.h deleted file mode 100644 index 6b3cdd60b7..0000000000 --- a/dcc-old/include/widgets/accessibleinterface.h +++ /dev/null @@ -1,531 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ACCESSIBLEINTERFACE_H -#define ACCESSIBLEINTERFACE_H - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define SEPARATOR "_" - -inline QString getAccessibleName(QWidget *w, QAccessible::Role r, const QString &fallback) -{ - const QString lowerFallback = fallback.toLower(); - // 避免重复生成 - static QMap< QObject *, QString > objnameMap; - if (!objnameMap[w].isEmpty()) - return objnameMap[w]; - - static QMap< QAccessible::Role, QList< QString > > accessibleMap; - QString oldAccessName = w->accessibleName().toLower(); - oldAccessName.replace(SEPARATOR, ""); - - // 按照类型添加固定前缀 - QMetaEnum metaEnum = QMetaEnum::fromType(); - QByteArray prefix = metaEnum.valueToKeys(r); - switch (r) { - case QAccessible::Form: prefix = "Form"; break; - case QAccessible::Button: prefix = "Btn"; break; - case QAccessible::StaticText: prefix = "Label"; break; - case QAccessible::EditableText: prefix = "Editable"; break; - case QAccessible::Slider: prefix = "Slider"; break; - default: break; - } - - // 再加上标识 - QString accessibleName = QString::fromLatin1(prefix) + SEPARATOR; - accessibleName += oldAccessName.isEmpty() ? lowerFallback : oldAccessName; - // 检查名称是否唯一 - if (accessibleMap[r].contains(accessibleName)) { - // 获取编号,然后+1 - int pos = accessibleName.indexOf(SEPARATOR); - int id = accessibleName.mid(pos + 1).toInt(); - - QString newAccessibleName; - do { - // 一直找到一个不重复的名字 - newAccessibleName = accessibleName + SEPARATOR + QString::number(++id); - } while (accessibleMap[r].contains(newAccessibleName)); - - accessibleMap[r].append(newAccessibleName); - objnameMap.insert(w, newAccessibleName); - - QObject::connect(w, &QWidget::destroyed, [ = ] (QObject *obj) { // 对象销毁后移除占用名称 - objnameMap.remove(obj); - accessibleMap[r].removeOne(newAccessibleName); - }); - return newAccessibleName; - } else { - accessibleMap[r].append(accessibleName); - objnameMap.insert(w, accessibleName); - - QObject::connect(w, &QWidget::destroyed, [ = ] (QObject *obj) { // 对象销毁后移除占用名称 - objnameMap.remove(obj); - accessibleMap[r].removeOne(accessibleName); - }); - return accessibleName; - } -} - -// 公共的功能 -#define FUNC_CREATE(classname,accessibletype,accessdescription) Accessible##classname(classname *w) \ - : QAccessibleWidget(w,accessibletype,#classname)\ - , m_w(w)\ - , m_description(accessdescription)\ - {}\ - -#define FUNC_TEXT(classname,accessiblename) inline QString Accessible##classname::text(QAccessible::Text t) const{\ - switch (t) {\ - case QAccessible::Name:\ - return getAccessibleName(m_w, this->role(), accessiblename);\ - case QAccessible::Description:\ - return m_description;\ - default:\ - return QString();\ - }\ - }\ - -// button控件特有功能 -#define FUNC_ACTIONNAMES(classname) inline QStringList Accessible##classname::actionNames() const{\ - if(!m_w->isEnabled())\ - return QStringList();\ - return QStringList() << pressAction()<< showMenuAction();\ - }\ - -#define FUNC_DOACTION(classname) inline void Accessible##classname::doAction(const QString &actionName){\ - if(actionName == pressAction())\ - {\ - QPointF localPos = m_w->geometry().center();\ - QMouseEvent event(QEvent::MouseButtonPress,localPos,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);\ - qApp->sendEvent(m_w,&event);\ - QMouseEvent eventr(QEvent::MouseButtonRelease,localPos,Qt::LeftButton,Qt::LeftButton,Qt::NoModifier);\ - qApp->sendEvent(m_w,&eventr);\ - }\ - else if(actionName == showMenuAction())\ - {\ - QPointF localPos = m_w->geometry().center();\ - QMouseEvent event(QEvent::MouseButtonPress,localPos,Qt::RightButton,Qt::RightButton,Qt::NoModifier);\ - qApp->sendEvent(m_w,&event);\ - }\ - }\ - -// QLABEL控件特有功能 -#define FUNC_TEXT_(classname) inline QString Accessible##classname::text(int startOffset, int endOffset) const{\ - Q_UNUSED(startOffset)\ - Q_UNUSED(endOffset)\ - return m_w->text();\ - }\ - -#define FUNC_CHILD_LABLE(classname) inline QAccessibleInterface *Accessible##classname::child(int index) const{\ - return QAccessibleWidget::child(index);\ - }\ - -// EDITABLE控件特有功能 -#define FUNC_DELETETEXT(classname) inline void Accessible##classname::deleteText(int startOffset, int endOffset) {\ - m_w->setText(m_w->text().remove(startOffset, endOffset - startOffset));\ - }\ - -#define FUNC_INSERTTEXT(classname) inline void Accessible##classname::insertText(int startOffset, const QString &text) {\ - m_w->setText(m_w->text().insert(startOffset, text));\ - }\ - -#define FUNC_REPLACETEXT(classname) inline void Accessible##classname::replaceText(int startOffset, int endOffset, const QString &text) {\ - m_w->setText(m_w->text().replace(startOffset, endOffset - startOffset, text));\ - }\ - -#define FUNC_CHILD_EDITABLE(classname) QAccessibleInterface *Accessible##classname::child(int index) const{\ - return nullptr;\ - }\ - -#define FUNC_SELECTION(classname) inline void Accessible##classname::selection(int selectionIndex, int *startOffset, int *endOffset) const {\ - m_w->setSelection(*startOffset, *endOffset);\ - *startOffset = *endOffset = 0;\ - if (selectionIndex != 0)\ - return;\ - *startOffset = m_w->selectionStart();\ - *endOffset = *startOffset + m_w->selectedText().count();\ - }\ - -#define FUNC_SELECTIONCOUNT(classname) inline int Accessible##classname::selectionCount() const {\ - return m_w->hasSelectedText() ? 1 : 0;\ - }\ - -#define FUNC_ADDSELECTION(classname) inline void Accessible##classname::addSelection(int startOffset, int endOffset) {\ - setSelection(0, startOffset, endOffset);\ - }\ - -#define FUNC_REMOVESELECTION(classname) inline void Accessible##classname::removeSelection(int selectionIndex) {\ - if (selectionIndex != 0)\ - return;\ - m_w->deselect();\ - }\ - -#define FUNC_SETSELECTION(classname) inline void Accessible##classname::setSelection(int selectionIndex, int startOffset, int endOffset) {\ - if (selectionIndex != 0)\ - return;\ - m_w->setSelection(startOffset, endOffset - startOffset);\ - }\ - -#define FUNC_CURORPOSITION(classname) inline int Accessible##classname::cursorPosition() const {\ - return m_w->cursorPosition();\ - }\ - -#define FUNC_SETCURORPOSITION(classname) inline void Accessible##classname::setCursorPosition(int position) {\ - m_w->setCursorPosition(position);\ - }\ - -#define FUNC_TEXT_LineEdit(classname) inline QString Accessible##classname::text(int startOffset, int endOffset) const{\ - if (startOffset > endOffset)\ - return QString();\ - if (m_w->echoMode() != QLineEdit::Normal)\ - return QString();\ - return m_w->text().mid(startOffset, endOffset - startOffset);\ - }\ - -#define FUNC_TEXTBEFOREOFFSET(classname) QString Accessible##classname::textBeforeOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\ - if (m_w->echoMode() != QLineEdit::Normal) {\ - *startOffset = *endOffset = -1;\ - return QString();\ - }\ - if (offset == -2)\ - offset = cursorPosition();\ - return QAccessibleTextInterface::textBeforeOffset(offset, boundaryType, startOffset, endOffset);\ - }\ - -#define FUNC_TEXTAFTEROFFSET(classname) QString Accessible##classname::textAfterOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\ - if (lineEdit()->echoMode() != QLineEdit::Normal) {\ - *startOffset = *endOffset = -1;\ - return QString();\ - }\ - if (offset == -2)\ - offset = cursorPosition();\ - return QAccessibleTextInterface::textAfterOffset(offset, boundaryType, startOffset, endOffset);\ - }\ - -#define FUNC_TEXTATOFFSET(classname) QString Accessible##classname::textAtOffset(int offset, QAccessible::TextBoundaryType boundaryType, int *startOffset, int *endOffset) const {\ - if (m_w->echoMode() != QLineEdit::Normal) {\ - *startOffset = *endOffset = -1;\ - return QString();\ - }\ - if (offset == -2)\ - offset = cursorPosition();\ - return QAccessibleTextInterface::textAtOffset(offset, boundaryType, startOffset, endOffset);\ - }\ - -#define FUNC_CHARACTERCOUNT(classname) inline int Accessible##classname::characterCount() const {\ - return m_w->text().count();\ - }\ - -#define FUNC_CHARACTERRECT(classname) inline QRect Accessible##classname::characterRect(int offset) const {\ - Q_UNUSED(offset)\ - return QRect();\ - }\ - -#define FUNC_OFFSETATPOINT(classname) inline int Accessible##classname::offsetAtPoint(const QPoint &point) const {\ - QPoint p = m_w->mapFromGlobal(point);\ - return m_w->cursorPositionAt(p);\ - }\ - -#define FUNC_SCROLLTOSUBSTRING(classname) inline void Accessible##classname::scrollToSubstring(int startIndex, int endIndex) {\ - m_w->setCursorPosition(endIndex);\ - m_w->setCursorPosition(startIndex);\ - }\ - -#define FUNC_ATTRIBUTES(classname) inline QString Accessible##classname::attributes(int offset, int *startOffset, int *endOffset) const {\ - *startOffset = *endOffset = offset;\ - return QString();\ - }\ - -// Slider控件特有功能 -#define FUNC_CURRENTVALUE(classname) inline QVariant Accessible##classname::currentValue() const{\ - return m_w->value();\ - }\ - -#define FUNC_SETCURRENTVALUE(classname) inline void Accessible##classname::setCurrentValue(const QVariant &value){\ - return m_w->setValue(value.toInt());\ - }\ - -#define FUNC_MAXMUMVALUE(classname) inline QVariant Accessible##classname::maximumValue() const{\ - return QVariant(m_w->maximum());\ - }\ - -#define FUNC_FUNC_MINIMUMVALUE(classname) inline QVariant Accessible##classname::minimumValue() const{\ - return QVariant(m_w->minimum());\ - }\ - -#define FUNC_FUNC_MINIMUMSTEPSIZE(classname) inline QVariant Accessible##classname::minimumStepSize() const{\ - return QVariant(m_w->singleStep());\ - }\ - -#define SET_FORM_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget\ - {\ - public:\ - FUNC_CREATE(classname,QAccessible::Form,accessdescription)\ - QString text(QAccessible::Text t) const override;\ - void *interface_cast(QAccessible::InterfaceType t) override{\ - switch (t) {\ - case QAccessible::ActionInterface:\ - return static_cast(this);\ - default:\ - return nullptr;\ - }\ - }\ - private:\ - classname *m_w;\ - QString m_description;\ - };\ - FUNC_TEXT(classname,accessiblename)\ - -#define SET_BUTTON_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget\ - {\ - public:\ - FUNC_CREATE(classname,QAccessible::Button,accessdescription)\ - QString text(QAccessible::Text t) const override;\ - void *interface_cast(QAccessible::InterfaceType t) override{\ - switch (t) {\ - case QAccessible::ActionInterface:\ - return static_cast(this);\ - default:\ - return nullptr;\ - }\ - }\ - QStringList actionNames() const override;\ - void doAction(const QString &actionName) override;\ - private:\ - classname *m_w;\ - QString m_description;\ - };\ - FUNC_TEXT(classname,accessiblename)\ - FUNC_ACTIONNAMES(classname)\ - FUNC_DOACTION(classname)\ - -#define SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,type,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleTextInterface\ - {\ - public:\ - FUNC_CREATE(classname,type,accessdescription)\ - QString text(QAccessible::Text t) const override;\ - void *interface_cast(QAccessible::InterfaceType t) override{\ - switch (t) {\ - case QAccessible::ActionInterface:\ - return static_cast(this);\ - case QAccessible::TextInterface:\ - return static_cast(this);\ - default:\ - return nullptr;\ - }\ - }\ - QAccessibleInterface *child(int index) const override;\ - QString text(int startOffset, int endOffset) const override;\ - void selection(int selectionIndex, int *startOffset, int *endOffset) const override {\ - Q_UNUSED(selectionIndex)\ - Q_UNUSED(startOffset)\ - Q_UNUSED(endOffset)\ - }\ - int selectionCount() const override { return 0; }\ - void addSelection(int startOffset, int endOffset) override {\ - Q_UNUSED(startOffset)\ - Q_UNUSED(endOffset)\ - }\ - void removeSelection(int selectionIndex) override {\ - Q_UNUSED(selectionIndex)\ - }\ - void setSelection(int selectionIndex, int startOffset, int endOffset) override {\ - Q_UNUSED(selectionIndex)\ - Q_UNUSED(startOffset)\ - Q_UNUSED(endOffset)\ - }\ - int cursorPosition() const override { return 0; }\ - void setCursorPosition(int position) override {\ - Q_UNUSED(position)\ - }\ - int characterCount() const override { return 0; }\ - QRect characterRect(int offset) const override { \ - Q_UNUSED(offset)\ - return QRect();\ - }\ - int offsetAtPoint(const QPoint &point) const override { \ - Q_UNUSED(point)\ - return 0; \ - }\ - void scrollToSubstring(int startIndex, int endIndex) override {\ - Q_UNUSED(startIndex)\ - Q_UNUSED(endIndex)\ - }\ - QString attributes(int offset, int *startOffset, int *endOffset) const override {\ - Q_UNUSED(startOffset)\ - Q_UNUSED(offset)\ - Q_UNUSED(endOffset)\ - return QString(); \ - }\ - private:\ - classname *m_w;\ - QString m_description;\ - };\ - FUNC_TEXT(classname,accessiblename)\ - FUNC_TEXT_(classname)\ - -#define SET_SLIDER_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleValueInterface\ - {\ - public:\ - FUNC_CREATE(classname,QAccessible::Slider,accessdescription)\ - QString text(QAccessible::Text t) const override;\ - void *interface_cast(QAccessible::InterfaceType t) override{\ - switch (t) {\ - case QAccessible::ActionInterface:\ - return static_cast(this);\ - case QAccessible::ValueInterface:\ - return static_cast(this);\ - default:\ - return nullptr;\ - }\ - }\ - QVariant currentValue() const override;\ - void setCurrentValue(const QVariant &value) override;\ - QVariant maximumValue() const override;\ - QVariant minimumValue() const override;\ - QVariant minimumStepSize() const override { return QVariant(); }\ - private:\ - classname *m_w;\ - QString m_description;\ - };\ - FUNC_TEXT(classname,accessiblename)\ - FUNC_CURRENTVALUE(classname)\ - FUNC_SETCURRENTVALUE(classname)\ - FUNC_MAXMUMVALUE(classname)\ - FUNC_FUNC_MINIMUMVALUE(classname)\ - -#define SET_EDITABLE_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,accessdescription) class Accessible##classname : public QAccessibleWidget, public QAccessibleEditableTextInterface, public QAccessibleTextInterface\ - {\ - public:\ - FUNC_CREATE(classname,QAccessible::EditableText,accessdescription)\ - QString text(QAccessible::Text t) const override;\ - QAccessibleInterface *child(int index) const override { \ - Q_UNUSED(index) \ - return nullptr; \ - }\ - void *interface_cast(QAccessible::InterfaceType t) override{\ - switch (t) {\ - case QAccessible::ActionInterface:\ - return static_cast(this);\ - case QAccessible::TextInterface:\ - return static_cast(this);\ - case QAccessible::EditableTextInterface:\ - return static_cast(this);\ - default:\ - return nullptr;\ - }\ - }\ - QAccessible::State state() const override {\ - QAccessible::State state;\ - state.editable = 1;\ - return state;\ - }\ - QString text(int startOffset, int endOffset) const override;\ - void selection(int selectionIndex, int *startOffset, int *endOffset) const override;\ - int selectionCount() const override;\ - void addSelection(int startOffset, int endOffset) override;\ - void removeSelection(int selectionIndex) override;\ - void setSelection(int selectionIndex, int startOffset, int endOffset) override;\ - int cursorPosition() const override;\ - void setCursorPosition(int position) override;\ - int characterCount() const override;\ - QRect characterRect(int offset) const override;\ - int offsetAtPoint(const QPoint &point) const override;\ - void scrollToSubstring(int startIndex, int endIndex) override;\ - QString attributes(int offset, int *startOffset, int *endOffset) const override;\ - void insertText(int offset, const QString &text) override;\ - void deleteText(int startOffset, int endOffset) override;\ - void replaceText(int startOffset, int endOffset, const QString &text) override;\ - private:\ - classname *m_w;\ - QString m_description;\ - };\ - FUNC_TEXT(classname,accessiblename)\ - FUNC_TEXT_LineEdit(classname)\ - FUNC_DELETETEXT(classname)\ - FUNC_INSERTTEXT(classname)\ - FUNC_REPLACETEXT(classname)\ - FUNC_SELECTION(classname)\ - FUNC_SELECTIONCOUNT(classname)\ - FUNC_ADDSELECTION(classname)\ - FUNC_REMOVESELECTION(classname)\ - FUNC_SETSELECTION(classname)\ - FUNC_CURORPOSITION(classname)\ - FUNC_SETCURORPOSITION(classname)\ - FUNC_CHARACTERCOUNT(classname)\ - FUNC_CHARACTERRECT(classname)\ - FUNC_OFFSETATPOINT(classname)\ - FUNC_SCROLLTOSUBSTRING(classname)\ - FUNC_ATTRIBUTES(classname)\ - -#define USE_ACCESSIBLE(classnamestring,classname) if (classnamestring == QLatin1String(#classname) && object && object->isWidgetType())\ - {\ - interface = new Accessible##classname(static_cast(object));\ - }\ - -// [指定objectname]---适用同一个类,但objectname不同的情况 -#define USE_ACCESSIBLE_BY_OBJECTNAME(classnamestring,classname,objectname) if (classnamestring == QLatin1String(#classname) && object && (object->objectName() == objectname) && object->isWidgetType())\ - {\ - interface = new Accessible##classname(static_cast(object));\ - }\ - -/*******************************************简化使用*******************************************/ - -class AccessibleFactoryBase -{ -public: - explicit AccessibleFactoryBase() {} - virtual ~AccessibleFactoryBase() {} - virtual QAccessibleInterface* createObject(QObject *object) = 0; -}; - -class AccessibleFactoryManager -{ -public: - static AccessibleFactoryBase * RegisterAccessibleFactory(const char *factoryName,AccessibleFactoryBase *factory); -}; - -#define FactoryMacro(Key,ClassName)\ -class FactoryAccessible##ClassName :public AccessibleFactoryBase\ -{\ - private:\ - static AccessibleFactoryBase* s_Accessible##ClassName##instance;\ - public:\ - virtual QAccessibleInterface* createObject(QObject *object) override\ - { return new Accessible##ClassName(static_cast(object));}\ -};\ -inline AccessibleFactoryBase* FactoryAccessible##ClassName::s_Accessible##ClassName##instance = AccessibleFactoryManager::RegisterAccessibleFactory(Key, new FactoryAccessible##ClassName()); - -///////////////////////////////////////////////// -#define SET_FORM_ACCESSIBLE(classname,accessiblename) SET_FORM_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\ -FactoryMacro(#classname, classname) - -#define SET_BUTTON_ACCESSIBLE(classname,accessiblename) SET_BUTTON_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\ -FactoryMacro(#classname, classname) - -#define SET_LABEL_ACCESSIBLE(classname,accessiblename) SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,QAccessible::StaticText,"") \ -FUNC_CHILD_LABLE(classname)\ -FactoryMacro(#classname, classname) - -#define SET_DTK_EDITABLE_ACCESSIBLE(classname,accessiblename) SET_LABEL_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,QAccessible::EditableText,"") \ -FUNC_CHILD_EDITABLE(classname)\ -FactoryMacro(#classname, classname) - -#define SET_SLIDER_ACCESSIBLE(classname,accessiblename) SET_SLIDER_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\ -FactoryMacro(#classname, classname) - -#define SET_EDITABLE_ACCESSIBLE(classname,accessiblename) SET_EDITABLE_ACCESSIBLE_WITH_DESCRIPTION(classname,accessiblename,"")\ -FactoryMacro(#classname, classname) -///////////////////////////////////////////////// - -#endif // ACCESSIBLEINTERFACE_H diff --git a/dcc-old/include/widgets/buttontuple.h b/dcc-old/include/widgets/buttontuple.h deleted file mode 100644 index c2a27054e1..0000000000 --- a/dcc-old/include/widgets/buttontuple.h +++ /dev/null @@ -1,48 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include -#include - -class QPushButton; - -namespace DCC_NAMESPACE -{ -/** - * @brief ButtonTuple 提供一个按钮组合,可以通过leftButton和rightButton来访问按钮对象 - */ -class ButtonTuple : public QWidget -{ - Q_OBJECT -public: - enum ButtonType { - Normal = 0, // 默认按钮,无任何特殊处理 - Save = 1, // 使用DSuggestButton实现 - Delete = 2, // 使用DWarningButton实现 - }; - explicit ButtonTuple(ButtonType type = Normal, QWidget *parent = nullptr); - - void setButtonType(const ButtonType type); - QPushButton *leftButton(); - QPushButton *rightButton(); - - /** - * @brief 删除两个按钮间的空隙 - */ - void removeSpacing(); - -private: - void initUI(); - -Q_SIGNALS: - void leftButtonClicked(); - void rightButtonClicked(); - -private: - QPushButton *m_leftButton; - QPushButton *m_rightButton; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/include/widgets/comboxwidget.h b/dcc-old/include/widgets/comboxwidget.h deleted file mode 100644 index c72b631c46..0000000000 --- a/dcc-old/include/widgets/comboxwidget.h +++ /dev/null @@ -1,78 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" -#include - -QT_BEGIN_NAMESPACE -class QStringList; -class QLabel; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class AlertComboBox; - -class ComboxWidget : public SettingsItem -{ - Q_OBJECT - -public: - explicit ComboxWidget(QFrame *parent = nullptr); - explicit ComboxWidget(const QString &title, QFrame *parent = nullptr); - explicit ComboxWidget(QWidget *widget, QFrame *parent = nullptr); - - void setComboxOption(const QStringList &options); - void setCurrentText(const QString &curText); - void setCurrentIndex(const int index); - void setTitle(const QString &title); - - AlertComboBox *comboBox(); - -Q_SIGNALS: - void onIndexChanged(int index); - void onSelectChanged(const QString &selected); - void dataChanged(const QVariant &data); - void clicked(); - -protected: - void mouseReleaseEvent(QMouseEvent *event) override; - void resizeEvent(QResizeEvent *event) override; - -private: - QWidget *m_leftWidget; - AlertComboBox *m_switchComboBox; - QLabel *m_titleLabel; - QString m_str; -}; - -class AlertComboBox : public QComboBox -{ - Q_OBJECT - - Q_PROPERTY(bool isWarning READ isWarning WRITE setIsWarning) - -public: - explicit AlertComboBox(QWidget *parent = Q_NULLPTR); - ~AlertComboBox() override; - void setIsWarning(bool isWarning); - bool isWarning(); - bool eventFilter(QObject *o, QEvent *e) override; - -Q_SIGNALS: - void clicked(); - -protected Q_SLOTS: - void onValueChange(const QString &text); - -protected: - void paintEvent(QPaintEvent *e) override; - -private: - bool m_isWarning; -}; - -} diff --git a/dcc-old/include/widgets/dccdbusinterface.h b/dcc-old/include/widgets/dccdbusinterface.h deleted file mode 100644 index 13707a50f7..0000000000 --- a/dcc-old/include/widgets/dccdbusinterface.h +++ /dev/null @@ -1,44 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCCDBUSINTERFACE_H -#define DCCDBUSINTERFACE_H - -#include "interface/namespace.h" - -#include - -#include - -namespace DCC_NAMESPACE { - -class DCCDBusInterfacePrivate; - -class D_DECL_DEPRECATED_X("Use DDBusInteface") DCCDBusInterface : public QDBusAbstractInterface -{ - Q_OBJECT - -public: - explicit DCCDBusInterface(const QString &service, - const QString &path, - const QString &interface = QString(), - const QDBusConnection &connection = QDBusConnection::sessionBus(), - QObject *parent = nullptr); - virtual ~DCCDBusInterface() override; - - bool serviceValid() const; - QString suffix() const; - void setSuffix(const QString &suffix); - - QVariant property(const char *propname); - void setProperty(const char *propname, const QVariant &value); - -Q_SIGNALS: - void serviceValidChanged(const bool valid) const; - - DCC_DECLARE_PRIVATE(DCCDBusInterface) -}; - -} // namespace DCC_NAMESPACE - -#endif // DCCDBUSINTERFACE_H diff --git a/dcc-old/include/widgets/dcclistview.h b/dcc-old/include/widgets/dcclistview.h deleted file mode 100644 index 8b9143f474..0000000000 --- a/dcc-old/include/widgets/dcclistview.h +++ /dev/null @@ -1,21 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCCLISTVIEW_H -#define DCCLISTVIEW_H -#include "interface/namespace.h" - -#include - -namespace DCC_NAMESPACE { -class DCCListView : public DTK_WIDGET_NAMESPACE::DListView -{ - Q_OBJECT -public: - explicit DCCListView(QWidget *parent = nullptr); - -protected slots: - void updateGeometries() override; -}; -} -#endif // DCCLISTVIEW_H diff --git a/dcc-old/include/widgets/dccslider.h b/dcc-old/include/widgets/dccslider.h deleted file mode 100644 index b39a9ab535..0000000000 --- a/dcc-old/include/widgets/dccslider.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include -namespace DCC_NAMESPACE { - -class DCCSlider : public DTK_WIDGET_NAMESPACE::DSlider -{ - Q_OBJECT -public: - enum SliderType { - Normal, - Vernier, - Progress - }; - -public: - explicit DCCSlider(SliderType type = Normal, QWidget *parent = nullptr); - explicit DCCSlider(Qt::Orientation orientation, QWidget *parent = nullptr); - - inline DCCSlider *slider() const { return const_cast(this); } - QSlider *qtSlider(); - - void setType(SliderType type); - void setRange(int min, int max); - void setTickPosition(QSlider::TickPosition tick); - void setTickInterval(int ti); - void setSliderPosition(int Position); - void setAnnotations(const QStringList &annotations); - void setOrientation(Qt::Orientation orientation); - //当value大于0时,在slider中插入一条分隔线 - void setSeparateValue(int value = 0); - -protected: - void wheelEvent(QWheelEvent *e); - void paintEvent(QPaintEvent *e); -private: - QSlider::TickPosition tickPosition = QSlider::TicksBelow; - int m_separateValue; -}; - -} diff --git a/dcc-old/include/widgets/detailinfoitem.h b/dcc-old/include/widgets/detailinfoitem.h deleted file mode 100644 index 01fa2279db..0000000000 --- a/dcc-old/include/widgets/detailinfoitem.h +++ /dev/null @@ -1,51 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" -#include - -DWIDGET_BEGIN_NAMESPACE -class DLabel; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { - -inline const QString titleColor = QStringLiteral("#0082fa"); -inline const QString grayColor = QStringLiteral("#526a7f"); - -inline constexpr int titleFontSize = 14; -inline constexpr int dateFontSize = 12; -inline constexpr int detailFontSize = 8; -inline constexpr int linkFontSize = 10; - -class DetailInfoItem: public SettingsItem -{ - Q_OBJECT -public: - explicit DetailInfoItem(QWidget *parent = 0); - - void initUi(); - - void setDate(QString date); - void setTitle(QString title); - void setExplaintTitle(QString title); - void setLinkData(QString data); - void setDetailData(QString data); - -private Q_SLOTS: - void onThemeChanged(); - -private: - Dtk::Widget::DLabel *m_dateLabel; - Dtk::Widget::DLabel *m_explainTitle; - Dtk::Widget::DLabel *m_linkDataLabel; - Dtk::Widget::DLabel *m_dataLable; - Dtk::Widget::DLabel *m_linkLable; - Dtk::Widget::DLabel *m_title; -}; - -} - diff --git a/dcc-old/include/widgets/horizontalmodule.h b/dcc-old/include/widgets/horizontalmodule.h deleted file mode 100644 index bbb2b3b742..0000000000 --- a/dcc-old/include/widgets/horizontalmodule.h +++ /dev/null @@ -1,42 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef HORIZONTALMODULE_H -#define HORIZONTALMODULE_H - -#include "interface/moduleobject.h" -namespace DCC_NAMESPACE { -class HorizontalModulePrivate; -class HorizontalModule : public ModuleObject -{ - Q_OBJECT -public: - enum StretchType { - NoStretch = 0, - LeftStretch = 1, - RightStretch = 2, - AllStretch = LeftStretch | RightStretch, - }; - explicit HorizontalModule(const QString &name, const QString &displayName, QObject *parent = nullptr); - ~HorizontalModule() override; - - void setStretchType(StretchType stretchType); - void setSpacing(const int spacing); - - void appendChild(ModuleObject *const module) override; - void insertChild(QList::iterator before, ModuleObject *const module) override; - void insertChild(const int index, ModuleObject *const module) override; - void removeChild(ModuleObject *const module) override; - void removeChild(const int index) override; - - void appendChild(ModuleObject *const module, int stretch, Qt::Alignment alignment = Qt::Alignment()); - void insertChild(QList::iterator before, ModuleObject *const module, int stretch, Qt::Alignment alignment = Qt::Alignment()); - void insertChild(const int index, ModuleObject *const module, int stretch, Qt::Alignment alignment = Qt::Alignment()); - - QWidget *page() override; - inline DCC_MODULE_TYPE getClassID() const override { return HORIZONTAL; } - - DCC_DECLARE_PRIVATE(HorizontalModule) -}; -} -#endif // HORIZONTALMODULE_H diff --git a/dcc-old/include/widgets/itemmodule.h b/dcc-old/include/widgets/itemmodule.h deleted file mode 100644 index 9e2867bef3..0000000000 --- a/dcc-old/include/widgets/itemmodule.h +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ITEMMODULE_H -#define ITEMMODULE_H -#include "interface/moduleobject.h" - -namespace DCC_NAMESPACE { -class ItemModulePrivate; -class ItemModule : public ModuleObject -{ - Q_OBJECT -public: - explicit ItemModule(QObject *parent = nullptr); - ItemModule(const QString &name, const QString &displayName, bool isTitle = true); - - template - ItemModule(const QString &name, const QString &displayName, FunT callback, bool leftVisible = true) - : ItemModule(name, displayName, false) - { - setLeftVisible(leftVisible); - setRightWidget(callback); - } - - template - ItemModule(const QString &name, const QString &displayName, classT *receiver, WidgetT *(classT::*callback)(ModuleObject *), bool leftVisible = true) - : ItemModule(name, displayName, false) - { - setLeftVisible(leftVisible); - setRightWidget(receiver, callback); - } - - template - ItemModule(const QString &name, const QString &displayName, classT *receiver, WidgetT *(classT::*callback)(), bool leftVisible = true) - : ItemModule(name, displayName, false) - { - setLeftVisible(leftVisible); - setRightWidget(receiver, callback); - } - - ~ItemModule() override; - - void setTitleItem(bool isTitle); - void setBackground(bool has); - void setWordWrap(bool on); - bool wordWrap() const; - void setLeftVisible(bool visible); - bool clickable() const; - void setClickable(const bool clickable); - - template - void setRightWidget(FunT callback) - { - auto fun = [](FunT callback, ModuleObject *module) { - return (callback)(module); - }; - setCallback(std::bind(fun, callback, this)); - } - - template - void setRightWidget(classT *receiver, WidgetT *(classT::*callback)(ModuleObject *)) - { - auto fun = [](classT *receiver, WidgetT *(classT::*callback)(ModuleObject *), ModuleObject *module) { - return (receiver->*callback)(module); - }; - setCallback(std::bind(fun, receiver, callback, this)); - } - - template - void setRightWidget(classT *receiver, WidgetT *(classT::*callback)()) - { - auto fun = [](classT *receiver, WidgetT *(classT::*callback)()) { - return (receiver->*callback)(); - }; - setCallback(std::bind(fun, receiver, callback)); - } - - QWidget *page() override; - inline DCC_MODULE_TYPE getClassID() const override { return ITEM; } - -Q_SIGNALS: - void clicked(QWidget *widget); - -private: - void setCallback(std::function callback); - - DCC_DECLARE_PRIVATE(ItemModule) -}; -} -#endif // ITEMMODULE_H diff --git a/dcc-old/include/widgets/lineeditwidget.h b/dcc-old/include/widgets/lineeditwidget.h deleted file mode 100644 index 58dd0522fe..0000000000 --- a/dcc-old/include/widgets/lineeditwidget.h +++ /dev/null @@ -1,76 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include - -DWIDGET_BEGIN_NAMESPACE -class DLineEdit; -DWIDGET_END_NAMESPACE - -class QLabel; -class QLineEdit; -class QHBoxLayout; - -namespace DCC_NAMESPACE { - -class ErrorTip : public Dtk::Widget::DArrowRectangle { - Q_OBJECT -public: - explicit ErrorTip(QWidget *parent = nullptr); - - void setText(QString text); - void clear(); - bool isEmpty() const; - -public Q_SLOTS: - void appearIfNotEmpty(); - -private: - QLabel *m_label; -}; - -class LineEditWidget : public SettingsItem -{ - Q_OBJECT - -public: - explicit LineEditWidget(QFrame *parent = nullptr); - explicit LineEditWidget(bool isPasswordMode, QWidget *parent = nullptr); - - QLineEdit *textEdit() const; - inline Dtk::Widget::DLineEdit *dTextEdit() const { return m_edit; } - QString text() const; - void setTitleVisible(const bool visible); - void addRightWidget(QWidget *widget); - void setReadOnly(const bool state); - void setIsErr(const bool err = true); - - bool isShowAlert() { return m_errTip->isVisible(); } - void showAlertMessage(const QString &message); - void hideAlertMessage(); - - inline QLabel *label() { return m_title; } - -public Q_SLOTS: - void setTitle(const QString &title); - void setText(const QString &text); - void setPlaceholderText(const QString &text); - -protected: - void mousePressEvent(QMouseEvent *e); - -protected: - QHBoxLayout *m_mainLayout; - -private: - QLabel *m_title; - Dtk::Widget::DLineEdit *m_edit; - ErrorTip *m_errTip; -}; - -} diff --git a/dcc-old/include/widgets/listviewmodule.h b/dcc-old/include/widgets/listviewmodule.h deleted file mode 100644 index baa308d81f..0000000000 --- a/dcc-old/include/widgets/listviewmodule.h +++ /dev/null @@ -1,26 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef LISTVIEWMODULE_H -#define LISTVIEWMODULE_H - -#include "interface/moduleobject.h" -namespace DCC_NAMESPACE { -class ListViewModulePrivate; -class ListViewModule : public ModuleObject -{ - Q_OBJECT -public: - explicit ListViewModule(const QString &name, const QString &displayName, QObject *parent = nullptr); - ~ListViewModule() override; - - QWidget *page() override; - inline DCC_MODULE_TYPE getClassID() const override { return LISTVIEW; } - -Q_SIGNALS: - void clicked(ModuleObject *module); - - DCC_DECLARE_PRIVATE(ListViewModule) -}; -} -#endif // LISTVIEWMODULE_H diff --git a/dcc-old/include/widgets/modulelistmodel.h b/dcc-old/include/widgets/modulelistmodel.h deleted file mode 100644 index 6a2d44c9be..0000000000 --- a/dcc-old/include/widgets/modulelistmodel.h +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MODULELISTMODEL_H -#define MODULELISTMODEL_H - -#include "interface/moduleobject.h" - -#include - -namespace DCC_NAMESPACE { -class ModuleListModelPrivate; -class ModuleListModel : public QAbstractItemModel -{ - Q_OBJECT -public: - explicit ModuleListModel(ModuleObject *parent = nullptr); - ~ModuleListModel() override; - - // Basic functionality: - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - Qt::ItemFlags flags(const QModelIndex &index) const override; - - DCC_DECLARE_PRIVATE(ModuleListModel) -}; -} -#endif // ModuleListModel_H diff --git a/dcc-old/include/widgets/moduleobjectitem.h b/dcc-old/include/widgets/moduleobjectitem.h deleted file mode 100644 index 5944e75a18..0000000000 --- a/dcc-old/include/widgets/moduleobjectitem.h +++ /dev/null @@ -1,38 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MODULEOBJECTITEM_H -#define MODULEOBJECTITEM_H - -#include "interface/moduleobject.h" - -#include -#include - -namespace DCC_NAMESPACE { -class ModuleObjectItemPrivate; -class ModuleObjectItem : public ModuleObject -{ - Q_OBJECT -public: - explicit ModuleObjectItem(const QString &name, const QString &displayName, QObject *parent = nullptr); - ~ModuleObjectItem() override; - - void setRightIcon(DTK_WIDGET_NAMESPACE::DStyle::StandardPixmap st, int index = -1); - void setRightIcon(const QString &icon, int index = -1); - void setRightIcon(const QIcon &icon, int index = -1); - void setRightText(const QString &text, int index = -1); - DTK_WIDGET_NAMESPACE::DViewItemAction *getRightItem(int index = -1); - void update(); - - virtual void setData(int role, const QVariant &value); - virtual QVariant data(int role) const; - inline DCC_MODULE_TYPE getClassID() const override { return ITEM; } - -Q_SIGNALS: - void clicked(); - - DCC_DECLARE_PRIVATE(ModuleObjectItem) -}; -} -#endif // MODULEOBJECTITEM_H diff --git a/dcc-old/include/widgets/settingsgroup.h b/dcc-old/include/widgets/settingsgroup.h deleted file mode 100644 index fa3e6bcf36..0000000000 --- a/dcc-old/include/widgets/settingsgroup.h +++ /dev/null @@ -1,65 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include - -#include - -DWIDGET_BEGIN_NAMESPACE -class DBackgroundGroup; -DWIDGET_END_NAMESPACE - -class QVBoxLayout; - -namespace DCC_NAMESPACE { - -class SettingsItem; -class SettingsHeaderItem; - -class SettingsGroup : public QFrame -{ - Q_OBJECT - -public: - enum BackgroundStyle { - ItemBackground = 0, - GroupBackground, - NoneBackground - }; - - explicit SettingsGroup(QFrame *parent = nullptr, BackgroundStyle bgStyle = ItemBackground); - explicit SettingsGroup(const QString &title, QFrame *parent = nullptr); - ~SettingsGroup(); - - SettingsHeaderItem *headerItem() const { return m_headerItem; } - void setHeaderVisible(const bool visible); - - SettingsItem *getItem(int index); - void insertWidget(QWidget *widget); - void insertItem(const int index, SettingsItem *item); - void appendItem(SettingsItem *item); - void appendItem(SettingsItem *item, BackgroundStyle bgStyle); - void removeItem(SettingsItem *item); - void moveItem(SettingsItem *item, const int index); - void setSpacing(const int spacing); - - int itemCount() const; - void clear(); - QVBoxLayout *getLayout() const { return m_layout; } - - void setBackgroundStyle(BackgroundStyle bgStyle); - BackgroundStyle backgroundStyle() const { return m_bgStyle; } - -protected: - void resizeEvent(QResizeEvent *event) override; -private: - BackgroundStyle m_bgStyle{ItemBackground}; - QVBoxLayout *m_layout; - SettingsHeaderItem *m_headerItem; - DTK_WIDGET_NAMESPACE::DBackgroundGroup *m_bggroup{nullptr}; -}; - -} diff --git a/dcc-old/include/widgets/settingsgroupmodule.h b/dcc-old/include/widgets/settingsgroupmodule.h deleted file mode 100644 index 709110f5fa..0000000000 --- a/dcc-old/include/widgets/settingsgroupmodule.h +++ /dev/null @@ -1,30 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SETTINGSGROUPMODULE_H -#define SETTINGSGROUPMODULE_H - -#include "interface/moduleobject.h" -#include "settingsgroup.h" -namespace DCC_NAMESPACE { -class SettingsGroupModulePrivate; -class SettingsGroupModule : public ModuleObject -{ - Q_OBJECT -public: - explicit SettingsGroupModule(const QString &name, const QString &displayName, QObject *parent = nullptr); - ~SettingsGroupModule() override; - - void setHeaderVisible(const bool visible); - void setSpacing(const int spacing); - void setBackgroundStyle(SettingsGroup::BackgroundStyle bgStyle); - SettingsGroup::BackgroundStyle backgroundStyle() const; - void setSizePolicy(QSizePolicy::Policy hor, QSizePolicy::Policy ver); - - QWidget *page() override; - inline DCC_MODULE_TYPE getClassID() const override { return SETTINGSGROUP; } - - DCC_DECLARE_PRIVATE(SettingsGroupModule) -}; -} -#endif // SETTINGSGROUPMODULE_H diff --git a/dcc-old/include/widgets/settingshead.h b/dcc-old/include/widgets/settingshead.h deleted file mode 100644 index 3958c7bebb..0000000000 --- a/dcc-old/include/widgets/settingshead.h +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include - -DWIDGET_BEGIN_NAMESPACE -class DCommandLinkButton; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class TitleLabel; -class SettingsHead : public SettingsItem -{ - Q_OBJECT - -public: - enum State { - Edit, - Cancel - }; - -public: - explicit SettingsHead(QFrame *parent = nullptr); - - void setTitle(const QString &title); - void setEditEnable(bool state = true); - -public Q_SLOTS: - void toEdit(); - void toCancel(); - -Q_SIGNALS: - void editChanged(bool edit); - -private Q_SLOTS: - void refershButton(); - void onClicked(); - -private: - TitleLabel *m_title; - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_edit; - - State m_state; -}; - -} diff --git a/dcc-old/include/widgets/settingsheaderitem.h b/dcc-old/include/widgets/settingsheaderitem.h deleted file mode 100644 index 62a500b5dc..0000000000 --- a/dcc-old/include/widgets/settingsheaderitem.h +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -class QHBoxLayout; - -namespace DCC_NAMESPACE { - -class TitleLabel; -class SettingsHeaderItem : public SettingsItem -{ - Q_OBJECT - -public: - explicit SettingsHeaderItem(QWidget *parent = 0); - - TitleLabel *textLabel() const { return m_headerText; } - QHBoxLayout *layout() const { return m_mainLayout; } - - void setTitle(const QString &title); - void setRightWidget(QWidget *widget); - -private: - QHBoxLayout *m_mainLayout; - TitleLabel *m_headerText; -}; - -} diff --git a/dcc-old/include/widgets/settingsitem.h b/dcc-old/include/widgets/settingsitem.h deleted file mode 100644 index 00126f6646..0000000000 --- a/dcc-old/include/widgets/settingsitem.h +++ /dev/null @@ -1,44 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include -namespace DCC_NAMESPACE { - -class SettingsItem : public QFrame -{ - Q_OBJECT - Q_PROPERTY(bool isErr READ isErr DESIGNABLE true SCRIPTABLE true) - -public: - explicit SettingsItem(QWidget *parent = nullptr); - - bool isErr() const; - virtual void setIsErr(const bool err = true); - - void addBackground(); - void removeBackground(); - - bool clickable() const; - void setClickable(const bool clickable); - -Q_SIGNALS: - void clicked(QWidget *widget); - -protected: - void resizeEvent(QResizeEvent *event) override; - void paintEvent(QPaintEvent *event) override; - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - -private: - bool m_isErr; - bool m_hasBack; - bool m_hover; - bool m_clickable; -}; - -} diff --git a/dcc-old/include/widgets/switchwidget.h b/dcc-old/include/widgets/switchwidget.h deleted file mode 100644 index 22de01bba3..0000000000 --- a/dcc-old/include/widgets/switchwidget.h +++ /dev/null @@ -1,73 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" -#include -#include - -DWIDGET_BEGIN_NAMESPACE -class DSwitchButton; -DWIDGET_END_NAMESPACE - -QT_BEGIN_NAMESPACE -class QHBoxLayout; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class SwitchLabel : public QLabel -{ - Q_OBJECT - -public: - explicit SwitchLabel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); - inline QSize actualSize() { return m_actualSize; } - -protected: - void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; - -private: - QSize m_actualSize; - QString m_sourceText; -}; - -class SwitchWidget : public SettingsItem -{ - Q_OBJECT - -public: - // explicit SwitchWidget(QWidget *parent = nullptr); - explicit SwitchWidget(const QString &title, QWidget *parent = nullptr); - explicit SwitchWidget(QWidget *parent = nullptr, QWidget *widget = nullptr); - - void setChecked(const bool checked = true); - QString title() const; - void setTitle(const QString &title); - bool checked() const; - - void setLeftWidget(QWidget *widget); - QWidget *leftWidget() const { return m_leftWidget; } - QHBoxLayout* getMainLayout() { return m_mainLayout; } - -public: - inline DTK_WIDGET_NAMESPACE::DSwitchButton *switchButton() const { return m_switchBtn; } - -Q_SIGNALS: - void checkedChanged(const bool checked) const; - void clicked(); - -protected: - void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - -private: - void init(); - - QWidget *m_leftWidget; - Dtk::Widget::DSwitchButton *m_switchBtn; - QHBoxLayout *m_mainLayout; -}; - -} diff --git a/dcc-old/include/widgets/titledslideritem.h b/dcc-old/include/widgets/titledslideritem.h deleted file mode 100644 index 0d9ea3e8f7..0000000000 --- a/dcc-old/include/widgets/titledslideritem.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -class QLabel; -class QSlider; -class QHBoxLayout; - -namespace DCC_NAMESPACE { - -class DCCSlider; - -class TitledSliderItem : public SettingsItem -{ - Q_OBJECT -public: - TitledSliderItem(QString title = QString(), QWidget *parent = nullptr); - - DCCSlider *slider() const; - void setAnnotations(const QStringList &annotations); - - QString valueLiteral() const; - void setValueLiteral(const QString &valueLiteral); - - QString title() const; - void setTitle(const QString &title); - - void setLeftIcon(const QIcon &leftIcon); - void setRightIcon(const QIcon &rightIcon); - void setIconSize(const QSize &size); - QHBoxLayout *getbottomlayout() { return m_bottomLayout; } - -private: - QLabel *m_titleLabel; - QLabel *m_valueLabel; - DCCSlider *m_slider; - QString m_valueLiteral; - QHBoxLayout *m_bottomLayout; -}; - -} diff --git a/dcc-old/include/widgets/titlelabel.h b/dcc-old/include/widgets/titlelabel.h deleted file mode 100644 index 8e8e211f16..0000000000 --- a/dcc-old/include/widgets/titlelabel.h +++ /dev/null @@ -1,23 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include - -namespace DCC_NAMESPACE -{ - -class TitleLabel : public Dtk::Widget::DLabel -{ - Q_OBJECT -public: - TitleLabel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); - TitleLabel(const QString &text, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); - -protected: - bool event(QEvent *e) override; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/include/widgets/titlevalueitem.h b/dcc-old/include/widgets/titlevalueitem.h deleted file mode 100644 index ae8e660db2..0000000000 --- a/dcc-old/include/widgets/titlevalueitem.h +++ /dev/null @@ -1,93 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include - -QT_BEGIN_NAMESPACE -class QPushButton; -class QLabel; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE -{ - -class ItemTitleTipsLabel; - -class ResizeEventFilter : public QObject -{ - Q_OBJECT -public: - explicit ResizeEventFilter(QObject* parent = nullptr); -protected: - bool eventFilter(QObject *watched, QEvent *event); -}; - -class TitleValueItem : public SettingsItem -{ - Q_OBJECT - -public: - explicit TitleValueItem(QFrame *parent = nullptr); - ~TitleValueItem() override; - void setTitle(const QString& title); - void setValue(const QString& value); - void setWordWrap(const bool enable); - QString value() const; - void setValueAligment(const Qt::Alignment aligment); - void setValueBackground(bool showBackground); - -protected: - void resizeEvent(QResizeEvent *event) override; - -private: - QLabel* m_title; - ItemTitleTipsLabel *m_value; -}; - -class TitleAuthorizedItem: public SettingsItem -{ - Q_OBJECT - -public: - TitleAuthorizedItem(QFrame *parent = nullptr); - void setTitle(const QString& title); - void setValue(const QString& value); - void setWordWrap(bool enable); - void setButtonText(const QString &str); - void setValueForegroundRole(const QColor &color); - void setVisable(bool value); - -Q_SIGNALS: - //传递button的点击信号 - void clicked(); - -private: - QLabel* m_title; - DTK_WIDGET_NAMESPACE::DTipLabel *m_value; - QPushButton *m_pActivatorBtn; -}; - -class ItemTitleTipsLabel : public DTK_WIDGET_NAMESPACE::DTipLabel -{ - Q_OBJECT - -public: - explicit ItemTitleTipsLabel(const QString &text = QString(), QWidget *parent = nullptr); - ~ItemTitleTipsLabel() override; - void addBackground(); - void removeBackground(); - bool hasBackground() const; - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - bool m_hasBackground; -}; - -} diff --git a/dcc-old/include/widgets/utils.h b/dcc-old/include/widgets/utils.h deleted file mode 100644 index 4e37a52761..0000000000 --- a/dcc-old/include/widgets/utils.h +++ /dev/null @@ -1,80 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef UTILS_H -#define UTILS_H -#include "interface/namespace.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DCORE_USE_NAMESPACE - -inline const QMargins ZeroMargins(0, 0, 0, 0); - -inline constexpr int ComboxWidgetHeight = 48; -inline constexpr int SwitchWidgetHeight = 36; -inline constexpr int ComboxTitleWidth = 110; - -inline constexpr qint32 ActionIconSize=30;//大图标角标大小 -inline constexpr qint32 ActionListSize=26;//list图标角标大小 - -template -T valueByQSettings(const QStringList& configFiles, - const QString& group, - const QString& key, - const QVariant& failback) -{ - for (const QString& path : configFiles) { - QSettings settings(path, QSettings::IniFormat); - if (!group.isEmpty()) { - settings.beginGroup(group); - } - - const QVariant& v = settings.value(key); - if (v.isValid()) { - T t = v.value(); - return t; - } - } - - return failback.value(); -} - -inline QPixmap loadPixmap(const QString &path) -{ - qreal ratio = 1.0; - QPixmap pixmap; - - const qreal devicePixelRatio = qApp->devicePixelRatio(); - - if (!qFuzzyCompare(ratio, devicePixelRatio)) { - QImageReader reader; - reader.setFileName(qt_findAtNxFile(path, devicePixelRatio, &ratio)); - if (reader.canRead()) { - reader.setScaledSize(reader.size() * (devicePixelRatio / ratio)); - pixmap = QPixmap::fromImage(reader.read()); - pixmap.setDevicePixelRatio(devicePixelRatio); - } - } else { - pixmap.load(path); - } - - return pixmap; -} - - -#endif // UTILS_H diff --git a/dcc-old/include/widgets/widgetmodule.h b/dcc-old/include/widgets/widgetmodule.h deleted file mode 100644 index 6da44220eb..0000000000 --- a/dcc-old/include/widgets/widgetmodule.h +++ /dev/null @@ -1,57 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef WIDGETMODULE_H -#define WIDGETMODULE_H -#include "interface/moduleobject.h" - -class QWidget; - -template -class WidgetModule : public DCC_NAMESPACE::ModuleObject -{ -public: - template - WidgetModule(const QString &name, const QString &displayName, classT *receiver, void (classT::*callback)(T *), QObject *parent = nullptr) - : DCC_NAMESPACE::ModuleObject(name, displayName, parent) - { - connect(receiver, callback); - } - template - WidgetModule(const QString &name, const QString &displayName, FunT callback, QObject *parent = nullptr) - : DCC_NAMESPACE::ModuleObject(name, displayName, parent) - { - auto fun = [](QWidget *w, FunT callback) { - T *tWidget = static_cast(w); - (callback)(tWidget); - }; - m_callback = std::bind(fun, std::placeholders::_1, callback); - } - WidgetModule(const QString &name = QString(), const QString &displayName = QString(), QObject *parent = nullptr) - : DCC_NAMESPACE::ModuleObject(name, displayName, parent) - , m_callback(nullptr) - { - } - template - void connect(classT *receiver, void (classT::*callback)(T *)) - { - auto fun = [](QWidget *w, classT *receiver, void (classT::*callback)(T *)) { - T *tWidget = static_cast(w); - (receiver->*callback)(tWidget); - }; - m_callback = std::bind(fun, std::placeholders::_1, receiver, callback); - } - - virtual QWidget *page() override - { - QWidget *widget = new T(); - if (m_callback) - m_callback(widget); - return widget; - } - -private: - std::function m_callback; -}; - -#endif // WIDGETMODULE_H diff --git a/dcc-old/misc/translate_desktop2ts.sh b/dcc-old/misc/translate_desktop2ts.sh deleted file mode 100755 index 51479c3529..0000000000 --- a/dcc-old/misc/translate_desktop2ts.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -DESKTOP_SOURCE_FILE=org.deepin.dde.control-center.desktop -DESKTOP_TS_DIR=../translations/desktop/ - -/usr/bin/deepin-desktop-ts-convert desktop2ts $DESKTOP_SOURCE_FILE $DESKTOP_TS_DIR diff --git a/dcc-old/misc/translate_generation.sh b/dcc-old/misc/translate_generation.sh deleted file mode 100755 index 8e5588adf1..0000000000 --- a/dcc-old/misc/translate_generation.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/bash -# this file is used to auto-generate .qm file from .ts file. -# author: shibowen at linuxdeepin.com -export PATH=/usr/lib/qt5/bin:$PATH -ts_list=(`ls translations/*.ts`) - -for ts in "${ts_list[@]}" -do - printf "\nprocess ${ts}\n" - lrelease "${ts}" -done diff --git a/dcc-old/src/dcc-agent/main.c b/dcc-old/src/dcc-agent/main.c deleted file mode 100644 index fd7f7df7db..0000000000 --- a/dcc-old/src/dcc-agent/main.c +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2024 - 2027 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include -#include -#include -#include -#include -#include - -int main(int argc, char *argv[]) -{ - int (*main_func)(int, char **); - char *error; - bool isOldDcc = false; - if (argc >= 1 && strcmp(argv[argc - 1], "n") == 0) { - isOldDcc = false; - argc = argc - 1; - } else if (argc >= 1 && strcmp(argv[argc - 1], "o") == 0) { - isOldDcc = true; - argc = argc - 1; - } - - // 加载共享库 - char *dccSoPath = isOldDcc ? OLD_DCC_SO_PATH : NEW_DCC_SO_PATH; - char *dccPath = isOldDcc ? OLD_DCC_PATH : NEW_DCC_PATH; - if (!dlopen(dccSoPath, RTLD_LAZY | RTLD_GLOBAL)) { - fprintf(stderr, "%s\n", dlerror()); - } - dlerror(); - void *handle = dlopen(dccPath, RTLD_LAZY); - if (!handle) { - fprintf(stderr, "%s\n", dlerror()); - return 1; - } - - // 清除之前可能存在的错误 - dlerror(); - - // 查找函数 - *(void **)(&main_func) = dlsym(handle, "main"); - - // 检查错误 - if ((error = dlerror()) != NULL) { - fprintf(stderr, "%s\n", error); - dlclose(handle); - return 1; - } - - // 使用函数 - int ret = (*main_func)(argc, argv); - - // 关闭共享库 - dlclose(handle); - return ret; -} diff --git a/dcc-old/src/frame/accessible.h b/dcc-old/src/frame/accessible.h deleted file mode 100644 index fc6c0d927b..0000000000 --- a/dcc-old/src/frame/accessible.h +++ /dev/null @@ -1,75 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "widgets/accessibleinterface.h" -#include "src/widgets/accessiblefactoryinterface.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -/**************************************************************************************/ -// Qt控件 -SET_FORM_ACCESSIBLE(QWidget, m_w->objectName().isEmpty() ? "widget" : m_w->objectName()) -SET_BUTTON_ACCESSIBLE(QPushButton, m_w->text().isEmpty() ? "qpushbutton" : m_w->text()) -SET_EDITABLE_ACCESSIBLE(QLineEdit, m_w->text().isEmpty() ? "qlineedit" : m_w->text()) -SET_BUTTON_ACCESSIBLE(QToolButton, m_w->text().isEmpty() ? "qtoolbutton" : m_w->text()) -SET_SLIDER_ACCESSIBLE(QSlider, "qslider") -SET_FORM_ACCESSIBLE(QMenu, "qmenu") -SET_FORM_ACCESSIBLE(QFrame, "qframe") -SET_FORM_ACCESSIBLE(QListView, "qlistview") -SET_FORM_ACCESSIBLE(QListWidget, "qlistwidget") -SET_FORM_ACCESSIBLE(QScrollArea, "qscrollarea") -SET_FORM_ACCESSIBLE(QScrollBar, "QScrollBar") -SET_FORM_ACCESSIBLE(QComboBox, "QComboBox") -SET_FORM_ACCESSIBLE(QMainWindow, "QMainWindow") -SET_LABEL_ACCESSIBLE(QLabel, m_w->text().isEmpty() ? "qlabel" : m_w->text()) - -class AccessibleFactory : public AccessibleFactoryInterface -{ -public: - explicit AccessibleFactory() - : AccessibleFactoryInterface() - { - AccessibleFactoryInterface::RegisterInstance(this); - } - virtual ~AccessibleFactory() { } - virtual AccessibleFactoryBase *registerAccessibleFactory(const char *factoryName, AccessibleFactoryBase *factory) override - { - if (!m_factoryMap.contains(factoryName)) - m_factoryMap.insert(factoryName, factory); - return factory; - } - QAccessibleInterface *createObject(const QString &classname, QObject *object) - { - return m_factoryMap.contains(classname) ? m_factoryMap.value(classname)->createObject(object) : nullptr; - } - -private: - QMap m_factoryMap; -}; - -inline QAccessibleInterface *accessibleFactory(const QString &classname, QObject *object) -{ - QAccessibleInterface *interface = nullptr; - static AccessibleFactory * s_accessibleFactory = nullptr; - if (!s_accessibleFactory) - s_accessibleFactory = new AccessibleFactory(); - - if (object && object->isWidgetType()) - interface = s_accessibleFactory->createObject(classname.split("::").last(),object); - - return interface; -} diff --git a/dcc-old/src/frame/completerview.cpp b/dcc-old/src/frame/completerview.cpp deleted file mode 100644 index 6ce6c0ba24..0000000000 --- a/dcc-old/src/frame/completerview.cpp +++ /dev/null @@ -1,39 +0,0 @@ -// SPDX-FileCopyrightText: 2024 - 2027 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "completerview.h" - -DGUI_USE_NAMESPACE - -namespace DCC_NAMESPACE { -const int MARGIN = 8; -const int COMPACT_MARGIN = 4; - -CompleterView::CompleterView(QWidget *parent) - : DListView(parent) - , m_sizeMode(DGuiApplicationHelper::instance()->sizeMode()) -{ - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::sizeModeChanged, this, [this](DGuiApplicationHelper::SizeMode sizeMode) { - if (sizeMode == m_sizeMode) - return; - - m_sizeMode = sizeMode; - updateViewportMargins(); - }); - - setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy::ScrollBarAlwaysOff); - updateViewportMargins(); -} - -void CompleterView::updateViewportMargins() -{ - (m_sizeMode == DGuiApplicationHelper::CompactMode) ? setViewportMargins(0, COMPACT_MARGIN, 0, COMPACT_MARGIN) : setViewportMargins(0, MARGIN, 0, MARGIN); -} - -int CompleterView::margin() const -{ - const static int compactOffset = -1; - const static int normalOffset = 2; - return m_sizeMode == DGuiApplicationHelper::CompactMode ? COMPACT_MARGIN + compactOffset : MARGIN + normalOffset; -} -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/frame/completerview.h b/dcc-old/src/frame/completerview.h deleted file mode 100644 index 6d19d0ad7d..0000000000 --- a/dcc-old/src/frame/completerview.h +++ /dev/null @@ -1,24 +0,0 @@ -// SPDX-FileCopyrightText: 2024 - 2027 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef COMPLETERVIEW_H -#define COMPLETERVIEW_H -#include "interface/namespace.h" - -#include -#include - -namespace DCC_NAMESPACE { -class CompleterView : public Dtk::Widget::DListView -{ -public: - CompleterView(QWidget *parent = nullptr); - void updateViewportMargins(); - int margin() const; - -private: - Dtk::Gui::DGuiApplicationHelper::SizeMode m_sizeMode; -}; -} // namespace DCC_NAMESPACE - -#endif // COMPLETERVIEW_H diff --git a/dcc-old/src/frame/controlcenterdbusadaptor.cpp b/dcc-old/src/frame/controlcenterdbusadaptor.cpp deleted file mode 100644 index 180132712c..0000000000 --- a/dcc-old/src/frame/controlcenterdbusadaptor.cpp +++ /dev/null @@ -1,134 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "controlcenterdbusadaptor.h" -#include "mainwindow.h" -#include "interface/moduleobject.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace DCC_NAMESPACE; - -/* - * Implementation of adaptor class DBusControlCenter - */ - -ControlCenterDBusAdaptor::ControlCenterDBusAdaptor(MainWindow *parent) - : QDBusAbstractAdaptor(parent) -{ -} - -ControlCenterDBusAdaptor::~ControlCenterDBusAdaptor() -{ -} - -MainWindow *ControlCenterDBusAdaptor::parent() const -{ - return static_cast(QObject::parent()); -} - -const QRect ControlCenterDBusAdaptor::rect() const -{ - return parent()->geometry(); -} - -void ControlCenterDBusAdaptor::Exit() -{ - pid_t pid = getpid(); - qDebug() << "exit pid:" << pid; - QCoreApplication::quit(); -} - -void ControlCenterDBusAdaptor::Hide() -{ - parent()->hide(); -} - -void ControlCenterDBusAdaptor::Show() -{ - if (parent()->isMinimized() || !parent()->isVisible()) - parent()->showNormal(); - - parent()->activateWindow(); -} - -void ControlCenterDBusAdaptor::ShowHome() -{ - parent()->showPage("", MainWindow::UrlType::Name); - Show(); -} - -void ControlCenterDBusAdaptor::ShowPage(const QString &url) -{ - parent()->showPage(url); - Show(); -} - -void ControlCenterDBusAdaptor::Toggle() -{ - parent()->setVisible(!parent()->isVisible()); - if (parent()->isVisible()) - parent()->activateWindow(); -} - -QString ControlCenterDBusAdaptor::GetAllModule() -{ - return parent()->getAllModule(); -} - -DBusControlCenterGrandSearchService::DBusControlCenterGrandSearchService(MainWindow *parent) - : QDBusAbstractAdaptor(parent) - , m_autoExitTimer(new QTimer(this)) -{ - m_autoExitTimer->setInterval(10000); - m_autoExitTimer->setSingleShot(true); - connect(m_autoExitTimer, &QTimer::timeout, this, [this]() { - //当主界面show出来之后不再执行自动退出 - if (!this->parent()->isVisible()) - QCoreApplication::quit(); - }); - m_autoExitTimer->start(); -} - -DBusControlCenterGrandSearchService::~DBusControlCenterGrandSearchService() -{ -} - -MainWindow *DBusControlCenterGrandSearchService::parent() const -{ - return static_cast(QObject::parent()); -} -//匹配搜索结果 -QString DBusControlCenterGrandSearchService::Search(const QString json) -{ - QString val = parent()->GrandSearchSearch(json); - m_autoExitTimer->start(); - return val; -} -//停止搜索 -bool DBusControlCenterGrandSearchService::Stop(const QString json) -{ - bool val = parent()->GrandSearchStop(json); - m_autoExitTimer->start(); - return val; -} -//执行搜索 -bool DBusControlCenterGrandSearchService::Action(const QString json) -{ - bool val = parent()->GrandSearchAction(json); - m_autoExitTimer->start(); - return val; -} diff --git a/dcc-old/src/frame/controlcenterdbusadaptor.h b/dcc-old/src/frame/controlcenterdbusadaptor.h deleted file mode 100644 index 7b23865241..0000000000 --- a/dcc-old/src/frame/controlcenterdbusadaptor.h +++ /dev/null @@ -1,74 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include -#include - -QT_BEGIN_NAMESPACE -class QByteArray; -template class QList; -template class QMap; -class QString; -class QStringList; -class QVariant; -QT_END_NAMESPACE - -/* - * Adaptor class for interface com.deepin.dde.ControlCenter - */ - -namespace DCC_NAMESPACE -{ - -class MainWindow; - -class ControlCenterDBusAdaptor: public QDBusAbstractAdaptor -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.deepin.dde.ControlCenter1") - -public: - explicit ControlCenterDBusAdaptor(MainWindow *parent); - virtual ~ControlCenterDBusAdaptor(); - - inline MainWindow *parent() const; - -public: - const QRect rect() const; - -public Q_SLOTS: // METHODS - void Exit(); - void Hide(); - void Show(); - void ShowHome(); - void ShowPage(const QString &url); - void Toggle(); - QString GetAllModule(); - -}; - -class DBusControlCenterGrandSearchService: public QDBusAbstractAdaptor -{ - Q_OBJECT - Q_CLASSINFO("D-Bus Interface", "org.deepin.dde.ControlCenter1.GrandSearch") - -public: - explicit DBusControlCenterGrandSearchService(MainWindow *parent); - virtual ~DBusControlCenterGrandSearchService(); - - inline MainWindow *parent() const; - -public Q_SLOTS: // METHODS - QString Search(const QString json); - bool Stop(const QString json); - bool Action(const QString json); - -private: - QTimer *m_autoExitTimer; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/frame/listitemdelegate.cpp b/dcc-old/src/frame/listitemdelegate.cpp deleted file mode 100644 index e724832c39..0000000000 --- a/dcc-old/src/frame/listitemdelegate.cpp +++ /dev/null @@ -1,266 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "listitemdelegate.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -#if DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 0, 0) -# define USE_DCIICON -#endif - -#ifdef USE_DCIICON -# include -#endif -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -ListItemDelegate::ListItemDelegate(QAbstractItemView *parent) - : DStyledItemDelegate(parent) -{ -} - -void ListItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - painter->save(); - - QStyleOptionViewItem opt(option); - initStyleOption(&opt, index); - - bool isIconMode = option.decorationAlignment == Qt::AlignCenter; - bool isBeginning = (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::Beginning) || (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::OnlyOne); - bool isSelected = opt.state & QStyle::State_Selected; - bool isHover = opt.state & QStyle::State_MouseOver; - - // 选择高亮背景 - if (isSelected) { - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - opt.backgroundBrush = option.palette.color(cg, QPalette::Highlight); - } - - QVariant value; - - QRect decorationRect; - int fontHeight = opt.widget->fontMetrics().height(); - const int firstItemHeight = (opt.rect.height() - (fontHeight * 2 + opt.decorationSize.height())) / 2; - if (index.data(Qt::DecorationRole).isValid()) { - if (isBeginning && isIconMode) { - decorationRect = QRect(opt.rect.topLeft() + QPoint((opt.rect.width() - opt.decorationSize.width()) / 2, firstItemHeight), opt.decorationSize); - opt.displayAlignment = Qt::AlignCenter; - } else if (isBeginning) { - opt.decorationSize += QSize(4, 4); - decorationRect = QRect(opt.rect.topLeft() + QPoint(8, (opt.rect.height() - opt.decorationSize.height()) / 2), opt.decorationSize); - opt.displayAlignment = Qt::AlignLeft; - } else { - decorationRect = QRect(opt.rect.topLeft() + QPoint(8, (opt.rect.height() - opt.decorationSize.height()) / 2), opt.decorationSize); - opt.displayAlignment = Qt::AlignLeft; - } - } else { - decorationRect = QRect(); - } - QString text; - QRect displayRect; - value = index.data(Qt::DisplayRole); - if (value.isValid() && !value.isNull()) { - if (isBeginning && isIconMode) { - displayRect = QRect(opt.rect.topLeft() + QPoint(0, opt.decorationSize.height() + firstItemHeight + 10), QSize(opt.rect.width(), -1)); - } else if (isBeginning || isIconMode) { - displayRect = QRect(opt.rect.topLeft() + QPoint(decorationRect.width() + 18, (opt.rect.height() / 2 - fontHeight + 5)), QSize(opt.rect.width() - opt.decorationSize.width() - 30, -1)); - } else { - displayRect = QRect(opt.rect.topLeft() + QPoint(decorationRect.width() + 18, (opt.rect.height() - fontHeight) / 2), QSize(opt.rect.width() - opt.decorationSize.width() - 30, -1)); - } - } - - QRect tipRect = displayRect.translated(0, opt.widget->fontMetrics().lineSpacing() + 3); - - QStyle *style = option.widget ? option.widget->style() : QApplication::style(); - // draw the item - if (isIconMode || isSelected || isHover) { - drawBackground(style, painter, opt); - } - // 图标的绘制用也可能会使用这些颜色 - QPalette::ColorGroup cg = (opt.state & QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled; - auto role = (opt.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text; - painter->setPen(opt.palette.color(cg, role)); - - drawDecoration(painter, opt, decorationRect); - - drawDisplay(style, painter, opt, displayRect); - - if (isIconMode || isBeginning) { - painter->save(); - painter->setPen(opt.palette.color(cg, role)); - painter->setOpacity(0.7); - opt.text = index.data(Qt::StatusTipRole).toString(); - int fontSize = opt.font.pointSize(); - opt.font.setPointSize(fontSize - 3); - drawDisplay(style, painter, opt, tipRect); - painter->restore(); - } - - drawEllipse(painter, opt, index.data(Dtk::RightActionListRole).toInt()); - drawFocus(style, painter, opt, opt.rect); - // done - painter->restore(); -} - -void ListItemDelegate::drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option) const -{ - DStyleOptionBackgroundGroup boption; - boption.init(option.widget); - boption.QStyleOption::operator=(option); - boption.position = DStyleOptionBackgroundGroup::ItemBackgroundPosition(option.viewItemPosition); - bool isIconMode = option.decorationAlignment == Qt::AlignCenter; - if (isIconMode) - boption.dpalette.setBrush(DPalette::ItemBackground, option.palette.color(QPalette::Base)); - - if (option.backgroundBrush.style() != Qt::NoBrush) { - boption.dpalette.setBrush(DPalette::ItemBackground, option.backgroundBrush); - } - - boption.rect = option.rect; - - if (backgroundType() != RoundedBackground) { - boption.directions = Qt::Vertical; - } - - style->drawPrimitive(static_cast(DStyle::PE_ItemBackground), &boption, painter, option.widget); -} - -bool drawDciIcon(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) -{ -#ifdef USE_DCIICON - QVariant iconVar = option.index.data(Qt::DecorationRole); - DDciIcon icon; - if (iconVar.canConvert()) { - icon = iconVar.value(); - } else if (iconVar.type() == QVariant::String) { - QString iconstr = iconVar.toString(); - if (!iconstr.isEmpty()) { - icon = DDciIcon::fromTheme(iconstr); - if (icon.isNull()) - icon = DDciIcon(iconstr); - } - } - if (!icon.isNull()) { - DDciIcon::Mode dciMode = DDciIcon::Normal; - if (option.state & QStyle::State_Enabled) { - if (option.state & (QStyle::State_Sunken | QStyle::State_Selected)) { - dciMode = DDciIcon::Pressed; - } else if (option.state & QStyle::State_MouseOver) { - dciMode = DDciIcon::Hover; - } - } else { - dciMode = DDciIcon::Disabled; - } - - DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Dark : DDciIcon::Light; - - painter->save(); - painter->setBrush(Qt::NoBrush); - icon.paint(painter, rect, painter->device() ? painter->device()->devicePixelRatioF() : qApp->devicePixelRatio(), theme, dciMode, option.decorationAlignment); - painter->restore(); - return true; - } -#endif - return false; -} - -void ListItemDelegate::drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - if (option.features & QStyleOptionViewItem::HasDecoration - && !drawDciIcon(painter, option, rect)) { - QVariant iconVar = option.index.data(Qt::DecorationRole); - QIcon icon; - if (iconVar.type() == QVariant::Icon) { - icon = iconVar.value(); - } else if (iconVar.type() == QVariant::String) { - const QString &iconstr = iconVar.toString(); - icon = DIconTheme::findQIcon(iconstr); - if (icon.isNull()) - icon = QIcon(iconstr); - } - if (!icon.isNull()) { - QIcon::Mode mode = QIcon::Normal; - if (!(option.state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (option.state & QStyle::State_Selected) - mode = QIcon::Selected; - - QIcon::State state = (option.state & QStyle::State_Open) ? QIcon::On : QIcon::Off; - icon.paint(painter, rect, option.decorationAlignment, mode, state); - return; - } - } -} - -void ListItemDelegate::drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - DStyle::viewItemDrawText(style, painter, &option, rect); -} - -void ListItemDelegate::drawEllipse(QPainter *painter, const QStyleOptionViewItem &option, const int message) const -{ - if (message <= 0) - return; - - QRadialGradient Conical(0, 0, 7, 0, 0); - Conical.setColorAt(1, QColor(255, 106, 106, 255)); - Conical.setColorAt(0.2, QColor(255, 106, 106, 255)); - Conical.setColorAt(0, QColor(255, 106, 106, 25)); - - painter->setBrush(Conical); - painter->setPen(Qt::NoPen); - painter->drawEllipse(option.rect.center() + QPoint(option.rect.width() / 2 - 30, 0), 7, 7); -} - -void ListItemDelegate::drawFocus(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - if ((option.state & QStyle::State_HasFocus) == 0 || !rect.isValid()) - return; - QStyleOptionFocusRect o; - o.QStyleOption::operator=(option); - o.rect = rect; - o.state |= QStyle::State_KeyboardFocusChange; - o.state |= QStyle::State_Item; - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - o.backgroundColor = option.palette.color(cg, (option.state & QStyle::State_Selected) ? QPalette::Highlight : QPalette::Window); - style->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter, option.widget); -} - -bool ListItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) -{ - QStyleOptionViewItem opt(option); - bool isBeginning = (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::Beginning) || (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::OnlyOne); - int displayWidth = isBeginning ? opt.rect.width() : opt.rect.width() - opt.decorationSize.width() -30 ; - - QString displayName = index.data(Qt::DisplayRole).toString(); - - int fontWidth = opt.widget->fontMetrics().horizontalAdvance(displayName); - if (fontWidth > displayWidth) { - if (event->type() == QEvent::ToolTip) { - QToolTip::showText(QCursor::pos(), displayName, reinterpret_cast(view), option.rect, 1000); - } - } - return true; -} diff --git a/dcc-old/src/frame/listitemdelegate.h b/dcc-old/src/frame/listitemdelegate.h deleted file mode 100644 index 084b0b2e9e..0000000000 --- a/dcc-old/src/frame/listitemdelegate.h +++ /dev/null @@ -1,31 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef LISTITEMDELEGATE_H -#define LISTITEMDELEGATE_H - -#include "interface/namespace.h" - -#include - -namespace DCC_NAMESPACE { - -class ListItemDelegate : public Dtk::Widget::DStyledItemDelegate -{ -public: - ListItemDelegate(QAbstractItemView *parent = nullptr); - -protected: - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) override; - - virtual void drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option) const; - void drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawEllipse(QPainter *painter, const QStyleOptionViewItem &option, const int message) const; - void drawFocus(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; -}; - -} - -#endif // LISTITEMDELEGATE_H diff --git a/dcc-old/src/frame/listview.cpp b/dcc-old/src/frame/listview.cpp deleted file mode 100644 index 82a016aaa0..0000000000 --- a/dcc-old/src/frame/listview.cpp +++ /dev/null @@ -1,635 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "listview.h" -#include -#include -#include -#include -#include - -#include -#include - -DGUI_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; -///////////////////////////////////////// -namespace DCC_NAMESPACE { - -class ListViewPrivate -{ -public: - explicit ListViewPrivate(ListView *parent) - : q_ptr(parent) - , m_spacing(20) - , m_gridSize(280, 84) - , m_viewMode(ListView::ListMode) - , m_itemSize(m_gridSize) - , m_maxColumnCount(1) - , m_maxRowCount(1) - , m_xOffset(0) - , m_yOffset(0) - , m_alignment(Qt::AlignLeft | Qt::AlignTop) - , m_firstHeightDiff(0) - { - setGridSize(m_gridSize); - } - - void setSpacing(int space) - { - m_spacing = space; - } - int spacing() const - { - return m_spacing; - } - - void setGridSize(const QSize &size) - { - m_gridSize = size; - m_firstHeightDiff = m_viewMode == ListView::IconMode ? 0 : 18; - } - QSize gridSize() const - { - return m_gridSize; - } - - void setViewMode(ListView::ViewMode mode) - { - m_viewMode = mode; - } - ListView::ViewMode viewMode() const - { - return m_viewMode; - } - void setAlignment(Qt::Alignment alignment) - { - m_alignment = alignment; - } - Qt::Alignment alignment() const - { - return m_alignment; - } - - void updateGeometries() - { - Q_Q(ListView); - m_maxColumnCount = 1; - if (m_viewMode == ListView::IconMode && (m_gridSize.width() + m_spacing) > 0) - m_maxColumnCount = (q->viewport()->width() - m_spacing) / (m_gridSize.width() + m_spacing); - - int count = q->model() ? q->model()->rowCount() : 0; - if (count < m_maxColumnCount) - m_maxColumnCount = count; - - if (m_maxColumnCount <= 0) - m_maxColumnCount = 1; - - if (m_viewMode == ListView::IconMode) { - if (count == 0) - m_maxRowCount = 0; - else if (count <= m_maxColumnCount) - m_maxRowCount = 2; - else - m_maxRowCount = 1 + (count / m_maxColumnCount); - } else { - m_maxRowCount = (count <= m_maxColumnCount) ? 1 : count / m_maxColumnCount; - } - - m_itemSize = (m_viewMode == ListView::IconMode) ? m_gridSize : QSize(q->viewport()->width() - marginsWidth(), m_gridSize.height()); - int itemWidth = m_maxColumnCount * (m_itemSize.width() + m_spacing) - m_spacing; - int itemHeight = m_maxRowCount * (m_itemSize.height() + m_spacing) - m_spacing; - - if (m_alignment & Qt::AlignRight) { - m_xOffset = q->viewport()->width() - itemWidth; - } else if (m_alignment & Qt::AlignHCenter) { - m_xOffset = (q->viewport()->width() - itemWidth) / 2; - } else { - m_xOffset = 0; - } - if (itemHeight > q->viewport()->height()) { - m_yOffset = 0; - } else if (m_alignment & Qt::AlignBottom) { - m_yOffset = q->viewport()->height() - itemHeight; - } else if (m_alignment & Qt::AlignVCenter) { - m_yOffset = (q->viewport()->height() - itemHeight) / 2; - } else { - m_yOffset = 0; - } - } - // item在窗口中位置(无滚动) - QRect rectForIndex(const QModelIndex &index) const - { - QRect rect(0, 0, m_itemSize.width(), m_itemSize.height()); - if (index.row() == 0 && m_viewMode == ListView::IconMode) { - rect.setHeight(m_itemSize.height() * 2 + m_spacing); - } else if (index.row() == 0 && m_viewMode == ListView::ListMode) { - rect.setHeight(m_itemSize.height() + m_firstHeightDiff); - } else { - int indexRow = index.row(); - if (m_viewMode == ListView::IconMode && indexRow >= m_maxColumnCount) - indexRow++; - int row = indexRow / m_maxColumnCount; - int col = indexRow % m_maxColumnCount; - rect.translate((m_itemSize.width() + m_spacing) * col, (m_itemSize.height() + m_spacing) * row); - if (m_viewMode == ListView::ListMode && indexRow >= 1) - rect.translate(0, m_firstHeightDiff); - } - return rect.translated(contentsMargins().left() + m_xOffset, contentsMargins().top() + m_yOffset); - } - // item在窗口中位置(无滚动) - QModelIndex indexAt(const QPoint &p) const - { - if ((m_itemSize.height() + m_spacing) <= 0 || (m_itemSize.width() + m_spacing) <= 0) - return QModelIndex(); - Q_Q(const ListView); - QRect rect(p.x() - m_xOffset, p.y() - m_yOffset, 1, 1); - int row = (rect.y() - m_firstHeightDiff) / (m_itemSize.height() + m_spacing); - int col = (rect.x()) / (m_itemSize.width() + m_spacing); - if (row < 0) - row = 0; - int indexRow = 0; - if (m_viewMode == ListView::IconMode) { - if (row != 1 || col != 0) { - indexRow = row > 0 ? row * m_maxColumnCount + col - 1 : col; - } - } else { - indexRow = row * m_maxColumnCount + col; - } - QModelIndex index = q->model()->index(indexRow, 0); - if (index.isValid() && rectForIndex(index).contains(p)) - return index; - return QModelIndex(); - } - QVector intersectingSet(const QRect &area) const - { - Q_Q(const ListView); - QVector indexs; - int rows = q->model()->rowCount(); - for (int row = 0; row < rows; row++) { - QModelIndex index = q->model()->index(row, 0); - QRect rectIndex = rectForIndex(index); - if (!rectIndex.intersected(area).isEmpty()) { - indexs.append(index); - } - } - return indexs; - } - inline int marginsWidth() const - { - return contentsMargins().left() + contentsMargins().right(); - } - inline int marginsHidget() const - { - return contentsMargins().top() + contentsMargins().bottom(); - } - void setContentsMargins(int left, int top, int right, int bottom) - { - m_contentsMargins.setLeft(left); - m_contentsMargins.setTop(top); - m_contentsMargins.setRight(right); - m_contentsMargins.setBottom(bottom); - } - QMargins contentsMargins() const - { - return m_contentsMargins; - } - -private: - ListView *const q_ptr; - Q_DECLARE_PUBLIC(ListView) - int m_spacing; - QSize m_gridSize; - ListView::ViewMode m_viewMode; - - QSize m_itemSize; - int m_maxColumnCount; // 一行可容纳的最大列数 - int m_maxRowCount; // 换算显示所有item所需行数 - int m_xOffset; // x轴偏移 - int m_yOffset; // y轴偏移 - QModelIndex m_hover; // hover项 - Qt::Alignment m_alignment; // 对齐方式 - int m_firstHeightDiff; // 第一行与其他行高差值 - QMargins m_contentsMargins; -}; -} // namespace DCC_NAMESPACE - -///////////////////////////////////////// - -ListView::ListView(QWidget *parent) - : QAbstractItemView(parent) - , DCC_INIT_PRIVATE(ListView) -{ - setSelectionMode(SingleSelection); - setAttribute(Qt::WA_MacShowFocusRect); - scheduleDelayedItemsLayout(); - setMouseTracking(true); - - viewport()->setAutoFillBackground(false); - setAutoFillBackground(false); -} - -ListView::~ListView() -{ -} - -void ListView::setSpacing(int space) -{ - Q_D(ListView); - if (d->spacing() != space) { - d->setSpacing(space); - scheduleDelayedItemsLayout(); - } -} -int ListView::spacing() const -{ - Q_D(const ListView); - return d->spacing(); -} - -void ListView::setGridSize(const QSize &size) -{ - Q_D(ListView); - if (d->gridSize() != size) { - d->setGridSize(size); - scheduleDelayedItemsLayout(); - } -} -QSize ListView::gridSize() const -{ - Q_D(const ListView); - return d->gridSize(); -} - -void ListView::setViewMode(ViewMode mode) -{ - Q_D(ListView); - if (d->viewMode() != mode) { - d->setViewMode(mode); - scheduleDelayedItemsLayout(); - } -} -ListView::ViewMode ListView::viewMode() const -{ - Q_D(const ListView); - return d->viewMode(); -} - -void ListView::setAlignment(Qt::Alignment alignment) -{ - Q_D(ListView); - if (d->alignment() != alignment) { - d->setAlignment(alignment); - scheduleDelayedItemsLayout(); - } -} -Qt::Alignment ListView::alignment() const -{ - Q_D(const ListView); - return d->alignment(); -} - -void ListView::setContentsMargins(int left, int top, int right, int bottom) -{ - Q_D(ListView); - const QMargins &margins = d->contentsMargins(); - if (margins.left() != left || margins.top() != top - || margins.right() != right || margins.bottom() != bottom) { - d->setContentsMargins(left, top, right, bottom); - scheduleDelayedItemsLayout(); - } -} - -void ListView::setContentsMargins(const QMargins &margins) -{ - setContentsMargins(margins.left(), margins.top(), margins.right(), margins.bottom()); -} - -QMargins ListView::contentsMargins() const -{ - Q_D(const ListView); - return d->contentsMargins(); -} -///////////////////////////////////////////////////////////////////////////// -// item在窗口中位置(加滚动偏移) -QRect ListView::visualRect(const QModelIndex &index) const -{ - Q_D(const ListView); - return d->rectForIndex(index).translated(-horizontalOffset(), -verticalOffset()); -} - -void ListView::scrollTo(const QModelIndex &index, ScrollHint hint) -{ - if (!index.isValid()) - return; - - const QRect rect = visualRect(index); - if (hint == EnsureVisible && viewport()->rect().contains(rect)) { - viewport()->update(rect); - return; - } - - const QRect area = viewport()->rect(); - const bool above = (hint == EnsureVisible && rect.top() < area.top()); - const bool below = (hint == EnsureVisible && rect.bottom() > area.bottom()); - - int verticalValue = verticalScrollBar()->value(); - QRect adjusted = rect.adjusted(-spacing(), -spacing(), spacing(), spacing()); - if (hint == PositionAtTop || above) - verticalValue += adjusted.top(); - else if (hint == PositionAtBottom || below) - verticalValue += qMin(adjusted.top(), adjusted.bottom() - area.height() + 1); - else if (hint == PositionAtCenter) - verticalValue += adjusted.top() - ((area.height() - adjusted.height()) / 2); - verticalScrollBar()->setValue(verticalValue); -} - -QModelIndex ListView::indexAt(const QPoint &p) const -{ - Q_D(const ListView); - return d->indexAt(p + QPoint(horizontalOffset(), verticalOffset())); -} - -QModelIndex ListView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers /*modifiers*/) -{ - Q_D(const ListView); - QModelIndex current = currentIndex(); - int currentRow = current.row(); - int maxRow = model()->rowCount(); - - auto moveup = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == maxColumnCount * 2 - 1) { - currentRow = 0; - } else if (currentRow < maxColumnCount) { - // 第一行不处理 - } else if (currentRow < maxColumnCount * 2) { - currentRow -= (maxColumnCount - 1); - } else { - currentRow -= maxColumnCount; - } - return currentRow; - }; - auto movedown = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == 0) { - currentRow += (maxColumnCount * 2 - 1); - } else if (currentRow < maxColumnCount) - currentRow += (maxColumnCount - 1); - else - currentRow += maxColumnCount; - return currentRow; - }; - switch (cursorAction) { - case MoveLeft: - currentRow--; - break; - case MoveRight: - currentRow++; - break; - case MovePageUp: { - int pageItem = (viewport()->height() - d->marginsHidget() + d->m_spacing) / (d->m_itemSize.height() + d->m_spacing); - for (int i = 0; i < pageItem; i++) { - currentRow = moveup(currentRow, d->m_maxColumnCount); - } - } break; - case MoveUp: - currentRow = moveup(currentRow, d->m_maxColumnCount); - break; - case MovePageDown: { - int pageItem = (viewport()->height() - d->marginsHidget() + d->m_spacing) / (d->m_itemSize.height() + d->m_spacing); - for (int i = 0; i < pageItem; i++) { - int row = movedown(currentRow, d->m_maxColumnCount); - if (row >= maxRow) - break; - currentRow = row; - } - } break; - case MoveDown: - currentRow = movedown(currentRow, d->m_maxColumnCount); - break; - case MoveHome: - currentRow = 0; - break; - case MoveEnd: - currentRow = maxRow - 1; - break; - default: - return QModelIndex(); - } - QModelIndex selectIndex = model()->index(currentRow, 0); - activated(selectIndex); - return selectIndex; -} - -int ListView::horizontalOffset() const -{ - return 0; -} - -int ListView::verticalOffset() const -{ - return verticalScrollBar()->value(); -} - -void ListView::updateGeometries() -{ - Q_D(ListView); - QAbstractItemView::updateGeometries(); - d->updateGeometries(); - - // 更新滚动条范围 - if (geometry().isEmpty() || !model() || model()->rowCount() <= 0 || model()->columnCount() <= 0) { - horizontalScrollBar()->setRange(0, 0); - verticalScrollBar()->setRange(0, 0); - } else { - QSize step = d->m_itemSize; - verticalScrollBar()->setSingleStep(step.height() + spacing()); - verticalScrollBar()->setPageStep(viewport()->height()); - - int height = d->m_maxRowCount * (d->m_itemSize.height() + d->m_spacing) + (d->m_viewMode == ListMode ? d->m_firstHeightDiff : 0); - if (height < viewport()->height()) { - verticalScrollBar()->setRange(0, 0); - } else { - verticalScrollBar()->setRange(0, height - viewport()->height()); - } - } -} - -void ListView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) -{ - QAbstractItemView::dataChanged(topLeft, bottomRight, roles); - scheduleDelayedItemsLayout(); -} - -void ListView::rowsInserted(const QModelIndex &parent, int start, int end) -{ - scheduleDelayedItemsLayout(); - QAbstractItemView::rowsInserted(parent, start, end); -} - -void ListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) -{ - QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); - scheduleDelayedItemsLayout(); -} - -void ListView::mouseMoveEvent(QMouseEvent *event) -{ - setHoverIndexAt(event->pos()); - QAbstractItemView::mouseMoveEvent(event); -} - -void ListView::verticalScrollbarValueChanged(int value) -{ - setHoverIndexAt(viewport()->mapFromGlobal(QCursor::pos())); - QAbstractItemView::verticalScrollbarValueChanged(value); -} - -void ListView::horizontalScrollbarAction(int value) -{ - setHoverIndexAt(viewport()->mapFromGlobal(QCursor::pos())); - QAbstractItemView::horizontalScrollbarAction(value); -} - -void ListView::setHoverIndexAt(const QPoint &p) -{ - if (!viewport()->rect().contains(p)) - return; - - QModelIndex index = indexAt(p); - - Q_D(ListView); - if (d->m_hover == index) - return; - - if (selectionBehavior() != QAbstractItemView::SelectRows) { - update(d->m_hover); //update the old one - update(index); //update the new one - } else { - QRect oldHoverRect = visualRect(d->m_hover); - QRect newHoverRect = visualRect(index); - viewport()->update(QRect(0, newHoverRect.y(), viewport()->width(), newHoverRect.height())); - viewport()->update(QRect(0, oldHoverRect.y(), viewport()->width(), oldHoverRect.height())); - } - - d->m_hover = index; -} - -bool ListView::isIndexHidden(const QModelIndex & /*index*/) const -{ - return false; -} - -QRegion ListView::visualRegionForSelection(const QItemSelection &selection) const -{ - if (selection.isEmpty()) - return QRegion(); - Q_D(const ListView); - QRect rect = d->rectForIndex(selection.indexes().first()); - return QRegion(rect); -} - -void ListView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) -{ - int rows = model()->rowCount(); - QModelIndex selectedIndex; - for (int row = 0; row < rows; row++) { - QModelIndex index = model()->index(row, 0); - QRect rectIndex = visualRect(index); - if (!rectIndex.intersected(rect).isEmpty()) { - selectedIndex = index; - break; - } - } - selectionModel()->select(selectedIndex, command); -} - -void ListView::paintEvent(QPaintEvent *e) -{ - Q_D(const ListView); - QStyleOptionViewItem option = viewOptions(); - QPainter painter(viewport()); - - const QVector toBeRendered = d->intersectingSet(e->rect().translated(horizontalOffset(), verticalOffset())); - - const QModelIndex current = currentIndex(); - const QModelIndex hover = d->m_hover; - const QAbstractItemModel *itemModel = model(); - const QItemSelectionModel *selections = selectionModel(); - const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid(); - const bool alternate = alternatingRowColors(); - const QStyle::State state = option.state; - const QAbstractItemView::State viewState = this->state(); - const bool enabled = (state & QStyle::State_Enabled) != 0; - option.decorationAlignment = d->m_viewMode == IconMode ? Qt::AlignCenter : Qt::AlignLeft; - - bool alternateBase = false; - int previousRow = -2; - - painter.setRenderHint(QPainter::Antialiasing); - - QVector::const_iterator end = toBeRendered.constEnd(); - for (QVector::const_iterator it = toBeRendered.constBegin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - option.rect = visualRect(*it); - - option.state = state; - if (selections && selections->isSelected(*it)) - option.state |= QStyle::State_Selected; - if (enabled) { - QPalette::ColorGroup cg; - if ((itemModel->flags(*it) & Qt::ItemIsEnabled) == 0) { - option.state &= ~QStyle::State_Enabled; - cg = QPalette::Disabled; - } else { - cg = QPalette::Normal; - } - option.palette.setCurrentColorGroup(cg); - } - if (focus && current == *it) { - option.state |= QStyle::State_HasFocus; - if (viewState == EditingState) - option.state |= QStyle::State_Editing; - } - option.state.setFlag(QStyle::State_MouseOver, *it == hover); - - if (alternate) { // 交替色处理,未实现 - int row = (*it).row(); - if (row != previousRow + 1) { - // adjust alternateBase according to rows in the "gap" - alternateBase = (row & 1) != 0; - } - option.features.setFlag(QStyleOptionViewItem::Alternate, alternateBase); - - // draw background of the item (only alternate row). rest of the background - // is provided by the delegate - QStyle::State oldState = option.state; - option.state &= ~QStyle::State_Selected; - style()->drawPrimitive(QStyle::PE_PanelItemViewRow, &option, &painter, this); - option.state = oldState; - - alternateBase = !alternateBase; - previousRow = row; - } - - itemDelegate(*it)->paint(&painter, option, *it); - } -} - -bool ListView::viewportEvent(QEvent *event) -{ - Q_D(ListView); - switch (event->type()) { - case QEvent::HoverMove: - case QEvent::HoverEnter: - d->m_hover = indexAt(static_cast(event)->pos()); - break; - case QEvent::HoverLeave: - case QEvent::Leave: - d->m_hover = QModelIndex(); - break; - default: - break; - } - return QAbstractItemView::viewportEvent(event); -} diff --git a/dcc-old/src/frame/listview.h b/dcc-old/src/frame/listview.h deleted file mode 100644 index 25b491f13b..0000000000 --- a/dcc-old/src/frame/listview.h +++ /dev/null @@ -1,78 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef LISTVIEW_H -#define LISTVIEW_H -#include "interface/namespace.h" -#include -#include - -namespace DCC_NAMESPACE { - -class ListViewPrivate; -class ListView : public QAbstractItemView -{ - Q_OBJECT - Q_PROPERTY(int spacing READ spacing WRITE setSpacing) - Q_PROPERTY(QSize gridSize READ gridSize WRITE setGridSize) - Q_PROPERTY(ViewMode viewMode READ viewMode WRITE setViewMode) - Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment) - -public: - enum ViewMode { ListMode, - IconMode }; - Q_ENUM(ViewMode) - - explicit ListView(QWidget *parent = nullptr); - virtual ~ListView() override; - - void setSpacing(int space); - int spacing() const; - - void setGridSize(const QSize &size); - QSize gridSize() const; - - void setViewMode(ViewMode mode); - ViewMode viewMode() const; - - void setAlignment(Qt::Alignment alignment); - Qt::Alignment alignment() const; - - void setContentsMargins(int left, int top, int right, int bottom); - void setContentsMargins(const QMargins &margins); - QMargins contentsMargins() const; - - QRect visualRect(const QModelIndex &index) const override; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; - QModelIndex indexAt(const QPoint &p) const override; - -protected: - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; - int horizontalOffset() const override; - int verticalOffset() const override; - - bool isIndexHidden(const QModelIndex &index) const override; - QRegion visualRegionForSelection(const QItemSelection &selection) const override; - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; - - void updateGeometries() override; - - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector()) override; - void rowsInserted(const QModelIndex &parent, int start, int end) override; - void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; - - void mouseMoveEvent(QMouseEvent *event) override; - void verticalScrollbarValueChanged(int value) override; - void horizontalScrollbarAction(int value) override; - void setHoverIndexAt(const QPoint &p); - -protected: - void paintEvent(QPaintEvent *e) override; - bool viewportEvent(QEvent *event) override; - - DCC_DECLARE_PRIVATE(ListView) -}; - -} // namespace DCC_NAMESPACE - -#endif // LISTVIEW_H diff --git a/dcc-old/src/frame/main.cpp b/dcc-old/src/frame/main.cpp deleted file mode 100644 index 5e65177fc8..0000000000 --- a/dcc-old/src/frame/main.cpp +++ /dev/null @@ -1,179 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "accessible.h" -#include "controlcenterdbusadaptor.h" -#include "mainwindow.h" -#include "utils.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -DWIDGET_USE_NAMESPACE -DGUI_USE_NAMESPACE -DCORE_USE_NAMESPACE - -QStringList defaultpath() -{ - QStringList path; -#ifdef QT_DEBUG - path.append(qApp->applicationDirPath()); -#else - path.append(DCC_NAMESPACE::PLUGIN_DIRECTORY); - path.append(DCC_NAMESPACE::OLD_PLUGIN_DIRECTORY); -#endif - return path; -} - -int main(int argc, char *argv[]) -{ - DApplication *app = DApplication::globalApplication(argc, argv); - app->setOrganizationName("deepin"); - app->setApplicationName("dde-control-center"); - - // take care of command line options - QCommandLineOption showOption(QStringList() << "s" - << "show", - "show control center(hide for default)."); - QCommandLineOption toggleOption(QStringList() << "t" - << "toggle", - "toggle control center visible."); - QCommandLineOption dbusOption(QStringList() << "d" - << "dbus", - "startup on dbus"); - QCommandLineOption pageOption("p", "specified module page", "page"); - QCommandLineOption pluginDir("spec", "load plugins from specialdir", "plugindir"); - - QCommandLineParser parser; - parser.setApplicationDescription("DDE Control Center"); - parser.addHelpOption(); - parser.addVersionOption(); - parser.addOption(showOption); - parser.addOption(toggleOption); - parser.addOption(dbusOption); - parser.addOption(pageOption); - parser.addOption(pluginDir); - parser.process(*app); - - const QString &reqPage = parser.value(pageOption); - const QString &refPluginDir = parser.value(pluginDir); - - if (!app->setSingleInstance(app->applicationName())) { - if (parser.isSet(toggleOption)) { - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .method("Toggle") - .call(); - } - - if (!reqPage.isEmpty()) { - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .method("ShowPage") - .arg(reqPage) - .call(); - } else if (parser.isSet(showOption) && !parser.isSet(dbusOption)) { - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .method("Show") - .call(); - } - - return -1; - } - Dtk::Gui::DGuiApplicationHelper::loadTranslator(app->applicationName(), { TRANSLATE_READ_DIR }, { QLocale() }); - DLogManager::setLogFormat( - "%{time}{yy-MM-ddTHH:mm:ss.zzz} [%{type}] [%{category}] <%{function}> %{message}"); - - DLogManager::registerJournalAppender(); - DLogManager::registerConsoleAppender(); - DLogManager::registerFileAppender(); - -#ifdef CVERSION - QString verstr(CVERSION); - if (verstr.isEmpty()) - verstr = "6.0"; - app->setApplicationVersion(verstr); -#else - app->setApplicationVersion("6.0"); -#endif - app->setAttribute(Qt::AA_UseHighDpiPixmaps); - app->loadTranslator(); - app->setStyle("chameleon"); - app->setProductIcon(DIconTheme::findQIcon("preferences-system")); - app->setWindowIcon(DIconTheme::findQIcon("preferences-system")); - - app->setApplicationDisplayName(QObject::tr("Control Center")); - app->setApplicationDescription( - QApplication::translate("main", - "Control Center provides the options for system settings.")); - - QAccessible::installFactory(accessibleFactory); - - DCC_NAMESPACE::MainWindow mw; - - DCC_NAMESPACE::ControlCenterDBusAdaptor adaptor(&mw); - DCC_NAMESPACE::DBusControlCenterGrandSearchService grandSearchadAptor(&mw); - - if (!refPluginDir.isEmpty()) { - mw.loadModules(true, { refPluginDir }); - QDBusConnection conn = QDBusConnection::sessionBus(); - if (!conn.registerService("org.deepin.dde.ControlCenter1") - || !conn.registerObject("/org/deepin/dde/ControlCenter1", &mw)) { - qDebug() << "dbus service already registered!" - << "pid is:" << qApp->applicationPid(); - if (!parser.isSet(showOption)) - return -1; - } - mw.show(); - return app->exec(); - } - - mw.loadModules(!parser.isSet(dbusOption), defaultpath()); - - QDBusConnection conn = QDBusConnection::sessionBus(); - if (!conn.registerService("org.deepin.dde.ControlCenter1") - || !conn.registerObject("/org/deepin/dde/ControlCenter1", &mw)) { - qDebug() << "dbus service already registered!" - << "pid is:" << qApp->applicationPid(); - if (!parser.isSet(showOption)) - return -1; - } - - if (!reqPage.isEmpty()) { - adaptor.ShowPage(reqPage); - } - - if (parser.isSet(showOption) && !parser.isSet(dbusOption)) { - adaptor.Show(); - } - -#ifdef QT_DEBUG - // debug时会直接show - // 发布版本,不会直接显示,为了满足在被dbus调用时, - // 如果dbus参数错误,不会有任何UI上的变化 - if (1 == argc) { - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .method("Show") - .call(); - } -#endif - - return app->exec(); -} diff --git a/dcc-old/src/frame/mainmodule.cpp b/dcc-old/src/frame/mainmodule.cpp deleted file mode 100644 index 896fb7ac75..0000000000 --- a/dcc-old/src/frame/mainmodule.cpp +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "mainmodule.h" - -#include "listitemdelegate.h" -#include "listview.h" -#include "pagemodule.h" -#include "src/interface/moduledatamodel.h" - -#include - -#include -#include - -#include -#include -#include - -#if DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 3, 0) -# define USE_SIDEBAR -#endif - -using namespace DCC_NAMESPACE; - -constexpr int NavViewMaximumWidth = QWIDGETSIZE_MAX; -constexpr int NavViewMinimumWidth = 160; - -constexpr QSize ListViewItemIconSize_IconMode(64, 64); -constexpr QSize ListViewItemGridSize_IconMode(280, 84); -constexpr QSize ListViewItemIconSize_ListMode(32, 32); -constexpr QSize ListViewItemGridSize_ListMode(168, 36); -constexpr int ListView_ListMode_MaxWidth = 400; -constexpr int ListView_IconMode_MaxWidth = 500; -// mainly about icon and margin -constexpr int ExtraWidth = 80; - -namespace DCC_NAMESPACE { -class MainModulePrivate -{ -public: - explicit MainModulePrivate(MainModule *parent = nullptr) - : q_ptr(parent) - , m_view(nullptr) - , m_sidebarWidget(nullptr) - , m_layout(nullptr) - { - QObject::connect(Dtk::Gui::DGuiApplicationHelper::instance(), - &Dtk::Gui::DGuiApplicationHelper::sizeModeChanged, [this](){ - updateSpacing(); - }); - } - - ListView *createListView(QWidget *parentWidget, bool isSizebar = false) - { - Q_Q(MainModule); - const QSize viewGridSize = - isSizebar ? ListViewItemGridSize_ListMode : ListViewItemGridSize_IconMode; - const QSize viewIconSize = - isSizebar ? ListViewItemIconSize_ListMode : ListViewItemIconSize_IconMode; - const int viewMaxWidth = - isSizebar ? ListView_ListMode_MaxWidth : ListView_IconMode_MaxWidth; - ListView *view = new ListView(parentWidget); - view->setGridSize(viewGridSize); - view->setIconSize(viewIconSize); - ListItemDelegate *delegate = new ListItemDelegate(view); - view->setItemDelegate(delegate); - ModuleDataModel *model = new ModuleDataModel(view); - model->setModuleObject(q); - - view->setModel(model); - view->setFrameShape(QFrame::Shape::NoFrame); - view->setAutoScroll(true); - view->setDragEnabled(false); - view->setMaximumWidth(NavViewMaximumWidth); - view->setMinimumWidth(NavViewMinimumWidth); - view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - view->setSelectionMode(QAbstractItemView::SingleSelection); - view->setAcceptDrops(false); - - auto onClicked = [](const QModelIndex &index) { - ModuleObject *obj = static_cast(index.internalPointer()); - if (obj) - obj->trigger(); - }; - QObject::connect(model, - &ModuleDataModel::newModuleMaxDislayName, - view, - [view, viewGridSize, viewIconSize, viewMaxWidth](const QString &name) { - QSize gradSize = view->gridSize(); - const int elementWidth = view->fontMetrics().horizontalAdvance(name) - + viewIconSize.width() + ExtraWidth; - if (gradSize.width() < elementWidth && elementWidth < viewMaxWidth) { - view->setGridSize(QSize(elementWidth, viewGridSize.height())); - } - }); - QObject::connect(view, &ListView::activated, view, &ListView::clicked); - QObject::connect(view, &ListView::clicked, view, onClicked); - return view; - } - - void onCurrentModuleChanged(ModuleObject *child) - { - if (!m_layout) - return; - if (child && ModuleObject::IsVisible(child)) { - m_sidebarWidget->setViewMode(ListView::ListMode); - m_sidebarWidget->setContentsMargins(10, 0, 10, 0); - m_sidebarWidget->setAlignment(Qt::AlignLeft | Qt::AlignTop); - - ModuleDataModel *model = static_cast(m_sidebarWidget->model()); - m_sidebarWidget->setCurrentIndex(model->index(child)); - PageModule *module = qobject_cast(child); - if (module) { - module->setContentsMargins(60, 0, 60, 0); - module->setMaximumWidth(DCC_PAGEMODULE_MAX_WIDTH + 60 * 2); - } - while (m_layout->count() != 0) { - QLayoutItem *item = m_layout->takeAt(0); - if (item->widget() && item->widget() != m_view && item->widget() != m_sidebarWidget) - delete item->widget(); - delete item; - } - m_sidebarWidget->setVisible(true); - int sizebar = m_sidebarWidget->gridSize().width(); -#ifdef USE_SIDEBAR - m_mainWindow->setSidebarWidth(sizebar); - m_mainWindow->setSidebarVisible(true); -#else - m_layout->addWidget(m_sidebarWidget); - m_sidebarWidget->setFixedWidth(sizebar); -#endif - m_layout->addWidget(child->activePage()); - m_view->setVisible(false); - m_sidebarWidget->setFocus(); - } else { - m_view->setViewMode(ListView::IconMode); - m_view->setContentsMargins(0, 0, 0, 0); - m_view->setAlignment(Qt::AlignHCenter); - - while (!m_layout->isEmpty()) { - QLayoutItem *item = m_layout->takeAt(0); - if (item->widget() && item->widget() != m_view && item->widget() != m_sidebarWidget) - delete item->widget(); - delete item; - } - QVBoxLayout *vlayout = new QVBoxLayout; - vlayout->addSpacing(20); - vlayout->addWidget(m_view); - m_layout->addLayout(vlayout); - - m_view->setMinimumWidth(0); - m_view->setMaximumWidth(QWIDGETSIZE_MAX); - m_view->setVisible(true); - m_view->clearSelection(); - m_sidebarWidget->setVisible(false); -#ifdef USE_SIDEBAR - m_mainWindow->setSidebarWidth(100); - m_mainWindow->setSidebarVisible(false); -#endif - } - } - -public slots: - void updateSpacing() - { - if (m_view && m_sidebarWidget) { - m_view->setSpacing(Dtk::Widget::DSizeModeHelper::element(10, 20)); - m_sidebarWidget->setSpacing(Dtk::Widget::DSizeModeHelper::element(0, 10)); - } - } - - QWidget *page() - { - Q_Q(MainModule); - QWidget *parentWidget = new QWidget(); - m_layout = new QHBoxLayout; - m_layout->setContentsMargins(0, 10, 0, 10); - m_layout->setSpacing(0); - parentWidget->setLayout(m_layout); - QObject::connect(q, - &MainModule::currentModuleChanged, - parentWidget, - [this](ModuleObject *child) { - onCurrentModuleChanged(child); - }); - m_view = createListView(parentWidget); - m_sidebarWidget = createListView(parentWidget, true); - updateSpacing(); - QObject::connect(q, &MainModule::moduleDataChanged, q, [this, q](){ - if (auto model = dynamic_cast(m_sidebarWidget->model())) { - auto index = model->index(q->currentModule()); - model->dataChanged(index, index); - } - }); -#ifdef USE_SIDEBAR - m_mainWindow->setSidebarWidget(m_sidebarWidget); -#endif - onCurrentModuleChanged(q->currentModule()); - return parentWidget; - } - -private: - MainModule *q_ptr; - Q_DECLARE_PUBLIC(MainModule) - - ListView *m_view; - ListView *m_sidebarWidget; - QHBoxLayout *m_layout; - DTK_WIDGET_NAMESPACE::DMainWindow *m_mainWindow; -}; -} // namespace DCC_NAMESPACE - -MainModule::MainModule(DTK_WIDGET_NAMESPACE::DMainWindow *parent) - : ModuleObject(parent) - , DCC_INIT_PRIVATE(MainModule) -{ - Q_D(MainModule); - d->m_mainWindow = parent; -} - -MainModule::~MainModule() { } - -QWidget *MainModule::page() -{ - Q_D(MainModule); - return d->page(); -} - -ModuleObject *MainModule::defultModule() -{ - return nullptr; -} diff --git a/dcc-old/src/frame/mainmodule.h b/dcc-old/src/frame/mainmodule.h deleted file mode 100644 index 47d8aedd48..0000000000 --- a/dcc-old/src/frame/mainmodule.h +++ /dev/null @@ -1,25 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MAINMODULE_H -#define MAINMODULE_H -#include "interface/moduleobject.h" -#include - -namespace DCC_NAMESPACE { -class MainModulePrivate; -class MainModule : public ModuleObject -{ - Q_OBJECT -public: - explicit MainModule(DTK_WIDGET_NAMESPACE::DMainWindow *parent = nullptr); - ~MainModule() override; - - QWidget *page() override; - ModuleObject *defultModule() override; - inline DCC_MODULE_TYPE getClassID() const override { return MAINLAYOUT; } - - DCC_DECLARE_PRIVATE(MainModule) -}; -} -#endif // MAINMODULE_H diff --git a/dcc-old/src/frame/mainwindow.cpp b/dcc-old/src/frame/mainwindow.cpp deleted file mode 100644 index 9782e58374..0000000000 --- a/dcc-old/src/frame/mainwindow.cpp +++ /dev/null @@ -1,586 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "mainwindow.h" - -#include "interface/moduleobject.h" -#include "mainmodule.h" -#include "pluginmanager.h" -#include "searchwidget.h" -#include "utils.h" -#include "widgets/utils.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DCORE_USE_NAMESPACE -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -#define DCC_CONFIG_HIDDEN 0x20000000 -#define DCC_CONFIG_DISABLED 0x10000000 -#define setConfigHidden(hide) setFlagState(DCC_CONFIG_HIDDEN, hide) -#define setConfigDisabled(disabled) setFlagState(DCC_CONFIG_DISABLED, disabled) - -constexpr QSize MainWindowMininumSize(QSize(800, 600)); - -const QString ControlCenterConfig = QStringLiteral("org.deepin.dde.control-center"); -const QString WidthConfig = QStringLiteral("width"); -const QString HeightConfig = QStringLiteral("height"); -const QString HideConfig = QStringLiteral("hideModule"); -const QString DisableConfig = QStringLiteral("disableModule"); -const QString ControlCenterIcon = QStringLiteral("preferences-system"); -// 这个只有 com.xx 全局搜索才翻译设置 -const QString ControlCenterGroupName = - "com.deepin.dde-grand-search.group.dde-control-center-setting"; - -MainWindow::MainWindow(QWidget *parent) - : DMainWindow(parent) - , m_backwardBtn(new DIconButton(QStyle::SP_ArrowBack, this)) - , m_dconfig(DConfig::create( - "org.deepin.dde.control-center", ControlCenterConfig, QString(), this)) - , m_searchWidget(new SearchWidget(this)) - , m_rootModule(new MainModule(this)) - , m_pluginManager(new PluginManager(this)) -{ - qRegisterMetaType("ModuleObject *"); - - initUI(); - initConfig(); - - connect(m_searchWidget, &SearchWidget::notifySearchUrl, this, [this](const QString &url) { - showPage(url, UrlType::Name); - }); - qApp->installEventFilter(this); -} - -MainWindow::~MainWindow() -{ - int width_remember = width() > 1000 ? width() : 1000; - int height_remember = height() > 600 ? height() : 600; - - if (m_dconfig->isValid()) { - m_dconfig->setValue(WidthConfig, width_remember); - m_dconfig->setValue(HeightConfig, height_remember); - } - resizeCurrentModule(0); -} - -void MainWindow::showPage(const QString &url, const UrlType &uType) -{ - if (qApp->activeModalWidget()) { - qInfo() << "controlcenter has modal dialog, cannot switch page"; - return; - } - qInfo() << "show page url:" << url; - if (url.isEmpty() || url == "/") { - toHome(); - } - if (!m_rootModule) { - QTimer::singleShot(10, this, [=] { - showPage(url, uType); - }); - return; - } - showPage(m_rootModule, url, uType); -} - -void MainWindow::showPage(const QString &url) -{ - if (findModule(m_rootModule, url, UrlType::Name, false)) { - showPage(url, UrlType::Name); - return; - } - QTimer::singleShot(10, this, [url, this] { - showPage(url); - }); -} - -void MainWindow::showPage(ModuleObject *const module, const QString &url, const UrlType &uType) -{ - showModule(findModule(module, url, uType)); -} - -ModuleObject *MainWindow::findModule(ModuleObject *const module, - const QString &url, - const UrlType &uType, - bool fuzzy) -{ - ModuleObject *obj = module; - QStringList names = url.split('/'); - while (!names.isEmpty() && obj) { - const QString &name = names.takeFirst(); - QString childName; - ModuleObject *objChild = nullptr; - for (auto child : obj->childrens()) { - switch (uType) { - case UrlType::DisplayName: - childName = child->displayName(); - break; - default: - childName = child->name(); - break; - } - if (childName == name || child->contentText().contains(name)) { - objChild = child; - break; - } - } - if (objChild) { - obj = objChild; - } else if (fuzzy) { - break; - } else { - return nullptr; - } - } - return obj; -} - -void MainWindow::changeEvent(QEvent *event) -{ - if (event->type() == QEvent::PaletteChange) { - updateMainView(); - } - return DMainWindow::changeEvent(event); -} - -void MainWindow::closeEvent(QCloseEvent *event) -{ - Q_UNUSED(event) - m_pluginManager->cancelLoad(); -} - -bool MainWindow::eventFilter(QObject *watched, QEvent *event) -{ - if (event->type() == QEvent::Shortcut) { - auto ke = static_cast(event); - if (ke->key() == Qt::Key_F1) { - openManual(); - return true; - } - } - return DMainWindow::eventFilter(watched, event); -} - -void MainWindow::initUI() -{ - setMinimumSize(MainWindowMininumSize); - auto root = m_rootModule->activePage(); - root->setAutoFillBackground(true); - setCentralWidget(root); - - layout()->setMargin(0); - layout()->setSpacing(0); - layout()->setContentsMargins(ZeroMargins); - - auto menu = titlebar()->menu(); - if (!menu) { - qDebug() << "menu is nullptr, create menu!"; - menu = new QMenu; - } - menu->setAccessibleName("titlebarmenu"); - titlebar()->setMenu(menu); - - auto action = new QAction(tr("Help"), menu); - menu->addAction(action); - connect(action, &QAction::triggered, this, [this] { - openManual(); - }); - - m_backwardBtn->setAccessibleName("backwardbtn"); - m_backwardBtn->setFlat(true); - // flat iconButton size too small - m_backwardBtn->setMinimumSize({32, 32}); - - titlebar()->addWidget(m_backwardBtn, Qt::AlignLeft | Qt::AlignVCenter); - titlebar()->setIcon(DIconTheme::findQIcon("preferences-system")); - - connect(m_backwardBtn, &DIconButton::clicked, this, &MainWindow::toHome); - - m_searchWidget->setMinimumSize(300, 36); - m_searchWidget->setAccessibleName("SearchModule"); - m_searchWidget->lineEdit()->setAccessibleName("SearchModuleLineEdit"); - titlebar()->addWidget(m_searchWidget, Qt::AlignCenter); -} - -void MainWindow::initConfig() -{ - if (!m_dconfig->isValid()) { - qWarning() << QString("DConfig is invalide, name:[%1], subpath[%2].") - .arg(m_dconfig->name(), m_dconfig->subpath()); - return; - } - - auto w = m_dconfig->value(WidthConfig).toInt(); - auto h = m_dconfig->value(HeightConfig).toInt(); - - resize(w, h); - Dtk::Widget::moveToCenter(this); - - updateModuleConfig(HideConfig); - updateModuleConfig(DisableConfig); - connect(m_dconfig, &DConfig::valueChanged, this, &MainWindow::updateModuleConfig); -} - -void MainWindow::configModule(QString url, ModuleObject *module) -{ - module->setFlagState(DCC_CONFIG_HIDDEN, m_hideModule.contains(url)); - module->setFlagState(DCC_CONFIG_DISABLED, m_disableModule.contains(url)); -} - -QSet findAddItems(QSet *oldSet, QSet *newSet) -{ - QSet addSet; - for (auto &&key : *newSet) { - if (!oldSet->contains(key)) { - addSet.insert(key); - } - } - return addSet; -} - -void MainWindow::updateModuleConfig(const QString &key) -{ - QSet oldModuleConfig; - QSet *newModuleConfig = nullptr; - uint32_t type = DCC_CONFIG_HIDDEN; - if (key == HideConfig) { - type = DCC_CONFIG_HIDDEN; - oldModuleConfig = m_hideModule; - newModuleConfig = &m_hideModule; - } else if (key == DisableConfig) { - type = DCC_CONFIG_DISABLED; - oldModuleConfig = m_disableModule; - newModuleConfig = &m_disableModule; - } - if (!newModuleConfig) - return; - - const auto &list = m_dconfig->value(key).toStringList(); -#if QT_VERSION >= QT_VERSION_CHECK(5, 14, 0) - *newModuleConfig = QSet(list.begin(), list.end()); -#else - *newModuleConfig = QSet::fromList(list); -#endif - QSet addModuleConfig = findAddItems(&oldModuleConfig, newModuleConfig); - QSet removeModuleConfig = findAddItems(newModuleConfig, &oldModuleConfig); - for (auto &&url : addModuleConfig) { - ModuleObject *obj = DCC_NAMESPACE::GetModuleByUrl(m_rootModule, url); - if (obj) - obj->setFlagState(type, true); - } - for (auto &&url : removeModuleConfig) { - ModuleObject *obj = DCC_NAMESPACE::GetModuleByUrl(m_rootModule, url); - if (obj) - obj->setFlagState(type, false); - } -} - -void MainWindow::loadModules(bool async, const QStringList &dirs) -{ - onAddModule(m_rootModule); - m_pluginManager->loadModules(m_rootModule, async, dirs); - showModule(m_rootModule); -} - -QString MainWindow::GrandSearchSearch(const QString json) -{ - QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toLocal8Bit().data()); - if (!jsonDocument.isNull()) { - QJsonObject jsonObject = jsonDocument.object(); - - // 处理搜索任务, 返回搜索结果 - QList> lstMsg = - m_searchWidget->searchResults(jsonObject.value("cont").toString()); - - for (auto msg : lstMsg) { - qDebug() << "name:" << msg; - } - - QJsonObject jsonResults; - QJsonArray items; - for (int i = 0; i < lstMsg.size(); i++) { - QJsonObject jsonObj; - jsonObj.insert("item", lstMsg[i].first); - jsonObj.insert("name", lstMsg[i].second); - jsonObj.insert("icon", ControlCenterIcon); - jsonObj.insert("type", "application/x-dde-control-center-xx"); - - items.insert(i, jsonObj); - } - - QJsonObject objCont; - objCont.insert("group", ControlCenterGroupName); - objCont.insert("items", items); - - QJsonArray arrConts; - arrConts.insert(0, objCont); - - jsonResults.insert("ver", jsonObject.value("ver")); - jsonResults.insert("mID", jsonObject.value("mID")); - jsonResults.insert("cont", arrConts); - - QJsonDocument document; - document.setObject(jsonResults); - - return document.toJson(QJsonDocument::Compact); - } - - return QString(); -} - -bool MainWindow::GrandSearchStop(const QString &json) -{ - Q_UNUSED(json) - return true; -} - -bool MainWindow::GrandSearchAction(const QString &json) -{ - QString searchName; - QJsonDocument jsonDocument = QJsonDocument::fromJson(json.toLocal8Bit().data()); - if (!jsonDocument.isNull()) { - QJsonObject jsonObject = jsonDocument.object(); - if (jsonObject.value("action") == "openitem") { - // 打开item的操作 - searchName = jsonObject.value("item").toString(); - } - } - - show(); - activateWindow(); - showPage(searchName, UrlType::Name); - return true; -} - -void MainWindow::toHome() -{ - showModule(m_rootModule); -} - -void MainWindow::updateMainView() -{ - // 在布局中,待实现 - // if (!m_mainView) - // return; - // // set background - // DPalette pa = DPaletteHelper::instance()->palette(m_mainView); - // QColor baseColor = palette().base().color(); - // DGuiApplicationHelper::ColorType ct = DGuiApplicationHelper::toColorType(baseColor); - // if (ct == DGuiApplicationHelper::LightType) { - // pa.setBrush(DPalette::ItemBackground, palette().base()); - // } else { - // baseColor = DGuiApplicationHelper::adjustColor(baseColor, 0, 0, +5, 0, 0, 0, 0); - // pa.setColor(DPalette::ItemBackground, baseColor); - // } - // DPaletteHelper::instance()->setPalette(m_mainView, pa); -} - -void MainWindow::clearPage(QWidget *const widget) -{ - QLayout *widgetLayout = widget->layout(); - if (!widgetLayout) - return; - - QList layouts; - layouts.append(widgetLayout); - while (!layouts.isEmpty()) { - QLayout *layout = layouts.takeFirst(); - while (!layout->isEmpty()) { - QLayoutItem *item = layout->takeAt(0); - QWidget *w = item->widget(); - if (w) - delete w; - QLayout *l = item->layout(); - if (l) - layouts.append(l); - } - delete layout; - } -} - -void MainWindow::configLayout(QBoxLayout *const layout) -{ - layout->setMargin(0); - layout->setSpacing(0); -} - -void MainWindow::showModule(ModuleObject *const module) -{ - if (m_currentModule.contains(module) && module->defultModule()) - return; - - m_backwardBtn->setVisible(module != m_rootModule); - QList modules; - - ModuleObject *child = module; - while (child) { - child->setCurrentModule(child->defultModule()); - modules.append(child); - child = child->currentModule(); - } - child = module; - ModuleObject *p = module->getParent(); - while (p) { - p->setCurrentModule(child); - modules.prepend(p); - child = p; - p = p->getParent(); - } - m_currentModule = modules; -} - -void MainWindow::resizeCurrentModule(int size) -{ - m_currentModule = m_currentModule.mid(0, size); -} - -void MainWindow::onAddModule(ModuleObject *const module) -{ - QString url = DCC_NAMESPACE::GetUrlByModule(module); - - QList> modules; - modules.append({ url, module }); - while (!modules.isEmpty()) { - auto it = modules.takeFirst(); - ModuleObject *obj = it.second; - configModule(it.first, obj); - connect(obj, &ModuleObject::insertedChild, this, &MainWindow::onAddModule); - connect(obj, &ModuleObject::removedChild, this, &MainWindow::onRemoveModule); - connect(obj, &ModuleObject::childStateChanged, this, &MainWindow::onChildStateChanged); - connect(obj, &ModuleObject::moduleDataChanged, this, &MainWindow::onModuleDataChanged); - connect(obj, - &ModuleObject::triggered, - this, - &MainWindow::onTriggered, - Qt::QueuedConnection); - m_searchWidget->addModule(obj); - for (auto &&tmpObj : obj->childrens()) { - modules.append({ it.first + "/" + tmpObj->name(), tmpObj }); - } - } -} - -void MainWindow::onRemoveModule(ModuleObject *const module) -{ - QList modules; - modules.append(module); - while (!modules.isEmpty()) { - ModuleObject *obj = modules.takeFirst(); - disconnect(obj, nullptr, this, nullptr); - m_searchWidget->removeModule(obj); - modules.append(obj->childrens()); - } - // 最后一个是滚动到,不参与比较 - if (!m_currentModule.isEmpty() - && std::any_of(m_currentModule.cbegin(), m_currentModule.cend() - 1, [module](auto &&data) { - return data == module; - })) - toHome(); -} - -void MainWindow::onTriggered() -{ - QObject *qobj = sender(); - ModuleObject *module = qobject_cast(sender()); - ModuleObject *obj = dynamic_cast(sender()); - if (obj && qobj && module) { - showModule(obj); - } -} - -void MainWindow::onChildStateChanged(ModuleObject *const child, uint32_t flag, bool state) -{ - if (ModuleObject::IsHiddenFlag(flag)) { - if (state) - onRemoveModule(child); - else - onAddModule(child); - } -} - -void MainWindow::onModuleDataChanged() -{ - ModuleObject *module = qobject_cast(sender()); - if (module) { - m_searchWidget->removeModule(module); - m_searchWidget->addModule(module); - } -} - -void MainWindow::openManual() -{ - QString helpTitle; - if (1 < m_currentModule.count()) - helpTitle = m_currentModule[1]->name(); - if (helpTitle.isEmpty()) - helpTitle = "controlcenter"; - - const QString &dmanInterface = "com.deepin.Manual.Open"; - QDBusInterface interface(dmanInterface, - "/com/deepin/Manual/Open", - dmanInterface, - QDBusConnection::sessionBus()); - - QDBusMessage reply = interface.call("OpenTitle", "dde", helpTitle); - if (reply.type() == QDBusMessage::ErrorMessage) { - qWarning() << "Open manual failed, error message:" << reply.errorMessage(); - } -} - -QString MainWindow::getAllModule() const -{ - ModuleObject *root = m_rootModule; - QList> modules; - for (auto &&child : root->childrens()) { - modules.append({ child, { child->name(), child->displayName() } }); - } - - QJsonArray arr; - while (!modules.isEmpty()) { - const auto &urlInfo = modules.takeFirst(); - QJsonObject obj; - obj.insert("url", urlInfo.second.at(0)); - obj.insert("displayName", urlInfo.second.at(1)); - arr.append(obj); - const QList &children = urlInfo.first->childrens(); - for (auto it = children.crbegin(); it != children.crend(); ++it) - modules.prepend({ *it, - { urlInfo.second.at(0) + "/" + (*it)->name(), - urlInfo.second.at(1) + "/" + (*it)->displayName() } }); - } - - QJsonDocument doc; - doc.setArray(arr); - return doc.toJson(QJsonDocument::Compact); -} diff --git a/dcc-old/src/frame/mainwindow.h b/dcc-old/src/frame/mainwindow.h deleted file mode 100644 index 48392a283f..0000000000 --- a/dcc-old/src/frame/mainwindow.h +++ /dev/null @@ -1,106 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include - -#include - -#include - -/*************forward declaring start****************/ - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DBackgroundGroup; -class DIconButton; -class DListView; -DWIDGET_END_NAMESPACE - -class QStandardItemModel; -class QBoxLayout; -class QScrollArea; -class QAbstractItemView; - -namespace DCC_NAMESPACE { - -class ModuleObject; -class PluginManager; -class SearchWidget; - -/**************forward declaring end*****************/ - -class MainWindow : public Dtk::Widget::DMainWindow, protected QDBusContext -{ - Q_OBJECT -public: - enum class UrlType { Name, DisplayName }; - explicit MainWindow(QWidget *parent = nullptr); - virtual ~MainWindow() override; - - /** - * @brief 显示路径请求的页面,用于搜索接口 - * @param url 路径地址,从左至右搜索,如路径错误,只显示已搜索出的模块 - */ - void showPage(const QString &url, const UrlType &uType); - /** - * @brief 显示路径请求的页面,用于DBus接口,会延时到所有插件加载完成再调用 - * @param url 路径地址 - */ - void showPage(const QString &url); - QString getAllModule() const; - void loadModules(bool async, const QStringList &dirs); - - QString GrandSearchSearch(const QString json); - bool GrandSearchStop(const QString &json); - bool GrandSearchAction(const QString &json); - -protected: - void changeEvent(QEvent *event) override; - void closeEvent(QCloseEvent *event) override; - virtual bool eventFilter(QObject *watched, QEvent *event) override; - -private: - void openManual(); - void initUI(); - void initConfig(); - void configModule(QString url, ModuleObject *module); - void toHome(); - void updateMainView(); - void clearPage(QWidget *const widget); - void configLayout(QBoxLayout *const layout); - void showPage(ModuleObject *const module, const QString &url, const UrlType &uType); - ModuleObject *findModule(ModuleObject *const module, - const QString &url, - const UrlType &uType, - bool fuzzy = true); - void showModule(ModuleObject *const module); - void resizeCurrentModule(int size); - -private Q_SLOTS: - void onAddModule(ModuleObject *const module); - void onRemoveModule(ModuleObject *const module); - void onTriggered(); - void onChildStateChanged(ModuleObject *const child, uint32_t flag, bool state); - void onModuleDataChanged(); - void updateModuleConfig(const QString &key); - -private: - Dtk::Widget::DIconButton *m_backwardBtn; // 回退按钮 - Dtk::Core::DConfig *m_dconfig; // 配置 - SearchWidget *m_searchWidget; // 搜索框 - ModuleObject *m_rootModule; - QList m_currentModule; - PluginManager *m_pluginManager; - - QSet m_hideModule; - QSet m_disableModule; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/frame/pluginmanager.cpp b/dcc-old/src/frame/pluginmanager.cpp deleted file mode 100644 index f08ba363df..0000000000 --- a/dcc-old/src/frame/pluginmanager.cpp +++ /dev/null @@ -1,331 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "pluginmanager.h" - -#include "interface/moduleobject.h" -#include "interface/plugininterface.h" -#include "utils.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcFramePluginManager, "dcc-frame-pluginManager") - -#include -#include - -std::mutex PLUGIN_LOAD_GUARD; - -using namespace DCC_NAMESPACE; - -const static QString TranslateReadDir = QStringLiteral(TRANSLATE_READ_DIR); - -bool comparePluginLocation(PluginInterface const *target1, PluginInterface const *target2) -{ - return target1->location() < target2->location(); -} - -PluginData getModule(const QPair &pair) -{ - PluginData data = pair.second; - if (data.Plugin) { - QElapsedTimer et; - et.start(); - data.Module = data.Plugin->module(); - data.Module->setParent(nullptr); - data.Module->moveToThread(qApp->thread()); - qCInfo(DdcFramePluginManager) << QString("get module: %1 end, using time: %2 ms") - .arg(data.Module->name()) - .arg(et.elapsed()); - emit pair.first->loadedModule(data); - } - return data; -} - -PluginData loadPlugin(const QPair &pair) -{ - PluginData data; - data.Plugin = nullptr; - data.Module = nullptr; - data.Location = "-1"; - auto &&fileName = pair.second; - QFileInfo fileInfo(fileName); - QSettings settings(DCC_NAMESPACE::CollapseConfgPath, QSettings::IniFormat); - settings.beginGroup("collapse"); - const QByteArray &md5 = settings.value(fileInfo.fileName()).toByteArray(); - settings.endGroup(); - if (DCC_NAMESPACE::getFileMd5(fileName).toHex() == md5) { - qCWarning(DdcFramePluginManager) - << QString("The Plugin: %1 crashed, will not load!").arg(fileName); - return data; - } - qCInfo(DdcFramePluginManager) << "loading plugin: " << fileName; - - QElapsedTimer et; - et.start(); - QScopedPointer loader(new QPluginLoader(fileName)); - if (!loader->load()) { - qCWarning(DdcFramePluginManager) << QString("The plugin: %1 load failed! error message: %2") - .arg(fileName, loader->errorString()); - return data; - } - const QJsonObject &meta = loader->metaData().value("MetaData").toObject(); - - PluginInterface *plugin = qobject_cast(loader->instance()); - if (!plugin) { - qCWarning(DdcFramePluginManager) << QString("Can't read plugin: %1").arg(fileName); - loader->unload(); - return data; - } - - // FIXME: load all plugin under treeland - static QByteArray compositor = qgetenv("DDE_CURRENT_COMPOSITOR"); - static QStringList allowedUnderTreeland{ "accounts", - "display", - "systeminfo", - "Default Applications" }; - - if (compositor.compare("treeland", Qt::CaseInsensitive) == 0 - and !allowedUnderTreeland.contains(plugin->name())) { - qCWarning(DdcFramePluginManager) - << QString("plugin %1 has been banned under treeland.").arg(plugin->name()); - loader->unload(); - return data; - } - - data.Plugin = plugin; - data.Follow = plugin->follow(); - data.Location = plugin->location(); - data.Plugin->setParent(nullptr); - data.Plugin->moveToThread(qApp->thread()); - qCInfo(DdcFramePluginManager) - << QString("load plugin: %1 end, using time: %2 ms").arg(fileName).arg(et.elapsed()); - return data; -} - -PluginManager::PluginManager(QObject *parent) - : QObject(parent) - , m_rootModule(nullptr) -{ - qRegisterMetaType("PluginData"); -} - -void PluginManager::loadModules(ModuleObject *root, bool async, const QStringList &dirs) -{ - if (!root) - return; - m_rootModule = root; - - connect(this, &PluginManager::loadedModule, root, [this](const PluginData &data) { - initModules(data); - }); - - QFileInfoList pluginList; - for (const auto &dir : dirs) { - QDir plugindir(dir); - if (plugindir.exists()) { - pluginList += plugindir.entryInfoList(); - } - } - - QSet filenames; - QList> libraryNames; - for (auto &lib : pluginList) { - const QString &filepath = lib.absoluteFilePath(); - if (!QLibrary::isLibrary(filepath)) { - continue; - } - auto filename = lib.fileName(); - // 不加载文件名重复的模块 - if (filenames.contains(filename)) { - continue; - } - filenames.insert(filename); - libraryNames.append({ this, filepath }); - m_pluginsStatus.push_back(filepath); - } - - QFutureWatcher *watcher = new QFutureWatcher(this); - std::function(const QPair &pair)> - loadPluginAndRecord = [](const QPair &pair) { - auto plugin = loadPlugin(pair); - return QPair{ plugin, pair.second }; - }; - auto results = QtConcurrent::mapped(libraryNames, loadPluginAndRecord).results(); - using Dtk::Gui::DGuiApplicationHelper; - for (const auto &re : results) { - if (re.first.Plugin) { - QString qmFile = QString("%1/%2_%3.qm") - .arg(TranslateReadDir) - .arg(re.first.Plugin->name()) - .arg(QLocale::system().name()); - if (!QFile::exists(qmFile)) { - continue; - } - DGuiApplicationHelper::loadTranslator(re.first.Plugin->name(), - { TranslateReadDir }, - QList() << QLocale::system()); - } - } - std::function)> loadModuleAndRecord = - [this](const QPair &data) { - if (data.first.Plugin) { - getModule({ this, data.first }); - } - std::lock_guard guard(PLUGIN_LOAD_GUARD); - m_pluginsStatus.remove(m_pluginsStatus.indexOf(data.second)); - return data.first; - }; - m_future = QtConcurrent::mapped(results, loadModuleAndRecord); - connect(watcher, &QFutureWatcher::finished, this, [this] { - // 加载非一级插件 - insertChild(true); - emit loadAllFinished(); - }); - watcher->setFuture(m_future); - - QtConcurrent::run([this] { - // NOTE: wait for all plugin for 10 seconds, if timeout and run with sync - // then watcher will be finished - QThread::sleep(10); - std::lock_guard guard(PLUGIN_LOAD_GUARD); - if (!m_pluginsStatus.isEmpty()) { - QString logMessage = "Some plugins not loaded in time: "; - for (const QString &value : m_pluginsStatus) { - logMessage.push_back(value.split('/').last()); - logMessage.push_back(";"); - } - qCWarning(DdcFramePluginManager) << logMessage; - } - }); - if (!async) { - for (int i = 0; i < 50; i++) { - QThread::msleep(100); - if (m_pluginsStatus.isEmpty()) { - break; - } - } - } -} - -void PluginManager::cancelLoad() -{ - if (!loadFinished()) { - m_future.cancel(); - } -} - -bool PluginManager::loadFinished() const -{ - return m_pluginsStatus.isEmpty(); -} - -ModuleObject *PluginManager::findModule(ModuleObject *module, const QString &name) -{ - if (!module) - return nullptr; - - std::queue qbfs; - qbfs.push(module); - while (!qbfs.empty()) { - if (qbfs.front()->name() == name) - return qbfs.front(); - for (auto &&child : qbfs.front()->childrens()) { - qbfs.push(child); - } - qbfs.pop(); - } - - return nullptr; -} - -void PluginManager::initModules(const PluginData &data) -{ - if (data.Follow.isEmpty()) { // root plugin - data.Module->setProperty("location", data.Location); - if (!m_rootModule->hasChildrens()) { - m_rootModule->appendChild(data.Module); - insertChild(false); - return; - } - if (data.Location.isEmpty()) { - m_rootModule->appendChild(data.Module); - insertChild(false); - return; - } - bool isInt; - int curLocation = data.Location.toInt(&isInt); - - int i = m_rootModule->childrens().count() - 1; - for (; i >= 0; i--) { - if (isInt) { - bool ok = false; - const QString &location = - m_rootModule->childrens().at(i)->property("location").toString(); - int tmpLocation = location.toInt(&ok); - if (ok && tmpLocation >= 0 && curLocation > tmpLocation) { - break; - } - } else { - if (m_rootModule->children(i)->name() == data.Location) - break; - } - } - m_rootModule->insertChild(i + 1, data.Module); - insertChild(false); - } else { // other plugin - m_datas.append(data); - } -} - -void PluginManager::insertChild(bool force) -{ - bool loop = true; - while (loop) { - loop = false; - for (auto it = m_datas.begin(); it != m_datas.end();) { - auto &&module = DCC_NAMESPACE::GetModuleByUrl(m_rootModule, it->Follow); - if (module) { - bool isInt; - int locationIndex = it->Location.toInt(&isInt); - if (!isInt) { - for (locationIndex = 0; locationIndex < module->getChildrenSize(); - ++locationIndex) { - if (module->children(locationIndex)->name() == it->Location) { - ++locationIndex; - break; - } - } - } - module->insertChild(locationIndex, it->Module); - loop = true; - it = m_datas.erase(it); - } else - ++it; - } - } - if (force) { - // 释放加不进去的module - for (auto &&data : m_datas) { - qCWarning(DdcFramePluginManager) - << "Unknown Module! name:" << data.Module->name() << "follow:" << data.Follow - << "location:" << data.Location; - delete data.Module; - } - m_datas.clear(); - } -} diff --git a/dcc-old/src/frame/pluginmanager.h b/dcc-old/src/frame/pluginmanager.h deleted file mode 100644 index b06bc87f21..0000000000 --- a/dcc-old/src/frame/pluginmanager.h +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "utils.h" - -#include -#include -#include - -class QPluginLoader; - -namespace DCC_NAMESPACE { -class ModuleObject; -class PluginInterface; -class LayoutManager; -} // namespace DCC_NAMESPACE - -struct PluginData -{ - QString Follow; - QString Location; - DCC_NAMESPACE::ModuleObject *Module; - DCC_NAMESPACE::PluginInterface *Plugin; -}; - -Q_DECLARE_METATYPE(PluginData) - -namespace DCC_NAMESPACE { -class PluginManager : public QObject -{ - Q_OBJECT -public: - explicit PluginManager(QObject *parent = nullptr); - void loadModules(ModuleObject *root, - bool async = true, - const QStringList &dirs = { PLUGIN_DIRECTORY }); - bool loadFinished() const; - -public Q_SLOTS: - void cancelLoad(); - -Q_SIGNALS: - void loadedModule(const PluginData &data); - void loadAllFinished(); - -private: - ModuleObject *findModule(ModuleObject *module, const QString &name); - void initModules(const PluginData &data); - void insertChild(bool force); - - QList m_datas; // cache for other plugin - ModuleObject *m_rootModule; // root module from MainWindow - QFuture m_future; - QVector m_pluginsStatus; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/frame/searchwidget.cpp b/dcc-old/src/frame/searchwidget.cpp deleted file mode 100644 index 633808ba28..0000000000 --- a/dcc-old/src/frame/searchwidget.cpp +++ /dev/null @@ -1,397 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "searchwidget.h" -#include "completerview.h" -#include "interface/moduleobject.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#if DTK_VERSION >= DTK_VERSION_CHECK(5, 6, 0, 0) -# define USE_DCIICON -#endif - -#ifdef USE_DCIICON -# include -# include -# include -DGUI_USE_NAMESPACE -#endif - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -const QStringList &FilterText{ "-", "--", "-->", "->", ">", "/" }; -enum CompleterRole { - UrlRole = Qt::UserRole + 1, - SearchRole, - DisplayNameRole, - ModuleRole, -}; - -DccCompleter::DccCompleter(QObject *parent) - : QCompleter(parent) -{ -} - -DccCompleter::DccCompleter(QAbstractItemModel *model, QObject *parent) - : QCompleter(model, parent) -{ -} - -bool DccCompleter::eventFilter(QObject *o, QEvent *e) -{ - // 匹配列表隐藏时,将滑动条恢复到顶部 - if (e->type() == QEvent::Hide) { - popup()->scrollToTop(); - } - - if (e->type() == QEvent::FocusOut) { - return QCompleter::eventFilter(o, e); - } - - if (e->type() == QEvent::KeyPress) { - QKeyEvent *ke = static_cast(e); - QModelIndex keyIndex; - switch (ke->key()) { - case Qt::Key_Up: { - if (popup()->currentIndex().row() == 0) { - keyIndex = popup()->model()->index(popup()->model()->rowCount() - 1, 0); - popup()->setCurrentIndex(keyIndex); - } else { - keyIndex = popup()->model()->index(popup()->currentIndex().row() - 1, 0); - popup()->setCurrentIndex(keyIndex); - } - return true; - } - case Qt::Key_Down: { - if (popup()->currentIndex().row() == popup()->model()->rowCount() - 1) { - keyIndex = popup()->model()->index(0, 0); - popup()->setCurrentIndex(keyIndex); - } else { - keyIndex = popup()->model()->index(popup()->currentIndex().row() + 1, 0); - popup()->setCurrentIndex(keyIndex); - } - return true; - } - case Qt::Key_Return: - case Qt::Key_Enter: - if (popup()->isVisible() && !popup()->currentIndex().isValid()) { - keyIndex = popup()->model()->index(0, 0); - popup()->setCurrentIndex(keyIndex); - } - popup()->hide(); - //原因:在QCompleter上执行回车操作会触发它的activated()信号,回车也会触发DLineEdit的returnPressed()信号 - //导致一个操作触发两次执行,模块load()会被执行两次,导致程序崩溃 - //方法:在QCompleter的eventFilter()函数中对回车操作做过滤,直接触发DLineEdit的returnPressed()信号, - //不继续将事件传给QCompleter,保证回车只触发一次操作 - Q_EMIT static_cast(this->parent())->returnPressed(); - return true; - } - } - return QCompleter::eventFilter(o, e); -} - -DccCompleterStyledItemDelegate::DccCompleterStyledItemDelegate(QObject *parent) - : QStyledItemDelegate(parent) -{ -} - -void DccCompleterStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - if (cg == QPalette::Normal && !(option.state & QStyle::State_Active)) { - cg = QPalette::Inactive; - } - - if (option.showDecorationSelected && (option.state & (QStyle::State_Selected | QStyle::State_MouseOver))) { - painter->fillRect(option.rect, option.palette.brush(cg, QPalette::Highlight)); - } - - ModuleObject *p = index.data(CompleterRole::ModuleRole).value(); - if (p->getParent()) { - while (p->getParent()->getParent()) { - p = p->getParent(); - } - } - QVariant iconVar = p->icon(); - QRect iconRect = calculateIconRect(option.rect); -#ifdef USE_DCIICON - DDciIcon dciIcon; - if (iconVar.canConvert()) { - dciIcon = iconVar.value(); - } else if (iconVar.type() == QVariant::String) { - QString iconstr = iconVar.toString(); - if (!iconstr.isEmpty()) { - dciIcon = DDciIcon::fromTheme(iconstr); - if (dciIcon.isNull()) - dciIcon = DDciIcon(iconstr); - } - } - if (!dciIcon.isNull()) { - DDciIcon::Mode dciMode = DDciIcon::Normal; - if (option.state & QStyle::State_Enabled) { - if (option.state & (QStyle::State_Sunken | QStyle::State_Selected)) { - dciMode = DDciIcon::Pressed; - } else if (option.state & QStyle::State_MouseOver) { - dciMode = DDciIcon::Hover; - } - } else { - dciMode = DDciIcon::Disabled; - } - - DDciIcon::Theme theme = DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType ? DDciIcon::Dark : DDciIcon::Light; - - painter->save(); - painter->setBrush(Qt::NoBrush); - dciIcon.paint(painter, iconRect, painter->device() ? painter->device()->devicePixelRatioF() : qApp->devicePixelRatio(), theme, dciMode, option.decorationAlignment); - painter->restore(); - iconVar.clear(); - } -#endif - if (iconVar.isValid()) { - QIcon icon; - if (iconVar.type() == QVariant::Icon) { - icon = iconVar.value(); - } else if (iconVar.type() == QVariant::String) { - const QString &iconstr = iconVar.toString(); - icon = DIconTheme::findQIcon(iconstr); - if (icon.isNull()) - icon = QIcon(iconstr); - } - if (!icon.isNull()) { - QIcon::Mode mode = QIcon::Normal; - if (!(option.state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (option.state & QStyle::State_Selected) - mode = QIcon::Selected; - - QIcon::State state = (option.state & QStyle::State_Open) ? QIcon::On : QIcon::Off; - icon.paint(painter, iconRect, option.decorationAlignment, mode, state); - } - } - // draw text - QRect textRect = calculateTextRect(option.rect); - auto font = option.font; - font.setPixelSize(DFontSizeManager::instance()->fontPixelSize(DFontSizeManager::T6)); - const QFontMetrics fontMetrics(font); - QString newText = fontMetrics.elidedText(index.data(Qt::DisplayRole).toString(), Qt::ElideRight, textRect.width()); - - if (option.state & (QStyle::State_Selected | QStyle::State_MouseOver)) { - painter->setPen(option.palette.color(cg, QPalette::HighlightedText)); - } else { - painter->setPen(option.palette.color(cg, QPalette::Text)); - } - painter->setFont(font); - painter->drawText(textRect, Qt::AlignVCenter, newText); -} - -QSize DccCompleterStyledItemDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - QSize s = QStyledItemDelegate::sizeHint(option, index); - s.setHeight(DSizeModeHelper::element(24, 36)); - return s; -} - -bool DccCompleterStyledItemDelegate::helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) -{ - switch (event->type()) { - case QEvent::WhatsThis: - case QEvent::ToolTip: { - QString text = index.data(Qt::DisplayRole).toString(); - auto font = option.font; - font.setPixelSize(DFontSizeManager::instance()->fontPixelSize(DFontSizeManager::T6)); - const QFontMetrics fontMetrics(font); - if (fontMetrics.size(0, text).width() <= calculateTextRect(option.rect).width()) { - QToolTip::showText(event->globalPos(), QString()); - event->setAccepted(true); - return true; - } - } break; - default: - break; - } - return QStyledItemDelegate::helpEvent(event, view, option, index); -} - -QRect DccCompleterStyledItemDelegate::calculateIconRect(const QRect &rect) const -{ - return QRect(8, rect.y() + (rect.height() - 24) / 2, 24, 24); -} - -QRect DccCompleterStyledItemDelegate::calculateTextRect(const QRect &rect) const -{ - return rect.adjusted(calculateIconRect(rect).right() + 8, 0, -8, 0); -} - -SearchWidget::SearchWidget(QWidget *parent) - : DSearchEdit(parent) - , m_model(new QStandardItemModel(this)) - , m_completer(new DccCompleter(m_model, this)) - , m_completerView(new CompleterView(this)) - , m_bIsChinese(false) -{ - const QString &language = QLocale::system().name(); - m_bIsChinese = language == "zh_CN" || language == "zh_HK" || language == "zh_TW"; - - DccCompleterStyledItemDelegate *delegate = new DccCompleterStyledItemDelegate(m_completer); - m_completer->setPopup(m_completerView); - m_completer->popup()->setItemDelegate(delegate); - m_completer->popup()->setAttribute(Qt::WA_InputMethodEnabled); - - m_completer->setFilterMode(Qt::MatchContains); //设置QCompleter支持匹配字符搜索 - m_completer->setCaseSensitivity(Qt::CaseInsensitive); //这个属性可设置进行匹配时的大小写敏感性 - m_completer->setWrapAround(false); - m_completer->installEventFilter(this); - m_completer->setWidget(lineEdit()); //设置自动补全时弹出时相应位置的widget - - m_completer->setCompletionRole(CompleterRole::SearchRole); - - connect(this, &DSearchEdit::textChanged, this, &SearchWidget::onSearchTextChange); - - connect(this, &DSearchEdit::returnPressed, this, &SearchWidget::onReturnPressed); - - //鼠标点击后直接页面跳转(存在同名信号) - connect(m_completer, qOverload(&QCompleter::activated), this, &SearchWidget::onReturnPressed); -} - -void SearchWidget::setModuleObject(ModuleObject *const module) -{ - m_rootModule = module; -} - -QList> SearchWidget::searchResults(const QString text) -{ - QList> result; - m_completer->setCompletionPrefix(text); - QAbstractItemModel *model = m_completer->completionModel(); - for (int i = 0; i < model->rowCount(); i++) { - const QModelIndex &index = model->index(i, 0); - result.append({ index.data(CompleterRole::UrlRole).toString(), index.data().toString() }); - } - return result; -} - -void SearchWidget::addModule(ModuleObject *const module) -{ - if (ModuleObject::IsHidden(module) || module->noSearch() || (module->displayName().isEmpty() && module->contentText().isEmpty())) - return; - - QList moduleurl; - QStringList urls; - QStringList displayNames; - ModuleObject *p = module; - while (p->getParent()) { - if (ModuleObject::IsHidden(p)) - return; - moduleurl.prepend(p); - urls.prepend(p->name()); - const QString &&displayName = p->displayName(); - if (!displayName.isEmpty()) { - displayNames.prepend(displayName); - } - p = p->getParent(); - } - - QString text = convertUrl(displayNames); - if (m_allText.contains(text)) { - return; - } - m_allText.insert(text); - QStandardItem *item = new QStandardItem; - item->setText(text); - item->setToolTip(text); - item->setData(urls.join("/"), CompleterRole::UrlRole); - item->setData(QVariant::fromValue((ModuleObject *)(module)), CompleterRole::ModuleRole); - QString searchStr = module->displayName(); - item->setData(searchStr, CompleterRole::DisplayNameRole); - - searchStr.remove(' '); - QStringList searchList(searchStr); - if (m_bIsChinese) { - searchStr.remove(QRegularExpression(R"([a-zA-Z\d]+)")); - QStringList displaynameList = Dtk::Core::Chinese2Pinyin(searchStr).split(QRegularExpression(R"(\d+)")); - if (!displaynameList.isEmpty()) { - searchList << displaynameList.join(QString()); - QString initial; - for (auto &&str : displaynameList) { - if (!str.isEmpty()) - initial.append(str.at(0)); - } - searchList << initial; - } - } - item->setData(searchList.join("\n"), CompleterRole::SearchRole); - m_model->appendRow(item); -} - -void SearchWidget::removeModule(ModuleObject *const module) -{ - for (int i = 0; i < m_model->rowCount(); i++) { - if (m_model->index(i, 0).data(CompleterRole::ModuleRole).value() == module) { - m_allText.remove(m_model->index(i, 0).data().toString()); - m_model->removeRow(i); - break; - } - } -} - -QString SearchWidget::convertUrl(const QStringList &displayNames) -{ - return displayNames.join(" / "); -} - -void SearchWidget::onReturnPressed() -{ - if (!text().isEmpty()) { - // enter defalt set first - const QString &url = m_completer->popup()->currentIndex().data(CompleterRole::UrlRole).toString(); - if (!url.isEmpty()) { - blockSignals(true); - setText(m_completer->popup()->currentIndex().data(CompleterRole::DisplayNameRole).toString()); - blockSignals(false); - Q_EMIT notifySearchUrl(url); - } - } -} - -void SearchWidget::onSearchTextChange(const QString &text) -{ - const QString &t = text.simplified(); - if (FilterText.contains(t)) - return; - //发送该信号,用于解决外部直接setText的时候,搜索的图标不消失的问题 - Q_EMIT focusChanged(true); - //实现自动补全 - onAutoComplete(t); - - m_completerView->resize(m_completerView->width(), m_completerView->height() + m_completerView->margin()); - // 当搜索popup弹窗在搜索框上方时,因为resize导致popup的高度增加了margin(),所以需要上移margin(),否则会遮盖搜索框,再增加6x与搜索框间隔 - if (this->mapToGlobal(this->geometry().topLeft()).y() > m_completerView->geometry().y()) { - m_completerView->move(m_completerView->x(), m_completerView->y() - m_completerView->margin() - 6); - } -} - -void SearchWidget::onAutoComplete(const QString &text) -{ - auto *widget = m_completer->popup(); - if (widget && text.isEmpty()) { - widget->hide(); - } else { - QString str = text; - str.remove(' '); - m_completer->setCompletionPrefix(str); - m_completer->complete(rect().adjusted(0, 0, 0, 8)); - } -} diff --git a/dcc-old/src/frame/searchwidget.h b/dcc-old/src/frame/searchwidget.h deleted file mode 100644 index ec9d92b43d..0000000000 --- a/dcc-old/src/frame/searchwidget.h +++ /dev/null @@ -1,76 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include -#include -#include -#include - -class QStandardItemModel; - -namespace DCC_NAMESPACE { - -class ModuleObject; -class CompleterView; - -class DccCompleter : public QCompleter -{ -public: - DccCompleter(QObject *parent = nullptr); - DccCompleter(QAbstractItemModel *model, QObject *parent = nullptr); - -public: - bool eventFilter(QObject *o, QEvent *e) override; -}; - -class DccCompleterStyledItemDelegate : public QStyledItemDelegate -{ - Q_OBJECT -public: - explicit DccCompleterStyledItemDelegate(QObject *parent = nullptr); - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; - -protected: - bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index) override; - QRect calculateIconRect(const QRect &rect) const; - QRect calculateTextRect(const QRect &rect) const; -}; - -class SearchWidget : public Dtk::Widget::DSearchEdit -{ - Q_OBJECT -public: - explicit SearchWidget(QWidget *parent = nullptr); - - void setModuleObject(ModuleObject *const module); - QList> searchResults(const QString text); - - void addModule(ModuleObject *const module); - void removeModule(ModuleObject *const module); - -signals: - void notifySearchUrl(const QString &url); - -private: - QString convertUrl(const QStringList &displayNames); - -private slots: - void onReturnPressed(); - void onSearchTextChange(const QString &text); - void onAutoComplete(const QString &text); - -private: - QStandardItemModel *m_model; - DccCompleter *m_completer; - CompleterView *m_completerView; - ModuleObject *m_rootModule; - bool m_bIsChinese; - QSet m_allText; // 去重 -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/frame/utils.cpp b/dcc-old/src/frame/utils.cpp deleted file mode 100644 index 00d53593cb..0000000000 --- a/dcc-old/src/frame/utils.cpp +++ /dev/null @@ -1,81 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "utils.h" -#include "interface/moduleobject.h" - -#include -#include -#include - -using namespace DCC_NAMESPACE; - -QByteArray DCC_NAMESPACE::getFileMd5(const QString &filePath) -{ - QFile localFile(filePath); - - if (!localFile.open(QFile::ReadOnly)) { - qDebug() << "file open error."; - return 0; - } - - QCryptographicHash ch(QCryptographicHash::Md5); - - quint64 totalBytes = 0; - quint64 bytesWritten = 0; - quint64 bytesToWrite = 0; - quint64 loadSize = 1024 * 4; - QByteArray buf; - - totalBytes = localFile.size(); - bytesToWrite = totalBytes; - - while (true) { - if (bytesToWrite > 0) { - buf = localFile.read(qMin(bytesToWrite, loadSize)); - ch.addData(buf); - bytesWritten += buf.length(); - bytesToWrite -= buf.length(); - buf.resize(0); - } else { - break; - } - - if (bytesWritten == totalBytes) { - break; - } - } - - localFile.close(); - return ch.result(); -} - -ModuleObject *DCC_NAMESPACE::GetModuleByUrl(ModuleObject *const root, const QString &url) -{ - ModuleObject *obj = root; - ModuleObject *parent = nullptr; - QStringList names = url.split('/'); - while (!names.isEmpty() && obj) { - const QString &name = names.takeFirst(); - parent = obj; - obj = nullptr; - for (auto &&child : parent->childrens()) { - if (child->name() == name) { - obj = child; - break; - } - } - } - return names.isEmpty() ? obj : nullptr; -} - -QString DCC_NAMESPACE::GetUrlByModule(ModuleObject *const module) -{ - QStringList url; - ModuleObject *obj = module; - while (obj && obj->getParent()) { - url.prepend(obj->name()); - obj = obj->getParent(); - } - return url.join('/'); -} diff --git a/dcc-old/src/frame/utils.h b/dcc-old/src/frame/utils.h deleted file mode 100644 index 55eb5a5300..0000000000 --- a/dcc-old/src/frame/utils.h +++ /dev/null @@ -1,27 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include -#include - -#define IS_SERVER_SYSTEM (DSysInfo::UosServer == DSysInfo::uosType()) // 是否是服务器版 -#define IS_COMMUNITY_SYSTEM (DSysInfo::UosCommunity == DSysInfo::uosEditionType()) // 是否是社区版 -#define IS_PROFESSIONAL_SYSTEM (DSysInfo::UosProfessional == DSysInfo::uosEditionType()) // 是否是专业版 -#define IS_HOME_SYSTEM (DSysInfo::UosHome == DSysInfo::uosEditionType()) // 是否是个人版 -#define IS_EDUCATION_SYSTEM (DSysInfo::UosEducation == DSysInfo::uosEditionType()) // 是否是教育版 -#define IS_DEEPIN_DESKTOP (DSysInfo::DeepinDesktop == DSysInfo::deepinType()) // 是否是Deepin桌面 - -namespace DCC_NAMESPACE { -class ModuleObject; - -static const QString &CollapseConfgPath = QDir::tempPath() + "/dde-control-center-collapse.conf"; -QByteArray getFileMd5(const QString &filePath); -ModuleObject *GetModuleByUrl(ModuleObject *const root, const QString &url); -QString GetUrlByModule(ModuleObject *const module); - -inline const QString PLUGIN_DIRECTORY = QStringLiteral(DCC_DefaultModuleDirectory); -inline const QString OLD_PLUGIN_DIRECTORY = QStringLiteral("/usr/lib/dde-control-center/modules/"); -} diff --git a/dcc-old/src/interface/hlistmodule.cpp b/dcc-old/src/interface/hlistmodule.cpp deleted file mode 100644 index 257a68de0c..0000000000 --- a/dcc-old/src/interface/hlistmodule.cpp +++ /dev/null @@ -1,160 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "hlistmodule.h" -#include "moduledatamodel.h" -#include "tabitemdelegate.h" -#include "tabview.h" -#include "pagemodule.h" - -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { -class HListModulePrivate -{ -public: - explicit HListModulePrivate(HListModule *parent) - : q_ptr(parent) - , m_view(nullptr) - , m_layout(nullptr) - { - } - - void onCurrentModuleChanged(ModuleObject *child) - { - if (!m_layout) - return; - if (m_layout->count() > 1) { - QLayoutItem *item = m_layout->takeAt(1); - delete item->widget(); - delete item; - } - if (child) { - PageModule *module = qobject_cast(child); - if(module) { - module->setContentsMargins(60, 0, 60, 0); - module->setMaximumWidth(DCC_PAGEMODULE_MAX_WIDTH + 60 * 2); - } - m_layout->addWidget(child->activePage(), 60); - ModuleDataModel *model = static_cast(m_view->model()); - m_view->setCurrentIndex(model->index(child)); - } - } - - QWidget *page() - { - Q_Q(HListModule); - QWidget *parentWidget = new QWidget(); - m_layout = new QVBoxLayout(parentWidget); - m_layout->setContentsMargins(0, 10, 0, 10); - parentWidget->setLayout(m_layout); - QObject::connect(parentWidget, &QObject::destroyed, m_layout, [this]() { m_layout = nullptr; }); - - m_view = new TabView; - - TabItemDelegate *delegate = new TabItemDelegate(m_view); - ModuleDataModel *model = new ModuleDataModel(m_view); - model->setModuleObject(q); - QObject::connect(q, &HListModule::currentModuleChanged, m_layout, [this](ModuleObject *child) { - onCurrentModuleChanged(child); - }); - m_view->setModel(model); - m_view->setItemDelegate(delegate); - - m_layout->addWidget(m_view); - - auto onClicked = [](const QModelIndex &index) { - ModuleObject *obj = static_cast(index.internalPointer()); - if (obj) - obj->trigger(); - }; - - QObject::connect(m_view, &TabView::activated, m_view, &TabView::clicked); - QObject::connect(m_view, &TabView::clicked, m_view, onClicked); - - onCurrentModuleChanged(q->currentModule()); - return parentWidget; - } - -private: - HListModule *q_ptr; - Q_DECLARE_PUBLIC(HListModule) - - TabView *m_view; - QVBoxLayout *m_layout; -}; -} - -HListModule::HListModule(QObject *parent) - : ModuleObject(parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, QObject *parent) - : ModuleObject(name, displayName, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QStringList &contentText, QObject *parent) - : ModuleObject(name, contentText, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QStringList &contentText, QObject *parent) - : ModuleObject(name, displayName, contentText, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, icon, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QString &description, QObject *parent) - : ModuleObject(name, displayName, description, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QString &description, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QString &description, const QIcon &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const QString &name, const QString &displayName, const QString &description, const QStringList &contentText, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, contentText, icon, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::HListModule(const ModuleInitContext &message, QObject *parent) - : ModuleObject(message, parent) - , DCC_INIT_PRIVATE(HListModule) -{ -} - -HListModule::~HListModule() -{ -} - -QWidget *HListModule::page() -{ - Q_D(HListModule); - return d->page(); -} diff --git a/dcc-old/src/interface/moduledatamodel.cpp b/dcc-old/src/interface/moduledatamodel.cpp deleted file mode 100644 index ac981285ce..0000000000 --- a/dcc-old/src/interface/moduledatamodel.cpp +++ /dev/null @@ -1,171 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "moduledatamodel.h" - -#include "interface/moduleobject.h" - -#include -#include - -#include - -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE - -ModuleDataModel::ModuleDataModel(QObject *parent) - : QAbstractItemModel(parent) - , m_parentObject(nullptr) -{ -} - -QModelIndex ModuleDataModel::index(int row, int column, const QModelIndex &parent) const -{ - Q_UNUSED(parent); - if (row < 0 || row >= m_data.size()) - return QModelIndex(); - return createIndex(row, column, m_data.at(row)); -} - -QModelIndex ModuleDataModel::parent(const QModelIndex &index) const -{ - Q_UNUSED(index); - return QModelIndex(); -} - -int ModuleDataModel::rowCount(const QModelIndex &parent) const -{ - if (!parent.isValid()) - return m_data.size(); - - return 0; -} - -int ModuleDataModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - return 1; -} - -QVariant ModuleDataModel::data(const QModelIndex &index, int role) const -{ - if (m_data.isEmpty() || !index.isValid()) - return QVariant(); - - int row = index.row(); - ModuleObject *data = m_data.at(row); - switch (role) { - case Qt::DisplayRole: - return data->displayName(); - case Qt::DecorationRole: { - auto icon = data->icon(); - if (icon.type() == QVariant::String) { - return DIconTheme::findQIcon(icon.toString()); - } - return data->icon(); - } - case Qt::StatusTipRole: - return data->description(); - case Dtk::RightActionListRole: - return data->badge(); - default: - break; - } - return QVariant(); -} - -Qt::ItemFlags ModuleDataModel::flags(const QModelIndex &index) const -{ - Qt::ItemFlags flag = QAbstractItemModel::flags(index); - ModuleObject *module = static_cast(index.internalPointer()); - flag.setFlag(Qt::ItemIsEnabled, !ModuleObject::IsDisabled(module)); - return flag; -} - -void ModuleDataModel::onDataChanged(QObject *obj) -{ - ModuleObject *const module = static_cast(obj); - if (module->extra() || ModuleObject::IsHidden(module)) - onRemovedChild(module); - else { - int row = m_data.indexOf(module); - if (row >= 0 && row < m_data.size()) { - QModelIndex i = index(row, 0); - emit dataChanged(i, i); - } else { - onInsertChild(module); - } - } -} - -void ModuleDataModel::onInsertChild(ModuleObject *const module) -{ - if (module->extra() || ModuleObject::IsHidden(module) || m_data.contains(module)) - return; - - int row = 0; - for (auto &&tmpModule : m_parentObject->childrens()) { - if (tmpModule == module) - break; - if (!tmpModule->extra() && !tmpModule->isHidden()) - row++; - } - Q_ASSERT(row <= rowCount(QModelIndex())); - beginInsertRows(QModelIndex(), row, row); - m_data.insert(row, module); - endInsertRows(); - - ModuleObject *maxOne = - *std::max_element(m_data.begin(), m_data.end(), [](ModuleObject *a, ModuleObject *b) { - return a->displayName().length() < b->displayName().length(); - }); - emit newModuleMaxDislayName(maxOne->displayName()); -} - -void ModuleDataModel::onRemovedChild(ModuleObject *const module) -{ - int row = m_data.indexOf(module); - if (row >= 0 && row < m_data.size()) { - beginRemoveRows(QModelIndex(), row, row); - m_data.removeAt(row); - endRemoveRows(); - } -} - -void ModuleDataModel::setModuleObject(ModuleObject *const module) -{ - m_parentObject = module; - QList datas = m_parentObject->childrens(); - - beginResetModel(); - m_data.clear(); - for (ModuleObject *tmpModule : datas) { - if (!tmpModule->extra() && !ModuleObject::IsHidden(tmpModule)) - m_data.append(tmpModule); - } - endResetModel(); - - connect(m_parentObject, &ModuleObject::insertedChild, this, &ModuleDataModel::onInsertChild); - connect(m_parentObject, &ModuleObject::removedChild, this, &ModuleDataModel::onRemovedChild); - connect(m_parentObject, - &ModuleObject::childStateChanged, - this, - [this](ModuleObject *const tmpChild, uint32_t flag, bool state) { - Q_UNUSED(flag) - Q_UNUSED(state) - onDataChanged(tmpChild); - }); - // emit moduleDataChanged if module data changed(e.g. setBadge) - connect(m_parentObject, &ModuleObject::moduleDataChanged, this, [this]() { - if (auto mainModule = dynamic_cast(m_parentObject->parent())) { - mainModule->moduleDataChanged(); - } - }); -} - -QModelIndex ModuleDataModel::index(ModuleObject *module) const -{ - return index(m_data.indexOf(module), 0); -} diff --git a/dcc-old/src/interface/moduledatamodel.h b/dcc-old/src/interface/moduledatamodel.h deleted file mode 100644 index b83dcae413..0000000000 --- a/dcc-old/src/interface/moduledatamodel.h +++ /dev/null @@ -1,50 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MODULEDATAMODEL_H -#define MODULEDATAMODEL_H - -#include "interface/namespace.h" - -#include - -class QSignalMapper; - -namespace DCC_NAMESPACE { -class ModuleObject; - -class ModuleDataModel : public QAbstractItemModel -{ - Q_OBJECT -public: - explicit ModuleDataModel(QObject *parent = nullptr); - - void setModuleObject(ModuleObject *const module); - QModelIndex index(DCC_NAMESPACE::ModuleObject *module) const; - // Basic functionality: - QModelIndex index(int row, - int column, - const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - virtual Qt::ItemFlags flags(const QModelIndex &index) const override; -signals: - Q_DECL_DEPRECATED void newModuleDislayNameLen(int); - void newModuleMaxDislayName(const QString&); - -public slots: - void onDataChanged(QObject *obj); - void onInsertChild(ModuleObject *const module); - void onRemovedChild(ModuleObject *const module); - -private: - QList m_data; - ModuleObject *m_parentObject; -}; -} // namespace DCC_NAMESPACE - -#endif // MODULEDATAMODEL_H diff --git a/dcc-old/src/interface/moduleobject.cpp b/dcc-old/src/interface/moduleobject.cpp deleted file mode 100644 index 04d15a06d2..0000000000 --- a/dcc-old/src/interface/moduleobject.cpp +++ /dev/null @@ -1,564 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "interface/moduleobject.h" - -#include - -#define DCC_HIDDEN 0x80000000 -#define DCC_DISABLED 0x40000000 - -// 0xA0000000 = 0x80000000|0x20000000 0x80000000为用户设置位 0x20000000为配置设置位 -// 0x50000000 = 0x40000000|0x10000000 0x4000000为用户设置位 0x10000000为配置设置位 -#define DCC_ALL_HIDDEN 0xA0000000 -#define DCC_ALL_DISABLED 0x50000000 - -#define DCC_EXTRA 0x00800000 // 扩展按钮(子项) -#define DCC_NOSEARCH 0x08000000 // 不参与搜索 - -/** Versions: - V1.0 - 2023/05/24 - create -**/ -const unsigned c_currentVersion = 10; // 1.0 - -// DCORE_USE_NAMESPACE - -using namespace DCC_NAMESPACE; -namespace DCC_NAMESPACE { - -class ModuleObjectPrivate -{ -public: - explicit ModuleObjectPrivate(ModuleObject *object) - : q_ptr(object) - , m_currentModule(nullptr) - , m_badge(0) - , m_flags(0) - { - } - QString modelDescription() { - Q_Q(ModuleObject); - // The punctuation symbol used to separate items in a list. e.g. A, B, C, D" - const QString SPLIT_CHAR = QObject::tr(", "); - QString description; - for (const auto child : q->childrens()) { - if (child->isHidden()) - continue; - const auto &name = child->displayName(); - if (!name.isEmpty()) - description.append(QString("%1%2").arg(name).arg(SPLIT_CHAR)); - } - description.chop(SPLIT_CHAR.size()); - if (!description.isEmpty()) - return description; - return q->displayName(); - } -public: - ModuleObject *q_ptr; - Q_DECLARE_PUBLIC(ModuleObject) - - QList m_childrens; - ModuleObject *m_currentModule; - - QString m_name; // 名称,作为每个模块的唯一标识,不可为空 - QString m_displayName; // 显示名称,如菜单的名称,页面的标题等,为空则不显示 - QString m_fallbackDescription; // 描述,如主菜单的描述信息,如果m_description为空,该值会跟随插件变换 - QString m_description; // 主动设置的的描述信息,当非空,为显示的描述信息 - QStringList m_contentText; // 上下文数据,参与搜索,只可用于终结点:DisplayName -> ContentText(one of it) - QVariant m_icon; // 图标,如主菜单的图标 - int m_badge; // 主菜单中的角标, 默认为0不显示,大于0显示 - - uint32_t m_flags; -}; -} -ModuleObject::ModuleObject(QObject *parent) - : ModuleObject(QString(), QString(), parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, QObject *parent) - : ModuleObject(name, displayName, QStringList(), parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QStringList &contentText, QObject *parent) - : ModuleObject(name, {}, contentText, parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QStringList &contentText, QObject *parent) - : ModuleObject(name, displayName, {}, contentText, QVariant(), parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, {}, icon, parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QString &description, QObject *parent) - : ModuleObject(name, displayName, description, {}, QVariant(), parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QString &description, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, {}, icon, parent) -{ -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QString &description, const QIcon &icon, QObject *parent) - : ModuleObject(name, displayName, description, {}, QVariant::fromValue(icon), parent) -{ -} - -ModuleObject::ModuleObject(const ModuleInitContext &message, QObject *parent) - : ModuleObject(message.name, message.displayName, message.description, message.contentText, message.icon, parent) -{ - -} - -ModuleObject::ModuleObject(const QString &name, const QString &displayName, const QString &description, const QStringList &contentText, const QVariant &icon, QObject *parent) - : QObject(parent) - , DCC_INIT_PRIVATE(ModuleObject) -{ - Q_D(ModuleObject); - d->m_name = name; - d->m_displayName = displayName; - d->m_description = description; - d->m_contentText = contentText; - d->m_icon = icon; - d->m_fallbackDescription = d->modelDescription(); - if (description.isEmpty()) { - connect(this, &ModuleObject::insertedChild, this, [this](ModuleObject *) { - Q_D(ModuleObject); - d->m_fallbackDescription = d->modelDescription(); - Q_EMIT moduleDataChanged(); - }); - connect(this, &ModuleObject::removedChild, this, [this](ModuleObject *) { - Q_D(ModuleObject); - d->m_fallbackDescription = d->modelDescription(); - Q_EMIT moduleDataChanged(); - }); - } -} - -ModuleObject::~ModuleObject() -{ - deactive(); -} - -QWidget *ModuleObject::activePage(bool autoActive) -{ - if (autoActive) - active(); - QWidget *w = ModuleObject::IsHidden(this) ? nullptr : page(); - // 处理page中修改隐藏状态 - if (w && ModuleObject::IsHidden(this)) { - delete w; - w = nullptr; - } - - if (w) { - connect(w, &QObject::destroyed, this, &ModuleObject::deactive); - connect(this, &ModuleObject::stateChanged, w, [w](uint32_t flag, bool state) { - if (ModuleObject::IsDisabledFlag(flag)) - w->setDisabled(state); - }); - w->setDisabled(ModuleObject::IsDisabled(this)); - } else { - deactive(); - } - return w; -} - -void ModuleObject::active() -{ -} - -QWidget *ModuleObject::page() -{ - return nullptr; -} - -void ModuleObject::deactive() -{ -} - -QString ModuleObject::name() const -{ - Q_D(const ModuleObject); - return d->m_name; -} -QString ModuleObject::displayName() const -{ - Q_D(const ModuleObject); - return d->m_displayName; -} -QString ModuleObject::description() const -{ - Q_D(const ModuleObject); - if (d->m_description.isEmpty()) { - return d->m_fallbackDescription; - } else { - return d->m_description; - } - -} -QStringList ModuleObject::contentText() const -{ - Q_D(const ModuleObject); - return d->m_contentText; -} -QVariant ModuleObject::icon() const -{ - Q_D(const ModuleObject); - return d->m_icon; -} -int ModuleObject::badge() const -{ - Q_D(const ModuleObject); - return d->m_badge; -} - -bool ModuleObject::isHidden() const -{ - return getFlagState(DCC_HIDDEN); -} - -bool ModuleObject::isVisible() const -{ - return !isHidden(); -} - -bool ModuleObject::isDisabled() const -{ - return getFlagState(DCC_DISABLED); -} - -bool ModuleObject::isEnabled() const -{ - return !isDisabled(); -} - -unsigned ModuleObject::GetCurrentVersion() -{ - return c_currentVersion; -} - -void ModuleObject::setHidden(bool hidden) -{ - setFlagState(DCC_HIDDEN, hidden); - Q_EMIT visibleChanged(); -} - -void ModuleObject::setVisible(bool visible) -{ - setHidden(!visible); -} - -void ModuleObject::setDisabled(bool disabled) -{ - setFlagState(DCC_DISABLED, disabled); -} - -void ModuleObject::setEnabled(bool enabled) -{ - setDisabled(!enabled); -} - -void ModuleObject::trigger() -{ - Q_EMIT triggered(); -} - -void ModuleObject::setName(const QString &name) -{ - Q_D(ModuleObject); - if (d->m_name != name) { - d->m_name = name; - Q_EMIT moduleDataChanged(); - } -} -void ModuleObject::setDisplayName(const QString &displayName) -{ - Q_D(ModuleObject); - if (d->m_displayName != displayName) { - d->m_displayName = displayName; - Q_EMIT displayNameChanged(d->m_displayName); - Q_EMIT moduleDataChanged(); - } -} -void ModuleObject::setDescription(const QString &description) -{ - Q_D(ModuleObject); - if (d->m_description != description) { - d->m_description = description; - d->m_fallbackDescription = description; - Q_EMIT moduleDataChanged(); - } -} -void ModuleObject::setContentText(const QStringList &contentText) -{ - Q_D(ModuleObject); - if (d->m_contentText != contentText) { - d->m_contentText = contentText; - Q_EMIT moduleDataChanged(); - } -} - -void ModuleObject::addContentText(const QString &contentText) -{ - Q_D(ModuleObject); - d->m_contentText << contentText; - Q_EMIT moduleDataChanged(); -} - -void ModuleObject::addContentText(const QStringList &contentText) -{ - Q_D(ModuleObject); - d->m_contentText << contentText; - Q_EMIT moduleDataChanged(); -} - -void ModuleObject::setIcon(const QVariant &icon) -{ - Q_D(ModuleObject); - d->m_icon = icon; - Q_EMIT moduleDataChanged(); -} - -void ModuleObject::setIcon(const QIcon &icon) -{ - setIcon(QVariant::fromValue(icon)); -} -void ModuleObject::setBadge(int badge) -{ - Q_D(ModuleObject); - if (d->m_badge != badge) { - d->m_badge = badge; - Q_EMIT moduleDataChanged(); - } -} - -void ModuleObject::appendChild(ModuleObject *const module) -{ - Q_D(ModuleObject); - if (d->m_childrens.contains(module)) - return; - d->m_childrens.append(module); - module->setParent(this); - connect(module, &ModuleObject::visibleChanged, this, [this]() { - Q_D(ModuleObject); - d->m_fallbackDescription = d->modelDescription(); - Q_EMIT moduleDataChanged(); - }); - Q_EMIT insertedChild(module); - Q_EMIT childrenSizeChanged(d->m_childrens.size()); -} - -void ModuleObject::removeChild(ModuleObject *const module) -{ - Q_D(ModuleObject); - if (!d->m_childrens.contains(module)) - return; - Q_EMIT removedChild(module); - d->m_childrens.removeOne(module); - Q_EMIT childrenSizeChanged(d->m_childrens.size()); -} - -void ModuleObject::removeChild(const int index) -{ - Q_D(ModuleObject); - if (d->m_childrens.size() <= index) - return; - Q_EMIT removedChild(d->m_childrens[index]); - d->m_childrens.removeAt(index); - Q_EMIT childrenSizeChanged(d->m_childrens.size()); -} - -void ModuleObject::insertChild(QList::iterator before, ModuleObject *const module) -{ - Q_D(ModuleObject); - if (d->m_childrens.contains(module)) - return; - d->m_childrens.insert(before, module); - connect(module, &ModuleObject::visibleChanged, this, [this]() { - Q_D(ModuleObject); - d->m_fallbackDescription = d->modelDescription(); - Q_EMIT moduleDataChanged(); - }); - module->setParent(this); - Q_EMIT insertedChild(module); - Q_EMIT childrenSizeChanged(d->m_childrens.size()); -} - -void ModuleObject::insertChild(const int index, ModuleObject *const module) -{ - Q_D(ModuleObject); - if (d->m_childrens.contains(module)) - return; - d->m_childrens.insert(index, module); - module->setParent(this); - Q_EMIT insertedChild(module); - Q_EMIT childrenSizeChanged(d->m_childrens.size()); -} - -bool ModuleObject::getFlagState(uint32_t flag) const -{ - Q_D(const ModuleObject); - return (d->m_flags & flag); -} - -uint32_t ModuleObject::getFlag() const -{ - Q_D(const ModuleObject); - return d->m_flags; -} - -bool ModuleObject::extra() const -{ - return getFlagState(DCC_EXTRA); -} - -void ModuleObject::setExtra(bool value) -{ - setFlagState(DCC_EXTRA, value); -} - -bool ModuleObject::noSearch() const -{ - return getFlagState(DCC_NOSEARCH); -} - -void ModuleObject::setNoSearch(bool noSearch) -{ - setFlagState(DCC_NOSEARCH, noSearch); -} - -ModuleObject *ModuleObject::currentModule() const -{ - Q_D(const ModuleObject); - return d->m_currentModule; -} - -ModuleObject *ModuleObject::defultModule() -{ - Q_D(const ModuleObject); - // 第一个可见项 - for (auto &&module : d->m_childrens) { - if (!ModuleObject::IsHidden(module) && !module->extra()) - return module; - } - return nullptr; -} - -void ModuleObject::setFlagState(uint32_t flag, bool state) -{ - Q_D(ModuleObject); - if (getFlagState(flag) != state) { - if (state) - d->m_flags |= flag; - else - d->m_flags &= (~flag); - Q_EMIT stateChanged(flag, state); - ModuleObject *parent = getParent(); - if (parent) - Q_EMIT parent->childStateChanged(this, flag, state); - } -} - -void ModuleObject::setCurrentModule(ModuleObject *child) -{ - Q_D(ModuleObject); - if (d->m_currentModule != child) { - d->m_currentModule = child; - Q_EMIT currentModuleChanged(d->m_currentModule); - } -} - -ModuleObject *ModuleObject::getParent() -{ - return dynamic_cast(parent()); -} - -int ModuleObject::findChild(ModuleObject *const child) -{ - if (!child) - return -1; - if (this == child) - return 0; - return findChild(this, child, 0); -} - -int ModuleObject::findChild(ModuleObject *const module, ModuleObject *const child) -{ - if (!module || !child) - return -1; - if (module == child) - return 0; - return findChild(module, child, 0); -} - -const QList &ModuleObject::childrens() -{ - Q_D(const ModuleObject); - return d->m_childrens; -} - -ModuleObject *ModuleObject::children(const int index) const -{ - Q_D(const ModuleObject); - if (index < 0 || index >= d->m_childrens.size()) - return nullptr; - return d->m_childrens.at(index); -} - -int ModuleObject::getChildrenSize() const -{ - Q_D(const ModuleObject); - return d->m_childrens.size(); -} - -int ModuleObject::findChild(ModuleObject *const module, ModuleObject *const child, const int num) -{ - for (auto ch : module->childrens()) { - if (ch == child) - return num + 1; - } - for (auto ch : module->childrens()) { - const int temp = ModuleObject::findChild(ch, child, num + 1); - if (temp > num) - return temp; - } - return -1; -} - -bool ModuleObject::IsVisible(ModuleObject *const module) -{ - return !ModuleObject::IsHidden(module); -} - -bool ModuleObject::IsHidden(ModuleObject *const module) -{ - return module ? module->getFlagState(DCC_ALL_HIDDEN) : true; -} - -bool ModuleObject::IsHiddenFlag(uint32_t flag) -{ - return DCC_ALL_HIDDEN & flag; -} - -bool ModuleObject::IsEnabled(ModuleObject *const module) -{ - return !ModuleObject::IsDisabled(module); -} - -bool ModuleObject::IsDisabled(ModuleObject *const module) -{ - return module ? module->getFlagState(DCC_ALL_DISABLED) : true; -} - -bool ModuleObject::IsDisabledFlag(uint32_t flag) -{ - return DCC_ALL_DISABLED & flag; -} diff --git a/dcc-old/src/interface/pagemodule.cpp b/dcc-old/src/interface/pagemodule.cpp deleted file mode 100644 index 358e13dfc1..0000000000 --- a/dcc-old/src/interface/pagemodule.cpp +++ /dev/null @@ -1,439 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "pagemodule.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -using namespace DCC_NAMESPACE; - -#define DCC_NO_Scroll 0x00080000 // 无滚动条(父项) -#define DCC_NO_STRETCH 0x00040000 // 无下方弹簧(父项) - -namespace DCC_NAMESPACE { -class PageModulePrivate : public QObject -{ -public: - explicit PageModulePrivate(PageModule *parent) - : QObject(parent) - , q_ptr(parent) - , m_spacing(Dtk::Widget::DSizeModeHelper::element(6, 10)) - , m_minimumWidth(0) - , m_maximumWidth(QWIDGETSIZE_MAX) - { - clearData(); - QObject::connect(q_ptr, &PageModule::currentModuleChanged, q_ptr, [this](ModuleObject *currentModule) { - onCurrentModuleChanged(currentModule); - }); - } - void insertModule(ModuleObject *const module, int stretch, Qt::Alignment alignment) - { - m_mapModules.insert(module, { stretch, alignment }); - } - void removeModule(ModuleObject *const module) - { - m_mapModules.remove(module); - } - QPair layoutParam(ModuleObject *const module) - { - if (m_mapModules.contains(module)) - return m_mapModules.value(module); - return { 0, Qt::Alignment() }; - } - void clearData() - { - m_vlayout = nullptr; - m_hlayout = nullptr; - m_area = nullptr; - m_mapWidget.clear(); - } - - QWidget *page() - { - Q_Q(PageModule); - QWidget *parentWidget = new QWidget(); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setContentsMargins(0, 0, 0, 0); - parentWidget->setLayout(mainLayout); - m_hlayout = new QHBoxLayout(); - QObject::connect(parentWidget, &QObject::destroyed, q, [this]() { clearData(); }); - - QWidget *areaWidget = new QWidget(); - if (q->noScroll()) { - m_area = nullptr; - areaWidget->setParent(parentWidget); - mainLayout->addWidget(areaWidget, 0, m_contentsMargins.isNull() ? Qt::Alignment() : Qt::AlignHCenter); - } else { - m_area = new QScrollArea(parentWidget); - m_area->installEventFilter(this); - m_area->setFrameShape(QFrame::NoFrame); - m_area->setWidgetResizable(true); - areaWidget->setParent(m_area); - m_area->setWidget(areaWidget); - if (!m_contentsMargins.isNull()) - m_area->setAlignment(Qt::AlignHCenter); - mainLayout->addWidget(m_area); - } - - QWidget *controlRestrictorWidget = new QWidget; - controlRestrictorWidget->setMinimumWidth(m_minimumWidth); - controlRestrictorWidget->setMaximumWidth(500); - controlRestrictorWidget->setLayout(m_hlayout); - QHBoxLayout *controlRestrictorLayout = new QHBoxLayout; - controlRestrictorLayout->setContentsMargins(m_contentsMargins.left(), - 0, - m_contentsMargins.right(), - 0); - controlRestrictorLayout->addWidget(controlRestrictorWidget); - mainLayout->addLayout(controlRestrictorLayout); - - m_vlayout = new QVBoxLayout(areaWidget); - m_vlayout->setContentsMargins(m_contentsMargins); - m_vlayout->setSpacing(m_spacing); - areaWidget->setLayout(m_vlayout); - areaWidget->setMinimumWidth(m_minimumWidth); - areaWidget->setMaximumWidth(m_maximumWidth); - - for (auto &&tmpChild : q->childrens()) { - auto page = tmpChild->activePage(); - if (page) { - if (tmpChild->extra()) - m_hlayout->addWidget(page); - else { - QPair param = layoutParam(tmpChild); - m_vlayout->addWidget(page, param.first, param.second); - } - m_mapWidget.insert(tmpChild, page); - page->setDisabled(ModuleObject::IsDisabled(tmpChild)); - } - } - if (!q->noStretch()) - m_vlayout->addStretch(1); - - if (m_hlayout->count() == 0) { - controlRestrictorWidget->hide(); - } - - // 监听子项的添加、删除、状态变更,动态的更新界面 - QObject::connect(q, &ModuleObject::insertedChild, areaWidget, [this](ModuleObject *const childModule) { onAddChild(childModule); }); - QObject::connect(q, &ModuleObject::removedChild, areaWidget, [this](ModuleObject *const childModule) { onRemoveChild(childModule); }); - QObject::connect(q, &ModuleObject::childStateChanged, areaWidget, [this](ModuleObject *const tmpChild, uint32_t flag, bool state) { - if (ModuleObject::IsHiddenFlag(flag)) { - if (state) - onRemoveChild(tmpChild); - else - onAddChild(tmpChild); - } - }); - QObject::connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::sizeModeChanged, m_vlayout, [this](){ - m_spacing = Dtk::Widget::DSizeModeHelper::element(6, 10); - m_vlayout->setSpacing(m_spacing); - }); - Q_EMIT q->currentModuleChanged(q->currentModule()); - return parentWidget; - } - -private: - void onCurrentModuleChanged(ModuleObject *child) - { - if (m_area && m_mapWidget.contains(child)) { - QWidget *w = m_mapWidget.value(child); - if (-1 != m_vlayout->indexOf(w)) { - QPoint p = w->mapTo(w->parentWidget(), QPoint()); - m_area->verticalScrollBar()->setSliderPosition(p.y()); - } - } - } - void onRemoveChild(DCC_NAMESPACE::ModuleObject *const childModule) - { - if (m_mapWidget.contains(childModule)) { - QWidget *w = m_mapWidget.value(childModule); - int index = m_vlayout->indexOf(w); - if (-1 != index) { - w->deleteLater(); - delete m_vlayout->takeAt(index); - m_mapWidget.remove(childModule); - return; - } - index = m_hlayout->indexOf(w); - if (-1 != index) { - w->deleteLater(); - delete m_hlayout->takeAt(index); - m_mapWidget.remove(childModule); - } - } - } - void onAddChild(DCC_NAMESPACE::ModuleObject *const childModule) - { - if (ModuleObject::IsHidden(childModule) || m_mapWidget.contains(childModule)) - return; - - Q_Q(PageModule); - bool isExtra = childModule->extra(); - int index = 0; - for (auto &&child : q->childrens()) { - if (child == childModule) - break; - if (!ModuleObject::IsHidden(child) && child->extra() == isExtra) - index++; - } - auto newPage = childModule->activePage(); - if (newPage) { - if (isExtra) { - m_hlayout->insertWidget(index, newPage); - } else { - QPair param = layoutParam(childModule); - m_vlayout->insertWidget(index, newPage, param.first, param.second); - } - - newPage->setDisabled(ModuleObject::IsDisabled(childModule)); - m_mapWidget.insert(childModule, newPage); - } - } - - bool eventFilter(QObject *watched, QEvent *event) override - { - if (QEvent::Resize == event->type() && m_area) { - QResizeEvent *e = static_cast(event); - int left, right, top, bottom; - m_vlayout->getContentsMargins(&left, &top, &right, &bottom); - int width = qMin(e->size().width() - left - right, m_maximumWidth); - if (m_maximumWidth >= width && width > 0) { - for (int i = 0; i < m_vlayout->count(); ++i) { - QAbstractScrollArea *w = qobject_cast(m_vlayout->itemAt(i)->widget()); - if (w) { - w->setMaximumWidth(width); - } - } - } - } - return QObject::eventFilter(watched, event); - } - -private: - PageModule *q_ptr; - Q_DECLARE_PUBLIC(PageModule) - - QVBoxLayout *m_vlayout; // 上方纵向布局 - QHBoxLayout *m_hlayout; // 底下横向布局 - QMap> m_mapModules; - QMap m_mapWidget; - QScrollArea *m_area; - QMargins m_contentsMargins; - int m_spacing; - int m_minimumWidth; - int m_maximumWidth; -}; - -} - -PageModule::PageModule(QObject *parent) - : ModuleObject(parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, QObject *parent) - : ModuleObject(name, displayName, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QStringList &contentText, QObject *parent) - : ModuleObject(name, contentText, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QStringList &contentText, QObject *parent) - : ModuleObject(name, displayName, contentText, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, icon, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QString &description, QObject *parent) - : ModuleObject(name, displayName, description, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QString &description, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QString &description, const QIcon &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const QString &name, const QString &displayName, const QString &description, const QStringList &contentText, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, contentText, icon, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::PageModule(const ModuleInitContext &message, QObject *parent) - : ModuleObject(message, parent) - , DCC_INIT_PRIVATE(PageModule) -{ -} - -PageModule::~PageModule() -{ -} - -int PageModule::spacing() const -{ - Q_D(const PageModule); - return d->m_spacing; -} - -void PageModule::setSpacing(const int spacing) -{ - Q_D(PageModule); - d->m_spacing = spacing; -} - -void PageModule::getContentsMargins(int *left, int *top, int *right, int *bottom) const -{ - Q_D(const PageModule); - *left = d->m_contentsMargins.left(); - *top = d->m_contentsMargins.top(); - *right = d->m_contentsMargins.right(); - *bottom = d->m_contentsMargins.bottom(); -} - -void PageModule::setContentsMargins(int left, int top, int right, int bottom) -{ - Q_D(PageModule); - d->m_contentsMargins.setLeft(left); - d->m_contentsMargins.setTop(top); - d->m_contentsMargins.setRight(right); - d->m_contentsMargins.setBottom(bottom); -} - -int PageModule::maximumWidth() const -{ - Q_D(const PageModule); - return d->m_maximumWidth; -} - -void PageModule::setMaximumWidth(int maxw) -{ - Q_D(PageModule); - d->m_maximumWidth = maxw; -} - -int PageModule::minimumWidth() const -{ - Q_D(const PageModule); - return d->m_minimumWidth; -} - -void PageModule::setMinimumWidth(int minw) -{ - Q_D(PageModule); - d->m_minimumWidth = minw; -} - -bool PageModule::noScroll() -{ - return getFlagState(DCC_NO_Scroll); -} - -void PageModule::setNoScroll(bool value) -{ - setFlagState(DCC_NO_Scroll, value); -} - -bool PageModule::noStretch() -{ - return getFlagState(DCC_NO_STRETCH); -} - -void PageModule::setNoStretch(bool value) -{ - setFlagState(DCC_NO_STRETCH, value); -} - -void PageModule::appendChild(ModuleObject *const module) -{ - appendChild(module, 0, Qt::Alignment()); -} - -void PageModule::insertChild(QList::iterator before, ModuleObject *const module) -{ - insertChild(before, module, 0, Qt::Alignment()); -} - -void PageModule::insertChild(const int index, ModuleObject *const module) -{ - insertChild(index, module, 0, Qt::Alignment()); -} - -void PageModule::removeChild(ModuleObject *const module) -{ - Q_D(PageModule); - d->removeModule(module); - ModuleObject::removeChild(module); -} - -void PageModule::removeChild(const int index) -{ - Q_D(PageModule); - d->removeModule(children(index)); - ModuleObject::removeChild(index); -} - -void PageModule::appendChild(ModuleObject *const module, int stretch, Qt::Alignment alignment) -{ - if (childrens().contains(module)) - return; - - Q_D(PageModule); - d->insertModule(module, stretch, alignment); - ModuleObject::appendChild(module); -} - -void PageModule::insertChild(QList::iterator before, ModuleObject *const module, int stretch, Qt::Alignment alignment) -{ - if (childrens().contains(module)) - return; - - Q_D(PageModule); - d->insertModule(module, stretch, alignment); - ModuleObject::insertChild(before, module); -} - -void PageModule::insertChild(const int index, ModuleObject *const module, int stretch, Qt::Alignment alignment) -{ - if (childrens().contains(module)) - return; - - Q_D(PageModule); - d->insertModule(module, stretch, alignment); - ModuleObject::insertChild(index, module); -} - -QWidget *PageModule::page() -{ - Q_D(PageModule); - return d->page(); -} diff --git a/dcc-old/src/interface/tabitemdelegate.cpp b/dcc-old/src/interface/tabitemdelegate.cpp deleted file mode 100644 index b2a7fae29b..0000000000 --- a/dcc-old/src/interface/tabitemdelegate.cpp +++ /dev/null @@ -1,161 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "tabitemdelegate.h" - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -TabItemDelegate::TabItemDelegate(QAbstractItemView *parent) - : DStyledItemDelegate(parent) -{ -} - -void TabItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - painter->save(); - - QStyleOptionViewItem opt(option); - initStyleOption(&opt, index); - - bool isIconMode = option.decorationAlignment == Qt::AlignCenter; - bool isBeginning = (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::Beginning) || (opt.viewItemPosition == QStyleOptionViewItem::ViewItemPosition::OnlyOne); - // 选择高亮背景 - if (opt.state & QStyle::State_Selected) { - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - opt.backgroundBrush = option.palette.color(cg, QPalette::Highlight); - } - - QVariant value; - - QRect decorationRect; - value = index.data(Qt::DecorationRole); - if (value.isValid()) { - if (isBeginning && isIconMode) { - decorationRect = QRect(opt.rect.topLeft() + QPoint((opt.rect.width() - opt.decorationSize.width()) / 2, 15), opt.decorationSize); - opt.displayAlignment = Qt::AlignCenter; - } else if (isBeginning) { - opt.decorationSize += QSize(4, 4); - decorationRect = QRect(opt.rect.topLeft() + QPoint(8, (opt.rect.height() - opt.decorationSize.height()) / 2), opt.decorationSize); - opt.displayAlignment = Qt::AlignLeft; - } else { - decorationRect = QRect(opt.rect.topLeft() + QPoint(8, (opt.rect.height() - opt.decorationSize.height()) / 2), opt.decorationSize); - opt.displayAlignment = Qt::AlignLeft; - } - } else { - decorationRect = QRect(); - } - int fontHeight = opt.widget->fontMetrics().height(); - QString text; - QRect displayRect; - value = index.data(Qt::DisplayRole); - if (value.isValid() && !value.isNull()) { - if (isBeginning && isIconMode) { - displayRect = QRect(opt.rect.topLeft() + QPoint(0, opt.decorationSize.height() + 40), QSize(opt.rect.width(), -1)); - } else if (isBeginning || isIconMode) { - displayRect = QRect(opt.rect.topLeft() + QPoint(decorationRect.width() + 18, (opt.rect.height() / 2 - fontHeight + 5)), QSize(opt.rect.width() - opt.decorationSize.width() - 30, -1)); - } else { - displayRect = QRect(opt.rect.topLeft() + QPoint(decorationRect.width() + 18, (opt.rect.height() - fontHeight) / 2), QSize(opt.rect.width() - opt.decorationSize.width() - 30, -1)); - } - } - - QStyle *style = option.widget ? option.widget->style() : QApplication::style(); - // draw the item - if (opt.state & QStyle::State_Selected - //|| opt.state & QStyle::State_Active - || opt.state & QStyle::State_MouseOver) - drawBackground(style, painter, opt); - // 图标的绘制用也可能会使用这些颜色 - QPalette::ColorGroup cg = (opt.state & QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled; - painter->setPen(opt.palette.color(cg, (opt.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text)); - - opt.displayAlignment = Qt::AlignCenter; - drawDisplay(style, painter, opt, opt.rect); - - painter->restore(); -} - -void TabItemDelegate::drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option) const -{ - DStyleOptionBackgroundGroup boption; - boption.init(option.widget); - boption.QStyleOption::operator=(option); - boption.position = DStyleOptionBackgroundGroup::ItemBackgroundPosition(option.viewItemPosition); - - if (option.backgroundBrush.style() != Qt::NoBrush) { - boption.dpalette.setBrush(DPalette::ItemBackground, option.backgroundBrush); - } - - boption.rect = option.rect; - - if (backgroundType() != RoundedBackground) { - boption.directions = Qt::Vertical; - } - - style->drawPrimitive(static_cast(DStyle::PE_ItemBackground), &boption, painter, option.widget); -} - -void TabItemDelegate::drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - if (option.features & QStyleOptionViewItem::HasDecoration) { - QIcon::Mode mode = QIcon::Normal; - if (!(option.state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (option.state & QStyle::State_Selected) - mode = QIcon::Selected; - QIcon::State state = (option.state & QStyle::State_Open) ? QIcon::On : QIcon::Off; - option.icon.paint(painter, rect, option.decorationAlignment, mode, state); - } -} - -void TabItemDelegate::drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - DStyle::viewItemDrawText(style, painter, &option, rect); -} - -void TabItemDelegate::drawEllipse(QPainter *painter, const QStyleOptionViewItem &option, const int message) const -{ - if (message <= 0) - return; - - QRadialGradient Conical(0, 0, 7, 0, 0); - Conical.setColorAt(1, QColor(255, 106, 106, 255)); - Conical.setColorAt(0.2, QColor(255, 106, 106, 255)); - Conical.setColorAt(0, QColor(255, 106, 106, 25)); - - painter->setBrush(Conical); - painter->setPen(Qt::NoPen); - painter->drawEllipse(option.rect.center() + QPoint(option.rect.width() / 2 - 30, 0), 7, 7); -} - -void TabItemDelegate::drawFocus(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - if ((option.state & QStyle::State_HasFocus) == 0 || !rect.isValid()) - return; - QStyleOptionFocusRect o; - o.QStyleOption::operator=(option); - o.rect = rect; - o.state |= QStyle::State_KeyboardFocusChange; - o.state |= QStyle::State_Item; - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - o.backgroundColor = option.palette.color(cg, (option.state & QStyle::State_Selected) ? QPalette::Highlight : QPalette::Window); - style->drawPrimitive(QStyle::PE_FrameFocusRect, &o, painter, option.widget); -} diff --git a/dcc-old/src/interface/tabitemdelegate.h b/dcc-old/src/interface/tabitemdelegate.h deleted file mode 100644 index 5c5aa00079..0000000000 --- a/dcc-old/src/interface/tabitemdelegate.h +++ /dev/null @@ -1,30 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TABITEMDELEGATE_H -#define TABITEMDELEGATE_H - -#include "interface/namespace.h" - -#include - -namespace DCC_NAMESPACE { - -class TabItemDelegate : public Dtk::Widget::DStyledItemDelegate -{ -public: - TabItemDelegate(QAbstractItemView *parent = nullptr); - -protected: - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - - virtual void drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option) const; - void drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawEllipse(QPainter *painter, const QStyleOptionViewItem &option, const int message) const; - void drawFocus(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; -}; - -} - -#endif // TABITEMDELEGATE_H diff --git a/dcc-old/src/interface/tabview.cpp b/dcc-old/src/interface/tabview.cpp deleted file mode 100644 index acc27340f9..0000000000 --- a/dcc-old/src/interface/tabview.cpp +++ /dev/null @@ -1,526 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "tabview.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DCORE_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -///////////////////////////////////////// -namespace DCC_NAMESPACE { - -class TabViewPrivate -{ -public: - explicit TabViewPrivate(TabView *parent) - : q_ptr(parent) - , m_spacing(20) - , m_gridSize(280, 84) - , m_maxColumnCount(1) - , m_maxRowCount(1) - , m_xOffset(0) - , m_yOffset(0) - , m_alignment(Qt::AlignHCenter) - { - setGridSize(m_gridSize); - } - - void setSpacing(int space) - { - m_spacing = space; - } - int spacing() const - { - return m_spacing; - } - - void setGridSize(const QSize &size) - { - m_gridSize = size; - } - QSize gridSize() const - { - return m_gridSize; - } - - void setAlignment(Qt::Alignment alignment) - { - m_alignment = alignment; - } - Qt::Alignment alignment() const - { - return m_alignment; - } - - void updateGeometries() - { - Q_Q(TabView); - m_itemX.clear(); - int totalWidth = 0; - int height = 0; - QFontMetrics fm = q->fontMetrics(); - QAbstractItemModel *model = q->model(); - DStyleHelper dstyle(q->style()); - DStyleOptionButtonBoxButton opt; - - QSize emptySZ = fm.size(Qt::TextShowMnemonic, QStringLiteral("XXXX")); - emptySZ = (dstyle.sizeFromContents(DStyle::CT_ButtonBoxButton, &opt, emptySZ, q).expandedTo(QApplication::globalStrut())); - for (int i = 0; i < model->rowCount(); i++) { - QString s(model->data(model->index(i, 0)).toString()); - QSize sz; - if (s.isEmpty()) { - sz = emptySZ; - } else { - sz = fm.size(Qt::TextShowMnemonic, s); - sz = (dstyle.sizeFromContents(DStyle::CT_ButtonBoxButton, &opt, sz, q).expandedTo(QApplication::globalStrut())); - } - totalWidth += sz.width() + 14; - m_itemX.append(totalWidth); - } - height = emptySZ.height() - 9; - m_size = QSize(totalWidth, height); - q->setFixedHeight(m_size.height() + 4); - - if (totalWidth > q->viewport()->width()) { - m_xOffset = 0; - } else if (m_alignment & Qt::AlignRight) { - m_xOffset = q->viewport()->width() - totalWidth; - } else if (m_alignment & Qt::AlignHCenter) { - m_xOffset = (q->viewport()->width() - totalWidth) / 2; - } else { - m_xOffset = 0; - } - if (height > q->viewport()->height()) { - m_yOffset = 0; - } else if (m_alignment & Qt::AlignBottom) { - m_yOffset = q->viewport()->height() - height; - } else if (m_alignment & Qt::AlignVCenter) { - m_yOffset = (q->viewport()->height() - height) / 2; - } else { - m_yOffset = 0; - } - } - // item在窗口中位置(无滚动) - QRect rectForIndex(const QModelIndex &index) const - { - Q_Q(const TabView); - QRect rect(0, 2, 0, m_size.height()); - int indexRow = index.row(); - if (indexRow < 0 || indexRow >= m_itemX.size()) { - rect = QRect(); - } else if (indexRow == 0) { - rect.setWidth(m_itemX.at(0)); - } else { - rect.setLeft(m_itemX.at(indexRow - 1)); - rect.setRight(m_itemX.at(indexRow) - 1); - } - - return rect.translated(q->contentsMargins().left() + m_xOffset, q->contentsMargins().top() + m_yOffset); - } - // item在窗口中位置(无滚动) - QModelIndex indexAt(const QPoint &p) const - { - Q_Q(const TabView); - QRect rect(p.x() - m_xOffset, p.y() - m_yOffset, 1, 1); - if (!QRect(QPoint(), m_size).contains(rect)) { - return QModelIndex(); - } - int row = -1; - for (int i = 0; i < m_itemX.size(); i++) { - if (rect.x() <= m_itemX.at(i)) { - row = i; - break; - } - } - QModelIndex index = q->model() ? q->model()->index(row, 0) : QModelIndex(); - if (index.isValid() && rectForIndex(index).contains(p)) - return index; - return QModelIndex(); - } - QVector intersectingSet(const QRect &area) const - { - Q_Q(const TabView); - QVector indexs; - int rows = q->model() ? q->model()->rowCount() : 0; - for (int row = 0; row < rows; row++) { - QModelIndex index = q->model()->index(row, 0); - QRect rectIndex = rectForIndex(index); - if (!rectIndex.intersected(area).isEmpty()) { - indexs.append(index); - } - } - return indexs; - } - inline int marginsWidth() const - { - Q_Q(const TabView); - return q->contentsMargins().left() + q->contentsMargins().right(); - } - inline int marginsHidget() const - { - Q_Q(const TabView); - return q->contentsMargins().top() + q->contentsMargins().bottom(); - } - -private: - TabView *const q_ptr; - Q_DECLARE_PUBLIC(TabView) - int m_spacing; - QSize m_gridSize; - - int m_maxColumnCount; // 一行可容纳的最大列数 - int m_maxRowCount; // 换算显示所有item所需行数 - int m_xOffset; // x轴偏移 - int m_yOffset; // y轴偏移 - QModelIndex m_hover; // hover项 - Qt::Alignment m_alignment; // 对齐方式 - - QList m_itemX; - QSize m_size; -}; -} // namespace DCC_NAMESPACE - -///////////////////////////////////////// - -TabView::TabView(QWidget *parent) - : QAbstractItemView(parent) - , d_ptr(new TabViewPrivate(this)) -{ - setSelectionMode(SingleSelection); - setAttribute(Qt::WA_MacShowFocusRect); - scheduleDelayedItemsLayout(); - setMouseTracking(true); - setContentsMargins(0, 0, 0, 0); - setFrameStyle(QFrame::NoFrame); - - // setFixedHeight at the beginning - DStyleHelper dstyle(style()); - QFontMetrics fm = fontMetrics(); - QSize emptySZ = fm.size(Qt::TextShowMnemonic, QStringLiteral("XXXX")); - DStyleOptionButtonBoxButton opt; - emptySZ = (dstyle.sizeFromContents(DStyle::CT_ButtonBoxButton, &opt, emptySZ, this).expandedTo(QApplication::globalStrut())); - setFixedHeight(emptySZ.height() - 5); - - viewport()->setAutoFillBackground(false); -} - -TabView::~TabView() -{ - delete d_ptr; -} - -void TabView::setSpacing(int space) -{ - Q_D(TabView); - if (d->spacing() != space) { - d->setSpacing(space); - scheduleDelayedItemsLayout(); - } -} -int TabView::spacing() const -{ - Q_D(const TabView); - return d->spacing(); -} - -void TabView::setGridSize(const QSize &size) -{ - Q_D(TabView); - if (d->gridSize() != size) { - d->setGridSize(size); - scheduleDelayedItemsLayout(); - } -} -QSize TabView::gridSize() const -{ - Q_D(const TabView); - return d->gridSize(); -} - -void TabView::setAlignment(Qt::Alignment alignment) -{ - Q_D(TabView); - if (d->alignment() != alignment) { - d->setAlignment(alignment); - scheduleDelayedItemsLayout(); - } -} -Qt::Alignment TabView::alignment() const -{ - Q_D(const TabView); - return d->alignment(); -} -///////////////////////////////////////////////////////////////////////////// -// item在窗口中位置(加滚动偏移) -QRect TabView::visualRect(const QModelIndex &index) const -{ - Q_D(const TabView); - return d->rectForIndex(index).translated(-horizontalOffset(), -verticalOffset()); -} - -void TabView::scrollTo(const QModelIndex &index, ScrollHint hint) -{ - if (!index.isValid()) - return; - - const QRect rect = visualRect(index); - if (hint == EnsureVisible && viewport()->rect().contains(rect)) { - viewport()->update(rect); - return; - } - - const QRect area = viewport()->rect(); - const bool above = (hint == EnsureVisible && rect.left() < area.left()); - const bool below = (hint == EnsureVisible && rect.right() > area.right()); - - int horizontalValue = horizontalScrollBar()->value(); - QRect adjusted = rect.adjusted(-spacing(), -spacing(), spacing(), spacing()); - if (hint == PositionAtTop || above) - horizontalValue += adjusted.top(); - else if (hint == PositionAtBottom || below) - horizontalValue += qMin(adjusted.left(), adjusted.right() - area.width() + 1); - else if (hint == PositionAtCenter) - horizontalValue += adjusted.left() - ((area.width() - adjusted.width()) / 2); - horizontalScrollBar()->setValue(horizontalValue); -} - -QModelIndex TabView::indexAt(const QPoint &p) const -{ - Q_D(const TabView); - return d->indexAt(p + QPoint(horizontalOffset(), verticalOffset())); -} - -QModelIndex TabView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers /*modifiers*/) -{ - Q_D(const TabView); - QModelIndex current = currentIndex(); - int currentRow = current.row(); - int maxRow = model()->rowCount(); - - auto moveup = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == maxColumnCount * 2 - 1) { - currentRow = 0; - } else if (currentRow < maxColumnCount) { - // 第一行不处理 - } else if (currentRow < maxColumnCount * 2) { - currentRow -= (maxColumnCount - 1); - } else { - currentRow -= maxColumnCount; - } - return currentRow; - }; - auto movedown = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == 0) { - currentRow += (maxColumnCount * 2 - 1); - } else if (currentRow < maxColumnCount) - currentRow += (maxColumnCount - 1); - else - currentRow += maxColumnCount; - return currentRow; - }; - switch (cursorAction) { - case MoveLeft: - currentRow--; - break; - case MoveRight: - currentRow++; - break; - case MovePageUp: { - } break; - case MoveUp: - currentRow = moveup(currentRow, d->m_maxColumnCount); - break; - case MovePageDown: { - } break; - case MoveDown: - currentRow = movedown(currentRow, d->m_maxColumnCount); - break; - case MoveHome: - currentRow = 0; - break; - case MoveEnd: - currentRow = maxRow - 1; - break; - default: - return QModelIndex(); - } - QModelIndex selectIndex = model()->index(currentRow, 0); - Q_EMIT activated(selectIndex); - return selectIndex; -} - -int TabView::horizontalOffset() const -{ - return horizontalScrollBar()->value(); -} - -int TabView::verticalOffset() const -{ - return verticalScrollBar()->value(); -} - -void TabView::updateGeometries() -{ - Q_D(TabView); - QAbstractItemView::updateGeometries(); - d->updateGeometries(); - - // 更新滚动条范围 - if (geometry().isEmpty() || !model() || model()->rowCount() <= 0 || model()->columnCount() <= 0) { - horizontalScrollBar()->setRange(0, 0); - verticalScrollBar()->setRange(0, 0); - } else { - QSize step = QSize(d->m_itemX.isEmpty() ? 0 : d->m_itemX.first(), d->m_size.height()); - horizontalScrollBar()->setSingleStep(step.width() + spacing()); - horizontalScrollBar()->setPageStep(viewport()->width()); - - int width = d->m_size.width(); - if (width < viewport()->width()) { - horizontalScrollBar()->setRange(0, 0); - } else { - horizontalScrollBar()->setRange(0, width - viewport()->width()); - } - } -} - -void TabView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) -{ - QAbstractItemView::dataChanged(topLeft, bottomRight, roles); - scheduleDelayedItemsLayout(); -} - -void TabView::rowsInserted(const QModelIndex &parent, int start, int end) -{ - scheduleDelayedItemsLayout(); - QAbstractItemView::rowsInserted(parent, start, end); -} - -void TabView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) -{ - QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); - scheduleDelayedItemsLayout(); -} - -bool TabView::isIndexHidden(const QModelIndex & /*index*/) const -{ - return false; -} - -QRegion TabView::visualRegionForSelection(const QItemSelection &selection) const -{ - if (selection.isEmpty()) - return QRegion(); - Q_D(const TabView); - QRect rect = d->rectForIndex(selection.indexes().first()); - return QRegion(rect); -} - -void TabView::setSelection([[maybe_unused]] const QRect &rect, [[maybe_unused]] QItemSelectionModel::SelectionFlags command) -{ - -} - -void TabView::paintEvent(QPaintEvent *e) -{ - Q_D(const TabView); - QStyleOptionViewItem option = viewOptions(); - QPainter painter(viewport()); - - const QVector toBeRendered = d->intersectingSet(e->rect().translated(horizontalOffset(), verticalOffset())); - - const QModelIndex current = currentIndex(); - const QModelIndex hover = d->m_hover; - const QAbstractItemModel *itemModel = model(); - const QItemSelectionModel *selections = selectionModel(); - const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid(); - const QStyle::State state = option.state; - const QAbstractItemView::State viewState = this->state(); - const bool enabled = (state & QStyle::State_Enabled) != 0; - option.decorationAlignment = Qt::AlignLeft; - - QVector::const_iterator end = toBeRendered.constEnd(); - for (QVector::const_iterator it = toBeRendered.constBegin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - option.rect = visualRect(*it); - - option.state = state; - if (selections && selections->isSelected(*it)) - option.state |= QStyle::State_Selected; - if (enabled) { - QPalette::ColorGroup cg; - if ((itemModel->flags(*it) & Qt::ItemIsEnabled) == 0) { - option.state &= ~QStyle::State_Enabled; - cg = QPalette::Disabled; - } else { - cg = QPalette::Normal; - } - option.palette.setCurrentColorGroup(cg); - } - if (focus && current == *it) { - option.state |= QStyle::State_HasFocus; - if (viewState == EditingState) - option.state |= QStyle::State_Editing; - } - option.state.setFlag(QStyle::State_MouseOver, *it == hover); - - painter.save(); - painter.setRenderHint(QPainter::Antialiasing); - painter.setPen(Qt::NoPen); - painter.setBrush(QBrush(palette().color(QPalette::Base))); - QRect maskRect = option.rect.adjusted(0, -2, 0, 2); - if (it->row() == 0) { - painter.drawRoundedRect(option.rect.adjusted(-2, -2, 0, 2), 8, 8); - maskRect.adjust(6, 0, 0, 0); - } - if (it->row() == itemModel->rowCount() - 1) { - painter.drawRoundedRect(option.rect.adjusted(0, -2, 2, 2), 8, 8); - maskRect.adjust(0, 0, -6, 0); - } - painter.drawRect(maskRect); - painter.restore(); - - itemDelegate(*it)->paint(&painter, option, *it); - } -} - -bool TabView::viewportEvent(QEvent *event) -{ - Q_D(TabView); - switch (event->type()) { - case QEvent::HoverMove: - case QEvent::HoverEnter: - d->m_hover = indexAt(static_cast(event)->pos()); - break; - case QEvent::HoverLeave: - case QEvent::Leave: - d->m_hover = QModelIndex(); - break; - default: - break; - } - return QAbstractItemView::viewportEvent(event); -} - -void TabView::wheelEvent(QWheelEvent *e) -{ - QApplication::sendEvent(horizontalScrollBar(), e); - e->setAccepted(true); -} - -void TabView::mouseMoveEvent(QMouseEvent *event) -{ - QWidget::mouseMoveEvent(event); -} diff --git a/dcc-old/src/interface/tabview.h b/dcc-old/src/interface/tabview.h deleted file mode 100644 index b94e294167..0000000000 --- a/dcc-old/src/interface/tabview.h +++ /dev/null @@ -1,66 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TABVIEW_H -#define TABVIEW_H -#include "interface/namespace.h" -#include -#include - -namespace DCC_NAMESPACE { - -class TabViewPrivate; -class TabView : public QAbstractItemView -{ - Q_OBJECT - Q_PROPERTY(int spacing READ spacing WRITE setSpacing) - Q_PROPERTY(QSize gridSize READ gridSize WRITE setGridSize) - Q_PROPERTY(Qt::Alignment alignment READ alignment WRITE setAlignment) - -public: - explicit TabView(QWidget *parent = nullptr); - virtual ~TabView() override; - - void setSpacing(int space); - int spacing() const; - - void setGridSize(const QSize &size); - QSize gridSize() const; - - void setAlignment(Qt::Alignment alignment); - Qt::Alignment alignment() const; - - QRect visualRect(const QModelIndex &index) const override; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; - QModelIndex indexAt(const QPoint &p) const override; - -protected: - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; - int horizontalOffset() const override; - int verticalOffset() const override; - - bool isIndexHidden(const QModelIndex &index) const override; - QRegion visualRegionForSelection(const QItemSelection &selection) const override; - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; - - void updateGeometries() override; - - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector()) override; - void rowsInserted(const QModelIndex &parent, int start, int end) override; - void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; - -protected: - void paintEvent(QPaintEvent *e) override; - bool viewportEvent(QEvent *event) override; - void wheelEvent(QWheelEvent *e) override; - void mouseMoveEvent(QMouseEvent *event) override; - -private: - TabViewPrivate *const d_ptr; - Q_DECLARE_PRIVATE(TabView) - Q_DISABLE_COPY(TabView) -}; - -} - -#endif // TABVIEW_H diff --git a/dcc-old/src/interface/vlistmodule.cpp b/dcc-old/src/interface/vlistmodule.cpp deleted file mode 100644 index 90a71feb35..0000000000 --- a/dcc-old/src/interface/vlistmodule.cpp +++ /dev/null @@ -1,253 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "moduledatamodel.h" -#include "vlistmodule.h" -#include "pagemodule.h" -#include "hlistmodule.h" - -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { -class VListModulePrivate -{ -public: - explicit VListModulePrivate(VListModule *parent) - : q_ptr(parent) - , m_view(nullptr) - , m_splitter(nullptr) - , m_childMargin(20) - , m_splitterSize({}) - { - } - - void onCurrentModuleChanged(ModuleObject *child) - { - if (!m_splitter) - return; - if (child) { - QWidget *widget = nullptr; - ModuleObject *activeModule = nullptr; - if (child->extra() && child->hasChildrens()) { - activeModule = child->children(0); - } else { - activeModule = child; - } - - PageModule *module = qobject_cast(activeModule); - if (module) { - module->setContentsMargins(m_childMargin, 0, m_childMargin, 0); - module->setMaximumWidth(DCC_PAGEMODULE_MAX_WIDTH + m_childMargin * 2); - } - widget = child->activePage(); - if (widget) { - QWidget *oldWidget = m_splitter->replaceWidget(1, widget); - widget->setVisible(true); - if (oldWidget) - delete oldWidget; - ModuleDataModel *model = static_cast(m_view->model()); - m_view->setCurrentIndex(model->index(child)); - } - } - } - - void onRemoveChild(DCC_NAMESPACE::ModuleObject *const childModule) - { - int index = m_extraModules.indexOf(childModule); - if (index != -1) { - QLayoutItem *item = m_hlayout->takeAt(index); - item->widget()->deleteLater(); - delete item; - m_extraModules.removeAt(index); - } - } - - void onAddChild(DCC_NAMESPACE::ModuleObject *const childModule) - { - if (ModuleObject::IsHidden(childModule) || !childModule->extra() || m_extraModules.contains(childModule)) - return; - - Q_Q(VListModule); - int index = 0; - for (auto &&child : q->childrens()) { - if (child == childModule) - break; - if (!ModuleObject::IsHidden(child) && child->extra()) - index++; - } - auto newPage = childModule->activePage(); - if (newPage) { - m_hlayout->insertWidget(index, newPage); - m_extraModules.insert(index, childModule); - } - } - - QWidget *page() - { - Q_Q(VListModule); - m_splitter = new QSplitter(Qt::Horizontal); - QObject::connect(m_splitter, &QObject::destroyed, q, [this]() { m_splitter = nullptr; }); - - DListView *view = new DListView(m_splitter); - QWidget *widget = new QWidget(m_splitter); - QVBoxLayout *vlayout = new QVBoxLayout; - m_hlayout = new QHBoxLayout; - widget->setLayout(vlayout); - vlayout->addWidget(view); - vlayout->addLayout(m_hlayout); - widget->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - widget->setMinimumWidth(158); - widget->setMaximumWidth(300); - m_splitter->addWidget(widget); - m_emptyWidget = new QWidget(m_splitter); - m_splitter->addWidget(m_emptyWidget); - m_splitter->setChildrenCollapsible(false); - - ModuleDataModel *model = new ModuleDataModel(view); - model->setModuleObject(q); - QObject::connect(q, &VListModule::currentModuleChanged, m_splitter, [this](ModuleObject *child) { - onCurrentModuleChanged(child); - }); - - view->setModel(model); - view->setFrameShape(QFrame::NoFrame); - view->setAutoScroll(true); - view->setDragEnabled(false); - view->setSpacing(5); - view->setItemSpacing(0); - view->setSelectionMode(QAbstractItemView::SingleSelection); - m_view = view; - - for (auto tmpChild : q->childrens()) { - if (tmpChild->extra()) { - auto page = tmpChild->activePage(); - if (page) { - m_hlayout->addWidget(page); - m_extraModules.append(tmpChild); - } - } - } - - auto onClicked = [](const QModelIndex &index) { - ModuleObject *obj = static_cast(index.internalPointer()); - if (obj && !ModuleObject::IsDisabled(obj)) - obj->trigger(); - }; - - QObject::connect(m_view, &DListView::activated, m_view, &DListView::clicked); - QObject::connect(m_view, &DListView::clicked, m_view, onClicked); - QObject::connect(q, &ModuleObject::insertedChild, m_view, [this](ModuleObject *const childModule) { onAddChild(childModule); }); - QObject::connect(q, &ModuleObject::removedChild, m_view, [this](ModuleObject *const childModule) { onRemoveChild(childModule); }); - QObject::connect(q, &ModuleObject::childStateChanged, m_view, [this](ModuleObject *const tmpChild, uint32_t flag, bool state) { - if (ModuleObject::IsHiddenFlag(flag)) { - if (state) - onRemoveChild(tmpChild); - else - onAddChild(tmpChild); - } - }); - QObject::connect(m_splitter, &QSplitter::splitterMoved, m_splitter, [this]([[maybe_unused]] int pos, [[maybe_unused]] int index) { - m_splitterSize = m_splitter->sizes(); - }); - m_childMargin = 0;//20; - if (qobject_cast(q->getParent())) { - m_childMargin = 0;//10; - m_view->setContentsMargins(10, 0, 10, 10); - } - onCurrentModuleChanged(q->currentModule()); - if (m_splitterSize.isEmpty()) { - m_splitterSize = {200, 600}; - } - m_splitter->setSizes(m_splitterSize); - return m_splitter; - } - -private: - VListModule *q_ptr; - Q_DECLARE_PUBLIC(VListModule) - - QAbstractItemView *m_view; - QSplitter *m_splitter; - QWidget *m_emptyWidget; - QHBoxLayout *m_hlayout; - QList m_extraModules; - int m_childMargin; - QList m_splitterSize; -}; -} - -VListModule::VListModule(QObject *parent) - : ModuleObject(parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, QObject *parent) - : ModuleObject(name, displayName, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QStringList &contentText, QObject *parent) - : ModuleObject(name, contentText, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QStringList &contentText, QObject *parent) - : ModuleObject(name, displayName, contentText, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, icon, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QString &description, QObject *parent) - : ModuleObject(name, displayName, description, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QString &description, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QString &description, const QIcon &icon, QObject *parent) - : ModuleObject(name, displayName, description, icon, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const QString &name, const QString &displayName, const QString &description, const QStringList &contentText, const QVariant &icon, QObject *parent) - : ModuleObject(name, displayName, description, contentText, icon, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::VListModule(const ModuleInitContext &message, QObject *parent) - : ModuleObject(message, parent) - , DCC_INIT_PRIVATE(VListModule) -{ -} - -VListModule::~VListModule() -{ -} - -QWidget *VListModule::page() -{ - Q_D(VListModule); - return d->page(); -} diff --git a/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.cpp b/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.cpp deleted file mode 100644 index 0ebd0efdcd..0000000000 --- a/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "accountsdbusproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include -#include -#include - -AccountsDBusProxy::AccountsDBusProxy(QObject *parent) - : QObject(parent) -{ - init(); -} - -void AccountsDBusProxy::init() -{ - const QString accountsService = "org.deepin.dde.Accounts1"; - const QString accountsPath = "/org/deepin/dde/Accounts1"; - const QString accountsInterface = "org.deepin.dde.Accounts1"; - - const QString displayManagerService = "org.freedesktop.DisplayManager"; - const QString displayManagerPath = "/org/freedesktop/DisplayManager"; - const QString displayManagerInterface = "org.freedesktop.DisplayManager"; - - m_dBusAccountsInter = new DDBusInterface(accountsService, accountsPath, accountsInterface, QDBusConnection::systemBus(), this); - m_dBusDisplayManagerInter = new DDBusInterface(displayManagerService, displayManagerPath, displayManagerInterface, QDBusConnection::systemBus(), this); -} - -// Accounts -QStringList AccountsDBusProxy::userList() -{ - return qvariant_cast(m_dBusAccountsInter->property("UserList")); -} - -QList AccountsDBusProxy::sessions() -{ - return qvariant_cast>(m_dBusDisplayManagerInter->property("Sessions")); -} - -QDBusPendingReply AccountsDBusProxy::CreateUser(const QString &in0, const QString &in1, int in2) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("CreateUser"), argumentList); -} - -QDBusPendingReply<> AccountsDBusProxy::DeleteUser(const QString &in0, bool in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("DeleteUser"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::FindUserById(const qint64 &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("FindUserById"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::FindUserByName(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("FindUserByName"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::GetGroups() -{ - QList argumentList; - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("GetGroups"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::GetPresetGroups(int in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("GetPresetGroups"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::IsPasswordValid(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("IsPasswordValid"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::IsUsernameValid(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("IsUsernameValid"), argumentList); -} - -QDBusPendingReply AccountsDBusProxy::RandUserIcon() -{ - QList argumentList; - return m_dBusAccountsInter->asyncCallWithArgumentList(QStringLiteral("RandUserIcon"), argumentList); -} diff --git a/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.h b/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.h deleted file mode 100644 index 8d1f35c4e9..0000000000 --- a/dcc-old/src/plugin-accounts/operation/accountsdbusproxy.h +++ /dev/null @@ -1,58 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ACCOUNTSDBUSPROXY_H -#define ACCOUNTSDBUSPROXY_H - -#include -#include -#include -#include "interface/namespace.h" - -using Dtk::Core::DDBusInterface; - -class QDBusMessage; - -class AccountsDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit AccountsDBusProxy(QObject *parent = nullptr); - - // accounts - Q_PROPERTY(QStringList UserList READ userList NOTIFY UserListChanged) - QStringList userList(); - - // displaymanager - Q_PROPERTY(QList Sessions READ sessions NOTIFY SessionsChanged) - QList sessions(); - -signals: - void UserAdded(const QString &in0); - void UserDeleted(const QString &in0); - // begin property changed signals - void UserListChanged(const QStringList &value) const; - - // displaymanager - void SessionsChanged(const QList &value) const; - -public slots: - QDBusPendingReply CreateUser(const QString &in0, const QString &in1, int in2); - QDBusPendingReply<> DeleteUser(const QString &in0, bool in1); - QDBusPendingReply FindUserById(const qint64 &in0); - QDBusPendingReply FindUserByName(const QString &in0); - QDBusPendingReply GetGroups(); - QDBusPendingReply GetPresetGroups(int in0); - QDBusPendingReply IsPasswordValid(const QString &in0); - QDBusPendingReply IsUsernameValid(const QString &in0); - QDBusPendingReply RandUserIcon(); - -private: - void init(); - -private: - DDBusInterface *m_dBusAccountsInter; - DDBusInterface *m_dBusDisplayManagerInter; -}; - -#endif // ACCOUNTSDBUSPROXY_H diff --git a/dcc-old/src/plugin-accounts/operation/accountsworker.cpp b/dcc-old/src/plugin-accounts/operation/accountsworker.cpp deleted file mode 100644 index 1e844c3b0b..0000000000 --- a/dcc-old/src/plugin-accounts/operation/accountsworker.cpp +++ /dev/null @@ -1,821 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "accountsworker.h" -#include "user.h" -#include "widgets/utils.h" -#include "syncdbusproxy.h" -#include "accountsdbusproxy.h" -#include "userdbusproxy.h" -#include "securitydbusproxy.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -using namespace PolkitQt1; - -using namespace DCC_NAMESPACE; - -AccountsWorker::AccountsWorker(UserModel *userList, QObject *parent) - : QObject(parent) - , m_accountsInter(new AccountsDBusProxy(this)) - , m_userQInter(new UserDBusProxy(QString("/org/deepin/dde/Accounts1/User%1").arg(getuid()), this)) - , m_syncInter(new SyncDBusProxy(this)) - , m_securityInter(new SecurityDBusProxy(this)) - , m_userModel(userList) -{ - struct passwd *pws; - pws = getpwuid(getuid()); - m_currentUserName = QString(pws->pw_name); - m_userModel->setCurrentUserName(m_currentUserName); - m_userModel->setIsSecurityHighLever(hasOpenSecurity()); - - connect(m_accountsInter, &AccountsDBusProxy::UserListChanged, this, &AccountsWorker::onUserListChanged, Qt::QueuedConnection); - connect(m_accountsInter, &AccountsDBusProxy::UserAdded, this, &AccountsWorker::addUser, Qt::QueuedConnection); - connect(m_accountsInter, &AccountsDBusProxy::UserDeleted, this, &AccountsWorker::removeUser, Qt::QueuedConnection); - connect(m_accountsInter, &AccountsDBusProxy::SessionsChanged, this, &AccountsWorker::updateUserOnlineStatus); - - QDBusPendingReply reply = m_accountsInter->FindUserById(pws->pw_uid); - QString currentUserPath = reply.value(); - if (!currentUserPath.isEmpty()) { - onUserListChanged({currentUserPath}); - } - onUserListChanged(m_accountsInter->userList()); - updateUserOnlineStatus(m_accountsInter->sessions()); - getAllGroups(); - getPresetGroups(); - - if(DSysInfo::UosServer != DSysInfo::uosType()) { - m_userModel->setAutoLoginVisable(true); - m_userModel->setNoPassWordLoginVisable(true); - } else { - m_userModel->setAutoLoginVisable(true); - m_userModel->setNoPassWordLoginVisable(false); - } -} - -void AccountsWorker::getAllGroups() -{ - QDBusPendingReply reply = m_accountsInter->GetGroups(); - QDBusPendingCallWatcher *groupResult = new QDBusPendingCallWatcher(reply, this); - connect(groupResult, &QDBusPendingCallWatcher::finished, this, &AccountsWorker::getAllGroupsResult); -} - -void AccountsWorker::getAllGroupsResult(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - if (!watch->isError()) { - m_userModel->setAllGroups(reply.value()); - } else { - qDebug() << "getAllGroupsResult error." << watch->error(); - } - watch->deleteLater(); -} - -void AccountsWorker::getPresetGroups() -{ - int userType = DSysInfo::UosServer == DSysInfo::uosType() ? 0 : 1; - QDBusPendingReply reply = m_accountsInter->GetPresetGroups(userType); - QDBusPendingCallWatcher *presetGroupsResult = new QDBusPendingCallWatcher(reply, this); - connect(presetGroupsResult, &QDBusPendingCallWatcher::finished, this, &AccountsWorker::getPresetGroupsResult); -} - -void AccountsWorker::getPresetGroupsResult(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - if (!watch->isError()) { - m_userModel->setPresetGroups(reply.value()); - } else { - qDebug() << "getPresetGroupsResult error." << watch->error(); - } - watch->deleteLater(); -} - -void AccountsWorker::getUOSID(QString &uosid) -{ - const auto &result = m_syncInter->UOSID(); - if (!result.isEmpty()) { - uosid = result; - } -} - -void AccountsWorker::getUUID(QString &uuid) -{ - QVariant retUUID = m_userQInter->uuid(); - uuid = retUUID.toString(); -} - -void AccountsWorker::localBindCheck(User *user, const QString &uosid, const QString &uuid) -{ - Q_UNUSED(user) - QFutureWatcher *watcher = new QFutureWatcher(this); - connect(watcher, &QFutureWatcher::finished, [this, watcher] { - BindCheckResult result = watcher->result(); - if (result.error.isEmpty()) - Q_EMIT localBindUbid(result.ubid); - else - Q_EMIT localBindError(result.error); - watcher->deleteLater(); - }); - QFuture future = QtConcurrent::run(this, &AccountsWorker::checkLocalBind, uosid, uuid); - watcher->setFuture(future); -} - -void AccountsWorker::startResetPasswordExec(User *user) -{ - qInfo() << "Begin Resetpassword"; - UserDBusProxy *userInter = m_userInters.value(user); - auto reply = userInter->SetPassword(""); - reply.waitForFinished(); - Q_EMIT user->startResetPasswordReplied(reply.error().message()); -} - -void AccountsWorker::asyncSecurityQuestionsCheck(User *user) -{ - QFutureWatcher> *watcher = new QFutureWatcher>(this); - connect(watcher, &QFutureWatcher>::finished, [user, watcher] { - QList result = watcher->result(); - if (result.size() != SECURITY_QUESTIONS_ERROR_COUNT) - Q_EMIT user->startSecurityQuestionsCheckReplied(result); - - watcher->deleteLater(); - }); - QFuture> future = QtConcurrent::run(this, &AccountsWorker::securityQuestionsCheck); - watcher->setFuture(future); -} - -QList AccountsWorker::securityQuestionsCheck() -{ - QDBusPendingReply> reply = m_userQInter->GetSecretQuestions(); - if (!reply.error().message().isEmpty()) { - qWarning() << reply.error().message(); - } - if (reply.isValid()) { - return reply.value(); - } - return {-1}; -} - -void AccountsWorker::setPasswordHint(User *user, const QString &passwordHint) -{ - UserDBusProxy *userInter = m_userInters.value(user); - Q_ASSERT(userInter); - - userInter->SetPasswordHint(passwordHint); -} - -void AccountsWorker::setSecurityQuestions(User *user, const QMap &securityQuestions) -{ - QDBusPendingReply reply = m_userQInter->SetSecretQuestions(securityQuestions); - if (reply.isValid()) { - Q_EMIT user->setSecurityQuestionsReplied(reply.error().message()); - } - if (!reply.error().message().isEmpty()) { - Q_EMIT user->setSecurityQuestionsReplied(reply.error().message() + "error"); - } -} - -bool AccountsWorker::hasOpenSecurity() -{ - const auto &value = m_securityInter->Status(); - if (value.isEmpty()) { - qWarning() << m_securityInter->lastError(); - return false; - } - if (value == "open") - return true; - return false; -} - -SecurityLever AccountsWorker::getSecUserLeverbyname(QString userName) -{ - std::tuple result = m_securityInter->GetSEUserByName(userName); - const auto &value = std::get<0>(result); - if (value.isEmpty()) { - qWarning() << m_securityInter->lastError(); - return SecurityLever::Standard; - } - - if (value == QStringLiteral("sysadm_u")) { - return SecurityLever::Sysadm; - } - if (value == QStringLiteral("secadm_u")) { - return SecurityLever::Secadm; - } - if (value == QStringLiteral("audadm_u")) { - return SecurityLever::Audadm; - } - if (value == QStringLiteral("auditadm_u")) { - return SecurityLever::Auditadm; - } - - return SecurityLever::Standard; -} - -void AccountsWorker::checkPwdLimitLevel() -{ - // 密码校验失败并且安全中心密码安全等级不为低,弹出跳转到安全中心的对话框,低、中、高等级分别对应的值为1、2、3 - QDBusInterface interface(QStringLiteral("com.deepin.defender.daemonservice"), - QStringLiteral("/com/deepin/defender/daemonservice"), - QStringLiteral("com.deepin.defender.daemonservice")); - if (!interface.isValid()) { - return; - } - QDBusReply level = interface.call("GetPwdLimitLevel"); - if (level.error().type() == QDBusError::NoError && level != 1) { - QDBusReply errorTips = interface.call("GetPwdError"); - Q_EMIT showSafeyPage(errorTips); - } -} - -void AccountsWorker::setGroups(User *user, const QStringList &usrGroups) -{ - UserDBusProxy *userInter = m_userInters[user]; - Q_ASSERT(userInter); - - userInter->SetGroups(usrGroups); -} - -void AccountsWorker::active() -{ - for (auto it(m_userInters.cbegin()); it != m_userInters.cend(); ++it) { - it.key()->setName(it.value()->property("UserName").toString()); - it.key()->setAutoLogin(it.value()->automaticLogin()); - it.key()->setNopasswdLogin(it.value()->noPasswdLogin()); - it.key()->setUserType(it.value()->accountType()); - it.key()->setAvatars(it.value()->iconList()); - it.key()->setGroups(it.value()->groups()); - it.key()->setCurrentAvatar(it.value()->iconFile()); - it.key()->setCreatedTime(it.value()->createdTime()); - it.key()->setGid(it.value()->gid()); - it.key()->setFullname(it.value()->fullName()); - it.key()->setIsCurrentUser(it.value()->property("UserName").toString() == m_currentUserName); - } -} - -QString AccountsWorker::getCurrentUserName() -{ - return m_currentUserName; -} - -QDBusPendingReply AccountsWorker::isUsernameValid(const QString &name) -{ - QDBusPendingReply reply = m_accountsInter->IsUsernameValid(name); - reply.waitForFinished(); - return reply; -} - -void AccountsWorker::randomUserIcon(User *user) -{ - QDBusPendingCall call = m_accountsInter->RandUserIcon(); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, [=] { - if (!call.isError()) { - QDBusPendingReply reply = call.reply(); - user->setCurrentAvatar(reply.value()); - } - watcher->deleteLater(); - }); -} - -void AccountsWorker::createAccount(const User *user) -{ - qDebug() << "create account"; - - QFutureWatcher *watcher = new QFutureWatcher(this); - connect(watcher, &QFutureWatcher::finished, [this, watcher] { - CreationResult *result = watcher->result(); - m_userModel->setAllGroups(m_accountsInter->GetGroups()); - Q_EMIT accountCreationFinished(result); - Q_EMIT requestMainWindowEnabled(true); - watcher->deleteLater(); - }); - - QFuture future = QtConcurrent::run(this, &AccountsWorker::createAccountInternal, user); - Q_EMIT requestMainWindowEnabled(false); - watcher->setFuture(future); -} - -void AccountsWorker::updateGroupinfo() -{ - m_userModel->setAllGroups(m_accountsInter->GetGroups()); -} - -void AccountsWorker::setAvatar(User *user, const QString &iconPath) -{ - qDebug() << "set account avatar"; - UserDBusProxy *ui = m_userInters[user]; - Q_ASSERT(ui); - - ui->SetIconFile(iconPath); -} - -void AccountsWorker::setFullname(User *user, const QString &fullname) -{ - qInfo() << "fullname" << fullname; - - UserDBusProxy *ui = m_userInters[user]; - Q_ASSERT(ui); - - QDBusPendingCall call = ui->SetFullName(fullname); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (!call.isError()) { - Q_EMIT accountFullNameChangeFinished(); - } - watcher->deleteLater(); - }); -} - -void AccountsWorker::deleteAccount(User *user, const bool deleteHome) -{ - QDBusPendingCall call = m_accountsInter->DeleteUser(user->name(), deleteHome); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, user] (QDBusPendingCallWatcher* call) { - Q_EMIT requestMainWindowEnabled(true); - if (call->isError()) { - qDebug() << Q_FUNC_INFO << call->error().message(); - Q_EMIT m_userModel->isCancelChanged(); - } else { - if (!m_userInters.contains(user)) { - call->deleteLater(); - return; - } - Q_EMIT m_userModel->deleteUserSuccess(); - removeUser(m_userInters.value(user)->path()); - getAllGroups(); - } - call->deleteLater(); - }); - Q_EMIT requestMainWindowEnabled(false); -} - -void AccountsWorker::setAutoLogin(User *user, const bool autoLogin) -{ - UserDBusProxy *ui = m_userInters[user]; - Q_ASSERT(ui); - - QDBusPendingCall call = ui->SetAutomaticLogin(autoLogin); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT user->autoLoginChanged(user->autoLogin()); - } - watcher->deleteLater(); - }); -} - -//切换账户权限 -void AccountsWorker::setAdministrator(User *user, const bool asAdministrator) -{ - UserDBusProxy *ui = m_userInters[user]; - Q_ASSERT(ui); - - // because this operate need root permission, we must wait for finished and refersh result - Q_EMIT requestMainWindowEnabled(false); - - QStringList lstGroups = ui->groups(); - if(!asAdministrator) - lstGroups.removeOne("sudo"); - else - lstGroups.append("sudo"); - - QDBusPendingCall call = ui->SetGroups(lstGroups); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT user->userTypeChanged(user->userType()); - } - Q_EMIT requestMainWindowEnabled(true); - watcher->deleteLater(); - }); -} - -void AccountsWorker::loadUserList() -{ - onUserListChanged(m_accountsInter->userList()); -} - -void AccountsWorker::onUserListChanged(const QStringList &userList) -{ - for (const QString &path : userList) { - if (!m_userModel->contains(path)) { - addUser(path); - } - } -} - -void AccountsWorker::setPassword(User *user, const QString &oldpwd, const QString &passwd, const QString &repeatPasswd, const bool needResult) -{ - QProcess process; - QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - env.insert("LC_ALL", "C"); - process.setProcessEnvironment(env); - process.setProcessChannelMode(QProcess::MergedChannels); - - process.start("/bin/bash", QStringList() << "-c" << QString("passwd")); - if (user->passwordStatus() == NO_PASSWORD) { - process.write(QString("%1\n%2\n").arg(passwd).arg(repeatPasswd).toLatin1()); - } else { - process.write(QString("%1\n%2\n%3").arg(oldpwd).arg(passwd).arg(repeatPasswd).toLatin1()); - } - - process.closeWriteChannel(); - process.waitForFinished(); - - if (needResult) { - // process.exitCode() = 0 表示密码修改成功 - int exitCode = process.exitCode(); - const QString& outputTxt = process.readAll(); - Q_EMIT user->passwordModifyFinished(exitCode, outputTxt); - } -} - -void AccountsWorker::resetPassword(User *user, const QString &password) -{ - auto reply = m_userInters.value(user)->SetPassword(cryptUserPassword(password)); - reply.waitForFinished(); - - Q_EMIT user->passwordResetFinished(reply.error().message()); -} - -void AccountsWorker::deleteUserIcon(User *user, const QString &iconPath) -{ - UserDBusProxy *userInter = m_userInters[user]; - Q_ASSERT(userInter); - - userInter->DeleteIconFile(iconPath); -} - -void AccountsWorker::addUser(const QString &userPath) -{ - if (userPath.contains("User0", Qt::CaseInsensitive) || m_userModel->contains(userPath)) - return; - - if(!userPath.contains("/org/deepin/dde/Accounts1")) - return; - - UserDBusProxy *userInter = new UserDBusProxy(userPath, this); - User *user = new User(this); - - connect(userInter, &UserDBusProxy::UserNameChanged, user, [=](const QString &name) { - user->setName(name); - user->setSecurityLever(getSecUserLeverbyname(name)); - user->setOnline(m_onlineUsers.contains(name)); - user->setIsCurrentUser(name == m_currentUserName); - checkADUser(); - }); - - connect(userInter, &UserDBusProxy::AutomaticLoginChanged, user, &User::setAutoLogin); - connect(userInter, &UserDBusProxy::IconListChanged, user, &User::setAvatars); - connect(userInter, &UserDBusProxy::IconFileChanged, user, &User::setCurrentAvatar); - connect(userInter, &UserDBusProxy::FullNameChanged, user, &User::setFullname); - connect(userInter, &UserDBusProxy::NoPasswdLoginChanged, user, &User::setNopasswdLogin); - connect(userInter, &UserDBusProxy::PasswordStatusChanged, user, &User::setPasswordStatus); - connect(userInter, &UserDBusProxy::CreatedTimeChanged, user, &User::setCreatedTime); - connect(userInter, &UserDBusProxy::GroupsChanged, user, &User::setGroups); - connect(userInter, &UserDBusProxy::AccountTypeChanged, user, &User::setUserType); - connect(userInter, &UserDBusProxy::MaxPasswordAgeChanged, user, &User::setPasswordAge); - connect(userInter, &UserDBusProxy::GidChanged, user, &User::setGid); - - // 这里直接赋值的话, 由于请求是异步的, 所以一开始会被初始化成乱码, - // 然后数据正常了以后会额外产生一次变化信号 - // 对于计算当前有多少个管理员有干扰. - userInter->iconList(); - userInter->groups(); - userInter->iconFile(); - userInter->noPasswdLogin(); - userInter->passwordStatus(); - userInter->createdTime(); - userInter->accountType(); - userInter->maxPasswordAge(); - userInter->IsPasswordExpired(); - userInter->gid(); - - user->setName(userInter->userName()); - user->setFullname(userInter->fullName()); - user->setAutoLogin(userInter->automaticLogin()); - user->setAvatars(userInter->iconList()); - user->setCurrentAvatar(userInter->iconFile()); - user->setNopasswdLogin(userInter->noPasswdLogin()); - user->setPasswordStatus(userInter->passwordStatus()); - user->setCreatedTime(userInter->createdTime()); - user->setGroups(userInter->groups()); - user->setUserType(userInter->accountType()); - user->setPasswordAge(userInter->maxPasswordAge()); - user->setGid(userInter->gid()); - - m_userInters[user] = userInter; - m_userModel->addUser(userPath, user); -} - -void AccountsWorker::removeUser(const QString &userPath) -{ - for (UserDBusProxy *userInter : m_userInters.values()) { - if (userInter->path() == userPath) { - User *user = m_userInters.key(userInter); - user->deleteLater(); - - m_userInters.remove(user); - m_userModel->removeUser(userPath); - - return; - } - } -} - -void AccountsWorker::setNopasswdLogin(User *user, const bool nopasswdLogin) -{ - UserDBusProxy *userInter = m_userInters[user]; - Q_ASSERT(userInter); - - QDBusPendingCall call = userInter->EnableNoPasswdLogin(nopasswdLogin); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT user->nopasswdLoginChanged(user->nopasswdLogin()); - } - QProcess restartLock; - QStringList restartLockCommand = QStringList { "--user", "restart", "dde-lock.service" }; - restartLock.start("systemctl", restartLockCommand); - restartLock.waitForFinished(-1); - watcher->deleteLater(); - }); -} - -void AccountsWorker::setMaxPasswordAge(User *user, const int maxAge) -{ - UserDBusProxy *userInter = m_userInters[user]; - Q_ASSERT(userInter); - - QDBusPendingCall call = userInter->SetMaxPasswordAge(maxAge); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT user->passwordAgeChanged(user->passwordAge()); - } - watcher->deleteLater(); - }); -} - -void AccountsWorker::refreshADDomain() -{ - QProcess *process = new QProcess(this); - process->start("/opt/pbis/bin/enum-users", QStringList()); - - connect(process, &QProcess::readyReadStandardOutput, this, [=] { - QRegularExpression re("Name:\\s+(\\w+)"); - QRegularExpressionMatch match = re.match(process->readAll()); - m_userModel->setIsJoinADDomain(match.hasMatch()); - }); - - connect(process, static_cast(&QProcess::finished), process, &QProcess::deleteLater); -} - -void AccountsWorker::ADDomainHandle(const QString &server, const QString &admin, const QString &password) -{ - const bool isJoin = m_userModel->isJoinADDomain(); - int exitCode = 0; - if (isJoin) { - exitCode = QProcess::execute("pkexec", QStringList() << "/opt/pbis/bin/domainjoin-cli" - << "leave" - << "--disable" - << "ssh"); - } else { - // for safety, restart lwsmd service before join AD Domain - QProcess::execute("pkexec", QStringList() << "/bin/systemctl" - << "restart" - << "lwsmd"); - exitCode = QProcess::execute("pkexec", QStringList() << "/opt/pbis/bin/domainjoin-cli" - << "join" - << "--disable" - << "ssh" << server << admin << password); - } - - QString message; - - if (!exitCode) { - message = isJoin ? tr("Your host was removed from the domain server successfully") - : tr("Your host joins the domain server successfully"); - - // Additional operation, need to initialize the user's settings - if (!isJoin) { - QProcess::execute("pkexec", QStringList() << "/opt/pbis/bin/config" - << "UserDomainPrefix" - << "ADS"); - QProcess::execute("pkexec", QStringList() << "/opt/pbis/bin/config" - << "LoginShellTemplate" - << "/bin/bash"); - } - // save config - QFile file("/etc/deepin/dde-session-ui.conf"); - QFile tmpFile("/tmp/.dde-session-ui.conf"); - - if (file.exists() && file.open(QIODevice::Text | QIODevice::ReadOnly)) { - qDebug() << file.copy("/tmp/.dde-session-ui.conf"); - } - if (tmpFile.open(QIODevice::Text | QIODevice::ReadWrite)) { - QSettings setting("/tmp/.dde-session-ui.conf", QSettings::IniFormat); - setting.setValue("loginPromptInput", !isJoin); - setting.sync(); - QProcess::execute("pkexec", QStringList() << "cp" - << "/tmp/.dde-session-ui.conf" - << "/etc/deepin/dde-session-ui.conf"); - tmpFile.remove(); - } - } else { - message = isJoin ? tr("Your host failed to leave the domain server") - : tr("Your host failed to join the domain server"); - } - - DDBusSender() - .service("org.freedesktop.Notifications") - .path("/org/freedesktop/Notifications") - .interface("org.freedesktop.Notifications") - .method("Notify") - .arg(QString()) - .arg((uint)QDateTime::currentMSecsSinceEpoch()) - .arg(exitCode ? QStringLiteral("dialog-warning") : QStringLiteral("dialog-ok")) - .arg(tr("AD domain settings")) - .arg(message) - .arg(QStringList()) - .arg(QVariantMap()) - .arg((int)0) - .call(); - - refreshADDomain(); -} - -void AccountsWorker::updateUserOnlineStatus(const QList &paths) -{ - m_onlineUsers.clear(); - m_userModel->SetOnlineUsers(QStringList()); - - for (const QDBusObjectPath &path : paths) { - QDBusInterface sessionInter("org.freedesktop.DisplayManager", - path.path(), - "org.freedesktop.DisplayManager.Session", - QDBusConnection::systemBus()); - - m_onlineUsers << qvariant_cast(sessionInter.property("UserName")); - } - - for (User *user : m_userModel->userList()) { - user->setOnline(m_onlineUsers.contains(user->name())); - } - - m_userModel->SetOnlineUsers(m_onlineUsers); - - checkADUser(); -} - -void AccountsWorker::checkADUser() -{ - // AD User is not in native user list, but session list have it. - bool isADUser = false; - - QStringList userList; - - for (User *user : m_userModel->userList()) { - userList << user->name(); - } - - for (const QString &u : m_onlineUsers) { - if (!userList.contains(u)) { - isADUser = true; - break; - } - } - - m_userModel->setADUserLogind(isADUser); -} - -CreationResult *AccountsWorker::createAccountInternal(const User *user) -{ - CreationResult *result = new CreationResult; - - // validate username - QDBusPendingReply reply = m_accountsInter->IsUsernameValid(user->name()); - reply.waitForFinished(); - if (reply.isError()) { - result->setType(CreationResult::UserNameError); - result->setMessage(reply.error().message()); - - return result; - } - bool validation = reply.argumentAt(0).toBool(); - if (!validation) { - result->setType(CreationResult::UserNameError); - result->setMessage(dgettext("dde-daemon", reply.argumentAt(1).toString().toUtf8().data())); - return result; - } - - // validate password - if (user->password() != user->repeatPassword()) { - result->setType(CreationResult::PasswordMatchError); - result->setMessage(tr("Password not match")); - return result; - } - - Authority::Result authenticationResult; - authenticationResult = Authority::instance()->checkAuthorizationSync("org.deepin.dde.accounts.user-administration", UnixProcessSubject(getpid()), - Authority::AllowUserInteraction); - - if (Authority::Result::Yes != authenticationResult) { - result->setType(CreationResult::Canceled); - return result; - } - - // default FullName is empty string - QDBusObjectPath path; - QDBusPendingReply createReply = m_accountsInter->CreateUser(user->name(), user->fullname(), user->userType()); - createReply.waitForFinished(); - if (createReply.isError()) { - /* 这里由后端保证出错时一定有错误信息返回,如果没有错误信息,就默认用户在认证时点了取消 */ - result->setType(createReply.error().message().isEmpty() ? CreationResult::Canceled : CreationResult::UnknownError); - result->setMessage(createReply.error().message()); - return result; - } else { - path = createReply.argumentAt<0>(); - } - const QString userPath = path.path(); - - UserDBusProxy *userDBus = new UserDBusProxy(userPath, this); - if (!userDBus->interface()->isValid()) { - result->setType(CreationResult::UnknownError); - result->setMessage("user dbus is still not valid."); - - return result; - } - - //TODO(hualet): better to check all the call results. - bool sifResult = !userDBus->SetIconFile(user->currentAvatar()).isError(); - bool spResult = !userDBus->SetPassword(cryptUserPassword(user->password())).isError(); - bool groupResult = true; - bool passwordHintResult = true; - if (DSysInfo::UosServer == DSysInfo::uosType() && !user->groups().isEmpty()) { - groupResult = !userDBus->SetGroups(user->groups()).isError(); - } - passwordHintResult = !userDBus->SetPasswordHint(user->passwordHint()).isError(); - - if (!sifResult || !spResult || !groupResult || !passwordHintResult) { - result->setType(CreationResult::UnknownError); - if (!sifResult) - result->setMessage("set icon file for new created user failed."); - if (!spResult) - result->setMessage("set password for new created user failed"); - if (!groupResult) - result->setMessage("set group for new created user failed"); - return result; - } - - return result; -} - -QString AccountsWorker::cryptUserPassword(const QString &password) -{ - /* - NOTE(kirigaya): Password is a combination of salt and crypt function. - slat is begin with $6$, 16 byte of random values, at the end of $. - crypt function will return encrypted values. - */ - - const QString seedchars("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); - char salt[] = "$6$................$"; - - std::random_device r; - std::default_random_engine e1(r()); - std::uniform_int_distribution uniform_dist(0, seedchars.size() - 1); //seedchars.size()是64,生成随机数的范围应该写成[0, 63]。 - - // Random access to a character in a restricted list - for (int i = 0; i != 16; i++) { - salt[3 + i] = seedchars.at(uniform_dist(e1)).toLatin1(); - } - - return crypt(password.toUtf8().data(), salt); -} - -BindCheckResult AccountsWorker::checkLocalBind(const QString &uosid, const QString &uuid) -{ - BindCheckResult result; - const auto &ret = m_syncInter->LocalBindCheck(uosid, uuid); - if (!ret.isEmpty()) - result.ubid = ret; - else - result.error = m_syncInter->lastError(); - return result; -} diff --git a/dcc-old/src/plugin-accounts/operation/accountsworker.h b/dcc-old/src/plugin-accounts/operation/accountsworker.h deleted file mode 100644 index e6cc6e60f3..0000000000 --- a/dcc-old/src/plugin-accounts/operation/accountsworker.h +++ /dev/null @@ -1,111 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ACCOUNTSWORKER_H -#define ACCOUNTSWORKER_H - -#include "interface/namespace.h" -#include "usermodel.h" -#include "creationresult.h" - -#include -#include - -#define SECURITY_QUESTIONS_ERROR_COUNT 1 - -class AccountsDBusProxy; -class UserDBusProxy; -class SyncDBusProxy; -class SecurityDBusProxy; - -namespace DCC_NAMESPACE { - -class User; - -struct BindCheckResult { - QString ubid = ""; - QString error = ""; -}; - -class AccountsWorker : public QObject -{ - Q_OBJECT - -public: - explicit AccountsWorker(UserModel * userList, QObject *parent = nullptr); - - void active(); - QString getCurrentUserName(); - void updateGroupinfo(); - QDBusPendingReply isUsernameValid(const QString &name); - -Q_SIGNALS: - void accountCreationFinished(CreationResult *result) const; - void accountFullNameChangeFinished() const; - void requestMainWindowEnabled(const bool isEnabled) const; - void localBindUbid(const QString &ubid); - void localBindError(const QString &error); - void showSafeyPage(const QString &errorTips); - -public Q_SLOTS: - void randomUserIcon(User *user); - void createAccount(const User *user); - - void setAvatar(User *user, const QString &iconPath); - void setFullname(User *user, const QString &fullname); - void deleteAccount(User *user, const bool deleteHome); - void setAutoLogin(User *user, const bool autoLogin); - void setAdministrator(User *user, const bool asAdministrator); - void onUserListChanged(const QStringList &userList); - void setPassword(User *user, const QString &oldpwd, const QString &passwd, const QString &repeatPasswd, const bool needResule = true); - void resetPassword(User *user, const QString &password); - void deleteUserIcon(User *user, const QString &iconPath); - void setNopasswdLogin(User *user, const bool nopasswdLogin); - void setMaxPasswordAge(User *user, const int maxAge); - void loadUserList(); - void getUOSID(QString &uosid); - void getUUID(QString &uuid); - void localBindCheck(User *user, const QString &uosid, const QString &uuid); - void startResetPasswordExec(User *user); - void asyncSecurityQuestionsCheck(User *user); - void refreshADDomain(); - void ADDomainHandle(const QString &server, const QString &admin, const QString &password); - void addUser(const QString &userPath); - void removeUser(const QString &userPath); - void setGroups(User *user, const QStringList &usrGroups); - void setPasswordHint(User *user, const QString &passwordHint); - void setSecurityQuestions(User *user, const QMap &securityQuestions); - - bool hasOpenSecurity(); - SecurityLever getSecUserLeverbyname(QString userName); - void checkPwdLimitLevel(); - -private Q_SLOTS: - void updateUserOnlineStatus(const QList &paths); - void getAllGroups(); - void getAllGroupsResult(QDBusPendingCallWatcher *watch); - void getPresetGroups(); - void getPresetGroupsResult(QDBusPendingCallWatcher *watch); - void checkADUser(); - -private: - UserDBusProxy *userInter(const QString &userName) const; - CreationResult *createAccountInternal(const User *user); - QString cryptUserPassword(const QString &password); - BindCheckResult checkLocalBind(const QString &uosid, const QString &uuid); - QList securityQuestionsCheck(); - -private: - AccountsDBusProxy *m_accountsInter; - UserDBusProxy *m_userQInter; - SyncDBusProxy *m_syncInter; - SecurityDBusProxy *m_securityInter; - QMap m_userInters; - QString m_currentUserName; - QStringList m_onlineUsers; - UserModel *m_userModel; -}; - -} // namespace DCC_NAMESPACE - -#endif // ACCOUNTSWORKER_H diff --git a/dcc-old/src/plugin-accounts/operation/creationresult.cpp b/dcc-old/src/plugin-accounts/operation/creationresult.cpp deleted file mode 100644 index bb0f731cba..0000000000 --- a/dcc-old/src/plugin-accounts/operation/creationresult.cpp +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "creationresult.h" - - -using namespace DCC_NAMESPACE; - -CreationResult::CreationResult(QObject *parent) - : CreationResult(NoError, QString(""), parent) -{ - -} - -CreationResult::CreationResult(CreationResult::ResultType type, const QString &message, QObject *parent) - : QObject(parent) - , m_type(type) - , m_message(message) -{ - -} - -void CreationResult::setType(const ResultType &type) -{ - m_type = type; -} - -void CreationResult::setMessage(const QString &message) -{ - m_message = message; -} - diff --git a/dcc-old/src/plugin-accounts/operation/creationresult.h b/dcc-old/src/plugin-accounts/operation/creationresult.h deleted file mode 100644 index 1fe9419b7a..0000000000 --- a/dcc-old/src/plugin-accounts/operation/creationresult.h +++ /dev/null @@ -1,41 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_ACCOUNTSS_CREATIONRESULT_H -#define DCC_ACCOUNTSS_CREATIONRESULT_H - -#include "interface/namespace.h" - -#include - -namespace DCC_NAMESPACE { - -class CreationResult : public QObject -{ - Q_OBJECT -public: - enum ResultType { - UserNameError, // 用户名错误 - PasswordError, // 密码错误 - PasswordMatchError, // 两次输入的密码不匹配 - UnknownError, // 未知错误 - Canceled, // 用户取消认证或关闭认证窗口 - NoError - }; - - explicit CreationResult(QObject *parent = 0); - explicit CreationResult(ResultType type, const QString &message, QObject *parent = 0); - - inline ResultType type() const { return m_type; } - void setType(const ResultType &type); - - inline QString message() const { return m_message; } - void setMessage(const QString &message); - -private: - ResultType m_type; - QString m_message; -}; -} // namespace DCC_NAMESPACE - -#endif // DCC_ACCOUNTSS_CREATIONRESULT_H diff --git a/dcc-old/src/plugin-accounts/operation/qrc/accounts.qrc b/dcc-old/src/plugin-accounts/operation/qrc/accounts.qrc deleted file mode 100644 index fdf759fdc0..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/accounts.qrc +++ /dev/null @@ -1,23 +0,0 @@ - - - icons/dcc_nav_accounts_42px.svg - icons/dcc_nav_accounts_84px.svg - icons/dcc_avatar_12px.svg - - - icons/dcc_user_animal.dci - icons/dcc_user_custom.dci - icons/dcc_user_emoji.dci - icons/dcc_user_funny.dci - icons/dcc_user_human.dci - icons/dcc_user_add_icon.dci - icons/dcc_user_scenery.dci - - - icons/dcc_deepin_password_strength_high.svg - icons/dcc_deepin_password_strength_low.svg - icons/dcc_deepin_password_strength_middle.svg - icons/dcc_deepin_password_strength_unactive_deep_mode.svg - icons/dcc_deepin_password_strength_unactive_light_mode.svg - - diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_avatar_12px.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_avatar_12px.svg deleted file mode 100644 index 0c1039f946..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_avatar_12px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_high.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_high.svg deleted file mode 100644 index 13b3c805ca..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_high.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - 矩形 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_low.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_low.svg deleted file mode 100644 index 982b7b312f..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_low.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - 矩形 - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_middle.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_middle.svg deleted file mode 100644 index 1f5b4090db..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_middle.svg +++ /dev/null @@ -1,23 +0,0 @@ - - - 矩形 - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_deep_mode.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_deep_mode.svg deleted file mode 100644 index dc4f731316..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_deep_mode.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - 密码-未激活-浅色备份 - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_light_mode.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_light_mode.svg deleted file mode 100644 index 0eae280451..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_deepin_password_strength_unactive_light_mode.svg +++ /dev/null @@ -1,21 +0,0 @@ - - - 密码-未激活-浅色 - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_42px.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_42px.svg deleted file mode 100644 index 9c86bb720d..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_42px.svg +++ /dev/null @@ -1,150 +0,0 @@ - - - dcc_nav_accounts_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_84px.svg b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_84px.svg deleted file mode 100644 index b02881a3dd..0000000000 --- a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_nav_accounts_84px.svg +++ /dev/null @@ -1,178 +0,0 @@ - - - dcc_nav_accounts_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_add_icon.dci b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_add_icon.dci deleted file mode 100644 index e0c866a9c6af6aa7fd3ca479cee22991c9984959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7167 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 diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_custom.dci b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_custom.dci deleted file mode 100644 index 060c2919cce8af1457f05accde0c8fd117355b66..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 709 zcmZ>9_GDmWWME)2G-IFylrlkdGv(zMF^;}M7dPa%9u|CXfn5V(wBpDA;Yype_5TMl4A0WmsFv1)L z<&#RSfNBWxbaPt(WQV&t1%w4y_)G?}_4N;M3v3qzwpr1oZXqqTX~zWtg8GSzs8WqUhwaH1}pcSfzA)|*A$61-N>v+O>{hzADfn8 z;C{KS){2`Us3J#Cpp5aych=Opa^VXsUrY{*U1&(+lRv9_GDmWWME)2G-IFycrrtDGv(zMF^;}M7dPa%9u|CXfn5V(wBpDA;%)=;TTI}a{SL2ooBxZk+1I%Ax`c828=joVV^XiAD^6sc`@o`a z+k3By*sJ6~QFUFI+3?>MYAT~eU5aaGw7 zTZLJ%0ol(RS4kD}&v+Tz-5?T`FX@own0uNrBu)J4;c3DhC%45s*^yIu>f;|q`-lnm zTP*^G45ltnSE>mr(!Bfo)!a=5?-xHzdRH5|^66s4bRG8 zH$I!7a}%VL*|!uh|CYGqoZ)fqLs5=m{ll&&66WgtM~+?DFel~thsCbzlHW3)P3)hu q|NShZicM|cMg{=aPSJD# diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_funny.dci b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_funny.dci deleted file mode 100644 index 5f122085da64066a6446651ef23fb79f4957b16b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1211 zcmZ>9_GDmWWME)2G-IFyWV1kYGv(zMF^;}M7dPa%9u|CXfn5V(wBpDA;tj7$YDfRR-CWtwVFo%)h z7Lb;CP;-Jj-Q1=D+2O8E0bv0aKAk|ezWxDjf%Qul>)JKVAyC*z$%@r0er!8+?2+95 zThgn3cz!jO+qAhRF?m^L^DgsR)wrjP6P9JCtO@?#aAeotb+bMT&sq~UGfuJnP>58< zm(I0K*V&7b1D@`a6w}=CSEYJ^gyUguu9JUTx1S1qp_Db3W*9x|jp^=xmvwg8J%&=ToB-}yCMJw$ zB4k4kS31u;pu9RI%WtIA#<{6FK=@*;+lr?pPku_Xjo`ERok<52iu82UTmn%ZBHoiWdu893Lk zth#khpex*CUI}Z!kEyGU$0qDZoBK#KKVe>%_TFt5zWE5f+Fzq=zQ6W&*-7?{-)g_@ zgn4RbH*+&R@RV!3vhJ5;7BM)b|=`4gU4oOw3!$)|S(43bYa zG_07WuVP-D!gnsq!lh^_H$%|Lxk4@zivNns?_w;N6&rW^{pv3*Db`0AK5bYte|25M zZvKW`m7US5-;Pb|Jj=y7?^FBoCmi~RKTX__vtB_g9_GDmWWME)2G-IFyBr`*FGv(zMF^;}M7dPa%9u|CXfn5V(wBpDA;ti}YPDfRR{U_^odBg|nC zF3IFHs5wENZf<=*cDSokKv;luYZ7BAYMqY@3vdflNXzAoq4zO`%%`bQtb;b z{o8fFkN3#$Z-42Ci;~nxxVdfaHqPRmyv3&y)6%m488dmW|FCws_{Dnm zJY~(GO}e^=V-L&Q{9m~J>Ayc2&qK@%vO9mZawgd_3e04loMn6~uyjWE^;z$JO+8V1 zG1^yVMw8h>=ee4lR{nceG`h_-3f{8DFMjGitK!f#R_vjDA2Ra3=y-0KcKd?$()I{} zNv9XFS63~cQfaVNMaf9>iRSC4oxxueeofAA`_qvjtLJa>`NLiPeQc6?{9ixUO!}gz z6g7*Zk}tr0_BU}!?m+jBtE;Q$HhpLOVfXp=uN&T*MIBdO$+CI9#xj Sp-roDWZ4#M)~NiaEC>Mbd)x5< diff --git a/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_scenery.dci b/dcc-old/src/plugin-accounts/operation/qrc/icons/dcc_user_scenery.dci deleted file mode 100644 index c52f7838eedb8390911d1846c7584a9a96a4555e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1325 zcmZ>9_GDmWWME)2G-IFy++~62X3EPi%1zACOGzxsCda(hP)$t6h<*Wfe7lkoXqr$5`ANRh}keNgGEU+9;AE`Gei@mUXFsA!$_f*g`nmH zdAhlA0omcMP61&77CwKO7#Q^R4{!@iU%DVy`q-b$?bZTH0$Xx#Uzz*Qzg^L+(Se6? z#|al62MG_g0|$5-CvY?IIC#hjaR@WDs2n-WE-WZ9(MEuyQ&cGTwwY`ud+P0s+uL$M zsI1)3v-0nwz3=Z%@A=oz@z1~E-{gtD($1Pwe>1FmzBJ%rcEk2cP2qj)d-oQYPtuBR zNIl))ds5O&^KzJM^V>^h8SA&Do}VRo#QT=s8Slv@O!r)uzOc5)#fLE@J%GA^f%Yx z(0>vOwx0;Q!u}y|P1wQA?eiz7r`}{*M)W}&wpR68=tu2w$G2e zz;*N8W*%N(`)Jx#7GYh+cg@~h1>$@7*n=lGTy&gLdf-xm-T`CQUF<@One-rOYrf%k=#`O+&V=GSeNt_WO~ zGVRWxU*BKO7F+Xt)08KM{XFk)D^F=k=C6BaT4gUQu~Mb&QgQcUG0&Oo4-=NzEIzvP zrQ-BoX$|Z8r(c^cb&JtDW!k#^Up8_t*m>`M#2)MOykCr8#Him({_ETDWBoO`GdGmh zA2mEP?^=A}j0gEfF;fmTPrJi>BmXvkLH@}F8%hM#e$VFOPnG>86tRhyUtXOji6I{^Gg6Z$NJF6V7@5N}Ix+C(Gm?V&f0paw|&v$xg<+ zT{;cRZ1{6G=T1(K6V@r<+}nIQvHwxt;@vltYgq5K#+Wc$$ZUK$@uSDL6M_kCceXR1 zXTMPC^Ig?^*aXE?n3p@ofJ3{ladKzF)VWv9WYv w!jd-jw%^Tcs)YxxZ7*E#`Se`tc&o-Ax7RXH`7&qMstqcwt6vp;k!N850J`LmlK=n! diff --git a/dcc-old/src/plugin-accounts/operation/securitydbusproxy.cpp b/dcc-old/src/plugin-accounts/operation/securitydbusproxy.cpp deleted file mode 100644 index 358528b727..0000000000 --- a/dcc-old/src/plugin-accounts/operation/securitydbusproxy.cpp +++ /dev/null @@ -1,57 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "securitydbusproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include - -SecurityDBusProxy::SecurityDBusProxy(QObject *parent) - : QObject(parent) -{ - init(); -} - -QString SecurityDBusProxy::Status() -{ - QDBusPendingReply reply = m_dBusInter->asyncCall("Status"); - reply.waitForFinished(); - if (reply.isError()) { - m_lastError = reply.error().message(); - } else { - return reply.argumentAt<0>(); - } - return QString(); -} - -std::tuple SecurityDBusProxy::GetSEUserByName(const QString &user) -{ - Q_UNUSED(user) - std::tuple result; - QDBusPendingReply reply = m_dBusInter->asyncCall("GetSEUserByName"); - reply.waitForFinished(); - if (reply.isError()) { - m_lastError = reply.error().message(); - } else { - result = std::make_tuple(reply.argumentAt<0>(), reply.argumentAt<1>()); - } - return result; -} - -void SecurityDBusProxy::init() -{ - const QString &service = QStringLiteral("com.deepin.daemon.SecurityEnhance"); - const QString &path = QStringLiteral("/com/deepin/daemon/SecurityEnhance"); - const QString &interface = QStringLiteral("com.deepin.daemon.SecurityEnhance"); - - m_dBusInter = new DDBusInterface(service, path, interface, QDBusConnection::systemBus(), this); - - if (!m_dBusInter->isValid()) { - qWarning() << "Security interface invalid: " << m_dBusInter->lastError().message(); - return; - } -} - diff --git a/dcc-old/src/plugin-accounts/operation/securitydbusproxy.h b/dcc-old/src/plugin-accounts/operation/securitydbusproxy.h deleted file mode 100644 index 79ebb8d73b..0000000000 --- a/dcc-old/src/plugin-accounts/operation/securitydbusproxy.h +++ /dev/null @@ -1,33 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include -#include "interface/namespace.h" -#include - -using Dtk::Core::DDBusInterface; - -class QDBusMessage; - -class SecurityDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit SecurityDBusProxy(QObject *parent = nullptr); - - QString Status(); - std::tuple GetSEUserByName(const QString &user); - - inline QString lastError() { return m_lastError; } - -private: - void init(); - -private: - DDBusInterface *m_dBusInter; - QString m_lastError; -}; diff --git a/dcc-old/src/plugin-accounts/operation/syncdbusproxy.cpp b/dcc-old/src/plugin-accounts/operation/syncdbusproxy.cpp deleted file mode 100644 index ca6915d941..0000000000 --- a/dcc-old/src/plugin-accounts/operation/syncdbusproxy.cpp +++ /dev/null @@ -1,59 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "syncdbusproxy.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -SyncDBusProxy::SyncDBusProxy(QObject *parent) - : QObject(parent) -{ - init(); -} - -QString SyncDBusProxy::UOSID() -{ - QDBusReply retUOSID = m_dBusInter->call("UOSID"); - m_lastError = retUOSID.error().message(); - if (m_lastError.isEmpty()) { - return retUOSID.value(); - } else { - qWarning() << "UOSID failed:" << m_lastError; - return QString(); - } -} - -QString SyncDBusProxy::LocalBindCheck(const QString &uosid, const QString &uuid) -{ - QDBusReply retLocalBindCheck = m_dBusInter->call(QDBus::BlockWithGui, "LocalBindCheck", uosid, uuid); - m_lastError = retLocalBindCheck.error().message(); - if (m_lastError.isEmpty()) { - return retLocalBindCheck.value(); - } else { - qWarning() << "localBindCheck failed:" << m_lastError; - return QString(); - } -} - -void SyncDBusProxy::init() -{ - const QString &service = QStringLiteral("com.deepin.sync.Helper"); - const QString &path = QStringLiteral("/com/deepin/sync/Helper"); - const QString &interface = QStringLiteral("com.deepin.sync.Helper"); - - m_dBusInter = new QDBusInterface(service, path, interface, QDBusConnection::systemBus(), this); - - if (!m_dBusInter->isValid()) { - qWarning() << "syncHelper interface invalid: " << m_dBusInter->lastError().message(); - return; - } -} - diff --git a/dcc-old/src/plugin-accounts/operation/syncdbusproxy.h b/dcc-old/src/plugin-accounts/operation/syncdbusproxy.h deleted file mode 100644 index 7582356088..0000000000 --- a/dcc-old/src/plugin-accounts/operation/syncdbusproxy.h +++ /dev/null @@ -1,30 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include - -class QDBusInterface; -class QDBusMessage; - -class SyncDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit SyncDBusProxy(QObject *parent = nullptr); - - QString UOSID(); - QString LocalBindCheck(const QString &uosid, const QString &uuid); - - inline QString lastError() { return m_lastError; } - -private: - void init(); - -private: - QDBusInterface *m_dBusInter; - QString m_lastError; -}; diff --git a/dcc-old/src/plugin-accounts/operation/user.cpp b/dcc-old/src/plugin-accounts/operation/user.cpp deleted file mode 100644 index 1678c49e1d..0000000000 --- a/dcc-old/src/plugin-accounts/operation/user.cpp +++ /dev/null @@ -1,222 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "user.h" - -using namespace DCC_NAMESPACE; -User::User(QObject *parent) - : QObject(parent) - , m_isCurrentUser(false) - , m_autoLogin(false) - , m_online(false) - , m_nopasswdLogin(false) - , m_userType(UserType::StandardUser) - , m_createdTime(0) - , m_securityLever(SecurityLever::Standard) -{ -} - -const QString User::name() const -{ - return m_name; -} - -void User::setName(const QString &name) -{ - if (name != m_name) { - m_name = name; - - Q_EMIT nameChanged(m_name); - } -} - -void User::setFullname(const QString &fullname) -{ - if (fullname != m_fullname) { - m_fullname = fullname; - - Q_EMIT fullnameChanged(m_fullname); - } -} - -void User::setAutoLogin(const bool autoLogin) -{ - if (m_autoLogin == autoLogin) - return; - - m_autoLogin = autoLogin; - - Q_EMIT autoLoginChanged(m_autoLogin); -} - -void User::setAvatars(const QList &avatars) -{ - m_avatars = avatars; - - Q_EMIT avatarListChanged(m_avatars); -} - -void User::setGroups(const QStringList &groups) -{ - if (m_groups != groups) { - m_groups = groups; - Q_EMIT groupsChanged(m_groups); - } -} - -void User::setCurrentAvatar(const QString &avatar) -{ - if (m_currentAvatar != avatar) { - m_currentAvatar = avatar; - - Q_EMIT currentAvatarChanged(m_currentAvatar); - } -} - -void User::setPassword(const QString &password) -{ - m_password = password; -} - -void User::setRepeatPassword(const QString &repeatPassword) -{ - m_repeatPassword = repeatPassword; -} - -void User::setPasswordHint(const QString &passwordHint) -{ - m_passwordHint = passwordHint; -} - -void User::setOnline(bool online) -{ - if (m_online != online) { - m_online = online; - Q_EMIT onlineChanged(online); - } -} - -bool User::nopasswdLogin() const -{ - return m_nopasswdLogin; -} - -void User::setNopasswdLogin(bool nopasswdLogin) -{ - if (m_nopasswdLogin == nopasswdLogin) - return; - - m_nopasswdLogin = nopasswdLogin; - - Q_EMIT nopasswdLoginChanged(nopasswdLogin); -} - -const QString User::displayName() const -{ - return m_fullname.isEmpty() ? m_name : m_fullname; -} - -void User::setIsCurrentUser(bool isCurrentUser) -{ - if (isCurrentUser == m_isCurrentUser) - return; - - m_isCurrentUser = isCurrentUser; - - Q_EMIT isCurrentUserChanged(isCurrentUser); -} - -void User::setPasswordStatus(const QString& status) -{ - if (m_passwordStatus == status) { - return; - } - - m_passwordStatus = status; - - Q_EMIT passwordStatusChanged(status); -} - -void User::setCreatedTime(const quint64 & createdtime) -{ - if (m_createdTime == createdtime) { - return; - } - - m_createdTime = createdtime; - - Q_EMIT createdTimeChanged(createdtime); -} - -void User::setUserType(const int userType) -{ - if (m_userType == userType) { - return; - } - m_userType = userType; - Q_EMIT userTypeChanged(userType); -} - -void User::setIsPasswordExpired(bool isExpired) -{ - if (isExpired == m_isPasswordExpired) - return; - - m_isPasswordExpired = isExpired; - Q_EMIT isPasswordExpiredChanged(isExpired); -} - -void User::setPasswordAge(const int age) -{ - if (age == m_pwAge) - return; - - m_pwAge = age; - Q_EMIT passwordAgeChanged(age); -} - -int User::charactertypes(QString password) -{ - int Number_flag = 0; - int Capital_flag = 0; - int Small_flag = 0; - int Symbol_flag = 0; - QByteArray ba = password.toLatin1(); - const char *s = ba.data(); - - while (*s) { - if ('0' <= *s && '9' >= *s) { - Number_flag = 1 ; - } else if ('A' <= *s && 'Z' >= *s) { - Capital_flag = 1; - } else if ('a' <= *s && 'z' >= *s) { - Small_flag = 1; - } else { - Symbol_flag = 1; - } - s++; - } - return Number_flag + Capital_flag + Small_flag + Symbol_flag; -} - -void User::setGid(const QString &gid) -{ - if (m_gid == gid) - return; - - m_gid = gid; - Q_EMIT gidChanged(gid); -} - -SecurityLever User::securityLever() const -{ - return m_securityLever; -} - -void User::setSecurityLever(const SecurityLever &securityLever) -{ - m_securityLever = securityLever; -} - diff --git a/dcc-old/src/plugin-accounts/operation/user.h b/dcc-old/src/plugin-accounts/operation/user.h deleted file mode 100644 index e08187a70f..0000000000 --- a/dcc-old/src/plugin-accounts/operation/user.h +++ /dev/null @@ -1,149 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef USER_H -#define USER_H - -#include "interface/namespace.h" - -#include -#include -#include - -static const QString NO_PASSWORD { "NP" }; - -namespace DCC_NAMESPACE { - -enum SecurityLever { - Standard, - Sysadm, - Secadm, - Audadm, - Auditadm -}; - -class User : public QObject -{ - Q_OBJECT - -public: - enum UserType { - StandardUser = 0, - Administrator, - Customized - }; - - explicit User(QObject *parent = nullptr); - - Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged) - Q_PROPERTY(QString fullname READ fullname WRITE setFullname NOTIFY fullnameChanged) - - const QString name() const; - void setName(const QString &name); - - const QString fullname() const { return m_fullname; } - void setFullname(const QString &fullname); - - inline bool autoLogin() const { return m_autoLogin; } - void setAutoLogin(const bool autoLogin); - - inline const QList &avatars() const { return m_avatars; } - void setAvatars(const QList &avatars); - - inline const QStringList &groups() const { return m_groups; } - void setGroups(const QStringList &groups); - - inline const QString currentAvatar() const { return m_currentAvatar; } - void setCurrentAvatar(const QString &avatar); - - inline QString password() const { return m_password; } - void setPassword(const QString &password); - - inline QString repeatPassword() const { return m_repeatPassword; } - void setRepeatPassword(const QString &repeatPassword); - - inline QString passwordHint() const { return m_passwordHint; } - void setPasswordHint(const QString &passwordHint); - - inline bool online() const { return m_online; } - void setOnline(bool online); - - bool nopasswdLogin() const; - void setNopasswdLogin(bool nopasswdLogin); - - const QString displayName() const; - - inline bool isCurrentUser() const { return m_isCurrentUser; } - void setIsCurrentUser(bool isCurrentUser); - - inline QString passwordStatus() const { return m_passwordStatus; } - void setPasswordStatus(const QString& status); - - inline quint64 createdTime() const { return m_createdTime; } - void setCreatedTime(const quint64 & createdtime); - - inline int userType() const { return m_userType; } - void setUserType(const int userType); - inline bool isPasswordExpired() const { return m_isPasswordExpired; } - void setIsPasswordExpired(bool isExpired); - - inline int passwordAge() const { return m_pwAge; } - void setPasswordAge(const int age); - - int charactertypes(QString password); - - inline QString gid() const { return m_gid; } - void setGid(const QString &gid); - - SecurityLever securityLever() const; - void setSecurityLever(const SecurityLever &securityLever); - -Q_SIGNALS: - void passwordModifyFinished(const int exitCode, const QString &errorTxt) const; - void nameChanged(const QString &name) const; - void fullnameChanged(const QString &name) const; - void currentAvatarChanged(const QString &avatar) const; - void autoLoginChanged(const bool autoLogin) const; - void avatarListChanged(const QList &avatars) const; - void groupsChanged(const QStringList &groups) const; - void onlineChanged(const bool &online) const; - void nopasswdLoginChanged(const bool nopasswdLogin) const; - void isCurrentUserChanged(bool isCurrentUser); - void passwordStatusChanged(const QString& password) const; - void createdTimeChanged(const quint64 & createtime); - void userTypeChanged(const int userType); - void isPasswordExpiredChanged(const bool isExpired) const; - void passwordAgeChanged(const int age) const; - void gidChanged(const QString &gid); - void passwordResetFinished(const QString &errorText) const; - void startResetPasswordReplied(const QString &errorText); - void setSecurityQuestionsReplied(const QString &errorText); - void startSecurityQuestionsCheckReplied(const QList &questios); - -private: - bool m_isCurrentUser; - bool m_autoLogin; - bool m_online; - bool m_nopasswdLogin; - int m_userType; - bool m_isPasswordExpired{false}; - int m_pwAge{-1}; - QString m_name; - QString m_fullname; - QString m_password; - QString m_repeatPassword; - QString m_currentAvatar; - QString m_passwordStatus; // NP: no password, P have a password, L user is locked - QList m_avatars; - QStringList m_groups; - quint64 m_createdTime; - QString m_gid; - QString m_passwordHint; - SecurityLever m_securityLever; - - - Q_ENUM(SecurityLever); -}; -} // namespace DCC_NAMESPACE - -#endif // USER_H diff --git a/dcc-old/src/plugin-accounts/operation/userdbusproxy.cpp b/dcc-old/src/plugin-accounts/operation/userdbusproxy.cpp deleted file mode 100644 index 62c263d5fc..0000000000 --- a/dcc-old/src/plugin-accounts/operation/userdbusproxy.cpp +++ /dev/null @@ -1,314 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "userdbusproxy.h" - -#include -#include -#include -#include -#include -#include - -UserDBusProxy::UserDBusProxy(QString accountsUserPath, QObject *parent) - : QObject(parent) - , m_accountsUserPath(accountsUserPath) -{ - init(); -} - -void UserDBusProxy::init() -{ - const QString AccountsUserService = "org.deepin.dde.Accounts1"; - const QString AccountsUserInterface = "org.deepin.dde.Accounts1.User"; - const QString PropertiesInterface = "org.freedesktop.DBus.Properties"; - const QString PropertiesChanged = "PropertiesChanged"; - - m_dBusAccountsUserInter = new QDBusInterface(AccountsUserService, m_accountsUserPath, AccountsUserInterface, QDBusConnection::systemBus(), this); - QDBusConnection dbusConnection = m_dBusAccountsUserInter->connection(); - dbusConnection.connect(AccountsUserService, m_accountsUserPath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); -} - -//users -QDBusPendingReply<> UserDBusProxy::AddGroup(const QString &group) -{ - QList argumentList; - argumentList << QVariant::fromValue(group); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("AddGroup"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::DeleteGroup(const QString &group) -{ - QList argumentList; - argumentList << QVariant::fromValue(group); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("DeleteGroup"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::DeleteIconFile(const QString &iconFile) -{ - QList argumentList; - argumentList << QVariant::fromValue(iconFile); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("DeleteIconFile"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::EnableNoPasswdLogin(bool enabled) -{ - QList argumentList; - argumentList << QVariant::fromValue(enabled); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("EnableNoPasswdLogin"), argumentList); -} -QDBusPendingReply UserDBusProxy::IsPasswordExpired() -{ - QList argumentList; - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("IsPasswordExpired"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetAutomaticLogin(bool enabled) -{ - QList argumentList; - argumentList << QVariant::fromValue(enabled); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetAutomaticLogin"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetDesktopBackgrounds(const QStringList &backgrounds) -{ - QList argumentList; - argumentList << QVariant::fromValue(backgrounds); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetDesktopBackgrounds"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetFullName(const QString &name) -{ - qInfo() << "m_accountsUserPath" << m_accountsUserPath; - QList argumentList; - argumentList << QVariant::fromValue(name); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetFullName"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetGreeterBackground(const QString &background) -{ - QList argumentList; - argumentList << QVariant::fromValue(background); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetGreeterBackground"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetGroups(const QStringList &groups) -{ - QList argumentList; - argumentList << QVariant::fromValue(groups); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetGroups"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetHistoryLayout(const QStringList &layouts) -{ - QList argumentList; - argumentList << QVariant::fromValue(layouts); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetHistoryLayout"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetHomeDir(const QString &home) -{ - QList argumentList; - argumentList << QVariant::fromValue(home); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetHomeDir"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetIconFile(const QString &iconFile) -{ - QList argumentList; - argumentList << QVariant::fromValue(iconFile); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetIconFile"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetLayout(const QString &layout) -{ - QList argumentList; - argumentList << QVariant::fromValue(layout); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetLayout"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetLocale(const QString &locale) -{ - QList argumentList; - argumentList << QVariant::fromValue(locale); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetLocale"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetLocked(bool locked) -{ - QList argumentList; - argumentList << QVariant::fromValue(locked); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetLocked"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetMaxPasswordAge(int nDays) -{ - QList argumentList; - argumentList << QVariant::fromValue(nDays); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetMaxPasswordAge"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetPassword(const QString &password) -{ - QList argumentList; - argumentList << QVariant::fromValue(password); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetPassword"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetPasswordHint(const QString &hint) -{ - QList argumentList; - argumentList << QVariant::fromValue(hint); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetPasswordHint"), argumentList); -} -QDBusPendingReply<> UserDBusProxy::SetShell(const QString &shell) -{ - QList argumentList; - argumentList << QVariant::fromValue(shell); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetShell"), argumentList); -} - -QDBusPendingReply> UserDBusProxy::GetSecretQuestions() -{ - //获取安全问题需要使用同步调用 - return m_dBusAccountsUserInter->call(QStringLiteral("GetSecretQuestions")); -} - -QDBusPendingReply<> UserDBusProxy::SetSecretQuestions(const QMap &securityQuestions) -{ - QList argumentList; - argumentList << QVariant::fromValue(securityQuestions); - return m_dBusAccountsUserInter->asyncCallWithArgumentList(QStringLiteral("SetSecretQuestions"), argumentList); -} - -//获取属性值 -int UserDBusProxy::accountType() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("AccountType")); -} -bool UserDBusProxy::automaticLogin() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("AutomaticLogin")); -} -qulonglong UserDBusProxy::createdTime() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("CreatedTime")); -} -QStringList UserDBusProxy::desktopBackgrounds() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("DesktopBackgrounds")); -} -QString UserDBusProxy::fullName() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("FullName")); -} -QString UserDBusProxy::gid() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Gid")); -} -QString UserDBusProxy::greeterBackground() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("GreeterBackground")); -} -QStringList UserDBusProxy::groups() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Groups")); -} -QStringList UserDBusProxy::historyLayout() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("HistoryLayout")); -} -QString UserDBusProxy::homeDir() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("HomeDir")); -} -QString UserDBusProxy::iconFile() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("IconFile")); -} -QStringList UserDBusProxy::iconList() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("IconList")); -} -QString UserDBusProxy::layout() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Layout")); -} -QString UserDBusProxy::locale() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Locale")); -} -bool UserDBusProxy::locked() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Locked")); -} -qulonglong UserDBusProxy::loginTime() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("LoginTime")); -} -int UserDBusProxy::longDateFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("LongDateFormat")); -} -int UserDBusProxy::longTimeFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("LongTimeFormat")); -} -int UserDBusProxy::maxPasswordAge() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("MaxPasswordAge")); -} -bool UserDBusProxy::noPasswdLogin() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("NoPasswdLogin")); -} -QString UserDBusProxy::passwordHint() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("PasswordHint")); -} -int UserDBusProxy::passwordLastChange() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("PasswordLastChange")); -} -QString UserDBusProxy::passwordStatus() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("PasswordStatus")); -} -QString UserDBusProxy::shell() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Shell")); -} -int UserDBusProxy::shortDateFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("ShortDateFormat")); -} -int UserDBusProxy::shortTimeFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("ShortTimeFormat")); -} -bool UserDBusProxy::systemAccount() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("SystemAccount")); -} -QString UserDBusProxy::uid() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Uid")); -} - -QString UserDBusProxy::uuid() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("UUID")); -} - -bool UserDBusProxy::use24HourFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("Use24HourFormat")); -} -QString UserDBusProxy::userName() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("UserName")); -} -int UserDBusProxy::weekBegins() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("WeekBegins")); -} -int UserDBusProxy::weekdayFormat() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("WeekdayFormat")); -} -QString UserDBusProxy::xSession() -{ - return qvariant_cast(m_dBusAccountsUserInter->property("XSession")); -} - -void UserDBusProxy::onPropertiesChanged(const QDBusMessage &message) -{ - QVariantMap changedProps = qdbus_cast(message.arguments().at(1).value()); - for (QVariantMap::const_iterator it = changedProps.begin(); it != changedProps.end(); ++it) { - QMetaObject::invokeMethod(this, it.key().toLatin1() + "Changed", Qt::DirectConnection, QGenericArgument(it.value().typeName(), it.value().data())); - } -} diff --git a/dcc-old/src/plugin-accounts/operation/userdbusproxy.h b/dcc-old/src/plugin-accounts/operation/userdbusproxy.h deleted file mode 100644 index 129fcb44cd..0000000000 --- a/dcc-old/src/plugin-accounts/operation/userdbusproxy.h +++ /dev/null @@ -1,198 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef USERDBUSPROXY_H -#define USERDBUSPROXY_H - -#include -#include - -class QDBusInterface; -class QDBusMessage; - -class UserDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit UserDBusProxy(QString accountsUserPath, QObject *parent = nullptr); - - Q_PROPERTY(int AccountType READ accountType NOTIFY AccountTypeChanged) - int accountType(); - - Q_PROPERTY(bool AutomaticLogin READ automaticLogin NOTIFY AutomaticLoginChanged) - bool automaticLogin(); - - Q_PROPERTY(qulonglong CreatedTime READ createdTime NOTIFY CreatedTimeChanged) - qulonglong createdTime(); - - Q_PROPERTY(QStringList DesktopBackgrounds READ desktopBackgrounds NOTIFY DesktopBackgroundsChanged) - QStringList desktopBackgrounds(); - - Q_PROPERTY(QString FullName READ fullName NOTIFY FullNameChanged) - QString fullName(); - - Q_PROPERTY(QString Gid READ gid NOTIFY GidChanged) - QString gid(); - - Q_PROPERTY(QString GreeterBackground READ greeterBackground NOTIFY GreeterBackgroundChanged) - QString greeterBackground(); - - Q_PROPERTY(QStringList Groups READ groups NOTIFY GroupsChanged) - QStringList groups(); - - Q_PROPERTY(QStringList HistoryLayout READ historyLayout NOTIFY HistoryLayoutChanged) - QStringList historyLayout(); - - Q_PROPERTY(QString HomeDir READ homeDir NOTIFY HomeDirChanged) - QString homeDir(); - - Q_PROPERTY(QString IconFile READ iconFile NOTIFY IconFileChanged) - QString iconFile(); - - Q_PROPERTY(QStringList IconList READ iconList NOTIFY IconListChanged) - QStringList iconList(); - - Q_PROPERTY(QString Layout READ layout NOTIFY LayoutChanged) - QString layout(); - - Q_PROPERTY(QString Locale READ locale NOTIFY LocaleChanged) - QString locale(); - - Q_PROPERTY(bool Locked READ locked NOTIFY LockedChanged) - bool locked(); - - Q_PROPERTY(qulonglong LoginTime READ loginTime NOTIFY LoginTimeChanged) - qulonglong loginTime(); - - Q_PROPERTY(int LongDateFormat READ longDateFormat NOTIFY LongDateFormatChanged) - int longDateFormat(); - - Q_PROPERTY(int LongTimeFormat READ longTimeFormat NOTIFY LongTimeFormatChanged) - int longTimeFormat(); - - Q_PROPERTY(int MaxPasswordAge READ maxPasswordAge NOTIFY MaxPasswordAgeChanged) - int maxPasswordAge(); - - Q_PROPERTY(bool NoPasswdLogin READ noPasswdLogin NOTIFY NoPasswdLoginChanged) - bool noPasswdLogin(); - - Q_PROPERTY(QString PasswordHint READ passwordHint NOTIFY PasswordHintChanged) - QString passwordHint(); - - Q_PROPERTY(int PasswordLastChange READ passwordLastChange NOTIFY PasswordLastChangeChanged) - int passwordLastChange(); - - Q_PROPERTY(QString PasswordStatus READ passwordStatus NOTIFY PasswordStatusChanged) - QString passwordStatus(); - - Q_PROPERTY(QString Shell READ shell NOTIFY ShellChanged) - QString shell(); - - Q_PROPERTY(int ShortDateFormat READ shortDateFormat NOTIFY ShortDateFormatChanged) - int shortDateFormat(); - - Q_PROPERTY(int ShortTimeFormat READ shortTimeFormat NOTIFY ShortTimeFormatChanged) - int shortTimeFormat(); - - Q_PROPERTY(bool SystemAccount READ systemAccount NOTIFY SystemAccountChanged) - bool systemAccount(); - - Q_PROPERTY(QString Uid READ uid NOTIFY UidChanged) - QString uid(); - - Q_PROPERTY(QString UUID READ uuid NOTIFY UUIDChanged) - QString uuid(); - - Q_PROPERTY(bool Use24HourFormat READ use24HourFormat NOTIFY Use24HourFormatChanged) - bool use24HourFormat(); - - Q_PROPERTY(QString UserName READ userName NOTIFY UserNameChanged) - QString userName(); - - Q_PROPERTY(int WeekBegins READ weekBegins NOTIFY WeekBeginsChanged) - int weekBegins(); - - Q_PROPERTY(int WeekdayFormat READ weekdayFormat NOTIFY WeekdayFormatChanged) - int weekdayFormat(); - - Q_PROPERTY(QString XSession READ xSession NOTIFY XSessionChanged) - QString xSession(); - - inline QString path() { return m_accountsUserPath; } - inline const QDBusInterface* interface() { return m_dBusAccountsUserInter; } - - - -signals: - // begin property changed signals - void AccountTypeChanged(int value) const; - void AutomaticLoginChanged(bool value) const; - void CreatedTimeChanged(qulonglong value) const; - void DesktopBackgroundsChanged(const QStringList & value) const; - void FullNameChanged(const QString & value) const; - void GidChanged(const QString & value) const; - void GreeterBackgroundChanged(const QString & value) const; - void GroupsChanged(const QStringList & value) const; - void HistoryLayoutChanged(const QStringList & value) const; - void HomeDirChanged(const QString & value) const; - void IconFileChanged(const QString & value) const; - void IconListChanged(const QStringList & value) const; - void LayoutChanged(const QString & value) const; - void LocaleChanged(const QString & value) const; - void LockedChanged(bool value) const; - void LoginTimeChanged(qulonglong value) const; - void LongDateFormatChanged(int value) const; - void LongTimeFormatChanged(int value) const; - void MaxPasswordAgeChanged(int value) const; - void NoPasswdLoginChanged(bool value) const; - void PasswordHintChanged(const QString & value) const; - void PasswordLastChangeChanged(int value) const; - void PasswordStatusChanged(const QString & value) const; - void ShellChanged(const QString & value) const; - void ShortDateFormatChanged(int value) const; - void ShortTimeFormatChanged(int value) const; - void SystemAccountChanged(bool value) const; - void UidChanged(const QString & value) const; - void UUIDChanged(const QString & value) const; - void Use24HourFormatChanged(bool value) const; - void UserNameChanged(const QString & value) const; - void WeekBeginsChanged(int value) const; - void WeekdayFormatChanged(int value) const; - void XSessionChanged(const QString & value) const; - -public slots: - QDBusPendingReply<> AddGroup(const QString &group); - QDBusPendingReply<> DeleteGroup(const QString &group); - QDBusPendingReply<> DeleteIconFile(const QString &iconFile); - QDBusPendingReply<> EnableNoPasswdLogin(bool enabled); - QDBusPendingReply IsPasswordExpired(); - QDBusPendingReply<> SetAutomaticLogin(bool enabled); - QDBusPendingReply<> SetDesktopBackgrounds(const QStringList &backgrounds); - QDBusPendingReply<> SetFullName(const QString &name); - QDBusPendingReply<> SetGreeterBackground(const QString &background); - QDBusPendingReply<> SetGroups(const QStringList &groups); - QDBusPendingReply<> SetHistoryLayout(const QStringList &layouts); - QDBusPendingReply<> SetHomeDir(const QString &home); - QDBusPendingReply<> SetIconFile(const QString &iconFile); - QDBusPendingReply<> SetLayout(const QString &layout); - QDBusPendingReply<> SetLocale(const QString &locale); - QDBusPendingReply<> SetLocked(bool locked); - QDBusPendingReply<> SetMaxPasswordAge(int nDays); - QDBusPendingReply<> SetPassword(const QString &password); - QDBusPendingReply<> SetPasswordHint(const QString &hint); - QDBusPendingReply<> SetShell(const QString &shell); - QDBusPendingReply> GetSecretQuestions(); - QDBusPendingReply<> SetSecretQuestions(const QMap &securityQuestions); - -private slots: - void onPropertiesChanged(const QDBusMessage &message); -private: - void init(); - -private: - QDBusInterface *m_dBusAccountsUserInter; - QString m_accountsUserPath; -}; - -#endif // USERDBUSPROXY_H diff --git a/dcc-old/src/plugin-accounts/operation/usermodel.cpp b/dcc-old/src/plugin-accounts/operation/usermodel.cpp deleted file mode 100644 index eb12c645b3..0000000000 --- a/dcc-old/src/plugin-accounts/operation/usermodel.cpp +++ /dev/null @@ -1,162 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "usermodel.h" - -#include - -using namespace DCC_NAMESPACE; - -UserModel::UserModel(QObject *parent) - : QObject(parent) - , m_autoLoginVisable(true) - , m_noPassWordLoginVisable(true) - , m_bCreateUserValid(false) - , m_isJoinADDomain(false) - , m_isADUserLogind(false) - , m_isSecurityHighLever(false) -{ - -} - -UserModel::~UserModel() -{ - qDeleteAll(m_userList.values()); -} - -User * UserModel::getUser(const QString &id) -{ - return m_userList.value(id, nullptr); -} - -QList UserModel::userList() const -{ - for(auto user : m_userList) { - if (m_onlineUsers.contains(user->name())) - user->setOnline(true); - else - user->setOnline(false); - } - return m_userList.values(); -} - -void UserModel::addUser(const QString &id, User *user) -{ - Q_ASSERT(!m_userList.contains(id)); - - m_userList[id] = user; - - Q_EMIT userAdded(user); -} - -void UserModel::removeUser(const QString &id) -{ - Q_ASSERT(m_userList.contains(id)); - - User *user = m_userList[id]; - m_userList.remove(id); - - Q_EMIT userRemoved(user); -} - -bool UserModel::contains(const QString &id) -{ - return m_userList.contains(id); -} - -void UserModel::setAutoLoginVisable(const bool visable) -{ - if (m_autoLoginVisable == visable) - return; - - m_autoLoginVisable = visable; - Q_EMIT autoLoginVisableChanged(m_autoLoginVisable); -} - -void UserModel::setCreateUserValid(bool bValid) -{ - if (m_bCreateUserValid == bValid) - return; - - m_bCreateUserValid = bValid; -} - -void UserModel::setNoPassWordLoginVisable(const bool visable) -{ - if (m_noPassWordLoginVisable == visable) - return; - - m_noPassWordLoginVisable = visable; - Q_EMIT noPassWordLoginVisableChanged(m_noPassWordLoginVisable); -} - -QStringList UserModel::getAllGroups() -{ - return m_allGroups; -} - -void UserModel::setPresetGroups(const QStringList &presetGroups) -{ - m_presetGroups = presetGroups; -} - -void UserModel::setAllGroups(const QStringList &groups) -{ - if (m_allGroups == groups) { - return; - } - m_allGroups = groups; - Q_EMIT allGroupsChange(groups); -} - -QStringList UserModel::getPresetGroups() -{ - return m_presetGroups; -} - -QString UserModel::getCurrentUserName() const -{ - return m_currentUserName; -} - -void UserModel::setCurrentUserName(const QString ¤tUserName) -{ - m_currentUserName = currentUserName; -} - -bool UserModel::getIsSecurityHighLever() const -{ - return m_isSecurityHighLever; -} - -void UserModel::setIsSecurityHighLever(bool isSecurityHighLever) -{ - m_isSecurityHighLever = isSecurityHighLever; -} - -void UserModel::SetOnlineUsers(QStringList onlineUsers) -{ - m_onlineUsers = onlineUsers; -} - -void UserModel::setIsJoinADDomain(bool isJoinADDomain) -{ - if (m_isJoinADDomain == isJoinADDomain) - return; - - m_isJoinADDomain = isJoinADDomain; - - Q_EMIT isJoinADDomainChanged(isJoinADDomain); -} - -void UserModel::setADUserLogind(bool isADUserLogind) -{ - if (m_isADUserLogind == isADUserLogind) { - return; - } - - m_isADUserLogind = isADUserLogind; - - Q_EMIT isADUserLoginChanged(isADUserLogind); -} diff --git a/dcc-old/src/plugin-accounts/operation/usermodel.h b/dcc-old/src/plugin-accounts/operation/usermodel.h deleted file mode 100644 index 17bfe813b2..0000000000 --- a/dcc-old/src/plugin-accounts/operation/usermodel.h +++ /dev/null @@ -1,87 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef USERMODEL_H -#define USERMODEL_H - -#include "interface/namespace.h" - -#include -#include - -#include "user.h" - -namespace DCC_NAMESPACE { - -class UserModel : public QObject -{ - Q_OBJECT -public: - explicit UserModel(QObject *parent = nullptr); - ~UserModel(); - - User *getUser(const QString &id); - QList userList() const; - void addUser(const QString &id, User *user); - void removeUser(const QString &id); - bool contains(const QString &id); - - inline bool isAutoLoginVisable() const { return m_autoLoginVisable; } - void setAutoLoginVisable(const bool visable); - - inline bool isCreateUserValid() const { return m_bCreateUserValid; } - void setCreateUserValid(bool bValid); - - inline bool isNoPassWordLoginVisable() const { return m_noPassWordLoginVisable; } - void setNoPassWordLoginVisable(const bool visable); - bool isJoinADDomain() const { return m_isJoinADDomain; } - void setIsJoinADDomain(bool isJoinADDomain); - - bool isADUserLogind() const { return m_isADUserLogind; } - void setADUserLogind(bool isADUserLogind); - void setAllGroups(const QStringList &groups); - QStringList getAllGroups(); - void setPresetGroups(const QStringList &presetGroups); - QStringList getPresetGroups(); - QString getCurrentUserName() const; - void setCurrentUserName(const QString ¤tUserName); - - bool getIsSecurityHighLever() const; - void setIsSecurityHighLever(bool isSecurityHighLever); - - inline QStringList getOnlineUsers() { return m_onlineUsers; } - void SetOnlineUsers(QStringList onlineUsers); - - enum ActionOption { - ClickCancel = 0, - CreateUserSuccess, - ModifyPwdSuccess - }; - -Q_SIGNALS: - void userAdded(User *user); - void userRemoved(User *user); - void isJoinADDomainChanged(bool isjoin); - void isADUserLoginChanged(bool isLogind); - void allGroupsChange(const QStringList &groups); - void deleteUserSuccess(); - void autoLoginVisableChanged(bool autoLogin); - void noPassWordLoginVisableChanged(bool noPassword); - void isCancelChanged(); - void adminCntChange(const int adminCnt); -private: - bool m_autoLoginVisable; - bool m_noPassWordLoginVisable; - bool m_bCreateUserValid; - QMap m_userList; - QStringList m_allGroups; - QStringList m_presetGroups; - QString m_currentUserName; - bool m_isJoinADDomain; - bool m_isADUserLogind; - bool m_isSecurityHighLever; - QStringList m_onlineUsers; -}; -} // namespace DCC_NAMESPACE - -#endif // USERMODEL_H diff --git a/dcc-old/src/plugin-accounts/window/AccountsPlugin.json b/dcc-old/src/plugin-accounts/window/AccountsPlugin.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-accounts/window/AccountsPlugin.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-accounts/window/accountslistview.cpp b/dcc-old/src/plugin-accounts/window/accountslistview.cpp deleted file mode 100644 index f008ce9efb..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountslistview.cpp +++ /dev/null @@ -1,502 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "accountslistview.h" - -#include -#include -#include -#include -#include - -#include - -class AccountsListViewPrivate -{ -public: - explicit AccountsListViewPrivate(AccountsListView *parent) - : q_ptr(parent) - , m_spacing(20) - , m_gridSize(64, 64) - , m_itemSize(m_gridSize) - , m_maxColumnCount(1) - , m_maxRowCount(1) - , m_xOffset(0) - , m_yOffset(0) - , m_alignment(Qt::AlignHCenter) - , m_firstHeightDiff(0) - { - setGridSize(m_gridSize); - } - - void setSpacing(int space) - { - m_spacing = space; - } - int spacing() const - { - return m_spacing; - } - - void setGridSize(const QSize &size) - { - m_gridSize = size; - m_firstHeightDiff = 0; - } - QSize gridSize() const - { - return m_gridSize; - } - - void setAlignment(Qt::Alignment alignment) - { - m_alignment = alignment; - } - Qt::Alignment alignment() const - { - return m_alignment; - } - - void updateGeometries() - { - Q_Q(AccountsListView); - m_maxColumnCount = 1; - - int count = q->model() ? q->model()->rowCount() : 0; - m_maxRowCount = (count <= m_maxColumnCount) ? 1 : count; - - m_itemSize = m_gridSize; - int itemWidth = m_maxRowCount * (m_itemSize.width() + m_spacing) - m_spacing; - int itemHeight = m_maxColumnCount * (m_itemSize.height() + m_spacing) - m_spacing; - - if (itemWidth > q->viewport()->width()) { - m_xOffset = 0; - } else if (m_alignment & Qt::AlignRight) { - m_xOffset = q->viewport()->width() - itemWidth; - } else if (m_alignment & Qt::AlignHCenter) { - m_xOffset = (q->viewport()->width() - itemWidth) / 2; - } else { - m_xOffset = 0; - } - if (itemHeight > q->viewport()->height()) { - m_yOffset = 0; - } else if (m_alignment & Qt::AlignBottom) { - m_yOffset = q->viewport()->height() - itemHeight; - } else if (m_alignment & Qt::AlignVCenter) { - m_yOffset = (q->viewport()->height() - itemHeight) / 2; - } else { - m_yOffset = 0; - } - } - // item在窗口中位置(无滚动) - QRect rectForIndex(const QModelIndex &index) const - { - Q_Q(const AccountsListView); - QRect rect(0, 0, m_itemSize.width(), m_itemSize.height()); - // if (index.row() == 0 && m_viewMode == AccountsListView::IconMode) { - // rect.setHeight(m_itemSize.height() * 2 + m_spacing); - // } else if (index.row() == 0 && m_viewMode == AccountsListView::ListMode) { - // rect.setHeight(m_itemSize.height() + m_firstHeightDiff); - // } else { - int indexRow = index.row(); - // if (m_viewMode == AccountsListView::IconMode && indexRow >= m_maxColumnCount) - // indexRow++; - // int row = indexRow / m_maxColumnCount; - // int col = indexRow % m_maxColumnCount; - rect.translate((m_itemSize.width() + m_spacing) * indexRow, (m_spacing)); - // if (m_viewMode == AccountsListView::ListMode && indexRow >= 1) - // rect.translate(0, m_firstHeightDiff); - // } - return rect.translated(q->contentsMargins().left() + m_xOffset, q->contentsMargins().top() + m_yOffset); - } - // item在窗口中位置(无滚动) - QModelIndex indexAt(const QPoint &p) const - { - if ((m_itemSize.height() + m_spacing) <= 0 || (m_itemSize.width() + m_spacing) <= 0) - return QModelIndex(); - Q_Q(const AccountsListView); - QRect rect(p.x() - m_xOffset, p.y() - m_yOffset, 1, 1); - // int row = (rect.y() - m_firstHeightDiff) / (m_itemSize.height() + m_spacing); - int col = (rect.x()) / (m_itemSize.width() + m_spacing); - - QModelIndex index = q->model()->index(col, 0); - if (index.isValid() && rectForIndex(index).contains(p)) - return index; - return QModelIndex(); - } - QVector intersectingSet(const QRect &area) const - { - Q_Q(const AccountsListView); - QVector indexs; - int rows = q->model()->rowCount(); - for (int row = 0; row < rows; row++) { - QModelIndex index = q->model()->index(row, 0); - QRect rectIndex = rectForIndex(index); - if (!rectIndex.intersected(area).isEmpty()) { - indexs.append(index); - } - } - return indexs; - } - inline int marginsWidth() const - { - Q_Q(const AccountsListView); - return q->contentsMargins().left() + q->contentsMargins().right(); - } - inline int marginsHidget() const - { - Q_Q(const AccountsListView); - return q->contentsMargins().top() + q->contentsMargins().bottom(); - } - -private: - AccountsListView *const q_ptr; - Q_DECLARE_PUBLIC(AccountsListView) - int m_spacing; - QSize m_gridSize; - - QSize m_itemSize; - int m_maxColumnCount; // 一行可容纳的最大列数 - int m_maxRowCount; // 换算显示所有item所需行数 - int m_xOffset; // x轴偏移 - int m_yOffset; // y轴偏移 - QModelIndex m_hover; // hover项 - Qt::Alignment m_alignment; // 对齐方式 - int m_firstHeightDiff; // 第一行与其他行高差值 -}; - -///////////////////////////////////////// - -AccountsListView::AccountsListView(QWidget *parent) - : QAbstractItemView(parent) - , DCC_INIT_PRIVATE(AccountsListView) -{ - setSelectionMode(SingleSelection); - setAttribute(Qt::WA_MacShowFocusRect); - scheduleDelayedItemsLayout(); - setMouseTracking(true); -} - -AccountsListView::~AccountsListView() -{ -} - -void AccountsListView::setModel(QAbstractItemModel *model) -{ - setVisible(model->rowCount() >= 2); - QAbstractItemView::setModel(model); -} - -///////////////////////////////////////////////////////////////////////////// -// item在窗口中位置(加滚动偏移) -QRect AccountsListView::visualRect(const QModelIndex &index) const -{ - Q_D(const AccountsListView); - return d->rectForIndex(index).translated(-horizontalOffset(), -verticalOffset()); -} - -void AccountsListView::scrollTo(const QModelIndex &index, ScrollHint hint) -{ - if (!index.isValid()) - return; - - const QRect rect = visualRect(index); - if (hint == EnsureVisible && viewport()->rect().contains(rect)) { - viewport()->update(rect); - return; - } - - const QRect area = viewport()->rect(); - const bool above = (hint == EnsureVisible && rect.left() < area.left()); - const bool below = (hint == EnsureVisible && rect.right() > area.right()); - - Q_D(const AccountsListView); - int horizontalValue = horizontalScrollBar()->value(); - QRect adjusted = rect.adjusted(-d->spacing(), -d->spacing(), d->spacing(), d->spacing()); - if (hint == PositionAtTop || above) - horizontalValue += adjusted.left(); - else if (hint == PositionAtBottom || below) - horizontalValue += qMin(adjusted.left(), adjusted.right() - area.width() + 1); - else if (hint == PositionAtCenter) - horizontalValue += adjusted.left() - ((area.width() - adjusted.width()) / 2); - horizontalScrollBar()->setValue(horizontalValue); -} - -QModelIndex AccountsListView::indexAt(const QPoint &p) const -{ - Q_D(const AccountsListView); - return d->indexAt(p + QPoint(horizontalOffset(), verticalOffset())); -} - -QModelIndex AccountsListView::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers /*modifiers*/) -{ - Q_D(const AccountsListView); - QModelIndex current = currentIndex(); - int currentRow = current.row(); - int maxRow = model()->rowCount(); - - auto moveup = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == maxColumnCount * 2 - 1) { - currentRow = 0; - } else if (currentRow < maxColumnCount) { - // 第一行不处理 - } else if (currentRow < maxColumnCount * 2) { - currentRow -= (maxColumnCount - 1); - } else { - currentRow -= maxColumnCount; - } - return currentRow; - }; - auto movedown = [](int currentRow, int maxColumnCount) -> int { - if (currentRow == 0) { - currentRow += (maxColumnCount * 2 - 1); - } else if (currentRow < maxColumnCount) - currentRow += (maxColumnCount - 1); - else - currentRow += maxColumnCount; - return currentRow; - }; - switch (cursorAction) { - case MoveLeft: - currentRow--; - break; - case MoveRight: - currentRow++; - break; - case MovePageUp: { - int pageItem = (viewport()->height() - d->marginsHidget() + d->m_spacing) / (d->m_itemSize.height() + d->m_spacing); - for (int i = 0; i < pageItem; i++) { - currentRow = moveup(currentRow, d->m_maxColumnCount); - } - } break; - case MoveUp: - currentRow = moveup(currentRow, d->m_maxColumnCount); - break; - case MovePageDown: { - int pageItem = (viewport()->height() - d->marginsHidget() + d->m_spacing) / (d->m_itemSize.height() + d->m_spacing); - for (int i = 0; i < pageItem; i++) { - int row = movedown(currentRow, d->m_maxColumnCount); - if (row >= maxRow) - break; - currentRow = row; - } - } break; - case MoveDown: - currentRow = movedown(currentRow, d->m_maxColumnCount); - break; - case MoveHome: - currentRow = 0; - break; - case MoveEnd: - currentRow = maxRow - 1; - break; - default: - return QModelIndex(); - } - QModelIndex selectIndex = model()->index(currentRow, 0); - activated(selectIndex); - return selectIndex; -} - -int AccountsListView::horizontalOffset() const -{ - return horizontalScrollBar()->value(); -} - -int AccountsListView::verticalOffset() const -{ - return verticalScrollBar()->value(); -} - -void AccountsListView::updateGeometries() -{ - Q_D(AccountsListView); - QAbstractItemView::updateGeometries(); - d->updateGeometries(); - - // 更新滚动条范围 - if (geometry().isEmpty() || !model() || model()->rowCount() <= 0 || model()->columnCount() <= 0) { - horizontalScrollBar()->setRange(0, 0); - verticalScrollBar()->setRange(0, 0); - } else { - QSize step = d->m_itemSize; - - horizontalScrollBar()->setSingleStep(step.width() + d->spacing()); - horizontalScrollBar()->setPageStep(viewport()->width()); - - int width = d->m_maxRowCount * (d->m_itemSize.width() + d->m_spacing) - d->m_spacing; - if (width < viewport()->width()) { - horizontalScrollBar()->setRange(0, 0); - } else { - horizontalScrollBar()->setRange(0, width - viewport()->width()); - } - } -} - -void AccountsListView::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles) -{ - QAbstractItemView::dataChanged(topLeft, bottomRight, roles); - scheduleDelayedItemsLayout(); -} - -void AccountsListView::rowsInserted(const QModelIndex &parent, int start, int end) -{ - scheduleDelayedItemsLayout(); - QAbstractItemView::rowsInserted(parent, start, end); - if (model()->rowCount() >= 2) - setVisible(true); -} - -void AccountsListView::rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) -{ - QAbstractItemView::rowsAboutToBeRemoved(parent, start, end); - scheduleDelayedItemsLayout(); - if (model()->rowCount() <= 2) - setVisible(false); -} - -bool AccountsListView::isIndexHidden(const QModelIndex & /*index*/) const -{ - return false; -} - -QRegion AccountsListView::visualRegionForSelection(const QItemSelection &selection) const -{ - if (selection.isEmpty()) - return QRegion(); - Q_D(const AccountsListView); - QRect rect = d->rectForIndex(selection.indexes().first()); - return QRegion(rect); -} - -void AccountsListView::setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) -{ - int rows = model()->rowCount(); - QModelIndex selectedIndex; - for (int row = 0; row < rows; row++) { - QModelIndex index = model()->index(row, 0); - QRect rectIndex = visualRect(index); - if (!rectIndex.intersected(rect).isEmpty()) { - selectedIndex = index; - break; - } - } - selectionModel()->select(selectedIndex, command); -} - -void AccountsListView::paintEvent(QPaintEvent *e) -{ - Q_D(const AccountsListView); - QStyleOptionViewItem option = viewOptions(); - QPainter painter(viewport()); - - const QVector toBeRendered = d->intersectingSet(e->rect().translated(horizontalOffset(), verticalOffset())); - - const QModelIndex current = currentIndex(); - const QModelIndex hover = d->m_hover; - const QAbstractItemModel *itemModel = model(); - const QItemSelectionModel *selections = selectionModel(); - const bool focus = (hasFocus() || viewport()->hasFocus()) && current.isValid(); - const bool alternate = alternatingRowColors(); - const QStyle::State state = option.state; - const QAbstractItemView::State viewState = this->state(); - const bool enabled = (state & QStyle::State_Enabled) != 0; - option.decorationAlignment = Qt::AlignCenter; - - bool alternateBase = false; - int previousRow = -2; - - painter.setRenderHint(QPainter::Antialiasing); - painter.fillRect(e->rect(), palette().color(QPalette::Window)); - - QVector::const_iterator end = toBeRendered.constEnd(); - for (QVector::const_iterator it = toBeRendered.constBegin(); it != end; ++it) { - Q_ASSERT((*it).isValid()); - option.rect = visualRect(*it); - - option.state = state; - if (selections && selections->isSelected(*it)) - option.state |= QStyle::State_Selected; - if (enabled) { - QPalette::ColorGroup cg; - if ((itemModel->flags(*it) & Qt::ItemIsEnabled) == 0) { - option.state &= ~QStyle::State_Enabled; - cg = QPalette::Disabled; - } else { - cg = QPalette::Normal; - } - option.palette.setCurrentColorGroup(cg); - } - if (focus && current == *it) { - option.state |= QStyle::State_HasFocus; - if (viewState == EditingState) - option.state |= QStyle::State_Editing; - } - option.state.setFlag(QStyle::State_MouseOver, *it == hover); - - if (alternate) { // 交替色处理,未实现 - int row = (*it).row(); - if (row != previousRow + 1) { - // adjust alternateBase according to rows in the "gap" - alternateBase = (row & 1) != 0; - } - option.features.setFlag(QStyleOptionViewItem::Alternate, alternateBase); - - // draw background of the item (only alternate row). rest of the background - // is provided by the delegate - QStyle::State oldState = option.state; - option.state &= ~QStyle::State_Selected; - style()->drawPrimitive(QStyle::PE_PanelItemViewRow, &option, &painter, this); - option.state = oldState; - - alternateBase = !alternateBase; - previousRow = row; - } - - itemDelegate(*it)->paint(&painter, option, *it); - } - QScrollBar *hbar = horizontalScrollBar(); - int gradualW = d->m_itemSize.width() * 2; - QRect lRect(0, 0, gradualW, height()); - QRect rRect(width() - gradualW, 0, gradualW + 1, height()); - if (!e->rect().intersected(lRect).isEmpty() && hbar->minimum() != hbar->value()) { //左边 - QLinearGradient linearGradient(lRect.left(), 0, lRect.right(), 0); - linearGradient.setColorAt(0, option.palette.window().color()); - linearGradient.setColorAt(1, QColor(255, 255, 255, 0)); - painter.setBrush(QBrush(linearGradient)); - painter.setPen(Qt::NoPen); - painter.drawRect(lRect); - } - if (!e->rect().intersected(rRect).isEmpty() && hbar->maximum() != hbar->value()) { // 右边 - QLinearGradient linearGradient(rRect.left(), 0, rRect.right(), 0); - linearGradient.setColorAt(0, QColor(255, 255, 255, 0)); - linearGradient.setColorAt(1, option.palette.window().color()); - painter.setBrush(QBrush(linearGradient)); - painter.setPen(Qt::NoPen); - painter.drawRect(rRect); - } -} - -bool AccountsListView::viewportEvent(QEvent *event) -{ - Q_D(AccountsListView); - switch (event->type()) { - case QEvent::HoverMove: - case QEvent::HoverEnter: - d->m_hover = indexAt(static_cast(event)->pos()); - break; - case QEvent::HoverLeave: - case QEvent::Leave: - d->m_hover = QModelIndex(); - break; - default: - break; - } - return QAbstractItemView::viewportEvent(event); -} - -void AccountsListView::wheelEvent(QWheelEvent *e) -{ - QApplication::sendEvent(horizontalScrollBar(), e); - e->setAccepted(true); -} diff --git a/dcc-old/src/plugin-accounts/window/accountslistview.h b/dcc-old/src/plugin-accounts/window/accountslistview.h deleted file mode 100644 index 42a6e382d7..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountslistview.h +++ /dev/null @@ -1,46 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ACCOUNTSLISTVIEW_H -#define ACCOUNTSLISTVIEW_H -#include "interface/namespace.h" - -#include -class AccountsListViewPrivate; -class AccountsListView : public QAbstractItemView -{ - Q_OBJECT -public: - explicit AccountsListView(QWidget *parent = nullptr); - virtual ~AccountsListView() override; - - - void setModel(QAbstractItemModel *model) override; - QRect visualRect(const QModelIndex &index) const override; - void scrollTo(const QModelIndex &index, ScrollHint hint = EnsureVisible) override; - QModelIndex indexAt(const QPoint &p) const override; - -protected: - QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override; - int horizontalOffset() const override; - int verticalOffset() const override; - - bool isIndexHidden(const QModelIndex &index) const override; - QRegion visualRegionForSelection(const QItemSelection &selection) const override; - void setSelection(const QRect &rect, QItemSelectionModel::SelectionFlags command) override; - - void updateGeometries() override; - - void dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector &roles = QVector()) override; - void rowsInserted(const QModelIndex &parent, int start, int end) override; - void rowsAboutToBeRemoved(const QModelIndex &parent, int start, int end) override; - -protected: - void paintEvent(QPaintEvent *e) override; - bool viewportEvent(QEvent *event) override; - void wheelEvent(QWheelEvent *e) override; - - DCC_DECLARE_PRIVATE(AccountsListView) -}; - -#endif // ACCOUNTSLISTVIEW_H diff --git a/dcc-old/src/plugin-accounts/window/accountsmodel.cpp b/dcc-old/src/plugin-accounts/window/accountsmodel.cpp deleted file mode 100644 index eaa16fe900..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountsmodel.cpp +++ /dev/null @@ -1,244 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "accountsmodel.h" -#include "operation/user.h" -#include "operation/usermodel.h" - -#include -#include - -#include -#include -#include -#include -#include - -static constexpr int OnlineLeftReserve = 10; -static constexpr int OnineDisplayWidthReserve = OnlineLeftReserve * 2; -static constexpr int DisplayHeight = 15; -static constexpr QSize OnlineSize = QSize(OnlineLeftReserve, OnlineLeftReserve); - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -AccountsModel::AccountsModel(QObject *parent) - : QAbstractItemModel(parent) -{ - -} - -void AccountsModel::setUserModel(UserModel *userModel) -{ - m_userModel = userModel; - connect(userModel,&UserModel::userAdded,this,&AccountsModel::onUserAdded); - connect(userModel,&UserModel::userRemoved,this,&AccountsModel::onUserRemoved); - for (auto &&user:userModel->userList()) - onUserAdded(user); -} - -User *AccountsModel::getUser(const QModelIndex &index) const -{ - int row = index.row(); - if (row < 0 || row >= m_data.size()) - return nullptr; - return m_data.at(row); -} - -QModelIndex AccountsModel::index(User *user) const -{ - return index(m_data.indexOf(user), 0); -} - -QModelIndex AccountsModel::index(int row, int column, const QModelIndex &parent) const -{ - Q_UNUSED(parent); - if (row < 0 || row >= m_data.size()) - return QModelIndex(); - return createIndex(row, column, m_data.at(row)); -} - -QModelIndex AccountsModel::parent(const QModelIndex &index) const -{ - Q_UNUSED(index); - return QModelIndex(); -} - -int AccountsModel::rowCount(const QModelIndex &parent) const -{ - if (!parent.isValid()) - return m_data.size(); - - return 0; -} - -int AccountsModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - return 1; -} - -QVariant AccountsModel::data(const QModelIndex &index, int role) const -{ - if (m_data.isEmpty() || !index.isValid()) - return QVariant(); - - int row = index.row(); - User *user = m_data.at(row); - switch (role) { - case Qt::DisplayRole: - return user->fullname().isEmpty()?user->name():user->fullname(); - case Qt::DecorationRole: - return QIcon(user->currentAvatar().mid(7)); - case Qt::CheckStateRole: - return user->online()?Qt::Checked:Qt::Unchecked; - default: - break; - } - return QVariant(); -} - -void AccountsModel::onUserAdded(User *user) -{ - int row = user->isCurrentUser() ? 0 : m_data.size(); - connect(user,&User::nameChanged,this,&AccountsModel::onDataChanged); - connect(user,&User::fullnameChanged,this,&AccountsModel::onDataChanged); - connect(user,&User::currentAvatarChanged,this,&AccountsModel::onDataChanged); - connect(user,&User::onlineChanged,this,&AccountsModel::onDataChanged); - - beginInsertRows(QModelIndex(), row, row); - m_data.insert(row, user); - endInsertRows(); -} - -void AccountsModel::onUserRemoved(User *user) -{ - int row = m_data.indexOf(user); - if (row >= 0 && row < m_data.size()) { - beginRemoveRows(QModelIndex(), row, row); - m_data.removeAt(row); - endRemoveRows(); - } -} - -void AccountsModel::onDataChanged() -{ - User *user = qobject_cast(sender()); - if (user) { - QModelIndex i = index(m_data.indexOf(user),0); - emit dataChanged(i,i); - } -} - -UserDelegate::UserDelegate(QAbstractItemView *parent) - : DStyledItemDelegate(parent) -{ -} - -void UserDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - painter->save(); - - QStyleOptionViewItem opt(option); - initStyleOption(&opt, index); - // 选择高亮背景 - if (opt.state & QStyle::State_Selected) { - QPalette::ColorGroup cg = (option.state & QStyle::State_Enabled) - ? QPalette::Normal - : QPalette::Disabled; - opt.backgroundBrush = option.palette.color(cg, QPalette::Highlight); - } - QStyle *style = option.widget ? option.widget->style() : QApplication::style(); - QRect decorationRect; - decorationRect = QRect(opt.rect.topLeft() + QPoint((opt.rect.width() - opt.decorationSize.width()) / 2, 3), opt.decorationSize); - - opt.displayAlignment = Qt::AlignLeft|Qt::AlignVCenter; - - // draw the item - drawBackground(style, painter, opt, decorationRect); - // 图标的绘制用也可能会使用这些颜色 - QPalette::ColorGroup cg = (opt.state & QStyle::State_Enabled) ? QPalette::Normal : QPalette::Disabled; - painter->setPen(opt.palette.color(cg, QPalette::Text));//(opt.state & QStyle::State_Selected) ? QPalette::HighlightedText : QPalette::Text)); - drawDecoration(painter, opt, decorationRect); - - opt.displayAlignment = Qt::AlignCenter; - - bool hasChecked = index.data(Qt::CheckStateRole) == Qt::Checked; - - QRect displayRect = QRect(opt.rect.topLeft() + QPoint(0, opt.decorationSize.height() + 4), QSize(opt.rect.width(), DisplayHeight)); - - if (hasChecked) { - displayRect = QRect(opt.rect.topLeft() + QPoint(OnlineLeftReserve, opt.decorationSize.height() + 4), QSize(opt.rect.width() - OnineDisplayWidthReserve, DisplayHeight)); - QRect onlineRect = QRect(opt.rect.topLeft() + QPoint(0, opt.decorationSize.height() + 8), OnlineSize); - drawOnlineIcon(painter, opt, onlineRect); - } - - drawDisplay(style, painter, opt, displayRect); - painter->restore(); -} - -QSize UserDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_UNUSED(option) - Q_UNUSED(index) - - return QSize(60,60); -} - -void UserDelegate::drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - Q_UNUSED(style) - QRect r = rect; - r.adjust(-2,-2,2,2); - painter->save(); - painter->setRenderHint(QPainter::Antialiasing); - painter->setPen(option.palette.color(QPalette::Normal,(option.state & QStyle::State_Selected)? QPalette::Highlight:QPalette::Window)); - painter->drawRoundedRect(r,8,8); - painter->restore(); -} - -void UserDelegate::drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - DStyle::viewItemDrawText(style, painter, &option, rect); -} - - -void UserDelegate::drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - if (option.features & QStyleOptionViewItem::HasDecoration) { - QIcon::Mode mode = QIcon::Normal; - if (!(option.state & QStyle::State_Enabled)) - mode = QIcon::Disabled; - else if (option.state & QStyle::State_Selected) - mode = QIcon::Selected; - QIcon::State state = (option.state & QStyle::State_Open) ? QIcon::On : QIcon::Off; - painter->save(); - QPainterPath painterPath; - painterPath.addRoundedRect(rect,8,8); - painter->setRenderHint(QPainter::Antialiasing); - painter->setClipPath(painterPath); - option.icon.paint(painter, rect, option.decorationAlignment, mode, state); - - painter->restore(); - } -} - - -void UserDelegate::drawOnlineIcon(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const -{ - Q_UNUSED(option) - painter->save(); - painter->setRenderHints(QPainter::Antialiasing); - - painter->setBrush(QBrush(QColor(103, 239, 74))); - painter->setPen(Qt::NoPen); - painter->drawEllipse(rect.adjusted(1, 1, -1, -1)); - - QPen pen; - pen.setColor(Qt::white); - pen.setWidth(1); - painter->setPen(pen); - painter->setBrush(Qt::NoBrush); - painter->drawEllipse(rect.adjusted(1, 1, -1, -1)); - painter->restore(); -} diff --git a/dcc-old/src/plugin-accounts/window/accountsmodel.h b/dcc-old/src/plugin-accounts/window/accountsmodel.h deleted file mode 100644 index 5578e59a70..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountsmodel.h +++ /dev/null @@ -1,70 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ACCOUNTSMODEL_H -#define ACCOUNTSMODEL_H -#include "interface/namespace.h" - -#include - -#include -#include - -namespace DCC_NAMESPACE { -class User; -class UserModel; -} - - -class AccountsModel : public QAbstractItemModel -{ - Q_OBJECT -public: - explicit AccountsModel(QObject *parent = nullptr); - ~AccountsModel() {} - - void setUserModel(DCC_NAMESPACE::UserModel *userModel); - DCC_NAMESPACE::User *getUser(const QModelIndex &index) const; - QModelIndex index(DCC_NAMESPACE::User *user) const; - // Basic functionality: - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - -private Q_SLOTS: - void onUserAdded(DCC_NAMESPACE::User *user); - void onUserRemoved(DCC_NAMESPACE::User *user); - void onDataChanged(); - -private: - QList m_data; - DCC_NAMESPACE::UserModel *m_userModel; -}; - - -class UserDelegate : public Dtk::Widget::DStyledItemDelegate -{ -public: - explicit UserDelegate(QAbstractItemView *parent = nullptr); - -protected: - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; - - virtual void drawDecoration(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawBackground(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - void drawDisplay(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; -// void drawEllipse(QPainter *painter, const QStyleOptionViewItem &option, const int message) const; -// void drawFocus(const QStyle *style, QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - - void drawOnlineIcon(QPainter *painter, const QStyleOptionViewItem &option, const QRect &rect) const; - -private: -// QGraphicsDropShadowEffect *m_shadowEffect; -}; - -#endif // ACCOUNTSMODEL_H diff --git a/dcc-old/src/plugin-accounts/window/accountsmodule.cpp b/dcc-old/src/plugin-accounts/window/accountsmodule.cpp deleted file mode 100644 index f5a8020257..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountsmodule.cpp +++ /dev/null @@ -1,884 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "accountslistview.h" -#include "accountsmodule.h" -#include "avatarwidget.h" -#include "createaccountpage.h" -#include "dwidgetutil.h" -#include "groupitem.h" -#include "modifypasswdpage.h" -#include "removeuserdialog.h" - -#include "operation/accountsworker.h" -#include "operation/user.h" -#include "operation/usermodel.h" -#include "securityquestionspage.h" - -#include "window/accountsmodel.h" - -#include "widgets/listviewmodule.h" -#include "widgets/moduleobjectitem.h" -#include "widgets/horizontalmodule.h" -#include "widgets/itemmodule.h" -#include "widgets/dcclistview.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include - -using namespace DCC_NAMESPACE; -DCORE_USE_NAMESPACE -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -QString AccountsPlugin::name() const -{ - return QStringLiteral("accounts"); -} - -ModuleObject *AccountsPlugin::module() -{ - return new AccountsModule(this); -} - -QString AccountsPlugin::location() const -{ - return "1"; -} -/////////////////////////////////////// -#define MAXVALUE 99999 -#define GSETTINGS_EFFECTIVE_DAY_VISIBLE "effectiveDayVisible" - -AccountSpinBox::AccountSpinBox(QWidget *parent) - : DSpinBox(parent) -{ -} - -QString AccountSpinBox::textFromValue(int val) const -{ - if (val >= MAXVALUE && !lineEdit()->hasFocus()) { - return tr("Always"); - } - return QString::number(val); -} - -void AccountSpinBox::focusInEvent(QFocusEvent *event) -{ - if (lineEdit()->text() == tr("Always")) { - lineEdit()->setText(QString::number(MAXVALUE)); - } - return DSpinBox::focusInEvent(event); -}; - -void AccountSpinBox::focusOutEvent(QFocusEvent *event) -{ - if (lineEdit()->text().isEmpty()) { - editingFinished(); - } - return DSpinBox::focusOutEvent(event); -} -/////////////////////////////////////// -AccountsModule::AccountsModule(QObject *parent) - : PageModule("accounts", tr("Users"), tr("User management") , DIconTheme::findQIcon("dcc_nav_accounts"), parent) - , m_model(nullptr) - , m_worker(nullptr) - , m_curLoginUser(nullptr) - , m_curUser(nullptr) - , m_accountsmodel(nullptr) - , m_groupItemModel(new QStandardItemModel(this)) - , m_checkAuthorizationing(false) -{ - m_model = new UserModel(this); - m_worker = new AccountsWorker(m_model, this); - - setGroupInfo(m_model->getAllGroups()); - connect(m_model, &UserModel::allGroupsChange, this, &AccountsModule::setGroupInfo); - connect(m_worker, &AccountsWorker::showSafeyPage, this, &AccountsModule::onShowSafetyPage); - - HorizontalModule *horModule = new HorizontalModule("accountsList", QString()); - horModule->appendChild(new ItemModule("accountsList", QString(), this, &AccountsModule::initAccountsList, false)); - horModule->appendChild(new ItemModule("createAccount", tr("Create User"), this, &AccountsModule::initCreateAccount, false), 0, Qt::AlignRight); - appendChild(horModule); - appendChild(new ItemModule("avatar", QString(), this, &AccountsModule::initAvatar, false), 0, Qt::AlignHCenter); - horModule = new HorizontalModule("fullName", QString()); - horModule->setStretchType(HorizontalModule::AllStretch); - m_fullNameModule = new ItemModule("fullName", QString(), this, &AccountsModule::initFullName, false); - m_fullNameModule->setNoSearch(true); - horModule->appendChild(m_fullNameModule); - m_fullNameEditModule = new ItemModule("fullNameEdit", QString(), this, &AccountsModule::initFullNameEdit, false); - horModule->appendChild(m_fullNameEditModule); - m_fullNameEditModule->setHidden(true); - m_fullNameIconModule = new ItemModule("fullNameIcon", QString(), this, &AccountsModule::initFullNameIcon, false); - connect(m_fullNameIconModule, &ModuleObject::stateChanged, this, &AccountsModule::updateFullnameVisible); - horModule->appendChild(m_fullNameIconModule); - appendChild(horModule); - - appendChild(new ItemModule("name", tr("Username"), this, &AccountsModule::initName, false)); - horModule = new HorizontalModule("button", QString()); - m_changePasswordModule = new ItemModule("changePassword", tr("Change Password"), this, &AccountsModule::initChangePassword, false); - horModule->appendChild(m_changePasswordModule); - m_deleteAccountModule =new ItemModule("deleteUser", tr("Delete User"), this, &AccountsModule::initDeleteAccount, false); - horModule->appendChild(m_deleteAccountModule); - appendChild(horModule); - - ItemModule *accountTypeModule = new ItemModule("accountType", tr("User Type"), this, &AccountsModule::initAccountType); - accountTypeModule->setBackground(true); - m_accountTypeModule = accountTypeModule; - appendChild(m_accountTypeModule); - - ListViewModule *listViewModule = new ListViewModule("autoLogin", tr("Auto Login")); - connect(listViewModule, &ListViewModule::clicked, this, &AccountsModule::onLoginModule); - appendChild(listViewModule); - m_autoLoginModule = new ModuleObjectItem("autoLogin", tr("Auto Login")); - listViewModule->appendChild(m_autoLoginModule); - m_loginWithoutPasswordModule = new ModuleObjectItem("loginWithoutPassword", tr("Login Without Password")); - listViewModule->appendChild(m_loginWithoutPasswordModule); - - ItemModule *validityDaysModule = new ItemModule("validityDays", tr("Validity Days"), this, &AccountsModule::initValidityDays); - validityDaysModule->setBackground(true); - m_validityDaysModule = validityDaysModule; - appendChild(m_validityDaysModule); - - if (DSysInfo::UosServer == DSysInfo::uosType()) { - appendChild(new ItemModule("group", tr("Group"))); - appendChild(new ItemModule( - "groupListView", tr("Group"), [this](ModuleObject *module) { - Q_UNUSED(module) - DCCListView *groupListView = new DCCListView(); - groupListView->setModel(m_groupItemModel); - groupListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - groupListView->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - groupListView->setSelectionMode(QAbstractItemView::NoSelection); - groupListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - groupListView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - groupListView->setSpacing(1); - connect(groupListView, &DListView::clicked, this, &AccountsModule::userGroupClicked); - return groupListView; - }, - false)); - } -} - -AccountsModule::~AccountsModule() -{ - m_model->deleteLater(); - m_worker->deleteLater(); -} - -void AccountsModule::active() -{ - m_worker->active(); - for (auto user : m_model->userList()) { - if (user->name() == m_model->getCurrentUserName()) { - m_curLoginUser = user; - // 结束后续没必要的循环 - break; - } - } - m_checkAuthorizationing = false; - if (!m_accountsmodel) { - m_accountsmodel = new AccountsModel(this); - m_accountsmodel->setUserModel(m_model); - } - setCurrentUser(m_accountsmodel->getUser(m_accountsmodel->index(0, 0))); -} - -void AccountsModule::deactive() -{ - Q_EMIT deactivated(); -} - -bool AccountsModule::isSystemAdmin(User *user) -{ - // 本地管理员账户不一定是等保三级的管理员账户,要区分判断 - if (m_model->getIsSecurityHighLever()) - return user->securityLever() == SecurityLever::Sysadm; - - return user->userType() == User::UserType::Administrator; -} - -static QWidget *findAncestorWidget(const QObject *obj) -{ - while (obj) { - if (QWidget *w = qobject_cast(obj->parent())) - return w; - obj = obj->parent(); - } - - return nullptr; -} - -QWidget *AccountsModule::initAccountsList(ModuleObject *module) -{ - Q_UNUSED(module) - - QWidget *pw = findAncestorWidget(this); - AccountsListView *userlistView = new AccountsListView(pw); - userlistView->parentWidget(); - - userlistView->setMaximumHeight(90); - userlistView->setFrameShape(QFrame::NoFrame); - QPalette pa = userlistView->palette(); - pa.setColor(QPalette::Base, pa.color(QPalette::Window)); - userlistView->setAutoFillBackground(true); - userlistView->setPalette(pa); - - userlistView->setIconSize(QSize(40, 40)); - userlistView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - userlistView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - QScroller::grabGesture(userlistView, QScroller::LeftMouseButtonGesture); - UserDelegate *delegate = new UserDelegate(userlistView); - userlistView->setItemDelegate(delegate); - userlistView->setModel(m_accountsmodel); - - QScroller::grabGesture(userlistView->viewport(), QScroller::LeftMouseButtonGesture); - QScroller *scroller = QScroller::scroller(userlistView); - QScrollerProperties sp; - sp.setScrollMetric(QScrollerProperties::HorizontalOvershootPolicy, QScrollerProperties::OvershootAlwaysOff); - scroller->setScrollerProperties(sp); - //自动刷新当前链接状态 - connect(userlistView->selectionModel(), &QItemSelectionModel::currentChanged, this, [this](const QModelIndex ¤t, const QModelIndex &previous) { - Q_UNUSED(previous) - setCurrentUser(m_accountsmodel->getUser(current)); - }); - connect(this, &AccountsModule::currentUserChanged, userlistView, [this, userlistView](User *user, User *oldUser) { - Q_UNUSED(oldUser) - QModelIndex i = m_accountsmodel->index(user); - if (userlistView->selectionModel()->currentIndex() != i) { - userlistView->selectionModel()->setCurrentIndex(i, QItemSelectionModel::ClearAndSelect); - } - }); - userlistView->selectionModel()->select(m_accountsmodel->index(0, 0), QItemSelectionModel::SelectCurrent); - return userlistView; -} - -QWidget *AccountsModule::initCreateAccount(ModuleObject *module) -{ - Q_UNUSED(module) - DFloatingButton *createBtn = new DFloatingButton(nullptr); - createBtn->setIcon(DStyle::SP_IncreaseElement); - createBtn->setFixedSize(50, 50); - createBtn->setToolTip(tr("Create User")); - createBtn->setAccessibleName(tr("Create User")); - connect(createBtn, &QPushButton::clicked, this, &AccountsModule::onCreateAccount); - return createBtn; -} - -QWidget *AccountsModule::initAvatar(ModuleObject *module) -{ - Q_UNUSED(module) - AvatarWidget *avatar = new AvatarWidget(); - avatar->setFixedSize(120, 120); - avatar->setArrowed(false); - auto updateUser = [avatar](User *user, User *oldUser) { - if (!user) { - return; - } - if (oldUser) - disconnect(oldUser, 0, avatar, 0); - - avatar->setAvatarPath(user->currentAvatar()); - connect(user, &User::currentAvatarChanged, avatar, &AvatarWidget::setAvatarPath); - }; - updateUser(m_curUser, nullptr); - connect(this, &AccountsModule::currentUserChanged, avatar, updateUser); - connect(avatar, &AvatarWidget::clicked, this, &AccountsModule::onModifyIcon); - return avatar; -} - -QWidget *AccountsModule::initFullName(ModuleObject *module) -{ - DLabel *fullName = new DLabel(); - fullName->setContentsMargins(0, 6, 0, 6); - fullName->setElideMode(Qt::ElideRight); - if (!m_curUser) { - return fullName; - } - DFontSizeManager::instance()->bind(fullName, DFontSizeManager::T5); - setFullname(m_curUser->fullname(), fullName); - connect(module, &ModuleObject::displayNameChanged, fullName, [this, fullName](const QString &name) { - setFullname(name, fullName); - }); - - return fullName; -} - -QWidget *AccountsModule::initFullNameEdit(ModuleObject *module) -{ - Q_UNUSED(module) - DLineEdit *inputLineEdit = new DLineEdit(); - inputLineEdit->setAccessibleName("fullName_edit"); - inputLineEdit->setMinimumWidth(220); - inputLineEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - inputLineEdit->lineEdit()->setFrame(false); - inputLineEdit->lineEdit()->setAlignment(Qt::AlignCenter); - inputLineEdit->lineEdit()->installEventFilter(this); - DFontSizeManager::instance()->bind(inputLineEdit, DFontSizeManager::T5); - - if (!m_curUser) { - return inputLineEdit; - } - - connect(inputLineEdit, &DLineEdit::textEdited, inputLineEdit, [inputLineEdit](const QString &userFullName) { - /* 90401:在键盘输入下禁止冒号的输入,粘贴情况下自动识别冒号自动删除 */ - QString fullName = userFullName; - fullName.remove(":"); - if (fullName != userFullName) { - inputLineEdit->setText(fullName); - } - if (fullName.size() > 32) { - inputLineEdit->lineEdit()->backspace(); - inputLineEdit->setAlert(true); - inputLineEdit->showAlertMessage(tr("The full name is too long"), inputLineEdit); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } else if (inputLineEdit->isAlert()) { - inputLineEdit->setAlert(false); - inputLineEdit->hideAlertMessage(); - } - }); - - connect(inputLineEdit, &DLineEdit::editingFinished, inputLineEdit, [inputLineEdit, this] { - QString userFullName = inputLineEdit->lineEdit()->text(); - QDBusPendingReply reply = m_worker->isUsernameValid(userFullName); - //欧拉版会自己创建shutdown等root组账户且不会添加到userList中,导致无法重复性算法无效,先通过isUsernameValid校验这些账户再通过重复性算法校验 - // vaild == false && code ==6 是用户名已存在 - if (!reply.argumentAt(0).toBool() && PassErrorCode::ErrCodeSystemUsed == reply.argumentAt(2).toInt()) { - onEditingFinished(true, inputLineEdit); - } else { - onEditingFinished(false, inputLineEdit); - } - }); - - - inputLineEdit->setAlert(false); - inputLineEdit->setText(m_curUser->fullname()); - inputLineEdit->hideAlertMessage(); - QTimer::singleShot(10, inputLineEdit->lineEdit(), SLOT(setFocus())); - return inputLineEdit; -} - -QWidget *AccountsModule::initFullNameIcon(ModuleObject *module) -{ - DToolButton *fullNameBtn = new DToolButton(); - fullNameBtn->setAccessibleName("fullName_btn"); - fullNameBtn->setIcon(DIconTheme::findQIcon("dcc_edit")); - fullNameBtn->setIconSize(QSize(12, 12)); - //点击用户全名编辑按钮 - connect(fullNameBtn, &DIconButton::clicked, module, [this]() { - m_fullNameIconModule->setHidden(true); - }); - return fullNameBtn; -} - -QWidget *AccountsModule::initChangePassword(ModuleObject *module) -{ - QPushButton *modifyPassword = new QPushButton(); - modifyPassword->setText(module->displayName()); - connect(module, &ModuleObject::displayNameChanged, modifyPassword, &QPushButton::setText); - connect(modifyPassword, &QPushButton::clicked, this, &AccountsModule::onModifyPassword); - - return modifyPassword; -} - -QWidget *AccountsModule::initDeleteAccount(ModuleObject *module) -{ - Q_UNUSED(module) - DWarningButton *deleteAccount = new DWarningButton(); - deleteAccount->setText(tr("Delete User")); - connect(deleteAccount, &DWarningButton::clicked, this, &AccountsModule::onDeleteUser); - return deleteAccount; -} - -QWidget *AccountsModule::initAccountType(ModuleObject *module) -{ - Q_UNUSED(module) - QComboBox *asAdministrator = new QComboBox(); - asAdministrator->addItems({ tr("Standard User"), tr("Administrator") }); - if (!m_curUser) { - return asAdministrator; - } - auto updateType = [asAdministrator, this]() { - asAdministrator->blockSignals(true); - asAdministrator->setCurrentIndex(isSystemAdmin(m_curUser)); - asAdministrator->blockSignals(false); - }; - updateType(); - connect(m_model, &UserModel::adminCntChange, asAdministrator, updateType); - connect(this, &AccountsModule::currentUserChanged, asAdministrator, updateType); - connect(asAdministrator, qOverload(&QComboBox::currentIndexChanged), this, [this](const int userType) { - m_worker->setAdministrator(m_curUser, User::UserType::Administrator == userType); - }); - return asAdministrator; -} - -QWidget *AccountsModule::initValidityDays(ModuleObject *module) -{ - Q_UNUSED(module) - AccountSpinBox *validityDaysBox = new AccountSpinBox(); - validityDaysBox->lineEdit()->setValidator(new QRegularExpressionValidator(QRegularExpression("[1-9]\\d{0,4}/^[1-9]\\d*$/"), validityDaysBox->lineEdit())); - validityDaysBox->lineEdit()->setPlaceholderText("99999"); - validityDaysBox->setRange(1, 99999); - - connect(validityDaysBox, qOverload(&DSpinBox::valueChanged), this, [=](const int value) { - validityDaysBox->setValue(value); - validityDaysBox->setAlert(false); - }); - - if (!m_curUser) { - return validityDaysBox; - } - connect(validityDaysBox, &QSpinBox::editingFinished, this, [this, validityDaysBox]() { - if (validityDaysBox->lineEdit()->text().isEmpty()) { - validityDaysBox->setValue(m_curUser->passwordAge()); - return; - } - int age = validityDaysBox->value(); - if (age == m_curUser->passwordAge()) - return; - - m_worker->setMaxPasswordAge(m_curUser, validityDaysBox->value()); - }); - validityDaysBox->setValue(m_curUser->passwordAge()); - validityDaysBox->valueChanged(m_curUser->passwordAge()); - - auto setvalidityDaysFun = [](AccountsModule *module, AccountSpinBox *validityDaysBox) { - validityDaysBox->setValue(module->m_curUser->passwordAge()); - validityDaysBox->valueChanged(module->m_curUser->passwordAge()); - module->m_validityDaysModule->setEnabled(!(module->m_model->getIsSecurityHighLever() && module->m_curLoginUser->securityLever() != SecurityLever::Sysadm && !module->m_curUser->isCurrentUser())); - }; - std::function setvalidityDays = std::bind(setvalidityDaysFun, this, validityDaysBox); - - auto updateValidityDays = [validityDaysBox, setvalidityDays](User *user, User *oldUser) { - if (oldUser) - disconnect(oldUser, 0, validityDaysBox, 0); - setvalidityDays(); - - connect(user, &User::passwordAgeChanged, validityDaysBox, setvalidityDays); - }; - updateValidityDays(m_curUser, nullptr); - - connect(this, &AccountsModule::currentUserChanged, validityDaysBox, updateValidityDays); - return validityDaysBox; -} - -QWidget *AccountsModule::initName(ModuleObject *module) -{ - Q_UNUSED(module) - QWidget *w = new QWidget(); - QLabel *shortnameBtn = new QLabel(); - shortnameBtn->setPixmap(DIconTheme::findQIcon("dcc_avatar").pixmap(12, 12)); - QLabel *shortName = new QLabel(); - shortName->setEnabled(false); - auto updateName = [shortName](User *user, User *oldUser) { - if (!user) { - return; - } - if (oldUser) - disconnect(oldUser, 0, shortName, 0); - - shortName->setText(user->name()); - connect(user, &User::nameChanged, shortName, &QLabel::setText); - }; - updateName(m_curUser, nullptr); - connect(this, &AccountsModule::currentUserChanged, shortName, updateName); - - QHBoxLayout *layout = new QHBoxLayout; - layout->setMargin(0); - layout->addStretch(); - layout->addWidget(shortnameBtn); - layout->addWidget(shortName); - layout->addStretch(); - w->setLayout(layout); - return w; -} - -void AccountsModule::onCreateAccount() -{ - if (m_checkAuthorizationing) - return; - m_checkAuthorizationing = true; - QWidget *w = qobject_cast(sender()); - PolkitQt1::Authority::instance()->checkAuthorization("org.deepin.dde.accounts.user-administration", PolkitQt1::UnixProcessSubject(getpid()), - PolkitQt1::Authority::AllowUserInteraction); - - connect(PolkitQt1::Authority::instance(), &PolkitQt1::Authority::checkAuthorizationFinished, w, [this, w](PolkitQt1::Authority::Result authenticationResult) { - disconnect(PolkitQt1::Authority::instance(), nullptr, w, nullptr); - m_checkAuthorizationing = false; - if (PolkitQt1::Authority::Result::Yes != authenticationResult) { - return; - } - CreateAccountPage *createAccountPage = new CreateAccountPage(m_worker, w); - User *newUser = new User(this); - createAccountPage->setAttribute(Qt::WA_DeleteOnClose); - newUser->setUserType(m_curLoginUser->userType()); - createAccountPage->setModel(m_model, newUser); - connect(createAccountPage, &CreateAccountPage::requestCreateUser, m_worker, &AccountsWorker::createAccount); - connect(m_worker, &AccountsWorker::accountCreationFinished, createAccountPage, &CreateAccountPage::setCreationResult); - connect(createAccountPage, &CreateAccountPage::requestCheckPwdLimitLevel, m_worker, &AccountsWorker::checkPwdLimitLevel); - if (createAccountPage->exec() == QDialog::Accepted) { - for (auto &&user : m_model->userList()) { - if (user->name() == newUser->name()) { - setCurrentUser(user); - break; - } - } - } - }); -} - -void AccountsModule::onModifyPassword() -{ - if (m_checkAuthorizationing) - return; - m_checkAuthorizationing = true; - QWidget *w = qobject_cast(sender()); - PolkitQt1::Authority::instance()->checkAuthorization("org.deepin.dde.accounts.user-administration", PolkitQt1::UnixProcessSubject(getpid()), - PolkitQt1::Authority::AllowUserInteraction); - - connect(PolkitQt1::Authority::instance(), &PolkitQt1::Authority::checkAuthorizationFinished, w, [this, w](PolkitQt1::Authority::Result authenticationResult) { - disconnect(PolkitQt1::Authority::instance(), nullptr, w, nullptr); - m_checkAuthorizationing = false; - if (PolkitQt1::Authority::Result::Yes != authenticationResult) { - return; - } - ModifyPasswdPage *modifyPasswdPage = new ModifyPasswdPage(m_curUser, m_curUser->isCurrentUser(), w); - modifyPasswdPage->setAttribute(Qt::WA_DeleteOnClose); - connect(modifyPasswdPage, &ModifyPasswdPage::requestChangePassword, m_worker, &AccountsWorker::setPassword); - connect(modifyPasswdPage, &ModifyPasswdPage::requestResetPassword, m_worker, &AccountsWorker::resetPassword); - - connect(modifyPasswdPage, &ModifyPasswdPage::requestSetPasswordHint, m_worker, &AccountsWorker::setPasswordHint); - connect(modifyPasswdPage, &ModifyPasswdPage::requestUOSID, m_worker, &AccountsWorker::getUOSID); - connect(modifyPasswdPage, &ModifyPasswdPage::requestUUID, m_worker, &AccountsWorker::getUUID); - connect(modifyPasswdPage, &ModifyPasswdPage::requestLocalBindCheck, m_worker, &AccountsWorker::localBindCheck); - connect(modifyPasswdPage, &ModifyPasswdPage::requestStartResetPasswordExec, m_worker, &AccountsWorker::startResetPasswordExec); - connect(modifyPasswdPage, &ModifyPasswdPage::requestSecurityQuestionsCheck, m_worker, &AccountsWorker::asyncSecurityQuestionsCheck); - connect(modifyPasswdPage, &ModifyPasswdPage::requestCheckPwdLimitLevel, m_worker, &AccountsWorker::checkPwdLimitLevel); - connect(m_worker, &AccountsWorker::localBindUbid, modifyPasswdPage, &ModifyPasswdPage::onLocalBindCheckUbid); - connect(m_worker, &AccountsWorker::localBindError, modifyPasswdPage, &ModifyPasswdPage::onLocalBindCheckError); - modifyPasswdPage->exec(); - }); -} - -void AccountsModule::onDeleteUser() -{ - QWidget *w = qobject_cast(sender()); - if (!w) - return; - RemoveUserDialog *d = new RemoveUserDialog(m_curUser, w); - d->deleteLater(); - if (d->exec() == QDialog::Accepted) { - m_worker->deleteAccount(m_curUser, d->deleteHome()); - } -} - -void AccountsModule::onModifyIcon() -{ - QWidget *w = qobject_cast(sender()); - if (!w) - return; - - AvatarListDialog avatarListDialog = AvatarListDialog(m_curUser, m_worker); - - if (avatarListDialog.exec() == QDialog::Rejected) { - return; - } - - auto path = avatarListDialog.get_path(); - if (path.has_value()) { - m_worker->setAvatar(m_curUser, path.value()); - } -} - -void AccountsModule::setCurrentUser(User *user) -{ - if (user && m_curUser != user) { - User *oldUser = m_curUser; - m_curUser = user; - if (oldUser) { - disconnect(oldUser, 0, this, 0); - } - connect(m_curUser, &User::gidChanged, this, &AccountsModule::onGidChanged); - connect(m_curUser, &User::groupsChanged, this, &AccountsModule::changeUserGroup); - onGidChanged(m_curUser->gid()); - changeUserGroup(m_curUser->groups()); - - connect(m_curUser, &User::autoLoginChanged, this, &AccountsModule::updateLoginModule); - connect(m_curUser, &User::nopasswdLoginChanged, this, &AccountsModule::updateLoginModule); - updateLoginModule(); - m_fullNameIconModule->setHidden(false); - m_fullNameModule->setDisplayName(m_curUser->fullname()); - connect(m_curUser, &User::fullnameChanged, this, [this](const QString &fullname) { - m_fullNameModule->setDisplayName(fullname); - }); - m_autoLoginModule->setEnabled(m_curUser->isCurrentUser()); - m_loginWithoutPasswordModule->setEnabled(m_curUser->isCurrentUser()); - m_changePasswordModule->setEnabled(!(m_model->getIsSecurityHighLever() && m_curLoginUser->securityLever() != SecurityLever::Sysadm && m_curUser != m_curLoginUser)); - m_changePasswordModule->setDisplayName(m_curUser->isCurrentUser() ? tr("Change Password") : tr("Reset Password")); - bool deleteEnable = deleteUserBtnEnable(); - m_deleteAccountModule->setEnabled(deleteEnable); - m_accountTypeModule->setEnabled(deleteEnable); - connect(m_curUser, &User::onlineChanged, this, [this]() { - bool deleteEnable = deleteUserBtnEnable(); - m_deleteAccountModule->setEnabled(deleteEnable); - m_accountTypeModule->setEnabled(deleteEnable); - }); - emit currentUserChanged(m_curUser, oldUser); - } -} - -void AccountsModule::setGroupInfo(const QStringList &group) -{ - m_groupItemModel->clear(); - for (const QString &item : group) { - GroupItem *it = new GroupItem(item); - it->setCheckable(false); - m_groupItemModel->appendRow(it); - } - if (m_curUser) - changeUserGroup(m_curUser->groups()); -} - -void AccountsModule::userGroupClicked(const QModelIndex &index) -{ - QStandardItem *item = m_groupItemModel->item(index.row(), index.column()); - //不可移除主组 - if (!item || item->text() == m_groupName) - return; - - QStringList curUserGroup; - int row_count = m_groupItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *itemGroup = m_groupItemModel->item(i, 0); - if (itemGroup && itemGroup->checkState()) { - curUserGroup << itemGroup->text(); - } - } - - Qt::CheckState state = item->checkState(); - state == Qt::Checked ? (void)curUserGroup.removeOne(item->text()) : curUserGroup.append(item->text()); - - m_worker->setGroups(m_curUser, curUserGroup); -} - -void AccountsModule::changeUserGroup(const QStringList &groups) -{ - int row_count = m_groupItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_groupItemModel->item(i, 0); - if (item) { - item->setCheckState(groups.contains(item->text()) ? Qt::Checked - : Qt::Unchecked); - item->setEnabled(item->text() != m_groupName); - } - } - m_groupItemModel->sort(0); -} - -void AccountsModule::onGidChanged(const QString &gid) -{ - bool ok; - int iGid = gid.toInt(&ok, 10); - if (!ok) - return; - - const group *group = getgrgid(static_cast<__gid_t>(iGid)); - if (nullptr == group || nullptr == group->gr_name) - return; - - m_groupName = QString(group->gr_name); - for (int i = 0; i < m_groupItemModel->rowCount(); ++i) { - QStandardItem *item = m_groupItemModel->item(i, 0); - if (nullptr == item) - continue; - item->setEnabled(item->text() != m_groupName); - } -} - -bool AccountsModule::onEditingFinished(bool isValid, DLineEdit *fullNameEdit) -{ - const QString &userFullName = fullNameEdit->text(); - if (userFullName == m_curUser->fullname() || (!userFullName.isEmpty() && userFullName.simplified().isEmpty())) { - fullNameEdit->lineEdit()->clearFocus(); - m_fullNameIconModule->setVisible(true); - if (fullNameEdit->isAlert()) { - fullNameEdit->setAlert(false); - fullNameEdit->hideAlertMessage(); - } - return true; - } - if (!userFullName.isEmpty()) { - if (isValid) { - fullNameEdit->setAlert(true); - fullNameEdit->showAlertMessage(tr("The full name has been used by other user accounts"), fullNameEdit, 2000); - fullNameEdit->lineEdit()->selectAll(); - return false; - } - QList userList = m_model->userList(); - for (User *user : userList) { - if (userFullName == user->fullname() || userFullName == user->name()) { - fullNameEdit->setAlert(true); - fullNameEdit->showAlertMessage(tr("The full name has been used by other user accounts"), fullNameEdit, 2000); - fullNameEdit->lineEdit()->selectAll(); - return false; - } - } - QList groupList = m_model->getAllGroups(); - for (QString &group : groupList) { - if (userFullName == group && userFullName != m_curUser->name()) { - fullNameEdit->setAlert(true); - fullNameEdit->showAlertMessage(tr("The full name has been used by other user accounts"), fullNameEdit, 2000); - fullNameEdit->lineEdit()->selectAll(); - return false; - } - } - } - fullNameEdit->lineEdit()->clearFocus(); - m_fullNameIconModule->setVisible(true); - if (fullNameEdit->isAlert()) { - fullNameEdit->setAlert(false); - fullNameEdit->hideAlertMessage(); - } - - m_worker->setFullname(m_curUser, fullNameEdit->text()); - return true; -} - -void AccountsModule::setFullname(const QString &fullName, DLabel *fullNameLabel) -{ - QString fullname = fullName; - m_fullNameModule->setEnabled(true); - if (fullname.simplified().isEmpty()) { - fullname = tr("Full Name"); - m_fullNameModule->setEnabled(false); - } else if (fullname.toLocal8Bit().size() > 32) { - for (auto i = 1; i <= fullname.size(); ++i) { - if (fullname.left(i).toLocal8Bit().size() > 29) { - fullname = fullname.left(i - 1) + QString("..."); - break; - } - } - } - fullNameLabel->setText(fullname.toHtmlEscaped()); -} - -void AccountsModule::updateFullnameVisible(uint32_t flag, bool state) -{ - Q_UNUSED(state) - if (ModuleObject::IsHiddenFlag(flag)) { - m_fullNameModule->setHidden(m_fullNameIconModule->isHidden()); - m_fullNameEditModule->setHidden(!m_fullNameIconModule->isHidden()); - } -} - -void AccountsModule::onShowSafetyPage(const QString &errorTips) -{ - DDialog dlg("", errorTips, nullptr); - dlg.setIcon(DIconTheme::findQIcon("preferences-system")); - dlg.addButton(tr("Go to Settings")); - dlg.addButton(tr("Cancel"), true, DDialog::ButtonWarning); - connect(this, &AccountsModule::deactivated, &dlg, &DDialog::close); - connect(&dlg, &DDialog::buttonClicked, this, [=](int idx) { - if (idx == 0) { - DDBusSender() - .service("com.deepin.defender.hmiscreen") - .interface("com.deepin.defender.hmiscreen") - .path("/com/deepin/defender/hmiscreen") - .method(QString("ShowPage")) - .arg(QString("securitytools")) - .arg(QString("login-safety")) - .call(); - } - }); - dlg.exec(); -} - -void AccountsModule::onLoginModule(ModuleObject *module) -{ - if (module == m_autoLoginModule) { - bool autoLogin = !m_curUser->autoLogin(); - if (autoLogin) { - const QString &existedAutoLoginUserName = getOtherUserAutoLogin(); - if (existedAutoLoginUserName.isEmpty()) { - m_worker->setAutoLogin(m_curUser, autoLogin); - } else { - DDialog *tipDialog = new DDialog(qobject_cast(sender())); - tipDialog->setIcon(DIconTheme::findQIcon("dialog-warning")); - tipDialog->setModal(true); - tipDialog->setAttribute(Qt::WA_DeleteOnClose); - tipDialog->addButton(tr("OK")); - tipDialog->setMessage(tr("\"Auto Login\" can be enabled for only one account, please disable it for the account \"%1\" first").arg(existedAutoLoginUserName)); - tipDialog->setFixedWidth(422); - tipDialog->show(); - } - } else { - m_worker->setAutoLogin(m_curUser, autoLogin); - } - } else if (module == m_loginWithoutPasswordModule) { - m_worker->setNopasswdLogin(m_curUser, !m_curUser->nopasswdLogin()); - } -} - -void AccountsModule::updateLoginModule() -{ - m_autoLoginModule->setRightIcon(m_curUser->autoLogin() ? DStyle::SP_IndicatorChecked : DStyle::SP_IndicatorUnchecked); - m_loginWithoutPasswordModule->setRightIcon(m_curUser->nopasswdLogin() ? DStyle::SP_IndicatorChecked : DStyle::SP_IndicatorUnchecked); -} - -QString AccountsModule::getOtherUserAutoLogin() -{ - for (auto user : m_model->userList()) { - if (user->name() != m_curUser->name() && user->autoLogin()) { - return user->name(); - } - } - return ""; -} - -bool AccountsModule::deleteUserBtnEnable() -{ - auto adminCnt = [this]() { - int cnt = 0; - if (m_model->getIsSecurityHighLever()) { - return 1; - } - for (auto user : m_model->userList()) { - if (user->userType() == User::UserType::Administrator) - cnt++; - } - return cnt; - }; - - auto isOnlyAdmin = [this, adminCnt] { // 是最后一个管理员 - return isSystemAdmin(m_curUser) // 是管理员 - && adminCnt() == 1; // 管理员只有一个 - }; - - if (m_model->getIsSecurityHighLever()) { - return m_curLoginUser->securityLever() == SecurityLever::Sysadm && !m_curUser->isCurrentUser(); - } - return !m_curUser->isCurrentUser() // 不是当前用户 - && !m_curUser->online() // 未登录 - && !isOnlyAdmin(); // 不是最后一个管理员 -} diff --git a/dcc-old/src/plugin-accounts/window/accountsmodule.h b/dcc-old/src/plugin-accounts/window/accountsmodule.h deleted file mode 100644 index 41625329e0..0000000000 --- a/dcc-old/src/plugin-accounts/window/accountsmodule.h +++ /dev/null @@ -1,144 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "interface/pagemodule.h" -#include "interface/plugininterface.h" - -#include -#include - -class QVBoxLayout; -class QStackedWidget; -class QStandardItemModel; -class AccountsModel; - -DWIDGET_BEGIN_NAMESPACE -class DLabel; -class DStandardItem; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class SettingsItem; -class User; -class AccountsWorker; -class UserModel; -class AccountsDetailWidget; -class AccountsListWidget; -class ModifyPasswdPage; -class SettingsGroup; -class DCCListView; -class ModuleObjectItem; - -class AccountsPlugin : public PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Accounts" FILE "AccountsPlugin.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - virtual QString name() const override; - virtual ModuleObject *module() override; - virtual QString location() const override; -}; -/////////////////////////////////////// -class AccountSpinBox : public DTK_WIDGET_NAMESPACE::DSpinBox -{ - Q_OBJECT - -public: - explicit AccountSpinBox(QWidget *parent = nullptr); -protected: - virtual QString textFromValue(int val) const override; - void focusInEvent(QFocusEvent *event) override; - void focusOutEvent(QFocusEvent *event) override; -}; -/////////////////////////////////////// -class AccountsModule : public PageModule -{ - Q_OBJECT - -public: - enum PassErrorCode { - ErrCodeEmpty = 1, - ErrCodeInvalidChar, - ErrCodeFirstCharInvalid, - ErrCodeExist, - ErrCodeNameExist, - ErrCodeSystemUsed, - ErrCodeLen - }; - - explicit AccountsModule(QObject *parent = nullptr); - ~AccountsModule(); - AccountsWorker *work() { return m_worker; } - UserModel *model() { return m_model; } - -protected: - void active() override; - void deactive() override; - bool isSystemAdmin(User *user); - -Q_SIGNALS: - void currentUserChanged(User *user, User *oldUser); - void deactivated(); - -protected Q_SLOTS: - QWidget *initAccountsList(ModuleObject *module); - QWidget *initCreateAccount(ModuleObject *module); - QWidget *initAvatar(ModuleObject *module); - QWidget *initFullName(ModuleObject *module); - QWidget *initFullNameEdit(ModuleObject *module); - QWidget *initFullNameIcon(ModuleObject *module); - QWidget *initName(ModuleObject *module); - QWidget *initChangePassword(ModuleObject *module); - QWidget *initDeleteAccount(ModuleObject *module); - QWidget *initAccountType(ModuleObject *module); - QWidget *initValidityDays(ModuleObject *module); - - void onCreateAccount(); - void onModifyPassword(); - void onDeleteUser(); - void onModifyIcon(); - void setCurrentUser(User *user); - void setGroupInfo(const QStringList &group); - void userGroupClicked(const QModelIndex &index); - void changeUserGroup(const QStringList &groups); - void onGidChanged(const QString &gid); - bool onEditingFinished(bool isValid, DTK_WIDGET_NAMESPACE::DLineEdit *fullNameEdit); - void setFullname(const QString &fullName, DTK_WIDGET_NAMESPACE::DLabel *fullNameLabel); - void updateFullnameVisible(uint32_t flag, bool state); - void onShowSafetyPage(const QString &errorTips); - void onLoginModule(ModuleObject *module); - void updateLoginModule(); - -protected: - QString getOtherUserAutoLogin(); //获取其它用户是否开启自动登录开关 - bool deleteUserBtnEnable(); // 可以删除用户 - -private: - UserModel *m_model; - AccountsWorker *m_worker; - User *m_curLoginUser; // 当前登录用户 - User *m_curUser; // 当前选中用户 - AccountsModel *m_accountsmodel; - - QStandardItemModel *m_groupItemModel; - QString m_groupName; - bool m_checkAuthorizationing; - - DCC_NAMESPACE::ModuleObjectItem *m_autoLoginModule; - DCC_NAMESPACE::ModuleObjectItem *m_loginWithoutPasswordModule; - - DCC_NAMESPACE::ModuleObject *m_fullNameModule; - DCC_NAMESPACE::ModuleObject *m_fullNameEditModule; - DCC_NAMESPACE::ModuleObject *m_fullNameIconModule; - DCC_NAMESPACE::ModuleObject *m_changePasswordModule; - DCC_NAMESPACE::ModuleObject *m_deleteAccountModule; - DCC_NAMESPACE::ModuleObject *m_accountTypeModule; - DCC_NAMESPACE::ModuleObject *m_validityDaysModule; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/avatarcropbox.cpp b/dcc-old/src/plugin-accounts/window/avatarcropbox.cpp deleted file mode 100644 index fb12db1629..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarcropbox.cpp +++ /dev/null @@ -1,49 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "avatarcropbox.h" - -#include - -#define CropBoxSize 120 - -using namespace DCC_NAMESPACE; - -AvatarCropBox::AvatarCropBox(QWidget *parent) - : QWidget(parent) - , m_backgroundColor(parent->palette().color(QPalette::Window)) -{ - setFixedSize(190, 190); -} - -AvatarCropBox::~AvatarCropBox() { } - -void AvatarCropBox::setBackgroundColor(QColor color) -{ - m_backgroundColor = color; - - repaint(); -} - -void AvatarCropBox::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QPainter p(this); - p.setRenderHint(QPainter::Antialiasing); - - auto rect = parentWidget()->rect(); - - QPainterPath border, cropBox; - - border.setFillRule(Qt::WindingFill); - border.addRect(rect); - - cropBox.setFillRule(Qt::WindingFill); - auto adjustSize = (rect.width() - CropBoxSize) / 2; - cropBox.addRoundedRect(rect.adjusted(adjustSize, adjustSize, -adjustSize, -adjustSize), 10, 10); - - QPainterPath endPath = border.subtracted(cropBox); - p.fillPath(endPath, m_backgroundColor); -} diff --git a/dcc-old/src/plugin-accounts/window/avatarcropbox.h b/dcc-old/src/plugin-accounts/window/avatarcropbox.h deleted file mode 100644 index 423574cad6..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarcropbox.h +++ /dev/null @@ -1,30 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include -#include -#include - -namespace DCC_NAMESPACE { - -class AvatarCropBox : public QWidget -{ - Q_OBJECT -public: - AvatarCropBox(QWidget *parent = nullptr); - ~AvatarCropBox(); - - void setBackgroundColor(QColor color); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QColor m_backgroundColor; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/avataritemdelegate.cpp b/dcc-old/src/plugin-accounts/window/avataritemdelegate.cpp deleted file mode 100644 index 07393e3b31..0000000000 --- a/dcc-old/src/plugin-accounts/window/avataritemdelegate.cpp +++ /dev/null @@ -1,135 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "avataritemdelegate.h" - -#include "avatarlistwidget.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -#define CustomAvatarRole 4 - -AvatarItemDelegate::AvatarItemDelegate(bool isCustom, QObject *parent) - : QStyledItemDelegate(parent) - , m_isCustom(isCustom) -{ -} - -void AvatarItemDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - painter->setRenderHints(painter->renderHints() | QPainter::Antialiasing - | QPainter::SmoothPixmapTransform); - - if (!index.isValid()) - return; - - QStyleOptionViewItem opt(option); - initStyleOption(&opt, index); - QStyle *style = option.widget ? option.widget->style() : QApplication::style(); - - opt.rect = opt.rect.adjusted(4, 4, -4, -4); - - auto pm = static_cast(DStyle::PM_FocusBorderWidth); - int borderWidth = style->pixelMetric(pm, &opt, nullptr); - pm = static_cast(DStyle::PM_FocusBorderSpacing); - int borderSpacing = style->pixelMetric(pm, &opt, nullptr); - const QMargins margins(borderWidth + borderSpacing, - borderWidth + borderSpacing, - borderWidth + borderSpacing, - borderWidth + borderSpacing); - QPixmap pixmap = index.data(Qt::DecorationRole).value(); - QPainterPath path; - path.addRoundedRect(opt.rect.marginsRemoved(margins), 8, 8); - painter->setClipPath(path); - - if (!pixmap.isNull()) { - painter->drawPixmap(opt.rect.marginsRemoved(margins), pixmap); - painter->setClipping(false); - } else { - qreal tw = opt.rect.width() / 3.0; - qreal th = opt.rect.height() / 3.0; - - // 绘制背景 - DStyleHelper dh(style); - QRectF rect(tw + opt.rect.x(), th + opt.rect.y(), tw, th); - rect.moveCenter(QRect(opt.rect).center()); - painter->setPen(Qt::NoPen); - painter->setBrush(dh.getColor(&opt, QPalette::Button)); - - painter->drawRoundedRect(opt.rect.marginsRemoved(margins), 8, 8); - - // 画+号 - qreal x1 = opt.rect.x() + tw; - qreal y1 = opt.rect.y() + opt.rect.height() / 2.0 - 0.5; - qreal x2 = opt.rect.x() + opt.rect.width() / 2.0 - 0.5; - qreal y2 = opt.rect.y() + th; - painter->setBrush(dh.getColor(&opt, QPalette::Text)); - painter->drawRect(QRectF(x1, y1, tw, 1.0)); - painter->drawRect(QRectF(x2, y2, 1.0, th)); - return; - } - - if (m_isCustom) { - painter->setPen(QPen(opt.palette.highlight(), borderWidth)); - painter->setBrush(Qt::NoBrush); - painter->drawRoundedRect(opt.rect.adjusted(1, 1, -1, -1), 8, 8); - - // 在中间绘制选中小图标 - int radius = 8; - int cx = opt.rect.marginsRemoved(margins).right(); - int cy = opt.rect.marginsRemoved(margins).top(); - QRect crect(QPoint(cx - radius, cy - radius), QPoint(cx + radius, cy + radius)); - opt.rect = crect; - opt.state |= QStyle::State_On; - opt.state &= ~QStyle::State_Selected; - if (index.data(Qt::CheckStateRole) == Qt::Checked) { - style->drawPrimitive(DStyle::PE_IndicatorItemViewItemCheck, &opt, painter, nullptr); - } else { - style->drawPrimitive(DStyle::PE_IndicatorTabClose, &opt, painter, nullptr); - } // draw + in the end - return; - } - - if (index.data(Qt::CheckStateRole) == Qt::Checked) { - painter->setPen(QPen(opt.palette.highlight(), borderWidth)); - painter->setBrush(Qt::NoBrush); - painter->drawRoundedRect(opt.rect.adjusted(1, 1, -1, -1), 8, 8); - - // 在中间绘制选中小图标 - int radius = 8; - int cx = opt.rect.marginsRemoved(margins).right(); - int cy = opt.rect.marginsRemoved(margins).top(); - QRect crect(QPoint(cx - radius, cy - radius), QPoint(cx + radius, cy + radius)); - opt.rect = crect; - opt.state |= QStyle::State_On; - opt.state &= ~QStyle::State_Selected; - style->drawPrimitive(DStyle::PE_IndicatorItemViewItemCheck, &opt, painter, nullptr); - return; - } // draw + in the end -} - -QSize AvatarItemDelegate::sizeHint(const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - Q_UNUSED(option) - Q_UNUSED(index) - - return index.data(Qt::SizeHintRole).toSize(); -} diff --git a/dcc-old/src/plugin-accounts/window/avataritemdelegate.h b/dcc-old/src/plugin-accounts/window/avataritemdelegate.h deleted file mode 100644 index 17572961b2..0000000000 --- a/dcc-old/src/plugin-accounts/window/avataritemdelegate.h +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include -#include - -struct LastItemData -{ - bool isDrawLast; - QString iconPath; -}; -Q_DECLARE_METATYPE(LastItemData) - -QT_BEGIN_NAMESPACE -class QObject; -class QStyleOptionViewItem; -class QModelIndex; -class QPainter; -class QSize; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class AvatarItemDelegate : public QStyledItemDelegate -{ - Q_OBJECT - -public: - explicit AvatarItemDelegate(bool isCustom, QObject *parent = nullptr); - - // painting - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const; - - // set item size - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; - -private: - bool m_isCustom; -}; -} - // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/avatarlistframe.cpp b/dcc-old/src/plugin-accounts/window/avatarlistframe.cpp deleted file mode 100644 index 4cffcaf2d1..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistframe.cpp +++ /dev/null @@ -1,673 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "avatarlistframe.h" - -#include "avatarcropbox.h" - -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE - -const QString VarDirectory = QStringLiteral(VARDIRECTORY); - -// 系统用户头像存放路径 -const QString PersonDimensionalPath = QStringLiteral("lib/AccountsService/icons/human/dimensional"); -const QString PersonDimensional2Path = QStringLiteral("lib/AccountsService/icons/human/dimensional_v2"); -const QString PersonFlatPath = QStringLiteral("lib/AccountsService/icons/human/flat"); -const QString AnimalDimensionalPath = QStringLiteral("lib/AccountsService/icons/animal"); -const QString SceneryPath = QStringLiteral("lib/AccountsService/icons/scenery"); -const QString IllustrationDimensionalPath = QStringLiteral("lib/AccountsService/icons/illustration"); -const QString EmojiDimensionalPath = QStringLiteral("lib/AccountsService/icons/emoji"); - -// 用户自定义图像存放路径 -const QString AvatarCustomPath = QStringLiteral("lib/AccountsService/icons/local"); - -#define BORDER_BOX_SIZE 190 -#define AVATAR_ICON_SIZE 140 -#define WINDOW_WIDTH 640 -#define WINDOW_HEIGHT 472 -#define FIRST_PAGE_WIDTH 180 // 160 + 10 + 10 -#define SECOND_PAGE_WIDTH 460 -#define WINDOW_ROUND_SIZE 10 -#define CROP_BOX_SIZE 120 -#define SLIDER_MINIMUM_SIZE 1 -#define SLIDER_MAX_SIZE 20 -#define SLIDER_STEP 1 - -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -// 头像选择项 -struct AvatarItem -{ - QString name; - QString icon; - int role; - - AvatarItem(const QString &_name, const QString &_icon, const int &_role) - : name(_name) - , icon(_icon) - , role(_role) - { - } -}; - -AvatarListFrame::AvatarListFrame(User * user, const int &role, QWidget *parent) - : QFrame(parent) - , m_role(role) - , m_currentAvatarLsv(nullptr) -{ - const QString personDimensionPath = QString("%1/%2").arg(VarDirectory).arg(PersonDimensionalPath); - const QString personDimension2Path = QString("%1/%2").arg(VarDirectory).arg(PersonDimensional2Path); - const QString personFlatPath = QString("%1/%2").arg(VarDirectory).arg(PersonFlatPath); - const QString animalDimensionPath = QString("%1/%2").arg(VarDirectory).arg(AnimalDimensionalPath); - const QString sceneryPath = QString("%1/%2").arg(VarDirectory).arg(SceneryPath); - const QString illustrationDimensionPath = QString("%1/%2").arg(VarDirectory).arg(IllustrationDimensionalPath); - const QString emojiDimensionPath = QString("%1/%2").arg(VarDirectory).arg(EmojiDimensionalPath); - const QString customAvatarPath = QString("%1/%2").arg(VarDirectory).arg(AvatarCustomPath); - - setFrameStyle(QFrame::NoFrame); - setContentsMargins(0, 0, 0, 0); - if (role == Role::Custom) { - m_path = customAvatarPath; - m_currentAvatarLsv = new AvatarListView(user, role, Type::Dimensional, customAvatarPath, this); - m_currentAvatarLsv->setCurrentAvatarChecked(user->currentAvatar()); - return; - } - - const QString &name = user->name(); - - QList items = { - AvatarRoleItem{ Role::Person, - Type::Cartoon, - personDimensionPath, - isExistCustomAvatar(personDimensionPath, name) }, - AvatarRoleItem{ Role::Person, - Type::Dimensional, - personDimension2Path, - isExistCustomAvatar(personDimension2Path, name) }, - AvatarRoleItem{ Role::Person, - Type::Flat, - personFlatPath, - isExistCustomAvatar(personFlatPath, name) }, - AvatarRoleItem{ Role::Animal, - Type::Dimensional, - animalDimensionPath, - isExistCustomAvatar(animalDimensionPath, name) }, - AvatarRoleItem{ Role::Scenery, - Type::Dimensional, - sceneryPath, - isExistCustomAvatar(sceneryPath, name) }, - AvatarRoleItem{ Role::Illustration, - Type::Dimensional, - illustrationDimensionPath, - isExistCustomAvatar(illustrationDimensionPath, name) }, - AvatarRoleItem{ Role::Expression, - Type::Dimensional, - emojiDimensionPath, - isExistCustomAvatar(emojiDimensionPath, name) }, - }; - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setContentsMargins(0, 0, 0, 0); - - auto addAvatar = [this, mainLayout, user](const AvatarRoleItem &item) { - m_currentAvatarLsv = new AvatarListView(user, item.role, item.type, item.path, this); - m_avatarViewMap[item.type] = m_currentAvatarLsv; - m_currentAvatarLsv->setCurrentAvatarChecked(user->currentAvatar()); - - QHBoxLayout *hBoxLayout = new QHBoxLayout; - hBoxLayout->addWidget(m_currentAvatarLsv, Qt::AlignCenter); - - // 人物头像有两种, 需要添加类型标签 - if (item.role == Role::Person) { - QLabel *dimStyleNameLabel = new QLabel(this); - const QStringList styles { tr("Cartoon Style"), tr("Dimensional Style"), tr("Flat Style")}; - dimStyleNameLabel->setText(styles.value(item.type)); - - QHBoxLayout *nameLabelLayout = new QHBoxLayout; - nameLabelLayout->addSpacing(10); - nameLabelLayout->addWidget(dimStyleNameLabel); - mainLayout->addLayout(nameLabelLayout); - mainLayout->addSpacing(2); - } - - mainLayout->addLayout(hBoxLayout); - - connect(m_currentAvatarLsv, - &AvatarListView::requestUpdateListView, - this, - &AvatarListFrame::updateListView); - }; - - for (const auto &item : items) { - if (item.role == m_role && item.isLoader) { - m_path = item.path; - addAvatar(item); - } - } - - QHBoxLayout *layout = new QHBoxLayout(); - layout->addLayout(mainLayout, Qt::AlignCenter); - - setLayout(layout); - - m_currentAvatarLsv = m_avatarViewMap.value(Type::Dimensional); -} - -QString AvatarListFrame::getAvatarPath() const -{ - return m_currentAvatarLsv->getAvatarPath(); -} - -bool AvatarListFrame::isExistCustomAvatar(const QString &path, const QString &userName) -{ - QDir dir(path); - QStringList filters{ "*.png", "*.jpg", ".jpeg", ".bmp" }; // 设置过滤类型 - dir.setNameFilters(filters); - - QFileInfoList list = dir.entryInfoList(); - - if (m_role != Custom) { - return !list.isEmpty(); - } - - // 自定义账户页面检查是否存在当前用户自定义头像 - auto res = std::find_if(list.cbegin(), list.cend(), [ userName ](const QFileInfo &info)->bool{ - return info.filePath().contains(userName + "-"); - }); - - if (res != list.cend()) { - return true; - } - - return false; -} - -void AvatarListFrame::updateListView(bool isSave, const int &role, const int &type) -{ - Q_UNUSED(isSave); - // 人物头像有两种类型,当有一种类型的item被选中时,取消另外一种类型item的选中状态 - if (role == Role::Person) { - for (auto it = m_avatarViewMap.begin(); it != m_avatarViewMap.end(); ++it) { - if (it.key() == type) { - m_currentAvatarLsv = it.value(); - } else { - it.value()->setCurrentAvatarUnChecked(); - } - } - } -} - -CustomAddAvatarWidget::CustomAddAvatarWidget(User *user, const int &role, QWidget *parent) - : AvatarListFrame(user, role, parent) - , m_addAvatarFrame(new DFrame(this)) - , m_hintLabel(new QLabel(this)) - , m_addAvatarIconSpacer(new QSpacerItem(60, 60)) - , m_isDragIn(false) - , m_isHover(false) - , m_isPress(false) -{ - setAcceptDrops(true); - m_addAvatarFrame->setFixedSize(400, 240); - m_addAvatarFrame->setFrameStyle(QFrame::NoFrame); - m_addAvatarFrame->setAcceptDrops(true); - m_addAvatarFrame->installEventFilter(this); - - m_addAvatarDciIcon = DDciIcon::fromTheme("dcc_user_add_icon"); - - m_hintLabel->setText(tr("You have not uploaded a picture, you can click or drag to upload a picture")); - m_hintLabel->setAlignment(Qt::AlignCenter); - m_hintLabel->setWordWrap(true); - - QVBoxLayout *mainLayout = new QVBoxLayout(this); - mainLayout->setAlignment(Qt::AlignHCenter); - mainLayout->addStretch(); - mainLayout->addWidget(m_addAvatarFrame); - mainLayout->addStretch(); - - QHBoxLayout *iconHLayout = new QHBoxLayout(); - iconHLayout->addStretch(); - iconHLayout->addItem(m_addAvatarIconSpacer); - iconHLayout->addStretch(); - - QVBoxLayout *avatarFrameLayout = new QVBoxLayout(m_addAvatarFrame); - avatarFrameLayout->addStretch(); - avatarFrameLayout->addLayout(iconHLayout); - avatarFrameLayout->addSpacing(20); - avatarFrameLayout->addWidget(m_hintLabel); - avatarFrameLayout->addStretch(); - - installEventFilter(this); -}; - -CustomAddAvatarWidget::~CustomAddAvatarWidget() -{ -} - -void CustomAddAvatarWidget::saveCustomAvatar(const QString &avatar_path) -{ - auto saveFunc = [this](const QString &path) { - QFile file(path); - if (file.open(QIODevice::ReadOnly)) { - QPixmap pix; - pix.loadFromData(file.readAll()); - - if (pix.isNull()) { - // 用户上传的不是图片类型,提醒用户上传的文件类型错误 - m_hintLabel->clear(); - qWarning() << "failed to save file, maybe the file is not picture type"; - QPalette pe; - pe.setColor(QPalette::Base, Qt::white); - m_hintLabel->setPalette(pe); - m_hintLabel->setText(tr("Uploaded file type is incorrect, please upload again")); - - file.close(); - return; - } - - file.close(); - } - - if (!path.isEmpty()) { - Q_EMIT requestUpdateCustomWidget(path); - } - }; - - if (avatar_path.isEmpty()) { - // open file manager to add pic - QStringList directory = QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); - QFileDialog dialog; - dialog.setNameFilter(tr("Images") + "(*.png *.bmp *.jpg *.jpeg)"); - if (!directory.isEmpty()) { - dialog.setDirectory(directory.first()); - } - if (dialog.exec() == QFileDialog::Accepted) { - const QString path = dialog.selectedFiles().first(); - saveFunc(path); - } - } else { - // save file - saveFunc(avatar_path); - } -} - -void CustomAddAvatarWidget::dragEnterEvent(QDragEnterEvent *event) -{ - event->accept(m_addAvatarFrame->geometry()); - m_isDragIn = true; - update(); - - - QWidget::dragEnterEvent(event); -} - -void CustomAddAvatarWidget::dragLeaveEvent(QDragLeaveEvent *event) -{ - m_isDragIn = false; - update(); - - QWidget::dragLeaveEvent(event); -} - -void CustomAddAvatarWidget::dropEvent(QDropEvent *event) -{ - auto file = event->mimeData()->urls().first().toLocalFile(); - - saveCustomAvatar(file); - repaint(); -} - -void CustomAddAvatarWidget::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event) - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - QPen pen; - QColor backColor = Qt::transparent; - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - if (m_isPress || m_isDragIn) { - backColor = QColor(0, 129, 255, 0.1 * 255); - } else if (m_isHover) { - backColor = QColor(0, 129, 255, 0.05 * 255); - } else { - backColor = Qt::transparent; - } - pen.setColor(QColor(0, 0, 0, 0.2 * 255)); - } else { - if (m_isPress || m_isDragIn) { - backColor = QColor(255, 255, 255, 0.1 * 255); - } else if (m_isHover) { - backColor = QColor(255, 255, 255, 0.05 * 255); - } else { - backColor = Qt::transparent; - } - pen.setColor(QColor(255, 255, 255, 255 * 0.2)); - } - - pen.setWidth(2); - pen.setStyle(Qt::DashLine); - painter.setPen(pen); - QPainterPath path; - path.addRoundedRect(m_addAvatarFrame->geometry(), WINDOW_ROUND_SIZE, WINDOW_ROUND_SIZE); - painter.fillPath(path, backColor); - painter.drawPath(path); - QRect iconRect = - {m_addAvatarFrame->mapToParent(m_addAvatarIconSpacer->geometry().topLeft()), m_addAvatarIconSpacer->geometry().size()}; - m_addAvatarDciIcon.paint(&painter, iconRect, qApp->devicePixelRatio(), DDciIcon::Light, DDciIcon::Normal, - Qt::AlignCenter, DDciIconPalette::fromQPalette(palette())); -} - -bool CustomAddAvatarWidget::eventFilter(QObject *object, QEvent *event) -{ - if (object == m_addAvatarFrame) { - if (event->type() == QEvent::Enter) { - m_isHover = true; - } else if (event->type() == QEvent::Leave) { - m_isHover = false; - m_isPress = false; - } else if (event->type() == QEvent::MouseButtonPress) { - m_isPress = true; - } else if (event->type() == QEvent::MouseButtonRelease) { - m_isPress = false; - saveCustomAvatar(QString()); - } else { - return false; - } - - update(); - return true; - } - - return false; -} - -CustomAvatarView::CustomAvatarView(QWidget *parent) - : QWidget(parent) - , m_autoExitTimer(new QTimer(this)) - , m_cropBox(new AvatarCropBox(this)) -{ - setFixedSize(BORDER_BOX_SIZE, BORDER_BOX_SIZE); - - m_autoExitTimer->setInterval(1000); - m_autoExitTimer->setSingleShot(true); - connect(m_autoExitTimer, &QTimer::timeout, this, [this]() { - // 当用户退出图片修改后,1s内不再编辑,恢复背景 - m_cropBox->setBackgroundColor(palette().color(QPalette::Window)); - auto path = getCroppedImage(); - m_autoExitTimer->stop(); - - if (!path.isEmpty()) { - Q_EMIT requestSaveCustomAvatar(path); - } - }); - - QVBoxLayout *layout = new QVBoxLayout; - layout->setContentsMargins(0, 0, 0, 0); - layout->addWidget(m_cropBox); - setLayout(layout); -} - -QString CustomAvatarView::getCroppedImage() -{ - auto screen = qApp->primaryScreen(); - auto offset = (BORDER_BOX_SIZE - CROP_BOX_SIZE) / 2; - QPoint pos = mapToGlobal(QPoint(offset, offset)); - QRect rect(pos.x(), pos.y(), CROP_BOX_SIZE, CROP_BOX_SIZE); - - QFileInfo customAvatarPath(m_path); - const QString tempPath = QString("%1/%2").arg(QDir::tempPath()).arg(customAvatarPath.fileName()); - - // 修改后的头像直接覆盖之前的头像 - bool ret = - screen->grabWindow(0, rect.x(), rect.y(), rect.width(), rect.height()).save(tempPath); - if (!ret) { - qWarning() << "failed to save crop image"; - return QString(); - } - - return tempPath; -} - -void CustomAvatarView::setAvatarPath(const QString &avatarPath) -{ - m_path = avatarPath; - auto isValid = !avatarPath.isEmpty(); - m_image = isValid ? m_image : QImage(); - - if (isValid) { - m_image.load(m_path); - } - - onPresetImage(); - Q_EMIT enableAvatarScaledItem(isValid); - update(); -} - -CustomAvatarView::~CustomAvatarView() -{ - if (m_autoExitTimer) { - m_autoExitTimer->stop(); - m_autoExitTimer->deleteLater(); - m_autoExitTimer = nullptr; - } -} - -void CustomAvatarView::paintEvent(QPaintEvent *event) -{ - // 绘制样式 - QStyleOption opt; - opt.init(this); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing, true); - painter.setRenderHint(QPainter::SmoothPixmapTransform, true); - style()->drawPrimitive(QStyle::PE_Widget, &opt, &painter, this); - - if (m_image.isNull()) { - painter.setBrush(QBrush(QColor("#e4e4e4"))); - painter.setPen(QColor("#e4e4e4")); - painter.drawRoundedRect(QRect(35, 35, CROP_BOX_SIZE, CROP_BOX_SIZE), - WINDOW_ROUND_SIZE, - WINDOW_ROUND_SIZE); - return QWidget::paintEvent(event); - } - - // 平移 - painter.translate(this->width() / 2.0 + m_xPtInterval, this->height() / 2.0 + m_yPtInterval); - - // 缩放 - painter.scale(m_zoomValue, m_zoomValue); - - // 绘制图像 - QRect picRect(-AVATAR_ICON_SIZE / 2, -AVATAR_ICON_SIZE / 2, AVATAR_ICON_SIZE, AVATAR_ICON_SIZE); - painter.drawImage(picRect, m_image); -} - -void CustomAvatarView::mousePressEvent(QMouseEvent *event) -{ - if (m_image.isNull()) { - return event->ignore(); - } - - m_OldPos = event->pos(); - startAvatarModify(); -} - -void CustomAvatarView::mouseMoveEvent(QMouseEvent *event) -{ - if (!m_Pressed) - return QWidget::mouseMoveEvent(event); - - this->setCursor(Qt::SizeAllCursor); - QPoint pos = event->pos(); - - int xPtInterval = pos.x() - m_OldPos.x(); - int yPtInterval = pos.y() - m_OldPos.y(); - - m_OldPos = pos; - - // 限制图片移动区域,超出移动范围不移动 - m_offset = (AVATAR_ICON_SIZE * m_zoomValue - CROP_BOX_SIZE) / 2; - if ((m_xPtInterval >= m_offset && xPtInterval > 0) - || (m_xPtInterval <= -m_offset && xPtInterval < 0) - || (m_yPtInterval >= m_offset && yPtInterval > 0) - || (m_yPtInterval <= -m_offset && yPtInterval < 0)) { - return this->update(); - } - - m_xPtInterval += xPtInterval; - m_yPtInterval += yPtInterval; - - this->update(); -} - -void CustomAvatarView::mouseReleaseEvent(QMouseEvent *event) -{ - Q_UNUSED(event) - endAvatarModify(); - this->setCursor(Qt::ArrowCursor); -} - -void CustomAvatarView::startAvatarModify() -{ - m_Pressed = true; - m_cropBox->setBackgroundColor(QColor(0, 0, 0, 100)); - - if (m_autoExitTimer->isActive()) { - m_autoExitTimer->stop(); - } -} - -void CustomAvatarView::endAvatarModify() -{ - m_Pressed = false; - if (!m_autoExitTimer->isActive()) { - m_autoExitTimer->start(); - } -} - -void CustomAvatarView::stopAutoExitTimer() -{ - m_autoExitTimer->stop(); -} - -void CustomAvatarView::onZoomInImage(void) -{ - m_zoomValue += 0.2; - this->update(); -} - -void CustomAvatarView::setZoomValue(const int value) -{ - if (m_image.isNull()) { - return; - } - - if (value > m_currentScaledValue) - onZoomInImage(); - else - onZoomOutImage(); - - m_currentScaledValue = value; - - this->update(); -} - -void CustomAvatarView::onZoomOutImage(void) -{ - // 限制图片缩放区域,超出缩放范围不缩放 - m_offset = (AVATAR_ICON_SIZE * m_zoomValue - CROP_BOX_SIZE) / 2; - if (m_zoomValue <= 1.0 || m_offset == CROP_BOX_SIZE / 2) { - return; - } - - m_zoomValue -= 0.2; - - this->update(); -} - -// 还原图片大小 -void CustomAvatarView::onPresetImage(void) -{ - m_cropBox->setBackgroundColor(palette().color(QPalette::Window)); - m_zoomValue = 1.0; - m_xPtInterval = 0; - m_yPtInterval = 0; - this->update(); -} - -CustomAvatarWidget::CustomAvatarWidget(User *user, const int &role, QWidget *parent) - : AvatarListFrame(user, role, parent) - , m_avatarScaledItem(new DSlider(Qt::Horizontal, this)) - , m_avatarView(new CustomAvatarView(this)) -{ - QVBoxLayout *mainLayout = new QVBoxLayout(); - mainLayout->setAlignment(Qt::AlignHCenter | Qt::AlignVCenter); - mainLayout->setContentsMargins(10, 2, 10, 2); - - m_avatarScaledItem->setEnabled(false); - m_avatarScaledItem->setMinimum(SLIDER_MINIMUM_SIZE); - m_avatarScaledItem->setMaximum(SLIDER_MAX_SIZE); - m_avatarScaledItem->setPageStep(SLIDER_STEP); - - QHBoxLayout *iconLabelLayout = new QHBoxLayout(); - iconLabelLayout->addWidget(m_avatarView); - QHBoxLayout *scaledItemLayout = new QHBoxLayout(); - m_avatarScaledItem->setFixedWidth(150); - scaledItemLayout->addWidget(m_avatarScaledItem); - mainLayout->addLayout(iconLabelLayout); - mainLayout->addLayout(scaledItemLayout); - - QHBoxLayout *avatarLayout = new QHBoxLayout(); - avatarLayout->addWidget(getCurrentListView(), Qt::AlignCenter); - mainLayout->addLayout(avatarLayout); - - connect(m_avatarScaledItem, &DSlider::valueChanged, m_avatarView, [this](int value) { - m_avatarView->setZoomValue(value); - }); - connect(m_avatarScaledItem, &DSlider::sliderPressed, m_avatarView, [this] { - m_avatarView->startAvatarModify(); - }); - connect(m_avatarScaledItem, &DSlider::sliderReleased, m_avatarView, [this] { - m_avatarView->endAvatarModify(); - }); - connect(m_avatarView, - &CustomAvatarView::enableAvatarScaledItem, - this, - &CustomAvatarWidget::enableAvatarScaledItem); - - setLayout(mainLayout); -} - -void CustomAvatarWidget::enableAvatarScaledItem(bool enabled) -{ - m_avatarScaledItem->setEnabled(enabled); - m_avatarScaledItem->setValue(SLIDER_MINIMUM_SIZE); -} - -void CustomAvatarWidget::stopAvatarModify() -{ - m_avatarView->stopAutoExitTimer(); -} diff --git a/dcc-old/src/plugin-accounts/window/avatarlistframe.h b/dcc-old/src/plugin-accounts/window/avatarlistframe.h deleted file mode 100644 index 5183325260..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistframe.h +++ /dev/null @@ -1,172 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "avatarlistview.h" -#include "interface/namespace.h" -#include "widgets/accessibleinterface.h" - -#include - -#include -#include - -DWIDGET_BEGIN_NAMESPACE -class DSlider; -DWIDGET_END_NAMESPACE - -QT_BEGIN_NAMESPACE -class QLabel; -class QPoint; -class QColor; -class QTimer; -class QFileDialog; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class AvatarCropBox; -class AvatarListView; - -class AvatarListFrame : public QFrame -{ - Q_OBJECT -public: - struct AvatarRoleItem - { - int role; - int type; - QString path; - bool isLoader; - - AvatarRoleItem(const int &_role, - const int &_type, - const QString &_path, - const bool &_isLoader) - : role(_role) - , type(_type) - , path(_path) - , isLoader(_isLoader) - { - } - }; - - explicit AvatarListFrame(User * user, const int &role, QWidget *parent = nullptr); - virtual ~AvatarListFrame() = default; - - inline int getCurrentRole() { return m_role; } - inline QString getCurrentPath() { return m_path; } - inline AvatarListView *getCurrentListView() { return m_currentAvatarLsv; } - - QString getAvatarPath() const; - - bool isExistCustomAvatar(const QString &path, const QString &userName); - -public Q_SLOTS: - void updateListView(bool isSave, const int &role, const int &type); - -private: - QString getCurrentAvatarPath(const int role, const int type); - -private: - int m_role; - QString m_path; - QMap m_avatarViewMap; - AvatarListView *m_currentAvatarLsv; -}; - -class CustomAddAvatarWidget : public AvatarListFrame -{ - Q_OBJECT -public: - explicit CustomAddAvatarWidget(User *user, const int &role, QWidget *parent = nullptr); - virtual ~CustomAddAvatarWidget(); - -protected: - void dragEnterEvent(QDragEnterEvent *event) override; - void dragLeaveEvent(QDragLeaveEvent *event) override; - void dropEvent(QDropEvent *event) override; - bool eventFilter(QObject *object, QEvent *event) override; - void paintEvent(QPaintEvent *event) override; - -Q_SIGNALS: - void requestUpdateCustomWidget(const QString &path); - -private: - void saveCustomAvatar(const QString &path); - -private: - Dtk::Widget::DFrame *m_addAvatarFrame; - QLabel *m_hintLabel; - QSpacerItem *m_addAvatarIconSpacer; - Dtk::Gui::DDciIcon m_addAvatarDciIcon; - bool m_isDragIn; - bool m_isHover; - bool m_isPress; -}; - -class CustomAvatarView : public QWidget -{ - Q_OBJECT - -public: - explicit CustomAvatarView(QWidget *parent = nullptr); - ~CustomAvatarView(); - - void setAvatarPath(const QString &avatarPath); - -protected: - void paintEvent(QPaintEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - -Q_SIGNALS: - void enableAvatarScaledItem(const bool enabled); - void requestSaveCustomAvatar(const QString &path); - -public Q_SLOTS: - void startAvatarModify(); - void endAvatarModify(); - void stopAutoExitTimer(); - void setZoomValue(const int value); - QString getCroppedImage(); - -private: - int m_xPtInterval = 0; - int m_yPtInterval = 0; - int m_offset = 0; - int m_currentScaledValue = 0; - bool m_Pressed = false; - QTimer *m_autoExitTimer; - QImage m_image; - AvatarCropBox *m_cropBox; - qreal m_zoomValue = 1.0; - QPoint m_OldPos; - QString m_path; - -private slots: - void onZoomInImage(void); - void onZoomOutImage(void); - void onPresetImage(void); -}; - -class CustomAvatarWidget : public AvatarListFrame -{ - Q_OBJECT -public: - explicit CustomAvatarWidget(User *user, const int &role, QWidget *parent = nullptr); - ~CustomAvatarWidget() override = default; - - void enableAvatarScaledItem(bool enabled); - void stopAvatarModify(); - - inline CustomAvatarView *getCustomAvatarView() { return m_avatarView; } - -private: - Dtk::Widget::DSlider *m_avatarScaledItem; - CustomAvatarView *m_avatarView; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/avatarlistview.cpp b/dcc-old/src/plugin-accounts/window/avatarlistview.cpp deleted file mode 100644 index 012c3bbeef..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistview.cpp +++ /dev/null @@ -1,428 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "avatarlistview.h" - -#include "avataritemdelegate.h" -#include "widgets/accessibleinterface.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -const QString VarDirectory = QStringLiteral(VARDIRECTORY); -const QString DefaultAvatar = - QStringLiteral("lib/AccountsService/icons/animal/dimensional/raccoon.png"); - -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -AvatarListView::AvatarListView( - User *user, const int &role, const int &type, const QString &path, QWidget *parent) - : DListView(parent) - , m_currentAvatarRole(role) - , m_currentAvatarType(type) - , m_path(path) - , m_avatarItemModel(new QStandardItemModel(this)) - , m_avatarItemDelegate(new AvatarItemDelegate(m_currentAvatarRole == Custom, this)) - , m_avatarSize(QSize(80, 80)) - , m_curUser(user) - , m_dconfig(DConfig::create("org.deepin.dde.control-center", - QStringLiteral("org.deepin.dde.control-center.accounts"), - QString(), - this)) -{ - initWidgets(); - installEventFilter(this); - connect(this, &DListView::clicked, this, [this](const QModelIndex &index) { - m_save = false; - onItemClicked(index); - }); -} - -AvatarListView::~AvatarListView() -{ - - if (m_avatarItemModel) { - m_avatarItemModel->clear(); - m_avatarItemModel->deleteLater(); - m_avatarItemModel = nullptr; - } - if (m_avatarItemDelegate) { - m_avatarItemDelegate->deleteLater(); - m_avatarItemDelegate = nullptr; - } -} - -void AvatarListView::updateGeometries() -{ - DListView::updateGeometries(); - if (model()->rowCount() == 0) { - return; - } - QRect r = rectForIndex(model()->index(model()->rowCount() - 1, 0)); - QMargins margins = viewportMargins(); - setFixedHeight(r.y() + r.height() + margins.top() + margins.bottom() + 1); -} - -bool AvatarListView::eventFilter(QObject *object, QEvent *event) -{ - if (event->type() != QEvent::KeyPress) { - return QObject::eventFilter(object, event); - } - QKeyEvent *keyevent = static_cast(event); - if (keyevent->key() != Qt::Key_Tab) { - return QObject::eventFilter(object, event); - } - bool is_back_select = keyevent->modifiers() == Qt::Modifier::CTRL; - int count = m_avatarItemModel->rowCount(); - int current_index = m_currentSelectIndex.row(); - int next_index = 0; - if (is_back_select) { - if (current_index == 0) { - next_index = count - 1; - } else { - next_index = current_index - 1; - } - } else { - if (current_index == count - 1) { - next_index = 0; - } else { - next_index = current_index + 1; - } - } - - if (m_currentSelectIndex.isValid()) { - m_avatarItemModel->item(m_currentSelectIndex.row())->setCheckState(Qt::Unchecked); - } - m_currentSelectIndex = m_avatarItemModel->index(next_index, 0); - const QString filePath = m_currentSelectIndex.data(SaveAvatarRole).toString(); - m_avatarItemModel->item(m_currentSelectIndex.row())->setCheckState(Qt::Checked); - m_avatarItemModel->item(m_currentSelectIndex.row()) - ->setData(QVariant::fromValue(filePath), AvatarListView::SaveAvatarRole); - Q_EMIT requestUpdateListView(m_save, m_currentAvatarRole, m_currentAvatarType); - - return true; -} - -void AvatarListView::initWidgets() -{ - setViewMode(ViewMode::IconMode); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - setContentsMargins(0, 0, 0, 0); - setSpacing(2); - setItemAlignment(Qt::AlignTop); - setEditTriggers(QAbstractItemView::NoEditTriggers); - setDragDropMode(QAbstractItemView::NoDragDrop); - setDragEnabled(false); - setResizeMode(DListView::Adjust); - setFrameShape(QFrame::NoFrame); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - setItemDelegate(m_avatarItemDelegate); - setModel(m_avatarItemModel); - - addItemFromDefaultDir(m_path); -} - -void AvatarListView::addLastItem() -{ - DStandardItem *item = new DStandardItem(); - item->setAccessibleText("LastItem"); - item->setData(m_avatarSize, Qt::SizeHintRole); - item->setData("", AvatarListView::SaveAvatarRole); - item->setData(true, AvatarListView::AddAvatarRole); - m_avatarItemModel->appendRow(item); -} - -QStandardItem *AvatarListView::getCustomAvatar() -{ - // 用户编辑修改的头像直接替换原来的头像 - if (m_updateItem) { - return m_avatarItemModel->item(m_currentSelectIndex.row()); - } - - QStandardItem *item = new QStandardItem; - // 默认项MaxAvatarSize个,添加项一个 - if (m_currentSelectIndex.isValid()) - m_avatarItemModel->item(m_currentSelectIndex.row())->setCheckState(Qt::Unchecked); - m_avatarItemModel->insertRow(1, item); - return item; -} - -void AvatarListView::addItemFromDefaultDir(const QString &path) -{ - auto avatarPath = path; - - QDir dir(avatarPath); - QStringList hideList; - hideList << "default.png" - << "guest.png"; - QStringList filters; - filters << "*.png" - << "*.jpg" - << "*.jpeg"; // 设置过滤类型 - dir.setNameFilters(filters); // 设置文件名的过滤 - QFileInfoList list = dir.entryInfoList(); - - // 根据文件名进行排序 - std::sort(list.begin(), list.end(), [](const QFileInfo &fileinfo1, const QFileInfo &fileinfo2) { - return fileinfo1.baseName() < fileinfo2.baseName(); - }); - - const auto &name = m_curUser->name(); - // 当前用户有自定义用户头像时, 需要添加用户添加按钮, 否则不需要添加 - if (m_currentAvatarRole == Custom) { - auto res = std::find_if(list.cbegin(), list.cend(), [name](const QFileInfo &info) -> bool { - return info.filePath().contains(name + "-"); - }); - - if (res != list.cend()) { - addLastItem(); - } - } - - for (int i = 0; i < list.size(); ++i) { - if (hideList.contains(list.at(i).fileName())) { - continue; - } - - QString iconPath = list.at(i).filePath(); - - if (m_currentAvatarRole == Custom) { - // 过滤掉非当前用户自定义头像 - if (!iconPath.contains(name + "-")) { - continue; - } - } - - DStandardItem *item = new DStandardItem(); - item->setBackgroundRole(QPalette::ColorRole::Highlight); - item->setAccessibleText(iconPath); - auto ratio = devicePixelRatioF(); - - auto pxPath = iconPath; - auto px = QPixmap(pxPath).scaled(QSize(74, 74) * ratio, - Qt::KeepAspectRatio, - Qt::FastTransformation); - px.setDevicePixelRatio(ratio); - - item->setData(QVariant::fromValue(px), Qt::DecorationRole); - item->setData(QVariant::fromValue(iconPath), AvatarListView::SaveAvatarRole); - item->setData(m_avatarSize, Qt::SizeHintRole); - m_avatarItemModel->appendRow(item); - } -} - -void AvatarListView::setCurrentAvatarUnChecked() -{ - if (m_currentSelectIndex.isValid()) { - m_avatarItemModel->setData(m_currentSelectIndex, Qt::Unchecked, Qt::CheckStateRole); - } -} - -void AvatarListView::requestAddCustomAvatar(const QString &path) -{ - addLastItem(); - addCustomAvatar(path); -} - -void AvatarListView::requestUpdateCustomAvatar(const QString &path) -{ - if (m_currentAvatarRole != Custom) { - return; - } - - m_avatarItemModel->item(m_currentSelectIndex.row()) - ->setData(QVariant::fromValue(QUrl(path).toLocalFile()), - AvatarListView::SaveAvatarRole); -} - -void AvatarListView::addCustomAvatar(const QString &path) -{ - m_save = true; - - QStandardItem *item = getCustomAvatar(); - item->setAccessibleText(path); - auto ratio = devicePixelRatioF(); - auto px = QPixmap(path).scaled(QSize(74, 74) * ratio, - Qt::KeepAspectRatio, - Qt::FastTransformation); - px.setDevicePixelRatio(ratio); - - item->setData(QVariant::fromValue(px), Qt::DecorationRole); - item->setData(QVariant::fromValue(path), AvatarListView::SaveAvatarRole); - item->setData(m_avatarSize, Qt::SizeHintRole); - - if (m_updateItem) { - onItemClicked(m_avatarItemModel->index(m_currentSelectIndex.row(), 0)); - m_updateItem = false; - } else { - onItemClicked(m_avatarItemModel->index(1, 0)); - } -} - -bool AvatarListView::checkIsToDeleteAvatar(const QModelIndex &index) -{ - if (m_currentAvatarRole != Custom) { - return false; - } - if (index.row() == 0) { - return false; - } - auto pos = mapFromGlobal(QCursor::pos()); - auto rect = visualRect(index); - auto rectTopRight = rect.topRight(); - QRect closeBtnRegion = - QRect{ rectTopRight.x() - 16, rectTopRight.y(), 16, 16 }; - if (closeBtnRegion.contains(pos)) { - return true; - } - return false; -} - -void AvatarListView::onItemClicked(const QModelIndex &index) -{ - // NOTE: as design, the last one should not bbe deleted - if (checkIsToDeleteAvatar(index) && m_avatarItemModel->rowCount() > 2) { - QString iconPath = index.data(AvatarListView::SaveAvatarRole).toString(); - Q_EMIT requestDeleteUserIcon(iconPath); - m_avatarItemModel->removeRow(index.row()); - if (m_avatarItemModel->rowCount() >= 1) { - m_currentSelectIndex = m_avatarItemModel->index(1, 0); - } else { - m_currentSelectIndex = m_avatarItemModel->index(-1, 0); - } - - for (int i = 1; i < m_avatarItemModel->rowCount(); ++i) { - auto currentItem = m_avatarItemModel->item(i); - if (currentItem->index() == m_currentSelectIndex) { - currentItem->setCheckState(Qt::Checked); - } else { - currentItem->setCheckState(Qt::Unchecked); - } - } - - return; - } - // check if is x button, if is x button, then delete the model, and request to remove the icon - if (index.data(Qt::CheckStateRole) == Qt::Checked) - return; - const QString filePath = index.data(SaveAvatarRole).toString(); - if (filePath.isEmpty()) { - QFileDialog dialog; - dialog.setNameFilter(tr("Images") + "(*.png *.bmp *.jpg *.jpeg)"); - QString dir = m_dconfig->value("avatarPath").toString(); - if (dir.isEmpty() || !QDir(dir).exists()) { - QStringList directory = - QStandardPaths::standardLocations(QStandardPaths::PicturesLocation); - if (!directory.isEmpty()) { - dialog.setDirectory(directory.first()); - } - } else { - dialog.setDirectory(dir); - } - if (dialog.exec() == QFileDialog::Accepted) { - const QString path = dialog.selectedFiles().first(); - QFileInfo info(path); - - m_dconfig->setValue("avatarPath", info.absolutePath()); - - int row = -1; - for (int i = 1; i < m_avatarItemModel->rowCount(); ++i) { - if (path == m_avatarItemModel->index(i, 0).data(AvatarListView::SaveAvatarRole)) { - row = i; - break; - } - } - - if (row == -1) { - return addCustomAvatar(path); - } - - onItemClicked(m_avatarItemModel->index(row, 0)); - } - } else { - if (m_currentSelectIndex.isValid()) - m_avatarItemModel->item(m_currentSelectIndex.row())->setCheckState(Qt::Unchecked); - - m_currentSelectIndex = index; - m_avatarItemModel->item(m_currentSelectIndex.row())->setCheckState(Qt::Checked); - m_avatarItemModel->item(m_currentSelectIndex.row()) - ->setData(QVariant::fromValue(filePath), AvatarListView::SaveAvatarRole); - Q_EMIT requestUpdateListView(m_save, m_currentAvatarRole, m_currentAvatarType); - m_save = false; - } -} - -void AvatarListView::saveAvatar(const QString &path) -{ - m_updateItem = true; - - addCustomAvatar(path); -} - -QString AvatarListView::getAvatarPath() const -{ - if (!m_currentSelectIndex.isValid()) - return QString(); - - auto index = m_currentSelectIndex.row(); - auto idx = m_avatarItemModel->index(index, 0); - return m_avatarItemModel->data(idx, SaveAvatarRole).toString(); -} - -void AvatarListView::setCurrentAvatarChecked(const QString &avatar) -{ - if (avatar.isEmpty()) - return; - - QString currentAvatar = avatar; - const QString urlPre = "file://"; - // 如果是默认的头像, 需要将路径换成实际的路径 - if (currentAvatar.contains("default")) { - const auto defaultAvatar = - QString("%1%2/%3").arg(urlPre).arg(VarDirectory).arg(DefaultAvatar); - currentAvatar = defaultAvatar; - } - - if (currentAvatar.startsWith(urlPre)) - currentAvatar = QUrl(currentAvatar).toLocalFile(); - - if (!QFile(currentAvatar).exists()) - return; - - if (currentAvatar.isEmpty()) - return; - - for (int i = 0; i < m_avatarItemModel->rowCount(); ++i) { - QString itemAvatar = m_avatarItemModel->index(i, 0) - .data(AvatarListView::SaveAvatarRole) - .value(); - if (currentAvatar != itemAvatar) - continue; - - if (m_currentSelectIndex.isValid()) { - m_avatarItemModel->setData(m_currentSelectIndex, Qt::Unchecked, Qt::CheckStateRole); - } - m_avatarItemModel->item(i)->setCheckState(Qt::Checked); - m_currentSelectIndex = m_avatarItemModel->index(i, 0); - break; - } -} diff --git a/dcc-old/src/plugin-accounts/window/avatarlistview.h b/dcc-old/src/plugin-accounts/window/avatarlistview.h deleted file mode 100644 index 59e7aba132..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistview.h +++ /dev/null @@ -1,102 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef AVATARLISVIEW_H -#define AVATARLISVIEW_H - -#include "interface/namespace.h" -#include "src/plugin-accounts/operation/user.h" - -#include - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QLabel; -class QListView; -class QStandardItemModel; -class QModelIndex; -class QFileDialog; -QT_END_NAMESPACE - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -namespace DCC_NAMESPACE { -class AvatarItemDelegate; - -enum Role { Person, Animal, Scenery, Illustration, Expression, Custom, AvatarAdd }; - -enum Type { - Cartoon, // 卡通风格 - Dimensional, // 立体风格 - Flat // 平面风格 -}; - -class AvatarListView : public DTK_WIDGET_NAMESPACE::DListView -{ - Q_OBJECT -public: - enum ItemRole { - AddAvatarRole = Dtk::UserRole + 1, - SaveAvatarRole, - }; - -public: - AvatarListView(User *user, const int &role, - const int &type, - const QString &path, - QWidget *parent = nullptr); - virtual ~AvatarListView(); - - inline int getCurrentListViewRole() const { return m_currentAvatarRole; } - inline int getCurrentListViewType() const { return m_currentAvatarType; } - inline QSize avatarSize() const { return m_avatarSize; } - - void addCustomAvatar(const QString &path); - void addLastItem(); - void saveAvatar(const QString &path); - void addItemFromDefaultDir(const QString &path); - - QString getAvatarPath() const; - -Q_SIGNALS: - void requestUpdateListView(bool isSave, const int &role, const int &type); - void requestDeleteUserIcon(const QString &iconPath); - -public Q_SLOTS: - void setCurrentAvatarChecked(const QString &avatar); - void setCurrentAvatarUnChecked(); - void requestAddCustomAvatar(const QString &path); - void requestUpdateCustomAvatar(const QString &path); - -protected: - void updateGeometries() override; - bool eventFilter(QObject *obj, QEvent *event) override; - -private: - void initWidgets(); - QStandardItem *getCustomAvatar(); - bool checkIsToDeleteAvatar(const QModelIndex &index); - -private Q_SLOTS: - void onItemClicked(const QModelIndex &index); - -private: - bool m_updateItem = false; - bool m_save = false; - int m_currentAvatarRole; - int m_currentAvatarType; - QString m_path; - QStandardItemModel *m_avatarItemModel; - AvatarItemDelegate *m_avatarItemDelegate; - QSize m_avatarSize; - QModelIndex m_currentSelectIndex; - User *m_curUser; - DTK_CORE_NAMESPACE::DConfig *m_dconfig; -}; -} // namespace DCC_NAMESPACE - -#endif // AVATARLISVIEW_H diff --git a/dcc-old/src/plugin-accounts/window/avatarlistwidget.cpp b/dcc-old/src/plugin-accounts/window/avatarlistwidget.cpp deleted file mode 100644 index f2e0446174..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistwidget.cpp +++ /dev/null @@ -1,298 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "avatarlistwidget.h" - -#include "src/plugin-accounts/operation/user.h" -#include "widgets/buttontuple.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -static QScrollArea *get_new_scrollarea(QWidget *parent) -{ - QScrollArea *avatarArea = new QScrollArea(parent); - avatarArea->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); - avatarArea->setWidgetResizable(true); - avatarArea->setFrameShape(QFrame::NoFrame); - return avatarArea; -} - -AvatarListDialog::AvatarListDialog(User *usr, AccountsWorker *worker, QWidget *parent) - : Dtk::Widget::DAbstractDialog(parent) - , m_worker(worker) - , m_curUser(usr) - , m_mainContentLayout(new QHBoxLayout) - , m_leftContentLayout(new QVBoxLayout) - , m_rightContentLayout(new QVBoxLayout) - , m_avatarSelectItem(new DListView(this)) - , m_avatarSelectItemModel(new QStandardItemModel(this)) - , m_path(std::nullopt) -{ - m_mainContentLayout->setContentsMargins(0, 0, 0, 0); - m_rightContentLayout->setContentsMargins(0, 0, 0, 0); - - // 窗口Icon - QLabel *iconLabel = new QLabel(this); - iconLabel->setPixmap(qApp->windowIcon().pixmap(QSize(40, 40))); - - // 窗口关闭按钮 - auto closeBtn = new DDialogCloseButton(this); - closeBtn->setIcon(DStyle().standardIcon(DStyle::SP_DialogCloseButton)); - closeBtn->setIconSize(QSize(30, 30)); - QHBoxLayout *closeBtnLayout = new QHBoxLayout; - closeBtnLayout->setContentsMargins(0, 0, 0, 10); - closeBtnLayout->addStretch(); - closeBtnLayout->addWidget(closeBtn); - - connect(closeBtn, &QPushButton::clicked, this, &QDialog::reject); - - m_rightContentLayout->addLayout(closeBtnLayout); - - QList items = { - AvatarItem(tr("Person"), "dcc_user_human", Role::Person, true), - AvatarItem(tr("Animal"), "dcc_user_animal", Role::Animal, true), - AvatarItem(tr("Scenery"), "dcc_user_scenery", Role::Scenery, true), - AvatarItem(tr("Illustration"), "dcc_user_funny", Role::Illustration, true), - AvatarItem(tr("Expression"), "dcc_user_emoji", Role::Expression, true), - AvatarItem(tr("Custom Picture"), "dcc_user_custom", Role::Custom, true), - }; - - for (const auto &item : items) { - if (item.isLoader) { - DStandardItem *avatarItem = new DStandardItem(item.name); - avatarItem->setFontSize(DFontSizeManager::SizeType::T5); - avatarItem->setIcon(DIconTheme::findQIcon(item.icon)); - avatarItem->setData(item.role, AvatarItemNameRole); - m_avatarSelectItemModel->appendRow(avatarItem); - - if (item.role == Role::Custom) { - m_avatarFrames[AvatarAdd] = - new CustomAddAvatarWidget(m_curUser, Role::Custom, this); - m_avatarFrames[Role::Custom] = - new CustomAvatarWidget(m_curUser, Role::Custom, this); - } else { - m_avatarFrames[item.role] = new AvatarListFrame(m_curUser, item.role, this); - } - } - } - - // 添加选择Item - m_avatarSelectItem->setModel(m_avatarSelectItemModel); - m_avatarSelectItem->setIconSize(QSize{ 16, 16 }); - m_avatarSelectItem->setAccessibleName("List_AvatarSelect"); - m_avatarSelectItem->setFrameShape(QFrame::NoFrame); - m_avatarSelectItem->setItemSpacing(2); - m_avatarSelectItem->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_avatarSelectItem->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_avatarSelectItem->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - m_leftContentLayout->setContentsMargins(10, 0, 0, 0); - m_leftContentLayout->addWidget(iconLabel); - m_leftContentLayout->addSpacing(12); - m_leftContentLayout->addWidget(m_avatarSelectItem); - - QHBoxLayout *hLayout = new QHBoxLayout(); - hLayout->setContentsMargins(0, 10, 0, 10); - hLayout->addLayout(m_leftContentLayout); - - QFrame *avarSelectWidget = new QFrame(this); - avarSelectWidget->setFixedSize(180, 472); - avarSelectWidget->setLayout(hLayout); - - m_mainContentLayout->addWidget(avarSelectWidget); - - QStackedWidget *avatarSelectWidget = new QStackedWidget(this); - avatarSelectWidget->setFixedWidth(450); - - for (const auto &frame : m_avatarFrames) { - auto scrolllarea = get_new_scrollarea(this); - scrolllarea->setWidget(frame); - avatarSelectWidget->addWidget(scrolllarea); - - auto listView = frame->getCurrentListView(); - if (!listView || listView->getCurrentListViewRole() == Role::AvatarAdd) { - continue; - } - connect(listView, - &AvatarListView::requestUpdateListView, - this, - &AvatarListDialog::handleListViewRequestUpdate); - if (listView->getCurrentListViewRole() == Role::Custom) { - connect(listView, - &AvatarListView::requestDeleteUserIcon, - this, - &AvatarListDialog::handleRequestDeleteIcon); - } - } - - m_currentSelectAvatarWidget = m_avatarFrames[Person]; - - connect(m_avatarSelectItem, &DListView::clicked, this, [this, avatarSelectWidget](auto &index) { - // 如果没有添加自定义头像, 显示自定义添加图像页面 - if (!m_avatarFrames[Custom]->isExistCustomAvatar(m_avatarFrames[Custom]->getCurrentPath(), - m_curUser->name())) { - if (index.row() == Custom) { - avatarSelectWidget->setCurrentIndex(index.row() + 1); - m_currentSelectAvatarWidget = m_avatarFrames[Custom]; - - return; - } - } - - // 切换到自定义头像界面, 更新用户头像编辑页面 - if (index.row() == Custom) { - getCustomAvatarWidget()->getCustomAvatarView()->setAvatarPath( - m_avatarFrames[Custom]->getCurrentListView()->getAvatarPath()); - } - - if (auto customFrame = qobject_cast(m_avatarFrames[Custom])) { - customFrame->stopAvatarModify(); - } - - avatarSelectWidget->setCurrentIndex(index.row()); - QScrollArea *area = static_cast(avatarSelectWidget->currentWidget()); - m_currentSelectAvatarWidget = static_cast(area->widget()); - }); - - QHBoxLayout *avatarLayout = new QHBoxLayout(); - avatarLayout->addWidget(avatarSelectWidget, Qt::AlignCenter); - m_rightContentLayout->addLayout(avatarLayout); - - // 添加(关闭,保存)按钮 - auto buttonTuple = new ButtonTuple(ButtonTuple::Save, this); - auto cancelButton = buttonTuple->leftButton(); - cancelButton->setText(tr("Cancel")); - auto saveButton = buttonTuple->rightButton(); - saveButton->setText(tr("Save")); - QHBoxLayout *btnLayout = new QHBoxLayout(); - btnLayout->setContentsMargins(10, 10, 10, 10); - btnLayout->addWidget(cancelButton); - btnLayout->addSpacing(10); - btnLayout->addWidget(saveButton); - - connect(getCustomAvatarWidget()->getCustomAvatarView(), - &CustomAvatarView::requestSaveCustomAvatar, - m_avatarFrames[Custom]->getCurrentListView(), - &AvatarListView::saveAvatar); - - connect(static_cast(m_avatarFrames[AvatarAdd]), - &CustomAddAvatarWidget::requestUpdateCustomWidget, - this, - [avatarSelectWidget, this](const QString &path) { - m_currentSelectAvatarWidget = m_avatarFrames[Custom]; - avatarSelectWidget->setCurrentIndex(Custom); - m_currentSelectAvatarWidget->getCurrentListView()->requestAddCustomAvatar(path); - }); - - connect(saveButton, &QPushButton::clicked, this, [this]() { - const QString path = getAvatarPath(); - if (!path.isEmpty() && path != m_curUser->currentAvatar()) { - m_path = path; - } - // 成功设置头像后关闭窗口 - accept(); - }); - connect(cancelButton, &QPushButton::clicked, this, &QDialog::reject); - - m_rightContentLayout->addLayout(btnLayout); - - QFrame *frame = new QFrame(this); - frame->setLayout(m_rightContentLayout); - QPalette pa(DDialog().palette()); - pa.setColor(QPalette::Base, pa.color(QPalette::Window)); - frame->setAutoFillBackground(true); - frame->setPalette(pa); - - m_avatarSelectItem->setCurrentIndex(m_avatarSelectItem->model()->index(0, 0)); - m_mainContentLayout->addWidget(frame); - - setLayout(m_mainContentLayout); - - setFixedSize(640, 472); - installEventFilter(this); -} - -AvatarListDialog::~AvatarListDialog() -{ - if (m_avatarSelectItemModel) { - m_avatarSelectItemModel->clear(); - m_avatarSelectItemModel->deleteLater(); - m_avatarSelectItemModel = nullptr; - } - - m_avatarFrames.clear(); -} - -CustomAvatarWidget *AvatarListDialog::getCustomAvatarWidget() -{ - return static_cast(m_avatarFrames[Custom]); -} - -QString AvatarListDialog::getAvatarPath() const -{ - return m_currentSelectAvatarWidget->getAvatarPath(); -} - -void AvatarListDialog::handleRequestDeleteIcon(const QString &iconPath) -{ - m_worker->deleteUserIcon(m_curUser, iconPath); -} - -void AvatarListDialog::handleListViewRequestUpdate(bool isSave, const int &role, const int &type) -{ - - Q_UNUSED(type); - - for (auto frame : m_avatarFrames) { - if (frame->getCurrentRole() != role) { - if (frame->getCurrentListView()) { - frame->getCurrentListView()->setCurrentAvatarUnChecked(); - } - } - } - - if (role != Custom) { - return; - } - // 如果是新添加进来的用户头像, 先保存, 然后再更新用户头像编辑界面 - if (isSave) { - m_worker->setAvatar(m_curUser, m_avatarFrames[role]->getCurrentListView()->getAvatarPath()); - - connect(m_curUser, &User::currentAvatarChanged, this, [this](const QString &path) { - if (path.contains(m_avatarFrames[Custom]->getCurrentPath())) { - getCustomAvatarWidget()->getCurrentListView()->requestUpdateCustomAvatar(path); - getCustomAvatarWidget()->getCustomAvatarView()->setAvatarPath( - m_avatarFrames[Custom]->getCurrentListView()->getAvatarPath()); - } - }); - - return; - } - - getCustomAvatarWidget()->getCustomAvatarView()->setAvatarPath( - m_avatarFrames[role]->getCurrentListView()->getAvatarPath()); -} diff --git a/dcc-old/src/plugin-accounts/window/avatarlistwidget.h b/dcc-old/src/plugin-accounts/window/avatarlistwidget.h deleted file mode 100644 index 5ce9f23a89..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarlistwidget.h +++ /dev/null @@ -1,80 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "avatarlistframe.h" -#include "avatarlistview.h" -#include "interface/namespace.h" -#include "operation/accountsworker.h" - -#include -#include -#include - -#include -#include -#include -#include - -#include - -DWIDGET_BEGIN_NAMESPACE -class DFrame; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { -class CustomAddAvatarWidget; -class CustomAvatarWidget; - -class AvatarListDialog : public Dtk::Widget::DAbstractDialog -{ - Q_OBJECT -public: - // 头像选择项 - struct AvatarItem - { - QString name; - QString icon; - int role; - bool isLoader; - - AvatarItem(const QString &_name, - const QString &_icon, - const int &_role, - const bool &_isLoader) - : name(_name) - , icon(_icon) - , role(_role) - , isLoader(_isLoader) - { - } - }; - - enum AvatarItemRole { AvatarItemNameRole = DTK_NAMESPACE::UserRole + 1, AvatarItemIconRole }; - - explicit AvatarListDialog(User *user, AccountsWorker *m_worker, QWidget *parent = nullptr); - virtual ~AvatarListDialog(); - - QString getAvatarPath() const; - - inline std::optional get_path() const { return m_path; } - -private: - CustomAvatarWidget *getCustomAvatarWidget(); - void handleListViewRequestUpdate(bool isSave, const int &role, const int &type); - void handleRequestDeleteIcon(const QString &iconPath); - -private: - AccountsWorker *m_worker; - User *m_curUser{ nullptr }; - QHBoxLayout *m_mainContentLayout; - QVBoxLayout *m_leftContentLayout; - QVBoxLayout *m_rightContentLayout; - DTK_WIDGET_NAMESPACE::DListView *m_avatarSelectItem; - QStandardItemModel *m_avatarSelectItemModel; - AvatarListFrame *m_currentSelectAvatarWidget; - QMap m_avatarFrames; - std::optional m_path; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/avatarwidget.cpp b/dcc-old/src/plugin-accounts/window/avatarwidget.cpp deleted file mode 100644 index 5b957455e9..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarwidget.cpp +++ /dev/null @@ -1,222 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "avatarwidget.h" - -#include "widgets/accessibleinterface.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; - -// SET_LABEL_ACCESSIBLE(AvatarWidget, "avatarwidget") -AvatarWidget::AvatarWidget(QWidget *parent) - : QLabel(parent) - , m_hover(false) - , m_deleable(false) - , m_selected(false) - , m_arrowed(false) -{ - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setMargin(0); - mainLayout->setSpacing(0); - - setLayout(mainLayout); - setFixedSize(PIX_SIZE, PIX_SIZE); - setObjectName("AvatarWidget"); -} - -AvatarWidget::AvatarWidget(const QString &avatar, QWidget *parent) - : AvatarWidget(parent) -{ - setAvatarPath(avatar); -} - -void AvatarWidget::setSelected(const bool selected) -{ - m_selected = selected; - update(); -} - -void AvatarWidget::setDeletable(const bool deletable) -{ - m_deleable = deletable; - update(); -} - -void AvatarWidget::setArrowed(const bool arrowed) -{ - m_arrowed = arrowed; - update(); -} - -const QString AvatarWidget::avatarPath() const -{ - const auto ratio = devicePixelRatioF(); - - if (ratio > 1.0) - return QString(m_avatarPath).replace("icons/bigger/", "icons/"); - - return m_avatarPath; -} - -void AvatarWidget::setAvatarPath(const QString &avatar) -{ - const auto ratio = devicePixelRatioF(); - - QString avatarPath = avatar; - if (ratio > 1.0) - avatarPath.replace("icons/", "icons/bigger/"); - - QUrl url(avatarPath); - if (!QFile(url.toLocalFile()).exists()) - url = QUrl(avatar); - - m_avatarPath = url.toString(); - - if (!QPixmap(url.toLocalFile()).isNull()) { - m_avatar = QPixmap(url.toLocalFile()) - .scaled(size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); - m_avatar.setDevicePixelRatio(ratio); - } - - setAccessibleName(m_avatarPath); - - update(); -} - -void AvatarWidget::mouseReleaseEvent(QMouseEvent *e) -{ - if (rect().contains(e->pos())) - Q_EMIT clicked(avatarPath()); - - QWidget::mouseReleaseEvent(e); -} - -void AvatarWidget::paintEvent(QPaintEvent *e) -{ - QPainterPath painterPath; - painterPath.addRect(QRect(0, 0, width(), height())); - - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.setClipPath(painterPath); - - painter.drawPixmap(rect(), m_avatar); - - QRect picRect = rect(); - // second draw picture rounded rect bound - QPen pen; - pen.setColor(palette().base().color()); - painter.setPen(pen); - painter.drawRoundedRect(picRect, 8, 8); - - // third fill space with base brush - QPainterPath picPath; - picPath.addRect(picRect); - QPainterPath roundPath; - roundPath.addRoundedRect(picRect, 8, 8); - QPainterPath anglePath = picPath - roundPath; - painter.fillPath(anglePath, palette().base().color()); - painter.strokePath(picPath, palette().base().color()); - - if (m_selected) { - setAccessibleDescription("selectedIcon"); - QPen penSelected(Qt::transparent); - penSelected.setWidth(4); - penSelected.setColor(Qt::white); - painter.setPen(penSelected); - painter.setBrush(Qt::transparent); - painter.drawEllipse(rect()); - }; - - // 当鼠标移动到图像上面 - if (m_hover) { - painter.setPen(Qt::NoPen); - // 宽高 - int w = this->rect().width(); - int h = this->rect().height(); - // 矩形 - QRect rect(4, h - h / 4, w - 8, h - h / 4); - // 反走样 - painter.setRenderHint(QPainter::Antialiasing, true); - // 设置渐变色 - QLinearGradient linear(QPoint(0, h - h / 4), QPoint(0, h)); - linear.setColorAt(0, QColor(0, 0, 0, 0.00 * 255)); - linear.setColorAt(1, QColor(0, 0, 0, 0.50 * 255)); - - // 设置显示模式 - linear.setSpread(QGradient::PadSpread); - painter.setBrush(linear); - painter.drawEllipse(rect); - } - - if (!m_arrowed) { - QPen penNoArrowed(Qt::transparent); - penNoArrowed.setWidth(2); - penNoArrowed.setColor(Qt::white); - painter.setPen(penNoArrowed); - // 把直径平均分成10份 - int portion = this->rect().width() / 10; - // 圆中心点坐标 - QPoint cpt = this->rect().center(); - // 绘制左边直线 - painter.drawLine(QPoint(cpt.x() - portion / 2, cpt.y() + portion * 4 - portion / 2), - QPoint(cpt.x(), cpt.y() + portion * 4)); - // 绘制右边直线 - painter.drawLine(QPoint(cpt.x() + portion / 2, cpt.y() + portion * 4 - portion / 2), - QPoint(cpt.x(), cpt.y() + portion * 4)); - } else { - QPen penArrowed(Qt::transparent); - penArrowed.setWidth(2); - penArrowed.setColor(Qt::white); - painter.setPen(penArrowed); - // 把直径平均分成10份 - int portion = this->rect().width() / 10; - // 圆中心点坐标 - QPoint cpt = this->rect().center(); - // 绘制左边直线 - painter.drawLine(QPoint(cpt.x() - portion / 2, cpt.y() + portion * 4), - QPoint(cpt.x(), cpt.y() + portion * 4 - portion / 2)); - // 绘制右边直线 - painter.drawLine(QPoint(cpt.x() + portion / 2, cpt.y() + portion * 4), - QPoint(cpt.x(), cpt.y() + portion * 4 - portion / 2)); - } - - QWidget::paintEvent(e); -} - -void AvatarWidget::enterEvent(QEvent *) -{ - m_hover = true; - update(); -} - -void AvatarWidget::leaveEvent(QEvent *) -{ - m_hover = false; - update(); -} - -void AvatarWidget::resizeEvent(QResizeEvent *event) -{ - QWidget::resizeEvent(event); - - const auto ratio = devicePixelRatioF(); - - QUrl url(m_avatarPath); - m_avatar = QPixmap(url.toLocalFile()) - .scaled(size() * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); - m_avatar.setDevicePixelRatio(ratio); - - update(); -} diff --git a/dcc-old/src/plugin-accounts/window/avatarwidget.h b/dcc-old/src/plugin-accounts/window/avatarwidget.h deleted file mode 100644 index 35759066ec..0000000000 --- a/dcc-old/src/plugin-accounts/window/avatarwidget.h +++ /dev/null @@ -1,57 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef AVATARWIDGET_H -#define AVATARWIDGET_H - -#include "interface/namespace.h" - -#include -#include - -#define PIX_SIZE 60 - -namespace DCC_NAMESPACE { - -class AvatarWidget : public QLabel -{ - Q_OBJECT - -public: - explicit AvatarWidget(QWidget *parent = 0); - explicit AvatarWidget(const QString &avatar, QWidget *parent = 0); - - void setSelected(const bool selected = true); - void setDeletable(const bool deletable = true); - - const QString avatarPath() const; - void setAvatarPath(const QString &avatar); - - void setArrowed(const bool arrowed = true); - - inline bool arrowed() const { return m_arrowed; } - -Q_SIGNALS: - void clicked(const QString &iconPath) const; - void requestDelete(const QString &iconPath) const; - -protected: - void mouseReleaseEvent(QMouseEvent *e); - void paintEvent(QPaintEvent *e); - void enterEvent(QEvent *); - void leaveEvent(QEvent *); - void resizeEvent(QResizeEvent *event); - -private: - bool m_hover; - bool m_deleable; - bool m_selected; - bool m_arrowed; - - QPixmap m_avatar; - QString m_avatarPath; -}; - -} // namespace DCC_NAMESPACE - -#endif // AVATARWIDGET_H diff --git a/dcc-old/src/plugin-accounts/window/createaccountpage.cpp b/dcc-old/src/plugin-accounts/window/createaccountpage.cpp deleted file mode 100644 index b4c18d1a4f..0000000000 --- a/dcc-old/src/plugin-accounts/window/createaccountpage.cpp +++ /dev/null @@ -1,650 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "createaccountpage.h" - -#include "groupitem.h" -#include "pwqualitymanager.h" -#include "securitylevelitem.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -CreateAccountPage::CreateAccountPage(AccountsWorker *accountsWorker, QWidget *parent) - : DAbstractDialog(false, parent) - , m_newUser{ nullptr } - , m_accountWorker(accountsWorker) - , m_nameEdit(new LineEditWidget) - , m_fullnameEdit(new LineEditWidget) - , m_passwdEdit(new DPasswordEdit) - , m_repeatpasswdEdit(new DPasswordEdit) - , m_passwdTipsEdit(new DLineEdit) - , m_accountChooser(new ComboxWidget()) - , m_groupListView(nullptr) - , m_groupItemModel(nullptr) - , m_groupTip(new QLabel(tr("Group"))) - , m_securityLevelItem(new SecurityLevelItem(this)) -{ - m_passwdEdit->setCopyEnabled(false); - m_passwdEdit->setCutEnabled(false); - - m_repeatpasswdEdit->setCopyEnabled(false); - m_repeatpasswdEdit->setCutEnabled(false); - - m_groupListView = new DCCListView(this); - m_isServerSystem = DSysInfo::UosServer == DSysInfo::uosType(); - QVBoxLayout *mainContentLayout = new QVBoxLayout; - mainContentLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame); // 无边框 - titleIcon->setBackgroundTransparent(true); // 透明 - titleIcon->setMenuVisible(false); - titleIcon->setIcon(qApp->windowIcon()); - mainContentLayout->addWidget(titleIcon); - setLayout(mainContentLayout); - - m_tw = new QWidget(this); - QVBoxLayout *contentLayout = new QVBoxLayout(m_tw); - contentLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - contentLayout->setSpacing(0); - contentLayout->setContentsMargins(0, 0, 0, 0); - mainContentLayout->addWidget(m_tw); - - initWidgets(contentLayout); - initUsrGroup(contentLayout); - - QHBoxLayout *btnLayout = new QHBoxLayout; - btnLayout->setMargin(0); - - QPushButton *cancleBtn = new QPushButton(tr("Cancel")); - DSuggestButton *addBtn = new DSuggestButton(tr("Create")); - cancleBtn->setDefault(true); - addBtn->setDefault(true); - btnLayout->addWidget(cancleBtn); - btnLayout->addWidget(addBtn); - mainContentLayout->addSpacing(0); - mainContentLayout->addLayout(btnLayout); - - connect(cancleBtn, &QPushButton::clicked, this, &CreateAccountPage::reject); - connect(addBtn, &DSuggestButton::clicked, this, &CreateAccountPage::createUser); - resize(460, -1); -} - -CreateAccountPage::~CreateAccountPage() -{ - m_repeatpasswdEdit->hideAlertMessage(); -} - -void CreateAccountPage::resizeEvent(QResizeEvent *e) -{ - Q_UNUSED(e); -} - -void CreateAccountPage::initUsrGroup(QVBoxLayout *layout) -{ - m_groupItemModel = new QStandardItemModel(this); - m_groupListView->setModel(m_groupItemModel); - m_groupListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_groupListView->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - m_groupListView->setSelectionMode(QAbstractItemView::NoSelection); - m_groupListView->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); - m_groupListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_groupListView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_groupListView->setSpacing(1); - connect(m_groupListView, &DListView::clicked, this, [=](const QModelIndex &index) { - QStandardItem *item = m_groupItemModel->item(index.row(), index.column()); - Qt::CheckState state = item->checkState(); - if (state == Qt::Checked) { - item->setCheckState(Qt::Unchecked); - } else { - item->setCheckState(Qt::Checked); - } - m_groupItemModel->sort(0); - }); - layout->addWidget(m_groupTip); - layout->addSpacing(10); - layout->addWidget(m_groupListView); - - if (m_accountChooser->comboBox()->currentIndex() != 2) { - m_groupTip->setVisible(false); - m_groupListView->setVisible(false); - } -} - -void CreateAccountPage::initWidgets(QVBoxLayout *layout) -{ - TitleLabel *titleLabel = new TitleLabel(tr("New User")); - titleLabel->setAlignment(Qt::AlignCenter); - layout->addWidget(titleLabel); - layout->addSpacing(30); - - /* 用户类型 */ - m_accountChooser->setTitle(tr("User Type")); - m_accountChooser->addBackground(); - - layout->addWidget(m_accountChooser); - layout->addSpacing(7); - - SettingsGroup *nameGroup = new SettingsGroup(nullptr, SettingsGroup::GroupBackground); - m_nameEdit->setTitle(tr("Username") + ':'); - m_nameEdit->setAccessibleName("username_edit"); - nameGroup->insertWidget(m_nameEdit); - - m_fullnameEdit->setTitle(tr("Full Name") + ':'); - m_fullnameEdit->setAccessibleName("fullname_edit"); - nameGroup->insertWidget(m_fullnameEdit); - layout->addWidget(nameGroup); - layout->addSpacing(7); - - layout->addWidget(m_securityLevelItem, 0, Qt::AlignRight | Qt::AlignVCenter); - - SettingsGroup *passwdGroup = new SettingsGroup(nullptr, SettingsGroup::GroupBackground); - QLabel *passwdLabel = new QLabel(tr("Password") + ':'); - passwdLabel->setFixedWidth(110); - m_passwdEdit->setAccessibleName("passwd_edit"); - - QHBoxLayout *passwdLayout = new QHBoxLayout; - passwdLayout->setContentsMargins(10, 0, 10, 0); - passwdLayout->addWidget(passwdLabel, 0, Qt::AlignVCenter); - passwdLayout->addWidget(m_passwdEdit, 0, Qt::AlignVCenter); - SettingsItem *passwdItem = new SettingsItem(); - passwdItem->setLayout(passwdLayout); - passwdGroup->appendItem(passwdItem); - - QLabel *repeatpasswdLabel = new QLabel(tr("Repeat Password") + ':'); - repeatpasswdLabel->setFixedWidth(110); - m_repeatpasswdEdit->setAccessibleName("repeatpasswd_edit"); - - QHBoxLayout *repeatpasswdLayout = new QHBoxLayout; - repeatpasswdLayout->setContentsMargins(10, 0, 10, 0); - repeatpasswdLayout->addWidget(repeatpasswdLabel, 0, Qt::AlignVCenter); - repeatpasswdLayout->addWidget(m_repeatpasswdEdit, 0, Qt::AlignVCenter); - SettingsItem *repeatpasswdItem = new SettingsItem(); - repeatpasswdItem->setLayout(repeatpasswdLayout); - passwdGroup->appendItem(repeatpasswdItem); - - QLabel *passwdTipsLabel = new QLabel(tr("Password Hint") + ':'); - passwdTipsLabel->setFixedWidth(110); - m_passwdTipsEdit->setAccessibleName("password_hint"); - - QHBoxLayout *passwdTipsLayout = new QHBoxLayout; - passwdTipsLayout->setContentsMargins(10, 0, 10, 0); - passwdTipsLayout->addWidget(passwdTipsLabel, 0, Qt::AlignVCenter); - passwdTipsLayout->addWidget(m_passwdTipsEdit, 0, Qt::AlignVCenter); - SettingsItem *passwdTipsItem = new SettingsItem(); - passwdTipsItem->setLayout(passwdTipsLayout); - passwdGroup->appendItem(passwdTipsItem); - - layout->addWidget(passwdGroup); - layout->addSpacing(27); - - connect(m_nameEdit->dTextEdit(), &DLineEdit::textEdited, this, [=](const QString &strText) { - Q_UNUSED(strText); - if (m_nameEdit->dTextEdit()->isAlert()) { - m_nameEdit->hideAlertMessage(); - m_nameEdit->dTextEdit()->setAlert(false); - } - - if (strText.isEmpty()) - return; - - QString strTemp; - int idx; - for (idx = 0; idx < strText.size(); ++idx) { - if ((strText[idx] >= '0' && strText[idx] <= '9') - || (strText[idx] >= 'a' && strText[idx] <= 'z') - || (strText[idx] >= 'A' && strText[idx] <= 'Z') - || (strText[idx] == '-' || strText[idx] == '_')) { - strTemp.append(strText[idx]); - } else { - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } - } - - m_nameEdit->dTextEdit()->lineEdit()->blockSignals(true); - int cursorIndex = m_nameEdit->dTextEdit()->lineEdit()->cursorPosition(); - m_nameEdit->dTextEdit()->lineEdit()->setText(strTemp); - m_nameEdit->dTextEdit()->lineEdit()->setCursorPosition(cursorIndex); - m_nameEdit->dTextEdit()->lineEdit()->blockSignals(false); - }); - - connect(m_nameEdit->dTextEdit(), - &DLineEdit::editingFinished, - this, - &CreateAccountPage::checkName); - connect(m_nameEdit->dTextEdit(), &DLineEdit::editingFinished, this, [this]() { - m_securityLevelItem->setUser(m_nameEdit->text()); - }); - - connect(m_fullnameEdit->dTextEdit(), - &DLineEdit::textEdited, - this, - [=](const QString &userFullName) { - /* 90401:在键盘输入下禁止冒号的输入,粘贴情况下自动识别冒号自动删除 */ - QString fullName = userFullName; - fullName.remove(":"); - if (fullName != userFullName) { - m_fullnameEdit->setText(fullName); - } - /* 在输入的过程中仅检查全名的长度,输入完成后检查其它规则 */ - if (fullName.size() > 32) { - m_fullnameEdit->dTextEdit()->lineEdit()->backspace(); - m_fullnameEdit->dTextEdit()->setAlert(true); - m_fullnameEdit->dTextEdit()->showAlertMessage(tr("The full name is too long"), - m_fullnameEdit, - 2000); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } else if (m_fullnameEdit->dTextEdit()->isAlert()) { - m_fullnameEdit->dTextEdit()->setAlert(false); - m_fullnameEdit->hideAlertMessage(); - } - }); - - connect(m_fullnameEdit->dTextEdit(), - &DLineEdit::editingFinished, - this, - &CreateAccountPage::checkFullname); - - // 失焦后就提示 - connect(m_passwdEdit, &DLineEdit::editingFinished, this, [=] { - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword( - m_nameEdit->dTextEdit()->lineEdit()->text(), - m_passwdEdit->lineEdit()->text()); - if (error != PwqualityManager::ERROR_TYPE::PW_NO_ERR) { - m_passwdEdit->setAlert(true); - m_passwdEdit->showAlertMessage(PwqualityManager::instance()->getErrorTips(error), - m_passwdEdit, - 2000); - } - }); - - // 失焦后就提示,只检查密码一致性 - connect(m_repeatpasswdEdit, &DLineEdit::editingFinished, this, [=] { - if (m_passwdEdit->lineEdit()->text() != m_repeatpasswdEdit->lineEdit()->text()) { - m_repeatpasswdEdit->setAlert(true); - m_repeatpasswdEdit->showAlertMessage(tr("Passwords do not match"), - m_repeatpasswdEdit, - 2000); - } - }); - - connect(m_passwdEdit, &DPasswordEdit::textEdited, this, [=] { - if (m_passwdEdit->isAlert()) { - m_passwdEdit->hideAlertMessage(); - m_passwdEdit->setAlert(false); - } - }); - m_securityLevelItem->setUser(m_nameEdit->text()); - m_securityLevelItem->bind(m_passwdEdit); - - connect(m_repeatpasswdEdit, &DPasswordEdit::textEdited, this, [=] { - if (m_repeatpasswdEdit->isAlert()) { - m_repeatpasswdEdit->hideAlertMessage(); - m_repeatpasswdEdit->setAlert(false); - } - }); - - connect(m_passwdTipsEdit, &DLineEdit::textEdited, this, [=](const QString &passwdTips) { - if (passwdTips.size() > 14) { - m_passwdTipsEdit->lineEdit()->backspace(); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } else if (m_passwdTipsEdit->isAlert()) { - m_passwdTipsEdit->setAlert(false); - } - }); - - connect(m_accountChooser->comboBox(), - &DComboBox::currentTextChanged, - this, - &CreateAccountPage::showGroupList); - - m_accountChooser->comboBox()->addItem(tr("Standard User")); - m_accountChooser->comboBox()->addItem(tr("Administrator")); - /* 仅在服务器模式下创建用户才能自定义用户组 */ - if (m_isServerSystem) { - m_accountChooser->comboBox()->addItem(tr("Customized")); - } - - m_nameEdit->dTextEdit()->lineEdit()->setPlaceholderText(tr("Required")); // 必填 - m_fullnameEdit->dTextEdit()->lineEdit()->setPlaceholderText(tr("optional")); // 选填 - m_passwdEdit->lineEdit()->setPlaceholderText(tr("Required")); // 必填 - m_repeatpasswdEdit->lineEdit()->setPlaceholderText(tr("Required")); // 必填 - m_passwdTipsEdit->lineEdit()->setPlaceholderText(tr("optional")); // 选填 -} - -void CreateAccountPage::showGroupList(const QString &index) -{ - Q_UNUSED(index) - - if (m_accountChooser->comboBox()->currentIndex() == 2) { - m_groupTip->setVisible(true); - m_groupListView->setVisible(true); - } else { - m_groupTip->setVisible(false); - m_groupListView->setVisible(false); - } -} - -void CreateAccountPage::setModel(UserModel *userModel, User *user) -{ - m_newUser = user; - Q_ASSERT(m_newUser); - m_userModel = userModel; - Q_ASSERT(m_userModel); - - if (!m_groupItemModel) { - return; - } - m_groupItemModel->clear(); - for (QString item : m_userModel->getAllGroups()) { - GroupItem *it = new GroupItem(item); - it->setCheckable(false); - m_groupItemModel->appendRow(it); - } - - QStringList presetGroup = m_userModel->getPresetGroups(); - int row_count = m_groupItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_groupItemModel->item(i, 0); - if (item) { - item->setCheckState(presetGroup.contains(item->text()) ? Qt::Checked : Qt::Unchecked); - } - } - m_groupItemModel->sort(0); - m_accountChooser->setCurrentIndex(user->userType()); -} - -// 在修改密码页面设置默认焦点 -void CreateAccountPage::showEvent(QShowEvent *event) -{ - if (m_accountChooser && m_accountChooser->isVisible() && m_accountChooser->isEnabled()) - m_accountChooser->setFocus(); - else if (m_nameEdit && !m_nameEdit->hasFocus()) { - m_nameEdit->dTextEdit()->lineEdit()->setFocus(); - } - QWidget::showEvent(event); -} - -void CreateAccountPage::createUser() -{ - bool check = false; - // 校验输入的用户名和密码 - if (!checkName()) { - check = true; - } - - if (!checkFullname()) { - check = true; - } - - bool needShowSafetyPage = false; - if (!checkPassword(m_repeatpasswdEdit, needShowSafetyPage)) { - check = true; - } - - if (!checkPassword(m_passwdEdit, needShowSafetyPage)) { - check = true; - } - - if (check) { - if (needShowSafetyPage) { - Q_EMIT requestCheckPwdLimitLevel(); - } - return; - } - - for (auto c : m_passwdEdit->text()) { - if (m_passwdTipsEdit->text().contains(c)) { - m_passwdTipsEdit->setAlert(true); - m_passwdTipsEdit->showAlertMessage( - tr("The hint is visible to all users. Do not include the password here."), - m_passwdTipsEdit, - 2000); - return; - } - } - - // 如果用户没有选图像, 则从系统头像中随机选择一张图像 - m_accountWorker->randomUserIcon(m_newUser); - m_newUser->setName(m_nameEdit->dTextEdit()->lineEdit()->text().simplified()); - m_newUser->setFullname(m_fullnameEdit->dTextEdit()->lineEdit()->text()); - m_newUser->setPassword(m_passwdEdit->lineEdit()->text()); - m_newUser->setRepeatPassword(m_repeatpasswdEdit->lineEdit()->text()); - m_newUser->setPasswordHint(m_passwdTipsEdit->lineEdit()->text()); - - /* 设置用户组 */ - if (m_accountChooser->comboBox()->currentIndex() == 1) { - m_newUser->setUserType(User::UserType::Administrator); - } else if (m_accountChooser->comboBox()->currentIndex() == 0) { - m_newUser->setUserType(User::UserType::StandardUser); - } else { - QStringList usrGroups; - int row_count = m_groupItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_groupItemModel->item(i, 0); - if (item->checkState() == Qt::Checked) { - usrGroups << item->text(); - } - } - m_newUser->setGroups(usrGroups); - m_newUser->setUserType(User::UserType::StandardUser); - } - setEnabled(false); - Q_EMIT requestCreateUser(m_newUser); // 请求创建用户 -} - -void CreateAccountPage::setCreationResult(CreationResult *result) -{ - setEnabled(true); - switch (result->type()) { - case CreationResult::NoError: - accept(); - break; - case CreationResult::UserNameError: - m_nameEdit->dTextEdit()->setAlert(true); - m_nameEdit->dTextEdit()->showAlertMessage(result->message(), m_nameEdit, 2000); - break; - case CreationResult::PasswordError: - m_passwdEdit->setAlert(true); - m_passwdEdit->showAlertMessage(result->message(), m_passwdEdit, 2000); - break; - case CreationResult::PasswordMatchError: - m_repeatpasswdEdit->setAlert(true); - m_repeatpasswdEdit->showAlertMessage(result->message(), m_repeatpasswdEdit, 2000); - break; // reserved for future server edition feature. - case CreationResult::UnknownError: - // 当用户名与用户组信息重名时,会返回UnknownError,并且提示信息是从系统中获取过来的,控制中心无法区分他的中英文 - qDebug() << "error encountered creating user: " << result->message(); - m_nameEdit->dTextEdit()->setAlert(true); - if (result->message() == "Policykit authentication failed") { - m_nameEdit->dTextEdit()->showAlertMessage(tr("Policykit authentication failed"), - m_nameEdit, - 2000); - } else { - m_nameEdit->dTextEdit()->showAlertMessage(result->message(), m_nameEdit, 2000); - } - break; - case CreationResult::Canceled: - // canceled - break; - } - - result->deleteLater(); -} - -bool CreateAccountPage::checkName() -{ - const QString &userName = m_nameEdit->dTextEdit()->lineEdit()->text(); - - QString alertMsg; - do { - if (userName.size() < 3 || userName.size() > 32) { - alertMsg = tr("Username must be between 3 and 32 characters"); - break; - } - - QRegularExpression letterOrNum("^[A-Za-z0-9]+"); - if (!letterOrNum.match(userName).hasMatch()) { - alertMsg = tr("The first character must be a letter or number"); - break; - } - - QRegularExpression onlyNums("^\\d+$"); - if (onlyNums.match(userName).hasMatch()) { - alertMsg = tr("Your username should not only have numbers"); - break; - } - - // username existed check, not check fullname! - // reply ==> (false, "the username existed", 4) - QDBusPendingReply reply = m_accountWorker->isUsernameValid(userName); - if (!reply.argumentAt(0).toBool() && ErrCodeExist == reply.argumentAt(2).toInt()) { - alertMsg = tr("The username has been used by other user accounts"); - break; - } - - // check fullname - QList userList = m_userModel->userList(); - auto ret = std::any_of(userList.begin(), userList.end(), [userName](const User * user) { - return userName == user->fullname(); - }); - - if (ret) { - alertMsg = tr("The username has been used by other user accounts"); - break; - } - - } while (false); - - - bool ok = alertMsg.isEmpty(); - m_nameEdit->dTextEdit()->setAlert(!ok); - - if (!ok) { - m_nameEdit->dTextEdit()->showAlertMessage(alertMsg, 2000); - } else { - m_nameEdit->hideAlertMessage(); // ?? - } - - return ok; -} - -bool CreateAccountPage::checkFullname() -{ - QString userFullName = m_fullnameEdit->dTextEdit()->lineEdit()->text(); - - QString alertMsg; - do { - if (userFullName.size() > 32) { - alertMsg = tr("The full name is too long"); - break; - } - - // 欧拉版会自己创建 shutdown 等 root 组账户且不会添加到 userList 中,导致无法重复性算法无效, - // 先通过 isUsernameValid 校验这些账户再通过重复性算法校验 - // vaild == false && code == 6 是用户名已存在 - QDBusPendingReply reply = m_accountWorker->isUsernameValid(userFullName); - if (!reply.argumentAt(0).toBool() && - ErrCodeSystemUsed == reply.argumentAt(2).toInt()) { - alertMsg = tr("The full name has been used by other user accounts"); - break; - } - - if (userFullName.simplified().isEmpty()) { - m_fullnameEdit->dTextEdit()->lineEdit()->clear(); // 输入全空格不保存 - break; - } - - QList userList = m_userModel->userList(); - auto ret = std::any_of(userList.begin(), userList.end(), [userFullName](User *user) { - return userFullName == user->fullname() || userFullName == user->name(); - }); - /* 与已有的用户全名和用户名进行重复性校验 */ - if (ret) { - alertMsg = tr("The full name has been used by other user accounts"); - break; - } - - QList groupList = m_userModel->getAllGroups(); - ret = std::any_of(groupList.begin(), groupList.end(), [userFullName](const QString &group) { - return userFullName == group; - }); - if (ret) { - alertMsg = tr("The full name has been used by other user accounts"); - break; - } - } while (false); - - bool ok = alertMsg.isEmpty(); - m_fullnameEdit->dTextEdit()->setAlert(!ok); - if (!ok) { - m_fullnameEdit->dTextEdit()->showAlertMessage(alertMsg, 2000); - m_fullnameEdit->dTextEdit()->lineEdit()->selectAll(); - } else { - m_fullnameEdit->hideAlertMessage(); // ?_? - } - - return ok; -} - -bool CreateAccountPage::checkPassword(DPasswordEdit *edit, bool &needShowSafetyPage) -{ - if (edit == m_repeatpasswdEdit) { - if (m_passwdEdit->lineEdit()->text() != m_repeatpasswdEdit->lineEdit()->text()) { - m_repeatpasswdEdit->setAlert(true); - m_repeatpasswdEdit->showAlertMessage(tr("Passwords do not match"), 2000); - return false; - } - } - - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword( - m_nameEdit->dTextEdit()->lineEdit()->text(), - edit->lineEdit()->text()); - - if (error != PwqualityManager::ERROR_TYPE::PW_NO_ERR) { - m_passwdEdit->setAlert(true); - const QString &msg = PwqualityManager::instance()->getErrorTips(error); - m_passwdEdit->showAlertMessage(msg, 2000); - - // 企业版控制中心用户创建屏蔽安全中心登录安全的接口需求 - if ((DSysInfo::uosEditionType() == DSysInfo::UosEnterprise) - || (DSysInfo::uosEditionType() == DSysInfo::UosEnterpriseC)) - return false; - - needShowSafetyPage = true; - - return false; - } else { - edit->setAlert(false); - edit->hideAlertMessage(); - } - - return true; -} diff --git a/dcc-old/src/plugin-accounts/window/createaccountpage.h b/dcc-old/src/plugin-accounts/window/createaccountpage.h deleted file mode 100644 index 0a5c319e5b..0000000000 --- a/dcc-old/src/plugin-accounts/window/createaccountpage.h +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "avatarlistwidget.h" -#include "interface/namespace.h" -#include "src/plugin-accounts/operation/accountsworker.h" -#include "src/plugin-accounts/operation/creationresult.h" -#include "src/plugin-accounts/operation/user.h" -#include "src/plugin-accounts/operation/usermodel.h" -#include "widgets/lineeditwidget.h" - -#include -#include -#include -#include -#include - -#include - -#define NAME_ALREADY 4 - -DWIDGET_USE_NAMESPACE - -class QScrollArea; -class QVBoxLayout; -class QHBoxLayout; -class QPushButton; -class QLabel; - -namespace DCC_NAMESPACE { -class ComboxWidget; -class SecurityLevelItem; - -const int PwdLimitLowestLevel = 1; - -// 创建账户页面 -class CreateAccountPage : public DAbstractDialog -{ - Q_OBJECT - -public: - enum PassWordType { NormalPassWord, IncludeBlankSymbol }; - - enum PassErrorCode { - ErrCodeEmpty = 1, - ErrCodeInvalidChar, - ErrCodeFirstCharInvalid, - ErrCodeExist, - ErrCodeNameExist, - ErrCodeSystemUsed, - ErrCodeLen - }; - -public: - explicit CreateAccountPage(AccountsWorker *accountsWorker, QWidget *parent = nullptr); - ~CreateAccountPage(); - void setModel(UserModel *userModel, User *user); - -private: - void initWidgets(QVBoxLayout *layout); - void initUsrGroup(QVBoxLayout *layout); - void createUser(); - void showGroupList(const QString &index); - -protected: - void showEvent(QShowEvent *event) override; - -Q_SIGNALS: - void requestCreateUser(const User *user); - void requestSetPasswordHint(User *, const QString &); - void requestCheckPwdLimitLevel(); - -public Q_SLOTS: - void setCreationResult(CreationResult *result); - -protected: - void resizeEvent(QResizeEvent *e) override; - -private Q_SLOTS: - bool checkName(); - bool checkFullname(); - bool checkPassword(DPasswordEdit *edit, bool &needShowSafetyPage); - -private: - User *m_newUser; - UserModel *m_userModel; - AccountsWorker *m_accountWorker; - LineEditWidget *m_nameEdit; - LineEditWidget *m_fullnameEdit; - DPasswordEdit *m_passwdEdit; - DPasswordEdit *m_repeatpasswdEdit; - Dtk::Widget::DLineEdit *m_passwdTipsEdit; - ComboxWidget *m_accountChooser; - DListView *m_groupListView; - QStandardItemModel *m_groupItemModel; - bool m_isServerSystem; - QWidget *m_tw; - QScrollArea *m_scrollArea; - QLabel *m_groupTip; - SecurityLevelItem *m_securityLevelItem; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-accounts/window/groupitem.h b/dcc-old/src/plugin-accounts/window/groupitem.h deleted file mode 100644 index d9ec4615d9..0000000000 --- a/dcc-old/src/plugin-accounts/window/groupitem.h +++ /dev/null @@ -1,26 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef GROUPITEM_H -#define GROUPITEM_H - -#include "interface/namespace.h" - -#include -#include -#include - -namespace DCC_NAMESPACE { -class GroupItem : public DTK_WIDGET_NAMESPACE::DStandardItem -{ -public: - using DStandardItem::DStandardItem; - bool operator<(const QStandardItem &other) const override { - if ( checkState() != other.checkState()) { - return checkState() > other.checkState(); - } - return text().toLower() < other.text().toLower(); - } -}; -} -#endif // GROUPITEM_H diff --git a/dcc-old/src/plugin-accounts/window/modifypasswdpage.cpp b/dcc-old/src/plugin-accounts/window/modifypasswdpage.cpp deleted file mode 100644 index b22299d82a..0000000000 --- a/dcc-old/src/plugin-accounts/window/modifypasswdpage.cpp +++ /dev/null @@ -1,409 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "modifypasswdpage.h" -#include "widgets/titlelabel.h" -#include "pwqualitymanager.h" -#include "createaccountpage.h" -#include "securitylevelitem.h" -#include "widgets/accessibleinterface.h" - -#include "deepin_pw_check.h" -#include "unionidbindreminderdialog.h" -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -#include - -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; -SET_FORM_ACCESSIBLE(ModifyPasswdPage,"ModifyPasswdPage") -ModifyPasswdPage::ModifyPasswdPage(User *user, bool isCurrent, QWidget *parent) - : DAbstractDialog(false, parent) - , m_curUser(user) - , m_oldPasswordEdit(new DPasswordEdit) - , m_newPasswordEdit(new DPasswordEdit) - , m_repeatPasswordEdit(new DPasswordEdit) - , m_passwordTipsEdit(new DLineEdit) - , m_isCurrent(isCurrent) - , m_isBindCheckError(false) - , m_securityLevelItem(new SecurityLevelItem(this)) -{ - initWidget(); - resize(460, -1); -} - -ModifyPasswdPage::~ModifyPasswdPage() -{ - -} - -void ModifyPasswdPage::initWidget() -{ - QVBoxLayout *mainContentLayout = new QVBoxLayout; - - mainContentLayout->setSpacing(4); - - auto titleBar = new DTitlebar(this); - - titleBar->setBackgroundTransparent(true); - - mainContentLayout->addWidget(titleBar); - - TitleLabel *titleLabel = new TitleLabel(tr("Change Password")); - mainContentLayout->addWidget(titleLabel, 0, Qt::AlignHCenter); - if (!m_isCurrent) { - titleLabel->setText(tr("Reset Password")); - QLabel *label = new QLabel(tr("Resetting the password will clear the data stored in the keyring.")); - label->setWordWrap(true); - mainContentLayout->addWidget(label, 0, Qt::AlignHCenter); - } - mainContentLayout->addSpacing(40); - - if (m_isCurrent) { - QLabel *oldPasswdLabel = new QLabel(tr("Current Password") + ":"); - m_forgetPasswordBtn = new DCommandLinkButton(tr("Forgot password?")); - DFontSizeManager::instance()->bind(m_forgetPasswordBtn, DFontSizeManager::T8); - m_forgetPasswordBtn->setVisible(!(DSysInfo::UosCommunity == DSysInfo::uosEditionType()) && getuid() < 9999); // 如果当前账户是域账号,则屏蔽重置密码入口 - connect(m_forgetPasswordBtn, &QPushButton::clicked, this, &ModifyPasswdPage::onForgetPasswordBtnClicked); - QHBoxLayout *hLayout = new QHBoxLayout; - hLayout->addWidget(oldPasswdLabel); - hLayout->addStretch(); - hLayout->addWidget(m_forgetPasswordBtn); - hLayout->addSpacing(45); - mainContentLayout->addLayout(hLayout); - mainContentLayout->addWidget(m_oldPasswordEdit); - } - - QHBoxLayout *newPasswdLayout = new QHBoxLayout; - QLabel *newPasswdLabel = new QLabel(tr("New Password") + ":"); - newPasswdLayout->addWidget(newPasswdLabel); - newPasswdLayout->addSpacing(80); - - newPasswdLayout->addWidget(m_securityLevelItem); - mainContentLayout->addSpacing(6); - mainContentLayout->addLayout(newPasswdLayout); - mainContentLayout->addWidget(m_newPasswordEdit); - - QLabel *repeatPasswdLabel = new QLabel(tr("Repeat Password") + ":"); - mainContentLayout->addSpacing(6); - mainContentLayout->addWidget(repeatPasswdLabel); - mainContentLayout->addWidget(m_repeatPasswordEdit); - - QLabel *passwdTipsLabel = new QLabel(tr("Password Hint") + ":"); - mainContentLayout->addSpacing(6); - mainContentLayout->addWidget(passwdTipsLabel); - mainContentLayout->addWidget(m_passwordTipsEdit); - mainContentLayout->addStretch(); - - QPushButton *cancleBtn = new QPushButton(tr("Cancel")); - DSuggestButton *saveBtn = new DSuggestButton(tr("Save")); - QHBoxLayout *cansaveLayout = new QHBoxLayout; - cansaveLayout->addWidget(cancleBtn); - cansaveLayout->addWidget(saveBtn); - mainContentLayout->addLayout(cansaveLayout); - setLayout(mainContentLayout); - cancleBtn->setDefault(true); - saveBtn->setDefault(true); - cancleBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - saveBtn->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - setPasswordEditAttribute(m_oldPasswordEdit); - setPasswordEditAttribute(m_newPasswordEdit); - setPasswordEditAttribute(m_repeatPasswordEdit); - - connect(cancleBtn, &QPushButton::clicked, this, &ModifyPasswdPage::reject); - - connect(saveBtn, &DSuggestButton::clicked, this, &ModifyPasswdPage::clickSaveBtn); - - connect(m_curUser, &User::passwordModifyFinished, this, &ModifyPasswdPage::onPasswordChangeFinished); - - connect(m_curUser, &User::passwordStatusChanged, this, [ = ](const QString & status) { - m_oldPasswordEdit->setVisible(status != NO_PASSWORD); - }); - connect(m_curUser, &User::passwordResetFinished, this, &ModifyPasswdPage::resetPasswordFinished); - connect(m_curUser, &User::startResetPasswordReplied, this, &ModifyPasswdPage::onStartResetPasswordReplied); - connect(m_curUser, &User::startSecurityQuestionsCheckReplied, this, &ModifyPasswdPage::onSecurityQuestionsCheckReplied); - connect(m_oldPasswordEdit, &DPasswordEdit::textEdited, this, [ & ] { - if (m_oldPasswordEdit->isAlert()) - { - m_oldPasswordEdit->hideAlertMessage(); - m_oldPasswordEdit->setAlert(false); - } - }); - connect(m_repeatPasswordEdit, &DPasswordEdit::textEdited, this, [ & ] { - if (m_repeatPasswordEdit->isAlert()) - { - m_repeatPasswordEdit->hideAlertMessage(); - m_repeatPasswordEdit->setAlert(false); - } - }); - connect(m_passwordTipsEdit, &DLineEdit::textEdited, this, [ = ](const QString & passwdTips) { - if (passwdTips.size() > 14) { - m_passwordTipsEdit->lineEdit()->backspace(); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } else if (m_passwordTipsEdit->isAlert()) { - m_passwordTipsEdit->setAlert(false); - } - }); - - m_securityLevelItem->setUser(m_curUser->name()); - m_securityLevelItem->bind(m_newPasswordEdit); - - connect(m_repeatPasswordEdit, &DPasswordEdit::editingFinished, this, [ = ]() { - if (m_newPasswordEdit->lineEdit()->text() != m_repeatPasswordEdit->lineEdit()->text()) { - m_repeatPasswordEdit->setAlert(true); - m_repeatPasswordEdit->showAlertMessage(tr("Passwords do not match"), m_repeatPasswordEdit, 2000); - } - }); - - m_oldPasswordEdit->lineEdit()->setPlaceholderText(tr("Required")); - m_oldPasswordEdit->setAccessibleName("oldpasswordedit"); - m_newPasswordEdit->lineEdit()->setPlaceholderText(tr("Required")); - m_newPasswordEdit->setAccessibleName("newpasswordedit"); - m_repeatPasswordEdit->lineEdit()->setPlaceholderText(tr("Required")); - m_repeatPasswordEdit->setAccessibleName("repeatpasswordedit"); - m_passwordTipsEdit->lineEdit()->setPlaceholderText(tr("Optional")); - m_passwordTipsEdit->setAccessibleName("passwordtipsedit"); - - cancleBtn->setMinimumSize(165, 36); - saveBtn->setMinimumSize(165, 36); - DFontSizeManager::instance()->bind(titleLabel, DFontSizeManager::T5); - - setFocusPolicy(Qt::StrongFocus); -} - -bool ModifyPasswdPage::judgeTextEmpty(DPasswordEdit *edit) -{ - if (edit->text().isEmpty()) { - edit->setAlert(true); - edit->showAlertMessage(tr("Password cannot be empty"), edit, 2000); - } - - return edit->text().isEmpty(); -} - -void ModifyPasswdPage::clickSaveBtn() -{ - //校验输入密码 - if ((judgeTextEmpty(m_oldPasswordEdit) && m_isCurrent) || judgeTextEmpty(m_newPasswordEdit) || judgeTextEmpty(m_repeatPasswordEdit)) - return; - - if (m_isCurrent) { - for (auto c : m_newPasswordEdit->text()) { - if (m_passwordTipsEdit->text().contains(c)) { - m_passwordTipsEdit->setAlert(true); - m_passwordTipsEdit->showAlertMessage(tr("The hint is visible to all users. Do not include the password here."), m_passwordTipsEdit, 2000); - return; - } - } - - Q_EMIT requestChangePassword(m_curUser, m_oldPasswordEdit->lineEdit()->text(), m_newPasswordEdit->lineEdit()->text(), m_repeatPasswordEdit->lineEdit()->text()); - } else { - resetPassword(m_newPasswordEdit->text(), m_repeatPasswordEdit->text()); - } -} - -void ModifyPasswdPage::onPasswordChangeFinished(const int exitCode, const QString &errorTxt) -{ - Q_UNUSED(exitCode) - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword(m_curUser->name(), - m_newPasswordEdit->lineEdit()->text()); - qDebug() << "exit code:" << exitCode << "error text:" << errorTxt << "error type:" << error - << "error tips:" << PwqualityManager::instance()->getErrorTips(error); - if (exitCode != 0) { - if (errorTxt.startsWith("Current Password: passwd:", Qt::CaseInsensitive)) { - m_oldPasswordEdit->setAlert(true); - m_oldPasswordEdit->showAlertMessage(tr("Wrong password")); - return; - } - - if (m_newPasswordEdit->lineEdit()->text() == m_oldPasswordEdit->lineEdit()->text()) { - m_newPasswordEdit->setAlert(true); - m_newPasswordEdit->showAlertMessage(tr("New password should differ from the current one"), m_oldPasswordEdit, 2000); - return; - } - - if (error == PW_NO_ERR) { - if (m_newPasswordEdit->lineEdit()->text() != m_repeatPasswordEdit->lineEdit()->text()) { - m_repeatPasswordEdit->setAlert(true); - m_repeatPasswordEdit->showAlertMessage(tr("Passwords do not match"), m_repeatPasswordEdit, 2000); - return; - } - } - - m_newPasswordEdit->setAlert(true); - m_newPasswordEdit->showAlertMessage(PwqualityManager::instance()->getErrorTips(error)); - // 企业版控制中心修改密码屏蔽安全中心登录安全的接口需求 - if ((DSysInfo::uosEditionType() == DSysInfo::UosEnterprise) || (DSysInfo::uosEditionType() == DSysInfo::UosEnterpriseC)) - return; - - Q_EMIT requestCheckPwdLimitLevel(); - } else if (error != PW_NO_ERR) { - m_newPasswordEdit->setAlert(true); - m_newPasswordEdit->showAlertMessage(PwqualityManager::instance()->getErrorTips(error)); - Q_EMIT requestChangePassword(m_curUser, m_newPasswordEdit->lineEdit()->text(), m_oldPasswordEdit->lineEdit()->text(), m_oldPasswordEdit->lineEdit()->text(), false); - } else { - if (!m_passwordTipsEdit->text().simplified().isEmpty()) - requestSetPasswordHint(m_curUser, m_passwordTipsEdit->text()); - close(); - } -} - -void ModifyPasswdPage::setPasswordEditAttribute(DPasswordEdit *edit) -{ - edit->setAttribute(Qt::WA_InputMethodEnabled, false); - edit->lineEdit()->setValidator(new QRegExpValidator(QRegExp("[^\\x4e00-\\x9fa5]+"), edit)); - edit->setCopyEnabled(false); - edit->setCutEnabled(false); -} - -void ModifyPasswdPage::resetPassword(const QString &password, const QString &repeatPassword) -{ - bool check = false; - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword(m_curUser->name(), password); - - if (error != PW_NO_ERR) { - m_newPasswordEdit->setAlert(true); - m_newPasswordEdit->showAlertMessage(PwqualityManager::instance()->getErrorTips(error)); - check = true; - } - - if (password != repeatPassword) { - m_repeatPasswordEdit->setAlert(true); - m_repeatPasswordEdit->showAlertMessage(tr("Passwords do not match"), m_repeatPasswordEdit, 2000); - check = true; - } - - for (auto c : password) { - if (m_passwordTipsEdit->text().contains(c)) { - m_passwordTipsEdit->setAlert(true); - m_passwordTipsEdit->showAlertMessage(tr("The hint is visible to all users. Do not include the password here."), m_passwordTipsEdit, 2000); - check = true; - } - } - - if (check) { - // 企业版控制中心修改密码屏蔽安全中心登录安全的接口需求 - if ((DSysInfo::uosEditionType() == DSysInfo::UosEnterprise) - || (DSysInfo::uosEditionType() == DSysInfo::UosEnterpriseC)) { - return; - } - - if (error != PW_NO_ERR) { - Q_EMIT requestCheckPwdLimitLevel(); - } - return; - } - - if (!m_passwordTipsEdit->text().simplified().isEmpty()) - requestSetPasswordHint(m_curUser, m_passwordTipsEdit->text()); - - Q_EMIT requestResetPassword(m_curUser, password); -} - -//在修改密码页面当前密码处设置焦点 -void ModifyPasswdPage::showEvent(QShowEvent *event) -{ - Q_UNUSED(event); - DPasswordEdit *passwordEdit = m_isCurrent ? m_oldPasswordEdit : m_newPasswordEdit; - if (passwordEdit && !passwordEdit->hasFocus()) { - passwordEdit->lineEdit()->setFocus(); - } -} - -void ModifyPasswdPage::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing, true); - QDialog::paintEvent(event); -} - -void ModifyPasswdPage::resetPasswordFinished(const QString &errorText) -{ - if (errorText.isEmpty()) { - close(); - } else { - m_newPasswordEdit->setAlert(true); - m_newPasswordEdit->showAlertMessage(errorText, m_newPasswordEdit, 2000); - } -} - -void ModifyPasswdPage::onForgetPasswordBtnClicked() -{ - m_forgetPasswordBtn->setEnabled(false); - Q_EMIT requestSecurityQuestionsCheck(m_curUser); -} - -void ModifyPasswdPage::onStartResetPasswordReplied(const QString &errorText) -{ - if (!errorText.isEmpty()) { - m_forgetPasswordBtn->setEnabled(true); - } else { - m_enableBtnTimer.singleShot(5000, this, [this]{ m_forgetPasswordBtn->setEnabled(true); }); - } - qDebug() << "Resetpassword reply:" << errorText; -} - -void ModifyPasswdPage::onSecurityQuestionsCheckReplied(const QList &questions) -{ - if (!questions.isEmpty()) { - Q_EMIT requestStartResetPasswordExec(m_curUser); - } else { - QString uosid; - Q_EMIT requestUOSID(uosid); - if (uosid.isEmpty()) { - return; - } - - QString uuid; - Q_EMIT requestUUID(uuid); - if (uuid.isEmpty()) { - return; - } - Q_EMIT requestLocalBindCheck(m_curUser, uosid, uuid); - } - qDebug() << "IsSecurityQuestionsExist:" << !questions.isEmpty(); -} - -void ModifyPasswdPage::onLocalBindCheckUbid(const QString &ubid) -{ - if (!ubid.isEmpty()) { - m_isBindCheckError = false; - Q_EMIT requestStartResetPasswordExec(m_curUser); - } else if (!m_isBindCheckError) { - UnionIDBindReminderDialog dlg; - dlg.exec(); - m_forgetPasswordBtn->setEnabled(true); - } -} - -void ModifyPasswdPage::onLocalBindCheckError(const QString &error) -{ - m_isBindCheckError = true; - m_forgetPasswordBtn->setEnabled(true); - QString tips; - if (error.contains("7500")) { - tips = tr("System error"); - } else if (error.contains("7506")) { - tips = tr("Network error"); - } - if (!tips.isEmpty()) { - DMessageManager::instance()->sendMessage(this, - style()->standardIcon(QStyle::SP_MessageBoxWarning), - tips); - } -} diff --git a/dcc-old/src/plugin-accounts/window/modifypasswdpage.h b/dcc-old/src/plugin-accounts/window/modifypasswdpage.h deleted file mode 100644 index 2f83d9c9ad..0000000000 --- a/dcc-old/src/plugin-accounts/window/modifypasswdpage.h +++ /dev/null @@ -1,91 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "src/plugin-accounts/operation/user.h" -#include "src/plugin-accounts/operation/usermodel.h" - -#include - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -#define PASSWORD_LEVEL_ICON_NUM 3 -#define PASSWORD_LEVEL_ICON_LIGHT_MODE_PATH ":/accounts/themes/common/icons/dcc_deepin_password_strength_unactive_light_mode.svg" -#define PASSWORD_LEVEL_ICON_DEEP_MODE_PATH ":/accounts/themes/common/icons/dcc_deepin_password_strength_unactive_deep_mode.svg" -#define PASSWORD_LEVEL_ICON_LOW_PATH ":/accounts/themes/common/icons/dcc_deepin_password_strength_low.svg" -#define PASSWORD_LEVEL_ICON_MIDDLE_PATH ":/accounts/themes/common/icons/dcc_deepin_password_strength_middle.svg" -#define PASSWORD_LEVEL_ICON_HIGH_PATH ":/accounts/themes/common/icons/dcc_deepin_password_strength_high.svg" -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QHBoxLayout; -class QPushButton; -class QLabel; -QT_END_NAMESPACE - - -namespace DCC_NAMESPACE { -class SecurityLevelItem; -} - -namespace DCC_NAMESPACE { -//修改密码页面 -class ModifyPasswdPage : public DAbstractDialog -{ - Q_OBJECT - -public: - explicit ModifyPasswdPage(User *user, bool isCurrent = true, QWidget *parent = nullptr); - ~ModifyPasswdPage(); - void initWidget(); - bool judgeTextEmpty(DPasswordEdit *edit); - void clickSaveBtn(); - void onPasswordChangeFinished(const int exitCode, const QString &errorTxt); - void setPasswordEditAttribute(DPasswordEdit *); - void resetPassword(const QString &password, const QString &repeatPassword); - -protected: - void showEvent(QShowEvent *event) override; - void paintEvent(QPaintEvent *event) override; -private: - void resetPasswordFinished(const QString &errorText); - void onForgetPasswordBtnClicked(); - void onStartResetPasswordReplied(const QString &errorText); - void onSecurityQuestionsCheckReplied(const QList &questions); - -Q_SIGNALS: - void requestChangePassword(User *userInter, const QString &oldPassword, const QString &password, const QString &repeatPassword, const bool needResule = true); - void requestResetPassword(User *userInter, const QString &password); - void requestBack(UserModel::ActionOption option = UserModel::ClickCancel); - void requestSetPasswordHint(User *, const QString &); - void requestUOSID(QString &uosid); - void requestUUID(QString &uuid); - void requestLocalBindCheck(User *user, const QString &uosid, const QString &uuid); - void requestStartResetPasswordExec(User *user); - void requestSecurityQuestionsCheck(User *user); - void requestCheckPwdLimitLevel(); - -public Q_SLOTS: - void onLocalBindCheckUbid(const QString &ubid); - void onLocalBindCheckError(const QString &error); - -private: - User *m_curUser; - DPasswordEdit *m_oldPasswordEdit; - DPasswordEdit *m_newPasswordEdit; - DPasswordEdit *m_repeatPasswordEdit; - DCommandLinkButton *m_forgetPasswordBtn; - DTK_WIDGET_NAMESPACE::DLineEdit *m_passwordTipsEdit; - bool m_isCurrent; - bool m_isBindCheckError; - SecurityLevelItem *m_securityLevelItem; - QTimer m_enableBtnTimer; -}; -} diff --git a/dcc-old/src/plugin-accounts/window/pwqualitymanager.cpp b/dcc-old/src/plugin-accounts/window/pwqualitymanager.cpp deleted file mode 100644 index b9f210845a..0000000000 --- a/dcc-old/src/plugin-accounts/window/pwqualitymanager.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "pwqualitymanager.h" -#include -#include - -using namespace DCC_NAMESPACE; -DCORE_USE_NAMESPACE - -PwqualityManager::PwqualityManager() - : m_passwordMinLen(0) - , m_passwordMaxLen(0) -{ -} - -PwqualityManager *PwqualityManager::instance() -{ - static PwqualityManager pwquality; - return &pwquality; -} - -PwqualityManager::ERROR_TYPE PwqualityManager::verifyPassword(const QString &user, const QString &password, CheckType checkType) -{ - switch (checkType) { - case PwqualityManager::Default: { - ERROR_TYPE error = deepin_pw_check(user.toLocal8Bit().data(), password.toLocal8Bit().data(), LEVEL_STRICT_CHECK, nullptr); - - if (error == PW_ERR_PW_REPEAT) { - error = PW_NO_ERR; - } - return error; - } - case PwqualityManager::Grub2: { - // LEVEL_STRICT_CHECK? - ERROR_TYPE error = deepin_pw_check_grub2(user.toLocal8Bit().data(), password.toLocal8Bit().data(), LEVEL_STANDARD_CHECK, nullptr); - - if (error == PW_ERR_PW_REPEAT) { - error = PW_NO_ERR; - } - return error; - } - } - - return PW_NO_ERR; -} - -PASSWORD_LEVEL_TYPE PwqualityManager::GetNewPassWdLevel(const QString &newPasswd) -{ - return get_new_passwd_strength_level(newPasswd.toLocal8Bit().data()); -} - -QString PwqualityManager::getErrorTips(PwqualityManager::ERROR_TYPE type, CheckType checkType) -{ - int passwordPalimdromeNum = (checkType == Default ? get_pw_palimdrome_num(LEVEL_STRICT_CHECK) : get_pw_palimdrome_num_grub2(LEVEL_STRICT_CHECK)); - int passwordMonotoneCharacterNum = (checkType == Default ? get_pw_monotone_character_num(LEVEL_STRICT_CHECK) : get_pw_monotone_character_num_grub2(LEVEL_STRICT_CHECK)); - int passwordConsecutiveSameCharacterNum = (checkType == Default ? get_pw_consecutive_same_character_num(LEVEL_STRICT_CHECK) : get_pw_consecutive_same_character_num_grub2(LEVEL_STRICT_CHECK)); - m_passwordMinLen = (checkType == Default ? get_pw_min_length(LEVEL_STRICT_CHECK) : get_pw_min_length_grub2(LEVEL_STRICT_CHECK)); - m_passwordMaxLen = (checkType == Default ? get_pw_max_length(LEVEL_STRICT_CHECK) : get_pw_max_length_grub2(LEVEL_STRICT_CHECK)); - - //通用校验规则 - QMap PasswordFlagsStrMap = { - {PW_ERR_PASSWORD_EMPTY, tr("Password cannot be empty")}, - {PW_ERR_LENGTH_SHORT, tr("Password must have at least %1 characters").arg(m_passwordMinLen)}, - {PW_ERR_LENGTH_LONG, tr("Password must be no more than %1 characters").arg(m_passwordMaxLen)}, - {PW_ERR_CHARACTER_INVALID, tr("Password can only contain English letters (case-sensitive), numbers or special symbols (~`!@#$%^&*()-_+=|\\{}[]:\"'<>,.?/)")}, - {PW_ERR_PALINDROME, tr("No more than %1 palindrome characters please").arg(passwordPalimdromeNum)}, - {PW_ERR_PW_MONOTONE, tr("No more than %1 monotonic characters please").arg(passwordMonotoneCharacterNum)}, - {PW_ERR_PW_CONSECUTIVE_SAME, tr("No more than %1 repeating characters please").arg(passwordConsecutiveSameCharacterNum)}, - - }; - - //服务器版校验规则 - if (DSysInfo::UosServer == DSysInfo::uosType()) { - PasswordFlagsStrMap[PW_ERR_CHARACTER_INVALID] = tr("Password must contain uppercase letters, lowercase letters, numbers and symbols (~`!@#$%^&*()-_+=|\\{}[]:\"'<>,.?/)"); - PasswordFlagsStrMap[PW_ERR_PALINDROME] = tr("Password must not contain more than 4 palindrome characters"); - PasswordFlagsStrMap[PW_ERR_WORD] = tr("Do not use common words and combinations as password"); - PasswordFlagsStrMap[PW_ERR_PW_MONOTONE] = tr("Create a strong password please"); - PasswordFlagsStrMap[PW_ERR_PW_CONSECUTIVE_SAME] = tr("Create a strong password please"); - PasswordFlagsStrMap[PW_ERR_PW_FIRST_UPPERM] = tr("Do not use common words and combinations as password"); - } - - //规则校验以外的情况统一返回密码不符合安全要求 - if (PasswordFlagsStrMap.value(type).isEmpty()) { - PasswordFlagsStrMap[type] = tr("It does not meet password rules"); - } - - return PasswordFlagsStrMap.value(type); -} - diff --git a/dcc-old/src/plugin-accounts/window/pwqualitymanager.h b/dcc-old/src/plugin-accounts/window/pwqualitymanager.h deleted file mode 100644 index 4644a29ca5..0000000000 --- a/dcc-old/src/plugin-accounts/window/pwqualitymanager.h +++ /dev/null @@ -1,50 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DEEPIN_INSTALLER_PWQUALITY_MANAGER_H -#define DEEPIN_INSTALLER_PWQUALITY_MANAGER_H - -#include "interface/namespace.h" - -#include -#include - -#include - -namespace DCC_NAMESPACE { -class PwqualityManager : public QObject -{ -Q_OBJECT -public: - typedef PW_ERROR_TYPE ERROR_TYPE; - - enum CheckType { - Default, - Grub2 - }; - - /** - * @brief PwqualityManager::instance 构造一个 单例 - * @return 返回一个静态实例 - */ - static PwqualityManager* instance(); - - /** - * @brief PwqualityManager::verifyPassword 校验密码 - * @param password 带检密码字符串 - * @return 若找到,返回text,反之返回空 - */ - ERROR_TYPE verifyPassword(const QString &user, const QString &password, CheckType checkType = Default); - PASSWORD_LEVEL_TYPE GetNewPassWdLevel(const QString &newPasswd); - QString getErrorTips(ERROR_TYPE type, CheckType checkType = Default); - -private: - PwqualityManager(); - PwqualityManager(const PwqualityManager&) = delete; - - int m_passwordMinLen; - int m_passwordMaxLen; -}; -} - -#endif // DEEPIN_INSTALLER_PWQUALITY_MANAGER_H diff --git a/dcc-old/src/plugin-accounts/window/removeuserdialog.cpp b/dcc-old/src/plugin-accounts/window/removeuserdialog.cpp deleted file mode 100644 index 08767760ac..0000000000 --- a/dcc-old/src/plugin-accounts/window/removeuserdialog.cpp +++ /dev/null @@ -1,62 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "removeuserdialog.h" - -#include -#include -#include -#include - -#include "avatarwidget.h" - -using namespace DCC_NAMESPACE; - -static QPixmap RoundPixmap(const QPixmap &pix) { - QPixmap ret(pix.size()); - ret.fill(Qt::transparent); - - QPainter painter(&ret); - painter.setRenderHints(painter.renderHints() | QPainter::Antialiasing); - - QPainterPath path; - path.addEllipse(ret.rect()); - painter.setClipPath(path); - painter.drawPixmap(0, 0, pix); - - painter.end(); - - return ret; -} - -RemoveUserDialog::RemoveUserDialog(const User *user, QWidget *parent) - : DDialog(parent) - , m_deleteHome(true) -{ - setTitle(tr("Are you sure you want to delete this account?")); - - const auto ratio = devicePixelRatioF(); - const QString iconFile = QUrl(user->currentAvatar()).toLocalFile(); - const QPixmap pix = QPixmap(iconFile).scaled(48 * ratio, 48 * ratio, Qt::IgnoreAspectRatio, Qt::FastTransformation); - QPixmap p = RoundPixmap(pix); - p.setDevicePixelRatio(ratio); - setIcon(p); - - QCheckBox *box = new QCheckBox(tr("Delete account directory")); - box->setChecked(true); - box->setAccessibleName("Delete_Account_Checkbox"); - addContent(box, Qt::AlignTop); - - QStringList buttons; - buttons << tr("Cancel") << tr("Delete"); - addButtons(buttons); - - connect(box, &QCheckBox::toggled, [this, box] { - m_deleteHome = box->checkState() == Qt::Checked; - }); -} - -bool RemoveUserDialog::deleteHome() const -{ - return m_deleteHome; -} diff --git a/dcc-old/src/plugin-accounts/window/removeuserdialog.h b/dcc-old/src/plugin-accounts/window/removeuserdialog.h deleted file mode 100644 index fbc998f458..0000000000 --- a/dcc-old/src/plugin-accounts/window/removeuserdialog.h +++ /dev/null @@ -1,29 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef REMOVEUSERDIALOG_H -#define REMOVEUSERDIALOG_H - -#include - -#include "interface/namespace.h" -#include "src/plugin-accounts/operation/user.h" - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class RemoveUserDialog : public DDialog -{ - Q_OBJECT -public: - explicit RemoveUserDialog(const User *user, QWidget *parent = nullptr); - - bool deleteHome() const; - -private: - bool m_deleteHome; -}; -} - -#endif // REMOVEUSERDIALOG_H diff --git a/dcc-old/src/plugin-accounts/window/securitylevelitem.cpp b/dcc-old/src/plugin-accounts/window/securitylevelitem.cpp deleted file mode 100644 index c69a2184eb..0000000000 --- a/dcc-old/src/plugin-accounts/window/securitylevelitem.cpp +++ /dev/null @@ -1,211 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "securitylevelitem.h" -#include "widgets/accessibleinterface.h" -#include "pwqualitymanager.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -#define PASSWORD_LEVEL_ICON_LIGHT_MODE_PATH ":/accounts/icons/dcc_deepin_password_strength_unactive_light_mode.svg" -#define PASSWORD_LEVEL_ICON_DEEP_MODE_PATH ":/accounts/icons/dcc_deepin_password_strength_unactive_deep_mode.svg" -#define PASSWORD_LEVEL_ICON_LOW_PATH ":/accounts/icons/dcc_deepin_password_strength_low.svg" -#define PASSWORD_LEVEL_ICON_MIDDLE_PATH ":/accounts/icons/dcc_deepin_password_strength_middle.svg" -#define PASSWORD_LEVEL_ICON_HIGH_PATH ":/accounts/icons/dcc_deepin_password_strength_high.svg" - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE -DGUI_USE_NAMESPACE -SET_FORM_ACCESSIBLE(SecurityLevelItem, "SecurityLevelItem") -SecurityLevelItem::SecurityLevelItem(QWidget *parent) - : QWidget(parent) - , m_newPasswdLevelText(new QLabel(this)) - , m_level(NoneLevel) -{ - initIcons(); - initUi(); -} - -SecurityLevelItem::~SecurityLevelItem() -{ -} - -void SecurityLevelItem::setUser(const QString &userName) -{ - m_userName = userName; -} - -void SecurityLevelItem::bind(Dtk::Widget::DLineEdit *lineEdit) -{ - QObject::disconnect(lineEdit, &DLineEdit::textChanged, this, nullptr); - QObject::connect(lineEdit, &DLineEdit::textChanged, this, [this, lineEdit](const QString &text) { - if (text.isEmpty()) { - setLevel(SecurityLevelItem::NoneLevel); - lineEdit->setAlert(false); - lineEdit->hideAlertMessage(); - return; - } - PwqualityManager *pwQualityManager = PwqualityManager::instance(); - PASSWORD_LEVEL_TYPE level = pwQualityManager->GetNewPassWdLevel(text); - PwqualityManager::ERROR_TYPE error = pwQualityManager->verifyPassword(m_userName, text); - - switch (level) { - case PASSWORD_STRENGTH_LEVEL_HIGH: - setLevel(SecurityLevelItem::HighLevel); - break; - case PASSWORD_STRENGTH_LEVEL_MIDDLE: - setLevel(SecurityLevelItem::MidLevel); - break; - case PASSWORD_STRENGTH_LEVEL_LOW: - setLevel(SecurityLevelItem::LowLevel); - break; - default: - lineEdit->showAlertMessage(QObject::tr("Error occurred when reading the configuration files of password rules!")); - return; - } - if (error != PwqualityManager::ERROR_TYPE::PW_NO_ERR) { - lineEdit->lineEdit()->setProperty("_d_dtk_lineedit_opacity", false); - lineEdit->setAlert(true); - lineEdit->showAlertMessage(pwQualityManager->getErrorTips(error), lineEdit, 2000); - } else { - lineEdit->setAlert(false); - lineEdit->hideAlertMessage(); - } - }); -} - -void SecurityLevelItem::setLevel(SecurityLevelItem::Level level) -{ - if (level == m_level) - return; - - m_level = level; - - QPalette palette; - switch (level) { - case NoneLevel: - m_newPasswdLevelText->setText(tr("")); - m_newPasswdLevelIcons[0]->setPixmap(m_icons[NoneIcon]); - m_newPasswdLevelIcons[1]->setPixmap(m_icons[NoneIcon]); - m_newPasswdLevelIcons[2]->setPixmap(m_icons[NoneIcon]); - break; - case LowLevel: - palette.setColor(QPalette::Text, QColor("#FF5736")); - m_newPasswdLevelText->setPalette(palette); - m_newPasswdLevelText->setForegroundRole(QPalette::Text); - m_newPasswdLevelText->setText(tr("Weak")); - - m_newPasswdLevelIcons[0]->setPixmap(m_icons[RedIcon]); - m_newPasswdLevelIcons[1]->setPixmap(m_icons[NoneIcon]); - m_newPasswdLevelIcons[2]->setPixmap(m_icons[NoneIcon]); - break; - case MidLevel: - palette.setColor(QPalette::Text, QColor("#FFAA00")); - m_newPasswdLevelText->setPalette(palette); - m_newPasswdLevelText->setForegroundRole(QPalette::Text); - m_newPasswdLevelText->setText(tr("Medium")); - - m_newPasswdLevelIcons[0]->setPixmap(m_icons[YellowIcon]); - m_newPasswdLevelIcons[1]->setPixmap(m_icons[YellowIcon]); - m_newPasswdLevelIcons[2]->setPixmap(m_icons[NoneIcon]); - break; - case HighLevel: - palette.setColor(QPalette::Text, QColor("#15BB18")); - m_newPasswdLevelText->setPalette(palette); - m_newPasswdLevelText->setForegroundRole(QPalette::Text); - m_newPasswdLevelText->setText(tr("Strong")); - - m_newPasswdLevelIcons[0]->setPixmap(m_icons[GreenIcon]); - m_newPasswdLevelIcons[1]->setPixmap(m_icons[GreenIcon]); - m_newPasswdLevelIcons[2]->setPixmap(m_icons[GreenIcon]); - break; - } -} - -const QPixmap SecurityLevelItem::loadSvgImg(const QString &fileName, const int width, const int hight) -{ - if (!QFileInfo::exists(fileName)) - return QPixmap(); - - QPixmap pixmap(width, hight); - QSvgRenderer renderer(fileName); - pixmap.fill(Qt::transparent); - - QPainter painter; - painter.begin(&pixmap); - painter.setRenderHint(QPainter::Antialiasing, true); - renderer.render(&painter); - painter.end(); - - pixmap.setDevicePixelRatio(qRound(qApp->devicePixelRatio())); - - return pixmap; -} - -void SecurityLevelItem::initUi() -{ - for (int i = 0; i < PASSWORD_LEVEL_ICON_NUM; i++) { - m_newPasswdLevelIcons[i] = new QLabel; - } - - QHBoxLayout *newPasswdLevelLayout = new QHBoxLayout; - newPasswdLevelLayout->setMargin(0); - m_newPasswdLevelText->setFixedWidth(55); - m_newPasswdLevelText->setFixedHeight(20); - m_newPasswdLevelText->setAlignment(Qt::AlignRight); - DFontSizeManager::instance()->bind(m_newPasswdLevelText, DFontSizeManager::T8); - newPasswdLevelLayout->addWidget(m_newPasswdLevelText, 0, Qt::AlignRight); - newPasswdLevelLayout->addSpacing(4); - - for (int i = 0; i < PASSWORD_LEVEL_ICON_NUM; i++) { - m_newPasswdLevelIcons[i]->setFixedWidth(8); - m_newPasswdLevelIcons[i]->setFixedHeight(4); - m_newPasswdLevelIcons[i]->setPixmap(m_icons[NoneIcon]); - } - - newPasswdLevelLayout->addWidget(m_newPasswdLevelIcons[0]); - newPasswdLevelLayout->addSpacing(4); - - newPasswdLevelLayout->addWidget(m_newPasswdLevelIcons[1]); - newPasswdLevelLayout->addSpacing(4); - - newPasswdLevelLayout->addWidget(m_newPasswdLevelIcons[2]); - newPasswdLevelLayout->addSpacing(50); - setLayout(newPasswdLevelLayout); -} - -void SecurityLevelItem::initIcons() -{ - qreal pixelRatio = devicePixelRatioF(); - - auto onThemeTypeChanged = [=](DGuiApplicationHelper::ColorType themeType) { - switch (themeType) { - case DGuiApplicationHelper::UnknownType: - case DGuiApplicationHelper::LightType: - m_icons[NoneIcon] = loadSvgImg(PASSWORD_LEVEL_ICON_LIGHT_MODE_PATH, qRound(8 * pixelRatio), qRound(4 * pixelRatio)); - break; - case DGuiApplicationHelper::DarkType: - m_icons[NoneIcon] = loadSvgImg(PASSWORD_LEVEL_ICON_DEEP_MODE_PATH, qRound(8 * pixelRatio), qRound(4 * pixelRatio)); - break; - } - }; - - onThemeTypeChanged(DGuiApplicationHelper::instance()->themeType()); - - m_icons[RedIcon] = loadSvgImg(PASSWORD_LEVEL_ICON_LOW_PATH, qRound(8 * pixelRatio), qRound(4 * pixelRatio)); - m_icons[YellowIcon] = loadSvgImg(PASSWORD_LEVEL_ICON_MIDDLE_PATH, qRound(8 * pixelRatio), qRound(4 * pixelRatio)); - m_icons[GreenIcon] = loadSvgImg(PASSWORD_LEVEL_ICON_HIGH_PATH, qRound(8 * pixelRatio), qRound(4 * pixelRatio)); - - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType) { - onThemeTypeChanged(themeType); - setLevel(m_level); - }); -} diff --git a/dcc-old/src/plugin-accounts/window/securitylevelitem.h b/dcc-old/src/plugin-accounts/window/securitylevelitem.h deleted file mode 100644 index 6392dda3db..0000000000 --- a/dcc-old/src/plugin-accounts/window/securitylevelitem.h +++ /dev/null @@ -1,67 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_WIDGETS_SECURITYLEVEL_H -#define DCC_WIDGETS_SECURITYLEVEL_H - -#include "interface/namespace.h" - -#include - -#include - -#define PASSWORD_LEVEL_ICON_NUM 3 -DWIDGET_BEGIN_NAMESPACE -class DLineEdit; -DWIDGET_END_NAMESPACE - -QT_BEGIN_NAMESPACE -class QLabel; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { -class SecurityLevelItem : public QWidget -{ - Q_OBJECT -public: - explicit SecurityLevelItem(QWidget *parent = nullptr); - ~SecurityLevelItem(); - - void setUser(const QString &userName); - void bind(DTK_WIDGET_NAMESPACE::DLineEdit *lineEdit); - - enum Level { - NoneLevel = 0, - LowLevel, - MidLevel, - HighLevel - }; - Q_ENUM(Level) - - enum IconType { - NoneIcon = 0, - RedIcon, - YellowIcon, - GreenIcon, - ICONTYPE_NR_ITEMS - }; - Q_ENUM(IconType) - -public: - void setLevel(Level level); - -private: - const QPixmap loadSvgImg(const QString &fileName, const int width, const int hight); - void initUi(); - void initIcons(); - -private: - QLabel *m_newPasswdLevelText; - QLabel *m_newPasswdLevelIcons[PASSWORD_LEVEL_ICON_NUM]; - QPixmap m_icons[ICONTYPE_NR_ITEMS]; - Level m_level; - QString m_userName; -}; -} // namespace DCC_NAMESPACE - -#endif // DCC_WIDGETS_SECURITYLEVEL_H diff --git a/dcc-old/src/plugin-accounts/window/securityquestionspage.cpp b/dcc-old/src/plugin-accounts/window/securityquestionspage.cpp deleted file mode 100644 index 74440173db..0000000000 --- a/dcc-old/src/plugin-accounts/window/securityquestionspage.cpp +++ /dev/null @@ -1,350 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "securityquestionspage.h" -#include "createaccountpage.h" - -#include -#include -#include - -#include - -#include -#include - - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -static void palrtteTransparency(QWidget *widget, qint8 alphaFloat) -{ - QPalette palette = widget->palette(); - QColor color = DGuiApplicationHelper::adjustColor(palette.color(QPalette::Active, QPalette::BrightText), 0, 0, 0, 0, 0, 0, alphaFloat); - palette.setColor(QPalette::WindowText, color); - widget->setPalette(palette); -} - -SecurityQuestionsPage::SecurityQuestionsPage(User *user, QWidget *parent) - : QWidget(parent) - , m_curUser(user) - , m_questionCombobox1(new DComboBox) - , m_questionCombobox2(new DComboBox) - , m_questionCombobox3(new DComboBox) - , m_answerEdit1(new DLineEdit) - , m_answerEdit2(new DLineEdit) - , m_answerEdit3(new DLineEdit) -{ - initWidget(); - initData(); -} - -SecurityQuestionsPage::~SecurityQuestionsPage() -{ - -} - -void SecurityQuestionsPage::initWidget() -{ - this->setAccessibleName("SecurityQuestionsPage"); - - QLabel *titleLabel = new QLabel(tr("Security Questions")); - titleLabel->setObjectName("TitleLabel"); - titleLabel->setAccessibleName("DDialogTitleLabel"); - titleLabel->setAttribute(Qt::WA_TransparentForMouseEvents); - titleLabel->setWordWrap(true); - titleLabel->setAlignment(Qt::AlignCenter); - titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - DFontSizeManager *fontManager = DFontSizeManager::instance(); - fontManager->bind(titleLabel, DFontSizeManager::T5, QFont::Medium); - palrtteTransparency(titleLabel, -10); - - QLabel *messageLabel = new QLabel(tr("These questions will be used to help reset your password in case you forget it.")); - fontManager->bind(messageLabel, DFontSizeManager::T6, QFont::Medium); - messageLabel->setObjectName("MessageLabel"); - messageLabel->setAccessibleName("DDialogMessageLabel"); - messageLabel->setAttribute(Qt::WA_TransparentForMouseEvents); - messageLabel->setWordWrap(true); - messageLabel->setAlignment(Qt::AlignCenter); - messageLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - palrtteTransparency(messageLabel, -30); - - QVBoxLayout *mainContentLayout = new QVBoxLayout(this); - mainContentLayout->setContentsMargins(10, 20, 10, 10); - mainContentLayout->setSpacing(0); - - mainContentLayout->addWidget(titleLabel); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(messageLabel); - mainContentLayout->addSpacing(20); - - QLabel *questionLabel1 = new QLabel(tr("Security question 1") + ":"); - mainContentLayout->addWidget(questionLabel1, 0, Qt::AlignLeft); - mainContentLayout->addSpacing(6); - mainContentLayout->addWidget(m_questionCombobox1); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_answerEdit1); - mainContentLayout->addSpacing(20); - - QLabel *questionLabel2 = new QLabel(tr("Security question 2") + ":"); - mainContentLayout->addWidget(questionLabel2, 0, Qt::AlignLeft); - mainContentLayout->addSpacing(6); - mainContentLayout->addWidget(m_questionCombobox2); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_answerEdit2); - mainContentLayout->addSpacing(20); - - QLabel *questionLabel3 = new QLabel(tr("Security question 3") + ":"); - mainContentLayout->addWidget(questionLabel3, 0, Qt::AlignLeft); - mainContentLayout->addSpacing(6); - mainContentLayout->addWidget(m_questionCombobox3); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_answerEdit3); - mainContentLayout->addStretch(0); - - QPushButton *cancelButton = new QPushButton(tr("Cancel")); - DSuggestButton *confirmButton = new DSuggestButton(tr("Confirm")); - QHBoxLayout *buttonHLayout = new QHBoxLayout; - buttonHLayout->setSpacing(0); - buttonHLayout->addWidget(cancelButton); - buttonHLayout->addSpacing(10); - buttonHLayout->addWidget(confirmButton); - - mainContentLayout->addStretch(); - mainContentLayout->addLayout(buttonHLayout); - - addItems(m_questionCombobox1); - addItems(m_questionCombobox2); - addItems(m_questionCombobox3); - - connect(cancelButton, &QPushButton::clicked, this, [this] { - // 关闭当前界面时需要断开信号连接 - disconnect(m_curUser, &User::startSecurityQuestionsCheckReplied, this, &SecurityQuestionsPage::onSecurityQuestionsCheckReplied); - disconnect(m_curUser, &User::setSecurityQuestionsReplied, this, &SecurityQuestionsPage::onSetSecurityQuestionsReplied); - Q_EMIT requestBack(); - }); - - connect(confirmButton, &QPushButton::clicked, this, &SecurityQuestionsPage::onConfirmButtonClicked); - connect(m_questionCombobox1, qOverload(&QComboBox::currentIndexChanged), this, &SecurityQuestionsPage::onQuestionCombobox1CurrentTextChanged); - connect(m_questionCombobox2, qOverload(&QComboBox::currentIndexChanged), this, &SecurityQuestionsPage::onQuestionCombobox2CurrentTextChanged); - connect(m_questionCombobox3, qOverload(&QComboBox::currentIndexChanged), this, &SecurityQuestionsPage::onQuestionCombobox3CurrentTextChanged); - connect(m_answerEdit1, &DLineEdit::textChanged, this, &SecurityQuestionsPage::onAnswerEdit1CurrentTextChanged); - connect(m_answerEdit2, &DLineEdit::textChanged, this, &SecurityQuestionsPage::onAnswerEdit2CurrentTextChanged); - connect(m_answerEdit3, &DLineEdit::textChanged, this, &SecurityQuestionsPage::onAnswerEdit3CurrentTextChanged); - connect(m_curUser, &User::startSecurityQuestionsCheckReplied, this, &SecurityQuestionsPage::onSecurityQuestionsCheckReplied); - connect(m_curUser, &User::setSecurityQuestionsReplied, this, &SecurityQuestionsPage::onSetSecurityQuestionsReplied); - - m_answerEdit1->setFocus(); -} - -void SecurityQuestionsPage::initData() -{ - m_answerEdit1->setEchoMode(QLineEdit::PasswordEchoOnEdit); - m_answerEdit2->setEchoMode(QLineEdit::PasswordEchoOnEdit); - m_answerEdit3->setEchoMode(QLineEdit::PasswordEchoOnEdit); - m_answerEdit1->setPlaceholderText(tr("Keep the answer under 30 characters")); - m_answerEdit2->setPlaceholderText(tr("Keep the answer under 30 characters")); - m_answerEdit3->setPlaceholderText(tr("Keep the answer under 30 characters")); -} - -void SecurityQuestionsPage::onConfirmButtonClicked() -{ - if (isSecurityQuestionsEmpty()) { - return; - } - - int index1 = m_questionCombobox1->currentIndex(); - int index2 = m_questionCombobox2->currentIndex(); - int index3 = m_questionCombobox3->currentIndex(); - - if ((index1 == index2) || (index2 == index3 ) || (index1 == index3)) { - DMessageManager::instance()->sendMessage(this, - style()->standardIcon(QStyle::SP_MessageBoxWarning), - tr("Do not choose a duplicate question please")); - return; - } - - if (!isAllAnswersCharactersSizeRight()) { - return; - } - - QMap securityQuestions { - {index1, cryptUserPassword(m_answerEdit1->text()).toUtf8()}, - {index2, cryptUserPassword(m_answerEdit2->text()).toUtf8()}, - {index3, cryptUserPassword(m_answerEdit3->text()).toUtf8()}}; - - Q_EMIT requestSetSecurityQuestions(m_curUser, securityQuestions); -} - -void SecurityQuestionsPage::onQuestionCombobox1CurrentTextChanged(int index) -{ - m_answerEdit1->clear(); - checkQuestionDuplicate(index, m_questionCombobox2->currentIndex(), m_questionCombobox3->currentIndex(), m_questionCombobox1); -} - -void SecurityQuestionsPage::onQuestionCombobox2CurrentTextChanged(int index) -{ - m_answerEdit2->clear(); - checkQuestionDuplicate(index, m_questionCombobox1->currentIndex(), m_questionCombobox3->currentIndex(), m_questionCombobox2); -} - -void SecurityQuestionsPage::onQuestionCombobox3CurrentTextChanged(int index) -{ - m_answerEdit3->clear(); - checkQuestionDuplicate(index, m_questionCombobox1->currentIndex(), m_questionCombobox2->currentIndex(), m_questionCombobox3); -} - -void SecurityQuestionsPage::onAnswerEdit1CurrentTextChanged(const QString &) -{ - hideAlert(m_answerEdit1); -} - -void SecurityQuestionsPage::onAnswerEdit2CurrentTextChanged(const QString &) -{ - hideAlert(m_answerEdit2); -} - -void SecurityQuestionsPage::onAnswerEdit3CurrentTextChanged(const QString &) -{ - hideAlert(m_answerEdit3); -} - -void SecurityQuestionsPage::onSecurityQuestionsCheckReplied(const QList &questions) -{ - for (int i = 0; i < questions.size(); ++i) { - if (i == 0) { - m_questionCombobox1->setCurrentIndex(questions.at(i)); - } else if (i == 1) { - m_questionCombobox2->setCurrentIndex(questions.at(i)); - } else if (i == 2) { - m_questionCombobox3->setCurrentIndex(questions.at(i)); - } - } -} - -void SecurityQuestionsPage::onSetSecurityQuestionsReplied(const QString &errorText) -{ - if (errorText.isEmpty()) { - // 关闭当前界面时需要先断开信号连接 - disconnect(m_curUser, &User::startSecurityQuestionsCheckReplied, this, &SecurityQuestionsPage::onSecurityQuestionsCheckReplied); - disconnect(m_curUser, &User::setSecurityQuestionsReplied, this, &SecurityQuestionsPage::onSetSecurityQuestionsReplied); - Q_EMIT requestBack(); - } else { - qWarning() << "SetSecurityQuestionsReplied:" << errorText; - } -} - -void SecurityQuestionsPage::addItems(DComboBox *questionCombobox) -{ - questionCombobox->addItem(tr("Please select a question")); - questionCombobox->addItem(tr("What's the name of the city where you were born?")); - questionCombobox->addItem(tr("What's the name of the first school you attended?")); - questionCombobox->addItem(tr("Who do you love the most in this world?")); - questionCombobox->addItem(tr("What's your favorite animal?")); - questionCombobox->addItem(tr("What's your favorite song?")); - questionCombobox->addItem(tr("What's your nickname?")); - QStandardItemModel* model = qobject_cast(questionCombobox->model()); - QModelIndex firstIndex = model->index(0, questionCombobox->modelColumn(), questionCombobox->rootModelIndex()); - QStandardItem* firstItem = model->itemFromIndex(firstIndex); - firstItem->setSelectable(false); - firstItem->setEnabled(false); -} - -bool SecurityQuestionsPage::isContentEmpty(DComboBox *comboBox) -{ - DAlertControl *control = new DAlertControl(comboBox, this); - if (comboBox->currentIndex() == 0) { - control->setAlert(true); - control->showAlertMessage(tr("It cannot be empty"), comboBox, 3000); - } else { - control->setAlert(false); - } - - return comboBox->currentIndex() == 0; -} - -bool SecurityQuestionsPage::isContentEmpty(DLineEdit *edit) -{ - if (edit->text().isEmpty()) { - edit->setAlert(true); - edit->showAlertMessage(tr("It cannot be empty"), edit, 2000); - } else { - edit->setAlert(false); - } - - return edit->text().isEmpty(); -} - -bool SecurityQuestionsPage::isSecurityQuestionsEmpty() -{ - return isContentEmpty(m_questionCombobox1) || isContentEmpty(m_questionCombobox2) || isContentEmpty(m_questionCombobox3) || - isContentEmpty(m_answerEdit1) || isContentEmpty(m_answerEdit2) || isContentEmpty(m_answerEdit3); -} - -QString SecurityQuestionsPage::cryptUserPassword(const QString &password) -{ - /* - NOTE(kirigaya): Password is a combination of salt and crypt function. - slat is begin with $6$, 16 byte of random values, at the end of $. - crypt function will return encrypted values. - */ - - const QString seedchars("./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); - char salt[] = "$6$................$"; - - std::random_device r; - std::default_random_engine e1(r()); - std::uniform_int_distribution uniform_dist(0, seedchars.size() - 1); //seedchars.size()是64,生成随机数的范围应该写成[0, 63]。 - - // Random access to a character in a restricted list - for (int i = 0; i != 16; i++) { - salt[3 + i] = seedchars.at(uniform_dist(e1)).toLatin1(); - } - - return crypt(password.toUtf8().data(), salt); -} - -bool SecurityQuestionsPage::isAnswersCharactersSizeRight(DLineEdit *edit) -{ - if (edit->text().size() > SECURITY_ANSWERS_CHARACTERS_MAX_SIZE) { - edit->setAlert(true); - edit->showAlertMessage(tr("Keep the answer under 30 characters"), edit, 2000); - } else { - edit->setAlert(false); - } - - return edit->text().size() <= SECURITY_ANSWERS_CHARACTERS_MAX_SIZE; -} - -void SecurityQuestionsPage::checkQuestionDuplicate(int id, int id1, int id2, QWidget *w) -{ - if (id == id1 || id == id2) { - DAlertControl *control = new DAlertControl(w, this); - control->setAlert(true); - control->showAlertMessage(tr("Do not choose a duplicate question please"), w, 3000); - } -} - -void SecurityQuestionsPage::hideAlert(DLineEdit *edit) -{ - if (edit->isAlert()) { - edit->hideAlertMessage(); - edit->setAlert(false); - } -} - -bool SecurityQuestionsPage::isAllAnswersCharactersSizeRight() -{ - return isAnswersCharactersSizeRight(m_answerEdit1) && - isAnswersCharactersSizeRight(m_answerEdit2) && - isAnswersCharactersSizeRight(m_answerEdit3); -} - -//设置焦点 -void SecurityQuestionsPage::showEvent(QShowEvent *event) -{ - Q_UNUSED(event); - if (m_questionCombobox1 && !m_questionCombobox1->hasFocus()) { - m_questionCombobox1->setFocus(); - } -} diff --git a/dcc-old/src/plugin-accounts/window/securityquestionspage.h b/dcc-old/src/plugin-accounts/window/securityquestionspage.h deleted file mode 100644 index 67c1b00331..0000000000 --- a/dcc-old/src/plugin-accounts/window/securityquestionspage.h +++ /dev/null @@ -1,70 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "src/plugin-accounts/operation/user.h" -#include "src/plugin-accounts/operation/usermodel.h" - -#include -#include -#include - -#define SECURITY_QUESTIONS_NUM 6 -#define SECURITY_ANSWERS_CHARACTERS_MAX_SIZE 30 - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class SecurityQuestionsPage : public QWidget -{ - Q_OBJECT -public: - explicit SecurityQuestionsPage(User *user, QWidget *parent = nullptr); - ~SecurityQuestionsPage(); - -Q_SIGNALS: - void requestBack(UserModel::ActionOption option = UserModel::ClickCancel); - void requestSetSecurityQuestions(User *userInter, const QMap &securityQuestions); - void requestSecurityQuestionsCheck(User *userInter); - -public Q_SLOTS: - void onConfirmButtonClicked(); - void onQuestionCombobox1CurrentTextChanged(int); - void onQuestionCombobox2CurrentTextChanged(int); - void onQuestionCombobox3CurrentTextChanged(int); - void onAnswerEdit1CurrentTextChanged(const QString&); - void onAnswerEdit2CurrentTextChanged(const QString&); - void onAnswerEdit3CurrentTextChanged(const QString&); - void onSecurityQuestionsCheckReplied(const QList &questions); - void onSetSecurityQuestionsReplied(const QString &errorText); - -protected: - void showEvent(QShowEvent *event) override; - -private: - void initWidget(); - void initData(); - void addItems(DComboBox *questionCombobox); - bool isContentEmpty(DComboBox *edit); - bool isContentEmpty(DLineEdit *edit); - bool isSecurityQuestionsEmpty(); - QString cryptUserPassword(const QString &password); - bool isAllAnswersCharactersSizeRight(); - bool isAnswersCharactersSizeRight(DLineEdit *edit); - void checkQuestionDuplicate(int id, int id1, int id2, QWidget* w); - void hideAlert(DLineEdit *edit); - -private: - User *m_curUser; - DComboBox *m_questionCombobox1; - DComboBox *m_questionCombobox2; - DComboBox *m_questionCombobox3; - DLineEdit *m_answerEdit1; - DLineEdit *m_answerEdit2; - DLineEdit *m_answerEdit3; -}; - -} - diff --git a/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.cpp b/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.cpp deleted file mode 100644 index ff003980aa..0000000000 --- a/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.cpp +++ /dev/null @@ -1,34 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "unionidbindreminderdialog.h" -#include -#include -#include - -DCORE_USE_NAMESPACE -DGUI_USE_NAMESPACE - -UnionIDBindReminderDialog::UnionIDBindReminderDialog(QWidget *parent) - : DDialog(tr("The user account is not linked to Union ID"), - tr("To reset passwords, you should authenticate your Union ID first. Click \"Go to Link\" to finish the settings.")) -{ - setParent(parent); - setIcon(DIconTheme::findQIcon("dialog-warning")); - QStringList buttons; - buttons << tr("Cancel"); - addButtons(buttons); - addButton(tr("Go to Link"), true, ButtonRecommend); - - connect(getButton(1), &QPushButton::clicked, this, []{ - DDBusSender() - .service("org.deepin.dde.ControlCenter1") - .interface("org.deepin.dde.ControlCenter1") - .path("/org/deepin/dde/ControlCenter1") - .method("ShowPage") - .arg(QStringLiteral("cloudsync")) - .arg(tr("")) - .call(); - }); -} - diff --git a/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.h b/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.h deleted file mode 100644 index 4ae2649751..0000000000 --- a/dcc-old/src/plugin-accounts/window/unionidbindreminderdialog.h +++ /dev/null @@ -1,20 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef REMINDERDDIALOG_H -#define REMINDERDDIALOG_H - -#include - -DWIDGET_USE_NAMESPACE - -class UnionIDBindReminderDialog : public DDialog -{ - Q_OBJECT -public: - explicit UnionIDBindReminderDialog(QWidget *parent = nullptr); - ~UnionIDBindReminderDialog() {} - -}; - -#endif // REMINDERDDIALOG_H diff --git a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.cpp b/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.cpp deleted file mode 100644 index 324171c8c4..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "adapterv20tov23module.h" -#include "moduleinterface.h" -#include -#include - -AdapterV20toV23Module::AdapterV20toV23Module(dccV20::ModuleInterface *v20Module) - : ModuleObject() - , m_v20Module(v20Module) - , m_layout(nullptr) -{ - setName(v20Module->name()); - setDisplayName(v20Module->displayName()); - setIcon(m_v20Module->icon()); -} - -AdapterV20toV23Module::~AdapterV20toV23Module() -{ - delete m_v20Module; -} - -dccV20::ModuleInterface *AdapterV20toV23Module::inter() -{ - return m_v20Module; -} - -void AdapterV20toV23Module::active() -{ - emit actived(); - m_v20Module->active(); -} - -void AdapterV20toV23Module::deactive() -{ - m_layout = nullptr; - for (auto &&w : m_widgets) { - w = nullptr; - } - - m_v20Module->deactive(); -} - -QString AdapterV20toV23Module::path() const -{ - return m_v20Module->path(); -} - -QString AdapterV20toV23Module::follow() const -{ - return m_v20Module->follow(); -} - -bool AdapterV20toV23Module::enabled() const -{ - return m_v20Module->enabled(); -} - -void AdapterV20toV23Module::setWidget(int index) -{ - if (!m_layout) - return; - - while (m_layout->count() > index) { - QLayoutItem *item = m_layout->takeAt(index); - QWidget *oldW = item->widget(); - if (!m_widgets.contains(oldW)) { - oldW->setVisible(false); - oldW->setParent(nullptr); - oldW->deleteLater(); - } - delete item; - } - - for (int i = index; i < m_widgets.count(); ++i) { - m_layout->addWidget(m_widgets.at(i), i * 4 + 3); - } -} - -void AdapterV20toV23Module::setChildPage(int level, QWidget *w) -{ - while (level < m_widgets.size()) { - m_widgets.takeLast(); - } - m_widgets.append(w); - setWidget(level); -} - -void AdapterV20toV23Module::popWidget(QWidget *w) -{ - while (!m_widgets.isEmpty()) { - QWidget *last = m_widgets.takeLast(); - if (last == w) - break; - } - setWidget(0); -} - -QWidget *AdapterV20toV23Module::page() -{ - QWidget *parentWidget = new QWidget(); - m_layout = new QHBoxLayout(); - m_layout->setMargin(0); - m_layout->setSpacing(0); - parentWidget->setLayout(m_layout); - setWidget(0); - - return parentWidget; -} diff --git a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.h b/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.h deleted file mode 100644 index ef99665294..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23module.h +++ /dev/null @@ -1,50 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ADAPTERV20TOV23MODULE_H -#define ADAPTERV20TOV23MODULE_H - -#include "interface/moduleobject.h" - -class QEvent; -class QTimer; - -class QHBoxLayout; -namespace dccV20 { -class ModuleInterface; -} - -class AdapterV20toV23Module : public DCC_NAMESPACE::ModuleObject -{ - Q_OBJECT -public: - explicit AdapterV20toV23Module(dccV20::ModuleInterface *v20Module); - ~AdapterV20toV23Module(); - - virtual void active() override; - virtual void deactive() override; - - dccV20::ModuleInterface *inter(); - void setChildPage(int level, QWidget *w); - void popWidget(QWidget *w); - - virtual QWidget *page() override; - -Q_SIGNALS: - void actived(); - -public: - QString path() const; - QString follow() const; - bool enabled() const; - -private: - void setWidget(int index); - -private: - dccV20::ModuleInterface *m_v20Module; - QList m_widgets; - QHBoxLayout *m_layout; -}; - -#endif // ADAPTERV20TOV23MODULE_H diff --git a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.cpp b/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.cpp deleted file mode 100644 index 53efdceb86..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.cpp +++ /dev/null @@ -1,185 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "adapterv20tov23plugin.h" -#include "adapterv20tov23module.h" -#include "moduleinterface.h" -#include "frameproxyv20.h" -#include "pluginmanagerv20.h" - -#include -#include -#include -#include - -AdapterV20toV23Root::AdapterV20toV23Root(QObject *parent) - : ModuleObject("adapterV20toV23", QString(), parent) - , m_root(nullptr) - , m_timer(nullptr) - , m_prameProxy(nullptr) - , m_pluginManagerV20(nullptr) - , m_status(WaitParent) - , m_tryCount(50) -{ - setHidden(true); -} - -AdapterV20toV23Root::~AdapterV20toV23Root() -{ - if (m_timer) - delete m_timer; - if (m_pluginManagerV20) - delete m_pluginManagerV20; - if (m_prameProxy) - delete m_prameProxy; -} - -void AdapterV20toV23Root::init() -{ - m_timer = new QTimer(this); - connect(m_timer, &QTimer::timeout, this, &AdapterV20toV23Root::timerTask); - m_timer->start(10); -} - -bool AdapterV20toV23Root::loadFinished() const -{ - return m_status == LoadFinished; -} - -dccV23::ModuleObject *AdapterV20toV23Root::moduleRoot() const -{ - return m_root; -} - -void AdapterV20toV23Root::timerTask() -{ - switch (m_status) { - case WaitParent: // 等待获取父对象 - m_root = getParent(); - if (m_root) - m_status = GetPaths; - break; - case GetPaths: // 获取插件路径,并完成一些初始化 - m_root->removeChild(this); - connect(m_root, &ModuleObject::destroyed, this, &AdapterV20toV23Root::deleteLater); - connect(m_root, &ModuleObject::insertedChild, this, &AdapterV20toV23Root::pushModule, Qt::QueuedConnection); - m_prameProxy = new FrameProxyV20(this); - m_prameProxy->setRootModule(m_root); - m_pluginManagerV20 = new PluginManagerV20(); - m_pluginPaths = m_pluginManagerV20->pluginPath(); - m_status = LoadPlugin; - break; - case LoadPlugin: // 加载插件,每次加载一个 - if (!m_pluginPaths.isEmpty()) - m_pluginManagerV20->loadPlugin(m_pluginPaths.takeFirst(), m_prameProxy); - else { - m_modules = m_pluginManagerV20->modules(); - delete m_pluginManagerV20; - m_pluginManagerV20 = nullptr; - m_status = InsertModule; - } - break; - case InsertModule: // 尝试插入 - pushModule(); - m_tryCount--; - if (m_modules.isEmpty() || m_tryCount <= 0) - m_status = InsertAllModule; - break; - case InsertAllModule: // 插入所有项,并断开信号 - disconnect(m_root, &ModuleObject::insertedChild, this, &AdapterV20toV23Root::pushModule); - m_timer->stop(); - delete m_timer; - m_timer = nullptr; - insertModule(true); - m_status = LoadFinished; - break; - default: - break; - } -} - -void AdapterV20toV23Root::pushModule() -{ - insertModule(false); -} - -void AdapterV20toV23Root::insertModule(bool append) -{ - while (!m_modules.isEmpty()) { - auto &&module = m_modules.takeFirst(); - QString path = module->path(); - QString follow = module->follow(); - ModuleObject *root = m_root; - if (path != "mainwindow") { - auto it = std::find_if(m_root->childrens().begin(), m_root->childrens().end(), [path](auto &&child) { - return child->name() == path; - }); - - if (it == m_root->childrens().end()) { - if (append) { - follow = QString::number(m_root->getChildrenSize() + 1); - root = m_root; - } else { - m_modules.append(module); - return; - } - } else { - root = (*it); - } - } - bool ok; - int index = follow.toInt(&ok) - 1; - if (!ok) { - index = -1; - for (int i = 0; index == -1 && i < root->getChildrenSize(); i++) { - if (root->children(i)->name() == follow) - index = i + 1; - } - } - if (index == -1) { - if (append) { - index = m_root->getChildrenSize(); - } else { - m_modules.append(module); - return; - } - } - root->insertChild(index, module); - - m_prameProxy->append(module); - dccV20::ModuleInterface *inter = module->inter(); - inter->setFrameProxy(m_prameProxy); - if (inter->follow() != MAINWINDOW && m_prameProxy) { - m_prameProxy->setSearchPath(inter); - } - inter->preInitialize(false); - inter->initialize(); - } -} - -/////////////////////////// -AdapterV20toV23Plugin::AdapterV20toV23Plugin(QObject *parent) - : PluginInterface(parent) -{ -} - -AdapterV20toV23Plugin::~AdapterV20toV23Plugin() -{ -} - -QString AdapterV20toV23Plugin::name() const -{ - return "adapterv20tov23"; -} - -QString AdapterV20toV23Plugin::follow() const -{ - return PluginInterface::follow(); -} - -DCC_NAMESPACE::ModuleObject *AdapterV20toV23Plugin::module() -{ - auto root = new AdapterV20toV23Root; - root->init(); - return root; -} diff --git a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.h b/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.h deleted file mode 100644 index 13cdd7756f..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/adapterv20tov23plugin.h +++ /dev/null @@ -1,68 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef ADAPTERV20TOV23PLUGIN_H -#define ADAPTERV20TOV23PLUGIN_H - -#include "interface/moduleobject.h" -#include "interface/plugininterface.h" -class QEvent; -class QTimer; - -class FrameProxyV20; -class PluginManagerV20; -class AdapterV20toV23Module; - -class AdapterV20toV23Root : public DCC_NAMESPACE::ModuleObject -{ - Q_OBJECT -public: - explicit AdapterV20toV23Root(QObject *parent = nullptr); - ~AdapterV20toV23Root(); - - void init(); - bool loadFinished() const; - ModuleObject *moduleRoot() const; - -public Q_SLOTS: - void timerTask(); - void pushModule(); - void insertModule(bool append); - -private: - enum Status{ - WaitParent, - GetPaths, - LoadPlugin, - InsertModule, - InsertAllModule, // 对于找不到位置的插到最后 - LoadFinished, - }; - ModuleObject *m_root; - QTimer *m_timer; - FrameProxyV20 *m_prameProxy; - PluginManagerV20 *m_pluginManagerV20; - Status m_status; - QStringList m_pluginPaths; - QList m_modules; - int m_tryCount; - -}; - -class AdapterV20toV23Plugin : public DCC_NAMESPACE::PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.AdapterV20toV23" FILE "plugin-adapterv20tov23.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - explicit AdapterV20toV23Plugin(QObject *parent = nullptr); - ~AdapterV20toV23Plugin(); - - virtual QString name() const override; - virtual QString follow() const override; - virtual DCC_NAMESPACE::ModuleObject *module() override; - -}; - -#endif // ADAPTERV20TOV23PLUGIN_H diff --git a/dcc-old/src/plugin-adapterv20tov23/frameproxyinterface.h b/dcc-old/src/plugin-adapterv20tov23/frameproxyinterface.h deleted file mode 100644 index 466b7002eb..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/frameproxyinterface.h +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include - -class QWidget; -class QString; - -namespace dccV20 { -class ModuleInterface; -class FrameProxyInterface -{ -public: - enum PushType { - Replace, - CoverTop, - Normal, - DirectTop, - Count - }; - -public: - // Module request to into next page - virtual void pushWidget(ModuleInterface *const inter, QWidget *const w, PushType type = Normal) = 0; - virtual void popWidget(ModuleInterface *const inter) = 0; - virtual void setModuleVisible(ModuleInterface *const inter, const bool visible) = 0; - virtual void showModulePage(const QString &module, const QString &page, bool animation) = 0; - virtual void setModuleSubscriptVisible(const QString &module, bool bIsDisplay) = 0; - - Q_DECL_DEPRECATED virtual void setRemoveableDeviceStatus(QString type, bool state) = 0; - Q_DECL_DEPRECATED virtual bool getRemoveableDeviceStatus(QString type) const = 0; - - virtual void setSearchPath(ModuleInterface *const inter) const = 0; - virtual void addChildPageTrans(const QString &menu, const QString &rran) = 0; - - virtual void setModuleVisible(const QString &module, bool visible) = 0; - virtual void setWidgetVisible(const QString &module, const QString &widget, bool visible) = 0; - virtual void setDetailVisible(const QString &module, const QString &widget, const QString &detail, bool visible) = 0; - virtual void updateSearchData(const QString &module) = 0; - virtual QString moduleDisplayName(const QString &module) const = 0; -public: - ModuleInterface *currModule() const { return m_currModule; } - -protected: - void setCurrModule(ModuleInterface *const m) { m_currModule = m; } - -private: - ModuleInterface *m_currModule{nullptr}; -}; -} diff --git a/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.cpp b/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.cpp deleted file mode 100644 index f2285b0f40..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.cpp +++ /dev/null @@ -1,185 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "frameproxyv20.h" -#include "moduleinterface.h" - -#include -#include -#include - -using namespace dccV20; - -FrameProxyV20::FrameProxyV20(QObject *parent) - : QObject(parent) - , m_rootModule(nullptr) - , m_topWidget(nullptr) -{ -} - -void FrameProxyV20::setRootModule(DCC_NAMESPACE::ModuleObject *rootModule) -{ - m_rootModule = rootModule; -} - -void FrameProxyV20::append(AdapterV20toV23Module *module) -{ - m_moduleMap.insert(module->inter(), module); - connect(module,&AdapterV20toV23Module::actived,this,&FrameProxyV20::popAllWidgets); -} - -void FrameProxyV20::pushWidget(ModuleInterface *const inter, QWidget *const w, dccV20::FrameProxyInterface::PushType type) -{ - if (!m_moduleMap.contains(inter)) - return; - - AdapterV20toV23Module *module = m_moduleMap.value(inter); - switch (type) { - case Replace: // 替换三级页面。当在新的三级页面中单击“pop”按钮时,返回到旧的三级页面 - case CoverTop: //根据当前页面宽度去计算新增的页面放在最后面一层,或者Top页面 - case DirectTop: //不需要管页面宽度,直接将新增页面放在Top页面;为解决某些页面使用CoverTop无法全部示的问题 - if (m_topWidget) - popWidget(inter); - - module->setChildPage(m_widgets.size(), w); - m_topWidget = w; - m_widgets.push(w); - break; - case Normal: - default: - while (m_widgets.size() > 1) - popWidget(inter); - - module->setChildPage(m_widgets.size(), w); - m_widgets.push(w); - break; - } -} - -void FrameProxyV20::popWidget(ModuleInterface *const inter) -{ - Q_UNUSED(inter) - if (m_widgets.isEmpty()) - return; - - QWidget *w = m_widgets.pop(); - for (auto &&module : m_moduleMap) - module->popWidget(w); - - if (m_topWidget == w) - m_topWidget = nullptr; -} - -void FrameProxyV20::setModuleVisible(ModuleInterface *const inter, const bool visible) -{ - if (m_moduleMap.contains(inter)) - m_moduleMap.value(inter)->setHidden(!visible); -} - -void FrameProxyV20::showModulePage(const QString &module, const QString &page, bool animation) -{ - // DBus 切换页面 module/page - Q_UNUSED(animation) - QString arg = module; - if (!page.isEmpty()) - arg += "/" + page; - QDBusMessage message = QDBusMessage::createMethodCall("com.deepin.dde.ControlCenter", "/com/deepin/dde/ControlCenter", "com.deepin.dde.ControlCenter", "ShowPage"); - message << arg; - QDBusConnection::sessionBus().asyncCall(message); -} - -void FrameProxyV20::setModuleSubscriptVisible(const QString &module, bool bIsDisplay) -{ - Q_UNUSED(module); - Q_UNUSED(bIsDisplay); -} -// 该函数已废弃 -void FrameProxyV20::setRemoveableDeviceStatus(QString type, bool state) -{ - Q_UNUSED(type); - Q_UNUSED(state); -} -// 该函数已废弃 -bool FrameProxyV20::getRemoveableDeviceStatus(QString type) const -{ - Q_UNUSED(type); - return false; -} - -void FrameProxyV20::setSearchPath(ModuleInterface *const inter) const -{ - Q_UNUSED(inter) -} - -void FrameProxyV20::addChildPageTrans(const QString &menu, const QString &rran) -{ - Q_UNUSED(menu) - Q_UNUSED(rran) -} - -void FrameProxyV20::setModuleVisible(const QString &module, bool visible) -{ - auto find_it = std::find_if(m_moduleMap.cbegin(), m_moduleMap.cend(), [module](auto &it) { - return it->displayName() == module; - }); - if (find_it != m_moduleMap.cend()) - find_it.value()->setHidden(!visible); -} - -void FrameProxyV20::setWidgetVisible(const QString &module, const QString &widget, bool visible) -{ - auto find_it = std::find_if(m_moduleMap.cbegin(), m_moduleMap.cend(), [module](auto &it) { - return it->displayName() == module; - }); - if (find_it == m_moduleMap.cend()) - return; - - QStringList content = find_it.value()->contentText(); - if (visible) { - if (content.contains(widget)) - content.append(widget); - } else { - content.removeAll(widget); - } - find_it.value()->setContentText(content); -} - -void FrameProxyV20::setDetailVisible(const QString &module, const QString &widget, const QString &detail, bool visible) -{ - auto find_it = std::find_if(m_moduleMap.cbegin(), m_moduleMap.cend(), [module, widget](auto &it) { - return it->displayName() == widget || it->displayName() == module; - }); - if (find_it == m_moduleMap.cend()) - return; - - if (visible) - find_it.value()->addContentText(detail); - else { - QStringList content = find_it.value()->contentText(); - content.removeAll(detail); - find_it.value()->setContentText(content); - } -} - -void FrameProxyV20::updateSearchData(const QString &module) -{ - Q_UNUSED(module); -} - -QString FrameProxyV20::moduleDisplayName(const QString &module) const -{ - auto find_it = std::find_if(m_moduleMap.cbegin(), m_moduleMap.cend(), [module](auto &it) { - return it->name() == module; - }); - if (find_it == m_moduleMap.cend()) { - qDebug() << "Not found module:" << module; - return QString(); - } - return find_it.key()->displayName(); -} - -void FrameProxyV20::popAllWidgets() -{ - m_topWidget = nullptr; - m_widgets.clear(); -} diff --git a/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.h b/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.h deleted file mode 100644 index adef7efd9b..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/frameproxyv20.h +++ /dev/null @@ -1,58 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef FRAMEPROXYV20_H -#define FRAMEPROXYV20_H - -#include "frameproxyinterface.h" -#include "adapterv20tov23module.h" - -#include - -class QEvent; -class QTimer; -namespace dccV20 { -class ModuleInterface; -} -class FrameProxyV20 : public QObject, public dccV20::FrameProxyInterface -{ -public: - explicit FrameProxyV20(QObject *parent = nullptr); - ~FrameProxyV20() = default; - -public: - void setRootModule(DCC_NAMESPACE::ModuleObject *rootModule); - void append(AdapterV20toV23Module *module); - -public: - // Module request to into next page - virtual void pushWidget(dccV20::ModuleInterface *const inter, QWidget *const w, dccV20::FrameProxyInterface::PushType type = Normal) override; - virtual void popWidget(dccV20::ModuleInterface *const inter) override; - virtual void setModuleVisible(dccV20::ModuleInterface *const inter, const bool visible) override; - virtual void showModulePage(const QString &module, const QString &page, bool animation) override; - virtual void setModuleSubscriptVisible(const QString &module, bool bIsDisplay) override; - - virtual void setRemoveableDeviceStatus(QString type, bool state) override; // Q_DECL_DEPRECATED - virtual bool getRemoveableDeviceStatus(QString type) const override; // Q_DECL_DEPRECATED - - virtual void setSearchPath(dccV20::ModuleInterface *const inter) const override; - virtual void addChildPageTrans(const QString &menu, const QString &rran) override; - - virtual void setModuleVisible(const QString &module, bool visible) override; - virtual void setWidgetVisible(const QString &module, const QString &widget, bool visible) override; - virtual void setDetailVisible(const QString &module, const QString &widget, const QString &detail, bool visible) override; - virtual void updateSearchData(const QString &module) override; - virtual QString moduleDisplayName(const QString &module) const override; - -private: - void popAllWidgets(); - -private: - QMap m_moduleMap; - QStack m_widgets; - DCC_NAMESPACE::ModuleObject *m_rootModule; - QWidget *m_topWidget; -}; - -#endif // FRAMEPROXYV20_H diff --git a/dcc-old/src/plugin-adapterv20tov23/moduleinterface.h b/dcc-old/src/plugin-adapterv20tov23/moduleinterface.h deleted file mode 100644 index 7fb7c96410..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/moduleinterface.h +++ /dev/null @@ -1,190 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "frameproxyinterface.h" - -#include -#include -#include - -#include - -DGUI_USE_NAMESPACE - -//struct ModuleMetadata { -// QString icon; -// QString title; -//}; - -#define MAINWINDOW "mainwindow" -#define DISPLAY "display" -#define DEFAPP "defapp" -#define PERSONALIZATION "personalization" -#define COMMONINFO "commoninfo" -#define SOUND "sound" -#define DATETIME "datetime" -#define POWER "power" -#define KEYBOARD "keyboard" -#define SYSTEMINFO "systeminfo" -#define MOUSE "mouse" - -namespace dccV20 { - -// ModuleInterface_V1_0作为每个规范每个Module的接口,每个Module实现必须实现其所有虚函数。 -class ModuleInterface -{ -public: - ModuleInterface() = default; - ModuleInterface(FrameProxyInterface *frameProxy) : m_frameProxy(frameProxy) {} - virtual ~ModuleInterface() {} - - void setFrameProxy(FrameProxyInterface *frameProxy) { m_frameProxy = frameProxy; } - - // preInitialize会在模块初始化时被调用,用于模块在准备阶段进行资源的初始化; - // preInitialize不允许进行高资源的操作; - virtual void preInitialize(bool sync = false,FrameProxyInterface::PushType = FrameProxyInterface::PushType::Normal) {Q_UNUSED(sync)} - - // initialize初始化相应的模块,参数proxy用于Moudle向Frame信息查询和主动调用; - // 返回Module的id; - // initialize的时候不能做资源占用较高的操作; - virtual void initialize() = 0; - - // reset module settings - virtual void reset() {} - - /// - /// \brief name - /// your module name - /// \return - /// - virtual const QString name() const = 0; - - /// - /// \brief name - /// 模块名,用于显示 - /// \return - /// - virtual const QString displayName() const = 0; - - /// - /// \brief icon - /// get module icon path - /// \return - /// - virtual QIcon icon() const { - return DIconTheme::findQIcon(QString("dcc_nav_%1").arg(name())); - } - - /// - /// \brief translationPath - /// 获取多语言文件的路径,用以搜索 - /// \return QString - /// - virtual QString translationPath() const { - return QStringLiteral(":/translations/dde-control-center_%1.ts"); - } - - /// - /// \brief showPage - /// show specified module page - /// \param pageName - /// the page name - /// - virtual void showPage(const QString &pageName) { Q_UNUSED(pageName); } - - // 返回模块主Widget; - virtual QWidget *moduleWidget() { return nullptr;} - - /// - /// \brief contentPopped - /// call when specific widget popped - /// \param w - /// - virtual void contentPopped(QWidget *const w) { Q_UNUSED(w);} - - /// - /// \brief active - /// 当模块第一次被点击进入时,active会被调用,如果是插件,重载的时候必须声明为slots,否则加载不了 - virtual void active() {} - - /// - /// \brief active - /// 当模块被销毁时,deactive会被调用 - virtual void deactive() {} - - /// - /// \brief load - /// 当搜索到相关字段后,lead会被调用 - /// 如果可以正常显示则返回 0, 否则返回非0 - virtual int load(const QString &path) { - Q_UNUSED(path); - return 0; - } - - virtual QStringList availPage() const { return QStringList(); } - - /** - * @brief path - * @return 插件级别及二级菜单插件所属模块 - */ - virtual QString path() const { - return QString(); - } - - /** - * @brief follow - * @return 插件插入位置,可以字符串或者数字 - */ - virtual QString follow() const { - return QString(); - } - - /** - * @brief enabled - * @return 插件是否处于可用状态 - */ - virtual bool enabled() const { - return true; - } - - /** - * @brief addChildPageTrans - * @return 添加插件二级菜单翻译内容 - */ - virtual void addChildPageTrans() const {}; - -public: - inline void setAvailable(bool isAvailable) { m_available = isAvailable; } - inline bool isAvailable() const { return m_available; } - inline void setEnabled(bool value) { - QWidget *mainwindow = dynamic_cast(m_frameProxy); - if (mainwindow) { - mainwindow->setEnabled(value); - } - } - - inline bool deviceUnavailabel() const - { - return m_deviceUnavailabel; - } - - inline void setDeviceUnavailabel(bool deviceUnavailabel) - { - m_deviceUnavailabel = deviceUnavailabel; - } - -protected: - FrameProxyInterface *m_frameProxy{nullptr}; - bool m_available{true}; - bool m_deviceUnavailabel{false}; - -private: - virtual void initSearchData() {}; -}; - -} - -#define ModuleInterface_V1_0_iid "com.deepin.dde.ControlCenter.module/1.0" -Q_DECLARE_INTERFACE(dccV20::ModuleInterface, ModuleInterface_V1_0_iid) diff --git a/dcc-old/src/plugin-adapterv20tov23/plugin-adapterv20tov23.json b/dcc-old/src/plugin-adapterv20tov23/plugin-adapterv20tov23.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/plugin-adapterv20tov23.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.cpp b/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.cpp deleted file mode 100644 index 60068e51ae..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.cpp +++ /dev/null @@ -1,68 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "pluginmanagerv20.h" -#include "moduleinterface.h" -#include "frameproxyinterface.h" -#include "adapterv20tov23module.h" - -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcAdapterV20toV23Worker, "dcc-adapterv20tov23-worker") -const QString &PluginDirectory = QStringLiteral(DCC_DefaultModuleDirectory); - -using namespace DCC_NAMESPACE; -using namespace dccV20; - -PluginManagerV20::PluginManagerV20() -{ -} - -PluginManagerV20::~PluginManagerV20() -{ -} - -QStringList PluginManagerV20::pluginPath() -{ - QStringList paths; - QDir moduleDir(PluginDirectory); - if (!moduleDir.exists()) { - qCWarning(DdcAdapterV20toV23Worker) << "plugin directory not exists"; - return paths; - } - auto moduleList = moduleDir.entryInfoList(); - for (auto i : moduleList) { - QString path = i.absoluteFilePath(); - if (!QLibrary::isLibrary(path)) - continue; - paths.append(path); - } - return paths; -} - -void PluginManagerV20::loadPlugin(QString path, dccV20::FrameProxyInterface *frameProxy) -{ - Q_UNUSED(frameProxy) - qCDebug(DdcAdapterV20toV23Worker) << "loading module: " << path; - QElapsedTimer et; - et.start(); - QPluginLoader loader(path); - - QObject *instance = loader.instance(); - if (!instance) { - qDebug() << loader.errorString(); - return; - } - - auto *module = qobject_cast(instance); - if (!module) { - return; - } - qCDebug(DdcAdapterV20toV23Worker) << "load plugin Name: " << module->name() << module->displayName(); - qCDebug(DdcAdapterV20toV23Worker) << "load this plugin using time: " << et.elapsed() << "ms"; - m_modules.append(new AdapterV20toV23Module(module)); -} diff --git a/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.h b/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.h deleted file mode 100644 index 5aba6ab451..0000000000 --- a/dcc-old/src/plugin-adapterv20tov23/pluginmanagerv20.h +++ /dev/null @@ -1,24 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef PLUGINMANAGERV20_H -#define PLUGINMANAGERV20_H -#include "frameproxyinterface.h" -#include "interface/moduleobject.h" - -class AdapterV20toV23Module; - -class PluginManagerV20 -{ -public: - explicit PluginManagerV20(); - ~PluginManagerV20(); - - QStringList pluginPath(); - void loadPlugin(QString path, dccV20::FrameProxyInterface *frameProxy); - QList modules() { return m_modules; } - -private: - QList m_modules; -}; -#endif // PLUGINMANAGERV20_H diff --git a/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.cpp b/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.cpp deleted file mode 100644 index badcc77d87..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.cpp +++ /dev/null @@ -1,148 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "charamangerdbusproxy.h" - -#include -#include -#include -#include -#include -#include - -const static QString CharaMangerService = QStringLiteral("org.deepin.dde.Authenticate1"); - -const static QString CharaMangerPath = QStringLiteral("/org/deepin/dde/Authenticate1/CharaManger"); -const static QString CharaMangerInterface = QStringLiteral("org.deepin.dde.Authenticate1.CharaManger"); - -const static QString FingerprintPath = QStringLiteral("/org/deepin/dde/Authenticate1/Fingerprint"); -const static QString FingerprintInterface = QStringLiteral("org.deepin.dde.Authenticate1.Fingerprint"); - -const static QString SessionManagerService = QStringLiteral("org.deepin.dde.SessionManager1"); -const static QString SessionManagerPath = QStringLiteral("/org/deepin/dde/SessionManager1"); -const static QString SessionManagerInterface = QStringLiteral("org.deepin.dde.SessionManager1"); - -const static QString PropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); -const static QString PropertiesChanged = QStringLiteral("PropertiesChanged"); - -CharaMangerDBusProxy::CharaMangerDBusProxy(QObject *parent) - : QObject(parent) - , m_charaMangerInter(new QDBusInterface(CharaMangerService, CharaMangerPath, CharaMangerInterface, QDBusConnection::systemBus(), this)) - , m_fingerprintInter(new QDBusInterface(CharaMangerService, FingerprintPath, FingerprintInterface, QDBusConnection::systemBus(), this)) - , m_SMInter(new QDBusInterface(SessionManagerService, SessionManagerPath, SessionManagerInterface, QDBusConnection::sessionBus(), this)) -{ - QDBusConnection::systemBus().connect(CharaMangerService, CharaMangerPath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); - QDBusConnection::systemBus().connect(CharaMangerService, FingerprintPath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); - QDBusConnection::sessionBus().connect(SessionManagerService, SessionManagerPath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); - - connect(m_charaMangerInter, SIGNAL(EnrollStatus(const QString &, int , const QString &)),this,SIGNAL(EnrollStatusCharaManger(const QString &, int , const QString &))); - connect(m_charaMangerInter, SIGNAL(CharaUpdated(const QString &, int)), this, SIGNAL(CharaUpdated(const QString &, int))); - connect(m_charaMangerInter, SIGNAL(DriverChanged()), this, SIGNAL(DriverChanged())); - - connect(m_fingerprintInter, SIGNAL(EnrollStatus(const QString &, int , const QString &)),this,SIGNAL(EnrollStatusFingerprint(const QString &, int , const QString &))); - connect(m_fingerprintInter, SIGNAL(Touch(const QString &, bool )),this,SIGNAL(Touch(const QString &, bool ))); -} - -void CharaMangerDBusProxy::setFingerprintInterTimeout(int timeout) -{ - m_fingerprintInter->setTimeout(timeout); -} - -QString CharaMangerDBusProxy::List(const QString &driverName, int charaType) -{ - QList argumentList; - argumentList << QVariant::fromValue(driverName) << QVariant::fromValue(charaType); - return QDBusPendingReply(m_charaMangerInter->asyncCallWithArgumentList(QStringLiteral("List"), argumentList)); -} - -QString CharaMangerDBusProxy::driverInfo() -{ - return qvariant_cast(m_charaMangerInter->property("DriverInfo")); -} - -QDBusPendingReply CharaMangerDBusProxy::EnrollStart(const QString &driverName, int charaType, const QString &charaName) -{ - QList argumentList; - argumentList << QVariant::fromValue(driverName) << QVariant::fromValue(charaType) << QVariant::fromValue(charaName); - return m_charaMangerInter->asyncCallWithArgumentList(QStringLiteral("EnrollStart"), argumentList); -} - -QDBusPendingReply<> CharaMangerDBusProxy::EnrollStop() -{ - QList argumentList; - return m_charaMangerInter->asyncCallWithArgumentList(QStringLiteral("EnrollStop"), argumentList); -} - -QDBusPendingReply<> CharaMangerDBusProxy::Delete(int charaType, const QString &charaName) -{ - QList argumentList; - argumentList << QVariant::fromValue(charaType) << QVariant::fromValue(charaName); - return m_charaMangerInter->asyncCallWithArgumentList(QStringLiteral("Delete"), argumentList); -} - -QDBusPendingReply<> CharaMangerDBusProxy::Rename(int charaType, const QString &oldName, const QString &newName) -{ - QList argumentList; - argumentList << QVariant::fromValue(charaType) << QVariant::fromValue(oldName) << QVariant::fromValue(newName); - return m_charaMangerInter->asyncCallWithArgumentList(QStringLiteral("Rename"), argumentList); -} - -void CharaMangerDBusProxy::setFingerprintTimeout(int timeout) -{ - m_fingerprintInter->setTimeout(timeout); -} - -QString CharaMangerDBusProxy::defaultDevice() -{ - return qvariant_cast(m_fingerprintInter->property("DefaultDevice")); -} - -QDBusPendingReply<> CharaMangerDBusProxy::Claim(const QString &username, bool claimed) -{ - QList argumentList; - argumentList << QVariant::fromValue(username) << QVariant::fromValue(claimed); - return m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("Claim"), argumentList); -} - -QDBusPendingReply<> CharaMangerDBusProxy::Enroll(const QString &finger) -{ - QList argumentList; - argumentList << QVariant::fromValue(finger); - return m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("Enroll"), argumentList); - -} - -QStringList CharaMangerDBusProxy::ListFingers(const QString &username) -{ - QList argumentList; - argumentList << QVariant::fromValue(username); - return QDBusPendingReply(m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("ListFingers"), argumentList)); -} - -void CharaMangerDBusProxy::StopEnroll() -{ - QList argumentList; - m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("StopEnroll"), argumentList); -} - -QDBusPendingReply<> CharaMangerDBusProxy::DeleteFinger(const QString &username, const QString &finger) -{ - QList argumentList; - argumentList << QVariant::fromValue(username) << QVariant::fromValue(finger); - return m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("DeleteFinger"), argumentList); -} - -void CharaMangerDBusProxy::RenameFinger(const QString &username, const QString &finger, const QString &newName) -{ - QList argumentList; - argumentList << QVariant::fromValue(username) << QVariant::fromValue(finger) << QVariant::fromValue(newName); - m_fingerprintInter->asyncCallWithArgumentList(QStringLiteral("RenameFinger"), argumentList); -} - -void CharaMangerDBusProxy::onPropertiesChanged(const QDBusMessage &message) -{ - QVariantMap changedProps = qdbus_cast(message.arguments().at(1).value()); - for (QVariantMap::const_iterator it = changedProps.begin(); it != changedProps.end(); ++it) { - QMetaObject::invokeMethod(this, it.key().toLatin1() + "Changed", Qt::DirectConnection, QGenericArgument(it.value().typeName(), it.value().data())); - } -} diff --git a/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.h b/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.h deleted file mode 100644 index 5e3370dc01..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangerdbusproxy.h +++ /dev/null @@ -1,64 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef CHARAMANGERDBUSPROXY_H -#define CHARAMANGERDBUSPROXY_H - -#include -#include -#include -#include - -class QDBusInterface; -class QDBusMessage; -class CharaMangerDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit CharaMangerDBusProxy(QObject *parent = nullptr); - - void setFingerprintInterTimeout(int timeout); - -public: - // CharaManger - QString List(const QString &driverName, int charaType); - QString driverInfo(); - QDBusPendingReply EnrollStart(const QString &driverName, int charaType, const QString &charaName); - QDBusPendingReply<> EnrollStop(); - QDBusPendingReply<> Delete(int charaType, const QString &charaName); - QDBusPendingReply<> Rename(int charaType, const QString &oldName, const QString &newName); - - // Fingerprint - void setFingerprintTimeout(int timeout); - QString defaultDevice(); - QDBusPendingReply<> Claim(const QString &username, bool claimed); - QDBusPendingReply<> Enroll(const QString &finger); - QStringList ListFingers(const QString &username); - void StopEnroll(); - QDBusPendingReply<> DeleteFinger(const QString &username, const QString &finger); - void RenameFinger(const QString &username, const QString &finger, const QString &newName); - -signals: - // CharaManger signals - void CharaUpdated(const QString &charaName, int CharaType); - void DriverChanged(); - void EnrollStatusCharaManger(const QString &Sender, int Code, const QString &Msg); - void DriverInfoChanged(const QString & value) const; - - // Fingerprint signals - void EnrollStatusFingerprint(const QString &id, int code, const QString &msg); - void Touch(const QString &id, bool pressed); - - // SessionManager singnals - void LockedChanged(bool value) const; - -private slots: - void onPropertiesChanged(const QDBusMessage &message); - -private: - QDBusInterface *m_charaMangerInter; - QDBusInterface *m_fingerprintInter; - QDBusInterface *m_SMInter; -}; - -#endif // CHARAMANGERDBUSPROXY_H diff --git a/dcc-old/src/plugin-authentication/operation/charamangermodel.cpp b/dcc-old/src/plugin-authentication/operation/charamangermodel.cpp deleted file mode 100644 index b4b15f75af..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangermodel.cpp +++ /dev/null @@ -1,372 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "charamangermodel.h" - -#include -#include -#include - -CharaMangerModel::CharaMangerModel(QObject *parent) - : QObject (parent) - , m_isFaceDriverVaild(false) - , m_facesList(QStringList()) - , m_isIrisDriverVaild(false) - , m_irisList(QStringList()) - , m_charaVaild(false) -{ - initFingerModel(); - connect(this, &CharaMangerModel::vaildFingerChanged, this, &CharaMangerModel::checkCharaVaild); - connect(this, &CharaMangerModel::vaildFaceDriverChanged, this, &CharaMangerModel::checkCharaVaild); - connect(this, &CharaMangerModel::vaildIrisDriverChanged, this, &CharaMangerModel::checkCharaVaild); -} - -void CharaMangerModel::setFaceDriverVaild(bool isVaild) -{ - if (m_isFaceDriverVaild == isVaild) - return; - m_isFaceDriverVaild = isVaild; - - Q_EMIT vaildFaceDriverChanged(isVaild); -} - -void CharaMangerModel::setFaceDriverName(const QString &driverName) -{ - if (m_faceDriverName == driverName) - return; - m_faceDriverName = driverName; -} - -void CharaMangerModel::setFacesList(const QStringList &faces) -{ - if (faces == m_facesList) - return; - - m_facesList = faces; - Q_EMIT facesListChanged(faces); -} - -void CharaMangerModel::setIrisDriverVaild(bool isVaild) -{ - if (m_isIrisDriverVaild == isVaild) - return; - m_isIrisDriverVaild = isVaild; - - Q_EMIT vaildIrisDriverChanged(isVaild); -} - -void CharaMangerModel::setIrisDriverName(const QString &driverName) -{ - if (driverName == m_irisDriverName) - return; - - m_irisDriverName = driverName; -} - -void CharaMangerModel::setIrisList(const QStringList &iris) -{ - if (iris == m_irisList) - return; - - m_irisList.clear(); - m_irisList = iris; - Q_EMIT irisListChanged(iris); -} - -void CharaMangerModel::setInputFaceFD(const int &fd) -{ - Q_EMIT tryStartInputFace(fd); -} - -void CharaMangerModel::setInputIrisFD(CharaMangerModel::AddInfoState state) -{ - Q_EMIT tryStartInputIris(state); -} - -void CharaMangerModel::initFingerModel() -{ - m_isFingerVaild = false; - - m_predefineThumbsNames = { - tr("Fingerprint1"), tr("Fingerprint2"), tr("Fingerprint3"), - tr("Fingerprint4"), tr("Fingerprint5"), tr("Fingerprint6"), - tr("Fingerprint7"), tr("Fingerprint8"), tr("Fingerprint9"), - tr("Fingerprint10") - }; - m_progress = 0; -} - -void CharaMangerModel::setFingerVaild(bool isVaild) -{ - if (m_isFingerVaild == isVaild) - return; - - m_isFingerVaild = isVaild; - - Q_EMIT vaildFingerChanged(isVaild); -} - -void CharaMangerModel::setUserName(const QString &name) -{ - if (m_userName != name) - m_userName = name; -} - -void CharaMangerModel::onFingerEnrollStatusChanged(int code, const QString& msg) -{ - QJsonDocument jsonDocument; - QJsonObject jsonObject; - - if (!msg.isEmpty()) { - jsonDocument = QJsonDocument::fromJson(msg.toLocal8Bit()); - jsonObject = jsonDocument.object(); - } - - switch(code) { - case ET_Completed: - m_progress = 0; - Q_EMIT enrollCompleted(); - break; - case ET_Failed: { - m_progress = 0; - QString title = tr("Scan failed"); - QString msg = ""; - do { - QStringList keys = jsonObject.keys(); - if (!keys.contains("subcode")) { - break; - } - auto errCode = jsonObject.value("subcode").toInt(); - switch(errCode) { - case FC_RepeatTemplet: - title = tr("The fingerprint already exists"); - msg = tr("Please scan other fingers"); - break; - case FC_UnkownError: - title = tr("Unknown error"); - msg = tr("Scan suspended"); - } - break; - } while(0); - Q_EMIT enrollFailed(title, msg); - break; - } - case ET_StagePass: { - if (msg.isEmpty()) { - // 厂商未给出进度值的情况,直接让进度值递减增加,无限趋近于100,直到录入完成 - m_progress += (100 - m_progress)/3; - Q_EMIT enrollStagePass(m_progress); - break; - } - QStringList keys = jsonObject.keys(); - if (!keys.contains("progress")) { - // 厂商未给出进度值的情况,直接让进度值递减增加,无限趋近于100,直到录入完成 - m_progress += (100 - m_progress)/3; - Q_EMIT enrollStagePass(m_progress); - break; - } - auto pro = jsonObject.value("progress").toInt(); - Q_EMIT enrollStagePass(pro); - break; - } - case ET_Retry: { - QString title = tr("Cannot recognize"); - QString msg = tr("Cannot recognize"); - do { - QStringList keys = jsonObject.keys(); - if (!keys.contains("subcode")) { - break; - } - auto errCode = jsonObject.value("subcode").toInt(); - switch(errCode) { - case RC_TouchTooShort: //接触时间过短 - title = tr("Moved too fast"); - msg = tr("Finger moved too fast, please do not lift until prompted"); - break; - case RC_ErrorFigure: //图像不可用 - title = tr("Unclear fingerprint"); - msg = tr("Clean your finger or adjust the finger position, and try again"); - break; - case RC_RepeatTouchData: //重复率过高 - title = tr("Already scanned"); - msg = tr("Adjust the finger position to scan your fingerprint fully"); - break; - case RC_RepeatFingerData: //重复手指 - title = tr("The fingerprint already exists"); - msg = tr("Please scan other fingers"); - break; - case RC_SwipeTooShort: //按压时间短 - title = tr("Moved too fast"); - msg = tr("Finger moved too fast. Please do not lift until prompted"); - break; - case RC_FingerNotCenter: //手指不在中间 - msg = tr("Adjust the finger position to scan your fingerprint fully"); - break; - case RC_RemoveAndRetry: // 拿开手指从新扫描 - msg = tr("Clean your finger or adjust the finger position, and try again"); - break; - case RC_CannotRecognize: - title = tr("Cannot recognize"); - msg = tr("Lift your finger and place it on the sensor again"); - break; - } - break; - } while(0); - Q_EMIT enrollRetry(title, msg); - break; - } - case ET_Disconnect: - Q_EMIT enrollDisconnected(); - break; - default: - break; - } -} - -void CharaMangerModel::onTouch(const QString &id, bool pressed) -{ -} - -void CharaMangerModel::refreshEnrollResult(CharaMangerModel::EnrollResult enrollRes) -{ - Q_EMIT enrollResult(enrollRes); -} - -void CharaMangerModel::setThumbsList(const QStringList &thumbs) -{ - if (thumbs != m_thumbsList) { - m_thumbsList.clear(); - m_thumbsList = thumbs; - Q_EMIT thumbsListChanged(m_thumbsList); - } -} - -void CharaMangerModel::onEnrollStatusChanged(int code, const QString &msg) -{ - // TODO: 处理所有录入状态提示信息 - Q_UNUSED(msg); - QString title = tr("Position your face inside the frame"); - switch (code) { - case STATUS_SUCCESS: - Q_EMIT enrollInfoState(AddInfoState::Success, tr("Face enrolled")); - break; - case STATUS_CANCELED: - break; - case STATUS_NOT_REAL_HUMAN: - title = tr("Position a human face please"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_NOT_CENTER: - title = tr("Position your face inside the frame"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_TOO_BIG: - title = tr("Keep away from the camera"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_TOO_SMALL: - title = tr("Get closer to the camera"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_NO_FACE: - title = tr("Position your face inside the frame"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_TOO_MANY: - title = tr("Do not position multiple faces inside the frame"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_NOT_CLEARITY: - title = tr("Make sure the camera lens is clean"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_BRIGHTNESS: - title = tr("Do not enroll in dark, bright or backlit environments"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_FACE_COVERD: - title = tr("Keep your face uncovered"); - Q_EMIT enrollStatusTips(title); - break; - case STATUS_OVERTIME: - Q_EMIT enrollInfoState(AddInfoState::Fail, tr("Scan timed out")); - break; - case STATUS_COLLAPSE: - Q_EMIT enrollInfoState(AddInfoState::Fail, tr("Device crashed, please scan again!")); - break; - default: - break; - } -} - -void CharaMangerModel::onEnrollIrisStatusChanged(int code, const QString &msg) -{ - // TODO: 处理所有录入状态提示信息 未更新 - Q_UNUSED(msg); - QString title = tr("Position your face inside the frame"); - switch (code) { - case STATUS_IRIS_SUCCESS: - Q_EMIT enrollIrisInfoState(AddInfoState::Success, tr("Face enrolled")); - break; - case STATUS_IRIS_TOO_BIG: - break; - case STATUS_IRIS_TOO_SMALL: - title = tr("Position a human face please"); - Q_EMIT enrollIrisStatusTips(title); - break; - case STATUS_IRIS_NO_FACE: - title = tr("Position your face inside the frame"); - Q_EMIT enrollIrisStatusTips(title); - break; - case STATUS_IRIS_NOT_CLEARITY: - title = tr("Keep away from the camera"); - Q_EMIT enrollIrisStatusTips(title); - break; - case STATUS_IRIS_BRIGHTNESS: - title = tr("Get closer to the camera"); - Q_EMIT enrollIrisStatusTips(title); - break; - case STATUS_IRIS_EYES_CLOSE: - title = tr("Position your face inside the frame"); - Q_EMIT enrollIrisStatusTips(title); - break; - case STATUS_IRIS_CANCELED: - Q_EMIT enrollIrisInfoState(AddInfoState::Fail, tr("Cancel")); - break; - case STATUS_IRIS_Error: - Q_EMIT enrollIrisInfoState(AddInfoState::Fail, tr("Device crashed, please scan again!")); - break; - case STATUS_IRIS_OVERTIME: - Q_EMIT enrollIrisInfoState(AddInfoState::Fail, tr("Scan timed out")); - break; - default: - break; - } -} - -void CharaMangerModel::onRefreshEnrollDate(const int &charaType) -{ - if (charaType & FACE_CHARA) { - Q_EMIT facesListChanged(this->facesList()); - } - - if (charaType & IRIS_CHARA) { - Q_EMIT irisListChanged(this->irisList()); - } -} - - - - -bool CharaMangerModel::charaVaild() const -{ - return m_charaVaild; -} - -void CharaMangerModel::setCharaVaild(bool newCharaVaild) -{ - if (m_charaVaild == newCharaVaild) - return; - m_charaVaild = newCharaVaild; - emit charaVaildChanged(m_charaVaild); -} diff --git a/dcc-old/src/plugin-authentication/operation/charamangermodel.h b/dcc-old/src/plugin-authentication/operation/charamangermodel.h deleted file mode 100644 index c5f8b5d72e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangermodel.h +++ /dev/null @@ -1,238 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef CHARAMANGERMODEL_H -#define CHARAMANGERMODEL_H -#include - -#define FACE_CHARA 4 -#define IRIS_CHARA 64 - -class CharaMangerModel : public QObject -{ - Q_OBJECT - Q_PROPERTY(bool faceDriverVaild READ faceDriverVaild WRITE setFaceDriverVaild NOTIFY vaildFaceDriverChanged) - Q_PROPERTY(QStringList facesList READ facesList WRITE setFacesList NOTIFY facesListChanged) - Q_PROPERTY(bool charaVaild READ charaVaild WRITE setCharaVaild NOTIFY charaVaildChanged) - -public: - /** - * @brief The EnrollStatusType enum 人脸录入状态 - */ - enum EnrollFaceStatusType { - STATUS_SUCCESS = 0, // 成功 - STATUS_NOT_REAL_HUMAN, // 非人类 - STATUS_FACE_NOT_CENTER, // 非中心 - STATUS_FACE_TOO_BIG, // 脸太大 - STATUS_FACE_TOO_SMALL, - STATUS_NO_FACE, - STATUS_FACE_TOO_MANY, // 多人 - STATUS_FACE_NOT_CLEARITY, // 不清晰 - STATUS_FACE_BRIGHTNESS, // 亮度 - STATUS_FACE_COVERD, // 遮挡 - STATUS_CANCELED, // 取消 - STATUS_OVERTIME, // 超时 - STATUS_COLLAPSE // 崩溃 - }; - - /** - * @brief The EnrollIrisStatusType enum - */ - enum EnrollIrisStatusType { - STATUS_IRIS_SUCCESS = 0, // 成功 - STATUS_IRIS_TOO_BIG, // 太大 - STATUS_IRIS_TOO_SMALL, - STATUS_IRIS_NO_FACE, - STATUS_IRIS_NOT_CLEARITY, // 不清晰 - STATUS_IRIS_BRIGHTNESS, // 亮度 - STATUS_IRIS_EYES_CLOSE, // 闭目 - STATUS_IRIS_CANCELED, // 取消 - STATUS_IRIS_Error, // 崩溃 - STATUS_IRIS_OVERTIME // 超时 - }; - - /** - * @brief The AddInfoState enum 录入的四种状态 - */ - enum AddInfoState { - StartState, - Success, - Fail, - Processing, - }; - - /** - * @brief The EnrollResult enum 指纹 - */ - enum EnrollResult { - Enroll_AuthFailed, - Enroll_ClaimFailed, - Enroll_Failed, - Enroll_Success, - Count - }; - - enum EnrollStatusType { - ET_Completed = 0, - ET_Failed, - ET_StagePass, - ET_Retry, - ET_Disconnect - }; - - enum EnrollFailedCode { - FC_UnkownError = 1, - FC_RepeatTemplet, - FC_EnrollBroken, - FC_DataFull - }; - - enum EnrollRetryCode { - RC_TouchTooShort = 1, - RC_ErrorFigure, - RC_RepeatTouchData, - RC_RepeatFingerData, - RC_SwipeTooShort, - RC_FingerNotCenter, - RC_RemoveAndRetry, - RC_CannotRecognize - }; - -public: - explicit CharaMangerModel(QObject *parent = nullptr); - - inline int faceCharaType() const { return FACE_CHARA; } - inline int irisCharaType() const { return IRIS_CHARA; } - - inline bool faceDriverVaild() const { return m_isFaceDriverVaild; } - void setFaceDriverVaild(bool isVaild); - - inline QString faceDriverName() const { return m_faceDriverName; } - void setFaceDriverName(const QString &driverName); - - inline QStringList facesList() const { return m_facesList; } - void setFacesList(const QStringList &faces); - - inline bool irisDriverVaild() const { return m_isIrisDriverVaild; } - void setIrisDriverVaild(bool isVaild); - - inline QString irisDriverName() const { return m_irisDriverName; } - void setIrisDriverName(const QString &driverName); - - inline QStringList irisList() const { return m_irisList; } - void setIrisList(const QStringList &iris); - - /** - * @brief onEnrollStatusChanged 录入状态信号,在录入过程中通过此信号提示当前录入状态 - * @param code - * @param msg - */ - void onEnrollStatusChanged(int code, const QString& msg); - void onEnrollIrisStatusChanged(int code, const QString& msg); - - /** - * @brief onRefreshEnrollDate 用于刷新用户已录入的数据( eg: 重命名失败后) - * @param charaType 对应类型 - */ - void onRefreshEnrollDate(const int &charaType); - - void setInputFaceFD(const int &fd); - void setInputIrisFD(CharaMangerModel::AddInfoState state); - - // Finger - void initFingerModel(); - inline QList getPredefineThumbsName() const { return m_predefineThumbsNames; } - - inline bool fingerVaild() const { return m_isFingerVaild; } - void setFingerVaild(bool isVaild); - - inline QString userName() const { return m_userName; } - void setUserName(const QString &name); - - inline QStringList thumbsList() const { return m_thumbsList; } - void setThumbsList(const QStringList &thumbs); - - void onFingerEnrollStatusChanged(int code, const QString& msg); - void onTouch(const QString &id, bool pressed); - - void resetProgress() { m_progress = 0; } - - void refreshEnrollResult(EnrollResult enrollRes); - - bool charaVaild() const; - void setCharaVaild(bool newCharaVaild = true); - -Q_SIGNALS: - void vaildFaceDriverChanged(const bool isVaild); - void vaildIrisDriverChanged(const bool isVaild); - - void facesListChanged(const QStringList &faces); - void irisListChanged(const QStringList &iris); - - /** - * @brief enrollInfoState 注册录入状态 用于区分页面显示状态 注:仅处理成功录入失败状态 - * @param state 录入的状态 - * @param tips 对应的提示语 - */ - void enrollInfoState(AddInfoState state, const QString &tips); - void enrollStatusTips(QString title); - - /** - * @brief enrollIrisInfoState 注册虹膜录入状态 - * @param state 录入状态 - * @param tips 提示信息 - */ - void enrollIrisInfoState(AddInfoState state, const QString &tips); - void enrollIrisStatusTips(QString title); - - /** - * @brief tryStartInputFace tryStartInputIris 获取人脸虹膜文件标识符 - * @param fd - */ - void tryStartInputFace(const int &fd); - void tryStartInputIris(CharaMangerModel::AddInfoState state); - - // FInger - void vaildFingerChanged(const bool isVaild); - void thumbsListChanged(const QStringList &thumbs); - - void enrollFailed(QString title, QString msg); - void enrollCompleted(); - void enrollStagePass(int pro); - void enrollRetry(QString title, QString msg); - void enrollDisconnected(); - void enrollResult(EnrollResult enrollRes); - - void lockedChanged(bool locked); - - //charaVaild - void charaVaildChanged(const bool isVaild); - -private: - void checkCharaVaild() { - if (m_isIrisDriverVaild || m_isFaceDriverVaild || m_isFingerVaild) - setCharaVaild(); - else - setCharaVaild(false); - } - - // 人脸 - QString m_faceDriverName; - bool m_isFaceDriverVaild; - QStringList m_facesList; - - // 虹膜 - QString m_irisDriverName; - bool m_isIrisDriverVaild; - QStringList m_irisList; - - // 指纹 - QString m_userName; - bool m_isFingerVaild{false}; - int m_progress; - QStringList m_thumbsList; - QList m_predefineThumbsNames; - bool m_charaVaild; -}; - -#endif // CHARAMANGERMODEL_H diff --git a/dcc-old/src/plugin-authentication/operation/charamangerworker.cpp b/dcc-old/src/plugin-authentication/operation/charamangerworker.cpp deleted file mode 100644 index 2177d8b9eb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangerworker.cpp +++ /dev/null @@ -1,413 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "charamangerworker.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include -#include -#include - -#define INPUT_TIME 30 - -CharaMangerWorker::CharaMangerWorker(CharaMangerModel *model, QObject *parent) - : QObject(parent) - , m_model(model) - , m_charaMangerInter(new CharaMangerDBusProxy(this)) - , m_stopTimer(new QTimer(this)) - , m_fileDescriptor(nullptr) - , m_currentInputCharaType(0) -{ - m_stopTimer->setSingleShot(true); - // 监测录入状态 - connect(m_charaMangerInter, &CharaMangerDBusProxy::EnrollStatusCharaManger, this, &CharaMangerWorker::refreshUserEnrollStatus); - - // 若添加新信息 触发本信号 - connect(m_charaMangerInter, &CharaMangerDBusProxy::CharaUpdated, this, &CharaMangerWorker::refreshUserEnrollList); - - // 获取设备信息 - connect(m_charaMangerInter, &CharaMangerDBusProxy::DriverInfoChanged, this, &CharaMangerWorker::predefineDriverInfo); - connect(m_charaMangerInter, &CharaMangerDBusProxy::DriverChanged, this, &CharaMangerWorker::refreshDriverInfo); - - //处理指纹后端的录入状态信号 - connect(m_charaMangerInter, &CharaMangerDBusProxy::EnrollStatusFingerprint, m_model, [this](const QString &, int code, const QString &msg) { - m_model->onFingerEnrollStatusChanged(code, msg); - }); - //当前此信号末实现 - connect(m_charaMangerInter, &CharaMangerDBusProxy::Touch, m_model, &CharaMangerModel::onTouch); - connect(m_charaMangerInter, &CharaMangerDBusProxy::LockedChanged, m_model, &CharaMangerModel::lockedChanged); - - initCharaManger(); - initFinger(); -} - -CharaMangerWorker::~CharaMangerWorker() -{ - if (m_fileDescriptor) { - delete m_fileDescriptor; - m_fileDescriptor = nullptr; - } - if (m_stopTimer) - m_stopTimer->stop(); -} - -void CharaMangerWorker::initCharaManger() -{ - // 获取DeviceInfo属性 - QDBusInterface charaManagerInter("org.deepin.dde.Authenticate1", - "/org/deepin/dde/Authenticate1/CharaManger", - "org.freedesktop.DBus.Properties", - QDBusConnection::systemBus()); - QDBusPendingCall call = charaManagerInter.asyncCall("Get", "org.deepin.dde.Authenticate1.CharaManger", "DriverInfo"); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, [this, call, watcher] { - if (!call.isError()) { - QDBusReply reply = call.reply(); - predefineDriverInfo(reply.value().variant().toString()); - } else { - qWarning() << "Failed to get driver info: " << call.error().message(); - } - watcher->deleteLater(); - }); - - // 录入时间超时 停止录入 - connect(m_stopTimer, &QTimer::timeout, [this] { - if (m_currentInputCharaType & FACE_CHARA) { - m_model->onEnrollStatusChanged(CharaMangerModel::EnrollFaceStatusType::STATUS_OVERTIME, QString()); - } - if (m_currentInputCharaType & IRIS_CHARA) { - m_model->onEnrollIrisStatusChanged(CharaMangerModel::EnrollIrisStatusType::STATUS_IRIS_OVERTIME, QString()); - } - - stopEnroll(); - }); -} - -void CharaMangerWorker::initFinger() -{ - struct passwd *pws; - QString userId; - pws = getpwuid(getuid()); - userId = QString(pws->pw_name); - - auto defualtDevice = m_charaMangerInter->defaultDevice(); - m_model->setFingerVaild(!defualtDevice.isEmpty()); - m_model->setUserName(userId); - - if (!defualtDevice.isEmpty()) { - refreshFingerEnrollList(userId); - } -} - -QMap CharaMangerWorker::parseDriverNameJsonData(const QString &mangerInfo) -{ - QMap tmpInfo; - if (mangerInfo.isEmpty()) - return tmpInfo; - - QJsonDocument doc = QJsonDocument::fromJson(mangerInfo.toUtf8()); - QJsonArray jInfo = doc.array(); - for (QJsonValue jValue : jInfo) { - QJsonObject jObj = jValue.toObject(); - const QString tmpName = jObj["DriverName"].toString(); - const uint tmpType = static_cast(jObj["CharaType"].toInt()); - tmpInfo.insert(tmpName, tmpType); - } - return tmpInfo; -} - -QStringList CharaMangerWorker::parseCharaNameJsonData(const QString &mangerInfo) -{ - QMap tmpInfo; - QStringList userInfoList; - if (mangerInfo.isEmpty()) - return QStringList(); - - QJsonDocument doc = QJsonDocument::fromJson(mangerInfo.toUtf8()); - QJsonArray jInfo = doc.array(); - - for (QJsonValue jValue : jInfo) { - QJsonObject jObj = jValue.toObject(); - const QString tmpName = jObj["CharaName"].toString(); - const uint64_t time = static_cast(jObj["Time"].toInt()); - tmpInfo.insert(tmpName, time); - - QMap::Iterator it = tmpInfo.begin(); - int index = 0; - while (it != tmpInfo.end()) { - if (time > it.value()) { - index++; - } - it++; - } - userInfoList.insert(index, tmpName); - } - - return userInfoList; -} - -void CharaMangerWorker::predefineDriverInfo(const QString &driverInfo) -{ - // 处理界面显示空设备 - m_model->setFaceDriverVaild(false); - m_model->setIrisDriverVaild(false); - if (driverInfo.isNull()) { - return; - } - QStringList faceDriverNames; - QStringList irisDriverNames; - - // TODO: 处理设备信息 - QMap driInfo = parseDriverNameJsonData(driverInfo); - QMap::Iterator it; - - qDebug() << "info: " << driInfo.size() << driverInfo; - // 记录driver信息 - for (it = driInfo.begin(); it != driInfo.end(); ++it) { - // 可用人脸driverName - if (it.value() & FACE_CHARA) { - faceDriverNames.append(it.key()); - m_model->setFaceDriverVaild(false); - } - - if (it.value() & IRIS_CHARA) { - irisDriverNames.append(it.key()); - m_model->setIrisDriverVaild(false); - } - } - - // 获取用户录入的数据 - if (!faceDriverNames.isEmpty()) { - m_model->setFaceDriverVaild(true); - m_model->setFaceDriverName(faceDriverNames.at(0)); - refreshUserEnrollList(faceDriverNames.at(0), FACE_CHARA); - } else { - m_model->setFaceDriverVaild(false); - } - - if (!irisDriverNames.isEmpty()) { - m_model->setIrisDriverVaild(true); - m_model->setIrisDriverName(irisDriverNames.at(0)); - refreshUserEnrollList(irisDriverNames.at(0), IRIS_CHARA); - } else { - m_model->setIrisDriverVaild(false); - } -} - -void CharaMangerWorker::refreshUserEnrollList(const QString &serviceName, const int &CharaType) -{ - auto call = m_charaMangerInter->List(serviceName, CharaType); - qDebug() << "CharaManger List : " << call; - if (call.isEmpty()) { - qDebug() << "facePrintInter ListFaces call Error or MangerList is empty! "; - if (CharaType & FACE_CHARA) - m_model->setFacesList(QStringList()); - - if (CharaType & IRIS_CHARA) - m_model->setIrisList(QStringList()); - - return; - } - refreshUserInfo(call, CharaType); -} - -void CharaMangerWorker::refreshUserInfo(const QString &EnrollInfo, const int &CharaType) -{ - QStringList userInfoList = parseCharaNameJsonData(EnrollInfo); - - if (userInfoList.isEmpty()) { - qDebug() << "get userInfo error! "; - m_model->setFacesList(QStringList()); - m_model->setIrisList(QStringList()); - return; - } - - if (CharaType & FACE_CHARA) - m_model->setFacesList(userInfoList); - if (CharaType & IRIS_CHARA) - m_model->setIrisList(userInfoList); -} - -void CharaMangerWorker::refreshDriverInfo() -{ - auto driverInfo = m_charaMangerInter->driverInfo(); - predefineDriverInfo(driverInfo); -} - -void CharaMangerWorker::entollStart(const QString &driverName, const int &charaType, const QString &charaName) -{ - qDebug() << " CharaMangerWorker::entollStart " << driverName << charaType << charaName; - m_currentInputCharaType = charaType; - - m_fileDescriptor = new QDBusPendingReply(); - *m_fileDescriptor = m_charaMangerInter->EnrollStart(driverName, charaType, charaName); - - Q_EMIT requestMainWindowEnabled(false); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(*m_fileDescriptor, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (m_fileDescriptor->isError()) { - qDebug() << "get File Descriptor error! " << m_fileDescriptor->error(); - } else { - m_stopTimer->start(1000 * INPUT_TIME); - - if (charaType & FACE_CHARA) { - Q_EMIT requestMainWindowEnabled(true); - m_model->setInputFaceFD(m_fileDescriptor->value().fileDescriptor()); - } - - if (charaType & IRIS_CHARA) { - Q_EMIT requestMainWindowEnabled(true); - m_model->setInputIrisFD(CharaMangerModel::AddInfoState::Processing); - } - - } - Q_EMIT requestMainWindowEnabled(true); - watcher->deleteLater(); - }); -} - -void CharaMangerWorker::refreshUserEnrollStatus(const QString &senderid, const int &code, const QString &codeInfo) -{ - Q_UNUSED(senderid); - if (m_currentInputCharaType & FACE_CHARA) - m_model->onEnrollStatusChanged(code, codeInfo); - - if (m_currentInputCharaType & IRIS_CHARA) - m_model->onEnrollIrisStatusChanged(code, codeInfo); -} - -void CharaMangerWorker::stopEnroll() -{ - if (m_stopTimer) { - m_stopTimer->stop(); - } - - m_currentInputCharaType = -1; - auto call = m_charaMangerInter->EnrollStop(); - if (call.isError()) { - qDebug() << "call stop Enroll " << call.error(); - } - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [this]{ - if (m_fileDescriptor) { - delete m_fileDescriptor; - m_fileDescriptor = nullptr; - } - - sender()->deleteLater(); - }); -} - -void CharaMangerWorker::deleteCharaItem(const int &charaType, const QString &charaName) -{ - m_charaMangerInter->Delete(charaType, charaName); -} - -void CharaMangerWorker::renameCharaItem(const int &charaType, const QString &oldName, const QString &newName) -{ - auto call = m_charaMangerInter->Rename(charaType, oldName, newName); - call.waitForFinished(); - if (call.isError()) { - qDebug() << "call RenameFinger Error : " << call.error(); - m_model->onRefreshEnrollDate(charaType); - } -} - -void CharaMangerWorker::tryEnroll(const QString &name, const QString &thumb) -{ - m_charaMangerInter->setFingerprintInterTimeout(1000 * 60 * 60); - auto callClaim = m_charaMangerInter->Claim(name, true); - callClaim.waitForFinished(); - - if (callClaim.isError()) { - qDebug() << "call Claim Error : " << callClaim.error(); - m_model->refreshEnrollResult(CharaMangerModel::EnrollResult::Enroll_ClaimFailed); - } else { - m_charaMangerInter->setFingerprintInterTimeout(-1); - auto callEnroll = m_charaMangerInter->Enroll(thumb); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(callEnroll, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (callEnroll.isError()) { - qDebug() << "call Enroll Error : " << callEnroll.error(); - m_charaMangerInter->Claim(name, false); - m_model->refreshEnrollResult(CharaMangerModel::EnrollResult::Enroll_Failed); - } else { - Q_EMIT requestMainWindowEnabled(true); - m_model->refreshEnrollResult(CharaMangerModel::EnrollResult::Enroll_Success); - } - Q_EMIT requestMainWindowEnabled(true); - watcher->deleteLater(); - }); - } - m_charaMangerInter->setFingerprintInterTimeout(-1); - -} - -void CharaMangerWorker::refreshFingerEnrollList(const QString &id) -{ - QStringList call = m_charaMangerInter->ListFingers(id); - if (call.isEmpty()) { - qDebug() << "m_charaMangerInter->ListFingers call Error"; - m_model->setThumbsList(QStringList()); - return; - } else { - qDebug() << "m_charaMangerInter->ListFingers"; - } - m_model->setThumbsList(call); - -} - -void CharaMangerWorker::stopFingerEnroll(const QString &userName) -{ - qDebug() << "stopEnroll"; - m_charaMangerInter->StopEnroll(); - auto callClaim = m_charaMangerInter->Claim(userName, false); - callClaim.waitForFinished(); - if (callClaim.isError()) { - qDebug() << "call Claim Error : " << callClaim.error(); - } -} - -void CharaMangerWorker::deleteFingerItem(const QString &userName, const QString &finger) -{ - m_charaMangerInter->setFingerprintInterTimeout(1000 * 60 * 60); - auto callClaim = m_charaMangerInter->Claim(userName, true); - callClaim.waitForFinished(); - if (callClaim.isError()) { - qDebug() << "call Claim Error : " << callClaim.error(); - m_model->refreshEnrollResult(CharaMangerModel::EnrollResult::Enroll_ClaimFailed); - } else { - m_charaMangerInter->setFingerprintInterTimeout(-1); - auto call = m_charaMangerInter->DeleteFinger(userName, finger); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - - QObject::connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - refreshFingerEnrollList(userName); - sender()->deleteLater(); - auto callStopClaim = m_charaMangerInter->Claim(userName, false); - callStopClaim.waitForFinished(); - if (callStopClaim.isError()) { - qDebug() << "call stop Claim Error : " << callStopClaim.error(); - } - }); - } - m_charaMangerInter->setFingerprintInterTimeout(-1); -} - -void CharaMangerWorker::renameFingerItem(const QString &userName, const QString &finger, const QString &newName) -{ - m_charaMangerInter->RenameFinger(userName, finger, newName); - refreshFingerEnrollList(userName); -} diff --git a/dcc-old/src/plugin-authentication/operation/charamangerworker.h b/dcc-old/src/plugin-authentication/operation/charamangerworker.h deleted file mode 100644 index 096c59b841..0000000000 --- a/dcc-old/src/plugin-authentication/operation/charamangerworker.h +++ /dev/null @@ -1,100 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef FACEIDWORKER_H -#define FACEIDWORKER_H - -#include "charamangerdbusproxy.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -class CharaMangerWorker : public QObject -{ - Q_OBJECT -public: - explicit CharaMangerWorker(CharaMangerModel *model, QObject *parent = nullptr); - ~CharaMangerWorker(); - void initCharaManger(); - void initFinger(); - -private: - /** - * @brief parseJsonData 仅仅将 mangerInfo 进行数据转化 - * @return 获取后端所有解析后的数据 - */ - QMap parseDriverNameJsonData(const QString& mangerInfo); - QStringList parseCharaNameJsonData(const QString& mangerInfo); - -Q_SIGNALS: - void tryStartInputFace(const int &fd); - void tryStartInputIris(CharaMangerModel::AddInfoState state); - void requestMainWindowEnabled(const bool isEnabled) const; - -public Q_SLOTS: - void predefineDriverInfo(const QString &driverInfo); - - /** - * @brief refreshUserEnrollList 获取用户录入信息 - * @param driverName 驱动名称 - * @param CharaType 对应生物特征 - */ - void refreshUserEnrollList(const QString &driverName, const int &CharaType); - - void refreshUserInfo(const QString &EnrollInfo, const int &CharaType); - - void refreshDriverInfo(); - - /** - * @brief entollStart 处理认证接口 - * @param driverName - * @param charaType - * @param charaName - */ - void entollStart(const QString &driverName, const int &charaType, const QString &charaName); - - /** - * @brief refreshUserEnrollStatus 获取设备录入状态 - * @param senderid dbus对应senderID - * @param code 对应信息 - * @param codeInfo 信息描述 - */ - void refreshUserEnrollStatus(const QString &senderid, const int &code, const QString &codeInfo); - - void stopEnroll(); - - /** - * @brief deleteFaceidItem 删除对应录入信息 - * @param charaType 唯一值 - * @param charaName 对应名称 - */ - void deleteCharaItem(const int &charaType, const QString &charaName); - void renameCharaItem(const int &charaType, const QString &oldName, const QString &newName); - - // Fingerprint - void tryEnroll(const QString &name, const QString &thumb); - void refreshFingerEnrollList(const QString &id); - void stopFingerEnroll(const QString& userName); - void deleteFingerItem(const QString& userName, const QString& finger); - void renameFingerItem(const QString& userName, const QString& finger, const QString& newName); - -private: - CharaMangerModel *m_model; - CharaMangerDBusProxy *m_charaMangerInter; - - /** - * @brief m_stopTimer 开始录入进行计时 1Min后若没有录入成功则失败 - * 注: timer stop时机 - */ - QTimer *m_stopTimer; - QDBusPendingReply* m_fileDescriptor; - /** - * @brief m_currentInputCharaType 当前录入方式 注:确保唯一性 - */ - int m_currentInputCharaType; -}; - -#endif // FACEIDWORKER_H diff --git a/dcc-old/src/plugin-authentication/operation/qrc/authentication.qrc b/dcc-old/src/plugin-authentication/operation/qrc/authentication.qrc deleted file mode 100644 index 716803448d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/authentication.qrc +++ /dev/null @@ -1,116 +0,0 @@ - - - icons/dcc_nav_authentication_42px.svg - icons/dcc_nav_authentication_84px.svg - icons/dark/icons/icon_face-fail.svg - icons/dark/icons/icon_face-start.svg - icons/dark/icons/icon_face-success.svg - icons/dark/icons/icon_unknown_device.svg - icons/light/icons/icon_face-fail.svg - icons/light/icons/icon_face-start.svg - icons/light/icons/icon_face-success.svg - icons/light/icons/icon_unknown_device.svg - icons/light/icons/finger/fingerprint_animation_light_1.svg - icons/light/icons/finger/fingerprint_animation_light_2.svg - icons/light/icons/finger/fingerprint_animation_light_3.svg - icons/light/icons/finger/fingerprint_animation_light_4.svg - icons/light/icons/finger/fingerprint_animation_light_5.svg - icons/light/icons/finger/fingerprint_animation_light_6.svg - icons/light/icons/finger/fingerprint_animation_light_7.svg - icons/light/icons/finger/fingerprint_animation_light_8.svg - icons/light/icons/finger/fingerprint_animation_light_9.svg - icons/light/icons/finger/fingerprint_animation_light_10.svg - icons/light/icons/finger/fingerprint_animation_light_11.svg - icons/light/icons/finger/fingerprint_animation_light_12.svg - icons/light/icons/finger/fingerprint_animation_light_13.svg - icons/light/icons/finger/fingerprint_animation_light_14.svg - icons/light/icons/finger/fingerprint_animation_light_15.svg - icons/light/icons/finger/fingerprint_animation_light_16.svg - icons/light/icons/finger/fingerprint_animation_light_17.svg - icons/light/icons/finger/fingerprint_animation_light_18.svg - icons/light/icons/finger/fingerprint_animation_light_19.svg - icons/light/icons/finger/fingerprint_animation_light_20.svg - icons/light/icons/finger/fingerprint_animation_light_21.svg - icons/light/icons/finger/fingerprint_animation_light_22.svg - icons/light/icons/finger/fingerprint_animation_light_23.svg - icons/light/icons/finger/fingerprint_animation_light_24.svg - icons/light/icons/finger/fingerprint_animation_light_25.svg - icons/light/icons/finger/fingerprint_animation_light_26.svg - icons/light/icons/finger/fingerprint_animation_light_27.svg - icons/light/icons/finger/fingerprint_animation_light_28.svg - icons/light/icons/finger/fingerprint_animation_light_29.svg - icons/light/icons/finger/fingerprint_animation_light_30.svg - icons/light/icons/finger/fingerprint_animation_light_31.svg - icons/light/icons/finger/fingerprint_animation_light_32.svg - icons/light/icons/finger/fingerprint_animation_light_33.svg - icons/light/icons/finger/fingerprint_animation_light_34.svg - icons/light/icons/finger/fingerprint_animation_light_35.svg - icons/light/icons/finger/fingerprint_animation_light_36.svg - icons/light/icons/finger/fingerprint_animation_light_37.svg - icons/light/icons/finger/fingerprint_animation_light_38.svg - icons/light/icons/finger/fingerprint_animation_light_39.svg - icons/light/icons/finger/fingerprint_animation_light_40.svg - icons/light/icons/finger/fingerprint_animation_light_41.svg - icons/light/icons/finger/fingerprint_animation_light_42.svg - icons/light/icons/finger/fingerprint_animation_light_43.svg - icons/light/icons/finger/fingerprint_animation_light_44.svg - icons/light/icons/finger/fingerprint_animation_light_45.svg - icons/light/icons/finger/fingerprint_animation_light_46.svg - icons/light/icons/finger/fingerprint_animation_light_47.svg - icons/light/icons/finger/fingerprint_animation_light_48.svg - icons/light/icons/finger/fingerprint_animation_light_49.svg - icons/light/icons/finger/fingerprint_animation_light_50.svg - icons/light/icons/finger/fingerprint_light.svg - icons/dark/icons/finger/fingerprint_animation_light_1.svg - icons/dark/icons/finger/fingerprint_animation_light_2.svg - icons/dark/icons/finger/fingerprint_animation_light_3.svg - icons/dark/icons/finger/fingerprint_animation_light_4.svg - icons/dark/icons/finger/fingerprint_animation_light_5.svg - icons/dark/icons/finger/fingerprint_animation_light_6.svg - icons/dark/icons/finger/fingerprint_animation_light_7.svg - icons/dark/icons/finger/fingerprint_animation_light_8.svg - icons/dark/icons/finger/fingerprint_animation_light_9.svg - icons/dark/icons/finger/fingerprint_animation_light_10.svg - icons/dark/icons/finger/fingerprint_animation_light_11.svg - icons/dark/icons/finger/fingerprint_animation_light_12.svg - icons/dark/icons/finger/fingerprint_animation_light_13.svg - icons/dark/icons/finger/fingerprint_animation_light_14.svg - icons/dark/icons/finger/fingerprint_animation_light_15.svg - icons/dark/icons/finger/fingerprint_animation_light_16.svg - icons/dark/icons/finger/fingerprint_animation_light_17.svg - icons/dark/icons/finger/fingerprint_animation_light_18.svg - icons/dark/icons/finger/fingerprint_animation_light_19.svg - icons/dark/icons/finger/fingerprint_animation_light_20.svg - icons/dark/icons/finger/fingerprint_animation_light_21.svg - icons/dark/icons/finger/fingerprint_animation_light_22.svg - icons/dark/icons/finger/fingerprint_animation_light_23.svg - icons/dark/icons/finger/fingerprint_animation_light_24.svg - icons/dark/icons/finger/fingerprint_animation_light_25.svg - icons/dark/icons/finger/fingerprint_animation_light_26.svg - icons/dark/icons/finger/fingerprint_animation_light_27.svg - icons/dark/icons/finger/fingerprint_animation_light_28.svg - icons/dark/icons/finger/fingerprint_animation_light_29.svg - icons/dark/icons/finger/fingerprint_animation_light_30.svg - icons/dark/icons/finger/fingerprint_animation_light_31.svg - icons/dark/icons/finger/fingerprint_animation_light_32.svg - icons/dark/icons/finger/fingerprint_animation_light_33.svg - icons/dark/icons/finger/fingerprint_animation_light_34.svg - icons/dark/icons/finger/fingerprint_animation_light_35.svg - icons/dark/icons/finger/fingerprint_animation_light_36.svg - icons/dark/icons/finger/fingerprint_animation_light_37.svg - icons/dark/icons/finger/fingerprint_animation_light_38.svg - icons/dark/icons/finger/fingerprint_animation_light_39.svg - icons/dark/icons/finger/fingerprint_animation_light_40.svg - icons/dark/icons/finger/fingerprint_animation_light_41.svg - icons/dark/icons/finger/fingerprint_animation_light_42.svg - icons/dark/icons/finger/fingerprint_animation_light_43.svg - icons/dark/icons/finger/fingerprint_animation_light_44.svg - icons/dark/icons/finger/fingerprint_animation_light_45.svg - icons/dark/icons/finger/fingerprint_animation_light_46.svg - icons/dark/icons/finger/fingerprint_animation_light_47.svg - icons/dark/icons/finger/fingerprint_animation_light_48.svg - icons/dark/icons/finger/fingerprint_animation_light_49.svg - icons/dark/icons/finger/fingerprint_animation_light_50.svg - icons/dark/icons/finger/fingerprint_light.svg - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_1.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_1.svg deleted file mode 100644 index 58f6ef27aa..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_1.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_10.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_10.svg deleted file mode 100644 index 79bbdbdc59..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_10.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_11.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_11.svg deleted file mode 100644 index 25770c1c24..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_11.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_12.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_12.svg deleted file mode 100644 index bf4b196bfe..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_12.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_13.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_13.svg deleted file mode 100644 index 6df920a72c..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_13.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_14.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_14.svg deleted file mode 100644 index ec597c639d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_14.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_15.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_15.svg deleted file mode 100644 index 7cef3a8135..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_15.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_16.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_16.svg deleted file mode 100644 index b120055950..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_16.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_17.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_17.svg deleted file mode 100644 index 70c006b3b2..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_17.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_18.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_18.svg deleted file mode 100644 index 636ed3b095..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_18.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_19.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_19.svg deleted file mode 100644 index ccebd9df76..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_19.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_2.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_2.svg deleted file mode 100644 index 37b7661505..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_2.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_20.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_20.svg deleted file mode 100644 index 2f20a1eec4..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_20.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_21.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_21.svg deleted file mode 100644 index 02c9c9cacb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_21.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_22.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_22.svg deleted file mode 100644 index a7eb01b9c5..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_22.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_23.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_23.svg deleted file mode 100644 index af58b01388..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_23.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_24.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_24.svg deleted file mode 100644 index 4521fbeadc..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_24.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_25.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_25.svg deleted file mode 100644 index 32b4ee0d89..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_25.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_26.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_26.svg deleted file mode 100644 index 7016621f7a..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_26.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_27.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_27.svg deleted file mode 100644 index 110eee0b72..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_27.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_28.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_28.svg deleted file mode 100644 index b4aa4a0efb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_28.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_29.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_29.svg deleted file mode 100644 index 6afb233e91..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_29.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_3.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_3.svg deleted file mode 100644 index 1a7f6affe0..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_3.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_30.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_30.svg deleted file mode 100644 index c2e37524bc..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_30.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_31.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_31.svg deleted file mode 100644 index c09ac1241c..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_31.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_32.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_32.svg deleted file mode 100644 index b1e4ec2c50..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_32.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_33.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_33.svg deleted file mode 100644 index 6d046ce32b..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_33.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_34.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_34.svg deleted file mode 100644 index 75296d4409..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_34.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_35.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_35.svg deleted file mode 100644 index f34a2e69eb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_35.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_36.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_36.svg deleted file mode 100644 index ee86c7bcf9..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_36.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_37.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_37.svg deleted file mode 100644 index bcb9f59be9..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_37.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_38.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_38.svg deleted file mode 100644 index 979c921e73..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_38.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_39.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_39.svg deleted file mode 100644 index 36872a25c4..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_39.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_4.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_4.svg deleted file mode 100644 index 8e7dc1c671..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_4.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_40.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_40.svg deleted file mode 100644 index 36dad981ae..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_40.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_41.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_41.svg deleted file mode 100644 index f1b8b37df5..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_41.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_42.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_42.svg deleted file mode 100644 index 353194f429..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_42.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_43.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_43.svg deleted file mode 100644 index 5d59f2ae39..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_43.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_44.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_44.svg deleted file mode 100644 index 94f21adca8..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_44.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_45.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_45.svg deleted file mode 100644 index 05d2ef579e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_45.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_46.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_46.svg deleted file mode 100644 index 6ce18e0fba..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_46.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_47.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_47.svg deleted file mode 100644 index 0d04b62ddd..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_47.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_48.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_48.svg deleted file mode 100644 index 0570ae20bb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_48.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_49.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_49.svg deleted file mode 100644 index 851c6694be..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_49.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_5.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_5.svg deleted file mode 100644 index 34a8f24f42..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_5.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_50.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_50.svg deleted file mode 100644 index f59e137f92..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_50.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_6.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_6.svg deleted file mode 100644 index 9638a56afa..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_6.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_7.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_7.svg deleted file mode 100644 index 9a98c4579b..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_7.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_8.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_8.svg deleted file mode 100644 index 17371ca69d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_8.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_9.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_9.svg deleted file mode 100644 index e70b17aeb9..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_animation_light_9.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_light.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_light.svg deleted file mode 100644 index fadeba2af8..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/finger/fingerprint_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-fail.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-fail.svg deleted file mode 100644 index 37c50f985a..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-fail.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-start.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-start.svg deleted file mode 100644 index f49272b34c..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-start.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-success.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-success.svg deleted file mode 100644 index 50e86953cf..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_face-success.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - icon_face-enter_dark - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_unknown_device.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_unknown_device.svg deleted file mode 100644 index 18bfae2cd1..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dark/icons/icon_unknown_device.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_42px.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_42px.svg deleted file mode 100644 index 1c88b0c3a7..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_42px.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_84px.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_84px.svg deleted file mode 100644 index 773ca430c3..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/dcc_nav_authentication_84px.svg +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_1.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_1.svg deleted file mode 100644 index 893363c666..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_1.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_10.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_10.svg deleted file mode 100644 index 1e8a60759d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_10.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_11.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_11.svg deleted file mode 100644 index 2109a07cde..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_11.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_12.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_12.svg deleted file mode 100644 index db9a722f61..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_12.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_13.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_13.svg deleted file mode 100644 index a8b57de13a..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_13.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_14.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_14.svg deleted file mode 100644 index 854fcf4dec..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_14.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_15.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_15.svg deleted file mode 100644 index d587fec31f..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_15.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_16.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_16.svg deleted file mode 100644 index a547511c32..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_16.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_17.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_17.svg deleted file mode 100644 index 8edc13a831..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_17.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_18.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_18.svg deleted file mode 100644 index a7c2716822..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_18.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_19.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_19.svg deleted file mode 100644 index 358b3e504e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_19.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_2.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_2.svg deleted file mode 100644 index 76c6e8689d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_2.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_20.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_20.svg deleted file mode 100644 index f37803ed41..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_20.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_21.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_21.svg deleted file mode 100644 index c14238f277..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_21.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_22.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_22.svg deleted file mode 100644 index 775396659d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_22.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_23.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_23.svg deleted file mode 100644 index c09adccc6f..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_23.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_24.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_24.svg deleted file mode 100644 index d7b789cd97..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_24.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_25.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_25.svg deleted file mode 100644 index 32b0997d23..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_25.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_26.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_26.svg deleted file mode 100644 index ff297c167d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_26.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_27.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_27.svg deleted file mode 100644 index be36b805ab..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_27.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_28.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_28.svg deleted file mode 100644 index aad4f49e2e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_28.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_29.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_29.svg deleted file mode 100644 index 1a13828a0e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_29.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_3.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_3.svg deleted file mode 100644 index b729d90a3f..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_3.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_30.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_30.svg deleted file mode 100644 index 96ed68db67..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_30.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_31.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_31.svg deleted file mode 100644 index 1dbf59fbdc..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_31.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_32.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_32.svg deleted file mode 100644 index 31fde2221e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_32.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_33.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_33.svg deleted file mode 100644 index be2f68b5fc..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_33.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_34.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_34.svg deleted file mode 100644 index 78a65a47dd..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_34.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_35.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_35.svg deleted file mode 100644 index 202c15ef55..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_35.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_36.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_36.svg deleted file mode 100644 index 2b65d38045..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_36.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_37.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_37.svg deleted file mode 100644 index 61734617b3..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_37.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_38.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_38.svg deleted file mode 100644 index f3a6c729e5..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_38.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_39.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_39.svg deleted file mode 100644 index b276d3623d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_39.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_4.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_4.svg deleted file mode 100644 index 1356a4002d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_4.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_40.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_40.svg deleted file mode 100644 index beec1b956d..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_40.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_41.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_41.svg deleted file mode 100644 index 1f4a8ba922..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_41.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_42.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_42.svg deleted file mode 100644 index 1e87b034bd..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_42.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_43.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_43.svg deleted file mode 100644 index 59b23c4203..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_43.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_44.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_44.svg deleted file mode 100644 index 2387e433ab..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_44.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_45.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_45.svg deleted file mode 100644 index f04956b61e..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_45.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_46.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_46.svg deleted file mode 100644 index de0c69cad8..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_46.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_47.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_47.svg deleted file mode 100644 index c8199f1702..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_47.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_48.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_48.svg deleted file mode 100644 index 66bb4d0005..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_48.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_49.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_49.svg deleted file mode 100644 index 0bd8eb53b9..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_49.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_5.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_5.svg deleted file mode 100644 index 231825f0fb..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_5.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_50.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_50.svg deleted file mode 100644 index 46c1c1f8d3..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_50.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_6.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_6.svg deleted file mode 100644 index 80e0809453..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_6.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_7.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_7.svg deleted file mode 100644 index d6f643b1b2..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_7.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_8.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_8.svg deleted file mode 100644 index bf1e7c515c..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_8.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_9.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_9.svg deleted file mode 100644 index 587efa57e3..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_animation_light_9.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_light.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_light.svg deleted file mode 100644 index 3119fadb3b..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/finger/fingerprint_light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-fail.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-fail.svg deleted file mode 100644 index 4962e2952b..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-fail.svg +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-start.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-start.svg deleted file mode 100644 index 968fc0abbc..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-start.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-success.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-success.svg deleted file mode 100644 index 1e84386e53..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_face-success.svg +++ /dev/null @@ -1,44 +0,0 @@ - - - 编组 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_unknown_device.svg b/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_unknown_device.svg deleted file mode 100644 index 5b55bd2ab1..0000000000 --- a/dcc-old/src/plugin-authentication/operation/qrc/icons/light/icons/icon_unknown_device.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-authentication/window/authentication.json b/dcc-old/src/plugin-authentication/window/authentication.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-authentication/window/authentication.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-authentication/window/authenticationplugin.cpp b/dcc-old/src/plugin-authentication/window/authenticationplugin.cpp deleted file mode 100644 index f8a2bd506b..0000000000 --- a/dcc-old/src/plugin-authentication/window/authenticationplugin.cpp +++ /dev/null @@ -1,117 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "authenticationplugin.h" -#include "interface/pagemodule.h" - -#include "charamangermodel.h" -#include "charamangerworker.h" -#include "faceiddetailwidget.h" -#include "fingerdetailwidget.h" -#include "irisdetailwidget.h" -#include - -DGUI_USE_NAMESPACE -using namespace DCC_NAMESPACE; -QString AuthenticationPlugin::name() const -{ - return QStringLiteral("Authentication"); -} - -ModuleObject *AuthenticationPlugin::module() -{ - // 一级 - AuthenticationModule *authenticationInterface = new AuthenticationModule; - - // 二级 -- 指纹 - ModuleObject *moduleFinger = new PageModule("fingerprint", tr("Fingerprint"), authenticationInterface); - FingerModule *fingerPage = new FingerModule(authenticationInterface->model(), authenticationInterface->work()); - moduleFinger->appendChild(fingerPage); - authenticationInterface->appendChild(moduleFinger); - moduleFinger->setHidden(!authenticationInterface->model()->fingerVaild()); - connect(authenticationInterface->model(), &CharaMangerModel::vaildFingerChanged, moduleFinger, [ moduleFinger ](const bool isVaild) { - moduleFinger->setHidden(!isVaild); - }); - - // 二级 -- 人脸 - ModuleObject *moduleFace = new PageModule("face", tr("Face"), authenticationInterface); - FaceModule *facePage = new FaceModule(authenticationInterface->model(), authenticationInterface->work()); - moduleFace->appendChild(facePage); - authenticationInterface->appendChild(moduleFace); - moduleFace->setHidden(!authenticationInterface->model()->faceDriverVaild()); - connect(authenticationInterface->model(), &CharaMangerModel::vaildFaceDriverChanged, moduleFace, [ moduleFace ](const bool isVaild) { - moduleFace->setHidden(!isVaild); - }); - - // 二级 -- 虹膜 - ModuleObject *moduleIris= new PageModule("iris", tr("Iris"), authenticationInterface); - IrisModule *irisPage = new IrisModule(authenticationInterface->model(), authenticationInterface->work()); - moduleIris->appendChild(irisPage); - authenticationInterface->appendChild(moduleIris); - moduleIris->setHidden(!authenticationInterface->model()->irisDriverVaild()); - connect(authenticationInterface->model(), &CharaMangerModel::vaildIrisDriverChanged, moduleIris, [ moduleIris ](const bool isVaild) { - moduleIris->setHidden(!isVaild); - }); - - return authenticationInterface; -} - -QString AuthenticationPlugin::location() const -{ - return "3"; -} - -AuthenticationModule::AuthenticationModule(QObject *parent) - : HListModule("authentication", tr("Biometric Authentication"), QString(), DIconTheme::findQIcon("dcc_nav_authentication"), parent) - , m_model(new CharaMangerModel(this)) - , m_work(new CharaMangerWorker(m_model, this)) -{ - setHidden(!m_model->charaVaild()); - connect(m_model, &CharaMangerModel::charaVaildChanged, this, [ = ](const bool isVaild) { - setHidden(!isVaild); - }); -} - -AuthenticationModule::~AuthenticationModule() -{ - m_model->deleteLater(); - m_work->deleteLater(); -} - -void AuthenticationModule::active() -{ -} - -QWidget *FingerModule::page() -{ - FingerDetailWidget *w = new FingerDetailWidget; - w->setFingerModel(m_model); - connect(w, &FingerDetailWidget::requestAddThumbs, m_worker, &CharaMangerWorker::tryEnroll); - connect(w, &FingerDetailWidget::requestStopEnroll, m_worker, &CharaMangerWorker::stopFingerEnroll); - connect(w, &FingerDetailWidget::requestDeleteFingerItem, m_worker, &CharaMangerWorker::deleteFingerItem); - connect(w, &FingerDetailWidget::requestRenameFingerItem, m_worker, &CharaMangerWorker::renameFingerItem); - connect(w, &FingerDetailWidget::noticeEnrollCompleted, m_worker, &CharaMangerWorker::refreshFingerEnrollList); - return w; -} - -QWidget *FaceModule::page() -{ - FaceidDetailWidget *w = new FaceidDetailWidget(m_model); - connect(w, &FaceidDetailWidget::requestEntollStart, m_worker, &CharaMangerWorker::entollStart); - connect(w, &FaceidDetailWidget::requestStopEnroll, m_worker, &CharaMangerWorker::stopEnroll); - connect(w, &FaceidDetailWidget::requestDeleteFaceItem, m_worker, &CharaMangerWorker::deleteCharaItem); - connect(w, &FaceidDetailWidget::requestRenameFaceItem, m_worker, &CharaMangerWorker::renameCharaItem); - connect(w, &FaceidDetailWidget::noticeEnrollCompleted, m_worker, &CharaMangerWorker::refreshUserEnrollList); - return w; -} - -QWidget *IrisModule::page() -{ - IrisDetailWidget *w = new IrisDetailWidget(m_model); - connect(w, &IrisDetailWidget::requestEntollStart, m_worker, &CharaMangerWorker::entollStart); - connect(w, &IrisDetailWidget::requestStopEnroll, m_worker, &CharaMangerWorker::stopEnroll); - connect(w, &IrisDetailWidget::requestDeleteIrisItem, m_worker, &CharaMangerWorker::deleteCharaItem); - connect(w, &IrisDetailWidget::requestRenameIrisItem, m_worker, &CharaMangerWorker::renameCharaItem); - connect(w, &IrisDetailWidget::noticeEnrollCompleted, m_worker, &CharaMangerWorker::refreshUserEnrollList); - return w; -} diff --git a/dcc-old/src/plugin-authentication/window/authenticationplugin.h b/dcc-old/src/plugin-authentication/window/authenticationplugin.h deleted file mode 100644 index c3c9e394e4..0000000000 --- a/dcc-old/src/plugin-authentication/window/authenticationplugin.h +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef AUTHENTICATIONPLUGIN_H -#define AUTHENTICATIONPLUGIN_H - -#include "interface/hlistmodule.h" -#include "interface/plugininterface.h" - -class CharaMangerWorker; -class CharaMangerModel; -class AuthenticationPlugin : public DCC_NAMESPACE::PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Authentication" FILE "authentication.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface)public: -public: - explicit AuthenticationPlugin() {} - - virtual QString name() const override; - virtual DCC_NAMESPACE::ModuleObject *module() override; - virtual QString location() const override; -}; - -// 一级页面 -class AuthenticationModule : public DCC_NAMESPACE::HListModule -{ - Q_OBJECT -public: - explicit AuthenticationModule(QObject *parent = nullptr); - ~AuthenticationModule(); - - CharaMangerWorker *work() { return m_work; } - CharaMangerModel *model() { return m_model; } - -protected: - virtual void active() override; - -private: - CharaMangerModel *m_model; - CharaMangerWorker *m_work; -}; - -// 指纹页面 -class FingerModule : public DCC_NAMESPACE::ModuleObject -{ - Q_OBJECT -public: - explicit FingerModule(CharaMangerModel *model, CharaMangerWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker) {} - - virtual QWidget *page() override; - -private: - CharaMangerModel *m_model; - CharaMangerWorker *m_worker; -}; - -// 人脸页面 -class FaceModule : public DCC_NAMESPACE::ModuleObject -{ - Q_OBJECT -public: - explicit FaceModule(CharaMangerModel *model, CharaMangerWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker) {} - - virtual QWidget *page() override; - -private: - CharaMangerModel *m_model; - CharaMangerWorker *m_worker; -}; - -// 虹膜页面 -class IrisModule : public DCC_NAMESPACE::ModuleObject -{ - Q_OBJECT -public: - explicit IrisModule(CharaMangerModel *model, CharaMangerWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker) {} - - virtual QWidget *page() override; - -private: - CharaMangerModel *m_model; - CharaMangerWorker *m_worker; -}; - - -#endif // AUTHENTICATIONPLUGIN_H diff --git a/dcc-old/src/plugin-authentication/window/faceiddetailwidget.cpp b/dcc-old/src/plugin-authentication/window/faceiddetailwidget.cpp deleted file mode 100644 index 992ca3cd4c..0000000000 --- a/dcc-old/src/plugin-authentication/window/faceiddetailwidget.cpp +++ /dev/null @@ -1,150 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "faceiddetailwidget.h" -#include "widgets/face/faceinfodialog.h" -#include "widgets/face/addfaceinfodialog.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -#include -#include - -DGUI_USE_NAMESPACE - -FaceidDetailWidget::FaceidDetailWidget(CharaMangerModel *model, QWidget *parent) - : QWidget (parent) - , m_model (model) - , m_mainContentLayout(new QVBoxLayout(this)) - , m_faceWidget(new FaceWidget(model, this)) - , m_pNotDevice(new QLabel(this)) - , m_tip(new DLabel(tr("No supported devices found"), this)) - , m_addFaceInfodlg(new AddFaceInfoDialog(model, this)) - , m_facedlg(new FaceInfoDialog(model, this)) -{ - connect(m_model, &CharaMangerModel::vaildFaceDriverChanged, this, &FaceidDetailWidget::onDeviceStatusChanged); - onDeviceStatusChanged(model->faceDriverVaild()); - - initFaceidShow(); - - //人脸操作 - connect(m_faceWidget, &FaceWidget::requestAddFace, this, &FaceidDetailWidget::onShowAddFaceDialog); - connect(m_faceWidget, &FaceWidget::requestDeleteFaceItem, this, &FaceidDetailWidget::requestDeleteFaceItem); - connect(m_faceWidget, &FaceWidget::requestRenameFaceItem, this, &FaceidDetailWidget::requestRenameFaceItem); - connect(m_faceWidget, &FaceWidget::noticeEnrollCompleted, this, &FaceidDetailWidget::noticeEnrollCompleted); -} - -FaceidDetailWidget::~FaceidDetailWidget() -{ - -} - -void FaceidDetailWidget::initFaceidShow() -{ - //整体布局 - m_mainContentLayout->setContentsMargins(0, 10, 0, 0); - - m_faceWidget->setContentsMargins(0, 0, 0, 0); - m_faceWidget->layout()->setMargin(0); - - setLayout(m_mainContentLayout); - setFocusPolicy(Qt::FocusPolicy::ClickFocus); - - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, - this, [=](Dtk::Gui::DGuiApplicationHelper::ColorType themeType) { - Q_UNUSED(themeType); - m_pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - }); - - m_pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - m_pNotDevice->setAlignment(Qt::AlignHCenter); - - // 设置高亮字体 - m_tip->setEnabled(false); - auto pal = m_tip->palette(); - DFontSizeManager::instance()->bind(m_tip, DFontSizeManager::T7); - QColor base_color = pal.text().color(); - base_color.setAlpha(255 / 10 * 2); - pal.setColor(QPalette::Text, base_color); - m_tip->setPalette(pal); - - m_mainContentLayout->addWidget(m_faceWidget); - m_mainContentLayout->addWidget(m_pNotDevice); - m_mainContentLayout->addWidget(m_tip); -} - -QString FaceidDetailWidget::getDisplayPath() -{ - QString theme; - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - theme = QString("dark"); - break; - } - return QString(":/authentication/themes/%1/icons/icon_unknown_device.svg").arg(theme); -} - - -void FaceidDetailWidget::onDeviceStatusChanged(bool hasDevice) -{ - if (hasDevice) { - m_pNotDevice->hide(); - m_tip->hide(); - m_mainContentLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - m_faceWidget->show(); - } else { - m_faceWidget->hide(); - m_mainContentLayout->setAlignment(Qt::AlignHCenter | Qt::AlignCenter); - m_pNotDevice->show(); - m_tip->show(); - } -} - -void FaceidDetailWidget::onShowAddFaceDialog(const QString &driverName, const int &charaType, const QString &charaName) -{ - m_addFaceInfodlg->responseEnrollInfoState(CharaMangerModel::AddInfoState::StartState, QString()); - - connect(m_addFaceInfodlg, &AddFaceInfoDialog::requestStopEnroll, this, &FaceidDetailWidget::requestStopEnroll, Qt::UniqueConnection); - - // 用户点击对话框开始录入 - disconnect(m_addFaceInfodlg, &AddFaceInfoDialog::requestShowFaceInfoDialog, this, nullptr); - connect(m_addFaceInfodlg, &AddFaceInfoDialog::requestShowFaceInfoDialog, this, [=](){ - m_addFaceInfodlg->hide(); - onShowAddFaceidVideo(); - Q_EMIT requestEntollStart(driverName, charaType, charaName); - }); - - m_addFaceInfodlg->setWindowFlags(Qt::Dialog | Qt::Popup | Qt::WindowStaysOnTopHint); - m_addFaceInfodlg->show(); - m_addFaceInfodlg->setFocus(); - m_addFaceInfodlg->activateWindow(); -} - -void FaceidDetailWidget::onConnectFD(const int &facedf) -{ - m_facedlg->faceInfoLabel()->createConnection(facedf); - - m_facedlg->setWindowFlags(Qt::Dialog | Qt::Popup | Qt::WindowStaysOnTopHint); - m_facedlg->show(); - m_facedlg->setFocus(); - m_facedlg->activateWindow(); -} - -void FaceidDetailWidget::onShowAddFaceidVideo() -{ - // 开始录入人脸 - connect(m_facedlg, &FaceInfoDialog::requestCloseDlg, this, &FaceidDetailWidget::requestStopEnroll, Qt::UniqueConnection); - - // 开始录入就弹出 TODO: 处理拿到FD后的内容 - connect(m_model, &CharaMangerModel::tryStartInputFace, this, &FaceidDetailWidget::onConnectFD, Qt::UniqueConnection); -} diff --git a/dcc-old/src/plugin-authentication/window/faceiddetailwidget.h b/dcc-old/src/plugin-authentication/window/faceiddetailwidget.h deleted file mode 100644 index 9fde17ab6f..0000000000 --- a/dcc-old/src/plugin-authentication/window/faceiddetailwidget.h +++ /dev/null @@ -1,58 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/face/facewidget.h" -#include "widgets/face/addfaceinfodialog.h" -#include "widgets/face/faceinfodialog.h" - -#include -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QHBoxLayout; -class QScrollArea; -QT_END_NAMESPACE - -class CharaMangerModel; -class FaceidDetailWidget : public QWidget -{ - Q_OBJECT -public: - explicit FaceidDetailWidget(CharaMangerModel *model, QWidget *parent = nullptr); - ~FaceidDetailWidget(); - -private: - void initFaceidShow(); - QString getDisplayPath(); - void onShowAddFaceidVideo(); - -Q_SIGNALS: - void requestDeleteFaceItem(const int &charaType, const QString &charaName); - void requestRenameFaceItem(const int &charaType, const QString& oldFaceName, const QString& newFaceName); - void noticeEnrollCompleted(const QString &driverName, const int &CharaType); - void requestEntollStart(const QString &driverName, const int &charaType, const QString &charaName); - void requestStopEnroll(); - -public Q_SLOTS: - void onDeviceStatusChanged(bool hasDevice); - void onShowAddFaceDialog(const QString &driverName, const int &charaType, const QString &charaName); - -private Q_SLOTS: - void onConnectFD(const int &facedf); - -private: - CharaMangerModel *m_model; - - QVBoxLayout *m_mainContentLayout; - FaceWidget *m_faceWidget; - QLabel *m_pNotDevice; - DTK_WIDGET_NAMESPACE::DLabel *m_tip; - - AddFaceInfoDialog *m_addFaceInfodlg; - FaceInfoDialog *m_facedlg; -}; - diff --git a/dcc-old/src/plugin-authentication/window/fingerdetailwidget.cpp b/dcc-old/src/plugin-authentication/window/fingerdetailwidget.cpp deleted file mode 100644 index e929e441ad..0000000000 --- a/dcc-old/src/plugin-authentication/window/fingerdetailwidget.cpp +++ /dev/null @@ -1,195 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "widgets/finger/addfingerdialog.h" -#include "fingerdetailwidget.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -FingerDetailWidget::FingerDetailWidget(QWidget *parent) - : QWidget(parent) - , m_model(nullptr) - , m_fingerWidget(new FingerWidget) - , m_disclaimer(nullptr) -{ -} - -FingerDetailWidget::~FingerDetailWidget() -{ - -} - -void FingerDetailWidget::initFingerUI() -{ - //整体布局 - QVBoxLayout *mainContentLayout = new QVBoxLayout(this); - mainContentLayout->setContentsMargins(0, 10, 0, 0); - mainContentLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - - m_fingerWidget->setContentsMargins(0, 0, 0, 0); - m_fingerWidget->layout()->setMargin(0); - mainContentLayout->addWidget(m_fingerWidget); - mainContentLayout->addSpacing(30); - - setLayout(mainContentLayout); - setFocusPolicy(Qt::FocusPolicy::ClickFocus); - - //指纹界面操作 - connect(m_fingerWidget, &FingerWidget::requestAddThumbs, this, &FingerDetailWidget::showFingerDisclaimer); - connect(m_fingerWidget, &FingerWidget::requestDeleteFingerItem, this, &FingerDetailWidget::requestDeleteFingerItem); - connect(m_fingerWidget, &FingerWidget::requestRenameFingerItem, this, &FingerDetailWidget::requestRenameFingerItem); - connect(m_fingerWidget, &FingerWidget::noticeEnrollCompleted, this, &FingerDetailWidget::noticeEnrollCompleted); -} - -void FingerDetailWidget::initNotFingerDevice() -{ - QVBoxLayout *mainContentLayout = new QVBoxLayout(this); - mainContentLayout->setContentsMargins(0, 10, 0, 0); - mainContentLayout->setAlignment(Qt::AlignHCenter | Qt::AlignCenter); - - QLabel *pNotDevice = new QLabel; - - // 显示高亮字体 - DLabel *tip = new DLabel(tr("No supported devices found")); - tip->setEnabled(false); - auto pal = tip->palette(); - DFontSizeManager::instance()->bind(tip, DFontSizeManager::T7); - QColor base_color = pal.text().color(); - base_color.setAlpha(255 / 10 * 2); - pal.setColor(QPalette::Text, base_color); - tip->setPalette(pal); - - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, - this, [ = ](Dtk::Gui::DGuiApplicationHelper::ColorType themeType) { - Q_UNUSED(themeType); - pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - - }); - pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - pNotDevice->setAlignment(Qt::AlignHCenter); - - - mainContentLayout->addWidget(pNotDevice); - mainContentLayout->addWidget(tip); - setLayout(mainContentLayout); -} - -QString FingerDetailWidget::getDisplayPath() -{ - QString theme; - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - theme = QString("dark"); - break; - } - return QString(":/authentication/themes/%1/icons/icon_unknown_device.svg").arg(theme); -} - -void FingerDetailWidget::showDeviceStatus(bool hasDevice) -{ - // 指纹设备不支持热插拔 直接显示对应信息 - if (hasDevice) { - initFingerUI(); - } else { - initNotFingerDevice(); - } -} - -void FingerDetailWidget::showAddFingerDialog(const QString &name, const QString &thumb) -{ - AddFingerDialog *dlg = new AddFingerDialog(thumb, this); - connect(dlg, &AddFingerDialog::requestEnrollThumb, this, [ = ] { - dlg->deleteLater(); - showAddFingerDialog(name, thumb); - }); - connect(dlg, &AddFingerDialog::requestStopEnroll, this, &FingerDetailWidget::requestStopEnroll); - connect(dlg, &AddFingerDialog::requesetCloseDlg, dlg, [ = ](const QString & userName) { - Q_EMIT noticeEnrollCompleted(userName); - if (m_disclaimer != nullptr) { - m_disclaimer->close(); - delete m_disclaimer; - m_disclaimer = nullptr; - } - dlg->deleteLater(); - }); - - connect(m_model, &CharaMangerModel::enrollResult, dlg, [ = ](CharaMangerModel::EnrollResult res) { - // 第一次tryEnroll进入时显示添加指纹对话框 - if (res == CharaMangerModel::Enroll_Success) { - m_model->resetProgress(); - dlg->setFingerModel(m_model); - dlg->setWindowFlags(Qt::Dialog | Qt::Popup | Qt::WindowStaysOnTopHint); - dlg->setUsername(name); - dlg->show(); - dlg->setFocus(); - dlg->activateWindow(); - } else if (res == CharaMangerModel::Enroll_Failed) { - qDebug() << "CharaMangerModel::Enroll_Failed"; - Q_EMIT requestStopEnroll(name); - if (m_disclaimer != nullptr) { - m_disclaimer->close(); - delete m_disclaimer; - m_disclaimer = nullptr; - } - dlg->deleteLater(); - } else if (res == CharaMangerModel::Enroll_AuthFailed) { - qDebug() << "CharaMangerModel::Enroll_AuthFailed"; - dlg->deleteLater(); - } - }); - - Q_EMIT requestAddThumbs(name, thumb); -} - -void FingerDetailWidget::setFingerModel(CharaMangerModel *model) -{ - if (!model) - return; - - m_model = model; - m_fingerWidget->setFingerModel(model); - connect(model, &CharaMangerModel::vaildFingerChanged, this, &FingerDetailWidget::showDeviceStatus); - showDeviceStatus(model->fingerVaild()); -} - -void FingerDetailWidget::showFingerDisclaimer(const QString &name, const QString &thumb) -{ - if (m_disclaimer != nullptr) { - return; - } - m_disclaimer = new FingerDisclaimer(this); - m_disclaimer->setVisible(true); - - connect(m_disclaimer, &FingerDisclaimer::requestShowFingeInfoDialog, this, [ = ] { - m_disclaimer->setVisible(false); - showAddFingerDialog(name, thumb); - }); - - connect(m_disclaimer, &FingerDisclaimer::requesetCloseDlg, this, [ = ] { - if (m_disclaimer != nullptr) - { - delete m_disclaimer; - m_disclaimer = nullptr; - } - }); -} diff --git a/dcc-old/src/plugin-authentication/window/fingerdetailwidget.h b/dcc-old/src/plugin-authentication/window/fingerdetailwidget.h deleted file mode 100644 index e6acff6d2f..0000000000 --- a/dcc-old/src/plugin-authentication/window/fingerdetailwidget.h +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/finger/fingerwidget.h" -#include "widgets/finger/fingerdisclaimer.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QHBoxLayout; -class QScrollArea; -QT_END_NAMESPACE - -class CharaMangerModel; -class FingerWidget; -class FingerDetailWidget : public QWidget -{ - Q_OBJECT -public: - explicit FingerDetailWidget(QWidget *parent = nullptr); - ~FingerDetailWidget(); - - void setFingerModel(CharaMangerModel *model); - -private: - void initFingerUI(); - void initNotFingerDevice(); - QString getDisplayPath(); - -Q_SIGNALS: - void requestAddThumbs(const QString &name, const QString &thumb); - void requestStopEnroll(const QString &thumb); - void requestDeleteFingerItem(const QString &userName, const QString &finger); - void requestRenameFingerItem(const QString &userName, const QString &finger, const QString &newName); - void noticeEnrollCompleted(QString username); - -public Q_SLOTS: - void showDeviceStatus(bool hasDevice); - void showAddFingerDialog(const QString &name, const QString &thumb); - void showFingerDisclaimer(const QString &name, const QString &thumb); - -private: - QString m_currentUserName; - CharaMangerModel *m_model; - FingerWidget *m_fingerWidget; //指纹界面 - FingerDisclaimer *m_disclaimer; -}; - diff --git a/dcc-old/src/plugin-authentication/window/irisdetailwidget.cpp b/dcc-old/src/plugin-authentication/window/irisdetailwidget.cpp deleted file mode 100644 index ced4f8ed0a..0000000000 --- a/dcc-old/src/plugin-authentication/window/irisdetailwidget.cpp +++ /dev/null @@ -1,126 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "widgets/iris/addirisinfodialog.h" -#include "irisdetailwidget.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -#include -#include - -DGUI_USE_NAMESPACE - -IrisDetailWidget::IrisDetailWidget(CharaMangerModel *model, QWidget *parent) - : QWidget (parent) - , m_model (model) - , m_mainContentLayout(new QVBoxLayout(this)) - , m_irisWidget(new IrisWidget(model, this)) - , m_pNotDevice(new QLabel(this)) - , m_tip(new DLabel(tr("No supported devices found"), this)) -{ - connect(m_model, &CharaMangerModel::vaildIrisDriverChanged, this, &IrisDetailWidget::onDeviceStatusChanged); - onDeviceStatusChanged(model->irisDriverVaild()); - - initIrisShow(); - - connect(m_irisWidget, &IrisWidget::requestAddIris, this, &IrisDetailWidget::onShowAddIrisDialog); - connect(m_irisWidget, &IrisWidget::requestDeleteIrisItem, this, &IrisDetailWidget::requestDeleteIrisItem); - connect(m_irisWidget, &IrisWidget::requestRenameIrisItem, this, &IrisDetailWidget::requestRenameIrisItem); - connect(m_irisWidget, &IrisWidget::noticeEnrollCompleted, this, &IrisDetailWidget::noticeEnrollCompleted); -} - -IrisDetailWidget::~IrisDetailWidget() -{ - -} - -void IrisDetailWidget::initIrisShow() -{ - //整体布局 - m_mainContentLayout->setContentsMargins(0, 10, 0, 0); - - m_irisWidget->setContentsMargins(0, 0, 0, 0); - m_irisWidget->layout()->setMargin(0); - - setLayout(m_mainContentLayout); - setFocusPolicy(Qt::FocusPolicy::ClickFocus); - - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, - this, [=](Dtk::Gui::DGuiApplicationHelper::ColorType themeType) { - Q_UNUSED(themeType); - m_pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - }); - - m_pNotDevice->setPixmap(DIconTheme::findQIcon(getDisplayPath()).pixmap(64, 64)); - m_pNotDevice->setAlignment(Qt::AlignHCenter); - - // 设置高亮字体 - m_tip->setEnabled(false); - auto pal = m_tip->palette(); - DFontSizeManager::instance()->bind(m_tip, DFontSizeManager::T7); - QColor base_color = pal.text().color(); - base_color.setAlpha(255 / 10 * 2); - pal.setColor(QPalette::Text, base_color); - m_tip->setPalette(pal); - - m_mainContentLayout->addWidget(m_irisWidget); - m_mainContentLayout->addWidget(m_pNotDevice); - m_mainContentLayout->addWidget(m_tip); -} - -QString IrisDetailWidget::getDisplayPath() -{ - QString theme; - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - theme = QString("dark"); - break; - } - return QString(":/authentication/themes/%1/icons/icon_unknown_device.svg").arg(theme); -} - - -void IrisDetailWidget::onDeviceStatusChanged(bool hasDevice) -{ - if (hasDevice) { - m_pNotDevice->hide(); - m_tip->hide(); - m_mainContentLayout->setAlignment(Qt::AlignTop | Qt::AlignHCenter); - m_irisWidget->show(); - } else { - m_irisWidget->hide(); - m_mainContentLayout->setAlignment(Qt::AlignHCenter | Qt::AlignCenter); - m_pNotDevice->show(); - m_tip->show(); - } -} - -void IrisDetailWidget::onShowAddIrisDialog(const QString &driverName, const int &charaType, const QString &charaName) -{ - AddIrisInfoDialog *irisDlg = new AddIrisInfoDialog(m_model, this); - connect(m_model, &CharaMangerModel::tryStartInputIris, irisDlg, &AddIrisInfoDialog::refreshInfoStatusDisplay); - - connect(irisDlg, &AddIrisInfoDialog::requestStopEnroll, this, &IrisDetailWidget::requestStopEnroll); - connect(irisDlg, &AddIrisInfoDialog::requesetCloseDlg, irisDlg, &AddIrisInfoDialog::deleteLater); - - // 点击下一步开始录入 - connect(irisDlg, &AddIrisInfoDialog::requestInputIris, this, [ = ](){ - Q_EMIT requestEntollStart(driverName, charaType, charaName); - }); - - irisDlg->setWindowFlags(Qt::Dialog | Qt::Popup | Qt::WindowStaysOnTopHint); - irisDlg->exec(); - irisDlg->setFocus(); - irisDlg->activateWindow(); -} diff --git a/dcc-old/src/plugin-authentication/window/irisdetailwidget.h b/dcc-old/src/plugin-authentication/window/irisdetailwidget.h deleted file mode 100644 index 73e66ca5e0..0000000000 --- a/dcc-old/src/plugin-authentication/window/irisdetailwidget.h +++ /dev/null @@ -1,50 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/iris/iriswidget.h" - -#include -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QHBoxLayout; -class QScrollArea; -QT_END_NAMESPACE - -class CharaMangerModel; -class IrisDetailWidget : public QWidget -{ - Q_OBJECT -public: - explicit IrisDetailWidget(CharaMangerModel *model, QWidget *parent = nullptr); - ~IrisDetailWidget(); - -private: - void initIrisShow(); - QString getDisplayPath(); - -Q_SIGNALS: - void requestAddIris(const QString &driverName, const int &charaType, const QString &charaName); - void requestDeleteIrisItem(const int &charaType, const QString &charaName); - void requestRenameIrisItem(const int &charaType, const QString& oldIrisName, const QString& newIrisName); - void noticeEnrollCompleted(const QString &driverName, const int &CharaType); - void requestEntollStart(const QString &driverName, const int &charaType, const QString &charaName); - void requestStopEnroll(); - -public Q_SLOTS: - void onDeviceStatusChanged(bool hasDevice); - void onShowAddIrisDialog(const QString &driverName, const int &charaType, const QString &charaName); - -private: - CharaMangerModel *m_model; - - QVBoxLayout *m_mainContentLayout; - IrisWidget *m_irisWidget; - QLabel *m_pNotDevice; - DTK_WIDGET_NAMESPACE::DLabel *m_tip; -}; - diff --git a/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.cpp b/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.cpp deleted file mode 100644 index 3ea8283690..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.cpp +++ /dev/null @@ -1,232 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "authenticationinfoitem.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -AuthenticationInfoItem::AuthenticationInfoItem(QWidget *parent) - : SettingsItem(parent) - , m_layout(new QHBoxLayout) - , m_title(new QLabel) - , m_removeBtn(new DIconButton(this)) - , m_editBtn(new DIconButton(this)) - , m_editTitle(new DLineEdit(this)) - , m_itemName("") - , m_currentpa(DPaletteHelper::instance()->palette(this)) -{ - setFixedHeight(36); - - m_editBtn->setIcon(DIconTheme::findQIcon("dcc_edit")); - m_editBtn->setFlat(true);//设置背景透明 - m_editBtn->setVisible(false); - - m_editTitle->setClearButtonEnabled(false); - m_editTitle->setVisible(false); - m_editTitle->lineEdit()->setFrame(false); - - m_removeBtn->setFlat(true); - m_removeBtn->setIcon(DStyle::StandardPixmap::SP_DeleteButton); - m_removeBtn->setFixedSize(QSize(24, 24)); - m_removeBtn->setIconSize(QSize(16, 16)); - m_removeBtn->setVisible(false); - DStyle::setFocusRectVisible(m_removeBtn, false); - - m_layout->setContentsMargins(10, 5, 10, 5); - m_layout->addWidget(m_title, 0, Qt::AlignLeft); - m_layout->addWidget(m_editBtn, 0, Qt::AlignLeft); - m_layout->addWidget(m_editTitle, 0 , Qt::AlignLeft); - m_layout->addStretch(); - m_layout->addWidget(m_removeBtn, 0, Qt::AlignVCenter); - setLayout(m_layout); - - connect(m_removeBtn, &DIconButton::clicked, this, &AuthenticationInfoItem::removeClicked); - connect(m_editBtn, &DIconButton::clicked, this, [this] { - m_editBtn->hide(); - Q_EMIT editClicked(m_editTitle->isVisible()); - if (m_editTitle->isVisible()) { - m_editTitle->lineEdit()->setText(m_title->text()); - m_editTitle->lineEdit()->selectAll(); - m_editTitle->lineEdit()->setFocus(); - } - }); - connect(m_editTitle->lineEdit(), &QLineEdit::textChanged, this, [this] { - m_editTitle->setAlert(false); - m_editTitle->hideAlertMessage(); - }); - connect(m_editTitle->lineEdit(), &QLineEdit::editingFinished, this, [this] { - if (onNameEditFinished()) { - Q_EMIT editTextFinished(m_editTitle->text()); - } - m_editTitle->lineEdit()->clearFocus(); - setEditTitle(false); - }); - - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, - this, [=](Dtk::Gui::DGuiApplicationHelper::ColorType themeType) { - Q_UNUSED(themeType); - DPaletteHelper::instance()->resetPalette(this); - m_currentpa = DPaletteHelper::instance()->palette(this); - }); -} - -void AuthenticationInfoItem::setTitle(const QString &title) -{ - title.isEmpty() ? m_layout->removeWidget(m_title) : m_title->setText(title); - m_itemName = title; -} - -void AuthenticationInfoItem::appendItem(QWidget *widget) -{ - m_layout->addWidget(widget, 0, Qt::AlignLeft); -} - -void AuthenticationInfoItem::setShowIcon(bool state) -{ - m_removeBtn->setVisible(state); -} - -void AuthenticationInfoItem::setEditTitle(bool state) -{ - m_title->setVisible(!state); - m_editTitle->setVisible(state); -} - -void AuthenticationInfoItem::setHideTitle(bool state) -{ - m_title->setVisible(state); - m_editTitle->setVisible(state); -} - -bool AuthenticationInfoItem::validateName(const QString &password) -{ - QString validate_policy = QString("1234567890") + QString("abcdefghijklmnopqrstuvwxyz") + - QString("ABCDEFGHIJKLMNOPQRSTUVWXYZ") + QString("_"); - for (const QChar &p : password) { - if (!validate_policy.contains(p)) { - ushort uNum = p.unicode(); - // 片段非validate_policy中的字符是否为汉子 - if (uNum < 0x4E00 || uNum > 0x9FA5) { - return false; - } - } - } - return true; -} - -bool AuthenticationInfoItem::onNameEditFinished() -{ - QString editName = m_editTitle->lineEdit()->text(); - if (editName.isEmpty()) - return false; - //正则表达式判断是否由字母、数字、中文、下划线组成 - bool regResult = editName.contains(QRegularExpression("(^[\\w\u4e00-\u9fa5]+$)")); - if (editName.size() > 15) { - QString errMsg = regResult ? tr("No more than 15 characters") : tr("Use letters, numbers and underscores only, and no more than 15 characters"); - showAlertMessage(errMsg); - return false; - } else { - if (!regResult) { - QString errMsg = tr("Use letters, numbers and underscores only"); - showAlertMessage(errMsg); - return false; - } - } - return true; -} - -void AuthenticationInfoItem::showAlertMessage(const QString &errMsg) -{ - m_editTitle->setAlert(true); - m_editTitle->showAlertMessage(errMsg, parentWidget()->parentWidget(), 2000); - m_editTitle->lineEdit()->selectAll(); -} - -void AuthenticationInfoItem::enterEvent(QEvent *event) -{ - DPalette pa = DPaletteHelper::instance()->palette(this); - DStyleHelper styleHelper; - styleHelper = DStyleHelper(this->style()); - - QBrush brush; - if (styleHelper.dstyle()) { - brush = styleHelper.dstyle()->generatedBrush(DStyle::SS_HoverState, pa.itemBackground(), DPalette::Normal, DPalette::ItemBackground); - } - pa.setBrush(DPalette::Window, Qt::transparent); - pa.setBrush(DPalette::ItemBackground, brush); - DPaletteHelper::instance()->setPalette(this, pa); - - if (m_editTitle->isVisible()) - m_editBtn->hide(); - else - m_editBtn->show(); - - QFrame::enterEvent(event); -} - -void AuthenticationInfoItem::leaveEvent(QEvent *event) -{ - DPaletteHelper::instance()->setPalette(this, m_currentpa); - m_editBtn->hide(); - QFrame::leaveEvent(event); -} - -AuthenticationLinkButtonItem::AuthenticationLinkButtonItem(QWidget *parent) - : SettingsItem(parent) - , m_currentpa(DPaletteHelper::instance()->palette(this)) -{ - setFixedHeight(36); - - connect(Dtk::Gui::DGuiApplicationHelper::instance(), &Dtk::Gui::DGuiApplicationHelper::themeTypeChanged, - this, [=](Dtk::Gui::DGuiApplicationHelper::ColorType themeType) { - Q_UNUSED(themeType); - DPaletteHelper::instance()->resetPalette(this); - m_currentpa = DPaletteHelper::instance()->palette(this); - }); -} - -void AuthenticationLinkButtonItem::enterEvent(QEvent *event) -{ - DPalette pa = DPaletteHelper::instance()->palette(this); - DStyleHelper styleHelper; - styleHelper = DStyleHelper(this->style()); - - QBrush brush; - if (styleHelper.dstyle()) { - brush = styleHelper.dstyle()->generatedBrush(DStyle::SS_HoverState, pa.itemBackground(), DPalette::Normal, DPalette::ItemBackground); - } - pa.setBrush(DPalette::Window, Qt::transparent); - pa.setBrush(DPalette::ItemBackground, brush); - DPaletteHelper::instance()->setPalette(this, pa); - - QFrame::enterEvent(event); -} - -void AuthenticationLinkButtonItem::leaveEvent(QEvent *event) -{ - DPaletteHelper::instance()->setPalette(this, m_currentpa); - QFrame::leaveEvent(event); -} - -void AuthenticationLinkButtonItem::mousePressEvent(QMouseEvent *event) -{ - SettingsItem::mousePressEvent(event); - - Q_EMIT mousePressed(); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.h b/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.h deleted file mode 100644 index 8aeb95e9d0..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/authenticationinfoitem.h +++ /dev/null @@ -1,96 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -/* - * Copyright (C) 2011 ~ 2019 Deepin Technology Co., Ltd. - * - * Author: liuhong - * - * Maintainer: liuhong - * - * 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 . - */ - -#pragma once - -#include -#include "interface/namespace.h" -#include "widgets/settingsitem.h" -#include - -QT_BEGIN_NAMESPACE -class QWidget; -class QHBoxLayout; -class QStackedWidget; -class QLabel; -class QLineEdit; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DIconButton; -class DLineEdit; -DWIDGET_END_NAMESPACE - -class AuthenticationLinkButtonItem : public DCC_NAMESPACE::SettingsItem{ - Q_OBJECT -public: - explicit AuthenticationLinkButtonItem(QWidget *parent = nullptr); - -protected: - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - void mousePressEvent(QMouseEvent *event) override; - -Q_SIGNALS: - void mousePressed(); - -private: - DTK_GUI_NAMESPACE::DPalette m_currentpa; -}; - -class AuthenticationInfoItem : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT -public: - explicit AuthenticationInfoItem(QWidget *parent = nullptr); - void setTitle(const QString &title); - QString getTitle() const { return m_itemName; }; - void alertTitleRepeat(); - void appendItem(QWidget *widget); - void setShowIcon(bool state); - void setEditTitle(bool state); - void setHideTitle(bool state); - bool onNameEditFinished(); - //判断账户名是否符合规则 - bool validateName(const QString &password); - void showAlertMessage(const QString &errMsg); - -Q_SIGNALS: - void removeClicked(); - void editClicked(bool state); - void editTextFinished(QString finger); - -protected: - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - -private: - QHBoxLayout *m_layout; - QLabel *m_title; - DTK_WIDGET_NAMESPACE::DIconButton *m_removeBtn; - DTK_WIDGET_NAMESPACE::DIconButton *m_editBtn; - DTK_WIDGET_NAMESPACE::DLineEdit *m_editTitle; - QString m_itemName; - DTK_GUI_NAMESPACE::DPalette m_currentpa; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.cpp b/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.cpp deleted file mode 100644 index 377e43dda4..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.cpp +++ /dev/null @@ -1,116 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "disclaimersdialog.h" - -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -DisclaimersDialog::DisclaimersDialog(DisclaimersObj disobj, DAbstractDialog *parent) - : DAbstractDialog(parent) - , m_mainLayout(new QVBoxLayout(this)) - , m_cancelBtn(new QPushButton(this)) - , m_acceptBtn(new DSuggestButton(this)) -{ - initWidget(disobj); - initConnect(); - QWidget::installEventFilter(this); -} - -DisclaimersDialog::~DisclaimersDialog() -{ - -} - -void DisclaimersDialog::initWidget(DisclaimersObj state) -{ - setFixedSize(QSize(454, 542)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(this); - titleIcon->setFrameStyle(QFrame::NoFrame); - titleIcon->setBackgroundTransparent(true); - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Disclaimer")); - - DLabel *tipLabel = new DLabel(""); - if (state == DisclaimersObj::Faceid) { - tipLabel->setText(tr("Before using face recognition, please note that: \n" - "1. Your device may be unlocked by people or objects that look or appear similar to you.\n" - "2. Face recognition is less secure than digital passwords and mixed passwords.\n" - "3. The success rate of unlocking your device through face recognition will be reduced in a low-light, high-light, back-light, large angle scenario and other scenarios.\n" - "4. Please do not give your device to others randomly, so as to avoid malicious use of face recognition.\n" - "5. In addition to the above scenarios, you should pay attention to other situations that may affect the normal use of face recognition.\n" - "\n" - "In order to better use of face recognition, please pay attention to the following matters when inputting the facial data:\n" - "1. Please stay in a well-lit setting, avoid direct sunlight and other people appearing in the recorded screen.\n" - "2. Please pay attention to the facial state when inputting data, and do not let your hats, hair, sunglasses, masks, heavy makeup and other factors to cover your facial features.\n" - "3. Please avoid tilting or lowering your head, closing your eyes or showing only one side of your face, and make sure your front face appears clearly and completely in the prompt box.\n")); - } else if (state == DisclaimersObj::Finge || state == DisclaimersObj::Iris) { - setFixedSize(QSize(382, 446)); - tipLabel->setText(tr("\"Biometric authentication\" is a function for user identity authentication provided by UnionTech Software Technology Co., Ltd. Through \"biometric authentication\", the biometric data collected will be compared with that stored in the device, and the user identity will be verified based on the comparison result.\n" - "Please be noted that UnionTech Software will not collect or access your biometric information, which will be stored on your local device. Please only enable the biometric authentication in your personal device and use your own biometric information for related operations, and promptly disable or delete other people's biometric information on that device, otherwise you will bear the risk arising therefrom. \n" - "UnionTech Software is committed to research and improve the security, accuracy and stability of biometric authentication. However, due to environmental, equipment, technical and other factors and risk control, there is no guarantee that you will pass the biometric authentication temporarily. Therefore, please do not take biometric authentication as the only way to log in to UnionTech OS. If you have any questions or suggestions when using the biometric authentication, you can give feedback through \"Service and Support\" in the UnionTech OS. \n")); - } - - - DFontSizeManager::instance()->bind(tipLabel, DFontSizeManager::T6); - tipLabel->adjustSize(); - tipLabel->setWordWrap(true); - tipLabel->setContentsMargins(20, 0, 20, 0); - tipLabel->setAlignment(Qt::AlignJustify); - - QScrollArea *scrollArea = new QScrollArea; - scrollArea->setWidgetResizable(true); - scrollArea->setFrameStyle(QFrame::NoFrame); - scrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - scrollArea->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - scrollArea->setContentsMargins(0, 0, 0, 0); - scrollArea->setWidget(tipLabel); - scrollArea->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContentsOnFirstShow); - QPalette pa = scrollArea->palette(); - pa.setColor(QPalette::Window, Qt::transparent); - scrollArea->setPalette(pa); - - // 下方按钮 - QHBoxLayout *btnLayout = new QHBoxLayout(this); - m_cancelBtn->setText(tr("Cancel")); - m_acceptBtn->setText(tr("Next")); - m_acceptBtn->setDisabled(false); - - btnLayout->addWidget(m_cancelBtn, Qt::AlignCenter); - btnLayout->addSpacing(10); - btnLayout->addWidget(m_acceptBtn, Qt::AlignCenter); - btnLayout->setContentsMargins(20, 10, 20, 20); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(10); - m_mainLayout->setMargin(0); - m_mainLayout->addWidget(scrollArea, 0, Qt::AlignHCenter); - m_mainLayout->setSpacing(5); - m_mainLayout->addLayout(btnLayout); - setLayout(m_mainLayout); -} - -void DisclaimersDialog::initConnect() -{ - connect(m_cancelBtn, &QPushButton::clicked, this, &DisclaimersDialog::close); - connect(m_acceptBtn, &QPushButton::clicked, this, [this] { - Q_EMIT requestClickStatus(true); - this->close(); - }); -} - -void DisclaimersDialog::closeEvent(QCloseEvent *event) -{ - Q_EMIT requesetCloseDlg(true); - QDialog::closeEvent(event); -} - diff --git a/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.h b/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.h deleted file mode 100644 index f23155ac4f..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/disclaimersdialog.h +++ /dev/null @@ -1,79 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -/* - * Copyright (C) 2011 ~ 2021 Deepin Technology Co., Ltd. - * - * Author: duanhongyu - - * Maintainer: duanhongyu - * - * 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 . - */ - -#pragma once -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include -#include - -DWIDGET_USE_NAMESPACE - -QT_BEGIN_NAMESPACE -class QDialog; -class QVBoxLayout; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -enum DisclaimersObj { - Faceid, - Iris, - Finge -}; - -// 免责声明对话框 -class DisclaimersDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit DisclaimersDialog(DisclaimersObj disobj, DAbstractDialog *parent = nullptr); - ~DisclaimersDialog(); - -private: - void initWidget(DisclaimersObj state); - void initConnect(); - -protected: - void closeEvent(QCloseEvent *event) override; - -Q_SIGNALS: - /** - * @brief requestClickStatus 点击确定后 返回登陆界面 显示勾选状态 - */ - void requestClickStatus(bool isClick); - /** - * @brief requesetCloseDlg 离开免责对话框界面 需要恢复父窗口显示状态 - */ - void requesetCloseDlg(bool isClose); - -private: - QVBoxLayout *m_mainLayout; - QPushButton* m_cancelBtn; - DTK_WIDGET_NAMESPACE::DSuggestButton* m_acceptBtn; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.cpp b/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.cpp deleted file mode 100644 index 9335cb4e42..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.cpp +++ /dev/null @@ -1,60 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "disclaimersdialog.h" -#include "disclaimersitem.h" - -#include -#include -#include -#include - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -DisclaimersItem::DisclaimersItem(DisclaimersObj disobj, QWidget *parent) - : SettingsItem(parent) - , m_layout(new QHBoxLayout(this)) - , m_acceptCheck(new QCheckBox(this)) - , m_state(disobj) -{ - m_acceptCheck->setText(tr("I have read and agree to the")); - - m_disclaimersBtn = new DCommandLinkButton(tr("Disclaimer")); - - m_layout->setContentsMargins(10, 0, 10, 0); - m_layout->addStretch(); - m_layout->addWidget(m_acceptCheck, 0, Qt::AlignCenter); - m_layout->addWidget(m_disclaimersBtn, 0, Qt::AlignCenter); - m_layout->addStretch(); - - DFontSizeManager::instance()->bind(m_acceptCheck, DFontSizeManager::SizeType::T8); - DFontSizeManager::instance()->bind(m_disclaimersBtn, DFontSizeManager::SizeType::T8); - - connect(m_disclaimersBtn, &QPushButton::clicked, this, &DisclaimersItem::requestSetWindowEnabled); - connect(m_disclaimersBtn, &QPushButton::clicked, this, &DisclaimersItem::showDisclaimers); - connect(m_acceptCheck, &QCheckBox::toggled, this, &DisclaimersItem::setAcceptState); - setLayout(m_layout); -} - -void DisclaimersItem::setAcceptState(const bool &state) -{ - m_acceptCheck->setChecked(state); - Q_EMIT requestStateChange(!state); -} - -void DisclaimersItem::showDisclaimers() -{ - DisclaimersDialog *disdlg = new DisclaimersDialog(m_state); - connect(disdlg, &DisclaimersDialog::requestClickStatus, this, &DisclaimersItem::setAcceptState); - connect(disdlg, &DisclaimersDialog::requesetCloseDlg, this, &DisclaimersItem::requestSetWindowEnabled); - disdlg->setWindowFlags(Qt::Dialog | Qt::Popup | Qt::WindowStaysOnTopHint); - disdlg->setFocus(); - disdlg->activateWindow(); - disdlg->exec(); -} - diff --git a/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.h b/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.h deleted file mode 100644 index 262fa8ea59..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/disclaimersitem.h +++ /dev/null @@ -1,40 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "widgets/settingsitem.h" -#include "disclaimersdialog.h" - -QT_BEGIN_NAMESPACE -class QCheckBox; -class QLabel; -class QHBoxLayout; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DCommandLinkButton; -DWIDGET_END_NAMESPACE - -// 免责声明 -class DisclaimersItem : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT -public: - explicit DisclaimersItem(DisclaimersObj disobj, QWidget *parent = nullptr); - -public Q_SLOTS: - void showDisclaimers(); - void setAcceptState(const bool &state); - -Q_SIGNALS: - void requestStateChange(bool state); - void requestSetWindowEnabled(bool checked = false); - -private: - QHBoxLayout *m_layout; - QCheckBox *m_acceptCheck; - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_disclaimersBtn; // 免责声明按钮 - DisclaimersObj m_state; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.cpp b/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.cpp deleted file mode 100644 index c0d898d952..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.cpp +++ /dev/null @@ -1,217 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "addfaceinfodialog.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -AddFaceInfoDialog::AddFaceInfoDialog(CharaMangerModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_faceModel(model) - , m_mainLayout(new QVBoxLayout(this)) - , m_cancelBtn(new QPushButton(this)) - , m_acceptBtn(new DSuggestButton(this)) - , m_currentState(CharaMangerModel::AddInfoState::StartState) -{ - initWidget(); - initConnect(); - QWidget::installEventFilter(this); -} - -AddFaceInfoDialog::~AddFaceInfoDialog() -{ - -} - -void AddFaceInfoDialog::closeEvent(QCloseEvent *event) -{ - Q_EMIT requesetCloseDlg(); - QDialog::closeEvent(event); -} - -bool AddFaceInfoDialog::eventFilter(QObject *o, QEvent *e) -{ - if (o == this && QEvent::WindowDeactivate == e->type()) { - clearFocus(); - setFocus(); - return true; - } - return false; -} - -void AddFaceInfoDialog::initWidget() -{ - setFixedSize(QSize(454, 542)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Enroll Face")); - - // 人脸图片 - m_facePic = new QLabel(this); - m_facePic->setPixmap(DIconTheme::findQIcon(getFacePicture()).pixmap(128,128)); - - // 提示信息 - m_resultTips = new QLabel(this); - m_resultTips->hide(); - m_explainTips = new DLabel(tr("Make sure all parts of your face are not covered by objects and are clearly visible. Your face should be well-lit as well.")); - m_explainTips->setWordWrap(true); - m_explainTips->setAlignment(Qt::AlignCenter); - DFontSizeManager::instance()->bind(m_explainTips, DFontSizeManager::T8); - - QHBoxLayout *tips = new QHBoxLayout; - tips->addWidget(m_explainTips); - tips->setContentsMargins(42, 10, 42, 10); - - // 免责声明 - m_disclaimersItem = new DisclaimersItem(DisclaimersObj::Faceid, this); - m_disclaimersItem->show(); - - // 下方按钮 - QHBoxLayout *btnLayout = new QHBoxLayout; - m_cancelBtn->setText(tr("Cancel")); - m_cancelBtn->hide(); - m_acceptBtn->setText(tr("Next")); - m_acceptBtn->setDisabled(true); - - btnLayout->addWidget(m_cancelBtn, Qt::AlignCenter); - btnLayout->addSpacing(10); - btnLayout->addWidget(m_acceptBtn, Qt::AlignCenter); - btnLayout->setContentsMargins(20, 10, 20, 20); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(55); - m_mainLayout->addWidget(m_facePic, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(15); - m_mainLayout->addWidget(m_resultTips, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(10); - m_mainLayout->addLayout(tips); - m_mainLayout->addStretch(); - m_mainLayout->addWidget(m_disclaimersItem, 0, Qt::AlignCenter); - m_mainLayout->addLayout(btnLayout); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - setLayout(m_mainLayout); - - this->activateWindow(); - this->setFocus(); -} - -void AddFaceInfoDialog::initConnect() -{ - connect(m_faceModel, &CharaMangerModel::enrollInfoState, this, &AddFaceInfoDialog::responseEnrollInfoState); - - connect(m_disclaimersItem, &DisclaimersItem::requestSetWindowEnabled, this, &AddFaceInfoDialog::onSetWindowEnabled); - connect(m_disclaimersItem, &DisclaimersItem::requestStateChange, m_acceptBtn, &QPushButton::setDisabled); - connect(m_cancelBtn, &QPushButton::clicked, this, &AddFaceInfoDialog::close); - connect(m_acceptBtn, &QPushButton::clicked, this, &AddFaceInfoDialog::requestShowFaceInfoDialog, Qt::UniqueConnection); -} - -QString AddFaceInfoDialog::getFacePicture() -{ - QString theme; - QString icon; - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - theme = QString("dark"); - break; - } - - switch (m_currentState) { - case CharaMangerModel::AddInfoState::StartState: - icon = QString("start"); - break; - case CharaMangerModel::AddInfoState::Success: - icon = QString("success"); - break; - case CharaMangerModel::AddInfoState::Fail: - icon = QString("fail"); - break; - default: - break; - } - return QString(":/icons/deepin/builtin/icons/%1/icons/icon_face-%2.svg").arg(theme).arg(icon); -} - -void AddFaceInfoDialog::responseEnrollInfoState(CharaMangerModel::AddInfoState state, const QString &tips) -{ - m_currentState = state; - - m_facePic->setPixmap(DIconTheme::findQIcon(getFacePicture()).pixmap(128, 128)); - if (m_currentState == CharaMangerModel::AddInfoState::StartState) { - m_resultTips->hide(); - - m_explainTips->setText(tr("Make sure all parts of your face are not covered by objects and are clearly visible. Your face should be well-lit as well.")); - m_disclaimersItem->setAcceptState(false); - m_disclaimersItem->show(); - - m_cancelBtn->hide(); - m_acceptBtn->setText(tr("Next")); - m_acceptBtn->setDisabled(true); - m_acceptBtn->show(); - return; - } - - if (m_currentState == CharaMangerModel::AddInfoState::Success) { - m_resultTips->setText(tr("Face enrolled")); - m_resultTips->show(); - - m_explainTips->setText(tr("Use your face to unlock the device and make settings later")); - - m_disclaimersItem->hide(); - m_acceptBtn->hide(); - m_cancelBtn->show(); - m_cancelBtn->setText(tr("Done")); - } - - if (m_currentState == CharaMangerModel::AddInfoState::Fail) { - m_resultTips->setText(tr("Failed to enroll your face")); - m_resultTips->show(); - - m_explainTips->setText(tips); - - m_disclaimersItem->hide(); - m_acceptBtn->show(); - m_acceptBtn->setText(tr("Try Again")); - m_acceptBtn->setDisabled(false); - m_cancelBtn->show(); - m_cancelBtn->setText(tr("Close")); - } - - this->show(); - Q_EMIT requestStopEnroll(); -} - -// 处理界面失焦效果 配合 模态对话框 -void AddFaceInfoDialog::onSetWindowEnabled(const bool isEnabled) -{ - this->setEnabled(isEnabled); -} - diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.h b/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.h deleted file mode 100644 index 8fd2ea278b..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/addfaceinfodialog.h +++ /dev/null @@ -1,70 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "widgets/titlelabel.h" -#include "widgets/buttontuple.h" -#include "widgets/disclaimersitem.h" -#include "charamangermodel.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QPushButton; -class QCloseEvent; -class QDialog; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -// 添加人脸对话框 -class CharaMangerModel; -class AddFaceInfoDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit AddFaceInfoDialog(CharaMangerModel *model, QWidget *parent = nullptr); - ~AddFaceInfoDialog(); - - void onSetWindowEnabled(const bool isEnabled); - /** - * @brief responseEnrollInfoState 响应当前人脸录入状态 - * @param state 三种状态 - * @param tips 对应的提示语 - */ - void responseEnrollInfoState(CharaMangerModel::AddInfoState state, const QString &tips); - -Q_SIGNALS: - void requestShowFaceInfoDialog(); - void requesetCloseDlg(); - void requestStopEnroll(); - -protected: - void closeEvent(QCloseEvent *event) override; - bool eventFilter(QObject *o, QEvent *e) override; - -private: - void initWidget(); - void initConnect(); - QString getFacePicture(); - - -private: - CharaMangerModel *m_faceModel; - QVBoxLayout *m_mainLayout; - QLabel *m_facePic; // 人脸图片 - QLabel *m_resultTips; // 录入结果说明 - DLabel *m_explainTips; // 状态说明信息 - DisclaimersItem *m_disclaimersItem; // 免责声明 - QPushButton* m_cancelBtn; // 取消 - DTK_WIDGET_NAMESPACE::DSuggestButton* m_acceptBtn; // 下一步 - CharaMangerModel::AddInfoState m_currentState; -}; - diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.cpp b/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.cpp deleted file mode 100644 index b1e21dec34..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "faceinfodialog.h" - -#include -#include - -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -FaceInfoDialog::FaceInfoDialog(CharaMangerModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_faceModel(model) - , m_faceLabel(new FaceInfoWidget(this)) - , m_mainLayout(new QVBoxLayout(this)) -{ - initWidget(); - - connect(m_faceModel, &CharaMangerModel::enrollInfoState, this, &FaceInfoDialog::close); - connect(m_faceModel, &CharaMangerModel::enrollStatusTips, this, &FaceInfoDialog::refreshExplainTips); - - QWidget::installEventFilter(this); -} - -FaceInfoDialog::~FaceInfoDialog() -{ -} - -void FaceInfoDialog::initWidget() -{ - setFixedSize(QSize(454, 542)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(this); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Enroll Face")); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(60); - m_mainLayout->addWidget(m_faceLabel, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(30); - - // 提示语 - m_explainTips = new QLabel(tr("Position your face inside the frame")); - m_explainTips->setWordWrap(true); - m_explainTips->setAlignment(Qt::AlignTop); - DFontSizeManager::instance()->bind(m_explainTips, DFontSizeManager::T6); - m_mainLayout->addWidget(m_explainTips, 0, Qt::AlignHCenter); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - setLayout(m_mainLayout); - - this->activateWindow(); - this->setFocus(); -} - -void FaceInfoDialog::refreshExplainTips(QString tips) -{ - m_explainTips->setText(tips); -} - -void FaceInfoDialog::closeEvent(QCloseEvent *event) -{ - Q_EMIT requestCloseDlg(); - QDialog::closeEvent(event); -} - -bool FaceInfoDialog::eventFilter(QObject *o, QEvent *e) -{ - if (o == this && QEvent::WindowDeactivate == e->type()) { - clearFocus(); - setFocus(); - return true; - } - return false; -} - - diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.h b/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.h deleted file mode 100644 index 207789d9a0..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfodialog.h +++ /dev/null @@ -1,55 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "charamangermodel.h" -#include "widgets/face/faceinfowidget.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QPushButton; -class QCloseEvent; -class QLabel; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -// 人脸视频录入对话框 -class FaceInfoWidget; -class FaceInfoDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit FaceInfoDialog(CharaMangerModel *model, QWidget *parent = nullptr); - ~FaceInfoDialog(); - - inline FaceInfoWidget* faceInfoLabel() { return m_faceLabel; } - -private: - void initWidget(); - -private Q_SLOTS: - void refreshExplainTips(QString tips); - -Q_SIGNALS: - void requestCloseDlg(); - -protected: - void closeEvent(QCloseEvent *event) override; - bool eventFilter(QObject *o, QEvent *e) override; - -private: - CharaMangerModel *m_faceModel; - FaceInfoWidget *m_faceLabel; - - QVBoxLayout *m_mainLayout; - QLabel *m_explainTips; // 状态说明信息 -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.cpp deleted file mode 100644 index a42f92a50f..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.cpp +++ /dev/null @@ -1,122 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "faceinfowidget.h" - -#include - -#include -#include -#include -#include -#include -#include - -using Dtk::Gui::DGuiApplicationHelper; - -#define Faceimg_SIZE 248 - -FaceInfoWidget::FaceInfoWidget(QWidget *parent) - : QLabel (parent) - , m_faceLable(new QLabel(this)) - , m_startTimer(new QTimer(this)) - , m_themeColor(DGuiApplicationHelper::instance()->systemTheme()->activeColor()) - , m_persent(0) - , m_rotateAngle(0) -{ - initWidget(); - - connect(m_startTimer, &QTimer::timeout, this, &FaceInfoWidget::onUpdateProgressbar); - m_startTimer->start(100); -} - -FaceInfoWidget::~FaceInfoWidget() -{ - if (m_startTimer) - m_startTimer->stop(); - m_faceLable = nullptr; -} - -void FaceInfoWidget::initWidget() -{ - QVBoxLayout *mainLayout = new QVBoxLayout(this); - setFixedSize(QSize(258, 258)); - mainLayout->setAlignment(Qt::AlignHCenter); - - mainLayout->addWidget(m_faceLable, 0, Qt::AlignHCenter); - mainLayout->setMargin(0); - mainLayout->setSpacing(0); - setLayout(mainLayout); -} - -void FaceInfoWidget::createConnection(const int fd) -{ - m_faceLable->setPixmap(QPixmap()); - DA_read_frames(fd, static_cast(m_faceLable), recvCamara); -} - -void FaceInfoWidget::onUpdateProgressbar() -{ - m_persent >= 96 ? m_persent = 0 : m_persent += 4; - update(); -} - -void FaceInfoWidget::recvCamara(void *const context, const DA_img *const img) -{ - if (!context) - return; - - QLabel *label_ptr = static_cast(context); - - QPixmap pix(Faceimg_SIZE, Faceimg_SIZE); - pix.fill(Qt::transparent); - QPainter painter(&pix); - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - QPainterPath path; - path.addEllipse(0, 0, Faceimg_SIZE, Faceimg_SIZE); - painter.setClipPath(path); - painter.drawPixmap(0, 0, Faceimg_SIZE, Faceimg_SIZE, QPixmap::fromImage(QImage((uchar *)(img->data), img->width, img->height, QImage::Format_RGB888))); - if (label_ptr) { - label_ptr->setPixmap(pix); - } -} - - -void FaceInfoWidget::paintEvent(QPaintEvent *event) -{ - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.save(); - - m_rotateAngle = 360 * m_persent / 100; - int side = qMin(width(), height()); - QRectF outRect(0, 0, side, side); - QRectF inRect(5, 5, side-10, side-10); - - painter.setPen(Qt::NoPen); - painter.setOpacity(0.1); - switch (DGuiApplicationHelper::instance()->themeType()) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - painter.setBrush(QBrush(QColor("#000000"))); - break; - case DGuiApplicationHelper::DarkType: - painter.setBrush(QBrush(QColor("#ffffff"))); - break; - } - painter.drawEllipse(outRect); - - painter.setOpacity(1); - painter.setBrush(QBrush(m_themeColor)); - // startAngle和spanAngle必须以1/16度指定,即整圆等于5760(16 * 360) - painter.drawPie(outRect, (90 - m_rotateAngle)*16, 40 * 16); - - //画遮罩 - painter.setBrush(palette().window().color()); - painter.drawEllipse(inRect); - painter.restore(); - - QWidget::paintEvent(event); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.h b/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.h deleted file mode 100644 index ea9fc2b3dd..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/faceinfowidget.h +++ /dev/null @@ -1,42 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "charamangermodel.h" -#include - -#include - -class FaceInfoWidget : public QLabel -{ - Q_OBJECT -public: - explicit FaceInfoWidget(QWidget *parent = nullptr); - ~FaceInfoWidget(); - - void initWidget(); - void createConnection(const int fd); - -private Q_SLOTS: - /** - * @brief onUpdateProgressbar 刷新外圈进度条 - */ - void onUpdateProgressbar(); - -private: - void paintEvent(QPaintEvent *event); - static void recvCamara(void *const context, const DA_img *const img); - -private: - DA_img *m_videoData; - QLabel *m_faceLable; - QTimer *m_startTimer; - QColor m_themeColor; - - int m_persent; // 记录进度 - int m_rotateAngle;//旋转角度 - int m_postRotateAngle; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.cpp deleted file mode 100644 index 4acdb5e34d..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.cpp +++ /dev/null @@ -1,193 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "facewidget.h" -#include "widgets/titlelabel.h" -#include "charamangermodel.h" - -#include - -#include -#include -#include -#include - -#define FACEID_NUM 5 - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -FaceWidget::FaceWidget(CharaMangerModel *model, QWidget *parent) - : QWidget (parent) - , m_model(model) - , m_listGrp(new SettingsGroup(nullptr, SettingsGroup::GroupBackground)) - , m_clearBtn(new DCommandLinkButton(tr("Edit"), this)) -{ - initUI(); - initConnect(); -} - -FaceWidget::~FaceWidget() -{ - -} - -void FaceWidget::initUI() -{ - m_clearBtn->setCheckable(true); - TitleLabel *facetitleLabel = new TitleLabel(tr("Manage Faces"), this); - TitleLabel *maxFingerTip = new TitleLabel(tr("You can add up to 5 faces"), this); - - QFont font; - font.setPointSizeF(10); - maxFingerTip->setFont(font); - - m_listGrp->setSpacing(1); - m_listGrp->setContentsMargins(10, 0, 10, 0); - m_listGrp->layout()->setMargin(0); - m_listGrp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - QHBoxLayout *headLayout = new QHBoxLayout; - headLayout->setSpacing(0); - headLayout->setContentsMargins(10, 0, 10, 0); - headLayout->addWidget(facetitleLabel, 0, Qt::AlignLeft); - - QHBoxLayout *tipLayout = new QHBoxLayout; - tipLayout->setSpacing(10); - tipLayout->setContentsMargins(10, 0, 10, 0); - tipLayout->addWidget(maxFingerTip, 0, Qt::AlignLeft); - tipLayout->addWidget(m_clearBtn, 0, Qt::AlignRight); - tipLayout->addSpacing(5); - - QVBoxLayout *mainContentLayout = new QVBoxLayout; - mainContentLayout->setSpacing(1); - mainContentLayout->setMargin(0); - mainContentLayout->addLayout(headLayout); - mainContentLayout->addSpacing(2); - mainContentLayout->addLayout(tipLayout); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_listGrp); - setLayout(mainContentLayout); - - //设置字体大小 - DFontSizeManager::instance()->bind(m_clearBtn, DFontSizeManager::T8); - - connect(m_clearBtn, &DCommandLinkButton::clicked, this, [ = ](bool checked) { - if (checked) { - m_clearBtn->setText(tr("Done")); - //添加一个空白区域 - mainContentLayout->addSpacing(20); - } else { - m_clearBtn->setText(tr("Edit")); - //把之前添加的空白区域移除 - mainContentLayout->removeItem(mainContentLayout->itemAt(mainContentLayout->count() - 1)); - } - for (auto &item : m_vecItem) { - item->setShowIcon(checked); - } - }); -} - -void FaceWidget::initConnect() -{ - connect(m_model, &CharaMangerModel::enrollInfoState, this, [this](){ - Q_EMIT noticeEnrollCompleted(m_model->faceDriverName(), m_model->faceCharaType()); - }); - connect(m_model, &CharaMangerModel::facesListChanged, this, &FaceWidget::onFaceidListChanged); - onFaceidListChanged(m_model->facesList()); - -} - -void FaceWidget::addFaceButton(const QString &newFaceName) -{ - AuthenticationLinkButtonItem* addfaceItem = new AuthenticationLinkButtonItem(this); - QString strAddFace = tr("Add Face"); - DCommandLinkButton *addBtn = new DCommandLinkButton(strAddFace); - QHBoxLayout *faceLayout = new QHBoxLayout(); - faceLayout->addWidget(addBtn, 0, Qt::AlignLeft); - // DCommandLinkButton 本身有2px 的间距 按ui要求上下保持一致 - faceLayout->setContentsMargins(3, 5, 0, 5); - addfaceItem->setLayout(faceLayout); - m_listGrp->insertItem(m_listGrp->itemCount(), addfaceItem); - addfaceItem->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - DFontSizeManager::instance()->bind(addBtn, DFontSizeManager::T7); - QFontMetrics fontMetrics(font()); - int nFontWidth = fontMetrics.horizontalAdvance(strAddFace); - addBtn->setMinimumWidth(nFontWidth); - connect(addBtn, &DCommandLinkButton::clicked, this, [ = ] { - Q_EMIT requestAddFace(m_model->faceDriverName(), m_model->faceCharaType(), newFaceName); - }); - connect(addfaceItem, &AuthenticationLinkButtonItem::mousePressed, this, [ = ] { - Q_EMIT requestAddFace(m_model->faceDriverName(), m_model->faceCharaType(), newFaceName); - }); -} - -void FaceWidget::onFaceidListChanged(const QStringList &facelist) -{ - m_vecItem.clear(); - m_listGrp->clear(); - - for (int n = 0; n < FACEID_NUM && n < facelist.size(); ++n) { - QString faceid = facelist.at(n); - auto item = new AuthenticationInfoItem(this); - item->setTitle(faceid); - item->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - DFontSizeManager::instance()->bind(item, DFontSizeManager::T6); - m_listGrp->appendItem(item); - connect(item, &AuthenticationInfoItem::removeClicked, this, [this, faceid] { - Q_EMIT requestDeleteFaceItem(m_model->faceCharaType(), faceid); - }); - - connect(item, &AuthenticationInfoItem::editTextFinished, this, [this, faceid, item, facelist, n](QString newName) { - // 没有改名,直接返回 - if (item->getTitle() == newName) { - return; - } - for (int i = 0; i < facelist.size(); ++i) { - if (newName == facelist.at(i) && i != n) { - QString errMsg = tr("The name already exists"); - item->showAlertMessage(errMsg); - return; - } - } - item->setTitle(newName); - Q_EMIT requestRenameFaceItem(m_model->faceCharaType(), faceid, newName); - Q_EMIT noticeEnrollCompleted(m_model->faceDriverName(), m_model->faceCharaType()); - }); - - connect(item, &AuthenticationInfoItem::editClicked, this, [this, item, facelist]() { - for (int k = 0; k < facelist.size(); ++k) { - static_cast(m_listGrp->getItem(k))->setEditTitle(item == m_listGrp->getItem(k)); - } - }); - - if (m_clearBtn->isChecked()) - item->setShowIcon(true); - - m_vecItem.append(item); - } - m_clearBtn->setVisible(m_listGrp->itemCount()); - - if (facelist.size() >= FACEID_NUM) { - return; - } - - // 找到最小的名称以便作为缺省名添加 - for (int i = 0; i < FACEID_NUM; ++i) { - bool findNotUsedThumb = false; - QString newName(tr("Faceprint") + QString("%1").arg(i + 1)); - - for (int n = 0; n < FACEID_NUM && n < facelist.size(); ++n) { - if (newName == facelist.at(n)) { - findNotUsedThumb = true; - break; - } - } - - if (!findNotUsedThumb) { - addFaceButton(newName); - break; - } - } -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.h b/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.h deleted file mode 100644 index 27b64cee30..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/face/facewidget.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "widgets/authenticationinfoitem.h" -#include "widgets/settingsgroup.h" - -#include - -#include -#include - -class CharaMangerModel; -class FaceWidget : public QWidget -{ - Q_OBJECT -public: - explicit FaceWidget(CharaMangerModel *model, QWidget *parent = nullptr); - ~FaceWidget(); - -private: - void initUI(); - void initConnect(); - -private Q_SLOTS: - void addFaceButton(const QString &newFaceName); - -Q_SIGNALS: - void requestAddFace(const QString &driverName, const int &charaType, const QString &charaName); - void requestDeleteFaceItem(const int &charaType, const QString &charaName); - void requestRenameFaceItem(const int &charaType, const QString &oldName, const QString &newName); - void noticeEnrollCompleted(const QString &driverName, const int &CharaType); - -public Q_SLOTS: - void onFaceidListChanged(const QStringList &facelist); - -private: - CharaMangerModel *m_model; - DCC_NAMESPACE::SettingsGroup *m_listGrp; - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_clearBtn; - QVector m_vecItem; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.cpp b/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.cpp deleted file mode 100644 index ab06f06d61..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.cpp +++ /dev/null @@ -1,274 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "addfingerdialog.h" -#include "charamangermodel.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -#define test false - -AddFingerDialog::AddFingerDialog(const QString &thumb, QWidget *parent) - : DAbstractDialog(parent) - , m_timer(new QTimer(parent)) - , m_mainLayout(new QVBoxLayout(this)) - , m_btnHLayout(new QHBoxLayout(this)) - , m_fingeWidget(new FingerInfoWidget(this)) - , m_thumb(thumb) - , m_cancelBtn(new QPushButton(this)) - , m_spaceWidget(new QWidget(this)) - , m_addBtn(new DTK_WIDGET_NAMESPACE::DSuggestButton(this)) -{ - initWidget(); - initData(); - QWidget::installEventFilter(this); -} - -AddFingerDialog::~AddFingerDialog() -{ -} - -void AddFingerDialog::initWidget() -{ - setFixedSize(QSize(382,446)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(""); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(65); // UI 暂定 整体115 - m_mainLayout->addWidget(m_fingeWidget, 0, Qt::AlignTop | Qt::AlignHCenter); - - m_btnHLayout->addWidget(m_cancelBtn, Qt::AlignHorizontal_Mask); - QHBoxLayout *btnHLayout = new QHBoxLayout(this); - btnHLayout->addSpacing(20); - m_spaceWidget->setMaximumWidth(20); - m_spaceWidget->setLayout(btnHLayout); - m_btnHLayout->addWidget(m_spaceWidget, Qt::AlignHorizontal_Mask); - m_btnHLayout->addWidget(m_addBtn, Qt::AlignHorizontal_Mask); - m_btnHLayout->setContentsMargins(10, 0, 10, 10); - - m_mainLayout->setSpacing(0); - m_mainLayout->addLayout(m_btnHLayout); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - - setLayout(m_mainLayout); - - this->activateWindow(); - this->setFocus(); -} - -void AddFingerDialog::initData() -{ - m_cancelBtn->setText((tr("Cancel"))); - m_addBtn->setEnabled(false); - m_addBtn->setVisible(false); - m_spaceWidget->setVisible(false); - connect(m_cancelBtn, &QPushButton::clicked, this, &AddFingerDialog::close); - connect(m_addBtn, &DSuggestButton::clicked, this, [=] { - auto text = m_addBtn->text(); - if (text == tr("Done")) { - this->close(); - } else if (text == tr("Scan Again")) { - Q_EMIT requestEnrollThumb(); - } - }); -} - -void AddFingerDialog::setFingerModel(CharaMangerModel *model) -{ - m_model = model; - m_timer->setSingleShot(true); - connect(m_timer, &QTimer::timeout, this, &AddFingerDialog::enrollOverTime); - connect(m_model, &CharaMangerModel::enrollCompleted, this, &AddFingerDialog::enrollCompleted); - connect(m_model, &CharaMangerModel::enrollStagePass, this, &AddFingerDialog::enrollStagePass); - connect(m_model, &CharaMangerModel::enrollFailed, this, &AddFingerDialog::enrollFailed); - connect(m_model, &CharaMangerModel::enrollDisconnected, this, &AddFingerDialog::enrollDisconnected); - connect(m_model, &CharaMangerModel::enrollRetry, this, &AddFingerDialog::enrollRetry); - connect(m_model, &CharaMangerModel::lockedChanged, this, [=](bool locked) { - if (locked) { -// close(); - } - }); - m_timer->start(1000 * 60);//1min -} - -void AddFingerDialog::setUsername(const QString &name) -{ - m_username = name; -} - -void AddFingerDialog::enrollCompleted() -{ - if (!m_isEnrolling) { - return; - } - - m_isEnrolling = false; - m_fingeWidget->finished(); - m_addBtn->show(); - m_addBtn->setText(tr("Done")); - m_addBtn->setEnabled(true); - m_cancelBtn->setVisible(false); - m_cancelBtn->setEnabled(false); - m_spaceWidget->setVisible(false); - m_timer->stop(); - Q_EMIT requestStopEnroll(m_username); -} - -void AddFingerDialog::enrollStagePass(int pro) -{ - if (!m_isEnrolling) { - return; - } - - m_addBtn->setEnabled(false); - m_fingeWidget->setProsses(pro); - m_timer->start(1000 * 60);//1min -} - -void AddFingerDialog::enrollFailed(QString title, QString msg) -{ - if (!m_isEnrolling) { - return; - } - m_isEnrolling = false; - m_fingeWidget->stopLiftTimer(); - m_fingeWidget->setStatueMsg(title, msg, true); - m_addBtn->show(); - m_addBtn->setText(tr("Scan Again")); - m_addBtn->setEnabled(true); - m_spaceWidget->setVisible(true); - m_timer->stop(); - - Q_EMIT requestStopEnroll(m_username); -} -void AddFingerDialog::enrollDisconnected() -{ - Q_EMIT requestStopEnroll(m_username); - - m_isEnrolling = false; - m_fingeWidget->setStatueMsg(tr("Scan Suspended"), tr("Scan Suspended"), true); - m_addBtn->show(); - m_addBtn->setText(tr("Scan Again")); - m_addBtn->setEnabled(true); - m_spaceWidget->setVisible(false); - m_timer->stop(); - - //会出现末知情况,需要与后端确认中断时是否可以停止 - Q_EMIT requestStopEnroll(m_username); -} - -void AddFingerDialog::enrollFocusOut() -{ - Q_EMIT requestStopEnroll(m_username); - - m_isEnrolling = false; - m_fingeWidget->setStatueMsg(tr("Scan Suspended"), tr(""), true); - m_addBtn->show(); - m_addBtn->setText(tr("Scan Again")); - m_cancelBtn->setEnabled(false); - m_addBtn->setEnabled(false); - m_spaceWidget->setVisible(true); - m_timer->stop(); - - //会出现末知情况,需要与后端确认中断时是否可以停止 - Q_EMIT requestStopEnroll(m_username); -} - -void AddFingerDialog::enrollOverTime() -{ - Q_EMIT requestStopEnroll(m_username); - - m_isEnrolling = false; - m_fingeWidget->setStatueMsg(tr("Scan Suspended"), "", true); - m_addBtn->show(); - m_addBtn->setText(tr("Scan Again")); - m_addBtn->setEnabled(true); - m_spaceWidget->setVisible(true); - m_timer->stop(); - - //会出现末知情况,需要与后端确认中断时是否可以停止 - Q_EMIT requestStopEnroll(m_username); -} - -void AddFingerDialog::enrollRetry(QString title, QString msg) -{ - if (!m_isEnrolling) { - return; - } - - m_addBtn->setEnabled(false); - m_timer->start(1000 * 60);//1min - m_fingeWidget->setStatueMsg(title, msg, false); -} - -void AddFingerDialog::setInitStatus() -{ - m_isEnrolling = true; - m_addBtn->setEnabled(false); - m_addBtn->setVisible(false); - m_spaceWidget->setVisible(false); - m_timer->start(1000 * 60);//1min - m_fingeWidget->reEnter(); -} - -void AddFingerDialog::closeEvent(QCloseEvent *event) -{ - if (m_isEnrolling) { - Q_EMIT requestStopEnroll(m_username); - } - Q_EMIT requesetCloseDlg(m_username); - QDialog::closeEvent(event); -} - -void AddFingerDialog::keyPressEvent(QKeyEvent *event) -{ -// switch (event->key()) { -// case Qt::Key_Escape: -// break; -// default: -// QDialog::keyPressEvent(event); -// break; -// } - if (event->key() != Qt::Key_Escape) { - QDialog::keyPressEvent(event); - } -} - -bool AddFingerDialog::eventFilter(QObject *o, QEvent *e) -{ - if (o == this) { - if (QEvent::WindowDeactivate == e->type()) { - clearFocus(); - if (m_isEnrolling) { - enrollFocusOut(); - QTimer::singleShot(1000, this, [=] { - m_cancelBtn->setEnabled(true); - m_addBtn->setEnabled(true); - }); - } - setFocus(); - return true ; - } - } - return false ; -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.h b/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.h deleted file mode 100644 index 2ab6144582..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/addfingerdialog.h +++ /dev/null @@ -1,72 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "fingerinfowidget.h" -#include "widgets/titlelabel.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QHBoxLayout; -class QPushButton; -class QCloseEvent; -class QDialog; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -//添加指纹对话框 -class CharaMangerModel; -class AddFingerDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit AddFingerDialog(const QString &thumb, QWidget *parent = nullptr); - ~AddFingerDialog() override; - - void setFingerModel(CharaMangerModel *model); - void setUsername(const QString &name); - void enrollCompleted(); - void enrollStagePass(int pro); - void enrollFailed(QString title, QString msg); - void setInitStatus(); - void enrollDisconnected(); - void enrollFocusOut(); - void enrollOverTime(); - void enrollRetry(QString title, QString msg); - -private: - void initWidget(); - void initData(); - void keyPressEvent(QKeyEvent *event); -protected: - void closeEvent(QCloseEvent *event); - bool eventFilter(QObject *o, QEvent *e); -Q_SIGNALS: - void requestSaveThumb(const QString &name); - void requestStopEnroll(const QString &thumb); - void requestReEnrollThumb(); - void requestEnrollThumb(); - void requesetCloseDlg(const QString &name); - -private: - QTimer *m_timer; - CharaMangerModel *m_model; - QVBoxLayout *m_mainLayout; - QHBoxLayout *m_btnHLayout; - FingerInfoWidget *m_fingeWidget; - QString m_thumb; - QString m_username; - QPushButton *m_cancelBtn; - QWidget *m_spaceWidget; - DTK_WIDGET_NAMESPACE::DSuggestButton *m_addBtn; - bool m_isEnrolling{true}; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.cpp b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.cpp deleted file mode 100644 index 9e5907548f..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.cpp +++ /dev/null @@ -1,153 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "fingerdisclaimer.h" -#include "charamangermodel.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -FingerDisclaimer::FingerDisclaimer(QWidget *parent) - : DAbstractDialog(parent) - , m_mainLayout(new QVBoxLayout(this)) - , m_fingerPic(new QLabel(this)) - , m_cancelBtn(new QPushButton(this)) - , m_acceptBtn(new DSuggestButton(this)) - , m_currentState(CharaMangerModel::AddInfoState::StartState) -{ - initWidget(); - initConnect(); - QWidget::installEventFilter(this); -} - -FingerDisclaimer::~FingerDisclaimer() -{ - -} - -void FingerDisclaimer::closeEvent(QCloseEvent *event) -{ - Q_EMIT requesetCloseDlg(); - QDialog::closeEvent(event); -} - -bool FingerDisclaimer::eventFilter(QObject *o, QEvent *e) -{ - if (o == this && QEvent::WindowDeactivate == e->type()) { - clearFocus(); - setFocus(); - return true; - } - return false; -} - -void FingerDisclaimer::initWidget() -{ - setFixedSize(QSize(382, 446)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Add Fingerprint")); - - m_fingerPic = new QLabel(this); - m_fingerPic->setPixmap(DIconTheme::findQIcon(getFacePicture()).pixmap(128, 128)); - - // 提示信息 - m_resultTips = new QLabel(this); - m_resultTips->hide(); - m_explainTips = new DLabel(); - m_explainTips->setWordWrap(true); - m_explainTips->setAlignment(Qt::AlignCenter); - DFontSizeManager::instance()->bind(m_explainTips, DFontSizeManager::T8); - - QHBoxLayout *tips = new QHBoxLayout(this); - tips->addWidget(m_explainTips); - tips->setContentsMargins(42, 10, 42, 10); - - // 免责声明 - m_disclaimersItem = new DisclaimersItem(DisclaimersObj::Finge, this); - m_disclaimersItem->show(); - - // 下方按钮 - QHBoxLayout *btnLayout = new QHBoxLayout(this); - m_cancelBtn->setText(tr("Cancel")); - m_cancelBtn->hide(); - m_acceptBtn->setText(tr("Next")); - m_acceptBtn->setDisabled(true); - - btnLayout->addWidget(m_cancelBtn, Qt::AlignCenter); - btnLayout->addSpacing(10); - btnLayout->addWidget(m_acceptBtn, Qt::AlignHorizontal_Mask); - btnLayout->setContentsMargins(8, 10, 10, 12); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(85); - m_mainLayout->addWidget(m_fingerPic, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(15); - m_mainLayout->addWidget(m_resultTips, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(10); - m_mainLayout->addLayout(tips); - m_mainLayout->addStretch(); - m_mainLayout->addWidget(m_disclaimersItem, 0, Qt::AlignCenter); - m_mainLayout->addLayout(btnLayout); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - setLayout(m_mainLayout); - - this->activateWindow(); - this->setFocus(); -} - -void FingerDisclaimer::initConnect() -{ - connect(m_disclaimersItem, &DisclaimersItem::requestSetWindowEnabled, this, &FingerDisclaimer::onSetWindowEnabled); - connect(m_disclaimersItem, &DisclaimersItem::requestStateChange, m_acceptBtn, &QPushButton::setDisabled); - connect(m_cancelBtn, &QPushButton::clicked, this, &FingerDisclaimer::close); - connect(m_acceptBtn, &QPushButton::clicked, this, &FingerDisclaimer::requestShowFingeInfoDialog, Qt::UniqueConnection); -} - -QString FingerDisclaimer::getFacePicture() -{ - QString theme; - QString icon; - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - theme = QString("dark"); - break; - } - - return QString(":/icons/deepin/builtin/icons/%1/icons/finger/fingerprint_light.svg").arg(theme); -} - - -// 处理界面失焦效果 配合 模态对话框 -void FingerDisclaimer::onSetWindowEnabled(const bool isEnabled) -{ - this->setEnabled(isEnabled); -} - diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.h b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.h deleted file mode 100644 index 4ff1830e3e..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerdisclaimer.h +++ /dev/null @@ -1,59 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "charamangermodel.h" -#include "widgets/titlelabel.h" -#include "widgets/buttontuple.h" -#include "widgets/disclaimersitem.h" - -#include -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QPushButton; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -class CharaMangerModel; -class FingerDisclaimer : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit FingerDisclaimer(QWidget *parent = nullptr); - ~FingerDisclaimer(); - - void onSetWindowEnabled(const bool isEnabled); - -Q_SIGNALS: - void requestShowFingeInfoDialog(); - void requesetCloseDlg(); - void requestStopEnroll(); - -protected: - void closeEvent(QCloseEvent *event); - bool eventFilter(QObject *o, QEvent *e); - -private: - void initWidget(); - void initConnect(); - QString getFacePicture(); - -private: - QVBoxLayout *m_mainLayout; - QLabel *m_fingerPic; - QLabel *m_resultTips; // 录入结果说明 - DTK_WIDGET_NAMESPACE::DLabel *m_explainTips; // 状态说明信息 - DisclaimersItem *m_disclaimersItem; // 免责声明 - QPushButton *m_cancelBtn; // 取消 - DTK_WIDGET_NAMESPACE::DSuggestButton *m_acceptBtn; // 下一步 - CharaMangerModel::AddInfoState m_currentState; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.cpp deleted file mode 100644 index b9ab0f3ace..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.cpp +++ /dev/null @@ -1,166 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "fingerinfowidget.h" - -#include -#include - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -FingerInfoWidget::FingerInfoWidget(QWidget *parent) - : QWidget(parent) - , m_view(new DPictureSequenceView) - , m_tipLbl(new QLabel(this)) - , m_titleLbl(new DCC_NAMESPACE::TitleLabel(this)) - , m_isFinished(false) - , m_titleTimer(new QTimer(this)) - , m_msgTimer(new QTimer(this)) - , m_liftTimer(new QTimer(this)) -{ - m_titleTimer->setSingleShot(true); - m_titleTimer->setInterval(2000); - m_msgTimer->setSingleShot(true); - m_msgTimer->setInterval(2000); - m_liftTimer->setSingleShot(true); - m_liftTimer->setInterval(1000); - connect(m_titleTimer, &QTimer::timeout, this, [this] { - m_titleLbl->setText(m_defTitle); - }); - connect(m_msgTimer, &QTimer::timeout, this, [this] { - m_tipLbl->setText(m_defTip); - }); - connect(m_liftTimer, &QTimer::timeout, this, [this] { - if (m_pro > 0 && m_pro < 35) { - m_defTitle = tr("Place your finger"); - m_defTip = tr("Place your finger firmly on the sensor until you're asked to lift it"); - } else if (m_pro >= 35 && m_pro < 100) { - m_defTitle = tr("Scan the edges of your fingerprint"); - m_defTip = tr("Place the edges of your fingerprint on the sensor"); - } else { - m_liftTimer->stop(); - return; - } - - m_titleLbl->setText(m_defTitle); - m_tipLbl->setText(m_defTip); - }); - - DGuiApplicationHelper::ColorType type = DGuiApplicationHelper::instance()->themeType(); - switch (type) { - case DGuiApplicationHelper::UnknownType: - break; - case DGuiApplicationHelper::LightType: - m_theme = QString("light"); - break; - case DGuiApplicationHelper::DarkType: - m_theme = QString("dark"); - break; - } - - m_view->setSingleShot(true); - - m_titleLbl->setAlignment(Qt::AlignCenter); - m_tipLbl->setWordWrap(true); - m_tipLbl->setAlignment(Qt::AlignCenter); - - QVBoxLayout *layout = new QVBoxLayout; - m_view->setMinimumHeight(90); - layout->addWidget(m_view, 0, Qt::AlignTop); - layout->addSpacing(20); - layout->addWidget(m_titleLbl, 0, Qt::AlignHCenter); - layout->addSpacing(10); - layout->addWidget(m_tipLbl, 0, Qt::AlignHCenter); - setLayout(layout); - - setProsses(0); -} - -void FingerInfoWidget::setStatueMsg(const QString &title, const QString &msg, bool reset) -{ - m_reset = reset; - m_msgTimer->stop(); - m_titleTimer->stop(); - - m_titleLbl->setText(title); - m_tipLbl->setText(msg); - - if (!m_reset) { - m_msgTimer->start(); - m_titleTimer->start(); - - if (m_pro == 0) { - m_view->setPictureSequence(QStringList() << QString(":/icons/deepin/builtin/icons/%1/icons/finger/fingerprint_light.svg").arg(m_theme)); - } else { - m_view->setPictureSequence(QStringList() << QString(":/icons/deepin/builtin/icons/%1/icons/finger/fingerprint_animation_light_%2.svg") - .arg(m_theme).arg(m_pro/2)); - } - } -} - -void FingerInfoWidget::setProsses(int pro) -{ - m_pro = pro; - if (m_pro == 0) { - m_isStageOne = true; - m_view->setPictureSequence(QStringList() << QString(":/icons/deepin/builtin/icons/%1/icons/finger/fingerprint_light.svg").arg(m_theme)); - m_defTitle = tr("Place your finger"); - m_defTip = tr("Place your finger firmly on the sensor until you're asked to lift it"); - } else { - int idx = m_pro / 2; - idx = idx > 50 ? 50 : idx; - m_view->setPictureSequence(QStringList() << QString(":/icons/deepin/builtin/icons/%1/icons/finger/fingerprint_animation_light_%2.svg") - .arg(m_theme).arg(idx)); - if (m_pro > 0 && m_pro < 35) { - m_defTitle = tr("Lift your finger"); - m_defTip = tr("Lift your finger and place it on the sensor again"); - m_liftTimer->start(); - } else if (m_pro >= 35 && m_pro < 100) { - if (m_isStageOne == true) { - m_isStageOne = false; - m_defTitle = tr("Scan the edges of your fingerprint"); - m_defTip = tr("Adjust the position to scan the edges of your fingerprint"); - } else { - m_defTitle = tr("Scan the edges of your fingerprint"); - m_defTip = tr("Lift your finger and do that again"); - m_liftTimer->start(); - } - } else { - m_defTitle = tr("Fingerprint added"); - m_defTip = tr(""); - } - } - m_msgTimer->stop(); - m_titleTimer->stop(); - m_titleLbl->setText(m_defTitle); - auto font = m_titleLbl->font(); - font.setWeight(QFont::DemiBold); - m_titleLbl->setFont(font); - m_tipLbl->setText(m_defTip); -} - -void FingerInfoWidget::reEnter() -{ - m_isFinished = false; - - setProsses(0); -} - -void FingerInfoWidget::finished() -{ - m_isFinished = true; - stopLiftTimer(); - setProsses(100); -} - -void FingerInfoWidget::stopLiftTimer() -{ - if (nullptr != m_liftTimer && m_liftTimer->isActive()) - m_liftTimer->stop(); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.h b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.h deleted file mode 100644 index 70b1b5785f..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerinfowidget.h +++ /dev/null @@ -1,49 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "widgets/titlelabel.h" - -#include -#include -#include - -class FingerInfoWidget : public QWidget -{ - Q_OBJECT -public: - enum enrollStage { - enrollFirstStage = 1, - enrollSecondStage - }; - - explicit FingerInfoWidget(QWidget *parent = nullptr); - - void setStatueMsg(const QString &title, const QString &msg, bool reset = true); - - void setProsses(int pro); - void reEnter(); - void finished(); - void stopLiftTimer(); - -Q_SIGNALS: - void playEnd(); - -private: - DTK_WIDGET_NAMESPACE::DPictureSequenceView *m_view; - QLabel *m_tipLbl; - DCC_NAMESPACE::TitleLabel *m_titleLbl; - bool m_isFinished; - - QString m_defTip{""}; - QString m_defTitle{""}; - int m_pro{0}; - QTimer *m_titleTimer; - QTimer *m_msgTimer; - QTimer *m_liftTimer; - QString m_theme; - bool m_reset{false}; - bool m_isStageOne{true}; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.cpp b/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.cpp deleted file mode 100644 index 4fdb72dd54..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.cpp +++ /dev/null @@ -1,43 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "fingeritem.h" - -#include -#include - -FingerItem::FingerItem(QWidget *parent) - : SettingsItem(parent) - , m_layout(new QHBoxLayout) - , m_editMode(false) - , m_editBtn(new DIconButton(this)) - , m_removeBtn(new DIconButton(this)) - , m_title(new QLabel) -{ - setFixedHeight(36); - - m_editBtn->setVisible(false); - - m_layout->setContentsMargins(20, 0, 10, 0); - - m_layout->addWidget(m_title); - m_layout->addWidget(m_editBtn); - m_layout->addStretch(); - m_layout->addWidget(m_removeBtn); - - setLayout(m_layout); -} - -void FingerItem::setTitle(const QString &title) -{ - m_title->setText(title); -} - -void FingerItem::setEditMode(const bool editmode) -{ - m_editMode = editmode; - - m_editBtn->setVisible(editmode); - m_removeBtn->setVisible(editmode); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.h b/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.h deleted file mode 100644 index df242cbe6c..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingeritem.h +++ /dev/null @@ -1,42 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef FINGERITEM_H -#define FINGERITEM_H - -#include -#include "widgets/settingsitem.h" -#include - -#include - -QT_BEGIN_NAMESPACE -class QHBoxLayout; -class QLabel; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DIconButton; -DWIDGET_END_NAMESPACE - -DWIDGET_USE_NAMESPACE - -class FingerItem : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT -public: - explicit FingerItem(QWidget *parent = nullptr); - - void setTitle(const QString &title); - void setEditMode(const bool editmode); - -private: - QHBoxLayout *m_layout; - bool m_editMode; - DIconButton *m_editBtn; - DIconButton *m_removeBtn; - QLabel *m_title; -}; - -#endif // FINGERITEM_H diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.cpp deleted file mode 100644 index 216061187c..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.cpp +++ /dev/null @@ -1,198 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "charamangermodel.h" -#include "fingerwidget.h" -#include "widgets/titlelabel.h" -#include "widgets/settingsgroup.h" - -#include - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -FingerWidget::FingerWidget(QWidget *parent) - : QWidget(parent) - , m_listGrp(new SettingsGroup(nullptr, SettingsGroup::GroupBackground)) - , m_clearBtn(nullptr) -{ - //注册所有的事件 - installEventFilter(this); - - m_clearBtn = new DCommandLinkButton(tr("Edit")); - m_clearBtn->setCheckable(true); - - TitleLabel *fingetitleLabel = new TitleLabel(tr("Fingerprint Password")); - TitleLabel *maxFingerTip = new TitleLabel(tr("You can add up to 10 fingerprints")); - QFont font; - font.setPointSizeF(10); - maxFingerTip->setFont(font); - - m_listGrp->setSpacing(1); - m_listGrp->setContentsMargins(10, 0, 10, 0); - m_listGrp->layout()->setMargin(0); - m_listGrp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - QHBoxLayout *headLayout = new QHBoxLayout; - headLayout->setSpacing(0); - headLayout->setContentsMargins(10, 0, 10, 0); - headLayout->addWidget(fingetitleLabel, 0, Qt::AlignLeft); - - QHBoxLayout *tipLayout = new QHBoxLayout; - tipLayout->setSpacing(10); - tipLayout->setContentsMargins(10, 0, 10, 0); - tipLayout->addWidget(maxFingerTip, 0, Qt::AlignLeft); - tipLayout->addWidget(m_clearBtn, 0, Qt::AlignRight); - tipLayout->addSpacing(5); - - QVBoxLayout *mainContentLayout = new QVBoxLayout; - mainContentLayout->setSpacing(1); - mainContentLayout->setMargin(0); - mainContentLayout->addLayout(headLayout); - mainContentLayout->addSpacing(2); - mainContentLayout->addLayout(tipLayout); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_listGrp); - setLayout(mainContentLayout); - - //设置字体大小 - DFontSizeManager::instance()->bind(m_clearBtn, DFontSizeManager::T8); - - connect(m_clearBtn, &DCommandLinkButton::clicked, this, [ = ](bool checked) { - if (checked) { - m_clearBtn->setText(tr("Done")); - //添加一个空白区域 - mainContentLayout->addSpacing(20); - } else { - m_clearBtn->setText(tr("Edit")); - //把之前添加的空白区域移除 - mainContentLayout->removeItem(mainContentLayout->itemAt(mainContentLayout->count() - 1)); - } - for (auto &item : m_vecItem) { - item->setShowIcon(checked); - } - }); -} - -FingerWidget::~FingerWidget() -{ - -} - -void FingerWidget::setFingerModel(CharaMangerModel *model) -{ - m_model = model; - m_currentUserName = model->userName(); - connect(m_model, &CharaMangerModel::enrollCompleted, this, [this] { - Q_EMIT noticeEnrollCompleted(m_currentUserName); - }); - connect(model, &CharaMangerModel::thumbsListChanged, this, &FingerWidget::onThumbsListChanged); - onThumbsListChanged(model->thumbsList()); -} - -bool FingerWidget::eventFilter(QObject *watched, QEvent *event) -{ - Q_UNUSED(watched); - //删除指纹提权超时的时候,再次输入密码需要通知界面刷新 - if(event->type() == QEvent::WindowActivate) { - Q_EMIT noticeEnrollCompleted(m_currentUserName); - } - return true; -} - -void FingerWidget::onThumbsListChanged(const QStringList &thumbs) -{ - m_vecItem.clear(); - m_listGrp->clear(); - - for (int n = 0; n < 10 && n < thumbs.size(); ++n) { - QString finger = thumbs.at(n); - auto item = new AuthenticationInfoItem(this); - item->setTitle(finger); - item->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - DFontSizeManager::instance()->bind(item, DFontSizeManager::T6); - m_listGrp->appendItem(item); - connect(item, &AuthenticationInfoItem::removeClicked, this, [this, finger] { - Q_EMIT requestDeleteFingerItem(m_currentUserName, finger); - }); - connect(item, &AuthenticationInfoItem::editTextFinished, this, [this, finger, item, thumbs, n](QString newName) { - // 没有改名,直接返回 - if (item->getTitle() == newName) { - return; - } - for (int i = 0; i < thumbs.size(); ++i) { - if (newName == thumbs.at(i) && i != n) { - QString errMsg = tr("The name already exists"); - item->showAlertMessage(errMsg); - return; - } - } - item->setTitle(newName); - Q_EMIT requestRenameFingerItem(m_currentUserName, finger, newName); - }); - - connect(item, &AuthenticationInfoItem::editClicked, this, [this, item, thumbs]() { - for (int k = 0; k < thumbs.size(); ++k) { - static_cast(m_listGrp->getItem(k))->setEditTitle(item == m_listGrp->getItem(k)); - } - }); - - if(m_clearBtn->isChecked()) - item->setShowIcon(true); - - m_vecItem.append(item); - } - - m_clearBtn->setVisible(m_listGrp->itemCount()); - // 如果指纹数量大于等于10,则不显示添加指纹按钮 - if (thumbs.size() >= 10) { - return; - } - // 找到最小的指纹名以便作为缺省名添加 - for (int i = 0; i < m_model->getPredefineThumbsName().size(); ++i) { - bool findNotUsedThumb = false; - QString newFingerName = m_model->getPredefineThumbsName().at(i); - for (int n = 0; n < 10 && n < thumbs.size(); ++n) { - if (newFingerName == thumbs.at(n)) { - findNotUsedThumb = true; - break; - } - } - if (!findNotUsedThumb) { - addFingerButton(newFingerName); - break; - } - } -} - -void FingerWidget::addFingerButton(const QString &newFingerName) -{ - AuthenticationLinkButtonItem* addfingerItem = new AuthenticationLinkButtonItem(this); - - QString strAddFinger = tr("Add Fingerprint"); - DCommandLinkButton *addBtn = new DCommandLinkButton(strAddFinger); - QHBoxLayout *fingerLayout = new QHBoxLayout(this); - fingerLayout->addWidget(addBtn, 0, Qt::AlignLeft); - fingerLayout->setContentsMargins(3, 5, 0, 5); - addfingerItem->setLayout(fingerLayout); - m_listGrp->insertItem(m_listGrp->itemCount(), addfingerItem); - addfingerItem->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - DFontSizeManager::instance()->bind(addBtn, DFontSizeManager::T7); - QFontMetrics fontMetrics(font()); - int nFontWidth = fontMetrics.horizontalAdvance(strAddFinger); - addBtn->setMinimumWidth(nFontWidth); - connect(addBtn, &DCommandLinkButton::clicked, this, [ = ] { - Q_EMIT requestAddThumbs(m_currentUserName, newFingerName); - }); - connect(addfingerItem, &AuthenticationLinkButtonItem::mousePressed, this, [ = ] { - Q_EMIT requestAddThumbs(m_currentUserName, newFingerName); - }); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.h b/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.h deleted file mode 100644 index 099ef223eb..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/finger/fingerwidget.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "widgets/authenticationinfoitem.h" -#include "widgets/settingsgroup.h" -#include - -#include -#include - -DWIDGET_BEGIN_NAMESPACE -class DCommandLinkButton; -DWIDGET_END_NAMESPACE - -class CharaMangerModel; -class FingerWidget : public QWidget -{ - Q_OBJECT -public: - explicit FingerWidget(QWidget *parent = nullptr); - ~FingerWidget(); - void setFingerModel(CharaMangerModel *model); - void addFingerButton(const QString &newFingerName); - bool eventFilter(QObject *watched, QEvent *event)override; - -Q_SIGNALS: - void requestAddThumbs(const QString &name, const QString &thumb); - void requestDeleteFingerItem(const QString &userName, const QString& finger); - void requestRenameFingerItem(const QString &userName, const QString& finger, const QString& newName); - void noticeEnrollCompleted(QString userName); - -public Q_SLOTS: - void onThumbsListChanged(const QStringList &thumbs); - -private: - QString m_currentUserName; - CharaMangerModel *m_model; - DCC_NAMESPACE::SettingsGroup *m_listGrp; - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_clearBtn; - QVector m_vecItem; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.cpp b/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.cpp deleted file mode 100644 index fec616a9b9..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.cpp +++ /dev/null @@ -1,184 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "addirisinfodialog.h" -#include "charamangermodel.h" - -#include -#include -#include - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -AddIrisInfoDialog::AddIrisInfoDialog(CharaMangerModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_charaModel(model) - , m_mainLayout(new QVBoxLayout(this)) - , m_irisInfo(new IrisInfoWidget(this)) - , m_resultTips(new QLabel(this)) - , m_explainTips(new QLabel(this)) - , m_disclaimersItem(new DisclaimersItem(DisclaimersObj::Iris, this)) - , m_cancelBtn(new QPushButton(this)) - , m_acceptBtn(new DSuggestButton(this)) -{ - initWidget(); - initConnect(); - installEventFilter(this); -} - -AddIrisInfoDialog::~AddIrisInfoDialog() -{ - -} - - -void AddIrisInfoDialog::closeEvent(QCloseEvent *event) -{ - Q_EMIT requesetCloseDlg(); - if (m_state == CharaMangerModel::AddInfoState::Processing) { - Q_EMIT requestStopEnroll(); - } - QDialog::closeEvent(event); -} - -bool AddIrisInfoDialog::eventFilter(QObject *o, QEvent *e) -{ - if (o == this && QEvent::WindowDeactivate == e->type()) { - clearFocus(); - setFocus(); - return true; - } - return false; -} - -void AddIrisInfoDialog::initWidget() -{ - setFixedSize(QSize(340, 404)); - m_mainLayout->setAlignment(Qt::AlignHCenter); - - DTitlebar *titleIcon = new DTitlebar(this); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Enroll Iris")); - - // 图片 - m_irisInfo->setFixedSize(QSize(128, 128)); - m_irisInfo->updateState(CharaMangerModel::AddInfoState::StartState); - - // 提示信息 - m_resultTips->hide(); - m_explainTips = new QLabel(this); - m_explainTips->setWordWrap(true); - m_explainTips->setAlignment(Qt::AlignCenter); - DFontSizeManager::instance()->bind(m_explainTips, DFontSizeManager::T8); - - QHBoxLayout *tips = new QHBoxLayout(this); - tips->addWidget(m_explainTips, 0, Qt::AlignHCenter); - - // 免责声明 - m_disclaimersItem->show(); - - // 下方按钮 - QHBoxLayout *btnLayout = new QHBoxLayout(this); - m_cancelBtn->setText(tr("Cancel")); - m_cancelBtn->hide(); - m_acceptBtn->setText(tr("Next")); - m_acceptBtn->setDisabled(true); - - btnLayout->addWidget(m_cancelBtn, Qt::AlignCenter); - btnLayout->addSpacing(10); - btnLayout->addWidget(m_acceptBtn, Qt::AlignCenter); - btnLayout->setContentsMargins(20, 10, 20, 20); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - m_mainLayout->addSpacing(30); - m_mainLayout->addWidget(m_irisInfo, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(15); - m_mainLayout->addWidget(m_resultTips, 0, Qt::AlignHCenter); - m_mainLayout->addSpacing(10); - m_mainLayout->addLayout(tips); - m_mainLayout->addStretch(); - m_mainLayout->addWidget(m_disclaimersItem, 0, Qt::AlignCenter); - m_mainLayout->addLayout(btnLayout); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - setLayout(m_mainLayout); -} - -void AddIrisInfoDialog::initConnect() -{ - connect(m_charaModel, &CharaMangerModel::enrollIrisInfoState, this, &AddIrisInfoDialog::refreshInfoStatusDisplay); - connect(m_charaModel, &CharaMangerModel::enrollIrisStatusTips, this, &AddIrisInfoDialog::refreshExplainTips); - connect(m_disclaimersItem, &DisclaimersItem::requestSetWindowEnabled, this, &AddIrisInfoDialog::onSetWindowEnabled); - connect(m_disclaimersItem, &DisclaimersItem::requestStateChange, m_acceptBtn, &QPushButton::setDisabled); - - connect(m_cancelBtn, &QPushButton::clicked, this, &AddIrisInfoDialog::close); - connect(m_acceptBtn, &QPushButton::clicked, this, &AddIrisInfoDialog::requestInputIris); - connect(m_cancelBtn, &QPushButton::clicked, this, [this]{ - if (m_acceptBtn->text() == "Done") { - this->close(); - } - }); -} - -void AddIrisInfoDialog::refreshInfoStatusDisplay(CharaMangerModel::AddInfoState state) -{ - m_irisInfo->updateState(state); - m_state = state; - switch (state) { - case CharaMangerModel::AddInfoState::Processing:{ - m_resultTips->setVisible(false); - m_disclaimersItem->setVisible(false); - m_cancelBtn->setVisible(false); - m_acceptBtn->setVisible(false); - m_explainTips->setVisible(true); - } - break; - case CharaMangerModel::AddInfoState::Success:{ - m_resultTips->setVisible(true); - m_resultTips->setText(tr("Iris enrolled")); - m_disclaimersItem->setVisible(false); - m_cancelBtn->setVisible(true); - m_cancelBtn->setText(tr("Done")); - m_acceptBtn->setVisible(false); - m_explainTips->setVisible(false); - - Q_EMIT requestStopEnroll(); - } - break; - case CharaMangerModel::AddInfoState::Fail:{ - m_resultTips->setVisible(true); - m_resultTips->setText(tr("Failed to enroll your iris")); - m_disclaimersItem->setVisible(false); - m_cancelBtn->setVisible(true); - m_cancelBtn->setText("Done"); - m_acceptBtn->setVisible(true); - m_acceptBtn->setText(tr("Try Again")); - m_explainTips->setVisible(false); - - Q_EMIT requestStopEnroll(); - } - break; - default: - break; - } -} - -void AddIrisInfoDialog::onSetWindowEnabled(const bool isEnabled) -{ - this->setEnabled(isEnabled); -} - -void AddIrisInfoDialog::refreshExplainTips(QString tips) -{ - m_explainTips->setText(tips); -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.h b/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.h deleted file mode 100644 index bdf6f248a0..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/addirisinfodialog.h +++ /dev/null @@ -1,66 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "widgets/titlelabel.h" -#include "widgets/buttontuple.h" -#include "widgets/disclaimersitem.h" -#include "widgets/iris/irisinfowidget.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QPushButton; -class QCloseEvent; -class QDialog; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DSuggestButton; -class DTipLabel; -DWIDGET_END_NAMESPACE - -// 虹膜对话框 -class CharaMangerModel; -class AddIrisInfoDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - - explicit AddIrisInfoDialog(CharaMangerModel *model, QWidget *parent = nullptr); - ~AddIrisInfoDialog(); - -Q_SIGNALS: - void requestInputIris(); - void requesetCloseDlg(); - void requestStopEnroll(); - -protected: - void closeEvent(QCloseEvent *event) override; - bool eventFilter(QObject *o, QEvent *e) override; - -private: - void initWidget(); - void initConnect(); - -public Q_SLOTS: - void refreshInfoStatusDisplay(CharaMangerModel::AddInfoState state); - void onSetWindowEnabled(const bool isEnabled); - void refreshExplainTips(QString tips); - -private: - CharaMangerModel *m_charaModel; - QVBoxLayout *m_mainLayout; - IrisInfoWidget *m_irisInfo; - QLabel *m_resultTips; // 录入结果说明 - QLabel *m_explainTips; // 状态说明信息 - DisclaimersItem *m_disclaimersItem; // 免责声明 - QPushButton* m_cancelBtn; // 取消 - DTK_WIDGET_NAMESPACE::DSuggestButton* m_acceptBtn; // 下一步 - CharaMangerModel::AddInfoState m_state; -}; - diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.cpp deleted file mode 100644 index ed17fbf46f..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.cpp +++ /dev/null @@ -1,94 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "irisinfowidget.h" - -#include -#include -#include -#include - -DGUI_USE_NAMESPACE - -IrisInfoWidget::IrisInfoWidget(QWidget *parent) - : QWidget (parent) - , m_state(CharaMangerModel::AddInfoState::StartState) - , m_timer(new QTimer(this)) - , m_angle(0) -{ - m_timer->setInterval(1000 / 60); - connect(m_timer, &QTimer::timeout, this, static_cast(&QWidget::update)); -} - -IrisInfoWidget::~IrisInfoWidget() -{ - -} - -void IrisInfoWidget::updateState(CharaMangerModel::AddInfoState state) -{ - m_state = state; - - if (m_state == CharaMangerModel::AddInfoState::Processing) - m_timer->start(); - else { - m_timer->stop(); - } - update(); -} - -void IrisInfoWidget::paintEvent(QPaintEvent *event) -{ - QPainter painter(this); - - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - - QString backRes; - - if (m_state == CharaMangerModel::AddInfoState::StartState - || m_state == CharaMangerModel::AddInfoState::Processing) { - if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - backRes = ":/icons/deepin/builtin/icons/dcc_auth_iris-light.svg"; - } else if (DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { - backRes = ":/icons/deepin/builtin/icons/dcc_auth_iris-dark.svg"; - } - } else if (m_state == CharaMangerModel::AddInfoState::Success) { - backRes = ":/icons/deepin/builtin/icons/dcc_auth_success.svg"; - } else if (m_state == CharaMangerModel::AddInfoState::Fail) { - backRes = ":/icons/deepin/builtin/icons/dcc_auth_fail.svg"; - } else { - qWarning() << "not support"; - } - - // 静态背景图 - QPixmap backPix(backRes); - const int minSize = qMin(width(), height()); - const qreal scale = backPix.width() * 1.0 / minSize; - backPix = backPix.scaled(minSize, minSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - painter.drawPixmap(rect(), backPix); - - // 动态效果 - if (m_state == CharaMangerModel::AddInfoState::Processing) { - // 内圈 - painter.translate(width() / 2, height() / 2); - painter.rotate((m_angle += 1) % 360); - painter.translate( -(width() / 2), -(height() / 2)); - QPixmap insidePix(":/icons/deepin/builtin/icons/dcc_auth_circle_inside.svg"); - insidePix = insidePix.scaled(insidePix.width() / scale, insidePix.height() / scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - QRect insideRect((width() - insidePix.width() / scale) / 2, (height() - insidePix.height() / scale) / 2, insidePix.width() / scale, insidePix.height() / scale); - painter.drawPixmap(insideRect, insidePix); - - // 外圈 - painter.translate(width() / 2, height() / 2); - painter.rotate((m_angle += 2) % 360); - painter.translate( -(width() / 2), -(height() / 2)); - QPixmap outsidePix(":/icons/deepin/builtin/icons/dcc_auth_circle_outside.svg"); - outsidePix = outsidePix.scaled(outsidePix.width() / scale, outsidePix.height() / scale, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - QRect outsideRect((width() - outsidePix.width() / scale) / 2, (height() - outsidePix.height() / scale) / 2, outsidePix.width() / scale, outsidePix.height() / scale); - painter.drawPixmap(outsideRect, outsidePix); - } - - QWidget::paintEvent(event); -} - diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.h b/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.h deleted file mode 100644 index 9b8d1d5252..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/irisinfowidget.h +++ /dev/null @@ -1,34 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include "charamangermodel.h" - -#include - -class CharaMangerModel; - -class IrisInfoWidget : public QWidget -{ - Q_OBJECT -public: - explicit IrisInfoWidget(QWidget *parent = nullptr); - ~IrisInfoWidget(); - -public Q_SLOTS: - void updateState(CharaMangerModel::AddInfoState state); - -private: - void initWidget(); - -protected: - void paintEvent(QPaintEvent *event); - -private: - CharaMangerModel::AddInfoState m_state; - QTimer *m_timer; - int m_angle; -}; diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.cpp b/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.cpp deleted file mode 100644 index 3e962b2c72..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.cpp +++ /dev/null @@ -1,194 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "iriswidget.h" -#include "widgets/titlelabel.h" -#include "charamangermodel.h" - -#include - -#include -#include -#include -#include - -#define IRISID_NUM 5 - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -IrisWidget::IrisWidget(CharaMangerModel *model, QWidget *parent) - : QWidget (parent) - , m_model(model) - , m_listGrp(new SettingsGroup(nullptr, SettingsGroup::GroupBackground)) - , m_clearBtn(new DCommandLinkButton(tr("Edit"), this)) -{ - initUI(); - initConnect(); -} - -IrisWidget::~IrisWidget() -{ - -} - -void IrisWidget::initUI() -{ - m_clearBtn->setCheckable(true); - - TitleLabel *titleLabel = new TitleLabel(tr("Manage Irises"), this); - TitleLabel *maxFingerTip = new TitleLabel(tr("You can add up to 5 irises"), this); - - QFont font; - font.setPointSizeF(10); - maxFingerTip->setFont(font); - - m_listGrp->setSpacing(1); - m_listGrp->setContentsMargins(10, 0, 10, 0); - m_listGrp->layout()->setMargin(0); - m_listGrp->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - QHBoxLayout *headLayout = new QHBoxLayout; - headLayout->setSpacing(0); - headLayout->setContentsMargins(10, 0, 10, 0); - headLayout->addWidget(titleLabel, 0, Qt::AlignLeft); - - QHBoxLayout *tipLayout = new QHBoxLayout; - tipLayout->setSpacing(10); - tipLayout->setContentsMargins(10, 0, 10, 0); - tipLayout->addWidget(maxFingerTip, 0, Qt::AlignLeft); - tipLayout->addWidget(m_clearBtn, 0, Qt::AlignRight); - tipLayout->addSpacing(5); - - QVBoxLayout *mainContentLayout = new QVBoxLayout; - mainContentLayout->setSpacing(1); - mainContentLayout->setMargin(0); - mainContentLayout->addLayout(headLayout); - mainContentLayout->addSpacing(2); - mainContentLayout->addLayout(tipLayout); - mainContentLayout->addSpacing(10); - mainContentLayout->addWidget(m_listGrp); - setLayout(mainContentLayout); - - //设置字体大小 - DFontSizeManager::instance()->bind(m_clearBtn, DFontSizeManager::T8); - - connect(m_clearBtn, &DCommandLinkButton::clicked, this, [ = ](bool checked) { - if (checked) { - m_clearBtn->setText(tr("Done")); - //添加一个空白区域 - mainContentLayout->addSpacing(20); - } else { - m_clearBtn->setText(tr("Edit")); - //把之前添加的空白区域移除 - mainContentLayout->removeItem(mainContentLayout->itemAt(mainContentLayout->count() - 1)); - } - for (auto &item : m_vecItem) { - item->setShowIcon(checked); - } - }); -} - -void IrisWidget::initConnect() -{ - connect(m_model, &CharaMangerModel::enrollInfoState, this, [this](){ - Q_EMIT noticeEnrollCompleted(m_model->irisDriverName(), m_model->irisCharaType()); - }); - connect(m_model, &CharaMangerModel::irisListChanged, this, &IrisWidget::onIrisListChanged); - onIrisListChanged(m_model->irisList()); - -} - -void IrisWidget::addIrisButton(const QString &newIrisName) -{ - AuthenticationLinkButtonItem* addItem = new AuthenticationLinkButtonItem(this); - - QString strAddIris = tr("Add Iris"); - DCommandLinkButton *addBtn = new DCommandLinkButton(strAddIris); - QHBoxLayout *irisLayout = new QHBoxLayout(this); - irisLayout->addWidget(addBtn, 0, Qt::AlignLeft); - irisLayout->setContentsMargins(3, 5, 0, 5); - addItem->setLayout(irisLayout); - m_listGrp->insertItem(m_listGrp->itemCount(), addItem); - addItem->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - DFontSizeManager::instance()->bind(addBtn, DFontSizeManager::T7); - QFontMetrics fontMetrics(font()); - int nFontWidth = fontMetrics.horizontalAdvance(strAddIris); - addBtn->setMinimumWidth(nFontWidth); - connect(addBtn, &DCommandLinkButton::clicked, this, [ = ] { - Q_EMIT requestAddIris(m_model->irisDriverName(), m_model->irisCharaType(), newIrisName); - }); - connect(addItem, &AuthenticationLinkButtonItem::mousePressed, this, [ = ] { - Q_EMIT requestAddIris(m_model->irisDriverName(), m_model->irisCharaType(), newIrisName); - }); -} - -void IrisWidget::onIrisListChanged(const QStringList &irislist) -{ - m_vecItem.clear(); - m_listGrp->clear(); - - for (int n = 0; n < IRISID_NUM && n < irislist.size(); ++n) { - QString irisid = irislist.at(n); - auto item = new AuthenticationInfoItem(this); - item->setTitle(irisid); - item->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - DFontSizeManager::instance()->bind(item, DFontSizeManager::T6); - m_listGrp->appendItem(item); - connect(item, &AuthenticationInfoItem::removeClicked, this, [this, irisid] { - Q_EMIT requestDeleteIrisItem(m_model->irisCharaType(), irisid); - }); - - connect(item, &AuthenticationInfoItem::editTextFinished, this, [this, irisid, item, irislist, n](QString newName) { - // 没有改名,直接返回 - if (item->getTitle() == newName) { - return; - } - for (int i = 0; i < irislist.size(); ++i) { - if (newName == irislist.at(i) && i != n) { - QString errMsg = tr("The name already exists"); - item->showAlertMessage(errMsg); - return; - } - } - item->setTitle(newName); - Q_EMIT requestRenameIrisItem(m_model->irisCharaType(), irisid, newName); - Q_EMIT noticeEnrollCompleted(m_model->irisDriverName(), m_model->irisCharaType()); - }); - - connect(item, &AuthenticationInfoItem::editClicked, this, [this, item, irislist]() { - for (int k = 0; k < irislist.size(); ++k) { - static_cast(m_listGrp->getItem(k))->setEditTitle(item == m_listGrp->getItem(k)); - } - }); - - if (m_clearBtn->isChecked()) - item->setShowIcon(true); - - m_vecItem.append(item); - } - m_clearBtn->setVisible(m_listGrp->itemCount()); - - if (irislist.size() >= IRISID_NUM) { - return; - } - - // 找到最小的名称以便作为缺省名添加 - for (int i = 0; i < IRISID_NUM; ++i) { - bool findNotUsedThumb = false; - QString newName(tr("Iris") + QString("%1").arg(i + 1)); - - for (int n = 0; n < IRISID_NUM && n < irislist.size(); ++n) { - if (newName == irislist.at(n)) { - findNotUsedThumb = true; - break; - } - } - - if (!findNotUsedThumb) { - addIrisButton(newName); - break; - } - } -} diff --git a/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.h b/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.h deleted file mode 100644 index fc539353b5..0000000000 --- a/dcc-old/src/plugin-authentication/window/widgets/iris/iriswidget.h +++ /dev/null @@ -1,44 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "widgets/authenticationinfoitem.h" -#include "widgets/settingsgroup.h" - -#include - -#include -#include - -class CharaMangerModel; -class IrisWidget : public QWidget -{ - Q_OBJECT -public: - explicit IrisWidget(CharaMangerModel *model, QWidget *parent = nullptr); - ~IrisWidget(); - -private: - void initUI(); - void initConnect(); - -private Q_SLOTS: - void addIrisButton(const QString &newIrisName); - -Q_SIGNALS: - void requestAddIris(const QString &driverName, const int &charaType, const QString &charaName); - void requestDeleteIrisItem(const int &charaType, const QString &charaName); - void requestRenameIrisItem(const int &charaType, const QString &oldName, const QString &newName); - void noticeEnrollCompleted(const QString &driverName, const int &CharaType); - -public Q_SLOTS: - void onIrisListChanged(const QStringList &irislist); - -private: - CharaMangerModel *m_model; - DCC_NAMESPACE::SettingsGroup *m_listGrp; - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_clearBtn; - QVector m_vecItem; -}; diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.cpp b/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.cpp deleted file mode 100644 index 6468287ca0..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.cpp +++ /dev/null @@ -1,204 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "bluetoothadapter.h" -#include "bluetoothdbusproxy.h" - -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcBluetoothAdapter, "dcc-bluetooth-adapter") - -BluetoothAdapter::BluetoothAdapter(BluetoothDBusProxy *proxy, QObject *parent) - : QObject(parent) - , m_id("") - , m_name("") - , m_powered(false) - , m_discovering(false) - , m_discoverable(false) - , m_bluetoothDBusProxy(proxy) -{ -} - -void BluetoothAdapter::setName(const QString &name) -{ - if (name != m_name) { - m_name = name; - Q_EMIT nameChanged(name); - } -} - -void BluetoothAdapter::addDevice(const BluetoothDevice *device) -{ - if (!deviceById(device->id())) { - m_devicesId << device->id(); - m_devices[device->id()] = device; - //打印配对设备信息,方便查看设备显示顺序 - if (!device->name().isEmpty() && device->paired()) - qCDebug(DdcBluetoothAdapter) << "BluetoothAdapter add device " << device->name(); - Q_EMIT deviceAdded(device); - } -} - -void BluetoothAdapter::removeDevice(const QString &deviceId) -{ - const BluetoothDevice *device = nullptr; - - device = deviceById(deviceId); - if (device) { - m_devicesId.removeOne(deviceId); - m_devices.remove(deviceId); - Q_EMIT deviceRemoved(deviceId); - } -} - -void BluetoothAdapter::setPowered(bool powered, bool discovering) -{ - if (!powered) { - Q_EMIT closeDetailPage(); - } - if (powered != m_powered || (powered && m_powered && discovering != m_discovering)) { - m_powered = powered; - m_discovering = discovering; - Q_EMIT poweredChanged(powered, discovering); - } -} - -void BluetoothAdapter::setAdapterPowered(const bool &powered) -{ - // 关闭蓝牙之前删除历史蓝牙设备列表,确保完全是删除后再设置开关 - if (powered) { - m_bluetoothDBusProxy->SetAdapterPowered(QDBusObjectPath(id()), true, this, SLOT(onSetAdapterPowered()), SLOT(onSetAdapterPoweredError())); - } else { - m_bluetoothDBusProxy->ClearUnpairedDevice(this, SLOT(onClearUnpairedDevice())); - } -} - -void BluetoothAdapter::onClearUnpairedDevice() -{ - m_bluetoothDBusProxy->SetAdapterPowered(QDBusObjectPath(id()), false, this, SLOT(onSetAdapterPowered()), SLOT(onSetAdapterPoweredError())); -} - -void BluetoothAdapter::onSetAdapterPowered() -{ - Q_EMIT loadStatus(); -} - -void BluetoothAdapter::onSetAdapterPoweredError() -{ - Q_EMIT poweredChanged(powered(), discovering()); -} - -void BluetoothAdapter::setDiscoverabled(const bool discoverable) -{ - if (m_discoverable == discoverable) { - return; - } - m_discoverable = discoverable; - Q_EMIT discoverableChanged(discoverable); -} - -QMap BluetoothAdapter::devices() const -{ - return m_devices; -} - -QList BluetoothAdapter::devicesId() const -{ - return m_devicesId; -} - -const BluetoothDevice *BluetoothAdapter::deviceById(const QString &id) const -{ - return m_devices.keys().contains(id) ? m_devices[id] : nullptr; -} - -void BluetoothAdapter::setId(const QString &id) -{ - m_id = id; -} - -void BluetoothAdapter::inflate(const QJsonObject &obj) -{ - const QString path = obj["Path"].toString(); - const QString alias = obj["Alias"].toString(); - const bool powered = obj["Powered"].toBool(); - const bool discovering = obj["Discovering"].toBool(); - const bool discovered = obj["Discoverable"].toBool(); - - setDiscoverabled(discovered); - setId(path); - setName(alias); - setPowered(powered, discovering); - - QDBusObjectPath dPath(path); - m_bluetoothDBusProxy->GetDevices(dPath, this, SLOT(onGetDevices(QString))); -} - -void BluetoothAdapter::inflateDevice(BluetoothDevice *device, const QJsonObject &deviceObj) -{ - const QString id = deviceObj["Path"].toString(); - const QString addr = deviceObj["Address"].toString(); - const QString alias = deviceObj["Alias"].toString(); - const QString name = deviceObj["Name"].toString(); - const bool paired = deviceObj["Paired"].toBool(); - const BluetoothDevice::State state = BluetoothDevice::State(deviceObj["State"].toInt()); - const bool connectState = deviceObj["ConnectState"].toBool(); - const QString icon = deviceObj["Icon"].toString(); - const int battery = deviceObj["Battery"].toInt(); - - // if (icon == "audio-card") { - // m_connectingAudioDevice = (BluetoothDevice::StateAvailable == state); - // } - - // FIXME: If the name and alias of the Bluetooth device are both empty, it will not be updated by default. - // To solve the problem of blank device name display. - if (alias.isEmpty() && name.isEmpty()) - return; - - device->setId(id); - device->setAddress(addr); - device->setName(name); - device->setAlias(alias); - device->setPaired(paired); - device->setState(state, connectState); - device->setDeviceType(icon); - device->setBattery(battery); -} - -void BluetoothAdapter::onGetDevices(QString replyStr) -{ - QStringList tmpList; - QJsonDocument doc = QJsonDocument::fromJson(replyStr.toUtf8()); - QJsonArray arr = doc.array(); - for (QJsonValue val : arr) { - const QString id = val.toObject()["Path"].toString(); - const QString name = val.toObject()["Name"].toString(); - - const BluetoothDevice *result = deviceById(id); - BluetoothDevice *device = const_cast(result); - if (!device) { - device = new BluetoothDevice(this); - } else { - if (device->name() != name) - removeDevice(device->id()); - } - inflateDevice(device, val.toObject()); - addDevice(device); - - tmpList << id; - } - - for (const BluetoothDevice *device : devices()) { - if (!tmpList.contains(device->id())) { - removeDevice(device->id()); - - BluetoothDevice *target = const_cast(device); - if (target) - target->deleteLater(); - } - } -} diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.h b/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.h deleted file mode 100644 index 5f4b84ffe5..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothadapter.h +++ /dev/null @@ -1,74 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_BLUETOOTH_ADAPTER_H -#define DCC_BLUETOOTH_ADAPTER_H - -#include - -#include "bluetoothdevice.h" - -class QJsonObject; -class BluetoothDBusProxy; - -class BluetoothAdapter : public QObject -{ - Q_OBJECT -public: - explicit BluetoothAdapter(BluetoothDBusProxy *proxy, QObject *parent = 0); - - inline QString name() const { return m_name; } - void setName(const QString &name); - - inline QString id() const { return m_id; } - void setId(const QString &id); - - QMap devices() const; - QList devicesId() const; - const BluetoothDevice *deviceById(const QString &id) const; - - inline bool powered() const { return m_powered; } - void setPowered(bool powered, bool discovering); - void setAdapterPowered(const bool &powered); - - inline bool discoverabled() const { return m_discoverable; } - void setDiscoverabled(const bool discoverable); - - inline bool discovering() const { return m_discovering; } - - void inflate(const QJsonObject &obj); - void inflateDevice(BluetoothDevice *device, const QJsonObject &deviceObj); - -public Q_SLOTS: - void addDevice(const BluetoothDevice *device); - void removeDevice(const QString &deviceId); - - void onGetDevices(QString replyStr); - -Q_SIGNALS: - void nameChanged(const QString &name) const; - void deviceAdded(const BluetoothDevice *device) const; - void deviceRemoved(const QString &deviceId) const; - void poweredChanged(const bool &powered, const bool &discovering) const; - void loadStatus() const; - void discoverableChanged(const bool &discoverable) const; - void closeDetailPage() const; - -private Q_SLOTS: - void onClearUnpairedDevice(); - void onSetAdapterPowered(); - void onSetAdapterPoweredError(); - -private: - QString m_id; - QString m_name; - bool m_powered; - bool m_discovering; - bool m_discoverable; - QMap m_devices; - //按序存放设备id,确定设备显示顺序 - QList m_devicesId; - BluetoothDBusProxy *m_bluetoothDBusProxy; -}; - -#endif // DCC_BLUETOOTH_ADAPTER_H diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.cpp b/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.cpp deleted file mode 100644 index 6373574426..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.cpp +++ /dev/null @@ -1,156 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "bluetoothdbusproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include -#include - -const static QString BluetoothService = "org.deepin.dde.Bluetooth1"; -const static QString BluetoothPath = "/org/deepin/dde/Bluetooth1"; -const static QString BluetoothInterface = "org.deepin.dde.Bluetooth1"; - -const static QString AirPlaneModeService = "org.deepin.dde.AirplaneMode1"; -const static QString AirPlaneModePath = "/org/deepin/dde/AirplaneMode1"; -const static QString AirPlaneModeInterface = "org.deepin.dde.AirplaneMode1"; - -using namespace DCC_NAMESPACE; - -BluetoothDBusProxy::BluetoothDBusProxy(QObject *parent) - : QObject(parent) - , m_bluetoothInter(new DDBusInterface(BluetoothService, BluetoothPath, BluetoothInterface, QDBusConnection::sessionBus(), this)) - , m_airPlaneModeInter(new DDBusInterface(AirPlaneModeService, AirPlaneModePath, AirPlaneModeInterface, QDBusConnection::systemBus(), this)) -{ -} - -void BluetoothDBusProxy::showBluetoothTransDialog(const QString &address, const QStringList &files) -{ - QDBusMessage message = QDBusMessage::createMethodCall("com.deepin.filemanager.filedialog", "/com/deepin/filemanager/filedialogmanager", "com.deepin.filemanager.filedialogmanager", "showBluetoothTransDialog"); - message << address << files; - QDBusConnection::sessionBus().asyncCall(message); -} - -bool BluetoothDBusProxy::bluetoothIsValid() -{ - return m_bluetoothInter->isValid(); -} -// Bluetooth PROPERTY -uint BluetoothDBusProxy::state() -{ - return qvariant_cast(m_bluetoothInter->property("State")); -} - -bool BluetoothDBusProxy::transportable() -{ - return qvariant_cast(m_bluetoothInter->property("Transportable")); -} - -bool BluetoothDBusProxy::canSendFile() -{ - return qvariant_cast(m_bluetoothInter->property("CanSendFile")); -} - -bool BluetoothDBusProxy::displaySwitch() -{ - return qvariant_cast(m_bluetoothInter->property("DisplaySwitch")); -} - -void BluetoothDBusProxy::setDisplaySwitch(bool value) -{ - m_bluetoothInter->setProperty("DisplaySwitch", QVariant::fromValue(value)); -} -// AirplaneMode PROPERTY -bool BluetoothDBusProxy::enabled() -{ - return qvariant_cast(m_airPlaneModeInter->property("Enabled")); -} - -void BluetoothDBusProxy::ClearUnpairedDevice() -{ - m_bluetoothInter->asyncCall(QStringLiteral("ClearUnpairedDevice")); -} - -void BluetoothDBusProxy::ClearUnpairedDevice(QObject *receiver, const char *member) -{ - QList argumentList; - m_bluetoothInter->callWithCallback(QStringLiteral("ClearUnpairedDevice"), argumentList, receiver, member); -} - -void BluetoothDBusProxy::SetAdapterPowered(const QDBusObjectPath &adapter, bool powered) -{ - m_bluetoothInter->asyncCall(QStringLiteral("SetAdapterPowered"), QVariant::fromValue(adapter), QVariant::fromValue(powered)); -} - -void BluetoothDBusProxy::SetAdapterPowered(const QDBusObjectPath &adapter, bool powered, QObject *receiver, const char *member, const char *errorSlot) -{ - QList argumentList; - argumentList << QVariant::fromValue(adapter); - argumentList << QVariant::fromValue(powered); - m_bluetoothInter->callWithCallback(QStringLiteral("SetAdapterPowered"), argumentList, receiver, member, errorSlot); -} - -void BluetoothDBusProxy::DisconnectDevice(const QDBusObjectPath &device) -{ - m_bluetoothInter->asyncCall(QStringLiteral("DisconnectDevice"), QVariant::fromValue(device)); -} - -void BluetoothDBusProxy::RemoveDevice(const QDBusObjectPath &adapter, const QDBusObjectPath &device) -{ - m_bluetoothInter->asyncCall(QStringLiteral("RemoveDevice"), QVariant::fromValue(adapter), QVariant::fromValue(device)); -} - -void BluetoothDBusProxy::ConnectDevice(const QDBusObjectPath &device, const QDBusObjectPath &adapter) -{ - m_bluetoothInter->asyncCall(QStringLiteral("ConnectDevice"), QVariant::fromValue(device), QVariant::fromValue(adapter)); -} - -QString BluetoothDBusProxy::GetDevices(const QDBusObjectPath &adapter) -{ - return QDBusPendingReply(m_bluetoothInter->asyncCall(QStringLiteral("GetDevices"), QVariant::fromValue(adapter))); -} - -void BluetoothDBusProxy::GetDevices(const QDBusObjectPath &adapter, QObject *receiver, const char *member) -{ - QList argumentList; - argumentList << QVariant::fromValue(adapter); - m_bluetoothInter->callWithCallback(QStringLiteral("GetDevices"), argumentList, receiver, member); -} - -QString BluetoothDBusProxy::GetAdapters() -{ - return QDBusPendingReply(m_bluetoothInter->asyncCall(QStringLiteral("GetAdapters"))); -} - -void BluetoothDBusProxy::SetAdapterAlias(const QDBusObjectPath &adapter, const QString &alias) -{ - m_bluetoothInter->asyncCall(QStringLiteral("SetAdapterAlias"), QVariant::fromValue(adapter), QVariant::fromValue(alias)); -} - -void BluetoothDBusProxy::SetDeviceAlias(const QDBusObjectPath &device, const QString &alias) -{ - m_bluetoothInter->asyncCall(QStringLiteral("SetDeviceAlias"), QVariant::fromValue(device), QVariant::fromValue(alias)); -} - -void BluetoothDBusProxy::RequestDiscovery(const QDBusObjectPath &adapter) -{ - m_bluetoothInter->asyncCall(QStringLiteral("RequestDiscovery"), QVariant::fromValue(adapter)); -} - -void BluetoothDBusProxy::Confirm(const QDBusObjectPath &device, bool accept) -{ - m_bluetoothInter->asyncCall(QStringLiteral("Confirm"), QVariant::fromValue(device), QVariant::fromValue(accept)); -} - -void BluetoothDBusProxy::SetAdapterDiscovering(const QDBusObjectPath &adapter, bool discovering) -{ - m_bluetoothInter->asyncCall(QStringLiteral("SetAdapterDiscovering"), QVariant::fromValue(adapter), QVariant::fromValue(discovering)); -} - -void BluetoothDBusProxy::SetAdapterDiscoverable(const QDBusObjectPath &adapter, bool discoverable) -{ - m_bluetoothInter->asyncCall(QStringLiteral("SetAdapterDiscoverable"), QVariant::fromValue(adapter), QVariant::fromValue(discoverable)); -} diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.h b/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.h deleted file mode 100644 index fbee5c8ce0..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothdbusproxy.h +++ /dev/null @@ -1,89 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef BLUETOOTHDBUSPROXY_H -#define BLUETOOTHDBUSPROXY_H - -#include "interface/namespace.h" - -#include -#include -class QDBusInterface; -class QDBusMessage; -class QDBusObjectPath; - -using Dtk::Core::DDBusInterface; - -class BluetoothDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit BluetoothDBusProxy(QObject *parent = nullptr); - - void showBluetoothTransDialog(const QString &address, const QStringList &files); - // Bluetooth - bool bluetoothIsValid(); - Q_PROPERTY(uint State READ state NOTIFY StateChanged) - uint state(); - Q_PROPERTY(bool Transportable READ transportable NOTIFY TransportableChanged) - bool transportable(); - Q_PROPERTY(bool CanSendFile READ canSendFile NOTIFY CanSendFileChanged) - bool canSendFile(); - Q_PROPERTY(bool DisplaySwitch READ displaySwitch WRITE setDisplaySwitch NOTIFY DisplaySwitchChanged) - bool displaySwitch(); - void setDisplaySwitch(bool value); - // AirplaneMode - Q_PROPERTY(bool Enabled READ enabled NOTIFY EnabledChanged) - bool enabled(); - -Q_SIGNALS: // SIGNALS - // Bluetooth - void AdapterAdded(const QString &adapterJSON); - void AdapterRemoved(const QString &adapterJSON); - void AdapterPropertiesChanged(const QString &adapterJSON); - void DeviceAdded(const QString &devJSON); - void DeviceRemoved(const QString &devJSON); - void DevicePropertiesChanged(const QString &devJSON); - void Cancelled(const QDBusObjectPath &device); - void RequestAuthorization(const QDBusObjectPath &device); - void RequestConfirmation(const QDBusObjectPath &device, const QString &passkey); - void RequestPasskey(const QDBusObjectPath &device); - void RequestPinCode(const QDBusObjectPath &device); - void DisplayPasskey(const QDBusObjectPath &device, uint passkey, uint entered); - void DisplayPinCode(const QDBusObjectPath &device, const QString &pinCode); - // property changed signals - void StateChanged(uint value) const; - void TransportableChanged(bool value) const; - void CanSendFileChanged(bool value) const; - void DisplaySwitchChanged(bool value) const; - - // AirplaneMode - // property changed signals - void EnabledChanged(bool value) const; - -public Q_SLOTS: // METHODS - // Bluetooth - void ClearUnpairedDevice(); - void ClearUnpairedDevice(QObject *receiver, const char *member); - void SetAdapterPowered(const QDBusObjectPath &adapter, bool powered); - void SetAdapterPowered(const QDBusObjectPath &adapter, bool powered, QObject *receiver, const char *member, const char *errorSlot); - void DisconnectDevice(const QDBusObjectPath &device); - void RemoveDevice(const QDBusObjectPath &adapter, const QDBusObjectPath &device); - void ConnectDevice(const QDBusObjectPath &device, const QDBusObjectPath &adapter); - QString GetDevices(const QDBusObjectPath &adapter); - void GetDevices(const QDBusObjectPath &adapter, QObject *receiver, const char *member); - QString GetAdapters(); - void SetAdapterAlias(const QDBusObjectPath &adapter, const QString &alias); - void SetDeviceAlias(const QDBusObjectPath &device, const QString &alias); - void RequestDiscovery(const QDBusObjectPath &adapter); - void Confirm(const QDBusObjectPath &device, bool accept); - void SetAdapterDiscovering(const QDBusObjectPath &adapter, bool discovering); - void SetAdapterDiscoverable(const QDBusObjectPath &adapter, bool discoverable); - -private: - DDBusInterface *m_bluetoothInter; - DDBusInterface *m_airPlaneModeInter; -}; - -#endif // BLUETOOTHDBUSPROXY_H diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.cpp b/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.cpp deleted file mode 100644 index 3560e2b2f0..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.cpp +++ /dev/null @@ -1,104 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "bluetoothdevice.h" - -BluetoothDevice::BluetoothDevice(QObject *parent) - : QObject(parent) - , m_id("") - , m_name("") - , m_paired(false) - , m_trusted(false) - , m_connecting(false) - , m_connectState(false) - , m_state(StateUnavailable) -{ -} - -void BluetoothDevice::setId(const QString &id) -{ - m_id = id; -} - -void BluetoothDevice::setAddress(const QString &addr) -{ - m_address = addr; -} - -void BluetoothDevice::setName(const QString &name) -{ - if (name != m_name) { - m_name = name; - Q_EMIT nameChanged(name); - } -} - -void BluetoothDevice::setAlias(const QString &alias) -{ - if (alias != m_alias) { - m_alias = alias; - Q_EMIT aliasChanged(alias); - } -} - -void BluetoothDevice::setPaired(bool paired) -{ - if (paired != m_paired) { - m_paired = paired; - Q_EMIT pairedChanged(paired); - } -} - -void BluetoothDevice::setState(const State &state, bool connectState) -{ - if ((state != m_state) || (connectState != m_connectState)) { - m_state = state; - m_connectState = connectState; - Q_EMIT stateChanged(state, connectState); - } -} - -void BluetoothDevice::setTrusted(bool trusted) -{ - if (trusted != m_trusted) { - m_trusted = trusted; - Q_EMIT trustedChanged(trusted); - } -} - -void BluetoothDevice::setConnecting(bool connecting) -{ - if (connecting != m_connecting) { - m_connecting = connecting; - Q_EMIT connectingChanged(connecting); - } -} - -void BluetoothDevice::setBattery(int battery) { - if (m_battery != battery) { - m_battery = battery; - Q_EMIT batteryChanged(battery); - } -} - -void BluetoothDevice::setDeviceType(const QString &deviceType) -{ - m_deviceType = deviceType; -} - -bool BluetoothDevice::canSendFile() const -{ - // 目前pc和手机可以发送蓝牙文件 - if ((m_deviceType == "pc") || (m_deviceType == "phone")) { - return true; - } - return false; -} - -QDebug &operator<<(QDebug &stream, const BluetoothDevice *device) -{ - stream << "BluetoothDevice name:" << device->name() << " paired:" << device->paired() - << " state:" << device->state(); - - return stream; -} diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.h b/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.h deleted file mode 100644 index 27e9dbcbbc..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothdevice.h +++ /dev/null @@ -1,98 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_BLUETOOTH_DEVICE_H -#define DCC_BLUETOOTH_DEVICE_H - -#include -#include - -// INFO: when meet problem, view the link underline -// https://github.com/bluez/bluez/blob/master/src/dbus-common.c#L53-L115 - -class BluetoothDevice : public QObject -{ - Q_OBJECT - -public: - enum State { - StateUnavailable = 0, - StateAvailable = 1, - StateConnected = 2, - StateDisconnecting = 3 - }; - Q_ENUM(State) - -public: - explicit BluetoothDevice(QObject *parent = nullptr); - - inline QString id() const { return m_id; } - - void setId(const QString &id); - - inline int battery() const { return m_battery; } - - void setBattery(const int battery); - - inline QString address() const { return m_address; } - - void setAddress(const QString &addr); - - inline QString name() const { return m_name; } - - void setName(const QString &name); - - inline QString alias() const { return m_alias; } - - void setAlias(const QString &alias); - - inline bool paired() const { return m_paired; } - - void setPaired(bool paired); - - inline State state() const { return m_state; } - - void setState(const State &state, bool connectState); - - inline bool trusted() const { return m_trusted; } - - void setTrusted(bool trusted); - - inline bool connecting() const { return m_connecting; } - - void setConnecting(bool connecting); - - inline QString deviceType() const { return m_deviceType; } - - void setDeviceType(const QString &deviceType); - - inline bool connectState() const { return m_connectState; } - - bool canSendFile() const; - -Q_SIGNALS: - void nameChanged(const QString &name) const; - void aliasChanged(const QString &alias) const; - void pairedChanged(const bool &paired) const; - void stateChanged(const State &state, bool paired) const; - void trustedChanged(const bool trusted) const; - void connectingChanged(const bool &connecting) const; - void batteryChanged(const int battery) const; - -private: - QString m_id; - QString m_address; - QString m_name; - QString m_alias; - QString m_deviceType; - bool m_paired; - bool m_trusted; - bool m_connecting; - bool m_connectState; - State m_state; - int m_battery = 0; -}; - -QDebug &operator<<(QDebug &stream, const BluetoothDevice *device); - -#endif // DCC_BLUETOOTH_DEVICE_H diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.cpp b/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.cpp deleted file mode 100644 index 6202bc4d88..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.cpp +++ /dev/null @@ -1,126 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "bluetoothmodel.h" - -BluetoothModel::BluetoothModel(QObject *parent) - : QObject(parent) - , m_transPortable(false) - , m_canSendFile(false) - , m_airplaneEnable(false) - , m_displaySwitch(false) -{ - m_adapters.clear(); -} - -void BluetoothModel::addAdapter(BluetoothAdapter *adapter) -{ - if (!adapterById(adapter->id())) { - m_adapters[adapter->id()] = adapter; - m_adapterIds << adapter->id(); - Q_EMIT adapterAdded(adapter); - Q_EMIT adpaterListChanged(); - return; - } - - adapter->deleteLater(); -} - -const BluetoothAdapter *BluetoothModel::removeAdapater(const QString &adapterId) -{ - const BluetoothAdapter *adapter = nullptr; - - adapter = adapterById(adapterId); - if (adapter) { - m_adapters.remove(adapterId); - m_adapterIds.removeOne(adapterId); - Q_EMIT adapterRemoved(adapter); - Q_EMIT adpaterListChanged(); - } - - return adapter; -} - -QList BluetoothModel::adapters() const -{ - QList allAdapters = m_adapters.values(); - std::sort(allAdapters.begin(), allAdapters.end(), [ & ](const BluetoothAdapter *adapter1, const BluetoothAdapter *adapter2) { - return m_adapterIds.indexOf(adapter1->id()) < m_adapterIds.indexOf(adapter2->id()); - }); - - return allAdapters; -} - -const BluetoothAdapter *BluetoothModel::adapterById(const QString &id) -{ - return m_adapters.keys().contains(id) ? m_adapters[id] : nullptr; -} - -/** - * @brief BluetoothModel::canTransportable - * @return - * 返回值表示是否能传输蓝牙文件 - */ -bool BluetoothModel::canTransportable() const -{ - return m_transPortable; -} - -void BluetoothModel::setMyDeviceVisible(const bool visible) -{ - if (m_myDeviceVisible == visible) - return; - - m_myDeviceVisible = visible; - Q_EMIT notifyMyDeviceVisibleChanged(m_myDeviceVisible); -} - -void BluetoothModel::setOtherDeviceVisible(const bool visible) -{ - if (m_otherDeviceVisible == visible) - return; - - m_otherDeviceVisible = visible; - Q_EMIT notifyOtherDeviceVisibleChanged(m_otherDeviceVisible); -} - -/** - * @brief BluetoothModel::setTransportable - * @param transPortable - * 设置是否能传输蓝牙文件 - */ -void BluetoothModel::setTransportable(const bool transPortable) -{ - if (m_transPortable != transPortable) { - m_transPortable = transPortable; - Q_EMIT transportableChanged(transPortable); - } -} - -void BluetoothModel::setCanSendFile(const bool canSendFile) -{ - if (m_canSendFile != canSendFile) { - m_canSendFile = canSendFile; - Q_EMIT canSendFileChanged(canSendFile); - } -} - -void BluetoothModel::setAirplaneEnable(bool enable) -{ - if (m_airplaneEnable == enable) - return; - - m_airplaneEnable = enable; - - Q_EMIT airplaneEnableChanged(m_airplaneEnable); -} - -void BluetoothModel::setDisplaySwitch(bool on) -{ - if (m_displaySwitch == on) - return; - - m_displaySwitch = on; - - Q_EMIT displaySwitchChanged(m_displaySwitch); -} diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.h b/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.h deleted file mode 100644 index b41f0507c4..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothmodel.h +++ /dev/null @@ -1,63 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_BLUETOOTH_BLUETOOTHMODEL_H -#define DCC_BLUETOOTH_BLUETOOTHMODEL_H - -#include - -#include "bluetoothadapter.h" - -class BluetoothModel : public QObject -{ - Q_OBJECT -public: - explicit BluetoothModel(QObject *parent = nullptr); - - QList adapters() const; - const BluetoothAdapter *adapterById(const QString &id); - - bool canTransportable() const; - inline bool canSendFile() const { return m_canSendFile; } - - inline bool airplaneMode() const { return m_airplaneEnable; } - inline bool displaySwitch() const { return m_displaySwitch; } - - bool myDeviceVisible() { return m_myDeviceVisible; } - void setMyDeviceVisible(const bool visible); - - bool otherDeviceVisible() { return m_otherDeviceVisible; } - void setOtherDeviceVisible(const bool visible); - -public Q_SLOTS: - void addAdapter(BluetoothAdapter *adapter); - const BluetoothAdapter *removeAdapater(const QString &adapterId); - void setTransportable(const bool transPortable); - void setCanSendFile(const bool canSendFile); - void setAirplaneEnable(bool enable); - void setDisplaySwitch(bool on); - -Q_SIGNALS: - void adapterAdded(const BluetoothAdapter *adapter) const; - void adapterRemoved(const BluetoothAdapter *adapter) const; - void adpaterListChanged(); - void transportableChanged(const bool transPortable) const; - void canSendFileChanged(const bool canSendFile) const; - void airplaneEnableChanged(bool enable) const; - void displaySwitchChanged(bool on) const; - void notifyMyDeviceVisibleChanged(bool); - void notifyOtherDeviceVisibleChanged(bool); - -private: - QMap m_adapters; - QStringList m_adapterIds; - bool m_transPortable; - bool m_canSendFile; - bool m_airplaneEnable; - bool m_displaySwitch; - friend class BluetoothWorker; - bool m_myDeviceVisible = false; - bool m_otherDeviceVisible = false; -}; - -#endif // DCC_BLUETOOTH_BLUETOOTHMODEL_H diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.cpp b/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.cpp deleted file mode 100644 index 45f22ab2e4..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.cpp +++ /dev/null @@ -1,330 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "bluetoothworker.h" - -#include "bluetoothdbusproxy.h" - -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcBluetoothWorkder, "dcc-bluetooth-worker") - -BluetoothWorker::BluetoothWorker(BluetoothModel *model, QObject *parent) - : QObject(parent) - , m_bluetoothDBusProxy(new BluetoothDBusProxy(this)) - , m_model(model) - , m_connectingAudioDevice(false) - , m_state(m_bluetoothDBusProxy->state()) -{ - // clang-format off - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::StateChanged, this, &BluetoothWorker::onStateChanged); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::AdapterAdded, this, &BluetoothWorker::addAdapter); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::AdapterRemoved, this, &BluetoothWorker::removeAdapter); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::AdapterPropertiesChanged, this, &BluetoothWorker::onAdapterPropertiesChanged); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DeviceAdded, this, &BluetoothWorker::addDevice); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DeviceRemoved, this, &BluetoothWorker::removeDevice); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DevicePropertiesChanged, this, &BluetoothWorker::onDevicePropertiesChanged); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::Cancelled, this, [=](const QDBusObjectPath &device) { - PinCodeDialog *dialog = m_dialogs[device]; - if (dialog != nullptr) { - m_dialogs.remove(device); - QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection); - } else { - Q_EMIT pinCodeCancel(device); - } - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::RequestAuthorization, this, [](const QDBusObjectPath &in0) { - qCDebug(DdcBluetoothWorkder) << "request authorization: " << in0.path(); - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::RequestConfirmation, this, &BluetoothWorker::requestConfirmation); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::RequestPasskey, this, [](const QDBusObjectPath &in0) { - qCDebug(DdcBluetoothWorkder) << "request passkey: " << in0.path(); - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::RequestPinCode, this, [](const QDBusObjectPath &in0) { - qCDebug(DdcBluetoothWorkder) << "request pincode: " << in0.path(); - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DisplayPasskey, this, [=](const QDBusObjectPath &in0, uint in1, uint in2) { - qCDebug(DdcBluetoothWorkder) << "request display passkey: " << in0.path() << in1 << in2; - - PinCodeDialog *dialog = PinCodeDialog::instance(QString::number(in1), false); - m_dialogs[in0] = dialog; - if (!dialog->isVisible()) { - dialog->exec(); - QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection); - } - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DisplayPinCode, this, [=](const QDBusObjectPath &in0, const QString &in1) { - qCDebug(DdcBluetoothWorkder) << "request display pincode: " << in0.path() << in1; - - PinCodeDialog *dialog = PinCodeDialog::instance(in1, false); - m_dialogs[in0] = dialog; - if (!dialog->isVisible()) { - dialog->exec(); - QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection); - } - }); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::TransportableChanged, m_model, &BluetoothModel::setTransportable); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::CanSendFileChanged, m_model, &BluetoothModel::setCanSendFile); - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::DisplaySwitchChanged, m_model, &BluetoothModel::setDisplaySwitch); - - m_model->setTransportable(m_bluetoothDBusProxy->transportable()); - m_model->setCanSendFile(m_bluetoothDBusProxy->canSendFile()); - m_model->setDisplaySwitch(m_bluetoothDBusProxy->displaySwitch()); - - connect(m_bluetoothDBusProxy, &BluetoothDBusProxy::EnabledChanged, m_model, &BluetoothModel::setAirplaneEnable); - m_model->setAirplaneEnable(m_bluetoothDBusProxy->enabled()); - - //第一次调用时传true,refresh 函数会使用同步方式去获取蓝牙设备数据 - //避免出现当dbus调用控制中心接口直接显示蓝牙模块时, - //因为异步的数据获取使控制中心设置了蓝牙模块不可见, - //而出现没办法显示蓝牙模块 - refresh(true); - // clang-format on -} - -BluetoothWorker::~BluetoothWorker() { } - -void BluetoothWorker::onStateChanged(uint state) -{ - // 当蓝牙状态由0变成大于0时,强制刷新蓝牙列表 - if (!m_state && state > 0) - refresh(true); - - m_state = state; -} - -void BluetoothWorker::activate() -{ - if (!m_bluetoothDBusProxy->bluetoothIsValid()) { - return; - } - - blockDBusSignals(false); - m_bluetoothDBusProxy->ClearUnpairedDevice(); - - refresh(); -} - -void BluetoothWorker::deactivate() -{ - blockDBusSignals(true); -} - -void BluetoothWorker::blockDBusSignals(bool block) -{ - if (!m_bluetoothDBusProxy->bluetoothIsValid()) { - return; - } - - m_bluetoothDBusProxy->blockSignals(block); -} - -void BluetoothWorker::setAdapterPowered(const BluetoothAdapter *adapter, const bool &powered) -{ - const_cast(adapter)->setAdapterPowered(powered); -} - -void BluetoothWorker::disconnectDevice(const BluetoothDevice *device) -{ - QDBusObjectPath path(device->id()); - m_bluetoothDBusProxy->DisconnectDevice(path); - qCDebug(DdcBluetoothWorkder) << "disconnect from device: " << device->name(); -} - -void BluetoothWorker::ignoreDevice(const BluetoothAdapter *adapter, const BluetoothDevice *device) -{ - m_bluetoothDBusProxy->RemoveDevice(QDBusObjectPath(adapter->id()), - QDBusObjectPath(device->id())); - qCDebug(DdcBluetoothWorkder) << "ignore device: " << device->name(); -} - -void BluetoothWorker::connectDevice(const BluetoothDevice *device, const BluetoothAdapter *adapter) -{ - // INFO: when is headset, not connect twice - if (device - && (device->deviceType() == "audio-headset" || device->deviceType() == "autio-headphones") - && device->state() == BluetoothDevice::StateAvailable) { - return; - } - for (const BluetoothAdapter *a : m_model->adapters()) { - for (const BluetoothDevice *d : a->devices()) { - BluetoothDevice *vd = const_cast(d); - if (vd) - vd->setConnecting(d == device); - } - } - - QDBusObjectPath path(device->id()); - m_bluetoothDBusProxy->ConnectDevice(path, QDBusObjectPath(adapter->id())); - qCDebug(DdcBluetoothWorkder) << "connect to device: " << device->name(); -} - -void BluetoothWorker::onAdapterPropertiesChanged(const QString &json) -{ - const QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - const QJsonObject obj = doc.object(); - const QString id = obj["Path"].toString(); - - BluetoothAdapter *adapter = const_cast(m_model->adapterById(id)); - if (adapter) - adapter->inflate(obj); -} - -void BluetoothWorker::onDevicePropertiesChanged(const QString &json) -{ - const QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - const QJsonObject obj = doc.object(); - const QString id = obj["Path"].toString(); - const QString name = obj["Name"].toString(); - for (const BluetoothAdapter *adapter : m_model->adapters()) { - BluetoothAdapter *adapterPointer = const_cast(adapter); - BluetoothDevice *device = const_cast(adapter->deviceById(id)); - if (device) { - if (device->name() == name) { - adapterPointer->inflateDevice(device, obj); - } else { - if (!adapterPointer) - return; - adapterPointer->removeDevice(device->id()); - adapterPointer->inflateDevice(device, obj); - adapterPointer->addDevice(device); - } - } - } -} - -void BluetoothWorker::addAdapter(const QString &json) -{ - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - QJsonObject obj = doc.object(); - - BluetoothAdapter *adapter = new BluetoothAdapter(m_bluetoothDBusProxy, m_model); - adapter->inflate(obj); - m_model->addAdapter(adapter); -} - -void BluetoothWorker::removeAdapter(const QString &json) -{ - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - QJsonObject obj = doc.object(); - const QString id = obj["Path"].toString(); - - const BluetoothAdapter *result = m_model->removeAdapater(id); - BluetoothAdapter *adapter = const_cast(result); - if (adapter) { - adapter->deleteLater(); - adapter = nullptr; - } -} - -void BluetoothWorker::addDevice(const QString &json) -{ - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - QJsonObject obj = doc.object(); - const QString adapterId = obj["AdapterPath"].toString(); - const QString id = obj["Path"].toString(); - const int battery = obj["Battery"].toInt(); - - const BluetoothAdapter *result = m_model->adapterById(adapterId); - BluetoothAdapter *adapter = const_cast(result); - if (adapter) { - const BluetoothDevice *result1 = adapter->deviceById(id); - BluetoothDevice *device = const_cast(result1); - if (!device) - device = new BluetoothDevice(adapter); - device->setBattery(battery); - adapter->inflateDevice(device, obj); - adapter->addDevice(device); - } -} - -void BluetoothWorker::removeDevice(const QString &json) -{ - QJsonDocument doc = QJsonDocument::fromJson(json.toUtf8()); - QJsonObject obj = doc.object(); - const QString adapterId = obj["AdapterPath"].toString(); - const QString id = obj["Path"].toString(); - - const BluetoothAdapter *result = m_model->adapterById(adapterId); - BluetoothAdapter *adapter = const_cast(result); - if (adapter) { - adapter->removeDevice(id); - } -} - -void BluetoothWorker::refresh(bool beFirst) -{ - Q_UNUSED(beFirst) - if (!m_bluetoothDBusProxy->bluetoothIsValid()) - return; - - const QString replyStr = m_bluetoothDBusProxy->GetAdapters(); - QJsonDocument doc = QJsonDocument::fromJson(replyStr.toUtf8()); - QJsonArray arr = doc.array(); - for (QJsonValue val : arr) { - BluetoothAdapter *adapter = new BluetoothAdapter(m_bluetoothDBusProxy, m_model); - adapter->inflate(val.toObject()); - - m_model->addAdapter(adapter); - } -} - -void BluetoothWorker::setAlias(const BluetoothAdapter *adapter, const QString &alias) -{ - m_bluetoothDBusProxy->SetAdapterAlias(QDBusObjectPath(adapter->id()), alias); -} - -void BluetoothWorker::setDeviceAlias(const BluetoothDevice *device, const QString &alias) -{ - QDBusObjectPath path(device->id()); - m_bluetoothDBusProxy->SetDeviceAlias(QDBusObjectPath(device->id()), alias); -} - -void BluetoothWorker::setAdapterDiscoverable(const QString &path) -{ - m_bluetoothDBusProxy->RequestDiscovery(QDBusObjectPath(path)); -} - -void BluetoothWorker::pinCodeConfirm(const QDBusObjectPath &path, bool value) -{ - m_bluetoothDBusProxy->Confirm(path, value); -} - -void BluetoothWorker::setAdapterDiscovering(const QDBusObjectPath &path, bool enable) -{ - m_bluetoothDBusProxy->SetAdapterDiscovering(path, enable); -} - -void BluetoothWorker::onRequestSetDiscoverable(const BluetoothAdapter *adapter, - const bool &discoverable) -{ - QDBusObjectPath path(adapter->id()); - m_bluetoothDBusProxy->SetAdapterDiscoverable(path, discoverable); -} - -bool BluetoothWorker::displaySwitch() -{ - return m_bluetoothDBusProxy->property("DisplaySwitch").toBool(); -} - -void BluetoothWorker::setDisplaySwitch(const bool &on) -{ - m_bluetoothDBusProxy->setDisplaySwitch(on); -} - -void BluetoothWorker::showBluetoothTransDialog(const QString &address, const QStringList &files) -{ - m_bluetoothDBusProxy->showBluetoothTransDialog(address, files); -} diff --git a/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.h b/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.h deleted file mode 100644 index f8145c5540..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/bluetoothworker.h +++ /dev/null @@ -1,73 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_BLUETOOTH_BLUETOOTHWORKER_H -#define DCC_BLUETOOTH_BLUETOOTHWORKER_H - -#include - -#include "bluetoothmodel.h" -#include "pincodedialog.h" - -class QDBusObjectPath; -class BluetoothDBusProxy; - -class BluetoothWorker : public QObject -{ - Q_OBJECT -public: - explicit BluetoothWorker(BluetoothModel *model, QObject *parent = nullptr); - - BluetoothModel *model() { return m_model; } - - void activate(); - void deactivate(); - - void blockDBusSignals(bool block); - - bool displaySwitch(); - -Q_SIGNALS: - void requestConfirmation(const QDBusObjectPath &path, const QString &code); - void pinCodeCancel(const QDBusObjectPath &device); - -public Q_SLOTS: - void setAdapterPowered(const BluetoothAdapter *adapter, const bool &powered); - void connectDevice(const BluetoothDevice *device, const BluetoothAdapter *adapter); - void disconnectDevice(const BluetoothDevice *device); - void ignoreDevice(const BluetoothAdapter *adapter, const BluetoothDevice *device); - void setAlias(const BluetoothAdapter *adapter, const QString &alias); - void setDeviceAlias(const BluetoothDevice *device, const QString &alias); - void setAdapterDiscoverable(const QString &path); - void pinCodeConfirm(const QDBusObjectPath &path, bool value); - void setAdapterDiscovering(const QDBusObjectPath &path, bool enable); - void onRequestSetDiscoverable(const BluetoothAdapter *adapter, const bool &discoverable); - void setDisplaySwitch(const bool &on); - void showBluetoothTransDialog(const QString &address, const QStringList &files); - -private Q_SLOTS: - void onAdapterPropertiesChanged(const QString &json); - void onDevicePropertiesChanged(const QString &json); - - void addAdapter(const QString &json); - void removeAdapter(const QString &json); - - void addDevice(const QString &json); - void removeDevice(const QString &json); - - void refresh(bool beFirst = false); - void onStateChanged(uint state); - -private: - BluetoothWorker(BluetoothWorker const &) = delete; - BluetoothWorker &operator=(BluetoothWorker const &) = delete; - ~BluetoothWorker(); - - BluetoothDBusProxy *m_bluetoothDBusProxy; - BluetoothModel *m_model; - QMap m_dialogs; - bool m_connectingAudioDevice; - uint m_state; -}; - -#endif // DCC_BLUETOOTH_BLUETOOTHWORKER_H diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_battery_32px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_battery_32px.svg deleted file mode 100644 index dd05a2a45b..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_battery_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_general_purpose_32px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_general_purpose_32px.svg deleted file mode 100644 index c7fa0e51d1..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_general_purpose_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_using_electric_32px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_using_electric_32px.svg deleted file mode 100644 index 5c91cbb11e..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/actions/dcc_using_electric_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/bluetooth.qrc b/dcc-old/src/plugin-bluetooth/operation/qrc/bluetooth.qrc deleted file mode 100644 index e710b309dd..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/bluetooth.qrc +++ /dev/null @@ -1,53 +0,0 @@ - - - icons/dcc_nav_bluetooth_42px.svg - icons/dcc_nav_bluetooth_84px.svg - texts/bluetooth_other_16px.svg - texts/dcc_edit_12px.svg - texts/dcc_refresh_12px.svg - dark/icons/battery-000-symbolic_20px.svg - dark/icons/battery-010-symbolic_20px.svg - dark/icons/battery-020-symbolic_20px.svg - dark/icons/battery-030-symbolic_20px.svg - dark/icons/battery-040-symbolic_20px.svg - dark/icons/battery-050-symbolic_20px.svg - dark/icons/battery-060-symbolic_20px.svg - dark/icons/battery-070-symbolic_20px.svg - dark/icons/battery-080-symbolic_20px.svg - dark/icons/battery-090-symbolic_20px.svg - dark/icons/battery-100-symbolic_20px.svg - dark/icons/battery-unknow-symbolic_20px.svg - light/icons/battery-000-symbolic_20px.svg - light/icons/battery-010-symbolic_20px.svg - light/icons/battery-020-symbolic_20px.svg - light/icons/battery-030-symbolic_20px.svg - light/icons/battery-040-symbolic_20px.svg - light/icons/battery-050-symbolic_20px.svg - light/icons/battery-060-symbolic_20px.svg - light/icons/battery-070-symbolic_20px.svg - light/icons/battery-080-symbolic_20px.svg - light/icons/battery-090-symbolic_20px.svg - light/icons/battery-100-symbolic_20px.svg - light/icons/battery-unknow-symbolic_20px.svg - texts/bluetooth_camera_16px.svg - texts/bluetooth_clang_16px.svg - texts/bluetooth_keyboard_16px.svg - texts/bluetooth_lan_16px.svg - texts/bluetooth_laptop_16px.svg - texts/bluetooth_microphone_16px.svg - texts/bluetooth_mouse_16px.svg - texts/bluetooth_other_16px.svg - texts/bluetooth_pad_16px.svg - texts/bluetooth_pc_16px.svg - texts/bluetooth_pen_16px.svg - texts/bluetooth_pheadset_16px.svg - texts/bluetooth_phone_16px.svg - texts/bluetooth_print_16px.svg - texts/bluetooth_scaner_16px.svg - texts/bluetooth_touchpad_16px.svg - texts/bluetooth_tv_16px.svg - texts/bluetooth_video_16px.svg - texts/bluetooth_vidicon_16px.svg - texts/dcc_edit_12px.svg - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-000-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-000-symbolic_20px.svg deleted file mode 100644 index 5e86fa7eed..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-000-symbolic_20px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-010-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-010-symbolic_20px.svg deleted file mode 100644 index e56e848da4..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-010-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-020-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-020-symbolic_20px.svg deleted file mode 100644 index 212281ebb2..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-020-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-030-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-030-symbolic_20px.svg deleted file mode 100644 index d264f8dffd..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-030-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-040-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-040-symbolic_20px.svg deleted file mode 100644 index 3491ab4229..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-040-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-050-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-050-symbolic_20px.svg deleted file mode 100644 index e215c8b7d9..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-050-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-060-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-060-symbolic_20px.svg deleted file mode 100644 index 986c30c28c..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-060-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-070-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-070-symbolic_20px.svg deleted file mode 100644 index fef2614745..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-070-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-080-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-080-symbolic_20px.svg deleted file mode 100644 index c51847a02f..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-080-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-090-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-090-symbolic_20px.svg deleted file mode 100644 index 1aad3eaa1f..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-090-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-100-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-100-symbolic_20px.svg deleted file mode 100644 index 3126488bbb..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-100-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-unknow-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-unknow-symbolic_20px.svg deleted file mode 100644 index 0737573fbd..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/dark/icons/battery-unknow-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_42px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_42px.svg deleted file mode 100644 index 689e5be1f4..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_42px.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - dcc_nav_bluetooth_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_84px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_84px.svg deleted file mode 100644 index 08afaf7e87..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/icons/dcc_nav_bluetooth_84px.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - dcc_nav_bluetooth_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-000-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-000-symbolic_20px.svg deleted file mode 100644 index 7200009d1d..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-000-symbolic_20px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-010-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-010-symbolic_20px.svg deleted file mode 100644 index 570ea60c6f..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-010-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-020-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-020-symbolic_20px.svg deleted file mode 100644 index e5b1672b29..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-020-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-030-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-030-symbolic_20px.svg deleted file mode 100644 index 2652a707ac..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-030-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-040-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-040-symbolic_20px.svg deleted file mode 100644 index f6601f2a3c..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-040-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-050-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-050-symbolic_20px.svg deleted file mode 100644 index f4158de828..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-050-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-060-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-060-symbolic_20px.svg deleted file mode 100644 index b4df905b4a..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-060-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-070-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-070-symbolic_20px.svg deleted file mode 100644 index 2cd4ad4270..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-070-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-080-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-080-symbolic_20px.svg deleted file mode 100644 index c604bc7256..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-080-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-090-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-090-symbolic_20px.svg deleted file mode 100644 index 386b994620..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-090-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-100-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-100-symbolic_20px.svg deleted file mode 100644 index 6ac5c44f63..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-100-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-unknow-symbolic_20px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-unknow-symbolic_20px.svg deleted file mode 100644 index dd9536d31a..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/light/icons/battery-unknow-symbolic_20px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_camera_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_camera_16px.svg deleted file mode 100644 index dfc5671e53..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_camera_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/camera - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_clang_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_clang_16px.svg deleted file mode 100644 index 19af98e5ab..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_clang_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/clang - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_keyboard_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_keyboard_16px.svg deleted file mode 100644 index 4ac95ed96b..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_keyboard_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/keyboard - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_lan_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_lan_16px.svg deleted file mode 100644 index dd65217058..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_lan_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/lan - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_laptop_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_laptop_16px.svg deleted file mode 100644 index 74a8d8c42c..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_laptop_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/laptop - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_microphone_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_microphone_16px.svg deleted file mode 100644 index 2bc110d8ac..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_microphone_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/microphone - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_mouse_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_mouse_16px.svg deleted file mode 100644 index 72ce585e31..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_mouse_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/mouse - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_other_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_other_16px.svg deleted file mode 100644 index 50f4c7f869..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_other_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/other - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pad_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pad_16px.svg deleted file mode 100644 index 1bbeb41fdd..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pad_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/pad - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pc_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pc_16px.svg deleted file mode 100644 index dec6b72c26..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pc_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/pc - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pen_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pen_16px.svg deleted file mode 100644 index e4daa1afa8..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pen_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/pen - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pheadset_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pheadset_16px.svg deleted file mode 100644 index 44fd6e443c..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_pheadset_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/pheadset - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_phone_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_phone_16px.svg deleted file mode 100644 index eb81186973..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_phone_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/phone - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_print_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_print_16px.svg deleted file mode 100644 index b460c643f9..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_print_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/print - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_scaner_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_scaner_16px.svg deleted file mode 100644 index 0390b45885..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_scaner_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/scaner - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_touchpad_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_touchpad_16px.svg deleted file mode 100644 index 73df77c99c..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_touchpad_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/touchpad - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_tv_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_tv_16px.svg deleted file mode 100644 index c50aa782e2..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_tv_16px.svg +++ /dev/null @@ -1,9 +0,0 @@ - - - buletooth_icon/tv - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_video_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_video_16px.svg deleted file mode 100644 index 21dec29aab..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_video_16px.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - buletooth_icon/video - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_vidicon_16px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_vidicon_16px.svg deleted file mode 100644 index 6d1f55b335..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/bluetooth_vidicon_16px.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - buletooth_vidicon_dark - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_edit_12px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_edit_12px.svg deleted file mode 100644 index ef6823ccc1..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_edit_12px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_refresh_12px.svg b/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_refresh_12px.svg deleted file mode 100644 index e03bcfdf52..0000000000 --- a/dcc-old/src/plugin-bluetooth/operation/qrc/texts/dcc_refresh_12px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-bluetooth/window/adaptermodule.cpp b/dcc-old/src/plugin-bluetooth/window/adaptermodule.cpp deleted file mode 100644 index 46fe8cafdf..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/adaptermodule.cpp +++ /dev/null @@ -1,381 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "adaptermodule.h" -#include "bluetoothdevicemodel.h" -#include "bluetoothworker.h" -#include "widgets/widgetmodule.h" -#include "widgets/settingsgroup.h" -#include "widgets/dcclistview.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -AdapterModule::AdapterModule(const BluetoothAdapter *adapter, BluetoothModel *model, BluetoothWorker *work, QObject *parent) - : QObject(parent) - , m_adapter(adapter) - , m_hasPaired(false) - , m_model(model) - , m_work(work) -{ - m_moduleList.append(new WidgetModule("bluetoothTitleGroup", tr("Allow other Bluetooth devices to find this device"), this, &AdapterModule::initBluetoothTitle)); - m_bluetoothTitle = new WidgetModule("bluetoothTitle", tr("Enable Bluetooth to find nearby devices (speakers, keyboard, mouse)"), [](QLabel *tip) { - tip->setText(tr("Enable Bluetooth to find nearby devices (speakers, keyboard, mouse)")); - tip->setWordWrap(true); - tip->setContentsMargins(16, 0, 10, 0); - }); - m_moduleList.append(m_bluetoothTitle); - m_devicesTitle = new WidgetModule("devicesTitle", tr("My Devices"), [](TitleLabel *title) { - title->setText(tr("My Devices")); - DFontSizeManager::instance()->bind(title, DFontSizeManager::T5, QFont::DemiBold); // 设置字体 - }); - m_moduleList.append(m_devicesTitle); - m_mydevicelist = new WidgetModule("mydeviceList", tr("My Devices"), this, &AdapterModule::initDeviceListView); - m_moduleList.append(m_mydevicelist); - m_otherDevices = new WidgetModule("otherDevices", tr("Other Devices"), [](TitleLabel *title) { - title->setText(tr("Other Devices")); - DFontSizeManager::instance()->bind(title, DFontSizeManager::T5, QFont::DemiBold); // 设置字体 - }); - m_moduleList.append(m_otherDevices); - m_anonymousCheckBox = new WidgetModule("anonymousCheckBox", tr("Other Devices"), this, &AdapterModule::initAnonymousCheckBox); - m_moduleList.append(m_anonymousCheckBox); - m_otherdevicelist = new WidgetModule("otherdeviceList", "", this, &AdapterModule::initOtherDeviceListView); - m_moduleList.append(m_otherdevicelist); - - setAdapter(m_adapter); -} - -AdapterModule::~AdapterModule() -{ - qDeleteAll(m_moduleList); -} - -const QList &AdapterModule::ModuleList() const -{ - return m_moduleList; -} - -void AdapterModule::active() -{ - updateVisible(m_adapter->powered(), m_adapter->discovering()); - if (m_adapter->powered() && !m_adapter->discovering()) - Q_EMIT requestRefresh(m_adapter); -} - -void AdapterModule::initBluetoothTitle(DCC_NAMESPACE::SettingsGroup *settingsGrp) -{ - m_titleEdit = new TitleEdit; - m_titleEdit->setTitle(m_adapter->name()); - DSpinner *spinnerBtn = new DSpinner(m_titleEdit); - spinnerBtn->setFixedSize(24, 24); - spinnerBtn->start(); - spinnerBtn->hide(); - m_titleEdit->setMinimumWidth(10); - SwitchWidget *powerSwitch = new SwitchWidget(nullptr, m_titleEdit); - //把动画按钮放在蓝牙开关前面 - powerSwitch->getMainLayout()->insertWidget(1, spinnerBtn, Qt::AlignVCenter); - powerSwitch->setObjectName("powerSwitch"); - - powerSwitch->setFixedHeight(36); - powerSwitch->setContentsMargins(0, 0, 0, 0); - powerSwitch->setChecked(m_adapter->powered()); - - SwitchWidget *discoverySwitch = new SwitchWidget(tr("Allow other Bluetooth devices to find this device")); - discoverySwitch->leftWidget()->setMinimumWidth(10); - discoverySwitch->setContentsMargins(0, 0, 0, 0); - discoverySwitch->setFixedHeight(36); - discoverySwitch->setObjectName("discoverySwitch"); - discoverySwitch->setChecked(m_adapter->discoverabled()); - - settingsGrp->setBackgroundStyle(SettingsGroup::GroupBackground); - settingsGrp->setContentsMargins(0, 0, 0, 0); - settingsGrp->layout()->setMargin(0); - settingsGrp->setSpacing(1); - - settingsGrp->appendItem(powerSwitch); - settingsGrp->appendItem(discoverySwitch); - discoverySwitch->setChecked(m_adapter->discoverabled()); - discoverySwitch->setVisible(m_adapter->powered()); - - connect(m_titleEdit, &TitleEdit::requestSetBluetoothName, this, [=](const QString &alias) { - Q_EMIT requestSetAlias(m_adapter, alias); - }); - connect(m_adapter, &BluetoothAdapter::nameChanged, m_titleEdit, &TitleEdit::setTitle, Qt::QueuedConnection); - connect(powerSwitch, &SwitchWidget::checkedChanged, this, [this, powerSwitch, discoverySwitch](const bool check) { - //关闭蓝牙的时候,直接隐藏列表 - if (!check) { - discoverySwitch->setVisible(false); - updateVisible(false, false); - if (m_adapter) { - Q_EMIT m_adapter->closeDetailPage(); - } - } - powerSwitch->switchButton()->setEnabled(false); - Q_EMIT requestSetToggleAdapter(m_adapter, check); - }); - connect(m_adapter, &BluetoothAdapter::poweredChanged, powerSwitch, [powerSwitch, spinnerBtn] { - powerSwitch->switchButton()->setEnabled(true); - spinnerBtn->hide(); - }); - connect(m_adapter, &BluetoothAdapter::loadStatus, powerSwitch, [powerSwitch, spinnerBtn] { - powerSwitch->switchButton()->setEnabled(false); - spinnerBtn->show(); - }); - connect(discoverySwitch, &SwitchWidget::checkedChanged, this, &AdapterModule::toggleDiscoverableSwitch); - connect(m_adapter, &BluetoothAdapter::discoverableChanged, discoverySwitch, [this, discoverySwitch] { - discoverySwitch->setChecked(m_adapter->discoverabled()); - }); - connect(m_adapter, &BluetoothAdapter::poweredChanged, powerSwitch, [powerSwitch, discoverySwitch](bool bPower, bool) { - powerSwitch->setEnabled(true); - powerSwitch->setChecked(bPower); - powerSwitch->setVisible(true); - discoverySwitch->setEnabled(true); - discoverySwitch->setVisible(bPower); - }); -} - -void AdapterModule::initDeviceListView(DCCListView *deviceListView) -{ - deviceListView->setAccessibleName("List_mydevicelist"); - deviceListView->setObjectName("myDeviceListView"); - deviceListView->setFrameShape(QFrame::NoFrame); - BluetoothDeviceModel *model = new BluetoothDeviceModel(m_adapter, true, deviceListView); - deviceListView->setModel(model); - deviceListView->setItemDelegate(new BluetoothDeviceDelegate(deviceListView)); - deviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - deviceListView->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - deviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - deviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - deviceListView->setSelectionMode(QAbstractItemView::NoSelection); - deviceListView->setViewportMargins(0, 0, 0, 0); - - connect(model, &BluetoothDeviceModel::requestSetDevAlias, this, &AdapterModule::requestSetDevAlias); - connect(model, &BluetoothDeviceModel::detailClick, this, [this, deviceListView](const BluetoothDevice *device) { - contextMenu(m_adapter, device, deviceListView); - }); - connect(deviceListView, &DListView::clicked, this, [this](const QModelIndex &idx) { - const BluetoothDevice *device = static_cast(idx.internalPointer()); - if (device->state() != BluetoothDevice::StateConnected) { - Q_EMIT requestConnectDevice(device, m_adapter); - } - }); - - connect(deviceListView, &DListView::activated, deviceListView, &DListView::clicked); -} - -void AdapterModule::initAnonymousCheckBox(QWidget *w) -{ - QCheckBox *showAnonymousCheckBox = new QCheckBox(w); - showAnonymousCheckBox->setAccessibleName("AnonymousCheckBox"); - showAnonymousCheckBox->setChecked(m_model->displaySwitch()); - - showAnonymousCheckBox->setText(tr("Show Bluetooth devices without names")); - - showAnonymousCheckBox->setFixedHeight(36); - showAnonymousCheckBox->setMinimumWidth(10); - - DSpinner *spinner = new DSpinner(w); - spinner->setFixedSize(24, 24); - spinner->start(); - spinner->setVisible(m_adapter->discovering()); - - DIconButton *refreshBtn = new DIconButton(w); - refreshBtn->setFixedSize(36, 36); - refreshBtn->setIcon(DIconTheme::findQIcon("dcc_refresh")); - refreshBtn->setVisible(!m_adapter->discovering()); - - QHBoxLayout *phlayoutShowAnonymous = new QHBoxLayout; - phlayoutShowAnonymous->addWidget(showAnonymousCheckBox); - phlayoutShowAnonymous->addStretch(); - phlayoutShowAnonymous->addWidget(spinner); - phlayoutShowAnonymous->addWidget(refreshBtn); - - connect(refreshBtn, &DIconButton::clicked, this, [this] { - Q_EMIT requestRefresh(m_adapter); - }); - connect(m_model, &BluetoothModel::displaySwitchChanged, showAnonymousCheckBox, &QCheckBox::setChecked); - connect(showAnonymousCheckBox, &QCheckBox::stateChanged, this, [=](int state) { - if (state == Qt::CheckState::Unchecked) { - if (m_model->displaySwitch()) { - Q_EMIT requestSetDisplaySwitch(false); - } - } else { - if (!m_model->displaySwitch()) { - Q_EMIT requestSetDisplaySwitch(true); - } - } - }); - connect(m_adapter, &BluetoothAdapter::poweredChanged, spinner, [spinner, refreshBtn](bool bPower, bool bDiscovering) { - spinner->setVisible(bPower && bDiscovering); - refreshBtn->setVisible(bPower && !bDiscovering); - }); - w->setLayout(phlayoutShowAnonymous); -} - -void AdapterModule::initOtherDeviceListView(DCCListView *otherDeviceListView) -{ - otherDeviceListView->setAccessibleName("List_otherdevicelist"); - otherDeviceListView->setObjectName("otherDeviceListView"); - otherDeviceListView->setFrameShape(QFrame::NoFrame); - BluetoothDeviceModel *model = new BluetoothDeviceModel(m_adapter, false, otherDeviceListView); - otherDeviceListView->setModel(model); - otherDeviceListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - otherDeviceListView->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - otherDeviceListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - otherDeviceListView->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - otherDeviceListView->setSelectionMode(QAbstractItemView::NoSelection); - otherDeviceListView->setViewportMargins(0, 0, 0, 0); - model->showAnonymous(m_model->displaySwitch()); - - connect(m_model, &BluetoothModel::displaySwitchChanged, model, &BluetoothDeviceModel::showAnonymous); - - connect(otherDeviceListView, &DListView::clicked, this, [this](const QModelIndex &idx) { - const BluetoothDevice *device = static_cast(idx.internalPointer()); - if (device->state() != BluetoothDevice::StateConnected) { - Q_EMIT requestConnectDevice(device, m_adapter); - } - }); - - connect(otherDeviceListView, &DListView::activated, otherDeviceListView, &DListView::clicked); -} - -void AdapterModule::setAdapter(const BluetoothAdapter *adapter) -{ - connect(adapter, &BluetoothAdapter::poweredChanged, this, &AdapterModule::updateVisible, Qt::QueuedConnection); - connect(adapter, &BluetoothAdapter::deviceAdded, this, &AdapterModule::deviceChanged, Qt::QueuedConnection); - connect(adapter, &BluetoothAdapter::deviceRemoved, this, &AdapterModule::deviceChanged, Qt::QueuedConnection); - deviceChanged(); - updateVisible(adapter->powered(), adapter->discovering()); -} - -bool AdapterModule::getSwitchState() -{ - return m_adapter->powered(); -} - -void AdapterModule::toggleDiscoverableSwitch(const bool checked) -{ - Q_EMIT requestDiscoverable(m_adapter, checked); -} - -void AdapterModule::updateVisible(bool bPower, bool bDiscovering) -{ - // NOTE: maybe it should be used? - Q_UNUSED(bDiscovering) - m_bluetoothTitle->setHidden(bPower); - m_otherDevices->setHidden(!bPower); - m_anonymousCheckBox->setHidden(!bPower); - m_otherdevicelist->setHidden(!bPower); - m_devicesTitle->setHidden(!bPower || !m_hasPaired); - m_mydevicelist->setHidden(!bPower || !m_hasPaired); -} - -void AdapterModule::contextMenu(const BluetoothAdapter *adapter, const BluetoothDevice *device, DCCListView *view) -{ - QMenu *menu = new QMenu(view); - menu->setAccessibleName("DetailMenu"); - QAction *connectAction = menu->addAction(tr("Connect")); - QAction *disconnectAction = menu->addAction(tr("Disconnect")); - QAction *renameAction = menu->addAction(tr("Rename")); - QAction *transfileAction = menu->addAction(tr("Send Files")); - menu->addSeparator(); - QAction *ignoreAction = menu->addAction(tr("Ignore this device")); - connectAction->setObjectName("connectAction"); - switch (device->state()) { - case BluetoothDevice::StateConnected: - if (device->connectState()) { - menu->removeAction(connectAction); - } else { - menu->removeAction(disconnectAction); - menu->removeAction(transfileAction); - menu->removeAction(ignoreAction); - ignoreAction->setEnabled(false); - } - break; - case BluetoothDevice::StateAvailable: - connectAction->setText(tr("Connecting")); - menu->removeAction(disconnectAction); - menu->removeAction(transfileAction); - ignoreAction->setEnabled(false); - break; - case BluetoothDevice::StateDisconnecting: - connectAction->setText(tr("Disconnecting")); - menu->removeAction(disconnectAction); - menu->removeAction(transfileAction); - ignoreAction->setEnabled(false); - break; - case BluetoothDevice::StateUnavailable: - menu->removeAction(disconnectAction); - menu->removeAction(transfileAction); - break; - } - if (!device->canSendFile()) - menu->removeAction(transfileAction); - QAction *action = menu->exec(QCursor::pos()); - if (action == nullptr) { - // 没有不处理,但要先判断 - } else if (action == connectAction) { - Q_EMIT requestConnectDevice(device, adapter); - } else if (action == disconnectAction) { - Q_EMIT requestDisconnectDevice(device); - } else if (action == renameAction) { - BluetoothDeviceModel *model = qobject_cast(view->model()); - view->edit(model->index(device)); - } else if (action == transfileAction) { - QFileDialog *transFile = new QFileDialog(view); - transFile->setModal(true); - transFile->setFileMode(QFileDialog::ExistingFiles); - transFile->setAcceptMode(QFileDialog::AcceptOpen); - transFile->setDirectory(QDir::homePath()); - connect(transFile, &QFileDialog::finished, this, [this, transFile, device](int result) { - if (result == QFileDialog::Accepted) { - QStringList selectedFiles = transFile->selectedFiles(); - if (selectedFiles.count() <= 0) - return; - // 蓝牙传输dbus接口: SendFile(destination string, filename string) 接口支持文件多选 - m_work->showBluetoothTransDialog(device->address(), selectedFiles); - } - }); - transFile->show(); - } else if (action == ignoreAction) { - Q_EMIT requestIgnoreDevice(adapter, device); - } - menu->deleteLater(); -} - -void AdapterModule::deviceChanged() -{ - bool hasPaired = false; - for (auto &&dev : m_adapter->devices()) { - hasPaired |= dev->paired(); - if (!m_devices.contains(dev)) { - connect(dev, &BluetoothDevice::pairedChanged, this, &AdapterModule::deviceChanged, Qt::QueuedConnection); - connect(dev, &BluetoothDevice::destroyed, this, [this]() { - m_devices.remove(qobject_cast(sender())); - }); - m_devices.insert(dev); - } - } - if (hasPaired != m_hasPaired) { - m_hasPaired = hasPaired; - updateVisible(m_adapter->powered(), m_adapter->discovering()); - } -} diff --git a/dcc-old/src/plugin-bluetooth/window/adaptermodule.h b/dcc-old/src/plugin-bluetooth/window/adaptermodule.h deleted file mode 100644 index 350241778c..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/adaptermodule.h +++ /dev/null @@ -1,87 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef ADAPTERMODULE_H -#define ADAPTERMODULE_H - -#include "interface/moduleobject.h" - -#include "widgets/switchwidget.h" -#include "widgets/titlelabel.h" -#include "bluetoothmodel.h" -#include "titleedit.h" - -#include - -DWIDGET_BEGIN_NAMESPACE -class DListView; -class DSpinner; -class DIconButton; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { -class SettingsGroup; -class DCCListView; -} - -class BluetoothWorker; -class QCheckBox; - -class AdapterModule : public QObject -{ - Q_OBJECT -public: - explicit AdapterModule(const BluetoothAdapter *adapter, BluetoothModel *model, BluetoothWorker *work, QObject *parent = nullptr); - virtual ~AdapterModule(); - const QList &ModuleList() const; - void active(); - -public Q_SLOTS: - void initBluetoothTitle(DCC_NAMESPACE::SettingsGroup *settingsGrp); - void initDeviceListView(DCC_NAMESPACE::DCCListView *deviceListView); - void initAnonymousCheckBox(QWidget *w); - void initOtherDeviceListView(DCC_NAMESPACE::DCCListView *otherDeviceListView); - void toggleDiscoverableSwitch(const bool checked); - void updateVisible(bool bPower, bool bDiscovering); - -Q_SIGNALS: - void requestSetToggleAdapter(const BluetoothAdapter *adapter, const bool &toggled); - void requestConnectDevice(const BluetoothDevice *device, const BluetoothAdapter *adapter); - void requestDisconnectDevice(const BluetoothDevice *device); - void requestSetAlias(const BluetoothAdapter *adapter, const QString &alias); - void requestSetDevAlias(const BluetoothDevice *device, const QString &devAlias); - void notifyRemoveDevice(); - void requestRefresh(const BluetoothAdapter *adapter); - void requestDiscoverable(const BluetoothAdapter *adapter, const bool &discoverable); - void requestSetDisplaySwitch(const bool &on); - void requestIgnoreDevice(const BluetoothAdapter *adapter, const BluetoothDevice *device); - -private Q_SLOTS: - void contextMenu(const BluetoothAdapter *adapter, const BluetoothDevice *device, DCC_NAMESPACE::DCCListView *view); - void deviceChanged(); - -private: - void setAdapter(const BluetoothAdapter *adapter); - bool getSwitchState(); - -protected: - QList m_moduleList; - QSet m_devices; - - DCC_NAMESPACE::TitleEdit *m_titleEdit; - const BluetoothAdapter *m_adapter; - bool m_hasPaired; - - BluetoothModel *m_model; - BluetoothWorker *m_work; - - DCC_NAMESPACE::ModuleObject *m_bluetoothTitle; - DCC_NAMESPACE::ModuleObject *m_otherDevices; - DCC_NAMESPACE::ModuleObject *m_anonymousCheckBox; - DCC_NAMESPACE::ModuleObject *m_otherdevicelist; - DCC_NAMESPACE::ModuleObject *m_devicesTitle; - DCC_NAMESPACE::ModuleObject *m_mydevicelist; -}; - -#endif // ADAPTERMODULE_H diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.cpp b/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.cpp deleted file mode 100644 index dd0682e6c2..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.cpp +++ /dev/null @@ -1,447 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "bluetoothdevicemodel.h" - -#include "bluetoothadapter.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -struct BluetoothDeviceItemAction -{ - const BluetoothDevice *device; - DViewItemAction *spinnerAction; - DViewItemAction *percentageText; - DViewItemAction *percentageIcon; - DViewItemAction *textAction; - DViewItemAction *spaceAction; - DViewItemAction *iconAction; - DSpinner *loadingIndicator; - DViewItemActionList actionList; - DStandardItem *item; - - explicit BluetoothDeviceItemAction(const BluetoothDevice *_device) - : device(_device) - , spinnerAction(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), false)) - , percentageText(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), false)) - , percentageIcon(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), false)) - , textAction(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), true)) - , spaceAction(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), false)) - , iconAction(new DViewItemAction(Qt::AlignVCenter, QSize(), QSize(), true)) - , loadingIndicator(nullptr) - , item(new DStandardItem()) - { - iconAction->setData(static_cast(device)); - actionList.append(percentageText); - actionList.append(percentageIcon); - actionList.append(spinnerAction); - actionList.append(textAction); - actionList.append(spaceAction); - actionList.append(iconAction); - percentageText->setVisible(false); - percentageIcon->setVisible(false); - spinnerAction->setVisible(false); - item->setActionList(Qt::Edge::RightEdge, actionList); - } - - ~BluetoothDeviceItemAction() - { - delete item; - if (loadingIndicator) - delete loadingIndicator; - } - - void setLoading(bool isLoading, QWidget *parentView) - { - if (spinnerAction->isVisible() == isLoading) - return; - if (isLoading) { - QAbstractItemView *view = qobject_cast(parentView); - QWidget *parentWidget = view ? view->viewport() : parentView; - if (!loadingIndicator) { - loadingIndicator = new DSpinner(parentWidget); - loadingIndicator->setFixedSize(24, 24); - spinnerAction->setWidget(loadingIndicator); - loadingIndicator->connect(loadingIndicator, - &QWidget::destroyed, - loadingIndicator, - [this]() { - loadingIndicator = nullptr; - }); - } - loadingIndicator->setParent(parentWidget); - loadingIndicator->start(); - } else if (loadingIndicator) { - loadingIndicator->stop(); - loadingIndicator->setVisible(false); - } - spinnerAction->setVisible(isLoading); - textAction->setVisible(!isLoading); - } - Q_DISABLE_COPY(BluetoothDeviceItemAction) -}; - -const QMap BluetoothDeviceModel::deviceType2Icon = { - {"unknow", "other"}, - {"computer", "pc"}, - {"phone", "phone"}, - {"video-display", "vidicon"}, - {"multimedia-player", "tv"}, - {"scanner", "scaner"}, - {"input-keyboard", "keyboard"}, - {"input-mouse", "mouse"}, - {"input-gaming", "other"}, - {"input-tablet", "touchpad"}, - {"audio-card", "pheadset"}, - {"audio-headset", "pheadset"}, - {"network-wireless", "lan"}, - {"camera-video", "vidicon"}, - {"printer", "print"}, - {"camera-photo", "camera"}, - {"modem", "other"} -}; - -BluetoothDeviceModel::BluetoothDeviceModel(const BluetoothAdapter *adapter, - bool paired, - QWidget *parent) - : QAbstractItemModel(parent) - , m_paired(paired) - , m_adapter(adapter) - , m_parent(parent) - , m_showAnonymous(false) -{ - for (QString id : m_adapter->devicesId()) { - if (m_adapter->devices().contains(id)) { - const BluetoothDevice *device = m_adapter->devices()[id]; - addDevice(device); - } - } - connect(adapter, - &BluetoothAdapter::deviceAdded, - this, - &BluetoothDeviceModel::addDevice, - Qt::QueuedConnection); - connect(adapter, - &BluetoothAdapter::deviceRemoved, - this, - &BluetoothDeviceModel::removeDevice, - Qt::QueuedConnection); -} - -BluetoothDeviceModel::~BluetoothDeviceModel() -{ - for (auto it = m_allData.begin(); it != m_allData.end(); ++it) { - delete (*it); - } -} - -QModelIndex BluetoothDeviceModel::index(const BluetoothDevice *device) -{ - int row = 0; - for (auto it = m_data.begin(); it != m_data.end(); ++it, ++row) { - if ((*it)->device == device) { - return index(row, 0); - } - } - return QModelIndex(); -} - -// Basic functionality: -QModelIndex BluetoothDeviceModel::index(int row, int column, const QModelIndex &parent) const -{ - Q_UNUSED(parent) - if (row < 0 || row >= m_data.size()) - return QModelIndex(); - return createIndex(row, column, const_cast(m_data.at(row)->device)); -} - -QModelIndex BluetoothDeviceModel::parent(const QModelIndex &index) const -{ - Q_UNUSED(index) - return QModelIndex(); -} - -int BluetoothDeviceModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - return m_data.size(); -} - -int BluetoothDeviceModel::columnCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent) - return 1; -} - -QVariant BluetoothDeviceModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) - return QVariant(); - - auto themeType = DGuiApplicationHelper::instance()->themeType(); - bool isDarkTheme = themeType == DGuiApplicationHelper::DarkType; - - int row = index.row(); - const BluetoothDevice *device = m_data.at(row)->device; - const QString iconSuffix = deviceType2Icon[device->deviceType()]; - - switch (role) { - case Qt::EditRole: - case Qt::DisplayRole: - return device->alias().isEmpty() ? device->name() : device->alias(); - case Qt::DecorationRole: - if (!iconSuffix.isEmpty()) { - QString deviceIconName = QString("bluetooth_%1").arg(iconSuffix); - return QIcon::fromTheme(deviceIconName); - } - else - return QIcon::fromTheme(QString("bluetooth_other")); - case Dtk::RightActionListRole: - return m_data.at(row)->item->data(role); - default: - return QVariant(); - } -} - -bool BluetoothDeviceModel::setData(const QModelIndex &index, const QVariant &value, int role) -{ - if (index.isValid() && role == Qt::EditRole) { - const BluetoothDevice *device = - static_cast(index.internalPointer()); - QString devAlias = value.toString(); - QString devName(device->name()); - if (devAlias.isEmpty()) { - Q_EMIT requestSetDevAlias(device, devName); - } else { - Q_EMIT requestSetDevAlias(device, devAlias); - } - emit dataChanged(index, index, { role }); - return true; - } - return false; -} - -Qt::ItemFlags BluetoothDeviceModel::flags(const QModelIndex &index) const -{ - Qt::ItemFlags flag = QAbstractItemModel::flags(index); - int row = index.row(); - const BluetoothDevice *device = m_data.at(row)->device; - // INFO: when is headset, not connect twice - if (device - && (device->deviceType() == "audio-headset" || device->deviceType() == "autio-headphones") - && device->state() == BluetoothDevice::StateAvailable) - flag.setFlag(Qt::ItemIsEnabled, false); - return flag | Qt::ItemIsEditable; -} - -void BluetoothDeviceModel::addDevice(const BluetoothDevice *device) -{ - for (auto it = m_allData.begin(); it != m_allData.end(); ++it) { - if ((*it)->device == device) { - return; - } - } - - // clang-format off - connect(device, &BluetoothDevice::pairedChanged, this, &BluetoothDeviceModel::onPairedChanged, Qt::UniqueConnection); - if (device->paired() != m_paired) - return; - connect(device, &BluetoothDevice::nameChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - connect(device, &BluetoothDevice::aliasChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - connect(device, &BluetoothDevice::stateChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - connect(device, &BluetoothDevice::trustedChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - connect(device, &BluetoothDevice::connectingChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - connect(device, &BluetoothDevice::batteryChanged, this, &BluetoothDeviceModel::updateData, Qt::UniqueConnection); - - BluetoothDeviceItemAction *item = new BluetoothDeviceItemAction(device); - updateItem(item); - connect(item->iconAction, &DViewItemAction::triggered, this, [this]() { - DViewItemAction *action = qobject_cast(sender()); - for (auto it = m_data.begin(); it != m_data.end(); ++it) { - if ((*it)->iconAction == action) { - emit detailClick((*it)->device); - break; - } - } - }); - // clang-format on - m_allData.append(item); - if (m_showAnonymous || !device->name().isEmpty()) { - beginInsertRows(QModelIndex(), 0, 0); - m_data.prepend(item); - endInsertRows(); - } -} - -void BluetoothDeviceModel::onPairedChanged(const bool &paired) -{ - const BluetoothDevice *device = qobject_cast(sender()); - if (!device) - return; - if (paired == m_paired) { - addDevice(device); - } else { - removeDevice(device->id()); - } -} - -void BluetoothDeviceModel::updateData() -{ - const BluetoothDevice *device = qobject_cast(sender()); - int row = 0; - for (auto it = m_data.begin(); it != m_data.end(); ++it, ++row) { - if ((*it)->device == device) { - updateItem(*it); - emit dataChanged(index(row, 0), index(row, 0)); - break; - } - } -} - -void BluetoothDeviceModel::removeDevice(const QString &deviceId) -{ - for (auto it = m_allData.begin(); it != m_allData.end(); ++it) { - if ((*it)->device->id() == deviceId) { - BluetoothDeviceItemAction *item = *it; - m_allData.removeOne(item); - int row = m_data.indexOf(item); - if (row != -1) { - beginRemoveRows(QModelIndex(), row, row); - m_data.removeOne(item); - endRemoveRows(); - } - delete item; - break; - } - } -} - -void BluetoothDeviceModel::updateItem(BluetoothDeviceItemAction *item) -{ - const BluetoothDevice *device = item->device; - if (device->state() == BluetoothDevice::StateAvailable) { - item->setLoading(true, m_parent); - } else { - switch (device->state()) { - case BluetoothDevice::StateConnected: - if (device->connectState()) { - item->textAction->setText(tr("Connected")); - item->setLoading(false, m_parent); - } - break; - case BluetoothDevice::StateUnavailable: - case BluetoothDevice::StateDisconnecting: { - item->textAction->setText(tr("Not connected")); - item->setLoading(false, m_parent); - } break; - default: - break; - } - } - item->iconAction->setVisible(m_paired); - if (m_paired) { - item->iconAction->setIcon(m_parent->style()->standardIcon(QStyle::SP_ArrowRight)); - int battery = device->battery(); - if (battery != 0) { - item->percentageIcon->setVisible(true); - item->percentageIcon->setIcon(getBatteryIcon(battery)); - item->percentageText->setVisible(true); - item->percentageText->setText(QString("%1%").arg(battery)); - return; - } - } - item->percentageIcon->setVisible(false); - item->percentageText->setVisible(false); -} - -QIcon BluetoothDeviceModel::getBatteryIcon(int percentage) -{ - /* 0-5%、6-10%、11%-20%、21-30%、31-40%、41-50%、51-60%、61%-70%、71-80%、81-90%、91-100% */ - QString percentageStr; - if (percentage <= 5) { - percentageStr = "000"; - } else if (percentage <= 10) { - percentageStr = "010"; - } else if (percentage <= 20) { - percentageStr = "020"; - } else if (percentage <= 30) { - percentageStr = "030"; - } else if (percentage <= 40) { - percentageStr = "040"; - } else if (percentage <= 50) { - percentageStr = "050"; - } else if (percentage <= 60) { - percentageStr = "060"; - } else if (percentage <= 70) { - percentageStr = "070"; - } else if (percentage <= 80) { - percentageStr = "080"; - } else if (percentage <= 90) { - percentageStr = "090"; - } else if (percentage <= 100) { - percentageStr = "100"; - } else { - percentageStr = "unknow"; - } - - QString iconName = QString("battery-%1-symbolic").arg(percentageStr); - QIcon qrcIcon = DIconTheme::findQIcon(iconName, DIconTheme::DontFallbackToQIconFromTheme); - auto themeType = DGuiApplicationHelper::instance()->themeType(); - bool isDarkTheme = themeType == DGuiApplicationHelper::DarkType; - // "-dark" means dark icon, not icon for dark theme. - QString iconNameSystem = isDarkTheme ? iconName : iconName + "-dark"; - return DIconTheme::findQIcon(iconNameSystem, qrcIcon, DIconTheme::IgnoreBuiltinIcons); -} - -void BluetoothDeviceModel::showAnonymous(bool show) -{ - if (m_showAnonymous == show) - return; - m_showAnonymous = show; - beginResetModel(); - m_data.clear(); - for (auto it = m_allData.begin(); it != m_allData.end(); ++it) { - if (m_showAnonymous || !(*it)->device->name().isEmpty()) - m_data.append(*it); - } - endResetModel(); -} - -BluetoothDeviceDelegate::BluetoothDeviceDelegate(QAbstractItemView *parent) - : Dtk::Widget::DStyledItemDelegate(parent) -{ -} - -QWidget *BluetoothDeviceDelegate::createEditor(QWidget *parent, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - Q_UNUSED(option) - if (!index.isValid()) - return nullptr; - - QLineEdit *edit = new QLineEdit(parent); - edit->setFrame(false); - edit->setSizePolicy(QSizePolicy::Ignored, edit->sizePolicy().verticalPolicy()); - connect(edit, &QLineEdit::textChanged, edit, [edit](const QString &str) { - if (str.length() > 32) { - edit->backspace(); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } - }); - return edit; -} diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.h b/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.h deleted file mode 100644 index d74d897b60..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothdevicemodel.h +++ /dev/null @@ -1,74 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef BLUETOOTHDEVICEMODEL_H -#define BLUETOOTHDEVICEMODEL_H - -#include - -#include - -class QPainter; -class QStyleOptionViewItem; -class QModelIndex; -class BluetoothDevice; -class BluetoothAdapter; -struct BluetoothDeviceItemAction; - -class BluetoothDeviceModel : public QAbstractItemModel -{ - Q_OBJECT -public: - explicit BluetoothDeviceModel(const BluetoothAdapter *adapter, bool paired = false, QWidget *parent = nullptr); - virtual ~BluetoothDeviceModel() override; - void setPairedDevices(bool paired); - QModelIndex index(const BluetoothDevice *device); - // Basic functionality: - QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override; - QModelIndex parent(const QModelIndex &index) const override; - - int rowCount(const QModelIndex &parent = QModelIndex()) const override; - int columnCount(const QModelIndex &parent = QModelIndex()) const override; - - QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override; - bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; - virtual Qt::ItemFlags flags(const QModelIndex &index) const override; - -Q_SIGNALS: - void detailClick(const BluetoothDevice *device); - void requestSetDevAlias(const BluetoothDevice *device, const QString &devAlias); - -public Q_SLOTS: - void showAnonymous(bool show); - QIcon getBatteryIcon(int percentage); - -private Q_SLOTS: - void addDevice(const BluetoothDevice *device); - void removeDevice(const QString &deviceId); - void updateData(); - void onPairedChanged(const bool &paired); - -private: - void updateItem(BluetoothDeviceItemAction *item); - -private: - const static QMap deviceType2Icon; - bool m_paired; - QList m_allData; - QList m_data; - const BluetoothAdapter *m_adapter; - QWidget *m_parent; - bool m_showAnonymous; -}; - -class BluetoothDeviceDelegate : public Dtk::Widget::DStyledItemDelegate -{ -public: - BluetoothDeviceDelegate(QAbstractItemView *parent = nullptr); - -protected: - QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const override; -}; - -#endif // BLUETOOTHDEVICEMODEL_H diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.cpp b/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.cpp deleted file mode 100644 index 5ffdda000a..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.cpp +++ /dev/null @@ -1,146 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "bluetoothmodule.h" -#include "bluetoothmodel.h" -#include "adaptermodule.h" -#include "bluetoothworker.h" -#include "bluetoothadapter.h" -#include "bluetoothdevice.h" -#include "pincodedialog.h" - -#include -#include -#include - -#include -DGUI_USE_NAMESPACE - -Q_LOGGING_CATEGORY(DdcBluetoothModule, "dcc-bluetooth-module") - -using namespace DCC_NAMESPACE; - -BluetoothModule::BluetoothModule(QObject *parent) - : PageModule("bluetooth", tr("Bluetooth"), tr("Bluetooth device manager"), DIconTheme::findQIcon("dcc_nav_bluetooth"), parent) -{ - m_model = new BluetoothModel(this); - m_work = new BluetoothWorker(m_model, this); - - connect(this, &BluetoothModule::requestSetToggleAdapter, m_work, &BluetoothWorker::setAdapterPowered); - connect(this, &BluetoothModule::requestConnectDevice, m_work, &BluetoothWorker::connectDevice); - connect(this, &BluetoothModule::requestDisconnectDevice, m_work, &BluetoothWorker::disconnectDevice); - connect(this, &BluetoothModule::requestSetAlias, m_work, &BluetoothWorker::setAlias); - connect(this, &BluetoothModule::requestDiscoverable, m_work, &BluetoothWorker::onRequestSetDiscoverable); - - connect(m_work, &BluetoothWorker::requestConfirmation, this, &BluetoothModule::showPinCode); - connect(m_work, &BluetoothWorker::pinCodeCancel, this, &BluetoothModule::closePinCode); - - connect(m_model, &BluetoothModel::adapterAdded, this, &BluetoothModule::addAdapter); - connect(m_model, &BluetoothModel::adapterRemoved, this, &BluetoothModule::removeAdapter); - - for (const BluetoothAdapter *adapter : m_model->adapters()) - addAdapter(adapter); - - updateWidget(); -} - -void BluetoothModule::active() -{ - for (auto &&module : m_valueMap) - module->active(); -} - -void BluetoothModule::deactive() -{ - for (auto &&adapter : m_valueMap.keys()) - m_work->setAdapterDiscovering(QDBusObjectPath(adapter->id()), false); -} - -bool BluetoothModule::hasDevice() -{ - return !m_valueMap.isEmpty(); -} - -void BluetoothModule::showPinCode(const QDBusObjectPath &device, const QString &code) -{ - qCDebug(DdcBluetoothModule) << "request confirmation: " << device.path() << code; - PinCodeDialog *dialog = PinCodeDialog::instance(code); - m_dialogs[device] = dialog; - if (!dialog->isVisible()) { - int ret = dialog->exec(); - closePinCode(device); - m_work->pinCodeConfirm(device, bool(ret)); - } -} - -void BluetoothModule::closePinCode(const QDBusObjectPath &device) -{ - PinCodeDialog *dialog = m_dialogs[device]; - m_dialogs.remove(device); - QMetaObject::invokeMethod(dialog, "deleteLater", Qt::QueuedConnection); -} - -AdapterModule *BluetoothModule::getAdapter(const BluetoothAdapter *adapter) -{ - AdapterModule *adpWidget = new AdapterModule(adapter, m_model, m_work, this); - - const QDBusObjectPath path(adapter->id()); - - connect(adpWidget, &AdapterModule::requestSetToggleAdapter, this, &BluetoothModule::requestSetToggleAdapter); - connect(adpWidget, &AdapterModule::requestConnectDevice, this, &BluetoothModule::requestConnectDevice); - connect(adpWidget, &AdapterModule::requestDisconnectDevice, this, &BluetoothModule::requestDisconnectDevice); - connect(adpWidget, &AdapterModule::requestSetAlias, this, &BluetoothModule::requestSetAlias); - connect(adpWidget, &AdapterModule::requestRefresh, this, &BluetoothModule::requestRefresh); - connect(adpWidget, &AdapterModule::requestDiscoverable, this, &BluetoothModule::requestDiscoverable); - connect(adpWidget, &AdapterModule::requestDiscoverable, this, &BluetoothModule::requestDiscoverable); - connect(adpWidget, &AdapterModule::requestSetDevAlias, m_work, &BluetoothWorker::setDeviceAlias); - connect(adpWidget, &AdapterModule::requestSetDisplaySwitch, m_work, &BluetoothWorker::setDisplaySwitch); - connect(adpWidget, &AdapterModule::requestIgnoreDevice, m_work, &BluetoothWorker::ignoreDevice); - - return adpWidget; -} - -void BluetoothModule::addAdapter(const BluetoothAdapter *adapter) -{ - if (!m_valueMap.contains(adapter)) { - m_valueMap[adapter] = getAdapter(adapter); - updateVisible(); - updateWidget(); - } -} -void BluetoothModule::removeAdapter(const BluetoothAdapter *adapter) -{ - if (m_valueMap.contains(adapter)) { - AdapterModule *adpModule = m_valueMap.take(adapter); - for (auto &&obj : adpModule->ModuleList()) { - removeChild(obj); - } - adpModule->setParent(nullptr); - adpModule->deleteLater(); - updateWidget(); - } -} - -void BluetoothModule::requestRefresh(const BluetoothAdapter *adapter) -{ - m_work->setAdapterDiscoverable(adapter->id()); -} - -void BluetoothModule::updateVisible() -{ - int row = 0; - for (const BluetoothAdapter *adapter : m_model->adapters()) { - auto &&adpModule = m_valueMap.value(adapter, nullptr); - if (adpModule) { - for (auto &&module : adpModule->ModuleList()) { - insertChild(row++, module); - } - } - } -} - -void BluetoothModule::updateWidget() -{ - setHidden(m_valueMap.isEmpty()); -} diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.h b/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.h deleted file mode 100644 index c297066ee9..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothmodule.h +++ /dev/null @@ -1,60 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef BLUETOOTHMODULE_H -#define BLUETOOTHMODULE_H - -#include "interface/pagemodule.h" - -#include - -class BluetoothModel; -class BluetoothWorker; -class BluetoothAdapter; -class BluetoothDevice; -class QDBusObjectPath; -class PinCodeDialog; -class AdapterModule; - -class BluetoothModule : public DCC_NAMESPACE::PageModule -{ - Q_OBJECT - -public: - explicit BluetoothModule(QObject *parent = nullptr); - ~BluetoothModule() override { } - void active() override; - void deactive() override; - bool hasDevice(); - -Q_SIGNALS: - void showBluetoothDetail(const BluetoothAdapter *adapter) const; - - void requestSetToggleAdapter(const BluetoothAdapter *adapter, const bool &toggled); - void requestConnectDevice(const BluetoothDevice *device, const BluetoothAdapter *adapter); - void requestDisconnectDevice(const BluetoothDevice *device); - void requestSetAlias(const BluetoothAdapter *adapter, const QString &alias); - void requestDiscoverable(const BluetoothAdapter *adapter, const bool &discoverable); - -public Q_SLOTS: - void showPinCode(const QDBusObjectPath &device, const QString &code); - void closePinCode(const QDBusObjectPath &device); - - void addAdapter(const BluetoothAdapter *adapter); - void removeAdapter(const BluetoothAdapter *adapter); - void requestRefresh(const BluetoothAdapter *adapter); - void updateVisible(); - -private: - void updateWidget(); - AdapterModule *getAdapter(const BluetoothAdapter *adapter); - -private: - BluetoothModel *m_model; - BluetoothWorker *m_work; - QMap m_valueMap; - QMap m_dialogs; -}; - -#endif // BLUETOOTHMODULE_H diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.cpp b/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.cpp deleted file mode 100644 index 70efa79995..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.cpp +++ /dev/null @@ -1,38 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "bluetoothplugin.h" -#include "bluetoothmodule.h" - -using namespace DCC_NAMESPACE; - -BluetoothPlugin::BluetoothPlugin(QObject *parent) - : PluginInterface(parent) - , m_moduleRoot(nullptr) -{ -} - -BluetoothPlugin::~BluetoothPlugin() -{ - m_moduleRoot = nullptr; -} - -QString BluetoothPlugin::name() const -{ - return QStringLiteral("bluetooth"); -} - -ModuleObject *BluetoothPlugin::module() -{ - if (m_moduleRoot) - return m_moduleRoot; - - m_moduleRoot = new BluetoothModule; - return m_moduleRoot; -} - -QString BluetoothPlugin::location() const -{ - return "8"; -} diff --git a/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.h b/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.h deleted file mode 100644 index 4fb3c5164d..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/bluetoothplugin.h +++ /dev/null @@ -1,28 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef BLUETOOTHPLUGIN_H -#define BLUETOOTHPLUGIN_H - -#include "interface/moduleobject.h" -#include "interface/plugininterface.h" - -class BluetoothPlugin : public DCC_NAMESPACE::PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Bluetooth" FILE "plugin-bluetooth.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - explicit BluetoothPlugin(QObject *parent = nullptr); - ~BluetoothPlugin(); - - virtual QString name() const override; - virtual DCC_NAMESPACE::ModuleObject *module() override; - virtual QString location() const override; - -private: - DCC_NAMESPACE::ModuleObject *m_moduleRoot; -}; - -#endif // BLUETOOTHPLUGIN_H diff --git a/dcc-old/src/plugin-bluetooth/window/pincodedialog.cpp b/dcc-old/src/plugin-bluetooth/window/pincodedialog.cpp deleted file mode 100644 index 57d2da8aee..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/pincodedialog.cpp +++ /dev/null @@ -1,67 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "pincodedialog.h" - -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -static QList Instances; - -PinCodeDialog::PinCodeDialog(const QString &pinCode, const bool &cancelable) - : DDialog() - , m_pinCodeLabel(new QLabel) -{ - setTitle(tr("The PIN for connecting to the Bluetooth device is:")); - setIcon(DIconTheme::findQIcon("notification-bluetooth-connected")); - - m_pinCodeLabel->setObjectName("PinCodeText"); - addContent(m_pinCodeLabel, Qt::AlignTop | Qt::AlignCenter); - - QStringList btns; - if (cancelable) { - btns << tr("Cancel"); - } - btns << tr("Confirm"); - addButtons(btns); - - setPinCode(pinCode); -} - -PinCodeDialog::~PinCodeDialog() -{ - Instances.removeAll(this); -} - -PinCodeDialog *PinCodeDialog::instance(const QString &pinCode, const bool &cancelable) -{ - QList::Iterator it = std::find_if(Instances.begin(), Instances.end(), [pinCode](PinCodeDialog *dia) { - return dia->pinCode() == pinCode; - }); - if (it != Instances.end()) { - return *it; - } - - PinCodeDialog *dia = new PinCodeDialog(pinCode, cancelable); - Instances.append(dia); - - return dia; -} - -QString PinCodeDialog::pinCode() const -{ - return m_pinCodeLabel->text(); -} - -void PinCodeDialog::setPinCode(const QString &pinCode) -{ - m_pinCodeLabel->setText(pinCode); -} - -PinCodeDialog::PinCodeDialog() - : PinCodeDialog("", false) -{ -} diff --git a/dcc-old/src/plugin-bluetooth/window/pincodedialog.h b/dcc-old/src/plugin-bluetooth/window/pincodedialog.h deleted file mode 100644 index e8244a0753..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/pincodedialog.h +++ /dev/null @@ -1,28 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DCC_BLUETOOTH_PINCODEDIALOG_H -#define DCC_BLUETOOTH_PINCODEDIALOG_H - -#include - -class QLabel; - -class PinCodeDialog : public Dtk::Widget::DDialog -{ - Q_OBJECT -public: - static PinCodeDialog *instance(const QString &pinCode, const bool &cancelable = true); - - QString pinCode() const; - void setPinCode(const QString &pinCode); - -private: - QLabel *m_pinCodeLabel; - - explicit PinCodeDialog(); - explicit PinCodeDialog(const QString &pinCode, const bool &cancelable = true); - ~PinCodeDialog(); -}; - -#endif // DCC_BLUETOOTH_PINCODEDIALOG_H diff --git a/dcc-old/src/plugin-bluetooth/window/plugin-bluetooth.json b/dcc-old/src/plugin-bluetooth/window/plugin-bluetooth.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/plugin-bluetooth.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-bluetooth/window/titleedit.cpp b/dcc-old/src/plugin-bluetooth/window/titleedit.cpp deleted file mode 100644 index 26f0778084..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/titleedit.cpp +++ /dev/null @@ -1,93 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "titleedit.h" - -#include - -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -using namespace DCC_NAMESPACE; - -TitleEdit::TitleEdit(QWidget *parent) - : QWidget(parent) - , m_name(new QLabel) - , m_lineEdit(new DLineEdit) -{ - setAccessibleName("TitleEdit"); - QHBoxLayout *mainlayout = new QHBoxLayout; - m_lineEdit->lineEdit()->setVisible(false); - m_lineEdit->setAccessibleName("TitleEdit_lineEdit"); - mainlayout->addWidget(m_name); - mainlayout->addWidget(m_lineEdit); - mainlayout->addSpacing(5); - DToolButton *editWidget = new DToolButton(this); - editWidget->setIcon(DIconTheme::findQIcon("dcc_edit")); - mainlayout->addWidget(editWidget); - mainlayout->addStretch(); - mainlayout->setMargin(0); - mainlayout->setSpacing(0); - setLayout(mainlayout); - - connect(m_lineEdit, &DLineEdit::editingFinished, this, [this, editWidget]() { - this->setName(); - editWidget->setVisible(true); - }); - - connect(m_lineEdit, &DLineEdit::focusChanged, this, [this, editWidget](bool onFocus) { - if (onFocus) { - editWidget->setVisible(false); - this->setEdit(); - } else { - this->setName(); - editWidget->setVisible(true); - } - }); - - connect(m_lineEdit, &DLineEdit::textChanged, this, [=](const QString &str) { - if (str.length() > 64) { - m_lineEdit->lineEdit()->backspace(); - DDesktopServices::playSystemSoundEffect(DDesktopServices::SSE_Error); - } - }); - connect(editWidget, &DToolButton::clicked, this, [this, editWidget]() { - editWidget->setVisible(false); - this->setEdit(); - }); -} - -void TitleEdit::setName() -{ - m_lineEdit->lineEdit()->setVisible(false); - m_name->setVisible(true); - if (m_name->text() != m_lineEdit->text()) { - if (!m_lineEdit->text().isEmpty()) { - m_name->setText(m_lineEdit->text()); - Q_EMIT requestSetBluetoothName(m_lineEdit->text()); - } else { - m_lineEdit->setText(m_name->text()); - } - } - m_name->setFocus(); -} - -void TitleEdit::setEdit() -{ - m_name->setVisible(false); - m_lineEdit->lineEdit()->setVisible(true); - m_lineEdit->lineEdit()->setFocus(); -} - -void TitleEdit::setTitle(const QString &title) -{ - m_name->setText(title); - m_lineEdit->setText(title); -} diff --git a/dcc-old/src/plugin-bluetooth/window/titleedit.h b/dcc-old/src/plugin-bluetooth/window/titleedit.h deleted file mode 100644 index 52e4f6d656..0000000000 --- a/dcc-old/src/plugin-bluetooth/window/titleedit.h +++ /dev/null @@ -1,37 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" - -#include -#include - -DWIDGET_USE_NAMESPACE - -QT_BEGIN_NAMESPACE -class QLabel; -class QLineEdit; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { -class TitleEdit : public QWidget -{ - Q_OBJECT -public: - explicit TitleEdit(QWidget *parent = nullptr); - -Q_SIGNALS: - void requestSetBluetoothName(const QString &name); - -public Q_SLOTS: - void setName(); - void setEdit(); - void setTitle(const QString &title); - -private: - QLabel *m_name; - DLineEdit *m_lineEdit; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.cpp b/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.cpp deleted file mode 100644 index 2e582b2aaf..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.cpp +++ /dev/null @@ -1,147 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "commoninfomodel.h" - -#include - -using namespace DCC_NAMESPACE; - -CommonInfoModel::CommonInfoModel(QObject *parent) - : QObject(parent) - , m_bootDelay(false) - , m_themeEnabled(false) - , m_updating(false) - , m_joinUeProgram(false) - , m_activation(false) - , m_plymouthscale(0) - , m_plymouththeme(QString()) -{ -} - -void CommonInfoModel::setEntryLists(const QStringList &list) -{ - if (list != m_entryLists) { - m_entryLists = list; - Q_EMIT entryListsChanged(list); - } -} - -void CommonInfoModel::setThemeEnabled(const bool enabled) -{ - if (m_themeEnabled != enabled) { - m_themeEnabled = enabled; - Q_EMIT themeEnabledChanged(m_themeEnabled); - } -} - -void CommonInfoModel::setShowGrubEditAuth(const bool enabled) -{ - m_isShowGrubEditAuth = enabled; -} - -void CommonInfoModel::setGrubEditAuthEnabled(const bool enabled) -{ - if (m_grubEditAuthEnabled != enabled) { - m_grubEditAuthEnabled = enabled; - Q_EMIT grubEditAuthEnabledChanged(m_grubEditAuthEnabled); - } -} - -void CommonInfoModel::setDefaultEntry(const QString &entry) -{ - if (m_defaultEntry != entry) { - m_defaultEntry = entry; - Q_EMIT defaultEntryChanged(entry); - } -} - -void CommonInfoModel::setUpdating(bool updating) -{ - if (updating != m_updating) { - m_updating = updating; - Q_EMIT updatingChanged(updating); - } -} - -void CommonInfoModel::setUeProgram(const bool ueProgram) -{ - if (m_joinUeProgram != ueProgram) { - m_joinUeProgram = ueProgram; - } - Q_EMIT ueProgramChanged(m_joinUeProgram); -} - -void CommonInfoModel::setDeveloperModeState(const bool state) -{ - if (m_developerModeState != state) { - m_developerModeState = state; - Q_EMIT developerModeStateChanged(state); - } -} - -void CommonInfoModel::setIsLogin(const bool log) -{ - if (m_isLogin == log) - return; - - m_isLogin = log; - Q_EMIT isLoginChenged(log); -} - -bool CommonInfoModel::bootDelay() const -{ - return m_bootDelay; -} - -void CommonInfoModel::setBootDelay(bool bootDelay) -{ - if (m_bootDelay != bootDelay) { - m_bootDelay = bootDelay; - Q_EMIT bootDelayChanged(bootDelay); - } -} - -void CommonInfoModel::setActivation(bool value) -{ - if (m_activation != value) { - m_activation = value; - Q_EMIT LicenseStateChanged(value); - } -} - -QPixmap CommonInfoModel::background() const -{ - return m_background; -} - -void CommonInfoModel::setBackground(const QPixmap &background) -{ - m_background = background; - - Q_EMIT backgroundChanged(background); -} - -bool CommonInfoModel::ueProgram() const -{ - return m_joinUeProgram; -} - -bool CommonInfoModel::developerModeState() const -{ - return m_developerModeState; -} - -void CommonInfoModel::setPlymouthScale(int scale) -{ - m_plymouthscale = scale; - - Q_EMIT plymouthScaleChanged(scale); -} - -void CommonInfoModel::setPlymouthTheme(const QString &themeName) -{ - m_plymouththeme = themeName; - - Q_EMIT plymouthThemeChanged(themeName); -} diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.h b/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.h deleted file mode 100644 index 92c00d18de..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfomodel.h +++ /dev/null @@ -1,79 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include -#include - -namespace DCC_NAMESPACE { -class CommonInfoModel : public QObject -{ - Q_OBJECT -public: - explicit CommonInfoModel(QObject *parent = nullptr); - - void setEntryLists(const QStringList &list); - inline QStringList entryLists() const { return m_entryLists;} - inline QString defaultEntry() const { return m_defaultEntry;} - bool bootDelay() const; - inline bool themeEnabled() const { return m_themeEnabled; } - inline bool isShowGrubEditAuth() { return m_isShowGrubEditAuth; } - inline bool grubEditAuthEnabled() { return m_grubEditAuthEnabled; } - inline bool updating() const { return m_updating; } - QPixmap background() const; - void setBackground(const QPixmap &background); - bool ueProgram() const; // for user experience program - bool developerModeState() const; - inline bool isLogin() const { return m_isLogin; } - inline bool isActivate() const { return m_activation; } - void setActivation(bool value); - inline int plymouthScale() const { return m_plymouthscale; } - inline QString plymouthTheme() const { return m_plymouththeme; } - -Q_SIGNALS: - void bootDelayChanged(const bool enabled) const; - void themeEnabledChanged(const bool enabled) const; - void grubEditAuthEnabledChanged(const bool enabled) const; - void entryListsChanged(const QStringList &list); - void defaultEntryChanged(const QString &entry); - void updatingChanged(const bool &updating); - void backgroundChanged(const QPixmap &pixmap); - void ueProgramChanged(const bool enable) const; // for user experience program - void developerModeStateChanged(const bool enable) const; - void isLoginChenged(bool log) const; - void LicenseStateChanged(bool state); - void plymouthScaleChanged(int scale); - void plymouthThemeChanged(const QString &themeName); - -public Q_SLOTS: - void setBootDelay(bool bootDelay); - void setThemeEnabled(const bool enabled); - void setShowGrubEditAuth(const bool enabled); - void setGrubEditAuthEnabled(const bool enabled); - void setDefaultEntry(const QString &entry); - void setUpdating(bool updating); - void setUeProgram(const bool ueProgram); // for user experience program - void setDeveloperModeState(const bool state); - void setIsLogin(const bool log); - void setPlymouthScale(int scale); - void setPlymouthTheme(const QString &themeName); - -private: - bool m_bootDelay; - bool m_themeEnabled; - bool m_isShowGrubEditAuth = false; - bool m_grubEditAuthEnabled = false; - bool m_updating; - QStringList m_entryLists; - QString m_defaultEntry; - QPixmap m_background; - bool m_joinUeProgram; // for user experience program - bool m_developerModeState{false}; // for developer mode state - bool m_isLogin{false}; - bool m_activation; - int m_plymouthscale; - QString m_plymouththeme; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.cpp b/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.cpp deleted file mode 100644 index 0de84451ab..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.cpp +++ /dev/null @@ -1,201 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "commoninfoproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include -#include - -const QString &GrubService = QStringLiteral("org.deepin.dde.Grub2"); -const QString &GrubPath = QStringLiteral("/org/deepin/dde/Grub2"); -const QString &GrubInterface = QStringLiteral("org.deepin.dde.Grub2"); - -const QString &GrubThemePath = QStringLiteral("/org/deepin/dde/Grub2/Theme"); -const QString &GrubThemeInterface = QStringLiteral("org.deepin.dde.Grub2.Theme"); - -const QString &GrubEditAuthPath = QStringLiteral("/org/deepin/dde/Grub2/EditAuthentication"); -const QString &GrubEditAuthInterface = QStringLiteral("org.deepin.dde.Grub2.EditAuthentication"); - -const QString &DeepinIdService = QStringLiteral("com.deepin.deepinid"); -const QString &DeepinIdPath = QStringLiteral("/com/deepin/deepinid"); -const QString &DeepinIdInterface = QStringLiteral("com.deepin.deepinid"); - -const QString &LicenseService = QStringLiteral("com.deepin.license"); -const QString &LicensePath = QStringLiteral("/com/deepin/license/Info"); -const QString &LicenseInterface = QStringLiteral("com.deepin.license.Info"); - -const QString &UserexperienceService = QStringLiteral("com.deepin.userexperience.Daemon"); -const QString &UserexperiencePath = QStringLiteral("/com/deepin/userexperience/Daemon"); -const QString &UserexperienceInterface = QStringLiteral("com.deepin.userexperience.Daemon"); - -const QString &NotificationService = QStringLiteral("org.deepin.dde.Notification1"); -const QString &NotificationPath = QStringLiteral("/org/deepin/dde/Notification1"); -const QString &NotificationInterface = QStringLiteral("org.deepin.dde.Notification"); - -const QString &PlyMouthScaleService = QStringLiteral("org.deepin.dde.Daemon1"); -const QString &PlyMouthScalePath = QStringLiteral("/org/deepin/dde/Daemon1"); -const QString &PlyMouthScaleInterface = QStringLiteral("org.deepin.dde.Daemon1"); - -CommonInfoProxy::CommonInfoProxy(QObject *parent) - : QObject(parent) - , m_grubInter(new DDBusInterface(GrubService, GrubPath, GrubInterface, QDBusConnection::systemBus(), this)) - , m_grubThemeInter(new DDBusInterface(GrubService, GrubThemePath, GrubThemeInterface, QDBusConnection::systemBus(), this)) - , m_grubEditAuthInter(new DDBusInterface(GrubService, GrubEditAuthPath, GrubEditAuthInterface, QDBusConnection::systemBus(), this)) - , m_deepinIdInter(new DDBusInterface(DeepinIdService, DeepinIdPath, DeepinIdInterface, QDBusConnection::sessionBus(), this)) - , m_licenseInter(new DDBusInterface(LicenseService, LicensePath, LicenseInterface, QDBusConnection::systemBus(), this)) - , m_userexperienceInter(new DDBusInterface(UserexperienceService, UserexperiencePath, UserexperienceInterface, QDBusConnection::sessionBus(), this)) - , m_notificationInter(new DDBusInterface(NotificationService, NotificationPath, NotificationInterface, QDBusConnection::sessionBus(), this)) - , m_grubScaleInter(new DDBusInterface(PlyMouthScaleService, PlyMouthScalePath, PlyMouthScaleInterface, QDBusConnection::systemBus(), this)) -{ - // in this function, it will wait for 50 seconds finall return - m_grubScaleInter->setTimeout(50000); -} - -bool CommonInfoProxy::IsLogin() -{ - return qvariant_cast(m_deepinIdInter->property("IsLogin")); -} - -bool CommonInfoProxy::DeviceUnlocked() -{ - return qvariant_cast(m_deepinIdInter->property("DeviceUnlocked")); -} - -void CommonInfoProxy::UnlockDevice() -{ - m_deepinIdInter->asyncCall("UnlockDevice"); -} - -void CommonInfoProxy::Login() -{ - m_deepinIdInter->asyncCall("Login"); -} - -QStringList CommonInfoProxy::GetSimpleEntryTitles() -{ - QDBusReply reply = m_grubInter->call(QStringLiteral("GetSimpleEntryTitles")); - if (reply.isValid()) - return reply.value(); - return {}; -} - -bool CommonInfoProxy::EnableTheme() -{ - return qvariant_cast(m_grubInter->property("EnableTheme")); -} - -void CommonInfoProxy::setEnableTheme(const bool value) -{ - QDBusPendingCall call = m_grubInter->asyncCallWithArgumentList("SetEnableTheme", { value }); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT resetEnableTheme(); - } - watcher->deleteLater(); - }); -} - -bool CommonInfoProxy::Updating() -{ - return qvariant_cast(m_grubInter->property("Updating")); -} - -QString CommonInfoProxy::DefaultEntry() -{ - return qvariant_cast(m_grubInter->property("DefaultEntry")); -} - -void CommonInfoProxy::setDefaultEntry(const QString &entry) -{ - m_grubInter->asyncCallWithArgumentList("SetDefaultEntry", { entry }); -} - -uint CommonInfoProxy::Timeout() -{ - return qvariant_cast(m_grubInter->property("Timeout")); -} - -void CommonInfoProxy::setTimeout(const uint timeout) -{ - m_grubInter->asyncCallWithArgumentList("SetTimeout", { timeout }); -} - -QStringList CommonInfoProxy::EnabledUsers() -{ - return qvariant_cast(m_grubEditAuthInter->property("EnabledUsers")); -} - -void CommonInfoProxy::DisableUser(const QString &username) -{ - QDBusPendingCall call = m_grubEditAuthInter->asyncCallWithArgumentList("Disable", { username }); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT resetGrubEditAuthEnabled(); - } - watcher->deleteLater(); - }); -} - -void CommonInfoProxy::EnableUser(const QString &username, const QString &password) -{ - QDBusPendingCall call = m_grubEditAuthInter->asyncCallWithArgumentList("Enable", { username, password }); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - Q_EMIT resetGrubEditAuthEnabled(); - } - watcher->deleteLater(); - }); -} - -QDBusPendingCall CommonInfoProxy::SetScalePlymouth(int scale) -{ - return m_grubScaleInter->asyncCallWithArgumentList("ScalePlymouth", { scale }); -} - -QString CommonInfoProxy::Background() -{ - QDBusReply reply = m_grubThemeInter->call(QStringLiteral("GetBackground")); - if (reply.isValid()) - return reply.value(); - return QString(); -} - -void CommonInfoProxy::setBackground(const QString &name) -{ - m_grubThemeInter->asyncCallWithArgumentList("SetBackgroundSourceFile", { name }); -} - -int CommonInfoProxy::AuthorizationState() -{ - return qvariant_cast(m_licenseInter->property("AuthorizationState")); -} - -int CommonInfoProxy::LicenseState() -{ - return qvariant_cast(m_licenseInter->property("LicenseState")); -} - -void CommonInfoProxy::Enable(const bool value) -{ - m_userexperienceInter->asyncCallWithArgumentList("Enable", { value }); -} - -bool CommonInfoProxy::IsEnabled() -{ - QDBusReply reply = m_userexperienceInter->call(QStringLiteral("IsEnabled")); - if (reply.isValid()) - return reply.value(); - return false; -} - -void CommonInfoProxy::Notify(const QString &in0, const uint in1, const QString &in2, const QString &in3, const QString &in4, const QStringList &in5, const QVariantMap &in6, const int in7) -{ - m_notificationInter->asyncCall("Notify", in0, in1, in2, in3, in4, in5, in6, in7); -} diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.h b/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.h deleted file mode 100644 index 6bf89aebf8..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfoproxy.h +++ /dev/null @@ -1,100 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include -#include -#include - -using Dtk::Core::DDBusInterface; - -class CommonInfoProxy : public QObject -{ - Q_OBJECT -public: - explicit CommonInfoProxy(QObject *parent = nullptr); - - // deepin id - Q_PROPERTY(bool IsLogin READ IsLogin NOTIFY IsLoginChanged) - bool IsLogin(); - Q_PROPERTY(bool DeviceUnlocked READ DeviceUnlocked NOTIFY DeviceUnlockedChanged) - bool DeviceUnlocked(); - void UnlockDevice(); - void Login(); - - // grub2 - QStringList GetSimpleEntryTitles(); - Q_PROPERTY(bool EnableTheme READ EnableTheme WRITE setEnableTheme NOTIFY EnableThemeChanged) - bool EnableTheme(); - void setEnableTheme(const bool value); - Q_PROPERTY(bool Updating READ Updating NOTIFY UpdatingChanged) - bool Updating(); - Q_PROPERTY(QString DefaultEntry READ DefaultEntry WRITE setDefaultEntry NOTIFY DefaultEntryChanged) - QString DefaultEntry(); - void setDefaultEntry(const QString &entry); - Q_PROPERTY(uint Timeout READ Timeout WRITE setTimeout NOTIFY TimeoutChanged) - uint Timeout(); - void setTimeout(const uint timeout); - // grub2.EditAuth - Q_PROPERTY(QStringList EnabledUsers READ EnabledUsers NOTIFY EnabledUsersChanged) - QStringList EnabledUsers(); - void DisableUser(const QString &username); - void EnableUser(const QString &username, const QString &password); - // grub2.Theme - Q_PROPERTY(QString Background READ Background WRITE setBackground NOTIFY BackgroundChanged) - QString Background(); - void setBackground(const QString &name); - - // license - Q_PROPERTY(int AuthorizationState READ AuthorizationState NOTIFY AuthorizationStateChanged) - int AuthorizationState(); - Q_PROPERTY(int LicenseState READ LicenseState NOTIFY LicenseStateChanged) - int LicenseState(); - - // userexperience - void Enable(const bool value); - bool IsEnabled(); - - // notification - void Notify(const QString &in0, const uint in1, const QString &in2, const QString &in3, const QString &in4, - const QStringList &in5, const QVariantMap &in6, const int in7); - // groubScale - QDBusPendingCall SetScalePlymouth(int scale); - -Q_SIGNALS: // SIGNALS - // deepin id - void IsLoginChanged(const bool value); - void DeviceUnlockedChanged(const bool value); - // grub2 - void EnableThemeChanged(const bool value); - void UpdatingChanged(const bool value); - void DefaultEntryChanged(const QString &entry); - void TimeoutChanged(const uint value); - // grub2.EditAuth - void EnabledUsersChanged(const QStringList &users); - // grub2.Theme - void BackgroundChanged(); - - // license - void AuthorizationStateChanged(const int code); - void LicenseStateChanged(const int code); - - void DeepinIdError(const int code, const QString &msg); - - // reset signals - void resetEnableTheme(); - void resetGrubEditAuthEnabled(); - -private: - DDBusInterface *m_grubInter; - DDBusInterface *m_grubThemeInter; - DDBusInterface *m_grubEditAuthInter; - DDBusInterface *m_deepinIdInter; - DDBusInterface *m_licenseInter; - DDBusInterface *m_userexperienceInter; - DDBusInterface *m_notificationInter; - DDBusInterface *m_grubScaleInter; -}; diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfowork.cpp b/dcc-old/src/plugin-commoninfo/operation/commoninfowork.cpp deleted file mode 100644 index 14df7d8525..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfowork.cpp +++ /dev/null @@ -1,421 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "commoninfowork.h" -#include "commoninfomodel.h" -#include "commoninfoproxy.h" -#include "widgets/utils.h" - -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -Q_LOGGING_CATEGORY(DccCommonInfoWork, "dcc-commoninfo-work"); - -std::mutex SCALE_SETTING_GUARD; - -static const QString PlyMouthConf = QStringLiteral("/etc/plymouth/plymouthd.conf"); - -using namespace DCC_NAMESPACE; - -const QString &GRUB_EDIT_AUTH_ACCOUNT("root"); - -const QStringList &SYSTEM_LOCAL_LIST { - "zh_CN", - "zh_HK", - "zh_TW", - "ug_CN", // 维语 - "bo_CN" // 藏语 -}; - -const QMap &SYSTEM_LOCAL_MAP { - {"zh_CN", "zh_CN"}, - {"zh_HK", "zh_HK"}, - {"zh_TW", "zh_TW"}, -}; - -static const QString getLicensePath(const QString &filePath, const QString &type) -{ - const QString& locale { QLocale::system().name() }; - QString lang = SYSTEM_LOCAL_LIST.contains(locale) ? locale : "en_US"; - - QString path = QString(filePath).arg(lang).arg(type); - if (QFile(path).exists()) - return path; - else - return QString(filePath).arg("en_US").arg(type); - -} - -static QString getUserExpContent() -{ - QString userExpContent = getLicensePath("/usr/share/protocol/userexperience-agreement/User-Experience-Program-License-Agreement-CN-%1.md", ""); - if (DSysInfo::isCommunityEdition()) { - userExpContent = getLicensePath("/usr/share/deepin-deepinid-client/privacy/User-Experience-Program-License-Agreement-Community/User-Experience-Program-License-Agreement-CN-%1.md", ""); - return userExpContent; - } - QFile newfile(userExpContent); - if (false == newfile.exists()) { - userExpContent = getLicensePath("/usr/share/deepin-deepinid-client/privacy/User-Experience-Program-License-Agreement/User-Experience-Program-License-Agreement-CN-%1.md", ""); - QFile file(userExpContent); - if (false == file.exists()) { - userExpContent = getLicensePath("/usr/share/deepin-deepinid-client/privacy/User-Experience-Program-License-Agreement-%1.md", ""); - } - } - return userExpContent; -} - -static const QString getDevelopModeLicense(const QString &filePath, const QString &type) -{ - const QString& locale { QLocale::system().name() }; - QString lang; - if (SYSTEM_LOCAL_MAP.keys().contains(locale)) { - lang = { SYSTEM_LOCAL_MAP.value(QLocale::system().name(), "en_US") }; - } - - if (lang.isEmpty()) { - lang = { SYSTEM_LOCAL_MAP.value(QLocale::system().name(), "en_US") }; - } - - QString path = QString(filePath).arg(lang).arg(type); - QFile license(path); - if (!license.open(QIODevice::ReadOnly)) - return QString(); - - const QByteArray buf = license.readAll(); - license.close(); - - return buf; -} - -static void notifyInfo(const QString &summary) -{ - DUtil::DNotifySender(summary) - .appIcon("dde-control-center") - .appName(QObject::tr("dde-control-center")) - .timeOut(5000) - .call(); -} - -static void notifyInfoWithBody(const QString &summary, const QString &body) -{ - DUtil::DNotifySender(summary) - .appIcon("dde-control-center") - .appName(QObject::tr("dde-control-center")) - .appBody(body) - .timeOut(5000) - .call(); -} - -CommonInfoWork::CommonInfoWork(CommonInfoModel *model, QObject *parent) - : QObject(parent) - , m_commomModel(model) - , m_commonInfoProxy(new CommonInfoProxy(this)) - , m_title("") - , m_content("") - , m_scaleIsSetting(false) -{ - //监听开发者在线认证失败的错误接口信息 - connect(m_commonInfoProxy, &CommonInfoProxy::DeepinIdError, this, &CommonInfoWork::deepinIdErrorSlot); - connect(m_commonInfoProxy, &CommonInfoProxy::IsLoginChanged, m_commomModel, &CommonInfoModel::setIsLogin); - connect(m_commonInfoProxy, &CommonInfoProxy::DeviceUnlockedChanged, m_commomModel, &CommonInfoModel::setDeveloperModeState); - connect(m_commonInfoProxy, &CommonInfoProxy::DefaultEntryChanged, m_commomModel, &CommonInfoModel::setDefaultEntry); - connect(m_commonInfoProxy, &CommonInfoProxy::EnableThemeChanged, m_commomModel, &CommonInfoModel::setThemeEnabled); - connect(m_commonInfoProxy, &CommonInfoProxy::TimeoutChanged, m_commomModel, [this] (const uint timeout) { - m_commomModel->setBootDelay(timeout > 1); - }); - connect(m_commonInfoProxy, &CommonInfoProxy::UpdatingChanged, m_commomModel, &CommonInfoModel::setUpdating); - connect(m_commonInfoProxy, &CommonInfoProxy::BackgroundChanged, m_commomModel, [this] () { - QPixmap pix = QPixmap(m_commonInfoProxy->Background()); - m_commomModel->setBackground(pix); - }); - connect(m_commonInfoProxy, &CommonInfoProxy::EnabledUsersChanged, m_commomModel, [this] (const QStringList &users) { - m_commomModel->setGrubEditAuthEnabled(users.contains(GRUB_EDIT_AUTH_ACCOUNT)); - }); - connect(m_commonInfoProxy, &CommonInfoProxy::AuthorizationStateChanged, m_commomModel, [this] (const int code) { - m_commomModel->setActivation(code == 1 || code == 3); - }); - - connect(m_commonInfoProxy, &CommonInfoProxy::resetEnableTheme, this, [=](){ - m_commomModel->themeEnabledChanged(m_commomModel->themeEnabled()); - }); - - connect(m_commonInfoProxy, &CommonInfoProxy::resetGrubEditAuthEnabled, this, [=](){ - m_commomModel->grubEditAuthEnabledChanged(m_commomModel->grubEditAuthEnabled()); - }); -} - -CommonInfoWork::~CommonInfoWork() -{ - if (m_process) { - //如果控制中心被强制关闭,需要用kill来杀掉没有被关闭的窗口 - kill(static_cast<__pid_t>(m_process->processId()), 15); - m_process->deleteLater(); - m_process = nullptr; - } -} - -void CommonInfoWork::active() -{ - m_commomModel->setShowGrubEditAuth(true); - m_commomModel->setIsLogin(m_commonInfoProxy->IsLogin()); - m_commomModel->setDeveloperModeState(m_commonInfoProxy->DeviceUnlocked()); - m_commomModel->setThemeEnabled(m_commonInfoProxy->EnableTheme()); - m_commomModel->setBootDelay(m_commonInfoProxy->Timeout() > 1); - m_commomModel->setGrubEditAuthEnabled(m_commonInfoProxy->EnabledUsers().contains(GRUB_EDIT_AUTH_ACCOUNT)); - m_commomModel->setUpdating(m_commonInfoProxy->Updating()); - auto [factor, themeName] = getPlyMouthInformation(); - m_commomModel->setPlymouthScale(factor); - m_commomModel->setPlymouthTheme(themeName); - auto AuthorizationState = m_commonInfoProxy->AuthorizationState(); - m_commomModel->setActivation(AuthorizationState == 1 || AuthorizationState == 3); - m_commomModel->setUeProgram(m_commonInfoProxy->IsEnabled()); - m_commomModel->setEntryLists(m_commonInfoProxy->GetSimpleEntryTitles()); - m_commomModel->setDefaultEntry(m_commonInfoProxy->DefaultEntry()); - - QPixmap pix = QPixmap(m_commonInfoProxy->Background()); - m_commomModel->setBackground(pix); -} - -void CommonInfoWork::setBootDelay(bool value) -{ - qDebug()<<" CommonInfoWork::setBootDelay value = "<< value; - m_commonInfoProxy->setTimeout(value ? 5 : 1); -} - -void CommonInfoWork::setEnableTheme(bool value) -{ - m_commonInfoProxy->setEnableTheme(value); -} - -void CommonInfoWork::disableGrubEditAuth() -{ - m_commonInfoProxy->DisableUser(GRUB_EDIT_AUTH_ACCOUNT); -} - -void CommonInfoWork::onSetGrubEditPasswd(const QString &password, const bool &isReset) -{ - Q_UNUSED(isReset); - // 密码加密后发送到后端存储 - m_commonInfoProxy->EnableUser(GRUB_EDIT_AUTH_ACCOUNT, passwdEncrypt(password)); -} - -void CommonInfoWork::setDefaultEntry(const QString &entry) -{ - m_commonInfoProxy->setDefaultEntry(entry); -} - -void CommonInfoWork::setBackground(const QString &path) -{ - m_commonInfoProxy->setBackground(path); -} - -void CommonInfoWork::setUeProgram(bool enabled) -{ - QString current_date = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm::ss.zzz"); - if (enabled) { - qInfo("suser opened experience project switch."); - // 打开license-dialog必要的三个参数:标题、license文件路径、checkBtn的Text - QString allowContent(tr("Agree and Join User Experience Program")); - - // license路径 - m_content = getUserExpContent(); - - m_process = new QProcess(this); - - auto pathType = "-c"; - if (!SYSTEM_LOCAL_LIST.contains(QLocale::system().name())) - pathType = "-e"; - m_process->start("dde-license-dialog", - QStringList() << "-t" << m_title << pathType << m_content << "-a" << allowContent); - qDebug()<<" Deliver content QStringList() = "<<"dde-license-dialog" - << "-t" << m_title << pathType << m_content << "-a" << allowContent; - connect(m_process, static_cast(&QProcess::finished), this, [=](int result) { - if (96 == result) { - m_commonInfoProxy->Enable(enabled); - m_commomModel->setUeProgram(enabled); - } else { - m_commomModel->setUeProgram(!enabled); - qInfo() << QString("On %1, users cancel the switch to join the user experience program!").arg(current_date); - } - m_process->deleteLater(); - m_process = nullptr; - }); - } else { - m_commonInfoProxy->Enable(enabled); - m_commomModel->setUeProgram(enabled); - } -} - -void CommonInfoWork::closeUeProgram() -{ - if (m_process) { - m_process->kill(); - } -} - -void CommonInfoWork::setEnableDeveloperMode(bool enabled) -{ - QDateTime current_date_time = QDateTime::currentDateTime(); - QString current_date = current_date_time.toString("yyyy-MM-dd hh:mm::ss.zzz"); - - if (!enabled) - return; - // 打开license-dialog必要的三个参数:标题、license文件路径、checkBtn的Text - QString title(tr("The Disclaimer of Developer Mode")); - QString allowContent(tr("Agree and Request Root Access")); - - // license内容 - QString content = getDevelopModeLicense(":/systeminfo/license/deepin-end-user-license-agreement_developer_community_%1.txt", ""); - QString contentPath = QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation).append("tmpDeveloperMode.txt");// 临时存储路径 - QFile *contentFile = new QFile(contentPath); - // 如果文件不存在,则创建文件 - if (!contentFile->exists()) { - contentFile->open(QIODevice::WriteOnly); - contentFile->close(); - } - // 写入文件内容 - if (!contentFile->open(QFile::ReadWrite | QIODevice::Text | QIODevice::Truncate)) - return; - contentFile->write(content.toLocal8Bit()); - contentFile->close(); - - auto pathType = "-c"; - QStringList sl; - sl << "zh_CN" << "zh_TW"; - if (!sl.contains(QLocale::system().name())) - pathType = "-e"; - - m_process = new QProcess(this); - m_process->start("dde-license-dialog", QStringList() << "-t" << title << pathType << contentPath << "-a" << allowContent); - - connect(m_process, static_cast(&QProcess::finished), this, [=](int result) { - if (96 == result) { - m_commonInfoProxy->UnlockDevice(); - } else { - qInfo() << QString("On %1, Remove developer mode Disclaimer!").arg(current_date); - } - contentFile->remove(); - contentFile->deleteLater(); - m_process->deleteLater(); - m_process = nullptr; - }); -} - -void CommonInfoWork::login() -{ - m_commonInfoProxy->Login(); -} - -QString CommonInfoWork::passwdEncrypt(const QString &password) -{ - const QString &pbkdf2_cmd(R"(echo -e "%1\n%2\n"| grub-mkpasswd-pbkdf2 | grep PBKDF2 | awk '{print $4}')"); - QProcess pbkdf2; - pbkdf2.start("bash", {"-c", pbkdf2_cmd.arg(password).arg(password)}); - pbkdf2.waitForFinished(); - QString pwdOut = pbkdf2.readAllStandardOutput(); - pwdOut[pwdOut.length() - 1] = '\0'; - return pwdOut; -} - -std::pair CommonInfoWork::getPlyMouthInformation() -{ - QSettings settings(PlyMouthConf, QSettings::IniFormat); - - QString themeName = settings.value("Daemon/Theme").toString(); - - static QStringList ScaleLowDpiThemeNames = {"deepin-logo", "deepin-ssd-logo", "uos-ssd-logo"}; - static QStringList ScaleHighDpiThemeNames = {"deepin-hidpi-logo", "deepin-hidpi-ssd-logo", "uos-hidpi-ssd-logo"}; - if (ScaleLowDpiThemeNames.contains(themeName)) { - return {1, themeName}; - } else if (ScaleHighDpiThemeNames.contains(themeName)) { - return {2, themeName}; - } - - return {0, QString()}; -} - -void CommonInfoWork::deepinIdErrorSlot(int code, const QString &msg) -{ - Q_UNUSED(code); - - //初始化Notify 七个参数 - QString in0(QObject::tr("dde-control-center")); - uint in1 = 101; - QString in2("preferences-system"); - QString in3(""); - QString in4(""); - QStringList in5; - QVariantMap in6; - int in7 = 5000; - - //截取error接口 1001:未导入证书 1002:未登录 1003:无法获取硬件信息 1004:网络异常 1005:证书加载失败 1006:签名验证失败 1007:文件保存失败 - QString msgcode = msg; - msgcode = msgcode.split(":").at(0); - if (msgcode == "1001") { - in3 = tr("Failed to get root access"); - } else if (msgcode == "1002") { - in3 = tr("Please sign in to your Union ID first"); - } else if (msgcode == "1003") { - in3 = tr("Cannot read your PC information"); - } else if (msgcode == "1004") { - in3 = tr("No network connection"); - } else if (msgcode == "1005") { - in3 = tr("Certificate loading failed, unable to get root access"); - } else if (msgcode == "1006") { - in3 = tr("Signature verification failed, unable to get root access"); - } else if (msgcode == "1007") { - in3 = tr("Failed to get root access"); - } - //系统通知 认证失败 无法进入开发模式 - m_commonInfoProxy->Notify(in0, in1, in2, in3, in4, in5, in6, in7); -} - -void CommonInfoWork::setPlymouthFactor(int factor) -{ - if (factor == m_commomModel->plymouthScale()) { - return; - } - if (m_scaleIsSetting) { - return; - } - std::lock_guard guard(SCALE_SETTING_GUARD); - m_scaleIsSetting = true; - QDBusPendingCall call = m_commonInfoProxy->SetScalePlymouth(factor); - notifyInfo(tr("Start setting the new boot animation, please wait for a minute")); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [this, watcher, call] { - if (call.isError()) { - qCWarning(DccCommonInfoWork) << "DBus Error: " << call.error(); - } - auto [factor, themeName] = getPlyMouthInformation(); - m_commomModel->setPlymouthTheme(themeName); - m_commomModel->setPlymouthScale(factor); - notifyInfoWithBody(tr("Setting new boot animation finished"), - tr("The settings will be applied after rebooting the system")); - m_scaleIsSetting = false; - watcher->deleteLater(); - Q_EMIT settingScaling(false); - }); - Q_EMIT settingScaling(true); -} - -QPixmap CommonInfoWork::getPlymouthFilePixmap() -{ - QString theme = m_commomModel->plymouthTheme(); - - static QString ThemePath = "/usr/share/plymouth/themes"; - - QString logoPath = ThemePath + QDir::separator() + theme + QDir::separator() + "logo.png"; - - return QPixmap(logoPath); -} diff --git a/dcc-old/src/plugin-commoninfo/operation/commoninfowork.h b/dcc-old/src/plugin-commoninfo/operation/commoninfowork.h deleted file mode 100644 index 8cfd7da99e..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/commoninfowork.h +++ /dev/null @@ -1,56 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include - -class QProcess; -class CommonInfoProxy; - -namespace DCC_NAMESPACE { - -class CommonInfoModel; - -class CommonInfoWork : public QObject -{ - Q_OBJECT -public: - explicit CommonInfoWork(CommonInfoModel *model, QObject *parent = nullptr); - virtual ~CommonInfoWork(); - - void active(); - QPixmap getPlymouthFilePixmap(); - bool isSettingPlymouth() { return m_scaleIsSetting; } - -public Q_SLOTS: - void setBootDelay(bool value); - void setEnableTheme(bool value); - void setDefaultEntry(const QString &entry); - void disableGrubEditAuth(); - void onSetGrubEditPasswd(const QString &password, const bool &isReset); - void setBackground(const QString &path); - void setUeProgram(bool enabled); - void closeUeProgram(); - void setEnableDeveloperMode(bool enabled); - void login(); - void deepinIdErrorSlot(int code, const QString &msg); - void setPlymouthFactor(int factor); - -Q_SIGNALS: - void settingScaling(bool); - -private: - QString passwdEncrypt(const QString &password); - std::pair getPlyMouthInformation(); - -private: - CommonInfoModel *m_commomModel; - CommonInfoProxy *m_commonInfoProxy; - QProcess *m_process = nullptr; - QString m_title; - QString m_content; - bool m_scaleIsSetting; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/operation/qrc/commoninfo.qrc b/dcc-old/src/plugin-commoninfo/operation/qrc/commoninfo.qrc deleted file mode 100644 index 2e37b8fe79..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/qrc/commoninfo.qrc +++ /dev/null @@ -1,6 +0,0 @@ - - - icons/dcc_nav_commoninfo_42px.svg - icons/dcc_nav_commoninfo_84px.svg - - diff --git a/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_42px.svg b/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_42px.svg deleted file mode 100644 index 2cab53d7d2..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_42px.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - dcc_nav_commoninfo_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_84px.svg b/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_84px.svg deleted file mode 100644 index 93698a3275..0000000000 --- a/dcc-old/src/plugin-commoninfo/operation/qrc/icons/dcc_nav_commoninfo_84px.svg +++ /dev/null @@ -1,42 +0,0 @@ - - - dcc_nav_commoninfo_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-commoninfo/window/CommonInfoPlugin.json b/dcc-old/src/plugin-commoninfo/window/CommonInfoPlugin.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/CommonInfoPlugin.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-commoninfo/window/bootwidget.cpp b/dcc-old/src/plugin-commoninfo/window/bootwidget.cpp deleted file mode 100644 index 92e8e69a7a..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/bootwidget.cpp +++ /dev/null @@ -1,435 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "bootwidget.h" -#include "commonbackgrounditem.h" - -#include "pwqualitymanager.h" -#include "src/plugin-commoninfo/operation/commoninfomodel.h" -#include "src/frame/utils.h" - -#include "widgets/switchwidget.h" -#include "widgets/settingsgroup.h" - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - - -Q_LOGGING_CATEGORY(DccCommonInfoBoot, "dcc-commoninfo-bootwidget"); - -Q_DECLARE_METATYPE(QMargins) - -const QMargins ListViewItemMargin(10, 8, 10, 8); -const QVariant VListViewItemMargin = QVariant::fromValue(ListViewItemMargin); - -constexpr static int LISTVIEW_ITEM_SPACING = 3; -constexpr static int LISTVIEW_ITEM_HEIGHT = 32; -constexpr static int LISTVIEW_ITEM_HEIGHT_WITH_SPACING = LISTVIEW_ITEM_SPACING + LISTVIEW_ITEM_HEIGHT; -constexpr static int LISTVIEW_MAX_HEIGHT = 350; -constexpr static int MAX_BACKGROUND_HEIGHT = LISTVIEW_MAX_HEIGHT + LISTVIEW_ITEM_HEIGHT_WITH_SPACING; - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE - -BootWidget::BootWidget(QWidget *parent) - : QWidget(parent) - , m_isCommoninfoBootWallpaperConfigValid(!QSysInfo::currentCpuArchitecture().contains("arm")) -{ - QVBoxLayout *layout = new QVBoxLayout; - setLayout(layout); - SettingsGroup *groupOther = new SettingsGroup; - groupOther->getLayout()->setContentsMargins(0, 0, 0, 0); - - m_listLayout = new QVBoxLayout; - m_listLayout->addSpacing(10); - m_listLayout->setMargin(0); - - m_bootList = new CommonInfoListView(this); - m_bootList->setAccessibleName("List_bootlist"); - m_bootList->setAutoScroll(false); - m_bootList->setFrameShape(QFrame::NoFrame); - m_bootList->setDragDropMode(QListView::DragDrop); - m_bootList->setDefaultDropAction(Qt::MoveAction); - m_bootList->setAutoFillBackground(false); - m_bootList->setDragEnabled(false); - m_bootList->verticalScrollBar()->setContextMenuPolicy(Qt::NoContextMenu); - m_bootList->setSelectionMode(DListView::NoSelection); - m_bootList->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_bootList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_bootList->setVerticalScrollBarPolicy(Qt::ScrollBarAsNeeded); - m_bootList->setMinimumWidth(240); - m_bootList->setItemSpacing(LISTVIEW_ITEM_SPACING); - - QSize itemSize = m_bootList->itemSize(); - itemSize.setHeight(LISTVIEW_ITEM_HEIGHT); - m_bootList->setItemSize(itemSize); - - m_bootList->setMaxShowHeight(LISTVIEW_MAX_HEIGHT); - m_bootList->setWordWrap(true); - - DPalette dp = DPaletteHelper::instance()->palette(m_bootList); - dp.setColor(DPalette::Text, QColor(255, 255, 255)); - DPaletteHelper::instance()->setPalette(m_bootList, dp); - - m_updatingLabel = new QLabel(tr("Updating..."), this); - m_updatingLabel->setVisible(false); - - DPalette dpLabel = DPaletteHelper::instance()->palette(m_updatingLabel); - dpLabel.setColor(DPalette::Text, QColor(255, 255, 255)); - DPaletteHelper::instance()->setPalette(m_updatingLabel, dpLabel); - m_listLayout->addWidget(m_updatingLabel, 0, Qt::AlignHCenter | Qt::AlignBottom); - - m_background = new CommonBackgroundItem(this); - m_background->setLayout(m_listLayout); - - m_bootDelay = new SwitchWidget(this); - m_bootDelay->setTitle(tr("Startup Delay")); - m_theme = new SwitchWidget(this); - m_theme->setTitle(tr("Theme")); - - QMap mapBackgroundMessage; - mapBackgroundMessage[true] = tr("Click the option in boot menu to set it as the first boot, and drag and drop a picture to change the background"); - mapBackgroundMessage[false] = tr("Click the option in boot menu to set it as the first boot"); - DTipLabel *backgroundLabel = new DTipLabel(mapBackgroundMessage[false], this); - backgroundLabel->setText(mapBackgroundMessage[true]); - backgroundLabel->setWordWrap(true); - backgroundLabel->setContentsMargins(0, 0, 0, 0); - backgroundLabel->setAlignment(Qt::AlignLeft); - m_themeLbl = new DTipLabel(tr("Switch theme on to view it in boot menu"), this); - m_themeLbl->setAccessibleName("themeLbl"); - m_themeLbl->setWordWrap(true); - m_themeLbl->setContentsMargins(0, 0, 0, 0); - m_themeLbl->setAlignment(Qt::AlignLeft); - groupOther->appendItem(m_bootDelay); - groupOther->setSpacing(10); - groupOther->appendItem(m_theme); - groupOther->setSpacing(10); - layout->setMargin(0); - layout->addSpacing(10); - layout->addWidget(m_background); - layout->addSpacing(10); - layout->addWidget(backgroundLabel); - layout->addSpacing(10); - layout->addWidget(groupOther); - layout->addWidget(m_themeLbl); - - if (!m_isCommoninfoBootWallpaperConfigValid) { - m_theme->setVisible(false); - m_themeLbl->setVisible(false); - } - - m_grubVerification = new SwitchWidget(this); - m_grubVerification->setTitle(tr("GRUB Authentication")); - m_grubVerification->addBackground(); - layout->addSpacing(10); - layout->addWidget(m_grubVerification); - - m_grubVerifyLbl = new DTipLabel(tr("GRUB password is required to edit its configuration"), this); - m_grubVerifyLbl->setAccessibleName("grubVerifyLbl"); - m_grubVerifyLbl->setWordWrap(true); - m_grubVerifyLbl->setAlignment(Qt::AlignLeft); - QHBoxLayout *hLayout = new QHBoxLayout; - layout->addLayout(hLayout); - hLayout->addWidget(m_grubVerifyLbl, 1); - m_grubModifyPasswdLink = new DCommandLinkButton(tr("Change Password"), this); - m_grubModifyPasswdLink->hide(); - hLayout->addWidget(m_grubModifyPasswdLink, 0); - hLayout->setContentsMargins(0, 0, 0, 0); - layout->addStretch(); - layout->setContentsMargins(0, 10, 0, 10); - setWindowTitle(tr("Boot Menu")); - - if (IS_COMMUNITY_SYSTEM) { - m_grubVerification->hide(); - m_grubVerifyLbl->hide(); - } - - connect(m_theme, &SwitchWidget::checkedChanged, this, &BootWidget::enableTheme); - connect(m_bootDelay, &SwitchWidget::checkedChanged, this, &BootWidget::bootdelay); - connect(m_bootList, &DListView::clicked, this ,&BootWidget::onCurrentItem); - connect(m_background, &CommonBackgroundItem::requestEnableTheme, this, &BootWidget::enableTheme); - connect(m_background, &CommonBackgroundItem::requestSetBackground, this, &BootWidget::requestSetBackground); - - m_background->setThemeEnable(m_isCommoninfoBootWallpaperConfigValid); - backgroundLabel->setText(mapBackgroundMessage[m_isCommoninfoBootWallpaperConfigValid]); - // 修改grub密码 - connect(m_grubVerification, &SwitchWidget::checkedChanged, this, &BootWidget::enableGrubEditAuth); - connect(m_grubModifyPasswdLink, &DCommandLinkButton::clicked, this, [this]{ - showGrubEditAuthPasswdDialog(true); - }); -} - -BootWidget::~BootWidget() -{ -} - -void BootWidget::setDefaultEntry(const QString &value) -{ - m_defaultEntry = value; - - blockSignals(true); - int row_count = m_bootItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_bootItemModel->item(i, 0); - if (item->text() == value) { - m_curSelectedIndex = item->index(); - item->setCheckState(Qt::CheckState::Checked); - } else { - item->setCheckState(Qt::CheckState::Unchecked); - } - } - blockSignals(false); -} - -void BootWidget::setModel(CommonInfoModel *model) -{ - m_commonInfoModel = model; - - connect(model, &CommonInfoModel::bootDelayChanged, m_bootDelay, &SwitchWidget::setChecked); - connect(model, &CommonInfoModel::themeEnabledChanged, m_theme, &SwitchWidget::setChecked); - connect(model, &CommonInfoModel::defaultEntryChanged, this, &BootWidget::setDefaultEntry); - connect(model, &CommonInfoModel::updatingChanged, m_updatingLabel, &QLabel::setVisible); - connect(model, &CommonInfoModel::entryListsChanged, this, &BootWidget::setEntryList); - connect(model, &CommonInfoModel::themeEnabledChanged, this, [&](const bool _t1) { - if (m_isCommoninfoBootWallpaperConfigValid) { - m_background->setThemeEnable(_t1); - m_background->updateBackground(m_commonInfoModel->background()); - } - }); - connect(model, &CommonInfoModel::backgroundChanged, m_background, &CommonBackgroundItem::updateBackground); - - // modified by wuchuanfei 20190909 for 8613 - m_bootDelay->setChecked(model->bootDelay()); - m_theme->setChecked(model->themeEnabled()); - m_updatingLabel->setVisible(model->updating()); - m_background->setThemeEnable(model->themeEnabled() && m_isCommoninfoBootWallpaperConfigValid); - - setEntryList(model->entryLists()); - setDefaultEntry(model->defaultEntry()); - - if(m_isCommoninfoBootWallpaperConfigValid) - m_background->updateBackground(model->background()); - - m_grubVerification->setChecked(m_commonInfoModel->grubEditAuthEnabled()); - m_grubModifyPasswdLink->setVisible(m_commonInfoModel->isShowGrubEditAuth() && m_grubVerification->checked()); - connect(model, &CommonInfoModel::grubEditAuthEnabledChanged, this, [&](const bool &value) { - // from CommonInfoWork::onEnabledUsersChanged - m_grubVerification->setChecked(value); - m_grubModifyPasswdLink->setVisible(m_commonInfoModel->isShowGrubEditAuth() && value); - }); - - connect(m_grubVerification, &SwitchWidget::checkedChanged, this, [&](const bool &value){ - Q_UNUSED(value); - m_grubModifyPasswdLink->setVisible(m_commonInfoModel->isShowGrubEditAuth() && m_grubVerification->checked()); - }); -} - -void BootWidget::setEntryList(const QStringList &list) -{ - m_bootItemModel = new QStandardItemModel(this); - m_bootList->setModel(m_bootItemModel); - - for (int i = 0; i < list.count(); i++) { - const QString entry = list.at(i); - - DStandardItem *item = new DStandardItem(); - item->setText(entry); - item->setCheckable(false); // for Bug 2449 - item->setData(VListViewItemMargin, Dtk::MarginsRole); - - m_bootItemModel->appendRow(item); - - if (m_defaultEntry == entry) { - m_curSelectedIndex = item->index(); - item->setCheckState(Qt::CheckState::Checked); - } else { - item->setCheckState(Qt::CheckState::Unchecked); - } - } - - setBootList(); -} - -void BootWidget::setBootList() -{ - int cout = m_bootList->count(); - int height = (cout + 2) * LISTVIEW_ITEM_HEIGHT; - - m_listLayout->addWidget(m_bootList, Qt::AlignCenter); - m_listLayout->addSpacing(15); - m_background->setFixedHeight(std::min(height + LISTVIEW_ITEM_HEIGHT , MAX_BACKGROUND_HEIGHT)); -} - -void BootWidget::onCurrentItem(const QModelIndex &curIndex) -{ - QString curText = curIndex.data().toString(); - if (curText.isEmpty()) - return; - - // 获取当前被选项 - QString selectedText = m_curSelectedIndex.data().toString(); - - qCDebug(DccCommonInfoBoot) << "current text" << curText << "selectedText" << selectedText; - // NOTE: If the type of current selected boot entry is submenu whitch is not shown in current boot list, do not care, and do the set action - if (curText != selectedText) { - qCInfo(DccCommonInfoBoot) << "start to set first menu to "<< curText; - Q_EMIT defaultEntry(curText); - } -} - -void BootWidget::onGrubEditAuthCancel(bool toEnable) -{ - m_grubVerification->setChecked(toEnable); - m_grubModifyPasswdLink->setVisible(m_commonInfoModel->isShowGrubEditAuth() && toEnable); -} - -void BootWidget::setGrubEditAuthVisible(bool show) -{ - if (!show) { - m_grubModifyPasswdLink->hide(); - } - bool isShow = (!IS_COMMUNITY_SYSTEM) && show; - m_grubVerifyLbl->setVisible(isShow); - m_grubVerification->setVisible(isShow); -} - -void BootWidget::showGrubEditAuthPasswdDialog(bool isReset) -{ - if (m_grubEditAuthDialog) { - return; - } - m_grubEditAuthDialog = new DDialog(tr("Change GRUB password"), nullptr, nullptr); - m_grubEditAuthDialog->setIcon(DStyle().standardIcon(DStyle::SP_MessageBoxWarning)); - // 需要重新布局 - DWidget *widget = new DWidget; - QGridLayout *grid = new QGridLayout(widget); - DLabel *usernameLabel = new DLabel(tr("Username:")); - DLabel *rootLabel = new DLabel(tr("root")); - DLabel *label1 = new DLabel(tr("New password:")); - DLabel *label2 = new DLabel(tr("Repeat password:")); - DPasswordEdit *edit1 = new DPasswordEdit(); - DPasswordEdit *edit2 = new DPasswordEdit(); - edit1->setPlaceholderText(tr("Required")); - edit2->setPlaceholderText(tr("Required")); - edit1->setCutEnabled(false); - edit1->setCopyEnabled(false); - edit2->setCutEnabled(false); - edit2->setCopyEnabled(false); - grid->addWidget(usernameLabel, 0, 0, 1, 1); - grid->addWidget(rootLabel, 0, 1, 1, 1); - grid->addWidget(label1, 1, 0, 1, 1); - grid->addWidget(edit1, 1, 1, 1, 1); - grid->addWidget(label2, 2, 0, 1, 1); - grid->addWidget(edit2, 2, 1, 1, 1); - grid->setRowMinimumHeight(0, 40); - grid->setMargin(0); - m_grubEditAuthDialog->addContent(widget); - m_grubEditAuthDialog->addButton(tr("Cancel", "button"), false, DDialog::ButtonNormal); - m_grubEditAuthDialog->addButton(tr("Confirm", "button"), true, DDialog::ButtonRecommend); - - QList buttons = m_grubEditAuthDialog->getButtons(); - buttons[1]->setEnabled(false); - - QObject::connect(edit1, &DPasswordEdit::textChanged, [edit1, edit2, buttons](const QString &text){ - if (text.isEmpty()) { - buttons[1]->setEnabled(false); - if (!edit2->text().isEmpty()) { - edit1->setAlert(true); - edit1->showAlertMessage(tr("Password cannot be empty")); - } - return; - } - // "root" 是设置/修改 grub 密码默认的账户, 同 GRUB_EDIT_AUTH_ACCOUNT - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword("", edit1->lineEdit()->text(), PwqualityManager::CheckType::Grub2); - if (error != PwqualityManager::ERROR_TYPE::PW_NO_ERR) { - edit1->showAlertMessage(PwqualityManager::instance()->getErrorTips(error, PwqualityManager::CheckType::Grub2)); - buttons[1]->setEnabled(false); - edit1->setAlert(true); - } else { - if (!edit2->text().isEmpty() && text != edit2->text()) { - edit1->setAlert(true); - edit1->showAlertMessage(tr("Passwords do not match")); - } - bool isAlert = text != edit2->text() && !edit2->text().isEmpty(); - if (!isAlert) { - edit1->hideAlertMessage(); - edit2->hideAlertMessage(); - edit2->setAlert(false); - } - edit1->setAlert(isAlert); - buttons[1]->setEnabled(!isAlert && text == edit2->text()); - } - }); - QObject::connect(edit2, &DPasswordEdit::textChanged, [edit1, edit2, buttons](const QString &text){ - if (text.isEmpty()) { - buttons[1]->setEnabled(false); - if (!edit1->text().isEmpty()) { - edit2->setAlert(true); - edit2->showAlertMessage(tr("Password cannot be empty")); - } - return; - } - PwqualityManager::ERROR_TYPE error = PwqualityManager::instance()->verifyPassword("", text, PwqualityManager::CheckType::Grub2); - if (error != PwqualityManager::ERROR_TYPE::PW_NO_ERR) { - edit2->showAlertMessage(PwqualityManager::instance()->getErrorTips(error, PwqualityManager::CheckType::Grub2)); - buttons[1]->setEnabled(false); - edit2->setAlert(true); - return; - } - - if (text != edit1->text()) { - edit2->showAlertMessage(tr("Passwords do not match")); - } - - bool isValid = !edit1->text().isEmpty() && text == edit1->text(); - edit2->setAlert(!isValid); - if (isValid) { - edit1->hideAlertMessage(); - edit2->hideAlertMessage(); - edit1->setAlert(false); - } - buttons[1]->setEnabled(isValid); - }); - - QObject::connect(m_grubEditAuthDialog, &DDialog::buttonClicked, [=](int index){ - if (index == 1) { - // 需要将密码发送后在worker里加密 - Q_EMIT setGrubEditPasswd(edit1->text(), isReset); - } else { - if (!isReset) { - m_grubVerification->setChecked(false); - } - } - }); - QObject::connect(m_grubEditAuthDialog, &DDialog::closed, [=](){ - if (!isReset) { - m_grubVerification->setChecked(false); - } - }); - m_grubEditAuthDialog->exec(); - m_grubEditAuthDialog->deleteLater(); - m_grubEditAuthDialog = nullptr; -} - -void BootWidget::resizeEvent(QResizeEvent *event) -{ - auto w = event->size().width(); - m_listLayout->setContentsMargins(static_cast(w * 0.2), 0, static_cast(w * 0.2), 0); -} diff --git a/dcc-old/src/plugin-commoninfo/window/bootwidget.h b/dcc-old/src/plugin-commoninfo/window/bootwidget.h deleted file mode 100644 index bf41027b12..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/bootwidget.h +++ /dev/null @@ -1,71 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include "commoninfolistview.h" -#include - -class QVBoxLayout; -class QLabel; -class QResizeEvent; - -DWIDGET_BEGIN_NAMESPACE -class DTipLabel; -class DDialog; -class DCommandLinkButton; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { -class SwitchWidget; - -class CommonInfoModel; -class CommonBackgroundItem; - -class BootWidget : public QWidget -{ - Q_OBJECT -public: - explicit BootWidget(QWidget *parent = nullptr); - virtual ~BootWidget(); - - void setDefaultEntry(const QString &value); - void setModel(CommonInfoModel *model); - void resizeEvent(QResizeEvent *event); - void setBootList(); - -Q_SIGNALS: - void enableTheme(bool value); - void bootdelay(bool value); - void defaultEntry(const QString &item); - void requestSetBackground(const QString &path); - void enableGrubEditAuth(bool value); - void setGrubEditPasswd(const QString &passwd, const bool &isReset); - -public Q_SLOTS: - void setEntryList(const QStringList &list); - void onCurrentItem(const QModelIndex &curIndex); - void onGrubEditAuthCancel(bool toEnable); - void setGrubEditAuthVisible(bool show); - void showGrubEditAuthPasswdDialog(bool isReset); - -private: - QString m_defaultEntry; // 默认启动项 - SwitchWidget *m_bootDelay; // 延时启动功能 - SwitchWidget *m_theme; // 主题功能 - DTK_WIDGET_NAMESPACE::DTipLabel *m_themeLbl; // 主题提示 - SwitchWidget *m_grubVerification; // grub 验证 - DTK_WIDGET_NAMESPACE::DTipLabel *m_grubVerifyLbl; // grub 验证提示 - DTK_WIDGET_NAMESPACE::DCommandLinkButton *m_grubModifyPasswdLink; // grub修改密码 - DTK_WIDGET_NAMESPACE::DDialog *m_grubEditAuthDialog = nullptr; // grub修改密码输入框 - CommonInfoListView *m_bootList; // 启动项目列表 - QLabel *m_updatingLabel; // Updating标签 - CommonBackgroundItem *m_background; // 背景项 - QVBoxLayout *m_listLayout; - QModelIndex m_curSelectedIndex; - QStandardItemModel *m_bootItemModel; - CommonInfoModel *m_commonInfoModel = nullptr; - bool m_isCommoninfoBootWallpaperConfigValid; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.cpp b/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.cpp deleted file mode 100644 index 636430a339..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.cpp +++ /dev/null @@ -1,173 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "commonbackgrounditem.h" - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -static const QStringList mimeTypeList { "image/jpg", "image/jpeg", - "image/png", "image/tiff", - "image/gif", "image/bmp" }; -static const int ItemHeight = 187; -static const qreal Radius = 8.0; - -CommonBackgroundItem::CommonBackgroundItem(QWidget *parent) - : SettingsItem(parent) -{ - setMinimumHeight(ItemHeight); -} - -void CommonBackgroundItem::setThemeEnable(const bool state) -{ - setAcceptDrops(state); - m_themeEnable = state; - update(); -} - -void CommonBackgroundItem::paintEvent(QPaintEvent *e) -{ - SettingsItem::paintEvent(e); - - QPainter painter(this); - painter.setRenderHints(QPainter::Antialiasing); - - if (m_background.isNull()) { - painter.fillRect(this->rect(), Qt::black); - return; - } - - QPalette pa = DPaletteHelper::instance()->palette(this); - painter.setPen(Qt::NoPen); - painter.setBrush(QBrush(pa.color(QPalette::Window))); - - painter.drawRoundedRect(this->rect(), Radius, Radius); - - QRect pixRect(this->rect().x() + 10, this->rect().y() + 10, - this->rect().width() - 20, this->rect().height() - 20); - pixRect.moveCenter(this->rect().center()); - - QPainterPath path; - path.addRoundedRect(pixRect, Radius, Radius); - painter.setClipPath(path); - - if (m_themeEnable) { - painter.drawPixmap(m_background.rect(), m_background); - } else { - painter.setBrush(QBrush(Qt::black)); - painter.drawRect(pixRect); - } - - painter.setPen(Qt::NoPen); - painter.end(); - if (m_isDrop) { - painter.fillRect(this->rect(), QColor(0, 0, 0, 100)); - } -} - -void CommonBackgroundItem::dragEnterEvent(QDragEnterEvent *e) -{ - QMimeDatabase b; - Q_FOREACH (QUrl url, e->mimeData()->urls()) { - QString mime = b.mimeTypeForUrl(url).name(); - - if (!mimeTypeList.contains(mime)) - continue; - - if (e->mimeData()->hasUrls()) { - e->acceptProposedAction(); - m_isDrop = true; - update(); - } - - return; - } -} - -void CommonBackgroundItem::dragLeaveEvent(QDragLeaveEvent *e) -{ - Q_UNUSED(e); - - m_isDrop = false; - update(); -} - -void CommonBackgroundItem::dropEvent(QDropEvent *e) -{ - if (e->mimeData()->urls().isEmpty()) { - return; - } - - QList urls = e->mimeData()->urls(); - if (urls.isEmpty()) { - return; - } - QString path = urls[0].toLocalFile(); - if (path.isEmpty()) { - return; - } - Q_EMIT requestSetBackground(path); - e->acceptProposedAction(); - m_isDrop = false; - update(); -} - -void CommonBackgroundItem::dragMoveEvent(QDragMoveEvent *event) -{ - event->accept(); -} - -void CommonBackgroundItem::resizeEvent(QResizeEvent *e) -{ - Q_UNUSED(e); - - updateBackground(m_basePixmap); -} - -void CommonBackgroundItem::updateBackground(const QPixmap &pixmap) -{ - if (pixmap.isNull()) - return; - - m_basePixmap = pixmap; - - QSize pixmapSize = m_basePixmap.size(); - QSize showSize = size(); - QSize finalSize = ((float)showSize.width() / (float)pixmapSize.width()) * pixmapSize; - qreal ratio = devicePixelRatioF(); - - auto previewPixmap = m_basePixmap.scaled(finalSize, - Qt::IgnoreAspectRatio, - Qt::SmoothTransformation); - - - if (previewPixmap.size().height() <= showSize.height()) { - m_background = previewPixmap; - } else { - qreal centerHeight = (float)previewPixmap.size().height() / 2; - qreal offsetHeight = (float)showSize.height() / 2; - - qreal start_y = centerHeight - offsetHeight; - - qreal start_x = 0; - - m_background = previewPixmap.copy(QRect(start_x, start_y, showSize.width(), showSize.height())); - } - - m_background.setDevicePixelRatio(ratio); - update(); -} diff --git a/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.h b/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.h deleted file mode 100644 index 6ed5889569..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commonbackgrounditem.h +++ /dev/null @@ -1,37 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -namespace DCC_NAMESPACE { -class CommonBackgroundItem : public SettingsItem -{ - Q_OBJECT -public: - explicit CommonBackgroundItem(QWidget *parent = nullptr); - -Q_SIGNALS: - void requestEnableTheme(const bool state); - void requestSetBackground(const QString &path); - -public Q_SLOTS: - void setThemeEnable(const bool state); - void updateBackground(const QPixmap &pixmap); - -protected: - void paintEvent(QPaintEvent *e) override; - void dragEnterEvent(QDragEnterEvent *e) override; - void dragLeaveEvent(QDragLeaveEvent *e) override; - void dropEvent(QDropEvent *e) override; - void dragMoveEvent(QDragMoveEvent *event) override; - void resizeEvent(QResizeEvent *e) override; - -private: - QPixmap m_background; - QPixmap m_basePixmap; - bool m_isDrop; - bool m_themeEnable; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/window/commoninfolistview.cpp b/dcc-old/src/plugin-commoninfo/window/commoninfolistview.cpp deleted file mode 100644 index 131cb61e6c..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commoninfolistview.cpp +++ /dev/null @@ -1,33 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "commoninfolistview.h" - -CommonInfoListView::CommonInfoListView(QWidget *parent) - : DTK_WIDGET_NAMESPACE::DListView(parent) - , m_maxheight(std::nullopt) -{ - -} - -void CommonInfoListView::setMaxShowHeight(int height) -{ - m_maxheight = height; -} - -void CommonInfoListView::updateGeometries() -{ - DListView::updateGeometries(); - if (model()->rowCount() == 0) { - return; - } - QRect r = rectForIndex(model()->index(model()->rowCount() - 1, 0)); - QMargins margins = viewportMargins(); - - int height = r.y() + r.height() + margins.top() + margins.bottom() + 1; - - if (!m_maxheight.has_value() || m_maxheight.value() > height) { - setFixedHeight(height); - } -} diff --git a/dcc-old/src/plugin-commoninfo/window/commoninfolistview.h b/dcc-old/src/plugin-commoninfo/window/commoninfolistview.h deleted file mode 100644 index 797185f688..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commoninfolistview.h +++ /dev/null @@ -1,24 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include - -#include - -class CommonInfoListView : public DTK_WIDGET_NAMESPACE::DListView -{ - Q_OBJECT -public: - explicit CommonInfoListView(QWidget *parent = nullptr); - - void setMaxShowHeight(int height); - -protected slots: - void updateGeometries() override; - -private: - std::optional m_maxheight; -}; diff --git a/dcc-old/src/plugin-commoninfo/window/commoninfomodule.cpp b/dcc-old/src/plugin-commoninfo/window/commoninfomodule.cpp deleted file mode 100644 index a057e13f13..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commoninfomodule.cpp +++ /dev/null @@ -1,231 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "commoninfomodule.h" - -#include "bootwidget.h" -#include "dcclistview.h" -#include "developermodewidget.h" -#include "interface/pagemodule.h" -#include "moduleobject.h" -#include "plymouthdisplay.h" -#include "src/frame/utils.h" -#include "src/plugin-commoninfo/operation/commoninfomodel.h" -#include "src/plugin-commoninfo/operation/commoninfowork.h" -#include "userexperienceprogramwidget.h" -#include "widgets/itemmodule.h" - -#include - -#include -#include -#include - -#include - -using Dtk::Widget::DStandardItem; - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DCORE_USE_NAMESPACE - -CommonInfoModule::CommonInfoModule(QObject *parent) - : HListModule(parent) - , m_worker(nullptr) - , m_model(nullptr) -{ - m_model = new CommonInfoModel(this); - m_worker = new CommonInfoWork(m_model, this); -} - -CommonInfoModule::~CommonInfoModule() -{ - m_model->deleteLater(); - m_worker->deleteLater(); -} - -void CommonInfoModule::active() -{ - m_worker->active(); -} - -QString CommonInfoPlugin::name() const -{ - return QStringLiteral("commoninfo"); -} - -ModuleObject *CommonInfoPlugin::module() -{ - // 一级菜单--通用设置 - CommonInfoModule *moduleInterface = new CommonInfoModule(); - moduleInterface->setName("commoninfo"); - moduleInterface->setDisplayName(tr("General Settings")); - moduleInterface->setIcon(DIconTheme::findQIcon("dcc_nav_commoninfo")); - - // 二级菜单--启动菜单 - ModuleObject *moduleBootMenu = new PageModule("bootMenu", tr("Boot Menu")); - BootModule *bootModule = - new BootModule(moduleInterface->model(), moduleInterface->worker(), moduleBootMenu); - moduleBootMenu->appendChild(bootModule); - moduleInterface->appendChild(moduleBootMenu); - - moduleInterface->appendChild( - new PlyMouthModule(moduleInterface->model(), moduleInterface->worker())); - - // 服务器版/社区版 - if (!IS_SERVER_SYSTEM && !IS_COMMUNITY_SYSTEM && DSysInfo::isDeepin()) { - if (DSysInfo::uosEditionType() != DSysInfo::UosEuler - || DSysInfo::uosEditionType() != DSysInfo::UosEnterpriseC) { - // 二级菜单--开发者模式 - ModuleObject *moduleDeveloperMode = - new PageModule("developerMode", tr("Developer Mode")); - DeveloperModeModule *developerModeModule = - new DeveloperModeModule(moduleInterface->model(), - moduleInterface->worker(), - moduleBootMenu); - moduleDeveloperMode->appendChild(developerModeModule); - moduleInterface->appendChild(moduleDeveloperMode); - } - - // 二级菜单--用户体验计划 - ModuleObject *moduleUserExperienceProgram = - new PageModule("userExperienceProgram", tr("User Experience Program")); - UserExperienceProgramModule *userExperienceProgramModule = - new UserExperienceProgramModule(moduleInterface->model(), - moduleInterface->worker(), - moduleBootMenu); - moduleUserExperienceProgram->appendChild(userExperienceProgramModule); - moduleInterface->appendChild(moduleUserExperienceProgram); - } - - return moduleInterface; -} - -QString CommonInfoPlugin::location() const -{ - return "22"; -} - -QWidget *DeveloperModeModule::page() -{ - DeveloperModeWidget *w = new DeveloperModeWidget; - w->setModel(m_model); - connect(w, &DeveloperModeWidget::requestLogin, m_worker, &CommonInfoWork::login); - connect(w, &DeveloperModeWidget::enableDeveloperMode, this, [=](bool enabled) { - m_worker->setEnableDeveloperMode(enabled); - }); - return w; -} - -QWidget *UserExperienceProgramModule::page() -{ - UserExperienceProgramWidget *w = new UserExperienceProgramWidget(); - w->setModel(m_model); - connect(w, - &UserExperienceProgramWidget::enableUeProgram, - m_worker, - &CommonInfoWork::setUeProgram); - connect(w, &UserExperienceProgramWidget::destroyed, m_worker, &CommonInfoWork::closeUeProgram); - return w; -} - -QWidget *BootModule::page() -{ - BootWidget *w = new BootWidget(); - w->setModel(m_model); - connect(w, &BootWidget::bootdelay, m_worker, &CommonInfoWork::setBootDelay); - connect(w, &BootWidget::enableTheme, m_worker, &CommonInfoWork::setEnableTheme); - connect(w, &BootWidget::enableGrubEditAuth, m_worker, [this, w](bool value) { - if (value) { - w->showGrubEditAuthPasswdDialog(false); - } else { - m_worker->disableGrubEditAuth(); - } - }); - connect(w, &BootWidget::setGrubEditPasswd, m_worker, &CommonInfoWork::onSetGrubEditPasswd); - connect(w, &BootWidget::defaultEntry, m_worker, &CommonInfoWork::setDefaultEntry); - connect(w, &BootWidget::requestSetBackground, m_worker, &CommonInfoWork::setBackground); - - w->setGrubEditAuthVisible(m_model->isShowGrubEditAuth()); - return w; -} - -PlyMouthModule::PlyMouthModule(CommonInfoModel *model, CommonInfoWork *work, QObject *parent) - : PageModule("plymouthAnimation", tr("Boot Animation"), parent) - , m_model(model) - , m_work(work) -{ - appendChild(new ItemModule("", "", this, &PlyMouthModule::initPlyMouthDisplay, false)); - appendChild(new ItemModule("plymouthScale", - "", - this, - &PlyMouthModule::initPlymouthScale, - false)); -} - -QWidget *PlyMouthModule::initPlyMouthDisplay(ModuleObject *module) -{ - auto displayItem = new PlyMouthDisplayItem; - - displayItem->setLogoPixmap(m_work->getPlymouthFilePixmap()); - connect(m_model, &CommonInfoModel::plymouthThemeChanged, displayItem, [displayItem, this] { - displayItem->setLogoPixmap(m_work->getPlymouthFilePixmap()); - }); - - return displayItem; -} - -QWidget *PlyMouthModule::initPlymouthScale(ModuleObject *module) -{ - Q_UNUSED(module) - DCCListView *plymouthView = new DCCListView; - QStandardItemModel *plymouthModel = new QStandardItemModel; - - DStandardItem *smallOne = new DStandardItem; - smallOne->setData(tr("Small Size"), Qt::DisplayRole); - smallOne->setData(1, Dtk::UserRole); - - DStandardItem *bingOne = new DStandardItem; - bingOne->setData(tr("Big Size"), Qt::DisplayRole); - bingOne->setData(2, Dtk::UserRole); - - plymouthModel->appendRow(smallOne); - plymouthModel->appendRow(bingOne); - - plymouthView->setModel(plymouthModel); - - auto plymouthValueViewChanged = [plymouthView, plymouthModel](int scale) { - if (scale == 0 || scale > 2) { - return; - } - int row = scale - 1; - plymouthView->setCurrentIndex(plymouthModel->index(row, 0)); - for (int i = 0; i < 2; ++i) { - auto item = plymouthModel->item(i); - item->setCheckState(row == i ? Qt::Checked : Qt::Unchecked); - } - }; - plymouthValueViewChanged(m_model->plymouthScale()); - - auto handleDisableChanged = [plymouthModel](bool disable) { - for (int i = 0; i < 2; ++i) { - auto item = plymouthModel->item(i); - item->setEnabled(!disable); - } - }; - - handleDisableChanged(m_work->isSettingPlymouth()); - - connect(m_model, - &CommonInfoModel::plymouthScaleChanged, - plymouthView, - plymouthValueViewChanged); - - connect(m_work, &CommonInfoWork::settingScaling, plymouthView, handleDisableChanged); - - connect(plymouthView, &QListView::clicked, m_work, [this](const QModelIndex &index) { - int scale = index.row() + 1; - m_work->setPlymouthFactor(scale); - }); - return plymouthView; -} diff --git a/dcc-old/src/plugin-commoninfo/window/commoninfomodule.h b/dcc-old/src/plugin-commoninfo/window/commoninfomodule.h deleted file mode 100644 index b21d6412ec..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/commoninfomodule.h +++ /dev/null @@ -1,121 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/hlistmodule.h" -#include "interface/namespace.h" -#include "interface/plugininterface.h" -#include "pagemodule.h" - -#include - -namespace DCC_NAMESPACE { -class CommonInfoModel; -class CommonInfoWork; - -class CommonInfoPlugin : public PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.CommonInfo" FILE "CommonInfoPlugin.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - virtual QString name() const override; - virtual ModuleObject *module() override; - virtual QString location() const override; -}; - -class CommonInfoModule : public HListModule -{ - Q_OBJECT -public: - explicit CommonInfoModule(QObject *parent = nullptr); - ~CommonInfoModule(); - virtual void active() override; - - CommonInfoWork *worker() { return m_worker; } - - CommonInfoModel *model() { return m_model; } - -private: - CommonInfoWork *m_worker; - CommonInfoModel *m_model; -}; - -class DeveloperModeModule : public ModuleObject -{ - Q_OBJECT -public: - explicit DeveloperModeModule(CommonInfoModel *model, - CommonInfoWork *worker, - QObject *parent = nullptr) - : ModuleObject(parent) - , m_model(model) - , m_worker(worker) - { - } - - virtual QWidget *page() override; - -private: - CommonInfoModel *m_model; - CommonInfoWork *m_worker; -}; - -class PlyMouthModule : public PageModule -{ - Q_OBJECT -public: - explicit PlyMouthModule(CommonInfoModel *model, - CommonInfoWork *worker, - QObject *parent = nullptr); - -private slots: - QWidget *initPlymouthScale(ModuleObject *module); - QWidget *initPlyMouthDisplay(ModuleObject *module); - -private: - CommonInfoModel *m_model; - CommonInfoWork *m_work; -}; - -class UserExperienceProgramModule : public ModuleObject -{ - Q_OBJECT -public: - explicit UserExperienceProgramModule(CommonInfoModel *model, - CommonInfoWork *worker, - QObject *parent = nullptr) - : ModuleObject(parent) - , m_model(model) - , m_worker(worker) - { - } - - virtual QWidget *page() override; - -private: - CommonInfoModel *m_model; - CommonInfoWork *m_worker; -}; - -class BootModule : public ModuleObject -{ - Q_OBJECT -public: - explicit BootModule(CommonInfoModel *model, CommonInfoWork *worker, QObject *parent = nullptr) - : ModuleObject(parent) - , m_model(model) - , m_worker(worker) - { - } - - virtual QWidget *page() override; - -private: - CommonInfoModel *m_model; - CommonInfoWork *m_worker; -}; - -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/window/developermodedialog.cpp b/dcc-old/src/plugin-commoninfo/window/developermodedialog.cpp deleted file mode 100644 index 344a2a5faf..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/developermodedialog.cpp +++ /dev/null @@ -1,280 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "developermodedialog.h" -#include "src/plugin-commoninfo/operation/commoninfomodel.h" -#include "widgets/titlelabel.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -DeveloperModeDialog::DeveloperModeDialog(QObject *parent) - : DAbstractDialog(parent) - , m_importFile(new QFileDialog(this)) - , m_exportFile(new QFileDialog(this)) -{ - //注册类型 - qRegisterMetaType("DMIInfo"); - qDBusRegisterMetaType(); - qRegisterMetaType("HardwareInfo"); - qDBusRegisterMetaType(); - - setAccessibleName("DeveloperModeDialog"); - setMinimumSize(QSize(350, 380)); - //总布局 - QVBoxLayout *vBoxLayout = new QVBoxLayout(this); - //图标和关闭按钮布局 - QHBoxLayout *titleHBoxLayout = new QHBoxLayout(); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setAccessibleName("DeveloperModeDialog_titleIcon"); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setIcon(DIconTheme::findQIcon("preferences-system")); - titleHBoxLayout->addWidget(titleIcon, Qt::AlignTop); - titleIcon->setMenuVisible(false); - titleIcon->setTitle(""); - //内容布局 - QVBoxLayout *contentVBoxLayout = new QVBoxLayout(); - auto chooseModeTip = new TitleLabel(tr("Request Root Access"), this); - chooseModeTip->setAlignment(Qt::AlignHCenter | Qt::AlignTop); - chooseModeTip->setWordWrap(true); - - contentVBoxLayout->setContentsMargins(40, 0, 40, 20); - contentVBoxLayout->addWidget(chooseModeTip, 0, Qt::AlignTop); - - auto hw = new QWidget(); - hw->setAccessibleName("hBoxLayout"); - QHBoxLayout *hBoxLayout = new QHBoxLayout(); - m_onlineBtn = new DRadioButton(tr("Online")); - m_offlineBtn = new DRadioButton(tr("Offline")); - m_onlineBtn->setChecked(true); - hw->setLayout(hBoxLayout); - - hBoxLayout->setSpacing(20); - hBoxLayout->addWidget(m_onlineBtn, 0, Qt::AlignCenter); - hBoxLayout->addWidget(m_offlineBtn, 0, Qt::AlignCenter); - contentVBoxLayout->addWidget(hw, 0, Qt::AlignTop | Qt::AlignHCenter); - - //在线激活模式提示 - auto chooseModeCommonts = new DTextBrowser(); - chooseModeCommonts->setAccessibleName("DeveloperModeDialog_DTextBrowser"); - auto mpalette = this->palette(); - mpalette.setBrush(QPalette::Base, QBrush(Qt::NoBrush)); - chooseModeCommonts->setPalette(mpalette); - chooseModeCommonts->setFrameStyle(QFrame::NoFrame); - chooseModeCommonts->setAlignment(Qt::AlignLeft | Qt::AlignTop); - chooseModeCommonts->setText(tr("Please sign in to your Union ID first and continue")); - - contentVBoxLayout->addWidget(chooseModeCommonts, 1, Qt::AlignTop | Qt::AlignHCenter); - - //在线激活模式下一步按钮 - m_nextButton = new DSuggestButton(tr("Next")); - contentVBoxLayout->addWidget(m_nextButton, 0, Qt::AlignBottom); - - //离线激活模式导出机器信息和导入证书按钮 - auto exportBtn = new QPushButton(tr("Export PC Info")); - auto importBtn = new DSuggestButton(tr("Import Certificate")); - importBtn->setAccessibleName("importBtn"); - exportBtn->setVisible(false); - importBtn->setVisible(false); - - contentVBoxLayout->addWidget(exportBtn, 0, Qt::AlignBottom); - contentVBoxLayout->addWidget(importBtn, 0, Qt::AlignBottom); - - //加入布局 - vBoxLayout->addLayout(titleHBoxLayout); - vBoxLayout->addLayout(contentVBoxLayout); - vBoxLayout->setMargin(0); - setLayout(vBoxLayout); - - m_importFile->setModal(true); - m_importFile->setAcceptMode(QFileDialog::AcceptSave); - m_importFile->setNameFilter("*.json"); - // 以读写方式打开主目录下的1.json文件,若该文件不存在则会自动创建 - m_importFile->selectFile("1.json"); - QStringList directory = QStandardPaths::standardLocations(QStandardPaths::DesktopLocation); - if (!directory.isEmpty()) { - m_importFile->setDirectory(directory.first()); - } - - m_exportFile->setModal(true); - m_exportFile->setAcceptMode(QFileDialog::AcceptOpen); - directory = QStandardPaths::standardLocations(QStandardPaths::DownloadLocation); - if (!directory.isEmpty()) { - m_exportFile->setDirectory(directory.first()); - } - - connect(m_importFile, &QFileDialog::finished, this, [ = ](int result) { - if (result == QFileDialog::Accepted) { - QDBusInterface licenseInfo("com.deepin.sync.Helper", - "/com/deepin/sync/Helper", - "com.deepin.sync.Helper", - QDBusConnection::systemBus()); - - QDBusReply hardwareInfo = licenseInfo.call(QDBus::AutoDetect, "GetHardware"); - QString fileName = m_importFile->selectedFiles().first(); - if (fileName.isEmpty()) - return; - - QFile file(fileName); - if (!file.open(QIODevice::ReadWrite)) - qDebug() << "File open error"; - else - qDebug() << "File open!"; - - // 使用QJsonObject对象插入键值对。 - QJsonObject jsonObject; - auto hardwareInfoValue = hardwareInfo.value(); - auto hardwareDMIValue = hardwareInfo.value().dmi; - jsonObject.insert("id", hardwareInfoValue.id); - jsonObject.insert("hostname", hardwareInfoValue.hostName); - jsonObject.insert("username", hardwareInfoValue.username); - jsonObject.insert("cpu", hardwareInfoValue.cpu); - jsonObject.insert("laptop", hardwareInfoValue.laptop); - jsonObject.insert("memory", hardwareInfoValue.memory); - jsonObject.insert("network_cards", hardwareInfoValue.networkCards); - - QJsonObject objectDMI; - objectDMI.insert("bios_vendor", hardwareDMIValue.biosVendor); - objectDMI.insert("bios_version", hardwareDMIValue.biosVersion); - objectDMI.insert("bios_date", hardwareDMIValue.biosDate); - objectDMI.insert("board_name", hardwareDMIValue.boardName); - objectDMI.insert("board_serial", hardwareDMIValue.boardSerial); - objectDMI.insert("board_vendor", hardwareDMIValue.boardVendor); - objectDMI.insert("board_version", hardwareDMIValue.boardVersion); - objectDMI.insert("product_name", hardwareDMIValue.productName); - objectDMI.insert("product_family", hardwareDMIValue.productFamily); - objectDMI.insert("product_serial", hardwareDMIValue.producctSerial); - objectDMI.insert("product_uuid", hardwareDMIValue.productUUID); - objectDMI.insert("product_version", hardwareDMIValue.productVersion); - - jsonObject.insert("dmi", objectDMI); - //使用QJsonDocument设置该json对象 - QJsonDocument jsonDoc; - jsonDoc.setObject(jsonObject); - - //将json以文本形式写入文件并关闭文件 - file.write(jsonDoc.toJson()); - file.close(); - } - }); - - connect(m_exportFile, &QFileDialog::finished, this, [ = ](int result) { - if (result == QFileDialog::Accepted) { - QString fileName = m_exportFile->selectedFiles().first(); - if (fileName.isEmpty()) - return; - - Q_EMIT requestCommit(fileName); - close(); - } - }); - - //选择激活在线模式或离线模式 - connect(m_onlineBtn, &QAbstractButton::toggled, [ = ] { - if (m_onlineBtn->isChecked()) { - exportBtn->setVisible(false); - importBtn->setVisible(false); - m_nextButton->setVisible(true); - - chooseModeCommonts->setText(tr("Please sign in to your Union ID first and continue")); - this->update(); - } else { - m_nextButton->setVisible(false); - exportBtn->setVisible(true); - importBtn->setVisible(true); - chooseModeCommonts->setText(tr("1. Export your PC information") + '\n' - + tr("2. Go to https://www.chinauos.com/developMode to download an offline certificate") + '\n' - + tr("3. Import the certificate")); - } - }); - - connect(m_nextButton, &QPushButton::clicked, this, &DeveloperModeDialog::setLogin); - connect(exportBtn, &QPushButton::clicked, [ this ] { - m_importFile->show(); - }); - - //离线模式导入证书 - connect(importBtn, &QPushButton::clicked, [ this ] { - m_exportFile->show(); - }); -} - -DeveloperModeDialog::~DeveloperModeDialog() -{ - if (m_importFile) - m_importFile->deleteLater(); - - if (m_exportFile) - m_exportFile->deleteLater(); -} - -void DeveloperModeDialog::setModel(CommonInfoModel *model) -{ - m_model = model; -} - -void DeveloperModeDialog::shutdown() -{ - if (m_importFile && m_importFile->isVisible()) - m_importFile->reject(); - - if (m_exportFile && m_exportFile->isVisible()) - m_exportFile->reject(); -} - -void DeveloperModeDialog::setLogin() -{ - auto model = m_model; - auto btn = m_nextButton; - Q_ASSERT(model); - auto requestDev = [this, btn] { - btn->clearFocus(); - //防止出现弹窗时可以再次点击按钮 - hide(); - QTimer::singleShot(100, this, [ this ] { - Q_EMIT requestDeveloperMode(true); - }); - }; - - if (!model->isLogin()) { - m_enterDev = true; - btn->clearFocus(); - Q_EMIT requestLogin(); - connect(model, &CommonInfoModel::isLoginChenged, this, [requestDev, this](bool log) { - if (!log || !m_enterDev) - return; - - requestDev(); - m_enterDev = false; - }); - } else { - requestDev(); - } -} - -void DeveloperModeDialog::showEvent(QShowEvent *) -{ - setFocus(); -} diff --git a/dcc-old/src/plugin-commoninfo/window/developermodedialog.h b/dcc-old/src/plugin-commoninfo/window/developermodedialog.h deleted file mode 100644 index 8c31844df4..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/developermodedialog.h +++ /dev/null @@ -1,169 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DeveloperModeDialog_H -#define DeveloperModeDialog_H - -#include "interface/namespace.h" - -#include -#include -#include - -#include -#include -#include - -struct TS{ - QString ts1; - QString ts2; -}; - -class QFileDialog; - -namespace DCC_NAMESPACE { -class CommonInfoModel; - -class DeveloperModeDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit DeveloperModeDialog(QObject *parent = nullptr); - ~DeveloperModeDialog(); - -public: - void setModel(CommonInfoModel *model); - void shutdown(); - -Q_SIGNALS: - void requestDeveloperMode(bool enabled); - void requestLogin(); - void requestCommit(QString filePathName); - -protected: - virtual void showEvent(QShowEvent *); - -private Q_SLOTS: - void setLogin(); - -private: - DTK_WIDGET_NAMESPACE::DRadioButton *m_onlineBtn{nullptr}; - DTK_WIDGET_NAMESPACE::DRadioButton *m_offlineBtn{nullptr}; - DTK_WIDGET_NAMESPACE::DSuggestButton *m_nextButton{nullptr}; - CommonInfoModel *m_model{nullptr}; - bool m_enterDev{false}; - QFileDialog *m_importFile; - QFileDialog *m_exportFile; -}; -} - -class DMIInfo -{ -public: - DMIInfo(){} - - friend QDebug operator<<(QDebug debug, const DMIInfo &info) - { - debug << QString("DMIInfo(") << info.biosVendor << ", " << info.biosVersion << ", " - << info.biosDate << ", " << info.boardName << ", " << info.boardSerial << ", " - << info.boardVendor << ", " << info.boardVersion << ", " - << info.productName << ", " << info.productFamily << ", " - << info.producctSerial << ", " << info.productUUID << ", " - << info.productVersion << ")"; - - return debug; - } - friend const QDBusArgument &operator>>(const QDBusArgument &arg, DMIInfo &info) - { - arg.beginStructure(); - arg >> info.biosVendor >> info.biosVersion >> info.biosDate - >> info.boardName >> info.boardSerial >> info.boardVendor >> info.boardVersion - >> info.productName >> info.productFamily - >> info.producctSerial >> info.productUUID >> info.productVersion; - arg.endStructure(); - - return arg; - } - friend QDBusArgument &operator<<(QDBusArgument &arg, const DMIInfo &info) - { - arg.beginStructure(); - arg << info.biosVendor << info.biosVersion << info.biosDate - << info.boardName << info.boardSerial << info.boardVendor << info.boardVersion - << info.productName << info.productFamily - << info.producctSerial << info.productUUID << info.productVersion; - arg.endStructure(); - - return arg; - } - -public: - QString biosVendor{""}; - QString biosVersion{""}; - QString biosDate{""}; - QString boardName{""}; - QString boardSerial{""}; - QString boardVendor{""}; - QString boardVersion{""}; - QString productName{""}; - QString productFamily{""}; - QString producctSerial{""}; - QString productUUID{""}; - QString productVersion{""}; -}; - -class HardwareInfo -{ -public: - HardwareInfo(){} - - friend QDebug operator<<(QDebug debug, const HardwareInfo &info) - { - debug << "HardwareInfo(" <>(const QDBusArgument &arg, HardwareInfo &info) - { - arg.beginStructure(); - arg >> info.id >> info.hostName >> info.username >> info.os >> info.cpu - >> info.laptop >> info.memory >> info.diskTotal >> info.networkCards - >> info.diskList >> info.dmi; - arg.endStructure(); - - return arg; - } - -public: - QString id{""}; - QString hostName{""}; - QString username{""}; - QString os{""}; - QString cpu{""}; - bool laptop{false}; - qint64 memory{0}; - qint64 diskTotal{0}; - QString networkCards{""}; - QString diskList{""}; - DMIInfo dmi; -}; - -Q_DECLARE_METATYPE(DMIInfo) -Q_DECLARE_METATYPE(HardwareInfo) - - - - -#endif // DEVELPERMODEACTIVATE_H diff --git a/dcc-old/src/plugin-commoninfo/window/developermodewidget.cpp b/dcc-old/src/plugin-commoninfo/window/developermodewidget.cpp deleted file mode 100644 index 17a96a2370..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/developermodewidget.cpp +++ /dev/null @@ -1,187 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "developermodewidget.h" -#include "src/plugin-commoninfo/operation/commoninfomodel.h" -#include "widgets/switchwidget.h" - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -DeveloperModeWidget::DeveloperModeWidget(QWidget *parent) - : QWidget(parent) - , m_model(nullptr) - , m_inter(new QDBusInterface("com.deepin.sync.Helper", - "/com/deepin/sync/Helper", - "com.deepin.sync.Helper", - QDBusConnection::systemBus(), this)) - , m_developerDialog(new DeveloperModeDialog(this)) -{ - setAccessibleName("DeveloperModeWidget"); - m_devBtn = new QPushButton(tr("Request Root Access")); - m_dtip = new DTipLabel(tr("Developer mode enables you to get root privileges, install and run unsigned apps not listed in app store, but your system integrity may also be damaged, please use it carefully.")); - m_dtip->setAccessibleName("DeveloperModeWidget_dtip "); - m_dtip->setAlignment(Qt::AlignLeft | Qt::AlignTop); - m_dtip->setWordWrap(true); - - m_lab = new DLabel(tr("The feature is not available at present, please activate your system first")); - m_lab->setAccessibleName("DeveloperModeWidget_lab"); - m_lab->setWordWrap(true); - m_lab->setVisible(false); - - QVBoxLayout *vBoxLayout = new QVBoxLayout; - vBoxLayout->setMargin(0); - vBoxLayout->setSpacing(10); - vBoxLayout->setContentsMargins(0, 10, 0, 10); - vBoxLayout->addWidget(m_devBtn); - vBoxLayout->addWidget(m_lab); - vBoxLayout->addWidget(m_dtip); - vBoxLayout->addStretch(); - setLayout(vBoxLayout); - - connect(m_developerDialog, &DeveloperModeDialog::requestDeveloperMode, this, &DeveloperModeWidget::enableDeveloperMode); - connect(this, &DeveloperModeWidget::enableDeveloperMode, m_developerDialog, &DeveloperModeDialog::close); - connect(m_developerDialog, &DeveloperModeDialog::requestLogin, this, &DeveloperModeWidget::requestLogin); - connect(m_developerDialog, &DeveloperModeDialog::requestCommit, [ this ](QString filePathName) { - //读取机器信息证书 - QFile fFile(filePathName); - if (!fFile.open(QIODevice::ReadOnly)) { - qDebug() << "Can't open file for writing"; - } - - QByteArray data = fFile.readAll(); - QDBusMessage msg = m_inter->call("EnableDeveloperMode", data); - - //当返回信息为错误接口信息才处理 - if (msg.type() == QDBusMessage::MessageType::ErrorMessage) { - //系统通知弹窗qdbus 接口 - QDBusInterface tInterNotify("org.deepin.dde.Notification1", - "/org/deepin/dde/Notification1", - "org.deepin.dde.Notification1", - QDBusConnection::sessionBus()); - - //初始化Notify 七个参数 - QString in0(QObject::tr("dde-control-center")); - uint in1 = 101; - QString in2("preferences-system"); - QString in3(""); - QString in4(""); - QStringList in5; - QVariantMap in6; - int in7 = 5000; - - //截取error接口 1001:未导入证书 1002:未登录 1003:无法获取硬件信息 1004:网络异常 1005:证书加载失败 1006:签名验证失败 1007:文件保存失败 - QString msgcode = msg.errorMessage(); - msgcode = msgcode.split(":").at(0); - if (msgcode == "1001") { - in3 = tr("Failed to get root access"); - } else if (msgcode == "1002") { - in3 = tr("Please sign in to your Union ID first"); - } else if (msgcode == "1003") { - in3 = tr("Cannot read your PC information"); - } else if (msgcode == "1004") { - in3 = tr("No network connection"); - } else if (msgcode == "1005") { - in3 = tr("Certificate loading failed, unable to get root access"); - } else if (msgcode == "1006") { - in3 = tr("Signature verification failed, unable to get root access"); - } else if (msgcode == "1007") { - in3 = tr("Failed to get root access"); - } - - //系统通知认证失败 无法进入开发模式 - tInterNotify.call("Notify", in0, in1, in2, in3, in4, in5, in6, in7); - } - }); - - //绑定选择激活开发模式窗口 - connect(m_devBtn, &QPushButton::clicked, [ this ] { - m_developerDialog->show(); - }); -} - -DeveloperModeWidget::~DeveloperModeWidget() -{ - if (m_developerDialog) { - m_developerDialog->shutdown(); // 若存在可显示对话框,则需强制关闭 - m_developerDialog->deleteLater(); - } -} - -void DeveloperModeWidget::setModel(CommonInfoModel *model) -{ - m_model = model; - m_developerDialog->setModel(m_model); - onLoginChanged(); - if (!model->developerModeState()) { - m_devBtn->setEnabled(model->isActivate()); - m_lab->setVisible(!model->isActivate()); - m_dtip->setVisible(model->isActivate()); - } - updateDeveloperModeState(model->developerModeState()); - connect(model, &CommonInfoModel::developerModeStateChanged, this, [ this ](const bool state) { - //更新界面 - updateDeveloperModeState(state); - - if (!state) - return; - - //弹窗提示重启 - DDialog dlg("", tr("To make some features effective, a restart is required. Restart now?"), this); - dlg.addButtons({tr("Cancel"), tr("Restart Now")}); - connect(&dlg, &DDialog::buttonClicked, this, [ = ](int idx, QString str) { - Q_UNUSED(str); - if (idx == 1) { - DDBusSender() - .service("org.deepin.dde.SessionManager1") - .interface("org.deepin.dde.SessionManager1") - .path("/org/deepin/dde/SessionManager1") - .method("RequestReboot") - .call(); - } - }); - dlg.exec(); - }); - connect(model, &CommonInfoModel::isLoginChenged, this, &DeveloperModeWidget::onLoginChanged); - if (!model->developerModeState()) { - connect(model, &CommonInfoModel::LicenseStateChanged, this, [ = ](const bool & value) { - m_devBtn->setEnabled(value); - m_lab->setVisible(!value); - m_dtip->setVisible(value); - }); - } -} - -void DeveloperModeWidget::onLoginChanged() -{ -} - -//开发者模式变化时,更新界面 -void DeveloperModeWidget::updateDeveloperModeState(const bool state) -{ - QDBusReply reply = m_inter->call("IsDeveloperMode"); - if (state || reply.value()) { - //开发者模式不可逆,这里将控件disable - m_devBtn->clearFocus(); - m_devBtn->setEnabled(false); - m_devBtn->setText(tr("Root Access Allowed")); - } else { - m_devBtn->setEnabled(m_model->isActivate()); - m_devBtn->setText(tr("Request Root Access")); - m_devBtn->setChecked(false); - } -} diff --git a/dcc-old/src/plugin-commoninfo/window/developermodewidget.h b/dcc-old/src/plugin-commoninfo/window/developermodewidget.h deleted file mode 100644 index 9519e0a93e..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/developermodewidget.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" -#include "developermodedialog.h" - -#include -#include - -class QPushButton; -class QDBusInterface; - -namespace DCC_NAMESPACE { -class SwitchWidget; -class CommonInfoModel; - -class DeveloperModeWidget : public QWidget -{ - Q_OBJECT -public: - explicit DeveloperModeWidget(QWidget *parent = nullptr); - ~DeveloperModeWidget(); - void setModel(CommonInfoModel *model); - -Q_SIGNALS: - void enableDeveloperMode(bool enabled); - void requestLogin(); - -private Q_SLOTS: - void onLoginChanged(); - -public Q_SLOTS: - void updateDeveloperModeState(const bool state); - -private: - bool m_enterDev{false}; - QPushButton *m_devBtn; - CommonInfoModel *m_model{nullptr}; - QDBusInterface *m_inter; - DTK_NAMESPACE::Widget::DLabel *m_lab; - DTK_NAMESPACE::Widget::DLabel *m_dtip; - DeveloperModeDialog *m_developerDialog; -}; -} diff --git a/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.cpp b/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.cpp deleted file mode 100644 index 3ea5dff765..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.cpp +++ /dev/null @@ -1,46 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "plymouthdisplay.h" - -#include - -#include -#include - -using namespace DCC_NAMESPACE; - -static constexpr int ItemHeight = 200; -static constexpr qreal Radius = 8.0; - -PlyMouthDisplayItem::PlyMouthDisplayItem(QWidget *parent) - : QWidget(parent) - , m_logo(QPixmap()) -{ - setMinimumHeight(ItemHeight); -} - -void PlyMouthDisplayItem::paintEvent(QPaintEvent *event) -{ - QWidget::paintEvent(event); - QPainter painter(this); - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - - QPainterPath path; - path.addRoundedRect(rect(), Radius, Radius); - painter.fillPath(path, Qt::black); - - if (m_logo.isNull()) { - return; - } - qreal x = (rect().width() - m_logo.width()) / 2.0; - qreal y = (rect().height() - m_logo.height()) / 2.0; - painter.drawPixmap(x, y, m_logo); -} - -void PlyMouthDisplayItem::setLogoPixmap(const QPixmap &pix) -{ - m_logo = pix; - update(); -} diff --git a/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.h b/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.h deleted file mode 100644 index 05a4a02a03..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/plymouthdisplay.h +++ /dev/null @@ -1,28 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once -#include "interface/namespace.h" - -#include -#include -#include - -namespace DCC_NAMESPACE { -class PlyMouthDisplayItem : public QWidget -{ - Q_OBJECT -public: - explicit PlyMouthDisplayItem(QWidget *parent = nullptr); - -public slots: - void setLogoPixmap(const QPixmap &pix); - -protected: - void paintEvent(QPaintEvent *event) override; - -private: - QPixmap m_logo; -}; -} // namespace DCC_NAMESPACE diff --git a/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.cpp b/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.cpp deleted file mode 100644 index b9f210845a..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "pwqualitymanager.h" -#include -#include - -using namespace DCC_NAMESPACE; -DCORE_USE_NAMESPACE - -PwqualityManager::PwqualityManager() - : m_passwordMinLen(0) - , m_passwordMaxLen(0) -{ -} - -PwqualityManager *PwqualityManager::instance() -{ - static PwqualityManager pwquality; - return &pwquality; -} - -PwqualityManager::ERROR_TYPE PwqualityManager::verifyPassword(const QString &user, const QString &password, CheckType checkType) -{ - switch (checkType) { - case PwqualityManager::Default: { - ERROR_TYPE error = deepin_pw_check(user.toLocal8Bit().data(), password.toLocal8Bit().data(), LEVEL_STRICT_CHECK, nullptr); - - if (error == PW_ERR_PW_REPEAT) { - error = PW_NO_ERR; - } - return error; - } - case PwqualityManager::Grub2: { - // LEVEL_STRICT_CHECK? - ERROR_TYPE error = deepin_pw_check_grub2(user.toLocal8Bit().data(), password.toLocal8Bit().data(), LEVEL_STANDARD_CHECK, nullptr); - - if (error == PW_ERR_PW_REPEAT) { - error = PW_NO_ERR; - } - return error; - } - } - - return PW_NO_ERR; -} - -PASSWORD_LEVEL_TYPE PwqualityManager::GetNewPassWdLevel(const QString &newPasswd) -{ - return get_new_passwd_strength_level(newPasswd.toLocal8Bit().data()); -} - -QString PwqualityManager::getErrorTips(PwqualityManager::ERROR_TYPE type, CheckType checkType) -{ - int passwordPalimdromeNum = (checkType == Default ? get_pw_palimdrome_num(LEVEL_STRICT_CHECK) : get_pw_palimdrome_num_grub2(LEVEL_STRICT_CHECK)); - int passwordMonotoneCharacterNum = (checkType == Default ? get_pw_monotone_character_num(LEVEL_STRICT_CHECK) : get_pw_monotone_character_num_grub2(LEVEL_STRICT_CHECK)); - int passwordConsecutiveSameCharacterNum = (checkType == Default ? get_pw_consecutive_same_character_num(LEVEL_STRICT_CHECK) : get_pw_consecutive_same_character_num_grub2(LEVEL_STRICT_CHECK)); - m_passwordMinLen = (checkType == Default ? get_pw_min_length(LEVEL_STRICT_CHECK) : get_pw_min_length_grub2(LEVEL_STRICT_CHECK)); - m_passwordMaxLen = (checkType == Default ? get_pw_max_length(LEVEL_STRICT_CHECK) : get_pw_max_length_grub2(LEVEL_STRICT_CHECK)); - - //通用校验规则 - QMap PasswordFlagsStrMap = { - {PW_ERR_PASSWORD_EMPTY, tr("Password cannot be empty")}, - {PW_ERR_LENGTH_SHORT, tr("Password must have at least %1 characters").arg(m_passwordMinLen)}, - {PW_ERR_LENGTH_LONG, tr("Password must be no more than %1 characters").arg(m_passwordMaxLen)}, - {PW_ERR_CHARACTER_INVALID, tr("Password can only contain English letters (case-sensitive), numbers or special symbols (~`!@#$%^&*()-_+=|\\{}[]:\"'<>,.?/)")}, - {PW_ERR_PALINDROME, tr("No more than %1 palindrome characters please").arg(passwordPalimdromeNum)}, - {PW_ERR_PW_MONOTONE, tr("No more than %1 monotonic characters please").arg(passwordMonotoneCharacterNum)}, - {PW_ERR_PW_CONSECUTIVE_SAME, tr("No more than %1 repeating characters please").arg(passwordConsecutiveSameCharacterNum)}, - - }; - - //服务器版校验规则 - if (DSysInfo::UosServer == DSysInfo::uosType()) { - PasswordFlagsStrMap[PW_ERR_CHARACTER_INVALID] = tr("Password must contain uppercase letters, lowercase letters, numbers and symbols (~`!@#$%^&*()-_+=|\\{}[]:\"'<>,.?/)"); - PasswordFlagsStrMap[PW_ERR_PALINDROME] = tr("Password must not contain more than 4 palindrome characters"); - PasswordFlagsStrMap[PW_ERR_WORD] = tr("Do not use common words and combinations as password"); - PasswordFlagsStrMap[PW_ERR_PW_MONOTONE] = tr("Create a strong password please"); - PasswordFlagsStrMap[PW_ERR_PW_CONSECUTIVE_SAME] = tr("Create a strong password please"); - PasswordFlagsStrMap[PW_ERR_PW_FIRST_UPPERM] = tr("Do not use common words and combinations as password"); - } - - //规则校验以外的情况统一返回密码不符合安全要求 - if (PasswordFlagsStrMap.value(type).isEmpty()) { - PasswordFlagsStrMap[type] = tr("It does not meet password rules"); - } - - return PasswordFlagsStrMap.value(type); -} - diff --git a/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.h b/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.h deleted file mode 100644 index 4644a29ca5..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/pwqualitymanager.h +++ /dev/null @@ -1,50 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DEEPIN_INSTALLER_PWQUALITY_MANAGER_H -#define DEEPIN_INSTALLER_PWQUALITY_MANAGER_H - -#include "interface/namespace.h" - -#include -#include - -#include - -namespace DCC_NAMESPACE { -class PwqualityManager : public QObject -{ -Q_OBJECT -public: - typedef PW_ERROR_TYPE ERROR_TYPE; - - enum CheckType { - Default, - Grub2 - }; - - /** - * @brief PwqualityManager::instance 构造一个 单例 - * @return 返回一个静态实例 - */ - static PwqualityManager* instance(); - - /** - * @brief PwqualityManager::verifyPassword 校验密码 - * @param password 带检密码字符串 - * @return 若找到,返回text,反之返回空 - */ - ERROR_TYPE verifyPassword(const QString &user, const QString &password, CheckType checkType = Default); - PASSWORD_LEVEL_TYPE GetNewPassWdLevel(const QString &newPasswd); - QString getErrorTips(ERROR_TYPE type, CheckType checkType = Default); - -private: - PwqualityManager(); - PwqualityManager(const PwqualityManager&) = delete; - - int m_passwordMinLen; - int m_passwordMaxLen; -}; -} - -#endif // DEEPIN_INSTALLER_PWQUALITY_MANAGER_H diff --git a/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.cpp b/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.cpp deleted file mode 100644 index ae1a56a050..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.cpp +++ /dev/null @@ -1,85 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "userexperienceprogramwidget.h" -#include "src/plugin-commoninfo/operation/commoninfomodel.h" -#include "src/frame/utils.h" -#include "widgets/switchwidget.h" - -#include -#include - -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE -DCORE_USE_NAMESPACE -UserExperienceProgramWidget::UserExperienceProgramWidget(QWidget *parent) - : QWidget(parent) -{ - setAccessibleName("UserExperienceProgramWidget"); - QVBoxLayout *vBoxLayout = new QVBoxLayout; - - m_joinUeProgram = new SwitchWidget(); - m_joinUeProgram->addBackground(); - //~ contents_path /commoninfo/User Experience Program - //~ child_page User Experience Program - m_joinUeProgram->setTitle(tr("Join User Experience Program")); - - QString text = ""; - QString http = IS_COMMUNITY_SYSTEM ? tr("https://www.deepin.org/en/agreement/privacy/") : tr("https://www.uniontech.com/agreement/privacy-en"); - if (IS_COMMUNITY_SYSTEM) { - text = tr("

Joining User Experience Program means that you grant and authorize us to collect and use the information of your device, system and applications. " - "If you refuse our collection and use of the aforementioned information, do not join User Experience Program. " - "For details, please refer to Deepin Privacy Policy ( %1).

") - .arg(http); - } else { - text = tr("

Joining User Experience Program means that you grant and authorize us to collect and use the information of your device, system and applications. " - "If you refuse our collection and use of the aforementioned information, do not join User Experience Program. " - "To know more about the management of your data, please refer to UnionTech OS Privacy Policy ( %1).

") - .arg(http); - } - - DTipLabel *label = new DTipLabel(text); - - label->setTextFormat(Qt::RichText); - label->setAlignment(Qt::AlignJustify | Qt::AlignLeft); - label->setWordWrap(true); - connect(label, &QLabel::linkActivated, this, [](const QString &link) { - QDesktopServices::openUrl(QUrl(link)); - }); - - vBoxLayout->setMargin(0); - vBoxLayout->setContentsMargins(0, 10, 0, 10); - vBoxLayout->setSpacing(0); - vBoxLayout->addWidget(m_joinUeProgram); - vBoxLayout->addSpacing(8); - vBoxLayout->addWidget(label); - vBoxLayout->addStretch(); - - setLayout(vBoxLayout); - - connect(m_joinUeProgram, &SwitchWidget::checkedChanged, this, [this](bool state) { - m_joinUeProgram->setEnabled(false); - QTimer::singleShot(0, this, [ = ] { - this->enableUeProgram(state); - }); - }); -} - -void UserExperienceProgramWidget::setModel(CommonInfoModel *model) -{ - setDefaultUeProgram(model->ueProgram()); - connect(model, &CommonInfoModel::ueProgramChanged, m_joinUeProgram, [this](const bool enable) { - m_joinUeProgram->setEnabled(true); - m_joinUeProgram->setChecked(enable); - }); -} - -void UserExperienceProgramWidget::setDefaultUeProgram(const bool enabled) -{ - m_joinUeProgram->setChecked(enabled); -} diff --git a/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.h b/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.h deleted file mode 100644 index d87771e8c4..0000000000 --- a/dcc-old/src/plugin-commoninfo/window/userexperienceprogramwidget.h +++ /dev/null @@ -1,28 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include - - -namespace DCC_NAMESPACE { -class SwitchWidget; -class CommonInfoModel; - -class UserExperienceProgramWidget : public QWidget -{ - Q_OBJECT -public: - explicit UserExperienceProgramWidget(QWidget *parent = nullptr); - - void setModel(CommonInfoModel *model); - void setDefaultUeProgram(const bool enabled); -Q_SIGNALS: - void enableUeProgram(bool enabled); - -private: - SwitchWidget *m_joinUeProgram; -}; -} diff --git a/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.cpp b/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.cpp deleted file mode 100644 index f3f368005f..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.cpp +++ /dev/null @@ -1,247 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "datetimedbusproxy.h" - -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDateTimeDbusProxy, "dcc-datetime-dbusproxy") - -const QString TimedateService = QStringLiteral("org.deepin.dde.Timedate1"); -const QString TimedatePath = QStringLiteral("/org/deepin/dde/Timedate1"); -const QString TimedateInterface = QStringLiteral("org.deepin.dde.Timedate1"); - -const QString SystemTimedatedService = QStringLiteral("org.deepin.dde.Timedate1"); -const QString SystemTimedatedPath = QStringLiteral("/org/deepin/dde/Timedate1"); -const QString SystemTimedatedInterface = QStringLiteral("org.deepin.dde.Timedate1"); - -const QString PropertiesInterface = QStringLiteral("org.freedesktop.DBus.Properties"); -const QString PropertiesChanged = QStringLiteral("PropertiesChanged"); - -const QString LangSelectorService = QStringLiteral("org.deepin.dde.LangSelector1"); -const QString LangSelectorPath = QStringLiteral("/org/deepin/dde/LangSelector1"); -const QString LangSelectorInterface = QStringLiteral("org.deepin.dde.LangSelector1"); - -DatetimeDBusProxy::DatetimeDBusProxy(QObject *parent) - : QObject(parent) - , m_localeInter(new QDBusInterface(LangSelectorService, LangSelectorPath, LangSelectorInterface, QDBusConnection::sessionBus(), this)) - , m_timedateInter(new QDBusInterface(TimedateService, TimedatePath, TimedateInterface, QDBusConnection::sessionBus(), this)) - , m_systemtimedatedInter(new QDBusInterface(SystemTimedatedService, SystemTimedatedPath, SystemTimedatedInterface, QDBusConnection::systemBus(), this)) -{ - registerZoneInfoMetaType(); - - qRegisterMetaType("LocaleInfo"); - qDBusRegisterMetaType(); - - qRegisterMetaType("LocaleList"); - qDBusRegisterMetaType(); - QDBusConnection::sessionBus().connect(TimedateService, TimedatePath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); -} - -bool DatetimeDBusProxy::use24HourFormat() -{ - return qvariant_cast(m_timedateInter->property("Use24HourFormat")); -} -void DatetimeDBusProxy::setUse24HourFormat(bool value) -{ - m_timedateInter->setProperty("Use24HourFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::weekdayFormat() -{ - return qvariant_cast(m_timedateInter->property("WeekdayFormat")); -} -void DatetimeDBusProxy::setWeekdayFormat(int value) -{ - m_timedateInter->setProperty("WeekdayFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::longDateFormat() -{ - return qvariant_cast(m_timedateInter->property("LongDateFormat")); -} -void DatetimeDBusProxy::setLongDateFormat(int value) -{ - m_timedateInter->setProperty("LongDateFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::shortDateFormat() -{ - return qvariant_cast(m_timedateInter->property("ShortDateFormat")); -} -void DatetimeDBusProxy::setShortDateFormat(int value) -{ - m_timedateInter->setProperty("ShortDateFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::longTimeFormat() -{ - return qvariant_cast(m_timedateInter->property("LongTimeFormat")); -} -void DatetimeDBusProxy::setLongTimeFormat(int value) -{ - m_timedateInter->setProperty("LongTimeFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::shortTimeFormat() -{ - return qvariant_cast(m_timedateInter->property("ShortTimeFormat")); -} -void DatetimeDBusProxy::setShortTimeFormat(int value) -{ - m_timedateInter->setProperty("ShortTimeFormat", QVariant::fromValue(value)); -} - -int DatetimeDBusProxy::weekBegins() -{ - return qvariant_cast(m_timedateInter->property("WeekBegins")); -} -void DatetimeDBusProxy::setWeekBegins(int value) -{ - m_timedateInter->setProperty("WeekBegins", QVariant::fromValue(value)); -} - -QString DatetimeDBusProxy::nTPServer() -{ - return qvariant_cast(m_timedateInter->property("NTPServer")); -} - -QString DatetimeDBusProxy::timezone() -{ - return qvariant_cast(m_timedateInter->property("Timezone")); -} - -bool DatetimeDBusProxy::nTP() -{ - return qvariant_cast(m_timedateInter->property("NTP")); -} - -QStringList DatetimeDBusProxy::userTimezones() -{ - return qvariant_cast(m_timedateInter->property("UserTimezones")); -} - -void DatetimeDBusProxy::onPropertiesChanged(const QDBusMessage &message) -{ - QVariantMap changedProps = qdbus_cast(message.arguments().at(1).value()); - for (QVariantMap::const_iterator it = changedProps.cbegin(); it != changedProps.cend(); ++it) { - QMetaObject::invokeMethod(this, it.key().toLatin1() + "Changed", Qt::DirectConnection, QGenericArgument(it.value().typeName(), it.value().data())); - } -} - -// Timedate -void DatetimeDBusProxy::SetNTP(bool useNTP) -{ - m_timedateInter->asyncCall(QStringLiteral("SetNTP"), useNTP); -} -void DatetimeDBusProxy::SetNTP(bool useNTP, QObject *receiver, const char *member, const char *errorSlot) -{ - QList argumentList; - argumentList << QVariant::fromValue(useNTP); - m_timedateInter->callWithCallback(QStringLiteral("SetNTP"), argumentList, receiver, member, errorSlot); -} - -void DatetimeDBusProxy::SetDate(int year, int month, int day, int hour, int min, int sec, int nsec) -{ - m_timedateInter->asyncCall(QStringLiteral("SetDate"), year, month, day, hour, min, sec, nsec); -} -void DatetimeDBusProxy::SetDate(const QDateTime &datetime, QObject *receiver, const char *member) -{ - const QDate date = datetime.date(); - const QTime time = datetime.time(); - QList argumentList; - argumentList << QVariant::fromValue(date.year()) << QVariant::fromValue(date.month()) << QVariant::fromValue(date.day()); - argumentList << QVariant::fromValue(time.hour()) << QVariant::fromValue(time.minute()) << QVariant::fromValue(time.second()) << 0; - m_timedateInter->callWithCallback(QStringLiteral("SetDate"), argumentList, receiver, member); -} -void DatetimeDBusProxy::DeleteUserTimezone(const QString &zone) -{ - m_timedateInter->asyncCall(QStringLiteral("DeleteUserTimezone"), zone); -} - -void DatetimeDBusProxy::AddUserTimezone(const QString &zone) -{ - m_timedateInter->asyncCall(QStringLiteral("AddUserTimezone"), zone); -} - -QStringList DatetimeDBusProxy::GetSampleNTPServers() -{ - return QDBusPendingReply(m_timedateInter->asyncCall(QStringLiteral("GetSampleNTPServers"))); -} - -bool DatetimeDBusProxy::GetSampleNTPServers(QObject *receiver, const char *member) -{ - QList argumentList; - return m_timedateInter->callWithCallback(QStringLiteral("GetSampleNTPServers"), argumentList, receiver, member); -} - -ZoneInfo DatetimeDBusProxy::GetZoneInfo(const QString &zone) -{ - return QDBusPendingReply(m_timedateInter->asyncCall(QStringLiteral("GetZoneInfo"), zone)); -} -bool DatetimeDBusProxy::GetZoneInfo(const QString &zone, QObject *receiver, const char *member) -{ - QList argumentList; - argumentList << QVariant::fromValue(zone); - return m_timedateInter->callWithCallback(QStringLiteral("GetZoneInfo"), argumentList, receiver, member); -} - -// System Timedate -void DatetimeDBusProxy::SetTimezone(const QString &timezone) -{ - m_timedateInter->asyncCall(QStringLiteral("SetTimezone"), timezone); -} - -void DatetimeDBusProxy::SetNTPServer(const QString &server, const QString &message) -{ - m_systemtimedatedInter->asyncCall(QStringLiteral("SetNTPServer"), server, message); -} - -void DatetimeDBusProxy::SetNTPServer(const QString &server, const QString &message, QObject *receiver, const char *member, const char *errorSlot) -{ - QList argumentList; - argumentList << QVariant::fromValue(server) << QVariant::fromValue(message); - m_systemtimedatedInter->callWithCallback(QStringLiteral("SetNTPServer"), argumentList, receiver, member, errorSlot); -} - -QString DatetimeDBusProxy::currentLocale() -{ - QDBusInterface dbus(LangSelectorService, LangSelectorPath, LangSelectorInterface, QDBusConnection::sessionBus()); - return qvariant_cast(dbus.property("CurrentLocale")); -} - -std::optional DatetimeDBusProxy::getLocaleListMap() -{ - QDBusPendingReply reply = m_localeInter->asyncCall(QStringLiteral("GetLocaleList")); - reply.waitForFinished(); - if (reply.isError()) { - qCDebug(DdcDateTimeDbusProxy) << "Can not get localeRegion: "<< reply.error(); - return std::nullopt; - } - return reply.value(); -} - -std::optional DatetimeDBusProxy::getLocaleRegion() -{ - QDBusPendingReply reply = m_localeInter->asyncCall(QStringLiteral("GetLocaleRegion")); - reply.waitForFinished(); - if (reply.isError()) { - qCDebug(DdcDateTimeDbusProxy) << "Can not get localeRegion: "<< reply.error(); - return std::nullopt; - } - if (reply.value().isEmpty()) { - return std::nullopt; - } else { - return reply.value(); - } -} - -void DatetimeDBusProxy::setLocaleRegion(const QString &locale) -{ - m_localeInter->asyncCall(QStringLiteral("SetLocaleRegion"), locale); -} diff --git a/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.h b/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.h deleted file mode 100644 index 3689bebfaf..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimedbusproxy.h +++ /dev/null @@ -1,151 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DATETIMEDBUSPROXY_H -#define DATETIMEDBUSPROXY_H - -#include "zoneinfo.h" -#include -#include - -#include -class QDBusInterface; -class QDBusMessage; -class QDateTime; - -class LocaleInfo -{ -public: - LocaleInfo() { } - - friend QDBusArgument &operator<<(QDBusArgument &arg, const LocaleInfo &info) - { - arg.beginStructure(); - arg << info.id << info.name; - arg.endStructure(); - - return arg; - } - - friend const QDBusArgument &operator>>(const QDBusArgument &arg, LocaleInfo &info) - { - arg.beginStructure(); - arg >> info.id >> info.name; - arg.endStructure(); - - return arg; - } - - friend QDataStream &operator<<(QDataStream &ds, const LocaleInfo &info) - { - return ds << info.id << info.name; - } - - friend const QDataStream &operator>>(QDataStream &ds, LocaleInfo &info) - { - return ds >> info.id >> info.name; - } - - bool operator==(const LocaleInfo &info) { return id == info.id && name == info.name; } - -public: - QString id{ "" }; - QString name{ "" }; -}; - -typedef QList LocaleList; -Q_DECLARE_METATYPE(LocaleInfo) -Q_DECLARE_METATYPE(LocaleList) - -class DatetimeDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit DatetimeDBusProxy(QObject *parent = nullptr); - static QString currentLocale(); - // Timedate - Q_PROPERTY(bool Use24HourFormat READ use24HourFormat WRITE setUse24HourFormat NOTIFY Use24HourFormatChanged) - bool use24HourFormat(); - void setUse24HourFormat(bool value); - Q_PROPERTY(int WeekdayFormat READ weekdayFormat WRITE setWeekdayFormat NOTIFY WeekdayFormatChanged) - int weekdayFormat(); - void setWeekdayFormat(int value); - Q_PROPERTY(int LongDateFormat READ longDateFormat WRITE setLongDateFormat NOTIFY LongDateFormatChanged) - int longDateFormat(); - void setLongDateFormat(int value); - Q_PROPERTY(int ShortDateFormat READ shortDateFormat WRITE setShortDateFormat NOTIFY ShortDateFormatChanged) - int shortDateFormat(); - void setShortDateFormat(int value); - Q_PROPERTY(int LongTimeFormat READ longTimeFormat WRITE setLongTimeFormat NOTIFY LongTimeFormatChanged) - int longTimeFormat(); - void setLongTimeFormat(int value); - Q_PROPERTY(int ShortTimeFormat READ shortTimeFormat WRITE setShortTimeFormat NOTIFY ShortTimeFormatChanged) - int shortTimeFormat(); - void setShortTimeFormat(int value); - Q_PROPERTY(int WeekBegins READ weekBegins WRITE setWeekBegins NOTIFY WeekBeginsChanged) - int weekBegins(); - void setWeekBegins(int value); - Q_PROPERTY(QString NTPServer READ nTPServer NOTIFY NTPServerChanged) - QString nTPServer(); - Q_PROPERTY(QString Timezone READ timezone NOTIFY TimezoneChanged) - QString timezone(); - Q_PROPERTY(bool NTP READ nTP NOTIFY NTPChanged) - bool nTP(); - Q_PROPERTY(QStringList UserTimezones READ userTimezones NOTIFY UserTimezonesChanged) - QStringList userTimezones(); - - // Locale - std::optional getLocaleListMap(); - std::optional getLocaleRegion(); - - void setLocaleRegion(const QString &locale); - -Q_SIGNALS: // SIGNALS - // Timedate - // begin property changed signals - void CanNTPChanged(bool value) const; - void DSTOffsetChanged(int value) const; - void LocalRTCChanged(bool value) const; - void LongDateFormatChanged(int value) const; - void LongTimeFormatChanged(int value) const; - void NTPChanged(bool value) const; - void NTPServerChanged(const QString &value) const; - void ShortDateFormatChanged(int value) const; - void ShortTimeFormatChanged(int value) const; - void TimezoneChanged(const QString &value) const; - void Use24HourFormatChanged(bool value) const; - void UserTimezonesChanged(const QStringList &value) const; - void WeekBeginsChanged(int value) const; - void WeekdayFormatChanged(int value) const; - -public Q_SLOTS: - // Timedate - void SetNTP(bool useNTP); - void SetNTP(bool useNTP, QObject *receiver, const char *member, const char *errorSlot); - void SetDate(int year, int month, int day, int hour, int min, int sec, int nsec); - void SetDate(const QDateTime &datetime, QObject *receiver, const char *member); - void DeleteUserTimezone(const QString &zone); - void AddUserTimezone(const QString &zone); - QStringList GetSampleNTPServers(); - bool GetSampleNTPServers(QObject *receiver, const char *member); - ZoneInfo GetZoneInfo(const QString &zone); - bool GetZoneInfo(const QString &zone, QObject *receiver, const char *member); - // System Timedate - void SetTimezone(const QString &timezone); - void SetNTPServer(const QString &server, const QString &message); - void SetNTPServer(const QString &server, - const QString &message, - QObject *receiver, - const char *member, - const char *errorSlot); - -private Q_SLOTS: - void onPropertiesChanged(const QDBusMessage &message); - -private: - QDBusInterface *m_localeInter; - QDBusInterface *m_timedateInter; - QDBusInterface *m_systemtimedatedInter; -}; - -#endif // DATETIMEDBUSPROXY_H diff --git a/dcc-old/src/plugin-datetime/operation/datetimemodel.cpp b/dcc-old/src/plugin-datetime/operation/datetimemodel.cpp deleted file mode 100644 index f60a38a752..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimemodel.cpp +++ /dev/null @@ -1,226 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "datetimemodel.h" - -#include -#include -#include - -DatetimeModel::DatetimeModel(QObject *parent) - : QObject(parent) - , m_ntp(true) - , m_bUse24HourType(true) -{ -} - -void DatetimeModel::setNTP(bool ntp) -{ - if (m_ntp != ntp) { - m_ntp = ntp; - Q_EMIT NTPChanged(ntp); - } -} - -void DatetimeModel::set24HourFormat(bool state) -{ - if (m_bUse24HourType != state) { - m_bUse24HourType = state; - Q_EMIT hourTypeChanged(state); - } -} - -#ifndef DCC_DISABLE_TIMEZONE -QString DatetimeModel::systemTimeZoneId() const -{ - return m_systemTimeZoneId; -} - -void DatetimeModel::setSystemTimeZoneId(const QString &systemTimeZoneId) -{ - if (m_systemTimeZoneId != systemTimeZoneId) { - m_systemTimeZoneId = systemTimeZoneId; - Q_EMIT systemTimeZoneIdChanged(systemTimeZoneId); - } -} -#endif - -QList DatetimeModel::userTimeZones() const -{ - return m_userTimeZones; -} - -void DatetimeModel::addUserTimeZone(const ZoneInfo &zone) -{ - const QString zoneName = zone.getZoneName(); - - if (!m_userZoneIds.contains(zoneName)) { - m_userZoneIds.append(zoneName); - m_userTimeZones.append(zone); - Q_EMIT userTimeZoneAdded(zone); - } -} - -void DatetimeModel::removeUserTimeZone(const ZoneInfo &zone) -{ - const QString zoneName = zone.getZoneName(); - - if (m_userZoneIds.contains(zoneName)) { - m_userZoneIds.removeAll(zoneName); - m_userTimeZones.removeAll(zone); - Q_EMIT userTimeZoneRemoved(zone); - } -} - -void DatetimeModel::setCurrentTimeZone(const ZoneInfo ¤tTimeZone) -{ - if (m_currentTimeZone == currentTimeZone) - return; - - m_currentTimeZone = currentTimeZone; - - Q_EMIT currentTimeZoneChanged(currentTimeZone); -} - -void DatetimeModel::setCurrentUseTimeZone(const ZoneInfo ¤tSysTimeZone) -{ - if (m_currentSystemTimeZone == currentSysTimeZone) - return; - - m_currentSystemTimeZone = currentSysTimeZone; - - Q_EMIT currentSystemTimeZoneChanged(currentSysTimeZone); -} - -void DatetimeModel::setNtpServerAddress(const QString &ntpServer) -{ - if (m_strNtpServerAddress != ntpServer) { - m_strNtpServerAddress = ntpServer; - Q_EMIT NTPServerChanged(ntpServer); - } -} - -void DatetimeModel::setNTPServerList(const QStringList &list) -{ - if (m_NtpServerList != list) { - m_NtpServerList = list; - Q_EMIT NTPServerListChanged(list); - } -} - -void DatetimeModel::setTimeZoneInfo(const QString &timeZone) -{ - if (m_timeZones != timeZone) { - m_timeZones = timeZone; - Q_EMIT timeZoneChanged(timeZone); - } -} - -void DatetimeModel::setCountry(const QString &country) -{ - if (m_country != country) { - m_country = country; - Q_EMIT countryChanged(country); - } -} - -void DatetimeModel::setLocaleName(const QString &localeName) -{ - if (m_localeName != localeName) { - m_localeName = localeName; - Q_EMIT localeNameChanged(localeName); - } -} - -void DatetimeModel::setLangRegion(const QString &langCountry) -{ - if (m_langCountry != langCountry) { - m_langCountry = langCountry; - Q_EMIT langCountryChanged(langCountry); - } -} - -void DatetimeModel::setFirstDayOfWeek(const int &firstDayOfWeekFormat) -{ - if (m_firstDayOfWeekFormat != firstDayOfWeekFormat) { - m_firstDayOfWeekFormat = firstDayOfWeekFormat; - Q_EMIT firstDayOfWeekFormatChanged(firstDayOfWeekFormat); - } -} - -void DatetimeModel::setShortDateFormat(const QString &shortDateFormat) -{ - if (m_shortDateFormat != shortDateFormat) { - m_shortDateFormat = shortDateFormat; - Q_EMIT shortDateFormatChanged(shortDateFormat); - } -} - -void DatetimeModel::setLongDateFormat(const QString &longDateFormat) -{ - if (m_longDateFormat != longDateFormat) { - m_longDateFormat = longDateFormat; - Q_EMIT longDateFormatChanged(longDateFormat); - } -} - -void DatetimeModel::setShortTimeFormat(const QString &shortTimeFormat) -{ - if (m_shortTimeFormat != shortTimeFormat) { - m_shortTimeFormat = shortTimeFormat; - Q_EMIT shortTimeFormatChanged(shortTimeFormat); - } -} - -void DatetimeModel::setLongTimeFormat(const QString &longTimeFormat) -{ - if (m_longTimeFormat != longTimeFormat) { - m_longTimeFormat = longTimeFormat; - Q_EMIT longTimeFormatChanged(longTimeFormat); - } -} - -void DatetimeModel::setCurrencyFormat(const QString ¤cyFormat) -{ - if (m_currencyFormat != currencyFormat) { - m_currencyFormat = currencyFormat; - Q_EMIT currencyFormatChanged(currencyFormat); - } -} - -void DatetimeModel::setNumberFormat(const QString &numberFormat) -{ - if (m_numberFormat != numberFormat) { - m_numberFormat = numberFormat; - Q_EMIT numberFormatChanged(numberFormat); - } -} - -void DatetimeModel::setPaperFormat(const QString &paperFormat) -{ - if (m_paperFormat != paperFormat) { - m_paperFormat = paperFormat; - Q_EMIT paperFormatChanged(paperFormat); - } -} - -void DatetimeModel::setRegionFormat(const RegionFormat ®ionFormat) -{ - if (m_regionFormat != regionFormat) { - m_regionFormat = regionFormat; - } -} - -void DatetimeModel::setCountries(const QStringList &countries) -{ - if (m_countries != countries) { - m_countries = countries; - } -} - -void DatetimeModel::setRegions(const Regions ®ions) -{ - if (m_regions != regions) { - m_regions = regions; - } -} diff --git a/dcc-old/src/plugin-datetime/operation/datetimemodel.h b/dcc-old/src/plugin-datetime/operation/datetimemodel.h deleted file mode 100644 index 108076a1e4..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimemodel.h +++ /dev/null @@ -1,148 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DATETIMEMODEL_H -#define DATETIMEMODEL_H - -#include - -#include "zoneinfo.h" -#include "regionproxy.h" - -class DatetimeModel : public QObject -{ - Q_OBJECT -public: - using Regions = QMap; - - explicit DatetimeModel(QObject *parent = nullptr); - - inline bool nTP() const { return m_ntp; } - void setNTP(bool ntp); - inline bool get24HourFormat() const { return m_bUse24HourType; } - - QList userTimeZones() const; - void addUserTimeZone(const ZoneInfo &zone); - void removeUserTimeZone(const ZoneInfo &zone); -#ifndef DCC_DISABLE_TIMEZONE - QString systemTimeZoneId() const; - void setSystemTimeZoneId(const QString &systemTimeZoneId); -#endif - inline ZoneInfo currentTimeZone() const - { - return m_currentTimeZone; - } - void setCurrentTimeZone(const ZoneInfo ¤tTimeZone); - - inline ZoneInfo currentSystemTimeZone() const { return m_currentSystemTimeZone; } - void setCurrentUseTimeZone(const ZoneInfo ¤tTimeZone); - - inline QString ntpServerAddress() const { return m_strNtpServerAddress; } - void setNtpServerAddress(const QString &ntpServer); - - inline QStringList ntpServerList() const { return m_NtpServerList; } - void setNTPServerList(const QStringList &list); - - inline QString getTimeZone() const { return m_timeZones; } - void setTimeZoneInfo(const QString &timeZone); - - inline QString country() const { return m_country; } - void setCountry(const QString &country); - - inline QString localeName() const { return m_localeName; } - void setLocaleName(const QString &localeName); - - inline QString langRegion() const { return m_langCountry; } - void setLangRegion(const QString &langCountry); - - inline int firstDayOfWeekFormat() const { return m_firstDayOfWeekFormat; } - void setFirstDayOfWeek(const int &firstDayOfWeekFormat); - - inline QString shortDateFormat() const { return m_shortDateFormat; } - void setShortDateFormat(const QString &shortDateFormat); - - inline QString longDateFormat() const { return m_longDateFormat; } - void setLongDateFormat(const QString &longDateFormat); - - inline QString shortTimeFormat() const { return m_shortTimeFormat; } - void setShortTimeFormat(const QString &shortTimeFormat); - - inline QString longTimeFormat() const { return m_longTimeFormat; } - void setLongTimeFormat(const QString &longTimeFormat); - - inline QString currencyFormat() const { return m_currencyFormat; } - void setCurrencyFormat(const QString ¤cyFormat); - - inline QString numberFormat() const { return m_numberFormat; } - void setNumberFormat(const QString &numberFormat); - - inline QString paperFormat() const { return m_paperFormat; } - void setPaperFormat(const QString &paperFormat); - - inline RegionFormat regionFormat() const { return m_regionFormat; } - void setRegionFormat(const RegionFormat ®ionFormat); - - inline QStringList countries() const { return m_countries; } - void setCountries(const QStringList &countries); - - inline Regions regions() const { return m_regions; } - void setRegions(const Regions ®ions); - -Q_SIGNALS: - void NTPChanged(bool value); - void hourTypeChanged(bool value); - void userTimeZoneAdded(const ZoneInfo &zone); - void userTimeZoneRemoved(const ZoneInfo &zone); - void systemTimeZoneIdChanged(const QString &zone); - void systemTimeChanged(); - void currentTimeZoneChanged(const ZoneInfo &zone) const; - void currentSystemTimeZoneChanged(const ZoneInfo &zone) const; - void NTPServerChanged(QString server); - void NTPServerListChanged(QStringList list); - void NTPServerNotChanged(QString server); - void timeZoneChanged(QString value); - void localeNameChanged(const QString &localeName); - void countryChanged(const QString &country); - void langCountryChanged(const QString &langCountry); - void firstDayOfWeekFormatChanged(const int firstDayOfWeekFormat); - void shortDateFormatChanged(const QString &shortDateFormat); - void longDateFormatChanged(const QString &longDate); - void shortTimeFormatChanged(const QString &shortTimeFormat); - void longTimeFormatChanged(const QString &longTimeFormat); - void currencyFormatChanged(const QString ¤cyFormat); - void numberFormatChanged(const QString &numberFormat); - void paperFormatChanged(const QString &numberFormat); - -public Q_SLOTS: - void set24HourFormat(bool state); - -private: - bool m_ntp; - bool m_bUse24HourType; - QStringList m_userZoneIds; -#ifndef DCC_DISABLE_TIMEZONE - QString m_systemTimeZoneId; -#endif - QList m_userTimeZones; - ZoneInfo m_currentTimeZone; - ZoneInfo m_currentSystemTimeZone; - QString m_strNtpServerAddress; - QStringList m_NtpServerList; - QString m_timeZones; - QString m_country; - QString m_langCountry; - QStringList m_countries; - Regions m_regions; - QString m_localeName; - int m_firstDayOfWeekFormat; - QString m_shortDateFormat; - QString m_longDateFormat; - QString m_shortTimeFormat; - QString m_longTimeFormat; - QString m_currencyFormat; - QString m_numberFormat; - QString m_paperFormat; - RegionFormat m_regionFormat; -}; - -#endif // DATETIMEMODEL_H diff --git a/dcc-old/src/plugin-datetime/operation/datetimeworker.cpp b/dcc-old/src/plugin-datetime/operation/datetimeworker.cpp deleted file mode 100644 index 32b71fe35d..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimeworker.cpp +++ /dev/null @@ -1,401 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "datetimeworker.h" -#include "datetimedbusproxy.h" -#include "regionproxy.h" -#include - -#include -#include -#include - -#include -#include - -Q_LOGGING_CATEGORY(DdcDateTimeWorkder, "dcc-datetime-worker") - - -DatetimeWorker::DatetimeWorker(DatetimeModel *model, QObject *parent) - : QObject(parent) - , m_model(model) - , m_timedateInter(new DatetimeDBusProxy(this)) - , m_regionInter(new RegionProxy(this)) - , m_config(DTK_CORE_NAMESPACE::DConfig::createGeneric("org.deepin.region-format", QString(), this)) -{ -#ifndef DCC_DISABLE_TIMEZONE - connect(m_timedateInter, &DatetimeDBusProxy::UserTimezonesChanged, this, &DatetimeWorker::onTimezoneListChanged); - connect(m_timedateInter, &DatetimeDBusProxy::TimezoneChanged, m_model, &DatetimeModel::setSystemTimeZoneId); -#endif - connect(m_timedateInter, &DatetimeDBusProxy::NTPChanged, m_model, &DatetimeModel::setNTP); - connect(m_timedateInter, &DatetimeDBusProxy::Use24HourFormatChanged, m_model, &DatetimeModel::set24HourFormat); - - connect(m_timedateInter, &DatetimeDBusProxy::TimezoneChanged, this, [=](const QString &value) { - auto tzinfo = GetZoneInfo(value); - if (tzinfo.getZoneName().length() == 0) { - tzinfo = GetZoneInfo(QTimeZone::systemTimeZoneId()); - } - m_model->setCurrentUseTimeZone(tzinfo); - }); - - connect(m_timedateInter, &DatetimeDBusProxy::NTPServerChanged, m_model, &DatetimeModel::setNtpServerAddress); - connect(m_timedateInter, &DatetimeDBusProxy::TimezoneChanged, m_model, &DatetimeModel::setTimeZoneInfo); - - m_model->setCurrentTimeZone(GetZoneInfo(QTimeZone::systemTimeZoneId())); - m_model->setCurrentUseTimeZone(GetZoneInfo(m_timedateInter->timezone())); - m_model->set24HourFormat(m_timedateInter->use24HourFormat()); - - refreshNtpServerList(); - m_model->setNtpServerAddress(m_timedateInter->nTPServer()); - m_model->setTimeZoneInfo(m_timedateInter->timezone()); - m_model->setNTP(m_timedateInter->nTP()); - - initRegionFormatData(); -} - -DatetimeWorker::~DatetimeWorker() -{ -} - -void DatetimeWorker::activate() -{ - if (!m_regionInter->isActive()) { - m_regionInter->active(); - m_model->setCountries(m_regionInter->countries()); - m_model->setRegions(m_regionInter->regions()); - } - m_model->setNTP(m_timedateInter->nTP()); -#ifndef DCC_DISABLE_TIMEZONE - m_model->setSystemTimeZoneId(m_timedateInter->timezone()); - onTimezoneListChanged(m_timedateInter->userTimezones()); -#endif -} - -void DatetimeWorker::deactivate() -{ -} - -void DatetimeWorker::setNTP(bool ntp) -{ - Q_EMIT requestSetAutoHide(false); - m_timedateInter->SetNTP(ntp, this, SLOT(setAutoHide()), SLOT(setNTPError())); -} -void DatetimeWorker::setAutoHide() -{ - Q_EMIT requestSetAutoHide(true); -} -void DatetimeWorker::setNTPError() -{ - Q_EMIT m_model->NTPChanged(m_model->nTP()); - setAutoHide(); -} - -void DatetimeWorker::setDatetime(const QDateTime &datetime) -{ - Q_EMIT requestSetAutoHide(false); - qCDebug(DdcDateTimeWorkder) << "start setDatetime"; - m_setDatetime = new QDateTime(datetime); - m_timedateInter->SetNTP(false, this, SLOT(setDatetimeStart()), SLOT(setAutoHide())); -} -void DatetimeWorker::setDatetimeStart() -{ - if (m_setDatetime) { - qCDebug(DdcDateTimeWorkder) << "set ntp success, m_timedateInter->SetDate"; - m_timedateInter->SetDate(*m_setDatetime, this, SLOT(setDateFinished())); - delete m_setDatetime; - m_setDatetime = nullptr; - } - setAutoHide(); -} -void DatetimeWorker::setDateFinished() -{ - Q_EMIT m_model->systemTimeChanged(); -} -void DatetimeWorker::set24HourType(bool state) -{ - m_timedateInter->setUse24HourFormat(state); -} - -#ifndef DCC_DISABLE_TIMEZONE -void DatetimeWorker::setTimezone(const QString &timezone) -{ - m_timedateInter->SetTimezone(timezone); -} - -void DatetimeWorker::removeUserTimeZone(const ZoneInfo &info) -{ - m_timedateInter->DeleteUserTimezone(info.getZoneName()); -} - -void DatetimeWorker::addUserTimeZone(const QString &zone) -{ - m_timedateInter->AddUserTimezone(zone); -} - -void DatetimeWorker::setNtpServer(QString server) -{ - qInfo() << "Try set server : " << server; - - if (server.isEmpty() && server == m_timedateInter->nTPServer()) - return; - m_timedateInter->SetNTPServer(server, tr("Authentication is required to change NTP server"), this, SLOT(SetNTPServerFinished()), SLOT(SetNTPServerError())); -} - -void DatetimeWorker::SetNTPServerFinished() -{ - qInfo() << "set server success."; - Q_EMIT m_model->NTPServerChanged(m_timedateInter->nTPServer()); -} -void DatetimeWorker::SetNTPServerError() -{ - qInfo() << "Not set server success."; - Q_EMIT m_model->NTPServerNotChanged(m_timedateInter->nTPServer()); -} - -void DatetimeWorker::setWeekdayFormat(int type) -{ - m_timedateInter->setWeekdayFormat(type); -} - -void DatetimeWorker::setShortDateFormat(int type) -{ - m_timedateInter->setShortDateFormat(type); -} - -void DatetimeWorker::setLongDateFormat(int type) -{ - m_timedateInter->setLongDateFormat(type); -} - -void DatetimeWorker::setLongTimeFormat(int type) -{ - m_timedateInter->setLongTimeFormat(type); -} - -void DatetimeWorker::setShortTimeFormat(int type) -{ - m_timedateInter->setShortTimeFormat(type); -} - -void DatetimeWorker::setWeekStartDayFormat(int type) -{ - m_timedateInter->setWeekBegins(type); -} - -void DatetimeWorker::onTimezoneListChanged(const QStringList &timezones) -{ - QList zones = m_model->userTimeZones(); - QStringList zonesName; - for (const ZoneInfo &zone : zones) { - zonesName.append(zone.getZoneName()); - } - for (const QString &zone : timezones) { - zonesName.removeOne(zone); - m_timedateInter->GetZoneInfo(zone, this, SLOT(getZoneInfoFinished(ZoneInfo))); - } - for (const ZoneInfo &zone : zones) { - if (zonesName.contains(zone.getZoneName())) { - m_model->removeUserTimeZone(zone); - } - } -} - -void DatetimeWorker::getZoneInfoFinished(ZoneInfo zoneInfo) -{ - m_model->addUserTimeZone(zoneInfo); -} -#endif - -void DatetimeWorker::refreshNtpServerList() -{ - m_timedateInter->GetSampleNTPServers(this, SLOT(getSampleNTPServersFinished(const QStringList &))); -} - -void DatetimeWorker::getSampleNTPServersFinished(const QStringList &serverList) -{ - m_model->setNTPServerList(serverList); -} - -ZoneInfo DatetimeWorker::GetZoneInfo(const QString &zoneId) -{ - return m_timedateInter->GetZoneInfo(zoneId); -} - -void DatetimeWorker::initRegionFormatData() -{ - if (!m_config->isValid()) - return; - - if (m_config->isDefaultValue(country_key)) { - m_model->setCountry(m_regionInter->systemCountry()); - } else { - m_model->setCountry(m_config->value(country_key).toString()); - } - if (m_config->isDefaultValue(languageRegion_key) || m_config->value(languageRegion_key).toString().isEmpty()) { - m_model->setLangRegion(m_regionInter->langCountry()); - } else { - m_model->setLangRegion(m_config->value(languageRegion_key).toString()); - } - if (m_config->isDefaultValue(localeName_key)) { - m_model->setLocaleName(QLocale::system().name()); - } else { - m_model->setLocaleName(m_config->value(localeName_key).toString()); - } - if (m_config->isDefaultValue(firstDayOfWeek_key)) { - QLocale locale(QLocale::system().name()); - m_model->setFirstDayOfWeek(m_regionInter->regionFormat(locale).firstDayOfWeekFormat); - } else { - m_model->setFirstDayOfWeek(m_config->value(firstDayOfWeek_key).toInt()); - } - if (m_config->isDefaultValue(shortDateFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setShortDateFormat(m_regionInter->regionFormat(locale).shortDateFormat); - } else { - m_model->setShortDateFormat(m_config->value(shortDateFormat_key).toString()); - } - if (m_config->isDefaultValue(longDateFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setLongDateFormat(m_regionInter->regionFormat(locale).longDateFormat); - } else { - m_model->setLongDateFormat(m_config->value(longDateFormat_key).toString()); - } - if (m_config->isDefaultValue(shortTimeFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setShortTimeFormat(m_regionInter->regionFormat(locale).shortTimeFormat); - } else { - m_model->setShortTimeFormat(m_config->value(shortTimeFormat_key).toString()); - } - if (m_config->isDefaultValue(longTimeFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setLongTimeFormat(m_regionInter->regionFormat(locale).longTimeFormat); - } else { - m_model->setLongTimeFormat(m_config->value(longTimeFormat_key).toString()); - } - if (m_config->isDefaultValue(currencyFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setCurrencyFormat(m_regionInter->regionFormat(locale).currencyFormat); - } else { - m_model->setCurrencyFormat(m_config->value(currencyFormat_key).toString()); - } - if (m_config->isDefaultValue(numberFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setNumberFormat(m_regionInter->regionFormat(locale).numberFormat); - } else { - m_model->setNumberFormat(m_config->value(numberFormat_key).toString()); - } - if (m_config->isDefaultValue(paperFormat_key)) { - QLocale locale(QLocale::system().name()); - m_model->setPaperFormat(m_regionInter->regionFormat(locale).paperFormat); - } else { - m_model->setPaperFormat(m_config->value(paperFormat_key).toString()); - } - - RegionFormat regionFormat; - regionFormat.firstDayOfWeekFormat = m_model->firstDayOfWeekFormat(); - regionFormat.shortDateFormat = m_model->shortDateFormat(); - regionFormat.longDateFormat = m_model->longDateFormat(); - regionFormat.shortTimeFormat = m_model->shortTimeFormat(); - regionFormat.longTimeFormat = m_model->longTimeFormat(); - regionFormat.paperFormat = m_model->paperFormat(); - regionFormat.currencyFormat = m_model->currencyFormat(); - regionFormat.numberFormat = m_model->numberFormat(); - m_model->setRegionFormat(regionFormat); - - connect(m_config, &DTK_CORE_NAMESPACE::DConfig::valueChanged, this, [this] (const QString &key) { - if (key == country_key) { - m_model->setCountry(m_config->value(key).toString()); - } else if (key == languageRegion_key) { - m_model->setLangRegion(m_config->value(key).toString()); - } else if (key == localeName_key) { - m_model->setLocaleName(m_config->value(key).toString()); - } else if (key == firstDayOfWeek_key) { - m_model->setFirstDayOfWeek(m_config->value(key).toInt()); - } else if (key == shortDateFormat_key) { - m_model->setShortDateFormat(m_config->value(key).toString()); - } else if (key == longDateFormat_key) { - m_model->setLongDateFormat(m_config->value(key).toString()); - } else if (key == shortTimeFormat_key) { - m_model->setShortTimeFormat(m_config->value(key).toString()); - } else if (key == longTimeFormat_key) { - m_model->setLongTimeFormat(m_config->value(key).toString()); - } else if (key == currencyFormat_key) { - m_model->setCurrencyFormat(m_config->value(key).toString()); - } else if (key == numberFormat_key) { - m_model->setNumberFormat(m_config->value(key).toString()); - } else if (key == paperFormat_key) { - m_model->setPaperFormat(m_config->value(key).toString()); - } - }); -} - -std::optional DatetimeWorker::getSupportedLocale() -{ - if (m_supportedLocaleList.has_value()) { - return m_supportedLocaleList; - } - static QString LOCALE_LIST_FILE = QStringLiteral(LOCALE_I18N_PATH); - QFile file(LOCALE_LIST_FILE); - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) - return std::nullopt; - QStringList localelist; - QTextStream in(&file); - while (!in.atEnd()) { - QString line = in.readLine(); - QStringList out = line.split(" "); - localelist.push_back(out[0]); - } - m_supportedLocaleList = localelist; - return m_supportedLocaleList; -} - -std::optional DatetimeWorker::getAllLocale() -{ - return m_timedateInter->getLocaleListMap(); -} - -std::optional DatetimeWorker::getLocaleRegion() -{ - return m_timedateInter->getLocaleRegion(); -} - -void DatetimeWorker::setLocaleRegion(const QString &locale) -{ - m_timedateInter->setLocaleRegion(locale); -} - -void DatetimeWorker::setConfigValue(const QString &key, const QVariant &value) -{ - m_config->setValue(key, value); -} - -void DatetimeWorker::genLocale(const QString &localeName) -{ - static QString localeConfPath = QStandardPaths::writableLocation(QStandardPaths::ConfigLocation) + QDir::separator() + "locale.conf"; - - QSettings settings(localeConfPath, QSettings::IniFormat); - - auto supportedLocaleListRes = getSupportedLocale(); - if (!supportedLocaleListRes.has_value()) { - return; - } - - QStringList supportedLocaleList = supportedLocaleListRes.value(); - QString localeSet; - if (QString otherLocaleName = localeName + ".UTF-8"; - supportedLocaleList.contains(otherLocaleName)) { - localeSet = otherLocaleName; - } else if (supportedLocaleList.contains(localeName)) { - localeSet = localeName; - } else { - return; - } - - settings.setValue("LC_NUMERIC", localeSet); - settings.setValue("LC_MONETARY", localeSet); - settings.setValue("LC_TIME", localeSet); - settings.setValue("LC_PAPER", localeSet); - settings.setValue("LC_NAME", localeSet); - settings.setValue("LC_ADDRESS", localeSet); - settings.setValue("LC_TELEPHONE", localeSet); - settings.setValue("LC_MEASUREMENT", localeSet); -} diff --git a/dcc-old/src/plugin-datetime/operation/datetimeworker.h b/dcc-old/src/plugin-datetime/operation/datetimeworker.h deleted file mode 100644 index d3394923f9..0000000000 --- a/dcc-old/src/plugin-datetime/operation/datetimeworker.h +++ /dev/null @@ -1,92 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DATETIMEWORKER_H -#define DATETIMEWORKER_H - -#include "datetimemodel.h" -#include "datetimedbusproxy.h" - -#include - -#include - -#include -#include - -class DatetimeDBusProxy; -class RegionProxy; - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -class DatetimeWorker : public QObject -{ - Q_OBJECT -public: - explicit DatetimeWorker(DatetimeModel *model, QObject *parent = nullptr); - ~DatetimeWorker(); - - void activate(); - void deactivate(); - DatetimeModel *model() { return m_model; } - - std::optional getAllLocale(); - std::optional getLocaleRegion(); - - void setLocaleRegion(const QString &locale); - void setConfigValue(const QString &key, const QVariant &value); - -Q_SIGNALS: - void requestSetAutoHide(const bool visible) const; - -public Q_SLOTS: - void setNTP(bool ntp); - void setDatetime(const QDateTime &time); - void set24HourType(bool state); -#ifndef DCC_DISABLE_TIMEZONE - void setTimezone(const QString &timezone); - void removeUserTimeZone(const ZoneInfo &info); - void addUserTimeZone(const QString &zone); -#endif - void setNtpServer(QString server); - - void setWeekdayFormat(int type); - void setShortDateFormat(int type); - void setLongDateFormat(int type); - void setLongTimeFormat(int type); - void setShortTimeFormat(int type); - void setWeekStartDayFormat(int type); - - void genLocale(const QString &localeName); - -private Q_SLOTS: -#ifndef DCC_DISABLE_TIMEZONE - void onTimezoneListChanged(const QStringList &timezones); -#endif - void setAutoHide(); - void setNTPError(); - void setDatetimeStart(); - void setDateFinished(); - void getSampleNTPServersFinished(const QStringList &serverList); - void SetNTPServerFinished(); - void SetNTPServerError(); - void getZoneInfoFinished(ZoneInfo zoneInfo); - -private: - void refreshNtpServerList(); - ZoneInfo GetZoneInfo(const QString &zoneId); - void initRegionFormatData(); - std::optional getSupportedLocale(); - -private: - DatetimeModel *m_model; - DatetimeDBusProxy *m_timedateInter; - QDateTime *m_setDatetime; - RegionProxy *m_regionInter; - DTK_CORE_NAMESPACE::DConfig *m_config; - std::optional m_supportedLocaleList; -}; - -#endif // DATETIMEWORKER_H diff --git a/dcc-old/src/plugin-datetime/operation/qrc/datetime.qrc b/dcc-old/src/plugin-datetime/operation/qrc/datetime.qrc deleted file mode 100644 index 267df3ade3..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/datetime.qrc +++ /dev/null @@ -1,18 +0,0 @@ - - - icons/dcc_nav_datetime_42px.svg - icons/dcc_nav_datetime_84px.svg - texts/dcc_clock_white_16px.svg - texts/dcc_noun_minute_16px.svg - texts/dcc_noun_hour_16px.svg - texts/dcc_clock_black_16px.svg - texts/dcc_noun_second_16px.svg - resource/deepindigitaltimes-Regular.ttf - images/indicator_active.png - images/timezone_map_big2.png - images/timezone_map_big.png - images/timezone_map_big@1x.svg - images/timezone_map_big@2x.png - images/popup_menu.css - - \ No newline at end of file diff --git a/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_42px.svg b/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_42px.svg deleted file mode 100644 index 3ca1ed2134..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_42px.svg +++ /dev/null @@ -1,57 +0,0 @@ - - - dcc_nav_datetime_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_84px.svg b/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_84px.svg deleted file mode 100644 index 39ed24ac67..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/icons/dcc_nav_datetime_84px.svg +++ /dev/null @@ -1,49 +0,0 @@ - - - dcc_nav_datetime_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-datetime/operation/qrc/images/indicator_active.png b/dcc-old/src/plugin-datetime/operation/qrc/images/indicator_active.png deleted file mode 100644 index 12dc84d284eb6325eca947f91e7f84fd52b2dc7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 272 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=$1|-8uW1a&kmUKs7M+SzC{oH>NS%LiHo-U3d z8luT54Gd*@d3lU$SC%LJFW_+dmzWU3&bis(&;FC29{>H6eN(G@f8F0-j2d4i3wmtO zRw>Ek+VR}y-{Au(%t0M|5fcAoe{LxDde_XFdR?+nt$X#k%DrsUlV+q%Saw@;kz&s> z?s?N|(#7Ajc|KTdS-(#|m1(Ese5Dl22~lb@*e9wMY;??;S>X9dD4mH_R?oAf5GWpC zvDo{;qvk7FVdQ&MBb@0K^$>AOHXW diff --git a/dcc-old/src/plugin-datetime/operation/qrc/images/popup_menu.css b/dcc-old/src/plugin-datetime/operation/qrc/images/popup_menu.css deleted file mode 100644 index dd9ef4b137..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/images/popup_menu.css +++ /dev/null @@ -1,27 +0,0 @@ -/** Used in class PopupMenu **/ - -QHeaderView, -QHeaderView::section, -QListCornerButton::section { - background-color: transparent; -} - -QListView { - font-size: 12px; - border: none; - margin: 4px 0px; - padding: 0px; - background: transparent; - - /* make the selection span the entire width of the view */ - show-decoration-selected: 0; -} - -QListView::item { - background: transparent; - height: 24px; - padding: 0px; - margin: 0px; - outline: none; - border-bottom: 1px solid rgba(0, 0, 0, 0.05); -} diff --git a/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big.png b/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big.png deleted file mode 100644 index 9a3c3ad586943a8c695eef2f873767d3f1120a9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 106965 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 diff --git a/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big2.png b/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big2.png deleted file mode 100644 index 3ecb36561662c93cf7d64654d88389e94f8777fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65327 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

?csEri+>BEtjPAFNc#qj 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ν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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big@2x.png b/dcc-old/src/plugin-datetime/operation/qrc/images/timezone_map_big@2x.png deleted file mode 100644 index a6fb8f1888a7156a1976025453b02bd39679a7ff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269633 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%0Ap6Y8+)sObduZ`agGnj&i|Hm?bGv4*29e9${w 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

ZDGfxi~DMRl4cgpkE@`ukTM}& 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 S#httjFQ0DQ&ujxYm-{cP(q!`h diff --git a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_black_16px.svg b/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_black_16px.svg deleted file mode 100644 index 36ac2e555e..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_black_16px.svg +++ /dev/null @@ -1,50 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_white_16px.svg b/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_white_16px.svg deleted file mode 100644 index 5f2cf1dca7..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_clock_white_16px.svg +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_hour_16px.svg b/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_hour_16px.svg deleted file mode 100644 index 8cbdc7dc02..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_hour_16px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_minute_16px.svg b/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_minute_16px.svg deleted file mode 100644 index fc614a83d8..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_minute_16px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_second_16px.svg b/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_second_16px.svg deleted file mode 100644 index 5e969e5aaf..0000000000 --- a/dcc-old/src/plugin-datetime/operation/qrc/texts/dcc_noun_second_16px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-datetime/operation/regionproxy.cpp b/dcc-old/src/plugin-datetime/operation/regionproxy.cpp deleted file mode 100644 index b9861cb0a3..0000000000 --- a/dcc-old/src/plugin-datetime/operation/regionproxy.cpp +++ /dev/null @@ -1,376 +0,0 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "regionproxy.h" - -#include -#include - -static const QDate CurrentDate(2023, 1, 1); -static const QTime CurrentTime(1, 1, 1); - -class Format -{ - enum Type { Date, Time }; - -public: - virtual ~Format() = default; - - inline QStringList daysText() - { - return QStringList() << m_locale.dayName(Qt::Monday) << m_locale.dayName(Qt::Tuesday) - << m_locale.dayName(Qt::Wednesday) << m_locale.dayName(Qt::Thursday) - << m_locale.dayName(Qt::Friday) << m_locale.dayName(Qt::Saturday) - << m_locale.dayName(Qt::Sunday); - } - - inline QStringList shortDatesText() { return textFromFormat(Date, shortDateFormats()); } - - inline QStringList longDatesText() { return textFromFormat(Date, longDateFormats()); } - - inline QStringList shortTimesText() { return textFromFormat(Time, shortTimeFormats()); } - - inline QStringList longTimesText() { return textFromFormat(Time, longTimeFormats()); } - - virtual QStringList shortDateFormats() { return QStringList(); } - - virtual QStringList longDateFormats() { return QStringList(); } - - virtual QStringList shortTimeFormats() { return QStringList(); } - - virtual QStringList longTimeFormats() { return QStringList(); } - - void updateState(QDate date, QTime time, QLocale locale) - { - m_date = date; - m_time = time; - m_locale = locale; - } - -private: - QStringList textFromFormat(Type type, const QStringList &formats) - { - QStringList text; - for (const QString &format : formats) - type == Date ? text << m_locale.toString(m_date, format) - : text << m_locale.toString(m_time, format); - return text; - } - -private: - QDate m_date; - QTime m_time; - -protected: - QLocale m_locale; -}; - -class DefaultFormat : public Format -{ -public: - virtual ~DefaultFormat() override { } - - virtual QStringList shortDateFormats() override - { - return { m_locale.dateFormat(QLocale::ShortFormat) }; - } - - virtual QStringList longDateFormats() override - { - return { m_locale.dateFormat(QLocale::LongFormat) }; - } - - virtual QStringList shortTimeFormats() override - { - return { m_locale.timeFormat(QLocale::ShortFormat) }; - } - - virtual QStringList longTimeFormats() override - { - return { m_locale.timeFormat(QLocale::LongFormat) }; - } -}; - -class ChineseSimpliedFormat : public Format -{ -public: - virtual QStringList shortDateFormats() override - { - return { "yyyy/M/d", "yyyy-M-d", "yyyy.M.d", "yyyy/MM/dd", "yyyy-MM-dd", - "yyyy.MM.dd", "yy/M/d", "yy-M-d", "yy.M.d" }; - } - - virtual QStringList longDateFormats() override - { - return { "yyyy年M月d日", "yyyy年M月d日,dddd", "yyyy年M月d日 dddd", "dddd yyyy年M月d日" }; - } - - virtual QStringList shortTimeFormats() override - { - return { "H:mm", "HH:mm", "AP h:mm", "AP hh:mm" }; - } - - virtual QStringList longTimeFormats() override - { - return { "H:mm:ss", "HH:mm:ss", "AP H:mm:ss", "AP HH:mm:ss" }; - } -}; - -class UKFormat : public Format -{ -public: - virtual QStringList shortDateFormats() override - { - return { "dd/MM/yyyy", "dd/MM/yy", "d/M/yy", "d.M.yy", "yyyy-MM-dd" }; - } - - virtual QStringList longDateFormats() override - { - return { "dd MMMM yyyy", "d MMMM yyyy", "dddd,d MMMM yyyy", "dddd, dd MMMM yyyy" }; - } - - virtual QStringList shortTimeFormats() override - { - return { "HH:mm", "H:mm", "HH:mm AP", "H:mm AP" }; - } - - virtual QStringList longTimeFormats() override - { - return { "HH:mm:ss", "H:mm:ss", "HH:mm:ss ap", "apH:mm:ss ap" }; - } -}; - -class USAFormat : public Format -{ -public: - virtual QStringList shortDateFormats() override - { - return { "M/d/yyyy", "M/d/yy", "MM/dd/yy", "MM/dd/yyyy", - "yy/MM/dd", "yyyy-MM-dd", "dd-MMM-yy" }; - } - - virtual QStringList longDateFormats() override - { - return { "dddd, MMMM d, yyyy", "MMMM d, yyyy", "dddd, d MMMM, yyyy", "d MMMM, yyyy" }; - } - - virtual QStringList shortTimeFormats() override - { - return { "H:mm AP", "HH:mm AP", "H:mm", "HH:mm" }; - } - - virtual QStringList longTimeFormats() override - { - return { "H:mm:ss AP", "HH:mm:ss AP", "H:mm:ss", "HH:mm:ss" }; - } -}; - -class WorldFormat : public Format -{ -public: - virtual QStringList shortDateFormats() override { return { "dd/MM/yyyy", "d MMM yyyy" }; } - - virtual QStringList longDateFormats() override - { - return { "dddd, d MMMM yyyy", "d MMMM yyyy" }; - } - - virtual QStringList shortTimeFormats() override { return { "H:mm AP", "HH:mm" }; } - - virtual QStringList longTimeFormats() override { return { "H:mm:ss AP", "HH:mm:ss" }; } -}; - -RegionAvailableData RegionProxy::m_formatData = RegionAvailableData(); -RegionAvailableData RegionProxy::m_allFormat = RegionAvailableData(); -RegionAvailableData RegionProxy::m_defaultFormat = RegionAvailableData(); -RegionAvailableData RegionProxy::m_customFormat = RegionAvailableData(); - -RegionProxy::RegionProxy(QObject *parent) - : QObject(parent) - , m_translatorLanguage(nullptr) - , m_translatorCountry(nullptr) - , m_isActive(false) -{ -} - -// the locale even has sichuangYi. too many languages -void RegionProxy::active() -{ - if (m_isActive) { - return; - } - m_isActive = true; - m_translatorLanguage = new QTranslator(this); - m_translatorLanguage->load("/usr/share/dde-control-center/translations/datetime_language_" - + QLocale::system().name()); - qApp->installTranslator(m_translatorLanguage); - m_translatorCountry = new QTranslator(this); - m_translatorCountry->load("/usr/share/dde-control-center/translations/datetime_country_" - + QLocale::system().name()); - qApp->installTranslator(m_translatorCountry); - - QList locales = - QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); - locales.removeOne(QLocale::C); - // NOTE: sorry for Sichuang friends - locales.removeOne(QLocale::SichuanYi); - QStringList countries; - for (const auto &locale : locales) { - QString script = locale.scriptToString(locale.script()); - QString language = locale.languageToString(locale.language()); - QString country = locale.countryToString(locale.country()); - // NOTE: sorry for guangdong friends - if (locale.language() == QLocale::Cantonese && locale.language() == QLocale::Chinese) { - continue; - } - if ((locale.country() == QLocale::HongKong || locale.country() == QLocale::Taiwan) - && locale.language() == QLocale::Chinese) - language = "Traditional Chinese"; - if (locale.country() == QLocale::China && locale.language() == QLocale::Chinese) - language = "Simplified Chinese"; - QString langCountry = QString("%1:%2").arg(language).arg(country); - if (!countries.contains(country)) { - countries << country; - m_countries << country; - } - m_regions.insert(langCountry, locale); - } -} - -RegionProxy::~RegionProxy() { } - -Regions RegionProxy::regions() const -{ - return m_regions; -} - -RegionFormat RegionProxy::systemRegionFormat() -{ - return regionFormat(QLocale::system()); -} - -QStringList RegionProxy::countries() const -{ - return m_countries; -} - -QString RegionProxy::systemCountry() const -{ - QString country = QLocale::system().countryToString(QLocale::system().country()); - return country; -} - -QString RegionProxy::langCountry() const -{ - QLocale locale = QLocale::system(); - QString language = locale.languageToString(locale.language()); - QString country = locale.countryToString(locale.country()); - if ((locale.country() == QLocale::HongKong || locale.country() == QLocale::Taiwan) - && locale.language() == QLocale::Chinese) - language = "Traditional Chinese"; - if (locale.country() == QLocale::China && locale.language() == QLocale::Chinese) - language = "Simplified Chinese"; - QString langCountry = QString("%1:%2").arg(language).arg(country); - return langCountry; -} - -RegionFormat RegionProxy::regionFormat(const QLocale &locale) -{ - RegionFormat regionFormat; - regionFormat.firstDayOfWeekFormat = locale.firstDayOfWeek(); - regionFormat.shortDateFormat = locale.dateFormat(QLocale::ShortFormat); - regionFormat.longDateFormat = locale.dateFormat(QLocale::LongFormat); - regionFormat.shortTimeFormat = locale.timeFormat(QLocale::ShortFormat); - regionFormat.longTimeFormat = locale.timeFormat(QLocale::LongFormat); - regionFormat.currencyFormat = locale.currencySymbol(QLocale::CurrencySymbol); - regionFormat.numberFormat = locale.toString(123456789); - regionFormat.paperFormat = "A4"; - - return regionFormat; -} - -RegionAvailableData RegionProxy::allTextData(const QLocale &locale) -{ - RegionAvailableData allTextData; - allTextData += RegionProxy::defaultTextData(locale); - allTextData += RegionProxy::customTextData(locale); - - m_allFormat += m_defaultFormat; - m_allFormat += m_customFormat; - - return allTextData; -} - -RegionAvailableData RegionProxy::allFormat() -{ - return m_allFormat; -} - -RegionAvailableData RegionProxy::customTextData(const QLocale &locale) -{ - qDebug() << locale.country() << locale.language() << locale.name(); - - Format *format = nullptr; - if (locale.country() == QLocale::China && locale.script() == QLocale::SimplifiedHanScript) { - format = new ChineseSimpliedFormat(); - } else if (locale.country() == QLocale::UnitedKingdom - && locale.language() == QLocale::English) { - format = new UKFormat(); - } else if (locale.country() == QLocale::UnitedStates && locale.language() == QLocale::English) { - format = new USAFormat(); - } else if (locale.country() == QLocale::World && locale.language() == QLocale::English) { - format = new WorldFormat(); - } else { - return RegionAvailableData(); - } - - QScopedPointer pFormat(format); - pFormat->updateState(CurrentDate, CurrentTime, locale); - - RegionAvailableData textData; - textData.daysAvailable = pFormat->daysText(); - textData.shortDatesAvailable = pFormat->shortDatesText(); - textData.longDatesAvailable = pFormat->longDatesText(); - textData.shortTimesAvailable = pFormat->shortTimesText(); - textData.longTimesAvailable = pFormat->longTimesText(); - - m_customFormat.daysAvailable = pFormat->daysText(); // TODO format - m_customFormat.shortDatesAvailable = pFormat->shortDateFormats(); - m_customFormat.longDatesAvailable = pFormat->longDateFormats(); - m_customFormat.shortTimesAvailable = pFormat->shortTimeFormats(); - m_customFormat.longTimesAvailable = pFormat->longTimeFormats(); - - return textData; -} - -RegionAvailableData RegionProxy::defaultTextData(const QLocale &locale) -{ - QScopedPointer defaultFormat(new DefaultFormat()); - defaultFormat->updateState(CurrentDate, CurrentTime, locale); - - RegionAvailableData textData; - textData.daysAvailable = defaultFormat->daysText(); - textData.shortDatesAvailable = defaultFormat->shortDatesText(); - textData.longDatesAvailable = defaultFormat->longDatesText(); - textData.shortTimesAvailable = defaultFormat->shortTimesText(); - textData.longTimesAvailable = defaultFormat->longTimesText(); - - m_defaultFormat.daysAvailable = defaultFormat->daysText(); // TODO format - m_defaultFormat.shortDatesAvailable = defaultFormat->shortDateFormats(); - m_defaultFormat.longDatesAvailable = defaultFormat->longDateFormats(); - m_defaultFormat.shortTimesAvailable = defaultFormat->shortTimeFormats(); - m_defaultFormat.longTimesAvailable = defaultFormat->longTimeFormats(); - - return textData; -} - -QDebug operator<<(QDebug debug, const RegionFormat ®ionFormat) -{ - debug << regionFormat.firstDayOfWeekFormat << regionFormat.shortDateFormat - << regionFormat.longDateFormat << regionFormat.shortTimeFormat - << regionFormat.longTimeFormat << regionFormat.currencyFormat << regionFormat.numberFormat - << regionFormat.paperFormat; - - return debug; -} diff --git a/dcc-old/src/plugin-datetime/operation/regionproxy.h b/dcc-old/src/plugin-datetime/operation/regionproxy.h deleted file mode 100644 index 481d866971..0000000000 --- a/dcc-old/src/plugin-datetime/operation/regionproxy.h +++ /dev/null @@ -1,121 +0,0 @@ -//SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef REGIONPROXY_H -#define REGIONPROXY_H - -#include -#include - -const QString localeName_key = "localeName"; -const QString country_key = "country"; -const QString languageRegion_key = "languageRegion"; -const QString firstDayOfWeek_key = "firstDayOfWeek"; -const QString shortDateFormat_key = "shortDateFormat"; -const QString longDateFormat_key = "longDateFormat"; -const QString shortTimeFormat_key = "shortTimeFormat"; -const QString longTimeFormat_key = "longTimeFormat"; -const QString currencyFormat_key = "currencyFormat"; -const QString numberFormat_key = "numberFormat"; -const QString paperFormat_key = "paperFormat"; - -struct RegionFormat { - int firstDayOfWeekFormat = 0; - QString shortDateFormat; - QString longDateFormat; - QString shortTimeFormat; - QString longTimeFormat; - QString currencyFormat; - QString numberFormat; - QString paperFormat; - bool operator!=(const RegionFormat &other) - { - return !(*this == other); - } - bool operator==(const RegionFormat &other) - { - return (this->firstDayOfWeekFormat == other.firstDayOfWeekFormat) && - (this->shortDateFormat == other.shortDateFormat) && - (this->longDateFormat == other.longDateFormat) && - (this->shortTimeFormat == other.shortTimeFormat) && - (this->longTimeFormat == other.longTimeFormat) && - (this->currencyFormat == other.currencyFormat) && - (this->numberFormat == other.numberFormat) && - (this->paperFormat == other.paperFormat); - } -}; - -QDebug operator<<(QDebug debug, const RegionFormat ®ionFormat); - -struct RegionAvailableData { - QStringList daysAvailable; - QStringList shortDatesAvailable; - QStringList longDatesAvailable; - QStringList shortTimesAvailable; - QStringList longTimesAvailable; - RegionAvailableData& operator+=(const RegionAvailableData &rhs) { - for (QString element : rhs.daysAvailable) { - if (daysAvailable.contains(element)) - continue; - daysAvailable << element; - } - for (QString element : rhs.shortDatesAvailable) { - if (shortDatesAvailable.contains(element)) - continue; - shortDatesAvailable << element; - } - for (QString element : rhs.longDatesAvailable) { - if (longDatesAvailable.contains(element)) - continue; - longDatesAvailable << element; - } - for (QString element : rhs.shortTimesAvailable) { - if (shortTimesAvailable.contains(element)) - continue; - shortTimesAvailable << element; - } - for (QString element : rhs.longTimesAvailable) { - if (longTimesAvailable.contains(element)) - continue; - longTimesAvailable << element; - } - return *this; - } -}; - -using Regions = QMap; -class QTranslator; -class RegionProxy : public QObject -{ - Q_OBJECT -public: - explicit RegionProxy(QObject *parent = nullptr); - ~RegionProxy(); - - Regions regions() const; - QStringList countries() const; - QString systemCountry() const; - QString langCountry() const; - - static RegionFormat regionFormat(const QLocale &locale); - static RegionFormat systemRegionFormat(); - static RegionAvailableData allTextData(const QLocale &locale); - static RegionAvailableData allFormat(); - - void active(); - - bool isActive() { return m_isActive; } -private: - QStringList m_countries; - Regions m_regions; - QTranslator *m_translatorLanguage = nullptr; - QTranslator *m_translatorCountry = nullptr; - static RegionAvailableData m_formatData; - static RegionAvailableData m_allFormat, m_defaultFormat, m_customFormat; - static RegionAvailableData customTextData(const QLocale &locale); - static RegionAvailableData defaultTextData(const QLocale &locale); - bool m_isActive; -}; - -#endif // REGIONPROXY_H diff --git a/dcc-old/src/plugin-datetime/operation/zoneinfo.cpp b/dcc-old/src/plugin-datetime/operation/zoneinfo.cpp deleted file mode 100644 index 21f129c0d7..0000000000 --- a/dcc-old/src/plugin-datetime/operation/zoneinfo.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "zoneinfo.h" - -ZoneInfo::ZoneInfo() - : m_utcOffset(0) - , i2(0) - , i3(0) - , i4(0) -{ -} - -QDebug operator<<(QDebug argument, const ZoneInfo &info) -{ - argument << QString("ZoneInfo("); - argument << info.m_zoneName << "," << info.m_zoneCity << "," << info.m_utcOffset; - argument << ",("; - argument << info.i2 << "," << info.i3 << "," << info.i4; - argument << "))"; - 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; -} - -bool ZoneInfo::operator==(const ZoneInfo &what) const -{ - return m_zoneName == what.m_zoneName - && m_zoneCity == what.m_zoneCity - && m_utcOffset == what.m_utcOffset - && i2 == what.i2 - && i3 == what.i3 - && i4 == what.i4; -} - -void registerZoneInfoMetaType() -{ - qRegisterMetaType("ZoneInfo"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-datetime/operation/zoneinfo.h b/dcc-old/src/plugin-datetime/operation/zoneinfo.h deleted file mode 100644 index 93302ce670..0000000000 --- a/dcc-old/src/plugin-datetime/operation/zoneinfo.h +++ /dev/null @@ -1,44 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ZONEINFO_H -#define ZONEINFO_H - -#include -#include -#include -#include -#include - -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 diff --git a/dcc-old/src/plugin-datetime/window/datetimeplugin.cpp b/dcc-old/src/plugin-datetime/window/datetimeplugin.cpp deleted file mode 100644 index 7b5e15f116..0000000000 --- a/dcc-old/src/plugin-datetime/window/datetimeplugin.cpp +++ /dev/null @@ -1,60 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "datetimeplugin.h" -#include "datetimemodel.h" -#include "datetimeworker.h" -#include "regionmodule.h" -#include "timesettingmodule.h" -#include "timezonemodule.h" - -#include -DGUI_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -DatetimeModule::DatetimeModule(QObject *parent) - : HListModule("datetime", tr("Time and Format"), DIconTheme::findQIcon("dcc_nav_datetime"), parent) - , m_model(nullptr) -{ - m_model = new DatetimeModel(this); - m_work = new DatetimeWorker(m_model, this); - - appendChild(new TimeSettingModule(m_model, m_work, this)); - appendChild(new TimezoneModule(m_model, m_work, this)); - appendChild(new RegionModule(m_model, m_work, this)); -} - -void DatetimeModule::active() -{ - m_work->activate(); -} - -DatetimePlugin::DatetimePlugin(QObject *parent) - : PluginInterface(parent) - , m_moduleRoot(nullptr) -{ -} - -DatetimePlugin::~DatetimePlugin() -{ - m_moduleRoot = nullptr; -} - -QString DatetimePlugin::name() const -{ - return QStringLiteral("datetime"); -} - -ModuleObject *DatetimePlugin::module() -{ - if (m_moduleRoot) - return m_moduleRoot; - - m_moduleRoot = new DatetimeModule; - return m_moduleRoot; -} - -QString DatetimePlugin::location() const -{ - return "12"; -} diff --git a/dcc-old/src/plugin-datetime/window/datetimeplugin.h b/dcc-old/src/plugin-datetime/window/datetimeplugin.h deleted file mode 100644 index 7d18ea5290..0000000000 --- a/dcc-old/src/plugin-datetime/window/datetimeplugin.h +++ /dev/null @@ -1,47 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef DATETIMEPLUGIN_H -#define DATETIMEPLUGIN_H - -#include "interface/hlistmodule.h" -#include "interface/plugininterface.h" - -class DatetimeModel; -class DatetimeWorker; - -class DatetimeModule : public DCC_NAMESPACE::HListModule -{ - Q_OBJECT -public: - explicit DatetimeModule(QObject *parent = nullptr); - ~DatetimeModule() override {} - virtual void active() override; - -private: - DatetimeModel *m_model; - DatetimeWorker *m_work; - DCC_NAMESPACE::ModuleObject *m_timeSettings; - DCC_NAMESPACE::ModuleObject *m_timezoneList; - DCC_NAMESPACE::ModuleObject *m_timeFormat; -}; - -class DatetimePlugin : public DCC_NAMESPACE::PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Datetime" FILE "plugin-datetime.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - explicit DatetimePlugin(QObject *parent = nullptr); - ~DatetimePlugin() override; - - virtual QString name() const override; - virtual DCC_NAMESPACE::ModuleObject *module() override; - virtual QString location() const override; - -private: - DCC_NAMESPACE::ModuleObject *m_moduleRoot; -}; - -#endif // DatetimePLUGIN_H diff --git a/dcc-old/src/plugin-datetime/window/plugin-datetime.json b/dcc-old/src/plugin-datetime/window/plugin-datetime.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-datetime/window/plugin-datetime.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-datetime/window/regionmodule.cpp b/dcc-old/src/plugin-datetime/window/regionmodule.cpp deleted file mode 100644 index eded89adce..0000000000 --- a/dcc-old/src/plugin-datetime/window/regionmodule.cpp +++ /dev/null @@ -1,360 +0,0 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "regionmodule.h" - -#include "customregionformatdialog.h" -#include "datetimemodel.h" -#include "datetimeworker.h" -#include "widgets/widgetmodule.h" - -#include -#include -#include -#include - -#include - -using icu::Locale; -using icu::UnicodeString; - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -RegionModule::RegionModule(DatetimeModel *model, DatetimeWorker *work, QObject *parent) - : PageModule("region", tr("Region and Format"), parent) - , m_model(model) - , m_work(work) - , m_locale(QLocale::system()) -{ - if (!m_model->localeName().isEmpty()) - m_locale = QLocale(m_model->localeName()); - - setNoScroll(false); - - // NOTE: not provide this feature - appendChild(new ItemModule("RegionTitle", tr("Country or Region"))); - appendChild(new WidgetModule("RegionTip", - tr(""), - this, - &RegionModule::initCountryTip)); - initCountryModule(); - appendChild(m_countryModule); - appendChild(new ItemModule("regionFormat", tr("Format"))); - appendChild(new WidgetModule("regionFormatTip", - tr(""), - this, - &RegionModule::initRegionFormatTip)); - initLangRegionModule(); - appendChild(m_langRegionModule); - appendChild(new WidgetModule("", tr(""), [this](DListView *formatList) { - m_listView = formatList; - initFormatList(formatList); - })); - initFormatModificationModule(); - appendChild(m_formatModificationModule); - - m_regionFormat = m_model->regionFormat(); - - connect(m_langRegionModule, &ItemModule::clicked, this, &RegionModule::onLangRegionClicked); - connect(m_model, &DatetimeModel::localeNameChanged, this, [this](const QString &name) { - m_locale = QLocale(name); - }); -} - -void RegionModule::initCountryTip(DTipLabel *countryTipLabel) -{ - countryTipLabel->setWordWrap(true); - countryTipLabel->setAlignment(Qt::AlignLeft); - countryTipLabel->setContentsMargins(10, 0, 10, 0); - countryTipLabel->setText(tr("Operating system and applications may provide you with local content based on your country and region.")); -} - -void RegionModule::initCountryModule() -{ - m_countryModule = new ItemModule("Region", tr("Area"), [this](ModuleObject *) { - m_countryCombo = new DComboBox; - for (const QString &country : m_model->countries()) { - m_countryCombo->addItem( - QString("%1").arg(QCoreApplication::translate("dcc::datetime::Country", - country.toUtf8().data()))); - } - m_countryCombo->setCurrentText( - QString("%1").arg(QCoreApplication::translate("dcc::datetime::Country", - m_model->country().toUtf8().data()))); - connect(m_countryCombo, - qOverload(&QComboBox::currentIndexChanged), - this, - [this](int index) { - QString country = m_model->countries().at(index); - m_work->setConfigValue(country_key, country); - m_model->setCountry(country); - QString language; - QList locales = - QLocale::matchingLocales(QLocale::AnyLanguage, QLocale::AnyScript, QLocale::AnyCountry); - for (auto locale : locales) { - if (QLocale::countryToString(locale.country()) == country) { - language = QLocale::languageToString(locale.language()); - m_model->setLocaleName(locale.name()); - m_work->setConfigValue(localeName_key, locale.name()); - m_work->genLocale(locale.name()); - break; - } - } - QString langCountry = QString("%1:%2").arg(country).arg(language); - m_work->setConfigValue(languageRegion_key, langCountry); - m_model->setLangRegion(langCountry); - updateRegionFormat(RegionProxy::regionFormat(m_model->localeName())); - }); - connect(m_model, &DatetimeModel::countryChanged, this, [this](const QString &text) { - m_countryCombo->setCurrentText(QString("%1").arg( - QCoreApplication::translate("dcc::datetime::Country", text.toUtf8().data()))); - }); - return m_countryCombo; - }); - m_countryModule->setBackground(true); -} - -void RegionModule::initRegionFormatTip(DTipLabel *regionFormatTipLabel) -{ - regionFormatTipLabel->setWordWrap(true); - regionFormatTipLabel->setAlignment(Qt::AlignLeft); - regionFormatTipLabel->setContentsMargins(10, 0, 10, 0); - regionFormatTipLabel->setText( - tr("Operating system and applications may set date and time formats based on regional formats.")); -} - -void RegionModule::initLangRegionModule() -{ - m_langRegionModule = - new ItemModule("languageRegion", tr("Region format"), [this](ModuleObject *) { - QWidget *widget = new QWidget; - m_langRegionLabel = new QLabel; - m_langRegionLabel->setText( - getTranslation(m_model->localeName(), m_model->langRegion())); - connect(m_model, - &DatetimeModel::langCountryChanged, - this, - [this](const QString &text) { - m_langRegionLabel->setText(getTranslation(m_model->localeName(), text)); - }); - QLabel *langRegionEnterLabel = new QLabel; - langRegionEnterLabel->setPixmap( - DStyle::standardIcon(widget->style(), DStyle::SP_ArrowEnter) - .pixmap(16, 16)); - QHBoxLayout *hLayout = new QHBoxLayout; - hLayout->addStretch(0); - hLayout->addWidget(m_langRegionLabel); - hLayout->addWidget(langRegionEnterLabel); - widget->setLayout(hLayout); - return widget; - }); - m_langRegionModule->setBackground(true); - m_langRegionModule->setClickable(true); -} - -void RegionModule::initFormatList(DListView *formatList) -{ - QStandardItemModel *viewModel = new QStandardItemModel; - formatList->setFrameShape(QFrame::NoFrame); - formatList->setSelectionMode(QAbstractItemView::NoSelection); - formatList->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - formatList->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - formatList->setEditTriggers(QAbstractItemView::NoEditTriggers); - formatList->setSpacing(0); - formatList->setItemSpacing(0); - formatList->setViewportMargins(0, 0, 0, 0); - formatList->setModel(viewModel); - formatList->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - formatList->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - - // first day of week - DStandardItem *dayItem = new DStandardItem; - dayItem->setText(tr("First day of week")); - m_dayAction = new DViewItemAction; - QString day = m_locale.standaloneDayName(m_model->firstDayOfWeekFormat()); - m_dayAction->setText(day); - dayItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_dayAction); - connect(m_model, &DatetimeModel::firstDayOfWeekFormatChanged, this, [this](const int day) { - QString dayStr = m_locale.standaloneDayName(day); - m_dayAction->setText(dayStr); - }); - - // short date - DStandardItem *shortDateItem = new DStandardItem; - shortDateItem->setText(tr("Short date")); - m_shortDateAction = new DViewItemAction; - m_shortDateAction->setText(m_locale.toString(QDate::currentDate(), m_model->shortDateFormat())); - shortDateItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_shortDateAction); - connect(m_model, &DatetimeModel::shortDateFormatChanged, this, [this](const QString &text) { - m_shortDateAction->setText(m_locale.toString(QDate::currentDate(), text)); - }); - - // long date - DStandardItem *longDateItem = new DStandardItem; - longDateItem->setText(tr("Long date")); - m_longDateAction = new DViewItemAction; - m_longDateAction->setText(m_locale.toString(QDate::currentDate(), m_model->longDateFormat())); - longDateItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_longDateAction); - connect(m_model, &DatetimeModel::longDateFormatChanged, this, [this](const QString &text) { - m_longDateAction->setText(m_locale.toString(QDate::currentDate(), text)); - }); - - // short time - DStandardItem *shortTimeItem = new DStandardItem; - shortTimeItem->setText(tr("Short time")); - m_shortTimeAction = new DViewItemAction; - m_shortTimeAction->setText(m_locale.toString(QTime::currentTime(), m_model->shortTimeFormat())); - shortTimeItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_shortTimeAction); - connect(m_model, &DatetimeModel::shortTimeFormatChanged, this, [this](const QString &text) { - m_shortTimeAction->setText(m_locale.toString(QTime::currentTime(), text)); - }); - - // long time - DStandardItem *longTimeItem = new DStandardItem; - longTimeItem->setText(tr("Long time")); - m_longTimeAction = new DViewItemAction; - m_longTimeAction->setText(m_locale.toString(QTime::currentTime(), m_model->longTimeFormat())); - longTimeItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_longTimeAction); - connect(m_model, &DatetimeModel::longTimeFormatChanged, this, [this](const QString &text) { - m_longTimeAction->setText(m_locale.toString(QTime::currentTime(), text)); - }); - - // currency - DStandardItem *currencyItem = new DStandardItem; - currencyItem->setText(tr("Currency symbol")); - m_currencyAction = new DViewItemAction; - m_currencyAction->setText(m_model->currencyFormat()); - currencyItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_currencyAction); - connect(m_model, &DatetimeModel::currencyFormatChanged, this, [this](const QString &text) { - m_currencyAction->setText(text.toUtf8()); - }); - - // number - DStandardItem *numberItem = new DStandardItem; - numberItem->setText(tr("Numbers")); - m_numberAction = new DViewItemAction; - m_numberAction->setText(m_model->numberFormat()); - numberItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_numberAction); - connect(m_model, &DatetimeModel::numberFormatChanged, this, [this](const QString &text) { - m_numberAction->setText(text.toUtf8()); - }); - - // paper - DStandardItem *paperItem = new DStandardItem; - paperItem->setText(tr("Paper")); - m_paperAction = new DViewItemAction; - m_paperAction->setText(m_model->paperFormat()); - paperItem->setActionList(Qt::RightEdge, DViewItemActionList() << m_paperAction); - connect(m_model, &DatetimeModel::paperFormatChanged, this, [this](const QString &text) { - m_paperAction->setText(text.toUtf8()); - }); - - viewModel->appendRow(dayItem); - viewModel->appendRow(shortDateItem); - viewModel->appendRow(longDateItem); - viewModel->appendRow(shortTimeItem); - viewModel->appendRow(longTimeItem); - viewModel->appendRow(currencyItem); - viewModel->appendRow(numberItem); - viewModel->appendRow(paperItem); -} - -void RegionModule::initFormatModificationModule() -{ - m_formatModificationModule = new ItemModule("", tr(""), [this](ModuleObject *) { - QWidget *widget = new QWidget; - QHBoxLayout *hlayout = new QHBoxLayout(widget); - hlayout->setSpacing(0); - hlayout->setMargin(0); - DCommandLinkButton *button = new DCommandLinkButton(tr("Custom Format")); - connect(button, &QPushButton::clicked, this, [this]() { - CustomRegionFormatDialog dlg; - connect(&dlg, - &CustomRegionFormatDialog::customFormatSaved, - this, - [this](const RegionFormat ®ionFormat) { - updateRegionFormat(regionFormat); - }); - dlg.initRegionFormat(m_locale, m_regionFormat); - dlg.exec(); - }); - hlayout->addStretch(0); - hlayout->addWidget(button); - return widget; - }); - appendChild(m_formatModificationModule); -} - -void RegionModule::updateRegionFormat(const RegionFormat ®ionFormat) -{ - m_regionFormat = regionFormat; - m_dayAction->setText(m_locale.standaloneDayName(regionFormat.firstDayOfWeekFormat)); - m_shortDateAction->setText( - m_locale.toString(QDate::currentDate(), regionFormat.shortDateFormat)); - m_longDateAction->setText(m_locale.toString(QDate::currentDate(), regionFormat.longDateFormat)); - m_shortTimeAction->setText( - m_locale.toString(QTime::currentTime(), regionFormat.shortTimeFormat)); - m_longTimeAction->setText(m_locale.toString(QTime::currentTime(), regionFormat.longTimeFormat)); - m_currencyAction->setText(regionFormat.currencyFormat); - m_numberAction->setText(regionFormat.numberFormat); - m_paperAction->setText(regionFormat.paperFormat); - m_listView->update(); - - m_work->setConfigValue(firstDayOfWeek_key, regionFormat.firstDayOfWeekFormat); - m_work->setConfigValue(shortDateFormat_key, regionFormat.shortDateFormat); - m_work->setConfigValue(longDateFormat_key, regionFormat.longDateFormat); - m_work->setConfigValue(shortTimeFormat_key, regionFormat.shortTimeFormat); - m_work->setConfigValue(longTimeFormat_key, regionFormat.longTimeFormat); - m_work->setConfigValue(currencyFormat_key, regionFormat.currencyFormat); - m_work->setConfigValue(numberFormat_key, regionFormat.numberFormat); - m_work->setConfigValue(paperFormat_key, regionFormat.paperFormat); -} - -void RegionModule::onLangRegionClicked() -{ - RegionFormatDialog dlg(this->m_model); - qRegisterMetaType("RegionFormat"); - dlg.setCurrentRegion(m_langRegionLabel->text()); - connect(&dlg, - &RegionFormatDialog::regionFormatSaved, - this, - [this](const QString &langRegion, const QLocale &locale) { - m_langRegion = langRegion; - m_locale = locale; - m_langRegionLabel->setText(getTranslation(locale.name(), langRegion)); - m_work->setConfigValue(languageRegion_key, langRegion); - m_work->setConfigValue(localeName_key, locale.name()); - m_work->genLocale(locale.name()); - m_model->setLocaleName(locale.name()); - updateRegionFormat(RegionProxy::regionFormat(m_locale)); - }); - dlg.exec(); -} - -QString RegionModule::getTranslation(const QString &localeName, const QString &langRegion) -{ - // This is legacy code that no longer used, if the code is ever needed, this should be - // replaced with DCCLocale::languageAndRegionName() - - QStringList langRegions = langRegion.split(":"); - if (langRegions.size() < 2) { - return langRegion; - } - - auto localeSystem = QLocale::system(); - auto systemLocale = Locale(localeSystem.name().toStdString().data()); - auto IcuLocale = Locale(localeName.toStdString().data()); - auto localeHex = UnicodeString(localeName.toStdString().data()); - std::string displayLanguageIcu; - IcuLocale.getDisplayLanguage(systemLocale, localeHex).toUTF8String(displayLanguageIcu); - std::string displayCountryIcu; - IcuLocale.getDisplayCountry(systemLocale, localeHex).toUTF8String(displayCountryIcu); - - QString displaylanguage = QString::fromStdString(displayLanguageIcu); - QString displayCountry = QString::fromStdString(displayCountryIcu); - QString langCountry = QString("%1(%2)").arg(displaylanguage).arg(displayCountry); - - return langCountry; -} diff --git a/dcc-old/src/plugin-datetime/window/regionmodule.h b/dcc-old/src/plugin-datetime/window/regionmodule.h deleted file mode 100644 index b9a341e4cb..0000000000 --- a/dcc-old/src/plugin-datetime/window/regionmodule.h +++ /dev/null @@ -1,82 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef REGIONMODULE_H -#define REGIONMODULE_H - -#include "interface/pagemodule.h" -#include "settingsitem.h" -#include "regionformatdialog.h" -#include "itemmodule.h" - -#include -#include - -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -namespace DCC_NAMESPACE { -class SettingsGroup; -} - -using DCC_NAMESPACE::SettingsItem; -class DatetimeModel; -class DatetimeWorker; - -class RegionModule : public DCC_NAMESPACE::PageModule -{ - Q_OBJECT -public: - explicit RegionModule(DatetimeModel *model, - DatetimeWorker *work, - QObject *parent = nullptr); - -private: - void initCountryTip(DTipLabel *countryTipLabel); - void initCountryModule(); - void initRegionFormatTip(DTipLabel *countryTipLabel); - void initLangRegionModule(); - void initFormatList(DListView *view); - void initFormatModificationModule(); - void updateRegionFormat(const RegionFormat ®ionFormat); - QString getTranslation(const QString &localeName,const QString &langRegion); - -private slots: - void onLangRegionClicked(); - -private: - DatetimeModel *m_model = nullptr; - DatetimeWorker *m_work = nullptr; - DComboBox *m_countryCombo = nullptr; - QLabel *m_langRegionLabel = nullptr; - DViewItemAction *m_dayAction = nullptr; - DViewItemAction *m_shortDateAction = nullptr; - DViewItemAction *m_longDateAction = nullptr; - DViewItemAction *m_shortTimeAction = nullptr; - DViewItemAction *m_longTimeAction = nullptr; - DViewItemAction *m_currencyAction = nullptr; - DViewItemAction *m_numberAction = nullptr; - DViewItemAction *m_paperAction = nullptr; - const QStringList m_fotmatWeek; - const QStringList m_fotmatLongDate; - const QStringList m_fotmatShortDate; - const QStringList m_fotmatLongTime; - const QStringList m_fotmatShortTime; - const QStringList m_weekStartWithDay; - QString m_langRegion; - QLocale m_locale; - RegionFormat m_regionFormat; - - ItemModule *m_countryModule = nullptr; - ItemModule *m_langRegionModule = nullptr; - ItemModule *m_formatModificationModule = nullptr; - - DListView *m_listView = nullptr; -}; - -#endif // FORMATSETTINGMODULE_H diff --git a/dcc-old/src/plugin-datetime/window/timesettingmodule.cpp b/dcc-old/src/plugin-datetime/window/timesettingmodule.cpp deleted file mode 100644 index ca4805e781..0000000000 --- a/dcc-old/src/plugin-datetime/window/timesettingmodule.cpp +++ /dev/null @@ -1,446 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "timesettingmodule.h" -#include "datetimemodel.h" -#include "datetimeworker.h" -#include "clock.h" -#include "datewidget.h" -#include "widgets/widgetmodule.h" -#include "widgets/settingsgroup.h" -#include "widgets/switchwidget.h" -#include "widgets/comboxwidget.h" -#include "widgets/lineeditwidget.h" -#include "widgets/buttontuple.h" - -#include -#include -#include - -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDateTimeTimeSettingModule, "dcc-datetime-timesettingmodule") - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -const static int SpinBtnLength = 26; - -class TimeSpinBox : public QSpinBox -{ -public: - explicit TimeSpinBox(QWidget *parent = nullptr) - : QSpinBox(parent) - { - this->lineEdit()->setMaxLength(2); - } - -protected: - QString textFromValue(int value) const override - { - return QString("%1").arg(value, 2, 10, QLatin1Char('0')); - } -}; - -TimeSettingModule::TimeSettingModule(DatetimeModel *model, DatetimeWorker *work, QObject *parent) - : PageModule("timeSettings", tr("Time Settings"), parent) - , m_model(model) - , m_work(work) -{ - deactive(); - appendChild(new WidgetModule("time", tr("Time"))); - appendChild(new WidgetModule("ntpServer", tr("Auto Sync"), this, &TimeSettingModule::initAutoSyncTime)); - appendChild(new WidgetModule("time", QString(), this, &TimeSettingModule::initTimeSetting)); - appendChild(new WidgetModule("datetime", QString(), this, &TimeSettingModule::initDigitalClock)); - - ModuleObject *saveButton = new WidgetModule("datetimeDatesettingConfirmbtn","",[this](ButtonTuple *buttonTuple){ - m_buttonTuple = buttonTuple; - m_buttonTuple->setButtonType(ButtonTuple::Save); - QPushButton *cancelButton = m_buttonTuple->leftButton(); - QPushButton *confirmButton = m_buttonTuple->rightButton(); - cancelButton->setText(tr("Reset")); - confirmButton->setText(tr("Save")); - connect(cancelButton, &QPushButton::clicked, this, &TimeSettingModule::onCancelButtonClicked); - connect(cancelButton, &QPushButton::clicked, this, &TimeSettingModule::onCancelButtonClicked); - connect(confirmButton, &QPushButton::clicked, this, &TimeSettingModule::onConfirmButtonClicked); - connect(cancelButton, &QPushButton::clicked, this, [this] { - setBtnEnable(false); - }); - connect(confirmButton, &QPushButton::clicked, this, [this] { - setBtnEnable(false); - }); - setButtonShowState(m_model->nTP()); - setBtnEnable(false); - }); - saveButton->setExtra(); - appendChild(saveButton); - - connect(this, &TimeSettingModule::requestNTPServer, m_work, &DatetimeWorker::setNtpServer); - connect(this, &TimeSettingModule::requestSetTime, m_work, &DatetimeWorker::setDatetime); -} - -void TimeSettingModule::deactive() -{ - m_autoSyncTimeSwitch = nullptr; - m_datetimeGroup = nullptr; - m_timeHourWidget = nullptr; - m_timeMinWidget = nullptr; - m_yearWidget = nullptr; - m_monthWidget = nullptr; - m_dayWidget = nullptr; - m_buttonTuple = nullptr; -} - -void TimeSettingModule::initAutoSyncTime(SettingsGroup *ntpGroup) -{ - ntpGroup->setBackgroundStyle(SettingsGroup::GroupBackground); - m_autoSyncTimeSwitch = new SwitchWidget(ntpGroup); - m_autoSyncTimeSwitch->setTitle(tr("Auto Sync")); - - m_ntpServerList = new ComboxWidget(ntpGroup); - m_ntpServerList->setTitle(tr("Server")); - m_ntpServerList->comboBox()->setMinimumWidth(240); - - m_customizeAddress = new LineEditWidget(ntpGroup); - m_customizeAddress->setTitle(tr("Address")); - m_customizeAddress->textEdit()->setMinimumWidth(240); - m_customizeAddress->textEdit()->setPlaceholderText(tr("Required")); - - m_ntpServerList->comboBox()->addItems(m_model->ntpServerList()); - m_ntpServerList->comboBox()->addItem(tr("Customize")); - - auto setNtpServer = [this](QString server) { - const QStringList &ntpServerList = m_model->ntpServerList(); - m_ntpServerList->comboBox()->blockSignals(true); - m_customizeAddress->blockSignals(true); - if (server.isEmpty()) { - m_ntpServerList->comboBox()->setCurrentIndex(0); - m_customizeAddress->setVisible(false); - } else if (ntpServerList.contains(server)) { - m_ntpServerList->comboBox()->setCurrentText(server); - m_customizeAddress->setVisible(false); - } else { - m_ntpServerList->comboBox()->setCurrentText(tr("Customize")); - m_customizeAddress->setText(server); - m_customizeAddress->setVisible(true); - } - m_ntpServerList->comboBox()->blockSignals(false); - m_customizeAddress->blockSignals(false); - }; - setNtpServer(m_model->ntpServerAddress()); - connect(m_model, &DatetimeModel::NTPServerChanged, m_ntpServerList, setNtpServer); - connect(m_model, &DatetimeModel::NTPServerNotChanged, m_ntpServerList, setNtpServer); - - const bool isNtp = m_model->nTP(); - m_autoSyncTimeSwitch->setChecked(isNtp); - connect(m_autoSyncTimeSwitch, &SwitchWidget::checkedChanged, m_work, &DatetimeWorker::setNTP); - connect(m_model, &DatetimeModel::NTPChanged, this, &TimeSettingModule::setControlVisible); - connect(m_autoSyncTimeSwitch, &SwitchWidget::checkedChanged, this, [this] { - setBtnEnable(false); - }); - - connect(m_ntpServerList->comboBox(), QOverload::of(&QComboBox::currentIndexChanged), this, [this](const int index) { - const QString &text = m_ntpServerList->comboBox()->itemText(index); - m_customizeAddress->setVisible(m_ntpServerList->isVisible() && text == tr("Customize")); - isUserOperate(); - if (m_autoSyncTimeSwitch->checked()) { - if (text == tr("Customize")) - m_customizeAddress->setText(m_customNtpServer); - - if (m_customizeAddress->isShowAlert()) { - m_customizeAddress->hideAlertMessage(); - } - } - if (!m_bIsUserOperate) - return; - - m_bIsUserOperate = false; - - if (text != tr("Customize")) { - if ("" != text) { - Q_EMIT requestNTPServer(text); - } - } else if (!m_customizeAddress->text().isEmpty()) { - Q_EMIT requestNTPServer(m_customNtpServer); - } - - setButtonShowState(m_autoSyncTimeSwitch->checked()); - }); - connect(m_customizeAddress->dTextEdit(), &DLineEdit::focusChanged, this, [=] { - m_buttonTuple->rightButton()->setEnabled(true); - }); - m_ntpServerList->setVisible(isNtp); - m_customizeAddress->setVisible(isNtp && m_ntpServerList->comboBox()->currentText() == tr("Customize")); - ntpGroup->appendItem(m_autoSyncTimeSwitch); - ntpGroup->appendItem(m_ntpServerList); - ntpGroup->appendItem(m_customizeAddress); -} - -void TimeSettingModule::initTimeSetting(SettingsGroup *datetimeGroup) -{ - m_datetimeGroup = datetimeGroup; - - datetimeGroup->setHidden(m_model->nTP()); - connect(m_model, &DatetimeModel::NTPChanged, datetimeGroup, &SettingsGroup::setHidden); - QLabel *centerLabel = new QLabel(" : "); - QFont font; - font.setPointSizeF(24); - centerLabel->setFont(font); - centerLabel->setContextMenuPolicy(Qt::NoContextMenu); - - QTime time(QTime::currentTime()); - m_timeHourWidget = createDSpinBox(datetimeGroup, 0, 23); - m_timeMinWidget = createDSpinBox(datetimeGroup, 0, 59); - m_timeHourWidget->setValue(time.hour()); - m_timeMinWidget->setValue(time.minute()); - m_timeHourWidget->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_timeMinWidget->setButtonSymbols(QAbstractSpinBox::NoButtons); - m_timeMinWidget->setAccessibleName("TIME_MIN_WIDGET"); - m_timeHourWidget->setAccessibleName("TIME_HOUR_WIDGET"); - - int nIndex = QFontDatabase::addApplicationFont(":/icons/deepin/builtin/resource/deepindigitaltimes-Regular.ttf"); - if (nIndex != -1) { - QStringList strList(QFontDatabase::applicationFontFamilies(nIndex)); - if (strList.count() > 0) { - QFont fontThis(strList.at(0)); - fontThis.setPointSize(28); - m_timeHourWidget->setFont(fontThis); - m_timeMinWidget->setFont(fontThis); - } - } - - QHBoxLayout *timeLayout = new QHBoxLayout; - timeLayout->addStretch(); - timeLayout->addWidget(m_timeHourWidget); - timeLayout->addWidget(centerLabel); - timeLayout->addWidget(m_timeMinWidget); - timeLayout->addStretch(); - SettingsItem *w = new SettingsItem(datetimeGroup); - w->addBackground(); - w->setLayout(timeLayout); - - m_yearWidget = new DateWidget(DateWidget::Year, QDate::currentDate().year() - 30, QDate::currentDate().year() + 30); - m_monthWidget = new DateWidget(DateWidget::Month, 1, 12); - m_dayWidget = new DateWidget(DateWidget::Day, 1, 31); - QDate currentDate(QDate::currentDate()); - m_yearWidget->setValue(currentDate.year()); - m_yearWidget->setAccessibleName("yearwidget"); - m_yearWidget->addBackground(); - m_monthWidget->setValue(currentDate.month()); - m_monthWidget->setAccessibleName("monthwidget"); - m_monthWidget->addBackground(); - m_dayWidget->setValue(currentDate.day()); - m_dayWidget->setAccessibleName("daywidget"); - m_dayWidget->addBackground(); - - datetimeGroup->insertWidget(w); - datetimeGroup->insertWidget(m_yearWidget); - datetimeGroup->insertWidget(m_monthWidget); - datetimeGroup->insertWidget(m_dayWidget); - - auto updateDayRange = [this]() { - const int year = m_yearWidget->value(); - const int month = m_monthWidget->value(); - - QDate date(year, month, 1); - m_dayWidget->setRange(1, date.daysInMonth()); - qCDebug(DdcDateTimeTimeSettingModule) << " year : " << year << " , month : " << month << " day range : 1 to " << date.daysInMonth(); - if (m_dayWidget->maximum() < m_dayWidget->getCurrentText().toInt()) { - m_dayWidget->setCurrentText(QString::number(m_dayWidget->maximum())); - } - }; - connect(m_monthWidget, &DateWidget::editingFinished, this, updateDayRange); - connect(m_monthWidget, &DateWidget::notifyClickedState, this, updateDayRange); - connect(m_yearWidget, &DateWidget::editingFinished, this, updateDayRange); - connect(m_yearWidget, &DateWidget::notifyClickedState, this, updateDayRange); - updateDayRange(); - datetimeGroup->setVisible(!m_model->nTP()); - connect(m_timeHourWidget, qOverload(&QSpinBox::valueChanged), this, [this] { - setBtnEnable(true); - }); - connect(m_timeMinWidget, qOverload(&QSpinBox::valueChanged), this, [this] { - setBtnEnable(true); - }); - connect(m_yearWidget, &DateWidget::chenged, this, [this] { - setBtnEnable(true); - }); - connect(m_monthWidget, &DateWidget::chenged, this, [this] { - setBtnEnable(true); - }); - connect(m_dayWidget, &DateWidget::chenged, this, [this] { - setBtnEnable(true); - }); -} - -void TimeSettingModule::initDigitalClock(QWidget *w) -{ - QLabel *centerLabel = new QLabel(" : "); - QLabel *hourLabel = new QLabel(); - QLabel *minLabel = new QLabel(); - QLabel *yearLabel = new QLabel(); - QLabel *monthLabel = new QLabel(); - QLabel *dayLabel = new QLabel(); - centerLabel->setAlignment(Qt::AlignCenter); - hourLabel->setAlignment(Qt::AlignCenter); - minLabel->setAlignment(Qt::AlignCenter); - yearLabel->setAlignment(Qt::AlignCenter); - monthLabel->setAlignment(Qt::AlignCenter); - dayLabel->setAlignment(Qt::AlignCenter); - QFont font; - font.setPointSizeF(24); - centerLabel->setFont(font); - centerLabel->setContextMenuPolicy(Qt::NoContextMenu); - - int nIndex = QFontDatabase::addApplicationFont(":/icons/deepin/builtin/resource/deepindigitaltimes-Regular.ttf"); - if (nIndex != -1) { - QStringList strList(QFontDatabase::applicationFontFamilies(nIndex)); - if (strList.count() > 0) { - QFont fontThis(strList.at(0)); - fontThis.setPointSize(28); - hourLabel->setFont(fontThis); - minLabel->setFont(fontThis); - } - } - QHBoxLayout *timeLayout = new QHBoxLayout; - timeLayout->addWidget(hourLabel); - timeLayout->addWidget(centerLabel); - timeLayout->addWidget(minLabel); - QHBoxLayout *dataLayout = new QHBoxLayout; - dataLayout->addWidget(yearLabel); - dataLayout->addWidget(monthLabel); - dataLayout->addWidget(dayLabel); - DBackgroundGroup *bggroup = new DBackgroundGroup(dataLayout); - bggroup->setAccessibleName("bggroup"); - bggroup->setBackgroundRole(QPalette::Window); - bggroup->setItemSpacing(1); - bggroup->setUseWidgetBackground(false); - - QVBoxLayout *layout = new QVBoxLayout; - layout->addLayout(timeLayout); - layout->addWidget(bggroup); - layout->setSpacing(10); - layout->setContentsMargins(0, 0, 0, 0); - w->setLayout(layout); - QTimer::singleShot(10, w, [this, w]() { - w->setVisible(m_model->nTP()); - }); - connect(m_model, &DatetimeModel::NTPChanged, w, &QWidget::setVisible); - QTimer *timer = new QTimer(w); - auto updateTime = [minLabel, hourLabel, yearLabel, monthLabel, dayLabel]() { - QDateTime datetime = QDateTime::currentDateTime(); - QTime time = QTime::currentTime(); - minLabel->setText(QString::number(time.minute())); - hourLabel->setText(QString::number(time.hour())); - QDate date = QDate::currentDate(); - yearLabel->setText(QString("%1 %2").arg(date.year()).arg(tr("Year"))); - monthLabel->setText(QString("%1 %2").arg(date.month()).arg(tr("Month"))); - dayLabel->setText(QString("%1 %2").arg(date.day()).arg(tr("Day"))); - }; - connect(timer, &QTimer::timeout, w, updateTime); - timer->start(1000); - updateTime(); -} - -void TimeSettingModule::setButtonShowState(bool state) -{ - if (m_customizeAddress->isShowAlert()) { - m_customizeAddress->hideAlertMessage(); - } - m_buttonTuple->leftButton()->setVisible(!state); - m_buttonTuple->rightButton()->setVisible(!state || m_ntpServerList->comboBox()->currentText() == tr("Customize")); -// m_buttonTuple->rightButton()->setText(state ? tr("Save") : tr("Confirm")); -} - -void TimeSettingModule::setControlVisible(bool state) -{ - m_datetimeGroup->setVisible(!state); - m_ntpServerList->setVisible(state); - setButtonShowState(state); - m_autoSyncTimeSwitch->setChecked(state); - m_customizeAddress->setVisible(state && m_ntpServerList->comboBox()->currentText() == tr("Customize")); -} - -void TimeSettingModule::onCancelButtonClicked() -{ - // 取消操作 - QDate date(QDate::currentDate()); - m_yearWidget->setValue(date.year()); - m_monthWidget->setValue(date.month()); - m_dayWidget->setValue(date.day()); - QTime time(QTime::currentTime()); - m_timeHourWidget->setValue(time.hour()); - m_timeMinWidget->setValue(time.minute()); -} - -void TimeSettingModule::onConfirmButtonClicked() -{ - if (m_autoSyncTimeSwitch->checked() && m_ntpServerList->comboBox()->currentText() == tr("Customize")) { - m_buttonTuple->rightButton()->setEnabled(false); - if (m_customizeAddress->text().isEmpty()) { - qCDebug(DdcDateTimeTimeSettingModule) << "The customize address is nullptr."; - m_customizeAddress->setIsErr(true); - return; - } - // this->setFocus(); - // m_customNtpServer = m_addressContent->text(); - // QGSettings("com.deepin.dde.control-center","/com/deepin/dde/control-center/").set("custom-ntpserver", m_customNtpServer); - qCDebug(DdcDateTimeTimeSettingModule) << "ok clicked, requestNTPServer"; - Q_EMIT requestNTPServer(m_customizeAddress->text()); - } else { - qCDebug(DdcDateTimeTimeSettingModule) << "ok clicked, requestSetTime"; - - QDateTime datetime; - datetime.setDate(QDate(m_yearWidget->value(), m_monthWidget->value(), m_dayWidget->value())); - datetime.setTime(QTime(m_timeHourWidget->value(), m_timeMinWidget->value())); - Q_EMIT requestSetTime(datetime); - } -} - -QSpinBox *TimeSettingModule::createDSpinBox(QWidget *parent, int min, int max) -{ - QSpinBox *spinBox = new TimeSpinBox(parent); - spinBox->setFixedSize(100, 60); - spinBox->setRange(min, max); - spinBox->setSingleStep(1); - spinBox->setWrapping(true); - spinBox->setValue(0); - - DIconButton *btnUp = new DIconButton(spinBox); - DIconButton *btnDown = new DIconButton(spinBox); - if (max == 59) { - btnUp->setAccessibleName("MINUP_BUTTON"); - btnDown->setAccessibleName("MINDOWM_BUTTON"); - } else { - btnUp->setAccessibleName("HOURUP_BUTTON"); - btnDown->setAccessibleName("HOURDOWM_BUTTON"); - } - btnUp->setIcon(DStyle::SP_ArrowUp); - btnDown->setIcon(DStyle::SP_ArrowDown); - btnUp->setFixedSize(QSize(SpinBtnLength, SpinBtnLength)); - btnDown->setFixedSize(QSize(SpinBtnLength, SpinBtnLength)); - btnUp->move(70, 4); - btnDown->move(70, 31); - - connect(btnUp, &DIconButton::clicked, spinBox, &QSpinBox::stepUp); - connect(btnDown, &DIconButton::clicked, spinBox, &QSpinBox::stepDown); - - return spinBox; -} - -void TimeSettingModule::isUserOperate() -{ - if (!m_bIsUserOperate) { - m_bIsUserOperate = true; - } -} - -void TimeSettingModule::setBtnEnable(bool state) -{ - m_buttonTuple->leftButton()->setEnabled(state); - m_buttonTuple->rightButton()->setEnabled(state); -} diff --git a/dcc-old/src/plugin-datetime/window/timesettingmodule.h b/dcc-old/src/plugin-datetime/window/timesettingmodule.h deleted file mode 100644 index f1f53228a6..0000000000 --- a/dcc-old/src/plugin-datetime/window/timesettingmodule.h +++ /dev/null @@ -1,71 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef TIMESETTINGMODULE_H -#define TIMESETTINGMODULE_H -#include "interface/pagemodule.h" - -namespace DCC_NAMESPACE { -class SettingsGroup; -class SwitchWidget; -class ComboxWidget; -class LineEditWidget; -class ButtonTuple; -} - -class DatetimeModel; -class DatetimeWorker; - -class QSpinBox; -class DateWidget; - -class TimeSettingModule : public DCC_NAMESPACE::PageModule -{ - Q_OBJECT -public: - explicit TimeSettingModule(DatetimeModel *model, DatetimeWorker *work, QObject *parent = nullptr); - - void initAutoSyncTime(DCC_NAMESPACE::SettingsGroup *ntpGroup); - void initTimeSetting(DCC_NAMESPACE::SettingsGroup *datetimeGroup); - void initDigitalClock(QWidget *w); - - virtual void deactive() override; -Q_SIGNALS: - void requestSetAutoSyncdate(const bool &state); - void requestSetTime(const QDateTime &time); - void requestNTPServer(QString server); - -public Q_SLOTS: - void setControlVisible(bool state); - void onCancelButtonClicked(); - void onConfirmButtonClicked(); - void isUserOperate(); - void setBtnEnable(bool state); - -private: - QSpinBox *createDSpinBox(QWidget *parent, int min, int max); - void setButtonShowState(bool state); - -private: - DatetimeModel *m_model; - DatetimeWorker *m_work; - - DCC_NAMESPACE::SwitchWidget *m_autoSyncTimeSwitch; - DCC_NAMESPACE::SettingsGroup *m_datetimeGroup; - QSpinBox *m_timeHourWidget; - QSpinBox *m_timeMinWidget; - DateWidget *m_yearWidget; - DateWidget *m_monthWidget; - DateWidget *m_dayWidget; - DCC_NAMESPACE::ButtonTuple *m_buttonTuple; - - DCC_NAMESPACE::ComboxWidget *m_ntpServerList; - DCC_NAMESPACE::LineEditWidget *m_customizeAddress; - // dcc::widgets::SettingsItem *m_ntpSrvItem; - // dcc::widgets::SettingsItem *m_address; - bool m_bIsUserOperate; - QString m_customNtpServer; -}; - -#endif // TIMESETTINGMODULE_H diff --git a/dcc-old/src/plugin-datetime/window/timezonemodule.cpp b/dcc-old/src/plugin-datetime/window/timezonemodule.cpp deleted file mode 100644 index 9bf316850e..0000000000 --- a/dcc-old/src/plugin-datetime/window/timezonemodule.cpp +++ /dev/null @@ -1,122 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "timezonemodule.h" -#include "datetimemodel.h" -#include "datetimeworker.h" -#include "timezoneitem.h" -#include "timezonechooser.h" -#include "widgets/widgetmodule.h" -#include "widgets/titlelabel.h" -#include "widgets/settingshead.h" -#include "widgets/settingsgroup.h" - -#include - -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -TimezoneModule::TimezoneModule(DatetimeModel *model, DatetimeWorker *work, QObject *parent) - : PageModule("timezoneList", tr("Timezone List"), parent) - , m_model(model) - , m_work(work) - , m_timezoneGroup(nullptr) -{ - deactive(); - connect(this, &TimezoneModule::requestRemoveUserTimeZone, m_work, &DatetimeWorker::removeUserTimeZone); - - appendChild(new WidgetModule("systemTimezone", tr("System Timezone"), [this](SettingsHead *w) { - w->setTitle(tr("System Timezone")); - w->removeBackground(); - connect(w, &SettingsHead::editChanged, this, [this, w](bool) { - w->blockSignals(true); - w->toCancel(); - w->blockSignals(false); - ensureZoneChooserDialog(true); - }); - })); - appendChild(new WidgetModule("systemTimezone", tr("System Timezone"), [this](TimezoneItem *w) { - w->setTimeZone(m_model->currentSystemTimeZone()); - w->setDetailVisible(false); - connect(m_model, &DatetimeModel::currentSystemTimeZoneChanged, w, &TimezoneItem::setTimeZone); - })); - appendChild(new WidgetModule("timezoneList", tr("Timezone List"), [this](SettingsHead *w) { - w->setTitle(tr("Timezone List")); - connect(w, &SettingsHead::editChanged, this, &TimezoneModule::onEditClicked); - connect(this, &TimezoneModule::exitEdit, w, &SettingsHead::toCancel); - connect(this, &TimezoneModule::exitEdit, w, [w, this] { - w->setEditEnable(m_model->userTimeZones().length() > 1); - }); - })); - appendChild(new WidgetModule("timezoneList", tr("Timezone List"), this, &TimezoneModule::initTimezoneListGroup)); -} - -void TimezoneModule::initTimezoneListGroup(DCC_NAMESPACE::SettingsGroup *timezoneGroup) -{ - m_timezoneGroup = timezoneGroup; - - SettingsItem *item = new SettingsItem; - item->addBackground(); - QVBoxLayout *layout = new QVBoxLayout; - DCommandLinkButton *m_addTimezoneButton = new DCommandLinkButton(tr("Add Timezone"), m_timezoneGroup); - m_addTimezoneButton->setAccessibleName(tr("Add Timezone")); - layout->addWidget(m_addTimezoneButton, 0, Qt::AlignLeft); - item->setLayout(layout); - m_timezoneGroup->insertWidget(item); - m_timezoneGroup->setSpacing(8); - - auto updateZones = [this]() { - for (int i = m_timezoneGroup->itemCount() - 2; i >= 0; --i) { - m_timezoneGroup->removeItem(m_timezoneGroup->getItem(i)); - } - const QList &userTimeZones = m_model->userTimeZones(); - for (const ZoneInfo &zoneInfo : userTimeZones) { - TimezoneItem *timezoneitem = new TimezoneItem; - timezoneitem->setTimeZone(zoneInfo); - connect(timezoneitem, &TimezoneItem::removeClicked, this, [this, timezoneitem] { - timezoneitem->setVisible(false); - Q_EMIT requestRemoveUserTimeZone(timezoneitem->timeZone()); - }); - if (zoneInfo.getZoneName() != m_model->systemTimeZoneId()) { - m_timezoneGroup->insertItem(m_timezoneGroup->itemCount() - 1, timezoneitem); - } - } - Q_EMIT exitEdit(); - }; - updateZones(); - connect(m_model, &DatetimeModel::systemTimeZoneIdChanged, m_timezoneGroup, updateZones); - connect(m_model, &DatetimeModel::userTimeZoneAdded, m_timezoneGroup, updateZones); - - connect(m_addTimezoneButton, &QPushButton::clicked, this, &TimezoneModule::ensureZoneChooserDialog); -} - -void TimezoneModule::ensureZoneChooserDialog(bool setZone) -{ - TimeZoneChooser *zoneChooserdialog = new TimeZoneChooser(qApp->activeWindow()); - zoneChooserdialog->setAttribute(Qt::WA_DeleteOnClose, true); - zoneChooserdialog->setIsAddZone(!setZone); - - if (setZone) { - zoneChooserdialog->setMarkedTimeZone(installer::GetCurrentTimezone().isEmpty() ? m_model->getTimeZone() : installer::GetCurrentTimezone()); - connect(zoneChooserdialog, &TimeZoneChooser::confirmed, m_work, &DatetimeWorker::setTimezone); - } else { - connect(zoneChooserdialog, &TimeZoneChooser::confirmed, m_work, &DatetimeWorker::addUserTimeZone); - } - Q_EMIT exitEdit(); - zoneChooserdialog->exec(); -} - -void TimezoneModule::onEditClicked(const bool &edit) -{ - for (int i = m_timezoneGroup->itemCount() - 2; i >= 0; --i) { - TimezoneItem *item = qobject_cast(m_timezoneGroup->getItem(i)); - if (edit) { - item->toRemoveMode(); - } else { - item->toNormalMode(); - } - } -} diff --git a/dcc-old/src/plugin-datetime/window/timezonemodule.h b/dcc-old/src/plugin-datetime/window/timezonemodule.h deleted file mode 100644 index 35144ac7ce..0000000000 --- a/dcc-old/src/plugin-datetime/window/timezonemodule.h +++ /dev/null @@ -1,48 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TIMEZONEMODULE_H -#define TIMEZONEMODULE_H -#include "interface/pagemodule.h" - -#include "zoneinfo.h" - -namespace DCC_NAMESPACE { -class SettingsGroup; -} - -class DatetimeModel; -class DatetimeWorker; - -class TimezoneItem; -class TimeZoneChooser; - -class TimezoneModule : public DCC_NAMESPACE::PageModule -{ - Q_OBJECT -public: - explicit TimezoneModule(DatetimeModel *model, DatetimeWorker *work, QObject *parent = nullptr); - - void initTimezoneListGroup(DCC_NAMESPACE::SettingsGroup *timezoneGroup); - -Q_SIGNALS: - void requestRemoveUserTimeZone(const ZoneInfo &zone); - void notifyItemCount(int); - void requestAddTimeZone(); - void requestAddUserTimeZone(const QString &zone); - void requestSetTimeZone(const QString &zone); - void exitEdit(); - -public Q_SLOTS: - void ensureZoneChooserDialog(bool setZone); - void onEditClicked(const bool &edit); - -private: - DatetimeModel *m_model; - DatetimeWorker *m_work; - - QList m_zoneList; - DCC_NAMESPACE::SettingsGroup *m_timezoneGroup; -}; - -#endif // TIMEZONEMODULE_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.cpp b/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.cpp deleted file mode 100644 index 948e26c9d9..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.cpp +++ /dev/null @@ -1,70 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "basiclistdelegate.h" -#include "basiclistmodel.h" - -#include -#include - -QPixmap loadPixmap(const QString &path) -{ - qreal ratio = 1.0; - QPixmap pixmap; - - const qreal devicePixelRatio = qApp->devicePixelRatio(); - - if (!qFuzzyCompare(ratio, devicePixelRatio)) { - QImageReader reader; - reader.setFileName(qt_findAtNxFile(path, devicePixelRatio, &ratio)); - if (reader.canRead()) { - reader.setScaledSize(reader.size() * (devicePixelRatio / ratio)); - pixmap = QPixmap::fromImage(reader.read()); - pixmap.setDevicePixelRatio(devicePixelRatio); - } - } else { - pixmap.load(path); - } - - return pixmap; -} - - -BasicListDelegate::BasicListDelegate(QObject *parent) - : QAbstractItemDelegate(parent) -{ - -} - -void BasicListDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - const bool isHover = index.data(BasicListModel::ItemHoverRole).toBool(); - - painter->setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing | QPainter::SmoothPixmapTransform); - painter->setBrush(Qt::red); - painter->setPen(Qt::black); - - if (isHover) { - QPainterPath path; - path.addRoundedRect(option.rect.marginsRemoved(QMargins(15, 0, 5, 0)), 6, 6); - painter->fillPath(path, QColor(0, 0, 0, 0.05 * 255)); - } - - painter->drawText(option.rect.marginsRemoved(QMargins(30, 0, 0, 0)), Qt::AlignVCenter | Qt::AlignLeft, index.data(Qt::DisplayRole).toString()); - - if (index.data(BasicListModel::ItemSelectedRole).toBool()) - { - const int x = option.rect.right() - 16 - 14; - const int y = option.rect.top() + (option.rect.height() - 16) / 2; - - painter->drawPixmap(x, y, loadPixmap(":/widgets/themes/dark/icons/list_select.png")); - } -} - -QSize BasicListDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - Q_UNUSED(option); - - return index.data(Qt::SizeHintRole).toSize(); -} - diff --git a/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.h b/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.h deleted file mode 100644 index 247111f549..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/basiclistdelegate.h +++ /dev/null @@ -1,27 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef BASICLISTDELEGATE_H -#define BASICLISTDELEGATE_H - -#include -#include -#include -#include - -QPixmap loadPixmap(const QString &path); - - -class BasicListDelegate : public QAbstractItemDelegate -{ - Q_OBJECT - -public: - explicit BasicListDelegate(QObject *parent = 0); - - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; - QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; -}; - - -#endif // BASICLISTDELEGATE_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.cpp b/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.cpp deleted file mode 100644 index a01412f389..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.cpp +++ /dev/null @@ -1,72 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "widgets/basiclistmodel.h" - -#include -#include - - -BasicListModel::BasicListModel(QObject *parent) - : QAbstractListModel(parent) -{ - -} - -int BasicListModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - - return m_options.size(); -} - -QVariant BasicListModel::data(const QModelIndex &index, int role) const -{ - if (!index.isValid()) - return QVariant(); - - switch (role) { - case ItemTextRole: return m_options[index.row()]; - case ItemSizeRole: return QSize(0, 36); - case ItemSelectedRole: return m_selectedIndex == index; - case ItemHoverRole: return m_hoveredIndex == index; - default:; - } - - return QVariant(); -} - -void BasicListModel::clear() -{ - beginRemoveRows(QModelIndex(), 0, m_options.size()); - m_options.clear(); - m_values.clear(); - endRemoveRows(); -} - -void BasicListModel::appendOption(const QString &text, const QVariant &data) -{ - beginInsertRows(QModelIndex(), m_options.size(), m_options.size()); - m_options.append(text); - m_values.append(data); - endInsertRows(); - - // Q_EMIT layoutChanged(); -} - -void BasicListModel::setSelectedIndex(const QModelIndex &index) -{ - const QModelIndex oldIndex = m_selectedIndex; - - m_selectedIndex = index; - - Q_EMIT dataChanged(oldIndex, oldIndex); - Q_EMIT dataChanged(index, index); -} - -void BasicListModel::setHoveredIndex(const QModelIndex &index) -{ - m_hoveredIndex = index; - - Q_EMIT dataChanged(index, index); -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.h b/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.h deleted file mode 100644 index 166e160f8e..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/basiclistmodel.h +++ /dev/null @@ -1,43 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef BASICLISTMODEL_H -#define BASICLISTMODEL_H - -#include - -class BasicListModel : public QAbstractListModel -{ - Q_OBJECT - -public: - enum ItemRole { - ItemSizeRole = Qt::SizeHintRole, - ItemTextRole = Qt::DisplayRole, - ReservedRole = Qt::UserRole, - ItemIsFirstRole, - ItemIsLastRole, - ItemSelectedRole, - ItemHoverRole - }; - - explicit BasicListModel(QObject *parent = 0); - - int rowCount(const QModelIndex &parent) const; - QVariant data(const QModelIndex &index, int role) const; - -public Q_SLOTS: - void clear(); - void appendOption(const QString &text, const QVariant &data = QVariant()); - void setSelectedIndex(const QModelIndex &index); - void setHoveredIndex(const QModelIndex &index); - -private: - QList m_options; - QList m_values; - - QModelIndex m_selectedIndex; - QModelIndex m_hoveredIndex; -}; - -#endif // BASICLISTMODEL_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/clock.cpp b/dcc-old/src/plugin-datetime/window/widgets/clock.cpp deleted file mode 100644 index a82695927f..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/clock.cpp +++ /dev/null @@ -1,148 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "clock.h" - -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE - -static const QSize clockSize = QSize(224, 224); -static const QSize pointSize = QSize(145, 15); - -Clock::Clock(QWidget *parent) - : QWidget(parent) - , m_drawTicks(true) - , m_autoNightMode(true) - , n_bIsUseBlackPlat(true) -{ - m_hour = getPixmap("dcc_noun_hour", pointSize); - m_min = getPixmap("dcc_noun_minute", pointSize); - m_sec = getPixmap("dcc_noun_second", pointSize); - setMinimumSize(clockSize); - - QTimer *timer = new QTimer(this); - connect(timer, &QTimer::timeout, this, QOverload<>::of(&Clock::update)); - timer->start(1000); -} - -Clock::~Clock() -{ -} - -QPixmap Clock::getPixmap(const QString &name, const QSize size) -{ - const QIcon &icon = DIconTheme::findQIcon(name); - const qreal ratio = devicePixelRatioF(); - QPixmap pixmap = icon.pixmap(size * ratio).scaled(size * ratio, Qt::IgnoreAspectRatio, Qt::SmoothTransformation); - QPainter p(&pixmap); - p.setRenderHints(QPainter::Antialiasing); - p.drawPixmap(0, 0, pixmap); - pixmap.setDevicePixelRatio(ratio); - return pixmap; -} - -void Clock::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event) - - QDateTime datetime(QDateTime::currentDateTime()); - const QTime time(datetime.time()); - QPainter painter(this); - painter.setRenderHints(QPainter::Antialiasing | QPainter::SmoothPixmapTransform); - - do { - const bool nightMode = !(time.hour() >= 6 && time.hour() < 18); - if (nightMode == m_isBlack && !m_plat.isNull()) - break; - if (nightMode) { - m_plat = getPixmap("dcc_clock_black", clockSize); - m_isBlack = true; - } else { - m_plat = getPixmap("dcc_clock_white", clockSize); - m_isBlack = false; - } - } while (false); - - // draw plate - painter.save(); - painter.translate(width() / 2.0, height() / 2.0); - painter.drawPixmap(QPointF(-clockSize.width() / 2.0, -clockSize.height() / 2.0), m_plat); - painter.restore(); - - int nHour = (time.hour() >= 12) ? (time.hour() - 12) : time.hour(); - int nStartAngle = 90; //The image from 0 start , but the clock need from -90 start - - // draw hour hand - const qreal hourAngle = qreal(nHour * 30 + time.minute() * 30 / 60 + time.second() * 30 / 60 / 60 - nStartAngle); - painter.save(); - painter.translate(width() / 2.0, height() / 2.0); - painter.rotate(hourAngle); - painter.drawPixmap(QPointF(-pointSize.width() / 2.0, -pointSize.height() / 2.0), m_hour); - painter.restore(); - - // draw minute hand - const qreal minuteAngle = qreal(time.minute() * 6 + time.second() * 6 / 60 - nStartAngle); - painter.save(); - painter.translate(width() / 2.0, height() / 2.0); - painter.rotate(minuteAngle); - painter.drawPixmap(QPointF(-pointSize.width() / 2.0, -pointSize.height() / 2.0), m_min); - painter.restore(); - - // draw second hand - const qreal secondAngle = qreal(time.second() * 6 - nStartAngle); - painter.save(); - painter.translate(width() / 2.0, height() / 2.0); - painter.rotate(secondAngle); - painter.drawPixmap(QPointF(-pointSize.width() / 2.0, -pointSize.height() / 2.0), m_sec); - painter.restore(); - - painter.end(); -} -//////////////////////////////////////////////////////////// -bool Clock::autoNightMode() const -{ - return m_autoNightMode; -} - -void Clock::setAutoNightMode(bool autoNightMode) -{ - if (m_autoNightMode != autoNightMode) { - m_autoNightMode = autoNightMode; - update(); - } -} - -void Clock::setPlate(bool isBlack) -{ - if (n_bIsUseBlackPlat != isBlack) { - n_bIsUseBlackPlat = isBlack; - update(); - } -} - -void Clock::setTimeZone(const ZoneInfo &timeZone) -{ - if (m_timeZone == timeZone) - return; - - m_timeZone = timeZone; - update(); -} - -bool Clock::drawTicks() const -{ - return m_drawTicks; -} - -void Clock::setDrawTicks(bool drawTicks) -{ - if (m_drawTicks != drawTicks) { - m_drawTicks = drawTicks; - update(); - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/clock.h b/dcc-old/src/plugin-datetime/window/widgets/clock.h deleted file mode 100644 index bd654165e0..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/clock.h +++ /dev/null @@ -1,39 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once -#include "interface/namespace.h" - -#include -#include -#include "zoneinfo.h" - -class Clock : public QWidget -{ - Q_OBJECT -public: - explicit Clock(QWidget *parent = 0); - virtual ~Clock(); - - bool drawTicks() const; - void setDrawTicks(bool drawTicks); - void setTimeZone(const ZoneInfo &timeZone); - bool autoNightMode() const; - void setAutoNightMode(bool autoNightMode); - void setPlate(bool isBlack = true); - QPixmap getPixmap(const QString &name, const QSize size); - -protected: - void paintEvent(QPaintEvent *event); - -private: - bool m_drawTicks; - bool m_autoNightMode; - bool n_bIsUseBlackPlat; - bool m_isBlack; - ZoneInfo m_timeZone; - QPixmap m_plat; - QPixmap m_hour; - QPixmap m_min; - QPixmap m_sec; -}; diff --git a/dcc-old/src/plugin-datetime/window/widgets/consts.h b/dcc-old/src/plugin-datetime/window/widgets/consts.h deleted file mode 100644 index c315eea2c9..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/consts.h +++ /dev/null @@ -1,22 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_CONSTS_H -#define INSTALLER_CONSTS_H - -namespace installer { - -// Name of application. This name can be used as folder name. -const char kAppName[] = "deepin-installer-reborn"; - -// Human readable application name. -const char kAppDisplayName[] = "Deepin Installer Reborn"; - -const char kDomainName[] = "deepin.org"; - -// Default locale used in program. -const char kDefaultLocale[] = "en_US.UTF-8"; - -} - -#endif // INSTALLER_CONSTS_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.cpp b/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.cpp deleted file mode 100644 index 9bdb0bdebb..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.cpp +++ /dev/null @@ -1,179 +0,0 @@ -//SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "customregionformatdialog.h" - -#include -#include - -using namespace DCC_NAMESPACE; - -CustomRegionFormatDialog::CustomRegionFormatDialog(QWidget *parent) - : DDialog(parent) -{ - setMinimumSize(540, 590); - setTitle(tr("Custom Format")); - - QWidget *contentWidget = new QWidget; - QVBoxLayout *mainVLayout = new QVBoxLayout(contentWidget); - mainVLayout->setSpacing(0); - mainVLayout->setMargin(0); - - QVBoxLayout *dateGrpHLayout = new QVBoxLayout; - dateGrpHLayout->setContentsMargins(10, 6, 10, 6); - dateGrpHLayout->setSpacing(0); - DBackgroundGroup *dateGrp = new DBackgroundGroup; - dateGrp->setLayout(dateGrpHLayout); - dateGrp->setBackgroundRole(QPalette::Window); - dateGrp->setItemSpacing(1); - dateGrp->setUseWidgetBackground(false); - - QWidget *dayWidget = new QWidget; - QHBoxLayout *dayHBoxLayout = new QHBoxLayout(dayWidget); - dayHBoxLayout->setMargin(0); - QLabel *dayLabel = new QLabel(tr("First day of week")); - m_dayCombo = new QComboBox; - dayHBoxLayout->addWidget(dayLabel); - dayHBoxLayout->addWidget(m_dayCombo); - - QWidget *shortDateWidget = new QWidget; - QHBoxLayout *shortDateHBoxLayout = new QHBoxLayout(shortDateWidget); - shortDateHBoxLayout->setMargin(0); - QLabel *shortDateLabel = new QLabel(tr("Short date")); - m_shortDateCombo = new QComboBox; - shortDateHBoxLayout->addWidget(shortDateLabel); - shortDateHBoxLayout->addWidget(m_shortDateCombo); - - QWidget *longDateWidget = new QWidget; - QHBoxLayout *longDateHBoxLayout = new QHBoxLayout(longDateWidget); - longDateHBoxLayout->setMargin(0); - QLabel *longDateLabel = new QLabel(tr("Long date")); - m_longDateCombo = new QComboBox; - longDateHBoxLayout->addWidget(longDateLabel); - longDateHBoxLayout->addWidget(m_longDateCombo); - - dateGrpHLayout->addWidget(dayWidget); - dateGrpHLayout->addWidget(shortDateWidget); - dateGrpHLayout->addWidget(longDateWidget); - - QVBoxLayout *timeGrpHLayout = new QVBoxLayout; - timeGrpHLayout->setContentsMargins(10, 6, 10, 6); - timeGrpHLayout->setSpacing(0); - DBackgroundGroup *timeGrp = new DBackgroundGroup; - timeGrp->setBackgroundRole(QPalette::Window); - timeGrp->setLayout(timeGrpHLayout); - timeGrp->setItemSpacing(1); - timeGrp->setUseWidgetBackground(false); - - QWidget *shortTimeWidget = new QWidget; - QHBoxLayout *shortTimeHBoxLayout = new QHBoxLayout(shortTimeWidget); - shortTimeHBoxLayout->setMargin(0); - QLabel *shortTimeLabel = new QLabel(tr("Short time")); - m_shortTimeCombo = new QComboBox; - shortTimeHBoxLayout->addWidget(shortTimeLabel); - shortTimeHBoxLayout->addWidget(m_shortTimeCombo); - - QWidget *longTimeWidget = new QWidget; - QHBoxLayout *longTimeHBoxLayout = new QHBoxLayout(longTimeWidget); - longTimeHBoxLayout->setMargin(0); - QLabel *longTimeLabel = new QLabel(tr("Long time")); - m_longTimeCombo = new QComboBox; - longTimeHBoxLayout->addWidget(longTimeLabel); - longTimeHBoxLayout->addWidget(m_longTimeCombo); - - timeGrpHLayout->addWidget(shortTimeWidget); - timeGrpHLayout->addWidget(longTimeWidget); - - QVBoxLayout *otherGrpHLayout = new QVBoxLayout; - otherGrpHLayout->setContentsMargins(10, 6, 10, 6); - otherGrpHLayout->setSpacing(0); - DBackgroundGroup *otherGrp = new DBackgroundGroup; - otherGrp->setBackgroundRole(QPalette::Window); - otherGrp->setLayout(otherGrpHLayout); - otherGrp->setItemSpacing(1); - otherGrp->setUseWidgetBackground(false); - - QWidget *currencyWidget = new QWidget; - QHBoxLayout *currencyHBoxLayout = new QHBoxLayout(currencyWidget); - currencyHBoxLayout->setMargin(0); - QLabel *currencyLabel = new QLabel(tr("Currency symbol")); - m_currencyValueLabel = new QLabel("$"); - m_currencyValueLabel->setAlignment(Qt::AlignRight); - currencyHBoxLayout->addWidget(currencyLabel); - currencyHBoxLayout->addWidget(m_currencyValueLabel); - - QWidget *numberWidget = new QWidget; - QHBoxLayout *numberHBoxLayout = new QHBoxLayout(numberWidget); - numberHBoxLayout->setMargin(0); - QLabel *numberLabel = new QLabel(tr("Numbers")); - m_numberValueLabel = new QLabel("123456789"); - m_numberValueLabel->setAlignment(Qt::AlignRight); - numberHBoxLayout->addWidget(numberLabel); - numberHBoxLayout->addWidget(m_numberValueLabel); - - QWidget *paperWidget = new QWidget; - QHBoxLayout *paperHBoxLayout = new QHBoxLayout(paperWidget); - paperHBoxLayout->setMargin(0); - QLabel *paperLabel = new QLabel(tr("Paper")); - m_paperValueLabel = new QLabel("A4"); - m_paperValueLabel->setAlignment(Qt::AlignRight); - paperHBoxLayout->addWidget(paperLabel); - paperHBoxLayout->addWidget(m_paperValueLabel); - - otherGrpHLayout->addWidget(currencyWidget); - otherGrpHLayout->addWidget(numberWidget); - otherGrpHLayout->addWidget(paperWidget); - - mainVLayout->addWidget(dateGrp); - mainVLayout->addSpacing(10); - mainVLayout->addWidget(timeGrp); - mainVLayout->addSpacing(10); - mainVLayout->addWidget(otherGrp); - mainVLayout->addSpacing(40); - - addContent(contentWidget); - - addButton(tr("Cancel"), false, DDialog::ButtonNormal); - addButton(tr("Save"), true, DDialog::ButtonRecommend); - - connect(getButton(1), &QPushButton::clicked, this, &CustomRegionFormatDialog::onSaved); -} - -CustomRegionFormatDialog::~CustomRegionFormatDialog() -{ -} - -void CustomRegionFormatDialog::initRegionFormat(const QLocale &locale, const RegionFormat ®ionFormat) -{ - RegionAvailableData regionFormatsAvailable = RegionProxy::allTextData(locale); - m_dayCombo->addItems(regionFormatsAvailable.daysAvailable); - m_shortDateCombo->addItems(regionFormatsAvailable.shortDatesAvailable); - m_longDateCombo->addItems(regionFormatsAvailable.longDatesAvailable); - m_shortTimeCombo->addItems(regionFormatsAvailable.shortTimesAvailable); - m_longTimeCombo->addItems(regionFormatsAvailable.longTimesAvailable); - m_currencyValueLabel->setText(RegionProxy::regionFormat(locale).currencyFormat); - m_numberValueLabel->setText(RegionProxy::regionFormat(locale).numberFormat); - m_paperValueLabel->setText(RegionProxy::regionFormat(locale).paperFormat); - - m_dayCombo->setCurrentText(locale.standaloneDayName(regionFormat.firstDayOfWeekFormat)); - m_shortDateCombo->setCurrentText(locale.toString(QDate(2023, 1, 1), regionFormat.shortDateFormat)); - m_longDateCombo->setCurrentText(locale.toString(QDate(2023, 1, 1), regionFormat.longDateFormat)); - m_shortTimeCombo->setCurrentText(locale.toString(QTime(1, 1, 1), regionFormat.shortTimeFormat)); - m_longTimeCombo->setCurrentText(locale.toString(QTime(1, 1, 1), regionFormat.longTimeFormat)); -} - -void CustomRegionFormatDialog::onSaved() -{ - RegionAvailableData regionFormat = RegionProxy::allFormat(); - m_format.firstDayOfWeekFormat = m_dayCombo->currentIndex() + 1; - m_format.shortDateFormat = regionFormat.shortDatesAvailable.at(m_shortDateCombo->currentIndex()); - m_format.longDateFormat = regionFormat.longDatesAvailable.at(m_longDateCombo->currentIndex()); - m_format.shortTimeFormat = regionFormat.shortTimesAvailable.at(m_shortTimeCombo->currentIndex()); - m_format.longTimeFormat = regionFormat.longTimesAvailable.at(m_longTimeCombo->currentIndex()); - m_format.currencyFormat = m_currencyValueLabel->text(); - m_format.numberFormat = m_numberValueLabel->text(); - m_format.paperFormat = m_paperValueLabel->text(); - - Q_EMIT customFormatSaved(m_format); -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.h b/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.h deleted file mode 100644 index 07db58d157..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/customregionformatdialog.h +++ /dev/null @@ -1,49 +0,0 @@ -//SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef CUSTOMREGIONFORMATDIALOG_H -#define CUSTOMREGIONFORMATDIALOG_H - -#include "interface/namespace.h" -#include "regionproxy.h" - -#include - -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class CustomRegionFormatDialog : public DDialog -{ - Q_OBJECT -public: - explicit CustomRegionFormatDialog(QWidget *parent = nullptr); - ~CustomRegionFormatDialog(); - - void initRegionFormat(const QLocale &locale, const RegionFormat ®ionFormat); - -Q_SIGNALS: - void customFormatSaved(const RegionFormat ®ionFormat); - -private Q_SLOTS: - void onSaved(); - -private: - QComboBox *m_dayCombo; - QComboBox *m_shortDateCombo; - QComboBox *m_longDateCombo; - QComboBox *m_shortTimeCombo; - QComboBox *m_longTimeCombo; - QLabel *m_currencyValueLabel; - QLabel *m_numberValueLabel; - QLabel *m_paperValueLabel; - - RegionFormat m_format; -}; -} -#endif // CUSTOMREGIONFORMATDIALOG_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/datewidget.cpp b/dcc-old/src/plugin-datetime/window/widgets/datewidget.cpp deleted file mode 100644 index 5fce04743b..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/datewidget.cpp +++ /dev/null @@ -1,198 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "datewidget.h" - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -DateWidget::DateWidget(Type type, int minimum, int maximum, QWidget *parent) - : SettingsItem (parent) - , m_type(type) - , m_minimum(minimum) - , m_maximum(maximum) - , m_lineEdit(new QLineEdit(this)) - , m_label(new QLabel(this)) - , m_addBtn(new DIconButton(this)) - , m_reducedBtn(new DIconButton(this)) -{ - setFixedHeight(36); - - m_addBtn->setIcon(DStyle::StandardPixmap::SP_IncreaseElement); - m_reducedBtn->setIcon(DStyle::StandardPixmap::SP_DecreaseElement); - - m_lineEdit->setContextMenuPolicy(Qt::NoContextMenu); - m_lineEdit->setObjectName("DCC-Datetime-QLineEdit"); - QPalette palette = m_lineEdit->palette(); - palette.setColor(QPalette::Button, Qt::transparent); - m_lineEdit->setPalette(palette); - DStyle::setFocusRectVisible(m_lineEdit, false); - m_addBtn->setObjectName("DCC-Datetime-Datewidget-Add"); - m_reducedBtn->setObjectName("DCC-Datetime-Datewidget-Reduce"); - - m_label->setParent(m_lineEdit); - m_label->move(0, 0); - m_addBtn->setParent(m_lineEdit); - m_reducedBtn->setParent(m_lineEdit); - - if (m_type == Year) { - m_addBtn->setAccessibleName("yearadd"); - m_reducedBtn->setAccessibleName("yearreduced"); - m_label->setText(tr("Year")); - m_lineEdit->setAccessibleName(tr("Year")); - m_lineEdit->setMaxLength(4); - } else if (m_type == Month) { - m_addBtn->setAccessibleName("monthadd"); - m_reducedBtn->setAccessibleName("monthreduced"); - m_label->setText(tr("Month")); - m_lineEdit->setAccessibleName(tr("Month")); - m_lineEdit->setMaxLength(2); - } else { - m_addBtn->setAccessibleName("dayadd"); - m_reducedBtn->setAccessibleName("dayreduced"); - m_label->setText(tr("Day")); - m_lineEdit->setAccessibleName(tr("Day")); - m_lineEdit->setMaxLength(2); - } - - m_lineEdit->setAlignment(Qt::AlignVCenter | Qt::AlignRight); - setRange(minimum, maximum); - m_lineEdit->installEventFilter(this); - - QHBoxLayout *layout = new QHBoxLayout; - layout->setMargin(0); - layout->setSpacing(0); - - QHBoxLayout *lLayout = new QHBoxLayout; - lLayout->setMargin(0); - lLayout->setSpacing(0); - lLayout->addWidget(m_reducedBtn); - lLayout->addStretch(); - lLayout->addWidget(m_lineEdit); - - QHBoxLayout *rLayout = new QHBoxLayout; - rLayout->setMargin(0); - rLayout->setSpacing(0); - rLayout->addWidget(m_label); - rLayout->addStretch(); - rLayout->addWidget(m_addBtn); - - layout->addLayout(lLayout); - layout->addSpacing(5); - layout->addLayout(rLayout); - setLayout(layout); - - connect(m_addBtn, &DIconButton::clicked, this, &DateWidget::slotAdd); - connect(m_reducedBtn, &DIconButton::clicked, this, &DateWidget::slotReduced); - - connect(m_lineEdit, &QLineEdit::editingFinished, [this] { - fixup(); - Q_EMIT editingFinished(); - }); - connect(m_lineEdit, &QLineEdit::textChanged, this, [this] { - Q_EMIT chenged(); - }); -} - -void DateWidget::setValue(const int &value) -{ - m_lineEdit->blockSignals(true); - m_lineEdit->setText(QString::number(value)); - m_lineEdit->blockSignals(false); -} - -int DateWidget::value() const -{ - return m_lineEdit->text().toInt(); -} - -void DateWidget::slotAdd() -{ - int value = m_lineEdit->text().toInt() + 1; - - if (value < m_minimum) { - value = m_maximum; - } else if (value > m_maximum) { - value = m_minimum; - } - - m_lineEdit->setText(QString::number(value)); - - Q_EMIT notifyClickedState(true); -} - -void DateWidget::slotReduced() -{ - int value = m_lineEdit->text().toInt() - 1; - - if (value < m_minimum) { - value = m_maximum; - } else if (value > m_maximum) { - value = m_minimum; - } - - m_lineEdit->setText(QString::number(value)); - - Q_EMIT notifyClickedState(false); -} - -void DateWidget::fixup() -{ - int value = m_lineEdit->text().toInt(); - value = qMin(m_maximum, qMax(m_minimum, value)); - m_lineEdit->setText(QString::number(value)); -} - -int DateWidget::maximum() const -{ - return m_maximum; -} - -void DateWidget::setRange(int minimum, int maximum) -{ - m_minimum = minimum; - m_maximum = maximum; - - QIntValidator *validator = new QIntValidator(m_minimum, m_maximum, this); - m_lineEdit->setValidator(validator); - - fixup(); -} - -const QString DateWidget::getCurrentText() const -{ - return m_lineEdit->text(); -} - -void DateWidget::setCurrentText(QString text) -{ - m_lineEdit->setText(text); -} - -bool DateWidget::eventFilter(QObject *watched, QEvent *event) -{ - if (watched == m_lineEdit && event->type() == QEvent::FocusOut) { - fixup(); - Q_EMIT editingFinished(); - } - - return false; -} - -void DateWidget::mouseReleaseEvent(QMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) { - m_lineEdit->setFocus(); - } -} - -int DateWidget::minimum() const -{ - return m_minimum; -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/datewidget.h b/dcc-old/src/plugin-datetime/window/widgets/datewidget.h deleted file mode 100644 index 862db8965d..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/datewidget.h +++ /dev/null @@ -1,59 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef DATEWIDGET_H -#define DATEWIDGET_H - -#include "widgets/settingsitem.h" - -#include - -class QLineEdit; -class QLabel; - -class DateWidget : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT -public: - enum Type { - Year, - Month, - Day - }; - -public: - explicit DateWidget(Type type, int minimum, int maximum, QWidget *parent = 0); - - int value() const; - void setValue(const int &value); - int minimum() const; - int maximum() const; - void setRange(int minimum, int maximum); - const QString getCurrentText() const; - void setCurrentText(QString text); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - void mouseReleaseEvent(QMouseEvent *event) override; - -Q_SIGNALS: - void editingFinished(); - void notifyClickedState(bool); - void chenged(); - -public Q_SLOTS: - void slotAdd(); - void slotReduced(); - void fixup(); - -private: - Type m_type; - int m_minimum; - int m_maximum; - QLineEdit *m_lineEdit; - QLabel *m_label; - DTK_WIDGET_NAMESPACE::DIconButton *m_addBtn; - DTK_WIDGET_NAMESPACE::DIconButton *m_reducedBtn; -}; -#endif // DATEWIDGET_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/file_util.cpp b/dcc-old/src/plugin-datetime/window/widgets/file_util.cpp deleted file mode 100644 index 09b9a04788..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/file_util.cpp +++ /dev/null @@ -1,240 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "file_util.h" - -#include -#include -#include -#include -#include - -#include -#include -#include - -namespace installer { - -QDir ConcateDir(const QDir &parent_dir, const QString &folder_name) -{ - if (!parent_dir.exists(folder_name)) { - // TODO(xushaohua): Handles permission error. - parent_dir.mkpath(folder_name); - } - return QDir(parent_dir.filePath(folder_name)); -} - -bool CopyFile(const QString &src_file, const QString &dest_file, bool overwrite) -{ - QFile dest(dest_file); - if (dest.exists()) { - if (overwrite) { - if (!dest.remove()) { - qCritical() << "Failed to remove:" << dest_file; - return false; - } - } else { - qCritical() << dest_file << "exists but is not overwritten"; - return false; - } - } - return QFile::copy(src_file, dest_file); -} - -bool CopyFolder(const QString &src_dir, const QString &dest_dir, bool recursive) -{ - QDirIterator::IteratorFlag iter_flag; - if (recursive) { - iter_flag = QDirIterator::Subdirectories; - } else { - iter_flag = QDirIterator::NoIteratorFlags; - } - QDirIterator iter(src_dir, QDir::Dirs | QDir::Files | QDir::NoDotAndDotDot, iter_flag); - QFileInfo src_info; - QString dest_filepath; - bool ok = true; - if (!QDir(dest_dir).exists()) { - ok = CreateDirs(dest_dir); - } - - // Walk through source folder. - while (ok && iter.hasNext()) { - src_info = iter.next(); - dest_filepath = iter.filePath().replace(src_dir, dest_dir); - if (src_info.isDir()) { - if (!QDir(dest_filepath).exists()) { - ok = CreateDirs(dest_filepath); - } - if (ok) { - ok = CopyMode(iter.filePath().toStdString().c_str(), - dest_filepath.toStdString().c_str()); - } - } else if (src_info.isFile()) { - if (QFile::exists(dest_filepath)) { - // Remove old file first. - QFile::remove(dest_filepath); - } - ok = QFile::copy(iter.filePath(), dest_filepath); - if (ok) { - ok = CopyMode(iter.filePath().toStdString().c_str(), - dest_filepath.toStdString().c_str()); - } - } else if (src_info.isSymLink()) { - if (QFile::exists(dest_filepath)) { - QFile::remove(dest_filepath); - } - ok = QFile::link(src_info.canonicalFilePath(), dest_filepath); - } else { - // Ignores other type of files. - } - } - return ok; -} - -bool CopyMode(const char *src_file, const char *dest_file) -{ - struct stat st; - if (stat(src_file, &st) == -1) { - return false; - } - - const mode_t mode = st.st_mode & 0777; - return (chmod(dest_file, mode) == 0); -} - -bool CreateDirs(const QString &dirpath) -{ - return QDir(dirpath).mkpath("."); -} - -bool CreateParentDirs(const QString &filepath) -{ - return QFileInfo(filepath).absoluteDir().mkpath("."); -} - -QString GetFileBasename(const QString &filepath) -{ - const QString filename = GetFileName(filepath); - const int dot_index = filename.lastIndexOf(QChar('.')); - if (dot_index > 0) { - return filename.left(dot_index); - } else { - // Filename does not contain extension name. - return filename; - } -} - -QString GetFileExtname(const QString &filepath) -{ - const int dot_index = filepath.lastIndexOf(QChar('.')); - if (dot_index > 0) { - // Ignores hidden file. - return filepath.mid(dot_index + 1).toLower(); - } - - return ""; -} - -QString GetFileName(const QString &filepath) -{ - const int slash_index = filepath.lastIndexOf(QDir::separator()); - if (slash_index > -1) { - return filepath.mid(slash_index + 1); - } else { - // filepath is the filename. - return filepath; - } -} - -qint64 GetFileSize(const QString &filepath) -{ - QFileInfo info(filepath); - if (info.exists()) { - return info.size(); - } else { - return 0; - } -} - -QString ReadFile(const QString &path) -{ - QFile file(path); - if (file.exists()) { - if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { - qDebug() << "ReadFile() failed to open" << path; - return ""; - } - QTextStream text_stream(&file); - QString str = text_stream.readAll(); - file.close(); - return str; - } else { - qDebug() << "ReadFileContent() file not found: " << path; - return ""; - } -} - -QString ReadGBKFile(const QString &path) -{ - QFile file(path); - if (file.exists()) { - if (!file.open(QIODevice::ReadOnly)) { - qDebug() << "ReadGBKFile() failed to open" << path; - return ""; - } - const QByteArray file_data = file.readAll(); - QTextCodec *codec = QTextCodec::codecForName("GB18030"); - file.close(); - return codec->toUnicode(file_data); - } else { - qDebug() << "ReadGBKFile() file not found:" << path; - return ""; - } -} - -bool ReadRawFile(const QString &path, QByteArray &content) -{ - QFile file(path); - if (file.exists()) { - if (file.open(QIODevice::ReadOnly)) { - content = file.readAll(); - return true; - } - } - qDebug() << "ReadRawFile() failed!" << path; - return false; -} - -bool ReadTextFile(const QString &path, QString &content) -{ - QFile file(path); - if (file.exists()) { - if (file.open(QIODevice::ReadOnly | QIODevice::Text)) { - QTextStream text_stream(&file); - content = text_stream.readAll(); - file.close(); - return true; - } - } - qDebug() << "ReadTextFile() failed!" << path; - return false; -} - -bool WriteTextFile(const QString &path, const QString &content) -{ - QFile file(path); - if (file.open(QIODevice::WriteOnly | QIODevice::Text)) { - QTextStream text_stream(&file); - text_stream << content; - text_stream.flush(); - file.close(); - return true; - } else { - qCritical() << "WriteTextFile() failed!" - << ", path:" << path; - return false; - } -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/file_util.h b/dcc-old/src/plugin-datetime/window/widgets/file_util.h deleted file mode 100644 index e1dc7719a3..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/file_util.h +++ /dev/null @@ -1,69 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_BASE_FILE_UTIL_H -#define INSTALLER_BASE_FILE_UTIL_H - -#include -#include - -namespace installer { - -// Create a folder with |folder_name| in |parent_dir| directory and -// returns a QDir object referencing to its absolute path. -QDir ConcateDir(const QDir &parent_dir, const QString &folder_name); - -// Copy file from |src_file| to |dest_file|. -// If |dest_file| exists, overwrite its content if |overwrite| is true, or -// returns false if not overwrite. -bool CopyFile(const QString &src_file, const QString &dest_file, bool overwrite); - -// Folder content in |src_dir| into |dest_dir|. -// This method only copy normal files, folders and symbolic link file. -// Other type of files and character device, FIFO and device file are ignored. -// For advanced copy function, see misc/unsquashfs.cpp -bool CopyFolder(const QString &src_dir, const QString &dest_dir, bool recursive = true); - -// Copy file/folder mode from |src_file| to |dest_file| -// Both |src_file| and |dest_file| should not be symbolic link. -bool CopyMode(const char *src_file, const char *dest_file); - -// Create parent folders and itself. -bool CreateDirs(const QString &dirpath); - -// Create parent folders. -bool CreateParentDirs(const QString &filepath); - -// Returns basename of |filepath|. -QString GetFileBasename(const QString &filepath); - -// Returns lower cased extension name of |filepath|, might be empty. -QString GetFileExtname(const QString &filepath); - -// Returns filename of |filepath|. -QString GetFileName(const QString &filepath); - -// Get size of file. If file not found or has no access, returns 0. -qint64 GetFileSize(const QString &filepath); - -// Read contents of file, returns an empty string if failed. -// DEPRECATED: call ReadTextFile() instead. -QString ReadFile(const QString &path); - -// Read text file encoded in GB18030. -QString ReadGBKFile(const QString &path); - -// Read content of file at |path|, and save its content into |content|. -// Returns true if succeeded, or false otherwise. -bool ReadRawFile(const QString &path, QByteArray &content); - -// Read contents of text file, returns true if succeeded, or false otherwise. -// |content| holds the content of that file. -bool ReadTextFile(const QString &path, QString &content); - -// Write content to file, returns true if succeeded, or false otherwise. -bool WriteTextFile(const QString &path, const QString &content); - -} // namespace installer - -#endif // INSTALLER_BASE_FILE_UTIL_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/popup_menu.cpp b/dcc-old/src/plugin-datetime/window/widgets/popup_menu.cpp deleted file mode 100644 index 685dc99e51..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/popup_menu.cpp +++ /dev/null @@ -1,198 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "popup_menu.h" - -#include "file_util.h" -#include "popup_menu_delegate.h" - -#include -#include -#include -#include -#include -#include -#include - -namespace installer { - -namespace { - -const int kBorderRadius = 5; -const int kBorderDiameter = kBorderRadius * 2; - -// _____ -// \ | / -// \|/ -const int kTriangleHeight = 6; - -// Height of menu item is also defined in styles/popup_menu.css -const int kMenuItemHeight = 24; -const int kMenuViewVerticalMargin = 4; -const int kMenuViewBottomPadding = 5; -const int kMenuViewHorizontalMargins = 20; -const int kMenuViewMinimumWidth = 60; - -} // namespace - -PopupMenu::PopupMenu(QWidget *parent) - : QFrame(parent) -{ - this->setObjectName("popup_menu"); - this->initUI(); - this->initConnections(); -} - -QStringList PopupMenu::stringList() const -{ - return menu_model_->stringList(); -} - -void PopupMenu::popup(const QPoint &pos) -{ - const QSize size = menu_view_->size(); - this->move(pos.x() - size.width() / 2, pos.y() - size.height()); - this->show(); - - // Grab global keyboard events when menu window is popup. - this->grabKeyboard(); -} - -void PopupMenu::setStringList(const QStringList &strings) -{ - menu_model_->setStringList(strings); - - int item_width = kMenuViewMinimumWidth; - const QFontMetrics metrics(menu_view_->font()); - for (const QString &str : strings) { - const int curr_width = metrics.horizontalAdvance(str); - item_width = (curr_width > item_width) ? curr_width : item_width; - } - // Add margin to list view. - const int width = item_width + kMenuViewHorizontalMargins * 2; - - // Add more space at bottom of list view. - const int height = kMenuItemHeight * strings.length() + kMenuViewVerticalMargin * 2 - + kMenuViewBottomPadding; - - this->resize(width, height + kTriangleHeight); - menu_view_->adjustSize(); - menu_view_->resize(width, height); -} - -bool PopupMenu::eventFilter(QObject *obj, QEvent *event) -{ - if (event->type() == QEvent::MouseButtonPress) { - QMouseEvent *mouse_event = static_cast(event); - if (mouse_event) { - // If mouse press event is not happened within menu area, hide menu. - if (!this->geometry().contains(mouse_event->pos())) { - this->hide(); - } - } - } - return QObject::eventFilter(obj, event); -} - -void PopupMenu::hideEvent(QHideEvent *event) -{ - // No need to monitor global mouse event when menu is hidden. - qApp->removeEventFilter(this); - - this->releaseKeyboard(); - QWidget::hideEvent(event); - Q_EMIT this->onHide(); -} - -void PopupMenu::keyPressEvent(QKeyEvent *event) -{ - if (event->key() == Qt::Key_Escape) { - this->hide(); - } - QWidget::keyPressEvent(event); -} - -void PopupMenu::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QPainter painter(this); - painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, true); - const int kWidth = this->width(); - const int kHalfWidth = kWidth / 2; - const int kHeight = this->height(); - - // First draw background with round corner. - QPainterPath background_path; - background_path.moveTo(kWidth, kBorderRadius); - background_path.arcTo(kWidth - kBorderDiameter, 0, kBorderDiameter, kBorderDiameter, 0.0, 90.0); - background_path.lineTo(kBorderRadius, 0); - background_path.arcTo(0, 0, kBorderDiameter, kBorderDiameter, 90.0, 90.0); - background_path.lineTo(0, kHeight - kBorderRadius - kTriangleHeight); - background_path.arcTo(0, - kHeight - kBorderDiameter - kTriangleHeight, - kBorderDiameter, - kBorderDiameter, - 180.0, - 90.0); - background_path.lineTo(kHalfWidth - kTriangleHeight, kHeight - kTriangleHeight); - // Draw isosceles right-angled triangle in bottom center of label. - background_path.lineTo(kHalfWidth, kHeight); - background_path.lineTo(kHalfWidth + kTriangleHeight, kHeight - kTriangleHeight); - background_path.lineTo(kWidth - kBorderRadius, kHeight - kTriangleHeight); - background_path.arcTo(kWidth - kBorderDiameter, - kHeight - kBorderDiameter - kTriangleHeight, - kBorderDiameter, - kBorderDiameter, - 270.0, - 90.0); - background_path.closeSubpath(); - const QColor background_color(255, 255, 255, 230); - painter.fillPath(background_path, QBrush(background_color)); -} - -void PopupMenu::showEvent(QShowEvent *event) -{ - qApp->installEventFilter(this); - QFrame::showEvent(event); -} - -void PopupMenu::initConnections() -{ - connect(menu_view_, &QListView::pressed, this, &PopupMenu::onMenuViewActivated); -} - -void PopupMenu::initUI() -{ - menu_model_ = new QStringListModel(this); - menu_view_ = new QListView(this); - menu_view_->setObjectName("menu_view"); - menu_view_->setAccessibleName("menu_view"); - menu_view_->setContentsMargins(0, kMenuViewVerticalMargin, 0, kMenuViewVerticalMargin); - menu_view_->setModel(menu_model_); - menu_view_->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - menu_view_->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - menu_view_->setUniformItemSizes(true); - menu_view_->setSelectionMode(QListView::SingleSelection); - menu_view_->setEditTriggers(QListView::NoEditTriggers); - PopupMenuDelegate *popup_delegate = new PopupMenuDelegate(this); - menu_view_->setItemDelegate(popup_delegate); - menu_view_->setMouseTracking(true); - menu_view_->setStyleSheet(ReadFile(":/icons/deepin/builtin/images/popup_menu.css")); - - this->setContentsMargins(0, 0, 0, 0); - this->setAttribute(Qt::WA_TranslucentBackground, true); - this->setFocusPolicy(Qt::StrongFocus); - - this->setWindowFlags(Qt::Popup); -} - -void PopupMenu::onMenuViewActivated(const QModelIndex &index) -{ - Q_ASSERT(index.isValid()); - if (index.isValid()) { - Q_EMIT this->menuActivated(index.row()); - } -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/popup_menu.h b/dcc-old/src/plugin-datetime/window/widgets/popup_menu.h deleted file mode 100644 index 23392a2246..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/popup_menu.h +++ /dev/null @@ -1,68 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_UI_WIDGETS_TOOLTIP_CONTAINER_H -#define INSTALLER_UI_WIDGETS_TOOLTIP_CONTAINER_H - -#include -class QKeyEvent; -class QListView; -class QPaintEvent; -class QStringListModel; - -namespace installer { - -// Used to display popup menu with sharp corner at middle of bottom edge. -class PopupMenu : public QFrame -{ - Q_OBJECT - -public: - explicit PopupMenu(QWidget *parent = nullptr); - - // Returns the list used by menu_model to store menu items. - QStringList stringList() const; - -Q_SIGNALS: - // Q_EMITted when window is hidden. - void onHide(); - - // Q_EMITted when a menu item at |index| is activated. - void menuActivated(int index); - -public Q_SLOTS: - // Show tooltip container at |pos| and grab keyboard focus. - void popup(const QPoint &pos); - - // Set menu models's internal list to |strings|. - void setStringList(const QStringList &strings); - -protected: - // Filters global mouse press event. - bool eventFilter(QObject *obj, QEvent *event) override; - - // Release keyboard focus when window is hidden. - void hideEvent(QHideEvent *event) override; - - // Hide window when Escape button is pressed. - void keyPressEvent(QKeyEvent *event) override; - - void paintEvent(QPaintEvent *event) override; - - // Monitors global mouse event when menu is popup. - void showEvent(QShowEvent *event) override; - -private: - void initConnections(); - void initUI(); - - QListView *menu_view_ = nullptr; - QStringListModel *menu_model_ = nullptr; - -private Q_SLOTS: - void onMenuViewActivated(const QModelIndex &index); -}; - -} // namespace installer - -#endif // INSTALLER_UI_WIDGETS_TOOLTIP_CONTAINER_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.cpp b/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.cpp deleted file mode 100644 index 5cd5351be1..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.cpp +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "popup_menu_delegate.h" - -#include - -namespace installer { - -PopupMenuDelegate::PopupMenuDelegate(QWidget *parent) - : QStyledItemDelegate(parent) -{ - this->setObjectName("popup_menu_delegate"); -} - -void PopupMenuDelegate::paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const -{ - painter->save(); - - const QRect &rect(option.rect); - - if (option.state & QStyle::State_MouseOver) { - // Draw background color of selected item, no matter it is active or not. - // #2ca7f8 - const QColor selected_color = QColor::fromRgb(44, 167, 248); - painter->fillRect(rect, QBrush(selected_color)); - } - - // Draw text. Default color is #303030. - QColor text_color = QColor::fromRgb(48, 48, 48); - if (option.state & QStyle::State_MouseOver) { - // Change text color to white on mouse hover. - text_color = Qt::white; - } - painter->setPen(QPen(text_color)); - const QString text = index.model()->data(index, Qt::DisplayRole).toString(); - - // Text alignment is center. - painter->drawText(rect, Qt::AlignHCenter | Qt::AlignVCenter, text); - - painter->restore(); -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.h b/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.h deleted file mode 100644 index 8dfa2b9c1a..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/popup_menu_delegate.h +++ /dev/null @@ -1,28 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef INSTALLER_UI_DELEGATES_POPUP_MENU_DELEGATE_H -#define INSTALLER_UI_DELEGATES_POPUP_MENU_DELEGATE_H - -#include - -namespace installer { - -// Draw menu item in popup window. -class PopupMenuDelegate : public QStyledItemDelegate -{ - Q_OBJECT - -public: - explicit PopupMenuDelegate(QWidget *parent = nullptr); - -protected: - void paint(QPainter *painter, - const QStyleOptionViewItem &option, - const QModelIndex &index) const override; -}; - -} // namespace installer - -#endif // INSTALLER_UI_DELEGATES_POPUP_MENU_DELEGATE_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.cpp b/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.cpp deleted file mode 100644 index f4abb2831a..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.cpp +++ /dev/null @@ -1,234 +0,0 @@ -// SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "regionformatdialog.h" - -#include "datetimemodel.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include - -using icu::Locale; -using icu::UnicodeString; - -using namespace DCC_NAMESPACE; - -RegionFormatDialog::RegionFormatDialog(DatetimeModel *datetimeModel, QWidget *parent) - : DAbstractDialog(parent) -{ - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame); // 无边框 - titleIcon->setBackgroundTransparent(true); // 透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - QLabel *headTitle = new QLabel(tr("Region Format")); - DFontSizeManager::instance()->bind(headTitle, - DFontSizeManager::T5, - QFont::DemiBold); // 设置label字体 - headTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - headTitle->setAlignment(Qt::AlignCenter); - - QVBoxLayout *mainVLayout = new QVBoxLayout(); - mainVLayout->setSpacing(0); - mainVLayout->setMargin(0); - - QWidget *topWidget = new QWidget; - QHBoxLayout *topHLayout = new QHBoxLayout(topWidget); - topHLayout->setSpacing(0); - topHLayout->setMargin(0); - - DFrame *leftFrame = new DFrame; - leftFrame->setFixedSize(344, 520); - DSearchEdit *searchEdit = new DSearchEdit; - m_model = new QStandardItemModel(this); - m_proxyModel = new QSortFilterProxyModel(this); - m_proxyModel->setFilterCaseSensitivity(Qt::CaseInsensitive); - m_regionListView = new DListView; - m_regionListView->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_regionListView->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_regionListView->setFrameShape(QFrame::NoFrame); - m_regionListView->setSelectionMode(QAbstractItemView::NoSelection); - m_regionListView->setBackgroundType(DStyledItemDelegate::ClipCornerBackground); - m_regionListView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_regionListView->setModel(m_proxyModel); - - QVBoxLayout *leftVLayout = new QVBoxLayout(leftFrame); - leftVLayout->setSpacing(0); - leftVLayout->setMargin(10); - leftVLayout->addWidget(searchEdit); - leftVLayout->addSpacing(10); - leftVLayout->addWidget(m_regionListView); - - DFrame *rightFrame = new DFrame; - rightFrame->setFixedSize(344, 520); - DLabel *titleLabel = new DLabel(tr("Default format")); - DFontSizeManager::instance()->bind(titleLabel, - DFontSizeManager::T5, - QFont::DemiBold); // 设置label字体 - DFrame *formatContentFrame = new DFrame; - formatContentFrame->setBackgroundRole(DPalette::ItemBackground); - QVBoxLayout *formatLayout = new QVBoxLayout(formatContentFrame); - formatLayout->setMargin(0); - - m_dayLabel = addFormatItem(formatContentFrame, tr("First of day"), "Monday"); - m_shortDateLabel = addFormatItem(formatContentFrame, tr("Short date"), "2023.10.01"); - m_longDateLabel = addFormatItem(formatContentFrame, tr("Long date"), "2023.10.01.Mon"); - m_shortTimeLabel = addFormatItem(formatContentFrame, tr("Short time"), "12:00"); - m_longTimeLabel = addFormatItem(formatContentFrame, tr("Long time"), "12:00:00"); - m_currencyLabel = addFormatItem(formatContentFrame, tr("Currency symbol"), "$"); - m_numberLabel = addFormatItem(formatContentFrame, tr("Numbers"), "123456789"); - m_paperLabel = addFormatItem(formatContentFrame, tr("Paper"), "A4"); - - QVBoxLayout *rightLayout = new QVBoxLayout(rightFrame); - rightLayout->setSpacing(0); - rightLayout->setMargin(10); - rightLayout->addWidget(titleLabel); - rightLayout->addSpacing(12); - rightLayout->addWidget(formatContentFrame); - rightLayout->addStretch(0); - - QWidget *buttonsWidget = new QWidget; - QHBoxLayout *bHLayout = new QHBoxLayout(buttonsWidget); - bHLayout->setSpacing(0); - bHLayout->setMargin(0); - QPushButton *cancelBtn = new QPushButton(tr("Cancel")); - cancelBtn->setFixedSize(200, 36); - m_saveBtn = new DSuggestButton(tr("Save")); - m_saveBtn->setFixedSize(200, 36); - m_saveBtn->setEnabled(false); - bHLayout->addStretch(0); - bHLayout->addWidget(cancelBtn); - bHLayout->addSpacing(10); - bHLayout->addWidget(m_saveBtn); - bHLayout->addStretch(0); - - topHLayout->addWidget(leftFrame); - topHLayout->addSpacing(10); - topHLayout->addWidget(rightFrame); - - mainVLayout->addWidget(titleIcon); - mainVLayout->addWidget(headTitle); - mainVLayout->addSpacing(10); - mainVLayout->addWidget(topWidget); - mainVLayout->addSpacing(10); - mainVLayout->addWidget(buttonsWidget); - mainVLayout->addSpacing(40); - - setLayout(mainVLayout); - - connect(searchEdit, &DLineEdit::textChanged, m_proxyModel, &QSortFilterProxyModel::setFilterWildcard); - connect(cancelBtn, &QPushButton::clicked, this, &RegionFormatDialog::close); - connect(m_saveBtn, &QPushButton::clicked, this, &RegionFormatDialog::onSaved); - connect(m_regionListView, &QListView::clicked, this, &RegionFormatDialog::onRegionSelected); - - initItemModel(datetimeModel); - m_proxyModel->setSourceModel(m_model); -} - -RegionFormatDialog::~RegionFormatDialog() { } - -void RegionFormatDialog::setCurrentRegion(const QString ®ion) -{ - QModelIndex start = m_proxyModel->index(0, 0); - if (!start.isValid()) { - qWarning() << "startIndex is invalid when setCurrentRegion called!"; - return; - } - QModelIndexList results = m_proxyModel->match(start, Qt::DisplayRole, region); - if (results.size() > 0) { - m_regionListView->setCurrentIndex(results.first()); - auto realIndex = m_proxyModel->mapToSource(results.first()); - m_locale = realIndex.data(RegionFormatRole::LocaleRole).toLocale(); - updateRegionFormat(m_locale); - QStandardItem *selectedItem = m_model->itemFromIndex(realIndex); - if (selectedItem) { - selectedItem->setCheckState(Qt::Checked); - m_lastSelectedIndex = realIndex; - } - } else { - qWarning() << "There is not anything matched in region proxyModel"; - } -} - -void RegionFormatDialog::onRegionSelected(const QModelIndex &index) -{ - updateDataModel(m_model, index); - m_langRegion = index.data(RegionFormatRole::TextRole).toString(); - m_locale = index.data(RegionFormatRole::LocaleRole).toLocale(); - updateRegionFormat(m_locale); -} - -void RegionFormatDialog::onSaved() -{ - Q_EMIT regionFormatSaved(m_langRegion, m_locale); - close(); -} - -void RegionFormatDialog::initItemModel(DatetimeModel *dateTimeModel) -{ - m_regions = dateTimeModel->regions(); - for (auto locale : m_regions) { - // This is legacy code that no longer used, the following code doesn't garantee to be compilable. - // The code here is just for demo purpose. - auto langAndRegion = DCCLocale::languageAndRegionName(locale.name()); - QString langRegionText = QString("%1 (%2)").arg(langAndRegion.first).arg(langAndRegion.second); - DStandardItem *item = new DStandardItem; - item->setData(langAndRegion.first, RegionFormatRole::TextRole); - item->setData(locale, RegionFormatRole::LocaleRole); - item->setText(langRegionText); - item->setSizeHint(QSize(304, 36)); - m_model->appendRow(item); - } -} - -QLabel *RegionFormatDialog::addFormatItem(const QWidget *frame, - const QString &name, - const QString &format) -{ - QWidget *widget = new QWidget; - QHBoxLayout *hLayout = new QHBoxLayout(widget); - QLabel *nameLabel = new QLabel(name); - QLabel *formatLabel = new QLabel(format); - hLayout->addWidget(nameLabel); - hLayout->addStretch(0); - hLayout->addWidget(formatLabel); - frame->layout()->addWidget(widget); - return formatLabel; -} - -void RegionFormatDialog::updateRegionFormat(const QLocale &locale) -{ - RegionFormat regionFormat = RegionProxy::regionFormat(locale); - m_dayLabel->setText(locale.standaloneDayName(regionFormat.firstDayOfWeekFormat)); - m_shortDateLabel->setText(locale.toString(QDate::currentDate(), regionFormat.shortDateFormat)); - m_longDateLabel->setText(locale.toString(QDate::currentDate(), regionFormat.longDateFormat)); - m_shortTimeLabel->setText(locale.toString(QTime::currentTime(), regionFormat.shortTimeFormat)); - m_longTimeLabel->setText(locale.toString(QTime::currentTime(), regionFormat.longTimeFormat)); - m_currencyLabel->setText(regionFormat.currencyFormat.toUtf8().data()); - m_numberLabel->setText(regionFormat.numberFormat.toUtf8().data()); - m_paperLabel->setText(regionFormat.paperFormat.toUtf8().data()); -} - -void RegionFormatDialog::updateDataModel(QStandardItemModel *model, const QModelIndex &index) -{ - if (m_lastSelectedIndex.isValid()) { - model->itemFromIndex(m_lastSelectedIndex)->setCheckState(Qt::Unchecked); - } - auto realIndex = m_proxyModel->mapToSource(index); - QStandardItem *selectedItem = model->itemFromIndex(realIndex); - if (selectedItem) { - selectedItem->setCheckState(Qt::Checked); - m_lastSelectedIndex = realIndex; - m_saveBtn->setEnabled(true); - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.h b/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.h deleted file mode 100644 index 34c47ba174..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/regionformatdialog.h +++ /dev/null @@ -1,71 +0,0 @@ -//SPDX-FileCopyrightText: 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef REGIONFORMATDIALOG_H -#define REGIONFORMATDIALOG_H - -#include "interface/namespace.h" -#include "regionproxy.h" - -#include -#include - -DWIDGET_USE_NAMESPACE - -class QLabel; -class QSortFilterProxyModel; - -class DatetimeModel; - -namespace DCC_NAMESPACE { - -class RegionFormatDialog : public DAbstractDialog -{ - Q_OBJECT -public: - enum RegionFormatRole{ - TextRole = DTK_NAMESPACE::UserRole + 1, - LocaleRole - }; - explicit RegionFormatDialog(DatetimeModel *model, QWidget *parent = nullptr); - ~RegionFormatDialog(); - - void setCurrentRegion(const QString ®ion); - -Q_SIGNALS: - void regionFormatSaved(const QString &langRegion, const QLocale ®ionFormat); - -private Q_SLOTS: - void onRegionSelected(const QModelIndex &index); - void onSaved(); - -private: - void initItemModel(DatetimeModel *dateTimeModel); - QLabel* addFormatItem(const QWidget *frame, const QString &name, const QString &format); - void updateRegionFormat(const QLocale &locale); - void updateDataModel(QStandardItemModel *model, const QModelIndex &index); - -private: - QLabel *m_dayLabel = nullptr; - QLabel *m_shortDateLabel = nullptr; - QLabel *m_longDateLabel = nullptr; - QLabel *m_shortTimeLabel = nullptr; - QLabel *m_longTimeLabel = nullptr; - QLabel *m_currencyLabel = nullptr; - QLabel *m_numberLabel = nullptr; - QLabel *m_paperLabel = nullptr; - - Regions m_regions; - DListView *m_regionListView; - QPushButton *m_saveBtn; - QSortFilterProxyModel *m_proxyModel; - QStandardItemModel *m_model; - QModelIndex m_searchModelIndex; - QModelIndex m_lastSelectedIndex; - bool m_searchStatus = false; - QString m_langRegion; - QLocale m_locale; -}; -} -#endif // RegionFormatDialog_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/searchinput.cpp b/dcc-old/src/plugin-datetime/window/widgets/searchinput.cpp deleted file mode 100644 index 1f899390fc..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/searchinput.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "widgets/searchinput.h" -#include "widgets/basiclistdelegate.h" - -#include -#include - -SearchInput::SearchInput(QWidget* parent) - :QLineEdit(parent), - m_iconVisible(true) -{ - setContextMenuPolicy(Qt::NoContextMenu); - setFocusPolicy(Qt::ClickFocus); - m_search = tr("Search"); -} - -void SearchInput::setSearchText(const QString &text) -{ - m_search = text; -} - -void SearchInput::setIconVisible(bool visible) -{ - m_iconVisible = visible; -} - -QString SearchInput::iconPath() const -{ - return m_iconPath; -} - -void SearchInput::setIcon(const QString &filepath) -{ - m_iconPath = filepath; - - m_icon = loadPixmap(filepath); -} - -void SearchInput::paintEvent(QPaintEvent *e) -{ - QLineEdit::paintEvent(e); - - if(!hasFocus() && text().isEmpty()) - { - QRect rect = this->rect(); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.setOpacity(0.5); - if(m_iconVisible) - { - QFontMetrics fm(qApp->font()); - int w = fm.horizontalAdvance(m_search); - int iw = m_icon.width(); - int x = (rect.width() - w - iw -8)/2; - QRect iconRect(x, 0, iw, rect.height()); - QRect tmp(QPoint(0,0),m_icon.size() / devicePixelRatioF()); - tmp.moveCenter(iconRect.center()); - QRect searchRect(iconRect.right() + 2, 0, w, rect.height()); - painter.drawPixmap(tmp, m_icon); - painter.drawText(searchRect, Qt::AlignCenter, m_search); - } - else - { - painter.drawText(rect, Qt::AlignCenter, m_search); - } - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/searchinput.h b/dcc-old/src/plugin-datetime/window/widgets/searchinput.h deleted file mode 100644 index 51e7a9df5a..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/searchinput.h +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SEARCHINPUT_H -#define SEARCHINPUT_H - -#include - - -class SearchInput : public QLineEdit -{ - Q_OBJECT - Q_PROPERTY(QString icon READ iconPath WRITE setIcon) -public: - explicit SearchInput(QWidget* parent = 0); - void setSearchText(const QString& text); - void setIconVisible(bool visible); - QString iconPath() const; - void setIcon(const QString &filepath); - -protected: - void paintEvent(QPaintEvent *); - -private: - bool m_iconVisible; - QString m_search; - QPixmap m_icon; - QString m_iconPath; -}; - - -#endif // SEARCHINPUT_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezone.cpp deleted file mode 100644 index 25fd246c92..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone.cpp +++ /dev/null @@ -1,225 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "timezone.h" - -#ifndef _GNU_SOURCE -# define _GNU_SOURCE /* For tm_gmtoff and tm_zone */ -#endif -#include "consts.h" -#include "file_util.h" - -#include - -#include - -#include - -#include -#include - -namespace installer { - -namespace { - -const QString tzDirPath = std::visit([] { - QString tzDirPath = "/usr/share/zoneinfo"; - if (qEnvironmentVariableIsSet("TZDIR")) - tzDirPath = qEnvironmentVariable("TZDIR"); - return tzDirPath; -}); - -#if USE_DEEPIN_ZONE -const QString kZoneTabFileDeepin = QStringLiteral(DEEPIN_TIME_ZONE_PATH); -const QString kZoneTabFile = std::visit([] { - if (QFile(kZoneTabFileDeepin).exists()) { - return kZoneTabFileDeepin; - } - return tzDirPath + "/zone1970.tab"; -}); -#else -// Absolute path to zone.tab file. -const QString kZoneTabFile = std::visit([] { - return tzDirPath + "/zone1970.tab"; -}); -#endif - -// Absolute path to backward timezone file. -const char kTimezoneAliasFile[] = "/timezone_alias"; - -// Domain name for timezones. -const char kTimezoneDomain[] = "deepin-installer-timezones"; - -// Parse latitude and longitude of the zone's principal location. -// See https://en.wikipedia.org/wiki/List_of_tz_database_time_zones. -// |pos| is in ISO 6709 sign-degrees-minutes-seconds format, -// either +-DDMM+-DDDMM or +-DDMMSS+-DDDMMSS. -// |digits| 2 for latitude, 3 for longitude. -double ConvertPos(const QString &pos, int digits) -{ - if (pos.length() < 4 || digits > 9) { - return 0.0; - } - - const QString integer = pos.left(digits + 1); - const QString fraction = pos.mid(digits + 1); - const double t1 = integer.toDouble(); - const double t2 = fraction.toDouble(); - if (t1 > 0.0) { - return t1 + t2 / pow(10.0, fraction.length()); - } else { - return t1 - t2 / pow(10.0, fraction.length()); - } -} - -} // namespace - -[[maybe_unused]] bool ZoneInfoDistanceComp(const ZoneInfo &a, const ZoneInfo &b) -{ - return a.distance < b.distance; -} - -QDebug &operator<<(QDebug &debug, const ZoneInfo &info) -{ - debug << "ZoneInfo {" - << "cc:" << info.country << "tz:" << info.timezone << "lat:" << info.latitude - << "lng:" << info.longitude << "}"; - return debug; -} - -ZoneInfoList GetZoneInfoList() -{ - ZoneInfoList list; - const QString content(ReadFile(kZoneTabFile)); - for (const QString &line : content.split('\n')) { - if (!line.startsWith('#')) { - const QStringList parts(line.split('\t')); - // Parse latitude and longitude. - if (parts.length() >= 3) { - const QString coordinates = parts.at(1); - int index = coordinates.indexOf('+', 3); - if (index == -1) { - index = coordinates.indexOf('-', 3); - } - Q_ASSERT(index > -1); - const double latitude = ConvertPos(coordinates.left(index), 2); - const double longitude = ConvertPos(coordinates.mid(index), 3); - const ZoneInfo zone_info = { parts.at(0), parts.at(2), latitude, longitude, 0.0 }; - list.append(zone_info); - } - } - } - return list; -} - -[[maybe_unused]] int GetZoneInfoByCountry(const ZoneInfoList &list, const QString &country) -{ - int index = -1; - for (const ZoneInfo &info : list) { - index++; - if (info.country == country) { - return index; - } - } - return -1; -} - -int GetZoneInfoByZone(const ZoneInfoList &list, const QString &timezone) -{ - int index = -1; - for (const ZoneInfo &info : list) { - index++; - if (info.timezone == timezone) { - return index; - } - } - return -1; -} - -QString GetCurrentTimezone() -{ - const QString content(ReadFile("/etc/timezone")); - return content.trimmed(); -} - -[[maybe_unused]] QString GetTimezoneName(const QString &timezone) -{ - const int index = timezone.lastIndexOf('/'); - return (index > -1) ? timezone.mid(index + 1) : timezone; -} - -QString GetLocalTimezoneName(const QString &timezone, const QString &locale) -{ - // Set locale first. - (void)setlocale(LC_ALL, QString(locale + ".UTF-8").toStdString().c_str()); - const QString local_name(dgettext(kTimezoneDomain, timezone.toStdString().c_str())); - int index = local_name.lastIndexOf('/'); - if (index == -1) { - // Some translations of locale name contains non-standard char. - index = local_name.lastIndexOf("∕"); - } - - // Reset locale. - (void)setlocale(LC_ALL, kDefaultLocale); - - return (index > -1) ? local_name.mid(index + 1) : local_name; -} - -[[maybe_unused]] TimezoneAliasMap GetTimezoneAliasMap() -{ - TimezoneAliasMap map; - - const QString content = ReadFile(kTimezoneAliasFile); - for (const QString &line : content.split('\n')) { - if (!line.isEmpty()) { - const QStringList parts = line.split(':'); - Q_ASSERT(parts.length() == 2); - if (parts.length() == 2) { - map.insert(parts.at(0), parts.at(1)); - } - } - } - - return map; -} - -[[maybe_unused]] bool IsValidTimezone(const QString &timezone) -{ - // Ignores empty timezone. - if (timezone.isEmpty()) { - return false; - } -#if USE_DEEPIN_ZONE - if (kZoneTabFile == kZoneTabFileDeepin && QFile(kZoneTabFile).exists()) { - return true; - } -#endif - // If |filepath| is a file or a symbolic link to file, it is a valid timezone. - const QString filepath(tzDirPath + QDir::separator() + timezone); - return QFile::exists(filepath); -} - -[[maybe_unused]] TimezoneOffset GetTimezoneOffset(const QString &timezone) -{ - const char *kTzEnv = "TZ"; - const char *old_tz = getenv(kTzEnv); - setenv(kTzEnv, timezone.toStdString().c_str(), 1); - struct tm tm; - const time_t curr_time = time(nullptr); - - // Call tzset() before localtime_r(). Set tzset(3). - tzset(); - (void)localtime_r(&curr_time, &tm); - - // Reset timezone. - if (old_tz) { - setenv(kTzEnv, old_tz, 1); - } else { - unsetenv(kTzEnv); - } - - const TimezoneOffset offset = { tm.tm_zone, tm.tm_gmtoff }; - return offset; -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone.h b/dcc-old/src/plugin-datetime/window/widgets/timezone.h deleted file mode 100644 index f40af1fa24..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone.h +++ /dev/null @@ -1,67 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_SYSINFO_TIMEZONE_H -#define INSTALLER_SYSINFO_TIMEZONE_H - -#include -#include - -namespace installer { - -struct ZoneInfo -{ -public: - QString country; - QString timezone; - - // Coordinates of zone. - double latitude; - double longitude; - - // Distance to clicked point for comparison. - double distance; -}; - -[[maybe_unused]] bool ZoneInfoDistanceComp(const ZoneInfo &a, const ZoneInfo &b); -QDebug &operator<<(QDebug &debug, const ZoneInfo &info); -typedef QList ZoneInfoList; - -// Read available timezone info in zone.tab file. -ZoneInfoList GetZoneInfoList(); - -// Find ZoneInfo based on |country| or |timezone|. -// Returns -1 if not found. -[[maybe_unused]] int GetZoneInfoByCountry(const ZoneInfoList &list, const QString &country); -int GetZoneInfoByZone(const ZoneInfoList &list, const QString &timezone); - -// Read current timezone in /etc/timezone file. -QString GetCurrentTimezone(); - -// Returns name of timezone, excluding continent name. -[[maybe_unused]] QString GetTimezoneName(const QString &timezone); - -// Returns local name of timezone, excluding continent name. -// |locale| is desired locale name. -QString GetLocalTimezoneName(const QString &timezone, const QString &locale); - -// A map between old name of timezone and current name. -// e.g. Asia/Chongqing -> Asia/Shanghai -typedef QHash TimezoneAliasMap; -[[maybe_unused]] TimezoneAliasMap GetTimezoneAliasMap(); - -// Validate |timezone|. -[[maybe_unused]] bool IsValidTimezone(const QString &timezone); - -struct TimezoneOffset -{ - QString name; // Offset name, like CST. - long seconds; // Offset seconds. -}; - -// Get |timezone| offset. -[[maybe_unused]] TimezoneOffset GetTimezoneOffset(const QString &timezone); - -} // namespace installer - -#endif // INSTALLER_SYSINFO_TIMEZONE_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone_map.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezone_map.cpp deleted file mode 100644 index 30872ddc82..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone_map.cpp +++ /dev/null @@ -1,244 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "timezone_map.h" - -#include -#include -#include -#include -#include -#include -#include "basiclistdelegate.h" - -#include "file_util.h" -#include "timezone_map_util.h" -#include "popup_menu.h" -#include "tooltip_pin.h" - -using namespace installer; - -const int kDotVerticalMargin = 2; -const int kZonePinHeight = 30; -const int kZonePinMinimumWidth = 60; - -const double kDistanceThreshold = 64.0; -const char kDotFile[] = ":/icons/deepin/builtin/images/indicator_active.png"; -const char kTimezoneMapFile[] = ":/icons/deepin/builtin/images/timezone_map_big@1x.svg"; - -// At absolute position of |zone| on a map with size (map_width, map_height). -QPoint ZoneInfoToPosition(const installer::ZoneInfo &zone, int map_width, int map_height) -{ - // TODO(xushaohua): Call round(). - const int x = int(ConvertLongitudeToX(zone.longitude) * map_width); - const int y = int(ConvertLatitudeToY(zone.latitude) * map_height); - return QPoint(x, y); -} - -TimezoneMap::TimezoneMap(QWidget *parent) - : QFrame(parent) - , current_zone_() - , total_zones_(GetZoneInfoList()) - , nearest_zones_() -{ - this->setObjectName("timezone_map"); - this->setAccessibleName("timezone_map"); - this->initUI(); - this->initConnections(); -} - -TimezoneMap::~TimezoneMap() -{ - if (popup_window_) { - delete popup_window_; - popup_window_ = nullptr; - } -} - -const QString TimezoneMap::getTimezone() const -{ - return current_zone_.timezone; -} - -bool TimezoneMap::setTimezone(const QString &timezone) -{ - nearest_zones_.clear(); - const int index = GetZoneInfoByZone(total_zones_, timezone); - if (index > -1) { - // 找到时区并标记到地图上 - current_zone_ = total_zones_.at(index); - nearest_zones_.append(current_zone_); - this->remark(); - return true; - } else { - // NOTE(xushaohua): "Etc/UTC" can not be set on the map - qInfo() << "Timezone not found:" << timezone; - } - - return false; -} - -void TimezoneMap::mousePressEvent(QMouseEvent *event) -{ - if (event->button() == Qt::LeftButton) { - // Get nearest zones around mouse. - nearest_zones_ = GetNearestZones(total_zones_, kDistanceThreshold, - event->x(), event->y(), - this->width(), this->height()); - qDebug() << nearest_zones_; - current_zone_ = nearest_zones_.first(); - if (nearest_zones_.length() == 1) { - // 单个时区 - this->remark(); - } else { - this->popupZoneWindow(event->pos()); - } - Q_EMIT this->timezoneUpdated(current_zone_.timezone); - } else { - QWidget::mousePressEvent(event); - } -} - -void TimezoneMap::resizeEvent(QResizeEvent *event) -{ - if (popup_window_->isVisible()) { - dot_->hide(); - popup_window_->hide(); - } - - if (!nearest_zones_.isEmpty()) { - this->remark(); - } - QLabel *background_label = findChild("background_label"); - if (background_label) { - QPixmap timezone_pixmap = loadPixmap(kTimezoneMapFile); - background_label->setPixmap(timezone_pixmap.scaled(event->size() * devicePixelRatioF(), Qt::KeepAspectRatio, Qt::FastTransformation)); - } - - QWidget::resizeEvent(event); -} - -void TimezoneMap::initConnections() -{ - // Hide dot when popup-zones window is hidden. - connect(popup_window_, &PopupMenu::onHide, - dot_, &QLabel::hide); - - // Hide popup_window_ and mark new timezone on map. - connect(popup_window_, &PopupMenu::menuActivated, - this, &TimezoneMap::onPopupWindowActivated); -} - -void TimezoneMap::initUI() -{ - QLabel *background_label = new QLabel(this); - background_label->setObjectName("background_label"); - QPixmap timezone_pixmap = loadPixmap(kTimezoneMapFile); - Q_ASSERT(!timezone_pixmap.isNull()); - background_label->setPixmap(timezone_pixmap); - - // Set parent widget of dot_ to SystemInfoTimezoneFrame. - dot_ = new QLabel(this->parentWidget()); - const QPixmap dot_pixmap(kDotFile); - Q_ASSERT(!dot_pixmap.isNull()); - dot_->setPixmap(dot_pixmap); - dot_->setFixedSize(dot_pixmap.size()); - dot_->hide(); - - // Set parent widget of zone_pin_ to SystemInfoTimezoneFrame. - zone_pin_ = new TooltipPin(this->parentWidget()); - zone_pin_->setFixedHeight(kZonePinHeight); - zone_pin_->setMinimumWidth(kZonePinMinimumWidth); - // Allow mouse event to pass through. - zone_pin_->setAttribute(Qt::WA_TransparentForMouseEvents, true); - zone_pin_->hide(); - - popup_window_ = new PopupMenu(); - popup_window_->hide(); - - this->setContentsMargins(0, 0, 0, 0); -} - -void TimezoneMap::popupZoneWindow(const QPoint &pos) -{ - // Hide all marks first. - dot_->hide(); - zone_pin_->hide(); - popup_window_->hide(); - - // Popup zone list window. - const QString locale = QLocale::system().name(); - QStringList zone_names; - for (const ZoneInfo &zone : nearest_zones_) { - zone_names.append(GetLocalTimezoneName(zone.timezone, locale)); - } - - // Show popup window above dot - popup_window_->setStringList(zone_names); - const int dy = pos.y() - dot_->height() - kDotVerticalMargin; - const QPoint popup_window_pos = this->mapToGlobal(QPoint(pos.x(), dy)); - popup_window_->popup(popup_window_pos); - - const QPoint dot_relative_pos(pos.x() - dot_->width() / 2, - pos.y() - dot_->height() / 2); - const QPoint dot_pos(this->mapToParent(dot_relative_pos)); - dot_->move(dot_pos); - dot_->show(); -} - -void TimezoneMap::remark() -{ - // Hide all marks first. - dot_->hide(); - zone_pin_->hide(); - popup_window_->hide(); - - const int map_width = this->width(); - const int map_height = this->height(); - - Q_ASSERT(!nearest_zones_.isEmpty()); - const QString locale = QLocale::system().name(); - if (!nearest_zones_.isEmpty()) { - zone_pin_->setText(GetLocalTimezoneName(current_zone_.timezone, locale)); - - // Adjust size of pin to fit its content. - zone_pin_->adjustSize(); - - // Show zone pin at current marked zone. - const QPoint zone_pos = ZoneInfoToPosition(current_zone_, map_width, - map_height); - const int zone_dy = zone_pos.y() - dot_->height() / 2 - kDotVerticalMargin; - const QPoint zone_pin_relative_pos(zone_pos.x(), zone_dy); - const QPoint zone_pin_pos(this->mapToParent(zone_pin_relative_pos)); - - if (zone_pin_pos.x() < 100) { - // 左侧位置不够,箭头放到左边 - zone_pin_->setArrowDirection(TooltipPin::ArrowLeft); - } else { - zone_pin_->setArrowDirection(TooltipPin::ArrowDown); - } - zone_pin_->popup(zone_pin_pos); - - const QPoint dot_relative_pos(zone_pos.x() - dot_->width() / 2, - zone_pos.y() - dot_->height() / 2); - const QPoint dot_pos(this->mapToParent(dot_relative_pos)); - dot_->move(dot_pos); - dot_->show(); - } -} - -// 鼠标点击位置有多个时区,弹出菜单选择后 -void TimezoneMap::onPopupWindowActivated(int index) -{ - // Hide popup window and dot first. - popup_window_->hide(); - dot_->hide(); - - // Update current selected timezone and mark it on map. - Q_ASSERT(index < nearest_zones_.length()); - if (index < nearest_zones_.length()) { - current_zone_ = nearest_zones_.at(index); - this->remark(); - Q_EMIT this->timezoneUpdated(current_zone_.timezone); - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone_map.h b/dcc-old/src/plugin-datetime/window/widgets/timezone_map.h deleted file mode 100644 index 6699bac919..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone_map.h +++ /dev/null @@ -1,77 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_UI_WIDGETS_TIMEZONE_MAP_H -#define INSTALLER_UI_WIDGETS_TIMEZONE_MAP_H - -#include -class QLabel; -class QListView; -class QResizeEvent; -class QStringListModel; - -#include "timezone.h" - -namespace installer { -class PopupMenu; -class TooltipPin; -}; - -// Draw timezone map and bubble. -class TimezoneMap : public QFrame -{ - Q_OBJECT - -public: - explicit TimezoneMap(QWidget *parent = nullptr); - ~TimezoneMap(); - - // Get current selected timezone, might be empty. - const QString getTimezone() const; - -Q_SIGNALS: - void timezoneUpdated(const QString &timezone); - -public Q_SLOTS: - // Remark |timezone| on map. - bool setTimezone(const QString &timezone); - -protected: - void mousePressEvent(QMouseEvent *event) override; - - // Hide tooltips when window is resized. - void resizeEvent(QResizeEvent *event) override; - -private: - void initConnections(); - void initUI(); - - // Popup zone window at |pos|. - void popupZoneWindow(const QPoint &pos); - - // Mark current zone on the map. - void remark(); - - // Currently selected/marked timezone. - installer::ZoneInfo current_zone_; - - // A list of zone info found in system. - const installer::ZoneInfoList total_zones_; - - // A list of zone info which are near enough to current cursor position. - installer::ZoneInfoList nearest_zones_; - - // A round dot to indicate position on the map. - QLabel *dot_ = nullptr; - - // To mark a zone on map. - installer::TooltipPin *zone_pin_ = nullptr; - - // To display a list of zones on map. - installer::PopupMenu *popup_window_ = nullptr; - -private Q_SLOTS: - void onPopupWindowActivated(int index); -}; - -#endif // INSTALLER_UI_WIDGETS_TIMEZONE_MAP_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.cpp deleted file mode 100644 index 36857c0223..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "timezone_map_util.h" - -#include - -namespace installer { - -namespace { - -// From gnome-control-center. -double radians(double degrees) { - return (degrees / 360.0) * M_PI * 2; -} - -} // namespace - -double ConvertLatitudeToY(double latitude) { - const double bottom_lat = -59; - const double top_lat = 81; - const double full_range = 4.6068250867599998; - double top_per, y, top_offset, map_range; - - top_per = top_lat / 180.0; - y = 1.25 * log(tan(M_PI_4 + 0.4 * radians(latitude))); - top_offset = full_range * top_per; - map_range = fabs(1.25 * log(tan(M_PI_4 + 0.4 * radians(bottom_lat))) - - top_offset); - y = fabs(y - top_offset); - y = y / map_range; - return y; -} - -double ConvertLongitudeToX(double longitude) { - const double xdeg_offset = -6; - return ((180.0 + longitude) / 360.0 + xdeg_offset / 180.0); -} - -ZoneInfoList GetNearestZones(const ZoneInfoList& total_zones, double threshold, - int x, int y, int map_width, int map_height) { - ZoneInfoList zones; - double minimum_distance = map_width * map_width + map_height * map_height; - int nearest_zone_index = -1; - for (int index = 0; index < total_zones.length(); index++) { - const ZoneInfo& zone = total_zones.at(index); - const double point_x = ConvertLongitudeToX(zone.longitude) * map_width; - const double point_y = ConvertLatitudeToY(zone.latitude) * map_height; - const double dx = point_x - x; - const double dy = point_y - y; - const double distance = dx * dx + dy * dy; - if (distance < minimum_distance) { - minimum_distance = distance; - nearest_zone_index = index; - } - if (distance <= threshold) { - zones.append(zone); - } - } - - // Get the nearest zone. - if (zones.isEmpty()) { - zones.append(total_zones.at(nearest_zone_index)); - } - - return zones; -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.h b/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.h deleted file mode 100644 index bee4812549..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezone_map_util.h +++ /dev/null @@ -1,22 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_DELEGATES_TIMEZONE_MAP_UTIL_H -#define INSTALLER_DELEGATES_TIMEZONE_MAP_UTIL_H - -#include "timezone.h" - -namespace installer { - -// Convert position of zone from polar coordinates to rectangular coordinates. -double ConvertLatitudeToY(double latitude); -double ConvertLongitudeToX(double longitude); - -// Get a list of zone info whose distance to (x, y) is less than |threshold| -// in a world map with size (map_width, map_height). -ZoneInfoList GetNearestZones(const ZoneInfoList& total_zones, double threshold, - int x, int y, int map_width, int map_height); - -} // namespace installer - -#endif // INSTALLER_DELEGATES_TIMEZONE_MAP_UTIL_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.cpp deleted file mode 100644 index e23b8f36eb..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.cpp +++ /dev/null @@ -1,311 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "timezonechooser.h" - -#include "datetimedbusproxy.h" -#include "searchinput.h" -#include "timezone_map.h" - -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -TimeZoneChooser::TimeZoneChooser(QWidget *parent) - : QDialog(parent) - , m_blurEffect(new DBlurEffectWidget(this)) - , m_map(new TimezoneMap(this)) - , m_searchInput(new SearchInput) - , m_title(new QLabel) - , m_cancelBtn(new QPushButton(tr("Cancel"))) - , m_confirmBtn(new DSuggestButton(tr("Confirm"))) - , m_totalZones(installer::GetZoneInfoList()) -{ - m_blurEffect->setAccessibleName("blurEffect"); - - setWindowFlags(Qt::Dialog); - - m_blurEffect->blurEnabled(); - const bool blurIfPossible = DTK_GUI_NAMESPACE::DWindowManagerHelper::instance()->hasBlurWindow(); - setAttribute(Qt::WA_TranslucentBackground, blurIfPossible); - - setupSize(); - - DTitlebar *titleBar = new DTitlebar(this); - titleBar->setFrameStyle(QFrame::NoFrame); // 无边框 - titleBar->setBackgroundTransparent(true); // 透明 - titleBar->setMenuVisible(false); - - // 删除部分重复设置的代码,并移动部分代码到合适位置,尽量将相同功能的代码放在一起 - m_searchInput->setMinimumSize(350, 36); - m_cancelBtn->setMinimumSize(200, 36); - m_confirmBtn->setMinimumSize(200, 36); - m_confirmBtn->setEnabled(false); - - DPalette pa = DPaletteHelper::instance()->palette(m_title); - pa.setBrush(QPalette::WindowText, pa.windowText()); - DPaletteHelper::instance()->setPalette(m_title, pa); - - m_blurEffect->setBlendMode(DBlurEffectWidget::BehindWindowBlend); - m_blurEffect->setMaskColor(Qt::black); - - QHBoxLayout *hLayout = new QHBoxLayout; - hLayout->addStretch(); - hLayout->addWidget(m_cancelBtn, 0, Qt::AlignHCenter); - hLayout->addSpacing(20); - hLayout->addWidget(m_confirmBtn, 0, Qt::AlignHCenter); - hLayout->addStretch(); - - QVBoxLayout *layout = new QVBoxLayout; - layout->setMargin(0); - layout->setSpacing(0); - layout->addWidget(titleBar); - layout->addWidget(m_title, 0, Qt::AlignHCenter | Qt::AlignTop); - layout->addSpacing(10); - layout->addWidget(m_searchInput, 0, Qt::AlignHCenter | Qt::AlignTop); - layout->addSpacing(10); - layout->addWidget(m_map, 0, Qt::AlignHCenter); - layout->addSpacing(10); - layout->addLayout(hLayout); - layout->addSpacing(10); - setLayout(layout); - - connect(m_confirmBtn, &DSuggestButton::clicked, [this] { - QString zone = m_map->getTimezone(); - Q_EMIT confirmed(zone); - close(); - }); - - connect(m_cancelBtn, &QPushButton::clicked, this, [this] { - Q_EMIT cancelled(); - - close(); - }); - - connect(m_searchInput, &SearchInput::editingFinished, [this] { - QString timezone = m_searchInput->text(); - timezone = m_completionCache.value(timezone, timezone); - if (m_map->setTimezone(timezone) && !m_confirmBtn->isEnabled()) - m_confirmBtn->setEnabled(true); - }); - - connect(m_searchInput, &SearchInput::textChanged, m_searchInput, &SearchInput::editingFinished); - - connect(m_map, &TimezoneMap::timezoneUpdated, this, [this] { - m_searchInput->setText(""); - m_searchInput->clearFocus(); - m_confirmBtn->setEnabled(true); - }); - - QTimer::singleShot(0, [this] { - QStringList completions; - QStringList completions_filter; - for (const auto &zoneInfo : m_totalZones) { - auto timezone = zoneInfo.timezone; - completions << timezone; // timezone as completion candidate. - - // localized timezone as completion candidate. - const QString locale = QLocale::system().name(); - QString localizedTimezone = installer::GetLocalTimezoneName(timezone, locale); - completions << localizedTimezone; - - m_completionCache[localizedTimezone] = timezone; - } - - if ("en_US.UTF-8" == DatetimeDBusProxy::currentLocale()) { - int i = 0; - for (auto str : completions) { - if (i++ % 2 == 0) - continue; - completions_filter << str; - } - m_completer = new QCompleter(completions_filter, m_searchInput); - } else { - m_completer = new QCompleter(completions, m_searchInput); - } - - m_completer->popup()->setAttribute(Qt::WA_InputMethodEnabled); - m_completer->setCompletionMode(QCompleter::PopupCompletion); - m_completer->setCaseSensitivity(Qt::CaseInsensitive); - m_completer->setFilterMode(Qt::MatchContains); - - m_searchInput->setCompleter(m_completer); - - m_popup = m_completer->popup(); - m_popup->setObjectName("TimezoneCompleter"); - m_popup->setAttribute(Qt::WA_TranslucentBackground); - m_popup->installEventFilter(this); - - DBlurEffectWidget *blurEffect = new DBlurEffectWidget(m_popup); - blurEffect->setAccessibleName("blurEffect"); - blurEffect->setMaskColor(Qt::white); - - QHBoxLayout *popuLayout = new QHBoxLayout; - popuLayout->setSpacing(0); - popuLayout->setMargin(0); - popuLayout->addWidget(blurEffect); - m_popup->setLayout(popuLayout); - - blurEffect->lower(); - }); - connect(m_searchInput, &SearchInput::returnPressed, [this] { - QModelIndex index = m_popup->model()->index(0, 0); - if (index.isValid()) { - m_searchInput->setText(index.data().toString()); - m_popup->close(); - } - }); -} - -void TimeZoneChooser::setIsAddZone(const bool isAdd) -{ - m_isAddZone = isAdd; - - if (isAdd) { - m_title->setText(tr("Add Timezone")); - m_confirmBtn->setText(tr("Add")); - } else { - m_title->setText(tr("Change Timezone")); - m_confirmBtn->setText(tr("Confirm")); - } -} - -void TimeZoneChooser::setCurrentTimeZoneText(const QString &zone) -{ - if (zone.isEmpty()) - return; - - const QString locale = QLocale::system().name(); - const QString name = installer::GetLocalTimezoneName(zone, locale); -} - -void TimeZoneChooser::setMarkedTimeZone(const QString &timezone) -{ - m_map->setTimezone(timezone); -} - -void TimeZoneChooser::resizeEvent(QResizeEvent *event) -{ - QDialog::resizeEvent(event); - - m_blurEffect->resize(event->size()); - m_blurEffect->lower(); -} - -void TimeZoneChooser::keyReleaseEvent(QKeyEvent *event) -{ - if (event->matches(QKeySequence::Cancel)) { - Q_EMIT cancelled(); - - close(); - } -} - -bool TimeZoneChooser::eventFilter(QObject *watched, QEvent *event) -{ - // Qt make popups' position 2px higher than the bottom of its associated widget, - // and the 2px's hard coded, so I need to move the popup to a proper position so - // it won't overlap with the SearchInput. - if (watched == m_popup && event->type() == QEvent::Move) { - const QMoveEvent *move = static_cast(event); - const QPoint destPos = m_searchInput->mapToGlobal(QPoint(0, m_searchInput->height() + 1)); - // Don't panic, it won't cause dead loop. - if (move->pos() != destPos) { - m_popup->move(destPos); - } - } - - return false; -} - -void TimeZoneChooser::showEvent(QShowEvent *event) -{ - QDialog::showEvent(event); - - move(qApp->primaryScreen()->geometry().center() - rect().center()); -} - -void TimeZoneChooser::mouseMoveEvent(QMouseEvent *event) -{ - Q_UNUSED(event) - return; -} - -QSize TimeZoneChooser::getFitSize() const -{ - const QRect &primaryRect = QGuiApplication::primaryScreen()->availableGeometry(); - - double width = primaryRect.width() - 360 /* dcc */ - 20 * 2; - double height = primaryRect.height() - 70 /* dock */ - 20 * 2; - - return QSize(static_cast(width), static_cast(height)); -} - -int TimeZoneChooser::getFontSize() const -{ - // 根据屏幕大小设置标题字体大小,不至于因为屏幕太小时,字段显得太大 - const QRect &primaryRect = QGuiApplication::primaryScreen()->availableGeometry(); - - if (primaryRect.width() <= 1024) { - return 24; - } else if (primaryRect.width() <= 1440) { - return 28; - } else { - return 32; - } -} - -void TimeZoneChooser::setupSize() -{ - static const double MapPixWidth = 978.0; - static const double MapPixHeight = 500.0; - static const double MapPictureWidth = 978.0; - static const double MapPictureHeight = 500.0; - - QFont font = m_title->font(); - font.setPointSizeF(getFontSize()); - m_title->setFont(font); - // 获取标题部分根据字体大小计算得到的字体高度 - double fontHeight = m_title->fontMetrics().height() + 10.0; - - QSize fitSize = getFitSize(); - // 先根据屏幕大小,计算出大小合适的地图尺寸 - const double offsetW = 20 * 2.0; - // close Button height and margin 6.0 * 2 + 20, layout spacing * 4 , title font height, search - // and btn height 36 - const double offsetH = 10.0 * 2 + 20 + 10.0 * 4 + fontHeight + 36 * 2; - - // 比对地图和屏幕大小,取其中最小的大小 - const float mapWidth = qMin(MapPixWidth, fitSize.width() - offsetW); - const float mapHeight = qMin(MapPixHeight, fitSize.height() - offsetH); - - // 再计算地图和界面宽高比,取其中最小最大缩放比 - const double widthScale = MapPictureWidth / mapWidth; - const double heightScale = MapPictureHeight / mapHeight; - const double scale = qMax(widthScale, heightScale); - // 根据宽高最大缩放比设置地图大小 - m_map->setFixedSize(MapPictureWidth / scale, MapPictureHeight / scale); - - // 再根据地图大小设置界面大小,使界面与地图保持合适位置 - setFixedSize(m_map->size().width() + offsetW, m_map->size().height() + offsetH); -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.h b/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.h deleted file mode 100644 index d301b2482c..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezonechooser.h +++ /dev/null @@ -1,76 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef TIMEZONECHOOSER_H -#define TIMEZONECHOOSER_H - -#include -#include - -#include -#include -#include -#include "timezone.h" - -DWIDGET_USE_NAMESPACE - -class QPushButton; -class QComboBox; -class QLabel; -class QAbstractItemView; - -class TimezoneMap; -class SearchInput; - -DWIDGET_BEGIN_NAMESPACE -class DSearchEdit; -DWIDGET_END_NAMESPACE - -class TimeZoneChooser : public QDialog -{ - Q_OBJECT -public: - explicit TimeZoneChooser(QWidget *parent = nullptr); - void setIsAddZone(const bool isAdd); - inline bool isAddZone() { return m_isAddZone; } - void setCurrentTimeZoneText(const QString &zone); - -Q_SIGNALS: - void confirmed(const QString &zone); - void cancelled(); - -public Q_SLOTS: - void setMarkedTimeZone(const QString &timezone); - -protected: - void resizeEvent(QResizeEvent *event) override; - void keyReleaseEvent(QKeyEvent *event) override; - bool eventFilter(QObject *watched, QEvent *event) override; - void showEvent(QShowEvent *event) override; - void mouseMoveEvent(QMouseEvent *event) override; - -private: - QSize getFitSize() const; - int getFontSize() const; - void setupSize(); - -private: - bool m_isAddZone; - QMap m_completionCache; - - DBlurEffectWidget *m_blurEffect; - - QAbstractItemView *m_popup; - - TimezoneMap *m_map; - SearchInput *m_searchInput; - QLabel *m_title; - QPushButton *m_cancelBtn; - DSuggestButton *m_confirmBtn; - QCompleter *m_completer; - const installer::ZoneInfoList m_totalZones; -}; - -#endif // TIMEZONECHOOSER_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.cpp deleted file mode 100644 index f4e4a3930d..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.cpp +++ /dev/null @@ -1,116 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "timezoneclock.h" - -#include -#include -#include -#include - -TimezoneClock::TimezoneClock(QWidget *parent) - : QWidget(parent) - , m_drawTicks(true) - , m_autoNightMode(true) -{ -} - -TimezoneClock::~TimezoneClock() -{ -} - -void TimezoneClock::paintEvent(QPaintEvent *) -{ - QDateTime datetime(QDateTime::currentDateTimeUtc()); - datetime = datetime.addSecs(m_timeZone.getUTCOffset()); - - const QTime time(datetime.time()); - - // LCOV_EXCL_START - //paintEvent函数单元测试无法命中,使用宏跳过此部分 - QPainter painter(this); - painter.setRenderHints(painter.renderHints() | QPainter::Antialiasing); - - // draw plate - const bool nightMode = !(time.hour() >= 6 && time.hour() < 18); - painter.setPen(Qt::transparent); - painter.setBrush(nightMode && autoNightMode() ? Qt::black : Qt::white); - - QPen pen(painter.pen()); - if (nightMode && autoNightMode()) { - pen.setColor(Qt::black); - } else { - pen.setColor(QColor("#E6E6E6")); - } - pen.setWidth(1); - painter.setPen(pen); - - int penWidth = pen.width(); - const QRect rct(QRect(penWidth, penWidth, rect().width() - penWidth * 2, rect().height() - penWidth * 2)); - - painter.drawRoundedRect(rct, rct.width() / 2.0, rct.height() / 2.0); - - // draw hour hand - const qreal hourAngle = qreal(time.hour()) * 30 + time.minute() * 30 / 60; - painter.save(); - painter.setRenderHints(painter.renderHints() | QPainter::Antialiasing); - painter.translate(rct.width() / 2.0, rct.height() / 2.0); - painter.rotate(hourAngle); - pen.setColor(QColor("#07c5fb")); - pen.setWidth(3); - painter.setPen(pen); - painter.drawLine(QPointF(0, 0), QPointF(0, -rct.width() / 2 * 0.5)); - painter.restore(); - - // draw minute hand - const int minuteAngle = time.minute() * 6; - painter.save(); - painter.setRenderHints(painter.renderHints() | QPainter::Antialiasing); - painter.translate(rct.width() / 2.0, rct.height() / 2.0); - painter.rotate(minuteAngle); - pen.setColor(QColor("#f97676")); - pen.setWidth(2); - painter.setPen(pen); - painter.drawLine(QPointF(0, 0), QPointF(0, -rct.width() / 2 * 0.65)); - painter.restore(); - - painter.end(); - // LCOV_EXCL_STOP -} - -bool TimezoneClock::autoNightMode() const -{ - return m_autoNightMode; -} - -void TimezoneClock::setAutoNightMode(bool autoNightMode) -{ - if (m_autoNightMode != autoNightMode) { - m_autoNightMode = autoNightMode; - update(); - } -} - -void TimezoneClock::setTimeZone(const ZoneInfo &timeZone) -{ - if (m_timeZone == timeZone) - return; - - m_timeZone = timeZone; - update(); -} - -bool TimezoneClock::drawTicks() const -{ - return m_drawTicks; -} - -void TimezoneClock::setDrawTicks(bool drawTicks) -{ - if (m_drawTicks != drawTicks) { - m_drawTicks = drawTicks; - update(); - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.h b/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.h deleted file mode 100644 index a3c45fc4d7..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezoneclock.h +++ /dev/null @@ -1,37 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef TIMEZONECLOCK_H -#define TIMEZONECLOCK_H - -#include -#include -#include "zoneinfo.h" - -class TimezoneClock: public QWidget -{ - Q_OBJECT -public: - explicit TimezoneClock(QWidget *parent = 0); - virtual ~TimezoneClock(); - - bool drawTicks() const; - void setDrawTicks(bool drawTicks); - - void setTimeZone(const ZoneInfo &timeZone); - - bool autoNightMode() const; - void setAutoNightMode(bool autoNightMode); - -protected: - void paintEvent(QPaintEvent *event); - -private: - bool m_drawTicks; - bool m_autoNightMode; - ZoneInfo m_timeZone; -}; - -#endif // TIMEZONECLOCK_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.cpp b/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.cpp deleted file mode 100644 index 2b6d096f49..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.cpp +++ /dev/null @@ -1,136 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "timezoneitem.h" - -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -TimezoneItem::TimezoneItem(QFrame *parent) - : SettingsItem(parent) - , m_city(new QLabel) - , m_details(new DTipLabel("")) - , m_clock(new TimezoneClock) - , m_removeBtn(new DIconButton(this)) -{ - m_clock->setAccessibleName("TimezoneItem_clock"); - addBackground(); - QVBoxLayout *vlayout = new QVBoxLayout(); - vlayout->setMargin(0); - vlayout->setSpacing(0); - - m_city->setObjectName("DCC-Datetime-TimezoneItem-Label"); - m_details->setObjectName("DCC-Datetime-TimezoneItem-Label"); - m_details->setAlignment(Qt::AlignLeft); - - vlayout->addWidget(m_city); - vlayout->addSpacing(1); - vlayout->addWidget(m_details); - - m_removeBtn->setFlat(true); - m_removeBtn->setIcon(DStyle::StandardPixmap::SP_DeleteButton); - m_removeBtn->setObjectName("remove_button"); - - m_removeBtn->setFixedSize(QSize(48, 48)); - m_removeBtn->setIconSize(QSize(24, 24)); - m_removeBtn->setVisible(false); - - m_clock->setDrawTicks(false); - m_clock->setFixedSize(QSize(48, 48)); - - QHBoxLayout *hlayout = new QHBoxLayout(); - hlayout->setMargin(0); - hlayout->setSpacing(0); - hlayout->setContentsMargins(14, 0, 10, 0); // TODO: 设计沟通设置 14 - hlayout->addLayout(vlayout); - hlayout->addStretch(); - hlayout->addWidget(m_clock, 0, Qt::AlignVCenter); - hlayout->addWidget(m_removeBtn); - setLayout(hlayout); - - connect(m_removeBtn, &DIconButton::clicked, this, &TimezoneItem::removeClicked); -} - -void TimezoneItem::setTimeZone(const ZoneInfo &info) -{ - m_timezone = info; - - updateInfo(); -} - -void TimezoneItem::toRemoveMode() -{ - m_clock->setVisible(false); - m_removeBtn->setVisible(true); -} - -void TimezoneItem::toNormalMode() -{ - m_removeBtn->setVisible(false); - ; - m_clock->setVisible(true); -} - -void TimezoneItem::updateInfo() -{ - const QDateTime localTime(QDateTime::currentDateTime()); - - const double timeDelta = (m_timezone.getUTCOffset() - localTime.offsetFromUtc()) / 3600.0; - - QString dateLiteral; - if (localTime.time().hour() + timeDelta >= 24) { - dateLiteral = tr("Tomorrow"); - } else if (localTime.time().hour() + timeDelta <= 0) { - dateLiteral = tr("Yesterday"); - } else { - dateLiteral = tr("Today"); - } - - int decimalNumber = 1; - //小时取余,再取分钟,将15分钟的双倍只显示一位小数,其他的都显示两位小数 - switch ((m_timezone.getUTCOffset() - localTime.offsetFromUtc()) % 3600 / 60 / 15) { - case -1: - case -3: - case 1: - case 3: - decimalNumber = 2; - break; - default: - decimalNumber = 1; - break; - } - - QString compareLiteral; - if (timeDelta > 0) { - compareLiteral = tr("%1 hours earlier than local").arg(QString::number(timeDelta, 'f', decimalNumber)); - } else { - compareLiteral = tr("%1 hours later than local").arg(QString::number(-timeDelta, 'f', decimalNumber)); - } - - QString gmData = ""; - int utcOff = m_timezone.getUTCOffset() / 3600; - if (utcOff >= 0) { - gmData = QString("(UTC+%1:%2)").arg(utcOff, 2, 10, QLatin1Char('0')).arg(m_timezone.getUTCOffset() % 3600 / 60, 2, 10, QLatin1Char('0')); - } else { - gmData = QString("(UTC%1:%2)").arg(utcOff, 3, 10, QLatin1Char('0')).arg(m_timezone.getUTCOffset() % 3600 / 60, 2, 10, QLatin1Char('0')); - } - - m_details->setText(QString("%1, %2").arg(dateLiteral).arg(compareLiteral)); - QString cityName = m_timezone.getZoneCity().isEmpty() ? m_timezone.getZoneName() : m_timezone.getZoneCity(); - m_city->setText(cityName + gmData); - m_clock->setTimeZone(m_timezone); - - m_removeBtn->setAccessibleName(m_timezone.getZoneCity() + "_DEL"); -} - -void TimezoneItem::setDetailVisible(bool state) -{ - if (m_details) { - m_details->setVisible(state); - } -} diff --git a/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.h b/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.h deleted file mode 100644 index 1e3163cfde..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/timezoneitem.h +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef TIMEZONEITEM_H -#define TIMEZONEITEM_H - -#include "widgets/settingsitem.h" -#include "timezoneclock.h" -#include "zoneinfo.h" - -#include -#include - -#include -#include -#include - - - -class TimezoneItem : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT - -public: - explicit TimezoneItem(QFrame *parent = nullptr); - - inline ZoneInfo timeZone() const { return m_timezone; } - - void toRemoveMode(); - void toNormalMode(); - - void updateInfo(); - void setDetailVisible(bool state); - -Q_SIGNALS: - void removeClicked(); - -public Q_SLOTS: - void setTimeZone(const ZoneInfo &info); - -private: - ZoneInfo m_timezone; - - QLabel *m_city; - DTK_WIDGET_NAMESPACE::DTipLabel *m_details; - TimezoneClock *m_clock; - DTK_WIDGET_NAMESPACE::DIconButton *m_removeBtn; -}; - -#endif // TIMEZONEITEM_H diff --git a/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.cpp b/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.cpp deleted file mode 100644 index 2317f29483..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.cpp +++ /dev/null @@ -1,109 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "tooltip_pin.h" - -#include -#include -#include -#include - -namespace installer { - -namespace { - -const int kBorderRadius = 4; - -// _____ -// \ | / -// \|/ -const int kTriangleHeight = 6; - -} // namespace - -TooltipPin::TooltipPin(QWidget *parent) - : QLabel(parent) - , m_arrowDirection(ArrowDirection::ArrowDown) -{ - this->setObjectName("tooltip_pin"); - - this->setAlignment(Qt::AlignHCenter); - - // Add 15px margin horizontally. - this->setStyleSheet("margin: 0 15px;"); -} - -void TooltipPin::setArrowDirection(TooltipPin::ArrowDirection arrowDirection) -{ - m_arrowDirection = arrowDirection; -} - -void TooltipPin::popup(const QPoint &point) -{ - if (point.x() < 100) { - this->move(point.x() + kTriangleHeight / 2, point.y() - this->height() / 8); - } else { - this->move(point.x() - this->width() / 2, point.y() - this->height() + 6); - } - this->show(); -} - -void TooltipPin::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - - QPainter painter(this); - painter.setPen(Qt::NoPen); - painter.setBrush(Qt::white); - painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing, true); - const int kWidth = this->width(); - const int kHeight = this->height(); - - QPainterPath background_path; - QPainterPath arrow_path; - - if (ArrowLeft == m_arrowDirection) { - // 矩形区域 - background_path.addRoundedRect(kTriangleHeight, - 0, - kWidth - kTriangleHeight, - kHeight - kTriangleHeight, - kBorderRadius, - kBorderRadius); - - // 三角箭头 - arrow_path.moveTo(kTriangleHeight, (kHeight - kTriangleHeight) / 2 - kTriangleHeight); - arrow_path.lineTo(0, (kHeight - kTriangleHeight) / 2); - arrow_path.lineTo(kTriangleHeight, (kHeight - kTriangleHeight) / 2 + kTriangleHeight); - } else { - // 矩形区域 - background_path.addRoundedRect(0, - 0, - kWidth, - kHeight - kTriangleHeight, - kBorderRadius, - kBorderRadius); - - // 三角箭头 - arrow_path.moveTo(kWidth / 2 - kTriangleHeight, kHeight - kTriangleHeight); - arrow_path.lineTo(kWidth / 2, kHeight); - arrow_path.lineTo(kWidth / 2 + kTriangleHeight, kHeight - kTriangleHeight); - } - - background_path.addPath(arrow_path); - - // 画背景 - painter.drawPath(background_path); - - // Then draw text. - QFont label_font; - label_font.setPixelSize(12); - const QFontMetrics label_font_metrics(label_font); - const int label_length = label_font_metrics.horizontalAdvance(this->text()); - painter.setPen(QPen(Qt::black)); - painter.setFont(label_font); - // Set text alignment to center - painter.drawText((kWidth - label_length) / 2, 16, this->text()); -} - -} // namespace installer diff --git a/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.h b/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.h deleted file mode 100644 index 96b5b8005a..0000000000 --- a/dcc-old/src/plugin-datetime/window/widgets/tooltip_pin.h +++ /dev/null @@ -1,35 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INSTALLER_UI_WIDGETS_TOOLTIP_PIN_H -#define INSTALLER_UI_WIDGETS_TOOLTIP_PIN_H - -#include -class QPaintEvent; - -namespace installer { - -// Displays tooltip text with a sharp corner at middle of bottom edge. -class TooltipPin : public QLabel -{ - Q_OBJECT - -public: - enum ArrowDirection { ArrowDown = 0, ArrowTop, ArrowLeft, ArrowRight }; - -public: - explicit TooltipPin(QWidget *parent = nullptr); - void setArrowDirection(ArrowDirection arrowDirection); - -public Q_SLOTS: - // Show tooltip and set position of pin at |point|. - void popup(const QPoint &point); - -protected: - void paintEvent(QPaintEvent *event) override; - ArrowDirection m_arrowDirection; -}; - -} // namespace installer - -#endif // INSTALLER_UI_WIDGETS_TOOLTIP_PIN_H diff --git a/dcc-old/src/plugin-defaultapp/operation/defappmodel.cpp b/dcc-old/src/plugin-defaultapp/operation/defappmodel.cpp deleted file mode 100644 index 5721af6bc4..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappmodel.cpp +++ /dev/null @@ -1,29 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "defappmodel.h" - -DefAppModel::DefAppModel(QObject *parent) - :QObject(parent) -{ - m_modBrowser = new Category(this); - m_modMail = new Category(this); - m_modText = new Category(this); - m_modMusic = new Category(this); - m_modVideo = new Category(this); - m_modPicture = new Category(this); - m_modTerminal = new Category(this); -} - -DefAppModel::~DefAppModel() -{ - m_modBrowser->deleteLater(); - m_modMail->deleteLater(); - m_modText->deleteLater(); - m_modMusic->deleteLater(); - m_modVideo->deleteLater(); - m_modPicture->deleteLater(); - m_modTerminal->deleteLater(); -} - - diff --git a/dcc-old/src/plugin-defaultapp/operation/defappmodel.h b/dcc-old/src/plugin-defaultapp/operation/defappmodel.h deleted file mode 100644 index a88733fae2..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappmodel.h +++ /dev/null @@ -1,35 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DEFAPPMODEL_H -#define DEFAPPMODEL_H - -#include "interface/namespace.h" -#include "category.h" - -class Category; -class DefAppModel : public QObject -{ - Q_OBJECT -public: - explicit DefAppModel(QObject *parent = 0); - ~DefAppModel(); - - Category *getModBrowser() {return m_modBrowser;} - Category *getModMail() {return m_modMail;} - Category *getModText() {return m_modText;} - Category *getModMusic() {return m_modMusic;} - Category *getModVideo() {return m_modVideo;} - Category *getModPicture() {return m_modPicture;} - Category *getModTerminal() {return m_modTerminal;} - -private: - Category *m_modBrowser; - Category *m_modMail; - Category *m_modText; - Category *m_modMusic; - Category *m_modVideo; - Category *m_modPicture; - Category *m_modTerminal; -}; -#endif // DEFAPPMODEL_H diff --git a/dcc-old/src/plugin-defaultapp/operation/defappworker.cpp b/dcc-old/src/plugin-defaultapp/operation/defappworker.cpp deleted file mode 100644 index 86f693cb64..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappworker.cpp +++ /dev/null @@ -1,452 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "defappworker.h" - -#include "defappmodel.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDefaultWorker, "dcc-default-worker") - -const QString TerminalGSetting = QStringLiteral("com.deepin.desktop.default-applications.terminal"); - -DefAppWorker::DefAppWorker(DefAppModel *model, QObject *parent) - : QObject(parent) - , m_defAppModel(model) - , m_dbusManager(new MimeDBusProxy(this)) - , m_defaultTerminal(new QGSettings(TerminalGSetting.toLocal8Bit())) -{ - - m_stringToCategory.insert("Browser", Browser); - m_stringToCategory.insert("Mail", Mail); - m_stringToCategory.insert("Text", Text); - m_stringToCategory.insert("Music", Music); - m_stringToCategory.insert("Video", Video); - m_stringToCategory.insert("Picture", Picture); - m_stringToCategory.insert("Terminal", Terminal); - - connect(m_dbusManager, &MimeDBusProxy::Change, this, &DefAppWorker::onGetListApps); - - m_userLocalPath = QDir::homePath() + "/.local/share/applications/"; - - // mkdir folder - QDir dir(m_userLocalPath); - dir.mkpath(m_userLocalPath); -} - -DefAppWorker::~DefAppWorker() -{ - m_defaultTerminal->deleteLater(); -} - -void DefAppWorker::active() -{ - m_dbusManager->blockSignals(false); -} - -void DefAppWorker::deactive() -{ - m_dbusManager->blockSignals(true); -} - -void DefAppWorker::onSetDefaultApp(const QString &category, const App &item) -{ - if (category == "Terminal") { - onSetDefaultTerminal(item); - return; - } - QStringList mimelist = getTypeListByCategory(m_stringToCategory[category]); - - for (auto mimeType : mimelist) { - QDBusPendingCall call = m_dbusManager->SetDefaultApp(mimeType, item.Id); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, - &QDBusPendingCallWatcher::finished, - this, - [watcher, this, item, category] { - if (!watcher->isError()) { - qCDebug(DdcDefaultWorker) - << "Setting MIME " << category << "to " << item.Id; - auto tosetCategory = getCategory(category); - tosetCategory->setDefault(item); - } else { - qCWarning(DdcDefaultWorker) - << "Cannot set MIME" << category << "to" << item.Id; - } - watcher->deleteLater(); - }); - } -} - -void DefAppWorker::onSetDefaultTerminal(const App &item) -{ - Category *defaultTerinmalCategory = getCategory("Terminal"); - - m_defaultTerminal->set("app-id", item.Id); - m_defaultTerminal->set( - "exec", - QString("gdbus call --session --dest org.desktopspec.ApplicationManager1 --object-path " - "%1 --method org.desktopspec.ApplicationManager1.Application.Launch " - "'' [] {}") - .arg(item.dbusPath)); - - defaultTerinmalCategory->setDefault(item); -} - -void DefAppWorker::onGetListApps() -{ - // 遍历QMap去获取dbus数据 - for (auto mimelist = m_stringToCategory.constBegin(); mimelist != m_stringToCategory.constEnd(); - ++mimelist) { - if (mimelist.key() == "Terminal") { - QDBusPendingReply call = m_dbusManager->GetManagedObjects(); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, - &QDBusPendingCallWatcher::finished, - this, - &DefAppWorker::getManagerObjectFinished); - continue; - } - - const QString type{ getTypeByCategory(mimelist.value()) }; - - QDBusPendingReply call = m_dbusManager->ListApps(type); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [watcher, mimelist, type, this] { - if (watcher->isError()) { - qCWarning(DdcDefaultWorker) << "Cannot get AppList"; - watcher->deleteLater(); - return; - } - QDBusPendingReply call = *watcher; - getListAppFinished(mimelist.key(), call.value()); - - QDBusPendingReply getDefaultAppCall = - m_dbusManager->GetDefaultApp(type); - QDBusPendingCallWatcher *defappWatcher = - new QDBusPendingCallWatcher(getDefaultAppCall, this); - connect(defappWatcher, - &QDBusPendingCallWatcher::finished, - this, - [getDefaultAppCall, this, mimelist, type, defappWatcher] { - if (getDefaultAppCall.isError()) { - qCWarning(DdcDefaultWorker) << "Cannot get DefaultApp"; - defappWatcher->deleteLater(); - return; - } - QString mimeType = getDefaultAppCall.argumentAt<0>(); - if (mimeType != type) { - qCWarning(DdcDefaultWorker) << "MimeType not match"; - defappWatcher->deleteLater(); - return; - } - QDBusObjectPath objectPath = getDefaultAppCall.argumentAt<1>(); - if (objectPath.path() == "/") { - qCWarning(DdcDefaultWorker) << "Cannot find Mime: " << type; - defappWatcher->deleteLater(); - return; - } - getDefaultAppFinished(mimelist.key(), m_dbusManager->getAppId(objectPath)); - defappWatcher->deleteLater(); - }); - watcher->deleteLater(); - }); - } -} - -static QStringList getUILanguages() -{ - QLocale syslocal = QLocale::system(); - - QStringList uiLanguages = syslocal.uiLanguages(); - // the nameMap uses underscore instead of minus sign - for (auto &lang : uiLanguages) { - lang.replace('-', '_'); - } - uiLanguages << "default"; - - return uiLanguages; -} - -void DefAppWorker::getManagerObjectFinished(QDBusPendingCallWatcher *call) -{ - Category *category = getCategory("Terminal"); - QList list; - auto uiLanguages = getUILanguages(); - QDBusPendingReply reply = *call; - if (reply.isError()) { - call->deleteLater(); - return; - } - ObjectMap map = reply.value(); - for (auto it = map.cbegin(); it != map.cend(); it++) { - QString dbusPath = it.key().path(); - auto mapInterface = it.value(); - for (const QVariantMap &mapInter : mapInterface) { - if (mapInter.count() == 0) { - continue; - } - if (mapInter.value("Categories").isNull()) { - continue; - } - QStringList cats = qdbus_cast(mapInter["Categories"]); - if (!cats.contains("TerminalEmulator")) { - continue; - } - auto nameMap = qdbus_cast>(mapInter["Name"]); - auto genericNameMap = qdbus_cast>(mapInter["GenericName"]); - QString id = qdbus_cast(mapInter["ID"]); - bool isDeepinVendor = qdbus_cast(mapInter["X_Deepin_Vendor"]) == "deepin"; - - QString name = id; - for (auto &lang : uiLanguages) { - auto iter = nameMap.find(lang); - if (iter != nameMap.end()) { - name = iter.value(); - break; - } - } - - QString genericName; - if (isDeepinVendor) { - for (auto &lang : uiLanguages) { - auto iter = genericNameMap.find(lang); - if (iter != genericNameMap.end()) { - genericName = iter.value(); - break; - } - } - } - - QString icon; - if (auto mapicons = mapInter.value("Icons"); !mapicons.isNull()) { - auto icons = qdbus_cast>(mapicons); - if (!icons.value("Desktop Entry").isNull()) { - icon = icons["Desktop Entry"]; - } - } - - App app; - app.dbusPath = dbusPath; - app.Id = id; - app.Name = name; - app.DisplayName = genericName != "" ? genericName : name; - app.Icon = icon; - app.isUser = false; - list << app; - break; - } - } - - QList systemList = category->getappItem(); - - for (App app : list) { - if (!systemList.contains(app)) { - category->addUserItem(app); - } - } - - systemList = category->getappItem(); - for (App app : systemList) { - if (!list.contains(app)) { - category->delUserItem(app); - } - } - category->setCategory("Terminal"); - - QString id = m_defaultTerminal->get("app-id").toString(); - auto it = std::find_if(list.cbegin(), list.cend(), [id](const App &app) { - return app.Id == id; - }); - - if (it != list.cend()) { - category->setDefault(*it); - } - - call->deleteLater(); -} - -void DefAppWorker::onDelUserApp([[maybe_unused]] const QString &mime, - [[maybe_unused]] const App &item) -{ - // TODO: later -} - -void DefAppWorker::onCreateFile([[maybe_unused]] const QString &mime, - [[maybe_unused]] const QFileInfo &info) -{ - // TODO: later -} - -void DefAppWorker::getListAppFinished(const QString &mimeKey, const ObjectMap &map) -{ - Category *category = getCategory(mimeKey); - if (!category) { - return; - } - - QList list; - auto uiLanguages = getUILanguages(); - - for (auto it = map.cbegin(); it != map.cend(); it++) { - QString dbusPath = it.key().path(); - auto mapInterface = it.value(); - for (const QVariantMap &mapInter : mapInterface) { - if (mapInter.count() == 0) { - continue; - } - - if (auto nodisplay = mapInter.value("NoDisplay"); !nodisplay.isNull()) { - if (qdbus_cast(nodisplay)) { - continue; - } - } - - auto nameMap = qdbus_cast>(mapInter["Name"]); - auto genericNameMap = qdbus_cast>(mapInter["GenericName"]); - QString id = qdbus_cast(mapInter["ID"]); - bool isDeepinVendor = qdbus_cast(mapInter["X_Deepin_Vendor"]) == "deepin"; - - QString name = id; - for (auto &lang : uiLanguages) { - auto iter = nameMap.find(lang); - if (iter != nameMap.end()) { - name = iter.value(); - break; - } - } - - QString genericName; - if (isDeepinVendor) { - for (auto &lang : uiLanguages) { - auto iter = genericNameMap.find(lang); - if (iter != genericNameMap.end()) { - genericName = iter.value(); - break; - } - } - } - - QString icon; - if (auto mapicons = mapInter.value("Icons"); !mapicons.isNull()) { - auto icons = qdbus_cast>(mapicons); - if (!icons.value("Desktop Entry").isNull()) { - icon = icons["Desktop Entry"]; - } - } - - App app; - app.dbusPath = dbusPath; - app.Id = id; - app.Name = name; - app.DisplayName = genericName != "" ? genericName : name; - app.Icon = icon; - app.isUser = false; - list << app; - break; - } - } - - QList systemList = category->getappItem(); - - for (App app : list) { - if (!systemList.contains(app)) { - category->addUserItem(app); - } - } - - systemList = category->getappItem(); - for (App app : systemList) { - if (!list.contains(app)) { - category->delUserItem(app); - } - } - - category->setCategory(mimeKey); -} - -void DefAppWorker::getDefaultAppFinished(const QString &mimeKey, const QString &id) -{ - Category *category = getCategory(mimeKey); - if (!category) { - return; - } - - auto items = category->getappItem(); - auto it = std::find_if(items.cbegin(), items.cend(), [id](const App &app) { - return app.Id == id; - }); - - if (it != items.cend()) { - category->setDefault(*it); - category->setCategory(mimeKey); - } -} - -Category *DefAppWorker::getCategory(const QString &mime) const -{ - switch (m_stringToCategory[mime]) { - case Browser: - return m_defAppModel->getModBrowser(); - case Mail: - return m_defAppModel->getModMail(); - case Text: - return m_defAppModel->getModText(); - case Music: - return m_defAppModel->getModMusic(); - case Video: - return m_defAppModel->getModVideo(); - case Picture: - return m_defAppModel->getModPicture(); - case Terminal: - return m_defAppModel->getModTerminal(); - } - return nullptr; -} - -const QString DefAppWorker::getTypeByCategory(const DefaultAppsCategory &category) -{ - return getTypeListByCategory(category)[0]; -} - -// clang-format off -const QStringList DefAppWorker::getTypeListByCategory(const DefaultAppsCategory &category) -{ - switch (category) { - case Browser: return QStringList() << "x-scheme-handler/http" << "x-scheme-handler/ftp" << "x-scheme-handler/https" - << "text/html" << "text/xml" << "text/xhtml_xml" << "text/xhtml+xml"; - case Mail: return QStringList() << "x-scheme-handler/mailto" << "message/rfc822" << "application/x-extension-eml" - << "application/x-xpinstall"; - case Text: return QStringList() << "text/plain"; - case Music: return QStringList() << "audio/mpeg" << "audio/mp3" << "audio/x-mp3" << "audio/mpeg3" << "audio/x-mpeg-3" - << "audio/x-mpeg" << "audio/flac" << "audio/x-flac" << "application/x-flac" - << "audio/ape" << "audio/x-ape" << "application/x-ape" << "audio/ogg" << "audio/x-ogg" - << "audio/musepack" << "application/musepack" << "audio/x-musepack" - << "application/x-musepack" << "audio/mpc" << "audio/x-mpc" << "audio/vorbis" - << "audio/x-vorbis" << "audio/x-wav" << "audio/x-ms-wma"; - case Video: return QStringList() << "video/mp4" << "audio/mp4" << "audio/x-matroska" << "video/x-matroska" - << "application/x-matroska" << "video/avi" << "video/msvideo" << "video/x-msvideo" - << "video/ogg" << "application/ogg" << "application/x-ogg" << "video/3gpp" << "video/3gpp2" - << "video/flv" << "video/x-flv" << "video/x-flic" << "video/mpeg" << "video/x-mpeg" - << "video/x-ogm" << "application/x-shockwave-flash" << "video/x-theora" << "video/quicktime" - << "video/x-ms-asf" << "application/vnd.rn-realmedia" << "video/x-ms-wmv"; - case Picture: return QStringList() << "image/jpeg" << "image/pjpeg" << "image/bmp" << "image/x-bmp" << "image/png" - << "image/x-png" << "image/tiff" << "image/svg+xml" << "image/x-xbitmap" << "image/gif" - << "image/x-xpixmap" << "image/vnd.microsoft.icon"; - case Terminal: return QStringList() << "application/x-terminal"; - } - return QStringList(); -} - -// clang-format on diff --git a/dcc-old/src/plugin-defaultapp/operation/defappworker.h b/dcc-old/src/plugin-defaultapp/operation/defappworker.h deleted file mode 100644 index 39b004b3d9..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappworker.h +++ /dev/null @@ -1,68 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef DEFAPPWORKER_H -#define DEFAPPWORKER_H - -#include -#include - -#include -#include - -#include "mimedbusproxy.h" -#include "category.h" - - -class QFileInfo; - -class DefAppModel; -class Category; -class DefAppWorker : public QObject -{ - Q_OBJECT -public: - explicit DefAppWorker(DefAppModel *m_defAppModel, QObject *parent = 0); - - ~DefAppWorker(); - enum DefaultAppsCategory { - Browser, - Mail, - Text, - Music, - Video, - Picture, - Terminal - }; - - void active(); - void deactive(); - -public Q_SLOTS: - void onSetDefaultApp(const QString &category, const App &item); - void onSetDefaultTerminal(const App &item); - void onGetListApps(); - void onDelUserApp(const QString &mine, const App &item); - void onCreateFile(const QString &mime, const QFileInfo &info); - -private Q_SLOTS: - void getListAppFinished(const QString &mime, const ObjectMap &map); - void getDefaultAppFinished(const QString &mime, const QString &w); - void getManagerObjectFinished(QDBusPendingCallWatcher *call); - -private: - DefAppModel *m_defAppModel; - MimeDBusProxy *m_dbusManager; - QMap m_stringToCategory; - QString m_userLocalPath; - -private: - const QString getTypeByCategory(const DefAppWorker::DefaultAppsCategory &category); - const QStringList getTypeListByCategory(const DefAppWorker::DefaultAppsCategory &category); - Category* getCategory(const QString &mime) const; - QGSettings *m_defaultTerminal; -}; - -#endif // DEFAPPWORKER_H diff --git a/dcc-old/src/plugin-defaultapp/operation/defappworkerold.cpp b/dcc-old/src/plugin-defaultapp/operation/defappworkerold.cpp deleted file mode 100644 index e8a0730cb9..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappworkerold.cpp +++ /dev/null @@ -1,318 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "defappworkerold.h" -#include "defappmodel.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDefaultWorkerOld, "dcc-default-worker-old") - -DefAppWorkerOld::DefAppWorkerOld(DefAppModel *model, QObject *parent) : - QObject(parent), - m_defAppModel(model), - m_dbusManager(new MimeDBusProxyOld(this)) -{ - - m_stringToCategory.insert("Browser", Browser); - m_stringToCategory.insert("Mail", Mail); - m_stringToCategory.insert("Text", Text); - m_stringToCategory.insert("Music", Music); - m_stringToCategory.insert("Video", Video); - m_stringToCategory.insert("Picture", Picture); - m_stringToCategory.insert("Terminal", Terminal); - - connect(m_dbusManager, &MimeDBusProxyOld::Change, this, &DefAppWorkerOld::onGetListApps); - - m_userLocalPath = QDir::homePath() + "/.local/share/applications/"; - - // mkdir folder - QDir dir(m_userLocalPath); - dir.mkpath(m_userLocalPath); -} - -void DefAppWorkerOld::active() -{ - m_dbusManager->blockSignals(false); -} - -void DefAppWorkerOld::deactive() -{ - m_dbusManager->blockSignals(true); -} - -void DefAppWorkerOld::onSetDefaultApp(const QString &category, const App &item) -{ - QStringList mimelist = getTypeListByCategory(m_stringToCategory[category]); - - QDBusPendingCall call = m_dbusManager->SetDefaultApp(mimelist, item.Id); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [call, watcher, this, item, category] { - if (!call.isError()) { - qCDebug(DdcDefaultWorkerOld) << "Setting MIME " << category << "to " << item.Id; - auto tosetCategory = getCategory(category); - tosetCategory->setDefault(item); - } else { - qCWarning(DdcDefaultWorkerOld) << "Cannot set MIME" << category << "to" << item.Id; - } - watcher->deleteLater(); - }); - -} - -void DefAppWorkerOld::onGetListApps() -{ - //遍历QMap去获取dbus数据 - for (auto mimelist = m_stringToCategory.constBegin(); mimelist != m_stringToCategory.constEnd(); ++mimelist) { - const QString type { getTypeByCategory(mimelist.value()) }; - - getDefaultAppFinished(mimelist.key(), m_dbusManager->GetDefaultApp(type)); - getListAppFinished(mimelist.key(),m_dbusManager->ListApps(type), false); - getListAppFinished(mimelist.key(),m_dbusManager->ListUserApps(type), true); - } -} - -void DefAppWorkerOld::onDelUserApp(const QString &mime, const App &item) -{ - Category *category = getCategory(mime); - - category->delUserItem(item); - if (item.CanDelete) { - QStringList mimelist = getTypeListByCategory(m_stringToCategory[mime]); - m_dbusManager->DeleteApp(mimelist, item.Id); - } else { - m_dbusManager->DeleteUserApp(item.Id); - } - - //remove file - QFile file(m_userLocalPath + item.Id); - file.remove(); -} - -void DefAppWorkerOld::onCreateFile(const QString &mime, const QFileInfo &info) -{ - const bool isDesktop = info.suffix() == "desktop"; - - if (isDesktop) { - QFile file(info.filePath()); - QString newfile = m_userLocalPath + "deepin-custom-" + info.fileName(); - file.copy(newfile); - file.close(); - - QStringList mimelist = getTypeListByCategory(m_stringToCategory[mime]); - QFileInfo fileInfo(info.filePath()); - - const QString &filename = "deepin-custom-" + fileInfo.completeBaseName() + ".desktop"; - - m_dbusManager->AddUserApp(mimelist, filename); - - App app; - app.Id = filename; - app.Name = fileInfo.baseName(); - app.DisplayName = fileInfo.baseName(); - app.Icon = "application-default-icon"; - app.Description = ""; - app.Exec = info.filePath(); - app.isUser = true; - - onGetListApps(); - } else { - QFile file(m_userLocalPath + "deepin-custom-" + info.baseName() + ".desktop"); - - if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { - return; - } - - QTextStream out(&file); - out << "[Desktop Entry]\n" - "Type=Application\n" - "Version=1.0\n" - "Name=" + info.baseName() + "\n" - "Path=" + info.path() + "\n" - "Exec=" + info.filePath() + "\n" - "Icon=application-default-icon\n" - "Terminal=false\n" - "Categories=" + mime + ";" -#if (QT_VERSION < QT_VERSION_CHECK(5,15,0)) - << endl; -#else - << Qt::endl; -#endif - out.flush(); - file.close(); - - QStringList mimelist = getTypeListByCategory(m_stringToCategory[mime]); - - QFileInfo fileInfo(info.filePath()); - m_dbusManager->AddUserApp(mimelist, "deepin-custom-" + fileInfo.baseName() + ".desktop"); - - App app; - app.Id = "deepin-custom-" + fileInfo.baseName() + ".desktop"; - app.Name = fileInfo.baseName(); - app.DisplayName = fileInfo.baseName(); - app.Icon = "application-default-icon"; - app.Description = ""; - app.Exec = info.filePath(); - app.isUser = true; - - onGetListApps(); - } -} - -void DefAppWorkerOld::getListAppFinished(const QString &mime, const QString &defaultApp, bool isUser) -{ - const QJsonArray defApp = QJsonDocument::fromJson(defaultApp.toUtf8()).array(); - saveListApp(mime, defApp, isUser); -} - - -void DefAppWorkerOld::getDefaultAppFinished(const QString &mime, const QString &w) -{ - const QJsonObject &defaultApp = QJsonDocument::fromJson(w.toStdString().c_str()).object(); - saveDefaultApp(mime, defaultApp); -} - -void DefAppWorkerOld::saveListApp(const QString &mime, const QJsonArray &json, const bool isUser) -{ - Category *category = getCategory(mime); - if (!category) { - return; - } - - QList list; - - for (const QJsonValue &value : json) { - QJsonObject obj = value.toObject(); - App app; - app.Id = obj["Id"].toString(); - app.Name = obj["Name"].toString(); - app.DisplayName = obj["DisplayName"].toString(); - app.Icon = obj["Icon"].toString(); - app.Description = obj["Description"].toString(); - app.Exec = obj["Exec"].toString(); - app.isUser = isUser; - app.CanDelete = obj["CanDelete"].toBool(); - app.MimeTypeFit = obj["MimeTypeFit"].toBool(); - - list << app; - } - - QList systemList = category->systemAppList(); - QList userList = category->userAppList(); - for (App app : list) { - if (app.isUser == false) { - for (App appUser : userList) { - if (appUser.Exec == app.Exec) { - category->delUserItem(appUser); - } - } - } - } - - for (App app : list) { - if (!systemList.contains(app) || !userList.contains(app)) { - category->addUserItem(app); - } - } - - if (isUser) { - userList = category->userAppList(); - for (App app : userList) { - if (!list.contains(app)) { - category->delUserItem(app); - } - } - } else { - systemList = category->systemAppList(); - for (App app : systemList) { - if (!list.contains(app)) { - category->delUserItem(app); - } - } - } - - category->setCategory(mime); -} - -void DefAppWorkerOld::saveDefaultApp(const QString &mime, const QJsonObject &json) -{ - Category *category = getCategory(mime); - if (!category) { - return; - } - category->setCategory(mime); - - App app; - app.Id = json["Id"].toString(); - app.Name = json["Name"].toString(); - app.DisplayName = json["DisplayName"].toString(); - app.Icon = json["Icon"].toString(); - app.Description = json["Description"].toString(); - app.Exec = json["Exec"].toString(); - app.isUser = false; - - category->setDefault(app); -} - -Category *DefAppWorkerOld::getCategory(const QString &mime) const -{ - switch (m_stringToCategory[mime]) { - case Browser: - return m_defAppModel->getModBrowser(); - case Mail: - return m_defAppModel->getModMail(); - case Text: - return m_defAppModel->getModText(); - case Music: - return m_defAppModel->getModMusic(); - case Video: - return m_defAppModel->getModVideo(); - case Picture: - return m_defAppModel->getModPicture(); - case Terminal: - return m_defAppModel->getModTerminal(); - } - return nullptr; -} - -const QString DefAppWorkerOld::getTypeByCategory(const DefaultAppsCategory &category) -{ - return getTypeListByCategory(category)[0]; -} - -const QStringList DefAppWorkerOld::getTypeListByCategory(const DefaultAppsCategory &category) -{ - switch (category) { - case Browser: return QStringList() << "x-scheme-handler/http" << "x-scheme-handler/ftp" << "x-scheme-handler/https" - << "text/html" << "text/xml" << "text/xhtml_xml" << "text/xhtml+xml"; - case Mail: return QStringList() << "x-scheme-handler/mailto" << "message/rfc822" << "application/x-extension-eml" - << "application/x-xpinstall"; - case Text: return QStringList() << "text/plain"; - case Music: return QStringList() << "audio/mpeg" << "audio/mp3" << "audio/x-mp3" << "audio/mpeg3" << "audio/x-mpeg-3" - << "audio/x-mpeg" << "audio/flac" << "audio/x-flac" << "application/x-flac" - << "audio/ape" << "audio/x-ape" << "application/x-ape" << "audio/ogg" << "audio/x-ogg" - << "audio/musepack" << "application/musepack" << "audio/x-musepack" - << "application/x-musepack" << "audio/mpc" << "audio/x-mpc" << "audio/vorbis" - << "audio/x-vorbis" << "audio/x-wav" << "audio/x-ms-wma"; - case Video: return QStringList() << "video/mp4" << "audio/mp4" << "audio/x-matroska" << "video/x-matroska" - << "application/x-matroska" << "video/avi" << "video/msvideo" << "video/x-msvideo" - << "video/ogg" << "application/ogg" << "application/x-ogg" << "video/3gpp" << "video/3gpp2" - << "video/flv" << "video/x-flv" << "video/x-flic" << "video/mpeg" << "video/x-mpeg" - << "video/x-ogm" << "application/x-shockwave-flash" << "video/x-theora" << "video/quicktime" - << "video/x-ms-asf" << "application/vnd.rn-realmedia" << "video/x-ms-wmv"; - case Picture: return QStringList() << "image/jpeg" << "image/pjpeg" << "image/bmp" << "image/x-bmp" << "image/png" - << "image/x-png" << "image/tiff" << "image/svg+xml" << "image/x-xbitmap" << "image/gif" - << "image/x-xpixmap" << "image/vnd.microsoft.icon"; - case Terminal: return QStringList() << "application/x-terminal"; - } - return QStringList(); -} diff --git a/dcc-old/src/plugin-defaultapp/operation/defappworkerold.h b/dcc-old/src/plugin-defaultapp/operation/defappworkerold.h deleted file mode 100644 index 22333d402a..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/defappworkerold.h +++ /dev/null @@ -1,59 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include - -#include "mimedbusproxyold.h" -#include "category.h" - -class QFileInfo; - -class DefAppModel; -class Category; -class DefAppWorkerOld : public QObject -{ - Q_OBJECT -public: - explicit DefAppWorkerOld(DefAppModel *m_defAppModel, QObject *parent = 0); - - enum DefaultAppsCategory { - Browser, - Mail, - Text, - Music, - Video, - Picture, - Terminal - }; - - void active(); - void deactive(); - - -public Q_SLOTS: - void onSetDefaultApp(const QString &category, const App &item); - void onGetListApps(); - void onDelUserApp(const QString &mine, const App &item); - void onCreateFile(const QString &mime, const QFileInfo &info); - -private Q_SLOTS: - void getListAppFinished(const QString &mime, const QString &defaultApp, bool isUser); - void getDefaultAppFinished(const QString &mime, const QString &w); - void saveListApp(const QString &mime, const QJsonArray &json, const bool isUser); - void saveDefaultApp(const QString &mime, const QJsonObject &json); - -private: - DefAppModel *m_defAppModel; - MimeDBusProxyOld *m_dbusManager; - QMap m_stringToCategory; - QString m_userLocalPath; - -private: - const QString getTypeByCategory(const DefAppWorkerOld::DefaultAppsCategory &category); - const QStringList getTypeListByCategory(const DefAppWorkerOld::DefaultAppsCategory &category); - Category* getCategory(const QString &mime) const; -}; diff --git a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.cpp b/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.cpp deleted file mode 100644 index 256c65e56f..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.cpp +++ /dev/null @@ -1,95 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "mimedbusproxy.h" - -#include -#include -#include -#include -#include -#include -#include - -const QString ApplicationManagerServer = QStringLiteral("org.desktopspec.ApplicationManager1"); -const QString MimePath = QStringLiteral("/org/desktopspec/ApplicationManager1/MimeManager1"); -const QString MimeInterface = QStringLiteral("org.desktopspec.MimeManager1"); -const QString AMApplicationInterface = - QStringLiteral("org.desktopspec.ApplicationManager1.Application"); - -const QString ObjectManagerInterface = QStringLiteral("org.desktopspec.DBus.ObjectManager"); -const QString ApplicationManager1Path = QStringLiteral("/org/desktopspec/ApplicationManager1"); - -MimeDBusProxy::MimeDBusProxy(QObject *parent) - : QObject(parent) - , m_mimeInter(new QDBusInterface(ApplicationManagerServer, - MimePath, - MimeInterface, - QDBusConnection::sessionBus(), - this)) - , m_applicationManagerInter(new QDBusInterface(ApplicationManagerServer, - ApplicationManager1Path, - ObjectManagerInterface, - QDBusConnection::sessionBus(), - this)) -{ - qRegisterMetaType(); - qDBusRegisterMetaType(); - qRegisterMetaType(); - qDBusRegisterMetaType(); - qRegisterMetaType(); - qDBusRegisterMetaType(); - qRegisterMetaType(); - qDBusRegisterMetaType(); -} - -QDBusPendingReply MimeDBusProxy::GetManagedObjects() -{ - return m_applicationManagerInter->asyncCall("GetManagedObjects"); -} - -QDBusPendingReply MimeDBusProxy::SetDefaultApp(const QString &mimeType, - const QString &desktopId) -{ - QStringMap map; - map.insert(mimeType, desktopId); - return m_mimeInter->asyncCallWithArgumentList("setDefaultApplication", - { QVariant::fromValue(map) }); -} - -void MimeDBusProxy::DeleteApp([[maybe_unused]] const QStringList &mimeTypes, - [[maybe_unused]] const QString &desktopId) -{ - // QDBusPendingReply(m_mimeInter->asyncCall("DeleteApp", mimeTypes, desktopId)); -} - -void MimeDBusProxy::DeleteUserApp([[maybe_unused]] const QString &desktopId) -{ - // QDBusPendingReply(m_mimeInter->asyncCall("DeleteUserApp", desktopId)); -} - -void MimeDBusProxy::AddUserApp([[maybe_unused]] const QStringList &mimeTypes, - [[maybe_unused]] const QString &desktopId) -{ - // QDBusPendingReply(m_mimeInter->asyncCall("AddUserApp", mimeTypes, desktopId)); -} - -QString MimeDBusProxy::getAppId(const QDBusObjectPath &appPath) -{ - auto interface = QDBusInterface(ApplicationManagerServer, - appPath.path(), - AMApplicationInterface, - QDBusConnection::sessionBus(), - this); - return interface.property("ID").toString(); -} - -QDBusPendingReply MimeDBusProxy::GetDefaultApp(const QString &mimeType) -{ - return m_mimeInter->asyncCallWithArgumentList("queryDefaultApplication", { mimeType }); -} - -QDBusPendingReply MimeDBusProxy::ListApps(const QString &mimeType) -{ - return m_mimeInter->asyncCallWithArgumentList("listApplications", { mimeType }); -} diff --git a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.h b/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.h deleted file mode 100644 index bac37250cb..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxy.h +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include - -class QDBusInterface; -class QDBusMessage; - -using ObjectInterfaceMap = QMap; -using ObjectMap = QMap; -using QStringMap = QMap; -using PropMap = QMap; - -Q_DECLARE_METATYPE(ObjectInterfaceMap) -Q_DECLARE_METATYPE(ObjectMap) -Q_DECLARE_METATYPE(QStringMap) -Q_DECLARE_METATYPE(PropMap) - -class MimeDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit MimeDBusProxy(QObject *parent = nullptr); - - QDBusPendingReply SetDefaultApp(const QString &mime, const QString &desktopId); - void DeleteApp(const QStringList &mimeTypes, const QString &desktopId); - void DeleteUserApp(const QString &desktopId); - void AddUserApp(const QStringList &mimeTypes, const QString &desktopId); - - QDBusPendingReply GetManagedObjects(); - QDBusPendingReply GetDefaultApp(const QString &mimeType); - QDBusPendingReply ListApps(const QString &mimeType); - QString getAppId(const QDBusObjectPath &path); - -Q_SIGNALS: - void Change(); - -private: - QDBusInterface *m_mimeInter; - QDBusInterface *m_applicationManagerInter; -}; diff --git a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.cpp b/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.cpp deleted file mode 100644 index b82e6c8389..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "mimedbusproxyold.h" - -#include -#include -#include -#include -#include - -const QString MimeService = QStringLiteral("org.deepin.dde.Mime1"); -const QString MimePath = QStringLiteral("/org/deepin/dde/Mime1"); -const QString MimeInterface = QStringLiteral("org.deepin.dde.Mime1"); - -bool MimeDBusProxyOld::isRegisted() -{ - return QDBusConnection::sessionBus().interface()->isServiceRegistered(MimeInterface); -} - -MimeDBusProxyOld::MimeDBusProxyOld(QObject *parent) - : QObject(parent) - , m_mimeInter(new QDBusInterface(MimeService, MimePath, MimeInterface, QDBusConnection::sessionBus(), this)) -{ - connect(m_mimeInter, SIGNAL(Change()), this, SIGNAL(Change()), Qt::QueuedConnection); -} - -QDBusPendingReply MimeDBusProxyOld::SetDefaultApp(const QStringList &mimeTypes, const QString &desktopId) -{ - QList argumentList; - argumentList << QVariant::fromValue(mimeTypes) << QVariant::fromValue(desktopId); - return m_mimeInter->asyncCallWithArgumentList("SetDefaultApp", argumentList); -} - -void MimeDBusProxyOld::DeleteApp(const QStringList &mimeTypes, const QString &desktopId) -{ - QDBusPendingReply(m_mimeInter->asyncCall("DeleteApp", mimeTypes, desktopId)); -} - -void MimeDBusProxyOld::DeleteUserApp(const QString &desktopId) -{ - QDBusPendingReply(m_mimeInter->asyncCall("DeleteUserApp", desktopId)); -} - -void MimeDBusProxyOld::AddUserApp(const QStringList &mimeTypes, const QString &desktopId) -{ - QDBusPendingReply(m_mimeInter->asyncCall("AddUserApp", mimeTypes, desktopId)); -} - -QString MimeDBusProxyOld::GetDefaultApp(const QString &mimeType) -{ - return QDBusPendingReply(m_mimeInter->asyncCall("GetDefaultApp", mimeType)); -} - -QString MimeDBusProxyOld::ListApps(const QString &mimeType) -{ - return QDBusPendingReply(m_mimeInter->asyncCall("ListApps", mimeType)); -} - -QString MimeDBusProxyOld::ListUserApps(const QString &mimeType) -{ - return QDBusPendingReply(m_mimeInter->asyncCall("ListUserApps", mimeType)); -} diff --git a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.h b/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.h deleted file mode 100644 index 75783e91ee..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/mimedbusproxyold.h +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include -#include -class QDBusInterface; -class QDBusMessage; - -class MimeDBusProxyOld : public QObject -{ - Q_OBJECT -public: - static bool isRegisted(); - explicit MimeDBusProxyOld(QObject *parent = nullptr); - - QDBusPendingReply SetDefaultApp(const QStringList &mimeTypes, const QString &desktopId); - void DeleteApp(const QStringList &mimeTypes, const QString &desktopId); - void DeleteUserApp(const QString &desktopId); - void AddUserApp(const QStringList &mimeTypes, const QString &desktopId); - - QString GetDefaultApp(const QString &mimeType); - QString ListApps(const QString &mimeType); - - QString ListUserApps(const QString &mimeType); - -Q_SIGNALS: // SIGNALS - void Change(); - // begin property changed signals - -private: - QDBusInterface *m_mimeInter; -}; - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_browser_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_browser_32px.svg deleted file mode 100644 index 5240ff44e1..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_browser_32px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_mail_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_mail_32px.svg deleted file mode 100644 index 7318e6d647..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_mail_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_music_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_music_32px.svg deleted file mode 100644 index 06e7ca17c1..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_music_32px.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_photo_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_photo_32px.svg deleted file mode 100644 index 434346a527..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_photo_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_terminal_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_terminal_32px.svg deleted file mode 100644 index 8e7504774c..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_terminal_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_text_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_text_32px.svg deleted file mode 100644 index 864d5e163b..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_text_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_video_32px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_video_32px.svg deleted file mode 100644 index 319a93f473..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/actions/dcc_video_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/defapp.qrc b/dcc-old/src/plugin-defaultapp/operation/qrc/defapp.qrc deleted file mode 100644 index 2bff03aea9..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/defapp.qrc +++ /dev/null @@ -1,15 +0,0 @@ - - - actions/dcc_browser_32px.svg - actions/dcc_mail_32px.svg - actions/dcc_music_32px.svg - actions/dcc_photo_32px.svg - actions/dcc_terminal_32px.svg - actions/dcc_text_32px.svg - actions/dcc_video_32px.svg - icons/dcc_nav_defapp_42px.svg - icons/dcc_nav_defapp_84px.svg - themes/dark/icons/nav_defapp_normal.svg - themes/dark/icons/nav_defapp.svg - - diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_42px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_42px.svg deleted file mode 100644 index 165298543e..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_42px.svg +++ /dev/null @@ -1,47 +0,0 @@ - - - dcc_nav_defapp_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_84px.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_84px.svg deleted file mode 100644 index fe3e65f7be..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/icons/dcc_nav_defapp_84px.svg +++ /dev/null @@ -1,54 +0,0 @@ - - - dcc_nav_defapp_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp.svg deleted file mode 100755 index 8f095b782a..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - nav_default_app - Created with Sketch. - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp_normal.svg b/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp_normal.svg deleted file mode 100644 index 0a5b63f4df..0000000000 --- a/dcc-old/src/plugin-defaultapp/operation/qrc/themes/dark/icons/nav_defapp_normal.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - nav_default_app_normal - Created with Sketch. - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.cpp b/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.cpp deleted file mode 100644 index 27c29bc0dd..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.cpp +++ /dev/null @@ -1,325 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "defappdetailwidget.h" - -#include "defappmodel.h" -#include "defappworker.h" -#include "widgets/dcclistview.h" - -#include - -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDefaultDetailWidget, "dcc-default-detailwidget") - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -DefappDetailWidget::DefappDetailWidget(DefAppWorker::DefaultAppsCategory category, QWidget *parent) - : DCC_NAMESPACE::DCCListView(parent) - , m_model(new QStandardItemModel(this)) - , m_categoryValue(category) - , m_category(nullptr) - , m_systemAppCnt(0) - , m_userAppCnt(0) -{ - setAccessibleName("List_defapplist"); - setEditTriggers(QListView::NoEditTriggers); - setIconSize(QSize(32, 32)); - setMovement(QListView::Static); - setSelectionMode(QListView::NoSelection); - setFrameShape(QFrame::NoFrame); - setModel(m_model); - setViewportMargins(0, 0, 10, 0); - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); -} - -DefappDetailWidget::~DefappDetailWidget() { } - -void DefappDetailWidget::setDetailModel(DefAppModel *const model) -{ - switch (m_categoryValue) { - case DefAppWorker::Browser: - setCategory(model->getModBrowser()); - break; - case DefAppWorker::Mail: - setCategory(model->getModMail()); - break; - case DefAppWorker::Text: - setCategory(model->getModText()); - break; - case DefAppWorker::Music: - setCategory(model->getModMusic()); - break; - case DefAppWorker::Video: - setCategory(model->getModVideo()); - break; - case DefAppWorker::Picture: - setCategory(model->getModPicture()); - break; - case DefAppWorker::Terminal: - setCategory(model->getModTerminal()); - break; - default: - break; - } -} - -void DefappDetailWidget::setCategory(Category *const category) -{ - m_category = category; - - connect(m_category, &Category::defaultChanged, this, &DefappDetailWidget::onDefaultAppSet); - connect(m_category, &Category::addedUserItem, this, &DefappDetailWidget::addItem); - connect(m_category, &Category::removedUserItem, this, &DefappDetailWidget::removeItem); - connect(m_category, &Category::categoryNameChanged, this, &DefappDetailWidget::setCategoryName); - connect(m_category, &Category::clearAll, this, &DefappDetailWidget::onClearAll); - - AppsItemChanged(m_category->getappItem()); - - onDefaultAppSet(m_category->getDefault()); - setCategoryName(m_category->getName()); -} - -QIcon DefappDetailWidget::getAppIcon(const QString &appIcon, const QSize &size) -{ - QIcon icon(appIcon); - if (icon.pixmap(size).isNull()) - icon = DIconTheme::findQIcon(appIcon, DIconTheme::findQIcon("application-x-desktop")); - - const qreal ratio = devicePixelRatioF(); - QPixmap pixmap = icon.pixmap(size * ratio) - .scaled(size * ratio, Qt::KeepAspectRatio, Qt::SmoothTransformation); - pixmap.setDevicePixelRatio(ratio); - - return pixmap; -} - -void DefappDetailWidget::addItem(const App &item) -{ - qCDebug(DdcDefaultDetailWidget) << item.Id << ", isUser :" << item.isUser; - appendItemData(item); - updateListView(m_category->getDefault()); -} - -void DefappDetailWidget::removeItem(const App &item) -{ - qCDebug(DdcDefaultDetailWidget) << "DefappDetailWidget::removeItem id " << item.Id; - // update model - int cnt = m_model->rowCount(); - for (int row = 0; row < cnt; row++) { - QString id = m_model->data(m_model->index(row, 0), DefAppIdRole).toString(); - if (id == item.Id) { - m_model->removeRow(row); - if (item.isUser) { - m_userAppCnt--; - } else { - m_systemAppCnt--; - } - - break; - } - } - - updateListView(m_category->getDefault()); -} - -void DefappDetailWidget::showInvalidText(DStandardItem *modelItem, - const QString &name, - const QString &iconName) -{ - if (name.isEmpty()) - return; - - DViewItemActionList actions; - QPointer act( - new DViewItemAction(Qt::AlignVCenter | Qt::AlignLeft, QSize(32, 32), QSize(), false)); - QIcon icon = getAppIcon(iconName, QSize(32, 32)); - act->setIcon(icon); - act->setTextColorRole(DPalette::TextWarning); - act->setIconText(name); - actions << act; - modelItem->setActionList(Qt::LeftEdge, actions); -} - -void DefappDetailWidget::setCategoryName(const QString &name) -{ - m_categoryName = name; -} - -void DefappDetailWidget::updateListView(const App &defaultApp) -{ - int cnt = m_model->rowCount(); - for (int row = 0; row < cnt; row++) { - DStandardItem *modelItem = dynamic_cast(m_model->item(row)); - QString id = modelItem->data(DefAppIdRole).toString(); - bool isUser = modelItem->data(DefAppIsUserRole).toBool(); - bool canDelete = modelItem->data(DefAppCanDeleteRole).toBool(); - QString name = modelItem->data(DefAppNameRole).toString(); - QString iconName = modelItem->data(DefAppIconRole).toString(); - - if (id == defaultApp.Id) { - modelItem->setCheckState(Qt::Checked); - // remove user clear button - if (!isUser && !canDelete) - continue; - - DViewItemActionList actions; - modelItem->setActionList(Qt::RightEdge, actions); - showInvalidText(modelItem, name, iconName); - } else { - modelItem->setCheckState(Qt::Unchecked); - // add user clear button - if (!isUser && !canDelete) - continue; - - DViewItemActionList btnActList; - QPointer delAction( - new DViewItemAction(Qt::AlignVCenter | Qt::AlignRight, - QSize(21, 21), - QSize(19, 19), - true)); - - delAction->setIcon( - DStyleHelper(style()).standardIcon(DStyle::SP_CloseButton, nullptr, this)); - connect(delAction, &QAction::triggered, this, &DefappDetailWidget::onDelBtnClicked); - btnActList << delAction; - modelItem->setActionList(Qt::RightEdge, btnActList); - m_actionMap.insert(delAction, id); - showInvalidText(modelItem, name, iconName); - } - } -} - -void DefappDetailWidget::onDefaultAppSet(const App &app) -{ - qCDebug(DdcDefaultDetailWidget) << "SetAppName" << app.Name << this; - updateListView(app); -} - -void DefappDetailWidget::AppsItemChanged(const QList &list) -{ - for (const App &app : list) { - appendItemData(app); - } - - connect(this, &DListView::clicked, this, &DefappDetailWidget::onListViewClicked); - connect(this, &DListView::activated, this, &QListView::clicked); -} - -void DefappDetailWidget::onListViewClicked(const QModelIndex &index) -{ - if (!index.isValid()) - return; - - QString id = this->model()->data(this->currentIndex(), DefAppIdRole).toString(); - App app = getAppById(id); - if (!isValid(app)) - return; - - qCDebug(DdcDefaultDetailWidget) << "set default app " << app.Name; - updateListView(app); - // set default app - Q_EMIT requestSetDefaultApp(m_categoryName, app); -} - -void DefappDetailWidget::onDelBtnClicked() -{ - DViewItemAction *action = qobject_cast(sender()); - if (!m_actionMap.contains(action)) - return; - - QString id = m_actionMap[action]; - - App app = getAppById(id); - if (!isValid(app) || !(app.isUser || app.CanDelete)) - return; - - qCDebug(DdcDefaultDetailWidget) << "delete app " << app.Id; - // delete user app - Q_EMIT requestDelUserApp(m_categoryName, app); -} - -void DefappDetailWidget::onClearAll() -{ - int cnt = m_model->rowCount(); - m_model->removeRows(0, cnt); - m_systemAppCnt = 0; - m_userAppCnt = 0; -} - -App DefappDetailWidget::getAppById(const QString &appId) -{ - auto res = std::find_if(m_category->getappItem().cbegin(), - m_category->getappItem().cend(), - [=](const App &item) -> bool { - return item.Id == appId; - }); - - if (res != m_category->getappItem().cend()) { - return *res; - } - - App app; - app.Id = nullptr; - return app; -} - -void DefappDetailWidget::appendItemData(const App &app) -{ - qCDebug(DdcDefaultDetailWidget) << "appendItemData=" << app.MimeTypeFit; - DStandardItem *item = new DStandardItem; - QString appName = app.DisplayName; - if (!app.isUser || app.MimeTypeFit) { - item->setText(appName); - item->setIcon(getAppIcon(app.Icon, QSize(32, 32))); - } else { - item->setData(appName, DefAppNameRole); - item->setData(app.Icon, DefAppIconRole); - } - - item->setData(app.Id, DefAppIdRole); - item->setData(app.isUser, DefAppIsUserRole); - item->setData(app.CanDelete, DefAppCanDeleteRole); - - int index = 0; - if (app.isUser) { - index = m_systemAppCnt + m_userAppCnt; - m_userAppCnt++; - } else { - index = m_systemAppCnt; - m_systemAppCnt++; - } - - m_model->insertRow(index, item); -} - -bool DefappDetailWidget::isDesktopOrBinaryFile(const QString &fileName) -{ - QMimeDatabase mimeDatabase; - if (mimeDatabase.suffixForFileName(fileName) == "desktop") { - return true; - } - - QMimeType mimeType(mimeDatabase.mimeTypeForFile(fileName, QMimeDatabase::MatchExtension)); - return mimeType.name().startsWith("application/octet-stream"); -} - -bool DefappDetailWidget::isValid(const App &app) -{ - return (!app.Id.isNull() && !app.Id.isEmpty()); -} diff --git a/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.h b/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.h deleted file mode 100644 index e8c71437f8..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/defappdetailwidget.h +++ /dev/null @@ -1,84 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "dcclistview.h" -#include "defappworker.h" -#include "interface/namespace.h" - -#include - -#include - -#include - -DWIDGET_BEGIN_NAMESPACE -class DListView; -class DViewItemAction; -class DStandardItem; -DWIDGET_END_NAMESPACE - -QT_BEGIN_NAMESPACE -class QStandardItemModel; -class QVBoxLayout; -class QIcon; -QT_END_NAMESPACE - -class defappworker; - -class DefappDetailWidget : public DCC_NAMESPACE::DCCListView -{ - Q_OBJECT -public: - explicit DefappDetailWidget(DefAppWorker::DefaultAppsCategory category, - QWidget *parent = nullptr); - virtual ~DefappDetailWidget(); - - void setDetailModel(DefAppModel *const model); - void setCategory(Category *const category); - -private: - void updateListView(const App &defaultApp); - QIcon getAppIcon(const QString &appIcon, const QSize &size); - App getAppById(const QString &appId); - void appendItemData(const App &app); - bool isDesktopOrBinaryFile(const QString &fileName); - bool isValid(const App &app); - - enum DefAppDataRole { - DefAppIsUserRole = DTK_NAMESPACE::UserRole + 1, - DefAppIdRole, - DefAppCanDeleteRole, - DefAppNameRole, - DefAppIconRole - }; - -Q_SIGNALS: - void requestSetDefaultApp(const QString &category, const App &item); - void requestDelUserApp(const QString &name, const App &item); - -public Q_SLOTS: - void onDefaultAppSet(const App &app); - void setCategoryName(const QString &name); - void onListViewClicked(const QModelIndex &index); - void onDelBtnClicked(); - void onClearAll(); - -private: - void AppsItemChanged(const QList &list); - void addItem(const App &item); - void removeItem(const App &item); - void showInvalidText(DTK_WIDGET_NAMESPACE::DStandardItem *modelItem, - const QString &name, - const QString &iconName); - -private: - QStandardItemModel *m_model; - QString m_categoryName; - int m_categoryValue; - Category *m_category; - QMap m_actionMap; - int m_systemAppCnt; - int m_userAppCnt; -}; diff --git a/dcc-old/src/plugin-defaultapp/window/defappplugin.cpp b/dcc-old/src/plugin-defaultapp/window/defappplugin.cpp deleted file mode 100644 index 0c11f41f31..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/defappplugin.cpp +++ /dev/null @@ -1,163 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "defappplugin.h" - -#include "addbuttonwidget.h" -#include "defappdetailwidget.h" -#include "defappmodel.h" -#include "defappworker.h" -#include "interface/pagemodule.h" -#include "mimedbusproxyold.h" -#include "widgets/itemmodule.h" - -#include -#include -#include - -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -struct DATE -{ - QString name; - QString displayName; - QString icon; - DefAppWorker::DefaultAppsCategory category; - - DATE(const QString &_name, - const QString &_displayName, - const QString &_icon, - DefAppWorker::DefaultAppsCategory _category) - : name(_name) - , displayName(_displayName) - , icon(_icon) - , category(_category) - { - } -}; - -QString DefAppPlugin::name() const -{ - return QStringLiteral("Default Applications"); -} - -ModuleObject *DefAppPlugin::module() -{ - QList moduleInfo = { - DATE("defappWebpage", - tr("Webpage"), - "dcc_browser", - DefAppWorker::DefaultAppsCategory::Browser), - DATE("defappMail", tr("Mail"), "dcc_mail", DefAppWorker::DefaultAppsCategory::Mail), - DATE("defappText", tr("Text"), "dcc_text", DefAppWorker::DefaultAppsCategory::Text), - DATE("defappMusic", tr("Music"), "dcc_music", DefAppWorker::DefaultAppsCategory::Music), - DATE("defappVideo", tr("Video"), "dcc_video", DefAppWorker::DefaultAppsCategory::Video), - DATE("defappPicture", - tr("Picture"), - "dcc_photo", - DefAppWorker::DefaultAppsCategory::Picture), - DATE("defappTerminal", - tr("Terminal"), - "dcc_terminal", - DefAppWorker::DefaultAppsCategory::Terminal), - }; - // 一级页面 - DefAppModule *moduleRoot = new DefAppModule; - - for (DATE iter : moduleInfo) { - PageModule *defappDetail = new PageModule(iter.name, - iter.displayName, - QVariant::fromValue(iter.icon), - moduleRoot); - - defappDetail->appendChild(new ItemModule( - "", - "", - [iter, moduleRoot]([[maybe_unused]] ModuleObject *module) { - DefappDetailWidget *defDetail = new DefappDetailWidget(iter.category); - defDetail->setDetailModel(moduleRoot->model()); - // 设置默认程序 - if (moduleRoot->isOldInterface()) { - connect(defDetail, - &DefappDetailWidget::requestSetDefaultApp, - moduleRoot->oldWork(), - &DefAppWorkerOld::onSetDefaultApp); - connect(defDetail, - &DefappDetailWidget::requestDelUserApp, - moduleRoot->oldWork(), - &DefAppWorkerOld::onDelUserApp); - } else { - connect(defDetail, - &DefappDetailWidget::requestSetDefaultApp, - moduleRoot->work(), - &DefAppWorker::onSetDefaultApp); - connect(defDetail, - &DefappDetailWidget::requestDelUserApp, - moduleRoot->work(), - &DefAppWorker::onDelUserApp); - } - return defDetail; - }, - false)); - // TODO: if we need add again? - // ModuleObject *addButton = - // new WidgetModule("defappApplistAddbtn", - // "addDefApp", - // [iter, moduleRoot](AddButtonWidget *button) { - // button->setDefaultAppsCategory(iter.category); - // button->setModel(moduleRoot->model()); - // connect(button, - // &AddButtonWidget::requestCreateFile, - // moduleRoot->work(), - // &DefAppWorker::onCreateFile); - // }); - // addButton->setExtra(); - // defappDetail->appendChild(addButton); - moduleRoot->appendChild(defappDetail); - } - return moduleRoot; -} - -QString DefAppPlugin::location() const -{ - return "4"; -} - -DefAppModule::DefAppModule(QObject *parent) - : VListModule( - "defapp", tr("Default Applications"), DIconTheme::findQIcon("dcc_nav_defapp"), parent) - , m_model(new DefAppModel(this)) - , m_defApps(nullptr) - , m_isOldInterface(false) -{ - if (MimeDBusProxyOld::isRegisted()) { - m_oldwork = new DefAppWorkerOld(m_model, this); - m_isOldInterface = true; - } else { - m_work = new DefAppWorker(m_model, this); - } -} - -DefAppModule::~DefAppModule() -{ - m_model->deleteLater(); - if (m_isOldInterface) { - m_oldwork->deleteLater(); - } else { - m_work->deleteLater(); - } -} - -void DefAppModule::active() -{ - if (m_isOldInterface) { - m_oldwork->onGetListApps(); - } else { - m_work->onGetListApps(); - } -} diff --git a/dcc-old/src/plugin-defaultapp/window/defappplugin.h b/dcc-old/src/plugin-defaultapp/window/defappplugin.h deleted file mode 100644 index 50edede863..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/defappplugin.h +++ /dev/null @@ -1,56 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DEFAPPPLUGIN_H -#define DEFAPPPLUGIN_H - -#include "defappworker.h" -#include "defappworkerold.h" - -#include "interface/plugininterface.h" -#include "interface/vlistmodule.h" - -class DefAppModel; - -// 默认程序插件 -class DefAppPlugin : public DCC_NAMESPACE::PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.DefApp" FILE "defaultapp.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - explicit DefAppPlugin() { } - - virtual QString name() const override; - virtual DCC_NAMESPACE::ModuleObject *module() override; - virtual QString location() const override; -}; - -// 一级菜单 -class DefAppModule : public DCC_NAMESPACE::VListModule -{ - Q_OBJECT -public: - explicit DefAppModule(QObject *parent = nullptr); - ~DefAppModule() override; - - DefAppWorker *work() { return m_work; } - - DefAppWorkerOld *oldWork() { return m_oldwork; } - - DefAppModel *model() { return m_model; } - - bool isOldInterface() { return m_isOldInterface; } - -protected: - virtual void active() override; - -private: - DefAppModel *m_model; - DefAppWorker *m_work; - DefAppWorkerOld *m_oldwork; - ModuleObject *m_defApps; - bool m_isOldInterface; -}; - -#endif // DEFAPPPLUGIN_H diff --git a/dcc-old/src/plugin-defaultapp/window/defaultapp.json b/dcc-old/src/plugin-defaultapp/window/defaultapp.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/defaultapp.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.cpp b/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.cpp deleted file mode 100644 index 6c2ff27391..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.cpp +++ /dev/null @@ -1,103 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "addbuttonwidget.h" -#include "category.h" -#include "defappmodel.h" - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -AddButtonWidget::AddButtonWidget(DefAppWorker::DefaultAppsCategory category, QWidget *parent) - : QWidget(parent) - , m_addBtn(new DFloatingButton(DStyle::SP_IncreaseElement)) - , m_categoryValue(category) - , m_category(nullptr) -{ - QVBoxLayout *centralLayout = new QVBoxLayout; - - centralLayout->addWidget(m_addBtn, 0, Qt::AlignHCenter | Qt::AlignBottom); - setLayout(centralLayout); - - connect(m_addBtn, &Dtk::Widget::DFloatingButton::clicked, this, &AddButtonWidget::onAddBtnClicked); - m_addBtn->setToolTip(tr("Add Application")); - -} - -AddButtonWidget::~AddButtonWidget() -{ - -} - -void AddButtonWidget::setModel(DefAppModel * const model) -{ - switch (m_categoryValue) { - case DefAppWorker::Browser: - setCategory(model->getModBrowser()); - break; - case DefAppWorker::Mail: - setCategory(model->getModMail()); - break; - case DefAppWorker::Text: - setCategory(model->getModText()); - break; - case DefAppWorker::Music: - setCategory(model->getModMusic()); - break; - case DefAppWorker::Video: - setCategory(model->getModVideo()); - break; - case DefAppWorker::Picture: - setCategory(model->getModPicture()); - break; - case DefAppWorker::Terminal: - setCategory(model->getModTerminal()); - break; - default: - break; - } -} - -void AddButtonWidget::setCategory(Category * const category) -{ - m_category = category; - connect(m_category, &Category::categoryNameChanged, this, &AddButtonWidget::setCategoryName); - setCategoryName(m_category->getName()); -} - -void AddButtonWidget::setDefaultAppsCategory(DefAppWorker::DefaultAppsCategory category) -{ - m_categoryValue = category; -} - -void AddButtonWidget::setCategoryName(const QString &name) -{ - m_categoryName = name; -} - -void AddButtonWidget::onAddBtnClicked() -{ - QFileDialog dialog = QFileDialog(); - dialog.setWindowTitle(tr("Open Desktop file")); - QStringList screen; - screen << tr("Apps (*.desktop)") - << tr("All files (*)"); - dialog.setNameFilters(screen); - dialog.setAcceptMode(QFileDialog::AcceptOpen); - QStringList directory = QStandardPaths::standardLocations(QStandardPaths::HomeLocation); - if (!directory.isEmpty()) - dialog.setDirectory(directory.first()); - if(dialog.exec() == QDialog::Accepted) { - QString path = dialog.selectedFiles().first(); - if (path.isEmpty()) - return; - - QFileInfo info(path); - Q_EMIT requestCreateFile(m_categoryName, info); - } -} - diff --git a/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.h b/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.h deleted file mode 100644 index e85534d189..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/widgets/addbuttonwidget.h +++ /dev/null @@ -1,41 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ADDBUTTONWIDGET_H -#define ADDBUTTONWIDGET_H - -#include "defappworker.h" -#include - -#include - -QT_BEGIN_NAMESPACE -class QFileDialog; -QT_END_NAMESPACE - -class AddButtonWidget : public QWidget -{ - Q_OBJECT -public: - AddButtonWidget(DefAppWorker::DefaultAppsCategory category = DefAppWorker::Browser, QWidget *parent = nullptr); - ~AddButtonWidget(); - - void setModel(DefAppModel *const model); - void setCategory(Category *const category); - void setDefaultAppsCategory(DefAppWorker::DefaultAppsCategory category); - -Q_SIGNALS: - void requestCreateFile(const QString &category, const QFileInfo &info); - -public Q_SLOTS: - void setCategoryName(const QString &name); - void onAddBtnClicked(); - -private: - DTK_WIDGET_NAMESPACE::DFloatingButton *m_addBtn; - DefAppWorker::DefaultAppsCategory m_categoryValue; - QString m_categoryName; - Category *m_category; -}; - -#endif // ADDBUTTONWIDGET_H diff --git a/dcc-old/src/plugin-defaultapp/window/widgets/category.cpp b/dcc-old/src/plugin-defaultapp/window/widgets/category.cpp deleted file mode 100644 index de99d4e014..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/widgets/category.cpp +++ /dev/null @@ -1,74 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "category.h" -#include - -Category::Category(QObject *parent) - : QObject(parent) -{ - -} - -void Category::setDefault(const App &def) -{ - if (m_default.Id != def.Id) { - m_default = def; - Q_EMIT defaultChanged(def); - } -} - -void Category::setCategory(const QString &category) -{ - if (m_category == category) - return; - - m_category = category; - Q_EMIT categoryNameChanged(category); -} - -void Category::clear() -{ - bool clearFlag = !m_applist.isEmpty(); - - m_systemAppList.clear(); - m_userAppList.clear(); - m_applist.clear(); - if (clearFlag) - Q_EMIT clearAll(); -} - -void Category::addUserItem(const App &value) -{ - if (value.isUser) { - for (auto r : m_systemAppList) { - if (r.Exec == value.Exec) { - return; - } - } - if (m_userAppList.contains(value)) return; - m_userAppList << value; - } else { - if (m_systemAppList.contains(value)) return; - m_systemAppList << value; - } - - m_applist << value; - Q_EMIT addedUserItem(value); -} - -void Category::delUserItem(const App &value) -{ - bool isRemove = false; - - if (value.isUser) { - isRemove = m_userAppList.removeOne(value); - } else { - isRemove = m_systemAppList.removeOne(value); - } - - if (isRemove) { - m_applist.removeOne(value); - Q_EMIT removedUserItem(value); - } -} diff --git a/dcc-old/src/plugin-defaultapp/window/widgets/category.h b/dcc-old/src/plugin-defaultapp/window/widgets/category.h deleted file mode 100644 index c3ad63c7e2..0000000000 --- a/dcc-old/src/plugin-defaultapp/window/widgets/category.h +++ /dev/null @@ -1,65 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef CATEGORY_H -#define CATEGORY_H - -#include -#include - -struct App { - QString dbusPath; - QString Id; - QString Name; - QString DisplayName; - QString Description; - QString Icon; - QString Exec; - bool isUser; - bool CanDelete; - bool MimeTypeFit; - - App() : isUser(false), CanDelete(false), MimeTypeFit(false) {} - - bool operator ==(const App &app) const { - return app.Id == Id && app.isUser == isUser; - } - - bool operator !=(const App &app) const { - return app.Id != Id && app.isUser != isUser; - } -}; - -class Category : public QObject -{ - Q_OBJECT -public: - explicit Category(QObject *parent = 0); - - void setDefault(const App &def); - - const QString getName() const { return m_category;} - void setCategory(const QString &category); - inline const QList getappItem() const { return m_applist;} - inline const QList systemAppList() const { return m_systemAppList; } - inline const QList userAppList() const { return m_userAppList; } - inline const App getDefault() { return m_default;} - void clear(); - void addUserItem(const App &value); - void delUserItem(const App &value); - -Q_SIGNALS: - void defaultChanged(const App &id); - void addedUserItem(const App &app); - void removedUserItem(const App &app); - void categoryNameChanged(const QString &name); - void clearAll(); - -private: - QList m_applist; - QList m_systemAppList; - QList m_userAppList; - QString m_category; - App m_default; -}; -#endif // CATEGORY_H diff --git a/dcc-old/src/plugin-display/operation/displaydbusproxy.cpp b/dcc-old/src/plugin-display/operation/displaydbusproxy.cpp deleted file mode 100644 index c8077b1951..0000000000 --- a/dcc-old/src/plugin-display/operation/displaydbusproxy.cpp +++ /dev/null @@ -1,315 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "displaydbusproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include - -const static QString DisplayService = "org.deepin.dde.Display1"; -const static QString DisplayPath = "/org/deepin/dde/Display1"; -const static QString DisplayInterface = "org.deepin.dde.Display1"; - -const static QString AppearanceService = "org.deepin.dde.Appearance1"; -const static QString AppearancePath = "/org/deepin/dde/Appearance1"; -const static QString AppearanceInterface = "org.deepin.dde.Appearance1"; - -const static QString PowerService = "org.deepin.dde.Power1"; -const static QString PowerPath = "/org/deepin/dde/Power1"; -const static QString PowerInterface = "org.deepin.dde.Power1"; - -DisplayDBusProxy::DisplayDBusProxy(QObject *parent) - : QObject(parent) -{ - registerTouchscreenInfoList_V2MetaType(); - registerTouchscreenMapMetaType(); - registerResolutionListMetaType(); - registerBrightnessMapMetaType(); - registerTouchscreenInfoListMetaType(); - registerScreenRectMetaType(); - registerResolutionMetaType(); - - init(); -} - -void DisplayDBusProxy::init() -{ - m_dBusSystemDisplayInter = new DDBusInterface("org.deepin.dde.Display1", "/org/deepin/dde/Display1", "org.deepin.dde.Display1", QDBusConnection::systemBus(), this); - m_dBusDisplayInter = new DDBusInterface(DisplayService, DisplayPath, DisplayInterface, QDBusConnection::sessionBus(), this); - m_dBusAppearanceInter = new DDBusInterface(AppearanceService, AppearancePath, AppearanceInterface, QDBusConnection::sessionBus(), this); - m_dBusPowerInter = new DDBusInterface(PowerService, PowerPath, PowerInterface, QDBusConnection::sessionBus(), this); -} - -//power -bool DisplayDBusProxy::ambientLightAdjustBrightness() -{ - return qvariant_cast(m_dBusPowerInter->property("AmbientLightAdjustBrightness")); -} - -void DisplayDBusProxy::setAmbientLightAdjustBrightness(bool value) -{ - m_dBusPowerInter->setProperty("AmbientLightAdjustBrightness", QVariant::fromValue(value)); -} - -bool DisplayDBusProxy::hasAmbientLightSensor() -{ - return qvariant_cast(m_dBusPowerInter->property("HasAmbientLightSensor")); -} - -//display -BrightnessMap DisplayDBusProxy::brightness() -{ - return qvariant_cast(m_dBusDisplayInter->property("Brightness")); -} - -int DisplayDBusProxy::colorTemperatureManual() -{ - return qvariant_cast(m_dBusDisplayInter->property("ColorTemperatureManual")); -} - -int DisplayDBusProxy::colorTemperatureMode() -{ - return qvariant_cast(m_dBusDisplayInter->property("ColorTemperatureMode")); -} - -QString DisplayDBusProxy::currentCustomId() -{ - return qvariant_cast(m_dBusDisplayInter->property("CurrentCustomId")); -} - -QStringList DisplayDBusProxy::customIdList() -{ - return qvariant_cast(m_dBusDisplayInter->property("CustomIdList")); -} - -uchar DisplayDBusProxy::displayMode() -{ - return qvariant_cast(m_dBusDisplayInter->property("DisplayMode")); -} -bool DisplayDBusProxy::hasChanged() -{ - return qvariant_cast(m_dBusDisplayInter->property("HasChanged")); -} - -uint DisplayDBusProxy::maxBacklightBrightness() -{ - return qvariant_cast(m_dBusDisplayInter->property("MaxBacklightBrightness")); -} - -QList DisplayDBusProxy::monitors() -{ - return qvariant_cast>(m_dBusDisplayInter->property("Monitors")); -} - -QString DisplayDBusProxy::primary() -{ - return qvariant_cast(m_dBusDisplayInter->property("Primary")); -} - -ScreenRect DisplayDBusProxy::primaryRect() -{ - return qvariant_cast(m_dBusDisplayInter->property("PrimaryRect")); -} - -ushort DisplayDBusProxy::screenHeight() -{ - return qvariant_cast(m_dBusDisplayInter->property("ScreenHeight")); -} - -ushort DisplayDBusProxy::screenWidth() -{ - return qvariant_cast(m_dBusDisplayInter->property("ScreenWidth")); -} - -TouchscreenMap DisplayDBusProxy::touchMap() -{ - return qvariant_cast(m_dBusDisplayInter->property("TouchMap")); -} - -TouchscreenInfoList DisplayDBusProxy::touchscreens() -{ - return qvariant_cast(m_dBusDisplayInter->property("Touchscreens")); -} - -TouchscreenInfoList_V2 DisplayDBusProxy::touchscreensV2() -{ - return qvariant_cast(m_dBusDisplayInter->property("TouchscreensV2")); -} - - -QDBusPendingReply DisplayDBusProxy::GetScaleFactor() -{ - QList argumentList; - return m_dBusAppearanceInter->asyncCallWithArgumentList(QStringLiteral("GetScaleFactor"), argumentList); -} - -QDBusPendingReply > DisplayDBusProxy::GetScreenScaleFactors() -{ - QList argumentList; - return m_dBusAppearanceInter->asyncCallWithArgumentList(QStringLiteral("GetScreenScaleFactors"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetScaleFactor(double in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusAppearanceInter->asyncCallWithArgumentList(QStringLiteral("SetScaleFactor"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetScreenScaleFactors(const QMap &scaleFactors) -{ - QList argumentList; - argumentList << QVariant::fromValue(scaleFactors); - return m_dBusAppearanceInter->asyncCallWithArgumentList(QStringLiteral("SetScreenScaleFactors"), argumentList); -} - -QString DisplayDBusProxy::GetConfig() -{ - QList argumentList; - return QDBusPendingReply(m_dBusSystemDisplayInter->asyncCallWithArgumentList(QStringLiteral("GetConfig"), argumentList)); -} - -void DisplayDBusProxy::SetConfig(QString cfgStr) -{ - QList argumentList; - argumentList << cfgStr; - m_dBusSystemDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetConfig"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::ApplyChanges() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ApplyChanges"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::AssociateTouch(const QString &in0, const QString &in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("AssociateTouch"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::AssociateTouchByUUID(const QString &in0, const QString &in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("AssociateTouchByUUID"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::ChangeBrightness(bool in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ChangeBrightness"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::DeleteCustomMode(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("DeleteCustomMode"), argumentList); -} - -QDBusPendingReply DisplayDBusProxy::GetRealDisplayMode() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("GetRealDisplayMode"), argumentList); -} - -QDBusPendingReply DisplayDBusProxy::ListOutputNames() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ListOutputNames"), argumentList); -} - -QDBusPendingReply DisplayDBusProxy::ListOutputsCommonModes() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ListOutputsCommonModes"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::ModifyConfigName(const QString &in0, const QString &in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ModifyConfigName"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::RefreshBrightness() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("RefreshBrightness"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::Reset() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("Reset"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::ResetChanges() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("ResetChanges"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::Save() -{ - QList argumentList; - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("Save"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetAndSaveBrightness(const QString &in0, double in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetAndSaveBrightness"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetBrightness(const QString &in0, double in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetBrightness"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetColorTemperature(int in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetColorTemperature"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetMethodAdjustCCT(int in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetMethodAdjustCCT"), argumentList); -} - -QDBusPendingReply<> DisplayDBusProxy::SetPrimary(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SetPrimary"), argumentList); -} - - -QDBusPendingReply<> DisplayDBusProxy::SwitchMode(uchar in0, const QString &in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusDisplayInter->asyncCallWithArgumentList(QStringLiteral("SwitchMode"), argumentList); -} - -QDBusReply DisplayDBusProxy::CanSetBrightnessSync(const QString &name) -{ - return m_dBusDisplayInter->call("CanSetBrightness", name); -} - -QDBusReply DisplayDBusProxy::SupportSetColorTemperatureSync() -{ - return m_dBusDisplayInter->call("SupportSetColorTemperatureSync"); -} diff --git a/dcc-old/src/plugin-display/operation/displaydbusproxy.h b/dcc-old/src/plugin-display/operation/displaydbusproxy.h deleted file mode 100644 index bbde801087..0000000000 --- a/dcc-old/src/plugin-display/operation/displaydbusproxy.h +++ /dev/null @@ -1,151 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DISPLAYDBUSPROXY_H -#define DISPLAYDBUSPROXY_H - -#include "interface/namespace.h" -#include "types/touchscreeninfolist_v2.h" -#include "types/touchscreenmap.h" -#include "types/resolutionlist.h" -#include "types/brightnessmap.h" -#include "types/touchscreeninfolist.h" -#include "types/screenrect.h" - -#include - -#include -#include -#include - -using Dtk::Core::DDBusInterface; -class QDBusMessage; - -class DisplayDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit DisplayDBusProxy(QObject *parent = nullptr); - Q_PROPERTY(BrightnessMap Brightness READ brightness NOTIFY BrightnessChanged) - BrightnessMap brightness(); - - Q_PROPERTY(int ColorTemperatureManual READ colorTemperatureManual NOTIFY ColorTemperatureManualChanged) - int colorTemperatureManual(); - - Q_PROPERTY(int ColorTemperatureMode READ colorTemperatureMode NOTIFY ColorTemperatureModeChanged) - int colorTemperatureMode(); - - Q_PROPERTY(QString CurrentCustomId READ currentCustomId NOTIFY CurrentCustomIdChanged) - QString currentCustomId(); - - Q_PROPERTY(QStringList CustomIdList READ customIdList NOTIFY CustomIdListChanged) - QStringList customIdList(); - - Q_PROPERTY(uchar DisplayMode READ displayMode NOTIFY DisplayModeChanged) - uchar displayMode(); - - Q_PROPERTY(bool HasChanged READ hasChanged NOTIFY HasChangedChanged) - bool hasChanged(); - - Q_PROPERTY(uint MaxBacklightBrightness READ maxBacklightBrightness NOTIFY MaxBacklightBrightnessChanged) - uint maxBacklightBrightness(); - - Q_PROPERTY(QList Monitors READ monitors NOTIFY MonitorsChanged) - QList monitors(); - - Q_PROPERTY(QString Primary READ primary NOTIFY PrimaryChanged) - QString primary(); - - Q_PROPERTY(ScreenRect PrimaryRect READ primaryRect NOTIFY PrimaryRectChanged) - ScreenRect primaryRect(); - - Q_PROPERTY(ushort ScreenHeight READ screenHeight NOTIFY ScreenHeightChanged) - ushort screenHeight(); - - Q_PROPERTY(ushort ScreenWidth READ screenWidth NOTIFY ScreenWidthChanged) - ushort screenWidth(); - - Q_PROPERTY(TouchscreenMap TouchMap READ touchMap NOTIFY TouchMapChanged) - TouchscreenMap touchMap(); - - Q_PROPERTY(TouchscreenInfoList Touchscreens READ touchscreens NOTIFY TouchscreensChanged) - TouchscreenInfoList touchscreens(); - - Q_PROPERTY(TouchscreenInfoList_V2 TouchscreensV2 READ touchscreensV2 NOTIFY TouchscreensV2Changed) - TouchscreenInfoList_V2 touchscreensV2(); - - //power - Q_PROPERTY(bool AmbientLightAdjustBrightness READ ambientLightAdjustBrightness WRITE setAmbientLightAdjustBrightness NOTIFY AmbientLightAdjustBrightnessChanged) - bool ambientLightAdjustBrightness(); - void setAmbientLightAdjustBrightness(bool value); - - Q_PROPERTY(bool HasAmbientLightSensor READ hasAmbientLightSensor NOTIFY HasAmbientLightSensorChanged) - bool hasAmbientLightSensor(); - - -private: - void init(); - -public Q_SLOTS: // METHODS - //Display - QDBusPendingReply<> ApplyChanges(); - QDBusPendingReply<> AssociateTouch(const QString &in0, const QString &in1); - QDBusPendingReply<> AssociateTouchByUUID(const QString &in0, const QString &in1); - QDBusPendingReply<> ChangeBrightness(bool in0); - QDBusPendingReply<> DeleteCustomMode(const QString &in0); - QDBusPendingReply GetRealDisplayMode(); - QDBusPendingReply ListOutputNames(); - QDBusPendingReply ListOutputsCommonModes(); - QDBusPendingReply<> ModifyConfigName(const QString &in0, const QString &in1); - QDBusPendingReply<> RefreshBrightness(); - QDBusPendingReply<> Reset(); - QDBusPendingReply<> ResetChanges(); - QDBusPendingReply<> Save(); - QDBusPendingReply<> SetAndSaveBrightness(const QString &in0, double in1); - QDBusPendingReply<> SetBrightness(const QString &in0, double in1); - QDBusPendingReply<> SetColorTemperature(int in0); - QDBusPendingReply<> SetMethodAdjustCCT(int in0); - QDBusPendingReply<> SetPrimary(const QString &in0); - QDBusPendingReply<> SwitchMode(uchar in0, const QString &in1); - QDBusReply CanSetBrightnessSync(const QString &name); - QDBusReply SupportSetColorTemperatureSync(); - //Appearance - QDBusPendingReply GetScaleFactor(); - QDBusPendingReply > GetScreenScaleFactors(); - QDBusPendingReply<> SetScaleFactor(double in0); - QDBusPendingReply<> SetScreenScaleFactors(const QMap &scaleFactors); - // SystemDisplay - QString GetConfig(); - void SetConfig(QString cfgStr); - -Q_SIGNALS: // SIGNALS - // begin property changed signals - void BrightnessChanged(BrightnessMap value) const; - void ColorTemperatureManualChanged(int value) const; - void ColorTemperatureModeChanged(int value) const; - void CurrentCustomIdChanged(const QString & value) const; - void CustomIdListChanged(const QStringList & value) const; - void DisplayModeChanged(uchar value) const; - void HasChangedChanged(bool value) const; - void MaxBacklightBrightnessChanged(uint value) const; - void MonitorsChanged(const QList & value) const; - void PrimaryChanged(const QString & value) const; - void PrimaryRectChanged(ScreenRect value) const; - void ScreenHeightChanged(ushort value) const; - void ScreenWidthChanged(ushort value) const; - void TouchMapChanged(TouchscreenMap value) const; - void TouchscreensChanged(TouchscreenInfoList value) const; - void TouchscreensV2Changed(TouchscreenInfoList_V2 value) const; - - //power - void AmbientLightAdjustBrightnessChanged(bool value) const; - void HasAmbientLightSensorChanged(bool value) const; - -private: - DDBusInterface *m_dBusDisplayInter; - DDBusInterface *m_dBusSystemDisplayInter; - DDBusInterface *m_dBusAppearanceInter; - DDBusInterface *m_dBusPowerInter; -}; - -#endif // DISPLAYDBUSPROXY_H diff --git a/dcc-old/src/plugin-display/operation/displaymodel.cpp b/dcc-old/src/plugin-display/operation/displaymodel.cpp deleted file mode 100644 index db35c3102c..0000000000 --- a/dcc-old/src/plugin-display/operation/displaymodel.cpp +++ /dev/null @@ -1,241 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "displaymodel.h" - -using namespace DCC_NAMESPACE; -const double DoubleZero = 0.000001; -bool contains(const QList &container, const Resolution &item) -{ - for (auto r : container) - if (r.width() == item.width() && r.height() == item.height()) - return true; - - return false; -} - -DisplayModel::DisplayModel(QObject *parent) - : QObject(parent) - , m_screenHeight(0) - , m_screenWidth(0) - , m_uiScale(1) - , m_minimumBrightnessScale(0.0) - , m_redshiftIsValid(false) - , m_allowEnableMultiScaleRatio(false) - , m_resolutionRefreshEnable(true) - , m_brightnessEnable(true) -{ -} - -double DisplayModel::monitorScale(Monitor *moni) -{ - qDebug() << "ui scale : " << m_uiScale << "\tmonitor scale:" << moni->scale(); - return moni->scale() < 1.0 ? m_uiScale : moni->scale(); -} - -Monitor *DisplayModel::primaryMonitor() const -{ - for (auto mon : m_monitors) - if (mon->name() == m_primary) - return mon; - - return nullptr; -} - -void DisplayModel::setScreenHeight(const int h) -{ - if (m_screenHeight != h) { - m_screenHeight = h; - Q_EMIT screenHeightChanged(m_screenHeight); - } -} - -void DisplayModel::setScreenWidth(const int w) -{ - if (m_screenWidth != w) { - m_screenWidth = w; - Q_EMIT screenWidthChanged(m_screenWidth); - } -} - -void DisplayModel::setDisplayMode(const int mode) -{ - if (m_mode != mode && mode >= 0 && mode < 5) { - m_mode = mode; - Q_EMIT displayModeChanged(m_mode); - } -} - -void DisplayModel::setUIScale(const double scale) -{ - if (fabs(m_uiScale - scale) > DoubleZero) { - m_uiScale = scale; - Q_EMIT uiScaleChanged(m_uiScale); - } -} - -void DisplayModel::setMinimumBrightnessScale(const double scale) -{ - if (fabs(m_minimumBrightnessScale - scale) > DoubleZero) { - m_minimumBrightnessScale = scale; - Q_EMIT minimumBrightnessScaleChanged(m_minimumBrightnessScale); - } -} - -void DisplayModel::setPrimary(const QString &primary) -{ - if (m_primary != primary) { - m_primary = primary; - Q_EMIT primaryScreenChanged(m_primary); - } -} - -void DisplayModel::monitorAdded(Monitor *mon) -{ - m_monitors.append(mon); - // 按照名称排序,显示的时候VGA在前,HDMI在后 - std::sort(m_monitors.begin(), m_monitors.end(), [=](const Monitor *m1, const Monitor *m2){ - return m1->name() > m2->name(); - }); - checkAllSupportFillModes(); - - Q_EMIT monitorListChanged(); -} - -void DisplayModel::monitorRemoved(Monitor *mon) -{ - m_monitors.removeOne(mon); - checkAllSupportFillModes(); - - Q_EMIT monitorListChanged(); -} - -void DisplayModel::setAutoLightAdjustIsValid(bool ala) -{ - if (m_AutoLightAdjustIsValid == ala) - return; - m_AutoLightAdjustIsValid = ala; - Q_EMIT autoLightAdjustVaildChanged(ala); -} - -void DisplayModel::setBrightnessMap(const BrightnessMap &brightnessMap) -{ - if (brightnessMap == m_brightnessMap) - return; - - m_brightnessMap = brightnessMap; -} - -void DisplayModel::setTouchscreenList(const TouchscreenInfoList_V2 &touchscreenList) -{ - if (touchscreenList == m_touchscreenList) - return; - - m_touchscreenList = touchscreenList; - - Q_EMIT touchscreenListChanged(); -} - -void DisplayModel::setTouchMap(const TouchscreenMap &touchMap) -{ - if (touchMap == m_touchMap) - return; - - m_touchMap = touchMap; - - Q_EMIT touchscreenMapChanged(); -} - -void DisplayModel::setAutoLightAdjust(bool ala) -{ - if (ala == m_isAutoLightAdjust) - return; - - m_isAutoLightAdjust = ala; - - Q_EMIT autoLightAdjustSettingChanged(m_isAutoLightAdjust); -} - -bool DisplayModel::redshiftIsValid() const -{ - return m_redshiftIsValid; -} - -void DisplayModel::setAdjustCCTmode(int mode) -{ - if (m_adjustCCTMode == mode) - return; - - m_adjustCCTMode = mode; - - Q_EMIT adjustCCTmodeChanged(mode); -} - -void DisplayModel::setColorTemperature(int value) -{ - if (m_colorTemperature == value) - return; - - m_colorTemperature = value; - - Q_EMIT colorTemperatureChanged(value); -} - -void DisplayModel::setRedshiftIsValid(bool redshiftIsValid) -{ - if (m_redshiftIsValid == redshiftIsValid) - return; - - m_redshiftIsValid = redshiftIsValid; - - Q_EMIT redshiftVaildChanged(redshiftIsValid); -} - -void DisplayModel::setAllowEnableMultiScaleRatio(bool allowEnableMultiScaleRatio) -{ - if (m_allowEnableMultiScaleRatio == allowEnableMultiScaleRatio) - return; - - m_allowEnableMultiScaleRatio = allowEnableMultiScaleRatio; -} - -void DisplayModel::setRefreshRateEnable(bool isEnable) -{ - m_RefreshRateEnable = isEnable; -} - -void DisplayModel::setmaxBacklightBrightness(const uint value) -{ - if (m_maxBacklightBrightness != value && value < 100) { - m_maxBacklightBrightness = value; - Q_EMIT maxBacklightBrightnessChanged(value); - } -} - -void DisplayModel::setResolutionRefreshEnable(const bool enable) -{ - if (m_resolutionRefreshEnable != enable) { - m_resolutionRefreshEnable = enable; - Q_EMIT resolutionRefreshEnableChanged(m_resolutionRefreshEnable); - } -} - -void DisplayModel::setBrightnessEnable(const bool enable) -{ - if (m_brightnessEnable != enable) { - m_brightnessEnable = enable; - Q_EMIT brightnessEnableChanged(m_brightnessEnable); - } -} - -void DisplayModel::checkAllSupportFillModes() -{ - for (auto m : monitorList()) { - if (m->availableFillModes().isEmpty()) { - m_allSupportFillModes = false; - return; - } - } - m_allSupportFillModes = true; -} diff --git a/dcc-old/src/plugin-display/operation/displaymodel.h b/dcc-old/src/plugin-display/operation/displaymodel.h deleted file mode 100644 index 707d4f00f6..0000000000 --- a/dcc-old/src/plugin-display/operation/displaymodel.h +++ /dev/null @@ -1,153 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DISPLAYMODEL_H -#define DISPLAYMODEL_H - -#include "math.h" - -#include -#include - -#include "interface/namespace.h" -#include "monitor.h" -#include "types/brightnessmap.h" -#include "types/touchscreeninfolist_v2.h" -#include "types/touchscreenmap.h" - -#define CUSTOM_MODE 0 -#define MERGE_MODE 1 -#define EXTEND_MODE 2 -#define SINGLE_MODE 3 - -namespace DCC_NAMESPACE { - -class DisplayWorker; -class DisplayModel : public QObject -{ - Q_OBJECT - -public: - friend class DisplayWorker; - -public: - explicit DisplayModel(QObject *parent = 0); - - double monitorScale(Monitor *moni); - inline int screenHeight() const { return m_screenHeight; } - inline int screenWidth() const { return m_screenWidth; } - inline int displayMode() const { return m_mode; } - inline double uiScale() const { return m_uiScale; } - inline double minimumBrightnessScale() const { return m_minimumBrightnessScale; } - inline const QString primary() const { return m_primary; } - inline const QList monitorList() const { return m_monitors; } - Monitor *primaryMonitor() const; - inline const QString defaultFillMode() { return "None"; } - - bool isNightMode() const; - void setIsNightMode(bool isNightMode); - - bool redshiftIsValid() const; - - inline int adjustCCTMode() const { return m_adjustCCTMode; } - void setAdjustCCTmode(int mode); - - inline int colorTemperature() const { return m_colorTemperature; } - void setColorTemperature(int value); - - inline bool autoLightAdjustIsValid() const { return m_AutoLightAdjustIsValid; } - - inline bool isAudtoLightAdjust() const { return m_isAutoLightAdjust; } - void setAutoLightAdjust(bool); - - inline BrightnessMap brightnessMap() const { return m_brightnessMap; } - void setBrightnessMap(const BrightnessMap &brightnessMap); - - inline TouchscreenInfoList_V2 touchscreenList() const { return m_touchscreenList; } - void setTouchscreenList(const TouchscreenInfoList_V2 &touchscreenList); - - inline TouchscreenMap touchMap() const { return m_touchMap; } - void setTouchMap(const TouchscreenMap &touchMap); - - inline bool allowEnableMultiScaleRatio() { return m_allowEnableMultiScaleRatio; } - void setAllowEnableMultiScaleRatio(bool allowEnableMultiScaleRatio); - - inline bool isRefreshRateEnable() const { return m_RefreshRateEnable; } - void setRefreshRateEnable(bool isEnable); - - inline uint maxBacklightBrightness() const { return m_maxBacklightBrightness; } - - inline bool resolutionRefreshEnable() const { return m_resolutionRefreshEnable; } - void setResolutionRefreshEnable(const bool enable); - - inline bool brightnessEnable() const { return m_brightnessEnable; } - void setBrightnessEnable(const bool enable); - - inline bool allSupportFillModes() const { return m_allSupportFillModes; } - void checkAllSupportFillModes(); - - -Q_SIGNALS: - void screenHeightChanged(const int h) const; - void screenWidthChanged(const int w) const; - void displayModeChanged(const int mode) const; - void uiScaleChanged(const double scale) const; - void minimumBrightnessScaleChanged(const double) const; - void primaryScreenChanged(const QString &primary) const; - void monitorListChanged() const; - void machinesListChanged() const; - void nightModeChanged(const bool nightmode) const; - void redshiftVaildChanged(const bool isvalid) const; - void autoLightAdjustSettingChanged(bool setting) const; - void autoLightAdjustVaildChanged(bool isvalid) const; - void touchscreenListChanged() const; - void touchscreenMapChanged() const; - void maxBacklightBrightnessChanged(uint value); - void adjustCCTmodeChanged(int mode); - void colorTemperatureChanged(int value); - void resolutionRefreshEnableChanged(const bool enable); - void brightnessEnableChanged(const bool enable); - void deviceSharingSwitchChanged(const bool enable); - void sharedClipboardChanged(bool on) const; - void sharedDevicesChanged(bool on) const; - void filesStoragePathChanged(const QString& path) const; - -private Q_SLOTS: - void setScreenHeight(const int h); - void setScreenWidth(const int w); - void setDisplayMode(const int mode); - void setUIScale(const double scale); - void setMinimumBrightnessScale(const double scale); - void setPrimary(const QString &primary); - void setRedshiftIsValid(bool redshiftIsValid); - void monitorAdded(Monitor *mon); - void monitorRemoved(Monitor *mon); - void setAutoLightAdjustIsValid(bool); - void setmaxBacklightBrightness(const uint value); - -private: - int m_screenHeight; - int m_screenWidth; - int m_mode {-1}; - int m_colorTemperature {0}; //当前色温对应的颜色值 - int m_adjustCCTMode {0}; //当前自动调节色温模式 0 不开启 1 自动调节 2 手动调节 - double m_uiScale; - double m_minimumBrightnessScale; - QString m_primary; - QList m_monitors; - bool m_redshiftIsValid; - bool m_RefreshRateEnable {false}; - bool m_isAutoLightAdjust {false}; - bool m_AutoLightAdjustIsValid {false}; - bool m_allowEnableMultiScaleRatio; - bool m_resolutionRefreshEnable; - bool m_brightnessEnable; - BrightnessMap m_brightnessMap; - TouchscreenInfoList_V2 m_touchscreenList; - TouchscreenMap m_touchMap; - uint m_maxBacklightBrightness {0}; - bool m_allSupportFillModes; -}; -} - -#endif // DISPLAYMODEL_H diff --git a/dcc-old/src/plugin-display/operation/displayworker.cpp b/dcc-old/src/plugin-display/operation/displayworker.cpp deleted file mode 100644 index 859b6ccafc..0000000000 --- a/dcc-old/src/plugin-display/operation/displayworker.cpp +++ /dev/null @@ -1,915 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2024 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "displayworker.h" -#include "displaymodel.h" -#include "widgets/utils.h" - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include - -Q_LOGGING_CATEGORY(DdcDisplayWorker, "dcc-display-worker") - - -const QString DisplayInterface("org.deepin.dde.Display1"); - -Q_DECLARE_METATYPE(QList) -using namespace DCC_NAMESPACE; - -DisplayWorker::DisplayWorker(DisplayModel *model, QObject *parent, bool isSync) - : QObject(parent) - , m_model(model) - , m_displayInter(new DisplayDBusProxy(this)) - , m_updateScale(false) - , m_timer(new QTimer(this)) - , m_dconfig(DConfig::create("org.deepin.dde.control-center", QStringLiteral("org.deepin.dde.control-center.display"), QString(), this)) -{ - // NOTE: what will it be used? - Q_UNUSED(isSync) - m_timer->setSingleShot(true); - m_timer->setInterval(200); - - if (WQt::Utils::isTreeland()) { - m_reg = new WQt::Registry(WQt::Wayland::display()); - m_reg->setup(); - auto *opMgr = m_reg->outputManager(); - if (!opMgr) { - qFatal("Unable to start the output manager"); - } - connect(opMgr, &WQt::OutputManager::done, this, [this]() { - onWlMonitorListChanged(); - }); - } else { - connect(m_displayInter, &DisplayDBusProxy::MonitorsChanged, this, &DisplayWorker::onMonitorListChanged); - connect(m_displayInter, &DisplayDBusProxy::BrightnessChanged, this, &DisplayWorker::onMonitorsBrightnessChanged); - connect(m_displayInter, &DisplayDBusProxy::BrightnessChanged, model, &DisplayModel::setBrightnessMap); - connect(m_displayInter, &DisplayDBusProxy::TouchscreensV2Changed, model, &DisplayModel::setTouchscreenList); - connect(m_displayInter, &DisplayDBusProxy::TouchMapChanged, model, &DisplayModel::setTouchMap); - connect(m_displayInter, &DisplayDBusProxy::ScreenHeightChanged, model, &DisplayModel::setScreenHeight); - connect(m_displayInter, &DisplayDBusProxy::ScreenWidthChanged, model, &DisplayModel::setScreenWidth); - connect(m_displayInter, &DisplayDBusProxy::DisplayModeChanged, model, &DisplayModel::setDisplayMode); - connect(m_displayInter, &DisplayDBusProxy::MaxBacklightBrightnessChanged, model, &DisplayModel::setmaxBacklightBrightness); - connect(m_displayInter, &DisplayDBusProxy::ColorTemperatureModeChanged, model, &DisplayModel::setAdjustCCTmode); - connect(m_displayInter, &DisplayDBusProxy::ColorTemperatureManualChanged, model, &DisplayModel::setColorTemperature); - connect(m_displayInter, static_cast(&DisplayDBusProxy::PrimaryChanged), model, &DisplayModel::setPrimary); - - //display redSfit/autoLight - connect(m_displayInter, &DisplayDBusProxy::HasAmbientLightSensorChanged, m_model, &DisplayModel::autoLightAdjustVaildChanged); - connect(m_timer, &QTimer::timeout, this, [=] { - m_displayInter->ApplyChanges().waitForFinished(); - m_displayInter->Save().waitForFinished(); - }); - } -} - -DisplayWorker::~DisplayWorker() -{ - qDeleteAll(m_monitors.keys()); - qDeleteAll(m_monitors.values()); -} - -void DisplayWorker::active() -{ - if (WQt::Utils::isTreeland()) { - m_reg->outputManager()->waitForDone(); - onWlMonitorListChanged(); - - m_model->setDisplayMode(EXTEND_MODE); // TODO: use dconfig - auto *treelandOpMgr = m_reg->treeLandOutputManager(); - m_model->setPrimary(treelandOpMgr->mPrimaryOutput); - connect(treelandOpMgr, &WQt::TreeLandOutputManager::primaryOutputChanged, this, [this](){ - m_model->setPrimary(m_reg->treeLandOutputManager()->mPrimaryOutput); - }); - - m_model->setResolutionRefreshEnable(true); - m_model->setBrightnessEnable(false); // TODO: support gamma effects - } else { - // m_model->setAllowEnableMultiScaleRatio( - // valueByQSettings(DCC_CONFIG_FILES, - // "Display", - // "AllowEnableMultiScaleRatio", - // false)); - - QDBusPendingCallWatcher *scalewatcher = new QDBusPendingCallWatcher(m_displayInter->GetScaleFactor()); - connect(scalewatcher, &QDBusPendingCallWatcher::finished, this, &DisplayWorker::onGetScaleFinished); - - QDBusPendingCallWatcher *screenscaleswatcher = new QDBusPendingCallWatcher(m_displayInter->GetScreenScaleFactors()); - connect(screenscaleswatcher, &QDBusPendingCallWatcher::finished, this, &DisplayWorker::onGetScreenScalesFinished); - - onMonitorsBrightnessChanged(m_displayInter->brightness()); - m_model->setBrightnessMap(m_displayInter->brightness()); - onMonitorListChanged(m_displayInter->monitors()); - - m_model->setDisplayMode(m_displayInter->displayMode()); - m_model->setTouchscreenList(m_displayInter->touchscreensV2()); - m_model->setTouchMap(m_displayInter->touchMap()); - m_model->setPrimary(m_displayInter->primary()); - m_model->setScreenHeight(m_displayInter->screenHeight()); - m_model->setScreenWidth(m_displayInter->screenWidth()); - m_model->setAdjustCCTmode(m_displayInter->colorTemperatureMode()); - m_model->setColorTemperature(m_displayInter->colorTemperatureManual()); - m_model->setmaxBacklightBrightness(m_displayInter->maxBacklightBrightness()); - m_model->setAutoLightAdjustIsValid(m_displayInter->hasAmbientLightSensor()); - - bool isRedshiftValid = true; - QDBusReply reply = m_displayInter->SupportSetColorTemperatureSync(); - if (QDBusError::NoError == reply.error().type()) - isRedshiftValid = reply.value(); - else - qCWarning(DdcDisplayWorker) << "Call SupportSetColorTemperature method failed: " << reply.error().message(); - m_model->setRedshiftIsValid(isRedshiftValid); - QVariant minBrightnessValue = 0.1f; - minBrightnessValue = m_dconfig->value("minBrightnessValue", minBrightnessValue); - m_model->setMinimumBrightnessScale(minBrightnessValue.toDouble()); - // m_model->setResolutionRefreshEnable(m_dccSettings->get(GSETTINGS_SHOW_MUTILSCREEN).toBool()); - // m_model->setBrightnessEnable(m_dccSettings->get(GSETTINGS_BRIGHTNESS_ENABLE).toBool()); - } -} - -void DisplayWorker::saveChanges() -{ - clearBackup(); - m_displayInter->Save().waitForFinished(); - if (m_updateScale) - setUiScale(m_currentScale); - m_updateScale = false; -} - -void DisplayWorker::switchMode(const int mode, const QString &name) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - m_model->setDisplayMode(mode); - int posX = 0; - - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - switch (mode) { - case MERGE_MODE: { - auto *cfgHead = opCfg->enableHead(it.value()); - cfgHead->setPosition({0, 0}); - break; - } - case EXTEND_MODE: { - auto *cfgHead = opCfg->enableHead(it.value()); - cfgHead->setPosition({posX, 0}); - posX += it.key()->w(); - break; - } - case SINGLE_MODE: { - if (it.key()->name() == name) { - auto *cfgHead = opCfg->enableHead(it.value()); - WQt::OutputMode *preferMode = nullptr; - for (auto *mode: it.value()->property(WQt::OutputHead::Modes).value>()) { - preferMode = mode; - if (mode->isPreferred()) - break; - } - cfgHead->setMode(preferMode); - cfgHead->setPosition({0, 0}); - } else { - opCfg->disableHead(it.value()); - } - break; - } - default: - break; - } - } - - opCfg->apply(); - } else { - m_displayInter->SwitchMode(static_cast(mode), name).waitForFinished(); - } -} - -void DisplayWorker::onMonitorListChanged(const QList &mons) -{ - QList ops; - for (const auto *mon : m_monitors.keys()) - ops << mon->path(); - - qCDebug(DdcDisplayWorker) << mons.size(); - QList pathList; - for (const auto &op : mons) { - const QString path = op.path(); - pathList << path; - if (!ops.contains(path)) - monitorAdded(path); - } - - for (const auto &op : ops) - if (!pathList.contains(op)) - monitorRemoved(op); -} - -void DisplayWorker::onWlMonitorListChanged() -{ - // Only check new output here, listen OutputHead::finished for remove - auto heads = m_reg->outputManager()->heads(); - - qCDebug(DdcDisplayWorker) << heads.size(); - for (auto *head : heads) { - bool isNew = true; - for (const auto *oldHead : m_wl_monitors.values()) - if (head == oldHead) { - isNew = false; - break; - } - if (isNew) - wlMonitorAdded(head); - } -} - -void DisplayWorker::onMonitorsBrightnessChanged(const BrightnessMap &brightness) -{ - if (brightness.isEmpty()) - return; - - for (auto it = m_monitors.begin(); it != m_monitors.end(); ++it) { - it.key()->setBrightness(brightness[it.key()->name()]); - } -} - -void DisplayWorker::onGetScaleFinished(QDBusPendingCallWatcher *w) -{ - QDBusPendingReply reply = w->reply(); - - m_model->setUIScale(reply); - - w->deleteLater(); -} - -void DisplayWorker::onGetScreenScalesFinished(QDBusPendingCallWatcher *w) -{ - QDBusPendingReply> reply = w->reply(); - QMap rmap = reply; - - for (auto &m : m_model->monitorList()) { - if (rmap.find(m->name()) != rmap.end()) { - m->setScale(rmap.value(m->name()) < 1.0 - ? m_model->uiScale() - : rmap.value(m->name())); - } - } - - w->deleteLater(); -} - -#ifndef DCC_DISABLE_ROTATE - -constexpr static int wlRotate2dcc(int wlRotate) { - switch (wlRotate) { - case WL_OUTPUT_TRANSFORM_NORMAL: - return 1; - case WL_OUTPUT_TRANSFORM_90: - return 2; - case WL_OUTPUT_TRANSFORM_180: - return 4; - case WL_OUTPUT_TRANSFORM_270: - return 8; - default: - qWarning("dcc dont support FLIPPED"); - return 0; - } -} - -constexpr static int dccRotate2wl(int dccRotate) { - switch (dccRotate) { - case 1: - return WL_OUTPUT_TRANSFORM_NORMAL; - case 2: - return WL_OUTPUT_TRANSFORM_90; - case 4: - return WL_OUTPUT_TRANSFORM_180; - case 8: - return WL_OUTPUT_TRANSFORM_270; - default: - qWarning("unkone dccRotate, feedback to normal"); - return WL_OUTPUT_TRANSFORM_NORMAL; - } -} - -void DisplayWorker::setMonitorRotate(Monitor *mon, const quint16 rotate) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - continue; - } - auto *cfgHead = opCfg->enableHead(it.value()); - if (m_model->displayMode() == MERGE_MODE || it.key() == mon) { - cfgHead->setTransform(dccRotate2wl(rotate)); - } - } - opCfg->apply(); - } else { - if (m_model->displayMode() == MERGE_MODE) { - for (auto *m : m_monitors) { - m->SetRotation(rotate).waitForFinished(); - } - } else { - MonitorDBusProxy *inter = m_monitors.value(mon); - inter->SetRotation(rotate).waitForFinished(); - } - } -} -#endif - -void DisplayWorker::setPrimary(const QString &name) -{ - if (WQt::Utils::isTreeland()) { - m_reg->treeLandOutputManager()->setPrimaryOutput(name.toStdString().c_str());; - } else { - m_displayInter->SetPrimary(name); - } -} - -void DisplayWorker::setMonitorEnable(Monitor *monitor, const bool enable) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (it.key() == monitor) { - if (enable) { - auto *cfgHead = opCfg->enableHead(it.value()); - WQt::OutputMode *preferMode = nullptr; - for (auto *mode: it.value()->property(WQt::OutputHead::Modes).value>()) { - preferMode = mode; - if (mode->isPreferred()) - break; - } - cfgHead->setMode(preferMode); - } else { - opCfg->disableHead(it.value()); - } - } else { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - } else { - opCfg->enableHead(it.value()); - } - } - } - opCfg->apply(); - } else { - MonitorDBusProxy *inter = m_monitors.value(monitor); - inter->Enable(enable).waitForFinished(); - applyChanges(); - } -} - -void DisplayWorker::applyChanges() -{ - if (!m_timer->isActive()) { - m_timer->start(); - } -} - -void DisplayWorker::setColorTemperature(int value) -{ - if (WQt::Utils::isTreeland()) { -#if GAMMA_SUPPORT - auto *gammaEffect = m_wl_gammaEffects->value(mon); - auto *gammaConfig = m_wl_gammaConfig->value(mon); - gammaConfig->temperature = value; - gammaEffect->setConfiguration(*gammaConfig); -#endif - } else { - m_displayInter->SetColorTemperature(value).waitForFinished(); - } -} - -void DisplayWorker::SetMethodAdjustCCT(int mode) -{ - m_displayInter->SetMethodAdjustCCT(mode); -} - -void DisplayWorker::setCurrentFillMode(Monitor *mon,const QString fillMode) -{ - if (WQt::Utils::isTreeland()) { - // TODO: support treeland - } else { - MonitorDBusProxy *inter = m_monitors.value(mon); - Q_ASSERT(inter); - inter->setCurrentFillMode(fillMode); - } -} - -void DisplayWorker::backupConfig() -{ - m_displayConfig = m_displayInter->GetConfig(); -} - -void DisplayWorker::clearBackup() -{ - m_displayConfig.clear(); -} - -void DisplayWorker::resetBackup() -{ - //TODO: can't use in treeland - if (!m_displayConfig.isEmpty()) { - - QJsonDocument doc = QJsonDocument::fromJson(m_displayConfig.toLatin1()); - QJsonObject jsonObj = doc.object(); - - QDateTime time = QDateTime::currentDateTime(); - int offset = time.offsetFromUtc()/60; - bool negative = offset <0; - if (negative) - offset = -offset; - - jsonObj.insert("UpdateAt", QString("%1%2%3:%4").arg(time.toString("yyyy-MM-ddThh:mm:ss.zzz000000")).arg(negative ? '-' : '+').arg(offset / 60, 2, 10, QChar('0')).arg(offset % 60, 2, 10, QChar('0'))); - doc.setObject(jsonObj); - - m_displayInter->SetConfig(doc.toJson(QJsonDocument::Compact)); - clearBackup(); - } -} - -void DisplayWorker::setMonitorResolution(Monitor *mon, const int mode) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - auto res = mon->getResolutionById(mode); - if (!res.has_value()) - return; - - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - continue; - } - auto *cfgHead = opCfg->enableHead(it.value()); - if (it.key() == mon) { - for (auto *mode: it.value()->property(WQt::OutputHead::Modes).value>()) { - if (mode->size().width() == res.value().width() - && mode->size().height() == res.value().height() - && qFuzzyCompare(mode->refreshRate()*0.001, res.value().rate())) { - cfgHead->setMode(mode); - break; - } - } - } - } - opCfg->apply(); - } else { - MonitorDBusProxy *inter = m_monitors.value(mon); - if (inter) - inter->SetMode(static_cast(mode)).waitForFinished(); - } -} - -void DisplayWorker::setMonitorBrightness(Monitor *mon, const double brightness) -{ - if (WQt::Utils::isTreeland()) { -#if GAMMA_SUPPORT - auto *gammaEffect = m_wl_gammaEffects->value(mon); - auto *gammaConfig = m_wl_gammaConfig->value(mon); - gammaConfig->brightness = brightness; - gammaEffect->setConfiguration(*gammaConfig); -#endif - } else { - m_displayInter->SetAndSaveBrightness(mon->name(), std::max(brightness, m_model->minimumBrightnessScale())).waitForFinished(); - } -} - -void DisplayWorker::setMonitorPosition(QHash> monitorPosition) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - for (auto it(monitorPosition.cbegin()); it != monitorPosition.cend(); ++it) { - auto *head = m_wl_monitors.value(it.key()); - Q_ASSERT(head); - if (!it.key()->enable()) { - opCfg->disableHead(head); - continue; - } - auto *cfgHead = opCfg->enableHead(head); - cfgHead->setPosition({ it.value().first, it.value().second }); - } - opCfg->apply(); - } else { - for (auto it(monitorPosition.cbegin()); it != monitorPosition.cend(); ++it) { - MonitorDBusProxy *inter = m_monitors.value(it.key()); - Q_ASSERT(inter); - inter->SetPosition(static_cast(it.value().first), static_cast(it.value().second)).waitForFinished(); - } - applyChanges(); - } -} - -void DisplayWorker::setUiScale(const double value) -{ - double rv = value; - if (rv < 0) - rv = m_model->uiScale(); - for (auto &mm : m_model->monitorList()) { - mm->setScale(-1); - } - - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - continue; - } - auto *cfgHead = opCfg->enableHead(it.value()); - cfgHead->setScale(rv); - } - opCfg->apply(); - connect(opCfg, &WQt::OutputConfiguration::succeeded, this, [ this, rv ]() { - m_model->setUIScale(rv); - }); - } else { - QDBusPendingCall call = m_displayInter->SetScaleFactor(rv); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - watcher->waitForFinished(); - if (!watcher->isError()) { - m_model->setUIScale(rv); - } - watcher->deleteLater(); - } -} - -void DisplayWorker::setIndividualScaling(Monitor *m, const double scaling) -{ - if (m && scaling >= 1.0) { - m->setScale(scaling); - } else { - return; - } - - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - continue; - } - auto *cfgHead = opCfg->enableHead(it.value()); - if (it.key() == m) { - cfgHead->setScale(scaling); - } - } - opCfg->apply(); - } else { - QMap scalemap; - for (Monitor *m : m_model->monitorList()) { - scalemap[m->name()] = m_model->monitorScale(m); - } - m_displayInter->SetScreenScaleFactors(scalemap); - } -} - -void DisplayWorker::setNightMode(const bool nightmode) -{ - if (WQt::Utils::isTreeland()) { - // TODO: support treeland - } else { - QProcess *process = new QProcess(this); - - QString cmd; - QString serverCmd; - if (nightmode) { - cmd = "start"; - serverCmd = "enable"; - } else { - cmd = "stop"; - serverCmd = "disable"; - } - - connect(process, static_cast(&QProcess::finished), process, &QProcess::deleteLater); - - process->start("bash", QStringList() << "-c" << QString("systemctl --user %1 redshift.service && systemctl --user %2 redshift.service").arg(serverCmd).arg(cmd)); - } -} - -void DisplayWorker::monitorAdded(const QString &path) -{ - MonitorDBusProxy *inter = new MonitorDBusProxy(path, this); - Monitor *mon = new Monitor(this); - - connect(inter, &MonitorDBusProxy::XChanged, mon, &Monitor::setX); - connect(inter, &MonitorDBusProxy::YChanged, mon, &Monitor::setY); - connect(inter, &MonitorDBusProxy::WidthChanged, mon, &Monitor::setW); - connect(inter, &MonitorDBusProxy::HeightChanged, mon, &Monitor::setH); - connect(inter, &MonitorDBusProxy::MmWidthChanged, mon, &Monitor::setMmWidth); - connect(inter, &MonitorDBusProxy::MmHeightChanged, mon, &Monitor::setMmHeight); - connect(inter, &MonitorDBusProxy::RotationChanged, mon, &Monitor::setRotate); - connect(inter, &MonitorDBusProxy::NameChanged, mon, &Monitor::setName); - connect(inter, &MonitorDBusProxy::CurrentModeChanged, mon, &Monitor::setCurrentMode); - connect(inter, &MonitorDBusProxy::BestModeChanged, mon, &Monitor::setBestMode); - connect(inter, &MonitorDBusProxy::CurrentModeChanged, this, [=](Resolution value) { - if (value.id() == 0) { - return; - } - auto maxWScale = value.width() / 1024.0; - auto maxHScale = value.height() / 768.0; - auto maxScale = maxWScale < maxHScale ? maxWScale : maxHScale; - if ((m_model->uiScale() - maxScale) > 0.01 && maxScale >= 1.0) { - m_currentScale = 1.0; - for (int idx = 0; idx * 0.25 + 1.0 <= maxScale; ++idx) { - m_currentScale = idx * 0.25 + 1.0; - } - m_updateScale = true; - } - }); - - connect(inter, &MonitorDBusProxy::ModesChanged, mon, &Monitor::setModeList); - connect(inter, &MonitorDBusProxy::RotationsChanged, mon, &Monitor::setRotateList); - connect(inter, &MonitorDBusProxy::EnabledChanged, mon, &Monitor::setMonitorEnable); - connect(inter, &MonitorDBusProxy::CurrentRotateModeChanged, mon, &Monitor::setCurrentRotateMode); - connect(inter, &MonitorDBusProxy::AvailableFillModesChanged, mon, &Monitor::setAvailableFillModes); - connect(inter, &MonitorDBusProxy::CurrentFillModeChanged, mon, &Monitor::setCurrentFillMode); - connect(m_displayInter, static_cast(&DisplayDBusProxy::PrimaryChanged), mon, &Monitor::setPrimary); - connect(this, &DisplayWorker::requestUpdateModeList, this, [=] { - mon->setModeList(inter->modes()); - }); - - // NOTE: DO NOT using async dbus call. because we need to have a unique name to distinguish each monitor - mon->setName(inter->name()); - mon->setManufacturer(inter->manufacturer()); - mon->setModel(inter->model()); - QDBusReply reply = m_displayInter->CanSetBrightnessSync(inter->name()); - mon->setCanBrightness(reply.value()); - mon->setMonitorEnable(inter->enabled()); - mon->setCurrentRotateMode(inter->currentRotateMode()); - mon->setMonitorEnable(inter->enabled()); - mon->setCurrentFillMode(inter->currentFillMode()); - mon->setAvailableFillModes(inter->availableFillModes()); - mon->setPath(path); - mon->setX(inter->x()); - mon->setY(inter->y()); - mon->setW(inter->width()); - mon->setH(inter->height()); - mon->setRotate(inter->rotation()); - mon->setCurrentMode(inter->currentMode()); - mon->setBestMode(inter->bestMode()); - mon->setModeList(inter->modes()); - if (m_model->isRefreshRateEnable() == false) { - for (auto resolutionModel : mon->modeList()) { - if (qFuzzyCompare(resolutionModel.rate(), 0.0) == false) { - m_model->setRefreshRateEnable(true); - } - } - } - mon->setRotateList(inter->rotations()); - mon->setPrimary(m_displayInter->primary()); - mon->setMmWidth(inter->mmWidth()); - mon->setMmHeight(inter->mmHeight()); - - if (!m_model->brightnessMap().isEmpty()) { - mon->setBrightness(m_model->brightnessMap()[mon->name()]); - } - - m_model->monitorAdded(mon); - m_monitors.insert(mon, inter); -} - -void DisplayWorker::monitorRemoved(const QString &path) -{ - Monitor *monitor = nullptr; - for (auto it(m_monitors.cbegin()); it != m_monitors.cend(); ++it) { - if (it.key()->path() == path) { - monitor = it.key(); - break; - } - } - if (!monitor) - return; - - m_model->monitorRemoved(monitor); - - m_monitors[monitor]->deleteLater(); - m_monitors.remove(monitor); - - monitor->deleteLater(); -} - -static inline Resolution createResolutionFromMode(WQt::OutputMode *mode) { - static int idcount = 0; - Resolution res; - res.m_id = ++idcount; - res.m_width = mode->size().width(); - res.m_height = mode->size().height(); - res.m_rate = mode->refreshRate() * 0.001; - return res; -} - -void DisplayWorker::wlMonitorAdded(WQt::OutputHead *head) -{ - Monitor *mon = new Monitor(this); - - connect(head, &WQt::OutputHead::finished, this, [head, this]() { - wlMonitorRemoved(head); - }); - - connect(head, &WQt::OutputHead::changed, mon, [mon, head](WQt::OutputHead::Property type) { - switch (type) { - case WQt::OutputHead::Name: - mon->setName(head->property(WQt::OutputHead::Name).toString()); - break; - case WQt::OutputHead::PhysicalSize: { - auto physicalSize = head->property(WQt::OutputHead::PhysicalSize).toSize(); - mon->setMmWidth(physicalSize.width()); - mon->setMmHeight(physicalSize.height()); - break; - } - case WQt::OutputHead::Modes: { - ResolutionList resolutionList; - for (auto *mode: head->property(WQt::OutputHead::Modes).value>()) { - Resolution res = createResolutionFromMode(mode); - resolutionList << res; - if (mode->isPreferred()) { - mon->setBestMode(res); - } - } - mon->setModeList(resolutionList); - break; - } - case WQt::OutputHead::CurrentMode: { - Resolution currentRes = createResolutionFromMode(head->property(WQt::OutputHead::CurrentMode).value()); - mon->setCurrentMode(currentRes); - mon->setW(currentRes.width()); - mon->setH(currentRes.height()); - break; - } - case WQt::OutputHead::Position: - mon->setX(head->property(WQt::OutputHead::Position).toPoint().x()); - mon->setY(head->property(WQt::OutputHead::Position).toPoint().y()); - break; - case WQt::OutputHead::Transform: - mon->setRotate(wlRotate2dcc(head->property(WQt::OutputHead::Transform).toInt())); - break; - case WQt::OutputHead::Scale: - mon->setScale(head->property(WQt::OutputHead::Scale).toFloat()); - break; - case WQt::OutputHead::Make: - mon->setManufacturer(head->property(WQt::OutputHead::Make).toString()); - break; - case WQt::OutputHead::Model: - mon->setModel(head->property(WQt::OutputHead::Model).toString()); - break; - case WQt::OutputHead::Enabled: - case WQt::OutputHead::Description: - case WQt::OutputHead::SerialNumber: - // Not handle - default: - break; - } - }); - - // TODO: where to get UI Scale for model - m_model->setUIScale(head->property(WQt::OutputHead::Scale).toFloat()); - mon->setScale(head->property(WQt::OutputHead::Scale).toFloat()); - - // NOTE: we need to have a unique name to distinguish each monitor - mon->setName(head->property(WQt::OutputHead::Name).toString()); - mon->setManufacturer(head->property(WQt::OutputHead::Make).toString()); - mon->setModel(head->property(WQt::OutputHead::Model).toString()); - mon->setMonitorEnable(head->property(WQt::OutputHead::Enabled).toBool()); - mon->setCanBrightness(true); - - mon->setX(head->property(WQt::OutputHead::Position).toPoint().x()); - mon->setY(head->property(WQt::OutputHead::Position).toPoint().y()); - - mon->setRotateList({1, 2, 4, 8}); - mon->setRotate(wlRotate2dcc(head->property(WQt::OutputHead::Transform).toInt())); - - ResolutionList resolutionList; - for (auto *mode: head->property(WQt::OutputHead::Modes).value>()) { - Resolution res = createResolutionFromMode(mode); - resolutionList << res; - if (mode->isPreferred()) { - mon->setBestMode(res); - } - } - mon->setModeList(resolutionList); - - Resolution currentRes = createResolutionFromMode(head->property(WQt::OutputHead::CurrentMode).value()); - mon->setCurrentMode(currentRes); - mon->setW(currentRes.width()); - mon->setH(currentRes.height()); - - if (m_model->isRefreshRateEnable() == false) { - for (auto resolutionModel : mon->modeList()) { - if (qFuzzyCompare(resolutionModel.rate(), 0.0) == false) { - m_model->setRefreshRateEnable(true); - } - } - } - mon->setPrimary(m_reg->treeLandOutputManager()->mPrimaryOutput); - - auto physicalSize = head->property(WQt::OutputHead::PhysicalSize).toSize(); - mon->setMmWidth(physicalSize.width()); - mon->setMmHeight(physicalSize.height()); - - - m_model->monitorAdded(mon); - m_wl_monitors.insert(mon, head); - -#if GAMMA_SUPPORT - auto *gammaMgr = m_reg->gammaControlManager(); - auto *gammaEffect = new DFL::GammaEffects(gammaMgr->getGammaControl(op->get())); - auto *effectsConfig = new DFL::GammaEffectsConfig; - effectsConfig->mode = 0x8EC945; - effectsConfig->gamma = 0.5; - effectsConfig->brightness = 0.3; - effectsConfig->minTemp = 4000; - effectsConfig->maxTemp = 6500; - effectsConfig->temperature = 6500; - effectsConfig->latitude = 0; // How to get - effectsConfig->longitude = 0; - effectsConfig->sunrise = QTime( 6, 30, 0 ); - effectsConfig->sunset = QTime( 18, 30, 0 ); - effectsConfig->whitepoint = { 0, 0, 0 }; - - // gammaEffect->setConfiguration(config); - m_wl_gammaEffects->insert(mon, gammaEffect); - m_wl_gammaConfig->insert(mon, effectsConfig); -#endif -} - -void DisplayWorker::wlMonitorRemoved(WQt::OutputHead *head) -{ - Monitor *monitor = nullptr; - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (it.value() == head) { - monitor = it.key(); - break; - } - } - if (!monitor) - return; - - m_model->monitorRemoved(monitor); - -#if GAMMA_SUPPORT - //delete m_wl_gammaConfig[monitor]; - //delete m_wl_gammaEffects[monitor]; -#endif - head->deleteLater(); - - m_wl_monitors.remove(monitor); - - monitor->deleteLater(); -} - -void DisplayWorker::setAmbientLightAdjustBrightness(bool able) -{ - m_displayInter->setAmbientLightAdjustBrightness(able); -} - -void DisplayWorker::setTouchScreenAssociation(const QString &monitor, const QString &touchscreenUUID) -{ - m_displayInter->AssociateTouch(monitor, touchscreenUUID); -} - -void DisplayWorker::setMonitorResolutionBySize(Monitor *mon, const int width, const int height) -{ - if (WQt::Utils::isTreeland()) { - auto *opCfg = m_reg->outputManager()->createConfiguration(); - for (auto it(m_wl_monitors.cbegin()); it != m_wl_monitors.cend(); ++it) { - if (!it.key()->enable()) { - opCfg->disableHead(it.value()); - continue; - } - auto *cfgHead = opCfg->enableHead(it.value()); - if (it.key() == mon) - cfgHead->setCustomMode({width, height}, mon->currentMode().rate()); - } - opCfg->apply(); - } else { - MonitorDBusProxy *inter = m_monitors.value(mon); - Q_ASSERT(inter); - - QDBusPendingCall call = inter->SetModeBySize(static_cast(width), static_cast(height)); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - qCDebug(DdcDisplayWorker) << call.error().message(); - } - watcher->deleteLater(); - }); - watcher->waitForFinished(); - } -} diff --git a/dcc-old/src/plugin-display/operation/displayworker.h b/dcc-old/src/plugin-display/operation/displayworker.h deleted file mode 100644 index 26de22988d..0000000000 --- a/dcc-old/src/plugin-display/operation/displayworker.h +++ /dev/null @@ -1,113 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2024 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DISPLAYWORKER_H -#define DISPLAYWORKER_H - -#include "interface/namespace.h" -#include "displaydbusproxy.h" -#include "monitor.h" - -#include - -#include -#include -#include - -#define GAMMA_SUPPORT false -/* - * Disable gamma support for treeland now - * We can't keep GammaTable when dde-control-center close - * We need write a daemon in future - */ - -DCORE_BEGIN_NAMESPACE -class DConfig; -DCORE_END_NAMESPACE - -namespace WQt { - class Output; - class Registry; - class OutputHead; -} - -namespace DCC_NAMESPACE { -class DisplayModel; -class DisplayWorker : public QObject -{ - Q_OBJECT - -public: - explicit DisplayWorker(DisplayModel *model, QObject *parent = nullptr, bool isSync = false); - ~DisplayWorker(); - - void active(); - -public Q_SLOTS: - void saveChanges(); - void switchMode(const int mode, const QString &name); - void setPrimary(const QString &name); - void setMonitorEnable(Monitor *monitor, const bool enable); - void applyChanges(); - void setColorTemperature(int value); - void SetMethodAdjustCCT(int mode); -#ifndef DCC_DISABLE_ROTATE - void setMonitorRotate(Monitor *mon, const quint16 rotate); -#endif - void setMonitorResolution(Monitor *mon, const int mode); - void setMonitorBrightness(Monitor *mon, const double brightness); - void setMonitorPosition(QHash> monitorPosition); - void setUiScale(const double value); - void setIndividualScaling(Monitor *m, const double scaling); - void setNightMode(const bool nightmode); - void setTouchScreenAssociation(const QString &monitor, const QString &touchscreenUUID); - void setMonitorResolutionBySize(Monitor *mon, const int width, const int height); - void setAmbientLightAdjustBrightness(bool); - void setCurrentFillMode(Monitor *mon, const QString fillMode); - - void backupConfig(); - void clearBackup(); - void resetBackup(); - -private Q_SLOTS: - void onMonitorListChanged(const QList &mons); - void onMonitorsBrightnessChanged(const BrightnessMap &brightness); - void onGetScaleFinished(QDBusPendingCallWatcher *w); - void onGetScreenScalesFinished(QDBusPendingCallWatcher *w); - - // for wlroots-based compositors - void onWlMonitorListChanged(); - -private: - void monitorAdded(const QString &path); - void monitorRemoved(const QString &path); - - // for wlroots-based compositors - void wlMonitorAdded(WQt::OutputHead *head); - void wlMonitorRemoved(WQt::OutputHead *head); - -Q_SIGNALS: - void requestUpdateModeList(); - -private: - DisplayModel *m_model; - DisplayDBusProxy *m_displayInter; - QMap m_monitors; - - // for wlroots-based compositors - WQt::Registry *m_reg { nullptr }; - QMap m_wl_monitors; -#if GAMMA_SUPPORT - QMap *m_wl_gammaEffects; - QMap *m_wl_gammaConfig; -#endif - - double m_currentScale; - bool m_updateScale; - QTimer *m_timer; - DTK_CORE_NAMESPACE::DConfig *m_dconfig; - QString m_displayConfig; -}; -} - -#endif // DISPLAYWORKER_H diff --git a/dcc-old/src/plugin-display/operation/monitor.cpp b/dcc-old/src/plugin-display/operation/monitor.cpp deleted file mode 100644 index f0ef7693a0..0000000000 --- a/dcc-old/src/plugin-display/operation/monitor.cpp +++ /dev/null @@ -1,294 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "monitor.h" - -#include -#include - - -using namespace DCC_NAMESPACE; -const double DoubleZero = 0.000001; - -Monitor::Monitor(QObject *parent) - : QObject(parent) - , m_x(0) - , m_y(0) - , m_w(0) - , m_h(0) - , m_mmWidth(0) - , m_mmHeight(0) - , m_scale(-1.0) - , m_rotate(0) - , m_brightness(1.0) - , m_enable(false) - , m_canBrightness(true) - , m_screenSensingMode(RotateMode::Normal) -{ -} - -void Monitor::setX(const int x) -{ - if (m_x == x) - return; - - m_x = x; - - Q_EMIT xChanged(m_x); - Q_EMIT geometryChanged(); -} - -void Monitor::setY(const int y) -{ - if (m_y == y) - return; - - m_y = y; - - Q_EMIT yChanged(m_y); - Q_EMIT geometryChanged(); -} - -void Monitor::setW(const int w) -{ - if (m_w == w) - return; - - m_w = w; - - Q_EMIT wChanged(m_w); -} - -void Monitor::setH(const int h) -{ - if (m_h == h) - return; - - m_h = h; - - Q_EMIT hChanged(m_h); -} - -void Monitor::setMmWidth(const uint mmWidth) -{ - m_mmWidth = mmWidth; -} - -void Monitor::setMmHeight(const uint mmHeight) -{ - m_mmHeight = mmHeight; -} - -void Monitor::setScale(const double scale) -{ - if (fabs(m_scale - scale) < DoubleZero) - return; - - m_scale = scale; - - Q_EMIT scaleChanged(m_scale); -} - -void Monitor::setPrimary(const QString &primaryName) -{ - m_primary = primaryName; -} - -void Monitor::setRotate(const quint16 rotate) -{ - if (m_rotate == rotate) - return; - - m_rotate = rotate; - - Q_EMIT rotateChanged(m_rotate); -} - -void Monitor::setBrightness(const double brightness) -{ - if (fabs(m_brightness - brightness) < DoubleZero) - return; - - m_brightness = brightness; - - Q_EMIT brightnessChanged(m_brightness); -} - -void Monitor::setName(const QString &name) -{ - m_name = name; -} - -void Monitor::setManufacturer(const QString &manufacturer) -{ - m_manufacturer = manufacturer; -} - -void Monitor::setModel(const QString &model) -{ - m_model = model; -} - -void Monitor::setCanBrightness(bool canBrightness) -{ - m_canBrightness = canBrightness; -} - -void Monitor::setPath(const QString &path) -{ - m_path = path; -} - -void Monitor::setRotateList(const QList &rotateList) -{ - m_rotateList = rotateList; -} - -void Monitor::setCurrentMode(const Resolution &resolution) -{ - m_currentMode = resolution; - - Q_EMIT currentModeChanged(m_currentMode); -} - -bool compareResolution(const Resolution &first, const Resolution &second) -{ - long firstSum = long(first.width()) * first.height(); - long secondSum = long(second.width()) * second.height(); - if (firstSum > secondSum - || (firstSum == secondSum && (first.rate() - second.rate()) > 0.000001)) { - return true; - } - - return false; -} - -void Monitor::setModeList(const ResolutionList &modeList) -{ - m_modeList.clear(); - - QList miniMode; - miniMode << 1024 << 768; - - for (auto m : modeList) { - if (m.width() >= miniMode.at(0) && m.height() >= miniMode.at(1)) { - m_modeList.append(m); - } - } - std::sort(m_modeList.begin(), m_modeList.end(), compareResolution); - - Q_EMIT modelListChanged(m_modeList); -} - - -void Monitor::setAvailableFillModes(const QStringList &fillModeList) -{ - if (m_fillModeList == fillModeList) - return; - - m_fillModeList = fillModeList; - Q_EMIT availableFillModesChanged(m_fillModeList); -} - -void Monitor::setCurrentFillMode(const QString currentFillMode) -{ - if (m_currentFillMode == currentFillMode) - return; - - m_currentFillMode = currentFillMode; - Q_EMIT currentFillModeChanged(currentFillMode); -} - -void Monitor::setMonitorEnable(bool enable) -{ - if (m_enable == enable) - return; - - m_enable = enable; - Q_EMIT enableChanged(enable); -} - -void Monitor::setBestMode(const Resolution &mode) -{ - if (m_bestMode == mode) - return; - m_bestMode = mode; - - Q_EMIT bestModeChanged(); -} - -void Monitor::setCurrentRotateMode(const unsigned char mode) -{ - RotateMode screenDate = static_cast(mode); - if (screenDate == RotateMode::Gravity) - Q_EMIT currentRotateModeChanged(); - - if (m_screenSensingMode != screenDate) { - m_screenSensingMode = screenDate; - } -} - -bool Monitor::isSameResolution(const Resolution &r1, const Resolution &r2) -{ - return r1.width() == r2.width() && r1.height() == r2.height(); -} - -bool Monitor::isSameRatefresh(const Resolution &r1, const Resolution &r2) -{ - return fabs(r1.rate() - r2.rate()) < 0.000001; -} - -bool Monitor::hasResolution(const Resolution &r) -{ - for (auto m : m_modeList) { - if (isSameResolution(m, r)) { - return true; - } - } - - return false; -} - -bool Monitor::hasResolutionAndRate(const Resolution &r) -{ - for (auto m : m_modeList) { - if (fabs(m.rate() - r.rate()) < 0.000001 && m.width() == r.width() && m.height() == r.height()) { - return true; - } - } - - return false; -} - -bool Monitor::hasRatefresh(const double r) -{ - for (auto m : m_modeList) { - if (fabs(m.rate() - r) < 0.000001) { - return true; - } - } - - return false; -} - -QScreen *Monitor::getQScreen() -{ - auto screens = QGuiApplication::screens(); - - for(auto screen : screens) { - //x11下,qt获取的名字和后端给的名字一致 wayland下,qt获取的序列号中包含名称 - if(screen->name() == name() || screen->model().contains(name())) - return screen; - } - - return nullptr; -} - -std::optional Monitor::getResolutionById(quint32 id) -{ - for (auto res : m_modeList) { - if (res.id() == id) - return res; - } - return std::nullopt; -} diff --git a/dcc-old/src/plugin-display/operation/monitor.h b/dcc-old/src/plugin-display/operation/monitor.h deleted file mode 100644 index b7e593246a..0000000000 --- a/dcc-old/src/plugin-display/operation/monitor.h +++ /dev/null @@ -1,151 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MONITOR_H -#define MONITOR_H - -#include "interface/namespace.h" -#include "monitordbusproxy.h" - -#include -#include - -#include - -namespace DCC_NAMESPACE { - -class DisplayWorker; -class TouchscreenWorker; -class Monitor : public QObject -{ - Q_OBJECT - friend class DisplayWorker; - friend class TouchscreenWorker; - -public: - enum RotateMode { - Normal, - Gravity, - Rotate - }; - -public: - explicit Monitor(QObject *parent = 0); - - inline int x() const { return m_x; } - inline int y() const { return m_y; } - inline int w() const { return m_w; } - inline int h() const { return m_h; } - inline int mmWidth() const { return m_mmWidth; } - inline int mmHeight() const { return m_mmHeight; } - inline double scale() const { return m_scale; } - inline bool isPrimary() const { return m_primary == m_name; } - inline quint16 rotate() const { return m_rotate; } - inline double brightness() const { return m_brightness; } - inline const QRect rect() const { return QRect(m_x, m_y, m_w, m_h); } - inline const QString name() const - { - Q_ASSERT(!m_name.isEmpty()); - return m_name; - } - inline const QString manufacturer() const - { - Q_ASSERT(!m_manufacturer.isEmpty()); - return m_manufacturer; - } - inline const QString model() const - { - Q_ASSERT(!m_model.isEmpty()); - return m_model; - } - inline bool canBrightness() const { return m_canBrightness; } - inline const QString path() const { return m_path; } - inline const Resolution currentMode() const { return m_currentMode; } - inline const QList rotateList() const { return m_rotateList; } - inline const QList modeList() const { return m_modeList; } - inline bool enable() const { return m_enable; } - inline QStringList availableFillModes() const { return m_fillModeList; } - inline QString currentFillMode() const { return m_currentFillMode; } - inline const Resolution bestMode() const { return m_bestMode; } - inline RotateMode currentRotateMode() const { return m_screenSensingMode; } - -Q_SIGNALS: - void geometryChanged() const; - void xChanged(const int x) const; - void yChanged(const int y) const; - void wChanged(const int w) const; - void hChanged(const int h) const; - void scaleChanged(const double scale) const; - void rotateChanged(const quint16 rotate) const; - void brightnessChanged(const double brightness) const; - void currentModeChanged(const Resolution &resolution) const; - void modelListChanged(const QList &resolution) const; - void enableChanged(bool enable) const; - void bestModeChanged() const; - void availableFillModesChanged(const QStringList &fillModeList); - // TODO: 重力旋转 - void currentRotateModeChanged() const; - void currentFillModeChanged(QString currentFillMode) const; - -public: - static bool isSameResolution(const Resolution &r1, const Resolution &r2); - static bool isSameRatefresh(const Resolution &r1, const Resolution &r2); - bool hasResolution(const Resolution &r); - bool hasResolutionAndRate(const Resolution &r); - bool hasRatefresh(const double r); - QScreen *getQScreen(); - -private Q_SLOTS: - void setX(const int x); - void setY(const int y); - void setW(const int w); - void setH(const int h); - void setMmWidth(const uint mmWidth); - void setMmHeight(const uint mmHeight); - void setScale(const double scale); - void setPrimary(const QString &primaryName); - void setRotate(const quint16 rotate); - void setBrightness(const double brightness); - void setName(const QString &name); - void setManufacturer(const QString &manufacturer); - void setModel(const QString &model); - void setCanBrightness(bool canBrightness); - void setPath(const QString &path); - void setRotateList(const QList &rotateList); - void setCurrentMode(const Resolution &resolution); - void setModeList(const ResolutionList &modeList); - void setMonitorEnable(bool enable); - void setBestMode(const Resolution &mode); - void setCurrentRotateMode(const unsigned char mode); - void setAvailableFillModes(const QStringList &fillModeList); - void setCurrentFillMode(const QString currentFillMode); - std::optional getResolutionById(quint32 id); - -private: - int m_x; - int m_y; - int m_w; - int m_h; - uint m_mmWidth; - uint m_mmHeight; - double m_scale; - quint16 m_rotate; - double m_brightness; - QString m_name; - QString m_manufacturer; - QString m_model; - QString m_path; - QString m_primary; - Resolution m_currentMode; - QList m_rotateList; - QList m_modeList; - bool m_enable; - bool m_canBrightness; - Resolution m_bestMode; - RotateMode m_screenSensingMode; - QStringList m_fillModeList; - QString m_currentFillMode; -}; -} - -#endif // MONITOR_H diff --git a/dcc-old/src/plugin-display/operation/monitordbusproxy.cpp b/dcc-old/src/plugin-display/operation/monitordbusproxy.cpp deleted file mode 100644 index 6a8dc20d4f..0000000000 --- a/dcc-old/src/plugin-display/operation/monitordbusproxy.cpp +++ /dev/null @@ -1,216 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "monitordbusproxy.h" - -#include -#include -#include -#include -#include -#include - -const static QString MonitorService = "org.deepin.dde.Display1"; -const static QString MonitorInterface = "org.deepin.dde.Display1.Monitor"; - -const static QString PropertiesInterface = "org.freedesktop.DBus.Properties"; -const static QString PropertiesChanged = "PropertiesChanged"; - -MonitorDBusProxy::MonitorDBusProxy(QString monitorPath, QObject *parent) - : QObject(parent) - , m_monitorUserPath(monitorPath) -{ - registerResolutionMetaType(); - registerReflectListMetaType(); - registerRotationListMetaType(); - registerResolutionListMetaType(); - - init(); -} - -void MonitorDBusProxy::init() -{ - m_dBusMonitorInter = new QDBusInterface(MonitorService, m_monitorUserPath, MonitorInterface, QDBusConnection::sessionBus(), this); - m_dBusMonitorPropertiesInter = new QDBusInterface(MonitorService, m_monitorUserPath, PropertiesInterface, QDBusConnection::sessionBus(), this); - QDBusConnection dbusConnection = m_dBusMonitorInter->connection(); - dbusConnection.connect(MonitorService, m_monitorUserPath, PropertiesInterface, PropertiesChanged, this, SLOT(onPropertiesChanged(QDBusMessage))); -} - -QStringList MonitorDBusProxy::availableFillModes() -{ - return qvariant_cast(m_dBusMonitorInter->property("AvailableFillModes")); -} - -Resolution MonitorDBusProxy::bestMode() -{ - Resolution val; - m_dBusMonitorPropertiesInter->call("Get", MonitorInterface, "BestMode").arguments().at(0).value().variant().value() >> val; - return val; -} - -bool MonitorDBusProxy::connected() -{ - return qvariant_cast(m_dBusMonitorInter->property("Connected")); -} - -QString MonitorDBusProxy::currentFillMode() -{ - return qvariant_cast(m_dBusMonitorInter->property("CurrentFillMode")); -} - -void MonitorDBusProxy::setCurrentFillMode(const QString &value) -{ - m_dBusMonitorInter->setProperty("CurrentFillMode", QVariant::fromValue(value)); -} - -Resolution MonitorDBusProxy::currentMode() -{ - Resolution val; - m_dBusMonitorPropertiesInter->call("Get", MonitorInterface, "CurrentMode").arguments().at(0).value().variant().value() >> val; - return val; -} - -uchar MonitorDBusProxy::currentRotateMode() -{ - return qvariant_cast(m_dBusMonitorInter->property("CurrentRotateMode")); -} - -bool MonitorDBusProxy::enabled() -{ - return qvariant_cast(m_dBusMonitorInter->property("Enabled")); -} - -ushort MonitorDBusProxy::height() -{ - return qvariant_cast(m_dBusMonitorInter->property("Height")); -} - -QString MonitorDBusProxy::manufacturer() -{ - return qvariant_cast(m_dBusMonitorInter->property("Manufacturer")); -} - -uint MonitorDBusProxy::mmHeight() -{ - return qvariant_cast(m_dBusMonitorInter->property("MmHeight")); -} - -uint MonitorDBusProxy::mmWidth() -{ - return qvariant_cast(m_dBusMonitorInter->property("MmWidth")); -} - -QString MonitorDBusProxy::model() -{ - return qvariant_cast(m_dBusMonitorInter->property("Model")); -} - -ResolutionList MonitorDBusProxy::modes() -{ - ResolutionList val; - m_dBusMonitorPropertiesInter->call("Get", MonitorInterface, "Modes").arguments().at(0).value().variant().value() >> val; - return val; -} - -QString MonitorDBusProxy::name() -{ - return qvariant_cast(m_dBusMonitorInter->property("Name")); -} - -ushort MonitorDBusProxy::reflect() -{ - return qvariant_cast(m_dBusMonitorInter->property("Reflect")); -} - -ReflectList MonitorDBusProxy::reflects() -{ - return qvariant_cast(m_dBusMonitorPropertiesInter->call("Get", MonitorInterface, "Reflects").arguments().at(0).value().variant()); -} - -double MonitorDBusProxy::refreshRate() -{ - return qvariant_cast(m_dBusMonitorInter->property("RefreshRate")); -} - -ushort MonitorDBusProxy::rotation() -{ - return qvariant_cast(m_dBusMonitorInter->property("Rotation")); -} - -RotationList MonitorDBusProxy::rotations() -{ - return qvariant_cast(m_dBusMonitorPropertiesInter->call("Get", MonitorInterface, "Rotations").arguments().at(0).value().variant()); -} - -ushort MonitorDBusProxy::width() -{ - return qvariant_cast(m_dBusMonitorInter->property("Width")); -} - -short MonitorDBusProxy::x() -{ - return qvariant_cast(m_dBusMonitorInter->property("X")); -} - -short MonitorDBusProxy::y() -{ - return qvariant_cast(m_dBusMonitorInter->property("Y")); -} - -QDBusPendingReply<> MonitorDBusProxy::Enable(bool in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("Enable"), argumentList); -} - -QDBusPendingReply<> MonitorDBusProxy::SetMode(uint in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("SetMode"), argumentList); -} - -QDBusPendingReply<> MonitorDBusProxy::SetModeBySize(ushort in0, ushort in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("SetModeBySize"), argumentList); -} - -QDBusPendingReply<> MonitorDBusProxy::SetPosition(short in0, short in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("SetPosition"), argumentList); -} - -QDBusPendingReply<> MonitorDBusProxy::SetReflect(ushort in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("SetReflect"), argumentList); -} - -QDBusPendingReply<> MonitorDBusProxy::SetRotation(ushort in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusMonitorInter->asyncCallWithArgumentList(QStringLiteral("SetRotation"), argumentList); -} - -void MonitorDBusProxy::onPropertiesChanged(const QDBusMessage &message) -{ - QVariantMap changedProps = qdbus_cast(message.arguments().at(1).value()); - for (QVariantMap::const_iterator it = changedProps.begin(); it != changedProps.end(); ++it) { - if(it.key() =="CurrentMode") { - emit CurrentModeChanged(qdbus_cast(changedProps.value(it.key()))); - } else if(it.key() =="BestMode") { - emit BestModeChanged(qdbus_cast(changedProps.value(it.key()))); - } else if(it.key() =="Modes") { - emit ModesChanged(qdbus_cast(changedProps.value(it.key()))); - } else { - QMetaObject::invokeMethod(this, it.key().toLatin1() + "Changed", Qt::DirectConnection, QGenericArgument(it.value().typeName(), it.value().data())); - } - } -} diff --git a/dcc-old/src/plugin-display/operation/monitordbusproxy.h b/dcc-old/src/plugin-display/operation/monitordbusproxy.h deleted file mode 100644 index e4cdbf118e..0000000000 --- a/dcc-old/src/plugin-display/operation/monitordbusproxy.h +++ /dev/null @@ -1,140 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MONITORDBUSPROXY_H -#define MONITORDBUSPROXY_H - -#include "types/resolutionlist.h" -#include "types/reflectlist.h" -#include "types/rotationlist.h" -#include "types/resolution.h" - - -#include -#include -#include - -class QDBusInterface; -class QDBusMessage; - -class MonitorDBusProxy : public QObject -{ - Q_OBJECT -public: - static inline const char *staticInterfaceName() - { return "org.deepin.dde.Display1.Monitor"; } - -public: - explicit MonitorDBusProxy(QString monitorPath, QObject *parent = nullptr); - Q_PROPERTY(QStringList AvailableFillModes READ availableFillModes NOTIFY AvailableFillModesChanged) - QStringList availableFillModes(); - - Q_PROPERTY(Resolution BestMode READ bestMode NOTIFY BestModeChanged) - Resolution bestMode(); - - Q_PROPERTY(bool Connected READ connected NOTIFY ConnectedChanged) - bool connected(); - - Q_PROPERTY(QString CurrentFillMode READ currentFillMode WRITE setCurrentFillMode NOTIFY CurrentFillModeChanged) - QString currentFillMode(); - void setCurrentFillMode(const QString &value); - - Q_PROPERTY(Resolution CurrentMode READ currentMode NOTIFY CurrentModeChanged) - Resolution currentMode(); - - Q_PROPERTY(uchar CurrentRotateMode READ currentRotateMode NOTIFY CurrentRotateModeChanged) - uchar currentRotateMode(); - - Q_PROPERTY(bool Enabled READ enabled NOTIFY EnabledChanged) - bool enabled(); - - Q_PROPERTY(ushort Height READ height NOTIFY HeightChanged) - ushort height(); - - Q_PROPERTY(QString Manufacturer READ manufacturer NOTIFY ManufacturerChanged) - QString manufacturer(); - - Q_PROPERTY(uint MmHeight READ mmHeight NOTIFY MmHeightChanged) - uint mmHeight(); - - Q_PROPERTY(uint MmWidth READ mmWidth NOTIFY MmWidthChanged) - uint mmWidth(); - - Q_PROPERTY(QString Model READ model NOTIFY ModelChanged) - QString model(); - - Q_PROPERTY(ResolutionList Modes READ modes NOTIFY ModesChanged) - ResolutionList modes(); - - Q_PROPERTY(QString Name READ name NOTIFY NameChanged) - QString name(); - - Q_PROPERTY(ushort Reflect READ reflect NOTIFY ReflectChanged) - ushort reflect(); - - Q_PROPERTY(ReflectList Reflects READ reflects NOTIFY ReflectsChanged) - ReflectList reflects(); - - Q_PROPERTY(double RefreshRate READ refreshRate NOTIFY RefreshRateChanged) - double refreshRate(); - - Q_PROPERTY(ushort Rotation READ rotation NOTIFY RotationChanged) - ushort rotation(); - - Q_PROPERTY(RotationList Rotations READ rotations NOTIFY RotationsChanged) - RotationList rotations(); - - Q_PROPERTY(ushort Width READ width NOTIFY WidthChanged) - ushort width(); - - Q_PROPERTY(short X READ x NOTIFY XChanged) - short x(); - - Q_PROPERTY(short Y READ y NOTIFY YChanged) - short y(); - -private: - void init(); - -public Q_SLOTS: // METHODS - QDBusPendingReply<> Enable(bool in0); - QDBusPendingReply<> SetMode(uint in0); - QDBusPendingReply<> SetModeBySize(ushort in0, ushort in1); - QDBusPendingReply<> SetPosition(short in0, short in1); - QDBusPendingReply<> SetReflect(ushort in0); - QDBusPendingReply<> SetRotation(ushort in0); - - void onPropertiesChanged(const QDBusMessage &message); - -Q_SIGNALS: // SIGNALS - // begin property changed signals - void AvailableFillModesChanged(const QStringList & value) const; - void BestModeChanged(Resolution value) const; - void ConnectedChanged(bool value) const; - void CurrentFillModeChanged(const QString & value) const; - void CurrentModeChanged(Resolution value) const; - void CurrentRotateModeChanged(uchar value) const; - void EnabledChanged(bool value) const; - void HeightChanged(ushort value) const; - void ManufacturerChanged(const QString & value) const; - void MmHeightChanged(uint value) const; - void MmWidthChanged(uint value) const; - void ModelChanged(const QString & value) const; - void ModesChanged(ResolutionList value) const; - void NameChanged(const QString & value) const; - void ReflectChanged(ushort value) const; - void ReflectsChanged(ReflectList value) const; - void RefreshRateChanged(double value) const; - void RotationChanged(ushort value) const; - void RotationsChanged(RotationList value) const; - void WidthChanged(ushort value) const; - void XChanged(short value) const; - void YChanged(short value) const; - -private: - QDBusInterface *m_dBusMonitorInter; - QDBusInterface *m_dBusMonitorPropertiesInter; - QString m_monitorUserPath; -}; - -#endif // MONITORDBUSPROXY_H diff --git a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_break_32px.svg b/dcc-old/src/plugin-display/operation/qrc/actions/dcc_break_32px.svg deleted file mode 100644 index 7dbd04a494..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_break_32px.svg +++ /dev/null @@ -1,20 +0,0 @@ - - - 断开 - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesshigh_32px.svg b/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesshigh_32px.svg deleted file mode 100644 index baeb9afcda..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesshigh_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesslow_32px.svg b/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesslow_32px.svg deleted file mode 100644 index c5a11a1674..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/actions/dcc_brightnesslow_32px.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_bottom.dci b/dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_bottom.dci deleted file mode 100644 index 10c0524ce427a54611b3ca01b1c39ae6cb539e3c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 795 zcmZ>9_GDmWWME)2GGU+uoMwXPX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxDOZsAV8_7-Js?$!W;%M zmSplDR7a4fo7*=aJKWVNAS}Sb=M|8x?|wi~KwnU>N5#`iW+`jC^lKr;hMTOR&Yypk zr*OSVK6+N!bs|H8=cKh-S$8Vm{gd1K-!-YdSkCIR;Kl!(2lh{B-|}k3w$+!Kuh_g; zxrhIm5ht&j65q)T^X6M8?W`vDx%mAGcsFsUi}SiIxhLG3RIW_^b9&=i&4_&62RH6r zmrGF*6)1qB)!|znPYk#o7HRYGZ?@&S~$bLdQ0&J^xDg%)=X#-U=!+ zq)W*3FvW-~e>@<*Qqla@wG`!vljoVuKcg!1N#w11Rod9_GDmWWME)2GGU+u9A$#&X3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxC0mgAV8_79iZkg!W;%M zmSpk=R7a4fo7)EZ;k9&WzJ$p1^-Mj~#b!u%%It6cn9(LNE)S08=;vGR{vW&!JR3!|>= z#Wu-PzUO@UFnJ~Sq&Oz`46Pe%GQz*-Ol*=>|7Kac9_GDmWWME)2GGU+uoMwXPX3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxDOZsAV8_7-Js?$!W;%M zmSplDR7a4fo7*=aJKWVNAS}Sb=OvJ>?|wi~z+OUaxtT|uUH+>#{A=ym^|WEr@k_2TX_ZbN zH=9&O*=$JlWVq7kcq%KgmYMT7hscr&z8)Fr2P>X2O0zQr$sL%!;L=iue9y*{)0j5v zvtEnfdebSg!$`BiYdX_jRaUiVE}kHtZ325;jY6zC3zmL)wD?;~N<{Lc#BZK$C)FgY zx>Ht^2sM3nzQy2gDt^PlO(A?OgIgcVj@JRf$2p`JIN7&WBzUh$t6Wt!O^rYBif+3V L&~;zd8!`X@^wfqG diff --git a/dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_top.dci b/dcc-old/src/plugin-display/operation/qrc/built-in-icons/dcc_display_top.dci deleted file mode 100644 index 87c8b986c66810e292f70229a7045bdf90c4cf21..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 787 zcmZ>9_GDmWWME)2GGU+u9A<*(X3EPi%1zACOGzxsCda(BP)$t6bacE^o$aHV||#}Fi(TUNirUyxD6NqAV8_7?V#o`!W;%M zmSpl9R7a4fo7+1eJKWVNAS}Sb=OK`-?|wi~z+6zUN5#`iW+`jC^lKr;hMTOR&Yypk zr#K|YYv;*ncCj#cPs$0scy#XbcTR8XC!XjmmYCn)@z1~ExA>=^Ey`KPx9#v)yO{H7 z@Rn&O4QF&$I8;ShZtX6vV)kFubU~AU!K4?7%il8WWqELgdA{}idf|IE)%g#t4iwZf zALm8%ZPe9!7oW@k E01^9&A^-pY diff --git a/dcc-old/src/plugin-display/operation/qrc/display.qrc b/dcc-old/src/plugin-display/operation/qrc/display.qrc deleted file mode 100644 index 076aad6478..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/display.qrc +++ /dev/null @@ -1,45 +0,0 @@ - - - icons/dcc_nav_display_42px.svg - icons/dcc_nav_display_84px.svg - actions/dcc_break_32px.svg - actions/dcc_brightnesslow_32px.svg - actions/dcc_brightnesshigh_32px.svg - - - icons/dark/icons/dark/Center.svg - icons/dark/icons/dark/Fit.svg - icons/dark/icons/dark/Stretch.svg - icons/dark/icons/white/Center.svg - icons/dark/icons/white/Fit.svg - icons/dark/icons/white/Stretch.svg - icons/dark/icons/hover/Center.svg - icons/dark/icons/hover/Fit.svg - icons/dark/icons/hover/Stretch.svg - icons/light/icon/black/Center.svg - icons/light/icon/black/Fit.svg - icons/light/icon/black/Stretch.svg - icons/light/icon/light/Center.svg - icons/light/icon/light/Fit.svg - icons/light/icon/light/Stretch.svg - icons/light/icon/white/Center.svg - icons/light/icon/white/Fit.svg - icons/light/icon/white/Stretch.svg - icons/light/icon/hover/Center.svg - icons/light/icon/hover/Fit.svg - icons/light/icon/hover/Stretch.svg - icons/dark/icons/dark/Default.svg - icons/dark/icons/hover/Default.svg - icons/dark/icons/white/Default.svg - icons/light/icon/black/Default.svg - icons/light/icon/hover/Default.svg - icons/light/icon/light/Default.svg - icons/light/icon/white/Default.svg - - - built-in-icons/dcc_display_bottom.dci - built-in-icons/dcc_display_left.dci - built-in-icons/dcc_display_right.dci - built-in-icons/dcc_display_top.dci - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Center.svg deleted file mode 100644 index a26a5f8015..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Center.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Default.svg deleted file mode 100644 index 9886cd675c..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-深色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Fit.svg deleted file mode 100644 index 8a49cf9eec..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Fit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Stretch.svg deleted file mode 100644 index 98f4a6cddd..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/dark/Stretch.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Center.svg deleted file mode 100644 index 31b8413e1d..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Center.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 居中-深色hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Default.svg deleted file mode 100644 index 970f37980a..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-白色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Fit.svg deleted file mode 100644 index f1a6186201..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Fit.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 拉伸-深色hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Stretch.svg deleted file mode 100644 index 1b8d3478ab..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/hover/Stretch.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 适应-深色hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Center.svg deleted file mode 100644 index ee7248ae17..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Center.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Default.svg deleted file mode 100644 index 970f37980a..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-白色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Fit.svg deleted file mode 100644 index 55daa8d1bb..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Fit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Stretch.svg deleted file mode 100644 index 653155ed39..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dark/icons/white/Stretch.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_42px.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_42px.svg deleted file mode 100644 index 7e2249293e..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_42px.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - dcc_nav_display_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_84px.svg b/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_84px.svg deleted file mode 100644 index 02a49c9cc5..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/dcc_nav_display_84px.svg +++ /dev/null @@ -1,32 +0,0 @@ - - - dcc_nav_display_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Center.svg deleted file mode 100644 index 229a2e4463..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Center.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Default.svg deleted file mode 100644 index 68ac8cfeef..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-黑色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Fit.svg deleted file mode 100644 index b460e7f551..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Fit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Stretch.svg deleted file mode 100644 index dcda8ce4f6..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/black/Stretch.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Center.svg deleted file mode 100644 index 7c34b54ddc..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Center.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 居中-hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Default.svg deleted file mode 100644 index 894cc6b543..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-浅色-hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Fit.svg deleted file mode 100644 index 9545c38976..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Fit.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 拉伸-hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Stretch.svg deleted file mode 100644 index 7af59c5233..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/hover/Stretch.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 适应-hover - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Center.svg deleted file mode 100644 index 6d5c2a39ee..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Center.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Default.svg deleted file mode 100644 index ce4fb0e31c..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-浅色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Fit.svg deleted file mode 100644 index 8d08bc68cc..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Fit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Stretch.svg deleted file mode 100644 index a9c200cdfe..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/light/Stretch.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Center.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Center.svg deleted file mode 100644 index ee7248ae17..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Center.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Default.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Default.svg deleted file mode 100644 index 970f37980a..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Default.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - 默认-白色 - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Fit.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Fit.svg deleted file mode 100644 index 55daa8d1bb..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Fit.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Stretch.svg b/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Stretch.svg deleted file mode 100644 index 653155ed39..0000000000 --- a/dcc-old/src/plugin-display/operation/qrc/icons/light/icon/white/Stretch.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/dcc-old/src/plugin-display/operation/types/brightnessmap.cpp b/dcc-old/src/plugin-display/operation/types/brightnessmap.cpp deleted file mode 100644 index 3ac8127794..0000000000 --- a/dcc-old/src/plugin-display/operation/types/brightnessmap.cpp +++ /dev/null @@ -1,10 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "brightnessmap.h" - -void registerBrightnessMapMetaType() -{ - qRegisterMetaType("BrightnessMap"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/brightnessmap.h b/dcc-old/src/plugin-display/operation/types/brightnessmap.h deleted file mode 100644 index a0ba379252..0000000000 --- a/dcc-old/src/plugin-display/operation/types/brightnessmap.h +++ /dev/null @@ -1,14 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef BRIGHTNESSMAP_H -#define BRIGHTNESSMAP_H - -#include -#include - -typedef QMap BrightnessMap; - -void registerBrightnessMapMetaType(); - -#endif // BRIGHTNESSMAP_H diff --git a/dcc-old/src/plugin-display/operation/types/reflectlist.cpp b/dcc-old/src/plugin-display/operation/types/reflectlist.cpp deleted file mode 100644 index dd2283d1e4..0000000000 --- a/dcc-old/src/plugin-display/operation/types/reflectlist.cpp +++ /dev/null @@ -1,10 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "reflectlist.h" - -void registerReflectListMetaType() -{ - qRegisterMetaType("ReflectList"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/reflectlist.h b/dcc-old/src/plugin-display/operation/types/reflectlist.h deleted file mode 100644 index 53e592d176..0000000000 --- a/dcc-old/src/plugin-display/operation/types/reflectlist.h +++ /dev/null @@ -1,14 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef REFLECTLIST_H -#define REFLECTLIST_H - -#include -#include - -typedef QList ReflectList; - -void registerReflectListMetaType(); - -#endif // REFLECTLIST_H diff --git a/dcc-old/src/plugin-display/operation/types/resolution.cpp b/dcc-old/src/plugin-display/operation/types/resolution.cpp deleted file mode 100644 index 1afd96299e..0000000000 --- a/dcc-old/src/plugin-display/operation/types/resolution.cpp +++ /dev/null @@ -1,54 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "resolution.h" - -#include - -void registerResolutionMetaType() -{ - qRegisterMetaType("Resolution"); - qDBusRegisterMetaType(); -} - -QDebug operator<<(QDebug debug, const Resolution &resolution) -{ - debug << QString("Resolution(%1, %2, %3, %4)").arg(resolution.m_id) - .arg(resolution.m_width) - .arg(resolution.m_height) - .arg(resolution.m_rate); - - return debug; -} - -Resolution::Resolution() - : m_rate(0.0) -{ -} - -bool Resolution::operator!=(const Resolution &other) const -{ - return m_width != other.m_width || m_height != other.m_height || m_rate != other.m_rate; -} - -bool Resolution::operator==(const Resolution &other) const -{ - return !(other != *this); -} - -QDBusArgument &operator<<(QDBusArgument &arg, const Resolution &value) -{ - arg.beginStructure(); - arg << value.m_id << value.m_width << value.m_height << value.m_rate; - arg.endStructure(); - - return arg; -} - -const QDBusArgument &operator>>(const QDBusArgument &arg, Resolution &value) -{ - arg.beginStructure(); - arg >> value.m_id >> value.m_width >> value.m_height >> value.m_rate; - arg.endStructure(); - return arg; -} diff --git a/dcc-old/src/plugin-display/operation/types/resolution.h b/dcc-old/src/plugin-display/operation/types/resolution.h deleted file mode 100644 index 12abd74ca0..0000000000 --- a/dcc-old/src/plugin-display/operation/types/resolution.h +++ /dev/null @@ -1,38 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef RESOLUTION_H -#define RESOLUTION_H - -#include - -class Resolution -{ -public: - friend QDebug operator<<(QDebug debug, const Resolution &resolution); - friend QDBusArgument &operator<<(QDBusArgument &arg, const Resolution &value); - friend const QDBusArgument &operator>>(const QDBusArgument &arg, Resolution &value); - - explicit Resolution(); - - bool operator!=(const Resolution &other) const; - bool operator==(const Resolution &other) const; - - quint32 id() const { return m_id; } - quint16 width() const { return m_width; } - quint16 height() const { return m_height; } - double rate() const { return m_rate; } - -public: - quint32 m_id; - quint16 m_width; - quint16 m_height; - double m_rate; -}; - - -Q_DECLARE_METATYPE(Resolution) - -void registerResolutionMetaType(); - -#endif // RESOLUTION_H diff --git a/dcc-old/src/plugin-display/operation/types/resolutionlist.cpp b/dcc-old/src/plugin-display/operation/types/resolutionlist.cpp deleted file mode 100644 index 2c9a5af9ab..0000000000 --- a/dcc-old/src/plugin-display/operation/types/resolutionlist.cpp +++ /dev/null @@ -1,12 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "resolutionlist.h" - -void registerResolutionListMetaType() -{ - registerResolutionMetaType(); - - qRegisterMetaType("ResolutionList"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/resolutionlist.h b/dcc-old/src/plugin-display/operation/types/resolutionlist.h deleted file mode 100644 index fe7600a124..0000000000 --- a/dcc-old/src/plugin-display/operation/types/resolutionlist.h +++ /dev/null @@ -1,15 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef RESOLUTIONLIST_H -#define RESOLUTIONLIST_H - -#include "resolution.h" - -#include - -typedef QList ResolutionList; - -void registerResolutionListMetaType(); - -#endif // RESOLUTIONLIST_H diff --git a/dcc-old/src/plugin-display/operation/types/rotationlist.cpp b/dcc-old/src/plugin-display/operation/types/rotationlist.cpp deleted file mode 100644 index a97a77ba12..0000000000 --- a/dcc-old/src/plugin-display/operation/types/rotationlist.cpp +++ /dev/null @@ -1,10 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "rotationlist.h" - -void registerRotationListMetaType() -{ - qRegisterMetaType("RotationList"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/rotationlist.h b/dcc-old/src/plugin-display/operation/types/rotationlist.h deleted file mode 100644 index 95d81df0cd..0000000000 --- a/dcc-old/src/plugin-display/operation/types/rotationlist.h +++ /dev/null @@ -1,14 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef ROTATIONLIST_H -#define ROTATIONLIST_H - -#include -#include - -typedef QList RotationList; - -void registerRotationListMetaType(); - -#endif // ROTATIONLIST_H diff --git a/dcc-old/src/plugin-display/operation/types/screenrect.cpp b/dcc-old/src/plugin-display/operation/types/screenrect.cpp deleted file mode 100644 index 950a343c4a..0000000000 --- a/dcc-old/src/plugin-display/operation/types/screenrect.cpp +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "screenrect.h" - -ScreenRect::ScreenRect() - : x(0), - y(0), - w(0), - h(0) -{ - -} - -QDebug operator<<(QDebug debug, const ScreenRect &rect) -{ - debug << QString("ScreenRect(%1, %2, %3, %4)").arg(rect.x) - .arg(rect.y) - .arg(rect.w) - .arg(rect.h); - - return debug; -} - -ScreenRect::operator QRect() const -{ - return QRect(x, y, w, h); -} - -QDBusArgument &operator<<(QDBusArgument &arg, const ScreenRect &rect) -{ - arg.beginStructure(); - arg << rect.x << rect.y << rect.w << rect.h; - arg.endStructure(); - - return arg; -} - -const QDBusArgument &operator>>(const QDBusArgument &arg, ScreenRect &rect) -{ - arg.beginStructure(); - arg >> rect.x >> rect.y >> rect.w >> rect.h; - arg.endStructure(); - - return arg; -} - -void registerScreenRectMetaType() -{ - qRegisterMetaType("ScreenRect"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/screenrect.h b/dcc-old/src/plugin-display/operation/types/screenrect.h deleted file mode 100644 index bd051b8685..0000000000 --- a/dcc-old/src/plugin-display/operation/types/screenrect.h +++ /dev/null @@ -1,33 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SCREENRECT_H -#define SCREENRECT_H - -#include -#include -#include -#include - -struct ScreenRect -{ -public: - ScreenRect(); - operator QRect() const; - - friend QDebug operator<<(QDebug debug, const ScreenRect &rect); - friend const QDBusArgument &operator>>(const QDBusArgument &arg, ScreenRect &rect); - friend QDBusArgument &operator<<(QDBusArgument &arg, const ScreenRect &rect); - -private: - qint16 x; - qint16 y; - quint16 w; - quint16 h; -}; - -Q_DECLARE_METATYPE(ScreenRect) - -void registerScreenRectMetaType(); - -#endif // SCREENRECT_H diff --git a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.cpp b/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.cpp deleted file mode 100644 index 3573608144..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.cpp +++ /dev/null @@ -1,41 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "touchscreeninfolist.h" - -QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo &info) -{ - arg.beginStructure(); - arg << info.id << info.name << info.deviceNode << info.serialNumber; - arg.endStructure(); - - return arg; -} - -const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo &info) -{ - arg.beginStructure(); - arg >> info.id >> info.name >> info.deviceNode >> info.serialNumber; - arg.endStructure(); - - return arg; -} - -bool TouchscreenInfo::operator==(const TouchscreenInfo &info) -{ - return id == info.id && name == info.name && deviceNode == info.deviceNode && serialNumber == info.serialNumber; -} - -void registerTouchscreenInfoMetaType() -{ - qRegisterMetaType("TouchscreenInfo"); - qDBusRegisterMetaType(); -} - -void registerTouchscreenInfoListMetaType() -{ - registerTouchscreenInfoMetaType(); - - qRegisterMetaType("TouchscreenInfoList"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.h b/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.h deleted file mode 100644 index 4b35e81bd0..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist.h +++ /dev/null @@ -1,30 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TOUCHSCREENINFOLIST_H -#define TOUCHSCREENINFOLIST_H - -#include -#include -#include - -struct TouchscreenInfo { - qint32 id; - QString name; - QString deviceNode; - QString serialNumber; - - bool operator ==(const TouchscreenInfo& info); -}; - -typedef QList TouchscreenInfoList; - -Q_DECLARE_METATYPE(TouchscreenInfo) -Q_DECLARE_METATYPE(TouchscreenInfoList) - -QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo &info); -const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo &info); - -void registerTouchscreenInfoListMetaType(); - -#endif // !TOUCHSCREENINFOLIST_H diff --git a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.cpp b/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.cpp deleted file mode 100644 index ea0e472b39..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.cpp +++ /dev/null @@ -1,40 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "touchscreeninfolist_v2.h" - -QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo_V2 &info) -{ - arg.beginStructure(); - arg << info.id << info.name << info.deviceNode << info.serialNumber << info.UUID; - arg.endStructure(); - - return arg; -} - -const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo_V2 &info) -{ - arg.beginStructure(); - arg >> info.id >> info.name >> info.deviceNode >> info.serialNumber >> info.UUID; - arg.endStructure(); - - return arg; -} - -bool operator==(const TouchscreenInfo_V2 &info1, const TouchscreenInfo_V2 &info2) { - return info1.id == info2.id && info1.name == info2.name && info1.deviceNode == info2.deviceNode && info1.serialNumber == info2.serialNumber && info1.UUID == info2.UUID; -} - -void registerTouchscreenInfoV2MetaType() -{ - qRegisterMetaType("TouchscreenInfo_V2"); - qDBusRegisterMetaType(); -} - -void registerTouchscreenInfoList_V2MetaType() -{ - registerTouchscreenInfoV2MetaType(); - - qRegisterMetaType("TouchscreenInfoList_V2"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.h b/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.h deleted file mode 100644 index d02eab721e..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreeninfolist_v2.h +++ /dev/null @@ -1,31 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TOUCHSCREENINFOLISTV2_H -#define TOUCHSCREENINFOLISTV2_H - -#include -#include -#include - -struct TouchscreenInfo_V2 { - qint32 id; - QString name; - QString deviceNode; - QString serialNumber; - QString UUID; -}; - -bool operator==(const TouchscreenInfo_V2 &info1, const TouchscreenInfo_V2 &info2); - -typedef QList TouchscreenInfoList_V2; - -Q_DECLARE_METATYPE(TouchscreenInfo_V2) -Q_DECLARE_METATYPE(TouchscreenInfoList_V2) - -QDBusArgument &operator<<(QDBusArgument &arg, const TouchscreenInfo_V2 &info); -const QDBusArgument &operator>>(const QDBusArgument &arg, TouchscreenInfo_V2 &info); - -void registerTouchscreenInfoList_V2MetaType(); - -#endif // !TOUCHSCREENINFOLISTV2_H diff --git a/dcc-old/src/plugin-display/operation/types/touchscreenmap.cpp b/dcc-old/src/plugin-display/operation/types/touchscreenmap.cpp deleted file mode 100644 index 6f191aa22c..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreenmap.cpp +++ /dev/null @@ -1,10 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "touchscreenmap.h" - -void registerTouchscreenMapMetaType() -{ - qRegisterMetaType("TouchscreenMap"); - qDBusRegisterMetaType(); -} diff --git a/dcc-old/src/plugin-display/operation/types/touchscreenmap.h b/dcc-old/src/plugin-display/operation/types/touchscreenmap.h deleted file mode 100644 index 8a7c4f4345..0000000000 --- a/dcc-old/src/plugin-display/operation/types/touchscreenmap.h +++ /dev/null @@ -1,14 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TOUCHSCREENMAP_H -#define TOUCHSCREENMAP_H - -#include -#include - -typedef QMap TouchscreenMap; - -void registerTouchscreenMapMetaType(); - -#endif // TOUCHSCREENMAP_H diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/Output.cpp b/dcc-old/src/plugin-display/wayland/libwayqt/Output.cpp deleted file mode 100644 index c7b5f99097..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/Output.cpp +++ /dev/null @@ -1,182 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#include "wayland-client-protocol.h" - -#include -#include - -#include -#include -#include -#include -#include - -WQt::Output::Output(wl_output *op) -{ - mObj = op; - - wl_output_add_listener(mObj, &mListener, this); -} - -WQt::Output::~Output() -{ - wl_output_destroy(mObj); -} - -QString WQt::Output::name() -{ - return mName; -} - -QString WQt::Output::description() -{ - return mDescr; -} - -QString WQt::Output::make() -{ - return mMake; -} - -QString WQt::Output::model() -{ - return mModel; -} - -QPoint WQt::Output::position() -{ - return mPos; -} - -QSize WQt::Output::physicalSize() -{ - return mPhysicalSize; -} - -WQt::Output::OutputMode WQt::Output::mode() -{ - return mMode; -} - -WQt::Output::SubpixelGeometry WQt::Output::subpixelGeometry() -{ - return (WQt::Output::SubpixelGeometry)mSubPixel; -} - -WQt::Output::Rotation WQt::Output::transform() -{ - return (WQt::Output::Rotation)mTransform; -} - -int32_t WQt::Output::scale() -{ - return mScale; -} - -void WQt::Output::waitForReady() -{ - if (mDone) { - return; - } - - do { - QThread::usleep(100); - qApp->processEvents(); - } while (not mDone); -} - -wl_output *WQt::Output::get() -{ - return mObj; -} - -void WQt::Output::handleGeometryEvent(void *data, - struct wl_output *, - int32_t x, - int32_t y, - int32_t w, - int32_t h, - int32_t e, - const char *f, - const char *g, - int32_t t) -{ - Output *output = reinterpret_cast(data); - - output->mPos = QPoint(x, y); - output->mPhysicalSize = QSize(w, h); - output->mSubPixel = e; - output->mMake = QString(f); - output->mModel = QString(g); - output->mTransform = t; -} - -void WQt::Output::handleModeEvent(void *data, - struct wl_output *, - uint32_t current, - int32_t xres, - int32_t yres, - int32_t refresh) -{ - Output *output = reinterpret_cast(data); - - if (current) { - output->mMode = { QSize(xres, yres), refresh, true }; - } -} - -void WQt::Output::handleDone(void *data, struct wl_output *) -{ - Output *output = reinterpret_cast(data); - - output->mDone = true; -} - -void WQt::Output::handleScale(void *data, struct wl_output *, int32_t scale) -{ - Output *output = reinterpret_cast(data); - - output->mScale = scale; -} - -void WQt::Output::handleNameEvent(void *data, struct wl_output *, const char *name) -{ - Output *output = reinterpret_cast(data); - - output->mName = QString(name); -} - -void WQt::Output::handleDescriptionEvent(void *data, struct wl_output *, const char *descr) -{ - Output *output = reinterpret_cast(data); - - output->mDescr = descr; -} - -const wl_output_listener WQt::Output::mListener = { - handleGeometryEvent, handleModeEvent, handleDone, - handleScale, handleNameEvent, handleDescriptionEvent, -}; diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/Output.hpp b/dcc-old/src/plugin-display/wayland/libwayqt/Output.hpp deleted file mode 100644 index 649553d5f8..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/Output.hpp +++ /dev/null @@ -1,128 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#pragma once - -#include - -#include -#include -#include -#include - -struct wl_output; -struct wl_output_listener; - -namespace WQt { -class Output; -} - -class WQt::Output : public QObject -{ - Q_OBJECT; - -public: - enum SubpixelGeometry { - Unknown = 0x634429, - None, - HorizontalRGB, - HorizontalBGR, - VerticalRGB, - VerticalBGR, - }; - - enum Rotation { - Normal = 0x951893, - Rotate90, - Rotate180, - Rotate270, - Flipped, - Flipped90, - Flipped180, - Flipped270, - }; - - typedef struct output_mode_t - { - QSize resolution; - int32_t refreshRate; - bool current = false; - } OutputMode; - - Output(wl_output *); - ~Output(); - - QString name(); - QString description(); - QString make(); - QString model(); - - QPoint position(); - QSize physicalSize(); - WQt::Output::OutputMode mode(); - SubpixelGeometry subpixelGeometry(); - Rotation transform(); - - int32_t scale(); - - void waitForReady(); - - wl_output *get(); - -private: - static void handleGeometryEvent(void *, - struct wl_output *, - int32_t, - int32_t, - int32_t, - int32_t, - int32_t, - const char *, - const char *, - int32_t); - static void handleModeEvent(void *, struct wl_output *, uint32_t, int32_t, int32_t, int32_t); - static void handleDone(void *, struct wl_output *); - static void handleScale(void *, struct wl_output *, int32_t); - static void handleNameEvent(void *, struct wl_output *, const char *); - static void handleDescriptionEvent(void *, struct wl_output *, const char *); - - wl_output *mObj; - static const wl_output_listener mListener; - - QPoint mPos; - QSize mPhysicalSize; - int32_t mSubPixel; - QString mMake; - QString mModel; - int32_t mTransform; - - WQt::Output::OutputMode mMode; - int32_t mScale; - - QString mName; - QString mDescr; - - bool mDone = false; -}; diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.cpp b/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.cpp deleted file mode 100644 index 0b5ee21eed..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.cpp +++ /dev/null @@ -1,515 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#include "OutputManager.hpp" - -#include "wlr-output-management-unstable-v1-client-protocol.h" - -#include - -#include -#include -#include -#include -#include -#include - -/** - * Output Manager - * This is the beginning of all our operations. - * Obtain a pointer to this object from Wayland Registry - */ - -WQt::OutputManager::OutputManager(zwlr_output_manager_v1 *opMgr) -{ - mObj = opMgr; - zwlr_output_manager_v1_add_listener(mObj, &mListener, this); -} - -WQt::OutputManager::~OutputManager() -{ - zwlr_output_manager_v1_destroy(mObj); -} - -QList WQt::OutputManager::heads() -{ - return mHeads; -} - -void WQt::OutputManager::waitForDone() -{ - while (not mIsDone) { - /** 100 micro-seconds */ - QThread::usleep(100); - - /** Process events */ - qApp->processEvents(); - } -} - -WQt::OutputConfiguration *WQt::OutputManager::createConfiguration() -{ - return new WQt::OutputConfiguration(zwlr_output_manager_v1_create_configuration(mObj, mSerial)); -} - -void WQt::OutputManager::stop() -{ - zwlr_output_manager_v1_stop(mObj); -} - -zwlr_output_manager_v1 *WQt::OutputManager::get() -{ - return mObj; -} - -void WQt::OutputManager::handleHead(void *data, zwlr_output_manager_v1 *, zwlr_output_head_v1 *head) -{ - WQt::OutputManager *mgr = reinterpret_cast(data); - - WQt::OutputHead *opHead = new WQt::OutputHead(head); - - mgr->mHeads << opHead; - - connect(opHead, &WQt::OutputHead::finished, [=]() { - mgr->mHeads.removeAll(opHead); - }); - - emit mgr->headAttached(opHead); -} - -void WQt::OutputManager::handleDone(void *data, zwlr_output_manager_v1 *, uint32_t serial) -{ - WQt::OutputManager *mgr = reinterpret_cast(data); - - mgr->mSerial = serial; - mgr->mIsDone = true; - - emit mgr->done(); -} - -void WQt::OutputManager::handleFinished(void *data, zwlr_output_manager_v1 *) -{ - WQt::OutputManager *mgr = reinterpret_cast(data); - - zwlr_output_manager_v1_destroy(mgr->mObj); - mgr->mObj = nullptr; -} - -const struct zwlr_output_manager_v1_listener WQt::OutputManager::mListener = { - handleHead, - handleDone, - handleFinished, -}; - -/** - * Output Head - * Heads are obtained from OutputManager class, via signals, - * or via OutputManager::heads() function; - */ - -WQt::OutputHead::OutputHead() { } - -WQt::OutputHead::OutputHead(zwlr_output_head_v1 *head) -{ - mObj = head; - zwlr_output_head_v1_add_listener(mObj, &mListener, this); -} - -WQt::OutputHead::OutputHead(const WQt::OutputHead &otherHead) - : QObject() -{ - mObj = otherHead.mObj; - - mPropsMap = otherHead.mPropsMap; - mModes = otherHead.mModes; - mCurrentMode = otherHead.mCurrentMode; -} - -WQt::OutputHead::~OutputHead() -{ - zwlr_output_head_v1_destroy(mObj); -} - -QVariant WQt::OutputHead::property(WQt::OutputHead::Property prop) -{ - if (prop == WQt::OutputHead::Modes) { - return QVariant::fromValue>(mModes); - } - - else if (prop == WQt::OutputHead::CurrentMode) { - return QVariant::fromValue(mCurrentMode); - } - - else { - return mPropsMap.value((int)prop); - } -} - -zwlr_output_head_v1 *WQt::OutputHead::get() -{ - return mObj; -} - -void WQt::OutputHead::handleName(void *data, zwlr_output_head_v1 *, const char *name) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Name] = name; - - emit opHead->changed(WQt::OutputHead::Name); -} - -void WQt::OutputHead::handleDescription(void *data, zwlr_output_head_v1 *, const char *descr) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Description] = descr; - - emit opHead->changed(WQt::OutputHead::Description); -} - -void WQt::OutputHead::handlePhysicalSize(void *data, - zwlr_output_head_v1 *, - int32_t width, - int32_t height) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::PhysicalSize] = QSize(width, height); - - emit opHead->changed(WQt::OutputHead::PhysicalSize); -} - -void WQt::OutputHead::handleMode(void *data, zwlr_output_head_v1 *, zwlr_output_mode_v1 *mode) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - if (opHead->mPropsMap.contains(WQt::OutputHead::Modes)) { - opHead->mPropsMap[WQt::OutputHead::Modes] = - QVariant::fromValue>(QList()); - } - - WQt::OutputMode *opMode = new WQt::OutputMode(mode); - - connect(opMode, &WQt::OutputMode::finished, [=]() { - opHead->mModes.removeAll(opMode); - }); - opHead->mModes << opMode; - - emit opHead->changed(WQt::OutputHead::Modes); -} - -void WQt::OutputHead::handleEnabled(void *data, zwlr_output_head_v1 *, int32_t yes) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Enabled] = (bool)yes; - - emit opHead->changed(WQt::OutputHead::Enabled); -} - -void WQt::OutputHead::handleCurrentMode(void *data, - zwlr_output_head_v1 *, - zwlr_output_mode_v1 *curMode) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - for (auto *mode : opHead->property(WQt::OutputHead::Modes).value>()) { - if (mode->get() == curMode) - opHead->mCurrentMode = mode; - } - - emit opHead->changed(WQt::OutputHead::CurrentMode); -} - -void WQt::OutputHead::handlePosition(void *data, zwlr_output_head_v1 *, int32_t x, int32_t y) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Position] = QPoint(x, y); - - emit opHead->changed(WQt::OutputHead::Position); -} - -void WQt::OutputHead::handleTransform(void *data, zwlr_output_head_v1 *, int32_t transform) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Transform] = transform; - - emit opHead->changed(WQt::OutputHead::Transform); -} - -void WQt::OutputHead::handleScale(void *data, zwlr_output_head_v1 *, wl_fixed_t scale) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Scale] = wl_fixed_to_double(scale); - - emit opHead->changed(WQt::OutputHead::Scale); -} - -void WQt::OutputHead::handleFinished(void *data, zwlr_output_head_v1 *) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - emit opHead->finished(); -} - -void WQt::OutputHead::handleMake(void *data, zwlr_output_head_v1 *, const char *make) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Make] = make; - - emit opHead->changed(WQt::OutputHead::Make); -} - -void WQt::OutputHead::handleModel(void *data, zwlr_output_head_v1 *, const char *model) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::Model] = model; - - emit opHead->changed(WQt::OutputHead::Model); -} - -void WQt::OutputHead::handleSerialNumber(void *data, zwlr_output_head_v1 *, const char *serialNo) -{ - WQt::OutputHead *opHead = reinterpret_cast(data); - - opHead->mPropsMap[WQt::OutputHead::SerialNumber] = serialNo; - - emit opHead->changed(WQt::OutputHead::SerialNumber); -} - -const struct zwlr_output_head_v1_listener WQt::OutputHead::mListener = { - handleName, handleDescription, handlePhysicalSize, handleMode, handleEnabled, - handleCurrentMode, handlePosition, handleTransform, handleScale, handleFinished, - handleMake, handleModel, handleSerialNumber, -}; - -/** - * Output Mode - * This describes a mode of an output head. - * Obtained from OutputHead::property( Modes ) - * or from OutputHead::property( CurrentMode ) - */ - -WQt::OutputMode::OutputMode() { } - -WQt::OutputMode::OutputMode(zwlr_output_mode_v1 *mode) -{ - mObj = mode; - zwlr_output_mode_v1_add_listener(mObj, &mListener, this); -} - -WQt::OutputMode::OutputMode(const WQt::OutputMode &otherMode) - : QObject() -{ - mObj = otherMode.mObj; - - mSize = otherMode.mSize; - mRefreshRate = otherMode.mRefreshRate; - mIsPreferred = otherMode.mIsPreferred; -} - -WQt::OutputMode::~OutputMode() -{ - zwlr_output_mode_v1_destroy(mObj); -} - -QSize WQt::OutputMode::size() -{ - return mSize; -} - -int32_t WQt::OutputMode::refreshRate() -{ - return mRefreshRate; -} - -bool WQt::OutputMode::isPreferred() -{ - return mIsPreferred; -} - -zwlr_output_mode_v1 *WQt::OutputMode::get() -{ - return mObj; -} - -void WQt::OutputMode::handleSize(void *data, zwlr_output_mode_v1 *, int32_t width, int32_t height) -{ - WQt::OutputMode *opMode = reinterpret_cast(data); - - opMode->mSize = QSize(width, height); - - emit opMode->sizeChanged(opMode->mSize); -} - -void WQt::OutputMode::handleRefreshRate(void *data, zwlr_output_mode_v1 *, int32_t refreshRate) -{ - WQt::OutputMode *opMode = reinterpret_cast(data); - - opMode->mRefreshRate = refreshRate; - - emit opMode->refreshRateChanged(refreshRate); -} - -void WQt::OutputMode::handlePreferred(void *data, zwlr_output_mode_v1 *) -{ - WQt::OutputMode *opMode = reinterpret_cast(data); - - opMode->mIsPreferred = true; - - emit opMode->setAsPreferred(); -} - -void WQt::OutputMode::handleFinished(void *data, zwlr_output_mode_v1 *) -{ - WQt::OutputMode *opMode = reinterpret_cast(data); - - emit opMode->finished(); -} - -const struct zwlr_output_mode_v1_listener WQt::OutputMode::mListener = { - handleSize, - handleRefreshRate, - handlePreferred, - handleFinished, -}; - -/** - * Output Configuration - * We can configure all the outputs using this object - * Obtained from OutputManager::createConfiguration() - */ - -WQt::OutputConfiguration::OutputConfiguration(zwlr_output_configuration_v1 *config) -{ - mObj = config; - zwlr_output_configuration_v1_add_listener(mObj, &mListener, this); -} - -WQt::OutputConfiguration::~OutputConfiguration() -{ - zwlr_output_configuration_v1_destroy(mObj); -} - -WQt::OutputConfigurationHead *WQt::OutputConfiguration::enableHead(WQt::OutputHead *head) -{ - return new WQt::OutputConfigurationHead( - zwlr_output_configuration_v1_enable_head(mObj, head->get())); -} - -void WQt::OutputConfiguration::disableHead(WQt::OutputHead *head) -{ - zwlr_output_configuration_v1_disable_head(mObj, head->get()); -} - -void WQt::OutputConfiguration::apply() -{ - zwlr_output_configuration_v1_apply(mObj); -} - -void WQt::OutputConfiguration::test() -{ - zwlr_output_configuration_v1_test(mObj); -} - -void WQt::OutputConfiguration::handleSucceeded(void *data, zwlr_output_configuration_v1 *) -{ - WQt::OutputConfiguration *config = reinterpret_cast(data); - - emit config->succeeded(); - - zwlr_output_configuration_v1_destroy(config->mObj); -} - -void WQt::OutputConfiguration::handleFailed(void *data, zwlr_output_configuration_v1 *) -{ - WQt::OutputConfiguration *config = reinterpret_cast(data); - - emit config->failed(); - - zwlr_output_configuration_v1_destroy(config->mObj); -} - -void WQt::OutputConfiguration::handleCanceled(void *data, zwlr_output_configuration_v1 *) -{ - WQt::OutputConfiguration *config = reinterpret_cast(data); - - emit config->canceled(); - - zwlr_output_configuration_v1_destroy(config->mObj); // need? -} - -const struct zwlr_output_configuration_v1_listener WQt::OutputConfiguration::mListener = { - handleSucceeded, - handleFailed, - handleCanceled, -}; - -/** - * Output Configuration Head - * We can set the resolution and refresh rate for a given head - * Obtained from OutputConfiguration::enableHead() - */ - -WQt::OutputConfigurationHead::OutputConfigurationHead(zwlr_output_configuration_head_v1 *configHead) -{ - mObj = configHead; -} - -WQt::OutputConfigurationHead::~OutputConfigurationHead() -{ - zwlr_output_configuration_head_v1_destroy(mObj); -} - -void WQt::OutputConfigurationHead::setMode(WQt::OutputMode *mode) -{ - zwlr_output_configuration_head_v1_set_mode(mObj, mode->get()); -} - -void WQt::OutputConfigurationHead::setCustomMode(QSize size, int32_t refresh) -{ - zwlr_output_configuration_head_v1_set_custom_mode(mObj, size.width(), size.height(), refresh); -} - -void WQt::OutputConfigurationHead::setPosition(QPoint pos) -{ - zwlr_output_configuration_head_v1_set_position(mObj, pos.x(), pos.y()); -} - -void WQt::OutputConfigurationHead::setTransform(int32_t transform) -{ - zwlr_output_configuration_head_v1_set_transform(mObj, transform); -} - -void WQt::OutputConfigurationHead::setScale(qreal scale) -{ - zwlr_output_configuration_head_v1_set_scale(mObj, wl_fixed_from_double(scale)); -} diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.hpp b/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.hpp deleted file mode 100644 index f4339a5e9e..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/OutputManager.hpp +++ /dev/null @@ -1,268 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#pragma once - -#include - -#include -#include -#include -#include - -struct wl_buffer; -struct wl_output; - -struct zwlr_output_manager_v1; -struct zwlr_output_head_v1; -struct zwlr_output_mode_v1; -struct zwlr_output_configuration_v1; -struct zwlr_output_configuration_head_v1; - -struct zwlr_output_manager_v1_listener; -struct zwlr_output_head_v1_listener; -struct zwlr_output_mode_v1_listener; -struct zwlr_output_configuration_v1_listener; - -namespace WQt { -class OutputManager; -class OutputHead; -class OutputMode; -class OutputConfiguration; -class OutputConfigurationHead; -} // namespace WQt - -class WQt::OutputManager : public QObject -{ - Q_OBJECT; - -public: - OutputManager(zwlr_output_manager_v1 *); - ~OutputManager(); - - /** Create a configuration object */ - WQt::OutputConfiguration *createConfiguration(); - - QList heads(); - - void waitForDone(); - - /** Stop monitoring the outupts */ - void stop(); - - zwlr_output_manager_v1 *get(); - -private: - static void handleHead(void *, zwlr_output_manager_v1 *, zwlr_output_head_v1 *); - static void handleDone(void *, zwlr_output_manager_v1 *, uint32_t); - static void handleFinished(void *, zwlr_output_manager_v1 *); - - zwlr_output_manager_v1 *mObj; - uint32_t mSerial; - - static const zwlr_output_manager_v1_listener mListener; - - QList mHeads; - bool mIsDone = false; - -Q_SIGNALS: - void headAttached(WQt::OutputHead *); - void done(); -}; - -class WQt::OutputHead : public QObject -{ - Q_OBJECT; - -public: - enum Property { - Name = 0xbf278e, - Description, - PhysicalSize, - Modes, - Enabled, - CurrentMode, - Position, - Transform, - Scale, - Make, - Model, - SerialNumber, - }; - - OutputHead(); - OutputHead(zwlr_output_head_v1 *); - OutputHead(const WQt::OutputHead &); - ~OutputHead(); - - /** Get the suitable property of this head */ - QVariant property(WQt::OutputHead::Property); - - zwlr_output_head_v1 *get(); - -private: - static void handleName(void *, zwlr_output_head_v1 *, const char *); - static void handleDescription(void *, zwlr_output_head_v1 *, const char *); - static void handlePhysicalSize(void *, zwlr_output_head_v1 *, int32_t, int32_t); - static void handleMode(void *, zwlr_output_head_v1 *, zwlr_output_mode_v1 *); - static void handleEnabled(void *, zwlr_output_head_v1 *, int32_t); - static void handleCurrentMode(void *, zwlr_output_head_v1 *, zwlr_output_mode_v1 *); - static void handlePosition(void *, zwlr_output_head_v1 *, int32_t, int32_t); - static void handleTransform(void *, zwlr_output_head_v1 *, int32_t); - static void handleScale(void *, zwlr_output_head_v1 *, wl_fixed_t); - static void handleFinished(void *, zwlr_output_head_v1 *); - static void handleMake(void *, zwlr_output_head_v1 *, const char *); - static void handleModel(void *, zwlr_output_head_v1 *, const char *); - static void handleSerialNumber(void *, zwlr_output_head_v1 *, const char *); - - static const zwlr_output_head_v1_listener mListener; - - zwlr_output_head_v1 *mObj; - - /** Properties map */ - QMap mPropsMap; - QList mModes; - WQt::OutputMode *mCurrentMode; - -Q_SIGNALS: - void changed(WQt::OutputHead::Property); - - void finished(); -}; - -class WQt::OutputMode : public QObject -{ - Q_OBJECT; - -public: - OutputMode(); - OutputMode(zwlr_output_mode_v1 *); - OutputMode(const WQt::OutputMode &); - ~OutputMode(); - - QSize size(); - int32_t refreshRate(); - bool isPreferred(); - - zwlr_output_mode_v1 *get(); - -private: - static void handleSize(void *, zwlr_output_mode_v1 *, int32_t, int32_t); - static void handleRefreshRate(void *, zwlr_output_mode_v1 *, int32_t); - static void handlePreferred(void *, zwlr_output_mode_v1 *); - static void handleFinished(void *, zwlr_output_mode_v1 *); - - static const zwlr_output_mode_v1_listener mListener; - - zwlr_output_mode_v1 *mObj{ nullptr }; - - /** Resolution */ - QSize mSize{ 0, 0 }; - - /** Refresh rate */ - int32_t mRefreshRate{ 0 }; - - /** By default this is false */ - bool mIsPreferred{ false }; - -Q_SIGNALS: - void sizeChanged(QSize); - void refreshRateChanged(int32_t); - void setAsPreferred(); - - void finished(); -}; - -class WQt::OutputConfiguration : public QObject -{ - Q_OBJECT; - -public: - enum Error { - AlreadyConfiguredHead = 1, - UnconfiguredHead = 2, - AlreadyUsed = 3, - }; - - OutputConfiguration(zwlr_output_configuration_v1 *); - ~OutputConfiguration(); - - /** Get the outupt configuration head object for the enabled output head */ - WQt::OutputConfigurationHead *enableHead(WQt::OutputHead *); - - /** Disabled the given head */ - void disableHead(WQt::OutputHead *); - - /** This object is destroyed after calling this function */ - void apply(); - - /** This object is destroyed after calling this function */ - void test(); - -private: - static void handleSucceeded(void *, zwlr_output_configuration_v1 *); - static void handleFailed(void *, zwlr_output_configuration_v1 *); - static void handleCanceled(void *, zwlr_output_configuration_v1 *); - - static const zwlr_output_configuration_v1_listener mListener; - - zwlr_output_configuration_v1 *mObj; - -Q_SIGNALS: - void succeeded(); - void failed(); - void canceled(); -}; - -class WQt::OutputConfigurationHead : public QObject -{ - Q_OBJECT; - -public: - enum Error { - AlreadySet = 1, - InvalidMode = 2, - InvalidCustomMode = 3, - InvalidTransform = 4, - InvalidScale = 5, - }; - - OutputConfigurationHead(zwlr_output_configuration_head_v1 *); - ~OutputConfigurationHead(); - - void setMode(WQt::OutputMode *); - void setCustomMode(QSize, int32_t); - void setPosition(QPoint); - void setTransform(int32_t); - void setScale(qreal); - -private: - zwlr_output_configuration_head_v1 *mObj; -}; - -Q_DECLARE_METATYPE(WQt::OutputHead); -Q_DECLARE_METATYPE(WQt::OutputMode); -Q_DECLARE_METATYPE(QList); -Q_DECLARE_METATYPE(QList); diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/Registry.cpp b/dcc-old/src/plugin-display/wayland/libwayqt/Registry.cpp deleted file mode 100644 index 3560668a48..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/Registry.cpp +++ /dev/null @@ -1,318 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#include "treeland-output-management-client-protocol.h" -#include "wayland-client-protocol.h" -#include "wlr-output-management-unstable-v1-client-protocol.h" - -#include -#include -#include -#include - -#include -#include -#include - -/* Convenience functions */ -void WQt::Registry::globalAnnounce( - void *data, struct wl_registry *, uint32_t name, const char *interface, uint32_t version) -{ - auto r = reinterpret_cast(data); - - r->handleAnnounce(name, interface, version); -} - -void WQt::Registry::globalRemove(void *data, struct wl_registry *, uint32_t name) -{ - // who cares :D - // but we will call WQt::Registry::handleRemove just for the heck of it - - auto r = reinterpret_cast(data); - - r->handleRemove(name); -} - -const struct wl_registry_listener WQt::Registry::mRegListener = { - globalAnnounce, - globalRemove, -}; - -WQt::Registry::Registry(wl_display *wlDisplay) -{ - mWlDisplay = wlDisplay; - mObj = wl_display_get_registry(mWlDisplay); - - if (wl_proxy_get_listener((wl_proxy *)mObj) != &mRegListener) { - wl_registry_add_listener(mObj, &mRegListener, this); - } - - wl_display_roundtrip(mWlDisplay); -} - -WQt::Registry::~Registry() -{ - wl_registry_destroy(mObj); - - wl_seat_destroy(mWlSeat); - wl_shm_destroy(mWlShm); - - for (WQt::Output *op : mOutputs) { - delete op; - } - - if (mOutputMgr != nullptr) { - delete mOutputMgr; - } - - if (mTreeLandOutputMgr != nullptr) { - delete mTreeLandOutputMgr; - } -} - -void WQt::Registry::setup() -{ - if (mIsSetup == false) { - mIsSetup = true; - - for (WQt::Registry::ErrorType et : pendingErrors) { - emit errorOccured(et); - } - - for (WQt::Registry::Interface iface : pendingInterfaces) { - emit interfaceRegistered(iface); - } - - for (WQt::Output *op : pendingOutputs) { - emit outputAdded(op); - } - } -} - -wl_registry *WQt::Registry::get() -{ - return mObj; -} - -wl_display *WQt::Registry::waylandDisplay() -{ - return mWlDisplay; -} - -wl_seat *WQt::Registry::waylandSeat() -{ - return mWlSeat; -} - -wl_shm *WQt::Registry::waylandShm() -{ - return mWlShm; -} - -QList WQt::Registry::waylandOutputs() -{ - return mOutputs.values(); -} - -QList WQt::Registry::registeredInterfaces() -{ - return mRegisteredInterfaces; -} - -bool WQt::Registry::waitForInterface(WQt::Registry::Interface id, int timeout) -{ - int t = 0; - - while (t < timeout) { - if (mRegisteredInterfaces.contains(id)) { - return true; - } - - /** We will take 10 ms nap */ - QThread::msleep(10); - - /** Increment the timer */ - t += 10; - - /** Flush the queue */ - QCoreApplication::processEvents(); - } - - return false; -} - -WQt::OutputManager *WQt::Registry::outputManager() -{ - return mOutputMgr; -} - -WQt::TreeLandOutputManager *WQt::Registry::treeLandOutputManager() -{ - return mTreeLandOutputMgr; -} - -void WQt::Registry::handleAnnounce(uint32_t name, const char *interface, uint32_t version) -{ - /** - * We really don't care about wl_seat version right now. - */ - if (strcmp(interface, wl_seat_interface.name) == 0) { - mWlSeat = (wl_seat *)wl_registry_bind(mObj, name, &wl_seat_interface, version); - - if (!mWlSeat) { - emitError(WQt::Registry::EmptySeat); - } - } - - /** - * We really don't care about wl_shm version right now. - */ - if (strcmp(interface, wl_shm_interface.name) == 0) { - mWlShm = (wl_shm *)wl_registry_bind(mObj, name, &wl_shm_interface, version); - - if (!mWlShm) { - emitError(WQt::Registry::EmptyShm); - } - - else { - mRegisteredInterfaces << ShmInterface; - emitInterface(ShmInterface, true); - } - } - - /** - * We really don't care about wl_output version right now. - */ - if (strcmp(interface, wl_output_interface.name) == 0) { - wl_output *op = (wl_output *)wl_registry_bind(mObj, name, &wl_output_interface, version); - - if (op) { - mOutputs[name] = new WQt::Output(op); - emitOutput(mOutputs[name], true); - } - } - - /** - * We've implemented version 2. - * And wlroots 0.15.0 has version 2 available. - */ - else if (strcmp(interface, zwlr_output_manager_v1_interface.name) == 0) { - mWlrOutputMgr = (zwlr_output_manager_v1 *) - wl_registry_bind(mObj, name, &zwlr_output_manager_v1_interface, 2); - - if (!mWlrOutputMgr) { - emitError(WQt::Registry::EmptyOutputManager); - } - - else { - mOutputMgr = new WQt::OutputManager(mWlrOutputMgr); - - mRegisteredInterfaces << OutputManagerInterface; - emitInterface(OutputManagerInterface, true); - } - } - - else if (strcmp(interface, treeland_output_manager_v1_interface.name) == 0) { - m_treeland_output_mgr = (treeland_output_manager_v1 *) - wl_registry_bind(mObj, name, &treeland_output_manager_v1_interface, 1); - if (!m_treeland_output_mgr) { - emitError(WQt::Registry::EmptyTreeLandOuputManager); - } else { - mTreeLandOutputMgr = new WQt::TreeLandOutputManager(m_treeland_output_mgr); - - mRegisteredInterfaces << TreeLandOutputManagerInterface; - emitInterface(TreeLandOutputManagerInterface, true); - } - } -} - -void WQt::Registry::handleRemove(uint32_t name) -{ - /** - * While we do not care about most of the handleRemove, - * we need to worry about the wl_output * objects. - */ - if (mOutputs.keys().contains(name)) { - WQt::Output *output = mOutputs.take(name); - emitOutput(output, false); - } -} - -void WQt::Registry::emitError(ErrorType et) -{ - if (mIsSetup) { - emit errorOccured(et); - } - - else { - pendingErrors << et; - } -} - -void WQt::Registry::emitOutput(WQt::Output *op, bool added) -{ - if (mIsSetup) { - if (added) { - emit outputAdded(op); - } - - else { - emit outputRemoved(op); - } - } - - else { - if (added) { - pendingOutputs << op; - } - - else { - pendingOutputs.removeAll(op); - } - } -} - -void WQt::Registry::emitInterface(WQt::Registry::Interface iface, bool added) -{ - if (mIsSetup) { - if (added) { - emit interfaceRegistered(iface); - } - - else { - emit interfaceDeregistered(iface); - } - } - - else { - if (added) { - pendingInterfaces << iface; - } - - else { - pendingInterfaces.removeAll(iface); - } - } -} diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/Registry.hpp b/dcc-old/src/plugin-display/wayland/libwayqt/Registry.hpp deleted file mode 100644 index b8d0217104..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/Registry.hpp +++ /dev/null @@ -1,197 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#pragma once - -#include -#include - -struct wl_registry; -struct wl_display; -struct wl_seat; -struct wl_shm; -struct wl_output; -// struct wl_compositor; - -struct wl_registry_listener; - -struct xdg_wm_base; -struct zwlr_output_manager_v1; -struct zwlr_gamma_control_manager_v1; -struct treeland_output_manager_v1; - -namespace WQt { -class Registry; -class XdgShell; - -class Output; -class OutputManager; -class TreeLandOutputManager; -} // namespace WQt - -class WQt::Registry : public QObject -{ - Q_OBJECT; - -public: - enum ErrorType { - EmptyShm, - EmptyIdle, - EmptySeat, - EmptyXdgWmBase, - EmptyCompositor, - EmptyOutputManager, - EmptyTreeLandOuputManager - }; - - Q_ENUM(ErrorType); - - enum Interface { - ShmInterface, - IdleInterface, - SeatInterface, - WlrIdleInterface, - XdgWmBaseInterface, - CompositorInterface, - OutputManagerInterface, - TreeLandOutputManagerInterface - }; - - Q_ENUM(Interface); - - Registry(wl_display *wlDisplay); - ~Registry(); - - void setup(); - - wl_registry *get(); - - wl_display *waylandDisplay(); - wl_seat *waylandSeat(); - wl_shm *waylandShm(); - - QList waylandOutputs(); - - /** List the already registered interfaces */ - QList registeredInterfaces(); - - /** - * Wait upto @timeout milliseconds for interface @id to become available. - * NOTE: This is a blocking call. - */ - bool waitForInterface(WQt::Registry::Interface id, int timeout = 500); - - /* Ready to use Wayland Classes */ - - /** - * XdgShell - Xdg Shell protocol implementation - */ - WQt::XdgShell *xdgShell(); - - /** - * OutputManager - Output Management protocol implementation - */ - WQt::OutputManager *outputManager(); - - /** - * TreeLandOutputManager - Primary Output Manager - */ - WQt::TreeLandOutputManager *treeLandOutputManager(); - -private: - /** Raw C pointer to this class */ - wl_registry *mObj = nullptr; - - /** wl_display object */ - wl_display *mWlDisplay = nullptr; - - /** wl_seat object */ - wl_seat *mWlSeat = nullptr; - - /** wl_shm object */ - wl_shm *mWlShm = nullptr; - - /** Connected outputs */ - QHash mOutputs; - - /** List of registered interfaces */ - QList mRegisteredInterfaces; - - /** - * Output Manager Objects - */ - zwlr_output_manager_v1 *mWlrOutputMgr = nullptr; - WQt::OutputManager *mOutputMgr = nullptr; - - /** - * Gamma Control Objects - */ - zwlr_gamma_control_manager_v1 *mWlrGammaCtrl = nullptr; - - treeland_output_manager_v1 *m_treeland_output_mgr = nullptr; - WQt::TreeLandOutputManager *mTreeLandOutputMgr = nullptr; - - static const wl_registry_listener mRegListener; - static void globalAnnounce(void *data, - wl_registry *registry, - uint32_t name, - const char *interface, - uint32_t version); - static void globalRemove(void *data, wl_registry *registry, uint32_t name); - - void handleAnnounce(uint32_t name, const char *interface, uint32_t version); - void handleRemove(uint32_t name); - - QList pendingErrors; - QList pendingOutputs; - QList pendingInterfaces; - - /** Flag to ensure setup() is called only once. */ - bool mIsSetup = false; - - /** emit errorOccured or store it in pending */ - void emitError(ErrorType); - - /** - * emit output added/removed or store in pending. - * bool indicates the state: true => added, false => removed. - */ - void emitOutput(WQt::Output *, bool); - - /** - * emit iInterface registered/deregistered, or store in pending. - * bool indicates the state: true => registered, false => deregistered. - */ - void emitInterface(WQt::Registry::Interface, bool); - -signals: - void errorOccured(ErrorType et); - - void outputAdded(WQt::Output *); - void outputRemoved(WQt::Output *); - - void interfaceRegistered(WQt::Registry::Interface); - void interfaceDeregistered(WQt::Registry::Interface); -}; diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.cpp b/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.cpp deleted file mode 100644 index f79e039c65..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.cpp +++ /dev/null @@ -1,45 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "TreeLandOutputManager.hpp" - -#include "treeland-output-management-client-protocol.h" - -#include - -#include -#include -#include -#include - -WQt::TreeLandOutputManager::TreeLandOutputManager(treeland_output_manager_v1 *opMgr) -{ - mObj = opMgr; - treeland_output_manager_v1_add_listener(mObj, &mListener, this); -} - -WQt::TreeLandOutputManager::~TreeLandOutputManager() -{ - treeland_output_manager_v1_destroy(mObj); -} - -void WQt::TreeLandOutputManager::setPrimaryOutput(const char *name) -{ - treeland_output_manager_v1_set_primary_output(mObj, name); -} - -void WQt::TreeLandOutputManager::handlePrimaryOutput( - void *data, - struct treeland_output_manager_v1 *treeland_output_manager_v1, - const char *output_name) -{ - Q_UNUSED(treeland_output_manager_v1) - WQt::TreeLandOutputManager *manager = reinterpret_cast(data); - manager->mPrimaryOutput = QString::fromLocal8Bit(output_name); - emit manager->primaryOutputChanged(output_name); -} - -const treeland_output_manager_v1_listener WQt::TreeLandOutputManager::mListener = { - handlePrimaryOutput -}; diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.hpp b/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.hpp deleted file mode 100644 index aadae0d07e..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/TreeLandOutputManager.hpp +++ /dev/null @@ -1,47 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2024 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include - -#include -#include -#include -#include - -struct wl_buffer; -struct wl_output; -struct treeland_output_manager_v1; -struct treeland_output_manager_v1_listener; - -namespace WQt { -class TreeLandOutputManager; -} - -class WQt::TreeLandOutputManager : public QObject -{ - Q_OBJECT; - -public: - TreeLandOutputManager(treeland_output_manager_v1 *); - ~TreeLandOutputManager(); - - /** Set the primary output */ - void setPrimaryOutput(const char *); - - QString mPrimaryOutput; - -private: - static void handlePrimaryOutput(void *data, - struct treeland_output_manager_v1 *treeland_output_manager_v1, - const char *output_name); - - static const treeland_output_manager_v1_listener mListener; - - treeland_output_manager_v1 *mObj; - -Q_SIGNALS: - void primaryOutputChanged(const char *); -}; diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.cpp b/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.cpp deleted file mode 100644 index 34d76c3283..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.cpp +++ /dev/null @@ -1,187 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#include "WayQtUtils.hpp" - -#include -#include - -#include -#include -#include - -wl_display *WQt::Wayland::display() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_display *display = - reinterpret_cast(native->nativeResourceForIntegration("display")); - - return display; -} - -wl_compositor *WQt::Wayland::compositor() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_compositor *display = - reinterpret_cast(native->nativeResourceForIntegration("compositor")); - - return display; -} - -wl_seat *WQt::Wayland::seat() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_seat *display = - reinterpret_cast(native->nativeResourceForIntegration("wl_seat")); - - return display; -} - -wl_pointer *WQt::Wayland::pointer() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_pointer *display = - reinterpret_cast(native->nativeResourceForIntegration("wl_pointer")); - - return display; -} - -wl_keyboard *WQt::Wayland::keyboard() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_keyboard *display = - reinterpret_cast(native->nativeResourceForIntegration("wl_keyboard")); - - return display; -} - -wl_touch *WQt::Wayland::touch() -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_touch *display = - reinterpret_cast(native->nativeResourceForIntegration("wl_touch")); - - return display; -} - -void WQt::Utils::flushDisplay() -{ - wl_display_flush(WQt::Wayland::display()); -} - -void WQt::Utils::displayRoundtrip() -{ - wl_display_roundtrip(WQt::Wayland::display()); -} - -wl_output *WQt::Utils::wlOutputFromQScreen(QScreen *screen) -{ - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_output *output = - reinterpret_cast(native->nativeResourceForScreen("output", screen)); - - return output; -} - -wl_surface *WQt::Utils::wlSurfaceFromQWindow(QWindow *window) -{ - window->create(); - QPlatformNativeInterface *native = QGuiApplication::platformNativeInterface(); - - if (!native) { - return nullptr; - } - - struct wl_surface *surface = - reinterpret_cast(native->nativeResourceForWindow("surface", window)); - - return surface; -} - -bool WQt::Utils::isWayland() -{ - /* Check if XDG_SESSION_TYPE is set */ - QString session = qgetenv("XDG_SESSION_TYPE"); - - if (session.toLower() == QStringLiteral("wayland")) { - return true; - } - - /* - * May be XDG_SESSION_TYPE is not set. Try Harder. - * We check if WAYLAND_DISPLAY is set. - */ - QString wlID = qgetenv("WAYLAND_DISPLAY"); - - if (not wlID.isEmpty()) { - return true; - } - - /* It's probably not a wayland session. */ - return false; -} - -bool WQt::Utils::isTreeland() -{ - /** Checking the WAYFIRE_CONFIG_FILE variable is sufficient for our cause */ - static auto diff = qgetenv("DDE_CURRENT_COMPOSITOR").compare("TreeLand", Qt::CaseInsensitive); - - return diff == 0; -} diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.hpp b/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.hpp deleted file mode 100644 index a6a7fca988..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/WayQtUtils.hpp +++ /dev/null @@ -1,61 +0,0 @@ -/** - * The MIT License (MIT) - * - * Copyright (c) 2021 Marcus Britanicus (https://gitlab.com/marcusbritanicus) - * Copyright (c) 2021 Abrar (https://gitlab.com/s96Abrar) - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - **/ - -#pragma once - -class QWindow; -class QScreen; - -struct wl_display; -struct wl_compositor; -struct wl_touch; -struct wl_keyboard; -struct wl_seat; -struct wl_pointer; - -struct wl_output; -struct wl_surface; - -namespace WQt { -namespace Wayland { -struct wl_display *display(); -struct wl_compositor *compositor(); -struct wl_seat *seat(); -struct wl_pointer *pointer(); -struct wl_keyboard *keyboard(); -struct wl_touch *touch(); -} // namespace Wayland - -namespace Utils { -struct wl_output *wlOutputFromQScreen(QScreen *screen); -struct wl_surface *wlSurfaceFromQWindow(QWindow *window); - -void flushDisplay(); -void displayRoundtrip(); - -bool isWayland(); -bool isTreeland(); -} // namespace Utils -} // namespace WQt diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/protocols/treeland-output-management.xml b/dcc-old/src/plugin-display/wayland/libwayqt/protocols/treeland-output-management.xml deleted file mode 100644 index de018189ff..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/protocols/treeland-output-management.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - . - SPDX-License-Identifier: MIT - ]]> - - - - Protocol for telling which is the primary display among the selection of enabled outputs. - - - - - - - - - - Specifies which output is the primary one identified by their name. - - - - - - - - - - - diff --git a/dcc-old/src/plugin-display/wayland/libwayqt/protocols/wlr-output-management-unstable-v1.xml b/dcc-old/src/plugin-display/wayland/libwayqt/protocols/wlr-output-management-unstable-v1.xml deleted file mode 100644 index bf0cc9329a..0000000000 --- a/dcc-old/src/plugin-display/wayland/libwayqt/protocols/wlr-output-management-unstable-v1.xml +++ /dev/null @@ -1,554 +0,0 @@ - - - - Copyright © 2019 Purism SPC - - Permission to use, copy, modify, distribute, and sell this - software and its documentation for any purpose is hereby granted - without fee, provided that the above copyright notice appear in - all copies and that both that copyright notice and this permission - notice appear in supporting documentation, and that the name of - the copyright holders not be used in advertising or publicity - pertaining to distribution of the software without specific, - written prior permission. The copyright holders make no - representations about the suitability of this software for any - purpose. It is provided "as is" without express or implied - warranty. - - THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS - SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND - FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY - SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN - AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, - ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF - THIS SOFTWARE. - - - - This protocol exposes interfaces to obtain and modify output device - configuration. - - Warning! The protocol described in this file is experimental and - backward incompatible changes may be made. Backward compatible changes - may be added together with the corresponding interface version bump. - Backward incompatible changes are done by bumping the version number in - the protocol and interface names and resetting the interface version. - Once the protocol is to be declared stable, the 'z' prefix and the - version number in the protocol and interface names are removed and the - interface version number is reset. - - - - - This interface is a manager that allows reading and writing the current - output device configuration. - - Output devices that display pixels (e.g. a physical monitor or a virtual - output in a window) are represented as heads. Heads cannot be created nor - destroyed by the client, but they can be enabled or disabled and their - properties can be changed. Each head may have one or more available modes. - - Whenever a head appears (e.g. a monitor is plugged in), it will be - advertised via the head event. Immediately after the output manager is - bound, all current heads are advertised. - - Whenever a head's properties change, the relevant wlr_output_head events - will be sent. Not all head properties will be sent: only properties that - have changed need to. - - Whenever a head disappears (e.g. a monitor is unplugged), a - wlr_output_head.finished event will be sent. - - After one or more heads appear, change or disappear, the done event will - be sent. It carries a serial which can be used in a create_configuration - request to update heads properties. - - The information obtained from this protocol should only be used for output - configuration purposes. This protocol is not designed to be a generic - output property advertisement protocol for regular clients. Instead, - protocols such as xdg-output should be used. - - - - - This event introduces a new head. This happens whenever a new head - appears (e.g. a monitor is plugged in) or after the output manager is - bound. - - - - - - - This event is sent after all information has been sent after binding to - the output manager object and after any subsequent changes. This applies - to child head and mode objects as well. In other words, this event is - sent whenever a head or mode is created or destroyed and whenever one of - their properties has been changed. Not all state is re-sent each time - the current configuration changes: only the actual changes are sent. - - This allows changes to the output configuration to be seen as atomic, - even if they happen via multiple events. - - A serial is sent to be used in a future create_configuration request. - - - - - - - Create a new output configuration object. This allows to update head - properties. - - - - - - - - Indicates the client no longer wishes to receive events for output - configuration changes. However the compositor may emit further events, - until the finished event is emitted. - - The client must not send any more requests after this one. - - - - - - This event indicates that the compositor is done sending manager events. - The compositor will destroy the object immediately after sending this - event, so it will become invalid and the client should release any - resources associated with it. - - - - - - - A head is an output device. The difference between a wl_output object and - a head is that heads are advertised even if they are turned off. A head - object only advertises properties and cannot be used directly to change - them. - - A head has some read-only properties: modes, name, description and - physical_size. These cannot be changed by clients. - - Other properties can be updated via a wlr_output_configuration object. - - Properties sent via this interface are applied atomically via the - wlr_output_manager.done event. No guarantees are made regarding the order - in which properties are sent. - - - - - This event describes the head name. - - The naming convention is compositor defined, but limited to alphanumeric - characters and dashes (-). Each name is unique among all wlr_output_head - objects, but if a wlr_output_head object is destroyed the same name may - be reused later. The names will also remain consistent across sessions - with the same hardware and software configuration. - - Examples of names include 'HDMI-A-1', 'WL-1', 'X11-1', etc. However, do - not assume that the name is a reflection of an underlying DRM - connector, X11 connection, etc. - - If the compositor implements the xdg-output protocol and this head is - enabled, the xdg_output.name event must report the same name. - - The name event is sent after a wlr_output_head object is created. This - event is only sent once per object, and the name does not change over - the lifetime of the wlr_output_head object. - - - - - - - This event describes a human-readable description of the head. - - The description is a UTF-8 string with no convention defined for its - contents. Examples might include 'Foocorp 11" Display' or 'Virtual X11 - output via :1'. However, do not assume that the name is a reflection of - the make, model, serial of the underlying DRM connector or the display - name of the underlying X11 connection, etc. - - If the compositor implements xdg-output and this head is enabled, - the xdg_output.description must report the same description. - - The description event is sent after a wlr_output_head object is created. - This event is only sent once per object, and the description does not - change over the lifetime of the wlr_output_head object. - - - - - - - This event describes the physical size of the head. This event is only - sent if the head has a physical size (e.g. is not a projector or a - virtual device). - - - - - - - - This event introduces a mode for this head. It is sent once per - supported mode. - - - - - - - This event describes whether the head is enabled. A disabled head is not - mapped to a region of the global compositor space. - - When a head is disabled, some properties (current_mode, position, - transform and scale) are irrelevant. - - - - - - - This event describes the mode currently in use for this head. It is only - sent if the output is enabled. - - - - - - - This events describes the position of the head in the global compositor - space. It is only sent if the output is enabled. - - - - - - - - This event describes the transformation currently applied to the head. - It is only sent if the output is enabled. - - - - - - - This events describes the scale of the head in the global compositor - space. It is only sent if the output is enabled. - - - - - - - The compositor will destroy the object immediately after sending this - event, so it will become invalid and the client should release any - resources associated with it. - - - - - - - This event describes the manufacturer of the head. - - This must report the same make as the wl_output interface does in its - geometry event. - - Together with the model and serial_number events the purpose is to - allow clients to recognize heads from previous sessions and for example - load head-specific configurations back. - - It is not guaranteed this event will be ever sent. A reason for that - can be that the compositor does not have information about the make of - the head or the definition of a make is not sensible in the current - setup, for example in a virtual session. Clients can still try to - identify the head by available information from other events but should - be aware that there is an increased risk of false positives. - - It is not recommended to display the make string in UI to users. For - that the string provided by the description event should be preferred. - - - - - - - This event describes the model of the head. - - This must report the same model as the wl_output interface does in its - geometry event. - - Together with the make and serial_number events the purpose is to - allow clients to recognize heads from previous sessions and for example - load head-specific configurations back. - - It is not guaranteed this event will be ever sent. A reason for that - can be that the compositor does not have information about the model of - the head or the definition of a model is not sensible in the current - setup, for example in a virtual session. Clients can still try to - identify the head by available information from other events but should - be aware that there is an increased risk of false positives. - - It is not recommended to display the model string in UI to users. For - that the string provided by the description event should be preferred. - - - - - - - This event describes the serial number of the head. - - Together with the make and model events the purpose is to allow clients - to recognize heads from previous sessions and for example load head- - specific configurations back. - - It is not guaranteed this event will be ever sent. A reason for that - can be that the compositor does not have information about the serial - number of the head or the definition of a serial number is not sensible - in the current setup. Clients can still try to identify the head by - available information from other events but should be aware that there - is an increased risk of false positives. - - It is not recommended to display the serial_number string in UI to - users. For that the string provided by the description event should be - preferred. - - - - - - - - This object describes an output mode. - - Some heads don't support output modes, in which case modes won't be - advertised. - - Properties sent via this interface are applied atomically via the - wlr_output_manager.done event. No guarantees are made regarding the order - in which properties are sent. - - - - - This event describes the mode size. The size is given in physical - hardware units of the output device. This is not necessarily the same as - the output size in the global compositor space. For instance, the output - may be scaled or transformed. - - - - - - - - This event describes the mode's fixed vertical refresh rate. It is only - sent if the mode has a fixed refresh rate. - - - - - - - This event advertises this mode as preferred. - - - - - - The compositor will destroy the object immediately after sending this - event, so it will become invalid and the client should release any - resources associated with it. - - - - - - - This object is used by the client to describe a full output configuration. - - First, the client needs to setup the output configuration. Each head can - be either enabled (and configured) or disabled. It is a protocol error to - send two enable_head or disable_head requests with the same head. It is a - protocol error to omit a head in a configuration. - - Then, the client can apply or test the configuration. The compositor will - then reply with a succeeded, failed or cancelled event. Finally the client - should destroy the configuration object. - - - - - - - - - - - Enable a head. This request creates a head configuration object that can - be used to change the head's properties. - - - - - - - - Disable a head. - - - - - - - Apply the new output configuration. - - In case the configuration is successfully applied, there is no guarantee - that the new output state matches completely the requested - configuration. For instance, a compositor might round the scale if it - doesn't support fractional scaling. - - After this request has been sent, the compositor must respond with an - succeeded, failed or cancelled event. Sending a request that isn't the - destructor is a protocol error. - - - - - - Test the new output configuration. The configuration won't be applied, - but will only be validated. - - Even if the compositor succeeds to test a configuration, applying it may - fail. - - After this request has been sent, the compositor must respond with an - succeeded, failed or cancelled event. Sending a request that isn't the - destructor is a protocol error. - - - - - - Sent after the compositor has successfully applied the changes or - tested them. - - Upon receiving this event, the client should destroy this object. - - If the current configuration has changed, events to describe the changes - will be sent followed by a wlr_output_manager.done event. - - - - - - Sent if the compositor rejects the changes or failed to apply them. The - compositor should revert any changes made by the apply request that - triggered this event. - - Upon receiving this event, the client should destroy this object. - - - - - - Sent if the compositor cancels the configuration because the state of an - output changed and the client has outdated information (e.g. after an - output has been hotplugged). - - The client can create a new configuration with a newer serial and try - again. - - Upon receiving this event, the client should destroy this object. - - - - - - Using this request a client can tell the compositor that it is not going - to use the configuration object anymore. Any changes to the outputs - that have not been applied will be discarded. - - This request also destroys wlr_output_configuration_head objects created - via this object. - - - - - - - This object is used by the client to update a single head's configuration. - - It is a protocol error to set the same property twice. - - - - - - - - - - - - - This request sets the head's mode. - - - - - - - This request assigns a custom mode to the head. The size is given in - physical hardware units of the output device. If set to zero, the - refresh rate is unspecified. - - It is a protocol error to set both a mode and a custom mode. - - - - - - - - - This request sets the head's position in the global compositor space. - - - - - - - - This request sets the head's transform. - - - - - - - This request sets the head's scale. - - - - - diff --git a/dcc-old/src/plugin-display/window/DisplayPlugin.json b/dcc-old/src/plugin-display/window/DisplayPlugin.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-display/window/DisplayPlugin.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-display/window/brightnesswidget.cpp b/dcc-old/src/plugin-display/window/brightnesswidget.cpp deleted file mode 100644 index ab78edca97..0000000000 --- a/dcc-old/src/plugin-display/window/brightnesswidget.cpp +++ /dev/null @@ -1,344 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "brightnesswidget.h" -#include "operation/displaymodel.h" -#include "operation/monitor.h" - -#include "widgets/dccslider.h" - -#include -#include - -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -const double BrightnessMaxScale = 100.0; -const int PercentageNum = 100; -const double DoubleZero = 0.01; //后端传入的doube指为浮点型,有效位数为2位小数,存在精度丢失 - -BrightnessWidget::BrightnessWidget(QWidget *parent) - : QWidget(parent) - , m_displayModel(nullptr) - , m_centralLayout(new QVBoxLayout(this)) - , m_autoLightSpacerItem(new QSpacerItem(0, 10)) - , m_autoLightMode(new SwitchWidget(this)) - , m_colorSpacerItem(new QSpacerItem(0, 20)) - , m_tempratureColorWidget(new QWidget(this)) - , m_nightShift(new SwitchWidget(this)) - , m_settingsGroup(new SettingsGroup(nullptr, SettingsGroup::GroupBackground)) - , m_nightManual(new SwitchWidget(this)) - , m_cctItem(new TitledSliderItem(QString(), this)) - , m_nightShiftSpacerItem(new QSpacerItem(0, 10)) - , m_nightTipsSpacerItem(new QSpacerItem(0, 6)) - , m_nightManualSpacerItem(new QSpacerItem(0, 20)) -{ - m_centralLayout->setMargin(0); - m_centralLayout->setSpacing(0); - - m_brightnessTitle = new TitleLabel(tr("Brightness"), this); - - m_tempratureColorTitle = new TitleLabel(tr("Color Temperature"), this); - m_centralLayout->addWidget(m_brightnessTitle); - - m_centralLayout->addSpacerItem(m_autoLightSpacerItem); - - m_autoLightMode->setTitle(tr("Auto Brightness")); - m_autoLightMode->addBackground(); - m_autoLightMode->setVisible(false); - m_centralLayout->addWidget(m_autoLightMode); - - m_centralLayout->addSpacerItem(m_colorSpacerItem); - - m_centralLayout->addWidget(m_tempratureColorTitle); - - m_nightShift->setTitle(tr("Night Shift")); - m_nightShift->addBackground(); - m_centralLayout->addSpacerItem(m_nightShiftSpacerItem); - m_centralLayout->addWidget(m_nightShift); - - m_nightTips = new DTipLabel(tr("The screen hue will be auto adjusted according to your location"), m_tempratureColorWidget); - m_tempratureColorWidget->setAccessibleName("BrightnessWidget_tempratureColor"); - m_nightTips->setForegroundRole(DPalette::TextTips); - m_nightTips->setWordWrap(true); - m_nightTips->setAlignment(Qt::AlignTop | Qt::AlignLeft); - m_nightTips->adjustSize(); - m_nightTips->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); - m_nightTips->setContentsMargins(10, 0, 0, 0); - m_centralLayout->addSpacerItem(m_nightTipsSpacerItem); - m_centralLayout->addWidget(m_nightTips); - - m_nightManual->setTitle(tr("Change Color Temperature")); - m_cctItem->setAnnotations({tr("Cool"), "", tr("Warm")}); - m_settingsGroup->appendItem(m_nightManual); - m_settingsGroup->appendItem(m_cctItem); - m_centralLayout->addSpacerItem(m_nightManualSpacerItem); - m_centralLayout->addWidget(m_settingsGroup); - - m_tempratureColorWidget->setLayout(m_centralLayout); - m_centralLayout->addWidget(m_tempratureColorWidget); - setLayout(m_centralLayout); -} - -BrightnessWidget::~BrightnessWidget() -{ -} - -void BrightnessWidget::setMode(DisplayModel *model) -{ - m_displayModel = model; - - connect(m_autoLightMode, &SwitchWidget::checkedChanged, this, &BrightnessWidget::requestAmbientLightAdjustBrightness); - connect(m_displayModel, &DisplayModel::adjustCCTmodeChanged, this, &BrightnessWidget::setAdjustCCTmode); - connect(m_nightManual, &SwitchWidget::checkedChanged, this, [=](const bool enable) { - if (enable) { - Q_EMIT requestSetMethodAdjustCCT(2); - } else { - Q_EMIT requestSetMethodAdjustCCT(0); - } - }); - connect(m_nightShift, &SwitchWidget::checkedChanged, this, [=](const bool enable) { - if (enable) { - Q_EMIT requestSetMethodAdjustCCT(1); - } else { - Q_EMIT requestSetMethodAdjustCCT(0); - } - }); - connect(m_displayModel, &DisplayModel::autoLightAdjustVaildChanged, this, [=](const bool enable) { - m_autoLightSpacerItem->changeSize(0, enable ? 10 : 0); - m_autoLightMode->setVisible(enable); - }); - connect(m_displayModel, &DisplayModel::autoLightAdjustSettingChanged, m_autoLightMode, &SwitchWidget::setChecked); - - m_autoLightSpacerItem->changeSize(0, model->autoLightAdjustIsValid() ? 10 : 0); - m_autoLightMode->setVisible(model->autoLightAdjustIsValid()); - m_autoLightMode->setChecked(model->isAudtoLightAdjust()); - setAdjustCCTmode(model->adjustCCTMode()); //0不调节色温 1 自动调节 2手动调节 - setColorTemperatureVisible(model->redshiftIsValid()); - connect(model, &DisplayModel::redshiftVaildChanged, this, &BrightnessWidget::setColorTemperatureVisible); - - addSlider(); -} - -void BrightnessWidget::setColorTemperatureVisible(bool visible) -{ - m_nightShiftSpacerItem->changeSize(0, visible ? 10 : 0); - m_nightTipsSpacerItem->changeSize(0, visible ? 6 : 0); - m_nightManualSpacerItem->changeSize(0, visible ? 20 : 0); - m_nightShift->setVisible(visible); - m_tempratureColorTitle->setVisible(visible); - m_tempratureColorWidget->setVisible(visible); - m_nightTips->setVisible(visible); - m_nightManual->setVisible(visible); - m_cctItem->setVisible(visible && m_displayModel->adjustCCTMode() == 2); -} - -void BrightnessWidget::setAdjustCCTmode(int mode) -{ - m_nightShift->blockSignals(true); - m_nightManual->blockSignals(true); - m_nightShift->switchButton()->setChecked(mode == 1); - m_nightManual->switchButton()->setChecked(mode == 2); - m_cctItem->blockSignals(true); - //当布局器A中嵌套布局器B时,B中的控件隐藏时,需要先隐藏B再隐藏控件,消除控件闪动问题 - m_settingsGroup->hide(); - m_cctItem->setVisible(m_displayModel->adjustCCTMode() == 2); - m_settingsGroup->show(); - m_cctItem->blockSignals(false); - m_nightShift->blockSignals(false); - m_nightManual->blockSignals(false); -} - -void BrightnessWidget::showBrightness(Monitor *monitor) -{ - bool bTitle(false); - QMap::const_iterator iter; - for (iter = m_monitorBrightnessMap.cbegin(); iter != m_monitorBrightnessMap.cend(); ++iter) { - iter.value()->setVisible(monitor == nullptr || iter.key() == monitor); - if (!bTitle && (monitor == nullptr || iter.key() == monitor)) { - bTitle = true; - } - } - m_brightnessTitle->setVisible(bTitle); - //色温模块不显示的时候 设置空白区域高度为0 - m_colorSpacerItem->changeSize(0, bTitle && m_displayModel->redshiftIsValid() ? 20 : 0); -} - -void BrightnessWidget::addSlider() -{ - auto monList = m_displayModel->monitorList(); - for (auto monitor : monList) { - if (!monitor->canBrightness()) { - monList.removeOne(monitor); - } - } - - for (int i = 0; i < monList.size(); ++i) { - //单独显示每个亮度调节名 - TitledSliderItem *slideritem = new TitledSliderItem(monList[i]->name(), this); - slideritem->setAccessibleName("BrightnessWidget_TitledSliderItem"); - slideritem->addBackground(); - DCCSlider *slider = slideritem->slider(); - int maxBacklight = static_cast(m_displayModel->maxBacklightBrightness()); - if (maxBacklight == 0) { - qDebug() << "MinimumBrightness: " << m_displayModel->minimumBrightnessScale(); - int miniScale = int(m_displayModel->minimumBrightnessScale() * BrightnessMaxScale); - double brightness = monList[i]->brightness(); - slideritem->setValueLiteral(brightnessToTickInterval(brightness)); - slider->setRange(miniScale, int(BrightnessMaxScale)); - slider->setType(DCCSlider::Vernier); - slider->setTickPosition(QSlider::TicksBelow); - slider->setLeftIcon(DIconTheme::findQIcon("dcc_brightnesslow")); - slider->setRightIcon(DIconTheme::findQIcon("dcc_brightnesshigh")); - slider->setIconSize(QSize(24, 24)); - slider->setTickInterval(int((BrightnessMaxScale - miniScale) / 5.0)); - slider->setValue(int(brightness * BrightnessMaxScale)); - slider->setPageStep(1); - - auto onValueChanged = [=](int pos) { - this->requestSetMonitorBrightness(monList[i], pos / BrightnessMaxScale); - this->requestAmbientLightAdjustBrightness(false); - this->m_autoLightMode->setChecked(false); - }; - - connect(slider, &DCCSlider::valueChanged, this, onValueChanged); - connect(slider, &DCCSlider::sliderMoved, this, onValueChanged); - - connect(monList[i], &Monitor::brightnessChanged, this, [=](const double rb) { - slider->blockSignals(true); - if ((rb - m_displayModel->minimumBrightnessScale()) < 0.00001) { - slideritem->setValueLiteral(QString("%1%").arg(int(m_displayModel->minimumBrightnessScale() * BrightnessMaxScale))); - slider->setValue(int(m_displayModel->minimumBrightnessScale() * BrightnessMaxScale)); - } else { - slideritem->setValueLiteral(QString("%1%").arg(int(rb * BrightnessMaxScale))); - slider->setValue(int(rb * BrightnessMaxScale)); - } - slider->blockSignals(false); - }); - - connect(m_displayModel, &DisplayModel::minimumBrightnessScaleChanged, - this, [=](const double ms) { - double rb = monList[i]->brightness(); - int tmini = int(ms * PercentageNum); - slider->setMinimum(tmini); - slider->setTickInterval(int((BrightnessMaxScale - tmini) / 5.0)); - - slider->blockSignals(true); - slideritem->setValueLiteral(brightnessToTickInterval(rb)); - slider->setValue(int(rb * BrightnessMaxScale)); - slider->blockSignals(false); - }); - } else { - qDebug() << "MinimumBrightness: " << m_displayModel->minimumBrightnessScale(); - m_miniScales = int(m_displayModel->minimumBrightnessScale() * maxBacklight); - if (m_miniScales == 0) { - m_miniScales = 1; - } - double brightness = monList[i]->brightness(); - slideritem->setValueLiteral(brightnessToTickInterval(brightness)); - slider->setRange(m_miniScales, maxBacklight); - slider->setType(DCCSlider::Vernier); - slider->setTickPosition(QSlider::TicksBelow); - slider->setLeftIcon(DIconTheme::findQIcon("dcc_brightnesslow")); - slider->setRightIcon(DIconTheme::findQIcon("dcc_brightnesshigh")); - slider->setIconSize(QSize(24, 24)); - slider->setTickInterval(1); - slider->setValue(int((brightness + DoubleZero) * maxBacklight)); - slider->setPageStep(1); - QStringList speedList; - int j = m_miniScales; - for (; j <= maxBacklight; j++) { - speedList << ""; - } - slideritem->setAnnotations(speedList); - - auto onValueChanged = [=](int pos) { - this->requestSetMonitorBrightness(monList[i], pos / double(maxBacklight)); - this->requestAmbientLightAdjustBrightness(false); - this->m_autoLightMode->setChecked(false); - }; - - connect(slider, &DCCSlider::valueChanged, this, onValueChanged); - connect(slider, &DCCSlider::sliderMoved, this, onValueChanged); - - connect(monList[i], &Monitor::brightnessChanged, this, [=](const double rb) { - slider->blockSignals(true); - slideritem->setValueLiteral(brightnessToTickInterval(rb)); - if ((rb - m_displayModel->minimumBrightnessScale()) < 0.00001) { - slider->setValue(int((m_displayModel->minimumBrightnessScale() + DoubleZero) * maxBacklight)); - } else { - slider->setValue(int((rb + DoubleZero) * maxBacklight)); - } - slider->blockSignals(false); - }); - - connect(m_displayModel, &DisplayModel::minimumBrightnessScaleChanged, - this, [=](const double ms) { - double rb = monList[i]->brightness(); - int tmini = int(ms * PercentageNum); - slider->setMinimum(tmini); - slider->setTickInterval(int((BrightnessMaxScale - tmini) / 5.0)); - - slider->blockSignals(true); - slideritem->setValueLiteral(brightnessToTickInterval(rb)); - slider->setValue(int((rb + DoubleZero) * BrightnessMaxScale)); - slider->blockSignals(false); - }); - } - QWidget *brightnessSlideritem = new QWidget(this); - brightnessSlideritem->setAccessibleName("brightnessSlideritem"); - QVBoxLayout *sliderLayout = new QVBoxLayout(brightnessSlideritem); - sliderLayout->setContentsMargins(0, 10, 0, 0); - sliderLayout->addWidget(slideritem); - brightnessSlideritem->setLayout(sliderLayout); - m_centralLayout->insertWidget(1, brightnessSlideritem); - m_monitorBrightnessMap[monList[i]] = brightnessSlideritem; - } - - DCCSlider *cctSlider = m_cctItem->slider(); - cctSlider->setRange(0, 100); - cctSlider->setType(DCCSlider::Vernier); - cctSlider->setTickPosition(QSlider::TicksBelow); - cctSlider->setTickInterval(10); - cctSlider->setPageStep(1); - cctSlider->setValue(colorTemperatureToValue(m_displayModel->colorTemperature())); - connect(m_displayModel, &DisplayModel::colorTemperatureChanged, this, [=](int value) { - cctSlider->blockSignals(true); - cctSlider->setValue(colorTemperatureToValue(value)); - cctSlider->blockSignals(false); - }); - - connect(cctSlider, &DCCSlider::valueChanged, this, [=](int pos) { - int kelvin = pos > 50 ? (6500 - (pos - 50) * 100) : (6500 + (50 - pos) * 300); - this->requestSetColorTemperature(kelvin); - }); - connect(cctSlider, &DCCSlider::sliderMoved, this, [=](int pos) { - int kelvin = pos > 50 ? (6500 - (pos - 50) * 100) : (6500 + (50 - pos) * 300); - this->requestSetColorTemperature(kelvin); - }); -} - -int BrightnessWidget::colorTemperatureToValue(int kelvin) -{ - //色温范围有效值10000-25000 值越大,色温越冷,不开启色温时值为6500,超过18000基本看不出变化,小于1500色温实际效果没法看,无实际价值 - //此处取有效至1500-21500 - if (kelvin >= 6500) - return 50 - (kelvin - 6500) / 300; - else if (kelvin < 6500 && kelvin >= 1000) - return 50 - (kelvin - 6500) / 100; - else - return 0; -} - -QString BrightnessWidget::brightnessToTickInterval(const double tb) const -{ - int tmini = int(m_displayModel->minimumBrightnessScale() * BrightnessMaxScale); - int tnum = int(tb * BrightnessMaxScale); - tnum = tnum > tmini ? tnum : tmini; - return QString::number(int(tnum)) + "%"; -} diff --git a/dcc-old/src/plugin-display/window/brightnesswidget.h b/dcc-old/src/plugin-display/window/brightnesswidget.h deleted file mode 100644 index dd57c81805..0000000000 --- a/dcc-old/src/plugin-display/window/brightnesswidget.h +++ /dev/null @@ -1,81 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef BRIGHTNESSWIDGET_H -#define BRIGHTNESSWIDGET_H - -#include "interface/namespace.h" - -#include "widgets/titlelabel.h" -#include "widgets/settingsgroup.h" -#include "widgets/switchwidget.h" -#include "widgets/titledslideritem.h" - -#include -#include - -#include - -class QLabel; -class QVBoxLayout; -class QSpacerItem; - -namespace DCC_NAMESPACE { - -class TipsLabel; -class SwitchWidget; -class SettingsGroup; -class TitledSliderItem; -class Monitor; -class DisplayModel; - -class BrightnessWidget : public QWidget -{ - Q_OBJECT -public: - explicit BrightnessWidget(QWidget *parent = nullptr); - ~BrightnessWidget(); - -public: - void setMode(DisplayModel *model); - void setAdjustCCTmode(int mode); - void showBrightness(Monitor *monitor = nullptr); - -Q_SIGNALS: - void requestSetMonitorBrightness(Monitor *monitor, const double brightness); - void requestAmbientLightAdjustBrightness(const bool able); - void requestSetColorTemperature(const int value); - void requestSetMethodAdjustCCT(const int mode); - -private: - void addSlider(); - int colorTemperatureToValue(int kelvin); - QString brightnessToTickInterval(const double tb) const; - void setColorTemperatureVisible(bool visible); - -private: - DisplayModel *m_displayModel; - - QVBoxLayout *m_centralLayout; - TitleLabel *m_brightnessTitle; - QSpacerItem *m_autoLightSpacerItem; - SwitchWidget *m_autoLightMode; - QSpacerItem *m_colorSpacerItem; - QWidget *m_tempratureColorWidget; - TitleLabel *m_tempratureColorTitle; - SwitchWidget *m_nightShift; - DTK_WIDGET_NAMESPACE::DTipLabel *m_nightTips; - SettingsGroup *m_settingsGroup; - SwitchWidget *m_nightManual; - TitledSliderItem *m_cctItem; - QSpacerItem *m_nightShiftSpacerItem; - QSpacerItem *m_nightTipsSpacerItem; - QSpacerItem *m_nightManualSpacerItem; - - int m_miniScales = 0; - QMap m_monitorBrightnessMap; -}; - -} - -#endif // BRIGHTNESSWIDGET_H diff --git a/dcc-old/src/plugin-display/window/cooperationsettingsdialog.cpp b/dcc-old/src/plugin-display/window/cooperationsettingsdialog.cpp deleted file mode 100644 index 8effbf2c99..0000000000 --- a/dcc-old/src/plugin-display/window/cooperationsettingsdialog.cpp +++ /dev/null @@ -1,183 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "cooperationsettingsdialog.h" - -#include -#include -#include -#include - -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -CooperationSettingsDialog::CooperationSettingsDialog(QWidget *parent) - : DAbstractDialog(parent) - , m_mainLayout(new QVBoxLayout(this)) - , m_mousekeyboardSwitch(new SwitchWidget(this)) - , m_shearSwitch(new SwitchWidget(this)) - , m_storageItem(new FileChooseWidget(this)) - , m_buttonTuple(new ButtonTuple(ButtonTuple::Save, this)) -{ - initWidget(); - initConnect(); - QWidget::installEventFilter(this); - m_storageItem->edit()->lineEdit()->installEventFilter(this); -} - -CooperationSettingsDialog::~CooperationSettingsDialog() -{ - -} - -void CooperationSettingsDialog::onSetWindowEnabled(const bool isEnabled) -{ - this->setEnabled(isEnabled); -} - -void CooperationSettingsDialog::setOpenSharedDevices(bool on) -{ - m_mousekeyboardSwitch->setChecked(on); -} - -void CooperationSettingsDialog::setOpenSharedClipboard(bool on) -{ - m_shearSwitch->setChecked(on); -} - -void CooperationSettingsDialog::setFilesStoragePath(const QString &path) -{ - m_storagePath = path; - m_storageItem->edit()->setText(path); -} - -void CooperationSettingsDialog::closeEvent(QCloseEvent *event) -{ - QDialog::closeEvent(event); -} - -bool CooperationSettingsDialog::eventFilter(QObject *o, QEvent *e) -{ - // 实现鼠标点击编辑框,确定按钮激活,统一网络模块处理,捕捉FocusIn消息 - if (e->type() == QEvent::FocusIn) { - if (dynamic_cast(o)) { - setButtonEnabled(); - } - } - - if (o == this && QEvent::WindowDeactivate == e->type()) { - clearFocus(); - setFocus(); - return true; - } - return false; -} - -void CooperationSettingsDialog::initWidget() -{ - setFixedSize(QSize(480, 362)); -// m_mainLayout->setAlignment(Qt::AlignVCenter); - - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("Collaboration Settings")); - - // 共享鼠标键盘 - m_mousekeyboardSwitch->setTitle(tr("Share mouse and keyboard")); - m_mousekeyboardSwitch->addBackground(); - m_mousekeyboardSwitch->setContentsMargins(10, 0, 10, 0); - - // 提示信息 - m_mousekeyboardTips = new DTipLabel(tr("Share your mouse and keyboard across devices"), this); - m_mousekeyboardTips->setForegroundRole(DPalette::TextTips); - m_mousekeyboardTips->setWordWrap(true); - m_mousekeyboardTips->setAlignment(Qt::AlignTop | Qt::AlignLeft); - m_mousekeyboardTips->adjustSize(); - m_mousekeyboardTips->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); - m_mousekeyboardTips->setContentsMargins(20, 0, 0, 0); - - // 剪切板共享 - m_shearSwitch->setTitle(tr("Share clipboard")); - m_shearSwitch->addBackground(); - m_shearSwitch->setContentsMargins(10, 0, 10, 0); - - // 共享存储 - m_storageItem->setTitle(tr("Storage path for shared files")); - m_storageItem->edit()->setDialogDisplayPosition(DFileChooserEdit::DialogDisplayPosition::FollowParentWindow); - m_storageItem->setContentsMargins(10, 0, 10, 0); - m_storageTips = new DTipLabel(tr("Share the copied content across devices"), this); - m_storageTips->setForegroundRole(DPalette::TextTips); - m_storageTips->setWordWrap(true); - m_storageTips->setAlignment(Qt::AlignTop | Qt::AlignLeft); - m_storageTips->adjustSize(); - m_storageTips->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); - m_storageTips->setContentsMargins(20, 0, 0, 0); - - // 下方按钮 - QPushButton *cancelBtn = m_buttonTuple->leftButton(); - QPushButton *acceptBtn = m_buttonTuple->rightButton(); - - cancelBtn->setText(tr("Cancel", "button")); - acceptBtn->setText(tr("Confirm", "button")); - setButtonDisabled(); - m_buttonTuple->setContentsMargins(75, 0, 75, 0); - - m_mainLayout->addWidget(titleIcon, Qt::AlignTop); - m_mainLayout->addSpacing(20); - m_mainLayout->addWidget(m_mousekeyboardSwitch, 0, Qt::AlignVCenter); - m_mainLayout->addWidget(m_mousekeyboardTips, 0, Qt::AlignVCenter); - m_mainLayout->addSpacing(15); - - m_mainLayout->addWidget(m_shearSwitch, 0, Qt::AlignVCenter); - m_mainLayout->addSpacing(15); - m_mainLayout->addWidget(m_storageItem, 0, Qt::AlignVCenter); - m_mainLayout->addWidget(m_storageTips, 0, Qt::AlignVCenter); - m_mainLayout->addSpacing(30); - - m_mainLayout->addWidget(m_buttonTuple); - m_mainLayout->addSpacing(10); - - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(0); - m_mainLayout->setContentsMargins(10, 0, 10, 0); - setLayout(m_mainLayout); - - this->activateWindow(); - this->setFocus(); -} - -void CooperationSettingsDialog::initConnect() -{ - connect(m_storageItem->edit()->lineEdit(), &QLineEdit::textChanged, [this](const QString& filePath){ - if (filePath != m_storagePath) { - setFilesStoragePath(filePath); - } - setButtonTupleState(true); - }); - connect(m_shearSwitch, &SwitchWidget::checkedChanged, this, &CooperationSettingsDialog::setButtonEnabled); - connect(m_mousekeyboardSwitch, &SwitchWidget::checkedChanged, this, &CooperationSettingsDialog::setButtonEnabled); - connect(m_buttonTuple->leftButton(), &QPushButton::clicked, this, &CooperationSettingsDialog::close); - connect(m_buttonTuple->rightButton(), &QPushButton::clicked, this, &CooperationSettingsDialog::accept); -} - -void CooperationSettingsDialog::setButtonTupleState(bool state) -{ - m_buttonTuple->rightButton()->setChecked(state); -} - -void CooperationSettingsDialog::setButtonEnabled() -{ - m_buttonTuple->leftButton()->setEnabled(true); - m_buttonTuple->rightButton()->setEnabled(true); -} - -void CooperationSettingsDialog::setButtonDisabled() -{ - m_buttonTuple->leftButton()->setDisabled(true); - m_buttonTuple->rightButton()->setDisabled(true); -} diff --git a/dcc-old/src/plugin-display/window/cooperationsettingsdialog.h b/dcc-old/src/plugin-display/window/cooperationsettingsdialog.h deleted file mode 100644 index 64bdab5163..0000000000 --- a/dcc-old/src/plugin-display/window/cooperationsettingsdialog.h +++ /dev/null @@ -1,71 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef COOPERATIONSETTINGSDIALOG_H -#define COOPERATIONSETTINGSDIALOG_H - -#include "filechoosewidget.h" - -#include "interface/namespace.h" - -#include "widgets/buttontuple.h" -#include "widgets/switchwidget.h" - -#include -#include -#include - -QT_BEGIN_NAMESPACE -class QDialog; -class QVBoxLayout; -QT_END_NAMESPACE - -// 协同设置 -class CooperationSettingsDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit CooperationSettingsDialog(QWidget *parent = nullptr); - ~CooperationSettingsDialog(); - - void onSetWindowEnabled(const bool isEnabled); - - DCC_NAMESPACE::SwitchWidget *mousekeyboardSwitch() { return m_mousekeyboardSwitch; } - DCC_NAMESPACE::SwitchWidget *shearClipboardSwitch() { return m_shearSwitch; } - DCC_NAMESPACE::ButtonTuple *buttonTuple() { return m_buttonTuple; } - const QString& storagePath() { return m_storagePath; } - -Q_SIGNALS: - void requestFilesStoragePath(const QString &path); - -public Q_SLOTS: - void setOpenSharedDevices(bool on); - void setOpenSharedClipboard(bool on); - void setFilesStoragePath(const QString& path); - void setButtonEnabled(); - void setButtonDisabled(); - -protected: - void closeEvent(QCloseEvent *event) override; - bool eventFilter(QObject *o, QEvent *e) override; - -private: - void initWidget(); - void initConnect(); - void setButtonTupleState(bool state); - -private: - QVBoxLayout *m_mainLayout; - DCC_NAMESPACE::SwitchWidget *m_mousekeyboardSwitch; - DTK_WIDGET_NAMESPACE::DTipLabel *m_mousekeyboardTips; - - DCC_NAMESPACE::SwitchWidget *m_shearSwitch; // 剪切板共享 - - FileChooseWidget *m_storageItem; // 共享存储 - DTK_WIDGET_NAMESPACE::DTipLabel *m_storageTips; - - DCC_NAMESPACE::ButtonTuple *m_buttonTuple; - QString m_storagePath; -}; - -#endif // COOPERATIONSETTINGSDIALOG_H diff --git a/dcc-old/src/plugin-display/window/displaymodule.cpp b/dcc-old/src/plugin-display/window/displaymodule.cpp deleted file mode 100644 index 19777ca7a8..0000000000 --- a/dcc-old/src/plugin-display/window/displaymodule.cpp +++ /dev/null @@ -1,488 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "displaymodule.h" -#include "brightnesswidget.h" -#include "scalingwidget.h" -#include "resolutionwidget.h" -#include "refreshratewidget.h" -#include "rotatewidget.h" -#include "multiscreenwidget.h" -#include "timeoutdialog.h" - -#include "operation/displaymodel.h" -#include "operation/displayworker.h" - -#include -#include - -#include -#include -#include - -DGUI_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -QString DisplayPlugin::name() const -{ - return QStringLiteral("display"); -} - -ModuleObject * DisplayPlugin::module() -{ - //一级菜单--显示 - ModuleObject *moduleInterface = new PageModule(); - moduleInterface->setName("display"); - moduleInterface->setDisplayName(tr("Display")); - moduleInterface->setDescription(tr("Light, resolution, scaling and etc")); - moduleInterface->setIcon(DIconTheme::findQIcon("dcc_nav_display")); - - DisplayModule *displayModule = new DisplayModule(moduleInterface); - moduleInterface->appendChild(displayModule); - return moduleInterface; -} - -QString DisplayPlugin::location() const -{ - return "2"; -} - -QWidget *DisplayModule::page() -{ - m_displayWidget = new QWidget(); - - QVBoxLayout *contentLayout = new QVBoxLayout; - contentLayout->setSpacing(0); - contentLayout->setContentsMargins(0, 0, 0, 0); - m_displayWidget->setLayout(contentLayout); - - pushScreenWidget(); - - return m_displayWidget; -} - -DisplayModule::DisplayModule(QObject *parent) - : ModuleObject(parent) - , m_model(nullptr) - , m_worker(nullptr) - , m_displayWidget(nullptr) -{ - if (m_model) { - delete m_model; - } - m_model = new DisplayModel(this); - m_worker = new DisplayWorker(m_model, this); - - connect(m_model, &DisplayModel::monitorListChanged, this, [=] { - pushScreenWidget(); - }); - - //wayland下没有主屏和副屏之分 所以mainwindow窗体想要居中,直接使用QGuiApplication::primaryScreen()方法 - //获取的主屏的信息是错误的,所以不能直接使用。现在的方法是通过/com/deepin/daemon/Display服务获取主屏的名称 - //然后再在QGuiApplication::screens()中匹配,从而获取主屏的信息。 - connect(m_model, &DisplayModel::monitorListChanged, this, [=] { - for (auto mon : m_model->monitorList()) { - if (mon->isPrimary()) { - setPrimaryScreen(mon->getQScreen()); - } - } - }); - - connect(m_model, &DisplayModel::primaryScreenChanged, this, [=] (QString primary) { - if (!primary.isEmpty()) { - for (auto mon : m_model->monitorList()) { - if (mon->name() == primary) { - setPrimaryScreen(mon->getQScreen()); - } - } - } - }); -} - -DisplayModule::~DisplayModule() -{ -} - -void DisplayModule::active() -{ - m_worker->active(); -} - -void DisplayModule::deactive() -{ - m_displayWidget = nullptr; - m_primaryScreen = nullptr; -} - -void DisplayModule::showSingleScreenWidget() -{ - QWidget *singleScreenWidget = new QWidget(); - - QVBoxLayout *contentLayout = new QVBoxLayout; - contentLayout->setSpacing(0); - contentLayout->setContentsMargins(0, 20, 0, 0); - - BrightnessWidget *brightnessWidget = new BrightnessWidget(singleScreenWidget); - brightnessWidget->setMode(m_model); - contentLayout->addWidget(brightnessWidget); - const bool brightnessIsEnabled = m_model->brightnessEnable() && m_model->primaryMonitor() && m_model->primaryMonitor()->canBrightness(); - brightnessWidget->setVisible(brightnessIsEnabled); - connect(brightnessWidget, &BrightnessWidget::requestSetColorTemperature, m_worker, &DisplayWorker::setColorTemperature); - connect(brightnessWidget, &BrightnessWidget::requestSetMonitorBrightness, m_worker, &DisplayWorker::setMonitorBrightness); - connect(brightnessWidget, &BrightnessWidget::requestAmbientLightAdjustBrightness, m_worker, &DisplayWorker::setAmbientLightAdjustBrightness); - connect(brightnessWidget, &BrightnessWidget::requestSetMethodAdjustCCT, m_worker, &DisplayWorker::SetMethodAdjustCCT); - - QSpacerItem *scalingSpacerItem = new QSpacerItem(0, brightnessIsEnabled? 20 : 0); - contentLayout->addSpacerItem(scalingSpacerItem); - - ScalingWidget *scalingWidget = new ScalingWidget(singleScreenWidget); - scalingWidget->setModel(m_model); - contentLayout->addWidget(scalingWidget); - connect(scalingWidget, &ScalingWidget::requestUiScaleChange, m_worker, &DisplayWorker::setUiScale); - - QSpacerItem *resolutionSpacerItem = new QSpacerItem(0, 30); - contentLayout->addSpacerItem(resolutionSpacerItem); - - ResolutionWidget *resolutionWidget = new ResolutionWidget(300, singleScreenWidget); - resolutionWidget->setModel(m_model, m_model->monitorList().count() ? m_model->monitorList().first() : nullptr); - contentLayout->addWidget(resolutionWidget); - connect(resolutionWidget, &ResolutionWidget::requestSetResolution, this, [=](Monitor *monitor, const int mode) { - onRequestSetResolution(monitor, mode); - updateWinsize(); - }, Qt::QueuedConnection); - - connect(resolutionWidget, &ResolutionWidget::requestSetFillMode, this, [this](Monitor *monitor, const QString fillMode) { - onRequestSetFillMode(monitor, fillMode); - }); - - RefreshRateWidget *refreshRateWidget = new RefreshRateWidget(300, singleScreenWidget); - refreshRateWidget->setModel(m_model, m_model->monitorList().count() ? m_model->monitorList().first() : nullptr); - contentLayout->addSpacing(20); - contentLayout->addWidget(refreshRateWidget); - connect(refreshRateWidget, &RefreshRateWidget::requestSetResolution, this, &DisplayModule::onRequestSetResolution, Qt::QueuedConnection); - - RotateWidget *rotateWidget = new RotateWidget(300, singleScreenWidget); - rotateWidget->setModel(m_model, m_model->monitorList().count() ? m_model->monitorList().first() : nullptr); - contentLayout->addSpacing(20); - contentLayout->addWidget(rotateWidget); - connect(rotateWidget, &RotateWidget::requestSetRotate, this, &DisplayModule::onRequestSetRotate, Qt::QueuedConnection); - - contentLayout->addStretch(); - - singleScreenWidget->setLayout(contentLayout); - - if(m_displayWidget->layout()->count() > 0) { - QWidget * w = m_displayWidget->layout()->itemAt(0)->widget(); - m_displayWidget->layout()->removeWidget(w); - w->setParent(nullptr); - delete w; - } - m_displayWidget->layout()->addWidget(singleScreenWidget); - - auto setBrightnessWidget = [brightnessWidget, scalingSpacerItem, this]() { - const bool visible = m_model->brightnessEnable() && m_model->primaryMonitor() && m_model->primaryMonitor()->canBrightness(); - scalingSpacerItem->changeSize(0, visible ? 20 : 0); - brightnessWidget->setVisible(visible); - }; - - connect(m_model, &DisplayModel::primaryScreenChanged, brightnessWidget ,setBrightnessWidget); - connect(m_model, &DisplayModel::brightnessEnableChanged, brightnessWidget ,setBrightnessWidget); -} - -void DisplayModule::updateWinsize(QRect rect) -{ - if (!m_displayWidget || !m_displayWidget->window()) { - return; - } - - DMainWindow* topWidget = qobject_cast(m_displayWidget->window()); - - if (!qApp->screens().contains(m_primaryScreen)) - return; - - if(!topWidget) - return; - - if(topWidget->isMaximized()) - return; - - int w = m_primaryScreen->geometry().width(); - int h = m_primaryScreen->geometry().height(); - if (rect.width() && rect.height()) { - w = rect.width(); - h = rect.height(); - } - int WidgetMinimumWidth = qMin(w, 800); - int WidgetMinimumHeight = qMin(h, 600); - - topWidget->setMinimumSize(QSize(WidgetMinimumWidth, WidgetMinimumHeight)); - - topWidget->move(QPoint(m_primaryScreen->geometry().left() + (w - topWidget->geometry().width()) / 2, - m_primaryScreen->geometry().top() + (h - topWidget->geometry().height()) / 2)); -} - -void DisplayModule::setPrimaryScreen(QScreen *screen) -{ - if(m_primaryScreen == screen) - return; - - m_primaryScreen = screen; - updateWinsize(); - connect(m_primaryScreen, &QScreen::geometryChanged, this, &DisplayModule::updateWinsize); -} - -void DisplayModule::showMultiScreenWidget() -{ - connect(m_model, &DisplayModel::displayModeChanged, this, [this]() { - onSetFillMode(); - updateWinsize(); - }); - - MultiScreenWidget *multiScreenWidget = new MultiScreenWidget(); - multiScreenWidget->setModel(m_model); - connect(multiScreenWidget, &MultiScreenWidget::requestSwitchMode, m_worker, &DisplayWorker::switchMode); - connect(multiScreenWidget, &MultiScreenWidget::requestSetMonitorPosition, m_worker, &DisplayWorker::setMonitorPosition); - connect(multiScreenWidget, &MultiScreenWidget::requestSetPrimary, m_worker, &DisplayWorker::setPrimary); - connect(multiScreenWidget, &MultiScreenWidget::requestSetColorTemperature, m_worker, &DisplayWorker::setColorTemperature); - connect(multiScreenWidget, &MultiScreenWidget::requestSetMonitorBrightness, m_worker, &DisplayWorker::setMonitorBrightness); - connect(multiScreenWidget, &MultiScreenWidget::requestAmbientLightAdjustBrightness, m_worker, &DisplayWorker::setAmbientLightAdjustBrightness); - connect(multiScreenWidget, &MultiScreenWidget::requestSetMethodAdjustCCT, m_worker, &DisplayWorker::SetMethodAdjustCCT); - connect(multiScreenWidget, &MultiScreenWidget::requestUiScaleChange, m_worker, &DisplayWorker::setUiScale); - - connect(multiScreenWidget, &MultiScreenWidget::requestSetResolution, this, [=](Monitor *monitor, const int mode) { - onRequestSetResolution(monitor, mode); - updateWinsize(); - }, Qt::QueuedConnection); - connect(multiScreenWidget, &MultiScreenWidget::requestSetFillMode, this, [this](Monitor *monitor, const QString fillMode) { - onRequestSetFillMode(monitor, fillMode); - }); - - connect(multiScreenWidget, &MultiScreenWidget::requestCurrFillModeChanged, this, [this](Monitor *monitor, const QString currfillMode) { - if (m_model->displayMode() == MERGE_MODE && monitor->isPrimary()) { - for (auto m : m_model->monitorList()) - m_worker->setCurrentFillMode(m, currfillMode); - } - }); - - connect(multiScreenWidget, &MultiScreenWidget::requestSetRotate, this, &DisplayModule::onRequestSetRotate, Qt::QueuedConnection); - connect(multiScreenWidget, &MultiScreenWidget::requestSetMainwindowRect, this, [=](Monitor *moi, bool isInit) { - Q_UNUSED(moi) - bool stateChanged = false; - //窗口初始化且窗口最大化的时候不需要移动窗口 - if (!m_displayWidget->window()) { - return; - } - - if (m_displayWidget->window()->isMaximized()) { - if(isInit){ - return; - } -// m_pMainWindow->setNeedRememberLastSize(false); -// m_pMainWindow->showNormal(); - -// QSize lastsize = m_pMainWindow->getLastSize(); -// if (!lastsize.isValid() || lastsize == m_pMainWindow->maximumSize()) { -// lastsize.setWidth(m_pMainWindow->minimumWidth()); -// lastsize.setHeight(m_pMainWindow->minimumHeight()); -// } -// m_pMainWindow->resize(lastsize); - stateChanged = true; - } - - if (stateChanged) { - m_displayWidget->window()->showMaximized(); - } - - QScreen *screen = m_model->primaryMonitor()->getQScreen(); - if (qApp->screens().contains(screen)) { - m_displayWidget->window()->setGeometry(QRect(screen->geometry().topLeft(),m_displayWidget->window()->size())); - m_displayWidget->window()->move(QPoint(screen->geometry().left() + (screen->geometry().width() - m_displayWidget->window()->width()) / 2, - screen->geometry().top() + (screen->geometry().height() - m_displayWidget->window()->height()) / 2)); - } - }); - - if(m_displayWidget->layout()->count() > 0) { - QWidget * w = m_displayWidget->layout()->itemAt(0)->widget(); - m_displayWidget->layout()->removeWidget(w); - w->setParent(nullptr); - delete w; - } - m_displayWidget->layout()->addWidget(multiScreenWidget); -} - -void DisplayModule::onRequestSetResolution(Monitor *monitor, const uint mode) -{ - Resolution firstRes; - QString lastFillMode = m_model->primaryMonitor()->currentFillMode(); - - for (auto res : monitor->modeList()) { - if (res.id() == mode) { - firstRes = res; - break; - } - } - - auto tfunc = [this](Monitor *tmon, Resolution tmode) { - if (m_model->displayMode() == MERGE_MODE) { - for (auto monitor : m_model->monitorList()) { - bool bFind = false; - for (auto res : monitor->modeList()) { - if (res == tmode) { - m_worker->setMonitorResolution(monitor, res.id()); - bFind = true; - break; - } - } - if (!bFind) { - m_worker->setMonitorResolutionBySize(monitor, tmode.width(), tmode.height()); - } - } - } else { - m_worker->setMonitorResolution(tmon, tmode.id()); - } - - // 扩展模式调整分辨率时会再次调整显示屏位置,此时会调用两次applyChanges接口, - // 修改分辨率调用applyChanges后任务栏会响应分辨率改变信号,然后调整大小,造成部分界面显示到第二个屏幕 - // 只有一个屏幕时displayMode可能是EXTEND_MODE,同时需要判断显示数量 - if (m_model->displayMode() != EXTEND_MODE || m_model->monitorList().size() < 2) - m_worker->applyChanges(); - }; - m_worker->backupConfig(); - tfunc(monitor, firstRes); - - //此处处理调用applyChanges的200ms延时, TimeoutDialog提前弹出的问题 - QTimer::singleShot(300, monitor, [this, monitor, lastFillMode]{ - if (showTimeoutDialog(monitor) == QDialog::Accepted) { - m_worker->saveChanges(); - } else { - m_worker->resetBackup(); - } - }); -} - -void DisplayModule::onSetFillMode(QString currFullMode) -{ - if (m_model->primaryMonitor() == nullptr) - return; - - if (currFullMode.isEmpty()) - currFullMode = m_model->primaryMonitor()->currentFillMode(); - - //切分辨率时,如果是复制模式下,桌面显示不支持,全部切换为拉伸 否则以主屏为主 - if (m_model->displayMode() == MERGE_MODE) { - for (auto m : m_model->monitorList()) { - if(!m_model->allSupportFillModes()) - m_worker->setCurrentFillMode(m, m_model->defaultFillMode()); - else - m_worker->setCurrentFillMode(m, currFullMode); - } - } -} - -void DisplayModule::onRequestSetFillMode(Monitor *monitor, const QString fillMode) -{ - auto lastFillMode = monitor->currentFillMode(); - if (m_model->displayMode() == MERGE_MODE) { - for (auto m : m_model->monitorList()) { - m_worker->backupConfig(); - m_worker->setCurrentFillMode(m, fillMode); - } - } else { - m_worker->backupConfig(); - m_worker->setCurrentFillMode(monitor, fillMode); - } - //桌面显示增加15秒倒计时功能 - QTimer::singleShot(300, monitor, [this, monitor, lastFillMode]{ - if (showTimeoutDialog(monitor, true) != QDialog::Accepted) { - m_worker->resetBackup(); - } - m_worker->clearBackup(); - }); -} - -void DisplayModule::onRequestSetRotate(Monitor *monitor, const int rotate) -{ - m_worker->backupConfig(); - m_worker->setMonitorRotate(monitor, rotate); - m_worker->applyChanges(); - - //此处处理调用applyChanges的200ms延时, TimeoutDialog提前弹出的问题 - QTimer::singleShot(300, monitor, [this, monitor]{ - if (showTimeoutDialog(monitor) == QDialog::Accepted) { - m_worker->saveChanges(); - } else { - // 若是重力感应 调整后不对数据进行保存 - if (monitor->currentRotateMode() != Monitor::RotateMode::Gravity) { - m_worker->resetBackup(); - } - } - }); -} - -void DisplayModule::pushScreenWidget() -{ - if (!m_displayWidget) - return; - if (m_model->monitorList().size() > 1) { - showMultiScreenWidget(); - } else { - showSingleScreenWidget(); - } -} - -int DisplayModule::showTimeoutDialog(Monitor *monitor, const bool isFillMode) -{ - TimeoutDialog *timeoutDialog = new TimeoutDialog(15); - qreal radio = qApp->devicePixelRatio(); - QRectF rt(monitor->x(), monitor->y(), monitor->w() / radio, monitor->h() / radio); - QTimer::singleShot(1, this, [=] { timeoutDialog->moveToCenterByRect(rt.toRect()); }); - // 若用户切换重力旋转 直接退出对话框 - if (!isFillMode) { - connect(monitor, &Monitor::currentRotateModeChanged, timeoutDialog, &TimeoutDialog::close); - } - - connect(monitor, &Monitor::geometryChanged, timeoutDialog, [=] { - if (timeoutDialog) { - QRectF rt(monitor->x(), monitor->y(), monitor->w() / radio, monitor->h() / radio); - timeoutDialog->moveToCenterByRect(rt.toRect()); - } - }); - connect(m_model, &DisplayModel::monitorListChanged, timeoutDialog, &TimeoutDialog::reject); - - return timeoutDialog->exec(); -} - -void DisplayModule::showDisplayRecognize() -{ - // 复制模式 - if (m_model->displayMode() == MERGE_MODE) { - QString text = m_model->monitorList().first()->name(); - for (int idx = 1; idx < m_model->monitorList().size(); idx++) { - text += QString(" = %1").arg(m_model->monitorList()[idx]->name()); - } - - // 所在显示器不存在显示框 - if (m_recognizeWidget.value(text) == nullptr) { - RecognizeWidget *widget = new RecognizeWidget(m_model->monitorList()[0], text); - QTimer::singleShot(5000, this, [=] { - widget->deleteLater(); - m_recognizeWidget.remove(text); - }); - m_recognizeWidget[text] = widget; - } - } else { // 扩展模式 - for (auto monitor : m_model->monitorList()) { - // 所在显示器不存在显示框 - if (m_recognizeWidget.value(monitor->name()) == nullptr) { - RecognizeWidget *widget = new RecognizeWidget(monitor, monitor->name()); - m_recognizeWidget[monitor->name()] = widget; - QTimer::singleShot(5000, this, [=] { - widget->deleteLater(); - m_recognizeWidget.remove(monitor->name()); - }); - m_recognizeWidget[monitor->name()] = widget; - } - } - } -} diff --git a/dcc-old/src/plugin-display/window/displaymodule.h b/dcc-old/src/plugin-display/window/displaymodule.h deleted file mode 100644 index 34e4e334d2..0000000000 --- a/dcc-old/src/plugin-display/window/displaymodule.h +++ /dev/null @@ -1,67 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef DISPLAYMODULE_H -#define DISPLAYMODULE_H - -#include "interface/namespace.h" -#include "interface/pagemodule.h" -#include "interface/plugininterface.h" -#include "window/recognizewidget.h" - -class Resolution; -class QVBoxLayout; - -namespace DCC_NAMESPACE { -class DisplayModel; -class Monitor; -class DisplayWorker; - -class DisplayPlugin : public PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Display" FILE "DisplayPlugin.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - virtual QString name() const override; - virtual ModuleObject *module() override; - virtual QString location() const override; -}; - -class DisplayModule : public ModuleObject -{ - Q_OBJECT -public: - explicit DisplayModule(QObject *parent = nullptr); - ~DisplayModule(); - virtual QWidget *page() override; - DisplayWorker *work() { return m_worker; } - DisplayModel *model() { return m_model; } - -protected: - virtual void active() override; - virtual void deactive() override; - -private Q_SLOTS: - void onRequestSetResolution(Monitor *monitor, const uint mode); - void onRequestSetRotate(Monitor *monitor, const int rotate); - void onRequestSetFillMode(Monitor *monitor, const QString fillMode); - void showSingleScreenWidget(); - void showMultiScreenWidget(); - void pushScreenWidget(); - int showTimeoutDialog(Monitor *monitor, const bool isFillMode = false); - void onSetFillMode(QString currFullMode = ""); - void showDisplayRecognize(); - void updateWinsize(QRect rect = QRect(0,0,0,0)); - void setPrimaryScreen(QScreen *screen); - -private: - DisplayModel *m_model; - DisplayWorker *m_worker; - QWidget *m_displayWidget; - QMap m_recognizeWidget; - QScreen *m_primaryScreen; -}; -} - -#endif // DISPLAYMODULE_H diff --git a/dcc-old/src/plugin-display/window/filechoosewidget.cpp b/dcc-old/src/plugin-display/window/filechoosewidget.cpp deleted file mode 100644 index b154dd6ebc..0000000000 --- a/dcc-old/src/plugin-display/window/filechoosewidget.cpp +++ /dev/null @@ -1,41 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "filechoosewidget.h" - -#include - -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -FileChooseWidget::FileChooseWidget(QWidget *parent) - : SettingsItem(parent) - , m_fileChooserEdit(new DFileChooserEdit(this)) - , m_title(new QLabel) -{ - m_title->setFixedWidth(110); - QHBoxLayout *mainLayout = new QHBoxLayout; - mainLayout->addWidget(m_title); - m_fileChooserEdit->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); - m_fileChooserEdit->setFileMode(QFileDialog::Directory); - mainLayout->addWidget(m_fileChooserEdit); - setLayout(mainLayout); -} - -void FileChooseWidget::setTitle(const QString &title) -{ - m_title->setText(title); - setAccessibleName(title); - m_title->setWordWrap(true); -} - -void FileChooseWidget::setIsErr(const bool err) -{ - m_fileChooserEdit->setAlert(err); -} diff --git a/dcc-old/src/plugin-display/window/filechoosewidget.h b/dcc-old/src/plugin-display/window/filechoosewidget.h deleted file mode 100644 index f777837d74..0000000000 --- a/dcc-old/src/plugin-display/window/filechoosewidget.h +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef FILECHOOSEWIDGET_H -#define FILECHOOSEWIDGET_H - -#include "widgets/settingsitem.h" -#include - -QT_BEGIN_NAMESPACE -class QLabel; -QT_END_NAMESPACE - -class FileChooseWidget : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT - -public: - explicit FileChooseWidget(QWidget *parent = nullptr); - - DTK_WIDGET_NAMESPACE::DFileChooserEdit *edit() const { return m_fileChooserEdit; } - void setTitle(const QString &title); - virtual void setIsErr(const bool err = true) override; - -Q_SIGNALS: - void requestFrameKeepAutoHide(const bool autoHide) const; - -private: - DTK_WIDGET_NAMESPACE::DFileChooserEdit *m_fileChooserEdit; - QLabel *m_title; -}; -#endif // FILECHOOSEWIDGET_H diff --git a/dcc-old/src/plugin-display/window/monitorcontrolwidget.cpp b/dcc-old/src/plugin-display/window/monitorcontrolwidget.cpp deleted file mode 100644 index 3d69dc77f0..0000000000 --- a/dcc-old/src/plugin-display/window/monitorcontrolwidget.cpp +++ /dev/null @@ -1,90 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "monitorcontrolwidget.h" -#include "monitorsground.h" -#include "operation/displaymodel.h" - -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -MonitorControlWidget::MonitorControlWidget(int activateHeight, QWidget *parent) - : QFrame(parent) - , m_screensGround(new MonitorsGround(activateHeight,this)) - , m_recognize(new QPushButton(DIconTheme::findQIcon("dcc_recognize"), tr("Identify"))) - , m_gather(new QPushButton(DIconTheme::findQIcon("dcc_gather"), tr("Gather Windows"))) - , m_effectiveReminder(new QLabel(this)) -{ - m_screensGround->setAccessibleName("screensGround"); - - m_recognize->setFocusPolicy(Qt::NoFocus); - m_recognize->setMinimumWidth(106); - m_recognize->setMinimumHeight(36); - m_gather->setFocusPolicy(Qt::NoFocus); - m_gather->setMinimumWidth(106); - m_gather->setMinimumHeight(36); - m_effectiveReminder->setAlignment(Qt::AlignCenter); - - QHBoxLayout *btnsLayout = new QHBoxLayout; - btnsLayout->addStretch(); - btnsLayout->addWidget(m_recognize); - btnsLayout->setSpacing(20); - btnsLayout->addWidget(m_gather); - btnsLayout->addStretch(); - - QVBoxLayout *mainLayout = new QVBoxLayout; - mainLayout->setMargin(0); - mainLayout->setSpacing(20); - mainLayout->addWidget(m_screensGround); - mainLayout->addWidget(m_effectiveReminder); - mainLayout->addLayout(btnsLayout); - - setLayout(mainLayout); - - connect(m_recognize, &QPushButton::clicked, this, &MonitorControlWidget::requestRecognize); - connect(m_gather, &QPushButton::clicked, this, [=] { - Q_EMIT requestGatherWindows(QCursor::pos()); - }); - connect(m_screensGround, &MonitorsGround::requestApplySettings, this, &MonitorControlWidget::requestSetMonitorPosition); - connect(m_screensGround, &MonitorsGround::showsecondaryScreen, this, &MonitorControlWidget::requestShowsecondaryScreen); - connect(m_screensGround, &MonitorsGround::requestMonitorPress, this, &MonitorControlWidget::requestMonitorPress); - connect(m_screensGround, &MonitorsGround::requestMonitorRelease, this, &MonitorControlWidget::requestMonitorRelease); - connect(m_screensGround, &MonitorsGround::setEffectiveReminderVisible, this, &MonitorControlWidget::onSetEffectiveReminderVisible); -} - -void MonitorControlWidget::setModel(DisplayModel *model, Monitor *moni) -{ - m_screensGround->setModel(model, moni); -} - -void MonitorControlWidget::setMergeMode(bool val) -{ - m_screensGround->setMergeMode(val); -} - -void MonitorControlWidget::setScreensMerged(const int mode) -{ - m_recognize->setVisible(mode != SINGLE_MODE); - m_gather->setVisible(mode == EXTEND_MODE); - m_gather->setEnabled(mode == EXTEND_MODE); -} - -void MonitorControlWidget::onSetEffectiveReminderVisible(bool visible, int nEffectiveTime) -{ - if(visible) - m_effectiveReminder->setText(tr("Screen rearrangement will take effect in %1s after changes").arg(nEffectiveTime)); - else - m_effectiveReminder->setText(""); - -} - -void MonitorControlWidget::onGatherEnabled(const bool enable) -{ - m_gather->setEnabled(enable); -} diff --git a/dcc-old/src/plugin-display/window/monitorcontrolwidget.h b/dcc-old/src/plugin-display/window/monitorcontrolwidget.h deleted file mode 100644 index 230bd09a4f..0000000000 --- a/dcc-old/src/plugin-display/window/monitorcontrolwidget.h +++ /dev/null @@ -1,55 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MONITORCONTROLWIDGET_H -#define MONITORCONTROLWIDGET_H - -#include "interface/namespace.h" - -#include - -QT_BEGIN_NAMESPACE -class QLabel; -class QIcon; -class QVBoxLayout; -class QPushButton; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; -class MonitorsGround; -class MonitorControlWidget : public QFrame -{ - Q_OBJECT - -public: - explicit MonitorControlWidget(int activateHeight = 240, QWidget *parent = nullptr); - - void setModel(DisplayModel *model, Monitor *moni = nullptr); - void setScreensMerged(const int mode); - void setMergeMode(bool val); - -Q_SIGNALS: - void requestRecognize() const; - void requestGatherWindows(const QPoint cursor) const; - void requestSetMonitorPosition(QHash> monitorPosition) const; - void requestShowsecondaryScreen() const; - void requestMonitorPress(Monitor *mon); - void requestMonitorRelease(Monitor *mon); - -public Q_SLOTS: - void onGatherEnabled(const bool enable); - void onSetEffectiveReminderVisible(bool visible, int nEffectiveTime); - -private: - MonitorsGround *m_screensGround; - QPushButton *m_recognize; - QPushButton *m_gather; - //多屏设置生效提示 - QLabel *m_effectiveReminder; -}; -} - -#endif // MONITORCONTROLWIDGET_H diff --git a/dcc-old/src/plugin-display/window/monitorindicator.cpp b/dcc-old/src/plugin-display/window/monitorindicator.cpp deleted file mode 100644 index 33aa0ff6d5..0000000000 --- a/dcc-old/src/plugin-display/window/monitorindicator.cpp +++ /dev/null @@ -1,69 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "monitorindicator.h" - -#include -#include -#include - -#define LINE_WIDTH 10 - -using namespace DCC_NAMESPACE; - -MonitorIndicator::MonitorIndicator(QWidget *parent) - : QFrame(nullptr) - , m_topLine(new QFrame(nullptr)) - , m_bottomLine(new QFrame(nullptr)) - , m_leftLine(new QFrame(nullptr)) - , m_rightLine(new QFrame(nullptr)) -{ - Q_UNUSED(parent) - QFrame::setVisible(false); - - QPalette pal = QPalette(); - pal.setColor(QPalette::Window, QColor("#2ca7f8")); - - m_topLine->setWindowFlags(Qt::CoverWindow | Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); - m_topLine->setAutoFillBackground(true); - m_topLine->setPalette(pal); - - m_bottomLine->setWindowFlags(Qt::CoverWindow | Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); - m_bottomLine->setAutoFillBackground(true); - m_bottomLine->setPalette(pal); - - m_leftLine->setWindowFlags(Qt::CoverWindow | Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); - m_leftLine->setAutoFillBackground(true); - m_leftLine->setPalette(pal); - - m_rightLine->setWindowFlags(Qt::CoverWindow | Qt::WindowStaysOnTopHint | Qt::SplashScreen | Qt::FramelessWindowHint | Qt::X11BypassWindowManagerHint); - m_rightLine->setAutoFillBackground(true); - m_rightLine->setPalette(pal); -} - -MonitorIndicator::~MonitorIndicator() -{ - delete m_topLine; - delete m_bottomLine; - delete m_leftLine; - delete m_rightLine; -} - -void MonitorIndicator::setVisible(bool visible) -{ - updateGeometry(); - m_topLine->setVisible(visible); - m_bottomLine->setVisible(visible); - m_leftLine->setVisible(visible); - m_rightLine->setVisible(visible); -} - -void MonitorIndicator::updateGeometry() -{ - QPoint topLeft = mapToGlobal(QPoint(0,0)); - int lineWidth = static_cast(LINE_WIDTH / qApp->devicePixelRatio()); - m_topLine->setGeometry(topLeft.x(), topLeft.y(), width(), lineWidth); - m_bottomLine->setGeometry(topLeft.x(), topLeft.y() + height() - lineWidth, width(), lineWidth); - m_rightLine->setGeometry(topLeft.x() + width() - lineWidth, topLeft.y(), lineWidth, height()); - m_leftLine->setGeometry(topLeft.x(), topLeft.y(), lineWidth, height()); -} diff --git a/dcc-old/src/plugin-display/window/monitorindicator.h b/dcc-old/src/plugin-display/window/monitorindicator.h deleted file mode 100644 index 29da689275..0000000000 --- a/dcc-old/src/plugin-display/window/monitorindicator.h +++ /dev/null @@ -1,40 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MONITORFULLWIDGET_H -#define MONITORFULLWIDGET_H - -#include "interface/namespace.h" - -#include - -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class MonitorIndicator : public QFrame -{ - Q_OBJECT - -public: - explicit MonitorIndicator(QWidget *parent = 0); - ~MonitorIndicator() override; - -public Q_SLOTS: - - virtual void setVisible(bool visible) override; - -private: - void updateGeometry(); - -private: - QFrame *m_topLine; - QFrame *m_bottomLine; - QFrame *m_leftLine; - QFrame *m_rightLine; -}; -} - -#endif // MONITORFULLWIDGET_H diff --git a/dcc-old/src/plugin-display/window/monitorproxywidget.cpp b/dcc-old/src/plugin-display/window/monitorproxywidget.cpp deleted file mode 100644 index 4fbabb9964..0000000000 --- a/dcc-old/src/plugin-display/window/monitorproxywidget.cpp +++ /dev/null @@ -1,196 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "monitorproxywidget.h" -#include "operation/displaymodel.h" - -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -MonitorProxyWidget::MonitorProxyWidget(Monitor *mon, DisplayModel *model) - : m_monitor(mon) - , m_model(model) - , m_movedX(m_monitor->x()) - , m_movedY(m_monitor->y()) - , m_preCenter(QPointF(0,0)) - , m_selected(false) - , m_isMoving(false) - , m_reSplicing(false) -{ - setFlags(QGraphicsItem::ItemIsSelectable | QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsFocusable); -} - -void MonitorProxyWidget::setMovedX(const int x) -{ - m_movedX = x; -} -void MonitorProxyWidget::setMovedY(const int y) -{ - m_movedY = y; -} - - -int MonitorProxyWidget::w() const -{ - //90度和270度 - if (m_monitor->rotate() == 2 || m_monitor->rotate() == 8) { - return m_monitor->currentMode().height(); - } else { - return m_monitor->currentMode().width(); - } -} - -int MonitorProxyWidget::h() const -{ - //90度和270度 - if (m_monitor->rotate() == 2 || m_monitor->rotate() == 8) { - return m_monitor->currentMode().width(); - } else { - return m_monitor->currentMode().height(); - } -} - -const QString MonitorProxyWidget::name() const -{ - return m_monitor->name(); -} - -void MonitorProxyWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) -{ - Q_UNUSED(option); - Q_UNUSED(widget); - - painter->save(); - QRectF r = this->boundingRect(); - painter->setRenderHint(QPainter::Antialiasing, true); - painter->setBrush(QColor("#5f5f5f")); - painter->setPen(QColor("#2e2e2e")); - auto radius = std::max(r.width(), r.height()) / 20; - painter->drawRoundedRect(r, radius, radius); - painter->setClipRect(r); - - QFont font ("Microsoft YaHei", 100, 20); - painter->setFont(font); - const QFontMetrics fm(painter->font()); - - //修复在数字为0的时候,计算的字体宽度偏小导致显示遮挡的问题 - const int width = fm.boundingRect(name()).width() + 100; - const int height = fm.boundingRect(name()).height(); - painter->setPen(Qt::white); - if (m_model->displayMode() != MERGE_MODE) { - if (width > this->w()) { - QString elidedText = fm.elidedText(name(), Qt::ElideRight, this->w() - height); - painter->drawText(QRectF(r.x() + r.width() - width, r.y() + height, width, height), Qt::AlignRight, elidedText); - } else { - painter->drawText(QRectF(r.x() + r.width() - width - height / 2, r.y() + height, width, height), Qt::AlignCenter, name()); - } - } - - // draw dock pattern if it's primary screen - if (m_model->displayMode() == EXTEND_MODE) { - - if(m_monitor->isPrimary()) { - QPen penWhite(Qt::white); - const qreal width = r.width() / 2.0; - const qreal height = r.height() / 2.0; - painter->setBrush(Qt::white); - painter->drawRoundedRect(QRectF(r.x() + r.width() / 4.0, r.y() + r.height() * 9.0 / 10.0,width, height), radius, radius); - } - - //根据是否焦点绘制选中状态 - if (m_selected) { - // draw blue border if the mode is EXTEND_MODE - QPen penWhite(QColor("#2ca7f8")); - penWhite.setWidthF(radius/5.0); - painter->setPen(penWhite); - painter->setBrush(Qt::transparent); - r.adjust(penWhite.width() /2, penWhite.width() / 2, -penWhite.width() /2, -penWhite.width() / 2); - painter->drawRoundedRect(r, radius, radius); - } - } - - painter->restore(); -} - -void MonitorProxyWidget::mousePressEvent(QGraphicsSceneMouseEvent *event) -{ - if (m_model->displayMode() == EXTEND_MODE) { - Q_EMIT requestMonitorPress(m_monitor); - } - QGraphicsItem::mousePressEvent(event); -} - -void MonitorProxyWidget::mouseMoveEvent(QGraphicsSceneMouseEvent *event) -{ - QGraphicsItem::mouseMoveEvent(event); - - if (m_model->displayMode() == EXTEND_MODE) { - m_isMoving = true; - Q_EMIT requestMouseMove(this); - } -} - -void MonitorProxyWidget::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) -{ - if (m_model->displayMode() == EXTEND_MODE) { - - if(m_isMoving) { - Q_EMIT requestMonitorRelease(m_monitor); - m_isMoving = false; - } - } - - QGraphicsItem::mouseReleaseEvent(event); -} - -void MonitorProxyWidget::focusInEvent(QFocusEvent *event) -{ - //增加选中的效果 - m_selected = true; - - QGraphicsItem::focusInEvent(event); -} -void MonitorProxyWidget::focusOutEvent(QFocusEvent *event) -{ - //增加选中的效果 - m_selected = false; - - QGraphicsItem::focusOutEvent(event); -} - -void MonitorProxyWidget::keyPressEvent(QKeyEvent *event) -{ - QGraphicsItem::keyPressEvent(event); - - if (m_model->displayMode() == EXTEND_MODE) { - Q_EMIT requestKeyPress(this, event->key()); - } -} - -QRectF MonitorProxyWidget::boundingRect() const -{ - return QRectF(0, 0, this->w(), this->h()); -} - -QRectF MonitorProxyWidget::bufferboundingRect() const -{ - return boundingRect().adjusted(-200, -200, 200, 200); -} - -QRectF MonitorProxyWidget::justIntersectRect() const -{ - return boundingRect().adjusted(1, 1, -1, -1); -} - -//外扩0.05个像素, 规避由于计算导致精度丢失或者坐标值完全一致的情况下不能判定为相交的情况 -QRectF MonitorProxyWidget::boundingRectEx() const -{ - return boundingRect().adjusted(-0.05, -0.05, 0.05, 0.05); -} diff --git a/dcc-old/src/plugin-display/window/monitorproxywidget.h b/dcc-old/src/plugin-display/window/monitorproxywidget.h deleted file mode 100644 index 9dd3d63aab..0000000000 --- a/dcc-old/src/plugin-display/window/monitorproxywidget.h +++ /dev/null @@ -1,105 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef MONITORPROXYWIDGET_H -#define MONITORPROXYWIDGET_H - -#include "interface/namespace.h" - -#include - -class QScrollArea; -class QKeyEvent; -class QPainter; -class QGraphicsSceneMouseEvent; - -namespace DCC_NAMESPACE { -class DisplayModel; -class Monitor; -class MonitorProxyWidget : public QObject, public QAbstractGraphicsShapeItem -{ - Q_OBJECT -public: - explicit MonitorProxyWidget(Monitor *mon, DisplayModel *model); - - inline int x() const { return m_movedX; } - inline int y() const { return m_movedY; } - - int w() const; - int h() const; - - void setMovedX(const int x); - void setMovedY(const int y); - - const QString name() const; - - inline QPointF getPreCenter() { return m_preCenter; } - inline void setPreCenter(QPointF p) { m_preCenter = p; } - inline bool getReSplicing() { return m_reSplicing; } - inline void setReSplicing(bool value) { m_reSplicing = value; } - - QRectF boundingRect() const override; - QRectF bufferboundingRect() const; - QRectF justIntersectRect() const; - QRectF boundingRectEx() const; - - //自动吸附匹配使用 - //四边区域 左-右-下-上 - inline QRectF bufferboundingRectLeft() const { return QRectF(QPointF(bufferboundingRect().left(), boundingRect().top()), QPointF(boundingRect().left(), boundingRect().bottom())); } - inline QRectF bufferboundingRectRight() const { return QRectF(QPointF(boundingRect().right(), boundingRect().top()), QPointF(bufferboundingRect().right(), boundingRect().bottom())); } - inline QRectF bufferboundingRectBottom() const { return QRectF(QPointF(boundingRect().left(), boundingRect().bottom()), QPointF(boundingRect().right(), bufferboundingRect().bottom())); } - inline QRectF bufferboundingRectTop() const { return QRectF(QPointF(boundingRect().left(), bufferboundingRect().top()), QPointF(boundingRect().right(), boundingRect().top())); } - - //顶点 左上-左下-右上-右下 - inline QRectF bufferboundingRectLeftTop() const { return QRectF(QPointF(bufferboundingRect().left(), bufferboundingRect().top()), QPointF(boundingRect().left(), boundingRect().top())); } - inline QRectF bufferboundingRectLeftBottom() const { return QRectF(QPointF(bufferboundingRect().left(), boundingRect().bottom()), QPointF(boundingRect().left(), bufferboundingRect().bottom())); } - inline QRectF bufferboundingRectRightTop() const { return QRectF(QPointF(boundingRect().right(), bufferboundingRect().top()), QPointF(bufferboundingRect().right(), boundingRect().top())); } - inline QRectF bufferboundingRectRightBottom() const { return QRectF(QPointF(boundingRect().right(), boundingRect().bottom()), QPointF(bufferboundingRect().right(), bufferboundingRect().bottom())); } - - - //刚好相交的边界描述 - //四边区域 左-右-下-上 - inline QRectF justIntersectRectLeft() const { return QRectF(QPointF(boundingRectEx().left(), justIntersectRect().top()), QPointF(justIntersectRect().left(), justIntersectRect().bottom())); } - inline QRectF justIntersectRectRight() const { return QRectF(QPointF(justIntersectRect().right(), justIntersectRect().top()), QPointF(boundingRectEx().right(), justIntersectRect().bottom())); } - inline QRectF justIntersectRectBottom() const { return QRectF(QPointF(justIntersectRect().left(), justIntersectRect().bottom()), QPointF(justIntersectRect().right(), boundingRectEx().bottom())); } - inline QRectF justIntersectRectTop() const { return QRectF(QPointF(justIntersectRect().left(), boundingRectEx().top()), QPointF(justIntersectRect().right(), justIntersectRect().top())); } - - //顶点 左上-左下-右上-右下 - inline QRectF justIntersectRectLeftTop() const { return QRectF(QPointF(boundingRectEx().left(), boundingRectEx().top()), QPointF(justIntersectRect().left(), justIntersectRect().top())); } - inline QRectF justIntersectRectLeftBottom() const { return QRectF(QPointF(boundingRectEx().left(), justIntersectRect().bottom()), QPointF(justIntersectRect().left(), boundingRectEx().bottom())); } - inline QRectF justIntersectRectRightTop() const { return QRectF(QPointF(justIntersectRect().right(), boundingRectEx().top()), QPointF(boundingRectEx().right(), justIntersectRect().top())); } - inline QRectF justIntersectRectRightBottom() const { return QRectF(QPointF(justIntersectRect().right(), justIntersectRect().bottom()), QPointF(boundingRectEx().right(), boundingRectEx().bottom())); } -Q_SIGNALS: - void requestMonitorPress(Monitor *mon); - void requestMonitorRelease(Monitor *mon); - void requestMouseMove(MonitorProxyWidget *self) const; - void requestKeyPress(MonitorProxyWidget *self, int keyValue) const; - -protected: - void mousePressEvent(QGraphicsSceneMouseEvent *event) override; - void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override; - void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override; - void focusInEvent(QFocusEvent *event) override; - void focusOutEvent(QFocusEvent *event) override; - void keyPressEvent(QKeyEvent *event) override; - void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override; - -private: - Monitor *m_monitor; - DisplayModel *m_model; - - int m_movedX; - int m_movedY; - - QPointF m_preCenter; //记录上一次调整的中心点 - - bool m_selected; - bool m_isMoving; //表示item被移动了 - - bool m_reSplicing; //重新拼接 -}; -} - -#endif // MONITORPROXYWIDGET_H diff --git a/dcc-old/src/plugin-display/window/monitorsground.cpp b/dcc-old/src/plugin-display/window/monitorsground.cpp deleted file mode 100644 index 76c35399e1..0000000000 --- a/dcc-old/src/plugin-display/window/monitorsground.cpp +++ /dev/null @@ -1,1749 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "monitorsground.h" - -#include "monitorproxywidget.h" -#include "operation/displaymodel.h" - -#include - -#include -#include -#include -#include -#include - -#include -#include - -using namespace DCC_NAMESPACE; -constexpr int MIN_W = 484; // 窗口的最小宽度 -constexpr int MAX_W = 726; // 窗口的最大宽度 - -MonitorsGround::MonitorsGround(int activateHeight, QWidget *parent) - : DGraphicsView(parent) - , m_scrollArea(nullptr) - , m_refershTimer(new QTimer(this)) - , m_effectiveTimer(new QTimer(this)) - , m_isSingleDisplay(false) - , m_scale(0.1) - , m_isInit(false) - , m_nEffectiveTime(2) - , m_setMergeMode(false) - -{ - setFixedHeight(activateHeight); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - - // 隐藏水平/竖直滚动条 - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - // 反锯齿 - setRenderHints(QPainter::Antialiasing); - - // 自动填色和无边框 - setAutoFillBackground(true); - setStyleSheet("border:0px"); - DPalette pa = DPaletteHelper::instance()->palette(parentWidget()); - QColor curThemeColor = pa.base().color(); - curThemeColor.setAlphaF(0.001); // 设置透明度 - pa.setBrush(QPalette::Base, QBrush(curThemeColor)); - DPaletteHelper::instance()->setPalette(this, pa); - - // 添加场景 - setScene(&m_graphicsScene); - - Q_EMIT setEffectiveReminderVisible(false, m_nEffectiveTime); - - m_effectiveTimer->setInterval(m_nEffectiveTime * 1000); - m_effectiveTimer->setSingleShot(true); - connect(m_effectiveTimer, &QTimer::timeout, this, [=]() { - Q_EMIT setEffectiveReminderVisible(false, m_nEffectiveTime); - for (auto mon : m_model->monitorList()) { - disconnect(mon, &Monitor::geometryChanged, this, &MonitorsGround::onGeometryChanged); - } - - applySettings(); - Q_EMIT requestMonitorRelease(m_monitors[m_movingItem]); - m_effectiveTimer->setInterval(m_nEffectiveTime * 1000); - }); -} - -MonitorsGround::~MonitorsGround() -{ - qDeleteAll(m_monitors.keys()); -} - -void MonitorsGround::setModel(DisplayModel *model, Monitor *moni) -{ - m_setMergeMode = (model->displayMode() == MERGE_MODE); - - Q_EMIT setEffectiveReminderVisible(false, m_nEffectiveTime); - m_effectiveTimer->stop(); - qDeleteAll(m_monitors.keys()); - m_monitors.clear(); - m_lstItems.clear(); - m_mapItemConnectedState.clear(); - m_mapInitItemConnectedState.clear(); - m_lstSortItems.clear(); - m_graphicsScene.clear(); - m_model = model; - - if (!moni) { - m_isSingleDisplay = false; - for (auto mon : model->monitorList()) { - initMonitorProxyWidget(mon); - } - - for (auto pw : m_monitors.keys()) { - if (!m_isSingleDisplay) - pw->moveBy(pw->x(), pw->y()); - } - - for (auto mon : model->monitorList()) { - connect(mon, &Monitor::rotateChanged, this, &MonitorsGround::onRotateChanged); - connect(mon, &Monitor::currentModeChanged, this, &MonitorsGround::onCurrentModeChanged); - connect(mon, &Monitor::geometryChanged, this, &MonitorsGround::onGeometryChanged); - } - - connect(m_model, - &DisplayModel::primaryScreenChanged, - this, - static_cast(&MonitorsGround::update), - Qt::QueuedConnection); - } else { - initMonitorProxyWidget(moni); - connect(moni, &Monitor::geometryChanged, this, &MonitorsGround::onGeometryChanged); - connect(moni, &Monitor::currentModeChanged, this, &MonitorsGround::onCurrentModeChanged); - connect(moni, &Monitor::rotateChanged, this, &MonitorsGround::onRotateChanged); - m_isSingleDisplay = true; - } - setEnabled(!m_isSingleDisplay && m_model->displayMode() == EXTEND_MODE); - QTimer::singleShot(1, this, [=]() { - if (!m_isSingleDisplay) { - updateScale(); - } - resetMonitorsView(); - }); -} - -void MonitorsGround::initMonitorProxyWidget(Monitor *mon) -{ - MonitorProxyWidget *pw = new MonitorProxyWidget(mon, m_model); - - m_graphicsScene.addItem(pw); - m_monitors[pw] = mon; - m_lstItems.append(pw); - m_lstSortItems.append(pw); - - connect(pw, - &MonitorProxyWidget::requestMonitorPress, - this, - &MonitorsGround::requestMonitorPress); - connect(pw, &MonitorProxyWidget::requestMonitorPress, this, [this, pw]() { - for (auto item : m_monitors.keys()) { - item->setZValue(0); - } - m_movingItem = pw; - m_movingItem->setZValue(1); - }); - connect(pw, - &MonitorProxyWidget::requestMonitorRelease, - this, - &MonitorsGround::onRequestMonitorRelease); - connect(pw, &MonitorProxyWidget::requestMouseMove, this, &MonitorsGround::onRequestMouseMove); - connect(pw, &MonitorProxyWidget::requestKeyPress, this, &MonitorsGround::onRequestKeyPress); -} - -void MonitorsGround::onGeometryChanged() -{ - for (auto pw : m_monitors.keys()) { - Monitor *mon = qobject_cast(sender()); - if (mon->name() == m_monitors[pw]->name()) { - m_movingItem = pw; - pw->update(); - break; - } - } - - for (auto pw : m_monitors.keys()) { - pw->setMovedX(m_monitors[pw]->x()); - pw->setMovedY(m_monitors[pw]->y()); - pw->setPos(0, 0); - if (!m_isSingleDisplay) - pw->moveBy(pw->x(), pw->y()); - } - - onResize(); -} - -void MonitorsGround::onRotateChanged() -{ - onCurrentModeChanged(); -} - -// 当方向改变时 当分辨率改变时 -void MonitorsGround::onCurrentModeChanged() -{ - m_nEffectiveTime = 0; - m_effectiveTimer->setInterval(m_nEffectiveTime); - onResize(); - if (m_setMergeMode || m_isSingleDisplay) - return; - - Monitor *mon = qobject_cast(sender()); - for (auto pw : m_monitors.keys()) { - if (mon->name() == m_monitors[pw]->name()) { - m_movingItem = pw; - pw->update(); - break; - } - } - - executemultiScreenAlgo(false); -} - -void MonitorsGround::executemultiScreenAlgo(const bool isRebound) -{ - if (m_isSingleDisplay) - return; - - bool isRestore = false; - multiScreenSortAlgo(isRestore, isRebound); - - // 需要重新拼接 - if (m_movingItem->getReSplicing()) { - m_movingItem->setReSplicing(false); - multiScreenSortAlgo(isRestore, true); - } - - if (isRestore == true) - return; - - multiScreenAutoAdjust(); - onResize(); - updateConnectedState(); - - // 显示设置生效倒计时提示框 - Q_EMIT setEffectiveReminderVisible(true, m_nEffectiveTime); - m_effectiveTimer->start(); -} - -void MonitorsGround::onRequestMonitorRelease() -{ - executemultiScreenAlgo(true); -} - -void MonitorsGround::resetMonitorsView() -{ - if (m_model->displayMode() == MERGE_MODE) { - adjustAll(); - } else { - m_isInit = false; - centeredMonitorsView(); - } -} - -void MonitorsGround::adjustAll() -{ - setEnabled(false); - - const double scaleW = double(width()) / (m_monitors.values().first()->w() * 1.2); - const double scaleH = double(height()) / (m_monitors.values().first()->h() * 1.2); - - const double scale = std::min(scaleW, scaleH); - - int cnt = 0; - int offset = static_cast(10 / scale); - - for (auto pw : m_monitors.keys()) { - pw->setZValue(cnt); - pw->setPos(QPointF(offset * cnt, offset * cnt)); - cnt++; - } - - QPointF dPos = sceneRect().center() - scene()->itemsBoundingRect().center(); - for (auto pw : m_monitors.keys()) { - pw->setPos(pw->pos() + dPos); - } - - resetTransform(); - this->scale(scale, scale); -} - -void MonitorsGround::onResize() -{ - if (!m_isSingleDisplay) { - if (size().width() < MAX_W) { - setSceneRect(QRect(0, 0, width(), 240 + size().width() - MIN_W)); - setFixedHeight(240 + size().width() - MIN_W); - } else { - setSceneRect(QRect(0, 0, width(), 240 + MAX_W - MIN_W)); - setFixedHeight(240 + MAX_W - MIN_W); - } - updateScale(); - } else { - setSceneRect(QRect(0, 0, width(), height())); - } - - resetMonitorsView(); -} - -void MonitorsGround::resizeEvent(QResizeEvent *event) -{ - // 解决最大化view高度设置不能及时生效的问题 - QTimer::singleShot(0, this, [=] { - onResize(); - }); - - QGraphicsView::resizeEvent(event); -} - -void MonitorsGround::enterEvent(QEvent *) -{ - auto p = parentWidget(); - while (p && !m_scrollArea) { - m_scrollArea = qobject_cast(p); - if (m_scrollArea) - break; - p = p->parentWidget(); - } - if (m_scrollArea) - QScroller::ungrabGesture(m_scrollArea->viewport()); -} - -void MonitorsGround::leaveEvent(QEvent *) -{ - if (m_scrollArea) - QScroller::grabGesture(m_scrollArea->viewport(), QScroller::LeftMouseButtonGesture); -} - -void MonitorsGround::paintEvent(QPaintEvent *event) -{ - if (m_isSingleDisplay || m_model->displayMode() != EXTEND_MODE) - this->setEnabled(false); - - QGraphicsView::paintEvent(event); -} - -void MonitorsGround::singleScreenAdjest() -{ - const double scaleW = double(width()) / (m_monitors.keys().last()->w() * 1.5); - const double scaleH = double(height()) / (m_monitors.keys().last()->h() * 1.5); - - const double scale = std::min(scaleW, scaleH); - - QPointF dPos = sceneRect().center() - scene()->itemsBoundingRect().center(); - m_monitors.keys().last()->setPos(m_monitors.keys().last()->pos() + dPos); - resetTransform(); - this->scale(scale, scale); - setEnabled(false); -} - -// 应用设置 -void MonitorsGround::applySettings() -{ - qRegisterMetaType>>("QHash>"); - QHash> monitorPosition; - - QList lstX, lstY; - - for (auto pw : m_monitors.keys()) { - pw->update(); - } - - for (auto pw : m_monitors.keys()) { - lstX.append(pw->pos().x()); - lstY.append(pw->pos().y()); - qDebug() << pw->name() << "pos" << pw->pos(); - } - std::sort(lstX.begin(), lstX.end(), [=](const qreal item1, const qreal item2) { - return item1 < item2; - }); - std::sort(lstY.begin(), lstY.end(), [=](const qreal item1, const qreal item2) { - return item1 < item2; - }); - - for (auto it(m_monitors.cbegin()); it != m_monitors.cend(); ++it) { - monitorPosition.insert(it.value(), - QPair(int(it.key()->pos().x() - lstX.first()), - int(it.key()->pos().y() - lstY.first()))); - qWarning() << "applySettings" << it.value()->name() << monitorPosition[it.value()]; - } - - // 在计算之后再做一次过滤 - // 消除一个像素的重叠 - // 首先获取所以的拼接点到list - QList> lstMonitor; - for (auto iter = m_mapItemConnectedState.begin(); iter != m_mapItemConnectedState.end(); - ++iter) { - for (auto item : iter.value()) { - QList lstMonitorTemp; - lstMonitorTemp << m_monitors[iter.key()] << m_monitors[item]; - lstMonitor.append(lstMonitorTemp); - } - } - - // 依据字符串进行排序 - QMap> mapMonitor; - for (auto m : lstMonitor) { - std::sort(m.begin(), m.end(), [=](const Monitor *m1, const Monitor *m2) { - return m1->name() < m2->name(); - }); - // 去重 - mapMonitor.insert(m.first()->name() + m.last()->name(), m); - qDebug() << "mapMonitor" << m.first()->name() + m.last()->name(); - } - - // 获取到实际相交点的信息 - for (auto m : mapMonitor.values()) { - // 左右坐标 - // 上下坐标 对比 - QRect m1(monitorPosition[m.first()].first, - monitorPosition[m.first()].second, - m.first()->w(), - m.first()->h()); - QRect m2(monitorPosition[m.last()].first, - monitorPosition[m.last()].second, - m.last()->w(), - m.last()->h()); - - qDebug() << "获取实际交点" << mapMonitor.key(m) << "1:" << m1 << "2:" << m2; - - // 左右相接 - if (m1.left() < m2.left() && m1.right() == m2.left()) { - monitorPosition[m.last()] = (QPair(m1.right() + 1, m2.y())); - } else if (m1.left() > m2.left() && m2.right() == m1.left()) { - monitorPosition[m.first()] = (QPair(m2.right() + 1, m1.y())); - } - - // 上下相接 - if (m1.top() < m2.top() && m1.bottom() == m2.top()) { - monitorPosition[m.last()] = (QPair(m2.x(), m1.bottom() + 1)); - } else if (m1.top() > m2.top() && m2.bottom() == m1.top()) { - monitorPosition[m.first()] = (QPair(m1.x(), m2.bottom() + 1)); - } - } - - for (auto it(m_monitors.cbegin()); it != m_monitors.cend(); ++it) { - qWarning() << "applySettings 处理之后:" << it.value()->name() - << monitorPosition[it.value()]; - } - - Q_EMIT requestApplySettings(monitorPosition); -} - -/*1050-5401*/ -// 多屏排序算法 -QPointF MonitorsGround::multiScreenSortAlgo(bool &isRestore, const bool isRebound) -{ - // 排列算法 - // 1、寻找位置变化的屏幕块,确定为被移动的块 - // 2、判断被移动块和其他块之间的位置关系来进行图形拼接移动 - //*根据中心点判定 - - QList lstActivedItemsX; - QList lstActivedItemsY; - QList lstNoMovedItems; - QList lstShelterItems; - - m_lstMoveingItemToCenterPosLen.clear(); - - bool isMove = true; - isRestore = false; - bool isAutoAdsorption = false; - bool isIntersect = false; - qreal g_dx = 0.0; - qreal g_dy = 0.0; - - qreal intersectedArea = 0.0; // 相交的面积 - - QRectF moveItemIntersect, moveItemRect; - - bool g_bXYTogetherMoved = - false; // 标志XY方向是否一起移动,其余情况按哪个方向离得近向哪个方向移动 - - moveItemIntersect = m_movingItem->mapRectToScene(m_movingItem->justIntersectRect()); - moveItemRect = m_movingItem->mapRectToScene(m_movingItem->boundingRect()); - - auto mapToSceneIntersectRect = [=](MonitorProxyWidget *item) { - return item->mapToScene(item->justIntersectRect()); - }; - - auto mapToSceneBoundingRect = [=](MonitorProxyWidget *item) { - return item->mapToScene(item->boundingRect()); - }; - - for (int i = 0; i < m_lstSortItems.size(); i++) { - - if (m_movingItem != m_lstSortItems[i]) { - QRectF rect = moveItemIntersect.intersected( - m_lstSortItems[i]->mapRectToScene(m_lstSortItems[i]->boundingRect())); - intersectedArea += rect.width() * rect.height(); - - // 移动块完全覆盖一个块 - if (moveItemRect.contains( - m_lstSortItems[i]->mapRectToScene(m_lstSortItems[i]->boundingRect()))) { - lstShelterItems.append(m_lstSortItems[i]); - } - - // 要么不相交,要相交就是要点线相交的 - if (!mapToSceneIntersectRect(m_movingItem) - .intersects(mapToSceneBoundingRect(m_lstSortItems[i])) - && mapToSceneBoundingRect(m_movingItem) - .intersects(mapToSceneBoundingRect(m_lstSortItems[i]))) { - isAutoAdsorption = true; - } - // 出现相交的情况 - if (mapToSceneIntersectRect(m_movingItem) - .intersects(mapToSceneBoundingRect(m_lstSortItems[i])) - && mapToSceneBoundingRect(m_movingItem) - .intersects(mapToSceneBoundingRect(m_lstSortItems[i]))) { - isIntersect = true; - } - - lstNoMovedItems.append(m_lstSortItems[i]); - } - } - - // 移动块被完全包含在其他的块 - if (qFuzzyCompare(moveItemIntersect.width() * moveItemIntersect.height(), intersectedArea)) { - qDebug() << "存在包含关系"; - lstShelterItems.append(m_movingItem); - } - - // 移动块到其他块中心点的距离排序 - QPointF movedPos = m_movingItem->mapToScene(m_movingItem->boundingRect().center()); - for (auto item : lstNoMovedItems) { - QPointF tempPos = item->mapToScene(item->boundingRect().center()); - qreal len = sqrt(pow(tempPos.x() - movedPos.x(), 2) + pow(tempPos.y() - movedPos.y(), 2)); - m_lstMoveingItemToCenterPosLen.append(qMakePair(item, len)); - } - - // 获取距离最近的块 - std::sort(m_lstMoveingItemToCenterPosLen.begin(), - m_lstMoveingItemToCenterPosLen.end(), - [=](const QPair &item1, - const QPair &item2) { - return item1.second < item2.second; - }); - - // 自动回弹的触发条件: 1. 一个屏幕完全包含另一个屏的时候 2. 一个屏幕剩下的屏幕集合所包围 - if (lstShelterItems.size() > 0) { - if (isMove) { - - if (isRebound) { - autoRebound(); - qDebug() << "自动回弹流程触发! == " << lstShelterItems.size(); - isRestore = true; - return QPointF(0.0, 0.0); - } else { - // 当改变方向时出现覆盖多个块的情况,会触发自动会弹流程,但是改变方向的上一个操作状态不存在或者说回弹到上一个状态没有意义,会导致屏幕重叠现象 - // 如果是由于方向改变导致的重叠,那就将此块移动到items外接矩形的左下角再重新执行拼接算法。 - m_movingItem->moveBy( - scene()->itemsBoundingRect().right() - - m_movingItem - ->mapToScene(m_movingItem->boundingRect().bottomLeft()) - .x(), - scene()->itemsBoundingRect().bottom() - - m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()) - .y()); - m_movingItem->setReSplicing(true); - return QPointF(0.0, 0.0); - } - } - } else { // 没有完全重合的情况处理逻辑 - - std::sort(lstNoMovedItems.begin(), - lstNoMovedItems.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).x() - < item2->mapToScene(item2->boundingRect().bottomLeft()).x(); - }); - - // 将MovedItem放入链表中排序,左排 右排,判定覆盖几个块 - lstNoMovedItems.append(m_movingItem); - // 左排序 - std::sort(lstNoMovedItems.begin(), - lstNoMovedItems.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - if (item1 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomRight()).x() - < item2->mapToScene(item2->boundingRect().bottomLeft()).x(); - } else if (item2 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).x() - < item2->mapToScene(item2->boundingRect().bottomRight()).x(); - } - return item1->mapToScene(item1->boundingRect().bottomLeft()).x() - < item2->mapToScene(item2->boundingRect().bottomLeft()).x(); - }); - int nBIndexLeft = lstNoMovedItems.indexOf(m_movingItem); - - // 右排序 - std::sort(lstNoMovedItems.begin(), - lstNoMovedItems.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - if (item1 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).x() - < item2->mapToScene(item2->boundingRect().bottomRight()).x(); - } else if (item2 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomRight()).x() - < item2->mapToScene(item2->boundingRect().bottomLeft()).x(); - } - return item1->mapToScene(item1->boundingRect().bottomRight()).x() - < item2->mapToScene(item2->boundingRect().bottomRight()).x(); - }); - int nBIndexRight = lstNoMovedItems.indexOf(m_movingItem); - - // 上排序 - std::sort(lstNoMovedItems.begin(), - lstNoMovedItems.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - if (item1 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()).y(); - } else if (item2 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()).y(); - } - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()).y(); - }); - int nBIndexTop = lstNoMovedItems.indexOf(m_movingItem); - - // 下排序 - std::sort(lstNoMovedItems.begin(), - lstNoMovedItems.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - if (item1 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()).y(); - } else if (item2 == m_movingItem) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()).y(); - } - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()).y(); - }); - int nBIndexBottom = lstNoMovedItems.indexOf(m_movingItem); - - int nItemSize = lstNoMovedItems.size() - 1; - - // 说明移动块在其他块X坐标有重合 - if (nBIndexLeft != 0 && nBIndexRight != nItemSize) { - - // 移动X - // 将MovedItem放入链表中排序,上排 下排,判定在Y轴移动的方向和距离 - // 处理 - qreal movex1 = m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()).x(); - qreal movex2 = m_movingItem->mapToScene(m_movingItem->boundingRect().topRight()).x(); - - for (auto pair : m_lstMoveingItemToCenterPosLen) { - qreal x1 = pair.first->mapToScene(pair.first->boundingRect().topLeft()).x(); - qreal x2 = pair.first->mapToScene(pair.first->boundingRect().topRight()).x(); - - if (!((x1 >= movex1 && x1 >= movex2) || (x2 <= movex1 && x2 <= movex2))) { - lstActivedItemsX.append(pair.first); - } - } - - lstActivedItemsX.append(m_movingItem); - // 上排序 - std::sort(lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()).y(); - }); - int nIndexTop = lstActivedItemsX.indexOf(m_movingItem); - - // 下排序 - std::sort(lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()).y(); - }); - int nIndexBottom = lstActivedItemsX.indexOf(m_movingItem); - - // 先做预移动,如果有重合,把重合块加入激活块重新排序 - if (nIndexTop == nIndexBottom) { - // 移动块在最上面 - if (nIndexTop == 0) { - qreal dy = - lstActivedItemsX.first() - ->mapToScene(lstActivedItemsX.first()->boundingRect().topLeft()) - .y() - - m_movingItem->mapToScene(m_movingItem->boundingRect().bottomLeft()) - .y(); - m_movingItem->moveBy(0, dy); - m_graphicsScene.update(); - - QList lstShelterItemsTemp; - lstNoMovedItems.removeOne(m_movingItem); - for (int i = 0; i < lstNoMovedItems.size(); i++) { - if (m_movingItem->mapToScene(m_movingItem->boundingRect()) - .intersects(lstNoMovedItems[i]->mapToScene( - lstNoMovedItems[i]->boundingRect()))) { - lstShelterItemsTemp.append(lstNoMovedItems[i]); - } - } - - if (lstShelterItemsTemp.size() >= 0) { - m_movingItem->moveBy(0, -dy); // 先移回去 - m_graphicsScene.update(); - - // 下排序 - std::sort( - lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()) - .y(); - }); - // int nIndexBottomTemp = lstActivedItemsX.indexOf(m_movingItem); - - // 上排序 - for (auto t : lstShelterItemsTemp) { - if (!lstActivedItemsX.contains(t)) - lstActivedItemsX.append(t); - } - std::sort(lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()) - .y(); - }); - int nIndexTopTemp = lstActivedItemsX.indexOf(m_movingItem); - - lstActivedItemsX.removeOne(m_movingItem); - - if (!lstActivedItemsX.isEmpty()) { - if (nIndexTopTemp == 0) { - g_dy = lstActivedItemsX.first() - ->mapToScene(lstActivedItemsX.first() - ->boundingRect() - .topLeft()) - .y() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().bottomLeft()) - .y(); - qDebug() << "g_dy" << g_dy; - } else { - g_dy = lstActivedItemsX.last() - ->mapToScene(lstActivedItemsX.last() - ->boundingRect() - .bottomLeft()) - .y() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topLeft()) - .y(); - qDebug() << "g_dy" << g_dy; - } - } - } - } - // 移动块在最下面 - else { - if (!lstActivedItemsX.contains(m_movingItem)) - lstActivedItemsX.append(m_movingItem); - // 下排序 - std::sort( - lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()).y(); - }); - - qreal dy = lstActivedItemsX.last() - ->mapToScene( - lstActivedItemsX.last()->boundingRect().bottomLeft()) - .y() - - m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()).y(); - m_movingItem->moveBy(0, dy); - m_graphicsScene.update(); - - lstNoMovedItems.removeOne(m_movingItem); - QList lstShelterItemsTemp; - for (int i = 0; i < lstNoMovedItems.size(); i++) { - if (m_movingItem->mapToScene(m_movingItem->boundingRect()) - .intersects(lstNoMovedItems[i]->mapToScene( - lstNoMovedItems[i]->boundingRect()))) { - lstShelterItemsTemp.append(lstNoMovedItems[i]); - } - } - - if (lstShelterItemsTemp.size() >= 0) { - m_movingItem->moveBy(0, -dy); // 先移回去 - m_graphicsScene.update(); - - // 上排序 - for (auto t : lstShelterItemsTemp) { - if (!lstActivedItemsX.contains(t)) - lstActivedItemsX.append(t); - } - - std::sort(lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).y() - < item2->mapToScene(item2->boundingRect().topLeft()) - .y(); - }); - int nIndexTopTemp = lstActivedItemsX.indexOf(m_movingItem); - - // 下排序 - std::sort( - lstActivedItemsX.begin(), - lstActivedItemsX.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().bottomLeft()).y() - < item2->mapToScene(item2->boundingRect().bottomLeft()) - .y(); - }); - // int nIndexBottomTemp = lstActivedItemsX.indexOf(m_movingItem); - - lstActivedItemsX.removeOne(m_movingItem); - - if (!lstActivedItemsX.isEmpty()) { - if (nIndexTopTemp == 0) { - g_dy = lstActivedItemsX.first() - ->mapToScene(lstActivedItemsX.first() - ->boundingRect() - .topLeft()) - .y() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().bottomLeft()) - .y(); - qDebug() << "g_dy" << g_dy; - } else { - g_dy = lstActivedItemsX.last() - ->mapToScene(lstActivedItemsX.last() - ->boundingRect() - .bottomLeft()) - .y() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topLeft()) - .y(); - qDebug() << "g_dy" << g_dy; - } - } - } - } - } - } - - // 说明移动块在其他块Y坐标有重合 - if (nBIndexTop != 0 && nBIndexBottom != nItemSize) { - - // 移动Y - // 处理 - qreal movey1 = m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()).y(); - qreal movey2 = m_movingItem->mapToScene(m_movingItem->boundingRect().bottomLeft()).y(); - - for (auto pair : m_lstMoveingItemToCenterPosLen) { - qreal y1 = pair.first->mapToScene(pair.first->boundingRect().topLeft()).y(); - qreal y2 = pair.first->mapToScene(pair.first->boundingRect().bottomLeft()).y(); - - if (!((y1 >= movey1 && y1 >= movey2) || (y2 <= movey1 && y2 <= movey2))) { - lstActivedItemsY.append(pair.first); - } - } - - lstActivedItemsY.append(m_movingItem); - // 左排序 - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).x() - < item2->mapToScene(item2->boundingRect().topLeft()).x(); - }); - int nIndexLeft = lstActivedItemsY.indexOf(m_movingItem); - - // 右排序 - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topRight()).x() - < item2->mapToScene(item2->boundingRect().topRight()).x(); - }); - int nIndexRight = lstActivedItemsY.indexOf(m_movingItem); - - if (nIndexLeft == nIndexRight) { - // 移动块在最右侧 - if (nIndexLeft == 0) { - qreal dx = - lstActivedItemsY.first() - ->mapToScene(lstActivedItemsY.first()->boundingRect().topLeft()) - .x() - - m_movingItem->mapToScene(m_movingItem->boundingRect().topRight()).x(); - m_movingItem->moveBy(dx, 0); - m_graphicsScene.update(); - - QList lstShelterItemsTemp; - lstNoMovedItems.removeOne(m_movingItem); - for (int i = 0; i < lstNoMovedItems.size(); i++) { - if (m_movingItem->mapToScene(m_movingItem->boundingRect()) - .intersects(lstNoMovedItems[i]->mapToScene( - lstNoMovedItems[i]->boundingRect()))) { - lstShelterItemsTemp.append(lstNoMovedItems[i]); - } - } - - if (lstShelterItemsTemp.size() >= 0) { - m_movingItem->moveBy(-dx, 0); - m_graphicsScene.update(); - - // 下排序 - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topRight()).x() - < item2->mapToScene(item2->boundingRect().topRight()) - .x(); - }); - // int nIndexRightTemp = lstActivedItemsY.indexOf(m_movingItem); - - // 上排序 - for (auto t : lstShelterItemsTemp) { - if (!lstActivedItemsY.contains(t)) - lstActivedItemsY.append(t); - } - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).x() - < item2->mapToScene(item2->boundingRect().topLeft()) - .x(); - }); - int nIndexLeftTemp = lstActivedItemsY.indexOf(m_movingItem); - - lstActivedItemsY.removeOne(m_movingItem); - - if (!lstActivedItemsY.isEmpty()) { - if (nIndexLeftTemp == 0) { - g_dx = lstActivedItemsY.first() - ->mapToScene(lstActivedItemsY.first() - ->boundingRect() - .topLeft()) - .x() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topRight()) - .x(); - qDebug() << "g_dx" << g_dx; - } else { - g_dx = lstActivedItemsY.last() - ->mapToScene(lstActivedItemsY.last() - ->boundingRect() - .topRight()) - .x() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topLeft()) - .x(); - qDebug() << "g_dx" << g_dx; - } - } - } - } - // 移动块在最左侧 - else { - if (!lstActivedItemsY.contains(m_movingItem)) - lstActivedItemsY.append(m_movingItem); - // 右排序 - std::sort( - lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topRight()).x() - < item2->mapToScene(item2->boundingRect().topRight()).x(); - }); - - qreal dx = - lstActivedItemsY.last() - ->mapToScene(lstActivedItemsY.last()->boundingRect().topRight()) - .x() - - m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()).x(); - m_movingItem->moveBy(dx, 0); - m_graphicsScene.update(); - - lstNoMovedItems.removeOne(m_movingItem); - QList lstShelterItemsTemp; - for (int i = 0; i < lstNoMovedItems.size(); i++) { - if (m_movingItem->mapToScene(m_movingItem->boundingRect()) - .intersects(lstNoMovedItems[i]->mapToScene( - lstNoMovedItems[i]->boundingRect()))) { - lstShelterItemsTemp.append(lstNoMovedItems[i]); - } - } - - if (lstShelterItemsTemp.size() >= 0) { - m_movingItem->moveBy(-dx, 0); - m_graphicsScene.update(); - - // 上排序 - for (auto t : lstShelterItemsTemp) { - if (!lstActivedItemsY.contains(t)) - lstActivedItemsY.append(t); - } - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topLeft()).x() - < item2->mapToScene(item2->boundingRect().topLeft()) - .x(); - }); - int nIndexLeftTemp = lstActivedItemsY.indexOf(m_movingItem); - - // 下排序 - std::sort(lstActivedItemsY.begin(), - lstActivedItemsY.end(), - [=](const MonitorProxyWidget *item1, - const MonitorProxyWidget *item2) { - return item1->mapToScene(item1->boundingRect().topRight()).x() - < item2->mapToScene(item2->boundingRect().topRight()) - .x(); - }); - // int nIndexRightTemp = lstActivedItemsY.indexOf(m_movingItem); - - lstActivedItemsY.removeOne(m_movingItem); - - if (!lstActivedItemsY.isEmpty()) { - if (nIndexLeftTemp == 0) { - g_dx = lstActivedItemsY.first() - ->mapToScene(lstActivedItemsY.first() - ->boundingRect() - .topLeft()) - .x() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topRight()) - .x(); - qDebug() << "g_dx" << g_dx; - } else { - g_dx = lstActivedItemsY.last() - ->mapToScene(lstActivedItemsY.last() - ->boundingRect() - .topRight()) - .x() - - m_movingItem - ->mapToScene( - m_movingItem->boundingRect().topLeft()) - .x(); - qDebug() << "g_dx" << g_dx; - } - } - } - } - } - } - - // 说明移动块在其他块的四周 - if ((nBIndexLeft == 0 || nBIndexRight == nItemSize) - || (nBIndexTop == 0 || nBIndexBottom == nItemSize)) { - // 表示X方向没有重叠的 - // TODO: - // 找距离他最近的顶点 - // LT 左上 - lstNoMovedItems.removeOne(m_movingItem); - QRectF movedRectF = m_movingItem->mapRectToScene(m_movingItem->boundingRect()); - QList> lstTempLen; - if (nBIndexLeft == 0 && nBIndexTop == 0) { - for (auto item : lstNoMovedItems) { - QPointF tempPos = item->mapToScene(item->boundingRect().topLeft()); - qreal len = sqrt(pow(tempPos.x() - movedRectF.bottomRight().x(), 2) - + pow(tempPos.y() - movedRectF.bottomRight().y(), 2)); - lstTempLen.append(qMakePair(item, len)); - } - // 获取距离最近的块 - std::sort(lstTempLen.begin(), - lstTempLen.end(), - [=](const QPair &item1, - const QPair &item2) { - return item1.second < item2.second; - }); - - QPointF dPos = lstTempLen.first().first->mapToScene( - lstTempLen.first().first->boundingRect().topLeft()) - - m_movingItem->mapToScene(m_movingItem->boundingRect().bottomRight()); - g_dx = dPos.x(); - g_dy = dPos.y(); - qDebug() << "g_dx" << g_dx; - qDebug() << "g_dy" << g_dy; - g_bXYTogetherMoved = true; - } - - // LB 左下 - if (nBIndexLeft == 0 && nBIndexBottom == nItemSize) { - for (auto item : lstNoMovedItems) { - QPointF tempPos = item->mapToScene(item->boundingRect().bottomLeft()); - qreal len = sqrt(pow(tempPos.x() - movedRectF.topRight().x(), 2) - + pow(tempPos.y() - movedRectF.topRight().y(), 2)); - lstTempLen.append(qMakePair(item, len)); - } - // 获取距离最近的块 - std::sort(lstTempLen.begin(), - lstTempLen.end(), - [=](const QPair &item1, - const QPair &item2) { - return item1.second < item2.second; - }); - - QPointF dPos = lstTempLen.first().first->mapToScene( - lstTempLen.first().first->boundingRect().bottomLeft()) - - m_movingItem->mapToScene(m_movingItem->boundingRect().topRight()); - g_dx = dPos.x(); - g_dy = dPos.y(); - g_bXYTogetherMoved = true; - qDebug() << "g_dx" << g_dx; - qDebug() << "g_dy" << g_dy; - } - - // RT 右上 - if (nBIndexRight == nItemSize && nBIndexTop == 0) { - for (auto item : lstNoMovedItems) { - QPointF tempPos = item->mapToScene(item->boundingRect().topRight()); - qreal len = sqrt(pow(tempPos.x() - movedRectF.bottomLeft().x(), 2) - + pow(tempPos.y() - movedRectF.bottomLeft().y(), 2)); - lstTempLen.append(qMakePair(item, len)); - } - // 获取距离最近的块 - std::sort(lstTempLen.begin(), - lstTempLen.end(), - [=](const QPair &item1, - const QPair &item2) { - return item1.second < item2.second; - }); - - QPointF dPos = lstTempLen.first().first->mapToScene( - lstTempLen.first().first->boundingRect().topRight()) - - m_movingItem->mapToScene(m_movingItem->boundingRect().bottomLeft()); - g_dx = dPos.x(); - g_dy = dPos.y(); - g_bXYTogetherMoved = true; - qDebug() << "g_dx" << g_dx; - qDebug() << "g_dy" << g_dy; - } - - // RB 右下 - - if (nBIndexRight == nItemSize && nBIndexBottom == nItemSize) { - for (auto item : lstNoMovedItems) { - QPointF tempPos = item->mapToScene(item->boundingRect().bottomRight()); - qreal len = sqrt(pow(tempPos.x() - movedRectF.topLeft().x(), 2) - + pow(tempPos.y() - movedRectF.topLeft().y(), 2)); - lstTempLen.append(qMakePair(item, len)); - } - // 获取距离最近的块 - std::sort(lstTempLen.begin(), - lstTempLen.end(), - [=](const QPair &item1, - const QPair &item2) { - return item1.second < item2.second; - }); - - QPointF dPos = lstTempLen.first().first->mapToScene( - lstTempLen.first().first->boundingRect().bottomRight()) - - m_movingItem->mapToScene(m_movingItem->boundingRect().topLeft()); - g_dx = dPos.x(); - g_dy = dPos.y(); - qDebug() << "g_dx" << g_dx; - qDebug() << "g_dy" << g_dy; - g_bXYTogetherMoved = true; - } - } - } - - qreal dx = g_dx, dy = g_dy; - - // 是自动吸附并且没有相交的情况,不需要要移动 - if (isAutoAdsorption && !isIntersect) { - if (isMove) - m_movingItem->moveBy(0, 0); - else { - dx = 0.0; - dy = 0.0; - } - } - // 其他情况需要移动 - else { - // 是否XY一起移动 - if (g_bXYTogetherMoved) { - if (isMove) - m_movingItem->moveBy(g_dx, g_dy); - qDebug() << "XY_XY_XY" << g_dx << g_dy; - } else { - // XY其中一个为0的情况, 执行移动 - if (qFuzzyIsNull(g_dx) || qFuzzyIsNull(g_dy)) { - if (isMove) - m_movingItem->moveBy(g_dx, g_dy); - - qDebug() << "DBL_MIN" << g_dx << g_dy; - } - // X和Y都不为0的情况下,哪个移动的绝对值小移动哪一个 - else { - if (isMove) - fabs(g_dx) < fabs(g_dy) ? m_movingItem->moveBy(g_dx, 0) - : m_movingItem->moveBy(0, g_dy); - else { - fabs(g_dx) < fabs(g_dy) ? dy = 0.0 : dx = 0.0; - } - qDebug() << "fabs(g_dx) < fabs(g_dy) ?" << g_dx << g_dy; - } - } - } - for (auto pw : m_monitors.keys()) { - pw->update(); - } - m_graphicsScene.update(); - - if (!isMove) - return QPointF(dx, dy); - else { - return QPointF(g_dx, g_dy); - } -} - -// 多屏自动调整 -void MonitorsGround::multiScreenAutoAdjust() -{ - // 在自动拼接之后已经达成全连通状态,无效执行自动调整 - updateConnectedState(); - - // 判断是否为全连通状态 - if (getConnectedDomain(m_movingItem).size() == m_lstItems.size()) { - updateConnectedState(true); - return; - } - - // 存储移动块到临时变量 - MonitorProxyWidget *m_movingItemTemp = m_movingItem; - QList lstChangedItems = m_lstItems; - - // 处理之前变化的块为空则返回 - if (lstChangedItems.isEmpty()) - return; - - QMap> maplstItems; - QMap mapItemsNeedMove; - QList itemTemp; - - // 这个列表是存放的就是所有移动块相关的块 - // 判断改变连通的块与移动块的剩余联通块是否存在连接 - // 【这种是在移动块初始连接块是两个及以上的情况下触发的,如果是一个连通块的话不会改变连通状态的】 - - // 获取屏幕集群 - for (auto iter : m_lstItems) { - - if (!lstChangedItems.contains(iter)) - continue; - - itemTemp = getConnectedDomain(iter); - for (auto k : itemTemp) { - if (lstChangedItems.contains(k) && k != iter) { - lstChangedItems.removeOne(k); - } - } - } - - for (auto item : lstChangedItems) { - qDebug() << "处理之后变化的块:" << item->name(); - } - - for (auto iter : lstChangedItems) { - maplstItems.insert(iter, getConnectedDomain(iter)); - } - - for (auto iter : maplstItems.keys()) { - qDebug() << "屏幕集群:" << iter->name(); - for (auto k : maplstItems[iter]) { - qDebug() << "val" << k->name(); - } - } - - if (maplstItems.size() > 0) { - // 说明除了移动块剩下的被拆分成了几部分,需要重新向其中一个部分移动了 - // 找到中心屏幕集群(包含移动块) - for (auto iter1 = maplstItems.begin(); iter1 != maplstItems.end(); ++iter1) { - if (iter1.value().contains(m_movingItemTemp)) { - m_lstSortItems = iter1.value(); - break; - } - } - - // 其他屏幕集群依次向中心屏幕集群移动 - for (auto iter = maplstItems.begin(); iter != maplstItems.end(); ++iter) { - if (iter.value().contains(m_movingItemTemp)) - continue; - - QList lstPos; - QList lstX, lstY; - for (auto item : iter.value()) { - m_movingItem = item; - bool isRestore = false; - multiScreenSortAlgo(isRestore); - - if (!m_lstSortItems.contains(item)) - m_lstSortItems.append(item); - } - } - } - m_lstSortItems = m_lstItems; - m_movingItem = m_movingItemTemp; - - // 自动调整完毕后,更新连通域 - updateConnectedState(true); -} - -// 更连通状态 -// 更新上一次拼接完成的值 -bool MonitorsGround::updateConnectedState(bool isInit) -{ - bool isIntersect = false; - QList m_lstItemsTemp; - for (int i = 0; i < m_lstItems.size(); i++) { - m_lstItemsTemp.clear(); - - for (int j = 0; j < m_lstItems.size(); j++) { - if (j != i - && m_lstItems[i] - ->mapRectToScene(m_lstItems[i]->boundingRectEx()) - .intersects(m_lstItems[j]->mapRectToScene(m_lstItems[j]->boundingRect())) - && !m_lstItemsTemp.contains(m_lstItems[j]) - && !m_lstItems[i] - ->mapRectToScene(m_lstItems[i]->justIntersectRect()) - .intersects( - m_lstItems[j]->mapRectToScene(m_lstItems[j]->boundingRect()))) { - m_lstItemsTemp.append(m_lstItems[j]); - } - if (j != i - && m_lstItems[i] - ->mapRectToScene(m_lstItems[i]->justIntersectRect()) - .intersects( - m_lstItems[j]->mapRectToScene(m_lstItems[j]->boundingRect()))) { - isIntersect = true; - } - } - - if (isInit) { - m_mapInitItemConnectedState.insert(m_lstItems[i], m_lstItemsTemp); - } - - m_mapItemConnectedState.insert(m_lstItems[i], m_lstItemsTemp); - } - - return isIntersect; -} - -// 获取连通域 -QList MonitorsGround::getConnectedDomain(MonitorProxyWidget *item) -{ - QList lstTemp1Items; - - QList lstTemp; - QList lstItems; - - lstItems.append(item); - - for (auto iter : m_lstItems) /*标记循环次数*/ { - Q_UNUSED(iter) - - lstTemp.clear(); - // 获取所有的value - for (auto a : lstItems) { - for (auto t : m_mapItemConnectedState[a]) { - if (!lstTemp1Items.contains(t)) - lstTemp.append(t); - } - } - - // 去重插入 - for (auto t : lstTemp) { - if (!lstTemp1Items.contains(t) && t != item) - lstTemp1Items.append(t); - else { - lstTemp.removeOne(t); - } - } - - lstItems.clear(); - lstItems.append(lstTemp); - } - - lstTemp1Items.append(item); - - return lstTemp1Items; -} - -// 响应键盘调整 脱离的需要拉回来,重叠的需要打回去 -// 左右边界相交1个像素的情况下,只能像上下运动; 相反如果上下边界相交1个像素的情况下,只能左右运动. -// 鼠标巡边移动 -void MonitorsGround::onRequestKeyPress(MonitorProxyWidget *pw, int keyValue) -{ - Q_EMIT setEffectiveReminderVisible(false, m_nEffectiveTime); - m_effectiveTimer->stop(); - - // 当鼠标移动的时候开始响应并执行自动吸附的逻辑 - // 保证 bufferboundingRect 相交且 boundingRect - // 不相交,保证移动的块item始终在其他item的外边缘移动 - - // 需要在全连通的情况下开始响应键盘事件 - bool bIntersectsTop = false; - bool bIntersectsBottom = false; - bool bIntersectsRight = false; - bool bIntersectsLeft = false; - - for (auto item : m_lstItems) { - if (item == pw) - continue; - - if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectTop()))) { - // 上相交 - bIntersectsTop = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectBottom()))) { - // 下相交 - bIntersectsBottom = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectLeft()))) { - // 左相交 - bIntersectsLeft = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectRight()))) { - // 右相交 - bIntersectsRight = true; - } - } - - if (!bIntersectsTop && !bIntersectsBottom && !bIntersectsRight && !bIntersectsLeft) { - for (auto item : m_lstItems) { - if (item == pw) - continue; - // 达成顶点相交 - if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectLeftTop()))) { - // 左上相交 - bIntersectsBottom = true; - bIntersectsRight = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectLeftBottom()))) { - // 左下相交 - bIntersectsTop = true; - bIntersectsRight = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects(pw->mapRectToScene(pw->justIntersectRectRightTop()))) { - // 右上相交 - bIntersectsBottom = true; - bIntersectsLeft = true; - } else if (item->mapRectToScene(item->boundingRect()) - .intersects( - pw->mapRectToScene(pw->justIntersectRectRightBottom()))) { - // 右下相交 - bIntersectsTop = true; - bIntersectsLeft = true; - } - } - } - - int moveStep = 10; - qreal recision = 0.1; - // 根据按键的方向与当前的相接的边和连通域的变化来综合判定是否执行移动操作 - switch (keyValue) { - case Qt::Key_Left: - if (!bIntersectsLeft && (bIntersectsTop || bIntersectsBottom)) { - // 执行运动 - for (int i = 0; i < moveStep * 10; i++) { - pw->moveBy(-recision, 0); - pw->update(); - // 相交 - if (updateConnectedState()) { - pw->moveBy(1, 0); // 此处为:判定为重叠时,回退距离为内缩的距离 - break; - } - if (getConnectedDomain(m_movingItem).size() != m_lstItems.size()) { - pw->moveBy(recision, 0); - break; - } - } - } - break; - case Qt::Key_Right: - if (!bIntersectsRight && (bIntersectsTop || bIntersectsBottom)) { - // 执行运动 - for (int i = 0; i < moveStep * 10; i++) { - pw->moveBy(recision, 0); - pw->update(); - if (updateConnectedState()) { - pw->moveBy(-1, 0); - break; - } - if (getConnectedDomain(m_movingItem).size() != m_lstItems.size()) { - pw->moveBy(-recision, 0); - break; - } - } - } - break; - case Qt::Key_Up: - if (!bIntersectsTop && (bIntersectsLeft || bIntersectsRight)) { - // 执行运动 - for (int i = 0; i < moveStep * 10; i++) { - pw->moveBy(0, -recision); - pw->update(); - if (updateConnectedState()) { - pw->moveBy(0, 1); - break; - } - if (getConnectedDomain(m_movingItem).size() != m_lstItems.size()) { - pw->moveBy(0, recision); - break; - } - } - } - break; - case Qt::Key_Down: - if (!bIntersectsBottom && (bIntersectsLeft || bIntersectsRight)) { - // 执行运动 - for (int i = 0; i < moveStep * 10; i++) { - pw->moveBy(0, recision); - pw->update(); - if (updateConnectedState()) { - pw->moveBy(0, -1); - break; - } - if (getConnectedDomain(m_movingItem).size() != m_lstItems.size()) { - pw->moveBy(0, -recision); - break; - } - } - } - break; - default: - break; - } - - pw->update(); - updateConnectedState(); - onResize(); - - Q_EMIT setEffectiveReminderVisible(true, m_nEffectiveTime); - m_effectiveTimer->start(); -} - -// 自动吸附实现 -void MonitorsGround::onRequestMouseMove(MonitorProxyWidget *pw) -{ - Q_EMIT setEffectiveReminderVisible(false, m_nEffectiveTime); - m_effectiveTimer->stop(); - - // 当鼠标移动的时候开始响应并执行自动吸附的逻辑 - // 保证 bufferboundingRect 相交且 boundingRect - // 不相交,保证移动的块item始终在其他item的外边缘移动 - - qreal top = 0.0; - qreal bottom = 0.0; - qreal right = 0.0; - qreal left = 0.0; - - qreal topLeft = 0.0; - qreal topRight = 0.0; - qreal bottomLeft = 0.0; - qreal bottomRight = 0.0; - qreal rightTop = 0.0; - qreal rightBottom = 0.0; - qreal leftTop = 0.0; - qreal leftBottom = 0.0; - - int space = 200; - - auto minMoveLen = [=](qreal temp, qreal &len) { - if (fabs(len) > 0.0) { - if (fabs(temp) < fabs(len)) - len = temp; - } else { - len = temp; - } - }; - - for (auto item : m_lstItems) { - if (item == pw) - continue; - - if (pw->mapToScene(pw->boundingRect()).intersects(item->mapToScene(item->boundingRect()))) - return; - - // 与boundingRect 不相交 - if (pw->mapToScene(pw->boundingRect()) - .intersects(item->mapToScene(item->bufferboundingRectTop()))) { - // 上相交 - qreal temp = item->mapToScene(item->boundingRect().topRight()).y() - - pw->mapToScene(pw->boundingRect().bottomLeft()).y(); - minMoveLen(temp, top); - - // 判断边对齐 - temp = item->mapToScene(item->boundingRect().topRight()).x() - - pw->mapToScene(pw->boundingRect().bottomRight()).x(); - minMoveLen(temp, topLeft); - temp = item->mapToScene(item->boundingRect().topLeft()).x() - - pw->mapToScene(pw->boundingRect().bottomLeft()).x(); - minMoveLen(temp, topRight); - } else if (pw->mapToScene(pw->boundingRect()) - .intersects(item->mapToScene(item->bufferboundingRectBottom()))) { - // 下相交 - qreal temp = item->mapToScene(item->boundingRect().bottomLeft()).y() - - pw->mapToScene(pw->boundingRect().topLeft()).y(); - minMoveLen(temp, bottom); - - // 判断边对齐的可能 - temp = item->mapToScene(item->boundingRect().topRight()).x() - - pw->mapToScene(pw->boundingRect().bottomRight()).x(); - minMoveLen(temp, bottomLeft); - temp = item->mapToScene(item->boundingRect().topLeft()).x() - - pw->mapToScene(pw->boundingRect().bottomLeft()).x(); - minMoveLen(temp, bottomRight); - } else if (pw->mapToScene(pw->boundingRect()) - .intersects(item->mapToScene(item->bufferboundingRectLeft()))) { - // 左相交 - qreal temp = item->mapToScene(item->boundingRect().bottomLeft()).x() - - pw->mapToScene(pw->boundingRect().bottomRight()).x(); - minMoveLen(temp, left); - - // 判断边对齐的可能 - temp = item->mapToScene(item->boundingRect().topRight()).y() - - pw->mapToScene(pw->boundingRect().topRight()).y(); - minMoveLen(temp, leftTop); - temp = item->mapToScene(item->boundingRect().bottomLeft()).y() - - pw->mapToScene(pw->boundingRect().bottomLeft()).y(); - minMoveLen(temp, leftBottom); - } else if (pw->mapToScene(pw->boundingRect()) - .intersects(item->mapToScene(item->bufferboundingRectRight()))) { - // 右相交 - qreal temp = item->mapToScene(item->boundingRect().bottomRight()).x() - - pw->mapToScene(pw->boundingRect().bottomLeft()).x(); - minMoveLen(temp, right); - - // 判断边对齐的可能 - temp = item->mapToScene(item->boundingRect().topRight()).y() - - pw->mapToScene(pw->boundingRect().topRight()).y(); - minMoveLen(temp, rightTop); - temp = item->mapToScene(item->boundingRect().bottomLeft()).y() - - pw->mapToScene(pw->boundingRect().bottomLeft()).y(); - minMoveLen(temp, rightBottom); - } - } - - auto edgeAlignment = [=](qreal x1, qreal x2) { - if (fabs(x1) > fabs(x2)) - return fabs(x2) < space ? x2 : 0; - else - return fabs(x1) < space ? x1 : 0; - }; - - QPointF autoAdsorptionPos(0.0, 0.0), edgeAlignmentPos(0.0, 0.0); - - if (qFuzzyIsNull(top)) { - edgeAlignmentPos.setX(edgeAlignment(bottomRight, bottomLeft)); - autoAdsorptionPos.setY(bottom); - } else if (qFuzzyIsNull(bottom)) { - edgeAlignmentPos.setX(edgeAlignment(topRight, topLeft)); - autoAdsorptionPos.setY(top); - } else { - autoAdsorptionPos.setY((fabs(top) < fabs(bottom)) ? top : bottom); - edgeAlignmentPos.setX((fabs(top) < fabs(bottom)) ? edgeAlignment(topRight, topLeft) - : edgeAlignment(bottomRight, bottomLeft)); - } - - if (qFuzzyIsNull(left)) { - autoAdsorptionPos.setX(right); - edgeAlignmentPos.setY(edgeAlignment(rightTop, rightBottom)); - } else if (qFuzzyIsNull(right)) { - autoAdsorptionPos.setX(left); - edgeAlignmentPos.setY(edgeAlignment(leftTop, leftBottom)); - } else { - autoAdsorptionPos.setX((fabs(left) < fabs(right)) ? left : right); - edgeAlignmentPos.setY((fabs(left) < fabs(right)) ? edgeAlignment(leftTop, leftBottom) - : edgeAlignment(rightTop, rightBottom)); - } - - if (!qFuzzyIsNull(autoAdsorptionPos.x())) { - edgeAlignmentPos.setX(0.0); - } - - if (!qFuzzyIsNull(autoAdsorptionPos.y())) { - edgeAlignmentPos.setY(0.0); - } - - pw->moveBy(edgeAlignmentPos.x() + autoAdsorptionPos.x(), - edgeAlignmentPos.y() + autoAdsorptionPos.y()); -} - -// 更新缩放比例 -void MonitorsGround::updateScale() -{ - QRectF rectView = rect(); - QRectF rect = m_graphicsScene.itemsBoundingRect(); - - double screenWidth = rect.width(); - double screenHeight = rect.height(); - - // 计算缩放比例 1.2,是指活动区域和调节区域 - double hScale = ((rectView.width() > MAX_W) ? MAX_W : rectView.width()) / 1.2 / screenWidth; - double wScale = rectView.height() / 1.2 / screenHeight; - m_scale = std::min(hScale, wScale); - - resetTransform(); - scale(m_scale, m_scale); -} - -void MonitorsGround::autoRebound() -{ - - for (auto pw : m_monitors.keys()) { - // 设置位置 - pw->setPos(pw->getPreCenter()); - pw->update(); - } -} - -// 屏幕示意图平移居中 -void MonitorsGround::centeredMonitorsView() -{ - if (m_monitors.size() == 1) { - singleScreenAdjest(); - } else { - QPointF dPos = sceneRect().center() - scene()->itemsBoundingRect().center(); - for (auto pw : m_monitors.keys()) { - // 保存上一次调整的数据,用与在不满足调整条件的时候自动恢复的功能. - pw->setPreCenter(pw->pos()); - pw->setPos(pw->pos() + dPos); - } - - if (!m_isInit) - updateConnectedState(true); // 更新初始化连接数据 - } - - for (auto pw : m_monitors.keys()) { - pw->update(); - } - - m_isInit = true; -} diff --git a/dcc-old/src/plugin-display/window/monitorsground.h b/dcc-old/src/plugin-display/window/monitorsground.h deleted file mode 100644 index 7d0cc2f7a7..0000000000 --- a/dcc-old/src/plugin-display/window/monitorsground.h +++ /dev/null @@ -1,102 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef MONITORSGROUND_H -#define MONITORSGROUND_H - -#include "interface/namespace.h" -#include "operation/monitor.h" - -#include -#include - -#include - -class QGraphicsScene; -class QTimer; -class QScroller; -class QScrollArea; - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { - -class DisplayModel; -class MonitorProxyWidget; -class MonitorsGround : public DGraphicsView -{ - Q_OBJECT - -public: - explicit MonitorsGround(int activateHeight, QWidget *parent = nullptr); - ~MonitorsGround(); - - inline void setMergeMode(bool val) { m_setMergeMode = val; } - void setModel(DisplayModel *model, Monitor *moni = nullptr); -Q_SIGNALS: - void requestApplySettings(QHash> monitorposition); - void requestMonitorPress(Monitor *mon); - void requestMonitorRelease(Monitor *mon); - void showsecondaryScreen(); - void setEffectiveReminderVisible(bool visible, int nEffectiveTime); - -private Q_SLOTS: - void onRequestMouseMove(MonitorProxyWidget *pw); - void onRequestKeyPress(MonitorProxyWidget *pw, int keyValue); - void onRequestMonitorRelease(); - void onGeometryChanged(); - void onCurrentModeChanged(); - void onRotateChanged(); - -protected: - void resizeEvent(QResizeEvent *event) override; - void enterEvent(QEvent *) override; - void leaveEvent(QEvent *) override; - void paintEvent(QPaintEvent *event) override; - -private: - void applySettings(); - void adjustAll(); - void onResize(); - void resetMonitorsView(); - void centeredMonitorsView(); - void executemultiScreenAlgo(const bool isRebound); - - /*1050-5401*/ - QPointF multiScreenSortAlgo(bool &isRestore, const bool isRebound = true);//排序算法 返回值为计算之后需要移动的XY值 - void multiScreenAutoAdjust(); // 手动调整完如果出现没有完全连通的情况,需要启动自动调整算法 - bool updateConnectedState(bool isInit = false); //更新连通状态 - QList getConnectedDomain(MonitorProxyWidget *item); //获取每个屏幕的连通域 - void updateScale(); - void singleScreenAdjest();//单屏幕调整 - void autoRebound(); //自动回弹流程 - void initMonitorProxyWidget(Monitor *mon); - -private: - DisplayModel *m_model; - QGraphicsScene m_graphicsScene; //场景 - QScrollArea *m_scrollArea; - - QMap m_monitors; - - /*1050-5401*/ - QList m_lstItems; - QList m_lstSortItems; - MonitorProxyWidget * m_movingItem; //正在移动的块 - QList> m_lstMoveingItemToCenterPosLen; //所有块的中心点到移动点的距离 - QMap> m_mapItemConnectedState; //所有块的实时连通状态 - QMap> m_mapInitItemConnectedState; //所有块的初始连通状态 - - QTimer *m_refershTimer; - QTimer *m_effectiveTimer; - - int m_isSingleDisplay; //当前界面只显示单个屏幕 - double m_scale; //缩放比例 - bool m_isInit; //初始化完成 - int m_nEffectiveTime; //多屏设置生效时间 - bool m_setMergeMode; -}; -} - -#endif // MONITORSGROUND_H diff --git a/dcc-old/src/plugin-display/window/multiscreenwidget.cpp b/dcc-old/src/plugin-display/window/multiscreenwidget.cpp deleted file mode 100644 index 39d9ba309d..0000000000 --- a/dcc-old/src/plugin-display/window/multiscreenwidget.cpp +++ /dev/null @@ -1,493 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "multiscreenwidget.h" -#include "brightnesswidget.h" -#include "scalingwidget.h" -#include "resolutionwidget.h" -#include "refreshratewidget.h" -#include "rotatewidget.h" -#include "secondaryscreendialog.h" -#include "widgets/settingsitem.h" -#include "monitorcontrolwidget.h" -#include "monitorindicator.h" -#include "recognizewidget.h" -#include "operation/displaymodel.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -const int ComboxWidth = 300; - -MultiScreenWidget::MultiScreenWidget(QWidget *parent) - : QWidget(parent) - , m_contentLayout(new QVBoxLayout(this)) - , m_monitorControlWidget(new MonitorControlWidget(240, this)) //根据产品设计更改出事高度为240 - , m_fullIndication(new MonitorIndicator(this)) - , m_modeSettingsItem(new SettingsItem(this)) - , m_modeCombox(new QComboBox(this)) - , m_primarySettingsItem(new SettingsItem(this)) - , m_primaryCombox(new QComboBox(this)) - , m_brightnessWidget(new BrightnessWidget(this)) - , m_scalingWidget(new ScalingWidget(this)) - , m_resolutionWidget(new ResolutionWidget(300, this)) - , m_refreshRateWidget(new RefreshRateWidget(300, this)) - , m_rotateWidget(new RotateWidget(300, this)) - , m_model(nullptr) - , m_resetSecondaryScreenDlgTimer(new QTimer(this)) -{ - //初始化列表无法进行静态翻译 - //~ contents_path /display/Multiple Displays - m_multiSettingLabel = new TitleLabel(tr("Multiple Displays"), this); - //~ contents_path /display/Mode - m_modeLabel = new QLabel(tr("Mode"), this); - //~ contents_path /display/Main Scree - m_primaryLabel = new QLabel(tr("Main Screen"), this); - - m_monitorControlWidget->setAccessibleName("MultiScreenWidget_monitorControl"); - m_fullIndication->setAccessibleName("fullIndication"); - - m_contentLayout->setSpacing(Dtk::Widget::DSizeModeHelper::element(6, 10)); - m_contentLayout->setContentsMargins(0, 20, 0, 0); - m_contentLayout->addWidget(m_monitorControlWidget); - m_contentLayout->addSpacing(20); - m_contentLayout->addWidget(m_multiSettingLabel); - QHBoxLayout *modeLayout = new QHBoxLayout(m_modeSettingsItem); - modeLayout->setContentsMargins(10, 0, 10, 0); - modeLayout->addWidget(m_modeLabel); - modeLayout->addWidget(m_modeCombox); - m_modeCombox->setFocusPolicy(Qt::NoFocus); - m_modeCombox->setMinimumWidth(ComboxWidth); - m_modeCombox->setMinimumHeight(36); - m_modeSettingsItem->addBackground(); - m_modeSettingsItem->setMinimumHeight(48); - m_modeSettingsItem->setLayout(modeLayout); - m_contentLayout->addWidget(m_modeSettingsItem); - - QHBoxLayout *primaryLayout = new QHBoxLayout(m_primarySettingsItem); - primaryLayout->setContentsMargins(10, 0, 10, 0); - primaryLayout->addWidget(m_primaryLabel); - primaryLayout->addWidget(m_primaryCombox); - m_primaryCombox->setFocusPolicy(Qt::NoFocus); - m_primaryCombox->setMinimumWidth(ComboxWidth); - m_primaryCombox->setMinimumHeight(36); - m_primarySettingsItem->addBackground(); - m_primarySettingsItem->setMinimumHeight(48); - m_primarySettingsItem->setLayout(primaryLayout); - m_contentLayout->addWidget(m_primarySettingsItem); - - m_contentLayout->addWidget(m_brightnessWidget); - m_contentLayout->addWidget(m_scalingWidget); - m_contentLayout->addWidget(m_resolutionWidget); - m_contentLayout->addWidget(m_refreshRateWidget); - m_contentLayout->addWidget(m_rotateWidget); - m_contentLayout->addStretch(); - - setLayout(m_contentLayout); - - QDesktopWidget *desktopwidget = QApplication::desktop(); - connect(desktopwidget,SIGNAL(workAreaResized(int)),this,SLOT(onResetSecondaryScreenDlg())); - - m_resetSecondaryScreenDlgTimer->setSingleShot(true); - m_resetSecondaryScreenDlgTimer->setInterval(100); - connect(m_resetSecondaryScreenDlgTimer, &QTimer::timeout, this, &MultiScreenWidget::onResetSecondaryScreenDlgTimerOut); -} - -MultiScreenWidget::~MultiScreenWidget() -{ - for (auto dlg : m_secondaryScreenDlgList) { - dlg->deleteLater(); - } - m_secondaryScreenDlgList.clear(); - - for(auto widget : m_recognizeWidget) { - widget->deleteLater(); - } - m_recognizeWidget.clear(); - delete m_fullIndication; -} - -void MultiScreenWidget::setModel(DisplayModel *model) -{ - m_model = model; - - initModeList(); - initPrimaryList(); - - connect(m_model, &DisplayModel::displayModeChanged, m_monitorControlWidget, &MonitorControlWidget::setScreensMerged); - connect(m_model, &DisplayModel::displayModeChanged, this, [=](const int mode) { - if (mode == MERGE_MODE) { - m_modeCombox->setCurrentIndex(0); - m_primarySettingsItem->setVisible(false); - m_brightnessWidget->showBrightness(); - m_monitorControlWidget->setModel(m_model); - for (auto dlg : m_secondaryScreenDlgList) { - dlg->deleteLater(); - } - m_secondaryScreenDlgList.clear(); - } else if (mode == EXTEND_MODE) { - m_modeCombox->setCurrentIndex(1); - m_primarySettingsItem->setVisible(true); - m_brightnessWidget->showBrightness(m_model->primaryMonitor()); - m_monitorControlWidget->setModel(m_model); - initSecondaryScreenDialog(); - } else if (m_model->displayMode() == SINGLE_MODE) { - auto monitorList = m_model->monitorList(); - for (int idx = 0; idx < monitorList.size(); ++idx) { - auto monitor = monitorList[idx]; - if (monitor->enable()) { - m_modeCombox->setCurrentIndex(idx + 2); - m_monitorControlWidget->setModel(m_model, monitor); - break; - } - } - - m_primarySettingsItem->setVisible(false); - m_brightnessWidget->showBrightness(m_model->primaryMonitor()); - - for (auto dlg : m_secondaryScreenDlgList) { - dlg->deleteLater(); - } - m_secondaryScreenDlgList.clear(); - } - }); - connect(m_model, &DisplayModel::primaryScreenChanged, this, [=](const QString &name) { - for (int idx = 0; idx < m_primaryCombox->count(); ++idx) { - if (name == m_primaryCombox->itemText(idx)) { - m_primaryCombox->blockSignals(true); - m_primaryCombox->setCurrentIndex(idx); - m_primaryCombox->blockSignals(false); - break; - } - } - - if (m_model->displayMode() == MERGE_MODE) { - m_brightnessWidget->showBrightness(); - } else if (m_model->displayMode() == EXTEND_MODE) { - m_brightnessWidget->showBrightness(m_model->primaryMonitor()); - } else if (m_model->displayMode() == SINGLE_MODE) { - m_monitorControlWidget->setModel(m_model, m_model->primaryMonitor()); - m_brightnessWidget->showBrightness(m_model->primaryMonitor()); - auto monitorList = m_model->monitorList(); - for (int idx = 0; idx < monitorList.size(); ++idx) { - auto monitor = monitorList[idx]; - if (monitor->enable()) { - m_modeCombox->setCurrentIndex(idx + 2); - break; - } - } - } - - m_resolutionWidget->setMonitor(m_model->primaryMonitor()); - m_refreshRateWidget->setMonitor(m_model->primaryMonitor()); - m_rotateWidget->setMonitor(m_model->primaryMonitor()); - - for (const auto &monitor : m_model->monitorList()) { - if (name == monitor->name()) { - for (auto screen : QGuiApplication::screens()) { - disconnect(screen, &QScreen::geometryChanged, this, &MultiScreenWidget::onResetFullIndication); - } - QScreen *screen = m_model->primaryMonitor()->getQScreen(); - if(!screen) - continue; - - connect(screen, &QScreen::geometryChanged, this, &MultiScreenWidget::onResetFullIndication); - - m_fullIndication->setGeometry(screen->geometry()); - m_fullIndication->move(screen->geometry().topLeft()); - m_fullIndication->setVisible(true); - QTimer::singleShot(1000, this, [=] { m_fullIndication->setVisible(false); }); - m_brightnessWidget->setVisible(monitor->canBrightness()); - break; - } - } - - Q_EMIT requestGatherEnabled(true); - initSecondaryScreenDialog(); - }); - connect(m_model, &DisplayModel::brightnessEnableChanged, this, [=](const bool enable) { - const bool visible = enable && m_model->primaryMonitor() && m_model->primaryMonitor()->canBrightness(); - m_brightnessWidget->setVisible(visible); - }); - - connect(m_monitorControlWidget, &MonitorControlWidget::requestMonitorPress, this, &MultiScreenWidget::onMonitorPress); - connect(m_monitorControlWidget, &MonitorControlWidget::requestMonitorRelease, this, &MultiScreenWidget::onMonitorRelease); - connect(m_monitorControlWidget, &MonitorControlWidget::requestRecognize, this, &MultiScreenWidget::requestRecognize); - connect(m_monitorControlWidget, &MonitorControlWidget::requestSetMonitorPosition, this, &MultiScreenWidget::onRequestSetMonitorPosition); - connect(m_monitorControlWidget, &MonitorControlWidget::requestGatherWindows, this, &MultiScreenWidget::onGatherWindows); - connect(this, &MultiScreenWidget::requestGatherEnabled, m_monitorControlWidget, &MonitorControlWidget::onGatherEnabled); - - connect(m_modeCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - if (idx <= 1 && m_model->displayMode() != idx + 1) { - m_monitorControlWidget->setMergeMode((idx == 0)? true: false); - Q_EMIT requestSwitchMode(idx + 1); - } else if (idx > 1 && (m_model->displayMode() != SINGLE_MODE || (m_model->monitorList()[idx - 2]->name() != m_model->primary() && !m_model->primary().isEmpty()))) { - m_monitorControlWidget->setMergeMode(false); - Q_EMIT requestSwitchMode(SINGLE_MODE, m_model->monitorList()[idx - 2]->name()); - } - }); - connect(m_primaryCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - Q_EMIT requestSetPrimary(m_primaryCombox->itemText(idx)); - }); - - connect(m_brightnessWidget, &BrightnessWidget::requestSetColorTemperature, this, &MultiScreenWidget::requestSetColorTemperature); - connect(m_brightnessWidget, &BrightnessWidget::requestSetMonitorBrightness, this, &MultiScreenWidget::requestSetMonitorBrightness); - connect(m_brightnessWidget, &BrightnessWidget::requestAmbientLightAdjustBrightness, this, &MultiScreenWidget::requestAmbientLightAdjustBrightness); - connect(m_brightnessWidget, &BrightnessWidget::requestSetMethodAdjustCCT, this, &MultiScreenWidget::requestSetMethodAdjustCCT); - connect(m_scalingWidget, &ScalingWidget::requestUiScaleChange, this, &MultiScreenWidget::requestUiScaleChange); - connect(m_resolutionWidget, &ResolutionWidget::requestSetResolution, this, &MultiScreenWidget::requestSetResolution); - connect(m_resolutionWidget, &ResolutionWidget::requestSetFillMode, this, &MultiScreenWidget::requestSetFillMode); - connect(m_resolutionWidget, &ResolutionWidget::requestCurrFillModeChanged, this, &MultiScreenWidget::requestCurrFillModeChanged); - connect(m_refreshRateWidget, &RefreshRateWidget::requestSetResolution, this, &MultiScreenWidget::requestSetResolution); - connect(m_rotateWidget, &RotateWidget::requestSetRotate, this, &MultiScreenWidget::requestSetRotate); - - connect(this, &MultiScreenWidget::requestRecognize, this, &MultiScreenWidget::onRequestRecognize); - - m_monitorControlWidget->setScreensMerged(m_model->displayMode()); - m_monitorControlWidget->setModel(m_model, m_model->displayMode() == SINGLE_MODE ? m_model->primaryMonitor() : nullptr); - - m_brightnessWidget->setMode(m_model); - m_brightnessWidget->showBrightness(m_model->displayMode() == MERGE_MODE ? nullptr : m_model->primaryMonitor()); - const bool brightnessIsEnabled = m_model->brightnessEnable() && m_model->primaryMonitor() && m_model->primaryMonitor()->canBrightness(); - m_brightnessWidget->setVisible(brightnessIsEnabled); - m_scalingWidget->setModel(m_model); - m_resolutionWidget->setModel(m_model, m_model->primaryMonitor()); - m_refreshRateWidget->setModel(m_model, m_model->primaryMonitor()); - m_rotateWidget->setModel(m_model, m_model->primaryMonitor()); - m_primarySettingsItem->setVisible(m_model->displayMode() == EXTEND_MODE); - - initSecondaryScreenDialog(); -} - -void MultiScreenWidget::initModeList() -{ - m_modeCombox->addItem(tr("Duplicate")); - m_modeCombox->addItem(tr("Extend")); - - auto monitorList = m_model->monitorList(); - for (int idx = 0; idx < monitorList.size(); ++idx) { - auto monitor = monitorList[idx]; - if(monitorList.size() <= 2) - m_modeCombox->addItem(tr("Only on %1").arg(monitor->name())); - - if (m_model->displayMode() == MERGE_MODE) { - m_modeCombox->setCurrentIndex(0); - } else if (m_model->displayMode() == EXTEND_MODE) { - m_modeCombox->setCurrentIndex(1); - } else if (m_model->displayMode() == SINGLE_MODE && monitor->enable()) { - m_modeCombox->setCurrentIndex(idx + 2); - } - } -} - -void MultiScreenWidget::initPrimaryList() -{ - for (const auto &monitor : m_model->monitorList()) { - m_primaryCombox->addItem(monitor->name()); - if (monitor->name() == m_model->primary()) { - m_primaryCombox->setCurrentText(m_model->primary()); - } - } -} - -void MultiScreenWidget::initSecondaryScreenDialog() -{ - if (WQt::Utils::isTreeland()) { - // FIXME(treeland): why this will break treeland - return; - } - if (m_model->displayMode() == EXTEND_MODE) { - m_resetSecondaryScreenDlgTimer->stop(); - for (auto dlg : m_secondaryScreenDlgList) { - dlg->deleteLater(); - } - m_secondaryScreenDlgList.clear(); - - for (const auto &monitor : m_model->monitorList()) { - if (monitor == m_model->primaryMonitor()) { - QTimer::singleShot(0, this, [=] { requestSetMainwindowRect(m_model->primaryMonitor(), true); }); - continue; - } - - SecondaryScreenDialog *dlg = new SecondaryScreenDialog(this); - dlg->setAttribute(Qt::WA_WState_WindowOpacitySet); - dlg->setModel(m_model, monitor); - connect(dlg, &SecondaryScreenDialog::requestRecognize, this, &MultiScreenWidget::requestRecognize); - connect(dlg, &SecondaryScreenDialog::requestSetMonitorBrightness, this, &MultiScreenWidget::requestSetMonitorBrightness); - connect(dlg, &SecondaryScreenDialog::requestAmbientLightAdjustBrightness, this, &MultiScreenWidget::requestAmbientLightAdjustBrightness); - connect(dlg, &SecondaryScreenDialog::requestSetResolution, this, &MultiScreenWidget::requestSetResolution); - connect(dlg, &SecondaryScreenDialog::requestSetFillMode, this, &MultiScreenWidget::requestSetFillMode); - connect(dlg, &SecondaryScreenDialog::requestCurrFillModeChanged, this, &MultiScreenWidget::requestCurrFillModeChanged); - connect(dlg, &SecondaryScreenDialog::requestSetRotate, this, &MultiScreenWidget::requestSetRotate); - connect(dlg, &SecondaryScreenDialog::requestGatherWindows, this, &MultiScreenWidget::onGatherWindows); - connect(dlg, &SecondaryScreenDialog::requestCloseRecognize, this, &MultiScreenWidget::onRequestCloseRecognize); - connect(this, &MultiScreenWidget::requestGatherEnabled, dlg, &SecondaryScreenDialog::requestGatherEnabled); - m_secondaryScreenDlgList.append(dlg); - - dlg->show(); - } - activateWindow(); - - if (!qgetenv("WAYLAND_DISPLAY").isEmpty()) { - m_resetSecondaryScreenDlgTimer->start(); - } else { - onResetSecondaryScreenDlgTimerOut(); - } - } -} - -void MultiScreenWidget::onGatherWindows(const QPoint cursor) -{ - Q_EMIT requestGatherEnabled(false); - for (const auto &monitor : m_model->monitorList()) { - auto screen = monitor->getQScreen(); - auto mrt = screen->geometry(); - - if (mrt.contains(cursor.x(), cursor.y())) { - for (QWidget *w : qApp->topLevelWidgets()) { - if (DMainWindow *mainWin = qobject_cast(w)) { - auto rt = mainWin->rect(); - if (rt.width() > screen->geometry().width()) - rt.setWidth(screen->geometry().width()); - - if (rt.height() > screen->geometry().height()) - rt.setHeight(screen->geometry().height()); - - auto tsize = (mrt.size() - rt.size()) / 2; - rt.moveTo(screen->geometry().topLeft().x() + tsize.width(), screen->geometry().topLeft().y() + tsize.height()); - mainWin->setGeometry(rt); - } - } - - for (auto dlg : m_secondaryScreenDlgList) { - auto rt = dlg->rect(); - if (rt.width() > screen->geometry().width()) - rt.setWidth(screen->geometry().width()); - - if (rt.height() > screen->geometry().height()) - rt.setHeight(screen->geometry().height()); - - auto tsize = (mrt.size() - rt.size()) / 2; - rt.moveTo(screen->geometry().topLeft().x() + tsize.width(), screen->geometry().topLeft().y() + tsize.height()); - dlg->QDialog::setGeometry(rt); - // 将副窗口置顶 - dlg->activateWindow(); - } - break; - } - } -} - -void MultiScreenWidget::onMonitorPress(Monitor *monitor) -{ - QScreen *screen = monitor->getQScreen(); - if(!screen) - return; - - m_fullIndication->setGeometry(screen->geometry()); - m_fullIndication->move(screen->geometry().topLeft()); - m_fullIndication->setVisible(true); - - QTimer::singleShot(1000, this, [=] { m_fullIndication->setVisible(false); }); -} - -void MultiScreenWidget::onMonitorRelease(Monitor *monitor) -{ - Q_UNUSED(monitor) - m_fullIndication->setVisible(false); - QTimer::singleShot(2500, this, [=] { requestSetMainwindowRect(m_model->primaryMonitor(), false); }); -} - -void MultiScreenWidget::onRequestSetMonitorPosition(QHash> monitorPosition) -{ - Q_EMIT requestSetMonitorPosition(monitorPosition); -} - -void MultiScreenWidget::onResetFullIndication(const QRect &geometry) -{ - m_fullIndication->setGeometry(geometry); - m_fullIndication->move(geometry.topLeft()); -} - -void MultiScreenWidget::onResetSecondaryScreenDlgTimerOut() -{ - for (auto dlg : m_secondaryScreenDlgList) { - dlg->resetDialog(); - } -} - -void MultiScreenWidget::onResetSecondaryScreenDlg() -{ - for (int i = 0; i < m_secondaryScreenDlgList.count(); ++i) { - SecondaryScreenDialog *screenDialog = m_secondaryScreenDlgList.at(i); - Q_ASSERT(screenDialog); - screenDialog->setWindowOpacity(1); - screenDialog->resetDialog(); - } -} - -void MultiScreenWidget::onRequestRecognize() -{ - for(auto widget : m_recognizeWidget) { - widget->deleteLater(); - } - m_recognizeWidget.clear(); - - // 复制模式 - if (m_model->displayMode() == MERGE_MODE) { - QString text = m_model->monitorList().first()->name(); - for (int idx = 1; idx < m_model->monitorList().size(); idx++) { - text += QString(" = %1").arg(m_model->monitorList()[idx]->name()); - } - - // 所在显示器不存在显示框 - if (m_recognizeWidget.value(text) == nullptr) { - RecognizeWidget *widget = new RecognizeWidget(m_model->monitorList()[0], text); - m_recognizeWidget[text] = widget; - } - } else { // 扩展模式 - for (auto monitor : m_model->monitorList()) { - // 所在显示器不存在显示框 - if (m_recognizeWidget.value(monitor->name()) == nullptr) { - RecognizeWidget *widget = new RecognizeWidget(monitor, monitor->name()); - m_recognizeWidget[monitor->name()] = widget; - } - } - } - - this->setFocus(); //获取焦点响应键盘事件 -} - -void MultiScreenWidget::onRequestCloseRecognize() -{ - disconnect(this, &MultiScreenWidget::requestRecognize, this, &MultiScreenWidget::onRequestRecognize); - - for(auto widget : m_recognizeWidget) { - widget->deleteLater(); - } - m_recognizeWidget.clear(); - - connect(this, &MultiScreenWidget::requestRecognize, this, &MultiScreenWidget::onRequestRecognize); -} - -void MultiScreenWidget::keyPressEvent(QKeyEvent *e) -{ - if(e->key() == Qt::Key_Escape) { - onRequestCloseRecognize(); - } - - QWidget::keyPressEvent(e); -} diff --git a/dcc-old/src/plugin-display/window/multiscreenwidget.h b/dcc-old/src/plugin-display/window/multiscreenwidget.h deleted file mode 100644 index d3d9d56b5a..0000000000 --- a/dcc-old/src/plugin-display/window/multiscreenwidget.h +++ /dev/null @@ -1,115 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef MULTISCREENWIDGET_H -#define MULTISCREENWIDGET_H - -#include "interface/namespace.h" -#include "widgets/titlelabel.h" - -class Resolution; - -QT_BEGIN_NAMESPACE -class QLabel; -class QComboBox; -class QSpacerItem; -class QHBoxLayout; -class QVBoxLayout; -class QKeyEvent; -class QTimer; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { -class SettingsItem; -class Monitor; -class Machine; -class DisplayModel; -class MonitorControlWidget; -class MonitorIndicator; -class RecognizeWidget; -class BrightnessWidget; -class ScalingWidget; -class ResolutionWidget; -class RefreshRateWidget; -class RotateWidget; -class SecondaryScreenDialog; -class CollaborativeLinkWidget; -class MultiScreenWidget : public QWidget -{ - Q_OBJECT -public: - explicit MultiScreenWidget(QWidget *parent = nullptr); - ~MultiScreenWidget(); - -public: - void setModel(DisplayModel *model); - -Q_SIGNALS: - void requestRecognize(); - void requestSwitchMode(const int mode, const QString &name = QString()); - void requestSetMonitorPosition(QHash> monitorPosition); - void requestSetPrimary(const QString &name); - void requestSetColorTemperature(const int value); - void requestSetMonitorBrightness(Monitor *monitor, const double brightness); - void requestAmbientLightAdjustBrightness(const bool able); - void requestSetMethodAdjustCCT(const int mode); - void requestUiScaleChange(const double scale); - void requestSetResolution(Monitor *monitor, const int mode); - void requestSetRotate(Monitor *monitor, const int rotate); - void requestGatherEnabled(const bool enable); - void requestSetMainwindowRect(Monitor *monitor, bool isInit); - void requestSetFillMode(Monitor *monitor, const QString fillMode); - void requestCurrFillModeChanged(Monitor *monitor, const QString fillMode); - -private: - void initModeList(); - void initPrimaryList(); - void initSecondaryScreenDialog(); - -private Q_SLOTS: - void onGatherWindows(const QPoint cursor); - void onMonitorPress(Monitor *monitor); - void onMonitorRelease(Monitor *monitor); - void onRequestSetMonitorPosition(QHash> monitorPosition); - void onRequestRecognize(); - void onRequestCloseRecognize(); - void onResetSecondaryScreenDlg(); - void onResetFullIndication(const QRect &geometry); - void onResetSecondaryScreenDlgTimerOut(); - -protected: - void keyPressEvent(QKeyEvent *event) override; - -private: - QVBoxLayout *m_contentLayout; - MonitorControlWidget *m_monitorControlWidget; - MonitorIndicator *m_fullIndication; - TitleLabel *m_multiSettingLabel; - SettingsItem *m_modeSettingsItem; - QLabel *m_modeLabel; - QComboBox *m_modeCombox; - SettingsItem *m_primarySettingsItem; - QLabel *m_primaryLabel; - QComboBox *m_primaryCombox; - - //协同链接 - CollaborativeLinkWidget *m_linkWidget; - BrightnessWidget *m_brightnessWidget; - ScalingWidget *m_scalingWidget; - ResolutionWidget *m_resolutionWidget; - RefreshRateWidget *m_refreshRateWidget; - RotateWidget *m_rotateWidget; - - DisplayModel *m_model; - - QList m_secondaryScreenDlgList; - QMap m_recognizeWidget; - - bool isReleaseMonitor = false; - QTimer *m_resetSecondaryScreenDlgTimer; -}; -} - -#endif // MULTISCREENWIDGET_H diff --git a/dcc-old/src/plugin-display/window/recognizewidget.cpp b/dcc-old/src/plugin-display/window/recognizewidget.cpp deleted file mode 100644 index cb59a060d8..0000000000 --- a/dcc-old/src/plugin-display/window/recognizewidget.cpp +++ /dev/null @@ -1,82 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "recognizewidget.h" -#include "operation/displaymodel.h" - -#include -#include - -const int FontSize = 20; -const int Radius = 18; -const int MiniWidth = 200; -const int VerticalMargin = 12; -const int HorizentalMargin = 22; -const int yoffset = 220; - -using namespace DCC_NAMESPACE; -RecognizeWidget::RecognizeWidget(Monitor *monitor, QString text, QWidget *parent) - : DBlurEffectWidget(parent), m_monitor(monitor), m_text(text) -{ - connect(m_monitor, &Monitor::geometryChanged, this, &RecognizeWidget::onScreenRectChanged); - - setAttribute(Qt::WA_TranslucentBackground); - setWindowFlags(Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint); - setRadius(Radius); - setMinimumWidth(MiniWidth); - onScreenRectChanged(); - show(); - startTimer(5000); -} - -void RecognizeWidget::paintEvent(QPaintEvent *event) -{ - DBlurEffectWidget::paintEvent(event); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - - QFont font; - font.setStyle(QFont::StyleNormal); - font.setPixelSize(FontSize); - const QFontMetrics fm(font); - - QPainterPath path; - path.addText((m_rect.width() - fm.horizontalAdvance(m_text)) / 2, m_rect.height() - VerticalMargin - fm.height() / 4, font, m_text); - - QPalette palette; - QColor brushCorlor; - brushCorlor = palette.color(QPalette::BrightText); - - painter.setPen(Qt::NoPen); - painter.setBrush(brushCorlor); - painter.drawPath(path); -} - -void RecognizeWidget::onScreenRectChanged() -{ - const auto ratio = devicePixelRatioF(); - QRect displayRect(m_monitor->x(), m_monitor->y(), m_monitor->w(), m_monitor->h()); - displayRect = QRect(displayRect.topLeft(), displayRect.size() / ratio); - - QFont font; - font.setStyle(QFont::StyleNormal); - font.setPixelSize(FontSize); - const QFontMetrics fm(font); - int width = fm.horizontalAdvance(m_text) + 2 * HorizentalMargin > MiniWidth ? fm.horizontalAdvance(m_text) + 2 * HorizentalMargin : MiniWidth; - int height = fm.height() + 2 * VerticalMargin; - - const int x = displayRect.center().x() - width / 2; - const int y = displayRect.y() + displayRect.height() - height - yoffset; - m_rect = QRect(x, y, width, height); - - setGeometry(m_rect); - update(); -} - -void RecognizeWidget::timerEvent(QTimerEvent *event) -{ - Q_UNUSED(event) - hide(); -} diff --git a/dcc-old/src/plugin-display/window/recognizewidget.h b/dcc-old/src/plugin-display/window/recognizewidget.h deleted file mode 100644 index e35d256da2..0000000000 --- a/dcc-old/src/plugin-display/window/recognizewidget.h +++ /dev/null @@ -1,43 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef RECOGNIZEWIDGET_H -#define RECOGNIZEWIDGET_H - -#include "interface/namespace.h" - -#include - -class QPainter; -class QPainterPath; - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; -class RecognizeWidget : public DBlurEffectWidget -{ - Q_OBJECT - -public: - explicit RecognizeWidget(Monitor *monitor, QString name, QWidget *parent = nullptr); - -protected: - void paintEvent(QPaintEvent *) override; - void timerEvent(QTimerEvent *event) override; - -private Q_SLOTS: - void onScreenRectChanged(); - -private: - Monitor *m_monitor; - QRect m_rect; - QString m_text; -}; -} - -#endif // RECOGNIZEWIDGET_H diff --git a/dcc-old/src/plugin-display/window/refreshratewidget.cpp b/dcc-old/src/plugin-display/window/refreshratewidget.cpp deleted file mode 100644 index 7c84c991ca..0000000000 --- a/dcc-old/src/plugin-display/window/refreshratewidget.cpp +++ /dev/null @@ -1,167 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "refreshratewidget.h" -#include "operation/displaymodel.h" - -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -RefreshRateWidget::RefreshRateWidget(int comboxWidth, QWidget *parent) - : SettingsItem(parent) - , m_contentLayout(new QHBoxLayout(this)) - , m_refreshCombox(new QComboBox(this)) - , m_model(nullptr) - , m_monitor(nullptr) - , m_refreshItemModel(new QStandardItemModel(this)) -{ - m_refreshLabel = new QLabel(tr("Refresh Rate"), this); - - addBackground(); - setMinimumHeight(48); - m_contentLayout->setContentsMargins(10, 0, 10, 0); - m_contentLayout->addWidget(m_refreshLabel); - m_contentLayout->addWidget(m_refreshCombox); - m_refreshCombox->setFocusPolicy(Qt::NoFocus); - m_refreshCombox->setMinimumWidth(comboxWidth); - m_refreshCombox->setMinimumHeight(36); - m_refreshCombox->setModel(m_refreshItemModel); - setLayout(m_contentLayout); -} - -void RefreshRateWidget::setModel(DisplayModel *model, Monitor *monitor) -{ - m_model = model; - m_refreshCombox->setEnabled(m_model->resolutionRefreshEnable()); - - connect(m_model, &DisplayModel::monitorListChanged, this, &RefreshRateWidget::initRefreshRate); - connect(m_model, &DisplayModel::displayModeChanged, this, &RefreshRateWidget::initRefreshRate); - connect(m_model, &DisplayModel::resolutionRefreshEnableChanged, m_refreshCombox, &QComboBox::setEnabled); - - setMonitor(monitor); -} - -void RefreshRateWidget::setMonitor(Monitor *monitor) -{ - if (monitor == nullptr || m_monitor == monitor) { - return; - } - - // 先断开信号,设置数据再连接信号 - if (m_monitor != nullptr) { - disconnect(m_monitor, &Monitor::modelListChanged, this, &RefreshRateWidget::initRefreshRate); - disconnect(m_monitor, &Monitor::currentModeChanged, this, &RefreshRateWidget::OnCurrentModeChanged); - } - - m_monitor = monitor; - - initRefreshRate(); - - connect(m_monitor, &Monitor::modelListChanged, this, &RefreshRateWidget::initRefreshRate); - connect(m_monitor, &Monitor::currentModeChanged, this, &RefreshRateWidget::OnCurrentModeChanged); -} - -void RefreshRateWidget::OnCurrentModeChanged(const Resolution &mode) -{ - // 按主线逻辑,当mode=0时,在x11环境下需要特殊处理 - // 在wayland环境下,直接跳过 - if (qEnvironmentVariable("XDG_SESSION_TYPE").contains("x11")) { - // 规避mode == 0 - if (mode.id() == 0) { - return; - } - } - - auto w = 0; - auto h = 0; - // 当前分辨率宽度和高度 - if (m_refreshCombox->currentIndex() >= 0 && m_refreshItemModel->rowCount() >= 0) { - auto item = m_refreshItemModel->item(m_refreshCombox->currentIndex()); - w = item->data(WidthRole).toInt(); - h = item->data(HeightRole).toInt(); - } - - // 无刷新率,分辨率宽度或高度改变则重新加载刷新率 - if (m_refreshCombox->currentIndex() < 0 || m_refreshItemModel->rowCount() < 0 || w != mode.width() || h != mode.height()) { - initRefreshRate(); - } - - for (int idx = 0; idx < m_refreshItemModel->rowCount(); ++idx) { - auto item = m_refreshItemModel->item(idx); - if (item->data(IdRole).toUInt() == mode.id()) { - m_refreshCombox->setCurrentIndex(item->row()); - break; - } - } -} - -void RefreshRateWidget::initRefreshRate() -{ - if (m_monitor == nullptr) { - return; - } - - // 先断开信号,设置数据再连接信号 - if (m_refreshItemModel != nullptr) { - disconnect(m_refreshCombox, static_cast(&QComboBox::currentIndexChanged), this, nullptr); - m_refreshItemModel->clear(); - } - - auto modeList = m_monitor->modeList(); - bool first = true; - for (auto mode : modeList) { - if (!Monitor::isSameResolution(mode, m_monitor->currentMode())) - continue; - - if (m_model->displayMode() == MERGE_MODE) { - bool isComm = true; - for (auto monitor : m_model->monitorList()) { - if (!monitor->hasResolutionAndRate(mode)) { - isComm = false; - break; - } - } - - if (!isComm) { - continue; - } - } - - auto rate = mode.rate(); - DStandardItem *item = new DStandardItem; - auto ref = QString::number(rate, 'g', 4) + tr("Hz"); - if (Monitor::isSameResolution(mode, m_monitor->bestMode())) { - if (Monitor::isSameRatefresh(mode, m_monitor->bestMode())) { - ref += QString(" (%1)").arg(tr("Recommended")); - } - } else if (first) { - ref += QString(" (%1)").arg(tr("Recommended")); - first = false; - } - - item->setText(ref); - item->setData(QVariant(mode.id()), IdRole); - item->setData(QVariant(mode.rate()), RateRole); - item->setData(QVariant(mode.width()), WidthRole); - item->setData(QVariant(mode.height()), HeightRole); - m_refreshItemModel->appendRow(item); - - if (mode == m_monitor->currentMode()) { - m_refreshCombox->setCurrentIndex(item->row()); - } - } - - connect(m_refreshCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - auto item = m_refreshItemModel->item(idx); - auto r = item->data(IdRole).toUInt(); - if (m_monitor->currentMode().id() != r) { - Q_EMIT requestSetResolution(m_monitor, r); - } - }); -} diff --git a/dcc-old/src/plugin-display/window/refreshratewidget.h b/dcc-old/src/plugin-display/window/refreshratewidget.h deleted file mode 100644 index 1975dff47e..0000000000 --- a/dcc-old/src/plugin-display/window/refreshratewidget.h +++ /dev/null @@ -1,67 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef REFRESHRATEWIDGET_H -#define REFRESHRATEWIDGET_H - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include - -class Resolution; - -QT_BEGIN_NAMESPACE -class QLabel; -class QComboBox; -class QHBoxLayout; -QT_END_NAMESPACE - -DWIDGET_BEGIN_NAMESPACE -class DStandardItem; -DWIDGET_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; - -class RefreshRateWidget : public SettingsItem -{ - Q_OBJECT -public: - RefreshRateWidget(int comboxWidth = 300, QWidget *parent = nullptr); - - enum ResolutionRole { - IdRole = Dtk::UserRole, - WidthRole, - HeightRole, - RateRole - }; - -public: - void setModel(DisplayModel *model, Monitor *monitor); - void setMonitor(Monitor *monitor); - -Q_SIGNALS: - void requestSetResolution(Monitor *monitor, const int mode); - -public Q_SLOTS: - void OnCurrentModeChanged(const Resolution &mode); - -private: - void initRefreshRate(); - -private: - QHBoxLayout *m_contentLayout; - QLabel *m_refreshLabel; - QComboBox *m_refreshCombox; - - DisplayModel *m_model; - Monitor *m_monitor; - QStandardItemModel *m_refreshItemModel; -}; -} -#endif // REFRESHRATEWIDGET_H diff --git a/dcc-old/src/plugin-display/window/resolutionwidget.cpp b/dcc-old/src/plugin-display/window/resolutionwidget.cpp deleted file mode 100644 index 79e2e25f9c..0000000000 --- a/dcc-old/src/plugin-display/window/resolutionwidget.cpp +++ /dev/null @@ -1,512 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "resolutionwidget.h" -#include "operation/displaymodel.h" - -#include -#include -#include -#include -#include -#include - -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -fillModeCombox::fillModeCombox(QWidget *parent) - : QComboBox(parent) -{ - connect(this, QOverload::of(&QComboBox::highlighted), this, &fillModeCombox::OnHighlighted); - - connect(DGuiApplicationHelper::instance(), &DGuiApplicationHelper::themeTypeChanged, this, [=](DGuiApplicationHelper::ColorType themeType){ - //在切换主题的时候,combox无法获取当前是hidepopup还是showpopup, 所以需要设置为hidepopup来达到更新图标的目的 - Q_UNUSED(themeType) - hidePopup(); - }); - -} - -void fillModeCombox::OnHighlighted(int index) -{ - if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - for(int i = 0; i < this->count(); i++) { - if(i == index) - this->setItemIcon(i, QPixmap(this->itemData(i, LightHighlightIconRole).toString())); - else - this->setItemIcon(i, QPixmap(this->itemData(i, LightItemIconRole).toString())); - } - } - else if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { - for(int i = 0; i < this->count(); i++) { - if(i == index) - this->setItemIcon(i, QPixmap(this->itemData(i, DarkHighlightIconRole).toString())); - else - this->setItemIcon(i, QPixmap(this->itemData(i, DarkItemIconRole).toString())); - } - } -} - -void fillModeCombox::showPopup() -{ - QComboBox::showPopup(); - setItemRoleIcon(); -} - -void fillModeCombox::hidePopup() -{ - QComboBox::hidePopup(); - setDefaultRoleIcon(); -} - -void fillModeCombox:: setDefaultRoleIcon() -{ - //获取当前主题 - if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, LightDefaultIconRole).toString())); - } - } else if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, DarkDefaultIconRole).toString())); - } - } -} - -void fillModeCombox:: setItemRoleIcon() -{ - //获取当前主题 - if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, LightItemIconRole).toString())); - } - } else if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, DarkItemIconRole).toString())); - } - } -} - -void fillModeCombox:: setHoverRoleIcon() -{qInfo()<itemData(0, LightHoverIconRole).toString()<itemData(0, DarkHoverIconRole).toString(); - qInfo()<itemData(0, LightHoverIconRole).toString())<itemData(0, DarkHoverIconRole).toString()); - //获取当前主题 - if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::LightType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, LightHoverIconRole).toString())); - } - } else if(DGuiApplicationHelper::instance()->themeType() == DGuiApplicationHelper::DarkType) { - for(int i = 0; i < this->count(); i++) { - this->setItemIcon(i, QPixmap(this->itemData(i, DarkHoverIconRole).toString())); - } - } -} - -bool fillModeCombox::event(QEvent *e) -{ - switch (e->type()) { - case QEvent::HoverEnter: - setHoverRoleIcon(); - break; - case QEvent::HoverLeave: - setDefaultRoleIcon(); - break; - default: - break; - } - return QComboBox::event(e); -} - -ResolutionWidget::ResolutionWidget(int comboxWidth, QWidget *parent) - : SettingsItem(parent) - , m_resolutionLayout(new QHBoxLayout()) - , m_resizeDesktopLayout(new QHBoxLayout()) - , m_contentLayout(new QVBoxLayout()) - , m_resolutionCombox(new QComboBox(this)) - , m_resizeDesktopCombox(new fillModeCombox(this)) - , m_resizeDesktopItem(new SettingsItem) - , m_model(nullptr) - , m_monitor(nullptr) - , m_resoItemModel(new QStandardItemModel(this)) - , m_resizeItemModel(new QStandardItemModel(this)) -{ - //~ contents_path /display/Resolution - m_resolutionLabel = new QLabel(tr("Resolution"), this); - //~ contents_path /display/Resize Desktop - m_resizeDesktopLabel = new QLabel(tr("Resize Desktop"), this); - - setMinimumHeight(48); - SettingsItem *resolutionItem = new SettingsItem; - m_resolutionLayout->setContentsMargins(10, 10, 10, 10); - m_resolutionLayout->addWidget(m_resolutionLabel); - m_resolutionLayout->addWidget(m_resolutionCombox); - m_resolutionCombox->setFocusPolicy(Qt::NoFocus); - m_resolutionCombox->setMinimumWidth(comboxWidth); - m_resolutionCombox->setMinimumHeight(36); - m_resolutionCombox->setModel(m_resoItemModel); - resolutionItem->setLayout(m_resolutionLayout); - //"Resize Desktop" - m_resizeDesktopLayout->setContentsMargins(10, 10, 10, 10); - m_resizeDesktopLayout->addWidget(m_resizeDesktopLabel); - m_resizeDesktopLayout->addWidget(m_resizeDesktopCombox); - m_resizeDesktopCombox->setFocusPolicy(Qt::NoFocus); - m_resizeDesktopCombox->setMinimumWidth(comboxWidth); - m_resizeDesktopCombox->setMinimumHeight(36); - m_resizeDesktopCombox->setModel(m_resizeItemModel); - m_resizeDesktopItem->setLayout(m_resizeDesktopLayout); - m_resizeDesktopItem->installEventFilter(this); - - SettingsGroup *grp = new SettingsGroup(nullptr, SettingsGroup::GroupBackground); - grp->getLayout()->setContentsMargins(0, 0, 0, 0); - grp->setContentsMargins(0, 0, 0, 0); - grp->layout()->setMargin(0); - grp->appendItem(resolutionItem); - grp->appendItem(m_resizeDesktopItem); - - m_contentLayout->setSpacing(0); - m_contentLayout->setContentsMargins(0, 0, 0, 0); - setLayout(m_contentLayout); - m_contentLayout->addWidget(grp); -} - -ResolutionWidget::~ResolutionWidget() -{ - m_resizeItemModel->deleteLater(); -} - -void ResolutionWidget::setModel(DisplayModel *model, Monitor *monitor) -{ - m_model = model; - m_resolutionCombox->setEnabled(m_model->resolutionRefreshEnable()); - m_resizeDesktopCombox->setEnabled(m_model->resolutionRefreshEnable()); - connect(m_model, &DisplayModel::monitorListChanged, this, &ResolutionWidget::initResolution); - connect(m_model, &DisplayModel::displayModeChanged, this, &ResolutionWidget::initResolution); - connect(m_model, &DisplayModel::resolutionRefreshEnableChanged, m_resolutionCombox, &QComboBox::setEnabled); - - setMonitor(monitor); -} - -void ResolutionWidget::setMonitor(Monitor *monitor) -{ - if (monitor == nullptr || m_monitor == monitor) { - return; - } - - // 先断开信号,设置数据再连接信号 - if (m_monitor != nullptr) { - disconnect(m_monitor, &Monitor::currentFillModeChanged, this, nullptr); - disconnect(m_monitor, &Monitor::availableFillModesChanged, this, &ResolutionWidget::OnAvailableFillModesChanged); - disconnect(m_monitor, &Monitor::modelListChanged, this, &ResolutionWidget::initResolution); - disconnect(m_monitor, &Monitor::bestModeChanged, this, &ResolutionWidget::initResolution); - disconnect(m_monitor, &Monitor::currentModeChanged, this, &ResolutionWidget::OnCurrentModeChanged); - } - - m_monitor = monitor; - - initResolution(); - OnAvailableFillModesChanged(m_monitor->availableFillModes()); - initResizeDesktop(); - - connect(m_monitor, &Monitor::availableFillModesChanged, this, &ResolutionWidget::OnAvailableFillModesChanged); - connect(m_monitor, &Monitor::currentFillModeChanged, this, &ResolutionWidget::initResizeDesktop); - connect(m_monitor, &Monitor::currentFillModeChanged, this, [this] (QString currFillMode) { - Q_EMIT requestCurrFillModeChanged(m_monitor,currFillMode); - }); - - connect(m_monitor, &Monitor::modelListChanged, this, &ResolutionWidget::initResolution); - connect(m_monitor, &Monitor::bestModeChanged, this, &ResolutionWidget::initResolution); - connect(m_monitor, &Monitor::currentModeChanged, this, &ResolutionWidget::OnCurrentModeChanged); -} - -void ResolutionWidget::OnCurrentModeChanged(const Resolution &mode) -{ - // 按主线逻辑,当mode=0时,在x11环境下需要特殊处理 - // 在wayland环境下,直接跳过 - if (qEnvironmentVariable("XDG_SESSION_TYPE").contains("x11")) { - // 规避mode == 0 - if (mode.id() == 0) { - return; - } - } - - for (int idx = 0; idx < m_resoItemModel->rowCount(); ++idx) { - auto item = m_resoItemModel->item(idx); - auto w = item->data(WidthRole).toInt(); - auto h = item->data(HeightRole).toInt(); - if (w == mode.width() && h == mode.height() && m_resolutionCombox->currentIndex() != item->row()) { - m_resolutionCombox->setCurrentIndex(item->row()); - break; - } - } -} - -Dtk::Widget::DStandardItem *ResolutionWidget::getItemIcon(const QString &key) -{ - Dtk::Widget::DStandardItem *item = nullptr; - if (key == "None") { // 默认 - item = new Dtk::Widget::DStandardItem(tr("Default")); - //深色 - item->setData("None", FillModeRole); - item->setData(":/display/icons/dark/icons/dark/Default.svg", DarkItemIconRole); - item->setData(":/display/icons/dark/icons/dark/Default.svg", DarkDefaultIconRole); - item->setData(":/display/icons/dark/icons/white/Default.svg", DarkHighlightIconRole); - item->setData(":/display/icons/dark/icons/hover/Default.svg", DarkHoverIconRole); - //浅色 - item->setData(":/display/icons/light/icon/black/Default.svg", LightItemIconRole); - item->setData(":/display/icons/light/icon/light/Default.svg", LightDefaultIconRole); - item->setData(":/display/icons/light/icon/white/Default.svg", LightHighlightIconRole); - item->setData(":/display/icons/light/icon/hover/Default.svg", LightHoverIconRole); - } else if (key == "Full aspect") { // 适应 - item = new Dtk::Widget::DStandardItem(tr("Fit")); - //深色 - item->setData("Full aspect", FillModeRole); - item->setData(":/display/icons/dark/icons/dark/Fit.svg", DarkItemIconRole); - item->setData(":/display/icons/dark/icons/dark/Fit.svg", DarkDefaultIconRole); - item->setData(":/display/icons/dark/icons/white/Fit.svg", DarkHighlightIconRole); - item->setData(":/display/icons/dark/icons/hover/Fit.svg", DarkHoverIconRole); - //浅色 - item->setData(":/display/icons/light/icon/black/Fit.svg", LightItemIconRole); - item->setData(":/display/icons/light/icon/light/Fit.svg", LightDefaultIconRole); - item->setData(":/display/icons/light/icon/white/Fit.svg", LightHighlightIconRole); - item->setData(":/display/icons/light/icon/hover/Fit.svg", LightHoverIconRole); - } else if (key == "Full") { // 铺满 - item = new Dtk::Widget::DStandardItem(tr("Stretch")); - //深色 - item->setData("Full", FillModeRole); - item->setData(":/display/icons/dark/icons/dark/Stretch.svg", DarkItemIconRole); - item->setData(":/display/icons/dark/icons/dark/Stretch.svg", DarkDefaultIconRole); - item->setData(":/display/icons/dark/icons/white/Stretch.svg", DarkHighlightIconRole); - item->setData(":/display/icons/dark/icons/hover/Stretch.svg", DarkHoverIconRole); - //浅色 - item->setData(":/display/icons/light/icon/black/Stretch.svg", LightItemIconRole); - item->setData(":/display/icons/light/icon/light/Stretch.svg", LightDefaultIconRole); - item->setData(":/display/icons/light/icon/white/Stretch.svg", LightHighlightIconRole); - item->setData(":/display/icons/light/icon/hover/Stretch.svg", LightHoverIconRole); - } else if (key == "Center") { // 居中 - item = new Dtk::Widget::DStandardItem(tr("Center")); - //深色 - item->setData("Center", FillModeRole); - item->setData(":/display/icons/dark/icons/dark/Center.svg", DarkItemIconRole); - item->setData(":/display/icons/dark/icons/dark/Center.svg", DarkDefaultIconRole); - item->setData(":/display/icons/dark/icons/white/Center.svg", DarkHighlightIconRole); - item->setData(":/display/icons/dark/icons/hover/Center.svg", DarkHoverIconRole); - //浅色 - item->setData(":/display/icons/light/icon/black/Center.svg", LightItemIconRole); - item->setData(":/display/icons/light/icon/light/Center.svg", LightDefaultIconRole); - item->setData(":/display/icons/light/icon/white/Center.svg", LightHighlightIconRole); - item->setData(":/display/icons/light/icon/hover/Center.svg", LightHoverIconRole); - } - return item; -} - -void ResolutionWidget::initResizeDesktop() -{ - - if (m_monitor == nullptr) { - return; - } - // 先断开信号,设置数据再连接信号 - disconnect(m_resizeDesktopCombox, static_cast(&QComboBox::currentIndexChanged), this, nullptr); - - QStringList lstFillMode = m_monitor->availableFillModes(); - //获取最新的铺面方式 - QString fillMode = m_monitor->currentFillMode(); - if(fillMode.isEmpty()) - fillMode = "None"; - int index = lstFillMode.indexOf(fillMode); - if(index >= 0) - m_resizeDesktopCombox->setCurrentIndex(index); - //用户手动选择铺满方式时发送信号 - connect(m_resizeDesktopCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - Q_EMIT requestSetFillMode(m_monitor, this->m_resizeDesktopCombox->itemData(idx,FillModeRole).toString()); - }); -} - -void ResolutionWidget::OnAvailableFillModesChanged(const QStringList &lstFillMode) -{ - disconnect(m_resizeDesktopCombox, static_cast(&QComboBox::currentIndexChanged), this, nullptr); - - m_resizeItemModel->clear(); - for(auto str : lstFillMode) { - Dtk::Widget::DStandardItem *item = getItemIcon(str); - if(item) - m_resizeItemModel->appendRow(item); - } - m_resizeDesktopCombox->setDefaultRoleIcon(); - - updateResizeDesktopVisible(); -} - -void ResolutionWidget::setResizeDesktopVisible(bool visible) -{ - if (m_model->displayMode() == MERGE_MODE && visible) { - visible = m_model->allSupportFillModes(); - } - - m_resizeDesktopItem->setVisible(visible); -} - -bool ResolutionWidget::eventFilter(QObject *obj, QEvent *event) -{ - if (obj == m_resizeDesktopItem) { - switch (event->type()) { - case QEvent::Hide: - setMinimumHeight(48); - Q_EMIT requestResizeDesktopVisibleChanged(false); - break; - case QEvent::Show: - setMinimumHeight(48 * 2); - Q_EMIT requestResizeDesktopVisibleChanged(true); - break; - default: - break; - } - } - return SettingsItem::eventFilter(obj, event); -} - -void ResolutionWidget::updateResizeDesktopVisible() -{ - //推荐分辨率下隐藏铺满方式 - if (m_resolutionCombox->currentText().contains(tr("Recommended"))) { - setResizeDesktopVisible(false); - } else { - setResizeDesktopVisible(!m_monitor->availableFillModes().isEmpty()); - } -} - -void ResolutionWidget::initResolution() -{ - if (m_monitor == nullptr) { - return; - } - - // 先断开信号,设置数据再连接信号 - if (m_resoItemModel != nullptr) { - disconnect(m_resolutionCombox, static_cast(&QComboBox::currentIndexChanged), this, nullptr); - m_resoItemModel->clear(); - } - - auto modeList = m_monitor->modeList(); - auto curMode = m_monitor->currentMode(); - - Resolution preMode; - if (qgetenv("WAYLAND_DISPLAY").isEmpty() ) { - for (auto mode : modeList) { - if (Monitor::isSameResolution(preMode, mode)) { - continue; - } - - preMode = mode; - if (m_model->displayMode() == MERGE_MODE) { - bool isComm = true; - for (auto monitor : m_model->monitorList()) { - if (!monitor->hasResolution(mode)) { - isComm = false; - break; - } - } - - if (!isComm) { - continue; - } - } - - auto *item = new Dtk::Widget::DStandardItem; - item->setData(QVariant(mode.id()), IdRole); - item->setData(QVariant(mode.rate()), RateRole); - item->setData(QVariant(mode.width()), WidthRole); - item->setData(QVariant(mode.height()), HeightRole); - - auto res = QString::number(mode.width()) + "×" + QString::number(mode.height()); - if (Monitor::isSameResolution(mode, m_monitor->bestMode())) { - item->setText(res + QString(" (%1)").arg(tr("Recommended"))); - m_resoItemModel->insertRow(0, item); - } else { - item->setText(res); - m_resoItemModel->appendRow(item); - } - - if (Monitor::isSameResolution(curMode, mode)) { - m_resolutionCombox->setCurrentIndex(item->row()); - } - } - } else { - bool first = true; - for (auto mode : modeList) { - if (Monitor::isSameResolution(preMode, mode)) { - continue; - } - - preMode = mode; - if (m_model->displayMode() == MERGE_MODE) { - bool isComm = true; - for (auto monitor : m_model->monitorList()) { - if (!monitor->hasResolution(mode)) { - isComm = false; - break; - } - } - - if (!isComm) { - continue; - } - } - - auto *item = new Dtk::Widget::DStandardItem; - item->setData(QVariant(mode.id()), IdRole); - item->setData(QVariant(mode.rate()), RateRole); - item->setData(QVariant(mode.width()), WidthRole); - item->setData(QVariant(mode.height()), HeightRole); - - auto res = QString::number(mode.width()) + "×" + QString::number(mode.height()); - if (first) { - first = false; - item->setText(res + QString(" (%1)").arg(tr("Recommended"))); - m_resoItemModel->insertRow(0, item); - } else { - item->setText(res); - m_resoItemModel->appendRow(item); - } - - if (Monitor::isSameResolution(curMode, mode)) { - m_resolutionCombox->setCurrentIndex(item->row()); - } - } - } - - //推荐分辨率下隐藏铺满方式并改变高度 - updateResizeDesktopVisible(); - - connect(m_resolutionCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - auto item = m_resoItemModel->item(idx); - auto r = item->data(IdRole).toInt(); - auto w = item->data(WidthRole).toInt(); - auto h = item->data(HeightRole).toInt(); - - //推荐分辨率下隐藏铺满方式并改变高度 - updateResizeDesktopVisible(); - - // 选中分辨率和当前分别率相同 - if (m_monitor->currentMode().width() == w && m_monitor->currentMode().height() == h) { - return; - } - - // 优先设置最好模式 - if (m_monitor->bestMode().width() == w && m_monitor->bestMode().height() == h) { - Q_EMIT requestSetResolution(m_monitor, m_monitor->bestMode().id()); - return; - } - - for (auto mode : m_monitor->modeList()) { - if (mode.width() == w && mode.height() == h) { - Q_EMIT requestSetResolution(m_monitor, mode.id()); - return; - } - } - Q_EMIT requestSetResolution(m_monitor, r); - }); -} diff --git a/dcc-old/src/plugin-display/window/resolutionwidget.h b/dcc-old/src/plugin-display/window/resolutionwidget.h deleted file mode 100644 index 55b3fd5474..0000000000 --- a/dcc-old/src/plugin-display/window/resolutionwidget.h +++ /dev/null @@ -1,115 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef RESOLUTIONWIDGET_H -#define RESOLUTIONWIDGET_H - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" -#include "widgets/settingsgroup.h" - -#include - -#include - -class Resolution; -class DStandardItem; - -QT_BEGIN_NAMESPACE -class QLabel; -class QComboBox; -class QHBoxLayout; -class QVBoxLayout; -class QStandardItemModel; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; - -enum ResizeDesktopRole { - FillModeRole = Dtk::UserRole, - DarkDefaultIconRole, - DarkHighlightIconRole, - DarkItemIconRole, - DarkHoverIconRole, - LightDefaultIconRole, - LightHighlightIconRole, - LightItemIconRole, - LightHoverIconRole -}; - -class fillModeCombox : public QComboBox -{ - Q_OBJECT -public: - explicit fillModeCombox(QWidget *parent = nullptr); - virtual void showPopup() override; //显示下拉框 - virtual void hidePopup() override; //隐藏下拉框 - - void setDefaultRoleIcon(); - void setItemRoleIcon(); - void setHoverRoleIcon(); - -public Q_SLOTS: - void OnHighlighted(int index); -protected: - bool event(QEvent *e) override; -}; - -class ResolutionWidget : public SettingsItem -{ - Q_OBJECT -public: - explicit ResolutionWidget(int comboxWidth = 300, QWidget *parent = nullptr); - ~ResolutionWidget(); - enum ResolutionRole { - IdRole = Dtk::UserRole, - WidthRole, - HeightRole, - RateRole - }; - -public: - void setModel(DisplayModel *model, Monitor *monitor); - void setMonitor(Monitor *monitor); - -Q_SIGNALS: - void requestSetResolution(Monitor *monitor, const int mode); - void requestSetFillMode(Monitor *monitor, const QString fillMode); - void requestResizeDesktopVisibleChanged(bool visible); - void requestCurrFillModeChanged(Monitor *monitor, const QString fillMode); //用于复制模式下用主屏去更新其他屏幕铺满方式使用 - - -public Q_SLOTS: - void OnAvailableFillModesChanged(const QStringList &lstFillMode); - void OnCurrentModeChanged(const Resolution &mode); - -private: - void initResolution(); - void initResizeDesktop(); - Dtk::Widget::DStandardItem *getItemIcon(const QString &key); - void setResizeDesktopVisible(bool visible); - void updateResizeDesktopVisible(); - bool eventFilter(QObject *obj, QEvent *event) override; - -private: - QHBoxLayout *m_resolutionLayout; - QHBoxLayout *m_resizeDesktopLayout; - QVBoxLayout *m_contentLayout; - QLabel *m_resolutionLabel; - QComboBox *m_resolutionCombox; - QLabel *m_resizeDesktopLabel; //屏幕显示方式 - fillModeCombox *m_resizeDesktopCombox; //拉伸-居中-适应 - SettingsItem *m_resizeDesktopItem; - - DisplayModel *m_model; - Monitor *m_monitor; - QStandardItemModel *m_resoItemModel; - QStandardItemModel *m_resizeItemModel; -}; -} -#endif // RESOLUTIONWIDGET_H diff --git a/dcc-old/src/plugin-display/window/rotatewidget.cpp b/dcc-old/src/plugin-display/window/rotatewidget.cpp deleted file mode 100644 index 34c5ef6c70..0000000000 --- a/dcc-old/src/plugin-display/window/rotatewidget.cpp +++ /dev/null @@ -1,87 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include - -#include "rotatewidget.h" -#include "operation/displaymodel.h" - -#include -#include -#include - -using namespace DCC_NAMESPACE; -RotateWidget::RotateWidget(int comboxWidth, QWidget *parent) - : SettingsItem(parent) - , m_contentLayout(new QHBoxLayout(this)) - , m_rotateCombox(new QComboBox(this)) - , m_model(nullptr) - , m_monitor(nullptr) -{ - //初始化列表无法进行静态翻译 - //~ contents_path /display/Rotation - m_rotateLabel = new QLabel(tr("Rotation"), this); - - setAccessibleName("RotateWidget"); - addBackground(); - setMinimumHeight(48); - m_contentLayout->setContentsMargins(10, 0, 10, 0); - m_contentLayout->addWidget(m_rotateLabel); - m_contentLayout->addWidget(m_rotateCombox); - m_rotateCombox->setFocusPolicy(Qt::NoFocus); - m_rotateCombox->setMinimumWidth(comboxWidth); - m_rotateCombox->setMinimumHeight(36); - setLayout(m_contentLayout); - - QStringList rotateList {tr("Standard"), tr("90°"), tr("180°"), tr("270°")}; - for (int idx = 0; idx < rotateList.size(); ++idx) { - m_rotateCombox->addItem(rotateList[idx], qPow(2, idx)); - } -} - -void RotateWidget::setModel(DisplayModel *model, Monitor *monitor) -{ - m_model = model; - - connect(m_model, &DisplayModel::displayModeChanged, this, &RotateWidget::initRotate); - - setMonitor(monitor); -} - -void RotateWidget::setMonitor(Monitor *monitor) -{ - if (monitor == nullptr || m_monitor == monitor) { - return; - } - - // 先断开信号,设置数据再连接信号 - if (m_monitor != nullptr) { - disconnect(m_monitor, &Monitor::rotateChanged, this, &RotateWidget::initRotate); - } - - m_monitor = monitor; - - initRotate(); - - connect(m_monitor, &Monitor::rotateChanged, this, &RotateWidget::initRotate); -} - -void RotateWidget::initRotate() -{ - if (m_monitor == nullptr) { - return; - } - - // 先断开信号,设置数据再连接信号 - disconnect(m_rotateCombox, static_cast(&QComboBox::currentIndexChanged), this, nullptr); - - auto rotate = m_monitor->rotate(); - m_rotateCombox->setCurrentIndex(m_rotateCombox->findData(rotate)); - - connect(m_rotateCombox, static_cast(&QComboBox::currentIndexChanged), this, [=](int idx) { - Q_UNUSED(idx) - Q_EMIT requestSetRotate(m_monitor, m_rotateCombox->currentData().value()); - }); -} diff --git a/dcc-old/src/plugin-display/window/rotatewidget.h b/dcc-old/src/plugin-display/window/rotatewidget.h deleted file mode 100644 index 7aa95f7408..0000000000 --- a/dcc-old/src/plugin-display/window/rotatewidget.h +++ /dev/null @@ -1,49 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef ROTATEWIDGET_H -#define ROTATEWIDGET_H - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -QT_BEGIN_NAMESPACE -class QLabel; -class QComboBox; -class QHBoxLayout; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; - -class RotateWidget : public SettingsItem -{ - Q_OBJECT -public: - explicit RotateWidget(int comboxWidth = 300, QWidget *parent = nullptr); - -public: - void setModel(DisplayModel *model, Monitor *monitor); - void setMonitor(Monitor *monitor); - -Q_SIGNALS: - void requestSetRotate(Monitor *monitor, const int rotate); - -private: - void initRotate(); - -private: - QHBoxLayout *m_contentLayout; - QLabel *m_rotateLabel; - QComboBox *m_rotateCombox; - - DisplayModel *m_model; - Monitor *m_monitor; -}; -} - -#endif // ROTATEWIDGET_H diff --git a/dcc-old/src/plugin-display/window/scalingwidget.cpp b/dcc-old/src/plugin-display/window/scalingwidget.cpp deleted file mode 100644 index 53dfeaa3bb..0000000000 --- a/dcc-old/src/plugin-display/window/scalingwidget.cpp +++ /dev/null @@ -1,144 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later - -#include "scalingwidget.h" - -#include "operation/displaymodel.h" -#include "operation/monitor.h" - -#include - -const float MinScreenWidth = 1024.0f; -const float MinScreenHeight = 768.0f; - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE - -ScalingWidget::ScalingWidget(QWidget *parent) - : QWidget(parent) - , m_centralLayout(new QVBoxLayout(this)) - , m_tipWidget(new QWidget(this)) - , m_tipLabel(new DTipLabel(tr("The monitor only supports 100% display scaling"), this)) - , m_slider(new TitledSliderItem(QString(), this)) -{ - // 初始化列表无法进行静态翻译 - m_title = new TitleLabel(tr("Display Scaling"), this); - m_title->setText(tr("Display Scaling")); - - m_tipWidget->setAccessibleName("ScalingWidget_tipWidget"); - m_centralLayout->setMargin(0); - m_centralLayout->setSpacing(8); - m_centralLayout->addWidget(m_title); - - m_tipLabel->setForegroundRole(DPalette::TextTips); - m_tipLabel->setAlignment(Qt::AlignTop | Qt::AlignLeft); - QVBoxLayout *tipLayout = new QVBoxLayout(m_tipWidget); - tipLayout->setContentsMargins(10, 0, 0, 0); - tipLayout->addWidget(m_tipLabel); - m_tipWidget->setLayout(tipLayout); - m_centralLayout->addWidget(m_tipWidget); - - m_slider->addBackground(); - m_centralLayout->addWidget(m_slider); - setLayout(m_centralLayout); -} - -ScalingWidget::~ScalingWidget() { } - -void ScalingWidget::setModel(DisplayModel *model) -{ - m_displayModel = model; - - addSlider(); -} - -void ScalingWidget::addSlider() -{ - if (m_displayModel->monitorList().size() == 0) - return; - - onResolutionChanged(); - DCCSlider *slider = m_slider->slider(); - connect(slider, &DCCSlider::valueChanged, this, [=](const int value) { - if (value > 0 && value <= m_scaleList.size() - && m_displayModel->uiScale() != m_scaleList[value - 1].toFloat()) { - m_slider->setValueLiteral(QString("%1").arg(m_scaleList[value - 1].toFloat())); - Q_EMIT requestUiScaleChange(m_scaleList[value - 1].toFloat()); - } - }); - connect(m_displayModel, &DisplayModel::uiScaleChanged, this, [=](const double scale) { - slider->blockSignals(true); - qDebug() << "monitor scaleChanged ,scale :" << convertToSlider(scale); - slider->setValue(convertToSlider(scale)); - slider->blockSignals(false); - }); - - for (auto moni : m_displayModel->monitorList()) { - connect(moni, &Monitor::currentModeChanged, this, &ScalingWidget::onResolutionChanged); - connect(moni, &Monitor::enableChanged, this, &ScalingWidget::onResolutionChanged); - } -} - -void ScalingWidget::onResolutionChanged() -{ - QStringList fscaleList = { "1.0", "1.25", "1.5", "1.75", "2.0", "2.25", "2.5", "2.75", "3.0" }; - for (auto moni : m_displayModel->monitorList()) { - if (!moni->enable()) { - continue; - } - auto tmode = moni->currentMode(); - // 后端传入currentMode值可能为0 - if (tmode.width() == 0 || tmode.height() == 0) { - fscaleList.clear(); - break; - } - auto ts = getScaleList(tmode); - fscaleList = ts.size() < fscaleList.size() ? ts : fscaleList; - } - - // 如果仅一个缩放值可用 - if (fscaleList.size() <= 1) { - fscaleList.clear(); - fscaleList.append(QStringList() << "1.0" - << "1.0"); - m_tipWidget->setVisible(true); - } else { - m_tipWidget->setVisible(false); - } - - m_scaleList = fscaleList; - m_slider->setAnnotations(m_scaleList); - DCCSlider *slider = m_slider->slider(); - slider->blockSignals(true); - slider->setRange(1, m_scaleList.size()); - slider->setPageStep(1); - slider->setValue( - convertToSlider(m_displayModel->uiScale() > 1.0 ? m_displayModel->uiScale() : 1.0)); - slider->update(); - slider->blockSignals(false); -}; - -QStringList ScalingWidget::getScaleList(const Resolution &r) -{ - const QStringList tvstring = { - "1.0", "1.25", "1.5", "1.75", "2.0", "2.25", "2.5", "2.75", "3.0" - }; - QStringList fscaleList; - auto maxWScale = r.width() / MinScreenWidth; - auto maxHScale = r.height() / MinScreenHeight; - auto maxScale = maxWScale < maxHScale ? maxWScale : maxHScale; - maxScale = maxScale < 3.0f ? maxScale : 3.0f; - for (int idx = 0; idx * 0.25f + 1.0f <= maxScale; ++idx) { - fscaleList << tvstring[idx]; - } - - return fscaleList; -} - -int ScalingWidget::convertToSlider(const double value) -{ - // remove base scale (100), then convert to 1-based value - // with a stepping of 25 - return int(round(double(value * 100 - 100) / 25)) + 1; -} diff --git a/dcc-old/src/plugin-display/window/scalingwidget.h b/dcc-old/src/plugin-display/window/scalingwidget.h deleted file mode 100644 index d41dce9825..0000000000 --- a/dcc-old/src/plugin-display/window/scalingwidget.h +++ /dev/null @@ -1,61 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef SCALINGWIDGET_H -#define SCALINGWIDGET_H - -#include "interface/namespace.h" -#include "widgets/dccslider.h" -#include "widgets/switchwidget.h" -#include "widgets/titledslideritem.h" -#include "widgets/titlelabel.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -QT_END_NAMESPACE - -class Resolution; - -namespace DCC_NAMESPACE { - -class Monitor; -class DisplayModel; - -class ScalingWidget : public QWidget -{ - Q_OBJECT - -public: - explicit ScalingWidget(QWidget *parent = nullptr); - ~ScalingWidget(); - -public: - void setModel(DisplayModel *model); - -Q_SIGNALS: - void requestUiScaleChange(const double scale); - -private Q_SLOTS: - void onResolutionChanged(); - -private: - void addSlider(); - QStringList getScaleList(const Resolution &r); - int convertToSlider(const double value); - -private: - DisplayModel *m_displayModel; - QVBoxLayout *m_centralLayout; - TitleLabel *m_title; - QWidget *m_tipWidget; - DTK_WIDGET_NAMESPACE::DTipLabel *m_tipLabel; - TitledSliderItem *m_slider; - QStringList m_scaleList; -}; -} - -#endif // SCALINGWIDGET_H diff --git a/dcc-old/src/plugin-display/window/secondaryscreendialog.cpp b/dcc-old/src/plugin-display/window/secondaryscreendialog.cpp deleted file mode 100644 index 2c1202e0c1..0000000000 --- a/dcc-old/src/plugin-display/window/secondaryscreendialog.cpp +++ /dev/null @@ -1,275 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "secondaryscreendialog.h" -#include "widgets/dccslider.h" -#include "widgets/titlelabel.h" -#include "widgets/titledslideritem.h" -#include "resolutionwidget.h" -#include "refreshratewidget.h" -#include "rotatewidget.h" -#include "monitorcontrolwidget.h" -#include "operation/displaymodel.h" - -#include -#include - -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -const int ComboxWidth = 200; -const int PercentageNum = 100; -const double BrightnessMaxScale = 100.0; -const double DoubleZero = 0.01; //后端传入的doube指为浮点型,有效位数为2位小数,存在精度丢失 - -SecondaryScreenDialog::SecondaryScreenDialog(QWidget *parent) - : DAbstractDialog(parent) - , m_contentLayout(new QVBoxLayout(this)) - , m_monitorControlWidget(new MonitorControlWidget(180, this)) - , m_resolutionWidget(new ResolutionWidget(ComboxWidth, this)) - , m_refreshRateWidget(new RefreshRateWidget(ComboxWidth, this)) - , m_rotateWidget(new RotateWidget(ComboxWidth, this)) - , m_model(nullptr) - , m_monitor(nullptr) -{ - setFixedWidth(410); - setMinimumHeight(480); - - //WAYLAND下需要CoverWindow属性才能保证激活父窗口时,此窗口置顶的效果,而x11下则不需要 - if (!qgetenv("WAYLAND_DISPLAY").isEmpty()) { - setWindowFlags(Qt::CoverWindow); - } - - setWindowState((this->windowState() & ~Qt::WindowMinimized)); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - - m_monitorControlWidget->setAccessibleName("monitorControlWidget"); - - m_contentLayout->setSpacing(10); - m_contentLayout->setContentsMargins(35, 20, 35, 40); - m_contentLayout->addWidget(m_monitorControlWidget); - m_contentLayout->addSpacing(10); - m_contentLayout->addWidget(m_resolutionWidget); - m_contentLayout->addWidget(m_refreshRateWidget); - m_contentLayout->addWidget(m_rotateWidget); - m_contentLayout->addStretch(); - - setLayout(m_contentLayout); -} - -SecondaryScreenDialog::~SecondaryScreenDialog() -{ -} - -void SecondaryScreenDialog::OnRequestResizeDesktopVisibleChanged(bool visible) -{ - if (visible) - setMinimumHeight(m_model->brightnessEnable() ? 610+48 : 480+48); - else - setMinimumHeight(m_model->brightnessEnable() ? 610 : 480); -} - -void SecondaryScreenDialog::setModel(DisplayModel *model, Monitor *monitor) -{ - m_model = model; - m_monitor = monitor; - - // 缩放大于1时,adjustSize()后对话框高度错误,设置最小高度 - setMinimumHeight(m_model->brightnessEnable() ? 610 : 480); - m_monitorControlWidget->setScreensMerged(m_model->displayMode()); - m_monitorControlWidget->setModel(m_model, m_monitor); - m_resolutionWidget->setModel(m_model, m_monitor); - m_refreshRateWidget->setModel(m_model, m_monitor); - m_rotateWidget->setModel(m_model, m_monitor); - - connect(m_monitorControlWidget, &MonitorControlWidget::requestRecognize, this, &SecondaryScreenDialog::requestRecognize); - connect(m_monitorControlWidget, &MonitorControlWidget::requestGatherWindows, this, &SecondaryScreenDialog::requestGatherWindows); - connect(this, &SecondaryScreenDialog::requestGatherEnabled, m_monitorControlWidget, &MonitorControlWidget::onGatherEnabled); - connect(m_resolutionWidget, &ResolutionWidget::requestSetResolution, this, &SecondaryScreenDialog::requestSetResolution); - connect(m_resolutionWidget, &ResolutionWidget::requestSetFillMode, this, &SecondaryScreenDialog::requestSetFillMode); - connect(m_resolutionWidget, &ResolutionWidget::requestCurrFillModeChanged, this, &SecondaryScreenDialog::requestCurrFillModeChanged); - connect(m_resolutionWidget, &ResolutionWidget::requestResizeDesktopVisibleChanged, this, &SecondaryScreenDialog::OnRequestResizeDesktopVisibleChanged); - connect(m_refreshRateWidget, &RefreshRateWidget::requestSetResolution, this, &SecondaryScreenDialog::requestSetResolution); - connect(m_rotateWidget, &RotateWidget::requestSetRotate, this, &SecondaryScreenDialog::requestSetRotate); - - auto tfunc = [this](const double tb) { - int tmini = int(m_model->minimumBrightnessScale() * BrightnessMaxScale); - int tnum = int(tb * BrightnessMaxScale); - tnum = tnum > tmini ? tnum : tmini; - return QString::number(int(tnum)) + "%"; - }; - - if (m_monitor->canBrightness()) { - TitleLabel *headTitle = new TitleLabel(tr("Brightness"), this); //亮度 - DFontSizeManager::instance()->bind(headTitle, DFontSizeManager::T7, QFont::Normal); - - //单独显示每个亮度调节名 - TitledSliderItem *slideritem = new TitledSliderItem(m_monitor->name(), this); - slideritem->addBackground(); - DCCSlider *slider = slideritem->slider(); - int maxBacklight = static_cast(m_model->maxBacklightBrightness()); - if (maxBacklight == 0) { - int miniScale = int(m_model->minimumBrightnessScale() * BrightnessMaxScale); - double brightness = m_monitor->brightness(); - slideritem->setValueLiteral(tfunc(brightness)); - slider->setRange(miniScale, int(BrightnessMaxScale)); - slider->setType(DCCSlider::Vernier); - slider->setTickPosition(QSlider::TicksBelow); - slider->setLeftIcon(DIconTheme::findQIcon("dcc_brightnesslow")); - slider->setRightIcon(DIconTheme::findQIcon("dcc_brightnesshigh")); - slider->setIconSize(QSize(24, 24)); - slider->setTickInterval(int((BrightnessMaxScale - miniScale) / 5.0)); - slider->setValue(int(brightness * BrightnessMaxScale)); - slider->setPageStep(1); - - auto onValueChanged = [=](int pos) { - Q_EMIT requestSetMonitorBrightness(m_monitor, pos / BrightnessMaxScale); - Q_EMIT requestAmbientLightAdjustBrightness(false); - }; - - connect(slider, &DCCSlider::valueChanged, this, onValueChanged); - connect(slider, &DCCSlider::sliderMoved, this, onValueChanged); - - connect(m_monitor, &Monitor::brightnessChanged, this, [=](const double rb) { - slider->blockSignals(true); - if ((rb - m_model->minimumBrightnessScale()) < 0.00001) { - slideritem->setValueLiteral(QString("%1%").arg(int(m_model->minimumBrightnessScale() * BrightnessMaxScale))); - slider->setValue(int(m_model->minimumBrightnessScale() * BrightnessMaxScale)); - } else { - slideritem->setValueLiteral(QString("%1%").arg(int(rb * BrightnessMaxScale))); - slider->setValue(int(rb * BrightnessMaxScale)); - } - slider->blockSignals(false); - }); - - connect(m_model, &DisplayModel::minimumBrightnessScaleChanged, - this, [=](const double ms) { - double rb = m_monitor->brightness(); - int tmini = int(ms * PercentageNum); - slider->setMinimum(tmini); - slider->setTickInterval(int((BrightnessMaxScale - tmini) / 5.0)); - - slider->blockSignals(true); - slideritem->setValueLiteral(tfunc(rb)); - slider->setValue(int(rb * BrightnessMaxScale)); - slider->blockSignals(false); - }); - } else { - int m_miniScales = int(m_model->minimumBrightnessScale() * maxBacklight); - if (m_miniScales == 0) { - m_miniScales = 1; - } - double brightness = m_monitor->brightness(); - slider->setRange(m_miniScales, maxBacklight); - slider->setType(DCCSlider::Vernier); - slider->setTickPosition(QSlider::TicksBelow); - slider->setLeftIcon(DIconTheme::findQIcon("dcc_brightnesslow")); - slider->setRightIcon(DIconTheme::findQIcon("dcc_brightnesshigh")); - slider->setIconSize(QSize(24, 24)); - slider->setTickInterval(1); - slider->setValue(int((brightness + DoubleZero) * maxBacklight)); - slider->setPageStep(1); - QStringList speedList; - int j = m_miniScales; - for (; j <= maxBacklight; j++) { - speedList << ""; - } - slideritem->setAnnotations(speedList); - - auto onValueChanged = [=](int pos) { - Q_EMIT requestSetMonitorBrightness(m_monitor, pos / double(maxBacklight)); - Q_EMIT requestAmbientLightAdjustBrightness(false); - }; - - connect(slider, &DCCSlider::valueChanged, this, onValueChanged); - connect(slider, &DCCSlider::sliderMoved, this, onValueChanged); - - connect(m_monitor, &Monitor::brightnessChanged, this, [=](const double rb) { - slider->blockSignals(true); - if ((rb - m_model->minimumBrightnessScale()) < 0.00001) { - slider->setValue(int((m_model->minimumBrightnessScale() + DoubleZero) * maxBacklight)); - } else { - slider->setValue(int((rb + DoubleZero) * maxBacklight)); - } - slider->blockSignals(false); - }); - - connect(m_model, &DisplayModel::minimumBrightnessScaleChanged, - this, [=](const double ms) { - double rb = m_monitor->brightness(); - int tmini = int(ms * PercentageNum); - slider->setMinimum(tmini); - slider->setTickInterval(int((BrightnessMaxScale - tmini) / 5.0)); - - slider->blockSignals(true); - slideritem->setValueLiteral(tfunc(rb)); - slider->setValue(int((rb + DoubleZero) * BrightnessMaxScale)); - slider->blockSignals(false); - }); - } - QWidget *brightnessWidget = new QWidget(this); - brightnessWidget->setAccessibleName("SecondaryScreenDialog_brightnessWidget"); - QVBoxLayout *brightnessLayout = new QVBoxLayout(brightnessWidget); - brightnessLayout->setContentsMargins(0, 10, 0, 0); - brightnessLayout->addWidget(headTitle); - brightnessLayout->setSpacing(10); - brightnessLayout->addWidget(slideritem); - brightnessWidget->setLayout(brightnessLayout); - m_contentLayout->insertWidget(1, brightnessWidget); - brightnessWidget->setVisible(m_model->brightnessEnable()); - connect(m_model, &DisplayModel::brightnessEnableChanged, this, [this, brightnessWidget](const bool enable) { - brightnessWidget->setVisible(enable); - resetDialog(); - }); - } -} - -void SecondaryScreenDialog::resetDialog() -{ - adjustSize(); - - auto rt = rect(); - if (rt.width() > m_monitor->w()) - rt.setWidth(m_monitor->w()); - - if (rt.height() > m_monitor->h()) - rt.setHeight(m_monitor->h()); - - QScreen *screen = m_monitor->getQScreen(); - if(!screen) - return; - - setGeometry(QRect(screen->geometry().topLeft(),rt.size())); - move(QPoint(screen->geometry().left() + (screen->geometry().width() - rt.width()) / 2, - screen->geometry().top() + (screen->geometry().height() - rt.height()) / 2)); - - for (auto screen : QGuiApplication::screens()) { - screen->disconnect(this); - } - - connect(screen, &QScreen::geometryChanged, this, [=](const QRect &geometry) { - move(QPoint(geometry.left() + (geometry.width() - rt.width()) / 2, - geometry.top() + (geometry.height() - rt.height()) / 2)); - }); - show(); -} - -void SecondaryScreenDialog::keyPressEvent(QKeyEvent *event) -{ - switch (event->key()) { - case Qt::Key_Escape: - Q_EMIT requestCloseRecognize(); - break; - default: - QDialog::keyPressEvent(event); - break; - } -} diff --git a/dcc-old/src/plugin-display/window/secondaryscreendialog.h b/dcc-old/src/plugin-display/window/secondaryscreendialog.h deleted file mode 100644 index 1bda7eb474..0000000000 --- a/dcc-old/src/plugin-display/window/secondaryscreendialog.h +++ /dev/null @@ -1,68 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef SECONDARYSCREENDIALOG_H -#define SECONDARYSCREENDIALOG_H - -#include "interface/namespace.h" - -#include - -QT_BEGIN_NAMESPACE -class QVBoxLayout; -class QKeyEvent; -QT_END_NAMESPACE - -namespace DCC_NAMESPACE { - -class ResolutionWidget; -class RefreshRateWidget; -class RotateWidget; -class DisplayModel; -class Monitor; -class MonitorControlWidget; - -class SecondaryScreenDialog : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit SecondaryScreenDialog(QWidget *parent = nullptr); - ~SecondaryScreenDialog(); - -public: - void setModel(DisplayModel *model, Monitor *monitor); - void resetDialog(); - -protected: - void keyPressEvent(QKeyEvent *event) override; - -Q_SIGNALS: - void requestRecognize(); - void requestSetMonitorBrightness(Monitor *monitor, const double brightness); - void requestAmbientLightAdjustBrightness(const bool able); - void requestSetResolution(Monitor *monitor, const int mode); - void requestSetFillMode(Monitor *monitor, const QString fillMode); - void requestSetRotate(Monitor *monitor, const int rotate); - void requestGatherWindows(const QPoint cursor); - void requestGatherEnabled(const bool enable); - void requestCloseRecognize(); - void requestCurrFillModeChanged(Monitor *monitor, const QString fillMode); - -public Q_SLOTS: - void OnRequestResizeDesktopVisibleChanged(bool visible); - -private: - QVBoxLayout *m_contentLayout; - MonitorControlWidget *m_monitorControlWidget; - ResolutionWidget *m_resolutionWidget; - RefreshRateWidget *m_refreshRateWidget; - RotateWidget *m_rotateWidget; - - DisplayModel *m_model; - Monitor *m_monitor; -}; -} - -#endif // SECONDARYSCREENDIALOG_H diff --git a/dcc-old/src/plugin-display/window/timeoutdialog.cpp b/dcc-old/src/plugin-display/window/timeoutdialog.cpp deleted file mode 100644 index 65a22f312f..0000000000 --- a/dcc-old/src/plugin-display/window/timeoutdialog.cpp +++ /dev/null @@ -1,75 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "timeoutdialog.h" -#include -DGUI_USE_NAMESPACE - -TimeoutDialog::TimeoutDialog(const int timeout, QString messageModel, QWidget *parent) - : DDialog(parent) - , m_timeoutRefreshTimer(new QTimer(this)) - , m_timeout(timeout) - , m_messageModel(messageModel) -{ - setWindowFlags(Qt::WindowStaysOnTopHint | (windowFlags()&~Qt::WindowMinMaxButtonsHint)); - // set default title, message icon - setTitle(tr("Save the display settings?")); - if (messageModel.isEmpty()) { - m_messageModel = tr("Settings will be reverted in %1s."); - } - setMessage(m_messageModel.arg(m_timeout)); - setIcon(DIconTheme::findQIcon("preferences-system")); - - addButton(tr("Revert"), true, DDialog::ButtonRecommend); - addButton(tr("Save")); - - m_timeoutRefreshTimer->setInterval(1000); - - connect(m_timeoutRefreshTimer, &QTimer::timeout, this, &TimeoutDialog::onRefreshTimeout); - setAttribute(Qt::WA_DeleteOnClose); -} - -int TimeoutDialog::exec() -{ - m_timeoutRefreshTimer->start(); - - return DDialog::exec(); -} - -void TimeoutDialog::open() -{ - if (!isVisible()) { - m_timeoutRefreshTimer->start(); - } - - DDialog::open(); -} - -void TimeoutDialog::onRefreshTimeout() -{ - m_timeout--; - setMessage(m_messageModel.arg(m_timeout)); - - if (m_timeout < 1) { - reject(); - } -} - -QString TimeoutDialog::messageModel() const -{ - return m_messageModel; -} - -void TimeoutDialog::setMessageModel(const QString &messageModel) -{ - m_messageModel = messageModel; - setMessage(m_messageModel.arg(m_timeout)); -} - -void TimeoutDialog::mouseMoveEvent(QMouseEvent *event) -{ - Q_UNUSED(event) - return; -} diff --git a/dcc-old/src/plugin-display/window/timeoutdialog.h b/dcc-old/src/plugin-display/window/timeoutdialog.h deleted file mode 100644 index fa5b12dab8..0000000000 --- a/dcc-old/src/plugin-display/window/timeoutdialog.h +++ /dev/null @@ -1,39 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef TIMEOUTDIALOG_H -#define TIMEOUTDIALOG_H - -#include -#include - -DWIDGET_USE_NAMESPACE - -class TimeoutDialog : public DDialog -{ - Q_OBJECT -public: - explicit TimeoutDialog(const int timeout, QString messageModel = QString(), QWidget *parent = 0); - - QString messageModel() const; - void setMessageModel(const QString &messageModel); - -public Q_SLOTS: - int exec() override; - void open() override; - -private Q_SLOTS: - void onRefreshTimeout(); - -protected: - void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; - -private: - QTimer *m_timeoutRefreshTimer; - - int m_timeout; - QString m_messageModel; -}; - -#endif // TIMEOUTDIALOG_H diff --git a/dcc-old/src/plugin-display/window/treecombox.cpp b/dcc-old/src/plugin-display/window/treecombox.cpp deleted file mode 100644 index f0fe571433..0000000000 --- a/dcc-old/src/plugin-display/window/treecombox.cpp +++ /dev/null @@ -1,130 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "cooperationsettingsdialog.h" -#include "treecombox.h" - -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -TreeCombox::TreeCombox(QStandardItemModel *model, QWidget *parent) - : DComboBox(parent) - , m_deviceItemsListView(new DListView(this)) - , m_itemsmodel(model) -{ - initUI(); - initConnect(); -} - -TreeCombox::~TreeCombox() -{ - -} - -void TreeCombox::initUI() -{ - this->setMaxVisibleItems(16); - TreeComboxDelegate *delegate = new TreeComboxDelegate(m_deviceItemsListView); - delegate->setMargins(QMargins(0, 0, 0, 0)); - m_deviceItemsListView->setItemDelegate(delegate); - - m_deviceItemsListView->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_deviceItemsListView->setFrameShape(QFrame::WinPanel); - m_deviceItemsListView->setViewportMargins(10, 0, 10, 0); - m_deviceItemsListView->setItemSpacing(0); - m_deviceItemsListView->setMouseTracking(true); - m_deviceItemsListView->setItemMargins(QMargins(10, 0, 10, 0)); - m_deviceItemsListView->setItemRadius(30); - m_deviceItemsListView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel); - m_deviceItemsListView->setItemRadius(0); - m_deviceItemsListView->setBackgroundType(DStyledItemDelegate::BackgroundType::NoBackground); - - this->setModel(m_itemsmodel); - this->setView(m_deviceItemsListView); -} - -void TreeCombox::initConnect() -{ - connect(m_deviceItemsListView, &DListView::pressed, this, &TreeCombox::viewItemPressed); -} - -void TreeCombox::addDivicesTitel(const QString &devTitel) -{ - QLabel *devLabel = new QLabel(devTitel, m_deviceItemsListView->viewport()); - DStandardItem *item = new DStandardItem; - DViewItemAction *action = new DViewItemAction; - action->setWidget(devLabel); - - item->setActionList(Qt::Edge::LeftEdge,{action}); - item->setFontSize(DFontSizeManager::SizeType::T6); - item->setFlags(Qt::ItemIsUserCheckable); - m_itemsmodel->appendRow(item); -} - -void TreeCombox::addDevicesSettingsItem() -{ - DStandardItem *pi = new DStandardItem; - pi->setText(tr("Collaboration Settings")); - pi->setTextColorRole(DPalette::ColorType::TextTitle); - pi->setFontSize(DFontSizeManager::SizeType::T5); - - QSize size(14, 14); - auto rightAction = new DViewItemAction(Qt::AlignVCenter, size, size, true); - pi->setActionList(Qt::Edge::LeftEdge, {rightAction}); - m_itemsmodel->appendRow(pi); -} - -void TreeCombox::addDeviceCheckedIcon(Dtk::Widget::DStandardItem *pi, bool initChecked) -{ - QSize size(14, 14); - auto rightAction = new DViewItemAction(Qt::AlignVCenter, size, size, true); - auto checkoutState = initChecked ? DStyle::SP_MarkElement : DStyle::SP_CustomBase; - auto checkIcon = qobject_cast(style())->standardIcon(checkoutState); - rightAction->setIcon(checkIcon); - pi->setActionList(Qt::Edge::LeftEdge, {rightAction}); -} - -void TreeCombox::updateItemCheckStatus(const QString &name, bool visible) -{ - for (int i = 0; i < m_itemsmodel->rowCount(); ++i) { - auto item = static_cast(m_itemsmodel->item(i)); - if (item->text() != name) - continue; - - auto action = item->actionList(Qt::Edge::LeftEdge).first(); - qDebug() << "updateItemCheckStatus : " << name << visible; - auto checkstatus = visible ? DStyle::SP_MarkElement : DStyle::SP_CustomBase; - auto icon = qobject_cast(style())->standardIcon(checkstatus); - action->setIcon(icon); - m_deviceItemsListView->update(item->index()); - break; - } -} - -TreeComboxDelegate::TreeComboxDelegate(QAbstractItemView *parent) - : Dtk::Widget::DStyledItemDelegate(parent) - , m_parentWidget(parent) -{ - m_parentWidget->update(); -} - -TreeComboxDelegate::~TreeComboxDelegate() -{ - -} - -void TreeComboxDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const -{ - if (index.row() == m_parentWidget->model()->rowCount() - 2) { - // 绘制间隔线 - QRect rct = option.rect; - rct.setY(rct.top() + rct.height() - 1); - rct.setHeight(2); - painter->fillRect(rct, QColor(0, 0, 0, static_cast(0.1 * 255))); - } - DStyledItemDelegate::paint(painter, option, index); -} diff --git a/dcc-old/src/plugin-display/window/treecombox.h b/dcc-old/src/plugin-display/window/treecombox.h deleted file mode 100644 index 9a45d78ffe..0000000000 --- a/dcc-old/src/plugin-display/window/treecombox.h +++ /dev/null @@ -1,63 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include -#include -#include - -QT_BEGIN_NAMESPACE -class QStandardItem; -class QComboBox; -class QPushButton; -QT_END_NAMESPACE - -enum DevViewItemType { - DeviceViewItem = 0, - MoreSettingsItem -}; - -Q_DECLARE_METATYPE(DevViewItemType) - -class TreeComboxDelegate : public DTK_WIDGET_NAMESPACE::DStyledItemDelegate -{ -public: - explicit TreeComboxDelegate(QAbstractItemView *parent = Q_NULLPTR); - ~TreeComboxDelegate() ; -protected: - void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const Q_DECL_OVERRIDE; - -private: - QAbstractItemView *m_parentWidget; -}; - -class Machine; -class DisplayModel; -class TreeCombox : public DTK_WIDGET_NAMESPACE::DComboBox -{ - Q_OBJECT -public: - explicit TreeCombox(QStandardItemModel *model, QWidget *parent = nullptr); - ~TreeCombox(); - void addDivicesTitel(const QString& devTitel); - void addDevicesSettingsItem(); - - void addDeviceCheckedIcon(DTK_WIDGET_NAMESPACE::DStandardItem *pi, bool initChecked); - void updateItemCheckStatus(const QString &name, bool visible); - -private: - void initUI(); - void initConnect(); - -signals: - void viewItemPressed(const QModelIndex &index); - -private: - DTK_WIDGET_NAMESPACE::DListView *m_deviceItemsListView; - QStandardItemModel *m_itemsmodel; - - QList m_historyDeviceItems; - QList m_MoreDeviceItems; -}; - diff --git a/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.cpp b/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.cpp deleted file mode 100644 index 02416993e9..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.cpp +++ /dev/null @@ -1,349 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "keyboarddbusproxy.h" -#include "widgets/dccdbusinterface.h" - -#include -#include -#include -#include -#include -#include - -const static QString LangSelectorService = "org.deepin.dde.LangSelector1"; -const static QString LangSelectorPath = "/org/deepin/dde/LangSelector1"; -const static QString LangSelectorInterface = "org.deepin.dde.LangSelector1"; - -const static QString KeyboardService = "org.deepin.dde.InputDevices1"; -const static QString KeyboardPath = "/org/deepin/dde/InputDevice1/Keyboard"; -const static QString KeyboardInterface = "org.deepin.dde.InputDevice1.Keyboard"; - -const static QString KeybingdingService = "org.deepin.dde.Keybinding1"; -const static QString KeybingdingPath = "/org/deepin/dde/Keybinding1"; -const static QString KeybingdingInterface = "org.deepin.dde.Keybinding1"; - -const static QString WMService = "com.deepin.wm"; -const static QString WMPath = "/com/deepin/wm"; -const static QString WMInterface = "com.deepin.wm"; - -KeyboardDBusProxy::KeyboardDBusProxy(QObject *parent) - : QObject(parent) -{ - qRegisterMetaType("KeyboardLayoutList"); - qDBusRegisterMetaType(); - - qRegisterMetaType("LocaleInfo"); - qDBusRegisterMetaType(); - - qRegisterMetaType("LocaleList"); - qDBusRegisterMetaType(); - - init(); -} - -void KeyboardDBusProxy::init() -{ - m_dBusLangSelectorInter = new DDBusInterface(LangSelectorService, LangSelectorPath, LangSelectorInterface, QDBusConnection::sessionBus(), this); - m_dBusKeyboardInter = new DDBusInterface(KeyboardService, KeyboardPath, KeyboardInterface, QDBusConnection::sessionBus(), this); - m_dBusKeybingdingInter = new DDBusInterface(KeybingdingService, KeybingdingPath, KeybingdingInterface, QDBusConnection::sessionBus(), this); - m_dBusWMInter = new DDBusInterface(WMService, WMPath, WMInterface, QDBusConnection::sessionBus(), this); -} - -void KeyboardDBusProxy::langSelectorStartServiceProcess() -{ - if (m_dBusLangSelectorInter->isValid()) - { - qWarning() << "Service" << LangSelectorService << "is already started."; - return; - } - - QDBusInterface freedesktopInter = QDBusInterface("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QDBusConnection::systemBus(), this); - QDBusMessage msg = QDBusMessage::createMethodCall("org.freedesktop.DBus", "/", "org.freedesktop.DBus", QStringLiteral("StartServiceByName")); - msg << LangSelectorService << quint32(0); - QDBusPendingReply async = freedesktopInter.connection().asyncCall(msg); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(async, this); - - connect(watcher, &QDBusPendingCallWatcher::finished, this, &KeyboardDBusProxy::onLangSelectorStartServiceProcessFinished); -} - -void KeyboardDBusProxy::onLangSelectorStartServiceProcessFinished(QDBusPendingCallWatcher *w) -{ - - QDBusPendingReply reply = *w; - Q_EMIT langSelectorServiceStartFinished(reply.value()); - w->deleteLater(); -} - -//Keyboard -bool KeyboardDBusProxy::capslockToggle() -{ - return qvariant_cast(m_dBusKeyboardInter->property("CapslockToggle")); -} - -void KeyboardDBusProxy::setCapslockToggle(bool value) -{ - m_dBusKeyboardInter->setProperty("CapslockToggle", QVariant::fromValue(value)); -} - -QString KeyboardDBusProxy::currentLayout() -{ - return qvariant_cast(m_dBusKeyboardInter->property("CurrentLayout")); -} - -void KeyboardDBusProxy::setCurrentLayout(const QString &value) -{ - m_dBusKeyboardInter->setProperty("CurrentLayout", QVariant::fromValue(value)); -} - -int KeyboardDBusProxy::cursorBlink() -{ - return qvariant_cast(m_dBusKeyboardInter->property("CursorBlink")); -} - -void KeyboardDBusProxy::setCursorBlink(int value) -{ - m_dBusKeyboardInter->setProperty("CursorBlink", QVariant::fromValue(value)); -} - -int KeyboardDBusProxy::layoutScope() -{ - return qvariant_cast(m_dBusKeyboardInter->property("LayoutScope")); -} - -void KeyboardDBusProxy::setLayoutScope(int value) -{ - m_dBusKeyboardInter->setProperty("LayoutScope", QVariant::fromValue(value)); -} - - -uint KeyboardDBusProxy::repeatDelay() -{ - return qvariant_cast(m_dBusKeyboardInter->property("RepeatDelay")); -} - -void KeyboardDBusProxy::setRepeatDelay(uint value) -{ - m_dBusKeyboardInter->setProperty("RepeatDelay", QVariant::fromValue(value)); -} - - -bool KeyboardDBusProxy::repeatEnabled() -{ - return qvariant_cast(m_dBusKeyboardInter->property("RepeatEnabled")); -} - -void KeyboardDBusProxy::setRepeatEnabled(bool value) -{ - m_dBusKeyboardInter->setProperty("RepeatEnabled", QVariant::fromValue(value)); -} - - -uint KeyboardDBusProxy::repeatInterval() -{ - return qvariant_cast(m_dBusKeyboardInter->property("RepeatInterval")); -} - -void KeyboardDBusProxy::setRepeatInterval(uint value) -{ - m_dBusKeyboardInter->setProperty("RepeatInterval", QVariant::fromValue(value)); -} - - -QStringList KeyboardDBusProxy::userLayoutList() -{ - return qvariant_cast(m_dBusKeyboardInter->property("UserLayoutList")); -} - - -QStringList KeyboardDBusProxy::userOptionList() -{ - return qvariant_cast(m_dBusKeyboardInter->property("UserOptionList")); -} - -//LangSelector -QString KeyboardDBusProxy::currentLocale() -{ - return qvariant_cast(m_dBusLangSelectorInter->property("CurrentLocale")); -} - -int KeyboardDBusProxy::localeState() -{ - return qvariant_cast(m_dBusLangSelectorInter->property("LocaleState")); -} - -QStringList KeyboardDBusProxy::locales() -{ - return qvariant_cast(m_dBusLangSelectorInter->property("Locales")); -} - -//Keybinding -int KeyboardDBusProxy::numLockState() -{ - return qvariant_cast(m_dBusKeybingdingInter->property("NumLockState")); -} - -uint KeyboardDBusProxy::shortcutSwitchLayout() -{ - return qvariant_cast(m_dBusKeybingdingInter->property("ShortcutSwitchLayout")); -} - -void KeyboardDBusProxy::setShortcutSwitchLayout(uint value) -{ - m_dBusKeybingdingInter->setProperty("ShortcutSwitchLayout", QVariant::fromValue(value)); -} - -bool KeyboardDBusProxy::langSelectorIsValid() -{ - return m_dBusLangSelectorInter->isValid(); -} - -QDBusPendingReply<> KeyboardDBusProxy::KeybindingReset() -{ - QList argumentList; - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("Reset"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::ListAllShortcuts() -{ - QList argumentList; - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("ListAllShortcuts"), argumentList); -} - -QString KeyboardDBusProxy::LookupConflictingShortcut(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return QDBusPendingReply(m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("LookupConflictingShortcut"), argumentList)); -} - -QDBusPendingReply<> KeyboardDBusProxy::ClearShortcutKeystrokes(const QString &in0, int in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("ClearShortcutKeystrokes"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::AddShortcutKeystroke(const QString &in0, int in1, const QString &in2) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("AddShortcutKeystroke"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::AddCustomShortcut(const QString &in0, const QString &in1, const QString &in2) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("AddCustomShortcut"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::ModifyCustomShortcut(const QString &in0, const QString &in1, const QString &in2, const QString &in3) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1) << QVariant::fromValue(in2) << QVariant::fromValue(in3); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("ModifyCustomShortcut"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::DeleteCustomShortcut(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("DeleteCustomShortcut"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::GrabScreen() -{ - QList argumentList; - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("GrabScreen"), argumentList); -} - -void KeyboardDBusProxy::SetNumLockState(int in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("SetNumLockState"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::GetShortcut(const QString &in0, int in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("GetShortcut"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::SearchShortcuts(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("SearchShortcuts"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::Query(const QString &in0, int in1) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0) << QVariant::fromValue(in1); - return m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("Query"), argumentList); -} - -void KeyboardDBusProxy::SelectKeystroke() -{ - QList argumentList; - m_dBusKeybingdingInter->asyncCallWithArgumentList(QStringLiteral("SelectKeystroke"), argumentList); -} - -//keyBoard -QDBusPendingReply KeyboardDBusProxy::LayoutList() -{ - QList argumentList; - return m_dBusKeyboardInter->asyncCallWithArgumentList(QStringLiteral("LayoutList"), argumentList); -} - -void KeyboardDBusProxy::AddUserLayout(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - m_dBusKeyboardInter->asyncCallWithArgumentList(QStringLiteral("AddUserLayout"), argumentList); -} - -void KeyboardDBusProxy::DeleteUserLayout(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - m_dBusKeyboardInter->asyncCallWithArgumentList(QStringLiteral("DeleteUserLayout"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::GetLayoutDesc(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusKeyboardInter->asyncCallWithArgumentList(QStringLiteral("GetLayoutDesc"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::AddLocale(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusLangSelectorInter->asyncCallWithArgumentList(QStringLiteral("AddLocale"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::DeleteLocale(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusLangSelectorInter->asyncCallWithArgumentList(QStringLiteral("DeleteLocale"), argumentList); -} - -QDBusPendingReply<> KeyboardDBusProxy::SetLocale(const QString &in0) -{ - QList argumentList; - argumentList << QVariant::fromValue(in0); - return m_dBusLangSelectorInter->asyncCallWithArgumentList(QStringLiteral("SetLocale"), argumentList); -} - -QDBusPendingReply KeyboardDBusProxy::GetLocaleList() -{ - QList argumentList; - return m_dBusLangSelectorInter->asyncCallWithArgumentList(QStringLiteral("GetLocaleList"), argumentList); -} diff --git a/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.h b/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.h deleted file mode 100644 index 37baa90225..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboarddbusproxy.h +++ /dev/null @@ -1,207 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef KEYBOARDDBUSPROXY_H -#define KEYBOARDDBUSPROXY_H - -#include "interface/namespace.h" - -#include - -#include -#include - -class QDBusInterface; -class QDBusMessage; - -using Dtk::Core::DDBusInterface; - -typedef QMap KeyboardLayoutList; - -class LocaleInfo -{ -public: - LocaleInfo(){} - - friend QDBusArgument &operator<<(QDBusArgument &arg, const LocaleInfo &info) - { - arg.beginStructure(); - arg << info.id << info.name; - arg.endStructure(); - - return arg; - } - - friend const QDBusArgument &operator>>(const QDBusArgument &arg, LocaleInfo &info) - { - arg.beginStructure(); - arg >> info.id >> info.name; - arg.endStructure(); - - return arg; - } - - friend QDataStream &operator<<(QDataStream &ds, const LocaleInfo &info) - { - return ds << info.id << info.name; - } - - friend const QDataStream &operator>>(QDataStream &ds, LocaleInfo &info) - { - return ds >> info.id >> info.name; - } - - bool operator ==(const LocaleInfo &info) - { - return id==info.id && name==info.name; - } - -public: - QString id{""}; - QString name{""}; -}; - -typedef QList LocaleList; -namespace DCC_NAMESPACE { -class DCCDBusInterface; -} - -class KeyboardDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit KeyboardDBusProxy(QObject *parent = nullptr); - - //Keyboard - Q_PROPERTY(bool CapslockToggle READ capslockToggle WRITE setCapslockToggle NOTIFY CapslockToggleChanged) - bool capslockToggle(); - void setCapslockToggle(bool value); - - Q_PROPERTY(QString CurrentLayout READ currentLayout WRITE setCurrentLayout NOTIFY CurrentLayoutChanged) - QString currentLayout(); - void setCurrentLayout(const QString &value); - - Q_PROPERTY(int CursorBlink READ cursorBlink WRITE setCursorBlink NOTIFY CursorBlinkChanged) - int cursorBlink(); - void setCursorBlink(int value); - - Q_PROPERTY(int LayoutScope READ layoutScope WRITE setLayoutScope NOTIFY LayoutScopeChanged) - int layoutScope(); - void setLayoutScope(int value); - - Q_PROPERTY(uint RepeatDelay READ repeatDelay WRITE setRepeatDelay NOTIFY RepeatDelayChanged) - uint repeatDelay(); - void setRepeatDelay(uint value); - - Q_PROPERTY(bool RepeatEnabled READ repeatEnabled WRITE setRepeatEnabled NOTIFY RepeatEnabledChanged) - bool repeatEnabled(); - void setRepeatEnabled(bool value); - - Q_PROPERTY(uint RepeatInterval READ repeatInterval WRITE setRepeatInterval NOTIFY RepeatIntervalChanged) - uint repeatInterval(); - void setRepeatInterval(uint value); - - Q_PROPERTY(QStringList UserLayoutList READ userLayoutList NOTIFY UserLayoutListChanged) - QStringList userLayoutList(); - - Q_PROPERTY(QStringList UserOptionList READ userOptionList NOTIFY UserOptionListChanged) - QStringList userOptionList(); - - //LangSelector - Q_PROPERTY(QString CurrentLocale READ currentLocale NOTIFY CurrentLocaleChanged) - QString currentLocale(); - - Q_PROPERTY(int LocaleState READ localeState NOTIFY LocaleStateChanged) - int localeState(); - - Q_PROPERTY(QStringList Locales READ locales NOTIFY LocalesChanged) - QStringList locales(); - - //Keybinding - Q_PROPERTY(int NumLockState READ numLockState NOTIFY NumLockStateChanged) - int numLockState(); - - Q_PROPERTY(uint ShortcutSwitchLayout READ shortcutSwitchLayout WRITE setShortcutSwitchLayout NOTIFY ShortcutSwitchLayoutChanged) - uint shortcutSwitchLayout(); - void setShortcutSwitchLayout(uint value); - - bool langSelectorIsValid(); - void langSelectorStartServiceProcess(); - -signals: - // Keyboard property - void CapslockToggleChanged(bool value) const; - void CurrentLayoutChanged(const QString & value) const; - void CursorBlinkChanged(int value) const; - void LayoutScopeChanged(int value) const; - void RepeatDelayChanged(uint value) const; - void RepeatEnabledChanged(bool value) const; - void RepeatIntervalChanged(uint value) const; - void UserLayoutListChanged(const QStringList & value) const; - void UserOptionListChanged(const QStringList & value) const; - - // LangSelector property - void CurrentLocaleChanged(const QString & value) const; - void LocaleStateChanged(int value) const; - void LocalesChanged(const QStringList & value) const; - - // Keybinding property - void NumLockStateChanged(int value) const; - void ShortcutSwitchLayoutChanged(uint value) const; - // Keybinding - void Added(const QString &in0, int in1); - void Changed(const QString &in0, int in1); - void Deleted(const QString &in0, int in1); - void KeyEvent(bool in0, const QString &in1); - - //wm - void compositingEnabledChanged(bool enabled); - - void langSelectorServiceStartFinished(const quint32 ret) const; - -public slots: - // Keybinding - QDBusPendingReply<> KeybindingReset(); - QDBusPendingReply ListAllShortcuts(); - QString LookupConflictingShortcut(const QString &in0); - QDBusPendingReply<> ClearShortcutKeystrokes(const QString &in0, int in1); - QDBusPendingReply<> AddShortcutKeystroke(const QString &in0, int in1, const QString &in2); - QDBusPendingReply<> AddCustomShortcut(const QString &in0, const QString &in1, const QString &in2); - QDBusPendingReply<> ModifyCustomShortcut(const QString &in0, const QString &in1, const QString &in2, const QString &in3); - QDBusPendingReply<> DeleteCustomShortcut(const QString &in0); - QDBusPendingReply<> GrabScreen(); - void SetNumLockState(int in0); - QDBusPendingReply GetShortcut(const QString &in0, int in1); - QDBusPendingReply SearchShortcuts(const QString &in0); - QDBusPendingReply Query(const QString &in0, int in1); - void SelectKeystroke(); - - //KeyBoard - QDBusPendingReply LayoutList(); - void AddUserLayout(const QString &in0); - void DeleteUserLayout(const QString &in0); - QDBusPendingReply GetLayoutDesc(const QString &in0); - - QDBusPendingReply<> AddLocale(const QString &in0); - QDBusPendingReply<> DeleteLocale(const QString &in0); - QDBusPendingReply<> SetLocale(const QString &in0); - QDBusPendingReply GetLocaleList(); - -private slots: - void onLangSelectorStartServiceProcessFinished(QDBusPendingCallWatcher *w); -private: - void init(); - -private: - DDBusInterface *m_dBusLangSelectorInter; - DDBusInterface *m_dBusKeyboardInter; - DDBusInterface *m_dBusKeybingdingInter; - DDBusInterface *m_dBusWMInter; -}; - -Q_DECLARE_METATYPE(KeyboardLayoutList) -Q_DECLARE_METATYPE(LocaleInfo) -Q_DECLARE_METATYPE(LocaleList) - -#endif // KeyboardDBusProxy_H diff --git a/dcc-old/src/plugin-keyboard/operation/keyboardmodel.cpp b/dcc-old/src/plugin-keyboard/operation/keyboardmodel.cpp deleted file mode 100644 index 8eb0036b49..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboardmodel.cpp +++ /dev/null @@ -1,222 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "keyboardmodel.h" -#include - -using namespace DCC_NAMESPACE; -KeyboardModel::KeyboardModel(QObject *parent) - : QObject(parent) - , m_capsLock(true) - , m_numLock(true) - , m_repeatInterval(1) - , m_repeatDelay(1) -{ -} - -void KeyboardModel::setLangChangedState(const int state) -{ - if (m_status != state) { - m_status = state; - Q_EMIT onSetCurLangFinish(state); - } -} - -void KeyboardModel::setLayoutLists(QMap lists) -{ - m_layouts = lists; -} - -QString KeyboardModel::langByKey(const QString &key) const -{ - auto res = std::find_if(m_langList.cbegin(), m_langList.end(), [key] (const MetaData &data)->bool{ - return data.key() == key; - }); - - if (res != m_langList.cend()) { - return res->text(); - } - - return QString(); -} - -QString KeyboardModel::langFromText(const QString &text) const -{ - auto res = std::find_if(m_langList.cbegin(), m_langList.end(), [text] (const MetaData &data)->bool{ - return data.text() == text; - }); - - if (res != m_langList.cend()) { - return res->key(); - } - - return QString(); -} - -void KeyboardModel::setLayout(const QString &key) -{ - if (key.isEmpty()) - return; - - if (m_layout == key) - return ; - - m_layout = key; - - Q_EMIT curLayoutChanged(m_layout); -} - -QString KeyboardModel::curLayout() const -{ - return m_layout; -} - -void KeyboardModel::setLang(const QString &value) -{ - qDebug() << "old key is " << m_currentLangKey << " new is " << value; - if (m_currentLangKey != value && !value.isEmpty()) { - m_currentLangKey = value; - const QString &langName = langByKey(value); - qDebug() << "value is " << value << " langName is " << langName; - if (!langName.isEmpty()) - Q_EMIT curLangChanged(langName); - } -} - -QStringList KeyboardModel::convertLang(const QStringList &langList) -{ - QStringList realLangList; - for (int i = 0; i < langList.size(); ++i) { - QString lang = langByKey(langList[i]); - if (!lang.isEmpty()) { - realLangList << lang; - } - } - return realLangList; -} - -void KeyboardModel::setLocaleLang(const QStringList &localLangList) -{ - QStringList langList = convertLang(localLangList); - if (m_localLangList != langList && !langList.isEmpty()) { - m_localLangList = langList; - - Q_EMIT curLocalLangChanged(m_localLangList); - } -} - -void KeyboardModel::setLocaleList(const QList &langList) -{ - if (langList.isEmpty()) - return; - - m_langList = langList; - Q_EMIT langChanged(langList); - - const QString ¤tLang = langByKey(m_currentLangKey); - if (!currentLang.isEmpty()) - Q_EMIT curLangChanged(currentLang); -} - -void KeyboardModel::setCapsLock(bool value) -{ - if (m_capsLock != value) { - m_capsLock = value; - Q_EMIT capsLockChanged(value); - } -} - -uint KeyboardModel::repeatDelay() const -{ - return m_repeatDelay; -} - -void KeyboardModel::setRepeatDelay(const uint &repeatDelay) -{ - if (m_repeatDelay != repeatDelay) { - m_repeatDelay = repeatDelay; - Q_EMIT repeatDelayChanged(repeatDelay); - } -} - -uint KeyboardModel::repeatInterval() const -{ - return m_repeatInterval; -} - -void KeyboardModel::setRepeatInterval(const uint &repeatInterval) -{ - if (m_repeatInterval != repeatInterval) { - m_repeatInterval = repeatInterval; - Q_EMIT repeatIntervalChanged(repeatInterval); - } -} - -void KeyboardModel::setAllShortcut(const QMap &map) -{ - m_shortcutMap = map; -} - -bool KeyboardModel::numLock() const -{ - return m_numLock; -} - -void KeyboardModel::setNumLock(bool numLock) -{ - if (m_numLock != numLock) { - m_numLock = numLock; - Q_EMIT numLockChanged(m_numLock); - } -} - -void KeyboardModel::cleanUserLayout() -{ - m_userLayout.clear(); -} - -QString KeyboardModel::curLang() const -{ - qDebug() << "curLang key is " << m_currentLangKey; - return langByKey(m_currentLangKey); -} - -QMap KeyboardModel::userLayout() const -{ - return m_userLayout; -} - -QMap KeyboardModel::kbLayout() const -{ - return m_layouts; -} - -QStringList KeyboardModel::localLang() const -{ - return m_localLangList; -} - -void KeyboardModel::addUserLayout(const QString &id, const QString &value) -{ - if (!m_userLayout.contains(id)) { - m_userLayout.insert(id, value); - Q_EMIT userLayoutChanged(id, value); - } -} - -QList KeyboardModel::langLists() const -{ - return m_langList; -} - -bool KeyboardModel::capsLock() const -{ - return m_capsLock; -} - -QMap KeyboardModel::allShortcut() const -{ - return m_shortcutMap; -} diff --git a/dcc-old/src/plugin-keyboard/operation/keyboardmodel.h b/dcc-old/src/plugin-keyboard/operation/keyboardmodel.h deleted file mode 100644 index 72db946bb6..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboardmodel.h +++ /dev/null @@ -1,100 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef KEYBOARDMODEL_H -#define KEYBOARDMODEL_H - -#include "interface/namespace.h" -#include "metadata.h" - -#include -#include -#include - -namespace DCC_NAMESPACE { - -class KeyboardModel : public QObject -{ - Q_OBJECT -public: - explicit KeyboardModel(QObject *parent = nullptr); - enum KBLayoutScope { - system = 0, - application = 1 - }; -#ifndef DCC_DISABLE_KBLAYOUT - void setLayoutLists(QMap lists); -#endif - QString langByKey(const QString &key) const; - QString langFromText(const QString &text) const; - - QString curLayout() const; - QString curLang() const; - QMap userLayout() const; - QMap kbLayout() const; - QStringList localLang() const; - QList langLists() const; - bool capsLock() const; - QMap allShortcut() const; - - uint repeatInterval() const; - void setRepeatInterval(const uint &repeatInterval); - - uint repeatDelay() const; - void setRepeatDelay(const uint &repeatDelay); - - bool numLock() const; - void setNumLock(bool numLock); - - void cleanUserLayout(); - - inline int getLangChangedState() const { return m_status; } - void setLangChangedState(const int state); - inline QStringList &getUserLayoutList() { return m_userLaylist; } - -Q_SIGNALS: -#ifndef DCC_DISABLE_KBLAYOUT - void curLayoutChanged(const QString &layout); -#endif - void curLangChanged(const QString &lang); - void capsLockChanged(bool value); - void numLockChanged(bool value); - void repeatDelayChanged(const uint value); - void repeatIntervalChanged(const uint value); - void userLayoutChanged(const QString &id, const QString &value); - void langChanged(const QList &data); - - void curLocalLangChanged(const QStringList &localLangList); - void onSetCurLangFinish(const int value); - -public Q_SLOTS: -#ifndef DCC_DISABLE_KBLAYOUT - void setLayout(const QString &key); -#endif - void setLang(const QString &value); - void setLocaleLang(const QStringList &localLangList); - void addUserLayout(const QString &id, const QString &value); - void setLocaleList(const QList &langList); - void setCapsLock(bool value); - void setAllShortcut(const QMap &map); -private: - QStringList convertLang(const QStringList &langList); -private: - bool m_capsLock; - bool m_numLock; - uint m_repeatInterval; - uint m_repeatDelay; - QString m_layout; - QString m_currentLangKey; - QStringList m_localLangList; - QStringList m_userLaylist; - QMap m_userLayout; - QMap m_layouts; - QList m_langList; - QMap m_shortcutMap; - int m_status{0}; -}; -} -#endif // KEYBOARDMODEL_H diff --git a/dcc-old/src/plugin-keyboard/operation/keyboardwork.cpp b/dcc-old/src/plugin-keyboard/operation/keyboardwork.cpp deleted file mode 100644 index d192bc8de2..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboardwork.cpp +++ /dev/null @@ -1,812 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#include "keyboardwork.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -bool caseInsensitiveLessThan(const MetaData &s1, const MetaData &s2); - -const QMap &ModelKeycode = {{"minus", "-"}, {"equal", "="}, {"backslash", "\\"}, {"question", "?/"}, {"exclam", "1"}, {"numbersign", "3"}, - {"semicolon", ";"}, {"apostrophe", "'"}, {"less", ",<"}, {"period", ">."}, {"slash", "?/"}, {"parenleft", "9"}, {"bracketleft", "["}, - {"parenright", "0"}, {"bracketright", "]"}, {"quotedbl", "'"}, {"space", " "}, {"dollar", "$"}, {"plus", "+"}, {"asterisk", "*"}, - {"underscore", "_"}, {"bar", "|"}, {"grave", "`"}, {"at", "2"}, {"percent", "5"}, {"greater", ">."}, {"asciicircum", "6"}, - {"braceleft", "["}, {"colon", ":"}, {"comma", ",<"}, {"asciitilde", "~"}, {"ampersand", "7"}, {"braceright", "]"}, {"Escape", "Esc"} -}; - - -KeyboardWorker::KeyboardWorker(KeyboardModel *model, QObject *parent) - : QObject(parent) - , m_model(model) - , m_keyboardDBusProxy(new KeyboardDBusProxy(this)) - , m_translatorLanguage(nullptr) -{ - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::compositingEnabledChanged, this, &KeyboardWorker::onGetWindowWM); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::Added, this, &KeyboardWorker::onAdded); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::Deleted, this, &KeyboardWorker::removed); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::UserLayoutListChanged, this, &KeyboardWorker::onUserLayout); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::CurrentLayoutChanged, this, &KeyboardWorker::onCurrentLayout); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::CapslockToggleChanged, m_model, &KeyboardModel::setCapsLock); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::NumLockStateChanged, m_model, &KeyboardModel::setNumLock); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::langSelectorServiceStartFinished, this, [=] { - QTimer::singleShot(100, this, &KeyboardWorker::onLangSelectorServiceFinished); - }); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::RepeatDelayChanged, this, &KeyboardWorker::setModelRepeatDelay); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::RepeatIntervalChanged, this, &KeyboardWorker::setModelRepeatInterval); - - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::Changed, this, &KeyboardWorker::onShortcutChanged); - - m_model->setLangChangedState(m_keyboardDBusProxy->localeState()); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::LocaleStateChanged, m_model, &KeyboardModel::setLangChangedState); -} - -void KeyboardWorker::resetAll() { - QDBusPendingCallWatcher* watcher = new QDBusPendingCallWatcher(m_keyboardDBusProxy->KeybindingReset(), this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] (QDBusPendingCallWatcher *reply) { - watcher->deleteLater(); - - if (reply->isError()) { - qDebug() << Q_FUNC_INFO << reply->error(); - } - - Q_EMIT onResetFinished(); - }); -} - -void KeyboardWorker::onGetWindowWM(bool value) -{ - if (m_shortcutModel) - m_shortcutModel->onWindowSwitchChanged(value); -} - -void KeyboardWorker::setShortcutModel(ShortcutModel *model) -{ - m_shortcutModel = model; - - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::KeyEvent, model, &ShortcutModel::keyEvent); -} - -void KeyboardWorker::refreshShortcut() -{ - QDBusPendingCallWatcher *result = new QDBusPendingCallWatcher(m_keyboardDBusProxy->ListAllShortcuts(), this); - connect(result, SIGNAL(finished(QDBusPendingCallWatcher*)), this, - SLOT(onRequestShortcut(QDBusPendingCallWatcher*))); -} - -void KeyboardWorker::refreshLang() -{ - m_keyboardDBusProxy->blockSignals(false); - if (!m_keyboardDBusProxy->langSelectorIsValid()) - m_keyboardDBusProxy->langSelectorStartServiceProcess(); - else - onLangSelectorServiceFinished(); -} - -void KeyboardWorker::windowSwitch() -{ - QDBusInterface licenseInfo("com.deepin.wm", - "/com/deepin/wm", - "com.deepin.wm", - QDBusConnection::sessionBus()); - if (!licenseInfo.isValid()) { - qDebug() << "com.deepin.license error ," << licenseInfo.lastError().name(); - return; - } - - if (m_shortcutModel) - m_shortcutModel->onWindowSwitchChanged(licenseInfo.property("compositingEnabled").toBool()); -} - -void KeyboardWorker::active() -{ - if (!m_translatorLanguage) { - m_translatorLanguage = new QTranslator(this); - m_translatorLanguage->load("/usr/share/dde-control-center/translations/keyboard_language_" + QLocale::system().name()); - qApp->installTranslator(m_translatorLanguage); - } - - m_keyboardDBusProxy->blockSignals(false); - - setModelRepeatDelay(m_keyboardDBusProxy->repeatDelay()); - setModelRepeatInterval(m_keyboardDBusProxy->repeatInterval()); - - m_metaDatas.clear(); - m_letters.clear(); - - Q_EMIT onDatasChanged(m_metaDatas); - Q_EMIT onLettersChanged(m_letters); - - m_model->setCapsLock(m_keyboardDBusProxy->capslockToggle()); - m_model->setNumLock(m_keyboardDBusProxy->numLockState()); - - onRefreshKBLayout(); - refreshLang(); - windowSwitch(); -} - -void KeyboardWorker::deactive() -{ - m_keyboardDBusProxy->blockSignals(true); -} - -bool KeyboardWorker::keyOccupy(const QStringList &list) -{ - int bit = 0; - for (QString t : list) { - if (t == "Control") - bit += Modifier::control; - else if (t == "Alt") - bit += Modifier::alt; - else if (t == "Super") - bit += Modifier::super; - else if (t == "Shift") - bit += Modifier::shift; - else - continue; - } - - QMap keylist = m_model->allShortcut(); - QMap::iterator i; - for (i = keylist.begin(); i != keylist.end(); ++i) { - if (bit == i.value() && i.key().last() == list.last()) { - return false; - } - } - - return true; -} - -#ifndef DCC_DISABLE_KBLAYOUT -void KeyboardWorker::onRefreshKBLayout() -{ - QDBusPendingCallWatcher *layoutResult = new QDBusPendingCallWatcher(m_keyboardDBusProxy->LayoutList(), this); - connect(layoutResult, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onLayoutListsFinished); - - onCurrentLayout(m_keyboardDBusProxy->currentLayout()); - onUserLayout(m_keyboardDBusProxy->userLayoutList()); -} -#endif - -void KeyboardWorker::modifyShortcutEditAux(ShortcutInfo *info, bool isKPDelete) -{ - if (!info) - return; - - if (info->replace) { - onDisableShortcut(info->replace); - } - - QString shortcut = info->accels; - if (!isKPDelete) { - shortcut = shortcut.replace("KP_Delete", "Delete"); - } - - const QString &result = m_keyboardDBusProxy->LookupConflictingShortcut(shortcut); - - if (!result.isEmpty()) { - const QJsonObject obj = QJsonDocument::fromJson(result.toLatin1()).object(); - QDBusPendingCall call = m_keyboardDBusProxy->ClearShortcutKeystrokes(obj["Id"].toString(), obj["Type"].toInt()); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - - watcher->setProperty("id", info->id); - watcher->setProperty("type", info->type); - watcher->setProperty("shortcut", shortcut); - watcher->setProperty("clean", !isKPDelete); - - connect(watcher, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onConflictShortcutCleanFinished); - } else { - if (isKPDelete) { - m_keyboardDBusProxy->AddShortcutKeystroke(info->id, static_cast(info->type), shortcut); - } else { - cleanShortcutSlef(info->id, static_cast(info->type), shortcut); - } - } -} - -void KeyboardWorker::modifyShortcutEdit(ShortcutInfo *info) { - modifyShortcutEditAux(info); -} - -void KeyboardWorker::addCustomShortcut(const QString &name, const QString &command, const QString &accels) -{ - m_keyboardDBusProxy->AddCustomShortcut(name, command, accels); -} - -void KeyboardWorker::modifyCustomShortcut(ShortcutInfo *info) -{ - if (info->replace) { - onDisableShortcut(info->replace); - } - - // reset replace shortcut - info->replace = nullptr; - - const QString &result = m_keyboardDBusProxy->LookupConflictingShortcut(info->accels); - - if (!result.isEmpty()) { - const QJsonObject obj = QJsonDocument::fromJson(result.toUtf8()).object(); - QDBusPendingCall call = m_keyboardDBusProxy->ClearShortcutKeystrokes(obj["Id"].toString(), obj["Type"].toInt()); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - - watcher->setProperty("id", info->id); - watcher->setProperty("name", info->name); - watcher->setProperty("command", info->command); - watcher->setProperty("shortcut", info->accels); - - connect(watcher, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onCustomConflictCleanFinished); - } else { - m_keyboardDBusProxy->ModifyCustomShortcut(info->id, info->name, info->command, info->accels); - } -} - -void KeyboardWorker::grabScreen() -{ - m_keyboardDBusProxy->GrabScreen(); -} - -bool KeyboardWorker::checkAvaliable(const QString &key) -{ - const QString &value = m_keyboardDBusProxy->LookupConflictingShortcut(key); - - return value.isEmpty(); -} - -void KeyboardWorker::delShortcut(ShortcutInfo* info) -{ - m_keyboardDBusProxy->DeleteCustomShortcut(info->id); - if (m_shortcutModel) - m_shortcutModel->delInfo(info); -} - -void KeyboardWorker::setRepeatDelay(uint value) -{ - m_keyboardDBusProxy->setRepeatDelay(converToDBusDelay(value)); -} - -void KeyboardWorker::setRepeatInterval(uint value) -{ - m_keyboardDBusProxy->setRepeatInterval(static_cast(converToDBusInterval(value))); -} - -void KeyboardWorker::setModelRepeatDelay(uint value) -{ - m_model->setRepeatDelay(converToModelDelay(value)); -} - -void KeyboardWorker::setModelRepeatInterval(uint value) -{ - m_model->setRepeatInterval(converToModelInterval(value)); -} - -void KeyboardWorker::setNumLock(bool value) -{ - m_keyboardDBusProxy->SetNumLockState(value); -} - -void KeyboardWorker::setCapsLock(bool value) -{ - m_keyboardDBusProxy->setCapslockToggle(value); -} - -void KeyboardWorker::addUserLayout(const QString &value) -{ - m_keyboardDBusProxy->AddUserLayout(m_model->kbLayout().key(value)); -} - -void KeyboardWorker::delUserLayout(const QString &value) -{ - m_keyboardDBusProxy->DeleteUserLayout(m_model->userLayout().key(value)); -} - -bool caseInsensitiveLessThan(const MetaData &s1, const MetaData &s2) -{ - QCollator qc; - int i = qc.compare(s1.text(), s2.text()); - if (i < 0) - return true; - else - return false; -} - -void KeyboardWorker::onRequestShortcut(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - if(reply.isError()) - { - watch->deleteLater(); - return; - } - - QString info = reply.value(); - - QMap map; - QJsonArray array = QJsonDocument::fromJson(info.toStdString().c_str()).array(); - Q_FOREACH(QJsonValue value, array) { - QJsonObject obj = value.toObject(); - if (obj.isEmpty()) - continue; - if (obj["Accels"].toArray().isEmpty()) - continue; - QString accels = obj["Accels"].toArray().at(0).toString(); - accels.replace("<", ""); - accels.replace(">", "-"); - //转换为list - QStringList key; - key = accels.split("-"); - int bit = 0; - for (QString &t : key) { - if (t == "Control") - bit += Modifier::control; - else if (t == "Alt") - bit += Modifier::alt; - else if (t == "Super") - bit += Modifier::super; - else if (t == "Shift") - bit += Modifier::shift; - else { - QString s = t; - s = ModelKeycode.value(s); - if (!s.isEmpty()) - t = s; - } - } - if (bit == 0) - continue; - - map.insert(key, bit); - } - m_model->setAllShortcut(map); - if (m_shortcutModel) - m_shortcutModel->onParseInfo(info); - watch->deleteLater(); -} - -void KeyboardWorker::onAdded(const QString &in0, int in1) -{ - QDBusPendingReply reply = m_keyboardDBusProxy->GetShortcut(in0, in1); - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(reply, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onAddedFinished); -} - -void KeyboardWorker::onDisableShortcut(ShortcutInfo *info) -{ - // disable shortcut need wait! - m_keyboardDBusProxy->ClearShortcutKeystrokes(info->id, static_cast(info->type)).waitForFinished(); - info->accels.clear(); -} - -void KeyboardWorker::onAddedFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - if (m_shortcutModel && !watch->isError()) - m_shortcutModel->onCustomInfo(reply.value()); - - watch->deleteLater(); -} - -void KeyboardWorker::onLayoutListsFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - KeyboardLayoutList tmp_map = reply.value(); - m_model->setLayoutLists(tmp_map); - - watch->deleteLater(); -} - -void KeyboardWorker::onLocalListsFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - m_datas.clear(); - - LocaleList list = reply.value(); - - QStringList languageCodes; - QList metaDatas; - for (int i = 0; i != list.size(); ++i) { - MetaData md; - md.setKey(list.at(i).id); - languageCodes << list.at(i).id; - metaDatas << md; - } - QStringList dialectNames = DCCLocale::dialectNames(languageCodes); - for (int i = 0; i != metaDatas.size(); ++i) { - metaDatas[i].setText(QString("%1 - %2").arg(list.at(i).name).arg(dialectNames.at(i))); - } - m_datas.append(metaDatas); - - std::sort(m_datas.begin(), m_datas.end(), caseInsensitiveLessThan); - - m_model->setLocaleList(m_datas); - - watch->deleteLater(); - - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::CurrentLocaleChanged, m_model, &KeyboardModel::setLang); - connect(m_keyboardDBusProxy, &KeyboardDBusProxy::LocalesChanged, m_model, &KeyboardModel::setLocaleLang); - m_model->setLocaleLang(m_keyboardDBusProxy->locales()); - m_model->setLang(m_keyboardDBusProxy->currentLocale()); -} - -void KeyboardWorker::onUserLayout(const QStringList &list) -{ - m_model->cleanUserLayout(); - m_model->getUserLayoutList() = list; - - for (const QString &data : list) { - QDBusPendingCallWatcher *layoutResult = new QDBusPendingCallWatcher(m_keyboardDBusProxy->GetLayoutDesc(data), this); - layoutResult->setProperty("id", data); - connect(layoutResult, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onUserLayoutFinished); - } -} - -void KeyboardWorker::onUserLayoutFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - m_model->addUserLayout(watch->property("id").toString(), reply.value()); - - watch->deleteLater(); -} - -void KeyboardWorker::onCurrentLayout(const QString &value) -{ - QDBusPendingCallWatcher *layoutResult = new QDBusPendingCallWatcher(m_keyboardDBusProxy->GetLayoutDesc(value), this); - connect(layoutResult, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onCurrentLayoutFinished); -} - -void KeyboardWorker::onSearchShortcuts(const QString &searchKey) -{ - qDebug() << "onSearchShortcuts: " << searchKey; - QDBusPendingReply reply = m_keyboardDBusProxy->SearchShortcuts(searchKey); - QDBusPendingCallWatcher *searchResult = new QDBusPendingCallWatcher(reply, this); - connect(searchResult, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onSearchFinished); -} - -void KeyboardWorker::onCurrentLayoutFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - m_model->setLayout(reply.value()); - - watch->deleteLater(); -} - -void KeyboardWorker::onSearchFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - if (m_shortcutModel && !watch->isError()) { - m_shortcutModel->setSearchResult(reply.value()); - } else { - qDebug() << "search finished error." << watch->error(); - } - watch->deleteLater(); -} - -void KeyboardWorker::onPinyin() -{ - m_letters.clear(); - m_metaDatas.clear(); - QDBusInterface dbus_pinyin("org.deepin.dde.Pinyin1", "/org/deepin/dde/Pinyin1", - "org.deepin.dde.Pinyin1"); - - Q_FOREACH(const QString &str, m_model->kbLayout().keys()) { - MetaData md; - QString title = m_model->kbLayout()[str]; - md.setText(title); - md.setKey(str); - QChar letterFirst = title[0]; - QStringList letterFirstList; - if (letterFirst.isLower() || letterFirst.isUpper()) { - letterFirstList << QString(letterFirst); - md.setPinyin(title); - } else { - QDBusMessage message = dbus_pinyin.call("Query", title); - letterFirstList = message.arguments()[0].toStringList(); - md.setPinyin(letterFirstList.at(0)); - } - - append(md); - } - - QLocale locale; - - if (locale.language() == QLocale::Chinese) { - QChar ch = '\0'; - for (int i(0); i != m_metaDatas.size(); ++i) - { - const QChar flag = m_metaDatas[i].pinyin().at(0).toUpper(); - if (flag == ch) - continue; - ch = flag; - - m_letters.append(ch); - m_metaDatas.insert(i, MetaData(ch, true)); - } - } else { - std::sort(m_metaDatas.begin(), m_metaDatas.end(), caseInsensitiveLessThan); - } - - Q_EMIT onDatasChanged(m_metaDatas); - Q_EMIT onLettersChanged(m_letters); -} - -void KeyboardWorker::append(const MetaData &md) -{ - if(m_metaDatas.count() == 0) - { - m_metaDatas.append(md); - return; - } - - int index = 0; - for (int i = 0; i != m_metaDatas.size(); ++i) { - if(m_metaDatas.at(i) > md) - { - m_metaDatas.insert(index,md); - return; - } - index++; - } - - m_metaDatas.append(md); -} - -void KeyboardWorker::onLangSelectorServiceFinished() -{ - QDBusPendingCallWatcher *localResult = new QDBusPendingCallWatcher(m_keyboardDBusProxy->GetLocaleList(), this); - connect(localResult, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onLocalListsFinished); - m_keyboardDBusProxy->currentLocale(); -} - -void KeyboardWorker::onShortcutChanged(const QString &id, int type) -{ - QDBusPendingCallWatcher *result = new QDBusPendingCallWatcher(m_keyboardDBusProxy->Query(id, type)); - connect(result, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onGetShortcutFinished); -} - -void KeyboardWorker::onGetShortcutFinished(QDBusPendingCallWatcher *watch) -{ - QDBusPendingReply reply = *watch; - - if (m_shortcutModel && !watch->isError()) - m_shortcutModel->onKeyBindingChanged(reply.value()); - - watch->deleteLater(); -} - -void KeyboardWorker::updateKey(ShortcutInfo *info) -{ - if (m_shortcutModel) - m_shortcutModel->setCurrentInfo(info); - - m_keyboardDBusProxy->SelectKeystroke(); -} - -void KeyboardWorker::cleanShortcutSlef(const QString &id, const int type, const QString &shortcut) -{ - QDBusPendingCall call = m_keyboardDBusProxy->ClearShortcutKeystrokes(id, type); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - - watcher->setProperty("id", id); - watcher->setProperty("type", type); - watcher->setProperty("shortcut", shortcut); - - connect(watcher, &QDBusPendingCallWatcher::finished, this, &KeyboardWorker::onShortcutCleanFinished); -} - -void KeyboardWorker::setNewCustomShortcut(const QString &id, const QString &name, const QString &command, const QString &accles) -{ - m_keyboardDBusProxy->ModifyCustomShortcut(id, name, command, accles); -} - -void KeyboardWorker::onConflictShortcutCleanFinished(QDBusPendingCallWatcher *watch) -{ - if (!watch->isError()) { - const QString &id = watch->property("id").toString(); - const int type = watch->property("type").toInt(); - const QString &shortcut = watch->property("shortcut").toString(); - const bool clean = watch->property("clean").toBool(); - - if (clean) { - cleanShortcutSlef(id, type, shortcut); - } else { - m_keyboardDBusProxy->AddShortcutKeystroke(id, type, shortcut); - } - } - - watch->deleteLater(); -} - -void KeyboardWorker::onShortcutCleanFinished(QDBusPendingCallWatcher *watch) -{ - if (!watch->isError()) { - const QString &id = watch->property("id").toString(); - const int type = watch->property("type").toInt(); - const QString &shortcut = watch->property("shortcut").toString(); - - m_keyboardDBusProxy->AddShortcutKeystroke(id, type, shortcut); - - if (shortcut.contains("Delete") && !shortcut.contains("KP_Delete")) { - ShortcutInfo si; - si.id = id; - si.type = static_cast(type); - si.accels = shortcut; - si.accels = si.accels.replace("Delete", "KP_Delete"); - modifyShortcutEditAux(&si, true); - } - } else { - qDebug() << watch->error(); - } - - watch->deleteLater(); -} - -void KeyboardWorker::onCustomConflictCleanFinished(QDBusPendingCallWatcher *w) -{ - if (!w->isError()) { - const QString &id = w->property("id").toString(); - const QString name = w->property("name").toString(); - const QString &command = w->property("command").toString(); - const QString &accles = w->property("shortcut").toString(); - - setNewCustomShortcut(id, name, command, accles); - } - - w->deleteLater(); -} - -uint KeyboardWorker::converToDBusDelay(uint value) -{ - switch (value) { - case 1: - return 20; - case 2: - return 80; - case 3: - return 150; - case 4: - return 250; - case 5: - return 360; - case 6: - return 480; - case 7: - return 600; - default: - return 4; - } -} - -uint KeyboardWorker::converToModelDelay(uint value) -{ - if (value <= 20) - return 1; - else if (value <= 80) - return 2; - else if (value <= 150) - return 3; - else if (value <= 250) - return 4; - else if (value <= 360) - return 5; - else if (value <= 480) - return 6; - else - return 7; -} - -int KeyboardWorker::converToDBusInterval(int value) -{ - switch (value) { - case 1: - return 100; - case 2: - return 80; - case 3: - return 65; - case 4: - return 50; - case 5: - return 35; - case 6: - return 25; - case 7: - return 20; - default: - return 4; - } -} - -uint KeyboardWorker::converToModelInterval(uint value) -{ - if (value <= 20) - return 7; - else if (value <= 25) - return 6; - else if (value <= 35) - return 5; - else if (value <= 50) - return 4; - else if (value <= 65) - return 3; - else if (value <= 80) - return 2; - else - return 1; -} - -void KeyboardWorker::setLayout(const QString &value) -{ - m_keyboardDBusProxy->setCurrentLayout(value); -} - -void KeyboardWorker::setLang(const QString &value) -{ - Q_EMIT requestSetAutoHide(false); - - QDBusPendingCall call = m_keyboardDBusProxy->SetLocale(value); - qDebug() << "setLang is " << value; - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - qDebug() << "setLang error: " << call.error().type(); - m_model->setLang(m_keyboardDBusProxy->currentLocale()); - } - - qDebug() << "setLang success"; - Q_EMIT requestSetAutoHide(true); - watcher->deleteLater(); - }); -} - -void KeyboardWorker::addLang(const QString &value) -{ - Q_EMIT requestSetAutoHide(false); - - QDBusPendingCall call = m_keyboardDBusProxy->AddLocale(value); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - qDebug() << "add Locale language error: " << call.error().type(); - } - - Q_EMIT requestSetAutoHide(true); - watcher->deleteLater(); - }); -} - -void KeyboardWorker::deleteLang(const QString &value) -{ - Q_EMIT requestSetAutoHide(false); - - QString lang = m_model->langFromText(value); - QDBusPendingCall call = m_keyboardDBusProxy->DeleteLocale(lang); - - QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(call, this); - connect(watcher, &QDBusPendingCallWatcher::finished, this, [=] { - if (call.isError()) { - qDebug() << "delete Locale language error: " << call.error().type(); - } - - Q_EMIT requestSetAutoHide(true); - watcher->deleteLater(); - }); -} diff --git a/dcc-old/src/plugin-keyboard/operation/keyboardwork.h b/dcc-old/src/plugin-keyboard/operation/keyboardwork.h deleted file mode 100644 index b9ac657a4c..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/keyboardwork.h +++ /dev/null @@ -1,124 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - - -#ifndef KEYBOARDWORK_H -#define KEYBOARDWORK_H - -#include "interface/namespace.h" -#include "operation/metadata.h" -#include "shortcutmodel.h" -#include "keyboardmodel.h" -#include "keyboarddbusproxy.h" - -#include - -class QDBusPendingCallWatcher; -class QTranslator; - -namespace DCC_NAMESPACE { -class KeyboardWorker : public QObject -{ - Q_OBJECT -public: - explicit KeyboardWorker(KeyboardModel* model, QObject *parent = nullptr); - enum Modifier { - control = 1, - super = 2, - alt = 4, - shift = 8 - }; - - void resetAll(); - - void setShortcutModel(ShortcutModel * model); - void refreshShortcut(); - void refreshLang(); - void windowSwitch(); - - inline QList getDatas() {return m_metaDatas;} - inline QList getLetters() {return m_letters;} - - void modifyShortcutEditAux(ShortcutInfo* info, bool isKPDelete = false); - void modifyShortcutEdit(ShortcutInfo* info); - void addCustomShortcut(const QString& name, const QString& command, const QString& accels); - void modifyCustomShortcut(ShortcutInfo *info); - - void grabScreen(); - bool checkAvaliable(const QString& key); - void delShortcut(ShortcutInfo *info); - - void setRepeatDelay(uint value); - void setRepeatInterval(uint value); - void setModelRepeatDelay(uint value); - void setModelRepeatInterval(uint value); - - void setNumLock(bool value); - void setCapsLock(bool value); - void active(); - void deactive(); - bool keyOccupy(const QStringList &list); - void onRefreshKBLayout(); - -Q_SIGNALS: - void KeyEvent(bool in0, const QString &in1); - void searchChangd(ShortcutInfo* info, const QString& key); - void removed(const QString &id, int type); - void requestSetAutoHide(const bool visible); - void onDatasChanged(QList datas); - void onLettersChanged(QList letters); - // 快捷键恢复默认完成 - void onResetFinished(); - -public Q_SLOTS: - void setLang(const QString &value); - void addLang(const QString &value); - void deleteLang(const QString& value); - void setLayout(const QString& value); - void addUserLayout(const QString& value); - void delUserLayout(const QString& value); - void onRequestShortcut(QDBusPendingCallWatcher* watch); - void onAdded(const QString&in0, int in1); - void onDisableShortcut(ShortcutInfo* info); - void onAddedFinished(QDBusPendingCallWatcher *watch); - void onLocalListsFinished(QDBusPendingCallWatcher *watch); - void onGetWindowWM(bool value); - void onLayoutListsFinished(QDBusPendingCallWatcher *watch); - void onUserLayout(const QStringList &list); - void onUserLayoutFinished(QDBusPendingCallWatcher *watch); - void onCurrentLayout(const QString &value); - void onCurrentLayoutFinished(QDBusPendingCallWatcher *watch); - void onPinyin(); - void onSearchShortcuts(const QString &searchKey); - void onSearchFinished(QDBusPendingCallWatcher *watch); - void append(const MetaData& md); - void onLangSelectorServiceFinished(); - void onShortcutChanged(const QString &id, int type); - void onGetShortcutFinished(QDBusPendingCallWatcher *watch); - void updateKey(ShortcutInfo *info); - void cleanShortcutSlef(const QString &id, const int type, const QString &shortcut); - void setNewCustomShortcut(const QString &id, const QString &name, const QString &command, const QString &accles); - void onConflictShortcutCleanFinished(QDBusPendingCallWatcher *watch); - void onShortcutCleanFinished(QDBusPendingCallWatcher *watch); - void onCustomConflictCleanFinished(QDBusPendingCallWatcher *w); - -private: - uint converToDBusDelay(uint value); - uint converToModelDelay(uint value); - int converToDBusInterval(int value); - uint converToModelInterval(uint value); - -private: - QList m_datas; - QList m_metaDatas; - QList m_letters; - int m_delayValue; - int m_speedValue; - KeyboardModel* m_model; - KeyboardDBusProxy *m_keyboardDBusProxy; - ShortcutModel *m_shortcutModel = nullptr; - QTranslator *m_translatorLanguage; -}; -} -#endif // KEYBOARDWORK_H diff --git a/dcc-old/src/plugin-keyboard/operation/metadata.cpp b/dcc-old/src/plugin-keyboard/operation/metadata.cpp deleted file mode 100644 index 35f63000d8..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/metadata.cpp +++ /dev/null @@ -1,84 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "metadata.h" -#include - -using namespace DCC_NAMESPACE; - -MetaData::MetaData(const QString &text, bool section) - : m_text(text) - , m_pinyin(QString()) - , m_section(section) - , m_selected(false) -{ - -} - -void MetaData::setPinyin(const QString &py) -{ - m_pinyin = py; -} - -QString MetaData::pinyin() const -{ - return m_pinyin == QString() ? m_text : m_pinyin; -} - -void MetaData::setText(const QString &text) -{ - m_text = text; -} - -QString MetaData::text() const -{ - return m_text; -} - -void MetaData::setKey(const QString &key) -{ - m_key = key; -} - -QString MetaData::key() const -{ - return m_key; -} - -void MetaData::setSection(bool section) -{ - m_section = section; -} - -bool MetaData::section() const -{ - return m_section; -} - -void MetaData::setSelected(bool selected) -{ - m_selected = selected; -} - -bool MetaData::selected() const -{ - return m_selected; -} - -bool MetaData::operator ==(const MetaData &md) const -{ - return m_text == md.m_text; -} - -bool MetaData::operator >(const MetaData &md) const -{ - int x = QString::compare(m_pinyin, md.m_pinyin, Qt::CaseInsensitive); - return x > 0; -} - -QDebug &operator<<(QDebug dbg, const MetaData &md) -{ - dbg.nospace() << QString("key: %1, text: %2").arg(md.key(), md.text()); - return dbg.maybeSpace(); -} diff --git a/dcc-old/src/plugin-keyboard/operation/metadata.h b/dcc-old/src/plugin-keyboard/operation/metadata.h deleted file mode 100644 index b8ad6a472e..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/metadata.h +++ /dev/null @@ -1,46 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once - -#include "interface/namespace.h" -#include - -namespace DCC_NAMESPACE { - -class MetaData -{ -public: - MetaData(const QString &text = QString(), bool section = false); - - void setPinyin(const QString &py); - QString pinyin() const; - - void setText(const QString &text); - QString text() const; - - void setKey(const QString &key); - QString key() const; - - void setSection(bool section); - bool section() const; - - void setSelected(bool selected); - bool selected() const; - - bool operator ==(const MetaData &md) const; - bool operator >(const MetaData &md) const; -private: - QString m_key; - QString m_text; - QString m_pinyin; - bool m_section; - bool m_selected; - friend QDebug &operator<<(QDebug dbg, const MetaData &md); -}; - -QDebug &operator<<(QDebug dbg, const MetaData &md); - -} -Q_DECLARE_METATYPE(DCC_NAMESPACE::MetaData) diff --git a/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_42px.svg b/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_42px.svg deleted file mode 100644 index 28b7034307..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_42px.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - dcc_nav_keyboard_42px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_84px.svg b/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_84px.svg deleted file mode 100644 index 3d11c7e13e..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/qrc/icons/dcc_nav_keyboard_84px.svg +++ /dev/null @@ -1,59 +0,0 @@ - - - dcc_nav_keyboard_84px - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/dcc-old/src/plugin-keyboard/operation/qrc/icons/list_select.png b/dcc-old/src/plugin-keyboard/operation/qrc/icons/list_select.png deleted file mode 100644 index 886736105df8591d6a50568e75e8642c7d408e74..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 508 zcmVPx$wn;=mR5%fhQ#(ilK@fejcb7mAu`(8lAOu7qApSsNnKbDIJBxsY5G`!%?G({~ zAecU2txYTyL{S706;r9GXeEM0O!n5D)gv28qTB3z-kY7@5`LYbo$^3cQU*{dMd;OT zMGE%-66nfzIH+(=^=Yq!O1J6D-d_N zVG4f3ngb%=5f@lbxF|mOIDXMN08Ukkj4nZ?So`ZNkGm*KVEL?SK~+lpjLI?sU6DE! zGyM+6q5=y#bq*37=9(r32EO|{2)pSJ#-ra89_=J#;|`XNs(Adckw#WRFUg&4zIjvF zx|GOGdPsH)tW0>=zLGe2_HCGvdBJpRsHpoeXnXV55^Wx^mhf=!BuzluUz4fWa*VTs z4hpvt?`G#}G?sWPd5osec;R!yho7y7wAKVf?qWJLZ<@%v&Fk5kQu8vFIczZjc&B-{ yIVz`CgVsyzV@&W5*lS9#VGX`Bz9-fAJAVOTu&U0u{Yv=&0000Px(Qb|NXR9FeMmtANaRTRh1nNOo_LK(~q=Z+aN_P4F*#b3VuBK z;6p0}>WdG}L&UbA2o@2k4?d+D35XE1QfjKyB(<6>shUMk*fBY z>$TIvk6|`WXr5cVHT2S5l*zmSi2I4Cs<^i|iikIX=wmd^!#}m-AI0WG3h3w|ai&1Gro8P#@L7tTkS8wMVG!-lD;t zwJMBWci`o(voM?UsW<}_#(kr0IO%Dd<#S%@QHy{-zfp1FGCY2R@^CQ-OPJhH_G8Sp zuCcXJ4CQEzH3%nKbxu9P*t7%tzs!Q=6h_8d3Du}oexcmXa>7@c0LQj@@S7IF!GSQi zh@nbhD>m6}h1yE(^Mc`Miw&WwWG!WHrLp)qzVh5PaQA zgs#mV{OXLC`hY`3N7#}tenz*ZT7(aG>F~~W9Ui@Nv4{%hzP(+8J9LDM?G@dvSYHAz zlca9a(RhG=<}z8KA-wmv4hhc2!q&A(gY{M3zIP4f;3A*-xJ}r+1yoc(>N>%zXR_|< zR`4p{-=V|0N>9WK_p7kGp6^?3J>xd?{kCM$1+)oUQAimHSVKBP*9cx4$U)X2s5TKk zU=e%QDsZ6DgO5x((0$&&XF~!+n1qcDJ=tB3ZJ&zp37B`+EAZA<4HV38!*qtAqu+wb zzXPtZI*O{cDywR>GkhGTtzIaYuU0%`o0_3Z?!Z0>`-;Pu6 z`H>%d8+7{)ah|2Z-Pp`>ncVRXF#o7oZ5-p;`YI0mzxW74SbmIrIkV;A XJw9fJ6 zxY2hg?-PH;mB!|gJ^7-a&wzkrz(nIo-lLz(3+6KCm=b#-To?fXViP#(N3}>>Qh+~~?+AS4WVYERYU97*N&ezm!yjI*AOcKt qbx-jB^puL&ccDWc - - icons/dcc_nav_keyboard_42px.svg - icons/dcc_nav_keyboard_84px.svg - - - icons/list_select@2x.png - icons/list_select.png - - diff --git a/dcc-old/src/plugin-keyboard/operation/shortcutmodel.cpp b/dcc-old/src/plugin-keyboard/operation/shortcutmodel.cpp deleted file mode 100644 index 5facfaeac1..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/shortcutmodel.cpp +++ /dev/null @@ -1,367 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "shortcutmodel.h" - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -QStringList systemFilter = {"terminal", - "terminal-quake", - "global-search", - "screenshot", - "screenshot-delayed", - "screenshot-fullscreen", - "screenshot-window", - "screenshot-scroll", - "screenshot-ocr", - "deepin-screen-recorder", - "switch-group", - "switch-group-backward", - "preview-workspace", - "launcher", - "switch-applications", - "switch-applications-backward", - "show-desktop", - "file-manager", - "lock-screen", - "logout", - "wm-switcher", - "system-monitor", - "color-picker", - "clipboard", - "view-zoom-in", - "view-zoom-out", - "view-actual-size", -}; - -const QStringList &windowFilter = {"maximize", - "unmaximize", - "minimize", - "begin-move", - "begin-resize", - "close", - "toggle-to-left", - "toggle-to-right" -}; - -const QStringList &workspaceFilter = {"switch-to-workspace-left", - "switch-to-workspace-right", - "move-to-workspace-left", - "move-to-workspace-right"}; - -const QStringList &assistiveToolsFilter = {"ai-assistant", - "text-to-speech", - "speech-to-text", - "translation"}; - -using namespace DCC_NAMESPACE; -DCORE_USE_NAMESPACE -ShortcutModel::ShortcutModel(QObject *parent) - : QObject(parent) - , m_windowSwitchState(false) -{ - if (qApp->screens().count() > 1) { - systemFilter.append("switch-monitors"); - } -} - -ShortcutModel::~ShortcutModel() -{ - qDeleteAll(m_infos); - - m_infos.clear(); - m_systemInfos.clear(); - m_windowInfos.clear(); - m_workspaceInfos.clear(); - m_customInfos.clear(); - qDeleteAll(m_searchList); - m_searchList.clear(); -} - -QList ShortcutModel::systemInfo() const -{ - return m_systemInfos; -} - -QList ShortcutModel::windowInfo() const -{ - return m_windowInfos; -} - -QList ShortcutModel::workspaceInfo() const -{ - return m_workspaceInfos; -} - -QList ShortcutModel::assistiveToolsInfo() const -{ - return m_assistiveToolsInfos; -} - -QList ShortcutModel::customInfo() const -{ - return m_customInfos; -} - -QList ShortcutModel::infos() const -{ - return m_infos; -} - -void ShortcutModel::delInfo(ShortcutInfo *info) -{ - if (m_infos.contains(info)) { - m_infos.removeOne(info); - } - if (m_customInfos.contains(info)) { - m_customInfos.removeOne(info); - } - - delete info; - info = nullptr; -} - -void ShortcutModel::onParseInfo(const QString &info) -{ - QStringList systemShortKeys; - if (DSysInfo::UosServer == DSysInfo::uosType()) { - QStringList systemFilterServer = systemFilter; - systemFilterServer.removeOne("wm-switcher"); - systemFilterServer.removeOne("preview-workspace"); - systemShortKeys = systemFilterServer; - } else if (false == m_windowSwitchState) { - QStringList systemFilterServer = systemFilter; - systemFilterServer.removeOne("preview-workspace"); - systemShortKeys = systemFilterServer; - } else { - systemShortKeys = systemFilter; - } -#ifdef DISABLE_SCREEN_RECORDING - QStringList systemFilterServer = systemShortKeys; - systemFilterServer.removeOne("deepin-screen-recorder"); - systemShortKeys = systemFilterServer; -#endif - qDeleteAll(m_infos); - - m_infos.clear(); - m_systemInfos.clear(); - m_windowInfos.clear(); - m_workspaceInfos.clear(); - m_assistiveToolsInfos.clear(); - m_customInfos.clear(); - - QJsonArray array = QJsonDocument::fromJson(info.toStdString().c_str()).array(); - - Q_FOREACH (QJsonValue value, array) { - QJsonObject obj = value.toObject(); - int type = obj["Type"].toInt(); - - ShortcutInfo *info = new ShortcutInfo(); - info->type = type; - info->accels = obj["Accels"].toArray().first().toString(); - info->name = obj["Name"].toString(); - info->id = obj["Id"].toString(); - info->command = obj["Exec"].toString(); - - m_infos << info; - - if (type != MEDIAKEY) { - if (systemShortKeys.contains(info->id)) { - m_systemInfos << info; - continue; - } - if (windowFilter.contains(info->id)) { - m_windowInfos << info; - continue; - } - if (workspaceFilter.contains(info->id)) { - m_workspaceInfos << info; - continue; - } - if (assistiveToolsFilter.contains(info->id)) { - m_assistiveToolsInfos << info; - continue; - } - if (type == 1) { - m_customInfos << info; - } - } - } - - std::sort(m_systemInfos.begin(), m_systemInfos.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return systemShortKeys.indexOf(s1->id) < systemShortKeys.indexOf(s2->id); - }); - - std::sort(m_windowInfos.begin(), m_windowInfos.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return windowFilter.indexOf(s1->id) < windowFilter.indexOf(s2->id); - }); - - std::sort(m_workspaceInfos.begin(), m_workspaceInfos.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return workspaceFilter.indexOf(s1->id) < workspaceFilter.indexOf(s2->id); - }); - - std::sort(m_assistiveToolsInfos.begin(), m_assistiveToolsInfos.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return assistiveToolsFilter.indexOf(s1->id) < assistiveToolsFilter.indexOf(s2->id); - }); - - Q_EMIT listChanged(m_systemInfos, InfoType::System); - Q_EMIT listChanged(m_windowInfos, InfoType::Window); - Q_EMIT listChanged(m_workspaceInfos, InfoType::Workspace); - Q_EMIT listChanged(m_assistiveToolsInfos, InfoType::AssistiveTools); - Q_EMIT listChanged(m_customInfos, InfoType::Custom); -} - -void ShortcutModel::onCustomInfo(const QString &json) -{ - QJsonObject obj = QJsonDocument::fromJson(json.toStdString().c_str()).object(); - ShortcutInfo *info = new ShortcutInfo(); - info->type = obj["Type"].toInt(); - QString accels = obj["Accels"].toArray().at(0).toString(); - - info->accels = accels; - - info->name = obj["Name"].toString(); - info->id = obj["Id"].toString(); - info->command = obj["Exec"].toString(); - m_infos.append(info); - m_customInfos.append(info); - Q_EMIT addCustomInfo(info); -} - -void ShortcutModel::onKeyBindingChanged(const QString &value) -{ - const QJsonObject &obj = QJsonDocument::fromJson(value.toStdString().c_str()).object(); - const QString &update_id = obj["Id"].toString(); - auto res = std::find_if(m_infos.begin(), m_infos.end(), [ = ] (const ShortcutInfo *info)->bool{ - return info->id == update_id; - }); - - if (res != m_infos.end()) { - (*res)->type = obj["Type"].toInt(); - (*res)->accels = obj["Accels"].toArray().first().toString(); - (*res)->name = obj["Name"].toString(); - (*res)->command = obj["Exec"].toString(); - - Q_EMIT shortcutChanged((*res)); - } -} - -void ShortcutModel::onWindowSwitchChanged(bool value) -{ - if (m_windowSwitchState != value) { - m_windowSwitchState = value; - } -} - - bool ShortcutModel::getWindowSwitch() - { - return m_windowSwitchState; - } - -ShortcutInfo *ShortcutModel::currentInfo() const -{ - return m_currentInfo; -} - -void ShortcutModel::setCurrentInfo(ShortcutInfo *currentInfo) -{ - m_currentInfo = currentInfo; -} - -ShortcutInfo *ShortcutModel::getInfo(const QString &shortcut) -{ - auto res = std::find_if(m_infos.begin(), m_infos.end(), [ = ] (const ShortcutInfo *info)->bool{ - return !QString::compare(info->accels, shortcut, Qt::CaseInsensitive); //判断是否相等,相等则返回0 - }); - - if (res != m_infos.end()) { - return *res; - } - - return nullptr; -} - -void ShortcutModel::setSearchResult(const QString &searchResult) -{ - qDeleteAll(m_searchList); - m_searchList.clear(); - - QList systemInfoList; - QList windowInfoList; - QList workspaceInfoList; - QList customInfoList; - QList speechInfoList; - - QJsonArray array = QJsonDocument::fromJson(searchResult.toStdString().c_str()).array(); - for (auto value : array) { - QJsonObject obj = value.toObject(); - int type = obj["Type"].toInt(); - ShortcutInfo *info = new ShortcutInfo(); - info->type = type; - info->accels = obj["Accels"].toArray().first().toString(); - info->name = obj["Name"].toString(); - info->id = obj["Id"].toString(); - info->command = obj["Exec"].toString(); - - if (type != MEDIAKEY) { - if (systemFilter.contains(info->id)) { - systemInfoList << info; - continue; - } - if (windowFilter.contains(info->id)) { - windowInfoList << info; - continue; - } - if (workspaceFilter.contains(info->id)) { - workspaceInfoList << info; - continue; - } - if (assistiveToolsFilter.contains(info->id)) { - speechInfoList << info; - continue; - } - - if (type == 1) { - customInfoList << info; - }else{ - delete info; - info = nullptr; - } - - } else { - qDebug() << "not search is:" << info->name; - delete info; - info = nullptr; - } - } - - std::sort(systemInfoList.begin(), systemInfoList.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return systemFilter.indexOf(s1->id) < systemFilter.indexOf(s2->id); - }); - std::sort(windowInfoList.begin(), windowInfoList.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return windowFilter.indexOf(s1->id) < windowFilter.indexOf(s2->id); - }); - std::sort(workspaceInfoList.begin(), workspaceInfoList.end(), [ = ](ShortcutInfo *s1, ShortcutInfo *s2) { - return workspaceFilter.indexOf(s1->id) < workspaceFilter.indexOf(s2->id); - }); - m_searchList.append(systemInfoList); - m_searchList.append(windowInfoList); - m_searchList.append(workspaceInfoList); - m_searchList.append(speechInfoList); - m_searchList.append(customInfoList); - int i = 0; - for (auto search : m_searchList) { - qDebug() << "search" << ++i << " is: " << search->name; - } - - Q_EMIT searchFinished(m_searchList); -} diff --git a/dcc-old/src/plugin-keyboard/operation/shortcutmodel.h b/dcc-old/src/plugin-keyboard/operation/shortcutmodel.h deleted file mode 100644 index 75d6027a85..0000000000 --- a/dcc-old/src/plugin-keyboard/operation/shortcutmodel.h +++ /dev/null @@ -1,104 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef SHORTCUTMODEL_H -#define SHORTCUTMODEL_H - -#define MEDIAKEY 2 - -#include "interface/namespace.h" -#include - -namespace DCC_NAMESPACE { - -class ShortcutItem; -struct ShortcutInfo -{ - QString accels; - QString id; - QString name; - QString command; - int type; - ShortcutInfo *replace = nullptr; - ShortcutItem *item = nullptr; - - ShortcutInfo() - : type(0) - , replace(nullptr) - , item(nullptr) - { - } - bool operator==(const ShortcutInfo &info) const - { - return id == info.id && type == info.type; - } - - QString toString() - { - return name + accels + command + id + QString::number(type); - } -}; - -typedef QList ShortcutInfoList; - -class ShortcutModel : public QObject -{ - Q_OBJECT -public: - explicit ShortcutModel(QObject *parent = nullptr); - ~ShortcutModel(); - enum InfoType { - System, - Custom, - Media, - Window, - Workspace, - AssistiveTools, - }; - - QList systemInfo() const; - QList windowInfo() const; - QList workspaceInfo() const; - QList assistiveToolsInfo() const; - QList customInfo() const; - QList infos() const; - - void delInfo(ShortcutInfo *info); - - ShortcutInfo *currentInfo() const; - void setCurrentInfo(ShortcutInfo *currentInfo); - - ShortcutInfo *getInfo(const QString &shortcut); - void setSearchResult(const QString &searchResult); - bool getWindowSwitch(); -Q_SIGNALS: - void listChanged(QList, InfoType); - void addCustomInfo(ShortcutInfo *info); - void shortcutChanged(ShortcutInfo *info); - void keyEvent(bool press, const QString &shortcut); - void searchFinished(const QList searchResult); - void windowSwitchChanged(bool value); - -public Q_SLOTS: - void onParseInfo(const QString &info); - void onCustomInfo(const QString &json); - void onKeyBindingChanged(const QString &value); - void onWindowSwitchChanged(bool value); - -private: - QString m_info; - QList m_infos; - QList m_systemInfos; - QList m_windowInfos; - QList m_workspaceInfos; - QList m_assistiveToolsInfos; - QList m_customInfos; - QList m_searchList; - ShortcutInfo *m_currentInfo = nullptr; - bool m_windowSwitchState; - //dcc::display::DisplayModel m_dis; -}; - -} -#endif // SHORTCUTMODEL_H diff --git a/dcc-old/src/plugin-keyboard/window/KeyboardPlugin.json b/dcc-old/src/plugin-keyboard/window/KeyboardPlugin.json deleted file mode 100644 index f53d699afe..0000000000 --- a/dcc-old/src/plugin-keyboard/window/KeyboardPlugin.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "api": "1.0.0" -} \ No newline at end of file diff --git a/dcc-old/src/plugin-keyboard/window/customcontentdialog.cpp b/dcc-old/src/plugin-keyboard/window/customcontentdialog.cpp deleted file mode 100644 index c7cb7c4f5b..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customcontentdialog.cpp +++ /dev/null @@ -1,216 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "customcontentdialog.h" -#include "operation/keyboardwork.h" -#include "operation/shortcutmodel.h" -#include "operation/keyboardmodel.h" -#include "customitem.h" -#include "widgets/buttontuple.h" -#include "widgets/lineeditwidget.h" -#include "widgets/settingsgroup.h" - -#include - -#include -#include -#include - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -CustomContentDialog::CustomContentDialog(ShortcutModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_shortCutNameEdit(new DLineEdit(this)) - , m_shortCutCmdEdit(new DFileChooserEdit(this)) - , m_conflict(nullptr) - , m_model(model) - , m_buttonTuple(new ButtonTuple(ButtonTuple::Save, this)) -{ - setFixedSize(QSize(400, 388)); - QVBoxLayout *mainVLayout = new QVBoxLayout(); - mainVLayout->setContentsMargins(0, 0, 0, 5); - mainVLayout->setSpacing(0); - - QVBoxLayout *listVLayout = new QVBoxLayout(); - listVLayout->setAlignment(Qt::AlignHCenter); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - mainVLayout->addWidget(titleIcon); - - QLabel *shortCutTitle = new QLabel(tr("Add Custom Shortcut")); - DFontSizeManager::instance()->bind(shortCutTitle, DFontSizeManager::T5, QFont::DemiBold); // 设置label字体 - shortCutTitle->setAlignment(Qt::AlignCenter); - listVLayout->addWidget(shortCutTitle); - listVLayout->addSpacing(30); - - QLabel *shortCutName = new QLabel(tr("Name")); - QHBoxLayout *shortCutNameLayout = new QHBoxLayout; - shortCutNameLayout->addWidget(shortCutName); - shortCutNameLayout->setContentsMargins(10, 0, 0, 0); - listVLayout->addLayout(shortCutNameLayout); - - m_shortCutNameEdit->lineEdit()->setPlaceholderText(tr("Required")); - connect(m_shortCutNameEdit, &DLineEdit::textChanged, this, [this] { - if (!m_shortCutNameEdit->text().isEmpty()) { - m_shortCutNameEdit->setAlert(false); - } - }); - - listVLayout->addWidget(m_shortCutNameEdit); - listVLayout->addSpacing(4); - - QLabel *shortCutCmd = new QLabel(tr("Command")); - QHBoxLayout *shortCutCmdLayout = new QHBoxLayout; - shortCutCmdLayout->addWidget(shortCutCmd); - shortCutCmdLayout->setContentsMargins(10, 0, 0, 0); - listVLayout->addLayout(shortCutCmdLayout); - - // TODO: DFileChooserEdit控件包含有button按钮,点击触发QFileDialog文件弹窗,其为exec模态显示。 - // 该显示方式方式会触发程序异常崩溃,具体详情为当控制中心存在exec()模态显示的对话框界面时,若通过dbus调用切换菜单时,会导致程序崩溃。 - // 模态对话框处于事件监听阻塞状态没有被主动关闭,此时触发切换其他界面则会使阻塞的模态对话框关闭异常而导致程序崩溃。 - // 目前该DFileChooserEdit控件类会触发上诉所描述问题,暂时未解决,待后续完善。。 - m_shortCutCmdEdit->lineEdit()->setPlaceholderText(tr("Required")); - m_shortCutNameEdit->setAccessibleName("SHORTCUT_NAME_EDIT"); - m_shortCutCmdEdit->setAccessibleName("SHORTCUT_CMD_EDIT"); - - connect(m_shortCutCmdEdit, &DFileChooserEdit::textChanged, this, [this] { - if (!m_shortCutCmdEdit->text().isEmpty()) { - m_shortCutCmdEdit->setAlert(false); - } - }); - - connect(m_shortCutNameEdit, &DFileChooserEdit::textChanged, this, [this] { - bool exist = false; - QList lstInfo; - lstInfo.append(m_model->customInfo()); - lstInfo.append(m_model->assistiveToolsInfo()); - lstInfo.append(m_model->systemInfo()); - lstInfo.append(m_model->workspaceInfo()); - for (auto info : lstInfo) { - if (!info->name.compare(m_shortCutNameEdit->text(),Qt::CaseSensitive)) { - exist = true; - break; - } - } - m_buttonTuple->rightButton()->setEnabled(!exist); - }); - - listVLayout->addWidget(m_shortCutCmdEdit); - listVLayout->addSpacing(15); - - m_shortcut = new CustomItem; - m_shortcut->setShortcut(""); - m_shortcut->addBackground(); - - listVLayout->addWidget(m_shortcut); - - QPushButton *cancel = m_buttonTuple->leftButton(); - cancel->setText(tr("Cancel")); - QPushButton *ok = m_buttonTuple->rightButton(); - ok->setText(tr("Add")); - - m_bottomTip = new QLabel(); - m_bottomTip->setWordWrap(true); - m_bottomTip->hide(); - - listVLayout->addStretch(); - listVLayout->addWidget(m_buttonTuple); - listVLayout->addWidget(m_bottomTip); - listVLayout->setContentsMargins(20, 10, 20, 10); - - mainVLayout->addLayout(listVLayout); - setLayout(mainVLayout); - setContentsMargins(0, 0, 0, 0); - - connect(cancel, &QPushButton::clicked, this, &CustomContentDialog::close); - connect(ok, &QPushButton::clicked, this, &CustomContentDialog::onShortcut); - connect(m_shortcut, &CustomItem::requestUpdateKey, this, &CustomContentDialog::updateKey); - connect(model, &ShortcutModel::keyEvent, this, &CustomContentDialog::keyEvent); - connect(m_shortcut, &CustomItem::changeAlert, this, [this] { - m_shortcut->setAlert(false); - }); -} - -void CustomContentDialog::keyPressEvent(QKeyEvent *e) { - switch (e->key()) { - case Qt::Key_Enter: - case Qt::Key_Return: { - m_buttonTuple->rightButton()->click(); - return; - } - } - - DAbstractDialog::keyReleaseEvent(e); -} - -void CustomContentDialog::setBottomTip(ShortcutInfo *conflict) -{ - m_conflict = conflict; - if (conflict) { - QString accels = conflict->accels; - accels = accels.replace("<", ""); - accels = accels.replace(">", "+"); - accels = accels.replace("_L", ""); - accels = accels.replace("_R", ""); - accels = accels.replace("Control", "Ctrl"); - - QString str = tr("This shortcut conflicts with %1, click on Add to make this shortcut effective immediately") - .arg(QString("%1 %2").arg(conflict->name).arg(QString("[%1]").arg(accels))); - m_bottomTip->setText(str); - m_bottomTip->show(); - } else { - m_bottomTip->clear(); - m_bottomTip->hide(); - } -} - -void CustomContentDialog::onShortcut() -{ - m_shortCutNameEdit->setAlert(m_shortCutNameEdit->text().isEmpty()); - m_shortCutCmdEdit->setAlert(m_shortCutCmdEdit->lineEdit()->text().isEmpty()); - m_shortcut->setAlert(m_shortcut->text().isEmpty()); - - if (m_shortcut->text().isEmpty() || m_shortCutCmdEdit->lineEdit()->text().isEmpty() || m_shortCutNameEdit->text().isEmpty()) { - return; - } - - if (m_conflict) - Q_EMIT requestForceSubs(m_conflict); - - Q_EMIT requestAddKey(m_shortCutNameEdit->text(), m_shortCutCmdEdit->text(), m_shortcut->text()); - accept(); -} - -void CustomContentDialog::keyEvent(bool press, const QString &shortcut) -{ - if (!press) { - if (shortcut.isEmpty() || shortcut == "BackSpace" || shortcut == "Delete") { - m_shortcut->setShortcut(""); - setBottomTip(nullptr); - return; - } - - // check conflict - ShortcutInfo *conflict = m_model->getInfo(shortcut); - setBottomTip(conflict); - } - - m_shortcut->setShortcut(shortcut); -} - -void CustomContentDialog::updateKey() -{ - Q_EMIT requestUpdateKey(nullptr); -} diff --git a/dcc-old/src/plugin-keyboard/window/customcontentdialog.h b/dcc-old/src/plugin-keyboard/window/customcontentdialog.h deleted file mode 100644 index f2872d303b..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customcontentdialog.h +++ /dev/null @@ -1,55 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#pragma once -#include "interface/namespace.h" - -#include -#include -#include - -class QLabel; -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { -class ShortcutModel; -struct ShortcutInfo; -class KeyboardWorker; -class CustomItem; - -class SettingsGroup; -class LineEditWidget; -class ButtonTuple; - -class CustomContentDialog : public DAbstractDialog -{ - Q_OBJECT -public: - explicit CustomContentDialog(ShortcutModel *model, QWidget *parent = nullptr); - void setBottomTip(ShortcutInfo *conflict); - -protected: - void keyPressEvent(QKeyEvent *e) override; - -Q_SIGNALS: - void requestAddKey(const QString &name, const QString &command, const QString &accels); - void requestUpdateKey(ShortcutInfo *info); - void requestForceSubs(ShortcutInfo *info); - void requestFrameAutoHide(const bool autoHide) const; - -public Q_SLOTS: - void onShortcut(); - void keyEvent(bool press, const QString &shortcut); - void updateKey(); - -private: - KeyboardWorker *m_work; - CustomItem *m_shortcut; - DTK_WIDGET_NAMESPACE::DLineEdit *m_shortCutNameEdit; - DTK_WIDGET_NAMESPACE::DFileChooserEdit *m_shortCutCmdEdit; - QLabel *m_bottomTip; - ShortcutInfo *m_conflict; - ShortcutModel *m_model; - ButtonTuple *m_buttonTuple; -}; -} diff --git a/dcc-old/src/plugin-keyboard/window/customedit.cpp b/dcc-old/src/plugin-keyboard/window/customedit.cpp deleted file mode 100644 index dab9657ae3..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customedit.cpp +++ /dev/null @@ -1,179 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "customedit.h" -#include "customitem.h" -#include -#include -#include -#include - -#include -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; -CustomEdit::CustomEdit(ShortcutModel *model, QWidget *parent): - DAbstractDialog(parent), - m_model(model), - m_commandGroup(new SettingsGroup), - m_name(new LineEditWidget), - m_command(new LineEditWidget), - m_short(new CustomItem()), - m_tip(new QLabel), - m_conflict(nullptr) -{ - setFixedSize(QSize(400, 388)); - m_tip->setVisible(false); - m_tip->setWordWrap(true); - - QVBoxLayout *mainlayout = new QVBoxLayout; - QHBoxLayout *buttonlayout = new QHBoxLayout; - - mainlayout->setMargin(0); - buttonlayout->setMargin(0); - mainlayout->setSpacing(0); - buttonlayout->setSpacing(1); - - m_command->setPlaceholderText(tr("Required")); - DIconButton *pushbutton = new DIconButton(this); - pushbutton->setIcon(DStyleHelper(style()).standardIcon(DStyle::SP_SelectElement, nullptr)); - pushbutton->setBackgroundRole(QPalette::ColorRole::Highlight); - pushbutton->setIconSize(QSize(24, 24)); - m_command->addRightWidget(pushbutton); - - m_commandGroup->appendItem(m_name); - m_commandGroup->appendItem(m_command); - m_commandGroup->appendItem(m_short); - - QPushButton *cancelButton = new QPushButton(tr("Cancel")); - QPushButton *okButton = new QPushButton(tr("Save")); - - buttonlayout->addWidget(cancelButton); - buttonlayout->addWidget(okButton); - - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - mainlayout->addWidget(titleIcon); - mainlayout->addSpacing(10); - mainlayout->addWidget(m_commandGroup); - mainlayout->addWidget(m_tip); - mainlayout->addStretch(); - mainlayout->addLayout(buttonlayout); - mainlayout->setContentsMargins(20, 10, 20, 10); - - setLayout(mainlayout); - - connect(cancelButton, &QPushButton::clicked, this, &CustomEdit::reject); - connect(pushbutton, &DIconButton::clicked, this, &CustomEdit::onOpenFile); - connect(m_short, &CustomItem::requestUpdateKey, this, &CustomEdit::onUpdateKey); - connect(okButton, &QPushButton::clicked, this, &CustomEdit::onSaveAccels); - - connect(model, &ShortcutModel::keyEvent, this, &CustomEdit::keyEvent); -} - -void CustomEdit::setShortcut(ShortcutInfo *info) -{ - m_info = info; - - m_short->setTitle(tr("Shortcut")); - m_short->setShortcut(info->accels); - - m_name->setTitle(tr("Name")); - m_command->setTitle(tr("Command")); - - m_name->setText(m_info->name); - m_command->setText(m_info->command); -} - -void CustomEdit::setBottomTip(ShortcutInfo *conflict) -{ - m_conflict = conflict; - if (conflict) { - QString accels = conflict->accels; - accels = accels.replace("<", "["); - accels = accels.replace(">", "+"); - accels = accels.replace("_L",""); - accels = accels.replace("_R", ""); - accels = accels.replace("Control", "Ctrl"); - - QString str = tr("This shortcut conflicts with %1, click on Add to make this shortcut effective immediately") - .arg(QString("%1 %2").arg(conflict->name).arg(QString("[%1]").arg(accels))); - m_tip->setText(str); - m_tip->setVisible(true); - } else { - m_tip->setVisible(false); - } -} - -void CustomEdit::keyEvent(bool press, const QString &shortcut) -{ - m_short->setShortcut(shortcut); - - if (!press) { - - if (shortcut.isEmpty()) { - m_short->setShortcut(m_info->accels); - setBottomTip(nullptr); - return; - } - - if (shortcut == "BackSpace" || shortcut == "Delete") { - m_short->setShortcut(""); - setBottomTip(nullptr); - return; - } - - // check conflict - ShortcutInfo *info = m_model->getInfo(shortcut); - if (info && info != m_info && info->accels != m_info->accels) { - setBottomTip(info); - return; - } - setBottomTip(nullptr); - } -} - -void CustomEdit::onOpenFile() -{ - Q_EMIT requestFrameAutoHide(false); - - QString file = QFileDialog::getOpenFileName(this, "", "/usr/bin"); - m_command->setText(file); - - Q_EMIT requestFrameAutoHide(true); -} - -void CustomEdit::onSaveAccels() -{ - if (m_name->text().isEmpty()) - m_name->setIsErr(true); - - if (m_command->text().isEmpty()) - m_command->setIsErr(true); - - if (m_name->text().isEmpty() || m_command->text().isEmpty() || m_short->text().isEmpty()) - return; - - if (m_conflict) { - m_info->replace = m_conflict; - } - - m_info->name = m_name->text(); - m_info->command = m_command->text(); - m_info->accels = m_short->text(); - - Q_EMIT requestSaveShortcut(m_info); - - accept(); -} - -void CustomEdit::onUpdateKey() -{ - Q_EMIT requestUpdateKey(nullptr); -} diff --git a/dcc-old/src/plugin-keyboard/window/customedit.h b/dcc-old/src/plugin-keyboard/window/customedit.h deleted file mode 100644 index 11f59df334..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customedit.h +++ /dev/null @@ -1,51 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef CUSTOMEDIT_H -#define CUSTOMEDIT_H - -#include "interface/namespace.h" -#include "widgets/settingsgroup.h" -#include "widgets/lineeditwidget.h" -#include "shortcutitem.h" -#include "operation/shortcutmodel.h" -#include -#include - -namespace DCC_NAMESPACE { -struct ShortcutInfo; -class CustomItem; -class CustomEdit : public DTK_WIDGET_NAMESPACE::DAbstractDialog -{ - Q_OBJECT -public: - explicit CustomEdit(ShortcutModel *model, QWidget *parent = nullptr); - void setShortcut(ShortcutInfo* info); - -Q_SIGNALS: - void requestUpdateKey(ShortcutInfo *info); - void requestSaveShortcut(ShortcutInfo *info); - void requestFrameAutoHide(const bool autoHide) const; - -public Q_SLOTS: - void setBottomTip(ShortcutInfo *conflict); - void keyEvent(bool press, const QString &shortcut); - -private Q_SLOTS: - void onOpenFile(); - void onSaveAccels(); - void onUpdateKey(); - -private: - ShortcutModel *m_model; - SettingsGroup *m_commandGroup; - LineEditWidget *m_name; - LineEditWidget *m_command; - CustomItem *m_short; - ShortcutInfo *m_info; - QLabel *m_tip; - ShortcutInfo *m_conflict; -}; -} - -#endif // CUSTOMEDIT_H diff --git a/dcc-old/src/plugin-keyboard/window/customitem.cpp b/dcc-old/src/plugin-keyboard/window/customitem.cpp deleted file mode 100644 index cd2035a83b..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customitem.cpp +++ /dev/null @@ -1,110 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#include "customitem.h" - -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -CustomItem::CustomItem(QWidget *parent) - : SettingsItem(parent) - , isAlert(false) -{ - setMouseTracking(true); - QHBoxLayout *layout = new QHBoxLayout(); - layout->setContentsMargins(4, 4, 4, 4); - layout->setSpacing(2); - - m_title = new QLabel(); - m_title->setText(tr("Shortcut")); - m_title->setAlignment(Qt::AlignCenter); - - layout->addWidget(m_title); - layout->setAlignment(m_title, Qt::AlignLeft); - layout->addStretch(); - - m_shortKey = new ShortcutKey; - m_shortKey->setAccessibleName("SHORTCUT_KEY"); - layout->addWidget(m_shortKey); - m_shortKey->setTextList(QStringList()); - - m_shortcutEdit = new QLineEdit(this); - m_shortcutEdit->setReadOnly(true); - m_shortcutEdit->hide(); - m_shortcutEdit->installEventFilter(this); - m_shortcutEdit->setAccessibleName("SHORTCUT_EDIT"); - layout->addWidget(m_shortcutEdit); - - setLayout(layout); - setFixedHeight(36); - -} - -void CustomItem::setTitle(const QString &title) -{ - m_title->setText(title); -} - -void CustomItem::setShortcut(const QString &shortcut) -{ - m_accels = shortcut; - - QString list = shortcut; - list = list.replace("<", ""); - list = list.replace(">", "-"); - list = list.replace("_L", ""); - list = list.replace("_R", ""); - list = list.replace("Control", "Ctrl"); - - m_shortKey->setTextList(list.split("-")); - m_shortcutEdit->hide(); - m_shortKey->show(); - Q_EMIT changeAlert(); -} - -QString CustomItem::text() const -{ - return m_accels; -} - -void CustomItem::setAlert(bool isAlert) -{ - this->isAlert = isAlert; - update(); -} - -void CustomItem::mouseReleaseEvent(QMouseEvent *e) -{ - if (!m_shortcutEdit->isVisible() && m_shortKey->rect().contains(m_shortKey->mapFromParent(e->pos()))) { - m_shortKey->hide(); - m_shortcutEdit->clear(); - m_shortcutEdit->setFocus(); - m_shortcutEdit->show(); - m_shortcutEdit->setPlaceholderText(tr("Please enter a shortcut")); - - Q_EMIT requestUpdateKey(); - } else { - m_shortKey->show(); - m_shortcutEdit->hide(); - } -} - -void CustomItem::paintEvent(QPaintEvent *event) -{ - QPainter p(this); - if (isAlert) { - p.setPen(Qt::NoPen); - p.setBrush(QColor(241, 57, 50, qRound(0.15 * 255))); - const float Radius = 15.0f; - p.drawRoundedRect(rect(), int(Radius / rect().width() * 100), int(Radius / rect().height() * 100)); - } - QWidget::paintEvent(event); -} - diff --git a/dcc-old/src/plugin-keyboard/window/customitem.h b/dcc-old/src/plugin-keyboard/window/customitem.h deleted file mode 100644 index 5fb783ee09..0000000000 --- a/dcc-old/src/plugin-keyboard/window/customitem.h +++ /dev/null @@ -1,47 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef CUSTOMITEM_H -#define CUSTOMITEM_H - -#include -#include -#include - -#include "interface/namespace.h" -#include "shortcutitem.h" -#include "widgets/settingsitem.h" - -class ShortcutKey; - -namespace DCC_NAMESPACE { -class CustomItem : public SettingsItem -{ - Q_OBJECT -public: - explicit CustomItem(QWidget *parent = nullptr); - - void setTitle(const QString &title); - void setShortcut(const QString &shortcut); - void setAlert(bool isAlert); - QString text() const; - -Q_SIGNALS: - void requestUpdateKey(); - void changeAlert(); - -protected: - void mouseReleaseEvent(QMouseEvent *e) override; - void paintEvent(QPaintEvent *event) override; - -private: - QLabel *m_title; - QLineEdit *m_shortcutEdit; - QString m_accels; - ShortcutKey *m_shortKey; - bool isAlert; -}; -} - -#endif // CUSTOMITEM_H diff --git a/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.cpp b/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.cpp deleted file mode 100644 index 9c55546ef6..0000000000 --- a/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.cpp +++ /dev/null @@ -1,131 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "generalkbsettingwidget.h" -#include "widgets/dccslider.h" -#include "widgets/settingsgroup.h" -#include "widgets/titledslideritem.h" -#include "widgets/switchwidget.h" -#include "widgets/settingshead.h" -#include "widgets/settingsheaderitem.h" -#include "src/plugin-keyboard/operation/keyboardmodel.h" - -#include -#include -#include - - -#define GSETTINGS_NUMLOCK_ENABLE "keyboardGeneralNumlockEnable" -using namespace DCC_NAMESPACE; - -GeneralKBSettingWidget::GeneralKBSettingWidget(KeyboardModel *model, QWidget *parent) - : QWidget(parent) - , m_model(model) -{ - SettingsHead *systemHead = new SettingsHead(); - systemHead->setEditEnable(false); - systemHead->setTitle(tr("Keyboard Settings")); - systemHead->layout()->setContentsMargins(10, 0, 10, 0); - m_generalSettingsGrp = new SettingsGroup(); - m_generalSettingsGrp->appendItem(systemHead, SettingsGroup::NoneBackground); - TitledSliderItem *delayItem = new TitledSliderItem(tr("Repeat Delay")); - delayItem->setObjectName("RepeatDelay"); - m_delaySlider = delayItem->slider(); - m_delaySlider->setType(DCCSlider::Vernier); - m_delaySlider->setOrientation(Qt::Horizontal); - m_delaySlider->setRange(1, 7); - m_delaySlider->setTickInterval(1); - m_delaySlider->setPageStep(1); - m_delaySlider->setTickPosition(QSlider::TicksBelow); - QStringList delays; - delays << tr("Short") << "" << "" << "" << "" << ""; - delays << tr("Long"); - delayItem->setAnnotations(delays); - m_generalSettingsGrp->appendItem(delayItem); - TitledSliderItem *speedItem = new TitledSliderItem(tr("Repeat Rate")); - speedItem->setObjectName("RepeatRate"); - speedItem->setFocusPolicy(Qt::ClickFocus); - m_speedSlider = speedItem->slider(); - m_speedSlider->setType(DCCSlider::Vernier); - m_speedSlider->setOrientation(Qt::Horizontal); - m_speedSlider->setRange(1, 7); - m_speedSlider->setTickInterval(1); - m_speedSlider->setPageStep(1); - m_speedSlider->setTickPosition(QSlider::TicksBelow); - QStringList speeds; - speeds << tr("Slow") << "" << "" << "" << "" << ""; - speeds << tr("Fast"); - speedItem->setAnnotations(speeds); - - m_testArea = new DLineEdit(); - m_testArea->setFixedWidth(200); - m_testArea->lineEdit()->setPlaceholderText(tr("Test here")); - m_testArea->lineEdit()->setAlignment(Qt::AlignCenter); - m_testArea->setClearButtonEnabled(false); - DStyle::setFocusRectVisible(m_testArea->lineEdit(), false); - - auto pa = DPaletteHelper::instance()->palette(m_testArea); - pa.setColor(DPalette::Button, Qt::transparent); - DPaletteHelper::instance()->setPalette(m_testArea, pa); - - // adding extra stuff to speedItem - QVBoxLayout *speedItemLayout = qobject_cast(speedItem->layout()); - speedItemLayout->addSpacing(10); - speedItemLayout->addWidget(m_testArea); - speedItemLayout->setAlignment(m_testArea, Qt::AlignHCenter); - speedItemLayout->addSpacing(10); - speedItem->setFixedHeight(speedItemLayout->sizeHint().height()); - - m_generalSettingsGrp->appendItem(speedItem); - - m_numLock = new SwitchWidget; - m_numLock->setTitle(tr("Numeric Keypad")); - m_numLock->setObjectName("NumLock"); - m_generalSettingsGrp->appendItem(m_numLock); - - m_upper = new SwitchWidget(); - m_upper->setTitle(tr("Caps Lock Prompt")); - m_upper->setObjectName("Upper"); - m_generalSettingsGrp->appendItem(m_upper); - - m_contentLayout = new QVBoxLayout(); - m_contentLayout->setMargin(0); - m_contentLayout->addWidget(m_generalSettingsGrp); - m_contentLayout->addStretch(); - - setLayout(m_contentLayout); - setContentsMargins(0, 10, 0, 10); - - connect(m_delaySlider, &DCCSlider::valueChanged, this, &GeneralKBSettingWidget::requestKBDelayChanged); - connect(m_speedSlider, &DCCSlider::valueChanged, this, &GeneralKBSettingWidget::requestKBSpeedChanged); - connect(m_numLock, &SwitchWidget::checkedChanged, this, &GeneralKBSettingWidget::requestNumLockChanged); - connect(m_upper, &SwitchWidget::checkedChanged, this, &GeneralKBSettingWidget::requestCapsLockChanged); - - connect(m_model, &KeyboardModel::repeatDelayChanged, this, &GeneralKBSettingWidget::setDelayValue); - connect(m_model, &KeyboardModel::repeatIntervalChanged, this, &GeneralKBSettingWidget::setSpeedValue); - connect(m_model, &KeyboardModel::capsLockChanged, m_upper, &SwitchWidget::setChecked); - connect(m_model, &KeyboardModel::numLockChanged, m_numLock, &SwitchWidget::setChecked); - connect(m_testArea, &DLineEdit::focusChanged, this, [ = ] { - m_testArea->clear(); - m_testArea->update(); - }); - - setDelayValue(m_model->repeatDelay()); - setSpeedValue(m_model->repeatInterval()); - m_upper->setChecked(m_model->capsLock()); - m_numLock->setChecked(m_model->numLock()); -} - -void GeneralKBSettingWidget::setDelayValue(uint value) -{ - m_delaySlider->blockSignals(true); - m_delaySlider->setValue(static_cast(value)); - m_delaySlider->blockSignals(false); -} - -void GeneralKBSettingWidget::setSpeedValue(uint value) -{ - m_speedSlider->blockSignals(true); - m_speedSlider->setValue(static_cast(value)); - m_speedSlider->blockSignals(false); -} diff --git a/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.h b/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.h deleted file mode 100644 index 499a119725..0000000000 --- a/dcc-old/src/plugin-keyboard/window/generalkbsettingwidget.h +++ /dev/null @@ -1,48 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef GENERALKBSETTINGWIDGET_H -#define GENERALKBSETTINGWIDGET_H - -#include "interface/namespace.h" -#include -#include - -#include -#include -#include - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { -class KeyboardModel; - -class SettingsGroup; -class SwitchWidget; -class DCCSlider; -class GLineEdit; - -class GeneralKBSettingWidget : public QWidget -{ - Q_OBJECT -public: - explicit GeneralKBSettingWidget(KeyboardModel *model, QWidget *parent = nullptr); -Q_SIGNALS: - void requestKBDelayChanged(const int value); - void requestKBSpeedChanged(const int value); - void requestNumLockChanged(const bool state); - void requestCapsLockChanged(const bool state); -private Q_SLOTS: - void setDelayValue(uint value); - void setSpeedValue(uint value); -private: - DCCSlider *m_delaySlider; - DCCSlider *m_speedSlider; - SwitchWidget *m_upper; - SwitchWidget *m_numLock; - SettingsGroup *m_generalSettingsGrp; - KeyboardModel *m_model; - QVBoxLayout *m_contentLayout; - DLineEdit *m_testArea; -}; -} -#endif // GENERALKBSETTINGWIDGET_H diff --git a/dcc-old/src/plugin-keyboard/window/indexmodel.cpp b/dcc-old/src/plugin-keyboard/window/indexmodel.cpp deleted file mode 100644 index d2cbdf1271..0000000000 --- a/dcc-old/src/plugin-keyboard/window/indexmodel.cpp +++ /dev/null @@ -1,66 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "indexmodel.h" -#include - -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -IndexModel::IndexModel(QObject *parent) - : QStandardItemModel(parent) -{ -} - -void IndexModel::setMetaData(const QList &datas) -{ - beginResetModel(); - m_datas = datas; - for (int i = 0; i < m_datas.size(); ++i) { - DStandardItem *item = new DStandardItem(m_datas[i].text()); - item->setData(QVariant::fromValue(m_datas[i]), KBLayoutRole); - appendRow(item); - } - endResetModel(); -} - -QList IndexModel::metaData() const -{ - return m_datas; -} - -int IndexModel::indexOf(const MetaData &md) -{ - int index = 0; - QList::iterator it = m_datas.begin(); - for (; it != m_datas.end(); ++it) { - if ((*it) == md && (*it).section()) { - return index; - } - index++; - } - - return -1; -} - -void IndexModel::setLetters(QList &letters) -{ - m_letters = letters; -} - -QList IndexModel::letters() const -{ - return m_letters; -} - -int IndexModel::rowCount(const QModelIndex &parent) const -{ - Q_UNUSED(parent); - - return m_datas.count(); -} - -int IndexModel::getModelCount() -{ - return m_datas.count(); -} diff --git a/dcc-old/src/plugin-keyboard/window/indexmodel.h b/dcc-old/src/plugin-keyboard/window/indexmodel.h deleted file mode 100644 index 911dd57cca..0000000000 --- a/dcc-old/src/plugin-keyboard/window/indexmodel.h +++ /dev/null @@ -1,47 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INDEXMODEL_H -#define INDEXMODEL_H -#include "interface/namespace.h" -#include "operation/metadata.h" - -#include - -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { - -class IndexModel : public QStandardItemModel -{ - Q_OBJECT - -public: - explicit IndexModel(QObject *parent = nullptr); - - void setMetaData(const QList &datas); - QList metaData() const; - int indexOf(const MetaData &md); - - void setLetters(QList &letters); - QList letters() const; - int getModelCount(); - -protected: - int rowCount(const QModelIndex &parent) const; -private: - QList m_datas; - QList m_letters; -public: - enum { - KBLayoutRole = Dtk::UserRole + 1, - }; -}; - -} -#endif // INDEXMODEL_H diff --git a/dcc-old/src/plugin-keyboard/window/indexview.cpp b/dcc-old/src/plugin-keyboard/window/indexview.cpp deleted file mode 100644 index 9679da70bd..0000000000 --- a/dcc-old/src/plugin-keyboard/window/indexview.cpp +++ /dev/null @@ -1,50 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "indexview.h" -#include "indexmodel.h" -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -IndexView::IndexView(QWidget *parent) - :DListView(parent) -{ - setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - setVerticalScrollMode(ScrollPerPixel); -} - -void IndexView::onClick(const QString &ch) -{ - IndexModel * model = qobject_cast(this->model()); - MetaData md; - md.setText(ch); - - int index = model->indexOf(md); - if(index != -1) { - scrollTo(model->index(index,0),QAbstractItemView::PositionAtTop); - } -} - -void IndexView::showEvent(QShowEvent *e) -{ - QVariant var = indexAt(QPoint(5,10)).data(); - MetaData md = var.value(); - if(md.pinyin().count() > 0) - m_section = md.pinyin().at(0).toUpper(); - - QListView::showEvent(e); -} - -void IndexView::scrollContentsBy(int dx, int dy) -{ - QVariant var = indexAt(QPoint(5,10)).data(); - MetaData md = var.value(); - if(md.pinyin().count() > 0) - m_section = md.pinyin().at(0).toUpper(); - - QListView::scrollContentsBy(dx,dy); -} diff --git a/dcc-old/src/plugin-keyboard/window/indexview.h b/dcc-old/src/plugin-keyboard/window/indexview.h deleted file mode 100644 index 738d07f334..0000000000 --- a/dcc-old/src/plugin-keyboard/window/indexview.h +++ /dev/null @@ -1,32 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef INDEXVIEW_H -#define INDEXVIEW_H -#include "interface/namespace.h" -#include -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE{ -class IndexView : public DListView -{ - Q_OBJECT - -public: - explicit IndexView(QWidget* parent = nullptr); - -public Q_SLOTS: - void onClick(const QString& ch); - -protected: - void showEvent(QShowEvent* e); - void scrollContentsBy(int dx, int dy); - -private: - QString m_section; - QLabel* m_label; -}; -} -#endif // INDEXVIEW_H diff --git a/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.cpp b/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.cpp deleted file mode 100644 index b9e61e6983..0000000000 --- a/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.cpp +++ /dev/null @@ -1,263 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "kblayoutsettingwidget.h" - -#include "src/plugin-keyboard/operation/keyboardmodel.h" -#include "src/plugin-keyboard/window/keylabel.h" -#include "widgets/comboxwidget.h" -#include "widgets/settingsgroup.h" -#include "widgets/settingsitem.h" - -#include - -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; - -KBLayoutSettingWidget::KBLayoutSettingWidget(QWidget *parent) - : QWidget(parent) - , m_bEdit(false) - , m_kbLayoutListView(new KBLayoutListView(this)) - , m_addLayoutAction(nullptr) -{ - QVBoxLayout *mainLayout = new QVBoxLayout(); - QHBoxLayout *headLayout = new QHBoxLayout(); - - TitleLabel *headTitle = new TitleLabel(tr("Keyboard Layout")); - DFontSizeManager::instance()->bind(headTitle, - DFontSizeManager::T5, - QFont::DemiBold); // 设置label字体 - headLayout->addWidget(headTitle); - headTitle->setContentsMargins(10, 0, 0, 0); - - m_editKBLayout = new DCommandLinkButton(tr("Edit")); - m_editKBLayout->setObjectName("Edit"); - headLayout->addStretch(); - headLayout->addWidget(m_editKBLayout); - mainLayout->addLayout(headLayout); - - m_kbLayoutModel = new QStandardItemModel(m_kbLayoutListView); - m_kbLayoutModel->setObjectName("KbLayoutModel"); - m_kbLayoutListView->setAccessibleName("List_kblayoutlist"); - m_kbLayoutListView->setObjectName("KbLayoutListView"); - m_kbLayoutListView->setModel(m_kbLayoutModel); - - DStandardItem *footItem = new DStandardItem(tr("Add Keyboard Layout") + "..."); - footItem->setTextColorRole(DPalette::Highlight); - m_kbLayoutModel->appendRow(footItem); - - QMargins itemMargins(m_kbLayoutListView->itemMargins()); - itemMargins.setLeft(10); - m_kbLayoutListView->setItemMargins(itemMargins); - m_kbLayoutListView->setContentsMargins(0, 0, 0, 0); - mainLayout->addWidget(m_kbLayoutListView); - mainLayout->setAlignment(Qt::AlignTop); - mainLayout->setSpacing(10); - mainLayout->setContentsMargins(0, 0, 0, 0); - setLayout(mainLayout); - - connect(m_editKBLayout, &QPushButton::clicked, this, &KBLayoutSettingWidget::onEditClicked); - connect(m_kbLayoutListView, - &DListView::clicked, - this, - &KBLayoutSettingWidget::onKBLayoutChanged); - connect(m_kbLayoutListView, - &KBLayoutListView::currentChangedSignal, - this, - &KBLayoutSettingWidget::onKBCurrentChanged); -} - -void KBLayoutSettingWidget::setModel(KeyboardModel *model) -{ - m_model = model; - - connect(model, &KeyboardModel::userLayoutChanged, this, &KBLayoutSettingWidget::onAddKeyboard); - connect(model, &KeyboardModel::curLayoutChanged, this, &KBLayoutSettingWidget::onDefault); - - QMap map = model->userLayout(); - - for (auto i(map.begin()); i != map.end(); ++i) { - onAddKeyboard(i.key(), i.value()); - } -} - -void KBLayoutSettingWidget::onUpdateKBLayoutList() -{ - QMap map = m_model->userLayout(); - - for (auto i(map.begin()); i != map.end(); ++i) { - onAddKeyboard(i.key(), i.value()); - } - - m_bEdit = true; - onEditClicked(); -} - -void KBLayoutSettingWidget::onAddKeyboard(const QString &id, const QString &value) -{ - if (m_kbLangList.contains(id)) - return; - DStandardItem *kbLayoutItem = new DStandardItem(value); - kbLayoutItem->setData(id, KBLangIdRole); - // 去除最后一个item - DStandardItem *endItem = nullptr; - if (m_kbLayoutModel->rowCount() > 0) { - endItem = dynamic_cast( - m_kbLayoutModel->takeItem(m_kbLayoutModel->rowCount() - 1, 0)); - m_kbLayoutModel->removeRow(m_kbLayoutModel->rowCount() - 1); - } - - // 按用户键盘布局列表顺序显示 - int index = 0; - for (int i = m_kbLayoutModel->rowCount() - 1; i >= 0; --i) { - DStandardItem *item = dynamic_cast(m_kbLayoutModel->item(i, 0)); - if (item == nullptr) { - return; - } - if (m_model->getUserLayoutList().indexOf(id) - > m_model->getUserLayoutList().indexOf(item->data(KBLangIdRole).toString())) { - index = i + 1; - break; - } - } - m_kbLayoutModel->insertRow(index, kbLayoutItem); - m_kbLangList << id; - - // 添加最后一个item - if (endItem != nullptr) { - m_kbLayoutModel->appendRow(endItem); - } - - m_editKBLayout->setVisible(m_kbLangList.size() > 1); - - onDefault(m_model->curLayout()); - m_kbLayoutListView->adjustSize(); - m_kbLayoutListView->update(); -} - -void KBLayoutSettingWidget::onEditClicked() -{ - if (m_kbLangList.count() < 2) { - return; - } - m_bEdit = !m_bEdit; - if (m_bEdit) { - m_editKBLayout->setText(tr("Done")); - int row_count = m_kbLayoutModel->rowCount(); - for (int i = 0; i < row_count - 1; ++i) { - DStandardItem *item = dynamic_cast(m_kbLayoutModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - creatDelIconAction(item); - } - } - } else { - m_editKBLayout->setText(tr("Edit")); - int row_count = m_kbLayoutModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - DStandardItem *item = dynamic_cast(m_kbLayoutModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - item->setActionList(Qt::RightEdge, {}); - } - } - } -} - -void KBLayoutSettingWidget::onDefault(const QString &value) -{ - int row_count = m_kbLayoutModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - DStandardItem *item = dynamic_cast(m_kbLayoutModel->item(i, 0)); - if (item && (item->text() == value)) { - item->setCheckState(Qt::Checked); - if (m_bEdit) { - item->setActionList(Qt::RightEdge, {}); - } - // 滚动到当前选中项 - onKBCurrentChanged(m_kbLayoutModel->index(i, 0)); - } else { - item->setCheckState(Qt::Unchecked); - if (m_bEdit) { - creatDelIconAction(item); - } - } - } -} - -void KBLayoutSettingWidget::creatDelIconAction(DStandardItem *item) -{ - DViewItemAction *iconAction = - new DViewItemAction(Qt::AlignCenter | Qt::AlignRight, QSize(), QSize(), true); - iconAction->setIcon(DStyle::standardIcon(style(), DStyle::SP_DeleteButton)); - item->setActionList(Qt::RightEdge, { iconAction }); - connect(iconAction, &DViewItemAction::triggered, this, [this, item] { - m_kbLangList.removeOne(item->data(KBLangIdRole).toString()); - int idx = m_kbLayoutModel->indexFromItem(item).row(); - Q_EMIT delUserLayout(item->text()); - m_kbLayoutModel->removeRow(idx); - m_kbLayoutListView->adjustSize(); - m_kbLayoutListView->update(); - m_editKBLayout->setVisible(m_kbLangList.size() > 1); - }); -} - -void KBLayoutSettingWidget::onKBLayoutChanged(const QModelIndex &index) -{ - if (index.row() == m_kbLayoutListView->count() - 1) { - onLayoutAdded(); - return; - } - if (m_bEdit) { - return; - } - int row_count = m_kbLayoutModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_kbLayoutModel->item(i, 0); - if (item && (index.row() == i)) { - item->setCheckState(Qt::Checked); - Q_EMIT requestCurLayoutAdded(item->text()); - } else if (item) { - item->setCheckState(Qt::Unchecked); - } - } -} - -void KBLayoutSettingWidget::onKBCurrentChanged(const QModelIndex ¤t) -{ - if (current.row() == m_kbLayoutListView->count() - 1) { - return; - } - QSize itemSize = m_kbLayoutListView->itemDelegate()->sizeHint(QStyleOptionViewItem(), current); - int top = current.row() * (itemSize.height() + m_kbLayoutModel->span(current).height()); - - QRect visibleRect = m_kbLayoutListView->visibleRegion().boundingRect(); - QRect itemRect(0, top, visibleRect.width(), itemSize.height()); - - if (!visibleRect.contains(itemRect)) { - if (visibleRect.bottom() < itemRect.bottom()) { - // m_contentWidget->scrollTo(itemRect.bottom() - visibleRect.bottom()); - } else { - // m_contentWidget->scrollTo(itemRect.top() - visibleRect.top()); - } - } -} - -void KBLayoutSettingWidget::onLayoutAdded() -{ - m_bEdit = false; - - m_editKBLayout->setText(tr("Edit")); - int row_count = m_kbLayoutModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - DStandardItem *item = dynamic_cast(m_kbLayoutModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - item->setActionList(Qt::RightEdge, {}); - } - } - - Q_EMIT layoutAdded(m_kbLangList); -} diff --git a/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.h b/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.h deleted file mode 100644 index 75971462d0..0000000000 --- a/dcc-old/src/plugin-keyboard/window/kblayoutsettingwidget.h +++ /dev/null @@ -1,83 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef KBLAYOUTSETTINGWIDGET_H -#define KBLAYOUTSETTINGWIDGET_H - -#include "dcclistview.h" -#include "interface/namespace.h" -#include "widgets/titlelabel.h" - -#include -#include -#include -#include - -#include -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { -class KeyboardModel; -class SearchInput; -class ComboxWidget; - -class KBLayoutListView : public DCCListView -{ - Q_OBJECT -public: - explicit KBLayoutListView(QWidget *parent = nullptr) - : DCCListView(parent) - { - setSpacing(0); - } - -Q_SIGNALS: - void currentChangedSignal(const QModelIndex ¤t); - -protected: - void currentChanged(const QModelIndex ¤t, const QModelIndex &previous) override - { - DListView::currentChanged(current, previous); - Q_EMIT currentChangedSignal(current); - } -}; - -class KBLayoutSettingWidget : public QWidget -{ - Q_OBJECT -public: - explicit KBLayoutSettingWidget(QWidget *parent = nullptr); - void setModel(KeyboardModel *model); - void creatDelIconAction(DStandardItem *item); - -Q_SIGNALS: - void layoutAdded(const QStringList &kblist); - void requestCurLayoutAdded(const QString &value); - void curLang(const QString &value); - void delUserLayout(const QString &value); - -public Q_SLOTS: - void onAddKeyboard(const QString &id, const QString &value); - void onEditClicked(); - void onDefault(const QString &value); - void onKBLayoutChanged(const QModelIndex &index); - void onKBCurrentChanged(const QModelIndex ¤t); - void onLayoutAdded(); - void onUpdateKBLayoutList(); - -private: - bool m_bEdit = false; - QStringList m_kbLangList; - KeyboardModel *m_model; - KBLayoutListView *m_kbLayoutListView; - DCommandLinkButton *m_editKBLayout; - QStandardItemModel *m_kbLayoutModel; - DViewItemAction *m_addLayoutAction; - -private: - enum { SwitchValueRole = Dtk::UserRole + 1, KBLangIdRole }; -}; -} // namespace DCC_NAMESPACE -#endif // KBLAYOUTSETTINGWIDGET_H diff --git a/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.cpp b/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.cpp deleted file mode 100644 index 26d00d90dc..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.cpp +++ /dev/null @@ -1,229 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "keyboardlayoutdialog.h" -#include "widgets/settingsgroup.h" -#include "widgets/settingsitem.h" - -#include -#include -#include -#include -#include - -#include -#include - -using namespace DCC_NAMESPACE; -KeyboardLayoutDialog::KeyboardLayoutDialog(QWidget *parent) - : DAbstractDialog(parent) - , textLength(0) - , searchStatus(false) - , m_buttonTuple(new ButtonTuple(ButtonTuple::Save)) -{ - setFixedSize(QSize(500, 644)); - QHBoxLayout *hlayout = new QHBoxLayout(); - hlayout->setMargin(0); - hlayout->setSpacing(0); - - m_searchModel = new IndexModel(); - m_model = new IndexModel(); - m_view = new IndexView(); - - m_view->setAccessibleName("List_keyboardmenulist"); - m_view->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_view->setBackgroundType(DStyledItemDelegate::BackgroundType::ClipCornerBackground); - m_view->setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents); - m_view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view->setSelectionMode(QAbstractItemView::NoSelection); - - QPushButton *cancel = m_buttonTuple->leftButton(); - cancel->setText(tr("Cancel")); - QPushButton *ok = m_buttonTuple->rightButton(); - ok->setText(tr("Add")); - ok->setEnabled(false); - - hlayout->addWidget(m_view); - - QLabel *headTitle = new QLabel(tr("Add Keyboard Layout")); - DFontSizeManager::instance()->bind(headTitle, DFontSizeManager::T5, QFont::DemiBold); // 设置label字体 - headTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - headTitle->setAlignment(Qt::AlignCenter); - - m_search = new SearchInput(); - QVBoxLayout *mainVLayout = new QVBoxLayout(this); - QVBoxLayout *listVLayout = new QVBoxLayout(); - listVLayout->setAlignment(Qt::AlignHCenter); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - listVLayout->addSpacing(10); - listVLayout->addWidget(m_search, Qt::AlignCenter); - listVLayout->addSpacing(10); - listVLayout->addLayout(hlayout); - listVLayout->addSpacing(10); - listVLayout->addWidget(m_buttonTuple, 0, Qt::AlignBottom); - listVLayout->setContentsMargins(20, 10, 20, 10); - - mainVLayout->setMargin(0); - mainVLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - mainVLayout->addWidget(headTitle, Qt::AlignCenter); - mainVLayout->addLayout(listVLayout); - setLayout(mainVLayout); - setContentsMargins(0, 0, 0, 0); - installEventFilter(this); - - connect(m_search, SIGNAL(textChanged(QString)), this, SLOT(onSearch(QString))); - connect(cancel, &QPushButton::clicked, this, &KeyboardLayoutDialog::close); - connect(ok, &QPushButton::clicked, this, &KeyboardLayoutDialog::onAddKBLayout); - connect(m_view, &IndexView::clicked, this, &KeyboardLayoutDialog::onKBLayoutSelect); -} - -KeyboardLayoutDialog::~KeyboardLayoutDialog() -{ - m_searchModel->deleteLater(); - m_model->deleteLater(); -} - -void KeyboardLayoutDialog::onAddKBLayout() -{ - QVariant var; - MetaData md; - - if (searchStatus) { - var = m_selectSearchIndex.data(IndexModel::KBLayoutRole); - md = var.value(); - if (m_searchModel->letters().contains(md.text())) { - return; - } - } else { - var = m_selectIndex.data(IndexModel::KBLayoutRole); - md = var.value(); - if (m_model->letters().contains(md.text())) { - return; - } - } - - Q_EMIT layoutSelected(md.text()); - accept(); -} - -void KeyboardLayoutDialog::onKBLayoutSelect(const QModelIndex &index) -{ - if (searchStatus) { - setDataModel(m_searchModel, m_selectSearchIndex, index); - } else{ - setDataModel(m_model, m_selectIndex, index); - } -} - -void KeyboardLayoutDialog::setDataModel(IndexModel *model, QModelIndex &selectedIndex, const QModelIndex &index) { - - if (selectedIndex.isValid()) { - model->itemFromIndex(selectedIndex)->setCheckState(Qt::Unchecked); - } - - QStandardItem *selectItem = model->itemFromIndex(index); - - if (selectItem) { - bool addBtnEnabled = true; - QVariant var = index.data(IndexModel::KBLayoutRole); - MetaData md = var.value(); - if (md.text().isEmpty() || model->letters().contains(md.text())) { - addBtnEnabled = false; - } else { - selectItem->setCheckState(Qt::Checked); - selectedIndex = index; - } - m_buttonTuple->rightButton()->setEnabled(addBtnEnabled); - } -} - -void KeyboardLayoutDialog::setMetaData(const QList &datas) -{ - int count = datas.count(); - m_data.clear(); - for (int i = 0; i < count; i++) { - //当前key不为空,直接添加到list - if ("" != datas[i].key()) { - m_data.append(datas[i]); - } else { - //当前key为空,但是下一个key不为空(表示这是一个字母,如"H"),需要添加到list - //添加前要进行list数量判断, 需要满足 : i < count -1 - if ((i < count - 1) && ("" != datas[i + 1].key())) { - m_data.append(datas[i]); - } - } - } - - m_model->setMetaData(m_data); - m_view->setModel(m_model); -} - -void KeyboardLayoutDialog::setLetters(QList letters) -{ - QLocale locale; - if (locale.language() == QLocale::Chinese) { - //根据有效list,决定显示右边的索引 - QList validLetters; - //遍历有效list和letters list,遇到相同的就添加到新的valid letters list - for (auto value : m_data) { - for (auto letter : letters) { - if (value.text() == letter) { - validLetters.append(letter); - break; - } - } - } - m_model->setLetters(validLetters); - bool bVisible = m_model->getModelCount() > 1; - m_view->setVisible(bVisible); - } -} - -void KeyboardLayoutDialog::onSearch(const QString &text) -{ - if (text.length() == 0) { - searchStatus = false; - m_view->setModel(m_model); - } else { - searchStatus = true; - QList datas = m_model->metaData(); - QList::iterator it = datas.begin(); - QList sdatas; - for (; it != datas.end(); ++it) { - if ((*it).text().contains(text, Qt::CaseInsensitive)) { - if (!(*it).key().isEmpty()) { - sdatas.append(*it); - } - } - } - m_searchModel->clear(); - m_searchModel->setMetaData(sdatas); - m_view->setModel(m_searchModel); - m_buttonTuple->rightButton()->setEnabled(false); - } -} - -bool KeyboardLayoutDialog::eventFilter(QObject *watched, QEvent *event) -{ - Q_UNUSED(watched) - - if (event->type() != QEvent::Move && event->type() != QEvent::Resize) - return false; - - QRect rect = this->rect(); - - rect.moveTopLeft(-pos()); - rect.setHeight(window()->height() - mapTo(window(), rect.topLeft()).y()); - - QPainterPath path; - path.addRoundedRect(rect, 5, 5); - - return false; -} diff --git a/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.h b/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.h deleted file mode 100644 index 4d4ba96cdc..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keyboardlayoutdialog.h +++ /dev/null @@ -1,60 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef KEYBOARDLAYOUTDIALOG_H -#define KEYBOARDLAYOUTDIALOG_H - -#include "interface/namespace.h" -#include "widgets/buttontuple.h" -#include "indexmodel.h" -#include "indexview.h" -#include "searchinput.h" - -#include -#include -#include - -#include - -class QLineEdit; - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE{ - -class KeyboardLayoutDialog : public DAbstractDialog -{ - Q_OBJECT - -public: - explicit KeyboardLayoutDialog(QWidget *parent = nullptr); - ~KeyboardLayoutDialog(); - - void setDataModel(IndexModel *model, QModelIndex &selectedIndex, const QModelIndex &index); - void setMetaData(const QList& datas); - void setLetters(QList letters); - -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -Q_SIGNALS: - void layoutSelected(const QString &value); - -public Q_SLOTS: - void onSearch(const QString& text); - void onKBLayoutSelect(const QModelIndex &index); - void onAddKBLayout(); -private: - int textLength; - bool searchStatus; - SearchInput *m_search; - ButtonTuple *m_buttonTuple; - IndexView *m_view; - IndexModel *m_model; - IndexModel *m_searchModel; - DGraphicsClipEffect *m_clipEffectWidget; - QList m_data; - QModelIndex m_selectIndex; - QModelIndex m_selectSearchIndex; -}; -} -#endif // KEYBOARDLAYOUTDIALOG_H diff --git a/dcc-old/src/plugin-keyboard/window/keyboardmodule.cpp b/dcc-old/src/plugin-keyboard/window/keyboardmodule.cpp deleted file mode 100644 index bd5a707790..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keyboardmodule.cpp +++ /dev/null @@ -1,281 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "keyboardmodule.h" -#include "customcontentdialog.h" -#include "generalkbsettingwidget.h" -#include "kblayoutsettingwidget.h" -#include "keyboardlayoutdialog.h" -#include "shortcutsettingwidget.h" -#ifndef DCC_DISABLE_LANUGAGE -#include "systemlanguagewidget.h" -#include "systemlanguagesettingdialog.h" -#endif -#include "widgets/settingshead.h" -#include "operation/keyboardwork.h" -#include "operation/keyboardmodel.h" -#include "operation/shortcutmodel.h" -#include "customedit.h" -#include "shortcutcontentdialog.h" -#include "widgets/widgetmodule.h" -#include "interface/pagemodule.h" - -#include -#include - -#include - -using namespace DCC_NAMESPACE; -DGUI_USE_NAMESPACE -DWIDGET_USE_NAMESPACE - -class KeyboardFloatingButton : public DFloatingButton -{ -public: - explicit KeyboardFloatingButton() - : DFloatingButton(nullptr) {} -}; - -QString KeyboardPlugin::name() const -{ - return QStringLiteral("keyboard"); -} - -ModuleObject *KeyboardPlugin::module() -{ - //一级菜单--键盘与语言 - KeyboardModule *moduleInterface = new KeyboardModule(); - moduleInterface->setName("keyboard"); - moduleInterface->setDisplayName(tr("Keyboard and Language")); - moduleInterface->setIcon(DIconTheme::findQIcon("dcc_nav_keyboard")); - - //二级菜单--键盘 - ModuleObject *moduleKeyBoard = new PageModule("keyboardGeneral", tr("Keyboard")); - - //为二级菜单-键盘添加children - GeneralSettingModule *generalSettingModule = new GeneralSettingModule(moduleInterface->model(), moduleInterface->worker()); - generalSettingModule->setName("keyboardSetting"); - generalSettingModule->setDescription(tr("Keyboard Settings")); - generalSettingModule->addContentText(tr("Keyboard Settings")); - moduleKeyBoard->appendChild(generalSettingModule); - //键盘布局 - KBLayoutSettingModule *kBLayoutSettingModule = new KBLayoutSettingModule(moduleInterface->model(), moduleInterface->worker()); - kBLayoutSettingModule->setName("keyboardLayout"); - kBLayoutSettingModule->setDisplayName(tr("keyboard Layout")); - kBLayoutSettingModule->setDescription(tr("Keyboard Layout")); - kBLayoutSettingModule->addContentText(tr("Keyboard Layout")); - - moduleKeyBoard->appendChild(kBLayoutSettingModule); - moduleInterface->appendChild(moduleKeyBoard); - -#ifndef DCC_DISABLE_LANUGAGE - //二级菜单--系统语言 - ModuleObject *moduleSystemLanguageSetting = new PageModule("keyboardLanguage", tr("Language")); - SystemLanguageSettingModule *systemLanguageSettingModule = new SystemLanguageSettingModule(moduleInterface->model(), moduleInterface->worker()); - moduleSystemLanguageSetting->appendChild(systemLanguageSettingModule); - moduleInterface->appendChild(moduleSystemLanguageSetting); -#endif - - //二级菜单--快捷键 - ShortCutSettingMenuModule *moduleShortCutSetting = new ShortCutSettingMenuModule("keyboardShortcuts", tr("Shortcuts")); - ShortCutSettingModule *shortCutSettingModule = new ShortCutSettingModule(moduleInterface->model(), moduleInterface->worker(), moduleInterface->shortcutModel()); - moduleShortCutSetting->appendChild(shortCutSettingModule); - ModuleObject *customShortcutModule = new WidgetModule("AddCustomShortCut","AddCustomShortCut",[shortCutSettingModule](KeyboardFloatingButton *customShortcut){ - customShortcut->setIcon(DStyle::SP_IncreaseElement); - customShortcut->setObjectName("AddCustomShortCut"); - connect(customShortcut, &DFloatingButton::clicked, shortCutSettingModule, &ShortCutSettingModule::onPushCustomShortcut); - }); - customShortcutModule->setExtra(); - moduleShortCutSetting->appendChild(customShortcutModule); - moduleInterface->appendChild(moduleShortCutSetting); - - return moduleInterface; -} - -QString KeyboardPlugin::location() const -{ - return "15"; -} - -KeyboardModule::KeyboardModule(QObject *parent) - : HListModule(parent) - , m_model(nullptr) - , m_shortcutModel(nullptr) - , m_work(nullptr) -{ - //公共功能可能泄露。在分配指针“m_model”之前未释放它,因此加了这个处理 - if (m_model) { - delete m_model; - } - m_model = new KeyboardModel(this); - m_shortcutModel = new ShortcutModel(this); - m_work = new KeyboardWorker(m_model,this); - - //注意初始化的顺序和时机 - m_work->setShortcutModel(m_shortcutModel); -} - -KeyboardModule::~KeyboardModule() -{ - delete m_shortcutModel; - m_model->deleteLater(); - m_work->deleteLater(); - - m_shortcutModel = nullptr; - m_model = nullptr; - m_work = nullptr; -} - -void KeyboardModule::active() -{ - m_work->active(); -} - -//page -QWidget *GeneralSettingModule::page() -{ - GeneralKBSettingWidget *w = new GeneralKBSettingWidget(m_model); - connect(w, &GeneralKBSettingWidget::requestKBDelayChanged, m_worker, &KeyboardWorker::setRepeatDelay); - connect(w, &GeneralKBSettingWidget::requestKBSpeedChanged, m_worker, &KeyboardWorker::setRepeatInterval); - connect(w, &GeneralKBSettingWidget::requestNumLockChanged, m_worker, &KeyboardWorker::setNumLock); - connect(w, &GeneralKBSettingWidget::requestCapsLockChanged, m_worker, &KeyboardWorker::setCapsLock); - return w; -} - -void KBLayoutSettingModule::onPushKeyboard(const QStringList &kblist) -{ - m_worker->onPinyin(); - KeyboardLayoutDialog *kbLayoutDialog = new KeyboardLayoutDialog(); - auto dataControll = [ = ](QList datas) { - for (auto it(datas.begin()); it != datas.end();) { - const MetaData &data = *it; - if (kblist.contains(data.key())) - it = datas.erase(it); - else - ++it; - } - - kbLayoutDialog->setMetaData(datas); - }; - - connect(m_worker, &KeyboardWorker::onDatasChanged, kbLayoutDialog, dataControll); - connect(m_worker, &KeyboardWorker::onLettersChanged, kbLayoutDialog, &KeyboardLayoutDialog::setLetters); - - dataControll(m_worker->getDatas()); - kbLayoutDialog->setLetters(m_worker->getLetters()); - - connect(kbLayoutDialog, &KeyboardLayoutDialog::layoutSelected, m_worker, &KeyboardWorker::addUserLayout); - kbLayoutDialog->setAttribute(Qt::WA_DeleteOnClose); - kbLayoutDialog->exec(); - -} - -void KBLayoutSettingModule::setCurrentLayout(const QString &value) -{ - m_worker->setLayout(m_model->userLayout().key(value)); -} - -QWidget *KBLayoutSettingModule::page() -{ - m_worker->onRefreshKBLayout(); - KBLayoutSettingWidget *w = new KBLayoutSettingWidget; - w->setModel(m_model); - connect(w, &KBLayoutSettingWidget::layoutAdded, this, &KBLayoutSettingModule::onPushKeyboard); - connect(w, &KBLayoutSettingWidget::requestCurLayoutAdded, this, &KBLayoutSettingModule::setCurrentLayout); - connect(w, &KBLayoutSettingWidget::delUserLayout, m_worker, &KeyboardWorker::delUserLayout); - w->setFocus(); - return w; -} - -#ifndef DCC_DISABLE_LANUGAGE -QWidget *SystemLanguageSettingModule::page() -{ - m_worker->refreshLang(); - SystemLanguageWidget *w = new SystemLanguageWidget(m_model); - w->setVisible(false); - connect(w, &SystemLanguageWidget::onSystemLanguageAdded, this, &SystemLanguageSettingModule::onPushSystemLanguageSetting); - connect(w, &SystemLanguageWidget::delLocalLang, m_worker, &KeyboardWorker::deleteLang); - connect(w, &SystemLanguageWidget::setCurLang, m_worker, &KeyboardWorker::setLang); - connect(m_model, &KeyboardModel::onSetCurLangFinish, w, &SystemLanguageWidget::onSetCurLang); - w->setVisible(true); - return w; -} - -void SystemLanguageSettingModule::onPushSystemLanguageSetting() -{ - SystemLanguageSettingDialog *systemLanguageSettingDialog = new SystemLanguageSettingDialog(m_model); - connect(systemLanguageSettingDialog, &SystemLanguageSettingDialog::click, this, &SystemLanguageSettingModule::onAddLocale); - systemLanguageSettingDialog->setAttribute(Qt::WA_DeleteOnClose); - systemLanguageSettingDialog->exec(); -} - -void SystemLanguageSettingModule::onAddLocale(const QModelIndex &index) -{ - QVariant var = index.data(SystemLanguageSettingDialog::KeyRole); - m_worker->addLang(var.toString()); -} -#endif - -QWidget *ShortCutSettingModule::page() -{ - m_worker->refreshShortcut(); - ShortCutSettingWidget *w = new ShortCutSettingWidget(m_shortcutModel); - connect(w, &ShortCutSettingWidget::delShortcutInfo, m_worker, &KeyboardWorker::delShortcut); - connect(w, &ShortCutSettingWidget::requestUpdateKey, m_worker, &KeyboardWorker::updateKey); - connect(w, &ShortCutSettingWidget::requestShowConflict, this, &ShortCutSettingModule::onPushConflict); - connect(w, &ShortCutSettingWidget::requestSaveShortcut, m_worker, &KeyboardWorker::modifyShortcutEdit); - connect(w, &ShortCutSettingWidget::requestDisableShortcut, m_worker, &KeyboardWorker::onDisableShortcut); - connect(w, &ShortCutSettingWidget::shortcutEditChanged, this, &ShortCutSettingModule::onShortcutEdit); - connect(w, &ShortCutSettingWidget::requestReset, m_worker, &KeyboardWorker::resetAll); - connect(w, &ShortCutSettingWidget::requestSearch, m_worker, &KeyboardWorker::onSearchShortcuts); - connect(m_worker, &KeyboardWorker::removed, w, &ShortCutSettingWidget::onRemoveItem); - connect(m_worker, &KeyboardWorker::searchChangd, w, &ShortCutSettingWidget::onSearchInfo); - connect(m_worker, &KeyboardWorker::onResetFinished, w, &ShortCutSettingWidget::onResetFinished); - w->setFocus(); - return w; -} - -void ShortCutSettingModule::onPushCustomShortcut() -{ - CustomContentDialog *content = new CustomContentDialog(m_shortcutModel, qobject_cast(sender())); - connect(content, &CustomContentDialog::requestUpdateKey, m_worker, &KeyboardWorker::updateKey); - connect(content, &CustomContentDialog::requestAddKey, m_worker, &KeyboardWorker::addCustomShortcut); - connect(content, &CustomContentDialog::requestForceSubs, m_worker, &KeyboardWorker::onDisableShortcut); - content->setAttribute(Qt::WA_DeleteOnClose); - content->exec(); -} - -void ShortCutSettingModule::onPushConflict(ShortcutInfo *info, const QString &shortcut) -{ - ShortcutContentDialog *scContentDialog = new ShortcutContentDialog(m_shortcutModel); - - scContentDialog->setInfo(info); - scContentDialog->setShortcut(shortcut); - scContentDialog->setBottomTip(m_shortcutModel->getInfo(shortcut)); - - connect(scContentDialog, &ShortcutContentDialog::requestSaveShortcut, m_worker, &KeyboardWorker::modifyShortcutEdit); - connect(scContentDialog, &ShortcutContentDialog::requestUpdateKey, m_worker, &KeyboardWorker::updateKey); - connect(scContentDialog, &ShortcutContentDialog::requestDisableShortcut, m_worker, &KeyboardWorker::onDisableShortcut); - - scContentDialog->setAttribute(Qt::WA_DeleteOnClose); - scContentDialog->exec(); -} - -void ShortCutSettingModule::onShortcutEdit(ShortcutInfo *info) -{ - CustomEdit *customEdit = new CustomEdit(m_shortcutModel, qobject_cast(sender())); - customEdit->setVisible(false); - customEdit->setShortcut(info); - - ShortCutSettingWidget *shortcutWidget = qobject_cast(sender()); - SettingsHead *head = shortcutWidget->getHead(); - - connect(customEdit, &CustomEdit::requestUpdateKey, m_worker, &KeyboardWorker::updateKey); - connect(customEdit, &CustomEdit::requestSaveShortcut, head, &SettingsHead::toCancel); - connect(customEdit, &CustomEdit::requestSaveShortcut, m_worker, &KeyboardWorker::modifyCustomShortcut); - - customEdit->setFocus(); - customEdit->exec(); - head->toCancel(); -} - diff --git a/dcc-old/src/plugin-keyboard/window/keyboardmodule.h b/dcc-old/src/plugin-keyboard/window/keyboardmodule.h deleted file mode 100644 index e6a4c146c4..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keyboardmodule.h +++ /dev/null @@ -1,135 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#pragma once - -#include "interface/namespace.h" -#include "interface/plugininterface.h" -#include "interface/hlistmodule.h" -#include "interface/pagemodule.h" - -#include - -namespace DCC_NAMESPACE { -class KeyboardWidget; -class GeneralKBSettingWidget; -class KBLayoutSettingWidget; -class SystemLanguageWidget; -class SystemLanguageSettingWidget; -class ShortCutSettingWidget; -class CustomContent; - -class KeyboardModel; -class ShortcutModel; -class KeyboardWorker; -class KeyboardLayoutWidget; -struct ShortcutInfo; -class CustomEdit; -class ShortcutContent; - -class KeyboardPlugin : public PluginInterface -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID "com.deepin.dde.ControlCenter.Keyboard" FILE "KeyboardPlugin.json") - Q_INTERFACES(DCC_NAMESPACE::PluginInterface) -public: - virtual QString name() const override; - virtual ModuleObject *module() override; - virtual QString location() const override; -}; - -class KeyboardModule : public HListModule -{ - Q_OBJECT - -public: - explicit KeyboardModule(QObject *parent = nullptr); - ~KeyboardModule(); - KeyboardModel *model() { return m_model; } - ShortcutModel *shortcutModel() { return m_shortcutModel; } - KeyboardWorker *worker() { return m_work; } -protected: - virtual void active() override; - -private: - KeyboardModel *m_model; - ShortcutModel *m_shortcutModel; - KeyboardWorker *m_work; -}; - -class GeneralSettingModule : public ModuleObject -{ - Q_OBJECT -public: - explicit GeneralSettingModule(KeyboardModel *model, KeyboardWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker){} - virtual QWidget *page() override; - -private: - KeyboardModel *m_model; - KeyboardWorker *m_worker; -}; - -class KBLayoutSettingModule : public ModuleObject -{ - Q_OBJECT -public: - explicit KBLayoutSettingModule(KeyboardModel *model, KeyboardWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker){} - virtual QWidget *page() override; - -public Q_SLOTS: - void onPushKeyboard(const QStringList &kblist); - void setCurrentLayout(const QString &value); - -private: - KeyboardModel *m_model; - KeyboardWorker *m_worker; -}; - -#ifndef DCC_DISABLE_LANUGAGE -class SystemLanguageSettingModule : public ModuleObject -{ - Q_OBJECT -public: - explicit SystemLanguageSettingModule(KeyboardModel *model, KeyboardWorker *worker, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker){} - virtual QWidget *page() override; - -public Q_SLOTS: - void onPushSystemLanguageSetting(); - void onAddLocale(const QModelIndex &index); - -private: - KeyboardModel *m_model; - KeyboardWorker *m_worker; -}; -#endif - -class ShortCutSettingMenuModule : public PageModule -{ - Q_OBJECT -public: - explicit ShortCutSettingMenuModule(const QString &name, const QString &displayName = {}, QObject *parent = nullptr) - : PageModule(name, displayName, parent) {} -}; - -class ShortCutSettingModule : public ModuleObject -{ - Q_OBJECT -public: - explicit ShortCutSettingModule(KeyboardModel *model, KeyboardWorker *worker, ShortcutModel *shortcutModel, QObject *parent = nullptr) - : ModuleObject(parent), m_model(model), m_worker(worker), m_shortcutModel(shortcutModel){} - virtual QWidget *page() override; - -public Q_SLOTS: - void onPushCustomShortcut(); - void onPushConflict(ShortcutInfo *info, const QString &shortcut); - void onShortcutEdit(ShortcutInfo *info); - -private: - KeyboardModel *m_model; - KeyboardWorker *m_worker; - ShortcutModel *m_shortcutModel; -}; -} diff --git a/dcc-old/src/plugin-keyboard/window/keylabel.cpp b/dcc-old/src/plugin-keyboard/window/keylabel.cpp deleted file mode 100644 index bca83a1e4d..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keylabel.cpp +++ /dev/null @@ -1,63 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "keylabel.h" - -#include -#include -#include -#include -#include - -const QMap &DisplaykeyMap = { {"exclam", "!"}, {"at", "@"}, {"numbersign", "#"}, {"dollar", "$"}, {"percent", "%"}, - {"asciicircum", "^"}, {"ampersand", "&"}, {"asterisk", "*"}, {"parenleft", "("}, - {"parenright", ")"}, {"underscore", "_"}, {"plus", "+"}, {"braceleft", "{"}, {"braceright", "}"}, - {"bar", "|"}, {"colon", ":"}, {"quotedbl", "\""}, {"less", "<"}, {"greater", ">"}, {"question", "?"}, - {"minus", "-"}, {"equal", "="}, {"brackertleft", "["}, {"breckertright", "]"}, {"backslash", "\\"}, - {"semicolon", ";"}, {"apostrophe", "'"}, {"comma", ","}, {"period", "."}, {"slash", "/"}, {"Up", "↑"}, - {"Left", "←"}, {"Down", "↓"}, {"Right", "→"}, {"asciitilde", "~"}, {"grave", "`"}, {"Control", "Ctrl"}, - {"Super_L", "Super"}, {"Super_R", "Super"} -}; - -KeyLabel::KeyLabel(const QString &text, QWidget *parent) - : QWidget(parent) - , m_isEnter(false) - , m_text("") -{ - QString t; - - if (text.isEmpty()) { - t = tr("None"); - } else { - const QString &value = DisplaykeyMap[text]; - t = value.isEmpty() ? text : value; - } - - m_text = t; - - QFont font = qApp->font(); - QFontMetrics fm(font); - - setMinimumWidth(fm.horizontalAdvance(t) + 18); -} - -void KeyLabel::setEnter(const bool enter) -{ - m_isEnter = enter; - - update(); -} - -void KeyLabel::paintEvent(QPaintEvent *event) -{ - Q_UNUSED(event); - QStylePainter stylePainter(this); - QStyleOptionButton option; - option.rect = rect(); - option.text = m_text; - option.palette.setBrush(QPalette::Light, option.palette.base()); - option.palette.setBrush(QPalette::Dark, option.palette.base()); - option.palette.setBrush(QPalette::ButtonText, option.palette.highlight()); - option.palette.setBrush(QPalette::Shadow, Qt::transparent); - stylePainter.drawControl(QStyle::CE_PushButton, option); -} diff --git a/dcc-old/src/plugin-keyboard/window/keylabel.h b/dcc-old/src/plugin-keyboard/window/keylabel.h deleted file mode 100644 index 0c90985db9..0000000000 --- a/dcc-old/src/plugin-keyboard/window/keylabel.h +++ /dev/null @@ -1,26 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef KEYLABEL_H -#define KEYLABEL_H - -#include - -class KeyLabel : public QWidget -{ - Q_OBJECT -public: - explicit KeyLabel(const QString &text, QWidget *parent = nullptr); - - void setEnter(const bool enter); - -protected: - void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; - -private: - bool m_isEnter; - QString m_text; -}; - - -#endif // KEYLABEL_H diff --git a/dcc-old/src/plugin-keyboard/window/searchinput.cpp b/dcc-old/src/plugin-keyboard/window/searchinput.cpp deleted file mode 100644 index 7f88fa60b6..0000000000 --- a/dcc-old/src/plugin-keyboard/window/searchinput.cpp +++ /dev/null @@ -1,96 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "searchinput.h" - -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; - -QPixmap loadPixmap(const QString &path) -{ - qreal ratio = 1.0; - QPixmap pixmap; - - const qreal devicePixelRatio = qApp->devicePixelRatio(); - - if (!qFuzzyCompare(ratio, devicePixelRatio)) { - QImageReader reader; - reader.setFileName(qt_findAtNxFile(path, devicePixelRatio, &ratio)); - if (reader.canRead()) { - reader.setScaledSize(reader.size() * (devicePixelRatio / ratio)); - pixmap = QPixmap::fromImage(reader.read()); - pixmap.setDevicePixelRatio(devicePixelRatio); - } - } else { - pixmap.load(path); - } - - return pixmap; -} - - -SearchInput::SearchInput(QWidget* parent) - :QLineEdit(parent), - m_iconVisible(true) -{ - setContextMenuPolicy(Qt::NoContextMenu); - setFocusPolicy(Qt::ClickFocus); - m_search = tr("Search"); -} - -void SearchInput::setSearchText(const QString &text) -{ - m_search = text; -} - -void SearchInput::setIconVisible(bool visible) -{ - m_iconVisible = visible; -} - -QString SearchInput::iconPath() const -{ - return m_iconPath; -} - -void SearchInput::setIcon(const QString &filepath) -{ - m_iconPath = filepath; - - m_icon = loadPixmap(filepath); -} - -void SearchInput::paintEvent(QPaintEvent *e) -{ - QLineEdit::paintEvent(e); - - if(!hasFocus() && text().isEmpty()) - { - QRect rect = this->rect(); - QPainter painter(this); - painter.setRenderHint(QPainter::Antialiasing); - painter.setOpacity(0.5); - if(m_iconVisible) - { - QFontMetrics fm(qApp->font()); - int w = fm.horizontalAdvance(m_search); - int iw = m_icon.width(); - int x = (rect.width() - w - iw -8)/2; - QRect iconRect(x, 0, iw, rect.height()); - QRect tmp(QPoint(0,0),m_icon.size() / devicePixelRatioF()); - tmp.moveCenter(iconRect.center()); - QRect searchRect(iconRect.right() + 2, 0, w, rect.height()); - painter.drawPixmap(tmp, m_icon); - painter.drawText(searchRect, Qt::AlignCenter, m_search); - } - else - { - painter.drawText(rect, Qt::AlignCenter, m_search); - } - } -} diff --git a/dcc-old/src/plugin-keyboard/window/searchinput.h b/dcc-old/src/plugin-keyboard/window/searchinput.h deleted file mode 100644 index c21d00d4ac..0000000000 --- a/dcc-old/src/plugin-keyboard/window/searchinput.h +++ /dev/null @@ -1,35 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SEARCHINPUT_H -#define SEARCHINPUT_H - -#include "interface/namespace.h" -#include - -namespace DCC_NAMESPACE { - -class SearchInput : public QLineEdit -{ - Q_OBJECT - Q_PROPERTY(QString icon READ iconPath WRITE setIcon) -public: - explicit SearchInput(QWidget* parent = 0); - void setSearchText(const QString& text); - void setIconVisible(bool visible); - QString iconPath() const; - void setIcon(const QString &filepath); - -protected: - void paintEvent(QPaintEvent *); - -private: - bool m_iconVisible; - QString m_search; - QPixmap m_icon; - QString m_iconPath; -}; - -} - -#endif // SEARCHINPUT_H diff --git a/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.cpp b/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.cpp deleted file mode 100644 index fb6e5323eb..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.cpp +++ /dev/null @@ -1,159 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "shortcutcontentdialog.h" -#include "operation/shortcutmodel.h" -#include "shortcutitem.h" - -#include - -#include - -using namespace DCC_NAMESPACE; -ShortcutContentDialog::ShortcutContentDialog(ShortcutModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_model(model) - , m_conflict(nullptr) - , m_info(nullptr) - , m_shortcutItem(new ShortcutItem) - , m_buttonTuple(new ButtonTuple(ButtonTuple::Save)) -{ - setFixedSize(QSize(400, 300)); - QVBoxLayout *mainVLayout = new QVBoxLayout(); - mainVLayout->setContentsMargins(0, 0, 0, 0); - mainVLayout->setSpacing(0); - - QVBoxLayout *listVLayout = new QVBoxLayout(); - listVLayout->setAlignment(Qt::AlignHCenter); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - mainVLayout->addWidget(titleIcon); - - m_shortcutItem->setShortcut(tr("Please Reset Shortcut")); - m_shortcutItem->addBackground(); - listVLayout->addWidget(m_shortcutItem, 0, Qt::AlignTop); - - listVLayout->addSpacing(10); - QPushButton *cancel = m_buttonTuple->leftButton(); - QPushButton *ok = m_buttonTuple->rightButton(); - if (m_buttonTuple->layout()) { - //第二个控件为space - if (m_buttonTuple->layout()->itemAt(1) != nullptr && m_buttonTuple->layout()->itemAt(1)->spacerItem() != nullptr) { - int height = m_buttonTuple->layout()->itemAt(1)->spacerItem()->sizeHint().height(); - m_buttonTuple->layout()->itemAt(1)->spacerItem()->changeSize(20, height); - } - } - - cancel->setText(tr("Cancel")); - ok->setText(tr("Replace")); - - m_bottomTip = new QLabel(); - m_bottomTip->setWordWrap(true); - - listVLayout->addSpacing(10); - listVLayout->addWidget(m_bottomTip); - listVLayout->addStretch(); - listVLayout->addWidget(m_buttonTuple, 0, Qt::AlignBottom); - listVLayout->setContentsMargins(20, 10, 20, 10); - - mainVLayout->addLayout(listVLayout); - setLayout(mainVLayout); - setContentsMargins(0, 0, 0, 0); - - connect(ok, &QPushButton::clicked, this, &ShortcutContentDialog::onReplace); - connect(cancel, &QPushButton::clicked, this, &ShortcutContentDialog::close); - connect(m_shortcutItem, &ShortcutItem::requestUpdateKey, this, &ShortcutContentDialog::onUpdateKey); - connect(m_model, &ShortcutModel::keyEvent, this, &ShortcutContentDialog::keyEvent); -} - -void ShortcutContentDialog::setBottomTip(ShortcutInfo *conflict) -{ - m_conflict = conflict; - - m_info->replace = conflict; - - if (conflict) { - QString accels = conflict->accels; - accels = accels.replace("<", ""); - accels = accels.replace(">", "+"); - accels = accels.replace("_L", ""); - accels = accels.replace("_R", ""); - accels = accels.replace("Control", "Ctrl"); - - QString str = tr("This shortcut conflicts with %1, click on Replace to make this shortcut effective immediately") - .arg(QString("%1 %2").arg(conflict->name).arg(QString("[%1]").arg(accels))); - m_bottomTip->setText(str); - m_bottomTip->show(); - } else { - m_bottomTip->clear(); - m_bottomTip->hide(); - } -} - -void ShortcutContentDialog::setInfo(ShortcutInfo *info) -{ - m_info = info; - m_shortcutItem->setShortcutInfo(info); -} - -void ShortcutContentDialog::setShortcut(const QString &shortcut) -{ - m_shortcut = shortcut; - m_shortcutItem->setShortcut(shortcut); -} - -void ShortcutContentDialog::keyEvent(bool press, const QString &shortcut) -{ - if (!press) { - - if (shortcut.isEmpty()) { - setBottomTip(nullptr); - return; - } - - if (shortcut == "BackSpace" || shortcut == "Delete") { - m_shortcut.clear(); - setBottomTip(nullptr); - return; - } - - m_shortcut = shortcut; - - // check conflict - ShortcutInfo *info = m_model->getInfo(shortcut); - - qInfo() << info; - qInfo() << m_info; - - if (info && info != m_info && info->accels != m_info->accels) { - m_shortcutItem->setShortcut(info->accels); - setBottomTip(info); - return; - } - setBottomTip(nullptr); - m_shortcutItem->setShortcut(shortcut); - } -} - -void ShortcutContentDialog::onReplace() -{ - if (m_info->accels != m_shortcut) { - if (m_shortcut.isEmpty()) { - Q_EMIT requestDisableShortcut(m_info); - } else { - m_info->accels = m_shortcut; - Q_EMIT requestSaveShortcut(m_info); - } - } - accept(); -} - -void ShortcutContentDialog::onUpdateKey() -{ - Q_EMIT requestUpdateKey(nullptr); -} - diff --git a/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.h b/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.h deleted file mode 100644 index 64e24d6223..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutcontentdialog.h +++ /dev/null @@ -1,52 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SHORTCUTCONTENTDIALOG_H -#define SHORTCUTCONTENTDIALOG_H - -#include "interface/namespace.h" -#include "widgets/settingsgroup.h" -#include "widgets/buttontuple.h" -#include "titlebuttonItem.h" - -#include - -#include - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { -class ShortcutModel; -struct ShortcutInfo; -class KeyboardControl; -class ShortcutItem; -class ShortcutContentDialog : public DAbstractDialog -{ - Q_OBJECT -public: - explicit ShortcutContentDialog(ShortcutModel *model, QWidget *parent = nullptr); - void setBottomTip(ShortcutInfo *conflict); - void setInfo(ShortcutInfo *info); - void setShortcut(const QString &shortcut); - -Q_SIGNALS: - void requestUpdateKey(ShortcutInfo *conflict); - void requestSaveShortcut(ShortcutInfo *info); - void requestDisableShortcut(ShortcutInfo *info); - -public Q_SLOTS: - void keyEvent(bool press, const QString &shortcut); - void onReplace(); - void onUpdateKey(); - -private: - ShortcutModel *m_model; - QLabel* m_bottomTip; - ShortcutInfo* m_conflict; - ShortcutInfo* m_info; - ShortcutItem *m_shortcutItem; - ButtonTuple *m_buttonTuple; - TitleButtonItem* m_item; - QString m_shortcut; -}; -} -#endif // SHORTCUTCONTENTDIALOG_H diff --git a/dcc-old/src/plugin-keyboard/window/shortcutitem.cpp b/dcc-old/src/plugin-keyboard/window/shortcutitem.cpp deleted file mode 100644 index 8ffc490ef7..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutitem.cpp +++ /dev/null @@ -1,230 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "shortcutitem.h" -#include "operation/shortcutmodel.h" -#include "keylabel.h" - -#include -#include - -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; -DWIDGET_USE_NAMESPACE -DGUI_USE_NAMESPACE - -ShortcutItem::ShortcutItem(QFrame *parent) - : SettingsItem(parent) - , m_info(nullptr) -{ - installEventFilter(this); - setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Expanding); - setFocusPolicy(Qt::FocusPolicy::StrongFocus); - setMinimumHeight(36); - - setMouseTracking(true); - QHBoxLayout *layout = new QHBoxLayout(); - layout->setContentsMargins(10, 2, 10, 2); - layout->setSpacing(2); - - m_title = new QLabel(); - m_title->setText(""); - m_title->setAlignment(Qt::AlignLeft | Qt::AlignVCenter); - m_title->setWordWrap(false); - m_title->setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Expanding); - - layout->addWidget(m_title); - layout->setAlignment(m_title, Qt::AlignLeft); - - m_editBtn = new DIconButton(this); - m_editBtn->setIcon(DIconTheme::findQIcon("dcc_edit")); - m_editBtn->hide(); - m_editBtn->setFixedSize(16, 16); - m_editBtn->setAccessibleName("EDIT_SHORTCUT_BUTTON"); - layout->addWidget(m_editBtn, Qt::AlignLeft); - - layout->addStretch(); - - m_delBtn = new DIconButton(this); - m_delBtn->setIcon(DStyle::StandardPixmap::SP_DeleteButton); - m_delBtn->hide(); - m_delBtn->setFixedSize(16, 16); - m_delBtn->setAccessibleName("DEL_SHORTCUT_BUTTON"); - layout->addWidget(m_delBtn, Qt::AlignLeft); - - m_key = new ShortcutKey; - layout->addWidget(m_key); - - m_shortcutEdit = new QLineEdit; - m_shortcutEdit->setReadOnly(true); - layout->addWidget(m_shortcutEdit, 0, Qt::AlignVCenter | Qt::AlignRight); - - m_shortcutEdit->setPlaceholderText(tr("Enter a new shortcut")); - QFontMetrics fm = m_shortcutEdit->fontMetrics(); - QRect strRect = fm.boundingRect(m_shortcutEdit->placeholderText()); - QStyleOptionFrame opt; - initStyleOption(&opt); - int strWidth = (style()->sizeFromContents(QStyle::CT_LineEdit, &opt, strRect.size(). - expandedTo(QApplication::globalStrut()), m_shortcutEdit)).width(); - int borderWidth = m_shortcutEdit->minimumSizeHint().width() - fm.maxWidth(); - - m_shortcutEdit->setMinimumWidth(strWidth + borderWidth + 8); //始终有些误差 - m_shortcutEdit->hide(); - - setLayout(layout); - - connect(m_editBtn, &DIconButton::clicked, this, &ShortcutItem::onShortcutEdit); - connect(m_delBtn, &DIconButton::clicked, this, &ShortcutItem::onRemoveClick); -} - -ShortcutItem::~ShortcutItem() -{ -// GSettingWatcher::instance()->erase(configName(), this); -} - -void ShortcutItem::setShortcutInfo(ShortcutInfo *info) -{ - m_info = info; - setTitle(m_info->name); - setShortcut(info->accels); - - if (info->type != ShortcutModel::Custom) { - setConfigName(info->id + "Config"); -// GSettingWatcher::instance()->bind(configName(), this); - } -} - -void ShortcutItem::setTitle(const QString &title) -{ - m_title->setText(title); - QTimer::singleShot(0, this, &ShortcutItem::updateTitleSize); -} - -void ShortcutItem::setShortcut(const QString &shortcut) -{ - m_shortcutEdit->hide(); - m_key->show(); - - QString accels = shortcut; - accels = accels.replace("<", ""); - accels = accels.replace(">", "-"); - accels = accels.replace("_L", ""); - accels = accels.replace("_R", ""); - accels = accels.replace("Control", "Ctrl"); - - m_key->setTextList(accels.split("-")); - QTimer::singleShot(0, this, &ShortcutItem::updateTitleSize); -} - -void ShortcutItem::onEditMode(bool value) -{ - if (value) { - m_delBtn->show(); - m_editBtn->show(); - m_key->hide(); - } else { - m_delBtn->hide(); - m_editBtn->hide(); - m_key->show(); - } - update(); -} - -void ShortcutItem::onRemoveClick() -{ - Q_EMIT requestRemove(m_info); -} - -void ShortcutItem::onShortcutEdit() -{ - Q_EMIT shortcutEditChanged(m_info); -} - -void ShortcutItem::updateTitleSize() -{ - show(); - if (m_info->name.isEmpty()) return; - int v = 0; - if(m_shortcutEdit->isHidden()) - v = width() - m_key->width() - 32; - else - v = width() - m_shortcutEdit->width() - 32; - if (m_title->fontMetrics().horizontalAdvance(m_info->name) > v) { - QFontMetrics fontWidth(m_title->font()); - QString elideNote = fontWidth.elidedText(m_info->name, Qt::ElideRight, v); - m_title->setText(elideNote); - } - else { - m_title->setText(m_info->name); - } -} - -void ShortcutItem::mouseReleaseEvent(QMouseEvent *e) -{ - if (m_delBtn->isVisible()) - return; - - if (!m_shortcutEdit->isVisible() && m_key->rect().contains(m_key->mapFromParent(e->pos()))) { - m_key->hide(); - m_shortcutEdit->show(); - m_info->item = this; - m_shortcutEdit->setFocus(); - - Q_EMIT requestUpdateKey(m_info); - - } else { - m_shortcutEdit->hide(); - m_key->show(); - } - updateTitleSize(); -} - -void ShortcutItem::resizeEvent(QResizeEvent *event) -{ - SettingsItem::resizeEvent(event); - - int v = width() - m_key->width() - 32; - // 参与计算的是实际文本长度 - if (m_title->fontMetrics().horizontalAdvance(m_info->name) <= v) { - m_title->setText(m_info->name); - m_title->setToolTip(""); - } else { - m_title->setToolTip(m_info->name); - QTimer::singleShot(0, this, &ShortcutItem::updateTitleSize); - } - -} - -bool ShortcutItem::eventFilter(QObject *watched, QEvent *event) -{ - if (event->type() == QEvent::Show) { - if (m_info->type != ShortcutModel::Custom) { -// setVisible("Hidden" != GSettingWatcher::instance()->getStatus(configName())); - } - } - - return QObject::eventFilter(watched, event); -} - -QString ShortcutItem::configName() const -{ - QString configName = m_configName; - for (int i = 0; i < configName.size(); i++) { - if (configName[i] == "-") { - QChar upperChar = configName.at(i + 1).toUpper(); - configName.remove(i, 2); - configName.insert(i, upperChar); - } - } - return configName; -} - -void ShortcutItem::setConfigName(const QString &configName) -{ - m_configName = configName; -} diff --git a/dcc-old/src/plugin-keyboard/window/shortcutitem.h b/dcc-old/src/plugin-keyboard/window/shortcutitem.h deleted file mode 100644 index decb6eca4f..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutitem.h +++ /dev/null @@ -1,67 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SHORTCUTITEM_H -#define SHORTCUTITEM_H - -#include"interface/namespace.h" -#include "widgets/settingsitem.h" -#include "shortcutkey.h" - -#include - -#include -#include -#include - -namespace DCC_NAMESPACE { - -struct ShortcutInfo; - -class ShortcutItem : public SettingsItem -{ - Q_OBJECT - -public: - explicit ShortcutItem(QFrame *parent = nullptr); - ~ShortcutItem(); - - void setShortcutInfo(ShortcutInfo *info); - inline ShortcutInfo *curInfo() { return m_info; } - - void setChecked(bool checked); - void setTitle(const QString &title); - void setShortcut(const QString &shortcut); - - QString configName() const; - void setConfigName(const QString &configName); - -Q_SIGNALS: - void shortcutEditChanged(ShortcutInfo *info); - void requestUpdateKey(ShortcutInfo *info); - void requestRemove(ShortcutInfo *info); - -public Q_SLOTS: - void onEditMode(bool value); - void onRemoveClick(); - -private: - void onShortcutEdit(); - void updateTitleSize(); - -protected: - void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE; - void resizeEvent(QResizeEvent *event) Q_DECL_OVERRIDE; - bool eventFilter(QObject *watched, QEvent *event) Q_DECL_OVERRIDE; - -private: - QLineEdit *m_shortcutEdit; - QLabel *m_title; - ShortcutInfo *m_info; - DTK_WIDGET_NAMESPACE::DIconButton *m_delBtn; - DTK_WIDGET_NAMESPACE::DIconButton *m_editBtn; - ShortcutKey *m_key; - QString m_configName; -}; -} -#endif // SHORTCUTITEM_H diff --git a/dcc-old/src/plugin-keyboard/window/shortcutkey.cpp b/dcc-old/src/plugin-keyboard/window/shortcutkey.cpp deleted file mode 100644 index 9c98041707..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutkey.cpp +++ /dev/null @@ -1,53 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "shortcutkey.h" -#include "keylabel.h" - -#include -#include - -ShortcutKey::ShortcutKey(QWidget *parent) : QWidget(parent) -{ - setAccessibleName("ShortcutKey"); - m_mainLayout = new QHBoxLayout; - m_mainLayout->setMargin(0); - m_mainLayout->setSpacing(5); - - setLayout(m_mainLayout); -} - -void ShortcutKey::setTextList(const QStringList &list) -{ - for (KeyLabel *label : m_list) { - m_mainLayout->removeWidget(label); - label->deleteLater(); - } - - m_list.clear(); - - for (const QString &key : list) { - KeyLabel *label = new KeyLabel(key); - label->setAccessibleName("LABEL"); - m_list << label; - m_mainLayout->addWidget(label); - } - - adjustSize(); -} - -void ShortcutKey::enterEvent(QEvent *event) -{ - QWidget::enterEvent(event); - - for (KeyLabel *label : m_list) - label->setEnter(true); -} - -void ShortcutKey::leaveEvent(QEvent *event) -{ - QWidget::leaveEvent(event); - - for (KeyLabel *label : m_list) - label->setEnter(false); -} diff --git a/dcc-old/src/plugin-keyboard/window/shortcutkey.h b/dcc-old/src/plugin-keyboard/window/shortcutkey.h deleted file mode 100644 index 5ebdeed821..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutkey.h +++ /dev/null @@ -1,30 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later - -#ifndef SHORTCUTKEY_H -#define SHORTCUTKEY_H - -#include -#include -#include - -class KeyLabel; - -class ShortcutKey : public QWidget -{ - Q_OBJECT -public: - explicit ShortcutKey(QWidget *parent = nullptr); - void setTextList(const QStringList &list); - -protected: - void enterEvent(QEvent *event) override; - void leaveEvent(QEvent *event) override; - -private: - QHBoxLayout *m_mainLayout; - QList m_list; -}; - -#endif // SHORTCUTKEY_H diff --git a/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.cpp b/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.cpp deleted file mode 100644 index 3a10103746..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.cpp +++ /dev/null @@ -1,475 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "shortcutsettingwidget.h" -#include "operation/shortcutmodel.h" -#include "shortcutitem.h" -#include "widgets/settingshead.h" -#include "widgets/settingsheaderitem.h" -#include "widgets/settingsgroup.h" -#include "searchinput.h" - -#include -#include - -#include -#include -#include - -DCORE_USE_NAMESPACE -using namespace DCC_NAMESPACE; -ShortCutSettingWidget::ShortCutSettingWidget(ShortcutModel *model, QWidget *parent) - : QWidget(parent) - , m_workspaceGroup(nullptr) - , m_assistiveToolsGroup(nullptr) - , m_model(model) -{ - setAccessibleName("ShortCutSettingWidget"); - m_searchDelayTimer = new QTimer(this); - m_searchDelayTimer->setInterval(300); - m_searchDelayTimer->setSingleShot(true); - - m_searchText = QString(); - SettingsHead *systemHead = new SettingsHead(); - systemHead->setEditEnable(false); - systemHead->setTitle(tr("System Management")); - systemHead->layout()->setContentsMargins(10, 0, 10, 0); - m_systemGroup = new SettingsGroup(); - m_systemGroup->getLayout()->setMargin(0); - m_systemGroup->appendItem(systemHead, SettingsGroup::NoneBackground); - - SettingsHead *windowHead = new SettingsHead(); - windowHead->setEditEnable(false); - windowHead->setTitle(tr("Window")); - windowHead->layout()->setContentsMargins(10, 0, 10, 0); - m_windowGroup = new SettingsGroup(); - m_windowGroup->getLayout()->setMargin(0); - m_windowGroup->appendItem(windowHead, SettingsGroup::NoneBackground); - - if (DSysInfo::UosServer != DSysInfo::uosType()) { - m_workspaceHead = new SettingsHead(); - m_workspaceHead->setEditEnable(false); - m_workspaceHead->setTitle(tr("Workspace")); - m_workspaceHead->layout()->setContentsMargins(10, 0, 10, 0); - m_workspaceGroup = new SettingsGroup(); - m_workspaceGroup->appendItem(m_workspaceHead, SettingsGroup::NoneBackground); - } - - if (DSysInfo::UosServer != DSysInfo::uosType() && DSysInfo::UosCommunity != DSysInfo::uosEditionType()) { - SettingsHead *speechHead = new SettingsHead(); - speechHead->setTitle(tr("Assistive Tools")); - speechHead->setEditEnable(false); - speechHead->layout()->setContentsMargins(10, 0, 10, 0); - m_assistiveToolsGroup = new SettingsGroup(); - m_assistiveToolsGroup->appendItem(speechHead, SettingsGroup::NoneBackground); - } - - m_customGroup = new SettingsGroup(); - m_searchGroup = new SettingsGroup(); - m_searchInput = new SearchInput(); - m_searchInput->setAccessibleName("KEYBOARD_LINEEDIT"); - m_searchInput->setObjectName("KeyboardLineEdit"); - - m_head = new SettingsHead(); - m_head->setEditEnable(true); - m_head->setVisible(false); - m_head->setTitle(tr("Custom Shortcut")); - m_head->layout()->setContentsMargins(10, 0, 10, 0); - m_customGroup->appendItem(m_head, SettingsGroup::NoneBackground); - - QVBoxLayout *vlayout = new QVBoxLayout(); - QHBoxLayout *topLayout = new QHBoxLayout; - topLayout->setMargin(0); - topLayout->setAlignment(Qt::AlignTop); - topLayout->addWidget(m_searchInput); - vlayout->addLayout(topLayout); - - vlayout->setMargin(0); - vlayout->setSpacing(10); - //vlayout->addSpacing(10); - - m_layout = new QVBoxLayout; - m_layout->setContentsMargins(0, 0, 0, 0); - m_layout->addSpacing(3); - m_layout->addWidget(m_systemGroup); - m_layout->addSpacing(10); - m_layout->addWidget(m_windowGroup); - if (m_workspaceGroup) { - m_layout->addSpacing(10); - m_layout->addWidget(m_workspaceGroup); - } - - if (m_assistiveToolsGroup) { - m_layout->addSpacing(10); - m_layout->addWidget(m_assistiveToolsGroup); - } - m_layout->addSpacing(10); - m_layout->addWidget(m_customGroup); - - m_resetBtn = new QPushButton(tr("Restore Defaults")); - //m_layout->setMargin(10); - m_layout->addWidget(m_resetBtn); - m_layout->addSpacing(10); - m_layout->addStretch(); - - QWidget *widget = new QWidget(this); - widget->setAccessibleName("ShortCutSettingWidget_widget"); - widget->setContentsMargins(0, 0, 0, 0); - widget->setLayout(m_layout); - vlayout->addWidget(widget); - - widget->hide(); - m_searchInput->hide(); - - vlayout->setContentsMargins(0, 10, 0, 5); - setLayout(vlayout); - - connect(m_resetBtn, &QPushButton::clicked, this, [ = ] { - if (!m_bIsResting) { - m_bIsResting = true; - Q_EMIT requestReset(); - } - }); - - connect(m_searchInput, &QLineEdit::textChanged, this, &ShortCutSettingWidget::onSearchTextChanged); - connect(m_searchDelayTimer, &QTimer::timeout, this, &ShortCutSettingWidget::prepareSearchKeys); - setWindowTitle(tr("Shortcut")); - - connect(m_model, &ShortcutModel::addCustomInfo, this, &ShortCutSettingWidget::onCustomAdded); - //每次页面点击时会通过m_work->refreshShortcut()时,model会发出listChanged信号,对界面进行初始化 - connect(m_model, &ShortcutModel::listChanged, this, &ShortCutSettingWidget::addShortcut); - connect(m_model, &ShortcutModel::shortcutChanged, this, &ShortCutSettingWidget::onShortcutChanged); - connect(m_model, &ShortcutModel::keyEvent, this, &ShortCutSettingWidget::onKeyEvent); - connect(m_model, &ShortcutModel::searchFinished, this, &ShortCutSettingWidget::onSearchStringFinish); - - QTimer::singleShot(10, this, [=] { - widget->show(); - m_searchInput->show(); - }); -} - -void ShortCutSettingWidget::addShortcut(QList list, ShortcutModel::InfoType type) -{ - if ((m_assistiveToolsGroup == nullptr) && (type == ShortcutModel::AssistiveTools)) { - m_assistiveToolsIdList.clear(); - QList::iterator it = list.begin(); - for (; it != list.end(); ++it) { - ShortcutInfo *assistiveToolsinfo = *it; - m_assistiveToolsIdList << assistiveToolsinfo->id; - } - return; - } - - if ((m_workspaceGroup == nullptr) && (type == ShortcutModel::Workspace)) { - m_workspaceIdList.clear(); - QList::iterator it = list.begin(); - for (; it != list.end(); ++it) { - ShortcutInfo *workspaceIdListlsinfo = *it; - m_workspaceIdList << workspaceIdListlsinfo->id; - } - return; - } - QMap*> InfoMap { - {ShortcutModel::System, &m_systemList}, - {ShortcutModel::Window, &m_windowList}, - {ShortcutModel::Workspace, &m_workspaceList}, - {ShortcutModel::AssistiveTools, &m_assistiveToolsList}, - {ShortcutModel::Custom, &m_customList} - }; - - QMap GroupMap { - {ShortcutModel::System, m_systemGroup}, - {ShortcutModel::Window, m_windowGroup}, - {ShortcutModel::Workspace, m_workspaceGroup}, - {ShortcutModel::AssistiveTools, m_assistiveToolsGroup}, - {ShortcutModel::Custom, m_customGroup} - }; - - QList *itemList{ InfoMap[type] }; - auto group = GroupMap[type]; - for (auto it = itemList->begin(); it != itemList->end();) { - ShortcutItem *item = *it; - - group->removeItem(item); - m_allList.removeOne(item); - it = itemList->erase(it); - item->deleteLater(); - } - - QList::iterator it = list.begin(); - for (; it != list.end(); ++it) { - ShortcutInfo *info = *it; - ShortcutItem *item = new ShortcutItem(); - item->setAccessibleName(info->name); - connect(item, &ShortcutItem::requestUpdateKey, this, &ShortCutSettingWidget::requestUpdateKey); - item->setShortcutInfo(info); - item->setTitle(info->name); - info->item = item; - m_searchInfos[info->toString()] = info; - - m_allList << item; - switch (type) { - case ShortcutModel::System: - m_systemGroup->appendItem(item); - m_systemList.append(item); - break; - case ShortcutModel::Window: - m_windowGroup->appendItem(item); - m_windowList.append(item); - break; - case ShortcutModel::Workspace: - m_workspaceGroup->appendItem(item); - m_workspaceList.append(item); - - if (m_workspaceGroup->itemCount() > 1) - m_workspaceHead->setVisible(true); - break; - case ShortcutModel::AssistiveTools: - m_assistiveToolsGroup->appendItem(item); - m_assistiveToolsList.append(item); - break; - case ShortcutModel::Custom: - connect(m_head, &SettingsHead::editChanged, item, &ShortcutItem::onEditMode); - m_customGroup->appendItem(item); - m_customList.append(item); - - if (m_customGroup->itemCount() > 1) - m_head->setVisible(true); - - connect(item, &ShortcutItem::requestRemove, this, &ShortCutSettingWidget::onDestroyItem); - connect(item, &ShortcutItem::shortcutEditChanged, this, &ShortCutSettingWidget::shortcutEditChanged); - break; - default: - break; - } - } -} - -SettingsHead *ShortCutSettingWidget::getHead() const -{ - return m_head; -} - -void ShortCutSettingWidget::modifyStatus(bool status) -{ - if (status) { - m_customGroup->hide(); - if (m_assistiveToolsGroup) { - m_assistiveToolsGroup->hide(); - } - if (m_workspaceGroup) { - m_workspaceGroup->hide(); - } - - m_windowGroup->hide(); - m_systemGroup->hide(); - m_resetBtn->hide(); - m_searchGroup->show(); - m_layout->removeWidget(m_customGroup); - if (m_assistiveToolsGroup) { - m_layout->removeWidget(m_assistiveToolsGroup); - } - if (m_workspaceGroup) { - m_layout->removeWidget(m_workspaceGroup); - } - - m_layout->removeWidget(m_windowGroup); - m_layout->removeWidget(m_systemGroup); - m_layout->insertWidget(0, m_searchGroup, 0, Qt::AlignTop); - } else { - m_customGroup->show(); - if (m_assistiveToolsGroup) { - m_assistiveToolsGroup->show(); - } - if (m_workspaceGroup) { - m_workspaceGroup->show(); - } - - m_windowGroup->show(); - m_systemGroup->show(); - m_resetBtn->show(); - m_searchGroup->hide(); - m_layout->removeWidget(m_searchGroup); - m_layout->insertWidget(0, m_systemGroup); - m_layout->insertWidget(2, m_windowGroup); - - if (m_workspaceGroup) { - m_layout->insertWidget(4, m_workspaceGroup); - if (m_assistiveToolsGroup) { - m_layout->insertWidget(6, m_assistiveToolsGroup); - m_layout->insertWidget(8, m_customGroup); - } else { - m_layout->insertWidget(6, m_customGroup); - } - } else { - if (m_assistiveToolsGroup) { - m_layout->insertWidget(4, m_assistiveToolsGroup); - m_layout->insertWidget(6, m_customGroup); - } else { - m_layout->insertWidget(4, m_customGroup); - } - } - - } -} - -void ShortCutSettingWidget::onSearchTextChanged(const QString &text) -{ - if (m_searchText.length() == 0 || text.length() == 0) { - modifyStatus(text.length() > 0); - } - m_searchText = text; - qDebug() << "search text is " << m_searchText; - if (text.length() > 0) { - m_searchDelayTimer->start(); - } -} - -void ShortCutSettingWidget::onCustomAdded(ShortcutInfo *info) -{ - if (info) { - ShortcutItem *item = new ShortcutItem(); - connect(item, &ShortcutItem::requestUpdateKey, this, &ShortCutSettingWidget::requestUpdateKey); - item->setShortcutInfo(info); - item->setTitle(info->name); - info->item = item; - - m_searchInfos[info->toString()] = info; - - m_allList << item; - - m_head->setVisible(true); - connect(m_head, &SettingsHead::editChanged, item, &ShortcutItem::onEditMode); - m_customGroup->appendItem(item); - m_customList.append(item); - - connect(item, &ShortcutItem::requestRemove, this, &ShortCutSettingWidget::onDestroyItem); - connect(item, &ShortcutItem::shortcutEditChanged, this, &ShortCutSettingWidget::shortcutEditChanged); - } -} - -void ShortCutSettingWidget::onDestroyItem(ShortcutInfo *info) -{ - m_head->toCancel(); - ShortcutItem *item = info->item; - m_customGroup->removeItem(item); - if (m_customGroup->itemCount() == 1) { - m_head->setVisible(false); - } - m_searchInfos.remove(item->curInfo()->toString()); - m_customList.removeOne(item); - m_allList.removeOne(item); - Q_EMIT delShortcutInfo(item->curInfo()); - item->deleteLater(); -} - -void ShortCutSettingWidget::onSearchInfo(ShortcutInfo *info, const QString &key) -{ - if (m_searchInfos.keys().contains(key)) { - m_searchInfos.remove(key); - m_searchInfos[info->toString()] = info; - } -} - -void ShortCutSettingWidget::onSearchStringFinish(const QList searchList) -{ - for (int i = 0; i != m_searchGroup->itemCount(); ++i) { - m_searchGroup->getItem(i)->deleteLater(); - } - m_searchGroup->clear(); - QList list = searchList; - qDebug() << "searchList count is " << searchList.count(); - for (int i = 0; i < list.count(); i++) { - if (m_assistiveToolsGroup == nullptr && m_assistiveToolsIdList.contains(list[i]->id)) - continue; - - if (m_workspaceGroup == nullptr && m_workspaceIdList.contains(list[i]->id)) - continue; - - ShortcutItem *item = new ShortcutItem; - connect(item, &ShortcutItem::requestUpdateKey, this, &ShortCutSettingWidget::requestUpdateKey); - item->setShortcutInfo(list[i]); - item->setTitle(list[i]->name); - item->setFixedHeight(36); - m_searchGroup->appendItem(item); - } -} - -void ShortCutSettingWidget::prepareSearchKeys() -{ - Q_EMIT requestSearch(m_searchText); -} - -void ShortCutSettingWidget::onRemoveItem(const QString &id, int type) -{ - Q_UNUSED(type) - - for (auto item(m_customList.begin()); item != m_customList.end(); ++item) { - ShortcutItem *it = *item; - Q_ASSERT(it); - if (it->curInfo()->id == id) { - m_customGroup->removeItem(it); - m_customList.removeOne(it); - m_allList.removeOne(it); - it->deleteLater(); - return; - } - } -} - -void ShortCutSettingWidget::onShortcutChanged(ShortcutInfo *info) -{ - for (ShortcutItem *item : m_allList) { - if (item->curInfo()->id == info->id) { - item->setShortcutInfo(info); - break; - } - } -} - -void ShortCutSettingWidget::onKeyEvent(bool press, const QString &shortcut) -{ - ShortcutInfo *current = m_model->currentInfo(); - - if (!current) - return; - - ShortcutInfo *conflict = m_model->getInfo(shortcut); - - if (conflict == current && conflict->accels == current->accels) { - current->item->setShortcut(current->accels); - return; - } - - if (!press) { - if (shortcut.isEmpty()) { - current->item->setShortcut(current->accels); - return; - } - - if (shortcut == "BackSpace" || shortcut == "Delete") { - current->item->setShortcut(""); - Q_EMIT requestDisableShortcut(current); - } else { - if (conflict) { - // have conflict - Q_EMIT requestShowConflict(current, shortcut); - current->item->setShortcut(current->accels); - } else { - // save - current->accels = shortcut; - Q_EMIT requestSaveShortcut(current); - } - } - return; - } - - // update shortcut to item - current->item->setShortcut(shortcut); -} - -void ShortCutSettingWidget::onResetFinished() -{ - m_bIsResting = false; -} - diff --git a/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.h b/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.h deleted file mode 100644 index 6b0ebfedc3..0000000000 --- a/dcc-old/src/plugin-keyboard/window/shortcutsettingwidget.h +++ /dev/null @@ -1,99 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SHORTCUTSETTINGWIDGET_H -#define SHORTCUTSETTINGWIDGET_H - -#include "interface/namespace.h" -#include "operation/shortcutmodel.h" - -#include - -#include - -class QLineEdit; -class QPushButton; -class QVBoxLayout; - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { - -class ShortcutModel; -class ShortcutItem; - -class SettingsHead; -class SettingsGroup; - -class ShortCutSettingWidget : public QWidget -{ - Q_OBJECT -public: - explicit ShortCutSettingWidget(ShortcutModel *model, QWidget *parent = nullptr); - void addShortcut(QList list, ShortcutModel::InfoType type); - SettingsHead *getHead() const; - -protected: - void modifyStatus(bool status); - void wheelEvent(QWheelEvent *event) override - { - Q_UNUSED(event) - update(); - } - -Q_SIGNALS: - void delShortcutInfo(ShortcutInfo *info); - void requestDisableShortcut(ShortcutInfo *info); - void shortcutEditChanged(ShortcutInfo *info); - void requestUpdateKey(ShortcutInfo *info); - void requestShowConflict(ShortcutInfo *info, const QString &shortcut); - void requestSaveShortcut(ShortcutInfo *info); - void requestReset(); - void requestSearch(const QString &key); - -public Q_SLOTS: - void onSearchTextChanged(const QString &text); - void onCustomAdded(ShortcutInfo *info); - void onDestroyItem(ShortcutInfo *info); - void onSearchInfo(ShortcutInfo *info, const QString &key); - void onSearchStringFinish(const QList searchList); - void prepareSearchKeys(); - void onRemoveItem(const QString &id, int type); - void onShortcutChanged(ShortcutInfo *info); - void onKeyEvent(bool press, const QString &shortcut); - void onResetFinished(); - -private: - QWidget *m_searchWidget; - QWidget *m_widget; - QPushButton *m_resetBtn; - QLineEdit *m_searchInput; - QString m_searchText; - QVBoxLayout *m_layout; - QVBoxLayout *m_searchLayout; - - // 正在恢复默认快捷键,不能用禁用按钮,因为会导致焦点切换,体验不好 - bool m_bIsResting = false; - - SettingsHead *m_head; - SettingsHead *m_workspaceHead; - SettingsGroup *m_systemGroup; - SettingsGroup *m_windowGroup; - SettingsGroup *m_workspaceGroup; - SettingsGroup *m_assistiveToolsGroup; - SettingsGroup *m_customGroup; - SettingsGroup *m_searchGroup; - QMap m_searchInfos; - // 预留,如果用户太快,可以等带用户输入完成后才搜索 - QTimer *m_searchDelayTimer; - ShortcutModel *m_model; - QList m_allList; - QList m_systemList; - QList m_windowList; - QList m_workspaceList; - QList m_assistiveToolsList; - QList m_customList; - QStringList m_assistiveToolsIdList; - QStringList m_workspaceIdList; -}; -} -#endif // SHORTCUTSETTINGWIDGET_H diff --git a/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.cpp b/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.cpp deleted file mode 100644 index d5a086b3b3..0000000000 --- a/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.cpp +++ /dev/null @@ -1,179 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "systemlanguagesettingdialog.h" -#include "src/plugin-keyboard/operation/keyboardmodel.h" -#include "src/plugin-keyboard/window/indexview.h" - -#include - -using namespace DCC_NAMESPACE; -SystemLanguageSettingDialog::SystemLanguageSettingDialog(KeyboardModel *model, QWidget *parent) - : DAbstractDialog(parent) - , m_searchStatus(false) - , m_keyboardModel(model) - , m_buttonTuple(new ButtonTuple(ButtonTuple::Save)) -{ - setFixedSize(QSize(500, 644)); - QVBoxLayout *mainVLayout = new QVBoxLayout(); - mainVLayout->setContentsMargins(0, 0, 0, 5); - mainVLayout->setSpacing(0); - - m_model = new QStandardItemModel(this); - m_view = new DListView(); - m_view->setAccessibleName("List_languagelist"); - m_view->setFrameShape(QFrame::NoFrame); - m_view->setEditTriggers(QAbstractItemView::NoEditTriggers); - m_view->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - m_view->setBackgroundType(DStyledItemDelegate::ClipCornerBackground); - m_view->setSelectionMode(QAbstractItemView::NoSelection); - m_view->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - - QPushButton *cancel = m_buttonTuple->leftButton(); - cancel->setText(tr("Cancel")); - cancel->setObjectName("Cancel"); - QPushButton *ok = m_buttonTuple->rightButton(); - ok->setText(tr("Add")); - ok->setEnabled(false); - ok->setObjectName("Ok"); - - m_search = new SearchInput(); - QVBoxLayout *listVLayout = new QVBoxLayout(); - listVLayout->setAlignment(Qt::AlignHCenter); - DTitlebar *titleIcon = new DTitlebar(); - titleIcon->setFrameStyle(QFrame::NoFrame);//无边框 - titleIcon->setBackgroundTransparent(true);//透明 - titleIcon->setMenuVisible(false); - titleIcon->setTitle(tr("")); - - QLabel *headTitle = new QLabel(tr("Add System Language")); - DFontSizeManager::instance()->bind(headTitle, DFontSizeManager::T5, QFont::DemiBold); // 设置label字体 - headTitle->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); - headTitle->setAlignment(Qt::AlignCenter); - - listVLayout->addSpacing(10); - listVLayout->addWidget(m_search); - listVLayout->addSpacing(10); - listVLayout->addWidget(m_view); - listVLayout->addSpacing(10); - listVLayout->addWidget(m_buttonTuple, 0, Qt::AlignBottom); - listVLayout->setContentsMargins(20, 10, 20, 10); - - mainVLayout->setMargin(0); - mainVLayout->addWidget(titleIcon, Qt::AlignTop | Qt::AlignRight); - mainVLayout->addWidget(headTitle, Qt::AlignCenter); - mainVLayout->addLayout(listVLayout); - setLayout(mainVLayout); - setContentsMargins(0, 0, 0, 0); - - installEventFilter(this); - - connect(m_search, &SearchInput::textChanged, this, &SystemLanguageSettingDialog::onSearch); - connect(m_keyboardModel, &KeyboardModel::langChanged, this, &SystemLanguageSettingDialog::setModelData); - connect(cancel, &QPushButton::clicked, this, &SystemLanguageSettingDialog::close); - connect(ok, &QPushButton::clicked, this, &SystemLanguageSettingDialog::onAddLanguage); - connect(m_view, &DListView::clicked, this, &SystemLanguageSettingDialog::onLangSelect); - - setModelData(m_keyboardModel->langLists()); -} - -SystemLanguageSettingDialog::~SystemLanguageSettingDialog() -{ -} - -void SystemLanguageSettingDialog::onSearch(const QString &text) -{ - if (text.length() == 0) { - m_searchStatus = false; - m_view->setModel(m_model); - } else { - m_searchStatus = true; - m_searchModelIndex = QModelIndex(); - m_searchModel = new QStandardItemModel(this); - - for (auto md : m_datas) { - if (md.text().contains(text, Qt::CaseInsensitive)) { - auto item = new DStandardItem(md.text()); - item->setText(md.text()); - item->setData(md.key(),KeyRole); - item->setData(md.pinyin(),PingYinRole); - m_searchModel->appendRow(item); - } - } - m_view->setModel(m_searchModel); - } -} - -void SystemLanguageSettingDialog::onAddLanguage() -{ - if(m_searchStatus) { - Q_EMIT click(m_searchModelIndex); - } else{ - Q_EMIT click(m_modelIndex); - } - - accept(); -} - -void SystemLanguageSettingDialog::onLangSelect(const QModelIndex &index) -{ - if(m_searchStatus) { - updateDataModel(m_searchModel, m_searchModelIndex, index); - } else { - updateDataModel(m_model, m_modelIndex, index); - } -} - -void SystemLanguageSettingDialog::updateDataModel(QStandardItemModel *model, QModelIndex &selectedIndex, const QModelIndex &index) { - - if (selectedIndex.isValid()) { - model->itemFromIndex(selectedIndex)->setCheckState(Qt::Unchecked); - } - - QStandardItem *selectedItem = model->itemFromIndex(index); - if (selectedItem) { - selectedItem->setCheckState(Qt::Checked); - selectedIndex = index; - m_buttonTuple->rightButton()->setEnabled(true); - } -} - -void SystemLanguageSettingDialog::setModelData(const QList &datas) -{ - m_datas = datas; - QStringList removeLangList = m_keyboardModel->localLang(); - for (QList::iterator iter = m_datas.begin(); iter != m_datas.end();) { - if (removeLangList.contains(iter->text())) { - iter = m_datas.erase(iter); - continue; - } - ++iter; - } - - for (auto md : m_datas) { - auto item = new DStandardItem(); - item->setText(md.text()); - item->setData(md.key(),KeyRole); - item->setData(md.pinyin(),PingYinRole); - m_model->appendRow(item); - } - m_view->setModel(m_model); -} - -bool SystemLanguageSettingDialog::eventFilter(QObject *watched, QEvent *event) -{ - Q_UNUSED(watched) - - if (event->type() != QEvent::Move && event->type() != QEvent::Resize) - return false; - - QRect rect = this->rect(); - - rect.moveTopLeft(-pos()); - rect.setHeight(window()->height() - mapTo(window(), rect.topLeft()).y()); - - QPainterPath path; - path.addRoundedRect(rect, 5, 5); - - return false; -} diff --git a/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.h b/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.h deleted file mode 100644 index 8ac555fa37..0000000000 --- a/dcc-old/src/plugin-keyboard/window/systemlanguagesettingdialog.h +++ /dev/null @@ -1,69 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SYSTEMLANGUAGESETTINGDIALOG_H -#define SYSTEMLANGUAGESETTINGDIALOG_H - -#include "interface/namespace.h" -#include "widgets/buttontuple.h" -#include "src/plugin-keyboard/window/searchinput.h" - -#include -#include -#include - -#include -#include -#include -#include -#include - -DWIDGET_USE_NAMESPACE -namespace DCC_NAMESPACE { -class ButtonTuple; - -class KeyboardModel; -class MetaData; -class IndexModel; -class IndexView; - -class SystemLanguageSettingDialog : public DAbstractDialog -{ - Q_OBJECT -public: - explicit SystemLanguageSettingDialog(KeyboardModel *model, QWidget *parent = nullptr); - ~SystemLanguageSettingDialog(); - - void updateDataModel(QStandardItemModel *model, QModelIndex &selectedIndex, const QModelIndex &index); - - enum LanguageRole{ - TextRole = DTK_NAMESPACE::UserRole + 1, - KeyRole, - PingYinRole - }; - -Q_SIGNALS: - void click(const QModelIndex &index); - -public Q_SLOTS: - void setModelData(const QList &datas); - void onSearch(const QString &text); - void onAddLanguage(); - void onLangSelect(const QModelIndex &index); -protected: - bool eventFilter(QObject *watched, QEvent *event) override; - -private: - bool m_searchStatus; - SearchInput *m_search; - KeyboardModel *m_keyboardModel; - ButtonTuple *m_buttonTuple; - Dtk::Widget::DListView *m_view; - QStandardItemModel *m_model; - QStandardItemModel *m_searchModel; - QList m_datas; - QModelIndex m_modelIndex; - QModelIndex m_searchModelIndex; -}; -} -#endif // SYSTEMLANGUAGESETTINGDIALOG_H diff --git a/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.cpp b/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.cpp deleted file mode 100644 index 2c97855301..0000000000 --- a/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.cpp +++ /dev/null @@ -1,209 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#include "systemlanguagewidget.h" - -#include "src/plugin-keyboard/operation/keyboardmodel.h" -#include "src/plugin-keyboard/window/keylabel.h" -#include "systemlanguagesettingdialog.h" -#include "widgets/comboxwidget.h" -#include "widgets/settingsgroup.h" -#include "widgets/settingshead.h" -#include "widgets/titlelabel.h" - -#include -#include - -#include -#include -#include -#include -#include - -#include - -DCORE_USE_NAMESPACE -DWIDGET_USE_NAMESPACE -using namespace DCC_NAMESPACE; - -SystemLanguageWidget::SystemLanguageWidget(KeyboardModel *model, QWidget *parent) - : QWidget(parent) - , m_model(model) - , m_langItemModel(new QStandardItemModel(this)) - , m_langListview(std::visit([this]() -> SystemLanguageListView * { - auto langListview = new SystemLanguageListView(this); - langListview->setAccessibleName("SystemLanguageWidget_langListview"); - langListview->setContentsMargins(10, 0, 10, 0); - return langListview; - })) - , m_editSystemLang(std::visit([this]() -> DCommandLinkButton * { - auto editSystemLang = new DCommandLinkButton(tr("Edit"), this); - editSystemLang->setObjectName("Edit"); - return editSystemLang; - })) - , m_settingWidget(nullptr) -{ - QVBoxLayout *layout = new QVBoxLayout(); - layout->setSpacing(10); - - QHBoxLayout *headLayout = new QHBoxLayout(); - TitleLabel *headTitle = new TitleLabel(tr("Language List")); - DFontSizeManager::instance()->bind(headTitle, - DFontSizeManager::T5, - QFont::DemiBold); // 设置label字体 - headLayout->addWidget(headTitle); - headTitle->setContentsMargins(10, 0, 0, 0); - headLayout->addStretch(); - headLayout->addWidget(m_editSystemLang); - - m_langListview->setModel(m_langItemModel); - - DStandardItem *footItem = new DStandardItem(tr("Add Language") + "..."); - footItem->setTextColorRole(DPalette::Highlight); - m_langItemModel->appendRow(footItem); - - layout->addLayout(headLayout); - layout->addWidget(m_langListview); - layout->setContentsMargins(0, 0, 0, 0); - setLayout(layout); - - connect(m_langListview, &DListView::clicked, this, &SystemLanguageWidget::setCurLangChecked); - connect(m_editSystemLang, &QPushButton::clicked, this, &SystemLanguageWidget::onEditClicked); - - connect(m_model, - &KeyboardModel::curLocalLangChanged, - this, - [this](const QStringList &curLocalLang) { - for (int i = 0; i < curLocalLang.size(); i++) { - onAddLanguage(curLocalLang[i]); - } - }); - connect(m_model, &KeyboardModel::curLangChanged, this, &SystemLanguageWidget::onDefault); - QStringList localLangList = m_model->localLang(); - for (int i = 0; i < localLangList.size(); i++) { - onAddLanguage(localLangList[i]); - } - onDefault(m_model->curLang()); - onSetCurLang(m_model->getLangChangedState()); -} - -void SystemLanguageWidget::onEditClicked() -{ - m_bEdit = !m_bEdit; - if (m_bEdit) { - m_editSystemLang->setText(tr("Done")); - int row_count = m_langItemModel->rowCount(); - for (int i = 0; i < row_count - 1; ++i) { - DStandardItem *item = dynamic_cast(m_langItemModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - DViewItemAction *iconAction = new DViewItemAction(Qt::AlignCenter | Qt::AlignRight, - QSize(), - QSize(), - true); - iconAction->setIcon(DStyle::standardIcon(style(), DStyle::SP_DeleteButton)); - item->setActionList(Qt::RightEdge, { iconAction }); - connect(iconAction, &DViewItemAction::triggered, this, [this, item] { - m_sysLanglist.removeOne(item->text()); - int idx = m_langItemModel->indexFromItem(item).row(); - Q_EMIT delLocalLang(item->text()); - m_langItemModel->removeRow(idx); - m_langListview->adjustSize(); - m_langListview->update(); - m_editSystemLang->setVisible(m_sysLanglist.size() > 1); - }); - } - } - } else { - m_editSystemLang->setText(tr("Edit")); - int row_count = m_langItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - DStandardItem *item = dynamic_cast(m_langItemModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - item->setActionList(Qt::RightEdge, {}); - } - } - } -} - -void SystemLanguageWidget::onAddLanguage(const QString &localeLang) -{ - if (m_sysLanglist.contains(localeLang)) - return; - - // 去除最后一个item - DStandardItem *endItem = nullptr; - if (m_langItemModel->rowCount() > 0) { - endItem = dynamic_cast( - m_langItemModel->takeItem(m_langItemModel->rowCount() - 1, 0)); - m_langItemModel->removeRow(m_langItemModel->rowCount() - 1); - } - - DStandardItem *item = new DStandardItem(localeLang); - m_langItemModel->appendRow(item); - - // 添加最后一个item - if (endItem != nullptr) { - m_langItemModel->appendRow(endItem); - } - - m_langListview->adjustSize(); - m_langListview->update(); - m_sysLanglist << localeLang; - m_editSystemLang->setVisible(m_sysLanglist.size() > 1); -} - -void SystemLanguageWidget::setCurLangChecked(const QModelIndex &index) -{ - if (index.row() == m_langListview->count() - 1) { - addSystemLanguage(); - return; - } - if (m_bEdit) { - return; - } - int row_count = m_langItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_langItemModel->item(i, 0); - if (item && (index.row() == i)) { - item->setCheckState(Qt::Checked); - QString langKey = m_model->langFromText(item->text()); - Q_EMIT setCurLang(langKey); - } else if (item) { // 如果不加此判断,item会出现空指针 - item->setCheckState(Qt::Unchecked); - } - } -} - -void SystemLanguageWidget::onDefault(const QString &curLang) -{ - qDebug() << "curLang is " << curLang; - int row_count = m_langItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - QStandardItem *item = m_langItemModel->item(i, 0); - if (item && (item->text() == curLang)) { - item->setCheckState(Qt::Checked); - } else { - item->setCheckState(Qt::Unchecked); - } - } -} - -void SystemLanguageWidget::onSetCurLang(int value) -{ - qDebug() << "m_langListview & m_editSystemLang" << value; - setEnabled(!value); -} - -void SystemLanguageWidget::addSystemLanguage() -{ - m_bEdit = false; - m_editSystemLang->setText(tr("Edit")); - int row_count = m_langItemModel->rowCount(); - for (int i = 0; i < row_count; ++i) { - DStandardItem *item = dynamic_cast(m_langItemModel->item(i, 0)); - if (item && (item->checkState() == Qt::Unchecked)) { - item->setActionList(Qt::RightEdge, {}); - } - } - emit onSystemLanguageAdded(); -} diff --git a/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.h b/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.h deleted file mode 100644 index 9c711091cb..0000000000 --- a/dcc-old/src/plugin-keyboard/window/systemlanguagewidget.h +++ /dev/null @@ -1,66 +0,0 @@ -// SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -// SPDX-License-Identifier: GPL-3.0-or-later -#ifndef SYSTEMLANGUAGEWIDGET_H -#define SYSTEMLANGUAGEWIDGET_H - -#include "dcclistview.h" -#include "interface/namespace.h" - -#include -#include -#include -#include - -#include -#include - -DWIDGET_USE_NAMESPACE - -namespace DCC_NAMESPACE { -class SystemLanguageSettingWidget; -class KeyboardModel; - -class SystemLanguageListView : public DCCListView -{ - Q_OBJECT -public: - explicit SystemLanguageListView(QWidget *parent = nullptr) - : DCCListView(parent) - { - setSpacing(0); - } -}; - -class SystemLanguageWidget : public QWidget -{ - Q_OBJECT -public: - explicit SystemLanguageWidget(KeyboardModel *model, QWidget *parent = nullptr); -Q_SIGNALS: - void languageAdded(); - void onSystemLanguageAdded(); - void delLocalLang(const QString &localLang); - void setCurLang(const QString &curLang); -public Q_SLOTS: - void onEditClicked(); - void onAddLanguage(const QString &localeLang); - void onDefault(const QString &curLang); - void setCurLangChecked(const QModelIndex &index); - void onSetCurLang(int value); - -private: - void addSystemLanguage(); - -private: - KeyboardModel *m_model; - QStringList m_sysLanglist; - QStandardItemModel *m_langItemModel; - SystemLanguageListView *m_langListview; - DCommandLinkButton *m_editSystemLang; - SystemLanguageSettingWidget *m_settingWidget; - bool m_bEdit{ false }; - DViewItemAction *m_addLayoutAction; -}; -} // namespace DCC_NAMESPACE -#endif // SYSTEMLANGUAGEWIDGET_H diff --git a/dcc-old/src/plugin-keyboard/window/titlebuttonItem.cpp b/dcc-old/src/plugin-keyboard/window/titlebuttonItem.cpp deleted file mode 100644 index d9e0a93312..0000000000 --- a/dcc-old/src/plugin-keyboard/window/titlebuttonItem.cpp +++ /dev/null @@ -1,45 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "titlebuttonItem.h" -#include -#include -#include -#include -using namespace DCC_NAMESPACE; -TitleButtonItem::TitleButtonItem(QFrame *parent) - :SettingsItem(parent) -{ - QHBoxLayout* layout =new QHBoxLayout(); - m_title = new QLabel(); - m_button = new QPushButton(); - - m_title->setWordWrap(true); - - layout->addWidget(m_title); - layout->addStretch(); - layout->addWidget(m_button); - - setLayout(layout); - - connect(m_button, SIGNAL(clicked()), this, SIGNAL(click())); -} - -void TitleButtonItem::setTitle(const QString &title) -{ - m_title->setText(title); - - QTimer::singleShot(1, this, &TitleButtonItem::updateTitleSize); -} - -void TitleButtonItem::setValue(const QString &value) -{ - m_button->setText(value); -} - -void TitleButtonItem::updateTitleSize() -{ - int v = width() - m_button->width() - 32; - if (m_title->fontMetrics().horizontalAdvance(m_title->text()) > v) - m_title->setFixedWidth(v); -} diff --git a/dcc-old/src/plugin-keyboard/window/titlebuttonItem.h b/dcc-old/src/plugin-keyboard/window/titlebuttonItem.h deleted file mode 100644 index f9ac79851a..0000000000 --- a/dcc-old/src/plugin-keyboard/window/titlebuttonItem.h +++ /dev/null @@ -1,33 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef TITLEBUTTONITEM_H -#define TITLEBUTTONITEM_H - -#include "interface/namespace.h" -#include "widgets/settingsitem.h" - -#include -#include -#include - -class TitleButtonItem : public DCC_NAMESPACE::SettingsItem -{ - Q_OBJECT -public: - explicit TitleButtonItem(QFrame* parent = nullptr); - void setTitle(const QString& title); - void setValue(const QString& value); - -Q_SIGNALS: - void click(); - -private: - void updateTitleSize(); - -private: - QLabel *m_title; - QPushButton *m_button; -}; - -#endif // TITLEBUTTONITEM_H diff --git a/dcc-old/src/plugin-mouse/operation/mousedbusproxy.cpp b/dcc-old/src/plugin-mouse/operation/mousedbusproxy.cpp deleted file mode 100644 index e7c6b875f1..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mousedbusproxy.cpp +++ /dev/null @@ -1,353 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "mousedbusproxy.h" - -#include -#include -#include -#include -#include -#include -#include -#include - -using namespace DCC_NAMESPACE; - -const QString Service = "org.deepin.dde.InputDevices1"; -const QString MousePath = "/org/deepin/dde/InputDevice1/Mouse"; -const QString TouchpadPath = "/org/deepin/dde/InputDevice1/TouchPad"; -const QString TrackpointPath = "/org/deepin/dde/InputDevice1/Mouse"; -const QString InputDevicesPath = "/org/deepin/dde/InputDevices1"; -const QString PropertiesInterface = "org.freedesktop.DBus.Properties"; -const QString MouseInterface = "org.deepin.dde.InputDevice1.Mouse"; -const QString TouchpadInterface = "org.deepin.dde.InputDevice1.TouchPad"; -const QString TrackpointInterface = "org.deepin.dde.InputDevice1.TrackPoint"; -const QString InputDevicesInterface = "org.deepin.dde.InputDevices1"; - -MouseDBusProxy::MouseDBusProxy(MouseWorker *worker, QObject *parent) - : QObject(parent) - , m_worker(worker) -{ - init(); -} - -void MouseDBusProxy::active() -{ - // initial mouse settingss - bool exist = m_dbusMouseProperties->call("Get", MouseInterface, "Exist").arguments().at(0).value().variant().toBool(); - bool leftHanded = m_dbusMouseProperties->call("Get", MouseInterface, "LeftHanded").arguments().at(0).value().variant().toBool(); - bool naturalScroll = m_dbusMouseProperties->call("Get", MouseInterface, "NaturalScroll").arguments().at(0).value().variant().toBool(); - int doubleClick = m_dbusMouseProperties->call("Get", MouseInterface, "DoubleClick").arguments().at(0).value().variant().toInt(); - bool disableTpad = m_dbusMouseProperties->call("Get", MouseInterface, "DisableTpad").arguments().at(0).value().variant().toBool(); - bool adaptiveAccelProfile = m_dbusMouseProperties->call("Get", MouseInterface, "AdaptiveAccelProfile").arguments().at(0).value().variant().toBool(); - double motionAcceleration = m_dbusMouseProperties->call("Get", MouseInterface, "MotionAcceleration").arguments().at(0).value().variant().toDouble(); - - m_worker->setMouseExist(exist); - m_worker->setLeftHandState(leftHanded); - m_worker->setMouseNaturalScrollState(naturalScroll); - m_worker->setDouClick(doubleClick); - m_worker->setDisTouchPad(disableTpad); - m_worker->setAccelProfile(adaptiveAccelProfile); - m_worker->setMouseMotionAcceleration(motionAcceleration); - - // initial touchpad settings - motionAcceleration = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "MotionAcceleration").arguments().at(0).value().variant().toDouble(); - bool tapClick = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "TapClick").arguments().at(0).value().variant().toBool(); - exist = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "Exist").arguments().at(0).value().variant().toBool(); - bool touchpadEnabled = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "TPadEnable").arguments().at(0).value().variant().toBool(); - naturalScroll = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "NaturalScroll").arguments().at(0).value().variant().toBool(); - bool disableIfTyping = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "DisableIfTyping").arguments().at(0).value().variant().toBool(); - bool palmDetect = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "PalmDetect").arguments().at(0).value().variant().toInt(); - int palmMinWidth = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "PalmMinWidth").arguments().at(0).value().variant().toInt(); - bool palmMinZ = m_dbusTouchPadProperties->call("Get", TouchpadInterface, "PalmMinZ").arguments().at(0).value().variant().toBool(); - - m_worker->setTouchpadMotionAcceleration(motionAcceleration); - m_worker->setTpadEnabled(touchpadEnabled); - m_worker->setTapClick(tapClick); - m_worker->setTpadExist(exist); - m_worker->setTouchNaturalScrollState(naturalScroll); - m_worker->setDisTyping(disableIfTyping); - m_worker->setPalmDetect(palmDetect); - m_worker->setPalmMinWidth(palmMinWidth); - m_worker->setPalmMinz(palmMinZ); - - // initial redpoint settings - motionAcceleration = m_dbusTrackPointProperties->call("Get", TrackpointInterface, "MotionAcceleration").arguments().at(0).value().variant().toDouble(); - exist = m_dbusTouchPadProperties->call("Get", TrackpointInterface, "Exist").arguments().at(0).value().variant().toBool(); - - m_worker->setTrackPointMotionAcceleration(motionAcceleration); - m_worker->setRedPointExist(exist); - - // initial device properties - uint wheelSpeed = m_dbusDevicesProperties->call("Get", InputDevicesInterface, "WheelSpeed").arguments().at(0).value().variant().toUInt(); - - m_worker->setScrollSpeed(wheelSpeed); -} - -void MouseDBusProxy::deactive() -{ -} - -void MouseDBusProxy::init() -{ - //监控dbus上的属性改变信号 - QDBusConnection::sessionBus().connect(Service, MousePath, PropertiesInterface, "PropertiesChanged", "sa{sv}as", - this, SLOT(onMousePathPropertiesChanged(QDBusMessage))); - - QDBusConnection::sessionBus().connect(Service, TouchpadPath, PropertiesInterface, "PropertiesChanged", "sa{sv}as", - this, SLOT(onTouchpadPathPropertiesChanged(QDBusMessage))); - - QDBusConnection::sessionBus().connect(Service, TrackpointPath, PropertiesInterface, "PropertiesChanged", "sa{sv}as", - this, SLOT(onTrackpointPathPropertiesChanged(QDBusMessage))); - - QDBusConnection::sessionBus().connect(Service, InputDevicesPath, PropertiesInterface, "PropertiesChanged", "sa{sv}as", - this, SLOT(onInputDevicesPathPropertiesChanged(QDBusMessage))); - - //初始化dbus接口 - m_dbusMouseProperties = new QDBusInterface(Service, MousePath, PropertiesInterface, QDBusConnection::sessionBus()); - m_dbusTouchPadProperties = new QDBusInterface(Service, TouchpadPath, PropertiesInterface, QDBusConnection::sessionBus()); - m_dbusTrackPointProperties = new QDBusInterface(Service, TrackpointPath, PropertiesInterface, QDBusConnection::sessionBus()); - m_dbusDevicesProperties = new QDBusInterface(Service, InputDevicesPath, PropertiesInterface, QDBusConnection::sessionBus()); - - m_dbusMouse = new QDBusInterface(Service, MousePath, MouseInterface, QDBusConnection::sessionBus()); - m_dbusTouchPad = new QDBusInterface(Service, TouchpadPath, TouchpadInterface, QDBusConnection::sessionBus()); - m_dbusTrackPoint = new QDBusInterface(Service, TrackpointPath, TrackpointInterface, QDBusConnection::sessionBus()); - m_dbusDevices = new QDBusInterface(Service, InputDevicesPath, InputDevicesInterface, QDBusConnection::sessionBus()); - - - // set Mouse settings from dde-control-center - connect(m_worker, &MouseWorker::requestSetLeftHandState, this, &MouseDBusProxy::setLeftHandState); - connect(m_worker, &MouseWorker::requestSetMouseNaturalScrollState, this, &MouseDBusProxy::setMouseNaturalScrollState); - connect(m_worker, &MouseWorker::requestSetDouClick, this, &MouseDBusProxy::setDouClick); - connect(m_worker, &MouseWorker::requestSetDisTouchPad, this, &MouseDBusProxy::setDisableTouchPadWhenMouseExist); - connect(m_worker, &MouseWorker::requestSetAccelProfile, this, &MouseDBusProxy::setAccelProfile); - connect(m_worker, &MouseWorker::requestSetMouseMotionAcceleration, this, &MouseDBusProxy::setMouseMotionAcceleration); - - // set Touchpad settings from dde-control-center - connect(m_worker, &MouseWorker::requestSetTouchNaturalScrollState, this, &MouseDBusProxy::setTouchNaturalScrollState); - connect(m_worker, &MouseWorker::requestSetDisTyping, this, &MouseDBusProxy::setDisTyping); - connect(m_worker, &MouseWorker::requestSetTouchpadMotionAcceleration, this, &MouseDBusProxy::setTouchpadMotionAcceleration); - connect(m_worker, &MouseWorker::requestSetTapClick, this, &MouseDBusProxy::setTapClick); - connect(m_worker, &MouseWorker::requestSetPalmDetect, this, &MouseDBusProxy::setPalmDetect); - connect(m_worker, &MouseWorker::requestSetPalmMinWidth, this, &MouseDBusProxy::setPalmMinWidth); - connect(m_worker, &MouseWorker::requestSetPalmMinz, this, &MouseDBusProxy::setPalmMinz); - - // set Redpoint settings from dde-control-center - connect(m_worker, &MouseWorker::requestSetTrackPointMotionAcceleration, this, &MouseDBusProxy::setTrackPointMotionAcceleration); - - // set Device properties from dde-control-center - connect(m_worker, &MouseWorker::requestSetScrollSpeed, this, &MouseDBusProxy::setScrollSpeed); - connect(m_worker, &MouseWorker::requestSetTouchpadEnabled, this, &MouseDBusProxy::setTouchpadEnabled); -} - -void MouseDBusProxy::onDefaultReset() -{ - QDBusPendingCallWatcher *watcherMouse = new QDBusPendingCallWatcher(m_dbusMouse->asyncCall("Reset"), this); - QObject::connect(watcherMouse, &QDBusPendingCallWatcher::finished, this, [=](){ - watcherMouse->deleteLater(); - }); - - QDBusPendingCallWatcher *watcherTouchPad = new QDBusPendingCallWatcher(m_dbusTouchPad->asyncCall("Reset"), this); - QObject::connect(watcherTouchPad, &QDBusPendingCallWatcher::finished, this, [=](){ - watcherTouchPad->deleteLater(); - }); - - QDBusPendingCallWatcher *watcherTrackPoint = new QDBusPendingCallWatcher(m_dbusTrackPoint->asyncCall("Reset"), this); - QObject::connect(watcherTrackPoint, &QDBusPendingCallWatcher::finished, this, [=](){ - watcherTrackPoint->deleteLater(); - }); - - QDBusPendingCallWatcher *watcherDevices = new QDBusPendingCallWatcher(m_dbusDevices->asyncCall("Reset"), this); - QObject::connect(watcherDevices, &QDBusPendingCallWatcher::finished, this, [=](){ - watcherDevices->deleteLater(); - }); -} - -void MouseDBusProxy::setLeftHandState(const bool state) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "LeftHanded", state); - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "LeftHanded", state); - m_dbusTrackPointProperties->call("Set", TrackpointInterface, "LeftHanded", state); -} - -void MouseDBusProxy::setDouClick(const int &value) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "DoubleClick", value); - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "DoubleClick", value); -} - -void MouseDBusProxy::setMouseNaturalScrollState(const bool state) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "NaturalScroll", state); -} - -void MouseDBusProxy::setDisableTouchPadWhenMouseExist(const bool state) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "DisableTpad", state); -} - -void MouseDBusProxy::setAccelProfile(const bool state) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "AdaptiveAccelProfile", state); -} - -void MouseDBusProxy::setMouseMotionAcceleration(const double &value) -{ - m_dbusMouseProperties->call("Set", MouseInterface, "MotionAcceleration", value); -} - -void MouseDBusProxy::setTouchNaturalScrollState(const bool state) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "NaturalScroll", state); -} - -void MouseDBusProxy::setDisTyping(const bool state) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "DisableIfTyping", state); -} - -void MouseDBusProxy::setTouchpadMotionAcceleration(const double &value) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "MotionAcceleration", value); -} - -void MouseDBusProxy::setTapClick(const bool state) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "TapClick", state); -} - -void MouseDBusProxy::setPalmDetect(bool palmDetect) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "PalmDetect", palmDetect); -} - -void MouseDBusProxy::setPalmMinWidth(int palmMinWidth) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "PalmMinWidth", palmMinWidth); -} - -void MouseDBusProxy::setPalmMinz(int palmMinz) -{ - m_dbusTouchPadProperties->call("Set", TouchpadInterface, "PalmMinZ", palmMinz); -} - -void MouseDBusProxy::setTouchpadEnabled(bool state) -{ - m_dbusTouchPad->asyncCallWithArgumentList("Enable", { state }); -} - -void MouseDBusProxy::setTrackPointMotionAcceleration(const double &value) -{ - m_dbusTrackPointProperties->call("Set", TrackpointInterface, "MotionAcceleration", value); -} - -void MouseDBusProxy::setScrollSpeed(uint speed) -{ - m_dbusDevicesProperties->call("Set", InputDevicesInterface, "WheelSpeed", speed); -} - - -void MouseDBusProxy::onMousePathPropertiesChanged(QDBusMessage msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) { - return; - } - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName == MouseInterface) { - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - for (int i = 0; i < keys.size(); i++) { - if (keys.at(i) == "Exist") { - m_worker->setMouseExist(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "LeftHanded") { - m_worker->setLeftHandState(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "NaturalScroll") { - m_worker->setMouseNaturalScrollState(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "DoubleClick") { - m_worker->setDouClick(changedProps.value(keys.at(i)).toInt()); - } else if(keys.at(i) == "DisableTpad") { - m_worker->setDisTouchPad(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "AdaptiveAccelProfile") { - m_worker->setAccelProfile(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "MotionAcceleration") { - m_worker->setMouseMotionAcceleration(changedProps.value(keys.at(i)).toDouble()); - } - } - } -} - -void MouseDBusProxy::onTouchpadPathPropertiesChanged(QDBusMessage msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) { - return; - } - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName == TouchpadInterface) { - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - for (int i = 0; i < keys.size(); i++) { - if (keys.at(i) == "Exist") { - m_worker->setTpadExist(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "TPadEnable") { - m_worker->setTpadEnabled(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "NaturalScroll") { - m_worker->setTouchNaturalScrollState(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "DisableIfTyping") { - m_worker->setDisTyping(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "DoubleClick") { - m_worker->setDouClick(changedProps.value(keys.at(i)).toInt()); - } else if(keys.at(i) == "MotionAcceleration") { - m_worker->setTouchpadMotionAcceleration(changedProps.value(keys.at(i)).toDouble()); - } else if(keys.at(i) == "TapClick") { - m_worker->setTapClick(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "PalmDetect") { - m_worker->setPalmDetect(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "PalmMinWidth") { - m_worker->setPalmMinWidth(changedProps.value(keys.at(i)).toInt()); - } else if(keys.at(i) == "PalmMinZ") { - m_worker->setPalmMinz(changedProps.value(keys.at(i)).toInt()); - } - } - } -} - -void MouseDBusProxy::onTrackpointPathPropertiesChanged(QDBusMessage msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) { - return; - } - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName == TrackpointInterface) { - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - for (int i = 0; i < keys.size(); i++) { - if (keys.at(i) == "Exist") { - m_worker->setRedPointExist(changedProps.value(keys.at(i)).toBool()); - } else if(keys.at(i) == "MotionAcceleration") { - m_worker->setTrackPointMotionAcceleration(changedProps.value(keys.at(i)).toDouble()); - } - } - } -} - -void MouseDBusProxy::onInputDevicesPathPropertiesChanged(QDBusMessage msg) -{ - QList arguments = msg.arguments(); - if (3 != arguments.count()) { - return; - } - QString interfaceName = msg.arguments().at(0).toString(); - if (interfaceName == InputDevicesInterface) { - QVariantMap changedProps = qdbus_cast(arguments.at(1).value()); - QStringList keys = changedProps.keys(); - for (int i = 0; i < keys.size(); i++) { - if (keys.at(i) == "WheelSpeed") { - m_worker->setScrollSpeed(changedProps.value(keys.at(i)).toUInt()); - } - } - } -} diff --git a/dcc-old/src/plugin-mouse/operation/mousedbusproxy.h b/dcc-old/src/plugin-mouse/operation/mousedbusproxy.h deleted file mode 100644 index f43df873a8..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mousedbusproxy.h +++ /dev/null @@ -1,73 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MOUSEDBUSPROXY_H -#define MOUSEDBUSPROXY_H - -#include "mouseworker.h" - -#include -#include - -class QDBusInterface; - -namespace DCC_NAMESPACE { -class MouseDBusProxy : public QObject -{ - Q_OBJECT -public: - explicit MouseDBusProxy(MouseWorker *worker, QObject *parent = nullptr); - void active(); - void deactive(); - void init(); - -public Q_SLOTS: - void onDefaultReset(); - void setLeftHandState(const bool state); - void setDouClick(const int &value); - - // mouse settings - void setMouseNaturalScrollState(const bool state); - void setDisableTouchPadWhenMouseExist(const bool state); - void setAccelProfile(const bool state); - void setMouseMotionAcceleration(const double &value); - - // touchpad settings - void setTouchNaturalScrollState(const bool state); - void setDisTyping(const bool state); - void setTouchpadMotionAcceleration(const double &value); - void setTapClick(const bool state); - void setPalmDetect(bool palmDetect); - void setPalmMinWidth(int palmMinWidth); - void setPalmMinz(int palmMinz); - void setTouchpadEnabled(bool state); - - // redpoint settings - void setTrackPointMotionAcceleration(const double &value); - - // device properties - void setScrollSpeed(uint speed); - - void onMousePathPropertiesChanged(QDBusMessage msg); - void onTouchpadPathPropertiesChanged(QDBusMessage msg); - void onTrackpointPathPropertiesChanged(QDBusMessage msg); - void onInputDevicesPathPropertiesChanged(QDBusMessage msg); - -private: - MouseWorker *m_worker; - QDBusInterface *m_dbusMouseProperties; - QDBusInterface *m_dbusTouchPadProperties; - QDBusInterface *m_dbusTrackPointProperties; - QDBusInterface *m_dbusDevicesProperties; - - QDBusInterface *m_dbusMouse; - QDBusInterface *m_dbusTouchPad; - QDBusInterface *m_dbusTrackPoint; - QDBusInterface *m_dbusDevices; - -}; -} - - - -#endif // MOUSEWORKER_H diff --git a/dcc-old/src/plugin-mouse/operation/mousemodel.cpp b/dcc-old/src/plugin-mouse/operation/mousemodel.cpp deleted file mode 100644 index 203b8383ee..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mousemodel.cpp +++ /dev/null @@ -1,224 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "mousemodel.h" - -using namespace DCC_NAMESPACE; -MouseModel::MouseModel(QObject *parent) - : QObject(parent) - , m_leftHandState(false) - , m_disIfTyping(false) - , m_tpadExist(false) - , m_mouseExist(true) - , m_redPointExist(false) - , m_mouseNaturalScroll(false) - , m_tpadNaturalScroll(false) - , m_accelProfile(true) - , m_disTpad(false) - , m_palmDetect(false) - , m_tapclick(false) - , m_touchpadEnabled(true) - , m_doubleSpeed(1) - , m_mouseMoveSpeed(1) - , m_tpadMoveSpeed(1) - , m_redPointMoveSpeed(1) - , m_palmMinWidth(1) - , m_palmMinz(100) - , m_scrollSpeed(1) -{ -} - -MouseModel::~MouseModel() -{ - -} - -void MouseModel::setLeftHandState(const bool state) -{ - if (m_leftHandState == state) - return; - - m_leftHandState = state; - - Q_EMIT leftHandStateChanged(state); -} - -void MouseModel::setDisIfTyping(const bool state) -{ - if (m_disIfTyping == state) - return; - - m_disIfTyping = state; - - Q_EMIT disIfTypingStateChanged(state); -} - -void MouseModel::setTpadExist(bool tpadExist) -{ - if (m_tpadExist == tpadExist) - return; - - m_tpadExist = tpadExist; - - Q_EMIT tpadExistChanged(tpadExist); -} - -void MouseModel::setMouseExist(bool mouseExist) -{ - if (m_mouseExist == mouseExist) - return; - - m_mouseExist = mouseExist; - - Q_EMIT mouseExistChanged(mouseExist); -} - -void MouseModel::setRedPointExist(bool redPointExist) -{ - if (m_redPointExist == redPointExist) - return; - - m_redPointExist = redPointExist; - - Q_EMIT redPointExistChanged(redPointExist); -} - -void MouseModel::setDoubleSpeed(int doubleSpeed) -{ - if (m_doubleSpeed == doubleSpeed) - return; - - m_doubleSpeed = doubleSpeed; - - Q_EMIT doubleSpeedChanged(doubleSpeed); -} - -void MouseModel::setMouseNaturalScroll(bool mouseNaturalScroll) -{ - if (m_mouseNaturalScroll == mouseNaturalScroll) - return; - - m_mouseNaturalScroll = mouseNaturalScroll; - - Q_EMIT mouseNaturalScrollChanged(mouseNaturalScroll); -} - -void MouseModel::setTpadNaturalScroll(bool tpadNaturalScroll) -{ - if (m_tpadNaturalScroll == tpadNaturalScroll) - return; - - m_tpadNaturalScroll = tpadNaturalScroll; - - Q_EMIT tpadNaturalScrollChanged(tpadNaturalScroll); -} - -void MouseModel::setMouseMoveSpeed(int mouseMoveSpeed) -{ - if (m_mouseMoveSpeed == mouseMoveSpeed) - return; - - m_mouseMoveSpeed = mouseMoveSpeed; - - Q_EMIT mouseMoveSpeedChanged(mouseMoveSpeed); -} - -void MouseModel::setTpadMoveSpeed(int tpadMoveSpeed) -{ - if (m_tpadMoveSpeed == tpadMoveSpeed) - return; - - m_tpadMoveSpeed = tpadMoveSpeed; - - Q_EMIT tpadMoveSpeedChanged(tpadMoveSpeed); -} - -void MouseModel::setAccelProfile(bool useAdaptiveProfile) -{ - if (m_accelProfile == useAdaptiveProfile) - return; - - m_accelProfile = useAdaptiveProfile; - - Q_EMIT accelProfileChanged(useAdaptiveProfile); -} - -void MouseModel::setDisTpad(bool disTpad) -{ - if (m_disTpad == disTpad) - return; - - m_disTpad = disTpad; - - Q_EMIT disTpadChanged(disTpad); -} - -void MouseModel::setRedPointMoveSpeed(int redPointMoveSpeed) -{ - if (m_redPointMoveSpeed == redPointMoveSpeed) - return; - - m_redPointMoveSpeed = redPointMoveSpeed; - - Q_EMIT redPointMoveSpeedChanged(redPointMoveSpeed); -} - -void MouseModel::setPalmDetect(bool palmDetect) -{ - if (m_palmDetect == palmDetect) - return; - - m_palmDetect = palmDetect; - - Q_EMIT palmDetectChanged(palmDetect); -} - -void MouseModel::setPalmMinWidth(int palmMinWidth) -{ - if (m_palmMinWidth == palmMinWidth) - return; - - m_palmMinWidth = palmMinWidth; - - Q_EMIT palmMinWidthChanged(palmMinWidth); -} - -void MouseModel::setPalmMinz(int palmMinz) -{ - if (m_palmMinz == palmMinz) - return; - - m_palmMinz = palmMinz; - - Q_EMIT palmMinzChanged(palmMinz); -} - -void MouseModel::setTapClick(bool tapclick) -{ - if (m_tapclick == tapclick) - return; - - m_tapclick = tapclick; - - Q_EMIT tapClickChanged(tapclick); -} - -void MouseModel::setTapEnabled(bool tabEnabled) -{ - if (m_touchpadEnabled == tabEnabled) - return; - - m_touchpadEnabled = tabEnabled; - - Q_EMIT tapEnabledChanged(tabEnabled); -} - -void MouseModel::setScrollSpeed(uint speed) -{ - if (m_scrollSpeed == speed) - return; - - m_scrollSpeed = speed; - - Q_EMIT scrollSpeedChanged(speed); -} diff --git a/dcc-old/src/plugin-mouse/operation/mousemodel.h b/dcc-old/src/plugin-mouse/operation/mousemodel.h deleted file mode 100644 index 885e7053de..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mousemodel.h +++ /dev/null @@ -1,125 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MOUSEMODEL_H -#define MOUSEMODEL_H - -#include "interface/namespace.h" - -#include -#include - -namespace DCC_NAMESPACE { -class MouseModel : public QObject -{ - Q_OBJECT - friend class MouseWorker; -public: - explicit MouseModel(QObject *parent = nullptr); - ~MouseModel(); - - inline bool leftHandState() const { return m_leftHandState; } - void setLeftHandState(const bool state); - - void setDisIfTyping(const bool state); - inline bool disIfTyping() const { return m_disIfTyping; } - - inline bool tpadExist() const { return m_tpadExist; } - void setTpadExist(bool tpadExist); - - inline bool mouseExist() const { return m_mouseExist; } - void setMouseExist(bool mouseExist); - - inline bool redPointExist() const { return m_redPointExist; } - void setRedPointExist(bool redPointExist); - - inline int doubleSpeed() const { return m_doubleSpeed; } - void setDoubleSpeed(int doubleSpeed); - - inline bool mouseNaturalScroll() const { return m_mouseNaturalScroll; } - void setMouseNaturalScroll(bool mouseNaturalScroll); - - inline bool tpadNaturalScroll() const { return m_tpadNaturalScroll; } - void setTpadNaturalScroll(bool tpadNaturalScroll); - - inline int mouseMoveSpeed() const { return m_mouseMoveSpeed; } - void setMouseMoveSpeed(int mouseMoveSpeed); - - inline int tpadMoveSpeed() const { return m_tpadMoveSpeed; } - void setTpadMoveSpeed(int tpadMoveSpeed); - - inline bool accelProfile() const { return m_accelProfile; } - void setAccelProfile(bool useAdaptiveProfile); - - inline bool disTpad() const { return m_disTpad; } - void setDisTpad(bool disTpad); - - inline int redPointMoveSpeed() const { return m_redPointMoveSpeed; } - void setRedPointMoveSpeed(int redPointMoveSpeed); - - inline bool palmDetect() const { return m_palmDetect; } - void setPalmDetect(bool palmDetect); - - inline int palmMinWidth() const { return m_palmMinWidth; } - void setPalmMinWidth(int palmMinWidth); - - inline int palmMinz() const { return m_palmMinz; } - void setPalmMinz(int palmMinz); - - bool tapclick() const { return m_tapclick; } - void setTapClick(bool tapclick); - - bool tapEnabled() const { return m_touchpadEnabled; } - void setTapEnabled(bool tapEnabled); - - uint scrollSpeed() const { return m_scrollSpeed; } - void setScrollSpeed(uint speed); - -Q_SIGNALS: - void leftHandStateChanged(bool state); - void disIfTypingStateChanged(bool state); - void tpadExistChanged(bool tpadExist); - void mouseExistChanged(bool mouseExist); - void redPointExistChanged(bool rPointExist); - void doubleSpeedChanged(int speed); - void mouseNaturalScrollChanged(bool natural); - void tpadNaturalScrollChanged(bool natural); - void mouseMoveSpeedChanged(int speed); - void tpadMoveSpeedChanged(int speed); - void accelProfileChanged(bool useAdaptiveProfile); - void redPointMoveSpeedChanged(int speed); - void disTpadChanged(bool disable); - void palmDetectChanged(bool detect); - void palmMinWidthChanged(int palmMinWidth); - void palmMinzChanged(int palmMinz); - void tapClickChanged(bool tapclick); - void tapEnabledChanged(bool tapclick); - void scrollSpeedChanged(uint speed); - -private: - bool m_leftHandState; - bool m_disIfTyping; - bool m_tpadExist; - bool m_mouseExist; - bool m_redPointExist; - bool m_mouseNaturalScroll; - bool m_tpadNaturalScroll; - bool m_accelProfile; - bool m_disTpad; - bool m_palmDetect; - bool m_tapclick; - bool m_touchpadEnabled; - int m_doubleSpeed; - int m_mouseMoveSpeed; - int m_tpadMoveSpeed; - int m_redPointMoveSpeed; - int m_palmMinWidth; - int m_palmMinz; - uint m_scrollSpeed; -}; - -} - - - -#endif // MOUSEMODEL_H diff --git a/dcc-old/src/plugin-mouse/operation/mouseworker.cpp b/dcc-old/src/plugin-mouse/operation/mouseworker.cpp deleted file mode 100644 index 51bfa66815..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mouseworker.cpp +++ /dev/null @@ -1,243 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#include "mouseworker.h" - -using namespace DCC_NAMESPACE; -const QString Service = "org.deepin.dde.InputDevices1"; - -MouseWorker::MouseWorker(MouseModel *model, QObject *parent) - : QObject(parent) - , m_model(model) -{ - -} - -void MouseWorker::setMouseExist(bool exist) -{ - m_model->setMouseExist(exist); -} - -void MouseWorker::setTpadExist(bool exist) -{ - m_model->setTpadExist(exist); -} - -void MouseWorker::setTpadEnabled(bool enabled) -{ - m_model->setTapEnabled(enabled); -} - -void MouseWorker::setRedPointExist(bool exist) -{ - m_model->setRedPointExist(exist); -} - -void MouseWorker::setLeftHandState(const bool state) -{ - m_model->setLeftHandState(state); -} - -void MouseWorker::setMouseNaturalScrollState(const bool state) -{ - m_model->setMouseNaturalScroll(state); -} - -void MouseWorker::setTouchNaturalScrollState(const bool state) -{ - m_model->setTpadNaturalScroll(state); -} - -void MouseWorker::setDisTyping(const bool state) -{ - m_model->setDisIfTyping(state); -} - -void MouseWorker::setDisTouchPad(const bool state) -{ - m_model->setDisTpad(state); -} - -void MouseWorker::setTapClick(const bool state) -{ - m_model->setTapClick(state); -} - -void MouseWorker::setDouClick(const int &value) -{ - m_model->setDoubleSpeed(converToDoubleModel(value)); -} - -void MouseWorker::setMouseMotionAcceleration(const double &value) -{ - m_model->setMouseMoveSpeed(converToModelMotionAcceleration(value)); -} - -void MouseWorker::setAccelProfile(const bool state) -{ - m_model->setAccelProfile(state); -} - -void MouseWorker::setTouchpadMotionAcceleration(const double &value) -{ - m_model->setTpadMoveSpeed(converToModelMotionAcceleration(value)); -} - -void MouseWorker::setTrackPointMotionAcceleration(const double &value) -{ - m_model->setRedPointMoveSpeed(converToModelMotionAcceleration(value)); -} - -void MouseWorker::setPalmDetect(bool palmDetect) -{ - m_model->setPalmDetect(palmDetect); -} - -void MouseWorker::setPalmMinWidth(int palmMinWidth) -{ - m_model->setPalmMinWidth(palmMinWidth); -} - -void MouseWorker::setPalmMinz(int palmMinz) -{ - m_model->setPalmMinz(palmMinz); -} - -void MouseWorker::setScrollSpeed(uint speed) -{ - m_model->setScrollSpeed(speed); -} - - -void MouseWorker::onPalmDetectChanged(bool palmDetect) -{ - Q_EMIT requestSetPalmDetect(palmDetect); -} - -void MouseWorker::onPalmMinWidthChanged(int palmMinWidth) -{ - Q_EMIT requestSetPalmMinWidth(palmMinWidth); -} - -void MouseWorker::onPalmMinzChanged(int palmMinz) -{ - Q_EMIT requestSetPalmMinz(palmMinz); -} - -void MouseWorker::onScrollSpeedChanged(int speed) -{ - Q_EMIT requestSetScrollSpeed(static_cast(speed)); -} - -void MouseWorker::onTouchpadEnabledChanged(const bool state) -{ - Q_EMIT requestSetTouchpadEnabled(state); -} - -void MouseWorker::onLeftHandStateChanged(const bool state) -{ - Q_EMIT requestSetLeftHandState(state); -} - -void MouseWorker::onMouseNaturalScrollStateChanged(const bool state) -{ - Q_EMIT requestSetMouseNaturalScrollState(state); -} - -void MouseWorker::onTouchNaturalScrollStateChanged(const bool state) -{ - Q_EMIT requestSetTouchNaturalScrollState(state); -} - -void MouseWorker::onDisTypingChanged(const bool state) -{ - Q_EMIT requestSetDisTyping(state); -} - -void MouseWorker::onDisTouchPadChanged(const bool state) -{ - Q_EMIT requestSetDisTouchPad(state); -} - -void MouseWorker::onTapClick(const bool state) -{ - Q_EMIT requestSetTapClick(state); -} - -void MouseWorker::onDouClickChanged(const int &value) -{ - Q_EMIT requestSetDouClick(converToDouble(value)); -} - -void MouseWorker::onMouseMotionAccelerationChanged(const int &value) -{ - Q_EMIT requestSetMouseMotionAcceleration(converToMotionAcceleration(value)); -} - -void MouseWorker::onAccelProfileChanged(const bool state) -{ - Q_EMIT requestSetAccelProfile(state); -} - -void MouseWorker::onTouchpadMotionAccelerationChanged(const int &value) -{ - Q_EMIT requestSetTouchpadMotionAcceleration(converToMotionAcceleration(value)); -} - -void MouseWorker::onTrackPointMotionAccelerationChanged(const int &value) -{ - Q_EMIT requestSetTrackPointMotionAcceleration(converToMotionAcceleration(value)); -} - -int MouseWorker::converToDouble(int value) -{ - return 800 - value * 100; -} - -int MouseWorker::converToDoubleModel(int value) -{ - return (800 - value) / 100; -} -//conver slider value to real value -double MouseWorker::converToMotionAcceleration(int value) -{ - switch (value) { - case 0: - return 3.2; - case 1: - return 2.3; - case 2: - return 1.6; - case 3: - return 1.0; - case 4: - return 0.6; - case 5: - return 0.3; - case 6: - return 0.2; - default: - return 1.0; - } -} -//conver real value to slider value -int MouseWorker::converToModelMotionAcceleration(double value) -{ - if (value <= 0.2) { - return 6; - } else if (value <= 0.3) { - return 5; - } else if (value <= 0.6) { - return 4; - } else if (value <= 1.0) { - return 3; - } else if (value <= 1.6) { - return 2; - } else if (value <= 2.3) { - return 1; - } else if (value <= 3.2) { - return 0; - } else { - return 3; - } -} diff --git a/dcc-old/src/plugin-mouse/operation/mouseworker.h b/dcc-old/src/plugin-mouse/operation/mouseworker.h deleted file mode 100644 index 46562dc8d6..0000000000 --- a/dcc-old/src/plugin-mouse/operation/mouseworker.h +++ /dev/null @@ -1,92 +0,0 @@ -//SPDX-FileCopyrightText: 2018 - 2023 UnionTech Software Technology Co., Ltd. -// -//SPDX-License-Identifier: GPL-3.0-or-later -#ifndef MOUSEWORKER_H -#define MOUSEWORKER_H - -#include "interface/namespace.h" -#include "mousemodel.h" - -#include - - -namespace DCC_NAMESPACE { -class MouseWorker : public QObject -{ - Q_OBJECT -public: - explicit MouseWorker(MouseModel *model, QObject *parent = nullptr); - void active(); - void deactive(); - void init(); - -public Q_SLOTS: - void setMouseExist(bool exist); - void setTpadExist(bool exist); - void setTpadEnabled(bool enabled); - void setRedPointExist(bool exist); - void setLeftHandState(const bool state); - void setMouseNaturalScrollState(const bool state); - void setTouchNaturalScrollState(const bool state); - void setDisTyping(const bool state); - void setDisTouchPad(const bool state); - void setTapClick(const bool state); - void setDouClick(const int &value); - void setMouseMotionAcceleration(const double &value); - void setAccelProfile(const bool state); - void setTouchpadMotionAcceleration(const double &value); - void setTrackPointMotionAcceleration(const double &value); - void setPalmDetect(bool palmDetect); - void setPalmMinWidth(int palmMinWidth); - void setPalmMinz(int palmMinz); - void setScrollSpeed(uint speed); - - void onLeftHandStateChanged(const bool state); - void onMouseNaturalScrollStateChanged(const bool state); - void onTouchNaturalScrollStateChanged(const bool state); - void onDisTypingChanged(const bool state); - void onDisTouchPadChanged(const bool state); - void onTapClick(const bool state); - void onDouClickChanged(const int &value); - void onMouseMotionAccelerationChanged(const int &value); - void onAccelProfileChanged(const bool state); - void onTouchpadMotionAccelerationChanged(const int &value); - void onTrackPointMotionAccelerationChanged(const int &value); - void onPalmDetectChanged(bool palmDetect); - void onPalmMinWidthChanged(int palmMinWidth); - void onPalmMinzChanged(int palmMinz); - void onScrollSpeedChanged(int speed); - void onTouchpadEnabledChanged(const bool state); - -Q_SIGNALS: - void requestSetPalmDetect(bool palmDetect); - void requestSetPalmMinWidth(int palmMinWidth); - void requestSetPalmMinz(int palmMinz); - void requestSetScrollSpeed(uint speed); - void requestSetLeftHandState(const bool state); - void requestSetMouseNaturalScrollState(const bool state); - void requestSetTouchNaturalScrollState(const bool state); - void requestSetDisTyping(const bool state); - void requestSetDisTouchPad(const bool state); - void requestSetTapClick(const bool state); - void requestSetDouClick(const int &value); - void requestSetMouseMotionAcceleration(const double &value); - void requestSetAccelProfile(const bool state); - void requestSetTouchpadMotionAcceleration(const double &value); - void requestSetTrackPointMotionAcceleration(const double &value); - void requestSetTouchpadEnabled(const bool state); - -private: - int converToDouble(int value); - int converToDoubleModel(int value); - double converToMotionAcceleration(int value); - int converToModelMotionAcceleration(double value); - -private: - MouseModel *m_model; -}; -} - - - -#endif // MOUSEWORKER_H diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00001.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00001.png deleted file mode 100644 index f0805ed4f7245caf6acb0ba15cb216303aef0a17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6214 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%0A1=pc%9FL(1f7+Y1s8)YPs#zXYXX;Nx^O{O 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 ZLCt?@BK2j3@C8vsNnS;+NY*6a{{eHuiFW`1 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002.png deleted file mode 100644 index 9c3f539f7c6dfc4d24c924c9c1b3373a3d39772e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6204 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00002@2x.png deleted file mode 100644 index fb5c5d313a1865e67a80e525550937f04bd5b923..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14874 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003.png deleted file mode 100644 index f1b2ba1a26c65d2c4b1293cee5de30e9a2672418..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6136 zcmXw7cRZEv8-5Qbj=g1tPRKafJ6Rp85ZRKwla(DIo22x$<8V&aL75?yy*h;KvPbsH zmhpS~hbv;jc}Of)E)`w7c)!G4j+F(zx{61g z?jIk*8?@N%DC}#CvV17)sxHN2wHT_YGB?~WxBII-HxBJKCm8`{(z|=xR1)3Wz2w5DJBfc8eNG^bC_Bz3B!HW0#4M zY#VlDZw_im6M`TiFXi$w2< zl~KmUzN8=cGK@qdytr^evMG>mpwUjT&I#j^CRbv+)X^R}oe*mR}it zp@YtdM;8k^h_hy9XXk4>cHaPxgyG!;L=#z%bFj~d8IS!#`ZzdtfZx#QQmd$E!{qkg zGtYX9a#O)Sa%3|m(0R5^`ihXI5b+E%bPpPftn?CMBu~%DQCHy95Kfa=_HcGqe)#a= zPFW$$&5p%!@6JF_o~Qw|3gaNwBZctzxwbflE_-oq!O6W}8-9_hSK&nAcb@0Mj^Itt zpe-x+1RMR<(`#WEsOW~fff3VA0LT3N{40k*vPtHIOYAc4k^J%P9-%2V>6eACC#DgN zw0*s1YOe?_>;}HOFThBCsR$phnrHp_$BJZhbaemVU_^0o@t-Xlm=7cipCL62^k{<3 zzz|R=goZx0H;%L)9=HFcqnoB@7hT7EdOjxjUNB0Uh=!X z&qs3!N@ETFTaj3PqE4@tM472&XE(R%hDrCSSgtt~lasr6{I|o2CrQ4+!KeC|zC)&*C9{XSv~+yeuhS)}-(9{`j)ov>KR@RE{rz^2 z$HaP4&!{BQ!nR-m7LA;&tj*nTuJ3>3U9CRNTnenNuFn1VkvW;?YPRm}REM*vonXa_ zoL)z}hr*+-Dzu+DI^!r?O!^Gy|1s$E7yiWF9;1MdN4;z@DHFALs)RZ~Ffhp{%NUCV#w8!ZOk=w~UHqOon zP;`DqasWI}S&ohzdtMJK;WQy;h&_xC8vP9Yr)*?Ygm)Ef_(7k`PyYM&?^lFHT1t|E zsi~KG{P5aeA??fNjQp|K*s=$;w(joKgM))CoSYp;N3w3x>=W)X0XZ^?1}MtR0@h3y zI%F7rhtx0;a?Ui?C#I#7)M=fV;Na0x4GFpBUN=hu;w@hvp1xaeAzWu6EGZ>*l`{#~ z*vM63O6k{d#l4oD!=y3^-YVL)=)Gvg@YNNLA$BAWGY)R9bW@|^)}ja9q?$+j@$s){ zJ^pI!r!VH#X3WjjwBgDSz&5Bf3p;zn^j6HIyGVVlHZep2`+yJ2AkwRRGbj7r-lWVW zv!bG5f8;^Mv$K=Mw<-nCZCKz$Ft_QiR|<8rRsH>Cc(k5(&cj+otyvu7YM>@Y89&~1 zmn2PfkTd>ZcsDwm>p`fqIa3-Azc%rt3qS_^<|JtS$O0EV#!FzdCB|hf5B(>jl({{-uTas@%x~0A zcg(iNh~2#Tbn5YCVu1h227eqt8Uq6ZC|0fKY z{U^Lg-98c+j&=CnymDY2cVhd5w=s-No_m89ynrw27y@nHi2DD<^1dNI=M0 zl2lEiFI3UjVbu;*X4*PBHXyGAaiuiE>`<`*3maR@&=BMIw{j83$AQk7B&iNpOx2r{5@MV<)Ih4_1V(gJiUVm{1;T)TE{d2=%w z%MX$b;^s!0mKm3$D3H%l1aRlk=zBGgQ}QSx5KDyvA(i3>A|9JtSV&rU4-?&P`;Sb- z#Kd4F!{iC=w&}hg9aw(b-QT^@_5Q6?GS-uye3_zzUu$w_>*8u^m?&F=vux6@iv-OG zU+a-BZE$pS%ynV=Y`K-Jj%?YP?-Uaig&HPb);t<*v8@2<&MhgSKoQu8Kqps@qX7T) zkBuRcIstJDeBS+j^Jrp8(cf~@Rx5eCQ|X)zRBP6grNrcex`6@1r%#_~lRBwjdPYnj zC{QV4d2%OCEYMHxOKR<;;H2Yi&L;fcl?5f8Ldm5oXX%yjys`xKUeM zd!cpKv)ycPdO9gD@9NRnGayOecW7h;3&z5kL<*W5Kvz1e*ECH{zpbka;p*y2OCAM= zq!wgq&ZQ5+bG?S|(-#XK44?{GHN4b01Tfx`etHxIezvg!8nu9TYq%p1Ghf_~! ziVeTT(s*(>Azr>GGc=M)Ru5L>l6~3Q(?c2b^r_cwuZ+n=IUOB<&8uEVIs|-XC*W1L zz30)k4Pe1wMVg$YyC=3R9sLRe&WyEFK|%pJq=ZVAD_7J+SZH1)qaWjy!J);S$Kq~-`c&sul z9DEdfv9;KU8lW)C{gVJuQ()Y@znOIbG&B)%IO&gV(bnXlFE=kM|FuC2hXHJMV^dhL zxO4$P7(g>Bf(r-Z0K$S5t^TmyTIyf%QDs!K!=>HHr-T(%yD?J0%B`hW%{8ZmP)p`h zRZe{yraoaAR8{aWFZt}Rz?NjEuo)CHf`A=w5-NdiM9Vyu`(^!#O zBOg-q+@T2t^IV^9Y*eF-hV;r;Mnr}RIE@vgqnjCWa{?fttn2^ln~ zcSTHABBZGf&0cS99G1@>pi=MXD??%2i2c8ZTOKM*kx{+$&>^7A&;Tv6A4Ttz$MlUH}aFz^zY8&p^RRByjFdcP}e{o|3m06%N zSnY5t3o1YQyFr-pOtH>{0u*xg2~t4{oRFv^GK@kOA#gyC$CIn+Qzkr*ePK)eavn5$ z;zFYLMN54yMVv0Cz@_7`lm|*^yvSsP2)}!?CXGv^DkrFP3mK?mT1`9Sx=fkF@?GW^ z`<-rfdZ|~s3qAZsnz%IGQoP)@;+H0rpY1aL{_$TYDfQ&n5G9UI{@qJ4J?b-{5omth9*+?tyGw}F;Gl6-xA0fM@gcDIj%0bYf~)iB|BJd!?+MPQscp}me- zjSdL6YG|mEYTl~~{gRTBh+apDNN(`J8EQ1`{id2enxFAGkOm&InwlD+@6WCz%zO5d zh4BJKHL*bhe&A+J5X&P@yY$NBMNsi7b*r68+HRO{9uEW2juYEcIQx4ih@ZA}*hR$2$;q>^{{C$yhLt*etU6Al zx~Aq9-sLAZUK#4yyZxrXW#I2t<3+cHu>Uu-yfDQc3J3UDo6l}YjPY6;A^X$C`CrVC z1-o73uLS>oZ;}(V&4cywDbM_Gaqh8Ep#- zJRO~#z$(1%wilI=i7^z60t$jlj*E2+JzKL1J*SwS`7384?4#fN|XlwaLFc7NG!E3KvvI87hm2Gi%n z7`LjuB>TN+dQg%I%Wvsbri|7s9Q-H9v4~mEu_7ch90vM6mU^`YhUITr+qdn_lzIt_ zQusBEmp!(#&TsL`H3$gy$};rKmr$USW$~caeUgPd%JhrwJubr#>%g3tUdM>OB|sCm zk*}2nQ^fy}d_aVwfh2;d%571WHoQ?u>H<58G}^|raFBI#dHKjkFlBXhef08?6UD~QdB^Z?$17(QU zsJ9XXuGO}Jg(zH^Y?nz*g|BL_4il`HbWiaZ9$(qk-W;i#ch7D%w+o*hJdA{DtWJKU zeeI}p)4E|Khw}yY>of3HyeVH%1SBK5QIKjUuN{~!q9Zdi8=3c3J4ZoVpz1?`leV+7 zBV19}H`?5yCy$HGkLtue98M!Fde=>EzVx0G6k~&suMvP26i=3M$!-s0TJ`mIP-#ASSa_E^O$uu%T zceAD~3M}KZqrL)?&J%e@EIEEZ~*`* z9c=tMjHzpbXM4P0-s8O z!{I{W&~pMhgXjC(^)9JANnQP3>Cm;<4Ia z&klYm)dLt!8yfk-`IcbJICD7n^!RuNRZMFk2q^#uI-YgdR{e6sQXr5mY+jztLQ^>L zbm)3Try`t|Gz=K>ySD1=GND<;_;4P z(TL`3?s8+m`fLo>`EBW}D=JLc3>J^AVM8JF?9+AgU`>wne(_KpkJh`!oR9;vJNfqw zPb~#g*h1$MWvD0or$ZVlwkcZ{OWAA=Hz#Y`=64v{F(N@OG1OOr;6huWvI*^#t2s|M z$It(LU}^0`$}gX^z1bB8L0bNYcv(Rw9RZr#IX4I z9X+Ox&U7pgwF+&^^vOu=$i~l_M^EnFB~V#@@ZV@_i!84jA#~gSSy&k?d`fdge&}q- z;2u?XB?qx+(&DI5XJ6>~Zo@y6XxA4P+qt@~YTDV&6GOT=5sKHtnl69cj{1~+)BnBY zmmuFVu;vKd^o?xYJ~iAx@$|*{;r!OuzwR6qtV%8xnElI?Bos*|6p(YJc^NwpG5LRc zsqq>KO2O|&c|hMWqGGrEI_9%TR_`~0GsMQu{+Bq+_p&lBEb5x2D->C7tukyq>lIL7 zd}@j4Q4|W0qh)D|v^0jPL zoy!}rpzvgS&FbRB-Eg3l;{zZ5F+)JU4UG18;8(}N0-a6Z%L09TB+0CaD6(qS>eQR8 lRao%6EPhu;ZK%(=%scJmgEa51fK_`)OHCL3Ue)^f{{V6{e7*nx diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00003@2x.png deleted file mode 100644 index 7b3494b46e52863c540490a60c5a812e6de41e6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14943 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004.png deleted file mode 100644 index 3c3dc210d78242d030cc904196450f48398579c4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6167 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 O`VbClpi!=79r8a4G<@#> diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00004@2x.png deleted file mode 100644 index aa8befb0b7aa39b34fe2915472c80b57df9276b6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14972 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 NQj}MfE0#40`aj)0x5fYf diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005.png deleted file mode 100644 index fa03b5274245651f9c967a54bf35f617e42aa19e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6261 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 E4+qGz`Tzg` diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00005@2x.png deleted file mode 100644 index e065ae39f60b30331ee6c1eedbd331052bd90393..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15122 zcmZ|0cQ}>*{|A1bV;wqXNHz&?Bo!r_?5(o52-$n@RfI~2vP1UDI?bIcF#DDie8S;-U(fxHtChLClPiK?QruL(XeetttMV#cx$CT^qN2wC zA0Z;`OZelFFHHx6up&yb()YdJEI0Z%GY$o;9xgXpk6-(xNWoDTlT8~#bw#Dd(Q>xl zKZExcuENc<{>6pdzn?4K$OblPYYnd^rb*r{P?k&Fa6PZm^doke_e)K&VpFB+=z6t% z@}M5|f6DBrP=webrFF^AOT#N;S7Az!Aq*veNF#r@@*k0Osdm5Vcl)t=1Q%^f$N%rg zj7Zq<0%2WUF(F$x-UJaV$_A~8;>NbWG8`#iM0An&Arx(R81!TGW4txA03wLIMT{QO zMe=?4;ZF4T(;du3eCPAQV~8b!Mku97rN~+c5GMiby^%_J6QVkFCV`A1rX>(rHQcK| zA54xA*&!Rq0`dpFc0G6;d53(yfxR~zeY1I#EnJ{{=2WK^^_aSE6F#U3^o5m@jsMDwqp(M2=LI%Kxk6#IP~4O-slqh8Qu;60@DE zV)m)oEN#rK+-%{FDP&~ApY2l0G)ZAnjO&8_Y5zX7mHGT&CBRGnM))(0^D_U+EY_-B zQz%?RDK>m$KJ#1HUf@SCY*cL1!fewq;m__dcy|-Cy;a8S`^hMF>+JT=7^B&y?}R_A z3a5AwMwFw3Q95t;EGUlR1#39wt%@#}3`V7RV81H-S<(<9`+c8|)uEu4WgPEnSi<6XIlhE06JcL$RSH^BI{BEkUtaam0E3dw=AX6T*Ps_$pGjKe<@?O+no>m_DO}hA|`AVLxOuwK_Dq*`o z%chv6K4JH!*()Kt4J=!44a+u7-7YZWv12|egL#hnO*X-XtVYe~ww6x% zzAKFOZH#+ZMcgi6mdYs{cZZcCxO>)cUUZG$e+)}$jYnK5O)`$uww}%3eG8K zR84~4Egaz4*cYRZCB(MV-@&#^QQ(Kmu)&21MIy~xDw*OPkY5B7C}b72h9~nm{$k|C zhExfM3m7)OVEo{Cygk8Sb3V8DQR!8`3O(7J-r&MQP3?iEQ-l?RJ~%w=?eE8nGt_x9 zf;SO{1ft9yrj6CF%qyc1R&3W7YqRL@OHzEscW_hlN53hmELAi-vi19L6lBRmukXj0vrcVN@CkwdR zeF_;dWF<6rW1Lil)Rd-OAd{P63@QYy5E_CSiBAk${E*-5*g%^&UA3Knw8%( z3?XXyUj94I=~B2DwkyYZM!#H*H5?!LO*Cb*^2%VS<)q;e@Fa#77V6 zeC3%+E>(6fx23*`fCe_h-M>e3+A&J^U!#{FMRM1t*%1t~1Bf!IF4AQDncnNZX|f z?zbHsi7DrHREW8|igJC}%-{5p!N8enn_N@A`HCD_qm+5&6(cpKiqk^Y%6~4`T>2!a z_VbaD;dd{xo63u3_8kIPY7&C`JT%jrK3FU^v$nRjf9FX#+B_Y-wj2KJl+f%^gMQ@& z!2%RwimV+XGHFIbHiFN-KfER>Nv_tPq`K#6Sen#ryj5kypEGPPLy=T{L*6W4+}b>X zvO#!G9+la09a|k?H7r+js$A6T+A}MpcBg7sw$Y>$R=%?|jHjO@T0!2Uz2#QEQxQ)g zV}hq?_>ks-*~P}WFk7F@@8ciWZH`~Jka%au%Vj9>okmb1rlB++s|ttGY*V=tm3K_W z3yiD(bkD3fH7rvPaO#xfAuWwaQ-c9R!*fS!gtM5=?R=LFYT%K_bGEPhZuJAU_0o2! zoKS9XU@P=Ku8cM4j@H&}P$HtL{YUxZNB?ed?W~SxFflPXq^%vvn9gdHp zMiEPS9SI_I3UQ3B^Zohct78qjo6PaEj*;d%LOb)gxcz;fZ{6KFI))!|vUcBlGz>Ua zimplqq?^-G$H;B%?C@JVu^}r)b5Sbi#<&r5`Sq^%OjmHFcZNJ(<<%D-G`}D$f3Z-= zP4XjMJjU|+larIc(fG_UI}c-ps^PZ=A7f+Xr%oTx{mawv|9k#)vB>mzp~GE7t^N7! zvY{>(3IAViYZKC@?9ZQxF_W*Zdwc6A`M{Mv>!b7nUyIrYE~H0LZAef}SG&4k5m(9` z4c8wV!7cfmEbHqRx0i;is%yss8??%XJP>&fs#ZL5G3Rr^8oB-RIoaIG+1xS|_&pgV z>UU%1@v5q-KF_$;WR-bj^K)sYmD!E4YlgH6VDD>37n*1plx~p( zGnMazIuJmMGSm0$rOmuYlPEESvvNKe7gYQ9<43kZNp@}R1#xllwS9j9we!*0Qd-o0 zixWo$i@s&7nA4%g-9LWq-*1f{Rc3QnnUoEk#}eL=$hgW8ovrbLgQa_us;g2gKmgl* z1KVE3$6L%3u(@VRh`gIdSbywXKnVc{dS{`UqYI=tFEiMZ}r1`J`? zt}Ej$y@LCD(8AMadwK9>wZb`+dIU+~4&i{sF!~s*=G^iXAM@5k5E4;%Qm$!6&1{( zG~vS>*qouxFWFV;_4MgeMsxj|Z!V0JJ`yc1MifK*_2;f(bFvq4>X`MEy#MGUTj?Sv zsns>LX=W;CdcSR+4GSo5XmJtf>Hy)@c2`23gF{zC6xYvWGXk;l4_A%P7R1^%(q9u% zcv|AuH-HW5YRpTcfVYUw&K$P4@b#q+Wo4y}F*h?qpw9(1kDKWGq(`x0ew3ik*)g2g ztCnWKYj-hnzTIwBHT=GD$L6;ze{%b`Z&=rQM!lp6?&zI6FF3r#(rXOvawRk}ZMh|% zrz;ne)cv~lv)VleG3&7y@RZU1sxuID8835FsOz{}01GoxKF3@muwRf8OGrr)K@lrY ziNS|gHl;p;2j^;@(oTlM_CvdF9*@6U5H6DyER$u{pdOQrf$zn4_Rl|2G<P;T-$oU6Ih`A1eM6d~-%0SzFVlOt^u(ewBWW0Qh2!i* zUnTVu8W`VG>xb5;02hpN+f+pks=3uw1yfU&gM)*Kb?=)^x}%IqR&Y1=h6*BSpP+@_ zEuebmqG(6H}>$)Bp8F}`VBE{Q&TSL2zeSZfBw&fK`7}eBPLVj(m zd{;Fu5JBg1E&r-oE%)NBb}dqJn!nOiZ9p2G&B{nN)suCHj+t5B)N~w2YCI$w%4+89 z+%xzzFE39(NXUxIe0|>^Dx5;juCwOu@8E3iB8Pm!iIvl{sTgejii*urUlI{{oV1Dm zR+Cg(i~4?%_RmERXU3@K&nclf5jA)&F9?#9FHQ=R1q1{S(753#$Iwv`E20-Gk3sC(o0h959f}q8C_83f{{Rzs7z2; zc-DFRc9vSx#r@z!miZ8sD#&Vmgs7eiX>T$jv&HuVKCzf2x!c0 zQJX_JmQ_xiHuBb7uIdUU^3%oYvXcaCR>6JE0=-;hcXd2IjELM~_D9-KwRTVyCaS&0 z>Eqs>Feew+^X}PR`#->3B6B=!87{l@Kqx4zISb5Qnt9q**LsXIG%hu$U8u9>K=jS(b6gbksAgtLd{mZqscNv{|)p7MyP$31;o%8;ud!NG%=Ax{?c%<((_#PSy><-ko^2Oh z{SaovAN8>6i6RGD-^9PTIeI*jY>2Qt+>sXPildG1e2_7J4?q%BLpC=YkWali3Kd?f ze;lS7b&CcBZr+T9r`IBqQs=*aU5vRq`n*r$kOOBn_g^?qP&(d+%eB|U#Yx)*mRNZ* zb6%ln?cS;MTyd{L^mI&La(t;dxu+s&yuZ6L7BkfupVJ&P{4&%~2Ks;l74NZAPU)yU zU1aOpngA4ta9sQJGzW&Qh5}%@koh-@2<{%oT*J#2^uaa16HLl3h;_FMstMAQ0xSZc z1TA_ZVAXHD=JipqM;(Hjm)VpXC7l98n;mDAhu z`7>q(w^&+jxijX@q0|O%!rFD6Cy~TET|tc5)Ptq@&tgrgEPI6_24G3qL!z~|4FYEu zK;f)WG>kId>9qj|M1+LSL&jcNWo1t75^w$;-J|X(75(h;hKaf1$KRZ19K?6-+Y(<3w-++llK01nIH zPcbTMfH{>>(1VpQDWO)>27(7b2!IwqbNqAoXV=2g($YA?JeBi$%G2eJK^sBMqJgE4 zbh&rGsOQRIP@OKGC(WANmJLmPi8ttDExf(yp2%8sHIfpuy}Qrz>eVYLp2SMLEahCP zjs2s-fOGh03_kkRn>X(x#(t!U!iwUmsdcL_($ly3{n=!GmG{J5gj9=~@(JG;M5l%1 zi5V_&+2wH~0fmeN!9)z=J9kPg*9wPmVOs=Wx@B!`E%lB!fO_cb@XhNf*hkf=0jUD8 zZSEqmFdXBiMj~-{oobwgp8_t#N23m_VSYo&wzsz{awfcHwz5g({5o^}Q)lOMZOIbD)GdVe_qmZ?Uta#s|HEB$8 z&m}CEA{o@lBq}G|h4})DLx&(QzD%bQnM-7J{`y7t(AqkSn*_r~fsabfGY2@a@6U{F z|8?juvKPYJ8zES03{2*j42lE821x1M(4t~~Ka8=?rhvnnSJvM3+L-zKGoC+x9)2RA z)?cGtT;E{@m3&P^BpOX6b+nIW$}NTcc+JSnv^BeYi{bb9yb`yKSVvl6HvlP-+V1sq7&9RrGM{!MxHGl z3rlCc+w57}Do?Pw2z3WXuV(v?pxPTzFS4@6ozyh3w`r+MVw9QP_Y#xxu=zCJb6TUr zRo2p&)<2DYx0c=qtDhurX^d!l*^I*(@%8h&_1@`c?vTEPsus0TlmEp$+rLSMj`Ml~ zQSIh0yR4uITUP0BZEuH|zhXB+!AS8SAml46cahWj2@F5U3N~J(MrIKgckTkenY}$0 zq?5(%w$#KV7`)sIx8J_8t4Nsc}dPh(Ku^Sp3ghsf_Lq9}?zkWYq9-mJp78g41Dt zQ{{Xl?IbP6SZ3%E0y5+GhnshK5_yDPe@}N7{#|h@%7&kikU+=86j8bez{j)V98RX6 z$~2S}p4A*KuAtyQ5T4R!mjg;RKcrGrDthFd<`65)U#x`XoQpmuWTmQu1l&MqH3b(nqJ)#c0Y=lgLVYpV6v+AwW`yd$P{r&wD!eq6-T~!or zq5x8x3E1Sbu`n|7Rr2|5_pOWM*byMehs__N^}dbiiB|Po%<*1gw$Lc~O+MIY1kU1T z@s2_9fBN*vz7;wN@O=lNy0qR><1{gx*G()Qy#KETud>GLA_Pdg02Fea_c}W|qy;yY zWb5smd$)qCd1%r2ZF+xGZ=h*R)9pjh86H*BL+hY?A}g}-9s1F_HzS}gD7H$zWEdpB zZCYq?`iOw($wu;*PRWz?`|Qt!e-@x(nROGptQs;20(ywsTo~aUu1QFcwF|(UgA&ik zIseu}=&h2X?H^Gb$z36ljP4wR5`G?*L0oE5m({oL-`S|16c2OT&=EpgfuaR)m_3j| z%QNG{4Ej`^^JJUQydfWL)mTJYXgEcvd`<{FlC9lcFH7o|9K<0~2na%DO$UW8)1RNy z+#~e3G-i+YEF}Q65sy zb*LS4mQdiL*500%{bG6DGdT7hrpLe!+Wz;4{bUbTsEvoT_-L1nqV6L-Uo^NDt5;qZ z7RHnF+88%5^X#tA0u3i(xL{bLW@6Hl;2soYVrN+Bg5WX z`4lz-?lzeNJRMRFV$AW*o8ND7A&TWqe#r!&f(alN$XY}5VZ&}_yJ|&Y;YhlpI;v-3 zTRzRuCJyHrugx&$%@p8taQmlFa_LKVs@u9MTGXwT#o}2y?E+Y6MgSXki##^^JsqsZ zZBFr}r9jOp(J|cKq?JghKU`^WGTpmDICS|}9s@xzKCAQInz>JB98>eyyc{&`!a{!i z{o8Sd*Y|A8RT~=D4SviT4p@ok^CU(uuT32V6>(-3@+@p06lQ=hshrzKMZ|19Zew_} z$mz#y0fqApIij5VL**Mg9d@$BEHpghv>2r{mNFhZzGwu z_64;#PeK92Q-5t+^{LKCL6;!5cKfvCeC|CI^zSsXVh@!n?Ep84@lvNe+fpS&@r59~ z136Q;6&|Lvp?Bya5WP0Uxm$eKA7iIUAf#3m|IT0_&}{vWZoi-(%jn9!x}JK+L%Od2 zB0mk*-YD$7dGq!6xZl=*VPL%3b=x@XKHM$QR@7vZ!ptky-Iny66eUVhA{>o%e~nC_ zyvZ4bSuayPX&7|PGN+3X8#CDbq&~-?9~0q!*+5qY)}Pqw3MEr?dArh(v|li5@gRFK z?Ng&?n?u!sye$|bpTq$VHju&Fv?^099N=dj;s>)JUZ=;q%MMhiSYv;fIa!tMQ}RCY6rVrD`^7k z0!sSL>IR>xwPdgUsm9A}z(>L&t_IlH%r)9IzDke9TjnC_sFx`fOc8N(f4vK5X?QbW zc5$wL|B*8zQQ1(#+p!XRkMTFaFZa3ue8&S_(y(1Y`_^l)%iha(KRdJJr>=gFhmVP^GC zd)06;l3k*D@{8BC+MolZ3GejIGcMycs}7iBeceU0g0Nk0rXFM>`zV%!!2A8EVq%Ds!to;Xs1efrybDt58!<-8QN+((ORz~DqB zg4Lx&w1DT8NR+w1siyB@+Pq9f{5ac2gQ8u)zBwqP+j@2&r^g$4bUQ!c+diY2Eh-Nr0&ES#Yg}92I0fmsU?32gHnQnCwn-eC*8Z65m za-YYFTy-{Dw&+~%H0^TSPo11G{A+6GUvLb2oHOK-yb?R$E5ZCf9TJ2Xmz^bjM8~(v zMi4j6twt@!k)Q?M&T1>RzRN*7jfpqs_?^E-WJXi}M{C57E~ z7XHA71~@01qqViQ6+9)}K!`BC|DT2Qi|lh&r)!$}%bDWwNOLe(E-=S;o*4EEipHD# zkMhn@E!J^I3wtin{aqIZ5f3hZ36?k}(VCBGN#=C0Yk)=Cr`CT3*xh^$y0}T1SO0;$ z#ue56GuG_nw2J#0RSS==&Jb}=L4b{l7d4jO1JVSLhPS8ZiOg;h6xK5i+u=*?>NaVt zV%-m%ohd?DfAQv=De*;xl-k{>OigaqgfG8{#Vji5c9t7l(ezltNr1){IY6#K=?}g< z5!%WMjv|}V3xa*SB?O^=e3k_;exKmz1^B&8e_U4UJ!zo(1|W6->JECtH_q1bCBn49 z0CDf4l|qn=?qs9o2s__<(o$l~AU1z~SOto7xSnGn*j;C;4`8z;>XDMcP0#1yTh@zb z4+~0fXZ=Fjvr4{8%<-3~Nv;@tHw`-Wu)Kb8=}#j=V`HNL77v&jr+0c3Xi!T_d?tR& zLa<+>+EG9(;+VxrTBy))g7~`F;r2es$Y9_epspGx0~Y7!^?%-qH1Fx}57XnTnT*h2 zdeB;paz`;Dn9v>{R4^GOek*_5^RAhtw<#cEf)bFZY^B94j>P=vHEeg7*OhJ|*F zT)K40v+%0SV~6q_1#5LE6U`ExYrxqmDy|`eI%XjK{i=0hF@beYyWWPSL(6Az5i!>< zqAzE~fCdd7iY7Gy{E4AbV}_Ai2ESfD(gMu(e@@6^^noF1r{3HGU+WkGrOD+lc zDxR&Bpgj6Z#2b`EDsqH|grJOY?zZg*@^L5rTF}|u$qH_ma%C+)DPiK${V&&V@@k<6hM3mkXT@p_kt+FPEgAeMAOcn(kd|54{ z0aj28;SY{V%x?R-%xPMyKmXZro0_C`YCW^pCR2~k0#rUEI3*>;W7omb@*}?oEtE0H zs2_`lsLrJDHs2P^|F8Ce1sRo8%;)z(b<247_T1>DZ z3hw{I(_*uzY z!x{u1d61g-wQ?zm1WBzt^!=FfpHBmP2e)Q7B#%aqRh{;tz!vf}QEHpPeY!?Fm}Gb) zl4FP;jDidTbuEsKe-y7%Pp{Fr%|lg}7%?6)CT$^T$*!0n3Fem~LgciJ{@<@1Q8Oq1F3JNMp93OY>v|OX5Hyn9(CC?CFiU|qaE;5aE z^0;GELljq0o=4R_!~o}<8kwHY&roNGoTNuLFt!UQYe*iu(E92x4I^-uz zrV^c^w9$o6b@o@P4VHiJ?bQ)VMfj2Q2;E1_e0>jc&;H!tUplOkqD0aI zc7`tyvwbgdeA+cAg|U@5T&lXte>A+^*)~Rn#n($QCF`)b)(!dw^Y-DfLM=|3|FuT7 zfp`FDQ5yeT>j{IsCg3&+@uY4icU_#Cn&PU#UE?=w-`m@JV#IHaaOZS!N%k0{5rhO; zn@-SZvZRyuDPowatf!0A3f%a@HGk4vo*O&N3HbLN>Ye1yuLo`g_ZMaj$LNy3Urtm$ zKC0+sejVnqV>-I9V^4%rgFF4VxQ*K%TMgXxb96V`HKUVXZx}yb*Br_bq67b@jBd#PL~IwY8_`&LNlu`whO0CU^po{N(6t_t%7oo~eJH zN!jc1lbza(J`eHQ0aDlcnmJth;ZAMy@z1t}j1bX%2b>lj!gs|?mLj}mv8?%|6FA^8 z2X5EIX!RMWSCYPqCABBJ53BT10%W?#FQbev^E#dQnXmIMetTGzyiz}#-dM@E`fEYH z-d?Q3Vm&d6C2+4f?Y3JU+Kk?q`KbSlT()fBUHIcO%e2!Hg69@R#v}r2Z%`4#Or;Af z#`j=8|MbM^bjOJcWoce;dM5cTCn8HbzKthm62a*V^f2=4*#3bI_F6n(xcn4_zz-JM zvF*XLJ`kWupH05PB9F0cI^G#I4LCgoV=sCcmt(|2{k8Kz6{6k1^t>(;|GUC7V`a3(w8j!EhDH`65)&USh{DMO| z$x88sWwQJOI>JcvU%Pd^Hou1Q`{#rFrk^V`o&3C~VFl5)>E4)m&G zRl1eUU8=<0=T}q+p(_7_=`RURAW5o+<&LEymUWKJU4I=>rDkT6mJ=VJoKFNbEd>-` zd=8}%ZT{pGsNPjIVm7dvpasLqz^Oa?1TK8^jz&iJ*}w&Os@sw)&nu?|xg{8qaNlPl z_$00$++>iz&W8EJD)9b@t8fcT+P7%xJb)BcsRQ*!sW+vW7x*$*a8QvL72ZD{*iX-__4BN**0j0K5! zRm0ZDt`OJPJkOj&g3kj=cc?iX1Qh^AKpp(yF(Rjn3;~T-l@mNUqDb?J&3y_m!DBim zb`M)O8S=wj8M)-ypEsq6dU5V9k6P~?pR~nXZPJUf`dQLGM#9%hgQ#T5ux|a0x$4Ww z$yo_4gm~$9ebv?Hiq5?@)Br(^i)fs!IySt;fUAK)B-VYWUl4*!h8V>cTctN?`@UqT z=W7+*2crrQB|x#Gz*C_s&v-C0!qgpr!})uGM)!v-V4 z&p4E_4p*B`d(yoA)O(qkvCgl1*Tueh31OWV8~}zvFYgxwxhJcT2Ygt*u2p3=DXvpM ze$;Xyd|kgP9uToV{~TGm$J^@irh9Q)9-x9@;L&<#C${~W`3&M*jS!V0ddf)4#Kc7A z=@+hyBXX9LwW!m3;8(};b(vK8byV_M>PPZ*A!eh5?_8F~1oXFFN|fLwmM_unTm+_WdZI>`;*j=z^fHt_+duhDCPGbc9=miH`imKx~ z!kk4BaK8Xpi!?=A>HBzldylteup3?NmiyqBlw=o=VXd(n;$Qa)ob@_!(ogbo+9CqM zRJvaf7E@Bk-uLAmI2>Iw6!D$oG+cN;)sm-#54qiQ10P<$2u~Y;e(UUJ$-xPT+ht&g2#o^k0u*sqpTpU!LTddxL&+S(&lN4@RDvL+_3>s`q&cV{n%Dt} zEtma`85+|r0c_i(0P=wsAKCtdXLfj-FRFC$Ra#od)|MdXjO*3Gmu;$s`2hLB5sr+C z5~W4LDN6MCL{vf=4ugnRXeUUnBeLwz8AN@q8TZ;%Lm!}HHW}9WT*>EHH%SQP2a^36 zmj@CE`Nv_qIab}5%cjjQKFNXfVgHyv_dX9>nmXj=vYVS(z*pyO@+#4(YQ!8K9F&7K z6BipDY0hokoi5(6mXF@WH>2bwL1aGfjC(s$0G%_D!EklCn&uCICki=@HxdE#!0S5W z5)(+iR6f0=5C_>QRdw~hCAELr&I+lxP<8hh*L2*d=V1(6=BfJ86>J13QEqAg&esG4 z$`{UTPcX1ysBk2FiCZE#myydI?Yf^Yc|4!{=a0!s&8TC)~L{dsJEGX~^zEIIjAUSSMdfpxmi zzl+ioC+!SQA1bcW#$>_Wf3b8`i6aEb5PT+x%ZQ{!+NRE%3G7XcHF!x%-nfw<>a$_F zwYNT13oAQ4-$J_l=Z>~EI6{zK1u6mpAdO@Kg~cr4V_9~f=6Vw6)%ulh+_XU|Gu(^ie*vycNn``hc+1J4|!n58y$16Owg zU7>cy|IEwT>G!6c(HA%>9bnhM+#9`A(%ajc;XlJ`dJ%7JG3X#a$QRwxNh4Rk`nMxS zA*O@<{Qu|`1W$CS@j;V-(SEl;N?TjBI*CIGrX3WNLqyX5qLtj#Brwq66*%itt6>&U zcdfhM+}`X1xTL^!pH6DS>Exf&G(608TBNqdPNm>JSXtR3oVwCa@&WpPI@UmttY zaw*&<_wM|(8z{-&n~%Dh#Yi&`K3|Gg&5WUaukIp_Dl5$G!<#?{>7k~* zE?Lj_Nt~cghE!_%30Jxqv;SIaCkPq;n$76)9^9%?*V)p6Mt>$DyuJG$qquLb!EH9# z0D#=gL4TicRhGLB41WEHJ-+_L*zd6em&2Fg=2v`;la<#$bJX;epx_>lC^Mvrq z1;B?b)7Qte5N`0k9$DGj+xw3<1+4D*H(mBbQl}FlmCFdfzyBzps!#;o*?(qM@^t_7 zD5iNYX2@LaggW?B;RVnCN|8ErNFt45;NE0Z&{3?D{{wF@LQXF-iNv1`JS_Iitc6F+ zL>%lbMg~4^_bencm?kWNy+x5r9<9Zj6O_K~b#>pK*9a0Jm>4xZJs2`&5C4!%;i{5* zx4znlfBfU7KL~EXqK$_j?*6}c6vS0juu-6&&_NCZ=7xH@*b|^EVW6fRpM2nscDjMx z6bT*|z;1qpbZdEPEg4F)-=lG-`}C-LmXMGzT_o^mk1TGA)?vgpi6fQALFmnJux?+W zYQO#4y9F$gr$?KTM;pn_{t_A8y0j~4hNmtBzpu1d2qNEdRgz`3wXebx`?)*EL^bUNi2j6PXeSCR++qhw~|9s6&(g$7@80Vl`Z@zK20*{ zB;rx^L9?ZPVCd|A=jl@S$x`)fx?gGk-4Q~BGvUixo^6uX@`(16&Z#KsZ zdVK86@j3bV)&u=mZSCh@EH%r9z@-IgtZG^)QF-QP!M*&Gne|Q<$@QzJ8&~fE@4c-@ zAl2m@8_4_j5fZ~zPNMiYUgCh8EnI8|>gAv3>YroE^x1?W;}74Wo7jP?oCWy?j3hFG zcFrQp{qf>EzxaZG%NXi-82JEOibhUuu}xn%yX{?uNSCg&uTrsqV0T^mg<1a0N85c74NES=BTlbwM~+QBQnEk^X+A4HV z5?zGi>-gA~z78bfAmxU&JUCUFfK3yu>O1RGtNU=-UamT2i@v#fd?z?fZn53{?w}K* zZn4d8V#TU8o8>hK(`N3~03~_`hD}#SYyTCu4AB~3(7QLV{p(&!oBMx(K5Vv~yZRyF z`$HkUUGtKJ&qz=4(BeOk9#S7Xc;E)HBLj-?r`*vpuqpsspnkD3$CvqH0b&5dg|Trx z<^E-*R9@Pc=9D*Y#MT#z%1)+5$M=79o$ke-3j6%~mhv>uR$q_)9^T5=amrG}CO#yh zZXKRC1N@Q~C*(wB1?awQh?)NLNuTnO2*0@#0#yQ|bqNMhMo8~)fQql^)K|9*Klmi$c***7 z9%x1ewOqx6+S}22wr&u48Ob^0yQegRHzyt~%)69_7Kb8Y$TWH2TG%=yBX68#2bxY! zP9&PgSs;enz4-wf%ohGCoWg=G@^0DCX71hpL?tCN#Qk>c7l4}<=$iQCqE&8W(<>7s z;l^W`19fA05s|Pcp~nH`gq6Dx+Bu02+{$SL=^6fqz=^j~5131M}kcSbq$ zxIgwcUq8yye3g-wrWPL`e}=nK>Tg*8_-ST)kyJ0CDYS^?VNArlDeOA^nM*&( z_}(`@GyVRv`925zW&MgCn$;uG0bL4ON^!BuQCk>Z3uH(GEiGj?d>id6^aQ`oR6@?o zU9BIh*Vd!wJy$OHg0R?6H>zR8l%|xj{D!+8&%=vJ$Qt0&5x0Y_dFokNKDaWiW8?dWaGAT|r!q?Eiih&pAJ?y?%>A7bzxX8dNq85qc)qsllJ{ zr94G7vLo@hc;1_??)v_GckCy8vv-9Ckg{)cF|r)sH4uQjec>Yl9lu*6&*aUvjobfj z`pk;wB#efO_LkiS1|#Y2;o8<_Ae4pCUGaqI5qDf%T;T4#jDw%?Rm1kEB(7{=UbA)RiGv(sWY}KEe?B*v z)3I@T&_axP{QKrn<>dFm!XLm=78rsyxPmqSM_PB4|2U});=G$&^a)nQ#e>{P_<}j> z7e8QVZnU&W4X^HYUf5t1D8KvAxXF9{?{4$Sc3IH2#_5)ZsZ#D;4?RkEpE}yT(iRVV zTws=*`k|T64M@hjbjGugW68*T!PsN~gVXhLa+j9rDNpciJ%u+b)2mcQDCgrljcXR= z_#yWeZgjbRi2UC4y72#fBs)%?5~ZGtQ%E1aPl>>X NlAOA1sf=0Z{{y*s{-6K= diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006.png deleted file mode 100644 index e255a97d93ddbdeb6a8db9dbe40c70b818646873..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6223 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00006@2x.png deleted file mode 100644 index 20b220d9220227364003faced7ac189278b1f396..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15043 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00007@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00007@2x.png deleted file mode 100644 index 7f7ad963e770278f10f7f258937a288570f2d051..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15082 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

afARgRd)g6 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005.png deleted file mode 100644 index ae5fe65f35c55226bdc07d5bc5b64c1a0a41cad3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3231 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00005@2x.png deleted file mode 100644 index a2e11529e218a71e0e854c5390188431c1d865ae..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8088 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

%GL4tG1&XWV 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 UUtC~4dAbhiXc}mgtJ_EZ4`e1K_W%F@ diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007.png deleted file mode 100644 index 12888ffd6a0d07ab9ed2ad2a4c774d5721220494..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3242 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00007@2x.png deleted file mode 100644 index aed3ea59e712ecc38e142d6477e7a5b59bfa5685..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8155 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 Sz6oB;L;5#Nv~ik_(f=|Th2#+kIk)lzy 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 Yi||R^^BFe>{|EqS-_qBpQn!oxe|ayNga7~l diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009.png deleted file mode 100644 index c2919203a35193b22097dc79d75fb5caa8cd7b84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3251 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00009@2x.png deleted file mode 100644 index 2f64c918997eb6768aae241fc2628c2413bd2e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8026 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 fd1d@_fO3M{;OXF`i$l8FM(A=)hsgg2be}Cp diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001.png deleted file mode 100644 index c2919203a35193b22097dc79d75fb5caa8cd7b84..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3251 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00001@2x.png deleted file mode 100644 index 2f64c918997eb6768aae241fc2628c2413bd2e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8026 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 fd1d@_fO3M{;OXF`i$l8FM(A=)hsgg2be}Cp diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002.png deleted file mode 100644 index adbadb84017f7331253f24f0c102143b91cf51f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3290 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 g_5W}9lfLb9R>QA5nWC%m4rY diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00002@2x.png deleted file mode 100644 index 02bcf1ad527e47e122e6d3144c5984d1dc2f8785..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8141 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004.png deleted file mode 100644 index 57f4ed267e87dfc713f9a4fde18fd1ac97bbb3b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4766 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 LXO5*AxFq}!Z{_q1 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00004@2x.png deleted file mode 100644 index 83ded84d5b8814a6b8266f40c654c8edc0f191c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11404 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005.png deleted file mode 100644 index fc159c668c3a1d262c7549855cc27bb17edbb7a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5468 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00005@2x.png deleted file mode 100644 index bbde7f291dd54454693e0cb65ae43b3eee9a67c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12701 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006.png deleted file mode 100644 index 96e382904d19a4489929eb9353e8605e7bc7c264..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4874 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00006@2x.png deleted file mode 100644 index 500458e26a64b54168dd08d6ffc19782909f4679..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11866 zcmb`thdZ3#7d<*N+UOGm(aA&vK|~8tB8c9icM`q#&Ip1Cf)Aoc1VKjcU51Dr5xqti zjNaQlzW3fg;P*Vgc^-_Jcji53pMBO|YwZ)IuKI$Mh>i#XfsiW5%VL9%{O% zC@HD%Jiv!M^TQvo^Sj*%fv`XnWS(jHWNc;He?X3De`@V3>g)0I5^rcc6U@zu5cvIG z;Bf_VDq&P^{3q_X4Q95DOOg*!R+iHSZQl#M7ik=Mj{z4(DK$<{#;Y{mtB8U}ANI&q zn8(YIBz$<97Qga$=)i{QGDvHzk+YJs5_|P?K+99j)3ZOfz@L3T`sZ3!NncOXljAIR zZ2f8$j>P}Hhhb#Z2)RooTi6E(Qh~zolDn3UYg-3rK?+fZVpmT@D$Mm*H;(M!NzsHM z_)Tqx$g&6wlC1Dya zm>1&Qm>GhFlHvH5RbNkDO+a{{*N_Xw9eni<$nFM>!GPkw#3(^HD}G2Y`Nh+kQ8hF2 zqnNTX!9Uk{E#w(^R`(Q&90n3+o4%1;+?vN}!?d+Ru`mnW9YLCqYrFtT5nhD^-{$P$ zu2*o@AK{2r-mp4kSXsx&ON4ZQA$)gVI4Pfo5o}yxCn~HR(}Es9tCzwNgG8)Ba^r8LX8w6O-Ij){z;{0( z7L=qTnc=Me#?~3>r6XIZq&I15EdMULTf$i_q$9h+5!)sOsuQY8@N$kYAG>8Hv6_Zv zVLH~1kB9|HB32WG^peoun@^S!vC7pppe2OwNW&GzCl~$Ge?6Ki4@1y|BZ84(C%4S~ zo1JaL5YNo*FC}kFE5lj)R03MTXicf5ISgljLcv@uFpEZ-+jL#YuG--9gaZ+VPbPN=kvx*9w1UUl@!aB`9LD<98^cS; z6zbW0rIbfAWfbxqIak!jOm4tKY{>w#88XASkf8)}+y@ za6~OMn?M3*I<`4rve#1}UB$z=V94f|jew0%IxY;#77s7iBazi;Xx@l}l;TKs#E$Gt zK-7pK=B3ATG0jKQ@jAt_64|Q@ozZ&9;fU|`$!2`=oJnkn-H0d|I48doZppr5yeqR@wuv5bzRw=jGkGcvvm)jcgKm~f~lD{K4x zn<8F5EF=U<5rtb+L;*jj;>?2`L&Z>mV3j{0*G)@G9vDWKiSI~~UGVSRm8wYDpo_s@ zc1yJ=moL}*GGtRHUBkF)Oc44EA0Ho%Kep9y3_T`hHAzAi26&=($+B)kxb{2XH9yuO zE%mv1cs_54qIG%&#lsQu2}@poKrjlmJ{$2+M#<39(XqwLBZ$KN%HfmfkQwPnXNa0o z!k?xiomtwjEuVASc}WZMHqu2V?%vOuh3Xts98^SW4YRKEwZjfV`bI`b2D0I?vD#TJ zDSQds0P>Ueq?%59A03EU!~wQ5R&rauc*Mfoyj@UsO3bEUfHUlqW}ypq`pLqs$n)pV zI~H999F1{u8A*L`#iX%btR2is2~}IG<=@HN&V1)-%5zUgs|OiLFf7@FiM`8TN9>A~ zFRMk~jGpQjkAQ*5u-($~G#>l@yp4&qBmHXjJ=RAb@^jq$E2DN5;*DGVbfVQinH=>` zTAYvg_}b>@S$2JzQfxy=HZh}Lz)rl@PWV!(8?a9whG2sR+&a9lsJ|4TS!}D92OHCdtZI3L2a5@J&hJfDq*wqDO<1El*t?u4Q#!M3~cZKYUmY zhSF?edN}Ln8)skLgm?oIkUw>k9m3Q$tFt+b$4iWQ*5Fh0u=lf0F>9EfW!>kzYc3}Zzm1Jk%sHTU1@gaJdEcKQwIZ9xYQ&stHQ*8jwC&YQpsw3aS`Eu z@Qw{H^ci8>X(0!ZG`#zi(2Fh6s&f4bmrv!Th-7+y{@1aM8(?uT|AkAJeLlU)2IAZ* zAtG|JYa@_Ghzr~6IrbFjvahCdcXtOt^fpqc|9!kRovT?0U?Nh6Z9@fzqRoW0gX_w! z?F^*J^w1W@uUWNt#0{@4$>zdIMD@E}bBwO4 z)&B94TYYKP6Zibj97H+l@?_!CZk$O(5<6`;>zC)pxzn4wY96&IldGY6>+|! z(4mrjNhM2+3!_6>>ibnrc*OeU4%yJY%@L*}Z3a*3jYa{ont27Id;RsC;26l=lfK-ukx!9fvqyj)7D=Vv?tNXf^dzfWv>GK|? zYJ+=Bao&|MGU%ZBeahW+l=XA=a6~rrN~{L6#!pR6E#kX}jP;r(`MoZ1_wHR15)w20 zp#Om|J8C$Q;`=*4{l|44+A~3>yfkC<9r9cbIgJxzNW@Q=DXT+RBC!HR1IB z_XvwW72N%NB!x2>-eD=+y{ni;`DomL_5(5$jpY% zyhjL=8i=NctJ@Rmw!$czj^6mOCXlutK3H6gTw3BQE-sRicq{)de z$R&J1c==U`mHzvo`+|jvC?;Gwr(AUlWWibkR&+&q__dwgyUtG8q7hDjpwXQ=;kzZm zzozC~d4s{?(d$!tn@531Sh( zLz^HPWzKUF!r$tm^&1@lRS>+s!5q4n2G`4et3)H7E&$lzE^%E7ND4+wK4Z?LLYo&w zO|?OcRb_n%s_kg^Jt3>=w4(pRlKWGwDUM8p4ay;D{rUFLZ+VF?%P6VnypM}Jrjuww6NXD~PS+=9ig{b;Qzs@S8a4UE*VjJ*pKql5Adi&K z({$n+oXq=kIO}*W<<0$p)PnnH&%{C_TM(pi$9hG;hzjK3&2UtvaagqhseUrp44dQS zp~j6~<@RGdRLi3?ElhA+T4rYJfB=SJfqIX1iWDAW3qQX!%|e-SJtSRBf?^&#!cpl` z5zX1v^-C7A`Q79J$RQBB|9D~_4-1rY7w1COmMCqy?ws`Y_R_u$K`MML>d6xK7YR7w z>wc|v{@Urmn|78)?`wM5W%1|BNnJArF7$*$gVI;VU#K9~j;7Yf zJ8od8|Grg{tbI(0g{)CU^C%?HH@)Pb0>lJKK`3#MLtgHGjHTbbsAbso$%qSBx@*+n z5jAGwALCZvcW@w3sP)c6bn6V?tQv2HTinZ>N+hPapuK<;fU{?`vZz(T<1SNY@i_%* zfLjq{j0>U67xOCRL9H_r_3rm`b8{KQ{r;o8uUgjBq}*(BKfS+U7ia5@{+RGLnzTHn zzKE1vH)p}M-w!fWM{RdD8V0~#$hQT1;dGbz+SLm?T|Y6n@cdffbCV$rr~B;@4#>uSN1 z%opiD*VZ^B4_``l&d-0Mx7u8?b-}Hw{4*K;Ecj~f4zD3Z)OaN<7VlRJP227s0SrpU zAky|i@@&ZQc5}goD5wZj(XztPPQk&~Z`%cR{byp>nBw-M)B@hzeG%)j(szfNhNhf5 zT8lFrslZr!r*`Oj4J1Hx-V^$31co}+!O3W6Cc*bzihogeJnQfL$NebGoHj!;IP0)8?ToxkM4AC=iLT%}FYJSjLVNs5k02=2z_$-!<7 zGo0%BIfh)uDWw~0A>M@aAdR^pBCU5@OuFvf(J9|xXzwDqdCQK;*0V*mlJ zHn8;dy`!J(doc9kiI2++)f>auqN0OCbdASt*$F<{b-U6jJ8aXw>P-r=_VN=G6ZZ`c zmeN$+8_L^EAKR_KQ_oQ<`U;9@j=EH`rNmKr9N3@@BbXXIz;4B`b(ntPPaH%bCjinp z_jpc)fHH}*GihI1AEiA?^wgt0e#iwU$xl>k8`U)OP!+A`az@+a{M7f-A)t1Km3?T5yMk-8=m6yx< zOc1E!5N!n`r1=B|Wzjl!>0t6Rw{TIPy+=EH#DRH3qcwBeIq5FBmZ>^Y(>$s`3nr;V?3}c ziYbiGrWrt)6H3Q3v$G=_7RZcK7UFe0Q;A8zLy;+mIGzpm^#R&4&EP2^d>`y@8v(`K zAu}thAE`uoK8>ZN(J7|y$c$i(27?O=Y+!s(pEh;IExV(^PP(f=5gi?^`XMpg8S2r| z3u}X|7@&0=-P|b3xcX1l8=Zora}cS@_^9q~1@1<_$dvQ52A`um`2-~D_uk%~X0yo) zZEbw~3yX?cA{-o?uSJT@Cf2sLgcku2#@%ngCP`0!%wtqnhRY`+;-jBOmz_?dpFGpA z3`z#d$;H{u-iuP@<+gDR?~rp!6&k&1c0&qixombc-XpuC_i zF1LdvjSID`GEP4aqF=Bl=8V{-^0u5<;5#25$NHRxBll06IK%W>^cQ9WOEO;bN9Egw zEH7K$mVETn5>&qf;dB+(o%#0Wpt@}|AlIPo-JNm}GDK}J8;9!RNx>uMyypV{4h;>x zs68_e5K2*I2duGGGBT64!*taVQw(Fl*=cM&Z)7IHg#}ea8fHkbATGYswCuDb1)q^+ z3pH^-UbEzKyz{ueJPx+NR0cW`k}--NJd)Kwg7obSn!Cl@5-IXY;_75EwWXzn-0=`| zGEEC=!SguDD<6FIU3c6D9}Nf+n&q<)#oU>`bEg7<2Tr-5-lU- z3+}HbYMtl0bn~H8VvFmf9riF5lCN>%M|%7WWX$9LB6jP`!!UnwZeF4Ar~6gT6gIY# z23f;70i$(+ldnEM;QQTkEq?Os8R{5U3O0{z+`ei{GWojU$E$5qd;8EY)33SZuW#nN zPzP`2;V(ue!o}weRhM(;!;q#VY9oA$czKzB+uOk>io7NU1{S`)saID)K%b`NgWRss z{;kf6n`~)Li{EJx4-g5^$XBmk8J8B1*ky?OCxc59x{-ffXk|5Ow5K2jXzI7-05N|q zyHy!HtQC?fJvcs=WQdaa0^Y%3DYH~>WA8x`_+Rd4`B-RakHm8|>m^&-RnrX*4}%;6 ztgxsE6sr&^h<-AlhQk6+JpWO>HUCsp7iv`*WllToIc9utcv#=5 z^sx84fC>rblS%1Io)iG{S65f0t#iKE)YLn|)iwLm?Pf08Q>s}{!H2@6Spi+iQD1AQ zx~axnQ?<^_-LHQ?ymm}u&$s<;Bk;>J)2><(t+Qw+WnCb&%Au>C7DCw8P%ZbP+T2*fIU$q8^Cwr?sePVdK$4md^+R15~EHP-qIpbJ6Yo1 z?EcL$eUZ5SmZLki@(2_>-As&m9{B|&SK#+vpKd~0C@n2*-M$?U5I-eCj?Ay^2^0!K zT*Oy?$EH41ps3(3?J@at#V}9_ElHk@lwy$*pu2~F*M&N7p{95oE4hhTf!|@``R}Mk zV%`@zf16ke_Wj*w`5~Kwo+h~g8hMH#oBv!yHpvpIaby#ax_4_TRYxYdew;F`GQ}R5 zik&>{Wn&?36QNtYXiU=cqWf2AO+A$0T({TzVOuFtfmq9+|k1$S;yQE}&J+ArNV z?m_3kPJxF@7q_$q?uZRi$93tZ{sfutJ?k4GJQt97^K1*_T5GK8uyBE;S3nH zpo5qyxD(}(AgCaFK^5dl|2O@$27TLU;P=L_U%xyb%qFN71VT~X87NLEQ`0%mZbF(E zIpD#)_VOCt`nV<1DLa({E47TBmKX<65*ixH@vcH~A82j?l~*n$adDi32*LB?MKF|YX*SP*M`eL=-D{aY^j|2q5 z@@ z)}By=-G?)2^1m8Va&psAAq<~QwE@7>#D1$%&e>0tj)CpRP#*{$3j-OsaVak-WFYFm zlqAFtrF~nj2(R*9DHco_^E{iL5ZU1>ZRs|Feii#Ez|V_{N`7CUb)r2)`+;3jwAN;S zkAdtQ2H94IzD8|iLjK%>z585NRyJ?PC96Tp#AF4OdST%MfH}v+BB2=lRTFyIwF{#S zT>EN+X|E|qCx=#Z+K>6`X_rwl7D-+KfSjdfX9KaC0UT29-i1GfFR_Y0zJG@~H|^q2 zI8Ymp>6@5X+1Nz-Z#RzxnO7)3WwHir5%`>%oJk02KskZ62mFTvuf#wI@|IA*1Bz@C9UyWw;WT7QVP-X`j90)q1@HbqzKf1aeP)7qHs66aJ z&@m}r>m`cU0?HUDaQ;V|&orn=FjDYm|8tM)l-#%8$He4phyvN3A?8h1R(*w?X`HCE zChv-4F3{qPA6y0XOJ$hHpISc|nA~9Tkrd{xuD6WGfZMUV>k9Z#epP=3H(Pw2#S@3jU{1&!)lLco^H-4Lzd zZj5)@xXrfpg>i9Lq;@Vy42aF274P$HK_UPuQq(VM-@WVx^o2T4$}MR=V1HTe}QW+MgjTsPH z>hGxdX2DH;&S3`a5<0Y+qE%CYzSf^Tc zqM7W}(YIpc#IS>W-3IZV}$G>Qjm1TPy%lYpjcHTkw%JHOj<%m($4iN*b`XaEuR&4?* z)?8mE4m%7p3@h)O04?nxL`J8gteH(oDCM~nU-sa2OulX74LPqNGaj2$$)m#&ye9_aet2waE$-Ctxn~?56ifVeNJ}%W`F$nkq=c{UW?;T&8rVl z`NaR|5o>>6-^FDtqZm``D6fYbL?q45@vUJ&V#$cXl;g`m9Wz?|5xXSCyagvZx8G?> z34rc@Eovy*H~`&-@mw?MVjdW7RG%A^e%5bJ!?m=peSn zS!nCgS6jMxd0drYo!bnaN7Plss3VUx)w4bDS!@ZgeSx!dc6K(Jk8p0j*z27$J)I#Z z!Wh1Ulodd|t@-aPZ%$OIg=7ATH=C?|ECfa;Q2EU!-Y?Ayi~eDUo#zn4PCcUaTj6C~ zQ*VJv_lS{U`}z-^nb`n*&O$AYBt>BR0lURi3aAchuD-q#{Vxz?5r#MSG~h|8L@`{=6Es;v zQN|>DQtXL@s>;e2yeh+3z3mPl3jWtm%Gqd`GH2`$%$p>d9oCDz_xB?vEg#TO9oui| zjJ*}0O$fRt8k|XRd|BvcQE<@U*UedgP+*oPbbm=dvwzG-5*i?}O_Y&@i?rTu*eDrX zb$dc7LP(qLwx9mqP-*7iEne8a!-gZ^dOqBms9e<;g-f&If(}o3I9_r}iUw7z~EyCClb%ng<1Cxz#IkP=UrL zpgS|lFVe#k17wpefr;KwQu{xBqjq)VeC-7@JYN;sS`oe@>`dM$Bw!W{I;>fe!B@dD zZ1MgX83J;1Gj(^T5XU7Pw1 z$?A9s49eZ?maDUkd-G4rAV&V;`-ZsA=x1mv{IAzwmPd`w&4;79kX}BL+Qs}~TfoEM z5yIl}WlACpH}t|oG^S*uufN}%R(MRSTBjHkb7N?Y`>Lvd%9Nr~eh}~-1dcLV-+CvR zyZ{!iLEAm4fQv=u;C#)(CZOd&508~8t}$G)^nUZ7KKFM4KNelR4O}YC^r^uzO6N#{ zbx7|w(Ix)TUG!8;Y-(RH0a*(-p1s$P_%t_>ft2z0tr~|J+6YTy|#W zL&XG-8L<+~<|a1{kI}d~LL~G>0K?BE~w(NIG3wCvlkBTC!{rXc5)WTVx zMbcTn4RjV>E_ZK;gAo0K_|`TtN~nnk(w0S}b$u~--LyAS8g!@zXvnR&F8_uyni%Xa zyXu>!5nxt}prq1gF~@a*YW*=^p-}7Jsf3|y@yKTbv}W-LSX?K<-9ylhZ33=lhD6{b z+IT!hv#=viDMe3D&!zXj<2OK>P(+C+NM5wJ;+sOod*5usdS0rD3qmv2JXO8DHzRCl?|m4F?S6V^$VB6%lA~ zlyKdG_?7ErxG_;mvi5N{Q4`iNkveR<@FyuARw?}&S{t#u&5GOTwe`=hg}Zk;@OVZq zxij^#wTRayEl`^tqRm)A)%#GEYSFS{r;XqC44u-~tK_ba4Uw-8!35<AmY(ylgf}RLuLB zoxOUpyNDb5%xiOe=rBNKxNbGeAGiyEy16fO5Q5IZUr!ZF>tK|v({)F6zO99Ra^r@p zco+i6y~M#)&~SPm8|y@S3Rn@~a8At~CU@_JBN|FJ66elmk9o*QN%5F`=Arvz!Ixv9 zaZmRm3%E@c5=K4Q9A85j>IMcY98V{*FDHx}N(e0Vu?jOLF>(Y`PbEOdLrF>LrjG!4 z7@AAO06jWwdVOemeP3m`@3{5)(puOrzaYzx6G+aXkelwOWIZrl)f5t_*7F{2!CCFB z2Qp4aO|O=~W#e15CR3K#H!g)hBR0RbEYL@(|2c;K1r7}T(X@Z^srRf-K>v!qv z-b^l(5SFYP>mu?kJ%6HT#EwST=RQxYTvT=i_Y3Y;*B0ZqThB#T8gjdXA0OSL$k=qJ;sxG|r5#qvh!WAH(;w6x6b)m0gw{R*}GR4A1Tl}; zYG3MO-hgE;(Q%r*nyYFW| zh4#Uk{a6yEj+9K#61)Hk9hYmy`#$Wn00&I~69$I`NL&9*EHZ;b9c1^Yr3Kz~E)0RB z!vm&+aMHFICr&aI^+i@3wc*eRfr zpU=~3oICXKY;vsSh<9AI*uwDvUsXUSVP3tHG!HeMql{ zO|D%DI;nlJxzmBZ&CN~y(cPL9#d{utdjhS01M@#P=dC&iivdi!s;xz*%dm z-ZOf6654vV1>zIOsqTBWUf_OTHN!^{?kfAJ4u~#R(2AvNreRP5IPWwv7moN5MR`BV z4_ud07MkSOZ!(3;32>@c@_5?)1?cg_fi=n^G6laU7Zw)cZzlh<{8iVUk#7$-<1bVH zt?E6o?WV_IORIT`b}Q@^aww|BC#&Y?9qp~p03a)E+4)XvdR?D=UY}AS%;j=150L7+oK0W7)m^+!HH!vj$U9CyItKmieIlGD~!&6ZHf9hz?o!5R3S{4p)f z??^ZJP&d29XV>EP$CVy|azfnMp!2O2pq}@}$3Ie&MN|UktXM*2m>WDUhHG0dx17aK zmlCZ#j0epN`WiIR4{8k_3T6+|dr!N*aP;svn5{l;_St0%mu{c2xlQ7A{9MfNoyzcQ z7nia{EyB$w*C6uOmq*}>4wx_6nKRO|vUn`WuV7cd=Ne96W`d+r4L-Y{?P!10KaU{m z{5-T)hg1;nQUbj$CWVA?(7b%R%K7g5`f$M`lF&wM1F?Sc;l#wmwgec{^}gZUnGRVa z&asth(+grgPvaC&Ut->U=6Jd8AzDymr=&eH-h=uNVy>@~qsQHH3M`JGRp+Y}=a&5! z!3Qs_0ei{3+|#Wj?uLEo?Cdlv9^s6Mi%U5_KPUfLvH3$=O;xo4X6EAJ@*D~XG>9ya zqyQ#>jgyiIjNLd!F|SQ}HSxng`*SBhgn3kym6ysEMHNp%B#n3R+LqU(<_RQELbOZA z27$^Q+uYcokGJ%F9ycON*USZWUnd_4Q26e^X%0TW*$BbGmm8+p?Mz|&M#cm+C^@u_ zeKTlbCINs}Ge{N$97BzUD4eq12-^=rpv%tAel>T)$m2{e|LI;I@?I_Q@{HJ3=Ovw+ zI4)@rmw~pufVlX>l-}i2W%kD-b90hZB>0I5$ZlY?fbJw<`l-rR7;zeDI7rm))qOyq z9`W-pT+9Gcet#B}Cu`Gy-A?D5QAwU{Rt^pf^!Go64gBfOK6XYi)6d+wO$#|=24!Pu z`*LB!ZWI z#>2b_Ogd`hOR5 z)w$s7%R=6u-RKB%1`!u$q4efp3k!?mdiT}upi2Z^GQ-pXqkhKrxlpEySvGc+fM>&Q%UdD3$9i0j2l4R?yy@_D3hMMF3G)DqPJDzA|k&$m4Cc z*Vno2k8SQa95$h-Vfm#KgkP4~icazuC=(0{-4NFG!lvSCN-d=Xt*5*V+PfdT2XO(7 z0`j<+7*gy+WkG9cX{lQBGCajFH{VjfQ!W>fz5P?o!m8J4E6RXfh`O)zby{cnu3SX( zw&-tGhp2GKvZ*OgZm0oGPw0|0&nwokV6&2M9 zT4$~4fgsHo`?b564lJE!R5#&oM7(rX=6h~Iz5u;54Kz0gMbu9KRh&tRqtnwF6E*_e zvz1!ho5!!rS}P}e{`#Mkf=n>F^9;1q7>H^Liy`eHAtCbs8WZ}hv{9$0r$7Gu(QC+nGgCk8gMTS`W0fX1%;UxJZmDE(qMI z9Ykm1IBYF53R*!gEW?q>=DNJS~9Y4AwrCO2}2=MmaHL5X~>W@2_Ytw zr3u-WNC;UnqRGz+45$!Bs$Kh{i6A1Q9{|+YAQ#;z=iDZPOb!whY^0}S8TNR+Aks(JAiAf$-dL{5-a=BJgji(vwb^cY zm983%G!#`;zRB*HY@c@x@=}K+X+lUC+>tvh)8^%nW1DPd4anhw8H(&#eE!c?P(E+m ze_>ocZhUM1Oivjq{e?Bc9eX>Y&tYR@hgTD4o_TI6J>kR}1g;#KeMxKJVCh%>mji)E z9(i7+x&LoA&O^PKqH$)}ivSE@Bg!K6ZpaS#mJ72MXQ}~}tXoi`0B{j#XZII*dmKRP zLfy~0_@c-jKn0TzP{TY*h(FF$R8DsRo(4b)E5Lf1qlNt7e z1vY$in>n6TmZ@okJ|tP>QIIO+%q28g+zjhmx%k2kMLu#xrX<42J73Ubu9Lle=GaRp zGCP{Qs_LeUBLCGvAGiKs-)M&AAnyzitfJjx9ZNEg9tb2PmuHUYprh_sw!6f^@$mDnO0}yPP@1IMbCYaWWjBL4KdN#J5o>zmN7e2WMuI zEu}9!-DZ-=A8_^be7?=kK4)ZWec>}tKcaZty}I&^K=PF*UP4MHcdFJF|9a=K>6>p+ zd9~(#Ow>c;bxSx!;;sI$63?}StSdm^W@fNUoW_dcL=RB?ia@{gkub_}@Azgtq^51F zlj~`zmlo^RE%{cQx>yg{I0vJoWN8co;%8mL!UUT&I}tT(+6$t`KTA@5pv9Rapo+

7`JXEb#;SC4+7;F@Mb@`ID;c8gDIB+SDJ} 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 AdH?_b diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00007@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00007@2x.png deleted file mode 100644 index d64fc878981267998e7a6b3423da21a7b3a669f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11545 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 z zD9_0S0#s_<`0Z5web}+)(|w=2xc4c1qjlKeL7nfpFqO&otj|3?JZ|UgeHQsQzL`?T zJ=)~82I`f|Y}hM;a7@blz9!UD^q^3?Wbm}w_;39C4^MwH;)ff0dhFlkHn%^2{#-P1 z_(!I&_1|E*CR+^lLR`6dFmXY=aF-c+)YQ}@%j-QERL3LxbcO6K7Z6&ocx`^vnUr!j z|Hp=1j{noy(x(|QRpt8dEj zS{mt7DKcT4G4M*%T|HKtN?p-8P;Ghw{H$6_ZsYTcTi^kSR=h#v8gw50=OeG+p?HQO zWE>LqAnFqO{EcU`U5Qy-QnWKSH(z>^b1=%_HTt+S3+TsS3HjNl z?-ZPIA(a&u`(DZEYuza^KU!ipKb&Sa&&tf~X|GhgPCAhJbUql#9b}ctNCTaZ>G;*w zrUZ5k5Id{}zz&k3m6i8J%Z=1(^kb3NS>lj`lX9}uN^XHhR1_6g4AB&mJlvTo0^HE` z7hfwt9n$1_#vBanLeR`fPnTk2W4nh=9$syrM<@T1uWj7Tn~YSXRa_xAt&tlK$W0OF zxY3d*_4^|2l9@I}0Li!PdNVHo+H(4r7G@nbJ0*QAHc){?_leTa?>F?twOwMz|2&e$ zEv7XvC`fM9B`8AIwftx19~UtXpXvYQ84-3jcH+n-o=)Z@D zht0RHU)O)Yij83T{2=VA?|58I=ij~_m(lCN;Q<|IsVtmwr{svfFh2XWNNEN&xIq1* zfCqQy+%=X&GsAhGXC6FPgbu^RG^NFjgq0+?5dUvSh1mXyxqRnszi8eVu&o(V$7-sS IVJw3G2k(;14gdfE diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008.png deleted file mode 100644 index d5b3ef4491cc099c28a2453b89e9435d76aa573e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5218 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 MhCZt5rcL<&0NfPc*#H0l diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00008@2x.png deleted file mode 100644 index e3c1d810dc43b1d6c34252352c27a7d804946ecf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12830 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 VN=)4Cz~6R2R28)ps^Hdd{s&KcJjwt7 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00009.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00009.png deleted file mode 100644 index 2f1dcb4a69ace83b821417c89cda13a7a389f6ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5999 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

nngCEVwFSJ|a}ckfZQ8c&Os!hN{_RP) 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

FXpOkwcI_sytLD2wl{dF-h)CyCr!x#}1@e(t( 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008.png deleted file mode 100644 index 280d61d87cf21ddaf957f4d6ab41e133b81fc9b0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6131 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00008@2x.png deleted file mode 100644 index 82b366b9dfcb6486cbe89d3094dcb5e1c02ddeda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14685 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 OaZgTJwiIU^{C@z%ngj{} diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009.png deleted file mode 100644 index 0f82bae041e200411c3fa91fb08778f294b24bcd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5697 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00009@2x.png deleted file mode 100644 index 5a37f7d11612150f4c808f1994ff9ac169d6d6d4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13610 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 Z&T;P>{B0Fzi6HP$Q+}vau3#DV{{V3*E3g0n diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010.png deleted file mode 100644 index 698fcd1f0e76c49fdf4f1220717826f63fba23fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5373 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00010@2x.png deleted file mode 100644 index bab30d1b82b2bb566a5d63f268f9554316d0b9ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12636 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 B%4q-q diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011.png deleted file mode 100644 index 369ad1987fed768c64253603285a302e4f17ffa2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4844 zcmaJ_XFMF;|DDx4N%XRjG(OVFr zMzkP^9_@FZcmG%a7qfRhGoQV4@A;nZIcFwHPe+xOik%9AAX;@bi~$&f!J$P#27U_| z+eyGc>857v2}am|2MmqaR|F@#eug+NWe-~`FINu;qDc4D>e1D}x@p}~7c_9w*3{G% zx=98p`H>Ae_%VHkpsOzG7$rlW%&kmECk`X;?#sP}otteKeMZ}!I$lS?zNjtUx6sXn z&Xy=67wWpW5F6?`MJjQ%SNJD-xr)^X5kd^&6tA_T83!VmVOP0TYIlW3(FfBy87qqu z>eUTK4K}8QoF??92xtAPIfO-79fen7i<&h~nsB~ldhW<{8G^shP}6GLV5?#bv!F?x z{Rm#=|2x@cjGZDXBfAn}m0^M*Mi4=50q;a;^3#!n8Ba<^|G}F>3S>KhkPD;^6~WH< zgDD{cF*c0xx(jp!eIsA+hc=-fP(19Ii6H#?2~p5nZajaaeRiaHi7F5N@&;bvAH?k| z=`N(0pZs_Q9=yf1#8E{%1pbl_uT*R6>=$Vt7Mbz@`N<^cz9e&zdJPq(E+?{$7x9$# zk2yD9Ud-nFfnLSPJV&W@hHK zKg)gMA|guE)YSC}NX-5zhv3qdrGu$PLBp8>bQT}v8WaQ{8yoW@r-m$Rr-sMJ!xg!q z>{Z9-_egiBAq5zN>9)=zmJ^f)zur(c=sGzV;VZT&W(cy@ks)}PmJSUqZO9T@PMxUgtyNmg#*OcO?vv9)Ol!o$?<{`q z`Tq2fDlTydU{ndgBlWOM>t5`uLpiGA>?(PB#pmVzurtn%Bng&XV5;S7 zS6pV^hs3blMkH%sZ(8W`BW!A?Oq3h&onsQz1D4ReRW(KxwbzD4$GwimDeecqu(9#+ zh;*$90d9(g>$b-7$D^9JNufH}4lxC6O{r%L(|dB5+Rn3lD!06P_PxP*k1wgGT_1Zu z3f;TBJ0{-W-@gEWf5l6gQCR-h7>6r9Z*SMeq&!8n%XDq>Ex5uyG{HS_Q z)^*u;ZqPjwi^ZzzGwSOzs;AhByd5ZHVP>xIm(6w#QCvuf{Nhk=vgjp!gM#R46bax7 zNAE=OwpHWzYX2jbsxtkd6_}GPE8nx#f=2nT2gScdFM6r<8S_ehWtbacnKU&u)6&zG zxEVS+Iv`Fua#=XNw2X`(s_$ZMFiYn7ry5j*>7LiWPuP_)!{W5zcVSHr>5`I?z<*%f z?ru#F-O!wI(*I&@YK_0t(3Fms%u~TAh|@lh`bxej6b-(c2dU^k2+YHw5J^3XuX#yA zl>nFUMMdOv5&1QQ0#BLWDI<=kZucr2%HGjYSyh$1!F4{qsY$ATaPY@;y<^pslUvIy zLzqEoej>{kyV_*34v6(`A4D^g%u<7@T!Yydcm4SzDz2^k{JDbn<~La5_gS@dju+;8 z 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00011@2x.png deleted file mode 100644 index b3e71bc07c938fa3d23174d55b8c3d8f65a92dff..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11683 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 B`ON?T diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012.png deleted file mode 100644 index 9f09b05d26fd17ebeab9466935a829b982f6e3ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4491 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%0As$9V)kU$KB^ zaCNjIUpDM;Yc5X-cbspSBYSs#Z`@%n;iH8%?+tF5u-zfeb4%+3u&eS{ul!^6IK*rV zo?bN^kj>Y-vUt@X=a3$6E>fJ+wiI>e{Lh(q=i>IfkB&r3af1NorC)D7JC_y#QGP=a??_Sn4+PT2f&p-{|p-2QrM(|^ZZ%rOCJK6 z=!d0S-Q;$F?CEx)dfcoWc5A)~mE@bqVqt-i#{K%Qc?Be%0}w_CTB+Z+u?p|T*BXir zk<7+vi~mx)_(-H^-9B_LWL`=gUinK`^hfjf~5It2}teT7b zZR7fe#zq1pAuEgOtIbg@Y<~(}mvEQvw|-`<@*z@?H8x!Y?jUX#oZp!Lc!>mkbvk@n mNkN`&sIT{bNBHkk-ZwWG?4RKs$iW{ekoIi@bhVme)c*hoVrfDE diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00012@2x.png deleted file mode 100644 index fa2178092874d5c70c3d8376918bad170c11d109..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10713 zcmd72c{r5cA2)u_*v3+ZgzSUj!(fV#eP7C2$i5^=vhVv?vxF#Q-$ID7WZwo!k}Z`q z7(&RtW#@N%pX>Mk^XGG2bKNt>%-rWb=ly>dN5Ab~c9~exMdq)Ah;Pp2!_EdJav+;Cshag0{hgP5NZ9`WrK~15% zuG)9*Xbb;G4k`MR4?gj~+yg;ekfw^Ffp6AocED5fv7m*Hy`Y7Y-(Oy^$z8phTv1{u z9sEgWMbhD(=PbVOV^6`FGqylzr7I4iMk77X5Qplg|NUKcMlwV(WnNhMNO=PtIP@zr_9kSzh}n&QDpS%PgY&nD+tMAx z^(+!Seg>*YrTqWro@yGby_=y1k_hBQJQ7QT6@w@hE@0u-SMW65n7@N5uIma2I_S-` zj6DaIGLOnS$L95+PO6iL5?LNe#0vy=2-^38C}1kkKFk&Jgap`7#-tlCtOqm&dtuA` zaVq8pF#)Oc71F6}`v~KOMa;<9!xv0MNcNHV4#+pn=Jl_^SKcm)WO)}NUR;85$Xz+H z*CECCA(rG=L&yZW54BQGpTQbGVV(z%QU|aqA!cA~BpW7@>>>1c1XeODDTL=*mc0zg zbS|uwbXxf^5JxKj32{XPQsVDH9105wL@Me8Ro5$c2ME`7rJ6;eIje!kk^M{(ON2I% zY;+p=UL`K-9C#Dxj2*AL^bPCY%@rY|g*dpc6n(og*HG!x5G9Jp8^LChN&JV7c;Tk> zX^awerhw?9SNgK-TThOfON)3RLZ<|mwvhPDfknDoSGb8+7TVN5NJnn5pyuQ+DMiK1 z8mwGFpgQXk4nq*ATF2}?HEVjMDOAMqHI&NKlK)+2TLcP?nj1o(dRV_nN<6rvR7tON zDuSAed!w!q;pB>uf$AKM#PH_z6iF-rRJ%Gr}k5IV}7J~m#$4YA`P?T z;0GEkCDcoa5`n)4)8DK~Y_dh#H*Y&Yy6}B?mY-a}rS@2o4GdP~l9D@3_d}O1pB0n0 z5dO*u?3fQKTpZT8(5+Bm6z-5=%}ic{R!+5Zov26q!|=FHx-e;2U?Or07tp7vfrugT zWy7ySjT8wyb&lx%u*zkO_9eDn#pE{?Ic`XN2&ro-xcqL+ue#K>u{`*+E1Qn;Ze2^> z$YX0aH@aPa_Ijsq8|DoeT16xhL5hq~nch3<#8^>Sdza!J*?n(n;2rFjMdC?tZ5C7zp^#@q37wCfg46tqII!G?Mm zYr{O-{G?VH$>;Oi5jvH{!aQxZ2=(z#>Znxp^(u@;9*co#L7=8?)|p<2vf+B!=SgqE zIA}1tPKm1hMzxrb!vrZslTPbH`QBp;RAjGiUwvIX{x|q>2D$cVYZMz*a6Bn^3I zjfHl=v+3s<%FrnjYA)Bg2XF-#M`C7#BRV;Tm=FPT~G_@OjfE+EKnGcv3~={jXtYLE^7RzBkXRz|U-?HU3)&FIeibkO<^k3= zE5ym{WdVPV@{<-Yvle4uS~W!u;sppBAs`?(qw)ywg8V2Z@DFIYOoeGunyh>i&}$j$h4${)+jbu-a=0`b*Uk@ z8(VAG+SZ1v;NxNgUhrWVfx23FMyY|oV=AoTe=qhQmck?OnLI@X-jsnG#rAOD|vE)rUMN)WEBtPIxNOq)^?N<=Dk zWfb=WZ-jHU9)Gx``)xzh-hQldX8QSui74Xr$3jR}Y2WQLC&_Y_-8vs?>`8@7Q2%{? zhIR%7>1p)BK_R-ID*JO~nLuhVgtNYc#^nWLWG%S((3x_9)(M;tj86$o|f#?z*(s-*2o@Hj6W^##GO` z+f}&fVtQxwO;Sn1xDaf;nryu>Y`v7=i0;2FGZY7ojznB~aVep`!X&lGEYNQ85>Y^X>Ya!TFaUt5cBtH;LQub%1Kf;pe)=TP zRP^T>G&~e~XcEPRH~}ZJl6Cw2p~Nr8CAxr_i8P;9!an~3^fSulmGs(+dCUAVp;B>!4b%;h1>Kv-mS_x6#PV+)eUBh=xunFu)Ts7g7Rui0I-_E3ItIA0%@K7@8*6K*ySsbiAP`B~$*O-q2!D7ZU3O%N0H%SQoE(F}K>al@1|GHD zuQToW`j!5ni5fq{R%*cj4uX5luFTBy3S9u zanuTCgsI&hK9}I2H8W@L3tawG^Bj=ugj+BB>#QslL0T!Y7j{>Cru_J>@$tFs{xvjj z54_UzfG#dB4)LtpvR%F#<0J&P7_%`kl7?ANYi)bMm=%^M@j;~AjCdb9v68$@UDB6>M~YbOym$I9#Ck(m)nwJD9NS<=ArK;UsB&g?{^aoqQM=U zKExo2sHiB+&6|-aDVJT?6~$O4UsJ=NsXzJb(VcYAZEAlDNUC{{5+zgu)jJiAJO+BG z6GOxMQj<;ApFus5V{+8;#7s3LL_WEXSJ<*OnpXZ8SzcZaplZ{1f)MF9%aBK+?^&&{ ziTk7{-_znR6RM_bs2Ot~x)B3>!K?;BU`ZYeBR<6kS_*^xp7OLA|DZk7_N2yW-o|jR1S;P($RhyLyk_EMWK2TAvw zo*Z><%LJcp=br!2g5TRGy~qwu1L&7~?T;5kVNV7KKh9vF&+y?vwFTh-rof=8QaGY5 zAE&}CG2fp35OidTPPUR5iz-lA;+c_^%d5g^)jh>UZCW@psK>j*RieRFA}?@fME&}$ zTYiH5^+LzN@}S?QS2F|=Z~!zPdwX3z2T2crHbkI&w+AGW`sV>o5QHk}q38%?6bC~M zm>`Hu2n`YHtDBo+O)H|TG12OrLFZWTGxWDtB7ZD13riSreJ{%|N#l(m^|a|4;X)(# z?q)Bit)JhO8gwBJ=VEJ$A+aa;aNwQ%{`?+zGe&0pl1u@iSai4Z_it`MIUK&zp%%mg z3l;s=;=l;UHWvwuoZQ7!JN@$SRgH}Z&1B@oXA)7EQs{mDSP+y+s$gjNWoW3o-s$=C z=hHa>YvVEQ`t_ZQi~Im8o)SJD9|sDS<$mlX0vwj+m4Ez4wkUti#nfyYh#3e51fd3*}FDhFH5G;Qz z_}}+GhT&^A|Gm1fbEur|aRyW?n6J*7cVjR38<;9xYteB}#h0CM7klB0yY*AamLdFh z(B=M`s`u|n0l&rb^EdG2>mg=bnTs7BI5_lK@F@sk#dmg;ZJ0m8s|*BEqFa#H(zVt+ ztNF(?Z=^?XA^1~ng9o0^p69Ok@F)wNAfP>#dlhvF9QSfV%p)vb>b`fJ550`YK5R<0RVV-c-&|EaA_t4!e;Ojka33NZ;z5+{}?W0E@#~zC<4!#pw+-2mggrlzJy6>dd#m4H_&+^|%;^wQE&(yWeKMKP9)SY`;E zNCPZ@v<2g5ZQ$F0?1;QwL{ICl_4As)A!H0ub`XbxH{-01eOheRr9TgVYkVFb&t8R& zvySVw4oI>LVwQtWae?!Kn+5{AtkM?Dp9ijTBqqvk;7RBtTS!JOC}l1h!ZaW}=W!>e z%!eBEq-bzrH|F^Uq2q+GhdYs|E{q(v+bMuHpa)By86C3;(!m}j)XGga*<^e-#zvRK zXnXfYmuFlOEg7&F=(MyXhvgzE+-KF(hQA?7fy?#x`8!dg2TMsajynZ=j-1$^O&$xu zA@1&5v@Y{Zg!&8pHLcxfQz!d@8nk2r$3~+OO_?m&ICu&Gwa4C7sw1M3f=Et;8xgE(4@2G_~Z!{;5G~m(0T#8HBJEp zFOReJR6+$IiATM)xoNkV?!omNH@2EQrA{X2=jV}G^;Ns$>j7DommqoQG=?unLo@lk zi?jq#xxh4QkN!BBSbaTU|086hlLC|&P_RfV zw`IaQxdPkQvJaDaR|9^>@ZBYz{%c^Gc^~;?Ok!Q%UmN0vHULEsBb{_Y7@3%^%gfVh zCWF8MrAbe!xFO}Uy$I?xZ&}JXbyrQ(8vG?RkliDuZBTCLLh5|l=8yplr3P^r)k@DR7^T!R(JsZ)x05oMP<@7#Y@_YpfO66iU1wZFDrnUk2Zj1K%dKryAZqBHc-b_92X}+`(KG7b1wzKE4o+?$7)~7}&lC2}wuy zdrRMLS)Qb885eWeO}1+)zjb418xg6*zFc?D%kjQ^!xw@oGNPR?H_)AVaFMue657TK z1w)N{Qvo;!oJ$9hwu9K=Jou~Z1}Px4Pc<}AHZt-G=@E za*vcNNn^rINJ5k*+!}*0NtIPM6r^+Qejq{8AW9WB9XTcL9ef{H9l!$S63u00f1OfR zbsWrjHI;bj6)TJ!9cLzlV7D}23^$eSM%ZY?&m zY{ZiW{@AIv4Q_KjJeRADzp!3~0U0*~YDz6%4}w0-x&id_JL0;X909bKd(%n~d9PcQ z6JdD=-LI7V#)~*<{$o{(mZp1yRC82pu{lAla3+QY2z|S8>8zg1pmD8D7=gfgO8D0m z2INQqKR1ZX7^r~7X{e(Klp{Wr%Knp%Lu3hhn$5U1;cv6<$x2?}8DX}SSZ1zd4(4wnUT5qP0I2NuM+ZwBEd zQ0cq=LD>-Sahl1$GJddTTLHk#4w(Jqa-I)H_s#;fpVMd{aQVxZFW3dY=LrdLsJNu$ zx~ORQY;PhDV;s!2m<;&j*Eu==q>9ai_hcEUDry5W`o}fD07tCm2qFOt4R;cPoPr`r zr-UwEElGnH$cl!#n=MWROUC@8=N9E%04@thQfIo3)>>R%P$?u*DqMRx?!7-$g9c}Q z)ogee#rkYWIk10SB-_Ip@s!XNwF{FS)%rGZ8$V!*V9xMzfpMeTU93a=mFJT{1 zSa2s{xe$7Wb%JzU5x#$d+bk)j*(R=IFxZ(H8-ScV**aDpo}JkOjdF>m733h`EHwaI zBA^|OQzscNIz6G54MM8uQYy%B5Pww5gJ~|h+t>e+mJ}YX!VN6FW%7VGE%Lh;J1``G zPR^|^sFSLys_FC^(CP*Jm7>*|?Cx^8L(&Juesex!h&OjjwRtQ-V**1{GmaLvXr4Harw-Pu`MEtU(*6MuIu|RI}n0Ja&9p zm2Sz?KYMB2&=TpoHK%z_G_Nx~29@JgxF!9z=B~j!N^YiWk#BErPrY6Jy?ua;>(LWP zF^!_09CBs%1RV>~Y2ZgTX1W`fD_f9>y)M3TilWK9s3Z+Ae6Z9Yoz`ug?6A0Jwz!lX z7H}Jahbs7&Q&XaVVl*}}QEanR2b0E~q<~>=ok3wVlQFk$Ev0v@x9xEVTeZ^wt@6Ui z!&jF<_2G>x(FKcM!4_j6F#y;6d$Vy2KRN$tjZKn1hAUeq06wil#u6X3PzacE#`Pz) z-^B|TY@D4hmX%co$bnf|OEOzl!S7DD@N^XLb48pFo7!q0e(o>EM;ybrxaeaP#=Jm2 z1x5{w{`!H~|3B?DXqQ`LAP})!SXy3Iwz4ADr)F7F*Pv%VCGmj%1A5UHj2C1EU>$sO z_8$D6ot*_KI9CMtJ?5zDK`95ux719+T$uw8e0`bw9?};({O*dR1`1{5F#`yQ?FX|I zK?4*!fNUB#+FszaVS&ke7%8b(;H`0@)L~dpsdxi{$fl-SBIZ9^^Lp72C{Y?Eqx)NF z9j!ckA~6NgzA_2G6^P6&u8DB<*DRCd!G}qzApCYZwKsr*} z0Q&x|5}tW14CWgM*!cVZ5@#@F!?jUxCk3VGu zb&2I+wzahdJg`R$k!NIN%quHvxTI@E{KFN~Qmp~tV`u?zhI-LmMSg~^PoEH#mTj?W zg|Kc6AW)Wg@+WmHfR^M=mUMa2wWg{D*ViJ4AB%yMYWTY>O}8&&R*Ukbs!E}qul}#K zcVZzh(=|`c%%*k+0hxPBO@6=eYxTE|kea%>w0A66ICTy`QjkG`$^@kWP#b6$aJ1we zHoE2|!vS)Amjh{VB{4BEmHmTmS!q-i4jF0s8i>xWE_m7Zvb1QP{u}?+iHRf>7d>|} zL5%{V7aAH`nfkA?vhw%w!FCn8|58zf>&qypSIU7NY7hcBH_RBCmaMEGo6e|lZg!D) z%6Ia;-s$-7{SKuHBN7xT7zsO0-gkp*t^LRupaMv=0e$$J_)6F5^LJyWgf-UcA1-;a z0G;0GzbgP(1z6qljg~_7#7Z;As-(N65g^j=9sFV2o8Wc42DZz9?0EO?9oX`+d}&pD z>+Z-m#<$Q8?0Nrs+mDLzj=DJ4nl5#)eUW_vy$gw&g=Aaho&lf zJ_pMkUQPPno08{+wz=sBY_u&1TR}YUv@W4NN_Y@I+nAsPlVq339kR8tfhF_W1O~P` z!d%&lp&u3bcs?f^ADM6L1@}quJxZ)N+_Ld<>;ca#{FpGVTb zdx8P+@bD07S|`lOeQxcs$hJTvrR;ye{RFz__X504Pk<{R#xI%N1z&yVL}+!$h~+{E zJ!2gegISxo{at;&h#iFzIb^8}4bSsFEp6?YZ>9H~7W$k`CTdn6P3RTz$Fk?5P^4f0 z02aQ;>UIYP)yo&Oe0XpjSZ5>v+0IC6 zCXj-D`}(G0Y+1C};g?*lu4-CHTwh-wkhA=${dWJrxP2QeaS{m}vi<_}F)K`}*T>l? ztDRc%m;H70UnLIa%Afr)b7}JeJT1tln}gQT(Q$T+Wb1Xi2DW>&2kM`(yy8uJnma0a^{cjS-8hjePujyaNU+?-UAG{fBrKSuN+=BQgf zHsmbWywMdVC@2W_NQIP5nM5oDPo#+lgLY6q z@%WF#LW4dNxdKvw9*+y&^9k8o(3RQzun7>wHn>9`SbY~ly$NnCt)!%6=wzBg-uEn$ z$?_BYE%d2#TqL9=z*!ykren9lr4Q7BH0AV|sRc+C|CfR9Bxgy@L@{2~{Oiw7j#9bL zFh6Hu@{HE1yN1dVHdRsT9rE~M9z03 zPbB4b47lLKo;W7f*n&mqecf_gk9^^yo9Xns|_(>MJIZ4|&6u`KsOGwayvB}aw zhdaN^aqUtbhdWEEs`~Cw>R51Y&#u$+e7GJl_-OTW(Vetn$GTq>6~gY>k!z3m&1Tk2 zhF3>yi|#I^;W|zax2=wTjh$ZBS?HMZUv+p31;Rr|uRM1NoMka1^*cY+3M`OX3 z-Md5al-LZ1jJoyUy%x@P;DtkMO;T$%xg}U}1P}Vm`z+oyWuPF@!ouyx-JGWz2l59m z<^4MJ_zfVm&C!p0x+B|sg-;bI@W5L{XA}o{9`A2jb0L{+nTwZ8zkV;j--*$>?@%Ac zH4VfJNbP(k+$fAw4bxInPiJ(`c6877`b9cgsqAqo@1Q%B;_ z)ZQad!uMhCApUTv6DcJ!Yf%Acjd;3Be5Y3E=J()1*K-wa5FR)$Rnx1|F$tT4s9Q2{ z-}QcRx=A@|Ae6!g5V{-l8f?wh-z`P+(Z?LL zx3>r9EELjoSFL^h4dQtf?&|rB|8xICY)?VMv*}+$1Ev+?Uh|(*I8Sy;Tn0@lbX;ApkMDrB>ViFg>-u^(5yFqAvA z)SUCo_WDiN0Lp~~kVM>M#7aQ{&d!7W;A1#ac&H#S8bjNG=?i`d3kL|(xuh1J!@0SK ze7Kt>GjsFFQP-Ow?swnMTq)W;5Vm295O#;noXK3agQ_V-<3V7G#3^b z92~R^T&`#k4mu(ba|Bav-;~@oBuiLozON>7QNee0o`fp|Y<-+>l^bj=juf5?0g_H@ zjBxCO7Ylw@AZ0`~B?^SNb(T0L2Gu^?yLWRU=8Z3cR_n%UI*#W>1YOZQ?1LIsp|c-a zv&lSqfhuR0$x>s(j=nhQP2{AN`}foKY zxxJ(DyQL3P`t1ZW2Qr!~&5XAN-?eE;=C_e&+25yNU&T=iK!osTJkZ)5Y;DDR2&;ST z9hFKY>#+Y1qKWpK diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013.png deleted file mode 100644 index 6dc1bce809553196478e88dbeb15bda6c3ec11ee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3923 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 VvpnRCx8Q{s(9>U3mZi diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00013@2x.png deleted file mode 100644 index 88e452171551942ddfc7ed45d1374866a4caea32..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9678 zcmdUV`9Dm(uj9ukt6Y@>U(NyYHEv%P(tnnQTDq8UG0QGcpwi|?imDRZ{!5OqV0^bc z>;r@mw)9F_vmA1V^ zPw+XX38d=iQ>YbjF+U6^f5$(Io%h^o3Pm{hImn@Z_StNGY4WEcttYER7@7x9WSQ>o zqtGYBlY@$;dwePC0*rAg|34jGZNycLQq(_&A;}|7!dtN7JmkM4RPofF4<5b#K9;uK zuLiwL8WYa(j+9=HQoOsd<&HYZ>N6N0gqHMzJb-kfuSU)%Txbwdf;Gfzw6wFsu zz1;mXwxpwAk=RJAEuPDURh@(lhAmrB*uH|V2UTV9L&Xj!3X*Z__H?{yaBe$YCPXa;a_uy zCyEt@3<0at=2bao9$hg<#;U0#LrZ=$^F;-RBy?<%miH=IiGBq-mNiss7YUXmgq%afpL~UY8$^OB?19Nm0>?jNdF$SMDH;2GT_oW96;*j45dIq7Pnj^u>9oy}E4 zyfc1)NmXP{y&*Ua^|Y1+w)yoJ;z>@wwHWhV^tnRPqRti-DT#rhAQN?pme9kGBcK}k zPREI47hDt9qXI4;;^YHeG@+L%l%S__+r)@f%B_MSCq41>Vxv;lm^DVT9nizcqy=g)TbJCG_>vb)1$q&%LixG;KGXW?v=fcMX%vC>Cn(n z;hq@U&r0|`>^(d&8df0^{|Xb~IH4cKo_GP@X2)KZ8LW+h{UV^^JNcHpGtA0joHJXo zr00&1?k82|Ibp1a!N}OfVd@FEq6DOku44nMt>K*DhSSp3{g0Ir3B_CvLdYjYy5Zgy zJuEXSFc1ax{==bKrGTA{ob1NMg>l4X-VV+9_ZC3|4E|X#5=3Y3a_3EYI*5@pTVgGz^&_SWA71i8{WvG-_;NxNlJmkqEt~<$8&;n~ zaFYiyKHx@7t)(X|z8qM=Wu8BEuA$W$c@h{1V)dXV(ySkWcB;5baLU)s>9o&*nCSzoW-VDb0tlzwh2A>7gaDmBIN@v(ZLevZ2)gd1!5 z1r=63@GC)`#4~ieJtxfBl=&!xtINyij(UA-N-cZ0OAT9$?Z2&kBK1Tn!=3-F8tY-; zbo8x@d(fR@KQl=6@X>8-Dwf6cdcc%uY(hf9FP9p^dWq#(jTr=T5R{`|tfIiR-~JOIzZn z3#DxzyQ~k*<-X@6(~mARUEl4E6HpG0ju{yl`DSIcS9|>O$~qIM3`$4c(>JKNnEV4@ zjrP4CzZnkol;Au?d;BgLbvehF&&h|5#hI0TA1yU59w*Q;FpSL2VXV%> zLU;P;ZL{uv1YqCC-*_s{b?Ce8t%I4-5 zZn$yk>2G#s3l`Bi;smk%y0VJ zR5WKh=7q|%HaDM^R+{`7H#F2PE}7cNaKjZ@h~K__d(m9)DZ%b`z_@IdHo{nW{6Hst zE;8#sUJ4t|AWKMFJ$u;K&ML8z(e;v)Qg-%iB9Sa1#?~fNC^9l~To5){yMYnwZL9hW zqWPD7%{OSDC2XFh^?YV4tj;B~h&l?Huje^lZaFpE5?m9Yz!k5;7vTx#7?jo?MJd9l zqfd!8lAp>IvSwUm+}b5Mwq~TYn}(d=2SGESy804WBr;P|Qyr=&ztVFnaZFYI*Yz>| z&6`#e@$}TpqRaHpFHuI4N8U3qJg}~Hdo0GBk(*m&BIZ|?V8pv>gf8Q=C>;d>pCPxQ zDqq?kC!F03%CTYzhn6F7%(z;xk>{&5GSJoeJN-Iz^^XU?=ofqLEU419+c-HvwMV|V zWjR#GIcKuQ+$$J*H{=AKxuk?1JP`VCp+u-Nu}kT1CB~PdOGAKh{)yDJ#ID6S1JTh6 zXEOmN>SzPQQSc#+P^2)4r%L1Q1hid0c2gSSr zmYyZ=VzV+CH8nNvpAOX+C)NkUrB`sZJ5f9w^aTXDk`nzgql~<~k4B|s-d-|t>lJig z%R41$L3yqDsxdr)O-MxPF{w^A=MCN8Z-l6x^_;@Z zSq4#=eGZ+q8?kOU-rlN^6e(IVT~|PDeH(d-_{Zxq?Rd1&Z9p&Bdkeo%Quz8@G0=TWiiTSpdpGl7sE0 zrKhj*Sj{5R$*-w0G`bE!64w97hL0t{YwdoLu2*mOwDc+%~rc-mvk{!F=5v254)@6)< zT0f9`V-M&vwrdga4kZ=UH8wWB932kcM-SX*<0Y^RQvIs4P+;L`$EW@JTI4EWUXQ(*hZT@xJpXVn+t$9LEhV-Rjv6FOPh z*zA0LU+3rZK6vn8GhS!zlA&SulJ{@#yWrcy!g9g4FE1~HUHjSJ&q)6~uG6kHVX#UkfE_;L3adgBv8u0MRU}yjQq&JO?=_i*kKv2$O$nEjStmrI^scH-PAIrD z3=>EPM~D8B+Z33*SyF4GYu}c=G}#g?ySTU*)jm(Oz&AxWN%usMQL%D!uM8JzYH4c& zx;=Y)4~@oP)+=U?X*_R!eozo$Z<;ekLGHN-iNyYN3;HTgF9InYu?UTVP1LryOqE}m zb-h<(R;XVLi&L3s@VS0M+;Vhv{gVV;b)#r3KSBAf4GZ??AqEx}_y7)uy%6A_zXBzn zYP873`(4@_4Wl?tRje4wUw*LM{L!dX}K)Bh&O1tR9+>_t-2Zff3X)a0b;n>TMl{Cj-z zo1chzET)OC0=XT}6fW+|2$2{n)DyNbWd_%BC!f|Hvyv=OaiNa4tvJH^~?7)>lX$xIa$WQvU$?%n$Lr ziJq$x(iyk?*8?Q>B^NWVN)APobvTsttYEnTW>c)+KDqd?}vmL5T}wrOKNFpeF2HK6nw#~V1F+}<_i&p$`j(?<9SnWgG~hlKYTn(SBY(909HAwb;{Zfm zsd0rL4dr()M=}AoRTRy;BzCI$q_Gr4YPTz)pP@WYK}KeIKp$)<9?#R{x6vp_bh`tN zNa#001*ZS>RH39qN=|M{{Dx#y(~jo2lWheb1$Ktq=W5d87f{j-7D5?XyQ>AsQcA5Y z#&2TUZNGp2K8VUe<|_*`**Q7Ie*3m5zMVK*$2rjwT!$$g230lh`PNki=brv9j910V zoxxAh95GNG4Fu}tLy51S*;$Z!V$2P`Ym9q)dmr>gxB_hMcg;Mkjg5|`0O<~ysCLwC zy05}bI-62TTJaHRGRCL7kmiyS^5;f4umQeE*B zJW)0P-+|zSb2xZuEv*w ztrBx^aA6IBA>OvO`HPR* zTC^(a4kLV4`ukK09-*3C*LfQPJM3S>1z&m)N&SP#MDJdxiP>2-nX|xqnI5{k2xBI%kTEP%iU8CeH z+(X;69Cj&_z|orA3-tNpQY2)`*5c_jn-i6bSIjM0 z!`0%$dOshQS(IN=Vx5d1Yw&jsuAc0Wqy-Xe$@`l2NNlGaP(<&CR#9&v$_c@_0Sj^Y z6`>nXAJ@C(hn(bv1P?tWeF+IT1)FD=x|v+p`MRV8C^*{o?LLDM=}I^DF0WITdQyCg zfuZV%G{%5kS`hy_O-YPvN3hj~8%d@vNBMgf^J7*e*UX6l*z2QrV^=N!hFqG9wmSW2a zxbYp~xG|UmtRIvmD;F17%Pb>J;iRj6u>sIY;4+|Y|7U^#LvXb*shr@HSu65re|=2y zg`se3u+6P4v{QlXWUY3Cg@cPr ze0TRlV5@)*T<0UORnDC@6U{crvA0bX6Ts#GQ3{I0a{SEFbz$eQh=JV=B`?;yd*-|) z)}EiAkHWNjaR9zbe9*onSvK&?<(UUFFL{kwqIZLqQr^c&SAZfr0of*E55$=HIq2sG z{Ue{+N4MLy&HrOUgHpr)877km6=@h07FWN<1sVYcPPive$oeml2%L~yF6}7I{ws(I zWGU`??!+~qJ73cR`W9iLeyt%0`i(f1XTEaUGFgIY8kZ9~WoB$|_P*CI1|~zLSOUf&Lgg zJW%kiG6c0|#Tx~8c-G)aTXvtHJI2>hL+Y8eo(@(GIURPz*6od(myr)hOQdN4a|zJ% z#rYWr+%x?A{M?)kI*Q7Phybpdy`SHkr6qfGd%7|Yz9yo&-VI5uoD8F2y>_jk4yTHQ zf;|Sz2rvPlI2jokF#3SVwPw&Bsb9$r250f6_j&>C)Ss)U3G5uM7b7x+1+ z`??p>ATBL#O*ezzJ7fyc(9nPm;U8o1z_zEb{wV~~AYI7t+Wy&$c!_~1kSw4j27Ia| zfOMRcl6UyE@#qTb4WVTSFUe(m=Sb( zK`luoC1q~P)L0`Hyi7jn@#?CRFk7OZ!qSK&Enq@tX*Qq`V`5_52}1cGVE}2l;+7{W z{{x9KXW_0LJA|6q(%N`{#??M7)E8hJm$IU3w{dWY0U{d$E(6v7_a?bVEq-^Y_uL;~ z1=@;hI^4Vz`qeK?SD=~aN%f>adhgDfE;{quw{JIlL!tjuwZNAHhDENqw33`0TVv2c z2@CYkL*6$*=_wqq765gE%Nwx@ zMuQgCaFig2SrH0Yu3&-qay(z`O7_`beFU^#SA)+AJZN9IE18?Nwacj#+ZncxvQjJ+unH3h&lnULi7!mSjJnLL0f&wiw$~K$W5RA1VCpIpUJqsfC4tOsXKUW?p@G3$%u~W#iX!7$`cf(EUe1t&X}J z$mJ=38`Dx&uphPHtxc}y~XbRyw*k+IB9m=idy(Bc- zc2I!nTTeGLW}}+uT&rsnH%Q-+0P*J_XQ?Ne2JBNHNqcKsWhkx&c@y!00IrIn@%1EGM*L=Hyga<5XB#Sxp3O07rQCoq|3Y?EC3lFota0 zLZ?t4NKu4i{+;$An$>7zzG2|8l_j7btr3B&KJRV(xAMm?qmdCbEaH;4Zhbr2BUJPP z@dbQGDFhw5iS@-M|AC5cI^T*U_Q8ij2*4@_U$ z4dX_u(h^b7Myf#PX~GxbPMP1gx4+C?GMC5r^L#fW*?X1%(B{f@9nXc1OMnyrsQU&T zI5f;21>I;`EBB`2=&}XE+Y=sQxjj^^tdMezYtzZq)|7c1e_oGXe&dJ0;Afo-u`UDU*RIS7eU3lQbKI-Q6UMbBHVg0+#e-t~C@O zWfC`{e|Oh=JlOBg1WCQ~S1UDkHn!c5ROUYO=C_%~GiNf3yng?<3;=4$dy*lB^RD;r zMmT_rcNG-_46vZ5Tnd+gkk}^@E4;~?*Y5F>?*vREGE1*?+Wqr55PERXanx`DYX6__ zdj}Z*Aa|y|sLLlUax<UG`Sl;n^P1$lq$*-6i{|K=(N528X1 zt-{|6)6&wu?0#~(Yg}r`(X~^(0MY;+aww^m%tc{iV-xNxx8ZNmTXjmISyD1QHi2IeCNGNbseyr>XFkV707qB0N>y4?vf1@w?Gxru}ESYSBn0eb$Z#oGr ze$KaXxiH;oYTQZs85KRpp{30Xd60)nom&ePc0?UndA8$>AE|MBC;{RWH8 zm59iV9(z_waC=ZC2*G-GBoqh?FqHsi=xB{e@YCwa?7Zyk)Be2y#06R^Lu--7`moJF znym&~Q*KnGa%c0E-)!`MIboH#ko}*hP6CY12BK+BWkyY(ou`g(I8B_!Zl-7yPGHc8 zf4Bfz{XY|x1!WJ-OGm}c-zz16Qu^2P3+d#bZi+?qWr`wwX zouoA~{p%<(Y4Mk4;c&(lkT7T#DEa61=L{0x7k7lbue>z$y$Vr%G}~ZFF-a*#)-VwE zx4I&9^*;CU-~*4TpRuz&6BDdpy}&@IZf^dG#U2n+b@G(Xrnt}NxpOI&TX)kcwA_|$ z<=)}Hhc?f6a=6cWPlWLhl@;`uhNkDgE3M!Th`P(xUmOd_K67Ds2R^anO;#M zUU*l(M zvwiFNq+dQ+B3;aU;U)H_qZQ~g!WI{(4hdJBczMf@-tT+08s2*0B%AM3C;5D*=_|BcJ8)J??O0?_`Gj6Wd-14ytwjt|j zYeNotWe)?e>dDYrRt5rWgt5Y+0Zdast1bzL2h2R+d%9CAQ#$Gb_==LMLU&0xy%$IW z#Cal%RlxkHN5~?3>Pml(Iq7l)qtxp7RT0Se2;`UST*yfIIKi>2tE=pZ)Llj>`B)(3?%ssLmP$W)Ee~FSmo_k0)LGs6;y4a#6 z=nk0mu251^7D;9N)RScWW6UHdi9qNA--0XII=yO|o;M1^{hw6E6Hu8a(3U=F5z23igPnhXGqDGtdc2%MdxUXpq$(%(>8H1}w+&w+a_>;v;LeH=AI`@B7} ztYFe?ENPXH=ni>fpGFhiM%+C*twR&)!U$Ov&AUAcU&7^|-SHT{J)`6L&a`wi8|aa` zK#)Tjt}^mhsiT>twP}Dk9sv9hRlXFujT#t~{FJuCLfmn+QR%TT(=4#C7fKPwL&;Xb z=SM5(Z8h}18jEf=ywWCfnXkOlV5Oh2|K@#a@iak9v{ zpFQRlAR%Ur!r}ejzkjcBpW>+;&+!cBc#V9$PYcJTsum*$?$=rjrZ?)Y)U$iWpqCxP zg!TaI3Y=ic7-*AUyr3l>92DNsCV)|xt@33g9K1z=^D8hay~&c$*$K#}GcGP}(%3o_ z_4hgA)b`rAl$4j+vDBtmcaGRw^BAV^#CcBPYwd17hVDP7KL}laoX5t-%{`Fx;>B-( z*EYgT!-j@*#U&*o@z20m)86#oRPFcP(b3x48W7F>H$i&bxP4tG`_qEiHPp0@_41}$ zM=q?xOBN3;Z#GZ{?!_ zqppFL2u^E$DEKasY~=xsK%lwf1JFYLoe(|vrV;poh`50XF$wl^3ke7Y0REf@)?HUE zZw6YQu~5Gjh_`QO+wba zrs%?-)Va|Fe;OHiI@Ks979uRM&S4hI!2z||IiopMB0Y{PXdU(Rmp9KEx+>)9vwC+! z`p!@3v-bMbT;2cAvEE5bmVPY;cLyo}C=kMJ&Yh^;v7R9KUKoV{Rv`)iHCgM6Yq}gd zvC{@sB{6scevMR)LixZOO;Ic2gHsiu?`K5Q;}f^V2dhYI6L_N;>O6@pg4#R+Uq7xs zcZyd`pTu^#`>+PJ*^1gkh^;}px)SgHCHBW3t?y)~RA?wZD0j*;>W2b6HF0t$>tmIo zDeBN1Rd7FR2#GR0S-1mb?mtQl^D9eEL!cymetrvXux`MnT9$mR4_$SG&%QVAP!RjW zceAuqNz(MBsogEFSB1Jc?{B&7z@Mm+TUz;6o&Mw@ES|r3@d#ltjhFMUKVD$V?_Bj4 zY*^>JBhU(2751>6fXn{k-Z>9Ewi~*GibECr~po0pY{MatFN}u;IqVYGsY0M&Bw8p9ZF= zU#?5?lF4L@vvUH4P!ujr=8fF`8Pm_AsuLhIk+Gogx6IN9+&`gjuU<9Ji1XAIxOsC) z!_@9=P0gdF;VKU|w}Q$c$SOeKn!W^IoH|xb?#g|M(w)_UpG^G zp2Z4f4&udWF<+ke*81@A>Jhu;jsXfuaKU)4Zf0-~6{9x0%^ClI-%vtWP#y|%ufm9j zCktm1bY)Zz9a`pVbc!45f`3oTbFJo=tK5C&sZBb5-d`cVwbcnJY3ivRn$RgS&4%uI zI91E21H{&Hw5PVLO42n4qSp7!)OL4KQ?a(TwpE+~pvqlFSu96bte~x}_xC%~Po39K zm57LpvC!4~n);N{dBBQ;$cnQ%ADH^b^PK?Ht=Z$fVxd{ad(?qs5vt0BN^)k~GY<<)C-RG^B> zDXKm%lzd+(b=ADolqR3fW92Ip5-c)kK`-HWHmR7*#f+=7IH&hzU(ImtW7Rbx_kJWlW;5$6hE+wR<3Xk~d@;?HA zi@^S-Tl`Zm*+La~y1BwD8?DR(5JcGwhlKNdh>eu#3K>kvNb*{xl z6b?dVw@ow!#Q!wacYYDwtGQ83gyca$$&yco1PZH#zo z(c9ne5f&y*LUDndw<)V-Y)j@?m)b*s>ySmq2h-oSY^yPT`gCbB2(K)z+1X(2v&2Yq zN+2!xabM+*FOE_=uG73ap07kWM)z$y$jUJ+%7ih^7Ke*f7N8 zg}qNH1KaF8X(q-40rzEdIPLA^zwA^bX&VNTrZE%#!{l8^2=F|5Izd;q=!CI7pm?c3 z1O-ngPWaPDMn+1H5)9<%4G&mnwX_C*&>S^ajM*zIbh2g(Ke_!8s6uu{Fc&+DZKf+$ zBt?X%EDFGpV7_{opQ=6R_fDJ^G1WO{dO80JJe}6v-JP%@Cs{R2F1nJ26y-q`4UU<< z5i)YUeryzxY!3)Y@d*H~c)ToFuQXftwPC{a3yhZIv9YnMyHV_g1!EP-vB1eT*ZT3G zADv=g)xa54PR$Q^3%as{Bh&*o_<-1jkYn`$Q)YTFe<@C+r=2A4ujPq08ja{bc#x{~ zU01`cNZklZRPE88pPv^cp$;mb^5q{W;Xg-W8XELFYmR>7X&HkQNf{yFcmhF=&?;|J zHsl)g9$Gde&^lH1nDp@15hdA}0zsNg5tt%XNkM*StXWbG6XXjB-{-j?<>cr!iVTO( zwcdY19CSV|J=y#wPAefVPtF>R4(XFwoOsu_u(E3iNLjm?OT{I_Cs8U|DkB$uTTEM$K%=U-8Dv z9_EuT-v0s`gk^B7Py;$b$yy+(LqbAmGl8zGzE{oF7&V^jkZA+L{*LQenf;}Xqo#IG zdYF{5*n1*acC^zQ`<ORXWBrFUr%I}BAJx>IK7fYkN)!iCoFnF_jw%%y*z`+ti zpPhxjv{C-LuxXfKf2a*8WJgdLw?=K993dT|3wzM&Z{rH8cv#%J^c8rY~w@txCj~C!3F?(H}&5dj7alqZXag%~z7( z_ATu5!6LOvm>pZ?bF6Ss1*|1{u*ubFZekA;sRyh4J+Vdn>ix8bDN1gC>pQH$6Z?^G ztZsx81|9*KQC#5QjQ3Io_Ui4&+`-_cK*jvpLV*G(^a)gxW_vyx9klO-_2wijo2e z_w8MrtA^(`b}260&n!!_yjvMY+~rVvjoXbk!U+S+;B%*wTMS(=7*NNS6D_cE7zb>x z&tJWYM_8!$pOO~j{eZ1(H1!6X#{RxRLPEleZnGl0<5oeG(Iq3`#OMOV-ngc(O>9>Y-I)Y$Y9n*n&(_0Y`pc>P=K6)n~FHVY6 z;D7W!`tV@Cz~r%D3W4|LP3o4il2SxIem=*+*UK4;jRS!W4-dcH9CASjJv1;h^iN6# zqTTQ}yQm(X-uY~1W(KSD)NSP8YR9avgHv^6M8xlA_iFPL2aW8azwh)7^!8d`pJY%S ze1d~(UgYKFT_z`7ZO|o6{+fzD%&xnC)!KT1l^;Ec82Za4%2+}|0{zR>uJ@&3^nnl{ z_U{=>&HEBCTM4Mt5yPOf8fGvvDB1QH;s^;jui&D#$LavxNb<^5b3 zDm%>VVOB1lPilAX@v*YYEcG$7%Pi^Y>Y7STNx2Q2<%_K+)V(8fdD7|hs+Si+7adBj zEjW94bBu;(1NAn!i)+hlUj1h5?CePSeIbp1;**a$`)9dnrA0Am_8jn8#q!j|&3v)f5-&g3%RaJ^mi`3tR8a`8%L>cRu&<;lci{F9-@Gb2z|j&nLIxt`L-_ z$dBw_s%mXv?Sko56DPq|_x_kvW2`YwKf4w}esA~o_BzNDc4o3y{0nZ~f0FHPiMTBB-FCqE sP^I7if7|&Q@v*yNUjMtPtaq**q7LN-@b`~~fVVHe!qf&;iFAGRUqV}(3jhEB diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00014@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00014@2x.png deleted file mode 100644 index 2fad8bdb93d01bd41bd43811fbb95a075aca08ca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8870 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 HY@_}Urg_S~ diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00015.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00015.png deleted file mode 100644 index b6a2cc72522bb478be4149b2a6de6f4d50bd9f46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3391 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00016.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00016.png deleted file mode 100644 index d36cc9cc16f0d5b30b5ec2ee580c956aa0d1a088..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3269 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 QyZDg4j)``argPl?0f8fK)Bpeg diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017.png deleted file mode 100644 index b5398195a897cf949e3323d6ea6ccadb5cbf8b9e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3223 zcmbW4`9Da8b`7{ ziP3Z-VQp-%TF3bSR3u-2V5DRh00>Jh z_!^-IGox4+_?NZEU?MRg@`sWm%>CnnX{)@tuFAQyo=K|0y`m$Xy&8?T`nURe4W~6A zB5|FwBqQ1XE3l6L!{$1HLN5VC?!m+DJS5?EzvSu*nq(X;{vW^<5)UANu4W>*#3uPK0V1fUnKpoYfE!OBis&pB2tr_|!`d0*E7yn$}^pO}-G{HYB z7@Hh_V1*WiGGp>P;>&Kw5*?eb$DV? z-nv<-1GV+_Z&tTDJ*&S|egZbNyANudo7k|ADk_~Z_-EfUQ=~emUpTn(Pqau$fOFt9 zZ^2Kkz0wL+r$MnC^|ZT#1aJ8T!6pXxcI58B<5MRSX{XxuVTtsD(o+6p9Zr)7cE}`= z{#xI_fUWUyz0Ilo$p+I>p>FHfFXa1|#Jcen=bS#@t3;xNURE+gJu%(7xRzqVz}nfB zRN-5)O`|rKr=DMKIOzAS!Q8)p|Ap&wZ6WSqhFc}_r^Gv%Gx86W^Xxi<8;<>eVCbVnODur_pMG+4sD458-gLYm^t{CFkvE(|6b3|4YO|&p}^m zSfu+9M_xb@&|FM^3B%xtcJKj21DRYqzYb_p1_V2#h;cfol;@j)XkXH=jzFC;YHyk| zFW#6&VpU*=ymgO;MMQX!NMiV^21+G)nq-^@R?f;w*Z#f<1K*O^*!UMxU%z89Ov?9; zt!iwTvD-3$1?s7%+fP`_Dn5Syq!&n}d)&Bj)HGkz-eip@+H|_Yr%=j8LyFRZr?pvwQ{w}qf{k=79X`I(OU*FuZaGfyl^bAN6TtVTKsK4RFPi}T*wsE_4 zJ!8<~9zhY7;PHERgR;9=%4F3V#6=HRxm)UHp^?((RA7zZ4Z3`52;chiNR3xAGc(o0 zX=HS5pljK&x~C9npsamZjq2v+Hqsmsa_v|2z^{#sj#(1;=Iu)xQ`g1~Z^su@ocOdD zrj$_~vlq^3da$^-xWD;GDTBd~36!=IPmyaZqgblIjwc^@&VL)=THg!mhV!7xlBn7_ zeTWn*38yxxq+%5v?`&Vf;iav;>YKkKfssD=>5G5Qo?|r~!2yxRdFPE}wczeUNRS1M zQ>QG3klNkWvebBwI#=ez#Ff-LjqadG{>Vg%iHM`bY?$%vMkL6zhLjDehyZuMNrKQ7 z6%`GV<-pRqcVg3k#e%@SKraPq!_h%OC((`?uRWA7FjrSskD5_M0du8AuWVHif4aJh ztE;&R?Doe6+W3lAa%&(89p5uAaMv94J!g6O&SY>~fcb~OI(l_AhE!VzNUIlPEK~I1xQwp5<#`Cik$@FI;~V6gO+8C5zWvp zSFXHWUe*{J8=DDlUNutcg2#Sbc=NR{XKgl4VK?PtjE3_$j^Q&lszBS+l(83W3g&aG z)H_pCQ{&QY@aD+}Q&V_wzr6f-X2~VVLeOrZp`o0`MO0AGlADjR&!v0QtG5Ii^=`Xv zouQ5;k!(_*;3RlU0_a6W^AFbdDk{=n-}kC^8DugcL&)k^uQs`DhRGn2phJxE`pshw zNENBA184ud{&GRjJ}N4zN1*eL%HrJIJN@aRx95$X7>oNKHlC`z(#pIzuxU>am1@;6kIo?XJn{7lsmn-%Pg`y#rrX#~WdaX-ul(=b3{d_rA+R6SF!A@9I zG|sDf#E+YsyEnKYiU&pFYD^wWJ9%+%dfFZ4;!`u)xU;hpA*x`y|Ft8Q|12u_YUKxx zE>`b1_-*fExVIflx3;$Oo^$lRl+N2Qu1WAwggUZ4t2MN{Rp-{WejV6!1@3f0hI97smX&ckL|g5-g!1z8 zca5Rnd1mF`>Br`FJO*^j z`m#?v_pe1X&` PPX&NEXNP8(d(i#^IoI|r diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00017@2x.png deleted file mode 100644 index 389488f2d5f321a9a57921f496c8c19e629a4776..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7932 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 JE0iol{|6du20#D+ diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018.png deleted file mode 100644 index cb75c011e9732a85b22a1cfa3aee18a447a1b0ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3235 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00018@2x.png deleted file mode 100644 index 6be32797ebecb8cc5843d8c810824ef42a1e3f30..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8062 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 fU+?9^jV@X4@HTJ>CgN(9M9-4{} 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00019@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head/bow_head_00019@2x.png deleted file mode 100644 index 2f64c918997eb6768aae241fc2628c2413bd2e22..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8026 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 fd1d@_fO3M{;OXF`i$l8FM(A=)hsgg2be}Cp diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001.png deleted file mode 100644 index 0d6dd467bfd58f9189ba52afdb83fe062609b9eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3258 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00001@2x.png deleted file mode 100644 index c8ecf93dbd1b78b88ee78518ebd14ac5f42407b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8052 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 wbUc0BSjkj{*sFf@HtD7G|3>;%Q_fB*mh diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00002@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00002@2x.png deleted file mode 100644 index 0c2f5a886767ff3a4716939d6f6d9a2f6556f5b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8225 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00003.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/bow_head_ears/bow_head_ears_00003.png deleted file mode 100644 index 8be6a2db4376a30df4fac62bf29be4096b43dbd1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3263 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

&dSc+3*zg3Go-O4o=MyIm% z1$-VDa4^V~6(l;uIrLrr?aW;7x%?5FHkb83axfesH1|DDDZ9_LR)PghbbOhOx+$%5 znjM;xH{(R>!7@%A)2?h0NCq9m5kDl{Ek3)tK2*Uv$sfag;``DzfNa>9FmJ~s?ekv`h&zp^HAa$U8*QRLRG13QDbL>LtKJ~GmI zC##QGl%g;A!Y1!^Nq=<)JQsQ}=7G=K;bJt*h{Dt&$nKZv$zNphQgZ)g54AXcoyp4y zj;Q-93uf_LYSi4}o2EV1A?O<}nC3Bxty}S(8CrSG{~H_<+)I975Sqz57&mY2d4>*` zUu(Rwxjxn2bYkPbZDWI?PxD#Gv#5M2>kt>0L?I~4i0p0GG#z>4G35ox` z4?IaQQ{^@PbE9najkQRS{*Pzg#(y`=U(Di+U$ca5R^#?BhxI$>T!^Uz1SJ<`qVHZI z?xwgK6rn7O?u%&qv-kRvdgH(8EB<>~wVtZYw8z9Qx+q5t0uA4l+S!ClsosBv>tQ;i zfU;Fsvd{5z=1@QAKJcL`s;a-60|*CK$+%;qrH^-q!2uH@z8>j8h8*vgoEQ>1Plrh# zT71yvOCef&mdP8<7w)PK9Q0fa9z4Hl8odJRrS@spmem~~x-C=d_$jfuI#V|_{|66< zK(BDab$30c4#xbGYQ;)lrJS08g8CE8$J9r??8Nwg#|NuS;Jg;EjMi=h4lSlIk)|t3 z&1=qQr{7}|w=xKSC~`0kOX}qG-zqSZB)+$si~JY=p;XR=zL^S*w?m3c{Err;PsVo| zMSl(r?MP>R={`S@Nkc_tVQHCpnHc7xo67|N%z_NSKKa1X^3RX|y&>$evlWYnvfinx zPS)JsBeBsHoXOi{&TL(ipPyEsThOE{z<3@;5wo?(Bzi!f!b6?DR;K@OT$r1loSP*Q zT&?r3znK5eGrMM5;`MQHtMNj>C%_0bp>w<2vwGi!i#EHi_ZTnC&p-YR)n#!? ztl0XyS_MzvZmZVM3e*+aTwZlm)uTfj>4V{diNhJulCE#x7-v$)w3Z$1l3Qh}v{6_n zT9(;bwVoh$qzx^y>#OCj{m(vPhN-NlUv|g?@er_?T6yL@sgmXfx{5q>(g*cT2lcBb zo4L}et(B$~k;VSgv3mavnLc?mQ{%T-6M8oECTjABuhhx$=BB%nj?U80vh&_hf1iOQ zMimk{B?iVm*k-j_dC7-!S<$JruG3$4_+q~*!}FYn>zpSpe`57a?L5y1QsWgbzW!jr zycZA<0LJ-ndwJosV&wnypmTK3)3dVfe+g1^Pde9m4GO2YxcE#%t_E-NO}CjYn$)M; z!$baSL7Xp48hmb0U8l9>Q0sNlWTQ!EB)A??xSO)-8-~F(9(+2Z{ zAB{~MjeSh<8s8fcig#db#Y(8+aj)})Zj`{VFAT8$u&=Vd4PS8Jk5yuVWFEiiu`n>t zWa|C<*N9V-q!BOuHEhpO{AAZb{HJwf=DxY(H}CyTyJg^L@m{OrDKR{G3$C@|OM``} zJ`v+xS4~y>$$?Q7sa$kB1p4W_J{@nC8eq`uO43`1MeUng0#y@!>|xyIHxK_5k+&&=*N`?z&%OA<+Xq%qN2N0Kneq z5R-t9BMd~f^0eizCw7r0s?0E5QcL#U<2T#;Is$=xcC_Pu(<>@|KO_TI{I3|0g}>pe zw{1H=2SEx4m6-_icb4s^EZoMkL@A4Um07jyIqek3YoUn}BOx|Y_{4i2eM6R5ejPu6Hou&LeF z%GlY0n+cjHv4$no$e2^(-puSO6a{HIB8&A$o)jQ>{Ts-;H}M$8M*Ik_>+E-tj}Rn~ zT*U6U5;{vBuC>NwDMZWftWHd@N3@;V*Kc^krBY{25N6ynSu}TDF@L#0&x~vBKv$Q_ z0?e!5D``63A9%9bpogD7t7Bp4lXTL=;I%s@97SMD%`wBZ{gJIB73K|^K50t>&-suIamrSWZ$ODtPM;vf7R(pR%c|z153vuy)5 z5tyCX1y4(vBRZ_xy23{)Z74Sr|dFEZ!ye zJ@1E!D!QvtPqSXi$=_Q0J(XBs;|!R1(;ABp!a{BqmGdKkTM>5)kb#Vhj53%>jUo>+lp$K3tYy7A#td7-%;XcTffKN6vJ z|2A@J*cwec*-Ha)Mnqope5^P(^`X7Ht?wq!5E=M+yS04hFJ@jqZh@B5wKWY=X-x8wPI8ifKWBQ5}Y`k~9 ygxG~%#-XM8#X;%&vIq0;_o@G{e?=`PG+}kM?1XwhSK#}Oh@za@onoAM;Qt4Z7S>n* diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00010.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00010.png deleted file mode 100644 index 858acbf8f8e110f6b2e103641efead20cdb5d99f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6133 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00011@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00011@2x.png deleted file mode 100644 index 6cefe8f0839e4cd80759575827f591f6ac382897..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14736 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012.png deleted file mode 100644 index 10e9ff71d699a07f3f667ed50a5b32a65773ec0c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6155 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 W`0aJM5PVz{QIJ)YDU~)2`hNi4<|v#1 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00027.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00027.png deleted file mode 100644 index 179c043d61f011e559ff9f132d1e18d4dae43f1d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6156 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 G^nU>I*E(YW diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028.png deleted file mode 100644 index 77fe2ef724c7e5a03e3275a4271aa79931251d80..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5558 zcmW+)2{=^W8@^*5yK3yaEQ28tAvAV|FcVpltz?odd$J74WY3a)*CfflWQif9LUuxy zlKm$n+4-OT&vWiQ_dd^k?mg%G-tT?i??#y#>oL)D(?bx%WT3B&12X{}MsON%CLzdF zV50NXxAF!v?B4-X68?h*7b1aXmOffuP7XdEUJwM&@HYBnf-(0rk}{CSd0sO#ye1<- z18D@(d~pe6>w+LQB?D~@vw-aNoJX!V$Ai1cOX_=)x4r1a9cS<4BwTi zWYVu^P!D?%Wvs7nvasyr@!-|TOFCJuD+BI2kHs`nMPJ?Iv8pcgwJ2ljd`)hs$)CT^QiwM{}+=1w)#KICYv`bX#KR^2O+9Uk7mf;GL^k@J*XOR z`WDaH!t^Qv_ZgCfp23BxXa0VJr{K;*^lg*`>SuxxMr-#+k47ROB#8zJrJnPEzJ)o8 zh{3XHH(>-8xRCNODw_u*p)t6a1Jy%&3=kvX65$MV%49DfBvO_Zr@%xS(Uk}e!)3l4 z{e;C3B}k{566^UX)qzuth;zBPrd-?s4e63Pab0rbI_6g3l#RD3h6}U8B0>7?D{LyN zArYK`Yw{CYT5*ssNU1l)*u6-(%Yna4N@+EWG4GUl(w5|mu!zk5r4nTH^I~nx$}drQzp&*onskE(3)oTe!7Z6IEhHjb#6Xsl z(NiVIQ;AoWyYwzEbz2@xm1)jR^J(qJzlu-*ds`YTUFwTa@+U$5g!75|=v1do)r7IJ z8x1y2qM-r=TDVYh%)Pa^{9-5wGKQ8ZARVmd)(;&coS4 z#0zaQ3jLfE{z?a}!H&cUwg{d8?hGTE+qZA)izPo>a4depN`a9;u`@I^H@9!U3w#J` zGuHgL;a-<>IVP8)fwIkNG%`p%A>rx?XLRAKrJi!}h_;anIiFusgu{>8jl`bSzTK* z^f;Cvc-*MMawze2{L+Ym8dTOj`2G;$o7IiZl}o zi*tXrvb=Opb%Wo!waTSSfAE5=dqVx&kwcZ>nFlLFqDCeh&3i5-W*K`axX$@449xXI z@sD9XHA8|2#U9Jf-eleVhJY8+hT|j+lScCT zm#%s#@%s8TtJ%wP+Ms$e;X=GZ5w|%bwW`dXvFS*dVi;0}!cjfp$mmZcB_)-GNd8o( z4Rgd3TIg{*)I1&Usu)vMby0e}H08!M(&@Hp0@z?mv;tjzGOOIygyZH|zB8SvMWA4G zA$!TFwrL=$N3PtqCAz&`qqep-zp;_axcHp=TOQu-D&Fp$LQA_@g!|i@hh$S^z9|yT zN=5Zp0}TBns;oYmtiBsJ=*{otK}bdSb-(7okCe+)o>L6@sCp3t$sY4jZ9#*xFJHbC zgi{2m3yhWDiiwP*QR0o)kx!ae^5msW{zR45^Q69B(a6Y1kdslEm$}1LvE#dEo4stx zX#>|qWOR6tx}7A%K&V#HF!_T(b43@TQx{$<+hP$fhVQ|{35$z&|NQxr-`dL0*wMRH z+tuOz7L1~@GNvj^#=M~4bi#>nfXi%San8sL^Rw`9(?ES_FKuXX{}mSudSy-V(@R+- z*`PoOMY^P#z10mV7+lD@oI~f#?l*6irluyzo5u=alWNmVzEb5jjp41W>gj!Vm2!-) zL8O)}E>}bMW!`13A}pd=lL}d1J$e?6MRYn|{JQQJv|?x%K7Lc4>#ng(2$|tZR#akao!XB zrRa0w#%(TjjyhKnyYSiGY4(9(>~P}#^dn=G;cAlqPVW*J6d{2VX2{f zB%lD+INdXFs>`Ec4%0JZ5jh< zK85Bap*uBJfCO%L$MfZtcG5_@36cbAlp6#u+qn44 zB8nN*m~92ec=@gCrQs!O(=}$x(u9)$Rc0NmB%ipte}jz-02;W5=vvmXgXU0%(aWo6 zqdta^$zr;@?B_J$Mt(8?t+swYs|*b!Yxu1Hw-16l64NtFGq zTYQ#(4=97!W2n{C)UF}F&@Rt#j$D7@=G>oqJoDPT)X(BdiAu=N?T1ebpL#0AY7v>+ z?Pc3s6)kc&aR}-p5ugwGRaIwLt{%yP+{Wsj56I2)Kd{6i`nCYk&b92$bZlpR-( z3D*mE*9 zaAT%L3TC+!ymvM~4dMlX+f?(;LFiy(jy@~ztVN;wowaYQ=(;dm?+@*(rSIYD>BwB>*w9Khi)n0Gjv69)ADZjJ0JDW-|r|AA| z8GtFQQKoWgT{gq$nTUZQqG-_47p5!f;(nQv5%8N~kU+$0AH%NNRROvy*2P_v5xfdC- z=9MlfC0^Xg48Rb+P-_@9d4O;uG&OSGOP)>xs^3()iCJh4n2(>|LAih8 z)OuvkLbxCt;EF$iR<+;4yJE-`p;M}onVDG|nU3ng-@7*$bR^BrP&kN0vBxN?4-5?z zGC^$g)R!(_*21PJpR;2F+zOBu7Z+#!<0guI?|6LoC^w2YWejD{ZjgU1=Vc<?}>?f^_jTl~u znBB1ReC#X6@00UvSPP0++NU--y~s#Oo@D{KutY^(%Tjc(w}Q#TI2c&Mm*?c}PdNg=d!ln>i1B;>K=Kb2CqYDSRt{H(Zb~uLSfIq^V=w zuLD@fb+SC;^+m6j^>lZ+^x-x#96;|W!XPm*F(BO+6%Kya!~VY| zwh=AJOEIfu#Y#4J>HAJ#+MO!65EY=(va&L~n_J65e;$bZuI5P5UgGeI502=0KRzR% zVVz3Q_FcfmH(Ct}-A1at*2+yO%R+>2t-*)oIE=G&T4PRr3j5#nDStLX`7eh+c>cib zY+mnzmzGMzE%~2bjRhwsCnC{Th%1q{x1QaR99v8r30=PuBPds^vTai>ec0rdc?dqT^qHqQ;XxqAD522|1ClxxY=WO@;fF$ z_4h{>tJJzu9?h3H3Afd^BOPftdXO$36_80o|9RW9A_ng}JE?#^D#bsZb|3d+GH;17 zg#7RzXbYCz+RxzuO>^|Mpj4Lsl zT^TOE4MnWYG*FFbvOy4|(2M!6Rku&SPE9qZ%{TCPrQJYKgTCkE(l*}1!!9KW-M23- zEloN+nL+yC@ym6-Yh%Ye1S#Z%=(P)fJPg<#kdJ=%?7C0ZuJAAz909joe=5@<`>*>e zMCyyUAJ17Am=27cJQr(iVy(*z2F{|aUJD5})4)JDqmZ-@HaY{0+X-cdtW&9?Tanu9{lELF}k1A8K%+V}ioakW3nbK**j$#@q5ymomxpevD$)lTjDx z`*xrO0A1l5>pGXQI)LSd`S>fZ>-19eMTR!E0y^K$1RAC_yzCmE!<#iljA{|fddYw5 zDtyhhS>RL@z)b9IcCb9yXxUAb?pR%4@4B+_?y8I0Ov}>x;QRY0WDhsD zoszX3j}#x3IKwoV!8>vjsfu^MKZ6jmeE9I;q^Yc|@8?zk@Y=QRHo}Pmsi9NregUfdm8h7K z5(y9oZQ;c4LF%XSkq#$o40d~(XVLQ>p@&n$e0+SF5YV`zkkdDg>d!Ied|A(&l!O2K zS|#vr4Sa}QJsW;Hlt!wEL=`}X8>%POja2S;8c8G$f|dgC1@#>C+2kUS=&ILq0zFEiJdE2ELD!T<7HC z0t+l?*B0JNDny?fij}! zhDixYB08Wq_+0@S_Ps0BC>AZ}t8F*{y8Yo|6X)ZQ(}mpJTqfS`=Up!MG}GR1|8sFb z$K~FIo}PGI1r3=vtP`4>_Md&uBA_00Z>rwylyYu5EG#U4+Pz}7-Ysi(!Ry}5M$rGI z_bm?EogR$O8Ws=Fo_z6d-TwQ%gD6FGVc@u6i;!mT*=+J%Yht2#yzzUXN1N}3q-chb zaH2lgC0{klxo~iKki$0Mdt-54$U(w{s~@LAt%+w@JA^-4wIDamzkkATc)erPrATU25eof?vcA?ePB9IhWX`)`D>qR%h>8s+2%JsLT-%aH@KabX{+m%txPv;8*I zGJZaj|IvR{W#T5eN4vnt=kRcHK3(uqHV8Hb^g!(Rj<>U$ZEN&i3OSh0HLoq~dnj>pEv#9=l~@xh8v>){5O zycI^vZ&~HoMPJeJy%IPm;NDH*Vq;@ZPj<-yY9U7fj5-N#zx7E47rBhrGFx0+T*`4t zyBsL!jLPAk3pJi_!Wd|dRrC7pl0JVENa&{ZU!SaFQ>b+6k&7X=ulSS)14_s>7CCF- z%&eqH3jVo520F&t<(l^4{{xmtPC5Vp diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00028@2x.png deleted file mode 100644 index 7364c67ed1c66bf85a1434f339833f314995d272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13624 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029.png deleted file mode 100644 index 08a266d6bbe63719b17fc11aa2953f0f17d18a8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5128 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00029@2x.png deleted file mode 100644 index 378748113338958e5080b16d4aadcb5b43b8a315..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12939 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00030@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00030@2x.png deleted file mode 100644 index 7ff7370bb02910676cf2dcb3463717c5ad72fc53..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13081 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 W@fgJHx;EIzhxD`zG+&}|k^ci~Dth7o diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00012@2x.png deleted file mode 100644 index 2bb864b4de2b5c3635533bf47f7d0ccab05d1b1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14786 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013.png deleted file mode 100644 index 19f48169cc95c690e58b26eeb3093f9cc71f67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6105 zcmWky2|QF^8@|IBLzbx~d$Og8v1CgUL&m=ETS!Ruec#uNY$^LXvJ?_RS;sd?vgMC# z*+R;akbV13^Sg7;{mq?w?m6du-sgRulc1}uLQl&^3qcUQnyQjMXd}Q^6Nv!lQgjC# zG&CNnX5OHM{rkeCdH&+S1z(V%sn1<6`};obUJ!)L_SWptQ8)6?6jT$^_t4VN&=S6m zfE0od15QDgx*&+zLQP4*Fd%RJUa*VhX!hCkSnKQpYs&iOc=EQ`yTwrn6d#2rjoNk9 zDtL>%nUK>cx>;~!`nhq1?kgt0iQjb=4HgxsT&EI*&>JI-&X}vk8tSH07t-IU5fbu0 z?2dD$tOo{L?FH_pY_|1{FPM0EsSv{dQ!RMky%*x$K6_{OpnW^^VT4hY?WIc7E&*fD zJ5m2xM0lYT9U%n7gV(E@*}_uCpm-rF++_%Xiy~IEw(AQqOw-_yH=uX)q&CP6j)Pu6 zdDMTxA-N*VtD?e~?P!!@G2b@0Mg8V7M9)QO!$J~-81&JS)tOHu=@lO*p|&<+Qt4hM zQ*hfoMr|?1r1~i$OPcy{YMU{s{V}N~Nbb!*I}^`msP7{dKXNF!WB6l^#krNt>>wjP z8g3DkqKrd<>>ax@BzH0Etu2jbxhTbEwH~D^MJnz^2mPg=C zfbGlS^-4?>w4rgjxvP+cp84D(&^gPMD=Grdqp+EIOavkh8QEp4prS%8ootYs2(_#0 zjif!#*xrs9eQ7Np;k&}Fhd!UuU5ufHT<5seE`XU3hcL%s@=={!SSF2wP&!OMPtyg( zQv_+sNR{H*H!-%W|I6(7RFz4AD@cn(crdDqKW{pAAP{YQe9-CX>8X4)q=y6(dl57( znBkwJla&rnX!n9*vOd~(-DQmDOCn^An^;Tlci<)z_J3cZd}-_ALI)mnbaPWSFt}*i zsQ8y2vJzxUJlk#C2;I1*BYz?Rvq9L{uzY-D-^=8zp^?}%@8Mxw`CL4=Kd;BmHnEFn zh(Uj_6u#yl#_AamARYdrFWb`DS@2fi)?#6mMbqzi{`4M_XWmz9;Y@N@B6C{r5`@cr z{&~r$Csmd2GY$0268}6v64s_knuP^uhsukIMMXwN5)=&2UN?U6mdPJ~bDt8#G@w95 zDi_b69?6CDlFB{7Tu3-hnceVzKmA*|WqQU%l*N*coP{CSUMJW-%5l)kxnzge<5PUB zgiNzD6DAO|egqbjV4M=UkX14b_1JR?C{$t>PR}s*R?dcd@&cG#hF2XwoJ4r8JUZZOncVh;b9D#7Kw=dxwaNFyFslrJnH6ebiZi| z97B_n1XFAr2rPPGVd0H=wTCo^P1a|dtApE1?$@D6=j$7`6*LsOXvqya-S(WB2507# z)z#&Ex0B?Jjbsj$QiIYfB*3*>9x zMdQDD^$LOLk=LGwYef(-`yp~`Gi~gdBGw;&4VT}S%ANO-Sw;mTjPESwF$N|5gsZ@EhN+o*xA?;3Z(N*r* z5P<4*4AngrNR%zfoKGvm{)6p}7)5R$U*Ap_tM{8Zd3hg>HaZv+yP~GtJKAhF-+gIV zA}wsry>9vaKk6$X5u2Ny@aWD7Ehi_omfgyV3x*V+Wbj`^a--m|ix)3~bsVpMI7kq< z0{shazrzhl$=IHro~zat!r*Uy>yxoKt_W2=VpVcnkNV0pi}-Beal>1A#-@m+9w|3&bEBf^6L zcU#wsl95yPv5QnFP*d)%c_FvAE1f0CSR>*$Cy zFffn~Ka~~Brjt${4hgHDcw!^^IRCc4?aATJr5ReXsH2mUqBKWbze9AFZI4y0s0pn3 z)<{fhA#7hz5qWrYq%bUzlbg$YT&T$(Ju_pa#B&}b*8WMDUA@`gy*=J+O(!@Y=_oF) z!a*_!SNqX#@??YaGW-!!8Y3?+?>_m;X@sRPb!IPB`EWvUF}G#24-FdsXfK_Qrpxv` zIBxr`;Y>`JWjS@aPM-GgfsuZFeedXUhJAS58mvYAi#LAq9BvB15UY4jDp`p~I&g~* zA}w!&RdrH#ee|evo*dsAc$8&|DNx25VsU&t}+%h&FE^`Xg`;{fJ*7U zFTtiT{8kytDN{g3@~M5Y6Z=$(*om@}=kQCa5a`Xh^m&r-mBD5$ioFZW9xyjr7PnS4)1>>x& zASkB1tc;%?L5}j1&+Y%dkRt!p_@`Tw#gyeO5cb2v!_?j-+`r-YUbYcsu@TEAZOdYr z&Vgxs85?UV(!G24E(;r5)ZlU@7wOX{BzOQYDAAR=QY5FWvkps#pp;I&D_0obyQJvu z?vBq$pKwvepkH-Y!7tt^W`_j@2dB?_1h^Dqu5iPdg)Jd~#Q<5rR-gpWNi$5i80Q8V zb!Fad7+Mj|=Tigsknv>IQhlQ%K{V|{a_;lJ^h+@X{3LcHwpBbwy%aYr0oLq^a!Hv>(X*T`(Y{t% znC^XsvhsffdB1)FjP}QepO^3oSSEvelKmxsX+9Lk)K=$<$-#TsnG{&-BO;^k6chEXmip;RBeOI&mE_6Pmxv*9U6ORVio--U8HV0k?4Nnq16W| zcN#z1h)M{JRG4D_2LNSIL+d+>Gy0;hTGSlN(f!EH_SVRYXA_^P)mN!UlSMKTi>xyF z)GQvqiWI&C$o*GsH>X83+c?|TL?{^``{+j(+jAXqJ++nIvsZp|78Q`3&SwWxtkSV8B=^*jh zvt~Z1#dp;>e#p^M`cH~JMOlws6o%ma?7N4wL~LIs-Oi4BY`*4xNg!P-(@?rwGC*y;ccMSu zWI%6*&}5Myfp}fTsP*uG{^qx$>29|sAm^i(16^iXSzj8`cG{p~6=9nJ9Q^4t&R?q{ zvAsa!9-9HLM*qlSmRd*;G)KrzGkO2%}c90 zL7m&JWm$1?h>*=h>k%GzB1RDf2L%!T+pYN*|J%23ZTfR0&D%~te1Io&-XVapv^HK# z3Ce1B^5uW>6$TksUUD9L9ouPxlPerM-p_S!X9X2@F3_r1S^sD;kTa~~iba!K?AR(k zI5-&Jpexz;B)VY8^xn9NCr8toi%w1%kalxEGC=qPEdhia5c@y^@T4I@eFE|Ctpil% z=;ERT^th$4Nmu$i*C{Cl|;coXYAEGIisEaAm#gLpD{;ekwBNSE?SCtu^?fFHLqly}~ z7$SG}K1B=oBJJ{er&Rk=Fp)loZ9@6W!6(tL6S#vk<-PdRU$%3H=idiIxJ`kiq@;Wx z^Vh;ViEnUAwFxp*N|!jSLKxP`HAFy!LMIZBZ=hRD!v<^41GEI zqS_XsOSqqv1j>+nWo6}5bvj)$H&fz?yR-AEb#LAAbssq~?HbmIPjwuj2TPfZC`G4N z=DSYOD4zD?tzK$7vt%M-;M|BfEq+L%t-YpZgSuGvr;hKlg&ZCZhK|Xhq0Lad-k}~P z{EIk)78*|@zx9cCkU6nSL*{cWkM7METL-dr6IgJD7ys8K!jzcF8Mv6Xd94GL(yp2i!voW^g%J>W%-h*Pfx>Gjb6l&mH{WrjU41`P&xd(Rn;Mm<&H;XYn5 z=?I#CSzZvtTKei|4o%drJCqe!r~U3>;_t&w4)vO*+IZQLa`1XFy-QJJtFcq-aor1% zQ|n)!0U84)$hMXRh|(Ur=9PL1Zg{pP0?0M47%mjDsJ)%jujO8)weC4nmN-~%ooKcu zU`a=J_a-R`3Cn=JY5$8^zM2IE6_+SbQ0&c_favMg!1_>7qw{xmc6;d~WEX@l!61q%y5sH}&%2^5CE# zTgd5qUWBa=rcUbd6{m=37vV4at7}l&AVJonp2Gc}*#0K^UbkS5ji=U~-_|*Pm z2*aARV+fxdmN^f|+p+`sw{Mmo(?Leo*5MZ+UZ=(R%1aa@)82!3!WD*n@C_eb@Rg61 zOZHDT!mT|SM6`whHLJ*ST6@j|F#z=5*pZon2seCruu#R_eIsx8oanRh{Jfy$B z-(-;o>u!9<+7hST(0x*_q&DUc$jQaV}cS7u%g}!&oxW+!4i%R$jt?Y zZH>G%2(4*9bSkQ>)TsG9_p|RD2@9O5k>@6xZP3~2$%f?3o3qxZ^C1L;dP3gi%a?y{ zY>dgJD3^2>gziohw(fsV6xrR|JM#z$IToz0uI8^9s~kmuf$*iP3AqA&NM7A>idO}G zhKDVQVO#c0Jg4kz;j4wa7R+&f-93D2cxLAHc^g|>ib$NzfJC8odF4lbJF|h-y_w*% zy705pCWy{f@`5SM4BfT(d%C5CCGMrP4Bq!FEBvq}mMy>^a%lqq&eE6;v!N*hA#5c)jP)&X@4KsqzBUuM zoF9HXIo7_Lf$b$%q+R@9#3VN~J3O4u2&c%DxqZ9o4c6kut0jUkb+@N<@Ge%d_{$%_ zp6y3{;)8h*iZX&6&)7RXJrEdav0hK|k7X321b%Ipyf=9F6Ur zNJvQFl|T8VQy93_b8U8Td7E5OTOZ|2BM}kj9=4t99}0es|L>R23tbFq$9Ikdd#YWo zcJT0*kIdGOTzAf({rUJk3P;khRnq;9nYN}6wzWE+&pOshIc|9^UdOhc-Z#x~4VjCi z_A8Y3{BAuPu#mL?cXxNwi#J+<*)WS(w}as)u6XMw2)5kp56#!zU8-ON>}=%kj}X9&^}u6SEghLWS*qF@G&_#Sqor2_lfd? zGE^--)@RC=;5sOOc1%79vC4Xg;Ck@j!A8m2m}VwKsjku*02?V;R0xEP7khVYcD{EZh8*B=AyqFh}&!S8)*ow@xZe zWiXIXcgmG;slvg;`ohxy*_pk$XvW{l^c)j)gi7k@;a{!u>rJy^V%eGu1K3I0=;-L_ z+5L|y6ZL<*FEj!G diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00013@2x.png deleted file mode 100644 index 45d00a83729d184dad630819156a39fee27e0868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14722 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014.png deleted file mode 100644 index 19f48169cc95c690e58b26eeb3093f9cc71f67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6105 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00014@2x.png deleted file mode 100644 index 45d00a83729d184dad630819156a39fee27e0868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14722 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015.png deleted file mode 100644 index 19f48169cc95c690e58b26eeb3093f9cc71f67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6105 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00015@2x.png deleted file mode 100644 index 45d00a83729d184dad630819156a39fee27e0868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14722 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016.png deleted file mode 100644 index 19f48169cc95c690e58b26eeb3093f9cc71f67bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6105 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00016@2x.png deleted file mode 100644 index 45d00a83729d184dad630819156a39fee27e0868..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14722 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00017.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00017.png deleted file mode 100644 index fea0460e9fe0ebcb2aeea70d8090b35af62d49ea..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6173 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 WKIk*tbVd~jyfoGI)GBedk^cvmhDPB4 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018.png deleted file mode 100644 index b9bc23c8ad270681d57a90e5c876d3718e024a52..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6165 zcmW+)2RxMjAAhWKW)~OA9@Ql)grCgQ$vP`%gpgfi@4a)jva?Q^g(y4gWRG--Lg*4g zR>SuH`rqrGd!E3jp{8j-6LV-r6-fEuqHr{TY5CqTh(izax!nx~Q)f6>!$7*Y1#je00 z)j-(j{lIhYAc#Fn^QNki|I>BLAQy{?oRirbeh$BeXKqLpWc4MlPi+bMetQ@2M9kTY zl8!C{O{1aR=wyO^3DOX+Z(Yi+xP=6$c%+JivQOq!Q8vE-_`q)XH*U{4x%+ZNNP-fb{vLV8n zW-(kLG@Y`81H85AP+sa~6$E62!|3Uqp;m?XdqkGp?stO=jTxP z+!jVpL#Ue89a157A5<98+uGV{l#xnjkeCPrWzA$lLxT)bu7)Li1c}LS{pfjDgo9!A zAq_&}I6E&-O(rj|?jqb(w?y{(hViQ1Qf<5<++$UMjULf;P0XE_ndMaQXA=Wt5<~w;_g?LI{#;u z`S`PoFQbZLxNA%Gboiluj|bO>73oWtFJrae=vQ|aLY*F5U#6!S1_EK7K1htcSUZh4 z_lr7+S_QK}qnTdh{G|>rTkV`1dwd+~?dMnW>ebma4eGl!>=7yuBXNo&wwa=niT$bt zpLMd1{%P?9vW6CBn!V)0junh>G<_cPa?G*z5dNH-3KE0DQp5|Q-aYn^WCSH=HnkfMpsl^ zVPs^z2&N$w)Lp;n8AQQX$a+Hz9wqyw0lV3?-Gb-j-H&6yalm!IvIKpz!4t z6{DlQ3l0=5PWknrO53 z8Sme0h6j1{ei>d{WzvnanDsaf4Ia=9$*nhcZv9SF;NWU}HPG`;#5X`Y5~j z@G1(Tgp;$gDhk=%y3wBCuK-R{=Z!SHr-cR|LB`cDuzb8s5M-JeQ|g>*e}2oKYhq%e z>FDpYc+R%+@vd##W;cVJ$G08=;$d@86^0MdiIts=)<;GAD=_15+KTlqI%Z~PRd6^R zU0p(HDJ3EEXI`qxpA(m3EJg?KMHCZf^DQmNYk?2iWa5e;afKFYi7; zeaKboDUz$Mv|eS1pa!>{@f;Ez61Flx0$O;g7{s>GaiUaOS~~A8XI=lfXjR?_7XwE0 zcYS(mQ9SH?Mn*>ARZj#p1r-(5^3R{$IZ}?`8je^BEa}J8-P^aLPRmRx#cl?^O?cE- zCnDqaH4$)C6j`om_94B!Bm>;^0fh?$^kU}YT2fc23M)TulV9h;lQAvYZ4Mr$6N}aK2RHYr1j|T zN(-}Qx`eDOEjV3TdP!PZx~Qb2+9_|ZPno(ebDIql-gl(eFv5s9(Px`YZ5Q_)Os7)Ra?g0aDDoN{KEq4_E*!Bp9QB>exxf zJ4xeh`;v=GN{CLo41*W(0>{70lyi>ze~jeW)PF|M$GCs%p(7ENTbSdBHe%`q$e8hQ z15l-ft5$njyT7m}P!Ehp1P92R_A!FPOOf(Dvu@*u~2?+V&@ORI`N z0MU|Q3_UrRi?TNZVD4V=&V77CJtP_dRKQ3$W+YD*DB-ua|GpAO^KUHd>Jd0d9a1CEVrn`J(yqMg)-b{7CxZ)>h8Pj~{CfqTyX}yrFQ-bVU431f04EMGs0i z4j^EbITDyC?<&K|#Y}6Oi4jN(A6i7qam5lBIuABFI#AENn=NXm*SBp`6djH%{wll> zf_#?W^DA;OXECN<$Eul_uv11r!otFU(^2?tFi9M-5hD&#=WIIpB8oX|WnK{ol;CZ{ zj&};R#ja5W@SX}MAaZbyCxtdg=c|bnS4a1|GBnH7x-UEuvYZ@ox|wOu$jmHOc^OIX z%p1I^N;7Du7n?yn-~Ri#I4($m$EqTaOeQ--d2-Q~k>V}HXfXy_!gJxpNFqD5t$ALl za4bZ0YH0ThxsvmiJm zx#rti5jhqX@@_+jkv$7EL$@(HnD01sc zhI0Q-+j$bFkLcpAs7Z=JyZ*24=5X}z$%%>g1M@4U>QLcW^AhD<$Uy^c>#&@ADf8(i}ySG+%o znUvSnv4BRw;p(rMWyZ`t6#rSFtvcxgW>79)7q}Rut1R&<21wvI$h%wQ?3|oyq?Sa< z-ui$7D+5dQ96X->u~VH0acM`i*>Krg{z0Sb^pBW#^{fJMNgfC&N@0c?w~MNO_^uvjL~W-h`w3Ya~~97aG3U~K$&0dUenjQz`( zFT=%MAB4Zw^kGZ+J#)u4oW&_T`ngbTeSJctLds(l5dZ=!y&YoekK#>6r zzjNnK=Z-@6f&>tLV70(oT;Sy7*JJ@)3u=OW{O|>(Cs$l@GBZ#bV4Er{g{dhc&iz-l zvu?c-`Scuh(VFi;Wu4->?~R|Ut7*Dr*Ax|*Kygpy)zg!uzP=t%fHW59Dwxv9r2v2- zp#7T)Zc2UYzT__tYQP&hL|dC?qa8<9|8%eW3Z`jT`}(qtjEn%!@~Dptl1NnbDj@6f z@^Td+meYnCTT+wYu)ygq1m6hWf&=w;VHa!Q0InB&n=P1u8{}ZjwXJ<6yyV$D@7u~C zYs=O(wd!bnCFUAql)GG_wFF!h0jdH#tD`zyuTCN0t)a!1@{jd#OSEwe-#~G3u`Sz#B^zJ_(SI>71XRAwcSYTz<6mrjuq_#hAaE=AZ=#@~ zf3&9Oq6}s7UivsWEl(EfJ7r-cO=DM9R!&~l)SLuiNuvboxYy@u2PqL)(ziHfZg~~B zftbbN$r(8RV6j>pvr{fx+`B>A7x^&+r`(4t>+45lEiEl>rl`Ji??66EaCLQ6{^axa zjJ*nUb*VVMdR6e>T-XU~vqiPb=;&Kh1e#Big<4ewq(nY=f-h{*v)Swa7qnET6fr(I zBO>?b3uU>Qnwp^m2iMp3kOL-ZtoR)vL)?T#vgj~#-M2?gF#s9^b}X!{tf%2pGDmuh z7I1iWe*U}R;Y5$fm9_dYrGqHPf`C$1`}rfzS_N_Lfb;hY!;bgNH=4-FVGW;M+C2E| zgfl>db|~Q9{2Vdt+sds}=+;dBF3yR>bbb7Y1RVxU-`LKNieh!iiZl@cO%?}7$HlC> zfhz+*=XVj?x87xr2xU*Ob*lXE>o}OT)7Bnx!eHK6^^!fZ2q@sT;IJrwJ&Awt3tEkz zT{JE|239||dez$OZ=E>}8V;T?TBv*m4JVA3Hy^IK%MB|g^eR!4qYZ$&>+Mz7!{H__ zyS4BA5E)z!f8@yzQSk971!sQ-9T@g!!lco}*!V*)&)e>{qi*{-K%JmNgjnc+Q+DTy zOR#WmuMLmp1L=k>fuAM5sHNr0j94hYJ`&@_#lF70+$5Z#mH%^X?I|p^RV1>SWl;jG z9$^iP$kT2eM=#f>8nZxoPMBC7z0E*br3-!cEcD^aEj6&TbiEXK_df7tAkMhU zSv(5{cH-gj6Cpa@kl*8k{4S_`aB#2+k~6rJUtQdt&FU_Ah>F<#1ohPSk~di)s9!7Lu^?;{f4Y26`s<{gWrr+&AJ zcWC{t^mcC*4nK;oG-ztPE!S=0cL5Z&TfW@ZfAp zABbFZ7Jjonr9=!#y1{KOdGc-$6G&$`91a4OtIR5NZ;?GPF!0#nX#dXw;OYeWv!oSi z7!0N%nWON=gWOwKDDNX2LS&Mip_&&f83yyNz%xc*?N1*N^0vGs-O_aaqGql_z_#5+ zf_OW}?AxG5+>IzQO0KN=5ro8?n{A8iUz_VVSqJy-5Nm6CLWl_d;9zdfxxc?Zyt?Io zI8~COv|m*QBI!zddwXGGO3Iv}mDLz5O0`zxL99poP0Dnkh*IZGg%m(^c_XnP27u}4 zA#d4eriWrlzr%w6R9Rsu%L5lPOyoH^IkA*FIyxf3ZfC;}&8VLLxFn6$?f^Mdd9EYu zazOuq*Cshsaf1W)YdXGegrds_rjLS&pX~MsLz5Bwv@!|LnJ+h0nEjtT@ z!b@(&DIYF4p4QchB<;$UV`1;b1JN>o@3OX>3wZY$cqdy)4+&PGXXiLl4 z&8{fgu-$&a6s}vx)P`-x`>S8l1aHB7H@+SzLw7fR{=D!lK&cKy>hie_Sv~5UIc2%O z({smv`&PX7|x+`~cZ z8~Tf8XeGVf|5-)5(Y#a;0#(*}8=m5MvOUW0#z2bsFC78a3 zkWdP7;Zf+)jXCG9V5S?GIAsoF<~H0e@bdZ%r~L7h%;DPoP10*k=1~mX2kT#JS@!=i zTQh5?R25hqZ)f?PVl^kGxHMv5U_f@V#_9yxt_il%Rbp1z?d5cP@ul8T4+}p1tA9Kz zD}Szd%S%a0O74MWgHw;-a$zsAQ2JBgQKc&XiE)xdcwian^OsMbK8=G7xOnrlure$E z_F*lJVa2T;)_-6`;x-f-B5XmlDm%h<-h5#_+K4^YF~OaVom&6Cjr;mCZq=qxWN^!C zxV2WgP-SCdmT*(!oilg#=A+K2|7t(@buH6=GD}!OQt|_xis?Hkd()?+j@XPS%G%>u zKmyP>B)H2 zOtsM92wmHZHFR^`H^_Y`Q}pZBmPdfMw=|tKSAe4{lNCb0|8cPe8}U;u?7?POAH*^m UKksb|mh>S_jPA{9v~}eF02rQl3IG5A diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00018@2x.png deleted file mode 100644 index 07558a24a80bac14b9c5908ed0b032f64bcf395f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14801 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 Ku~fk#^#1_Nt4VPH diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00019.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00019.png deleted file mode 100644 index 69312d81ed2c842aa267e858430b746a49bd0986..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6149 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00020.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00020.png deleted file mode 100644 index 2441747b3279d8926b17d56c643d1275f0d2606f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6129 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ʼrTuF_Zf=s?sPcJWvEGB+Vs? z0fPX+P-W;2A%h_A#z#wI=63h!IuLbm6cDY(`uc-kKQX3)F2aA%><=hldje|MD%|R- z;j~9CQ4vyQMEdvMnDzd?^PQQB*Sx5E9YRYSwZi7SQGa;eT2<~*$w2_!x%Bk(RKl>E z)4~K3oDruxjDQL&M263TX9Dh+1t>2P=I`q%iW#+)W_ze;-MdmSw0||W++;~*ShY1( znIkt^VQ4(zf^9D3SB>BDpp5X7=Wi{E&@&MiXN}`R!>JwOi7z;8<=CpR{kx%YS*b63 ze@Z^Srkp$>VruU47^1iuurg$YOp`dd$o^9{()$<+pegqd_-mzDJpzchFHiimvs_~h^Bqd!ZsR3aiG&t0y@7ZsG05NDN&XhAa( z)G__7-&4i3=|B|%ItC`?Td^kKp=TV5@nK5TWg}$CJyDJ|@bm%Vim_&7Z8<*v^Jk4N z{7RZe3Ximm%plwMDoARI%A9{^UebXa2DF!exupYC!P)`q(M77LRi&fg*DyanDH~Dq z)Lq>YI+eob4pj#k7-als`3MgWp~zY~Yb&cnuEIc!x!ZrRf{KbOsL4C!{sP(A%;`Id zQ&czEVed;zOXs@15z&|ScODH0_KihNr}#*-qhKoVPr-SbhK9-Wn~VwSy|sxyeq8z> zKpR>q(Ufd5z-ZV52m73d4DjLTdmP_@B$zY}1xeEJ-jRar zGpVAqgbvSJ8S+FK#&RBwQ_TAjmTBrhtpM-PZm?au7E|i>*)!K9-lUueDD1CawjfVh zDMXfOzDlDi{w)4 zfP`77LiYQoV-+A-SvO*L8Pz2uUyAZx*f(6$qwLL8hC267i)t0G#!57VH_doQt8f8V z;Fq+qa1w`0J8U zi!U`6!eIV;*AOrjtyDIPwNA5N%YiLPxjiu|Fd*6PnHdYR#Z~Hhf0w#J_?p>0NnoR4 zN)eVvXoaDu7r@8TQ#z#|SyTZvgR0V-E~^q2h=?mSG;C~W2oIm1x`;rqQ?>n=nK|>) zA0eqBg4-|2OOHv5oURlnZ;CP{EbHSI@SrL8G|kP-R94Eb)-fWEbgT(J|E9?~Q|V^K zqKi6;Jjzzp?ds|>QC02IdiZc_hN9~W8C|LlFE@itW{k&YTAzAQ)}VC(I<&B`0MsEP zGqYoVUs^Jg0u+w8oLqU2NU3e;YDq-cd<^sPTcZ0H@_IwMnwGJ{Le;Ii=G01ubN?*U z0tDk7rHk?$OZYJ>ZF>sTKz7PTLcS&Cj}sirX-s-D0U84e2Viscb8}*-N&o05?(}%A z`u4xkJBAy?Xac^I^HlLEf|ZQ(gX)NDTYvtr?uCA6R4+EJC_-)rD}YWQa(wMZZM1($ zop6G`e3G*ynf?eO{=XZIiq1@t6h3#c{^0frZ>$5pVRKZ_N>iG( zdn@AN1b-G3dOQ(^m9il#Eh|$NsO&!|!~F-Whpf+kpK?w}Nl9tr)c#l%l{B2*rDFai?eLREvU(6%{``~%oPHC3&@LX=)S92*83UnYTXPWb)|ePxXZG;%tum^!(xA` z-zFut%cAbS{)eNdOi3Ds($dnsZKsQ3`feUp;l$6L{KUOQ^l$AnRUQ5@Z~JK}b{l0# zpcuN3l=1rMtoNQJR{7yWv0vdQUVyi_sqIGI{RW-J`NIC{Nb8*q{esp*kbX=(k6N87J>w0Dw~j$P;K z$89}+*19BE-ij)&mdCz>Tu7vrAWL7Jus+ zQaV{T%!@cbS_VOClai3wNe2y!qpB*Qnz8h>?Afp;u!jEf--d_nb40{tWMW;V<*#dh zA7Y6;YP_}io}04ZDCy>}m9_PCX*f+nccNdU(2G9jKUMm#@mY%gE5p=*8$SvN;P{5x^=HAD!zaw|j1%(|U|o#Rw17Y=!@8nO$95W1DD; zxS066G4)R%e%DxmBZ!wS4ke%4pmCiRh}+bG>dF_4L!o!!Us^3~Iy^&U6T?B-+m)c7i*p}m!@Elm%P zwcb3%M;{NqNDZ|nPyX8mod#+KOu9+Ly5W>Rk`VasE`u_u_uz$m$vsXve;MIK_Vrdh z5eF4^k8fpv4PT4n&kOdrI6te`tuLv2Fw`%T?d3ev9591H5P^*#!+mwU4)DUDQo&kL zW@DKa!hzdmx6f9k43&<4bM79U!qa-McIeVlL@rf_EecH;*L9}LZ)6`)oFOQ=B?oExjXLeCsk}8~TC|uIjG$cvQ8wRt}r zu|3zZFr@fz+R`$u81l`Cu&KW|?71C|9KuJ|0@r_ic=SLiKYh6d0-e+;tX(7>Q5?BTD@F;i8viX| zg=8IepUvt%nbhnaB#rlN_J^TVQg|fA#ZiL&q5&k8VTbeB`D?cV6BCLi?rz1RWv59I zcGaF7z2b6Z7ko_A1O*$tFSv)6_CiV;{uvq=P=QKzl1giTA#&4a0|9KZb;MrwtU{(v zN$h=oub9HZ!ZW+`-SjQh$>>?Mh5O5P4@xQ&{m>re+IV%4zMft$==$6sdZghG@Bc_( m%9#|pyextAHyxMxChlOv30qglvt=c1$|L-i>g!2!oOO5K zq}_Stf~nFN&+DSGie|AIzBV{}Jz@Arb*EbC`^ejFj@lt+T?N&j zVg)_3{B?~azWKxCVodS12>nkjUPV8ecR4((s}Y2Huy~@OPiIPcD9q z2k5x}=Ld$IvU-}l{tbJiKcoUlKulP7B9e#NIiOS6D`=~eDUt_GjXv8MV}!0VM8Ek`SldL3gcGl(9SXE< zKwB2jDWqpb5^^nNYY<<8d?pq8LsZcx_^Oh;zm>z2P98s!ie8=)eF_U=X!nH7p-xCT z;jsop2&KaK_}VOpw``)V_+72u`jKPkf0jNEHTb!1-~H8SKal@|?1 zxAJGZDAKj1dsN5-YGf-C&UiCYuY9}V?ZQ&l?Z~Ny>0s}MF!sp3Ysgj&c#&%-ySFu! zv%!fCvTyxE*F8LIl2%3dxH9~h6xqkj@xhBF>sSfd_i}xs977IqbU%h4^CDHO-V*20 zq*3iCAp0ChIEdjKXTFDlB^Z$03dL z*WZXmILBos)lN2?LuPXNur!>Cnlo}r0e(!)!Bwp^D5=56+hrcmAQD5xNsYWntFeks zFHrS1zf)@x&k*f-55M{myg?EEJc(+@Ig)D7jrBw1>z2sZxI2-}@_d(lje=wm?+R4O zy4XjZlK<{L*X5&sSx_6q+j!=64l5b*w0}yof$u^38TGbcxiLYvDAKEe3@g&HE3K$Q z(CfM7Fa4T}g!v19p)e(i;g|2cYeiid>#fKi!esg83YNaK-4nVkr0u=XSs)ZR<|*K9 zu3Tym!G|$2F+qORg>ev&b)lD@ADxGE&wCO?JQP%aa{jF|pp}g?^1Tg1K{LtpguZtT zo)K%#mkz{%V{Cz=%12#r2);TwqE76^&mJT$A0sUvi$e**Rg->U3D`c*q{Ki|_%l~G zmx4VoUzvg0S?dx8WkVj+2FyyPpNeChYGc7=1j$kwr#$TY-phdz@-`suv$?%VZSS`x0hqKF5McSv{ufU6=00q8wo77o&*_%)hj=_5huDow)S6hEn zOa}Iu;lIW*g)yJLs#oAT)Ne;T6^Z@x#{wQ+k+txU4J~KlhLr<_aHmUfJl@+y%ILs` z3pz72dh;JiO~M>LblN}{r}U{9ffZT(5fE*aenCmrB`=nt#7&DgxLb0M(7Gb!xm*;T zOlh_A%UBGTv6`rN6Y>DcM9j z>5PR@<<_M-{8+3@aA^$tWgT_=d;_+HLy=@eiXr=>_Up_1|40?Q&K z^!cNFrBNhq({i0r82Upwqf?K_Nl4I#DhON|N~H0zBDvh(i&wRB8mK)kEOcnqH8nXi zHS^2MDQ7+WOKXd1=u>=l1kpB;ugitVcDqE&98mo=dp#n}Lw_CS{6#O+A%=vp^b5Fk z=I@y{XS@Dm;CC&y|r|dOXQ=7j#WF35>YAdjk%Gf@D?We2q;_W4cu_usv$z zA1em?g@7`J6)KRQ1Dfk z<>|y&>qS%BX%o-CsLY7{P+Jzu8+7u*QA6BY@d7mHjUy+K=Doq-jc2uOCnaqN*pVo7 zDe&1mK1CbjDj1K15V!Is#plk{^rIm`3KJgJcuIU6E(6_=heqMWq+y8k9`)V7zwBHv`7j zDP@mlY!YQpo~mI*=rM@)rQL1iMAm)Q2VUK{(a~E0Ef#-P_ji)Gw!tAixSPj~U`>oU z^p}=~o~9Q#rx%nIn_zv+4QZ9Yk!oiQ4ofpLz22{1c^n3_l1oPaAqd%3ld=Yvy7Ke$ z+155UFQ2F;1rR(ma%Q2xih%1FSrJ)WS~Aox9@t#L6>W*{k`I+Xe*737V>s<12sLM0 zy}K-2kSmG!UE6V|)X1V*vwecZXq#Cb+kL~mIn1fHvFw(-)OWB2Bas|jZ&khh{1m7N z7^1BeWw6jYfRdAt9`w zu29DGv3c_P`lr=OIs}8eZ~{EN`XJ_Bmgy$H&5&rTD(2p>rDOJ9&)m_IN)oCr!Pv&K z>)z%9{~9eud@`w!)CG3XcML2LJP%Ez30mGpS%Y^#ky?T^ZR`t}32 zwplXm%s^B;%7YgsU;UWD2$P=yHUGB9`N?E{hEA;P0Q44{gbHaqo2G9!L7=Iu2Y0-i z;^rmx_V#iL3yA@Eg~>zGgI!<=mX5#5xG{+fR=m-4hoa}}1$#ZMbj%tuElWnVOGa~6 z8(oXQDFGPPEwbHw0bmtEbE#4(dDa?Fd|g@hyO>%&dp3fEK?caw2oE~6#vNWrj*m3w zZhAq7NWUa0dgS|_yO@!W`4^3#Vn`jUD9E5F!Tbn3f-iwLupoJ5hin=;J}+5ReXv%HTj(QVNl-ir}eWROS_Q3J=VY5LgfMi0;uA8z~S~TE#xNX%PL&qDqMJ2kvEtHZEo6%`uZ1oJW*!+ zF=`*JO$lVP%N-@$^OZ*Hr9DEjtQdxTf@|01VZV0n;<2|pmuc|?kfq(lbnakGA8l2$ z2NOvzDsarxEy^(|osfcq;!?T&c6ohWNhr;1@Ijb4KBfww7&w+!R}~~PA4z6@?d%L+ zXWlyw+B!W4hfl0$Ed%c@W%|s z62T5da{>)zWFDJU#le+CO_!~MDDSW}a3jF0x=&*`ZuW=q*$3I}KU+{n43 zz+XBmMHULM$N>OuQW`!lu{QaI671yPO@0FDt{DxVBj+Vfhx9n#v@c*%?+XjtoN6I+ zskl^&<4&IOlf1uVGfr7$j@4j@)c?^#m{|%5eG=HyiQ$g*eShLq;Lu?92(+_2Zm_sL zt-+@i?l@V+{NdH{4fD9(`HsFmxOF81^~=cM*8qM2=ZQq->PM6;Z+^PzL0-a(D0%&Y zRMH40NcMyy^1sSxHn5=@&7c980XMBSzbRt@1)JrezN)MR4RZ5){S7Wj@@W;JlliQe(9=;&7G{C`GkHjec0qiSQws z&-887?hAo_N^Vu^1Qw}io8E*{A9#-)J}ADhFc^SWK+RqyCXU^OE$w_Sf*Yl{(vj&! z(~2() zQH;CLrx$QA#h3lo{CHVtzcR_(S5b#&KEs2i{iWi|5u4XS{)rp0b1Y4()bXb!&=b7S z8m=u=S#dKNW7oX@%k*7Z8hASi|1EY37RjGp52}Vw>zERIBW@}uw6E^ZO*K5b`VA`v zP{-G%;rOP z_f2~7a?vC%D^!lGD4IK#H{^@);W}+&W1~keiy!LgQ#d${tD+Gh2QYyk*a5xPBg`4b z*B%RB^ST%jB>SLy_i1``SXdZ~!-3THaZvq2ifMb5OQ!JVOh?4nLTjd?pP%?f{X7L& zJ@C6twx)5y*JX_=A^zo=_h__!4R!n5imILw97m?6jhh=qfg>j~h5N+k<mAGYAdxb4r(cKW;b7tgQ(o(D~rpw#4e zrIL3eVMS!LO)lW1MS2J@y`-sg(#N?T^*eI@FynWKA;az&fsWT$*0r?Dk*1yp*kVXq z8-Gzj@BDbBT8D_ne;B(a_feN7Gib>90j z6>ex5JSuC_9F4by=kYe2A3KadTfO7tu%$5IgYvl%^z`(guf0~`qI&r`z~HGqC@wvo zcNrO7YioS`=8ciZ$In5Nlah}LDAB-1S}}k!0_`$5IM}y}D*Zk;16k+N?kG$2xTcp82?Z1CB01h>Kcxw0r zkM8sA(YlDF35-veJjXiSo*mF*lTuCwvN9=C%2ID(aq*Zji$HR~#(ZbBo#sfxQQ5Zn z;d6XpnVN;`3M#w1yWp&Hwc&w>8%m*}m$6SgO;t+`x&T%G6LRX>d@$h**2p)_EyZrV z`m|)<)zfph^>#-8)o$AgXklPx?%vv}VA*NXiBqN`me6y5ZGKc#^}};Q;R4g?Tr~p-bW} z!8G#FKK@R9DDq57U;h&G_wQegWHmw=85tEW>h(XQ#wqu~Dta}%(&o06>b!mXw#W9I z5_haM>C0z}1@=`>RGt>hbj48Gcz95?kE(y!qoauNTpr>eBPZ`z+BG+H&M_zf<$n{9 z5h}Qg8ZLqPK{xNc|;l;z#`$9q^{z6;IP)LT= zyPu*m@6D0D0x+lAiL{U-NaBzGeEjOj7wbx+G4Uls)g%k?@gEiwH0|Uq;E`VoXUj~x81Ozb6&(HTQctP6YG$V%dgPKntWq@HCbUqJe zhqmQ_3@e7yr$YM$maAUqfwSuZ7Tx334jigU>t{`@!K6eHbrJvZ-;zkc?-B$U0u;Ks zIa7CViIgH53bjsz0g_cD=d|s-iPAeNSon};J~kB^>F!pPPg(GmW))|Qb}RyPkMrx- zuYyui&evEr6X77*p1bjVZ$);oU%R9e*W$%J~+qB^FMziX$U&98o&y+M9jRm zDw_F-b$l-qNPkE3ef{DbXL`Zx$j8TZF<^R|ppZxQ`K)9(rq4WQtu^VdV}6PQEfp+q z`>u3AVBpxOc(fI`t=c@vuQ3ZlqoYbJP0#Bm(PEj+1SnJ#w0nB69``cux9-u(nuLrD zIhYz8N|WsvKk9y?*m`5f82P$!zx@HS$(jxh3cDct5^*XlkX z-?N~Gd=K*Cb5u13?= zazM`LOK%hX06z0ecoa*i2$1q zkB<mha(HrL zk*wBpP%jm#MF*=T`qci{>w%QHK@$}c5H!L2_pJ`&58QcA7tMG?RzZ0)u(2tZ)`g76 z_s)YZ0GL1k7;^>5=1-uM6+J>K0``k-w##ksr;YieJ)j*&Az{qD;}J=$zjSDOG?By0 zFyi#o7T=K{dIbUj?^LigjkxmL+|q+rGM6@Y%{jY>Mi;o3(C^OMv2!VhrNe4Z&30bo z8IAqgm!~tWHM!S%G#6L0NV=&gsRLBtIcV!f+xCsa`(#)zd2r_72>ewTI8oyU?Z=iI z%Ku{;Me$<|i}b2ir$x&OZv^A#aRVWy^sx%4@4Y>5bKKL*r|?aK{nE7L`89BT2MOH) zD25WX%Cgnt?DI7Ti~4I7Vws;HMW`cRIZ-VlBBJfrKWp&PQjZmdBv2I?$e z*H{awJswRD^YoPF*!$byp85-vCNw7pn}T;1!~6X@|Jj2b?Lk{1qNzsc>eM+Q4_xqJ zFqP}O@G8DZ!aJF!RzL4Ps>Zo|W|V@Kd&CI@yu>9Cj|HIU-+x{!_j+O za|Q?T7GqBrw3Xy<-WNw28X9t?Vn!<->HG%RL<>>2`yFjrRhE>jwyaOd^Zt~K!rdin zEGsvu3lRRXP#gI{heX?ISfsQxhaD^!PjdRkb~T@~q4J-BR?!2>_UQ0%h@F|@5KJQ! z1{Up_iQ$Ap&k^hp`V@4C2V8KZ>D`bOG8`X$c2*#9I&rs4Ds-s0kh9#kA@RNyrExW9w?iZ-{#)wcyL&|%;D5C z(rnQm}DhR@1sGon(h z-q8umouB(2y4K3-I@{$-TpV)LPlmC4gb1Ly^FtgP8Bs*}2{f4qUGop| zD_V|AQO3SXPL-Jx;sI>rUnjUbP+PyRem%05?)M4Dx|gIX%pW!rM$Gyf<7rkgo$>TP zbK$a7p`6WWgu{y09oEFc()ZEKy&SZNQh!RxU3Ui@)1<;=pCDOyN8M#G?~DZhQ9C~6 zn)yZLd3R#df10|GEF=+fb`-WhrAYZ<=;3mZPT|k}@bu==oh59owCi;l-AP2&(lv^h zjD!B?zb*rYG;s!ji?bd_>9UjeiNvyky;Fxg5r9vZl^oE?1g!q>)5_HLc0UP#BUrXX z9)5Moo~5Oj;GbAD*pg1v?%Ro4uW21-#EpOH*M$=9gGp}Pt)0FDb)3!eQqhF<+^2I_ z8X%p2))$$1&D?y(Ky-kWnLs>#7H6#WlS0G%nH$ko#Op%`b>SAgs!73@n#+?;=lQ=h z6jE?L^9=a1-t{*to?KPtGa#a=CVgmGZArUb`T>b_P(!{5MwE|Bo|xoBfQ}>1vK3!& zpN=|v@QZac&}HiVw>beVLYwg$j)^^_0?lqM(RaE?d+P44H09j3X(IiFu;Rv5JAgMlh(-ON z+Xo$_iX{S!NZ|Q_F)Z3@X7?EMdVRyv7^-kZ&dQI$&dpzork3}|sPSjI@6$^L@Pf5Q z6GJB_Ct@ygM0hY@%Xlyw8sbUOB0vR>GkTQU#jkmHGe(Djby4B6raT#qjIdvS*<)Sz zgc6zZpf(FAn% z^W%~?>bD(_3llV{MsyJD)Gu9t`td4RkCQbqg36i~oHd|GYms!Cm-13btV>B;tFlm9 z4Pk(2A)8DBGeyig!8_V?t;EH%3^4fTanDG&DJfZ~CJl{^5l377JE4z%R33<1u8ogU zD)M?(=UV;ZQNA}Ha2W8nAbCNC=7PK3^V{riQ~+*Gb{4Km0&d%q{byO#^0D^&w!(;P zgs%ki*O?jivyjjyvxRoGz$^huqo3bl?0(JIYR~q3FYv;En3buwd$c{zJ4YaqpdiAe zc@Ojrz=77CL42841d{@asrmB5hqtyqqDImn}va;&>9U!06WzAeivl~)`wqSx{ zU}6GVr*S2JLG{i3k;A>cpJ^k7nweMg=+>4X;FasIzV7XMH86t#>FNgP>%Zx@zxGm5 zP(tGACPJGqb#Td*)S>$Hk>3rbs5XO=@s+WwfuZbYvjwwFZa!w-Cl(I{1Cp0U+!=xZ z4{%o?kPLJ-g7n^yrm@@mnu>$gAhfs zVSgBJLiDpZ7e|Z-^Y-x>y<6A+^*;TLY`qi+VkElC0!Z31PW_jl3o-Y){+k8h@ml>h z7)ilJb_kMDFiSwdiX0y|?yCY8>FU6Wl;@**CC+PCI|7Aj{}b>GAxB36c7qY0!I$Z! zzrQPOfW!>+s)xDS5C_3GTk04}wnw0NM3{Pj@Cb|&qm&*nB7@bd&kF{O3Ybk`Tm4V( zK!I6tY)aguJ96N{TRh5uEmo0pd1J$ERb;+)hJloYh2;0$%r-{Ik|#N&d-tqXIZ5PU ziX9+RK=%OZzmyD^!j+5koYHf90aItD$OkfhrO}VFl-2h#jxMtI#_0fhOLjliH#53fOQjY3-T!oV3Q%F8m2O-vtW-Zuxut zpmN^EGKYwcneq-E8sEjn&>4!4PiWgqq2FpBcXs0y@ydvmbO1}%;iF#<3fD}O;rPIh zy?3tWu=|xy8kh;2hc}tx>wLNo1M*fSfh35C!sAJfHGj~THd$_r`=pyM(5MHrIItpb zRQ{$X9Jvu-MM^^2E?J@5XiK-1m`!#`CD;@ZRK?d8esAaGmy;+EsKD{5*vXwylEq%6 zo#@kG&`mhf{LK$%nX{_#cLgtjq3KkMP||TBls~PT;D`0gbH(Pdr1{_bCR6q%eQZ^x z;p{wPa`eS|!IL1+_-)b)zE`cKa6=ENr~nel?3t9>U!TYscJ(G-R~OYJ^>&G3Y}NtT zEyz&g;A%d$E@V9*=(v;?YO?V-=|kN}vbnoD_CuOd`MNEZT(giHVnG8j36aO`_FT*e zpcle)P0T;b@*1`cTQuragSJ*qMc_j8n?)HQ6a(>}EyReX{(m zJ*-wCst4kpoX%SR0J;ZEKJ(qXA)e&#$LnsdFbBFtdIMVO>Q5oP`X-1)fdm42sKuX+ z=z14{g!|ePzoOS5K!N_kX2u<|gI`jOR66EJu^?5}ufB9V?oGha|7n0NWl$2&0NH*+ zCiLPgKTLjRaoz1T=GPPc)Inz1pra?_E(Sy%6dTkzHi8gs_4w!e_wR3?`HFwF3w-zP zoxf~GKNA$Y>@iC$`4|StQ$VfzrS2^*439jUZp>HJGDPc~{rb|XGiUBs7fUNo zD8FCX%bH+#|yXbm$@mZuylCpmyZ5wuq~>2|sVpb{i~3}L^$o%CsG&~EAW+;6|B zPy6A5iMdpnrZyfmxX2y{U5v)Cg&bYpU}3ojd-pJg?ZWZH6FLah6Gpl;kZD87CMz9^ z1xDw$scrT7%Sa8^^YD%- zgs!Et{pnQO4#cS7G%!nw8F8x=gME8^|fKbtI|3>X2c+}yhT~kv8Gj5rJc9EVo ze=3+nz>ISRC8Y-I=`VpRYQ^x(*Y{vNhBaV00|-2HP&M>@a(XONrH~gwJ-GGr7zBS2jr_#phY z+Kj$5p_(Sv*5#HreYqabYrF9>USQJ%$%1|bk{UjQO6Zc0BTT%vozsalur>UXG*9i@pFF8M7Rz9XNBScw2DzKT$lk&@SKmZa$)@;~lI%l^s_wYWGsBv}S?^4jxwIN+cJ{8C$J=9J=1UW0|2*YEVrYmx8eaX1k%* zPC(0n`sTL(uaC4V)%yBZE&>pkG|zW{>chmh`ip?QgZ$K-&X2@{4j&_hKPYz@d+q2$0-33dBXV#5)Lj3_(Ywv73QO2fN3(2O<01qjTZ(1Qgjy5Ceu~PM+*EU zK6=m-MKtg^2*TOdB;$Y+3CtD{bpRO{fZ70q$%xjy7G^zuXC03%~?K%%3kynhtRUhOnRcUEi)UB3e zOF3c07Y!^}d3IE}7BI`$;Xbun1P?35D)czCmDpoB0Ts;Et|)4w^OQ!)h2i{Edf1vxC3?yX^Gz#w)$Ly$a+92HGV- z;*Xk0o=V<`wrA^(-0`=Jjn>l*{PXj38H@7NN%dS?2BJLf&doywS|!jEtt;XB`W>Fk zT&j&6$q?N|L&F2^SUlAvKucac6=^IIzA*7%UIGGJB|b3)ZMOg1OVVg7l?pGY-T;kn z2>Z+hM}ZIaty1^k)pNF!p_mH=p)~1^sx_ZL10Yo-aj7H`Ky~hD$zC^+?+Ze}0RcuY zsEC7&X;LuEEnJXiE#U)KaeFuW^6U;4izWC~CQn{QhnnX>2Pi`L%)NxIyP2CoGi6O1 zC;#C#+5Qw$UMGM7UJz{sG5~o7C9Wru#{o}(H3_hTCwXQ+02s(MnJHwX?Z7*(-}(Di z%ObkA`B^ZG!Z#IjJfRA~LuN@WC484M{X$0OxA$BZGiXKv=B^RIz^DZ$iU9ImpS}Bg z>~}rSh27^M1eTSRrBRCl;WpXq-m|ly$-@dhUUEuGHnWRieDUwq2{#;^8ZP{y?!%4g z)#H83%l%7k)sa5?(Dt)4X&{dc4GpCWbJAr2_TeHHr^xB4utqi{Xr3^?RytIB(g1va z5b3cMB5A|ncFwEE`5q}NTQLv;m3eO49}~zBJ==LPA|zuTTP_9EiEm1 z9`7vF(LDqdw!!Rcny`bQj7-ZS7@5FS2ep&uLQh3lA*lf?Q6TRE@fI)vz+%$J@KW;n zZH3-tW=3(x0vE!~6h?)t36kC9BityvWC7fzLiNQ=L;65;^BYqI4I zQ~Z^n{Uc2nY`};J=R0&sTqM1TY%zJ<@7}-fo^)@EZ`y1P)PIszcIp$nq+I#0k)lg* zP54^LL-<3UWF&v80yix(G&B^m9}1p}WkhkQF0ZUOVk|4pjAQe-v2qvNiG^Tr8QXRLe3N&1`rcON%VLKu_8}$ zwU=XV-n=OXZa{yQqz{kp&fjl-`+IvJve}#75>s5<2OJh!LI4lT|Nfcm3X^d7x}ibl z(6-9;TwO$i7g#D;AlXn!%oa3sDAl$r_2J7Gza?jE|59qndG09pzjsqB7UhO_Q!%Yh zwUP_l{sEH>4lTlxx0vGRfTn-cBM=f+S$Us~j7&t-kvIAKe|#7@N&>uHi}J(iahHQ& z(C7_8_XiGZTu&WWeKeId+oCbW`lymlkT89mOz4=o-}#5~^76fw&0qmM`7s}JQH^J# zKcs+A4II2ZGo_N+=Caj;2ciE{bEXV3G_e20^~^L~`$ITW zXYUI9VG!y9v8yooRoYj;!;j7T&4FF#mPWn+Q4!56Wz-U=-Ex6M^2b-edCPk!@)y4w z*Nnb8yw|MKO}GH@vt z-zc*l$AADr6CUaSMAA)LU#7m?g!yKz}^aA(jXx1prq4!G7~{*;XfO7{XK;!5n4-! zcJc4Gx8~n$clbrdeKWuo11176fr*HSOg13UYkv$50?Gp7e_YfrMa%C*GAwuES*4eNwSNSAnxqw=*GMOVrS1}R z?Z3Dp>{lkn<+|3zU#&lpx6VkRzbWFr++}$6h_GZjm4Kt!n9!r-@*q2Z505SJVf(EY zfH;JP%3VpJX=!P7wDO#9AWYR&YRxg-8~ql1Z&T)Mt4l7@$KzI1bZLp)Nxqy3wAC*F zfI|Sp(W9t#%5;moO)HI>qy85*1XutXM^n>{-UODb)`jS`0s)Zd=x7hnHr`A6AixYl z&?N}MijP?nm-xB_-SLhH!R3aWV6)xmN);eIZ}ak?b!ST{91eH+^V{1y#19fmOlz=w zsv`O(yzj@+V^ziK*#EB6(}x^Iu$|2WS{`*?=jXq7FF7SU)AZ7leCn3G3=?GUjqz`wVXNAsDUT#rZhJtoDaqpumgaT&XbF4@l z$W+|BMg20L4>OVS69m+NkO8W=v8l;)17rkadwP_>w5XV`1469j^#yu7nX^qeb+L*lqz)}`qt-@7Myf4OMpCmv)+&1!A=}i+5h0I-+!)sH_($21uS3uKlx4lZe{J|p zhhCoh{Q+|!8!I!j3vbtUdpr6Ntb0xpW+CKcDfD8g9QH24CnQ8>8HxponcefvP)n5Y z!5y~Cqu$3~ro1r9w^S#31!u8#R_dEf-1xsfj{fB?|{<45z^VupKG zz`vrxKhIY_rlx>Qty{x1UA<;oN@#RZRO4FAHv&+rvJ*-+wN}L~2 zMJgrsf~^~c%GIU-X>Iq+2#1*QF-uQYc6;-j6G|ZO2mQCgM;jD+F-MYsAzJ8=xSkQC07az8ommQ z-vL3Zgizp@AC@iIM_Wmx*o^`k`j}Ym=piD7-StCy0!)6?XBwmkVz;L^L;S$H-390U zePJihieUvr)?$0C8@XeD>`<2sn~jin^^H2!J}@7{aYQ!jml{~6zkh%BCDk(IxTo#% zv@P_1oueDzWpaw$1LDV9q!lTiZuRaN^@aJrqN8rZ z+LMyFd_Z_$e%rqh<^jfU5VVV-VDTDoi!N|<)YpF!o5x2V*V6#vILmw!EX7FDE3f8m=WR-8Nt*y4~R4<-OXF-Fz)DR#I)W{cB3~IF|<~+2B zG;hgF#v3SxViC*-oIaY1d8(qC}jhb zF{2P)uE6XBv8MpK6-3GQX#i)uq{URNN(z%2{n;BH9#-CLTrG2N*M&&Oe&3!c=7e{C zZ|oLmlYrE@Y3B|%aRMhnvSQhTH-MJ{Vgy5?8p5c%3O2_dyQ)-djRwmQesyiP&F-KA zmn+nNaDu>q%(KN;hk&P&R#3l$Lq}z0{2?fmJm8w!kUUTF2w>e#AgFS(6F8JsLgY+^ z1zx8G85F(rJj`yKobG|0vBAu9i=53`)pa4%gTus6SgwlA@wVw=G_5ZwOgg-ui^!*+`e-(IjzOph0jb2Q<{%oP8_zfC#Zn4uh z!B^D1p2I1AA}EGOs`{hUpAX#XZpOF&Yl=QOf4(G~-|5;(x3`*50*O&%X1=eeu-7QW zWB)Cg=uM866%`c?Tpr3bZo{>?5$14zUjq>@zA_U&Q<#1dzp1)%X51gVWp%COuKjmP zV@Sdr>C3ZSn&Y4l>znRC7P^xadT~r*l-qJ+9Olsw21f1;B$4*{SMk<2l0Z-_iOn-J z8SDp-|N9De^i^E9{$Gywcu&12)I?f!wgb8v&$G>z!=0CkbAp&E=a@+l-MT3!D|@jn zcN8IaWOe)Pw~kmv?|W!-aQ?n*q7dNBSy%gL#P!Q`iWV33O`v@RG#l%Wj)O@hbm1^$ z^Dv9$#tq)iiBsHhnu>WDqakb!1O^u8=JK`xu2|YKEGC0l#hRT;g>UHr3ia_vdTY?} zj$hl^f*Pg2i!Y(0SKASEn( z^JNK2-KlM{?=RtZ5Z~SFp4CEKIPkHR@SN@fG*>T3Trtd pqsh0DQ|Ery|L;et=4>ebtRLgwN>j#D@ZXe>s*9Ue8U3LiB>k1*q*?X07_U7V@&WcJ#C1m`RT?*M*ol#v< zM(C349V+~uyuNo|e|+!xKF{a*yw`Kf#8{t$O@Ix8AP$^?jv2Uk)k25OgdTr=w{e_F&mA(%W_<_i%D&B0SPwQ03R|@iXFQap==EMMlCmp(~o- zxITA=G?(MAX`C|;DdCeyrgTbZ@EDDVb>WtfQ=)b7Q zrQCHFLBZjNjn(zBsjGtnpN${PZA%>BP7Mw;%FX4k{+V2Tu&Oe3krC^1oJ#1C&8|(o z!F_jxVSq&o!9ikqY{FY&b$&R3gcOC|!QhZIREnXzwK+G^NsxsLlh>dI=oL%500h?% zXlI2E8K+$+MPiF$wkR@^?R4%cj3`Gkf;=HBNE?dbn7%+MDy_`&$HgPRiIM-NBC}3! zYKxNDk7^wxAV26KoStPL#~goztb2sqxS`eeouTf;E~CgBmlp$9ILXL7kb~}gK-RJ|l5d~rR}F0~^_sipo{HRH7ZKAy zH0EuLAw*)YAm$wmr0qs=wFI#`tfgW<`F2~|^-f8K>>-#t$IBz_ifKDyxX!gTX>)vn zFoM`T2`(f#+z)-S{Va5q;b$r4a%1O4B24wj^djVq_vxDr$a(NUN8(;wsn@g;r;(A- zT13n2{TQ}s1xk^brP-(M&g%?h2n~t{HB}W?S94vvc8zb;AI(xdn)3U1L~;>=l6R_s z-BFRWdX4u&0MmCkX&bUcr9(6p(uD7obk<~9|j%Ol%T1#BY z5)-+1S%jDExDXwh&_wJp>Y7^mEm=brJkwV&n_7*woRol1DfiEP(7^I*%jW91xSXwSUu<3W*@UUs{-s?Wt{}Y_(w99cqK`AdUZ^`#%exMTi0fzEm(B0)o zLYxFHOIA*<*tOou&C?STyY=(^aU+^5wDGCZX2ex?k2E~@hnrd#)rgjplT!-(!S3$v z4z+Jxp4|{|&B@D?I0Kom@o_L%vpr2B#WJkLtw)4~p`xRs`7X;p8diM28K&xa{W?RJ zbf0_uZMWl)2JN}AskxNM_q(+DXS3m7snV%wMVM@Gm3r}?u6{h4xI*g@q!URf;An!EXx!(Me!=ckcwVwO^+c z^+@T)-evn!`z7QoQ{kTE`OdOe}_kMIV3IEihu&@xOR=|a&#<^Jul)M?p zOW}Syw~5~>sgR&_i))_w!S5k0C3lXzZ& zx!i4sH)7B=y-l4J#vP685LWQ}nmRUS{c3XMocJ`h(6Ro@^m^Fz=H6{XaTz70WCE7i zly@eixx;?~O+Qf`Y^PsKz@8y7YOGOMqhU395Fcoxywbr&`UN9xg?!yYlXeQ{hTw zb7IdjnDAccWi-el2PvnSV95D?t;Y*ZJT(;~FKE)_wF;47(&FOc#I2vEZ=7Xz_hXWa zJncRDtaTyBFN_c*!LN@>{BI4)HDs>C(tA$$y{W)Im2m%ig^5>J1jX(=-r)0db+tG1 zl>Wb^ZbzI;w!Y+~P(Ul=K!L=Hy?5A7X2;&=g;g*okjf{<_+rN}WV3Y}>HAAjjrO)NV$ zqA7c8|IbdB?@RiRe7`CK;fGI`oo6=ph<}z}(&-uMJpjF(Gt!=U3UXw(8tWaX!Yq%! zT^J%|v7m&6^Z`;rmOlIU_pp#|-h_P*xR{!eaVpnPvT4~2tf3}&(cfs;1`V9!F|D_7dRL zy-A(z3?8*ha+FRs5Q{4<760tr5FTNR1|(dlokaY*>;H!CkD)NwjT%{g9UG&7hctvq zzkY?l<23{8EIINA6K(uj_%2<#)Hk;|yO}zndnD|*Q@BQ@*Vq*R{fwqb-;WT7@Jq=c=kI3U9y#uu8TB24!Vs_Ud&zO3?vb zYdg5nDconWW#{X7kMzL98Ddzv%1JN*0Fw8gJ|%woWC3Xa(GW&}dZK%8x>=d_<&ut{>b;7PITj;tq%E3B!cagjf}a_b(UbzdBQO-L zz`)H1YT&Mf*2D7056>|g(XIuaZv0)N%(hl-*WA$IUXMqq->1&duBs={=HVjnGglwI z$(8c}Wa*j5tZVwC>y@^T!U;Wn{SJS$svrO^1Q?^IxA*<{c%-oiGYiWtD3lfTgSmno;NjuXI16t; zTO1{Q3s-v{y!fg5UKml^KxAISuQQ23ik@sHsXD30FdM zf<4=fQqw6meL|ZLPq;0{T4wxE%g89ri;zzLvE{aZC*y>L3x+LUeY=j*lQFn``5wiGikl8n z&NMEY`%VwG>wWVE4hpyw(rlI9VB#>lFT)-Wa9mz-z4b@9AZHR|oG{8a#vbU+#0kIG zGp~hx>_iB<(A)W-PdcKR;}s{staMDt!U#tcAn*d3aJ!WhC~j%lu%xtrSj`u2pf`I_ zv;3D%J>${kM)zvs@qy0at*xGUdW9zCV%3Sc8<+wT-tw~~ytuOI@td$=lwbwz4X-YK ztITVxDAmu_1^FDE7^*a7-LtgX7VyG5g^Y*SD9X#*syoE@(q%Xtd_Qj%MoF4*7C*N| zk}u9XWxLG~l?D#psz-`M4~-V|2ChUuu5Ua1Fj^qRoz2}&Uw@WYU07P$6Evtd(UMbQ zuDw31Cr;KF4F)!@c~VUZHsPxXENQ71Uy4e~JPoD%_76>-Bd_$K+lKHp?t7#43pDH2Ap#}#4N+1aPtZ!)4#C7Q1Pk;7 zXbkujFv-*5tdjd>$ zV2FbeylYo)X5sC<5}&lh`#`*E#+QNC+1wR%-zE-nlQ@#P=CExtso#i7fKsiktqm1@ zP^A+nN|6Q<9uyo5Q#vt4txGi!W4KRE03737o4ma^dI~5bP>(DzCtxWQ@;NFiE8od; zEH5ulD-At^VOFWac|{mPy*me>D|w@MEEP}#y0@^T#O=NA+4_i@AVf`3V9yNkf#Si1 zY_~i8VqmF&@tkW>L3Y&y4s$%8UZq}3jLKXKJtTn8c~Toqn8mRlgvzRpu2L#9`#?4YzasNyuA)9h6CQY zys|Q3bg}XkkD~8H@{1dz44BHdm9~vXD=I8fN8*GZmy|H66%5-RH!LwT!H=Y(78Vu& zhYT(VoAR1EIArJ&BRE09m$^xex5we9<8?*3fyEIi7(P`ntex#9=R>W-!Zk^gz79Vj z)_3xDrf%L#d-i@2#z^IZXSK z7Y7zJ8_bx`A%t6gjoknN@?!pM)oG;G$5H!8ABa>^R$#3OZGWzH@xo;p+q~P!x+#V$ z%Q&f$&Fnaz=7>jR38K*x9;Q=Q80y=mHX3i^;RefJTOvWWI2^%E-#_C1FCnqNUasfP(yY;)RW?{*tUhAU{vC+pwTyaZT zE!M(hOm*AAZ%HHCw^u#GtWP}iR(>uoM~ff5^*1dcz!tAl{9aK-MWwBJ@wXQi#z4qT z5^t)~7mC@PxesXW82?*;D-DEqNXd5iDQltilp>ad{OPh}c71_klX2MK`K_s=)F%7Wz8 z`ThHoT3?xMs>8uXfkX86NEd;jK9(_iw4_)}n_eBW{j~aP1w0+AlnMvr~V6C`zgCZ_%n5m6%gp z4g(0wFm}VXe_YZ`Z&w-RD*${~mZY6jNi^f=7O-gruLF7xbWJulH9TaMkNY4; z7XhOJM$<-;yR$QB#$|G^eJ7h1<#GoyyOOxBLWHonKKvUq6az#m#Z)X8XQ=)D(UW#U z$i?bc+}jeMv_F4hDBa(f?z!3_QdOofGR+3JX=PVetzY_1a>2HWm&o!@9rq0@;8Vk~ z2b<>sKm1;CPIUlKZ?Jzap9To;XOpilXAAIne89GKIM#IT_RNfI_J{u6UB77a9x?%o zA7w<===iplXp!0{L#Osb<&7+tCdw6_-wabtSKpt%%J&EI%G2}lIWKH~nOO;Ql}`8PZiCn-~CrKf6&?06%HsXuqsWj7%=5v)F$^O!3?3z zKl>ZN*t^}T0;3WQ&F_;F96MxwOzjPYj{SJb<>~FMqbk^YrXVWryiG$6k0kK0{&c;i zFZC?zVH3}~MuVfjJq-OCPTw3>KePr%E;Y5a>qS~`ycJU9Jce!uDM!1GRN&Rs0=^sk z%C_+hN3`$vTqrIs2BtNTGsm!u2F%FJn(YPtlC$Dc`2~Qh8F-)c#6n z()iezA%oaa)=l(ufU9h7cpy(+shj%mpT$C}6ODmfBpB9%;oRf1l&rA^pYf1HCkf*r z>CQHAuyC==@5^#X)bIH+LUYJ@S1V&x;5pTmqIQXXp`kl{phSD=MVO?l{wI-9QK~t{ zW!>Ohz$*J+M9I$P2N`Q%U|{-Pp?0!f@j_ppfuF>^2&>WU*r@NB`d?R9Rup=8M5(eM z!`5md$aOua&4`QXI^4YPrZ#0pDyn2!A{%ZD2rg2V@9c$cFil!8uXO} zs2iYRu4`uP*p1Pu$@V($1PdyM9cMcI-+70DnC$b&ot4!~Af>aw459Wvt8LZ6p`is| zTBHBO!ou3h$~@l91|&52O$q)2WilMli1n#JeU~|Z_Xs%)6-M0Jvu6k2|-6pv%ZM{1QEz}Ur zyQchmPsU!5ky#Jlo1+T;22xPa(>SNjPOaPCnTkDZh-cwC_|v@F8VQ1(hgOzY_wJ)8 zHHXx0=Ub=r)3*S;zNtHe%_LM;+qXnq8alZ5H>)cvS(mB-Bd)0m#caLTw_N#LTm1CJ zi|s4+)i0yHy;BQLF3y6kE^TXT^H}}bqVEv1H>+lqO^4iT)?O{__Fs(&SRHz(;!w$X zfkW(0KUaQUo*<0)Lv`aK4DQ#m{i$i(x49BDjL39I^TUdYg)iPA$^vQPhr7M%=_}y0 zgQ0{{fX!b0eS|sTgZgziO#Vn*O;de+pq+=uoU$g;g3LzE~l@(yR4I(fglH0|%iUq9R@2@($dvg1n?sMix%hg5kM)3(c_s z0d+eaEJ72Br-`mq*(!8cMsMIGi%`^>xx_tzoQKbGjEszvQ@=mGT+!%Ha0nz^ztet> zgI^`T@|_oMwx=GOh<2G-vD@^>KI=Gysd9d~(?`lP0EhYz MPS;qcO3N|se`%qMCjbBd diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00021@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00021@2x.png deleted file mode 100644 index 8cf331454cc2bc462a657ec7b69b324357f2876a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14723 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 D>kc!P diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022.png deleted file mode 100644 index f647a357b2e8cd060fdef437c2379345ee5c6db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6167 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 MPS;qcO3N|se`%qMCjbBd diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00022@2x.png deleted file mode 100644 index 8cf331454cc2bc462a657ec7b69b324357f2876a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14723 zcmajGc{r5c8$bTc*am}1_Ux%7F(G6(wrp9l@02ZN-`BB6A@z=sJ!IcP6h=a2H!=1h z3E8vnzvJ`0uHX01uj^c6(p=ATo^#H9->>DKINf_{G*oO<5CqYv-&NL!AQ*THy+M$J zS8BAxG5AI4e%I6s{67C57)+9PTLHY`3p6nCR`RsB^>*`wAViv%)^{BZLwBtk>NoY> zwKX-hg|3rBih<;Pj{+GxAcz}MS5`Fef4kZo;Lb+~Svcq|6z{gjL(g`-JV#r_|!uZBaN&~tW(zTy!-1VgNoPPn<{!k zPIvV*YgFQU_6wYdZdmnoW1=#uL~x^Oh*j9@#uZpV2wfs7|Aa_95W zf>i^_K7U!iB1|`YXL1WFgt1e&BXR1GD6*Ypd0=Ik-WVpPfUt$}L6g)o^3W(<&LstA zC}~dr;t2O=1o!Q|KxSM&OU#|t80{8Y?kEH#M><0bHNZboKlA0aD0Z`Txh4xW6y{~riy{QiUjZ6S zykeQ@QYC`NkG{KjxEiIop@R8lg!y)+h)Cm&GB7$w%ZPg6f%(?EJY}7_3}K!sBM!_l zcU@mor~6J?aL=fae<1WpX1goWFuK&_q{FE3iK5lEn=M0X976$_#@^d z{be}sz9da_sk?uhjuXcO$yU{WvVt~*qh1tWaz2VTF)#6h?+aqj5H?P%dl-U`Q+kY9 zc}%cel12d>FVNB^b;Oe#O{g=Op(}p8Z|tE*p(# zh7tuExFn=F${`!Fv=s>Dw5x_e{FoPUaCFRFK8$F+5f4|$L`1nie@&fcQL|SZ{!XY&%+8o}?Z9qI(`i6%7WHIh8WRj%A#^Q~ir}8tYvK ze`B7lQH2S~$a7}$;Ok9R5qL(rH~EfIEpENJPP%`q-pW+l~wJ}bwk6Bj%UobL`5S{PeY?H zxdkI7_e@Miz7wHQHN*ie);MK@8eQdJc4)_D<@8U~<1<^>RS4PTq8>(C{Uy^4wt+0O zXPhXB+&)N5NXRuS7q_&7y^)x^pIam^9hTiaKQJ}b{00t{DOomqY2GL|Jd%pOX9SUs zXw~umT&Bw@J{YU8<4^6D4B8d^wJAv-M`~9+s!uW;2hHrk9^cmX>i6oG-D{@c3fAom zwq39ZNi3Ul$%i`?qS(kpzssP9lEttMu#7l08-Cddq&haVlTtdvQ~$XLkw{58-{nJ1%Cc*!T5(HoP< zB_FyzGcyyG!dI+@BHfT_9hI77`k9u-s->-cv&7(%qu=3i`gPdCUZVx=>_%P&%~fm= zYs`W0P5Cm~UokXt&K;BKJ7Q&)ShD^$G40QL(?RbI1iH=OAM%kVDJp0dWsx*xKR*c> zPC8_Jl^^4usL*L+OG2B6MKAjKR9Ad~fdCU#w7y)n zu#S$7u}KQ!-r7`<|3v*0y2Id>C~idkwX9B6$+^q#W92jNUC!tg4-ra8Z1Fu)JzLv5 zs&*r`6lyT07h-i(G?!Hjvy#0?p)-;zQfOyrGV zb}Xvugq^&KcRz(az<;O8p-X`~#g~{(bQC%ZO~6fl z7%L#E9RmyvSHIOyPg`woZ{wDCcu@%KLI5ZZ8!~i?sJB6r$g-WsXEi~eMOYH&nj{mK zAJw;vh|z!qLhzZ;9~7f0Dao@Cn$Y|2=gXITlzIF@;+hkZ%_n`?nf*0->Te1uO;ecf zL)hEXe(i>kcxD+CY=VI~rIX{u7EGc4j0(eQTk(>xqBOVks}XJ7UuMzZ6%5|wyXNp3 zJty6JXl<`7_}v2iZw|Hm3{+c~qGBI~RD@>Q$+N+Ii6#rP2<~xj179j|Wl597+(O-1 zHv_1AWWP5e3Ira5iekBuQnQsBKSPZl3AnmlH4AU@x4h+vWy%zLo_JnmJ!LdY6meaR zk6y9bL^)R%q;v(L)JRaG2+MWWeU`}%=3xn~F629Dx}_zQicl!#>7pvBnRgAG+o{@B z9Qh#2II!)Kpe^NqlAw1dL5yb5iD9C_O-)CKE^m-OZ*b8^6kkaSDm88F1=?8K^s68f z$9M38ij;h>D7k+@uiWU#Gu*<~ZJGtk$Lp!E#*3q4LL}XEGh5kB=$`)fB>toW~=S%xOq%OyL!91;-m$wlXD2 z?ODk_@oN*NvFU}BhK5gO2|gUn&CQGJ>kVXK$?XChv3%;IADmy6GZgc_NlUBt!+;Ba zwsONS%3n+9CjI-_GJ<7XCVPMqED`^M8lK$5Ty= z84_-)B54+`71%^Y6e$vkJg-J+TEG6ycYh2%s0k6mt?x}p^CqMiiMl{l_nhiC3bxzg zAA2i;iNee3Z0{{N!tkFVvR!U>sJC zh;3i|`xhg|*0H$A-`Uv-3VY776ejnDY`cUsn;-(tpc39y``)$k%a8lIX3tt4drKL? zdXmXsd-!J{P9~_8Y+6af=u9ufwiM$m&D2j z?S6DQakWtZY#zUFVAW0Y`Waj}$!JT+QIpzwa^vUdYxmybe*R?mY$fcwHW|ku?JL;G zZn_k*9Nsn8mL(fBvlDoJ8!as@92)u6uDb9Rkq9d=G>8* zg5PZ$XEMWrw9oWxK#WF7NooI^nq0*6bb{Z@pUXRWm6etA>qg5h2^ijF9EaazcyES; zQi}a=&pTjOSYieRP~Rd|Sk{zxq)`h`vOpQjXV9Uc0%D0`gS~9X zaNBR|rBMuq2Z=1Z7ws%!EP-|Cw< z;2fTfNEN*m-h2RmV{AdT%x!Ju`u=c8j!vickH1V7O(}yGUb)diRVY=dK)*Uk9^X=2 zLZ!zrNF*kmo}LDTLcP8>KPS~@!U`o*I#fuH72(hFBV{0nRbQKbMF zkRVg7C^;D%wto`(H1FfuEeb3n^7gG;;RXWHnyEszV1EnrzbCesm${vsoIF+L^?e)0 zn_MMIeh}PJx;CLLF%<T4c{Ba1~K6Z!KBzPLIQ=(F^&!nEAL)*_l_t< zMqj;l&ExmC3vZ=-s7guzi<|h$3=+$C)l`xX6*+?4piZJxE~FQZO?b?@vw&QvVr`u* z`<`HSVLvw_(d9eG(pS*&tc!h8dKfBCOp#MEk#pFcxE9Kt93PUcGlLv+3NB5 z2TJq$$BO(65&aA1)g6}+aM#9pCTZAGPY;ruoIJhRnmmPTCgys3=M!%&{tB_-CZmo7=0 zlp77=@sa*A(`(HjXS{m#>izH|Ktg>Tazq{bW{wZGKIBlCq-08XNnE5iG*m>ig_BUM z_>-hBrL+L}aGtZ<+S&|nWv1p?RbI}#m#@nYs#K*0k(N{DV~*SQdLF;sLSH6$q6z)i zq2?I;^MjL6Bn{1Nfo=kHT#0P|c)e{#2&P*}xPS5D#YRxaD+v?3O++zmhG#0zpFdY% zP(jktj*}#yA{4l>m|SeI9PuahJx2|xprOmv888gobA2>rSJdqMszVDn2fwP}id@?E}hfpO>bt2JYS(_v>JZ>9ZQvnY|c zK5aF^x1R>CyRuUPTmCY;rMmn%X656>btK_fO9^fkWQ4sb_$=*u>zQ25*kkG0$|p(} zGvD6vB3Db|Bx^?#-noHlwPwtXs%m9cxv=ET=GJ;5URYRYc4hx@JU0R$8XHq4z;)yE zB+uTeJ$uxZsa$le^ucuSR`2L+d+eSovE`)CM6mONh%_b7w}q{JkWJ9CvQM&^-@JXR z44`kZ!I%Ag$-cLDB0=6rv0q60Zjke~_A*+YSuVjLf5OqAij6SQVK;a$O(oOam?ZN+ zO;r^wBZJgq0Nfl*#HiVggoI?bjk84T?cT_v+Yd!pqcA+A@NoOR-nq>jt4gJmo3X7A z)Hm6%XY18noL+u#u&3`psFT^7X2o^bU2R8e3MgZqHV=z|c`elR&wGCKUZR&wtZm-* zrtZ1Uj(fdwTP%`>kr(q+)_h4$Gh*?cK$gN?$XA|S1tZ&XD^MX5eKKJWZYN_zcy zZdr9XyZ?cm-LLdrZ4{|fdVP)?D0g5INY^_nn@1)_wG!6})`lOBJ=<%$3%iGo>BHnbs zS?)%Bgx1vuYSds4DzW6fZkcBmxhA%8WB;$rXT^X;_90%8v zEf*5kz6b&liHW3V?zg=wY9aoJ&Vut@-?tj&-m2AC&5lz zB+Fw_5g)-`TpS#@jgj4h7L$`#%v5GY3&n$hd(u95kejwI} zX=m(7JHAKPApltMw(J7zF23Ve4HxN-t$_fedE>xC{++-O?L$?Pg0~upEs}}tD=UHk zey2=HR1#dwVSpc3!NV=6Z4&Pp0+r^jAk&=O>1I+G)6HO>7+V`pPx>@1hpY|Fm!zgC z3*~W__P&}AKCXXP3Dh=iJX6m*g9~B;;UGVM|Nh-Rpl@j9GxHv96fA7o&h>5pl_BEM%iXK#y{ab)-cAE*8mc);ZnM%J+6<|#2sx1t0 zF>p_y!p&`th9=Krj;?fjE+t4z&#=UJG{6=XmC0~80orh#utWSF8i^MvOc`k?DjEg+ zo>Z}l!|YzApL9fZjv`IOF9!1T|DsNt)9Br^s%|h)eRG(QU%A>X0>W?QsMyXtspYmn zTqg_MlHhUhZ{Bz7wAV#Rl0BwkIhtS<)Jq`&A1S=Zh(&OJ^jo)bc6Z+()-{1$)2i}8cs7|HrzQTfpD>(c6zlps~ZZVKX#Z8J0`kkz{3o3iva7T@xlA&SHh#!@F zJNi9gnfmW=rFY6ZqIB=cqq=c#oWw;20l|`zaTr=N*O~3de9g_{K2px*;Re+!gYRdY z1Uo%1kiz7$b@~^!u1+=qLi`^30=Wa>DH#6bO$4~O9)tPDB^}%#{jb%EXUzFyg5S|d zaAkOrRsQ|*TgOIv|J5^soqa2@Tv>5PZo&9Tq%jhufIuxHLHZ|eKaJA?K_>cOCh(*sf*7kL=JqbG^ zRL0MbfH1kbe&B>c`!lL-@I@Ii6od;o-O45kA~5FHL!CoEIfSFdmT9U6#9GopfXbHZ zejcssbBxblvuXE9_37aK=o^ZtC|r^J$x^7v1TLJh`8$nj(RC~e znhe>SYN!i}6s>RGRJj-g-*PN3?KqI@JFEU#*Jpg`O3lJfP8Q3(h)to8cM9AFy_f4Y{rRB%W<{N|@2`Xwr^8a0+e%X9&mAH|Z>2 z=YHTFGJG*KQtI|>C)w=IjgHN+*cn#}-~Zq!=qb>o+|Vq@HJ78pJ9J_Lfj2*!P5)CJ zPuqO^#H&8w`rB*AY{Un}yX8K_x9;qIhQn_n+h$sV)|({|E;p)nl$zR>_{e6+uoRsB zHq>1nZN6@K$sRw;3Q0y91>HUC96aZ=J~Je&<_eGhF#?(j5U~sp8PO*d_CzK?S(}Pl zhmIoYWHxXqjaMs6GSx>w*aL6+?EhjN0$~VW{YY z5g*B}GuX_;4?T*$|7J00;7l{p9jwZ|?wH+PG3^bRuwg3PEpiL8s%aXN%Pc)1qqFY& zh4Yhl>7c>YI@K%O@w_G}mNNm?OOMC=v-#AuGp+6^dNTc*k?fOW`AL;xzZxljso1UW z^v+Qy8VR6_VUe=m^YBD@=7H-}Sc;i3AXD;aG>s?qNfZX%N&Qe8PVzNy{C(W{gM9Nmmloc zr<>`^G}<^gP(QC{?m@VdJz}s){AZruwG}N3ST%N3mWgOA26F` zKnpw_bn*@dY6%U^Xs%umSjUZ{lij-f{Cvrf!w(!Xm*aU|o0hJAqN?heQv^y1P`z&) z3_SU|vzW1EHZISG{=Ii}Ax=4ECoH3_rfeP5IUP_6|B94V4_32ANOgc?bxw4jsGQyY z;=vAZBRm{?lg}Hqx4o@^iV6_DW`CzmviI`=vOTA=(k)A^b!_GC1OtK;h(xQVpNvXp z_c!MNu<^}m2Ha<^D`_J43$p!O4Kc#v=@-}5tne*&Dm|#=4VwUZesc54c-t)|slXdm z`GVM%mX@y?M1aD0nVu;c8akyrWK#lV;oN7jZ!FIF@Fn18b9VYRP^rLE*DFYqeY?*7 zLAKiDan^ygP^z9#>g?75T1<=-^7Z-U+4xwR3M{>jPEyFv6f?+WOd_z^>yFZq8bT2O zbjGdhms(esGRn0R>S#2IOdw7O-06l9gly-gj{{@$szh(f#iXv)w4v+#t5jOGI~BGp zz6X^Kgn?xzX{U*|g?GxYE0oe`YiW&EpY_?po5j<#B2adOl?SFw)g~+HdkIzxf`S@H zs$OVugT2N_z%k*Vu7EE>G7t(${;BehHqh^QlNG>D1Npey?8*3t?-iMZMRjW}UAC}w zhDQPek&%(q5ij0GSXUBkS;&DN^5QNZQ&~}n92Y?B2!L`m3IO8+p3pgfx5;=hCkZmC zx1V1ms-`f+t3}u{X5dU%o&NCfa6I0{gtpD5%5lxy80HPZq5YH7EFIW3A z%{xZsRX`{9T^SwpKAQsYvY~-_(CMe#b^r21)r&sjTlNF?G*9{;NuIKKJSQVi48YtW zZUn~r_Vn|LTKtk2Q1&1jpdo#m_qIDA=&`wyM;zWiYO*a zX8g-pSy|bwk(2e7BO!s;R539z0}~T2Mbt$=GXN|t58S(?g!k2VZngwFcXt$y@rnXM zvDhG@&>4_2i=CFi-<-YwUD9q%xyuJ=ywTicbL;~_Z|{K5_w*n^2-pLUeEFu@`yPq_ z=rAKm`^j&eyd8b65>fzjRx$H)=PFui-!!EIXggI;Cd5De!Pfp152+Re>l5!U(}Mf2 zlCb>d%^L-|>;~->0PO$=0;0sZa3ksSm!U6P-i;u(xV&7;2-)290X+0YuS0UL15gX5 z0Eun>8$xHZ>kDb!DZ=n_qkD*qsu=! z=5~p!V_}Pjoi@Lyhyu(cTmdJZQ0zWXSI>>`<<`0p`=+D>&{`=B#q><2r?0Q#y<5U37`EUspE`z*zIq~{e9%Ys5|aFkql}lQtMWj8 zGRHd}{*eqaFE=8ZsPoNu>N1c4i)-GKwMKAa`mv$m0*${O!vf=8&b>PV8+{kO!WAH} zEajJ52=v-`U48~29j?BCY2#O@Fdv%xknMT=^eneosVV1{a`%WdBGJHGMHC*Dc7yg zd8j9k!}4m`eFiM8!hl#gfBdg>$H)Sg)lzl)y5!k_&|dBRQeg6$S>)tXNBjO@dJ2PL zY#ByA@d#Za=`wL@{qG;mUA60wCBfK8zjHpO{T7o2*#K-2%HfZ9fqjJDNH9%aQJ~PJ zz}i(yHcr!cjIl^|VnQr0)%1Zqcn`xBXr`+E|5vkA-Xt#sQ$a#*pEo-f10}xNKbT>m zF7M_i;=spsp%=_n{ya}uVwMpr?#OojmW?me&L+2@AAt>yvP%qPHju8Gn%eU4qn(~W ziB9{FVxv+=RqzMM;NvHVLx~l-diCnG*?P>!GU3Eqx>kgk$B>jdi~*V{NVN)lg&L}M z&XMN8Jl!4A6mGt=_n^y-x-v|6cf1Yu@jBD9fd034wv@S1k{_pOJWYcHUjNvf`s5eJ zlhHc@y^Z-qy2yfr3LcBQfJD>MG@amK$^~w1-Rn?Gj-{8f*bnam9YHTBu#VXwyEog> z8p~5GsdXLb=R>vqa+-v*gDb*oC@F220qmQO+`(^ef!Bxg=g;s&y+FS;_}}+yMYgLa z#)MC@m%{Jehsd$4rYXH#ryH^TjYTBV6zym#c_7|qzp@`AMUxPYDF#gMDNxbb6agTf zEferhes52mzeU#X9{*#1hgomy2Ms27lXZ@Z9T=ypWs=rNWm>) zhhkAiGcT4WyPtV~xH5F7b!F<)o^6b+xDo9dZ4{Gyfe$>>{=4%d4@J}p!(8vsi;I{K zK!prBdBAlvDq16G3|U|cwk_GcYrs>PE5;N$hgVluYXT|G&zPTKoW}T81*@2SAkbaK zGgN@A3|@hUR&0O)y(U10sWXcf?A{U(W_+dsM8Iz~j|sr#q(!#B0c2lT_TRV5^1zFK z%!uQ|{s`RjxjeK)1-;Rv^Z~?H(QtUHffyRpv%cr%wxDX(pOx}UpMfksPa(w~u$lKI zRKT>%or?c-B zogK|3$)A=lWQT<^DNrfUa%7!_-I6L0!s!o`^UTIw%d!a!3TizWP@*HdoczsFTUcD% z{9|#N21R-8;uRZ8>5#!MED_wJBooU!LS`xps?mMFK0Kl?x8_%;2R0a=I=p{tiz*&6 z)+o50q6vx_pok!=0i`ij$TINk6Y*p%>1>sFsvXX_E>FEI>gya)3JD@1XXse|xLqDS z=(HWzAG%wMF*YV-Zbtw$BelI`_|bV%*V9VsdQhq9e48Eey^h9<0gVrc=?Vx~|JFue z^Z7UkJ|F%v%RhJO6!Bs}mY67$K$1jo=aiOGTU8RWmSj2mYyRU6sRuPawYwmRQ}*yQ zP1NykRhjukEUCnbpWfsZ93!%475Vw_Z|OX!ygIbBwB#y!lllU$-+;)i)TZPC_drBr z&YdcdO8FTuV4zt(v>u*>f`$bkfP)bf1MpjXUXFo4u2Jb&K|Pt`$5}x*1_A65;I979 zAwiMCK$%XyO9}=6qPsn^7(>cU-$GpM!RgV3fH`!@*!Zz9{YHV59%le0>j@-af z{mF0taiOdA_+Ph5)&c-=)>T%OZbGTuf;VkB;*?Pds=#BtfFNDjxnBNMQ`^`v+QJMe zib9OW16`Hn+<8N&=;b)4HyeDs0J>m+Jp_~`U@QYyD72Le)O#SA2(h-9xw9|CDf52U z&Jf>OnQX*^PN4${V(|T#`Jb<6g~*s@1hCP%R|a=K38N$8|(wv23mjsb_Lu57{!1cG;1|6 zAtF#~fB%ku0IpPMaB%SN$wn`%J=uHr%_uy!_tPy7dHmg)l?&Z)W zV_1(GDH`WtG1It^^=W+|SIHW%E_1@)Z0ZOoyC0-zU4hp*&f_JOuPSfX2!aj_&{zOa zn%&l)-eu?SRnT)VEzN$JtsWJVZfOGZ%uJ`}9cx(+s12mH(xbJ{TYddOGFdId!Cn|M z9T{-!0ZIag3`}xtWyi}bO`rmk3jtFIkFPCZdJfvT7^r|H;d;cGVqZ{h-mv!eXpltW zhZiTI|EK5bCiL{lSWU-PQ0rdMSq7iFQt1gDPzXWPRR?VSx#FlSAT#`kaqKY@=tyZA zWzDf|V(%I=&(+-V^7Ul`R^<1G^r5Y-^GA-grf+2e=z(iBw+Upqy3et;ETBC{^-t(; zaEt;zGT|7TAVk=nUzp#0KKeV8eKe~*iwt-%kH0^!vrGFTft~U=AOtkZfHsBm4m9!5 zQ+?og`-kW;oHNkvZDuMmi;wQG_V#wku+!k~J>l0H=UOw69>J*wP{=b~O`hL){}MPt zj2Os$Z_1C@j@B~AuL1=V7%QXoyugqGcDH2cu_V~8&%f&cePgF3!TIDuPGX#pbf4`l zpmze77GMJ#md=+1cuHRHLlL0BM)AjwHu<`ZH^X#PCm~A0tQs9Q>^y z&5UPlHY<-nMURi%7uH#n>#jIiORo`yLxINo{Qfuc*{tMx7k(0fh}1_p_07ayU!B zsk-;YT7;9Pmd$(WJe({Iuv_LLBILOAY{Kiy2M31*Ec7T#?zV!}-ux^~CR)17V5H3-Ci z$tWC4`B45)l|pc9AE*Q09*UfARK4p|)B9iCQSYpRH#?Zg6!$ath+$!l|EGT=Ffee$ z-emxd1Qx_QyfYYY3e#w#G4dR2Y=QQko+3fpi-U{66meT!S~^IAc5esK85$;kf0)Bh zb$E0HES!|%>?oA9gaYVq5gDrwy}A?FEP3ZnfD~W?T%r56M6Q!TuH=~7Kyg@_@g>0tJ2|V zkRtI`m3vBKk9X&W9}OD|rCvztx{#ns;QJVZvg7)bM!h<$q8BX8me3NoIFM@%cJ_7H z@f=qyY_X}L6zKiw0YxT)dEl^Ql{(d>5PYWO7S{KU0G}E*%FxD_z1Ap5wmv%~tXBz^ z5`htvW`lm;wgc;VpiYKE_r%pb`bN%8k+UG0ebCb{x1CED@_s5KMKoV}tp3TRnAq6! zu0snUg16@K%2=)Z(Kw++96m!J9{-WZhHYdss07UX>Uc&$9SsL+#redkqEie&(@u_2 zX|9D35PYTUQuyP6h62j0_UjbqbYRE>eFp3xcts;0MA?sVxuow7eSdY07&sG7@m?Vs zwtYM&f12+NbRcus3dp zVQUTw-GJlGF5#TWs~>zlF2gEq;7^N7(ocS0lMkTl^2qgd+YW3-YXkT2B4{fE1odX7 z0myYGf_5PBfGXD9yp@m`*etg>`XDJ}4jl9M@HfE+^Qrg4HYmb2D)RU*7CJLAsKkL@ zxTm5L06lD_kc+uHczO=`<_(gviM1+%8eMDvZ%6NX{Qf^3ze`Kbpxw{*(IYBA97M3G z2p*yy!~7>Y`Qwdm%ayHb-tTWg!SQ+MSURqIe6PMMIn}I+i;Kqq*8td2ps(k{Bn%{& zbNjbq83>c0>sHfB2XPA!1d4T#wYRd5CKnQMQjj;LS6a5kpSd--MJ`p&zaG(k^!YvT z4U?YT)*?u}FN?XfXy9ca=>Tm|QQ$S`L@_RTeG&7MPHul@$uTS7D#?vhOGbz@c%zLC z%iOw|;Kpvt^5-Vz+clB2o>>ba381mDumvlL(hLR%f;9I(m5k?H91M_d;RXdqmwyIS zU4Wrp@KFL5Y9Ry+f6!yyFN*Xc#ksI|HSYpsm~eB5gADsGgLqshBO)Tw1pFs_XlqzF z7xwDGJGBCHMbVqLkob`mYkr2r$(Iyi2Wsiy@4_@4S%P` z6|!AKJl$<*066Qk-$~T}D^MjsZ^Pxwmw^o8qzMBH2$Td1Aqu?M5_AphxqRsMpjsH! z@{9%>jk$5y=|Wf*d?V5=WZB&90!B^?(O738L^Kk3?fNG`?wbcY=ozY528v-P=((u^ zg^Mh)eQnM4@$_d_W+4mQV7{8i+T-y>1`l;&6ceRDiS%!u_ zg0D4RgC2>yetr$-sN#5}+?<(FJaG;M0y$3kk*KKXWnjq%HR~52w}Q6T_N`-l*sf#P zZeO=>>!j=TCnS)lv~+hyq3L*yz2+Uxq;-4Kk@|O_7Cr|G6zI}fTU$%{#0tE35MTh8 z(8uL``V`c5d*1T^G&OX!>;VYXdf2=kvOcu9=)`0M8=$u+BEAHbJs432r_Z{Uq!H%b+8Ay(bWl76HRP=z)E%3*W~02 zTwNZWsV&AR&L$BbUOti{hYSfmb3+B1 zok^kF`OcPvE)~7EB?bbuF}6LR-OW>s4HV6Xe^N{m{=9T$QMJN-x0X+fFK*k46iFX_&@~tZS-$#aoKK=4LBx#nW`$3w+Q>YR1ZAr@8@c6KUUCHSdKv=%$BEg$gj_r+LRjzc*? zvKLK1#9_t^iYTLzE1_#0FdIxRsx{=ucW_~=IvUdk#BWuB*F(!YO)yPXHZNh06czo* zot1|lYflVkrC<|EvG#T;HrJu`&AG1Tt|Tsbgne!M*nlF7MEX@ycKX0PN}lACZr2@5W96FxU#RWZ%W7Oow6l=){nf$ z+slt0z(ESWc_~KkkEGDhzeIANAeNSx#SBjm`@Xwi5>ol#^z`#qn%=DVEY;!dE<@-> zY~MZb9gf<<`!G~lrkWW^PEt~m&f0jL%h39susMuBUgVCPoLt-urfxHZ*YCR7@Ole* z1V{>hf8PD3!(f3fjK8ww@UK&@E{o;&OF;A*1iS3RVC1x};R{(*T(%%{f1pRg9d>p^ z)XBc%_2+3GKXZy#EqDcu9bUhWh-aZ}#_azINuXWXaS3E;K>>-Jvgrq-U2>h^L{ABJ z3vswo;Ly*%jMX}Z?H7d|7RdwV5@3@2w1Uh%5`2H|5*-aBlJ z^>01nbTcya`3K^icnVP5Tq=N&npL}}5}{Z1Q%gGyA&IL35FmO+{(p;$`fee&e8a-R zuA>lN7yhxMtMnZ#Tl_bFCAI97yM>(Soc`8He5Ze%b%e5s-GVMyZH62^^>Ki=NZn-c z`O^-&Nf3>Z083BD#l?+-2(#>Ss1+M&h1;-=FcsZ6<^ZaPYp@f86*7g_-7JJ$u&w`# z$iWoeizB8KlA>lZTA`qJ3DS@Kbhh^E|NabJKR#30v`k~Wo<9V>Knba<+*7W=*hKt) D>kc!P diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023.png deleted file mode 100644 index f647a357b2e8cd060fdef437c2379345ee5c6db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6167 zcmWkycRbW@9RD7NBjaRr>9Ue8U3LiB>k1*q*?X07_U7V@&WcJ#C1m`RT?*M*ol#v< zM(C349V+~uyuNo|e|+!xKF{a*yw`Kf#8{t$O@Ix8AP$^?jv2Uk)k25OgdTr=w{e_F&mA(%W_<_i%D&B0SPwQ03R|@iXFQap==EMMlCmp(~o- zxITA=G?(MAX`C|;DdCeyrgTbZ@EDDVb>WtfQ=)b7Q zrQCHFLBZjNjn(zBsjGtnpN${PZA%>BP7Mw;%FX4k{+V2Tu&Oe3krC^1oJ#1C&8|(o z!F_jxVSq&o!9ikqY{FY&b$&R3gcOC|!QhZIREnXzwK+G^NsxsLlh>dI=oL%500h?% zXlI2E8K+$+MPiF$wkR@^?R4%cj3`Gkf;=HBNE?dbn7%+MDy_`&$HgPRiIM-NBC}3! zYKxNDk7^wxAV26KoStPL#~goztb2sqxS`eeouTf;E~CgBmlp$9ILXL7kb~}gK-RJ|l5d~rR}F0~^_sipo{HRH7ZKAy zH0EuLAw*)YAm$wmr0qs=wFI#`tfgW<`F2~|^-f8K>>-#t$IBz_ifKDyxX!gTX>)vn zFoM`T2`(f#+z)-S{Va5q;b$r4a%1O4B24wj^djVq_vxDr$a(NUN8(;wsn@g;r;(A- zT13n2{TQ}s1xk^brP-(M&g%?h2n~t{HB}W?S94vvc8zb;AI(xdn)3U1L~;>=l6R_s z-BFRWdX4u&0MmCkX&bUcr9(6p(uD7obk<~9|j%Ol%T1#BY z5)-+1S%jDExDXwh&_wJp>Y7^mEm=brJkwV&n_7*woRol1DfiEP(7^I*%jW91xSXwSUu<3W*@UUs{-s?Wt{}Y_(w99cqK`AdUZ^`#%exMTi0fzEm(B0)o zLYxFHOIA*<*tOou&C?STyY=(^aU+^5wDGCZX2ex?k2E~@hnrd#)rgjplT!-(!S3$v z4z+Jxp4|{|&B@D?I0Kom@o_L%vpr2B#WJkLtw)4~p`xRs`7X;p8diM28K&xa{W?RJ zbf0_uZMWl)2JN}AskxNM_q(+DXS3m7snV%wMVM@Gm3r}?u6{h4xI*g@q!URf;An!EXx!(Me!=ckcwVwO^+c z^+@T)-evn!`z7QoQ{kTE`OdOe}_kMIV3IEihu&@xOR=|a&#<^Jul)M?p zOW}Syw~5~>sgR&_i))_w!S5k0C3lXzZ& zx!i4sH)7B=y-l4J#vP685LWQ}nmRUS{c3XMocJ`h(6Ro@^m^Fz=H6{XaTz70WCE7i zly@eixx;?~O+Qf`Y^PsKz@8y7YOGOMqhU395Fcoxywbr&`UN9xg?!yYlXeQ{hTw zb7IdjnDAccWi-el2PvnSV95D?t;Y*ZJT(;~FKE)_wF;47(&FOc#I2vEZ=7Xz_hXWa zJncRDtaTyBFN_c*!LN@>{BI4)HDs>C(tA$$y{W)Im2m%ig^5>J1jX(=-r)0db+tG1 zl>Wb^ZbzI;w!Y+~P(Ul=K!L=Hy?5A7X2;&=g;g*okjf{<_+rN}WV3Y}>HAAjjrO)NV$ zqA7c8|IbdB?@RiRe7`CK;fGI`oo6=ph<}z}(&-uMJpjF(Gt!=U3UXw(8tWaX!Yq%! zT^J%|v7m&6^Z`;rmOlIU_pp#|-h_P*xR{!eaVpnPvT4~2tf3}&(cfs;1`V9!F|D_7dRL zy-A(z3?8*ha+FRs5Q{4<760tr5FTNR1|(dlokaY*>;H!CkD)NwjT%{g9UG&7hctvq zzkY?l<23{8EIINA6K(uj_%2<#)Hk;|yO}zndnD|*Q@BQ@*Vq*R{fwqb-;WT7@Jq=c=kI3U9y#uu8TB24!Vs_Ud&zO3?vb zYdg5nDconWW#{X7kMzL98Ddzv%1JN*0Fw8gJ|%woWC3Xa(GW&}dZK%8x>=d_<&ut{>b;7PITj;tq%E3B!cagjf}a_b(UbzdBQO-L zz`)H1YT&Mf*2D7056>|g(XIuaZv0)N%(hl-*WA$IUXMqq->1&duBs={=HVjnGglwI z$(8c}Wa*j5tZVwC>y@^T!U;Wn{SJS$svrO^1Q?^IxA*<{c%-oiGYiWtD3lfTgSmno;NjuXI16t; zTO1{Q3s-v{y!fg5UKml^KxAISuQQ23ik@sHsXD30FdM zf<4=fQqw6meL|ZLPq;0{T4wxE%g89ri;zzLvE{aZC*y>L3x+LUeY=j*lQFn``5wiGikl8n z&NMEY`%VwG>wWVE4hpyw(rlI9VB#>lFT)-Wa9mz-z4b@9AZHR|oG{8a#vbU+#0kIG zGp~hx>_iB<(A)W-PdcKR;}s{staMDt!U#tcAn*d3aJ!WhC~j%lu%xtrSj`u2pf`I_ zv;3D%J>${kM)zvs@qy0at*xGUdW9zCV%3Sc8<+wT-tw~~ytuOI@td$=lwbwz4X-YK ztITVxDAmu_1^FDE7^*a7-LtgX7VyG5g^Y*SD9X#*syoE@(q%Xtd_Qj%MoF4*7C*N| zk}u9XWxLG~l?D#psz-`M4~-V|2ChUuu5Ua1Fj^qRoz2}&Uw@WYU07P$6Evtd(UMbQ zuDw31Cr;KF4F)!@c~VUZHsPxXENQ71Uy4e~JPoD%_76>-Bd_$K+lKHp?t7#43pDH2Ap#}#4N+1aPtZ!)4#C7Q1Pk;7 zXbkujFv-*5tdjd>$ zV2FbeylYo)X5sC<5}&lh`#`*E#+QNC+1wR%-zE-nlQ@#P=CExtso#i7fKsiktqm1@ zP^A+nN|6Q<9uyo5Q#vt4txGi!W4KRE03737o4ma^dI~5bP>(DzCtxWQ@;NFiE8od; zEH5ulD-At^VOFWac|{mPy*me>D|w@MEEP}#y0@^T#O=NA+4_i@AVf`3V9yNkf#Si1 zY_~i8VqmF&@tkW>L3Y&y4s$%8UZq}3jLKXKJtTn8c~Toqn8mRlgvzRpu2L#9`#?4YzasNyuA)9h6CQY zys|Q3bg}XkkD~8H@{1dz44BHdm9~vXD=I8fN8*GZmy|H66%5-RH!LwT!H=Y(78Vu& zhYT(VoAR1EIArJ&BRE09m$^xex5we9<8?*3fyEIi7(P`ntex#9=R>W-!Zk^gz79Vj z)_3xDrf%L#d-i@2#z^IZXSK z7Y7zJ8_bx`A%t6gjoknN@?!pM)oG;G$5H!8ABa>^R$#3OZGWzH@xo;p+q~P!x+#V$ z%Q&f$&Fnaz=7>jR38K*x9;Q=Q80y=mHX3i^;RefJTOvWWI2^%E-#_C1FCnqNUasfP(yY;)RW?{*tUhAU{vC+pwTyaZT zE!M(hOm*AAZ%HHCw^u#GtWP}iR(>uoM~ff5^*1dcz!tAl{9aK-MWwBJ@wXQi#z4qT z5^t)~7mC@PxesXW82?*;D-DEqNXd5iDQltilp>ad{OPh}c71_klX2MK`K_s=)F%7Wz8 z`ThHoT3?xMs>8uXfkX86NEd;jK9(_iw4_)}n_eBW{j~aP1w0+AlnMvr~V6C`zgCZ_%n5m6%gp z4g(0wFm}VXe_YZ`Z&w-RD*${~mZY6jNi^f=7O-gruLF7xbWJulH9TaMkNY4; z7XhOJM$<-;yR$QB#$|G^eJ7h1<#GoyyOOxBLWHonKKvUq6az#m#Z)X8XQ=)D(UW#U z$i?bc+}jeMv_F4hDBa(f?z!3_QdOofGR+3JX=PVetzY_1a>2HWm&o!@9rq0@;8Vk~ z2b<>sKm1;CPIUlKZ?Jzap9To;XOpilXAAIne89GKIM#IT_RNfI_J{u6UB77a9x?%o zA7w<===iplXp!0{L#Osb<&7+tCdw6_-wabtSKpt%%J&EI%G2}lIWKH~nOO;Ql}`8PZiCn-~CrKf6&?06%HsXuqsWj7%=5v)F$^O!3?3z zKl>ZN*t^}T0;3WQ&F_;F96MxwOzjPYj{SJb<>~FMqbk^YrXVWryiG$6k0kK0{&c;i zFZC?zVH3}~MuVfjJq-OCPTw3>KePr%E;Y5a>qS~`ycJU9Jce!uDM!1GRN&Rs0=^sk z%C_+hN3`$vTqrIs2BtNTGsm!u2F%FJn(YPtlC$Dc`2~Qh8F-)c#6n z()iezA%oaa)=l(ufU9h7cpy(+shj%mpT$C}6ODmfBpB9%;oRf1l&rA^pYf1HCkf*r z>CQHAuyC==@5^#X)bIH+LUYJ@S1V&x;5pTmqIQXXp`kl{phSD=MVO?l{wI-9QK~t{ zW!>Ohz$*J+M9I$P2N`Q%U|{-Pp?0!f@j_ppfuF>^2&>WU*r@NB`d?R9Rup=8M5(eM z!`5md$aOua&4`QXI^4YPrZ#0pDyn2!A{%ZD2rg2V@9c$cFil!8uXO} zs2iYRu4`uP*p1Pu$@V($1PdyM9cMcI-+70DnC$b&ot4!~Af>aw459Wvt8LZ6p`is| zTBHBO!ou3h$~@l91|&52O$q)2WilMli1n#JeU~|Z_Xs%)6-M0Jvu6k2|-6pv%ZM{1QEz}Ur zyQchmPsU!5ky#Jlo1+T;22xPa(>SNjPOaPCnTkDZh-cwC_|v@F8VQ1(hgOzY_wJ)8 zHHXx0=Ub=r)3*S;zNtHe%_LM;+qXnq8alZ5H>)cvS(mB-Bd)0m#caLTw_N#LTm1CJ zi|s4+)i0yHy;BQLF3y6kE^TXT^H}}bqVEv1H>+lqO^4iT)?O{__Fs(&SRHz(;!w$X zfkW(0KUaQUo*<0)Lv`aK4DQ#m{i$i(x49BDjL39I^TUdYg)iPA$^vQPhr7M%=_}y0 zgQ0{{fX!b0eS|sTgZgziO#Vn*O;de+pq+=uoU$g;g3LzE~l@(yR4I(fglH0|%iUq9R@2@($dvg1n?sMix%hg5kM)3(c_s z0d+eaEJ72Br-`mq*(!8cMsMIGi%`^>xx_tzoQKbGjEszvQ@=mGT+!%Ha0nz^ztet> zgI^`T@|_oMwx=GOh<2G-vD@^>KI=Gysd9d~(?`lP0EhYz MPS;qcO3N|se`%qMCjbBd diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00023@2x.png deleted file mode 100644 index 8cf331454cc2bc462a657ec7b69b324357f2876a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14723 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 D>kc!P diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024.png deleted file mode 100644 index f647a357b2e8cd060fdef437c2379345ee5c6db7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6167 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 MPS;qcO3N|se`%qMCjbBd diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00024@2x.png deleted file mode 100644 index 8cf331454cc2bc462a657ec7b69b324357f2876a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14723 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 D>kc!P diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025.png deleted file mode 100644 index ae9ef3affc2f9a48bf04e0377d2b0c2122b463fe..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6110 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00025@2x.png deleted file mode 100644 index d243438737b81b6316ebfd2307235460facc92cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14744 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 IM%O*z{|RS+_W%F@ diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00026@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00026@2x.png deleted file mode 100644 index 908fed09b49973f8ee06b0143c583870df4fa916..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14833 zcmajGcQ}>*{|A0sbsW-Bltgw3q0EpKvRC%V2-#$39=mLMN5~G@dnKHbq?475$V#^C zJ%3N1@AbQWfBsyri=!^*zVFxTIUeJAUZ|@+IESW1BM5R%L0(1^K?vX_@)~spzLW6^ z9l{S%XL)^B_<8z21O&p&o09N?)mux??Y@hpnVXXff}oOJl{?fFwVjnY6>e!dt0*a{ zaNj(GNO_;>vh}8JLl8zpK}Jf;>&?F=A7{EjzuAL->C5x!J6CZC;~L}53%-jgaxoTc zm5-Aay3fHr=%3RKl+U!>!s+C6; zugV(SbI^Rdi;%{BKDfK$xwAR-TY@(K7at8mgkh9a4k*k!^E!EXzR%UaWkd9IF_=F7 z|NU~sx7u%${N}(&dm+pS1s0w8m6!b2@1o%`jI<2mh=^eCV1==c2nE81=p(M=tyDt) zn4O;5lav#OUM1frV0wc*Py#){ zf>4-Ctr4;#Uy;{D&IGud$Sk7FN1kK<$#T4M2%SkGEsx-Wkz;zSC{j&;`b2Y7@*fg~ zQ%5!sab%Sit3=*9C-g66Da&(?A!)=iZymEP*NHfXAIhveT7Mvl|Od-DsCaQRePk6B?#N%B4 z{$1<|87`J4>}J_G^{~AUim8rL`q)WYJ_wWjvgRRM$h(lZ9a5&)3)0JsAt9tpcJn!Y~Of9}iS-Vx-0Ilb-}ecYec2XOq$2Zla*?iI77*i^Z(#hQysk zF@5ZGT(r86nnW?(mi{_R%Jh(ouyO1!DH8)*n8e2~RyHUmRr9EyELVFdZ{A`08vr+v zf^oTgn=a}W2~!ALShnAD%zA6+LFF};W6h`w()&VZrN5RrY~LID=A7zBkouj8#_qdPSEqo={Q@m%@r>|18)soU3^4&+d*JM| z=h>(j!+r-hWG-ZKUYvMBmz3$`2KIKC+25lRH4;Q~ma5j4! zE9o!$fe$BK_)nA0xM>$AItmsV@*vBr`?^C7(Y$e%J1+L%}e;`n24Nhb0;M3B66W_ zzmkb5B$!fZ4TUucq*Usqipb71;?B|IVt(0?sl^c(*G7=^N|7WY8wWSCvcuy(PC|o^ zXgB+8J@m7;5{*dGd_nzo-nibfbmmQJ`taI-j zV|cf6;!78M_|H{xoj%AbMJ5a?v$652YW_uv2Ys9x*N_uRoH5d@jCvMr_Ij^|-=0se z{9O=od;!-IZZ^8wNoUBN6t9>Yho4q2(8{zi=sX~A#bPSwgnHcR8;mH#GtT!~yWQl( zk(n}JuOY#9w!a1Q*r<_)o@3jhEHZQL8B;37&js2)j%y~w9{(X$aofldhp_&EN)+v^E13Ig; znZ8y=NoOG~<1KHfokg+m>})l>AT(i2A#q1~c}EGXS(*i0HerG(NdqlHw{Hi^ zFb8&ZsS*>1-iyOlhvSe4o8S(W({sy5b1{%a1r`>nQ<3!Bx=SWb zOMJJgdXVnFKkp>5_xELRffl-)9jP1Xq!)I^3Gnhxyl69rl=@@DefdTNGpzQfbT?3h zD{dlp^ZPmoBx?+`i~0*W@Riwxg&YbAunY>cek$f>U%x>5%-OlzZSqs7VuR76w@3`V z=$GiIsNb_&-X~S;5u*^EV%@=0^=z+Fx$yF=7ibt5Of(AyVwX3MHQ12MnL{lNizUnWoDs9ScXW(xpCT1bQ;lUr zU5l9_PPDwcZ%PyP7?ytG6aBbZkbvUxHFbJc`cVf~(DsN)=O}XYct~_Szf{qnVviuy)|Pq|2+hFq%Dfvb)E(HglsqX6@kYgGBYNDAZys!9Me6Ka`3MzF z5y6ebdkT@gg=h%>hJK8;c9zXBGg)T5WZw?0*}r<7iy0|PH=g z)4D84EI7?HRFSCo*K!*KVd^?X+Ei!~VLA#|?+KTN?>D87tefAogle9o=h?i|N{mkX zV=Bzyz*SvHi0JSpYik=<6W1GA(B?KjE-Z|2X|PY(?YE`&Z()FfH|b21rH+c1C(cs0 z7BKs4cq!4cQ$w7FocY2F#+Mz8P~%fOnPH`=w$8hynEiAsL^9<%45&XU`Xjc_=H55| zw@yW{OUhJgDDcgN#af#r(=@r3kNojIfzIP&Lla#pl2?jtM%kL$)NrLn&lNczA5qxh zPm`;+_(_V>RAA#KH)30=2+DzJU(HuaPX#mD`@chu$IkEYFb1LTC>#@8{zMI!X9 zUZUHdLb&2N5Yx5&8ZJEhD@FDsyt+0uJw5&0!onSraS>fdOBs#NU1_2!xv%9}dHMK) z_x7IkJ@~Wb%@i@{zUk6@xezr+WqQTeTD;dzsizRl7-{K(oSv!ZL%%0lR3uRNpmk5X zT={5<@$>VWo1d2wyJpfEmYEnd`^?SLGd050+??>@#fvl7xylCZRLP2WKKP?0$BT4| zI7_IC1x8kDbD^!Z@=}{y{9&@5Ah)17!-X%MBg$0r4wWW=H>L zwq0NGhqr}-961cEY8X+H%ptrU{FzdmoY-eHSy_?ZXeMH@?!hIZat{t|?fC9l4K7-? z`R#ur;Y~g}=CfUCBf~`jRj4z;C}P6rGR*ZZ(`Y$4xj4n#Om_64zl3m%UA+JeF58IE z-I>>1Qjf-m)*xL+2XWQ2N-gS}H=-hyr}u+RfSk-`|1xqryJ|*GPCn#%bnf%Y&eYd<7U#xM8ag@|kuI}%RJ^TE*GFy&_)k%QQsl2`azXR`1odzRUkY* zDOV06qrvYjyj4KaG*lQN;ncnAc+=q5C4o<8MS+$>7se1xWAZ_lw+{+uPY%983VRD3etFKGt&~^D6qWa0!>Noy{Hr z>H5q55=171epJ{>E@fDN*D2jUR7TtgAFkXtBTy9*E zQ&T(tZTilSc{jd5NxCRMMnSUbN|HF@xS;s1_h&@biwYy4G90e+oUAAE9h5-)(%ti> zqHDk9GUM?1sbMH!;@@zG@3c5(^0KM95CYr}n->OgB~uHd#3&|-Kn=Q(iVtCs^2%yz zkDZ+{4`S#(mKrw>Z28#Src~(zh_yH>pcwPCNQ&=fZwLo@>uZORcZ>xU6}LYe?=M0< z+5LP&JP^KemmgojIo%=Om^#-GXBekbiy)@NVG7pV>`$unzjt;9n$ggS`|gH?X6T&D zCcSN)r9rCzoES>!pEY6Wthi*eaH}qxJE6OIuzQ959P4`@8tPiKIFkSU|@Vn>EHI*0B8x3&XQxGM&3H@lGRa`lp@znUx#qx zP@BnVX`$Kda5i@7WEahUQggjhe4U>D(IiowZ-)Uikw4949qdVM7EC%*W zCP$;XriO_M{c&;Y)6^RO)Zbxe6cdzEtHkk*+3uKM1S_LMLFG;)WBhoRaD zwQ*zyWx$_7(H0u_y$BFiovO_~RUm0n)1l9uzOc~T!{ZWm(rsye{&uUsuD;o?klAOy z{SW@lI0;Kg#4ax{%k@!=oHfnrr^eA?$xVv`^80L@>B9B6Y8U>}^Y^XH&9Oru^9l-v z{raU3q$h7@Mwo&NKcI!na<$Ud?rh)OF`rR;YTs{QM#CHhg_6w!?w~0@{7Gin&2#m$@f~YwU&^TyH>e@0|Z+o7G5i ziF*!-qqS zo;)I=qD-hyVfsY;#NM{H=p-H!IgVEV$Ao^@78Kls20%<0nDXaF61VZ4k%5sBve@>j zh1zFg*C5j%s?9t+YQ?)v(HYXPE^YZfG z#GY=>X%GiX@jV!w#wV>!hBH8o>5odFDoR!keQrkc*X1rOzOgj)3&7^Nn!9a0{(;a) zvRhhOu7{6#OOZJkHF;CRIXgEP341KjNN4rDuPgZ<5&ksqCY@;cM%0r6N)r(g5%ip* z^azq*slOY~_%wO1#r7>$(qr8r2<4wt{ertBO|+zpY)cU=5>RRV{hO}q&D~%(k#ka* zp20x~0G&Rw^K`;kpojoQXqhs5jO|nMl4tn*{Ge>FdC{$T{nkRN4-;7xgguw(ph7{V z$DoJ@Ixhh3hC8^-^XM}~k5~EwD9RA7f*%}!c_gr!xw%n6H+v9!P1ewGq>zd(?Td=4 zDs!^3fhWZb%4uropId)4Xq| zSQ@kvAQ>N@8g&}f_baIm;umMTp(ew{)6&wQiOpPKN^{lapf+msI7i-UYHEu3x15B% zLYRp6e6PWIei|Bjom}bDG$NNoCMqfl2ts)>|DUTc9UR&2YU}x@f4@?GHm}gWNl-RO z)-oPzFBl28KriZnHG9pK*g?=6QC&@VTJGz4{MRCXb^C8uwOR8o*vWaJnBee)eYUw= z8t8sI*6IHSnZwk=;{?rGBh-dUhUhc;EIfo zrvzXOEjd%4trqsGm&!k-XdKj;G}Xs$Zf?dSf{?n+&EmVh%_$!G)QTc$Um9Fzoe%!i zvCvTnl}tb%(Ald z22fN1Lgol&t0zyMuKke(4XWOV8?uKxUjN=-+?GZ{X>uRvR=B5h{3=A<8}ML&AO&Is zi&~@8cNY4KAQGWLcc)zZPd*_8%Bi`91#vbz)XbmN4$jWbqa(n+zt{HHMWzcSEC2Zv zN>)D=BdU`-0sN$Umaha0MTj3?xoyQrR`TJBJTd0m>_)#e|FBl6mr9@WzhMEW>mY5_ zjW~z{7mjFShEU^I;aemle0Mu=k)%x|TSKZMCIn(r2f0O~$ho3PB6Dw)g@xsmp}yiR zdNAmInx=q2gBWqAHx)e~I`p-6P3*iB#&-FZw)9UzeWuBF=6C(T^I)x)dlC)wd_yym zV-GeYPB!jei)|nOPS9a-!PV6jQGdK2nT<-H1zMQN9&tCNKQ>0`RduEK+}9`f9ssV$ z)x1sem4jV}Qzn5GDo$$XUETXopuT@6x6m)Gu(cLmm#dA=)2gfO92QT)TXMW}^LFxwm*>A?;V%A7@@AM9TgSz8Xu}9Z0##r zVohWkZ(7XnRMQoIl~jp4iEr@tBE7BKBbB6)>o;ydVo!K9rh24kOs1r#mulE*RdiH- zn1t>Wwh&uU%ahUl*xsHT7?ZY?I#4G-n3uVY-dR=YpEd(+YV3LJ>WzT)8}}e#maQl< zS*W`=^04ZYp2BoiBonzaZJnk9870!vMd-nd?v$!H^oznmNE%Q9g4?HT7JLdGj7>WK ztnQq53z`zPxN}9TsQ;YPRpcRQPtPB35?!uK&>b-^WKxbDhx69f)_&+VuTx)+G7c29 z?!1W*<;YO^ZwLi!NQIfb;q<+RoN^MyTywPCQ3AC+(U+gvHE_Wir5xmrNKhdkGZ|b zwrrcQ!S14xAnBa>cdd?W)&h_17-O_6Zj%$~CpvkL(B8Z&h53$>mDNw<>7L!7tQ$GU zr58}tyz8LI$$>~9?HAR=ZZo2!P590N2ewYBwYI3{)>cTcSl+kuurP{{>*5n>EBF5* zl45X+Kt$6(qJ;`{HzRJIn}=Erqo=7<_K1`{!d%DF_EP#R{duufNgnbOwTG(XI+@he zk{INg@9M|c9EFGF>gN|nU22AwI6 zY9DSc=@Bd>7LGA|Nr+&5mK$b|LnTtjS1USg1W0fM&MPBzYR}uuTYfJ=gp(E)4se z@BACNfjH;5(@zLgrx30ZI*YA;Ww|HTEtK{r37w!Vxj+&)vt!3fBgD+L*+?a8!_K(LzIs+=_G`zF{i|UB3})j>`T|8@>lDv0^`n9@9EMzTGzxqVo{(N9s?G z4_1sirT8ly3n=5bTY9^HKUY^@2n9qHM(H1&I7l<&9fdO(wi^9emF$qCH)829Zcu)> zUCV%!uE7?dSdbbxNm*K>3Ab1falV-ow z)g(9WQ#GPf=DaXccZsW|iDBEtROu#i4ZGTN|NNe>`1r?uI=zgh+ISLEfp{kw$zr|k z`!DVIug;F!e=&aFlKH4WqgHXGcumK`x9;7f;y{)+;$Onl zrbAMf>|nUy-!~dz*Y@LV$}q|MG@H95K(?I>{{?EjULXlUlWt{}3F!o8Dw*O*NmZ() z${O^^u;@M=yQ^4PfSsdS2B&`tR@Se}&M!^NS0A4Z{&-Y$@3kXhu3ww?_OhS)gA{G` zfrZ>sp|<&8N0Gu4`zCCU#Z{25Z!#dGh|JEcQ(LXR5OMFKanX6?-8_+Fbv;YDHWhLf z_iO@3ph49(R`UisQ<&dX=>1TiN|tZ2Q?og!Up;_sH2H~NK*1>XqiOl|nua_Z`Rgxf zXld_oQt7XGiLD+SMGnhlkVw@RI21YMxC>3#@(Bq^!@CikrFf3Kv0lSw>ezg^h=^|$ zsI}=O8o&H?nf%PDLf>JLS!k=Gj-kGgKC7EnVRg5daCyz^Qs?|tQVDz|&=RWzO<4_I zF|nx0Ni)}xlEK9`91ijJ_C{z%EbnK^55$f5yfX(cfHrpl>`#Nq(lH zJk=o{tH-$#BF$7KO)+ZgGx>=G80EtrAl+xqp0!Kx-97RL=(-`MV`s`YVx=N=J%X7z z{_A@xs+!Hv#7Ag*YLW?JY*$y;Q1lyC(9EgO$rUI3a*qbxf%t%jBHI_-kCJD(nA+7k zGBN@@C6Ox5wg#O(YqM>*K?m&u6rXFcXOE7KPJugsyexIe0=FjR^pSspO4$xIwY?=R zlg_(godJqs*YaPPq<%YFVQh1g1VettNuB`8uO8PK(1JXaMTEBYd_fzT`Oowg%VU;U zp<5O7@pL zW}%H{rlUx`>PRKq0HIW8tEC;ooV z$)_UV#Q$9(8k9y*1_uWRo%wUoG5bXCF3c@0{VuO<7+p>o)YcZLLp6>%K2#{ak=Wex zLmaE44+sM3-k97HVY-EgNJuz|^a;nbf*tUG($9BednA!O&*m>xPRzY9v+^h1*Q)F4 zgy`r=nc&gEwcvf=s*rH1w6I460o(+>0|t={GXY}7eSAurFGWIAN(~j6S`$WE8G6PX zzdoqY<3A!B9UZ;;qt?3(uz8jZEwDpC|G*3!cXtZge_VF_o#RE;$AQL@ATd(|0_&Vq zXz=gAP~=lH2I=L;JU^%pRvvB(HF+Dq<@7=&HK;Jsr#H7WR6)dbGoq#!L9RSGodv+B zY&;baniZz_pZxpw`kz=#5D-crZLAka`8=|~&7-3LCQWqz{(WH(q~56J+x$>Uu;4&& zdX9?=3(|LzWdJvgBz9N~lsJfbE*F!QW^ef6)XRVF)l=&2OBd;VJO?ogTH}DLVWihDq}K^rz%=HKIU<2F+5t;Y2qwm#5l|)wGEJ7=@Iovmd^ms-L;| ztt>%03kzJur6CHoV}9PI>bn5_t;M>Jgo6*{p?*+=SNQBWg1QknRiCo!pWjDXHW=wF z{9#FsLHc>}LL{0#IwN1{HK^Xjzm@u4@XVSev63b$pZPy67FaXQ)vJwJwHo2qO_ej= zxxDWs%L9sF*7>KucOrYn>HsUhy0}Iv`LW0aW4S z?p05Dy19X0cWW5my&(n(9rV%k;Z*Nd@!i65ELt`5innB3_`i^J?^8$OAj;3|1+cEYpTOf+ln}SJd;^(R60c# zkTD!ZHiWh>c~tWhgG7}s-oaN2sSv35i9oHix@-JCr-I1s*uHa4X@|O4w+Al=1PQzs zSSY4E^Qzit)!W4mIoke$jSlZi``*mkjr3NlSW}Z^5>8Odc8~^@-~44dFXnqMSicti z)BM-ce21+%6$AYT=BUFbp|8dsAfJn)t zoLZ7BlMu_QP)lM;l$pmf^bmU~6OA+&Ioek7e73SPohK{exm_I%*HkCK0?N+nY{sOP z1m^N+32sRXChKS*mWbC>v{0%2|9h1!Z8^}*vJqC~?{tz$dLMtM2XU=%O5XG%|GnwE zG`Eo-Rwmt6KRD2mM2sd4F1ZFAuecqy+lK79b2aCGyyDa?L@b7ikX!c&5D4z^u_dyK zUq)PhndJqSD@g#(#F1ciP5icQNz3E&0v+8^Oy7#in)e4jwcKjq`rsbiImmDpdlWDK z*?s;;Zhq6FmH5tP#?(}`3O%t#r}5?o4-2$NaI)~6iBd#yVEzrm6;&NiuTP;{YIHYQ zF_#~CR$aeJ1TYR^Btm$acmIsQ-Rtg`cWz7fRUbz3G|SJPB&#&Nz9n6B6MF%>&etu* z$0sU!P}SK?lbVWOT3YH(e>RhRg~skA_m%iK8bE3f@*SAkQRDd0^3Kv|U`cSE&94>z zoyKv_B)kar+0cvxcEE*DQy8gh7sel7&JJ9%;1ML%Hs*Ao*>ZGoC!mo2I)-W8^JpZQ^^RyhE93G9I9HFqRECU2(gfZ|BmVc4(d*vCvbu7SHf)O z&EpLT40iuZl&ZSKY)NzGf3qmgbZ0fFt`1yh4Pggfxw}sUBt^Qxh?}tf%>DThJ!?xc zgf}sWUsmG-5cR2@@qhpj=2n7BXq;$6Fk1if2H$Gl1m4aBQx*T4(nxL7wmu4k0s>_O z%9|1Q6CHC+?S2DYsf?5q@2wX%(!I7plVw95A`z*h110iBoQNqC+s_)iK`;HpvN88T zV@go&8k31gnXGOuD&`U@Brqx@=+i1ET2@^`ZUxHP&DDrha^!+bNJWc;0ykv~gm%2|{s7f?1 zo8F!KfjQaiQ{w~Odfa!ZqTM%3eXco-VZi-ieL=FKXh{vlHKdAzf<75KfLFSZXf1x) zpt5?~BQ)mE|2b+A=Jwy;YRAcF5Q8^-o6>+ennT5|Lc>7u1L%F41u#GJ*w^)uH8O)Z!$Ae$Ls}>E17FQQ@ zY0OO|ZRW#IgFC4@8~yI|;HZKy7lMJq13>~}KJobds|ed-5?Ku>#VS?lI)oI&gdq3K z$gAOB2#__^!FHvocBhH^?FTC*aci6D)rlaK9z!b$kfV#%dU{ucpRHS%fi3h<)MIIt zG^i)Fdp22%!?H_-lnL}Xz~g}Y0BpdE)3xV2Qw5eLG}`|&HXjHlS~4kI0C$Gt6&f4? z6w|~r{}Fu{kb?&RSqMM_yjT@G530R7dk8ELonsD*(ynRbPe^Y)zD`H60Ya!EFU^~~ z0mr`jef(#m#`_-~IALLIL&NOv^C{Ig!tqnWj$i(H92EB3s%5F0%4+b7ItbGVD(Uy_ z-R$0&cs9mwJb&Uwp+rrnO&r81*~bq8EzCE_YJ4yF-M>)!nfGdn65NGJrH2vP=pTRoN zv*t8W&o7TFUW1I6+V4I1=X(xIB1~1melVgYgel;BK>E}oG|a-zL`#MSI66{5OAcaW zyznBksfqqkSzX@Yo_FhpFE0kQw6wT51)=D>}|hl*q1}8fQ)eQ-1_f7{XZK z-Ny&ZjZSL1y1I=}oQm_+?~oHoVJ6nR7*T|7#t*=9;KHAdm&vXrY7uJf=I7_bSpWzI z010@;(ID9sMjf6uj!xe5+5VdmaJUXc zl@G=-@s~m@;Ru?yf*O2vtRr0aXl$o>rvikUdkbq``;G%i8)D!po>S?I>z>VG|MtH7 zrBDjsA5gDhqA3X8fh)Zi!H|)G8#)JD?G20lcm5@Ra5J( zWMQUGhjIpYXwC1fR7~E(YaHHc#vRH%*aa8~MhU#cD4<~d*?U+(1?K!&pgC?LlrLm- z#KO#Ix~5%1FCDw%bP$1|OE`BzWcTzcV+`of7$H|lJ{A$#L3g8iXM!hPZ$1K&kI2~B z^M&UC-+%9LpxdNy@%@!D9uy&{(3R=O02S>9OU=Oh(=B^symkoU_|(+Y>x}=+7d99b zHHhus|MkfvyaXwoI*UD6X*mI5E``?diIo+vh{$j?Gw@&7p;NgVtoXzuu2x>iX~bEH z9ifdri;HsALxZ$=?_P9AhXSZwOHT;y_g;qqLKPJlGTGeP5-0)4)Ne0ncZs;o-i+mG-S8o)Nhi3o5N z!3`J&{Ao}H$3ckcGgE~5hhLASvoJF=GtS#f`e2CBizcdZutqRb(2Kxm6YrfnL8m5Q z^TD#=53Rfnf9=tIjpD*W={|l}wa=OuXP`1gjymBqO^=Tm=n;d0Ba>~apnk+qV3GkL34lD88Z*#u6+1fMv)L;ULo7dbyW4k$PojBe%xA@6JF`D(P6v2b=*N#z zFn9xA*q%fpGU4t%Z?1 z7(W^ve-VD3p_vGm7G27ggqKRR^lEzK)x?=^%9VtVW9=YMc9ff>lrC&ATHbtd@kaC3 zlYs3fPY9?oycY`Wtg{G8^q1sui*pEbC0D-qUWc0a989HkUYm1i0Ehkm*e95^x^9|l zVzK|5T>^n5I3~s*C&!>f)qh^eWIr6DJPA=w6MkyG?HRD+8NjXZ<8A4pzCyyMU-p6) zohmpm-+p4xbU`vFtMaEv2G0nApY(Nh!<6RB?--;14bPp*_rOBI4go-=f_S~ctdFxQ z><>)EN{DanFP0h7+ma)7tP0=PrrIB`c^%Tway7!hB4fNfBW-kcW1~+SH5O1Gs6X!t zBfy=v=6}Bg1KtKe3r>~Zmd%E4zhz^ZtJp6UaeEzkmwc!vMA(qF%a6PQpB=8XXS5t` zkDUBx_ByY1DCJ7;;;)LwXT!q6ctu4cSss+?a^48}I@=BXEA;Xs`A=UhbqTTK`z7Or zh}Sg3@g&2TCC!Y3^w;*69e>x{L`GM(ysyyu-sd~l>+4P4iksay9W`Cq37!(>Ylhij z7&SBZ@}dEwGn-vng9_w*Q01~0_qD^!#zq7<`s0;@MJI2;v~hnqXqD=hcW~ z?4XCMVK_+1PG&TUD(bFFlbs2sqhPJK3ZnpUfap*I&b3YSTdm znRqJ+U#N-i{f%wj>vY=wH&ih-p3^Zw3Ei%=l$-qAIWrfRN>JRQkBQ@(^aTjl>TKMm_GWhQnwd@zIyvX*_ zAKb!Ma>ah{>be9I848AmsRu(9kBv-B#uGlxz=#=?Aap3l#>U2du-wZoN4A|XMf@S7 zYrl8$AYk*sN`~;$>|dJ0w8-^%dFS_~vmgMH^;&Nt_{uys0ho@4&T7pcQCnL}t;+{h zl{sD#=8o8@q`~;k?xsSA@NR&Q3tYRQ>iVibv)$CYPizj0zVb+RQo9R9p79$^wq2pQJytqLs9r zG|(Y8diLkVjY{NLLi%fq|9)S_Sdq;z{rP*FJ@?K-hscK_+N%{dwY=;&*e-GW^ybTs z!|s+te2edS9Dmf&Mv)Xr98VIyi{W@RTnt|+arApuTod?|% zCjf6Yzwd=@jlo5XEJ{Nu_eWbtM@OAnnuz;;ZqlRo`vZnfxnv-aPrg?wPxI$AH$)

-}=xuKNeM4C==h#8`ASO zlR>jD&(_yso{PQoNHAPOFv8T%{CM_-RnIJ4`H)n@4r!4B8qtmD|Xo z&YmzWRJdNlFxx;q>$(q#uBMA;rJPumzU(;qJT;Z`)1>pK$yGOruV%-X)OeVm!D=iK zGQ>QtWG@*M(#$+@`bF5oavAnb^;7bOhe?*eJ(ak_W56>XsaF-*GI6ZrFKUFu!*BQ6~@i(1{g_HxzI} zjGO$)-%?40#O zkm0j6civN~>2?nd&AT6X%KIyP@oR2gtMNI6Q*Lc-1+*TCi@nD8byHS7Kfx$Rqd`%x zBb$Omji~8T^8AYo@g+nAW{$@Dv0Bn3k)zQ8IFd333Szg2Nz=>qn{ zACEs#M(CQyn?h-kKu`H4e>0BpzRf!BhgT*HQ*8&RMSe^?zYv0jUC_%3fl>}pyAqbS5ZPE|G9Gs`$LcKRoq!$UmyQ|*Rf?~MeOto%0D~ugwAQb3?+QU#@Vr{OEtMq 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031.png deleted file mode 100644 index aea697a526d8b62dd9b0aff4c8f5c64288fd1b9b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5681 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 d9jmqzZqy*x_UNvaq0j7 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00031@2x.png deleted file mode 100644 index b8b300e69ae77b6d3d9275d960665f1bb23c7718..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13923 zcmajGcRbba8$bR!$2vw4$Ci~Mgi6`#$jr_-vX#B}o*5yOLXPb4&K}v}AW?QQ4-S!$ zoxQ)e&+qrg_rI^l{W!-tIIq`z-`9Oz&vA*-(oniW#zY1|&=nQsM>-G$1K&dL5yaq; zTu9^;JdwI88+w4}%b&ntqMW<3;2SP~U9_jXyOo8fi#r4%(md3@YpUwGs`07Z(Q#FO z{8(M!HZdgUPuy?sPumGW?2yVMIbGim>&0O~yFp_aCrUZ?O!35nSaXP?Nc!4!(Z*tlYH@r|s-Rg5iSPgW zYidi2c{-FChC)!v5@I1O*st5MoXohQ(kmQ~;IjnTFfE7zzD!^a|BrwNdY{9iI#Z$O z43i`pgmXl|XGtnZuo{pAq+CIqLzWHCMr2c%lVSa0bD5ZjCrgPqBEq~{PnKBg;D?Bk zO*vw%NH07&WDR|QyHaEAplYN7BlF-IGm|E)R}PT_`wE*Pn8g!_5@wUg(nBpP`L{~s zd>Li!H?}<>nQWfFXI_r~Qo^X(VTbIYIB1Gu_9`S_!C#jD8uo!;%LKy1T*GpC_QW5K zJmW(lED#(d2#!Q5)C@;N_eT$5R5usLf+WX62n}k3Bf|3H=eA~2rnXMGe*8NtEJ@s%s$3kq?h8S(l>#A~QB zg_gA<1sy?^LRA$_^^bvLK?K~kAp_Lky#5{el7fwaZ6%qKJ>YogPW5TO(%n;RWM(wilr;_38J*A5nPxB~Dfr_UI zH>TiPhftZ7xqZazyQuCu1jmJQ*%c%2*VL#e1V`&*#L?Z#(;Iy4LKK#mTX!j5{95(W z;ipq+FuoOAwPxQ}3r}#`l^S2GpLlkB4PpzeS;EtqjA@tZYk$%;$J|1vM6x5y8HgnZ z1o9;oIpUb>`CC&JlYoXP`7&cpLj8ZDSQ0E;MRe4Dx~dMo|5uff|^l z+Fzr!-?oy?*1-Z1vOa}lMMbgx%?a)euPiHHD(1mZbTbLysY3`WL~(kqu;)Xi@7M-| zT*^MPIkzQ~LHe)13qWDsn$#$*Pr9$aKhIu04qvh|jNQ zGWjvD?y6U+`QeTa<6K2wJ-z9z3XAPSR60e>;=IV zDf-&G>s~ESOF7f~a*YM#Q>@+>hz*n!@)WK6fL;7|B#FwQLgfrvJ`NKK?Wo|CN(BpK z(4RUPLvUz5L3(-L48kE^(zePVW=YXxz0p@uz3Rh{c#~1mSw3pV1qa4kO=s1H9KuXj zz=9l}1y?xYa@1h;v7_IS+a)Ue-h zMT8fEI}|)c;#MiMOOGZ#S^lTXD;jbxX<5neds{SjXjzA#hVd%49L4~vNTvFB_<=h; zdN1Sd9ZI^CtqB>hhZ2#4yj!J|G@&!Q!`g^#->K6d1}&V7QEv1dLT2zmoJygmiBgUh z_V7?tSUsJ43aQX{GTm~qzqzg!h(dsh00yDOP#!&J$@Lfm3A;R;YX&@chXlKyZk2d_6Z3QGWs^tc}bsD6%irFHZjP$NiHo zuO3Cmtbag&4As@>i#r@#KdMS@oc75mXoHi?9+7PAq^afB)zN={PMx&SvLGw0euF8VlPNy8 zyqvPSy83-ah5|_20;%$)`tr@D(fCa;NYsa&>MouJ5$<0Is~fr67Dqz-k3sEIuh)hN zn_q9YBkvGO5S#ce{`sgdm#1HL)a!c8Bly|b891~3M-ZhfQi0;i6|n;=Z*RK$_wRQ< zzxUb-6n)Y2*PW-Z(jG#bUlXCWr>}I|%N@!i72yr#EU7U!^3B{FCy_=m{wYAxoE7Aq?lF#26Lk-mn%yzB%1QAF#jHHaIw# zvj4Z79)#uc-@hnfrq1PMo^Rj2z3%w~fC?(-_5ERy5D@@aQvUeOjokTV{^vGN`4bUm zgmEFXs7#=2`DR@4!o=SS5g)B>2x zS2Cd^n(`UGC1~d9g*Y`?r0YWWHGup+NCnUx1+s#J#d1{w_i6v&Guk;!>@PG~&SCrt z)J`USVRNH{FYE~NK&W=Br|Ojxu6Ax~u4BBxW2qo!=7xtK1>SGzx|*h@d=l5%Ofz$n z_xjWQiBTe7TuJf}Kuxlmj^FTDUma6%D6_VXoOcIQ!?gpssIf7yC*&aE~kZzoNn?dKk{0= zqM*&d$QU-TM9?8rA9!>RVyBJ~#T$^+dwmi7v8c7ZI>28-Nbgi>LyJOyKPHQWgJNFm zf={3fT9!}OID|PcJAz_3aZx(r#jL>j23uM;6FWC&@yq_f^J+t3ruaYBAy}r>o|bN> zdc7O{mN9MYD%1>7a;5qn5g}a(*X!pKBwj0XjaH_yuD|TGtlt|ovcTN>*3~74aQjV| z5=u0CozT9mlunjxv{uW=aVaU|%QFzwhg;DyuV!ZY0&;bexImS;bJAMV=$seRHDAA8 zixZNRTzhV5`i*S1@~h8={**oJqqzd%{^x+CdC?^yO*1n#>3?q$9aXDa(`4C0)14bh zh1CZ<7T2d5b{dWA7(q#HbE=z;Qp^hj2o>a~N1T=D&kxF9_T;fOtL zY%V(k#SB$DC0e6Oizk9ISIq|8yMZJDv?kZ z7e*sGtsrJ%!jQXRq0FQyC6@1C{5e1}?Nu{fgKfpn-=|gtt7U;jCSa2g9LR9gJCTUd;#b8Hs zhj;)J;7zudW`7r*dd(IFe)T@26F~)n0EB{a(r4Y6+lkB(8yn7`qC6t&k0cF{fSg>b z;qQrr1bXgOP4L@dynB@rnVAC^m4=0@CQ8<+_|0Q>*ql52$g<5bi}`A|B*IZTplNY*i;2li|zID&Knp>C z54Y#{ngb3NsbeB8{JHjo)Q7(d{#R7=1kxQA=863+X~Ph8W4CX_+c3q;o`5WTmPKch zVq8J&O2>PHGiALIzhr+;6A}e&u#yxVq9ZTTFX#wi(pfHjsb=BqAa+2V{oR{(e=9nDTd2DCO)0NM<9J#0&pB9VM^u&(XKLGgw;4yHIqNI=3F`@gf5XOB@Hd%Ic zSvH2F*Af7W0(BPDk);KkzY%F)q~@AC{*OCjvMLdHjLpRgy|Ow{M7SX{29`Wj3pOWf z$dkBA?eL&RtL9VpXGj#DEpW?BuuOW;%vlpriFy6iEiEp7+%W1SVh- zM+^-&03eUFBiIqMqWx(r>5+u*&902mVZccN2^~#|DVWO)*k}tQAfZAKvhcM9x2{H7 zFbGj}+$K2x#_Te?UWbn=uq*z{Y_4ZfreCb_E3>Gm{$!)cZF!J`5FX~I-(It;p2P*X zG~i|WnZCbc*cWSqrT9TsW`O2A#Y=ZhIvNac6tzUZGGQ=tkP?fE!k7G%gfNlMDw%xx z##gOQa*B9C=@`V}$km6zysL#PWNhxxhFLIZ>5bfWEV5(biETeTtbZHkQ+iAc(a_K^ zu&{V;Jy7sY-ACSx2u z_dr$!nGh0fH#b1odoS0dGvbDf$$Gpo6YcF){2+dByxf0f{7Lu2Z%kbBlqsoq%qA!! z_BCX~!q?@RXM&!9yMc6yM*uVbQ1gXLrI@$;mJ0R$I*$H{UUKx_G`)eFQ7sq1t;iD2 zYlnMg7kf>&W1kL5u}1(VgN#!E=o)~i_r?360?Dd_!hJ^p`M3OcjvEZMY%z*8PrYVv ziep}d|H?9+WGx-h4!rMsK)JTo6wWSMAgVqLK=W9$%l^gs!--fB@}e=a2FGb28#fVQ zH7$Y;Zu;JZK~sz*>=1%g)K!*+h2>O)uVJwNn&^WEk!fj+wwQ;SqK+0ksXhJs2E}$$ zD{6KZjx*xbL0zlFG%uH{x^pcM*m;#OrjrkwReE*HDl8^2|VA7-c zE`3J1{5|an<1B1!O8Gj5+IT3tynOQp$yFAryEbQ~%fIiuVy2ZvKs$r-l!M6s#2@#DQ(J*rjw};-Jx3;F+T%MY5`uLe_0WJNSI5&y*>Y*kVc{fHY-ApsApP z=`1W~a@b_fYU7i3CRtn>o^`zT_4q|y-$XLmvXhNEgty>EkT)fkHlgU6xvfLbBQR)v`!cH-4xn{x5VTb!0(|lj& zw-ZYi+I2of7z>be2+{SPmcB64e&=UoibV+?x_>ssebFx)u_xyb)qf1a*;~mHm&-$D zZEc-hROAsP0mJhL5tPj10L}=85HPRc;NtZegdT9-m?R|Ot0Hitj_6V zr!1~7p%gyIv{pU2UhG}XrJxPutbTpNozj(75(vvExpu)z>Q>=vgj; zQRk?SJU_(b#>=kstykl|uz=9rJP_pbWge>Q1X;0dHnvq!h=S$|&=G3;&Q^}6T%2_v zX-L#_d9X~+WNk+->7yTfl=pNU&FA9BSDJ+@GfCoVTiUsEBF5j7TU^{D_Un1pIIcHn zUi50t;NO&O^=IZs>D8TX8E`;3ii`ZF`PKSRKUF2F51;le!R4p{I zIi%6%1Xkz{bCXMfUAWbR9$#p|-Pzlr@y=LrIg5>+jg5_&R*Za;f}XHm6b_rc$^jIp9*%GO>xD6p789-8s@XsmrmW zIGlA?$~Hnm;MX{MvRW}aN*n(%$oALwf5Vd^5-8WaW9x$fedkKF<4D#W@No?uFiB%ps)dyP z9msXF`QV!!#EL8&WF*qRd4q+p%7!b-f`ue4qq1-$!g)z{HDc6IAE~gk1Br%P z6fVI-%gO|R9=C)U8q)r9FcYAKBnrK`b#k!jQv~fuCISis_>{>QIN8mp3-NCjrTG{rl@Sl8gx46Byu| z58_@w#DpGcBTs`{pAqp}la?sq*LEmM+g5Q9cmwCxSMidM#bwN@P zUyE1F;fZ~l+?9Fc*aql}xuJJk=Dxl4cWYR65+nhMijl29=M1%?<)S8CG7k1&e>1(Y_t$90{o4i`2O;2HW6#fVTyIrQ)QwF9 zdcj;Nq02W*ARx_&vM7qOc&lybXUTHDaV2(>c+x;ahr<=}kO96O&fZHy-E`d>hlw2O zuP^2y1Bv&pm>8*o_J^|zYoKidH3L!kk3iT)z%;RCZ*Q;fiL*Bz2Uf}|)& zLxwIcY`(s>i6{f1Cb3xuF1@)K%@ezGj|#UM+$7aEMlkvi4{)~YPM?TGIBjBArNdZR z?e?zZKpxO0-Y64BS%~&r$Ibako!nAM8deN2d{(#glqIB8IG$*LWERc<&58g1FQhF*+hM`V*(QeXF2S4c@Zy&1;9r?+^6WYyaqHi37?Ix zpm4kZ=Zb!_^+H;0I3kzlau!I){EinO=z#Bo@xfk3I*anfix;3YIZW1R@ht52wbX6< z2I}3t=ou2Go3bRT>(nC)wRpekeh64Ipnq~nT-@npc9?{%kHaf|+i>g%a-#3PRdMLJ z15lv7*T%!p{EP4V0OY2Q0l`prhu-^e%K`|h&j5tX*CB-l@%Y4`lYOzY7r?8eFiepf z7LJOJULtLcH?bRA+5zZAVrh?rgyhY@(pZTLkigwe?^4Vk-q(Li{DlVdExh;!Y&sX> zfwFn*kMi7#zb0tx90gw5L?iZ4s8ql{1Xdy`~rpKm4n&Q3RTx)XimMEuJf7VtF8ADefVRf^E`7E%IU{vwvY4M2aIh7eVgn$38 z0_wD^vZEucs&1-%P6%9oaCmq=Vn3>5E+OF%o`Mzhw$8M8Ps>&?CwdiVUSLDP{)MxH z1am1G8NQTQNw>p*bIZWWs;H@%=rPdP)KnhVfKMo>oV6#KrQ2DegTUUom}fM%UTY}L(S20|tkvz$itCHmDxN%T7cG4k2?yL=o5MtHT=t@sOVG;O$s zBU=6;LmfZN6Z%kKcTG{C$&Og5?7#l_dh=(@~>L zcP)r^CNpit2Ta!~+Wq7(4H+Wz9bzwV0HTsYBIUy&=$sJAASN z@;(WazE~M9yf88|!xxG)%CU}Rt*oqUvWR;wZ?5k7U%?X9pHjV!$MHkhH^h=Ka+)O`;uYXO7*nWphi1Pj^jg#;Dc$OO=<-<3!T73=1j}V!^I9t znNu0fENK&%5NRsgxm{-|8C3Bb+W=5Z;!KmzW-kx~UGUuzIjjzeWvic-0NcK}z_p&? z?m~v>#a1O6XORFR2p1%6Hk)ixaFOE*n&~}nMN+A34C#OpI}wGW z6}=f@3-Ibj>Sp6=Ss|D^E%qi_6%RyZBPg_n_PH&Fj)9rE$$crq$2$_0)4YY8Z?s5d z2iQV`vBp>+8n6~%M%&lKJ}r#`0}x#B2wnnj7yRgd%IU^0p63k2NQJZ~Po4-$?heZ1 zB}2{wuV9g(e-#hB?*H~Cf_n2K8a-F23weH=)Xn%i{MtO&Tw6e)5CA3Q@_@)b+7RXnsXqRDBm~z^lLO>t}xnC?%vOvoE@{Yw{{i^v)v z(MGma@iRoZv0_Ku=e^x@o3KD8($b@iS0vc;ziv=weDr6m^?Yyhyr=avj)HGShG11< z-}Xfz#7_a)L2G7bBWBuflou-Tr+xT^#>PhHIy2w~{@rW5--OGryd4W4*y(Tl+@M-! zGCv@!4kS1rC7=-K6tANBaj$LPOni1(Ii>dqJFWzv1D39w;$k52h~1YO*x}QO-EY=I z5*-Cf2mSsUW0oo5qY-H}je#EdTC~Rfz5^?>G$^oiAz?+vq%g0CLe?B`^cw6?)@aDk{pdIXOt}!MQ*a3ACgaR;s^z`Hqur4>F zeoo*df=vTX67cLz%U{fk77p40Flk_rdVid?zm=Dlj{&+k0QT8ilMdx07GhqjTPbkzEhHA@cyn+Myr+^XVDf`i+>=LC zSoqzmu6Z>sY9O8)jW`k+XH;^jpxCKGL0^d>T~Sf4F0YvCtRf%9WbB>O6;CEmumS!6 zzSJA#OUb3@<0@FCX<$&u-?(vO?eOq05@ZW_3T-ylgSfxr2}GU)5yCu4!w0=C&JH$P zflltdcW}TB4DL}Kp4+kE?1-(CGcZeFF@lB&ZKMzdfi}`b`KCGf#qO@~bHgZ}SfFe@ z5@j(RW(>K_5Vd_0*wPK)=?_h*yA#QHDUZ*2y^hoewl^?*WPBGE|lMV z`@I7oh`IoU;oUDqZM7~~?}TYv-C{k^y#kELtbu6YV*v76+7$A_YC_h>$7gNC!0c@9 z>sP|C8oundYB-A|kq{dU3+iK-OUMb1O~!wB+2$G=cT0nm~G@Dll%lmlZRARsWv3_f1zsYvn36wHn({o~%^Z3%^&o&Kh$oC!Wz zKiHAP*QK~~d4)q6U^aXw2#UD&_mMw6LNgfN@OS6+cH7 z>KAjQ_5huDno5Ge`@KMiP{01N&ROsCdpyaifXRTp=xGTNNbLZH1!x~Y#usKX*=LH) zMXMyWdxYErAtWhDKFezY)wdqTwT^>uOZ0M=AC+U6yShr2R^;wnF4V9K@*f4V59)d@gF^n%>@?Z6-Xok zUXiyAiMm~l1Kuq_YnLRhLntNij`{6L;DUVmbQ=*K`sU4>1X|Dzc84ymFCW{y7eX^b zJ$-}m*@9jjy$Lx z&z?OK^;o3X09KQNx>dk*`D(gMtlpRxL)6@d7&HY60c;oGYk|ZDdU8@tF6haK7Tm>N z<^tw9^rqE(qZ%}laGwJO*6T}MU1|gHmv&{2-pW|W91kTn{`i;AqiV9&@P|K?z+oyy zy~pKZ-zBlTsuxo*@#b@>wIT`s&LQyox~;1L!Xr~uRHV~miFo~MXF%pcvdfL_H7dzglGc{p!%fm348ao^=iPM?U@1_PV#W}MGO8Y1JBXi z+?;NfUMAIQycY9E@r{Ff;o~GOgJM0iW>dB$zm~eU4*KGGIIx~z$w^udI|VPJje>&W z^8-7Fnn~ZhA>Rj7h+gHS-8N%^gCStu7whr@=MJpaDz&jZ!tLr#Z{+^paP}|2FHc~T z^52aP3JOZz3_fU@hCEHiXorRA`@THkO$PqAc~&vn`A+$2qenk}^B}LdxH#`&dcg$X z0rbJg!&xl~!=HnP)kUmcv}F?ykO(E-qy=u+W{H9PLzo{FqZx8MEOR(ZB6HZLA^7zB ztC`+}>k^kYd)d>KHBdMGQ#|DSl(JRe-p3Ii^NYCaq&7r&nV&zwOeeXLal!~z5;5N&{y1s*|#4=Y&Nw8!kXgOhI7 z3eb~d*k9t;hv}_H%-dk2MF{HiO^kr6f>e+L@&S8AAlWzn=BtJ&8Lw9~kgVYBB&%|p z25xtjU($6MqU>V;ON_(gZhh9+=7g17!e8>nCY=B`#!sX}C`Uu^9T#bVoh6{DvALIa zevkMk&;asD7X^GT{HBu2W?-JY-pF^sz&Ua=F^@&HE7)Igf-UclOYz60Sv^&fb{K2z zlt0RqXbO>~TR<|J`H8*yAq|6Z|6uD4zar5p2YN{wjENPr``s46{DD#jG6is(p85MT z)jV~AV?kqR`S+^RJrcISt@a+l)~PkEJm~PbVF6fdI?Y>em4>WwPC!dfQzHf!0V%s@ z0|IrTx3^bz%nK+=Uo9(dnrR~L7LEK(1L$sbVjytwzDv6}_u#7M8D(2-2U7-)tDkH@cMs3fc3Cfnfax z*SYrPjp-)*&dC}1Dde4`dGg<``*>OkPwZdYeL=c7m-E9enRBy{)2@)yhx~JzFkAkB zoX6WptRAAIME3V3ygw@s-YdQVL57$5sFZ?hGlh1!YkE<3M%yC9D2Pac>Bu>8X;7 zvH;#c=*832qy)M5<=osHQ9?&%CM)PJng5ypSQI$wpw|fzn+x2zf06^OkF|f{pkO)e zU+I*RTUhrYaY9-3vAs!|iyfJ))y>V2eUNKjP;~Sfea0Ckt?AnJ41Kubd%O6DaGxS? z^6~j&!RFm*!QkyUdLVXKZOr)Xv87^-;Jr#jvhj(DJF&T6LVyAnir>U5YU_5zx`QY| zDp)M_|JjLkXNj)189-?x*Kl=|!s8;Lst^!{d>^K`Us>0 zP0fL-CSaPfzx@vI>y7_uhc;~vyvaYlzvb4H-v0GO^Lohd816D4tu30HYgfY|(y|iQyel^>;eC%j5XfuFCeOTtS*GBqD!%9JVuspK!I#Qw18;+Dn z`|BnM4&- zG#(D$Xt*_&3jr@}_1T;O$g_wiR;sVskgxQpPKxfpYb(bK!{=4D*^7yP7VbiRQ!vso-^b{p9Q%%|-qF%jv(KO{;1{ z+R-5NCn`qhvwySmB}-`n$4yO=HETgspkqhUfHyfjUnk}*7b(yeC!Az41psJ)PB~!B zb0XT+D$%E%duT*l4?sAEMs#SFa^oLm^#W& zHC64P{y3sLd>7(rEMo>-@NUaa#%AwwqqG2`-4mc4hN!#D@rrzJlpoO(hGC2>YcP)+ zEf|Q@hYP$+Lb9m-X*8RLfF!$?JZ2VhR(P>Rd9ihTBT@3+F)-qKA2P+m`P&5Bo__P2 zYq|bABjG6%Q;L=s4B_SDb0TxlFmQ!c!rSoxG+E7P@w`JS+!a8e!k3O%pg{}ED{LK7%6&dU`^z!n}XFgMI zN~ZvkeQ#-LdCpGta!ZoU+)$rT_8LkJg}6&0UpBUSr1R-rMn*T(F7AdAiH1-!C{#Jy!G43@iFzBYkl;*DDe6d zEEs~z+~bQ@8w>0(V0*1WBhD~T#L||sLV_1}SB4*;^%V(H1`S--U)0mf;=zTEjH0hz zKjv2-<`ch9js~sHg_<(nyURl^SRLq-gCmWr-ZerCD-+8lRtkt0NmdDjFC_3cO!(>I z-5VSMF9Pkw1S$7~7g@#m<37SxXGZ4w_QxWY2-hgCr^FaWpWkp`R0m{+K^gHd;H?T%k{3OeWpk#*2*xUU`3BsEZ+|E z%rK=I?+`y}g>~>;Vm<7!{9>2em29U~Pg6-@52OQfD)J`9KeFE{xM?ZLC zV1DI!%L@0~@6VS(2hIFn|4~POhI-!9{ehZqgyuZ4I(I4Z+J)47C-|NUQRL^G`qrU)sNu zGd_K&ieD2Xe$Ba}&MMY%)t}EY+(sIfy|9@pPJdjbtcUWopzf|jHa5T>@{0XlSXPSq zgH6^(=QI~jz_#kc07n|lg=L?|y9C|{+L&q(u`+D=oD>HhJuhFiZpXWPbQ_Udsf^tI z4b{>;-)PGcb>j>eGx4be89`8e_;EB21}5QqetP6`cD{LWeo#H(2-D}vwShUhNfK4; z4MM;L`B&b0ew=UQ+>p-@*I8T5-?Y4Kt)N{1dgP8q@MqKbpgDkit$?zaE<^LF>%si( z(9#$<7BIc3x0=#^Z*u<=0X(56OqTs&>QZQU@;!&&|Nivg{dR|xT2BL74+2~YbUulf z(0Ka!vicg#62YBJ);J4Q&_k~P_~-?VJ>dW({ajdhJ|8bK^B-Uu5~HnT=ES3Ph1{nC zZBHO0HVHC8vd7nije>~z+XmY19W@Vo2mnD~BRq=sM6P2p^Vi&ZYry~Y?^N}X7bJUU X(k!o)UE;t$h(Rg}8js3Q=HdSb{|}$Y diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032.png deleted file mode 100644 index 5f2475e5abb20ad1b132083a6cbc04f4bac6c8ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6184 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 v#*)5+*kE{0x{84g+h;72k;j*)hirbG1qpNMzC diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00032@2x.png deleted file mode 100644 index 02d1692516847e6567309be16d69cd6fb4ccd8ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14903 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 z zVMZF(4$5Tv-ripQIzbZVU29%99}F{(_bfo~Z!EitlY*-E$WN zVg-Q8R9p1Su5YK{|5cYYZ4DUd_n_w(sGJbrS0UO&u2n1xnpKMubY=SSB4QCbPlW{k`RHm&TyatW1->^|!a zJ6L~l)3tuK_J`}HX|%0>8WMHZ$f}1LP~x;_eYVhlxi}&0LyO`;J$-$BJgJ46mn&pC zie2o(_V4s)rKN$VbGCjz1@Z1>k12-&rkVnYhRfWQ$aEJ@+dj|toI^*;Oe*=c0ddZC3bdp zHqp0w?{V)2H=7AEfBx|AyK^D1WYmn}JClbJNKar>Y2xF@S9&w#q}UTX3Mo}Op=mG& z`cwc{1GPcNwV94n*_*Sa6|@l7`JZZb<_diQfAQAi#6;czsPtib-Qv9;_Aeg(y*LAq ztXn8HDa!Ve+&7z!R+6+sE^RN zd2$7`)V*+&66pGCpL5;6?7Gli2N*zy-`Me6ZBpmXouk7z?gvHZhX33GX(t_!Oc@?@W&9QqmaZ0}D6 z^yGC*aVDVXTQ0VkwaZL5bN_tx*y1Ex^mQLHnrJNlA~7^#*^+H ziyl7IzEdWRo5AN0U2(fbfZstC{SIVhD=1s+9hu*cJw_j~}K)s)}zjP-E$Sd3G^0F=@ z09O^X>f;%T$1|36FPvFSOwxNCjl@`J*P*J-!-?$%=q2Iz_t$4m`U`nvSLZI&?Wp`9 zhktMLo7m3S-`xxgcNmq-NTsBA+X0;@OWu3#YptyiZos7GSlv4s6sA(_4;>RDa)O>} z`~FzXBkQshQMNdXddnfhx6g}&VyUj4yhq2x8m;yX=drrr?zmh0(F5fhP22iOr1d(I z2@o|144=%1r<$q=p<~9Q8IQjO4NzhTG(P>evEdDr;tk!Z%AL})@hUpJi;_W?5RObD zB{*GgI?s1iqI%a+A!R=IQm9%l-H7xk`+!-=qr-v5S`YnH-_9TvdoDl!D&$41zT8@T zn1>8S)7ll35;!`=y7a}KeJ)SciEf)Ey>kt4suS7UAO_}~~SOb<=d>_~PPAU7B@GTxPA9CeFPd?V6{-Y0OfGBPq% zUc@ga!OnA}8VSw>z(uDR9KP4LB}CPH_Y zwZ&5MDh^B#FHDUz_jK*C$EdpP90Pv?j#$Dy(p?ON5_Rh@KfT^jdJVD>IyUtsYC5|h l!>Fpmm8t*l%ZB|ROe24$%0oKQ4*uyA(Nfb>EydbI{6C)Xa!vpM diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00033.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00033.png deleted file mode 100644 index aceb101ee64a0d35d1eca1d7fb325881374b6197..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5427 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034.png deleted file mode 100644 index 196e0b312785c071cc4a6945593e55cbeeb61a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5005 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 UdQZ0q{*?ykU<@@sqHRL{2h$60jQ{`u diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00034@2x.png deleted file mode 100644 index f93575681a0ae1f9333d936c098cde8e65faf361..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12701 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 H`-uMsLI9x2 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00035.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00035.png deleted file mode 100644 index 8172bacf937e09b4ff129b4e853973462fc56b85..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5317 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

UmW7yaa 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00004@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00004@2x.png deleted file mode 100644 index e72c0f7ca2c911a5e50a813167566b57b3187e97..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14953 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 KRNg9Chy5QIFE052 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00005.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00005.png deleted file mode 100644 index e801730c717808168660c6108addc5d60f3a2211..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6206 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00006.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00006.png deleted file mode 100644 index 509484caef249e7da40e8352cd3bfc7b8a079a64..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6210 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 G!v7DgV2OqR diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00007@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00007@2x.png deleted file mode 100644 index 72e2e3bc4e553c7fe75f13604871485df25f73fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15065 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 G7xh1OfTG<1 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00008@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00008@2x.png deleted file mode 100644 index 93d6d095668fceb27cde4f45f682571b84647ade..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15054 zcmaibcRZE<8~1&VbsV!oCz+8XNl_%3A+mF1kIKpxLdHo(cI9g&J7jM{cBl|KS;ps}N0fB|0oC7C{g?<=eNk5d;OlMdC4(@Rdeb zY!7~+cDk+q7=Ata8x%_X%$f}RhSy6+&sE;V!rax-1wk+gk5#{DsNkJcFDPHsc2c`@ zM@{HFB_iuZ`R$Pxb1Q;yA*=q-+8xlAoSI_sHLE$RWwjZ*``kil>x(&qeA?8|nXCVzKXacCndVvN59z;> zo--j(($}@f*JJIPQ8G|}PuEh{a&(iMWNF2Wl|e;N)@W^qy>HZx(cjb^dAwLXll+w4 z?7{!{^_bXV_k_%W62r}gP$4XYufpM_U1~p980CzRw}>brK)?`WCLO6|C}a}Mac;w` z)nvuYGBg2vedK_Sa7a7O zNV^(sx}Kgl`=Lg?0LA~e=HPCuMGA#5h5Yr~v@I{y9JkbN%gR?f z@=r3i&FozvG(5yj|H~5Xx15p3telYZO=0{e!2M3Kkgjg!B{g?gz{^8f%=V>#ml<@~ zx&v|;a}2kT+-C>5&wghEjJN}sFx-zOMQU|L

gai2->SRnUI6vJZxV-%HV@oQ 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 KDpa5?!~YL6^W*9O diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036.png deleted file mode 100644 index d114851f35a2149bec541f9f4e5140eed5d71786..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5857 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head/raise_head_00036@2x.png deleted file mode 100644 index 8d91e3e5d164b7cc73cc11e345f9e5465868ef9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14280 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%0A1=pc%9FL(1f7+Y1s8)YPs#zXYXX;Nx^O{O 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 ZLCt?@BK2j3@C8vsNnS;+NY*6a{{eHuiFW`1 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001.png deleted file mode 100644 index 8f10b860174661a5b1f910b20e7724ae3f4166ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6225 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00001@2x.png deleted file mode 100644 index 20f37c6ab02f42fc8c896c5129c127afeaa82dbf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14982 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 diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002.png deleted file mode 100644 index fdaa9d4722704ded43903cdf1d31097c9b84849f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6240 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 E19BsZZvX%Q diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00002@2x.png deleted file mode 100644 index be68cc3bb1c87659616015e8f23ff11eae6ff28c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15003 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 C@s1t< diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003.png deleted file mode 100644 index a77543cca3821aaf6d2e11a638d7ef93a6508b31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6187 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 E0Vs%hIsgCw diff --git a/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003@2x.png b/dcc-old/src/plugin-mouse/operation/qrc/double_test/raise_head_ears/raise_head_ears_00003@2x.png deleted file mode 100644 index 5a6010524007440a6960cf2246ce3bab4f4fb65e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14990 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