From 873304b59a3f639bc172b567c775ed9fa19594e9 Mon Sep 17 00:00:00 2001 From: Lenheart <947330670@qq.com> Date: Mon, 15 Sep 2025 09:46:04 +0800 Subject: [PATCH] 12121 --- CMakeLists.txt | 6 +- CMakeLists.txt.user | 52 +- Component/CustomProgressBar.qml | 6 +- Component/DownloadItemDelegate.qml | 36 +- Component/JsonEditor.qml | 8 +- Component/ServerConsole.qml | 14 +- Component/UserCard.qml | 6 +- DelegateUI/Controls/DelAcrylic.qml | 50 - DelegateUI/Controls/DelAutoComplete.qml | 211 -- DelegateUI/Controls/DelAvatar.qml | 151 -- DelegateUI/Controls/DelButton.qml | 201 -- DelegateUI/Controls/DelCaptionBar.qml | 193 -- DelegateUI/Controls/DelCaptionButton.qml | 40 - DelegateUI/Controls/DelCard.qml | 171 -- DelegateUI/Controls/DelCheckBox.qml | 129 - DelegateUI/Controls/DelCollapse.qml | 262 -- DelegateUI/Controls/DelCopyableText.qml | 17 - DelegateUI/Controls/DelDatePicker.qml | 675 ----- DelegateUI/Controls/DelDivider.qml | 120 - DelegateUI/Controls/DelDrawer.qml | 105 - DelegateUI/Controls/DelIconButton.qml | 62 - DelegateUI/Controls/DelIconText.qml | 20 - DelegateUI/Controls/DelInput.qml | 70 - DelegateUI/Controls/DelMenu.qml | 582 ----- DelegateUI/Controls/DelMessage.qml | 279 --- DelegateUI/Controls/DelMoveMouseArea.qml | 53 - DelegateUI/Controls/DelNotification.qml | 9 - DelegateUI/Controls/DelOTPInput.qml | 158 -- DelegateUI/Controls/DelPagination.qml | 293 --- DelegateUI/Controls/DelPopup.qml | 77 - DelegateUI/Controls/DelProgress.qml | 312 --- DelegateUI/Controls/DelRadio.qml | 117 - DelegateUI/Controls/DelRadioBlock.qml | 197 -- DelegateUI/Controls/DelRate.qml | 230 -- DelegateUI/Controls/DelResizeMouseArea.qml | 354 --- DelegateUI/Controls/DelScrollBar.qml | 138 - DelegateUI/Controls/DelSelect.qml | 196 -- DelegateUI/Controls/DelSlider.qml | 273 -- DelegateUI/Controls/DelSwitch.qml | 193 -- DelegateUI/Controls/DelTabView.qml | 710 ------ DelegateUI/Controls/DelTableView.qml | 986 -------- DelegateUI/Controls/DelTag.qml | 152 -- DelegateUI/Controls/DelText.qml | 13 - DelegateUI/Controls/DelTimePicker.qml | 469 ---- DelegateUI/Controls/DelTimeline.qml | 307 --- DelegateUI/Controls/DelToolTip.qml | 165 -- DelegateUI/Controls/DelTourFocus.qml | 49 - DelegateUI/Controls/DelTourStep.qml | 284 --- DelegateUI/Controls/DelWindow.qml | 160 -- DelegateUI/DelegateUI.dll | Bin 828928 -> 0 bytes DelegateUI/plugins.qmltypes | 2649 -------------------- DelegateUI/qmldir | 47 - FileTransfer.h | 6 + MyGlobals/GlobalVars.qml | 7 +- Page/Page_Home.qml | 32 +- Page/Page_Login.qml | 38 +- Page/Tab_about.qml | 36 +- Page/Tab_home.qml | 16 +- Page/Tab_personal.qml | 102 +- Page/Tab_server.qml | 66 +- Page/Tab_shop.qml | 47 +- Page/Tab_shopex.qml | 49 +- Page/Tab_update.qml | 8 +- Page/Window_AddServer.qml | 54 +- Page/Window_DownloadQuest.qml | 6 +- Page/Window_ExPluginInfo_Goods.qml | 40 +- Page/Window_ExPluginInfo_Private.qml | 38 +- Page/Window_PluginInfo_Goods.qml | 36 +- Page/Window_PluginInfo_Private.qml | 36 +- Page/Window_ServerPlugins.qml | 28 +- main.cpp | 8 +- main.qml | 10 +- 72 files changed, 401 insertions(+), 12319 deletions(-) delete mode 100644 DelegateUI/Controls/DelAcrylic.qml delete mode 100644 DelegateUI/Controls/DelAutoComplete.qml delete mode 100644 DelegateUI/Controls/DelAvatar.qml delete mode 100644 DelegateUI/Controls/DelButton.qml delete mode 100644 DelegateUI/Controls/DelCaptionBar.qml delete mode 100644 DelegateUI/Controls/DelCaptionButton.qml delete mode 100644 DelegateUI/Controls/DelCard.qml delete mode 100644 DelegateUI/Controls/DelCheckBox.qml delete mode 100644 DelegateUI/Controls/DelCollapse.qml delete mode 100644 DelegateUI/Controls/DelCopyableText.qml delete mode 100644 DelegateUI/Controls/DelDatePicker.qml delete mode 100644 DelegateUI/Controls/DelDivider.qml delete mode 100644 DelegateUI/Controls/DelDrawer.qml delete mode 100644 DelegateUI/Controls/DelIconButton.qml delete mode 100644 DelegateUI/Controls/DelIconText.qml delete mode 100644 DelegateUI/Controls/DelInput.qml delete mode 100644 DelegateUI/Controls/DelMenu.qml delete mode 100644 DelegateUI/Controls/DelMessage.qml delete mode 100644 DelegateUI/Controls/DelMoveMouseArea.qml delete mode 100644 DelegateUI/Controls/DelNotification.qml delete mode 100644 DelegateUI/Controls/DelOTPInput.qml delete mode 100644 DelegateUI/Controls/DelPagination.qml delete mode 100644 DelegateUI/Controls/DelPopup.qml delete mode 100644 DelegateUI/Controls/DelProgress.qml delete mode 100644 DelegateUI/Controls/DelRadio.qml delete mode 100644 DelegateUI/Controls/DelRadioBlock.qml delete mode 100644 DelegateUI/Controls/DelRate.qml delete mode 100644 DelegateUI/Controls/DelResizeMouseArea.qml delete mode 100644 DelegateUI/Controls/DelScrollBar.qml delete mode 100644 DelegateUI/Controls/DelSelect.qml delete mode 100644 DelegateUI/Controls/DelSlider.qml delete mode 100644 DelegateUI/Controls/DelSwitch.qml delete mode 100644 DelegateUI/Controls/DelTabView.qml delete mode 100644 DelegateUI/Controls/DelTableView.qml delete mode 100644 DelegateUI/Controls/DelTag.qml delete mode 100644 DelegateUI/Controls/DelText.qml delete mode 100644 DelegateUI/Controls/DelTimePicker.qml delete mode 100644 DelegateUI/Controls/DelTimeline.qml delete mode 100644 DelegateUI/Controls/DelToolTip.qml delete mode 100644 DelegateUI/Controls/DelTourFocus.qml delete mode 100644 DelegateUI/Controls/DelTourStep.qml delete mode 100644 DelegateUI/Controls/DelWindow.qml delete mode 100644 DelegateUI/DelegateUI.dll delete mode 100644 DelegateUI/plugins.qmltypes delete mode 100644 DelegateUI/qmldir diff --git a/CMakeLists.txt b/CMakeLists.txt index 7370c85..88ac7f7 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -47,14 +47,14 @@ else() endif() -target_include_directories(NDP_SM_Svr PRIVATE DelegateUI/include libssh2/include QXlsx/header) -target_link_directories(NDP_SM_Svr PRIVATE DelegateUI/lib "L:/Qt/QtApp/5.15.2/msvc2015_64/lib") +target_include_directories(NDP_SM_Svr PRIVATE L:/Qt_Project/HuskarUI_Qt5/HuskarUI_Qt5/HuskarUI/include libssh2/include QXlsx/header) +target_link_directories(NDP_SM_Svr PRIVATE "L:/Qt_Project/HuskarUI_Qt5/HuskarUI_Qt5/HuskarUI/lib") target_link_libraries(NDP_SM_Svr PRIVATE Qt${QT_VERSION_MAJOR}::Core Qt${QT_VERSION_MAJOR}::Quick Qt${QT_VERSION_MAJOR}::QuickControls2 - DelegateUI + HuskarUIBasic libssh2 ) diff --git a/CMakeLists.txt.user b/CMakeLists.txt.user index fa2342f..4a63b07 100644 --- a/CMakeLists.txt.user +++ b/CMakeLists.txt.user @@ -1,6 +1,6 @@ - + EnvironmentId @@ -103,15 +103,15 @@ 2 false - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + -DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake -DCMAKE_BUILD_TYPE:STRING=Debug --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON -DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} 0 L:\Qt_Project\DP_SM_Svr\build\Desktop_Qt_5_15_2_MSVC2015_64bit-Debug @@ -161,15 +161,15 @@ 2 false - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + -DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake -DCMAKE_BUILD_TYPE:STRING=Release --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON -DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} L:\Qt_Project\DP_SM_Svr\build\Desktop_Qt_5_15_2_MSVC2015_64bit-Release @@ -218,15 +218,15 @@ 2 false - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + -DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON -DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} L:\Qt_Project\DP_SM_Svr\build\Desktop_Qt_5_15_2_MSVC2015_64bit-RelWithDebInfo @@ -273,15 +273,15 @@ 2 false - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + -DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfo --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON -DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} 0 L:\Qt_Project\DP_SM_Svr\build\Desktop_Qt_5_15_2_MSVC2015_64bit-Profile @@ -329,15 +329,15 @@ 2 false - -DCMAKE_GENERATOR:STRING=Ninja --DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} + -DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DCMAKE_PROJECT_INCLUDE_BEFORE:FILEPATH=%{BuildConfig:BuildDirectory:NativeFilePath}/.qtc/package-manager/auto-setup.cmake -DCMAKE_BUILD_TYPE:STRING=MinSizeRel --DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} --DCMAKE_PREFIX_PATH:PATH=%{Qt:QT_INSTALL_PREFIX} -DQT_QMAKE_EXECUTABLE:FILEPATH=%{Qt:qmakeExecutable} +-DCMAKE_CXX_FLAGS_INIT:STRING=%{Qt:QML_DEBUG_FLAG} +-DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON -DCMAKE_C_COMPILER:FILEPATH=%{Compiler:Executable:C} --DCMAKE_COLOR_DIAGNOSTICS:BOOL=ON +-DCMAKE_GENERATOR:STRING=Ninja +-DCMAKE_CXX_COMPILER:FILEPATH=%{Compiler:Executable:Cxx} L:\Qt_Project\DP_SM_Svr\build\Desktop_Qt_5_15_2_MSVC2015_64bit-MinSizeRel diff --git a/Component/CustomProgressBar.qml b/Component/CustomProgressBar.qml index 284f14c..c07c2ca 100644 --- a/Component/CustomProgressBar.qml +++ b/Component/CustomProgressBar.qml @@ -1,6 +1,6 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 Item { id: progressBarWrapper @@ -33,9 +33,9 @@ Item { anchors.centerIn: parent font { pixelSize: 12 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } } diff --git a/Component/DownloadItemDelegate.qml b/Component/DownloadItemDelegate.qml index bdb3b5c..314580a 100644 --- a/Component/DownloadItemDelegate.qml +++ b/Component/DownloadItemDelegate.qml @@ -3,7 +3,7 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 @@ -38,10 +38,10 @@ Item { } } - DelRectangle { + HusRectangle { anchors.fill: parent color: { - if(!DelTheme.isDark)return index % 2 === 0 ? "#eeeeee" : "#dddddd" + if(!HusTheme.isDark)return index % 2 === 0 ? "#eeeeee" : "#dddddd" else return index % 2 === 0 ? "#333333" : "#444444" } @@ -50,7 +50,7 @@ Item { topRightRadius: index === 0 ? 8 : 0 clip: true - DelRectangle{ + HusRectangle{ id:progress_color width: { if(modelData.status === 3)return parent.width @@ -82,34 +82,34 @@ Item { spacing: 15 // 文件图标 - DelIconText { - iconSource: DelIcon.CopyOutlined + HusIconText { + iconSource: HusIcon.CopyOutlined iconSize: 32 } // 文件名 - DelText { + HusText { text: modelData.fileName elide: Text.ElideMiddle font.bold: true font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } // 下载时间 - DelText { + HusText { text: timestr elide: Text.ElideMiddle font.bold: true font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } // 占位项,用于将状态和进度文本推到右边 @@ -118,7 +118,7 @@ Item { } // 进度百分比文本 - DelText { + HusText { visible: modelData.status === 3 ? false : true Layout.margins: 10 // 设置右边距 text: Math.min(modelData.progress,100) + "%" @@ -126,14 +126,14 @@ Item { font.bold: true font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase Layout.alignment: Qt.AlignRight } // 状态 - DelText { + HusText { Layout.margins: 10 // 设置右边距 text: { switch(modelData.status){ @@ -148,9 +148,9 @@ Item { font.bold: true font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase Layout.alignment: Qt.AlignRight } diff --git a/Component/JsonEditor.qml b/Component/JsonEditor.qml index 8b23ea2..c363ee4 100644 --- a/Component/JsonEditor.qml +++ b/Component/JsonEditor.qml @@ -2,7 +2,7 @@ import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import JsonEditor 1.0 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 ScrollView { width: 600 @@ -62,7 +62,7 @@ ScrollView { anchors.bottomMargin: 40 color:"transparent" radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 ScrollView { @@ -165,14 +165,14 @@ ScrollView { font.bold: true } - DelButton { + HusButton { text: "格式化" onClicked: { jsonEditor.text = jsonProcessor.formatJson(jsonEditor.text) } } - DelButton { + HusButton { text: "保存" onClicked: saveFunction(jsonEditor.text) } diff --git a/Component/ServerConsole.qml b/Component/ServerConsole.qml index 33f8248..89c2d35 100644 --- a/Component/ServerConsole.qml +++ b/Component/ServerConsole.qml @@ -1,7 +1,7 @@ import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 import SSHManager 1.0 @@ -31,11 +31,11 @@ Item { wrapMode: Text.WrapAnywhere font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase background: Rectangle { - color: DelTheme.isDark ? "#2d2d2d" : "#f5f5f5" + color: HusTheme.isDark ? "#2d2d2d" : "#f5f5f5" radius: 4 } @@ -49,11 +49,11 @@ Item { } } - DelInput { + HusInput { id: inputField width: consolearea.width - iconPosition: DelInput.Position_Left - iconSource: DelIcon.ForwardOutlined + iconPosition: HusInput.Position_Left + iconSource: HusIcon.ForwardOutlined placeholderText: qsTr("这里可以输入服务器命令") anchors { top: consolearea.bottom diff --git a/Component/UserCard.qml b/Component/UserCard.qml index 749493c..0075906 100644 --- a/Component/UserCard.qml +++ b/Component/UserCard.qml @@ -2,7 +2,7 @@ import QtQuick 2.15 import QtQuick.Controls 2.15 import QtGraphicalEffects 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 Rectangle { id: card @@ -58,10 +58,10 @@ Rectangle { clip: true - DelAvatar { + HusAvatar { id: avatarImg anchors.fill: parent - iconSource: DelIcon.UserOutlined + iconSource: HusIcon.UserOutlined } } diff --git a/DelegateUI/Controls/DelAcrylic.qml b/DelegateUI/Controls/DelAcrylic.qml deleted file mode 100644 index 1bbea2a..0000000 --- a/DelegateUI/Controls/DelAcrylic.qml +++ /dev/null @@ -1,50 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import DelegateUI 1.0 - -Item { - id: control - - property alias sourceItem: __source.sourceItem - property alias sourceRect: __source.sourceRect - property alias opacityNoise: __noiseImage.opacity - property alias radiusBlur: __fastBlur.radius - property real radiusBg: 0 - property color colorTint: "#fff" - property real opacityTint: 0.65 - property real luminosity: 0.01 - - ShaderEffectSource { - id: __source - anchors.fill: parent - visible: false - sourceRect: Qt.rect(control.x, control.y, control.width, control.height) - } - - FastBlur { - id: __fastBlur - anchors.fill: parent - source: __source - radius: 32 - } - - Rectangle { - anchors.fill: parent - color: DelThemeFunctions.alpha("#fff", luminosity) - radius: control.radiusBg - } - - Rectangle { - anchors.fill: parent - color: DelThemeFunctions.alpha(colorTint, opacityTint) - radius: control.radiusBg - } - - Image { - id: __noiseImage - anchors.fill: parent - source: "data:image/png;base64,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" - fillMode: Image.Tile - opacity: 0.02 - } -} diff --git a/DelegateUI/Controls/DelAutoComplete.qml b/DelegateUI/Controls/DelAutoComplete.qml deleted file mode 100644 index 70b18e1..0000000 --- a/DelegateUI/Controls/DelAutoComplete.qml +++ /dev/null @@ -1,211 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Window 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -DelInput { - id: control - - signal search(input: string) - signal select(option: var) - - property var options: [] - property var filterOption: (input, option) => true - property string textRole: 'label' - property string valueRole: 'value' - property bool tooltipVisible: false - property alias clearIconSource: control.iconSource - property alias clearIconSize: control.iconSize - property alias clearIconPosition: control.iconPosition - property int defaultPopupMaxHeight: 240 - property int defaultOptionSpacing: 0 - - property Component labelDelegate: Text { - text: textData - color: DelTheme.DelAutoComplete.colorItemText - font { - family: DelTheme.DelAutoComplete.fontFamily - pixelSize: DelTheme.DelAutoComplete.fontSize - weight: highlighted ? Font.DemiBold : Font.Normal - } - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter - } - property Component labelBgDelegate: Rectangle { - radius: 2 - color: highlighted ? DelTheme.DelAutoComplete.colorItemBgActive : - hovered ? DelTheme.DelAutoComplete.colorItemBgHover : - DelTheme.DelAutoComplete.colorItemBg; - } - property Component clearIconDelegate: DelIconText { - iconSource: control.clearIconSource - iconSize: control.iconSize - colorIcon: control.enabled ? - __iconMouse.hovered ? DelTheme.DelAutoComplete.colorIconHover : - DelTheme.DelAutoComplete.colorIcon : DelTheme.DelAutoComplete.colorIconDisabled - - Behavior on colorIcon { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - MouseArea { - id: __iconMouse - anchors.fill: parent - hoverEnabled: true - cursorShape: parent.iconSource == control.clearIconSource ? Qt.PointingHandCursor : Qt.ArrowCursor - onEntered: hovered = true; - onExited: hovered = false; - onClicked: control.clearInput(); - property bool hovered: false - } - } - - clearIconPosition: DelInput.Position_Right - iconDelegate: clearIconDelegate - onOptionsChanged: { - __popupListView.currentIndex = -1; - __private.model = options; - } - onTextEdited: { - control.search(text); - __private.filter(); - if (__private.model.length > 0) - control.openPopup(); - else - control.closePopup(); - } - - function clearInput() { - control.clear(); - control.textEdited(); - __popupListView.currentIndex = -1; - } - - function openPopup() { - if (!__popup.opened) - __popup.open(); - } - - function closePopup() { - __popup.close(); - } - - Item { - id: __private - property var window: Window.window - property var model: [] - function filter() { - __private.model = options.filter(option => filterOption(text, option) === true); - } - } - - TapHandler { - onTapped: { - if (__private.model.length > 0) - control.openPopup(); - } - } - - DelPopup { - id: __popup - implicitWidth: control.width - implicitHeight: Math.min(control.defaultPopupMaxHeight, __popupListView.contentHeight) + topPadding + bottomPadding - leftPadding: 4 - rightPadding: 4 - topPadding: 6 - bottomPadding: 6 - closePolicy: T.Popup.NoAutoClose | T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent - onAboutToShow: { - const pos = control.mapToItem(null, 0, 0); - x = (control.width - width) * 0.5; - if (__private.window.height > (pos.y + control.height + implicitHeight + 6)){ - y = control.height + 6; - } else if (pos.y > implicitHeight) { - y = -implicitHeight - 6; - } else { - y = __private.window.height - (pos.y + implicitHeight + 6); - } - } - enter: Transition { - NumberAnimation { - property: 'opacity' - from: 0.0 - to: 1.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - exit: Transition { - NumberAnimation { - property: 'opacity' - from: 1.0 - to: 0.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - contentItem: ListView { - id: __popupListView - clip: true - currentIndex: -1 - model: __private.model - boundsBehavior: Flickable.StopAtBounds - spacing: control.defaultOptionSpacing - delegate: T.ItemDelegate { - id: __popupDelegate - - required property var modelData - required property int index - - property var textData: modelData[control.textRole] - property var valueData: modelData[control.valueRole] ?? textData - - width: __popupListView.width - height: implicitContentHeight + topPadding + bottomPadding - leftPadding: 8 - rightPadding: 8 - topPadding: 4 - bottomPadding: 4 - highlighted: __popupListView.currentIndex === index - contentItem: Loader { - sourceComponent: control.labelDelegate - property alias textData: __popupDelegate.textData - property alias valueData: __popupDelegate.valueData - property alias modelData: __popupDelegate.modelData - property alias hovered: __popupDelegate.hovered - property alias highlighted: __popupDelegate.highlighted - } - background: Loader { - sourceComponent: control.labelBgDelegate - property alias textData: __popupDelegate.textData - property alias valueData: __popupDelegate.valueData - property alias modelData: __popupDelegate.modelData - property alias hovered: __popupDelegate.hovered - property alias highlighted: __popupDelegate.highlighted - } - onClicked: { - control.select(__popupDelegate.modelData); - control.text = __popupDelegate.valueData; - __popupListView.currentIndex = index; - __popup.close(); - __private.filter(); - } - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - - Loader { - y: __popupDelegate.height - anchors.horizontalCenter: parent.horizontalCenter - active: control.tooltipVisible - sourceComponent: DelToolTip { - arrowVisible: false - visible: __popupDelegate.hovered && !__popupDelegate.pressed - text: __popupDelegate.textData - position: DelToolTip.Position_Bottom - } - } - } - T.ScrollBar.vertical: DelScrollBar { } - } - } -} diff --git a/DelegateUI/Controls/DelAvatar.qml b/DelegateUI/Controls/DelAvatar.qml deleted file mode 100644 index c051a63..0000000 --- a/DelegateUI/Controls/DelAvatar.qml +++ /dev/null @@ -1,151 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import DelegateUI 1.0 - -Item { - id: control - - width: __loader.width - height: __loader.height - - textFont { - family: DelTheme.Primary.fontPrimaryFamily - pixelSize: control.size * 0.5 - } - - enum TextSiz { - Size_Fixed = 0, - Size_Auto = 1 - } - - property int size: 30 - property int iconSource: 0 - - property url imageSource: "" - property bool imageMipmap: false - - property string textSource: "" - property font textFont - property int textSize: DelAvatar.Size_Fixed - property int textGap: 4 - - property color colorBg: DelTheme.Primary.colorTextQuaternary - property color colorIcon: "white" - property color colorText: "white" - property int radiusBg: width * 0.5 - - Component { - id: __iconImpl - - Rectangle { - width: control.size - height: control.size - radius: control.radiusBg - color: control.colorBg - - DelIconText { - id: __iconSource - anchors.centerIn: parent - iconSource: control.iconSource - iconSize: control.size * 0.7 - colorIcon: control.colorIcon - } - } - } - - Component { - id: __imageImpl - - Rectangle { - width: control.size - height: control.size - radius: control.radiusBg - color: control.colorBg - - Rectangle { - id: __mask - anchors.fill: parent - radius: parent.radius - layer.enabled: true - visible: false - } - - Image { - id: __imageSource - anchors.fill: parent - mipmap: control.imageMipmap - source: control.imageSource - sourceSize: Qt.size(width, height) - layer.enabled: true - visible: false - } - - OpacityMask { - anchors.fill: parent - maskSource: __mask - source: __imageSource - } - } - } - - Component { - id: __textImpl - - Rectangle { - id: __bg - width: Math.max(control.size, __textSource.implicitWidth + control.textGap * 2); - height: width - radius: control.radiusBg - color: control.colorBg - Component.onCompleted: calcBestSize(); - - function calcBestSize() { - if (control.textSize == DelAvatar.Size_Fixed) { - __textSource.font.pixelSize = control.size * 0.5; - } else { - let bestSize = control.size * 0.5; - __fontMetrics.font.pixelSize = bestSize; - while ((__fontMetrics.advanceWidth(control.textSource) + control.textGap * 2 > control.size)) { - bestSize -= 1; - __fontMetrics.font.pixelSize = bestSize; - if (bestSize <= 1) break; - } - __textSource.font.pixelSize = bestSize; - } - } - - FontMetrics { - id: __fontMetrics - font.family: __textSource.font.family - } - - Text { - id: __textSource - anchors.centerIn: parent - color: control.colorText - text: control.textSource - smooth: true - font: control.textFont - - Connections { - target: control - function onTextSourceChanged() { - __bg.calcBestSize(); - } - } - } - } - } - - Loader { - id: __loader - sourceComponent: { - if (control.iconSource != 0) - return __iconImpl; - else if (control.imageSource != "") - return __imageImpl; - else - return __textImpl; - } - } -} diff --git a/DelegateUI/Controls/DelButton.qml b/DelegateUI/Controls/DelButton.qml deleted file mode 100644 index 37b5c21..0000000 --- a/DelegateUI/Controls/DelButton.qml +++ /dev/null @@ -1,201 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Button { - id: control - - enum Type { - Type_Default = 0, - Type_Outlined = 1, - Type_Primary = 2, - Type_Filled = 3, - Type_Text = 4, - Type_Link = 5 - } - - enum Shape { - Shape_Default = 0, - Shape_Circle = 1 - } - - property bool animationEnabled: DelTheme.animationEnabled - property bool effectEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property int type: DelButton.Type_Default - property int shape: DelButton.Shape_Default - property int radiusBg: DelTheme.DelButton.radiusBg - property color colorText: { - if (enabled) { - switch(control.type) - { - case DelButton.Type_Default: - return control.down ? DelTheme.DelButton.colorTextActive : - control.hovered ? DelTheme.DelButton.colorTextHover : - DelTheme.DelButton.colorTextDefault; - case DelButton.Type_Outlined: - return control.down ? DelTheme.DelButton.colorTextActive : - control.hovered ? DelTheme.DelButton.colorTextHover : - DelTheme.DelButton.colorText; - case DelButton.Type_Primary: return "white"; - case DelButton.Type_Filled: - case DelButton.Type_Text: - case DelButton.Type_Link: - return control.down ? DelTheme.DelButton.colorTextActive : - control.hovered ? DelTheme.DelButton.colorTextHover : - DelTheme.DelButton.colorText; - default: return DelTheme.DelButton.colorText; - } - } else { - return DelTheme.DelButton.colorTextDisabled; - } - } - property color colorBg: { - if (type == DelButton.Type_Link) return "transparent"; - if (enabled) { - switch(control.type) - { - case DelButton.Type_Default: - case DelButton.Type_Outlined: - return control.down ? DelTheme.DelButton.colorBgActive : - control.hovered ? DelTheme.DelButton.colorBgHover : - DelTheme.DelButton.colorBg; - case DelButton.Type_Primary: - return control.down ? DelTheme.DelButton.colorPrimaryBgActive: - control.hovered ? DelTheme.DelButton.colorPrimaryBgHover : - DelTheme.DelButton.colorPrimaryBg; - case DelButton.Type_Filled: - if (DelTheme.isDark) { - return control.down ? DelTheme.DelButton.colorFillBgDarkActive: - control.hovered ? DelTheme.DelButton.colorFillBgDarkHover : - DelTheme.DelButton.colorFillBgDark; - } else { - return control.down ? DelTheme.DelButton.colorFillBgActive: - control.hovered ? DelTheme.DelButton.colorFillBgHover : - DelTheme.DelButton.colorFillBg; - } - case DelButton.Type_Text: - if (DelTheme.isDark) { - return control.down ? DelTheme.DelButton.colorFillBgDarkActive: - control.hovered ? DelTheme.DelButton.colorFillBgDarkHover : - DelTheme.DelButton.colorTextBg; - } else { - return control.down ? DelTheme.DelButton.colorTextBgActive: - control.hovered ? DelTheme.DelButton.colorTextBgHover : - DelTheme.DelButton.colorTextBg; - } - default: return DelTheme.DelButton.colorBg; - } - } else { - return DelTheme.DelButton.colorBgDisabled; - } - } - property color colorBorder: { - if (type == DelButton.Type_Link) return "transparent"; - if (enabled) { - switch(control.type) - { - case DelButton.Type_Default: - return control.down ? DelTheme.DelButton.colorBorderActive : - control.hovered ? DelTheme.DelButton.colorBorderHover : - DelTheme.DelButton.colorDefaultBorder; - default: - return control.down ? DelTheme.DelButton.colorBorderActive : - control.hovered ? DelTheme.DelButton.colorBorderHover : - DelTheme.DelButton.colorBorder; - } - } else { - return DelTheme.DelButton.colorBorder; - } - } - property string contentDescription: text - - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: implicitContentHeight + topPadding + bottomPadding - padding: 15 - topPadding: 5 - bottomPadding: 5 - font { - family: DelTheme.DelButton.fontFamily - pixelSize: DelTheme.DelButton.fontSize - } - contentItem: Text { - text: control.text - font: control.font - lineHeight: DelTheme.DelButton.fontLineHeight - color: control.colorText - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - background: Item { - Rectangle { - id: __effect - width: __bg.width - height: __bg.height - radius: __bg.radius - anchors.centerIn: parent - visible: control.effectEnabled && control.type != DelButton.Type_Link - color: "transparent" - border.width: 0 - border.color: control.enabled ? DelTheme.DelButton.colorBorderHover : "transparent" - opacity: 0.2 - - ParallelAnimation { - id: __animation - onFinished: __effect.border.width = 0; - NumberAnimation { - target: __effect; property: "width"; from: __bg.width + 3; to: __bg.width + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "height"; from: __bg.height + 3; to: __bg.height + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "opacity"; from: 0.2; to: 0; - duration: DelTheme.Primary.durationSlow - } - } - - Connections { - target: control - function onReleased() { - if (control.animationEnabled && control.effectEnabled) { - __effect.border.width = 8; - __animation.restart(); - } - } - } - } - Rectangle { - id: __bg - width: realWidth - height: realHeight - anchors.centerIn: parent - radius: control.shape == DelButton.Shape_Default ? control.radiusBg : height * 0.5 - color: control.colorBg - border.width: (control.type == DelButton.Type_Filled || control.type == DelButton.Type_Text) ? 0 : 1 - border.color: control.enabled ? control.colorBorder : "transparent" - - property real realWidth: control.shape == DelButton.Shape_Default ? parent.width : parent.height - property real realHeight: control.shape == DelButton.Shape_Default ? parent.height : parent.height - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on border.color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - } - } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Accessible.role: Accessible.Button - Accessible.name: control.text - Accessible.description: control.contentDescription - Accessible.onPressAction: control.clicked(); -} diff --git a/DelegateUI/Controls/DelCaptionBar.qml b/DelegateUI/Controls/DelCaptionBar.qml deleted file mode 100644 index d959c86..0000000 --- a/DelegateUI/Controls/DelCaptionBar.qml +++ /dev/null @@ -1,193 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Window 2.15 -import DelegateUI 1.0 - -Rectangle { - id: control - - color: "transparent" - - property var targetWindow: null - property DelWindowAgent windowAgent: null - - property alias layoutDirection: __row.layoutDirection - - property string winTitle: targetWindow ? targetWindow.title : "" - property string winIcon: "" - property alias winIconWidth: __winIconLoader.width - property alias winIconHeight: __winIconLoader.height - property alias winIconVisible: __winIconLoader.visible - - property font winTitleFont - winTitleFont { - family: DelTheme.Primary.fontPrimaryFamily - pixelSize: 14 - } - property color winTitleColor: DelTheme.Primary.colorTextBase - property alias winTitleVisible: __winTitleLoader.visible - - property string contentDescription: targetWindow ? targetWindow.title : "" - - property bool returnButtonVisible: false - property bool themeButtonVisible: false - property bool topButtonVisible: false - property bool minimizeButtonVisible: Qt.platform.os !== "osx" - property bool maximizeButtonVisible: Qt.platform.os !== "osx" - property bool closeButtonVisible: Qt.platform.os !== "osx" - - property var returnCallback: () => { } - property var themeCallback: () => { DelTheme.darkMode = DelTheme.isDark ? DelTheme.Light : DelTheme.Dark; } - property var topCallback: checked => { } - property var minimizeCallback: - () => { - if (targetWindow) targetWindow.showMinimized(); - } - property var maximizeCallback: () => { - if (!targetWindow) return; - - if (targetWindow.visibility === Window.Maximized) targetWindow.showNormal(); - else targetWindow.showMaximized(); - } - property var closeCallback: () => { if (targetWindow) targetWindow.close(); } - - property Component winIconDelegate: Image { - source: control.winIcon - sourceSize.width: width - sourceSize.height: height - mipmap: true - } - property Component winTitleDelegate: Text { - text: winTitle - color: winTitleColor - font: winTitleFont - } - property Component winButtonsDelegate: Row { - Connections { - target: control - function onWindowAgentChanged() { - if (windowAgent) { - windowAgent.setHitTestVisible(__themeButton, true); - windowAgent.setHitTestVisible(__topButton, true); - windowAgent.setSystemButton(DelWindowAgent.Minimize, __minimizeButton); - windowAgent.setSystemButton(DelWindowAgent.Maximize, __maximizeButton); - windowAgent.setSystemButton(DelWindowAgent.Close, __closeButton); - } - } - } - - DelCaptionButton { - id: __themeButton - visible: control.themeButtonVisible - iconSource: DelTheme.isDark ? DelIcon.MoonOutlined : DelIcon.SunOutlined - iconSize: 16 - onClicked: themeCallback(); - contentDescription: qsTr("明暗主题切换") - } - - DelCaptionButton { - id: __topButton - visible: control.topButtonVisible - iconSource: DelIcon.PushpinOutlined - iconSize: 16 - checkable: true - onClicked: topCallback(checked); - contentDescription: qsTr("置顶") - } - - DelCaptionButton { - id: __minimizeButton - visible: control.minimizeButtonVisible - iconSource: DelIcon.LineOutlined - onClicked: minimizeCallback(); - contentDescription: qsTr("最小化") - } - - DelCaptionButton { - id: __maximizeButton - visible: control.maximizeButtonVisible - iconSource: targetWindow ? (targetWindow.visibility === Window.Maximized ? DelIcon.SwitcherOutlined : DelIcon.BorderOutlined) : 0 - onClicked: maximizeCallback(); - contentDescription: qsTr("最大化") - } - - DelCaptionButton { - id: __closeButton - visible: control.closeButtonVisible - iconSource: DelIcon.CloseOutlined - isError: true - onClicked: closeCallback(); - contentDescription: qsTr("关闭") - } - } - - function addInteractionItem(item) { - if (windowAgent) - windowAgent.setHitTestVisible(item, true); - } - - function removeInteractionItem(item) { - if (windowAgent) - windowAgent.setHitTestVisible(item, false); - } - - RowLayout { - id: __row - anchors.fill: parent - spacing: 0 - - DelCaptionButton { - id: __returnButton - Layout.alignment: Qt.AlignVCenter - iconSource: DelIcon.ArrowLeftOutlined - iconSize: DelTheme.DelCaptionButton.fontSize + 2 - visible: control.returnButtonVisible - onClicked: returnCallback(); - contentDescription: qsTr("返回") - } - - Item { - id: __title - Layout.fillWidth: true - Layout.fillHeight: true - Component.onCompleted: { - if (windowAgent) - windowAgent.setTitleBar(__title); - } - - Row { - height: parent.height - anchors.left: Qt.platform.os === "osx" ? undefined : parent.left - anchors.leftMargin: Qt.platform.os === "osx" ? 0 : 8 - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: Qt.platform.os === "osx" ? parent.horizontalCenter : undefined - spacing: 5 - - Loader { - id: __winIconLoader - width: 20 - height: 20 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: winIconDelegate - } - - Loader { - id: __winTitleLoader - anchors.verticalCenter: parent.verticalCenter - sourceComponent: winTitleDelegate - } - } - } - - Loader { - Layout.alignment: Qt.AlignVCenter - width: item ? item.width : 0 - height: item ? item.height : 0 - sourceComponent: winButtonsDelegate - } - } - - Accessible.role: Accessible.TitleBar - Accessible.name: control.contentDescription - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelCaptionButton.qml b/DelegateUI/Controls/DelCaptionButton.qml deleted file mode 100644 index e881f7c..0000000 --- a/DelegateUI/Controls/DelCaptionButton.qml +++ /dev/null @@ -1,40 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -DelIconButton { - id: control - - property bool isError: false - - leftPadding: 12 - rightPadding: 12 - radiusBg: 0 - hoverCursorShape: Qt.ArrowCursor - type: DelButton.Type_Text - iconSize: DelTheme.DelCaptionButton.fontSize - font.pixelSize: iconSize - effectEnabled: false - colorIcon: { - if (enabled) { - return checked ? DelTheme.DelCaptionButton.colorIconChecked : - DelTheme.DelCaptionButton.colorIcon; - } else { - return DelTheme.DelCaptionButton.colorIconDisabled; - } - } - colorBg: { - if (enabled) { - if (isError) { - return control.down ? DelTheme.DelCaptionButton.colorErrorBgActive: - control.hovered ? DelTheme.DelCaptionButton.colorErrorBgHover : - DelTheme.DelCaptionButton.colorErrorBg; - } else { - return control.down ? DelTheme.DelCaptionButton.colorBgActive: - control.hovered ? DelTheme.DelCaptionButton.colorBgHover : - DelTheme.DelCaptionButton.colorBg; - } - } else { - return DelTheme.DelCaptionButton.colorBgDisabled; - } - } -} diff --git a/DelegateUI/Controls/DelCard.qml b/DelegateUI/Controls/DelCard.qml deleted file mode 100644 index 4604449..0000000 --- a/DelegateUI/Controls/DelCard.qml +++ /dev/null @@ -1,171 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import DelegateUI 1.0 - -Rectangle { - id: control - - width: 300 - height: __column.height - color: DelTheme.DelCard.colorBg - border.color: DelTheme.isDark ? DelTheme.DelCard.colorBorderDark : DelTheme.DelCard.colorBorder - radius: DelTheme.DelCard.radiusBg - clip: true - - titleFont { - family: DelTheme.DelCard.fontFamily - pixelSize: DelTheme.DelCard.fontSizeTitle - weight: Font.DemiBold - } - - bodyTitleFont { - family: DelTheme.DelCard.fontFamily - pixelSize: DelTheme.DelCard.fontSizeBodyTitle - weight: Font.DemiBold - } - - bodyDescriptionFont { - family: DelTheme.DelCard.fontFamily - pixelSize: DelTheme.DelCard.fontSizeBodyDescription - } - - property bool animationEnabled: DelTheme.animationEnabled - - property string title: "" - property font titleFont - - property url coverSource: "" - property int coverFillMode: Image.Stretch - - property int bodyAvatarSize: 40 - property int bodyAvatarIcon: 0 - property string bodyAvatarSource: "" - property string bodyAvatarText: "" - property string bodyTitle: "" - property font bodyTitleFont - property string bodyDescription: "" - property font bodyDescriptionFont - - property color colorTitle: DelTheme.DelCard.colorTitle - property color colorBodyAvatar: DelTheme.DelCard.colorBodyAvatar - property color colorBodyAvatarBg: "transparent" - property color colorBodyTitle: DelTheme.DelCard.colorBodyTitle - property color colorBodyDescription: DelTheme.DelCard.colorBodyDescription - - property Component titleDelegate: Item { - height: 60 - - RowLayout { - anchors.fill: parent - anchors.topMargin: 5 - anchors.bottomMargin: 5 - anchors.leftMargin: 15 - anchors.rightMargin: 15 - - Text { - Layout.fillWidth: true - Layout.fillHeight: true - text: control.title - font: control.titleFont - color: control.colorTitle - wrapMode: Text.WrapAnywhere - verticalAlignment: Text.AlignVCenter - } - - Loader { - Layout.alignment: Qt.AlignVCenter - sourceComponent: extraDelegate - } - } - - DelDivider { - width: parent.width; - height: 1 - anchors.bottom: parent.bottom - visible: control.coverSource == "" - } - } - property Component extraDelegate: Item { } - property Component coverDelegate: Image { - height: control.coverSource == "" ? 0 : 180 - source: control.coverSource - fillMode: control.coverFillMode - } - property Component bodyDelegate: Item { - height: 100 - - RowLayout { - anchors.fill: parent - - Item { - Layout.preferredWidth: __avatar.visible ? 70 : 0 - Layout.fillHeight: true - - DelAvatar { - id: __avatar - size: control.bodyAvatarSize - anchors.centerIn: parent - colorBg: control.colorBodyAvatarBg - iconSource: control.bodyAvatarIcon - imageSource: control.bodyAvatarSource - textSource: control.bodyAvatarText - colorIcon: control.colorBodyAvatar - colorText: control.colorBodyAvatar - visible: !(iconSource == 0 && imageSource == "" && textSource == "") - } - } - - ColumnLayout { - Layout.fillWidth: true - Layout.fillHeight: true - - Text { - Layout.fillWidth: true - leftPadding: __avatar.visible ? 0 : 15 - rightPadding: 15 - text: control.bodyTitle - font: control.bodyTitleFont - color: control.colorBodyTitle - wrapMode: Text.WrapAnywhere - visible: control.bodyTitle != "" - } - - Text { - Layout.fillWidth: true - leftPadding: __avatar.visible ? 0 : 15 - rightPadding: 15 - text: control.bodyDescription - font: control.bodyDescriptionFont - color: control.colorBodyDescription - wrapMode: Text.WrapAnywhere - visible: control.bodyDescription != "" - } - } - } - } - property Component actionDelegate: Item { } - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - Column { - id: __column - width: parent.width - - Loader { - width: parent.width - sourceComponent: titleDelegate - } - Loader { - width: parent.width - sourceComponent: coverDelegate - } - Loader { - width: parent.width - sourceComponent: bodyDelegate - } - Loader { - width: parent.width - sourceComponent: actionDelegate - } - } -} diff --git a/DelegateUI/Controls/DelCheckBox.qml b/DelegateUI/Controls/DelCheckBox.qml deleted file mode 100644 index 39cf6c3..0000000 --- a/DelegateUI/Controls/DelCheckBox.qml +++ /dev/null @@ -1,129 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.CheckBox { - id: control - - property bool animationEnabled: DelTheme.animationEnabled - property bool effectEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property int indicatorSize: 20 - property color colorText: enabled ? DelTheme.DelCheckBox.colorText : DelTheme.DelCheckBox.colorTextDisabled - property color colorIndicator: enabled ? - (checkState != Qt.Unchecked) ? DelTheme.DelCheckBox.colorIndicatorChecked : - DelTheme.DelCheckBox.colorIndicator : DelTheme.DelCheckBox.colorIndicatorDisabled - property color colorIndicatorBorder: enabled ? - (hovered || checked) ? DelTheme.DelCheckBox.colorIndicatorBorderChecked : - DelTheme.DelCheckBox.colorIndicatorBorder : DelTheme.DelCheckBox.colorIndicatorDisabled - property string contentDescription: "" - - font { - family: DelTheme.DelCheckBox.fontFamily - pixelSize: DelTheme.DelCheckBox.fontSize - } - - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: Math.max(implicitContentHeight, implicitIndicatorHeight) + topPadding + bottomPadding - spacing: 6 - indicator: Item { - x: control.leftPadding - implicitWidth: __bg.implicitWidth - implicitHeight: __bg.implicitHeight - anchors.verticalCenter: parent.verticalCenter - - Rectangle { - id: __effect - width: __bg.implicitWidth - height: __bg.implicitHeight - radius: 4 - anchors.centerIn: parent - visible: control.effectEnabled - color: "transparent" - border.width: 0 - border.color: control.enabled ? DelTheme.DelCheckBox.colorEffectBg : "transparent" - opacity: 0.2 - - ParallelAnimation { - id: __animation - onFinished: __effect.border.width = 0; - NumberAnimation { - target: __effect; property: "width"; from: __bg.implicitWidth + 2; to: __bg.implicitWidth + 6; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "height"; from: __bg.implicitHeight + 2; to: __bg.implicitHeight + 6; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "opacity"; from: 0.2; to: 0; - duration: DelTheme.Primary.durationSlow - } - } - - Connections { - target: control - function onReleased() { - if (control.animationEnabled && control.effectEnabled) { - __effect.border.width = 6; - __animation.restart(); - } - } - } - } - - DelIconText { - id: __bg - iconSize: control.indicatorSize - iconSource: DelIcon.BorderOutlined - anchors.centerIn: parent - colorIcon: control.colorIndicatorBorder - - Behavior on colorIcon { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - /*! √ 的背景色 */ - DelIconText { - anchors.centerIn: parent - iconSource: DelIcon.XFilledPath1 - iconSize: parent.iconSize * 0.5 - colorIcon: "#fff" - visible: control.checkState == Qt.Checked - } - - DelIconText { - iconSource: DelIcon.CheckSquareFilled - iconSize: parent.iconSize - colorIcon: control.colorIndicator - visible: control.checkState == Qt.Checked - } - - DelIconText { - anchors.centerIn: parent - iconSource: DelIcon.XFilledPath1 - iconSize: parent.iconSize * 0.5 - colorIcon: control.colorIndicator - visible: control.checkState == Qt.PartiallyChecked - } - } - } - contentItem: Text { - text: control.text - font: control.font - opacity: enabled ? 1.0 : 0.3 - color: control.colorText - verticalAlignment: Text.AlignVCenter - leftPadding: control.indicator.width + control.spacing - } - background: Item { } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Accessible.role: Accessible.CheckBox - Accessible.name: control.text - Accessible.description: control.contentDescription - Accessible.onPressAction: control.clicked(); -} diff --git a/DelegateUI/Controls/DelCollapse.qml b/DelegateUI/Controls/DelCollapse.qml deleted file mode 100644 index c37ff7d..0000000 --- a/DelegateUI/Controls/DelCollapse.qml +++ /dev/null @@ -1,262 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - - height: __listView.contentHeight - - titleFont { - family: DelTheme.DelCollapse.fontFamily - pixelSize: DelTheme.DelCollapse.fontSizeTitle - } - contentFont { - family: DelTheme.DelCollapse.fontFamily - pixelSize: DelTheme.DelCollapse.fontSizeContent - } - - signal actived(key: string) - - property bool animationEnabled: DelTheme.animationEnabled - property int hoverCursorShape: Qt.PointingHandCursor - property var initModel: [] - property alias count: __listModel.count - property alias spacing: __listView.spacing - property bool accordion: false - property var activeKey: accordion ? "" : [] - property var defaultActiveKey: [] - property int expandIcon: DelIcon.RightOutlined - property font titleFont - property color colorBg: DelTheme.DelCollapse.colorBg - property color colorIcon: DelTheme.DelCollapse.colorIcon - property color colorTitle: DelTheme.DelCollapse.colorTitle - property color colorTitleBg: DelTheme.DelCollapse.colorTitleBg - property font contentFont - property color colorContent: DelTheme.DelCollapse.colorContent - property color colorContentBg: DelTheme.DelCollapse.colorContentBg - property color colorBorder: DelTheme.isDark ? DelTheme.DelCollapse.colorBorderDark : DelTheme.DelCollapse.colorBorder - property int radiusBg: 6 - property Component titleDelegate: Row { - leftPadding: 16 - rightPadding: 16 - height: Math.max(40, __icon.height, __title.height) - spacing: 8 - - DelIconText { - id: __icon - anchors.verticalCenter: parent.verticalCenter - iconSource: control.expandIcon - colorIcon: control.colorIcon - rotation: isActive ? 90 : 0 - - Behavior on rotation { enabled: control.animationEnabled; RotationAnimation { duration: DelTheme.Primary.durationFast } } - } - - Text { - id: __title - anchors.verticalCenter: parent.verticalCenter - text: model.title - elide: Text.ElideRight - font: control.titleFont - color: control.colorTitle - } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - } - property Component contentDelegate: DelCopyableText { - padding: 16 - topPadding: 8 - bottomPadding: 8 - text: model.content - font: control.contentFont - wrapMode: Text.WordWrap - color: control.colorContent - } - - onInitModelChanged: { - clear(); - for (const object of initModel) { - append(object); - } - } - - function get(index) { - return __listModel.get(index); - } - - function set(index, object) { - __listModel.set(index, object); - } - - function setProperty(index, propertyName, value) { - __listModel.setProperty(index, propertyName, value); - } - - function move(from, to, count = 1) { - __listModel.move(from, to, count); - } - - function insert(index, object) { - __listModel.insert(index, object); - } - - function append(object) { - __listModel.append(object); - } - - function remove(index, count = 1) { - __listModel.remove(index, count); - } - - function clear() { - __listModel.clear(); - } - - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorTitle { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorTitleBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorContent { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorContentBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - QtObject { - id: __private - function calcActiveKey() { - if (control.accordion) { - for (let i = 0; i < __listView.count; i++) { - const item = __listView.itemAtIndex(i); - if (item && item.active) { - control.activeKey = item.model.key; - break; - } - } - } else { - let keys = []; - for (let i = 0; i < __listView.count; i++) { - const item = __listView.itemAtIndex(i); - if (item && item.active) { - keys.push(item.model.key); - } - } - control.activeKey = keys; - } - } - } - - ListView { - id: __listView - anchors.fill: parent - interactive: false - spacing: -1 - model: ListModel { id: __listModel } - onContentHeightChanged: cacheBuffer = contentHeight; - delegate: DelRectangle { - id: __rootItem - width: __listView.width - height: __column.height + ((detached && active) ? 1 : 0) - topLeftRadius: (isStart || detached) ? control.radiusBg : 0 - topRightRadius: (isStart || detached) ? control.radiusBg : 0 - bottomLeftRadius: (isEnd || detached) ? control.radiusBg : 0 - bottomRightRadius: (isEnd || detached) ? control.radiusBg : 0 - color: control.colorBg - border.color: control.colorBorder - border.width: detached ? 1 : 0 - clip: true - - required property var model - required property int index - property bool isStart: index == 0 - property bool isEnd: (index + 1) === control.count - property bool active: false - property bool detached: __listView.spacing !== -1 - - Component.onCompleted: { - if (control.defaultActiveKey.indexOf(model.key) != -1) - active = true; - } - - Column { - id: __column - width: parent.width - anchors.horizontalCenter: parent.horizontalCenter - - DelRectangle { - width: parent.width - height: __titleLoader.height - topLeftRadius: (isStart || detached) ? control.radiusBg : 0 - topRightRadius: (isStart || detached) ? control.radiusBg : 0 - bottomLeftRadius: (isEnd && !active) || (detached && !active) ? control.radiusBg : 0 - bottomRightRadius: (isEnd && !active) || (detached && !active) ? control.radiusBg : 0 - color: control.colorTitleBg - border.color: control.colorBorder - - Loader { - id: __titleLoader - width: parent.width - sourceComponent: titleDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - property alias isActive: __rootItem.active - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - onTapped: { - if (control.accordion) { - for (let i = 0; i < __listView.count; i++) { - const item = __listView.itemAtIndex(i); - if (item && item !== __rootItem) { - item.active = false; - } - } - __rootItem.active = !__rootItem.active; - } else { - __rootItem.active = !__rootItem.active; - } - if (__rootItem.active) - control.actived(__rootItem.model.key); - __private.calcActiveKey(); - } - } - } - } - - DelRectangle { - width: parent.width - __rootItem.border.width * 2 - height: active ? __contentLoader.height : 0 - anchors.horizontalCenter: parent.horizontalCenter - bottomLeftRadius: control.radiusBg - bottomRightRadius: control.radiusBg - color: control.colorContentBg - clip: true - - Behavior on height { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - - Loader { - id: __contentLoader - width: parent.width - anchors.centerIn: parent - sourceComponent: contentDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - property alias isActive: __rootItem.active - } - } - } - } - } - - Loader { - anchors.fill: __listView - active: spacing === -1 - sourceComponent: Rectangle { - color: "transparent" - border.color: control.colorBorder - radius: control.radiusBg - } - } -} diff --git a/DelegateUI/Controls/DelCopyableText.qml b/DelegateUI/Controls/DelCopyableText.qml deleted file mode 100644 index 5af46b7..0000000 --- a/DelegateUI/Controls/DelCopyableText.qml +++ /dev/null @@ -1,17 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -TextEdit { - id: control - - readOnly: true - color: DelTheme.DelCopyableText.colorText - selectByMouse: true - selectByKeyboard: true - selectedTextColor: DelTheme.DelCopyableText.colorSelectedText - selectionColor: DelTheme.DelCopyableText.colorSelection - font { - family: DelTheme.DelCopyableText.fontFamily - pixelSize: DelTheme.DelCopyableText.fontSize - } -} diff --git a/DelegateUI/Controls/DelDatePicker.qml b/DelegateUI/Controls/DelDatePicker.qml deleted file mode 100644 index 6d9fdc7..0000000 --- a/DelegateUI/Controls/DelDatePicker.qml +++ /dev/null @@ -1,675 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Window 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Controls 2.15 -import Qt.labs.calendar 1.0 as T -import DelegateUI 1.0 - -Item { - id: control - - width: 160 - height: 32 - - enum IconPosition { - Position_Left = 0, - Position_Right = 1 - } - - enum PickerMode { - Mode_Year = 0, - Mode_Quarter = 1, - Mode_Month = 2, - Mode_Week = 3, - Mode_Day = 4 - } - - property bool animationEnabled: DelTheme.animationEnabled - property alias placeholderText: __input.placeholderText - property int iconPosition: DelDatePicker.Position_Right - property int pickerMode: DelDatePicker.Mode_Day - - property var initDate: undefined - property var currentDate: new Date() - property int currentYear: new Date().getFullYear() - property int currentMonth: new Date().getMonth() - property int currentDay: new Date().getDate() - property int currentWeekNumber: DelApi.getWeekNumber(new Date()) - property int currentQuarter: Math.floor(currentMonth / 3) + 1 - - property int visualYear: control.currentYear - property int visualMonth: control.currentMonth - property int visualQuarter: control.currentQuarter - - property string dateFormat: "yyyy-MM-dd" - - property Component dayDelegate: DelButton { - padding: 0 - implicitWidth: 28 - implicitHeight: 28 - type: DelButton.Type_Primary - text: model.day - font { - family: DelTheme.DelDatePicker.fontFamily - pixelSize: DelTheme.DelDatePicker.fontSize - } - effectEnabled: false - colorBorder: model.today ? DelTheme.DelDatePicker.colorDayBorderToday : 'transparent' - colorText: { - if (control.pickerMode === DelDatePicker.Mode_Week) { - return isCurrentWeek || isHoveredWeek ? 'white' : isCurrentVisualMonth ? DelTheme.DelDatePicker.colorDayText : - DelTheme.DelDatePicker.colorDayTextNone; - } else { - return isCurrentDay ? 'white' : isCurrentVisualMonth ? DelTheme.DelDatePicker.colorDayText : - DelTheme.DelDatePicker.colorDayTextNone; - } - } - colorBg: { - if (control.pickerMode === DelDatePicker.Mode_Week) { - return 'transparent'; - } else { - return isCurrentDay ? DelTheme.DelDatePicker.colorDayBgCurrent : - hovered ? DelTheme.DelDatePicker.colorDayBgHover : - DelTheme.DelDatePicker.colorDayBg; - } - } - } - - onInitDateChanged: { - if (initDate) - __private.selectDate(initDate); - } - - function openPicker() { - if (!__picker.opened) - __picker.open(); - } - - function closePicker() { - __picker.close(); - } - - component PageButton: DelIconButton { - leftPadding: 8 - rightPadding: 8 - type: DelButton.Type_Link - iconSize: 16 - colorIcon: hovered ? DelTheme.DelDatePicker.colorPageIconHover : DelTheme.DelDatePicker.colorPageIcon - } - - component PickerHeader: RowLayout { - id: __pickerHeaderComp - - property bool isPickYear: false - property bool isPickMonth: false - property bool isPickQuarter: control.pickerMode == DelDatePicker.Mode_Quarter - - PageButton { - Layout.alignment: Qt.AlignVCenter - iconSource: DelIcon.DoubleLeftOutlined - onClicked: { - var prevYear = control.visualYear - (__pickerHeaderComp.isPickYear ? 10 : 1); - if (prevYear > -9999) { - control.visualYear = prevYear; - } - } - } - - PageButton { - Layout.alignment: Qt.AlignVCenter - iconSource: DelIcon.LeftOutlined - visible: !__pickerHeaderComp.isPickMonth && !__pickerHeaderComp.isPickMonth - onClicked: { - if (__pickerHeaderComp.isPickYear) { - var prev1Year = control.visualYear - 1; - if (prev1Year >= -9999) { - control.visualYear = prev1Year; - } - } else { - var prevMonth = control.visualMonth - 1; - if (prevMonth < 0) { - var prevYear = control.visualYear - 1; - if (prevYear >= -9999) { - control.visualYear = prevYear; - control.visualMonth = 11; - } - } else { - control.visualMonth = prevMonth; - } - } - } - } - - Item { - Layout.alignment: Qt.AlignVCenter - Layout.fillWidth: true - Layout.preferredHeight: __centerRow.height - - Row { - id: __centerRow - anchors.horizontalCenter: parent.horizontalCenter - - PageButton { - text: control.visualYear + qsTr('年') - colorText: hovered ? DelTheme.DelDatePicker.colorPageTextHover : DelTheme.DelDatePicker.colorPageText - font.bold: true - onClicked: { - __pickerHeaderComp.isPickYear = true; - __pickerHeaderComp.isPickMonth = false; - __pickerHeaderComp.isPickQuarter = false; - } - } - - PageButton { - visible: control.pickerMode != DelDatePicker.Mode_Year && - control.pickerMode != DelDatePicker.Mode_Quarter && - !__pickerHeaderComp.isPickQuarter && - !__pickerHeaderComp.isPickYear - text: (control.visualMonth + 1) + qsTr('月') - colorText: hovered ? DelTheme.DelDatePicker.colorPageTextHover : DelTheme.DelDatePicker.colorPageText - font.bold: true - onClicked: { - __pickerHeaderComp.isPickYear = false; - __pickerHeaderComp.isPickMonth = true; - } - } - } - } - - PageButton { - Layout.alignment: Qt.AlignVCenter - iconSource: DelIcon.RightOutlined - visible: !__pickerHeaderComp.isPickMonth && !__pickerHeaderComp.isPickMonth - onClicked: { - if (__pickerHeaderComp.isPickYear) { - var next1Year = control.visualYear + 1; - if (next1Year < 9999) { - control.visualYear = next1Year; - } - } else { - var nextMonth = control.visualMonth + 1; - if (nextMonth >= 11) { - var nextYear = control.visualYear + 1; - if (nextYear <= 9999) { - control.visualYear = nextYear; - control.visualMonth = 0; - } - } else { - control.visualMonth = nextMonth; - } - } - } - } - - PageButton { - Layout.alignment: Qt.AlignVCenter - iconSource: DelIcon.DoubleRightOutlined - onClicked: { - var nextYear = control.visualYear + (__pickerHeaderComp.isPickYear ? 10 : 1); - if (nextYear < 9999) { - control.visualYear = nextYear; - } - } - } - } - - component PickerButton: DelButton { - padding: 20 - topPadding: 4 - bottomPadding: 4 - effectEnabled: false - colorBorder: 'transparent' - colorBg: checked ? DelTheme.DelDatePicker.colorDayBgCurrent : - hovered ? DelTheme.DelDatePicker.colorDayBgHover : - DelTheme.DelDatePicker.colorDayBg - colorText: checked ? 'white' : DelTheme.DelDatePicker.colorDayText - } - - Item { - id: __private - property var window: Window.window - property int hoveredWeekNumber: control.currentWeekNumber - - function selectDate(date) { - var month = date.getMonth(); - var weekNumber = DelApi.getWeekNumber(date); - var quarter = Math.floor(month / 3) + 1; - if (control.pickerMode === DelDatePicker.Mode_Week) { - let inputDate = date; - let weekYear = date.getFullYear(); - if (weekNumber === 1 && month === 11) { - weekYear++; - inputDate = new Date(weekYear + 1, 0, 0); - } - __input.text = Qt.formatDate(inputDate, control.dateFormat.replace('w', String(weekNumber))); - } else if (control.pickerMode == DelDatePicker.Mode_Quarter) { - __input.text = Qt.formatDate(date, control.dateFormat.replace('q', String(quarter))); - } else { - __input.text = Qt.formatDate(date, control.dateFormat); - } - - control.currentDate = date; - control.currentYear = date.getFullYear(); - control.currentMonth = month; - control.currentDay = date.getDate(); - control.currentWeekNumber = weekNumber; - - control.closePicker(); - } - } - - DelInput { - id: __input - width: parent.width - height: parent.height - iconPosition: DelInput.Position_Right - iconDelegate: DelIconText { - anchors.left: control.iconPosition === DelDatePicker.Position_Left ? parent.left : undefined - anchors.right: control.iconPosition === DelDatePicker.Position_Right ? parent.right : undefined - anchors.margins: 5 - anchors.verticalCenter: parent.verticalCenter - iconSource: (__input.hovered && __input.length !== 0) ? DelIcon.CloseCircleFilled : DelIcon.CalendarOutlined - iconSize: __input.iconSize - colorIcon: control.enabled ? - __iconMouse.hovered ? DelTheme.DelDatePicker.colorInputIconHover : - DelTheme.DelDatePicker.colorInputIcon : DelTheme.DelDatePicker.colorInputIconDisabled - - Behavior on colorIcon { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - MouseArea { - id: __iconMouse - anchors.fill: parent - hoverEnabled: true - cursorShape: parent.iconSource == DelIcon.CloseCircleFilled ? Qt.PointingHandCursor : Qt.ArrowCursor - onEntered: hovered = true; - onExited: hovered = false; - onClicked: { - if (initDate) { - __private.selectDate(initDate); - __input.clear(); - } else { - __private.selectDate(new Date()); - __input.clear(); - } - } - property bool hovered: false - } - } - - TapHandler { - onTapped: { - control.openPicker(); - } - } - } - - DelPopup { - id: __picker - - function adjustPosition() { - var pos = control.mapToItem(null, 0, 0); - var pickerX = (control.width - implicitWidth) * 0.5; - if ((pos.x + pickerX) < 0) - x = pickerX + Math.abs(pos.x + pickerX) + 6; - else if (__private.window.width < (pos.x + pickerX + implicitWidth)) { - x = __private.window.width - pos.x - implicitWidth - 6; - } else { - x = pickerX; - } - - if (onTop) { - y = -implicitHeight - 6; - } else { - if (__private.window.height > (pos.y + control.height + implicitHeight + 6)){ - y = control.height + 6; - } else if (pos.y > implicitHeight) { - y = -implicitHeight - 6; - onTop = true; - } else { - y = __private.window.height - (pos.y + implicitHeight + 6); - } - } - } - - property bool onTop: false - - x: (control.width - implicitWidth) * 0.5 - y: control.height + 6 - width: implicitWidth - height: implicitHeight - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: implicitContentHeight + topPadding + bottomPadding - padding: 10 - leftPadding: 12 - rightPadding: 12 - closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutsideParent - enter: Transition { - NumberAnimation { - property: 'opacity' - from: 0.0 - to: 1.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - exit: Transition { - NumberAnimation { - property: 'opacity' - from: 1.0 - to: 0.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - onAboutToShow: { - control.visualYear = control.currentYear; - control.visualMonth = control.currentMonth; - control.visualQuarter = control.currentQuarter; - - switch (control.pickerMode) { - case DelDatePicker.Mode_Day: - case DelDatePicker.Mode_Week: - { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickMonth = false; - __pickerHeader.isPickQuarter = false; - } break; - case DelDatePicker.Mode_Month: - { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickMonth = true; - __pickerHeader.isPickQuarter = false; - } break; - case DelDatePicker.Mode_Quarter: - { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickMonth = false; - __pickerHeader.isPickQuarter = true; - } break; - case DelDatePicker.Mode_Year: - { - __pickerHeader.isPickYear = true; - __pickerHeader.isPickMonth = false; - __pickerHeader.isPickQuarter = false; - } break; - default: - { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickMonth = false; - __pickerHeader.isPickQuarter = false; - } - } - } - onOpened: adjustPosition(); - onHeightChanged: adjustPosition(); - contentItem: Item { - implicitWidth: __pickerColumn.implicitWidth - implicitHeight: __pickerColumn.implicitHeight - - Column { - id: __pickerColumn - spacing: 5 - - PickerHeader { - id: __pickerHeader - width: parent.width - } - - Rectangle { - width: parent.width - height: 1 - color: DelTheme.DelDatePicker.colorSplitLine - } - - T.DayOfWeekRow { - id: __dayOfWeekRow - visible: (control.pickerMode == DelDatePicker.Mode_Day || control.pickerMode == DelDatePicker.Mode_Week) && - !__pickerHeader.isPickYear && !__pickerHeader.isPickMonth - locale: __monthGrid.locale - spacing: 10 - delegate: Text { - width: __dayOfWeekRow.itemWidth - text: shortName - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - font { - family: DelTheme.DelDatePicker.fontFamily - pixelSize: DelTheme.DelDatePicker.fontSize - } - color: DelTheme.DelDatePicker.colorWeekText - - required property string shortName - } - property real itemWidth: (__monthGrid.implicitWidth - 6 * spacing) / 7 - } - - T.MonthGrid { - id: __monthGrid - visible: __dayOfWeekRow.visible - padding: 0 - spacing: 0 - year: control.visualYear - month: control.visualMonth - locale: Qt.locale() - delegate: Item { - id: __dayItem - width: __dayLoader.implicitWidth + 16 - height: __dayLoader.implicitHeight + 6 - - required property var model - property int weekYear: (model.weekNumber === 1 && model.month === 11) ? (model.year + 1) : model.year - property int currentYear: (control.currentWeekNumber === 1 && control.currentMonth === 11) ? (control.currentYear + 1) : - control.currentYear - property bool isCurrentWeek: control.currentWeekNumber === model.weekNumber && weekYear === __dayItem.currentYear - property bool isHoveredWeek: __monthGrid.hovered && __private.hoveredWeekNumber === model.weekNumber - property bool isCurrentMonth: control.currentYear === model.year && control.currentMonth === model.month - property bool isCurrentVisualMonth: control.visualMonth === model.month - property bool isCurrentDay: control.currentYear === model.year && - control.currentMonth === model.month && - control.currentDay === model.day - - Rectangle { - width: parent.width - height: __dayLoader.implicitHeight - anchors.verticalCenter: parent.verticalCenter - clip: true - color: { - if (control.pickerMode === DelDatePicker.Mode_Week) { - return __dayItem.isCurrentWeek ? DelTheme.DelDatePicker.colorDayItemBgCurrent : - __dayItem.isHoveredWeek ? DelTheme.DelDatePicker.colorDayItemBgHover : - DelTheme.DelDatePicker.colorDayItemBg; - } else { - return 'transparent'; - } - } - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - Loader { - id: __dayLoader - anchors.centerIn: parent - sourceComponent: control.dayDelegate - property alias model: __dayItem.model - property alias isCurrentWeek: __dayItem.isCurrentWeek - property alias isHoveredWeek: __dayItem.isHoveredWeek - property alias isCurrentMonth: __dayItem.isCurrentMonth - property alias isCurrentVisualMonth: __dayItem.isCurrentVisualMonth - property alias isCurrentDay: __dayItem.isCurrentDay - } - - HoverHandler { - id: __hoverHandler - onHoveredChanged: { - if (hovered) { - __private.hoveredWeekNumber = __dayItem.model.weekNumber; - } - } - } - - MouseArea { - anchors.fill: parent - onClicked: __private.selectDate(model.date); - } - } - } - - NumberAnimation on scale { - running: control.animationEnabled && __monthGrid.visible - from: 0 - to: 1 - easing.type: Easing.OutCubic - duration: DelTheme.Primary.durationMid - } - } - - Grid { - id: __yearPicker - anchors.horizontalCenter: parent.horizontalCenter - rows: 4 - columns: 3 - rowSpacing: 10 - columnSpacing: 10 - visible: __pickerHeader.isPickYear - - NumberAnimation on scale { - running: control.animationEnabled && __yearPicker.visible - from: 0 - to: 1 - easing.type: Easing.OutCubic - duration: DelTheme.Primary.durationMid - } - - Repeater { - model: 12 - delegate: Item { - width: 80 - height: 40 - - PickerButton { - id: __yearPickerButton - anchors.centerIn: parent - text: year - checked: year == control.visualYear - onClicked: { - control.visualYear = year; - if (control.pickerMode == DelDatePicker.Mode_Day || - control.pickerMode == DelDatePicker.Mode_Week || - control.pickerMode == DelDatePicker.Mode_Month) { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickMonth = true; - } else if (control.pickerMode == DelDatePicker.Mode_Quarter) { - __pickerHeader.isPickYear = false; - __pickerHeader.isPickQuarter = true; - } else if (control.pickerMode == DelDatePicker.Mode_Year) { - __private.selectDate(new Date(control.visualYear + 1, 0, 0)); - } - } - property int year: control.visualYear + modelData - 4 - } - } - } - } - - Grid { - id: __monthPicker - anchors.horizontalCenter: parent.horizontalCenter - rows: 4 - columns: 3 - rowSpacing: 10 - columnSpacing: 10 - visible: __pickerHeader.isPickMonth - - NumberAnimation on scale { - running: control.animationEnabled && __monthPicker.visible - from: 0 - to: 1 - easing.type: Easing.OutCubic - duration: DelTheme.Primary.durationMid - } - - Repeater { - model: 12 - delegate: Item { - width: 80 - height: 40 - - PickerButton { - id: __monthPickerButton - anchors.centerIn: parent - text: (month + 1) + qsTr('月') - checked: month == control.visualMonth - onClicked: { - control.visualMonth = month; - if (control.pickerMode == DelDatePicker.Mode_Day || - control.pickerMode == DelDatePicker.Mode_Week) { - __pickerHeader.isPickMonth = false; - } else if (control.pickerMode == DelDatePicker.Mode_Month) { - __private.selectDate(new Date(control.visualYear, control.visualMonth + 1, 0)); - } - } - property int month: modelData - } - } - } - } - - Row { - id: __quarterPicker - anchors.horizontalCenter: parent.horizontalCenter - visible: __pickerHeader.isPickQuarter - spacing: 10 - - NumberAnimation on scale { - running: control.animationEnabled && __quarterPicker.visible - from: 0 - to: 1 - easing.type: Easing.OutCubic - duration: DelTheme.Primary.durationMid - } - - Repeater { - model: 4 - delegate: Item { - width: 60 - height: 40 - - PickerButton { - anchors.centerIn: parent - text: `Q${quarter}` - checked: quarter == control.visualQuarter - onClicked: { - control.visualQuarter = quarter; - __pickerHeader.isPickYear = false; - - if (control.pickerMode == DelDatePicker.Mode_Quarter) { - __private.selectDate(new Date(control.visualYear, (quarter - 1) * 3 + 1, 0)); - } - } - property int quarter: modelData + 1 - } - } - } - } - - Loader { - width: parent.width - active: control.pickerMode == DelDatePicker.Mode_Day - sourceComponent: Rectangle { - height: 1 - color: DelTheme.DelDatePicker.colorSplitLine - } - } - - Loader { - anchors.horizontalCenter: parent.horizontalCenter - active: control.pickerMode == DelDatePicker.Mode_Day - sourceComponent: DelButton { - type: DelButton.Type_Link - text: qsTr('今天') - onClicked: __private.selectDate(new Date()); - } - } - } - } - } -} diff --git a/DelegateUI/Controls/DelDivider.qml b/DelegateUI/Controls/DelDivider.qml deleted file mode 100644 index 3a393bb..0000000 --- a/DelegateUI/Controls/DelDivider.qml +++ /dev/null @@ -1,120 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Shapes 1.15 -import DelegateUI 1.0 - -Item { - id: control - - enum Align - { - Align_Left = 0, - Align_Center = 1, - Align_Right = 2 - } - - enum Style - { - SolidLine = 0, - DashLine = 1 - } - - titleFont { - family: DelTheme.DelDivider.fontFamily - pixelSize: DelTheme.DelDivider.fontSize - } - - property bool animationEnabled: DelTheme.animationEnabled - property string title: "" - property font titleFont - property int titleAlign: DelDivider.Align_Left - property int titlePadding: 20 - property color colorText: DelTheme.DelDivider.colorText - property color colorSplit: DelTheme.DelDivider.colorSplit - property int style: DelDivider.SolidLine - property int orientation: Qt.Horizontal - property Component titleDelegate: Text { - text: control.title - font: control.titleFont - color: control.colorText - } - property Component splitDelegate: Shape { - id: __shape - - property real lineX: __titleLoader.x + __titleLoader.implicitWidth * 0.5 - property real lineY: __titleLoader.y + __titleLoader.implicitHeight * 0.5 - - ShapePath { - strokeStyle: control.style == DelDivider.SolidLine ? ShapePath.SolidLine : ShapePath.DashLine - strokeColor: control.colorSplit - strokeWidth: 1 - fillColor: "transparent" - startX: control.orientation == Qt.Horizontal ? 0 : __shape.lineX - startY: control.orientation == Qt.Horizontal ? __shape.lineY : 0 - PathLine { - x: { - if (control.orientation == Qt.Horizontal) { - return control.title == "" ? 0 : __titleLoader.x - 10; - } else { - return __shape.lineX; - } - } - y: control.orientation == Qt.Horizontal ? __shape.lineY : __titleLoader.y - 10 - } - } - - ShapePath { - strokeStyle: control.style == DelDivider.SolidLine ? ShapePath.SolidLine : ShapePath.DashLine - strokeColor: control.colorSplit - strokeWidth: 1 - fillColor: "transparent" - startX: { - if (control.orientation == Qt.Horizontal) { - return control.title == "" ? 0 : (__titleLoader.x + __titleLoader.implicitWidth + 10); - } else { - return __shape.lineX; - } - } - startY: { - if (control.orientation == Qt.Horizontal) { - return __shape.lineY; - } else { - return control.title == "" ? 0 : (__titleLoader.y + __titleLoader.implicitHeight + 10); - } - } - - PathLine { - x: control.orientation == Qt.Horizontal ? control.width : __shape.lineX - y: control.orientation == Qt.Horizontal ? __shape.lineY : control.height - } - } - } - property string contentDescription: title - - Behavior on colorSplit { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorText { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - Loader { - id: __splitLoader - sourceComponent: splitDelegate - } - - Loader { - id: __titleLoader - z: 1 - anchors.top: (control.orientation != Qt.Horizontal && control.titleAlign == DelDivider.Align_Left) ? parent.top : undefined - anchors.topMargin: (control.orientation != Qt.Horizontal && control.titleAlign == DelDivider.Align_Left) ? control.titlePadding : 0 - anchors.bottom: (control.orientation != Qt.Horizontal && control.titleAlign == DelDivider.Align_Right) ? parent.right : undefined - anchors.bottomMargin: (control.orientation != Qt.Horizontal && control.titleAlign == DelDivider.Align_Right) ? control.titlePadding : 0 - anchors.left: (control.orientation == Qt.Horizontal && control.titleAlign == DelDivider.Align_Left) ? parent.left : undefined - anchors.leftMargin: (control.orientation == Qt.Horizontal && control.titleAlign == DelDivider.Align_Left) ? control.titlePadding : 0 - anchors.right: (control.orientation == Qt.Horizontal && control.titleAlign == DelDivider.Align_Right) ? parent.right : undefined - anchors.rightMargin: (control.orientation == Qt.Horizontal && control.titleAlign == DelDivider.Align_Right) ? control.titlePadding : 0 - anchors.horizontalCenter: (control.orientation != Qt.Horizontal || control.titleAlign == DelDivider.Align_Center) ? parent.horizontalCenter : undefined - anchors.verticalCenter: (control.orientation == Qt.Horizontal || control.titleAlign == DelDivider.Align_Center) ? parent.verticalCenter : undefined - sourceComponent: titleDelegate - } - - Accessible.role: Accessible.Separator - Accessible.name: control.title - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelDrawer.qml b/DelegateUI/Controls/DelDrawer.qml deleted file mode 100644 index bce826f..0000000 --- a/DelegateUI/Controls/DelDrawer.qml +++ /dev/null @@ -1,105 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtGraphicalEffects 1.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Drawer { - id: control - - titleFont { - family: DelTheme.DelDrawer.fontFamily - pixelSize: DelTheme.DelDrawer.fontSizeTitle - } - - property bool animationEnabled: DelTheme.animationEnabled - property int drawerSize: 378 - property string title: "" - property font titleFont - property color colorTitle: DelTheme.DelDrawer.colorTitle - property color colorBg: DelTheme.DelDrawer.colorBg - property color colorOverlay: DelTheme.DelDrawer.colorOverlay - property Component titleDelegate: Item { - height: 56 - - Row { - height: parent.height - anchors.left: parent.left - anchors.leftMargin: 15 - spacing: 5 - - DelCaptionButton { - id: __close - topPadding: 2 - bottomPadding: 2 - leftPadding: 4 - rightPadding: 4 - radiusBg: 4 - anchors.verticalCenter: parent.verticalCenter - iconSource: DelIcon.CloseOutlined - hoverCursorShape: Qt.PointingHandCursor - onClicked: { - control.close(); - } - } - - Text { - anchors.verticalCenter: parent.verticalCenter - text: control.title - font: control.titleFont - color: control.colorTitle - } - } - - DelDivider { - width: parent.width - height: 1 - anchors.bottom: parent.bottom - } - } - property Component contentDelegate: Item { } - - enter: Transition { NumberAnimation { duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } } - exit: Transition { NumberAnimation { duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } } - - width: edge == Qt.LeftEdge || edge == Qt.RightEdge ? drawerSize : parent.width - height: edge == Qt.LeftEdge || edge == Qt.RightEdge ? parent.height : drawerSize - edge: Qt.RightEdge - parent: T.Overlay.overlay - modal: true - background: Item { - DropShadow { - anchors.fill: __rect - radius: 16 - samples: 17 - color: DelThemeFunctions.alpha(DelTheme.DelDrawer.colorShadow, DelTheme.isDark ? 0.1 : 0.2) - source: __rect - } - - Rectangle { - id: __rect - anchors.fill: parent - color: control.colorBg - } - } - contentItem: ColumnLayout { - Loader { - Layout.fillWidth: true - sourceComponent: titleDelegate - onLoaded: { - /*! 无边框窗口的标题栏会阻止事件传递, 需要调这个 */ - if (captionBar) - captionBar.addInteractionItem(item); - } - } - Loader { - Layout.fillWidth: true - Layout.fillHeight: true - sourceComponent: contentDelegate - } - } - - T.Overlay.modal: Rectangle { - color: control.colorOverlay - } -} diff --git a/DelegateUI/Controls/DelIconButton.qml b/DelegateUI/Controls/DelIconButton.qml deleted file mode 100644 index 2440cef..0000000 --- a/DelegateUI/Controls/DelIconButton.qml +++ /dev/null @@ -1,62 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -DelButton { - id: control - - enum IconPosition { - Position_Start = 0, - Position_End = 1 - } - - property bool loading: false - property int iconSource: 0 - property int iconSize: DelTheme.DelButton.fontSize - property int iconSpacing: 5 - property int iconPosition: DelIconButton.Position_Start - property color colorIcon: colorText - - contentItem: Item { - implicitWidth: __row.implicitWidth - implicitHeight: Math.max(__icon.implicitHeight, __text.implicitHeight) - - Row { - id: __row - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: parent.verticalCenter - spacing: control.iconSpacing - layoutDirection: control.iconPosition === DelIconButton.Position_Start ? Qt.LeftToRight : Qt.RightToLeft - - DelIconText { - id: __icon - anchors.verticalCenter: parent.verticalCenter - color: control.colorIcon - iconSize: control.iconSize - iconSource: control.loading ? DelIcon.LoadingOutlined : control.iconSource - verticalAlignment: Text.AlignVCenter - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - NumberAnimation on rotation { - running: control.loading - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - - Text { - id: __text - anchors.verticalCenter: parent.verticalCenter - text: control.text - font: control.font - lineHeight: DelTheme.DelButton.fontLineHeight - color: control.colorText - elide: Text.ElideRight - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - } - } -} diff --git a/DelegateUI/Controls/DelIconText.qml b/DelegateUI/Controls/DelIconText.qml deleted file mode 100644 index 8ab33dc..0000000 --- a/DelegateUI/Controls/DelIconText.qml +++ /dev/null @@ -1,20 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -DelText { - id: control - - property int iconSource: 0 - property alias iconSize: control.font.pixelSize - property alias colorIcon: control.color - property string contentDescription: text - - text: String.fromCharCode(iconSource) - font.family: 'DelegateUI-Icons' - font.pixelSize: DelTheme.DelIconText.fontSize - color: DelTheme.DelIconText.colorText - - Accessible.role: Accessible.StaticText - Accessible.name: control.text - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelInput.qml b/DelegateUI/Controls/DelInput.qml deleted file mode 100644 index accfcdb..0000000 --- a/DelegateUI/Controls/DelInput.qml +++ /dev/null @@ -1,70 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Controls 2.15 as T -import DelegateUI 1.0 - -T.TextField { - id: control - - enum IconPosition { - Position_Left = 0, - Position_Right = 1 - } - - property bool animationEnabled: DelTheme.animationEnabled - readonly property bool active: hovered || activeFocus - property int iconSource: 0 - property int iconSize: DelTheme.DelInput.fontIconSize - property int iconPosition: DelInput.Position_Left - property color colorIcon: colorText - property color colorText: enabled ? DelTheme.DelInput.colorText : DelTheme.DelInput.colorTextDisabled - property color colorBorder: enabled ? - active ? DelTheme.DelInput.colorBorderHover : - DelTheme.DelInput.colorBorder : DelTheme.DelInput.colorBorderDisabled - property color colorBg: enabled ? DelTheme.DelInput.colorBg : DelTheme.DelInput.colorBgDisabled - property int radiusBg: 6 - property string contentDescription: "" - - property Component iconDelegate: DelIconText { - iconSource: control.iconSource - iconSize: control.iconSize - colorIcon: control.colorIcon - } - - Behavior on colorText { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBorder { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - objectName: "__DelInput__" - focus: true - padding: 5 - leftPadding: 10 + ((iconSource != 0 && iconPosition == DelInput.Position_Left) ? iconSize : 0) - rightPadding: 10 + ((iconSource != 0 && iconPosition == DelInput.Position_Right) ? iconSize : 0) - implicitWidth: contentWidth + leftPadding + rightPadding - implicitHeight: contentHeight + topPadding + bottomPadding - color: colorText - placeholderTextColor: enabled ? DelTheme.DelInput.colorPlaceholderText : DelTheme.DelInput.colorPlaceholderTextDisabled - selectedTextColor: DelTheme.DelInput.colorSelectedText - selectionColor: DelTheme.DelInput.colorSelection - font { - family: DelTheme.DelInput.fontFamily - pixelSize: DelTheme.DelInput.fontSize - } - background: Rectangle { - color: control.colorBg - border.color: control.colorBorder - radius: control.radiusBg - } - - Loader { - anchors.left: iconPosition == DelInput.Position_Left ? parent.left : undefined - anchors.right: iconPosition == DelInput.Position_Right ? parent.right : undefined - anchors.margins: 5 - anchors.verticalCenter: parent.verticalCenter - active: control.iconSize != 0 - sourceComponent: iconDelegate - } - - Accessible.role: Accessible.EditableText - Accessible.editable: true - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelMenu.qml b/DelegateUI/Controls/DelMenu.qml deleted file mode 100644 index b583cfe..0000000 --- a/DelegateUI/Controls/DelMenu.qml +++ /dev/null @@ -1,582 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import QtQuick.Window 2.15 -import DelegateUI 1.0 - -Item { - id: control - - width: compactMode ? compactWidth : defaultMenuWidth - clip: true - - signal clickMenu(deep: int, menuKey: string, menuData: var) - - property bool animationEnabled: DelTheme.animationEnabled - property string contentDescription: "" - property bool showEdge: false - property bool tooltipVisible: false - property bool compactMode: false - property int compactWidth: 50 - property bool popupMode: false - property int popupWidth: 200 - property int popupMaxHeight: control.height - property int defaultMenuIconSize: DelTheme.DelMenu.fontSize - property int defaultMenuIconSpacing: 8 - property int defaultMenuWidth: 300 - property int defaultMenuHeight: 40 - property int defaultMenuSpacing: 4 - property var defaultSelectedKey: [] - property var initModel: [] - - Component { - id: myContentDelegate - - Item { - Text { - id: __text - anchors.left: parent.left - anchors.right: __tag.left - anchors.rightMargin: 5 - anchors.verticalCenter: parent.verticalCenter - text: menuButton.text - font: menuButton.font - color: menuButton.colorText - elide: Text.ElideRight - } - - DelTag { - id: __tag - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - text: 'Success' - tagState: DelTag.State_Success - } - } - } - - - Component { - id: __menuContentDelegate - - Item { - DelIconText { - id: __icon - x: menuButton.iconStart - anchors.verticalCenter: parent.verticalCenter - color: menuButton.colorText - iconSize: menuButton.iconSize - iconSource: menuButton.iconSource - verticalAlignment: Text.AlignVCenter - - Behavior on x { - enabled: control.animationEnabled - NumberAnimation { easing.type: Easing.OutCubic; duration: DelTheme.Primary.durationMid } - } - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - Text { - id: __text - anchors.left: __icon.right - anchors.leftMargin: menuButton.iconSpacing - anchors.right: menuButton.expandedVisible ? __expandedIcon.left : parent.right - anchors.rightMargin: menuButton.iconSpacing - anchors.verticalCenter: parent.verticalCenter - text: menuButton.text - font: menuButton.font - color: menuButton.colorText - elide: Text.ElideRight - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - DelIconText { - id: __expandedIcon - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - visible: menuButton.expandedVisible - iconSource: (control.compactMode || control.popupMode) ? DelIcon.RightOutlined : DelIcon.DownOutlined - colorIcon: menuButton.colorText - transform: Rotation { - origin { - x: __expandedIcon.width * 0.5 - y: __expandedIcon.height * 0.5 - } - axis { - x: 1 - y: 0 - z: 0 - } - angle: (control.compactMode || control.popupMode) ? 0 : (menuButton.expanded ? 180 : 0) - Behavior on angle { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - } - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - } - } - - Component { - id: __menuDelegate - - Item { - id: __rootItem - width: ListView.view.width - height: { - switch (menuType) { - case "item": - case "group": - return __layout.height; - case "divider": - return __dividerLoader.height; - default: - return __layout.height; - } - } - clip: true - Component.onCompleted: { - if (menuType == "item" || menuType == "group") { - layerPopup = __private.createPopupList(view.menuDeep); - let list = [] - for (let i = 0; i < menuChildren.length; i++) { - list.push(menuChildren[i]); - } - __childrenListView.model = list; - if (control.defaultSelectedKey.length != 0) { - if (control.defaultSelectedKey.indexOf(menuKey) != -1) { - __rootItem.expandParent(); - __menuButton.clicked(); - } - } - } - if (__rootItem.menuKey !== "" && __rootItem.menuKey === __private.gotoMenuKey) { - __rootItem.expandParent(); - __menuButton.clicked(); - } - } - - required property var modelData - property alias model: __rootItem.modelData - property var view: ListView.view - property string menuKey: model.key || "" - property string menuType: model.type || "item" - property bool menuEnabled: model.enabled === undefined ? true : model.enabled - property string menuLabel: model.label || "" - property int menuHeight: model.height || defaultMenuHeight - property int menuIconSize: model.iconSize || defaultMenuIconSize - property int menuIconSource: model.iconSource || 0 - property int menuIconSpacing: model.iconSpacing || defaultMenuIconSpacing - property var menuChildren: model.menuChildren || [] - property int menuChildrenLength: menuChildren ? menuChildren.length : 0 - property var menuContentDelegate: model.contentDelegate ?? __menuContentDelegate - - property var parentMenu: view.menuDeep === 0 ? null : view.parentMenu - property bool isCurrent: __private.selectedItem === __rootItem || isCurrentParent - property bool isCurrentParent: false - property var layerPopup: null - - function expandMenu() { - if (__menuButton.expandedVisible) - __menuButton.expanded = true; - } - - /*! 查找当前菜单的根菜单 */ - function findRootMenu() { - let parent = parentMenu; - while (parent !== null) { - if (parent.parentMenu === null) - return parent; - parent = parent.parentMenu; - } - /*! 根菜单返回自身 */ - return __rootItem; - } - /*! 展开当前菜单的所有父菜单 */ - function expandParent() { - let parent = parentMenu; - while (parent !== null) { - if (parent.parentMenu === null) { - parent.expandMenu(); - return; - } - parent.expandMenu(); - parent = parent.parentMenu; - } - } - /*! 清除当前菜单的所有子菜单 */ - function clearIsCurrentParent() { - isCurrentParent = false; - for (let i = 0; i < __childrenListView.count; i++) { - let item = __childrenListView.itemAtIndex(i); - if (item) - item.clearIsCurrentParent(); - } - } - /*! 选中当前菜单的所有父菜单 */ - function selectedCurrentParentMenu() { - for (let i = 0; i < __listView.count; i++) { - let item = __listView.itemAtIndex(i); - if (item) - item.clearIsCurrentParent(); - } - let parent = parentMenu; - while (parent !== null) { - parent.isCurrentParent = true; - if (parent.parentMenu === null) - return; - parent = parent.parentMenu; - } - } - - Connections { - target: __private - function onGotoMenu(key) { - if (__rootItem.menuKey !== "" && __rootItem.menuKey === key) { - __rootItem.expandParent(); - __menuButton.clicked(); - } - } - } - - Loader { - id: __dividerLoader - height: 5 - width: parent.width - active: __rootItem.menuType == "divider" - sourceComponent: DelDivider { } - } - - Item { - id: __layout - width: parent.width - height: __menuButton.height + ((control.compactMode || control.popupMode) ? 0 : __childrenListView.height) - visible: menuType == "item" || menuType == "group" - - MenuButton { - id: __menuButton - width: parent.width - height: __rootItem.menuHeight - enabled: __rootItem.menuEnabled - text: (control.compactMode && __rootItem.view.menuDeep === 0) ? "" : __rootItem.menuLabel - checkable: true - iconSize: __rootItem.menuIconSize - iconSource: __rootItem.menuIconSource - iconSpacing: __rootItem.menuIconSpacing - iconStart: (control.compactMode && __rootItem.view.menuDeep === 0) ? (width - iconSize - leftPadding - rightPadding) * 0.5 : 0 - expandedVisible: { - if (__rootItem.menuType == "group" || - (control.compactMode && __rootItem.view.menuDeep === 0)) - return false; - else - return __rootItem.menuChildrenLength > 0 - } - isCurrent: __rootItem.isCurrent - isGroup: __rootItem.menuType == "group" - model: __rootItem.model - contentDelegate: __rootItem.menuContentDelegate - onClicked: { - if (__rootItem.menuChildrenLength == 0) { - control.clickMenu(__rootItem.view.menuDeep, __rootItem.menuKey, model); - __private.selectedItem = __rootItem; - __rootItem.selectedCurrentParentMenu(); - if (control.compactMode || control.popupMode) - __rootItem.layerPopup.closeWithParent(); - } else { - if (control.compactMode || control.popupMode) { - const h = __rootItem.layerPopup.topPadding + - __rootItem.layerPopup.bottomPadding + - __childrenListView.realHeight + 6; - const pos = mapToItem(null, 0, 0); - const pos2 = mapToItem(control, 0, 0); - if ((pos.y + h) > __private.window.height) { - __rootItem.layerPopup.y = Math.max(0, pos2.y - ((pos.y + h) - __private.window.height)); - } else { - __rootItem.layerPopup.y = pos2.y; - } - __rootItem.layerPopup.current = __childrenListView; - __rootItem.layerPopup.open(); - } - } - } - - DelToolTip { - position: control.compactMode || control.popupMode ? DelToolTip.Position_Right : DelToolTip.Position_Bottom - text: __rootItem.menuLabel - visible: { - if (control.compactMode || control.popupMode) - return (__rootItem.layerPopup && !__rootItem.layerPopup.opened) ? parent.hovered : false; - else { - return control.tooltipVisible ? parent.hovered : false; - } - } - } - } - - ListView { - id: __childrenListView - visible: __rootItem.menuEnabled - parent: { - if (__rootItem.layerPopup && __rootItem.layerPopup.current === __childrenListView) - return __rootItem.layerPopup.contentItem; - else - return __layout; - } - height: { - if (__rootItem.menuType == "group" || __menuButton.expanded) - return realHeight; - else if (parent != __layout) - return parent.height; - else - return 0; - } - anchors.top: parent ? (parent == __layout ? __menuButton.bottom : parent.top) : undefined - anchors.topMargin: parent == __layout ? control.defaultMenuSpacing : 0 - anchors.left: parent ? parent.left : undefined - anchors.leftMargin: (control.compactMode || control.popupMode) ? 0 : __menuButton.iconSize * menuDeep - anchors.right: parent ? parent.right : undefined - spacing: control.defaultMenuSpacing - boundsBehavior: Flickable.StopAtBounds - interactive: __childrenListView.visible - model: [] - delegate: __menuDelegate - onContentHeightChanged: cacheBuffer = contentHeight; - T.ScrollBar.vertical: DelScrollBar { - id: childrenScrollBar - visible: (control.compactMode || control.popupMode) && childrenScrollBar.size !== 1 - } - clip: true - /* 子 ListView 从父 ListView 的深度累加可实现自动计算 */ - property int menuDeep: __rootItem.view.menuDeep + 1 - property var parentMenu: __rootItem - property int realHeight: (contentHeight + ((count === 0 || control.compactMode || control.popupMode) ? 0 : control.defaultMenuSpacing)) - Behavior on height { - enabled: control.animationEnabled - NumberAnimation { duration: DelTheme.Primary.durationFast } - } - - Connections { - target: control - function onCompactModeChanged() { - if (__rootItem.layerPopup) { - __rootItem.layerPopup.current = null; - __rootItem.layerPopup.close(); - } - } - function onPopupModeChanged() { - if (__rootItem.layerPopup) { - __rootItem.layerPopup.current = null; - __rootItem.layerPopup.close(); - } - } - } - } - } - } - } - - onInitModelChanged: { - clear(); - let list = []; - for (let object of initModel) { - append(object); - } - } - - function gotoMenu(key) { - __private.gotoMenuKey = key; - __private.gotoMenu(key); - } - - function get(index) { - if (index >= 0 && index < __listView.model.length) { - return __listView.model[index]; - } - return undefined; - } - - function set(index, object) { - if (index >= 0 && index < __listView.model.length) { - __private.model[index] = object; - __listView.model = __private.model; - } - } - - function setProperty(index, propertyName, value) { - if (index >= 0 && index < __listView.model.length) { - __private.model[index][propertyName] = value; - __listView.model = __private.model; - } - } - - function move(from, to, count = 1) { - if (from >= 0 && from < __listView.model.length && to >= 0 && to < __listView.model.length) { - const objects = __listView.model.splice(from, count); - __private.model.splice(to, 0, ...objects); - __listView.model = __private.model; - } - } - - function insert(index, object) { - __private.model.splice(index, 0, object); - __listView.model = __private.model; - } - - function append(object) { - __private.model.push(object); - __listView.model = __private.model; - } - - function remove(index, count = 1) { - if (index >= 0 && index < __listView.model.length) { - __private.model.splice(index, count); - __listView.model = __private.model; - } - } - - function clear() { - __private.gotoMenuKey = ''; - __listView.model = []; - } - - component MenuButton: DelButton { - id: __menuButtonImpl - property int iconSource: 0 - property int iconSize: DelTheme.DelMenu.fontSize - property int iconSpacing: 5 - property int iconStart: 0 - property bool expanded: false - property bool expandedVisible: false - property bool isCurrent: false - property bool isGroup: false - property var model: undefined - property var contentDelegate: null - - onClicked: { - if (expandedVisible) - expanded = !expanded; - } - hoverCursorShape: (isGroup && !control.compactMode) ? Qt.ArrowCursor : Qt.PointingHandCursor - effectEnabled: false - colorBorder: "transparent" - colorText: { - if (enabled) { - if (isGroup) { - return (isCurrent && control.compactMode) ? DelTheme.DelMenu.colorTextActive : DelTheme.DelMenu.colorTextDisabled; - } else { - return isCurrent ? DelTheme.DelMenu.colorTextActive : DelTheme.DelMenu.colorText; - } - } else { - return DelTheme.DelMenu.colorTextDisabled; - } - } - colorBg: { - if (enabled) { - if (isGroup) - return (isCurrent && control.compactMode) ? DelTheme.DelMenu.colorBgActive : DelTheme.DelMenu.colorBgDisabled; - else if (isCurrent) - return DelTheme.DelMenu.colorBgActive; - else if (hovered) { - return DelTheme.DelMenu.colorBgHover; - } else { - return DelTheme.DelMenu.colorBg; - } - } else { - return DelTheme.DelMenu.colorBgDisabled; - } - } - contentItem: Loader { - sourceComponent: __menuButtonImpl.contentDelegate - property alias model: __menuButtonImpl.model - property alias menuButton: __menuButtonImpl - } - } - - Behavior on width { - enabled: control.animationEnabled - NumberAnimation { - easing.type: Easing.OutCubic - duration: DelTheme.Primary.durationMid - } - } - - Item { - id: __private - signal gotoMenu(key: string) - property string gotoMenuKey: '' - property var model: [] - property var window: Window.window - property var selectedItem: null - property var popupList: [] - function createPopupList(deep) { - /*! 为每一层创建一个弹窗 */ - if (popupList[deep] === undefined) { - let parentPopup = deep > 0 ? popupList[deep - 1] : null; - popupList[deep] = __popupComponent.createObject(control, { parentPopup: parentPopup }); - } - return popupList[deep]; - } - } - - Loader { - width: 1 - height: parent.height - anchors.right: parent.right - active: control.showEdge - sourceComponent: Rectangle { - color: DelTheme.DelMenu.colorEdge - } - } - - MouseArea { - anchors.fill: parent - onWheel: (wheel) => wheel.accepted = true; - } - - Component { - id: __popupComponent - - DelPopup { - width: control.popupWidth - height: current ? Math.min(control.popupMaxHeight, current.realHeight + topPadding + bottomPadding) : 0 - padding: 5 - onAboutToShow: { - let toX = control.width + 4; - if (parentPopup) { - toX += parentPopup.width + 4; - } - x = toX; - } - property var current: null - property var parentPopup: null - function closeWithParent() { - close(); - let p = parentPopup; - while (p) { - p.close(); - p = p.parentPopup; - } - } - } - } - - ListView { - id: __listView - anchors.left: parent.left - anchors.right: parent.right - anchors.rightMargin: 8 - anchors.top: parent.top - anchors.bottom: parent.bottom - anchors.margins: 5 - boundsBehavior: Flickable.StopAtBounds - spacing: control.defaultMenuSpacing - delegate: __menuDelegate - onContentHeightChanged: cacheBuffer = contentHeight; - T.ScrollBar.vertical: DelScrollBar { - anchors.rightMargin: -8 - policy: control.compactMode ? DelScrollBar.AsNeeded : DelScrollBar.AlwaysOn - } - property int menuDeep: 0 - } - - Accessible.role: Accessible.Tree - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelMessage.qml b/DelegateUI/Controls/DelMessage.qml deleted file mode 100644 index ba3e159..0000000 --- a/DelegateUI/Controls/DelMessage.qml +++ /dev/null @@ -1,279 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Templates 2.15 as T -import QtGraphicalEffects 1.15 -import DelegateUI 1.0 - -Item { - id: control - - enum MessageType { - Type_None = 0, - Type_Success = 1, - Type_Warning = 2, - Type_Message = 3, - Type_Error = 4 - } - - messageFont { - family: DelTheme.DelMessage.fontFamily - pixelSize: DelTheme.DelMessage.fontSize - } - - signal messageClosed(key: string) - - property bool animationEnabled: DelTheme.animationEnabled - property bool closeButtonVisible: false - property int bgTopPadding: 12 - property int bgBottomPadding: 12 - property int bgLeftPadding: 12 - property int bgRightPadding: 12 - property color colorBg: DelTheme.isDark ? DelTheme.DelMessage.colorBgDark : DelTheme.DelMessage.colorBg - property color colorBgShadow: DelTheme.DelMessage.colorBgShadow - property int radiusBg: DelTheme.DelMessage.radiusBg - - property font messageFont - property color colorMessage: DelTheme.DelMessage.colorMessage - property int messageSpacing: 8 - - function info(message: string, duration = 3000) { - open({ - 'message': message, - 'type': DelMessage.Type_Message, - 'duration': duration - }); - } - - function success(message: string, duration = 3000) { - open({ - 'message': message, - 'type': DelMessage.Type_Success, - 'duration': duration - }); - } - - function error(message: string, duration = 3000) { - open({ - 'message': message, - 'type': DelMessage.Type_Error, - 'duration': duration - }); - } - - function warning(message: string, duration = 3000) { - open({ - 'message': message, - 'type': DelMessage.Type_Warning, - 'duration': duration - }); - } - - function loading(message: string, duration = 3000) { - open({ - 'loading': true, - 'message': message, - 'type': DelMessage.Type_Message, - 'duration': duration - }); - } - - function open(object) { - __listModel.append(__private.initObject(object)); - } - - function close(key: string) { - for (let i = 0; i < __listModel.count; i++) { - let object = __listModel.get(i); - if (object.key && object.key === key) { - let item = repeater.itemAt(i); - if (item) - item.removeSelf(); - break; - } - } - } - - function setProperty(key, property, value) { - for (let i = 0; i < __listModel.count; i++) { - let object = __listModel.get(i); - if (object.key && object.key === key) { - __listModel.setProperty(i, property, value); - break; - } - } - } - - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on colorMessage { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - QtObject { - id: __private - function initObject(object) { - if (!object.hasOwnProperty("colorNode")) object.colorNode = String(control.colorNode); - if (!object.hasOwnProperty('key')) object.key = ''; - if (!object.hasOwnProperty('loading')) object.loading = false; - if (!object.hasOwnProperty('message')) object.message = ''; - if (!object.hasOwnProperty('type')) object.type = DelMessage.Type_None; - if (!object.hasOwnProperty('duration')) object.duration = 3000; - if (!object.hasOwnProperty('iconSource')) object.iconSource = 0; - - if (!object.hasOwnProperty('colorIcon')) object.colorIcon = ''; - else object.colorIcon = String(object.colorIcon); - - return object; - } - } - - Column { - anchors.top: parent.top - anchors.topMargin: 10 - anchors.horizontalCenter: parent.horizontalCenter - spacing: 10 - - Repeater { - id: repeater - model: ListModel { id: __listModel } - delegate: Item { - id: __rootItem - width: __content.width - height: __content.height - anchors.horizontalCenter: parent.horizontalCenter - - required property int index - required property string key - required property bool loading - required property string message - required property int type - required property int duration - required property int iconSource - required property string colorIcon - - function removeSelf() { - __removeAniamtion.restart(); - } - - Timer { - id: __timer - running: true - interval: __rootItem.duration - onTriggered: { - __removeAniamtion.restart(); - } - } - - DropShadow { - anchors.fill: __rootItem - radius: 16 - samples: 17 - color: DelThemeFunctions.alpha(control.colorBgShadow, DelTheme.isDark ? 0.1 : 0.2) - source: __bgRect - } - - Rectangle { - id: __bgRect - anchors.fill: parent - radius: control.radiusBg - color: control.colorBg - visible: false - } - - Item { - id: __content - width: __rowLayout.width + control.bgLeftPadding + control.bgRightPadding - height: 0 - opacity: 0 - clip: true - - Component.onCompleted: { - opacity = 1; - height = __rowLayout.height + control.bgTopPadding + control.bgBottomPadding; - } - - Behavior on opacity { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on height { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - - NumberAnimation on height { - id: __removeAniamtion - to: 0 - running: false - alwaysRunToEnd: true - onFinished: { - control.messageClosed(__rootItem.key); - __listModel.remove(__rootItem.index); - } - } - - RowLayout { - id: __rowLayout - width: Math.min(implicitWidth, control.width - control.bgLeftPadding - control.bgRightPadding) - anchors.centerIn: parent - spacing: control.messageSpacing - - DelIconText { - Layout.alignment: Qt.AlignVCenter - iconSize: 18 - iconSource: { - if (__rootItem.loading) return DelIcon.LoadingOutlined; - if (__rootItem.iconSource != 0) return __rootItem.iconSource; - switch (type) { - case DelMessage.Type_Success: return DelIcon.CheckCircleFilled; - case DelMessage.Type_Warning: return DelIcon.ExclamationCircleFilled; - case DelMessage.Type_Message: return DelIcon.ExclamationCircleFilled; - case DelMessage.Type_Error: return DelIcon.CloseCircleFilled; - default: return 0; - } - } - colorIcon: { - if (__rootItem.loading) return DelTheme.Primary.colorInfo; - if (__rootItem.colorIcon !== '') return __rootItem.colorIcon; - switch ((type)) { - case DelMessage.Type_Success: return DelTheme.Primary.colorSuccess; - case DelMessage.Type_Warning: return DelTheme.Primary.colorWarning; - case DelMessage.Type_Message: return DelTheme.Primary.colorInfo; - case DelMessage.Type_Error: return DelTheme.Primary.colorError; - default: return DelTheme.Primary.colorInfo; - } - } - - NumberAnimation on rotation { - running: __rootItem.loading - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - - Text { - Layout.fillWidth: true - Layout.alignment: Qt.AlignVCenter - font: control.messageFont - color: control.colorMessage - text: __rootItem.message - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WrapAnywhere - } - - Loader { - Layout.alignment: Qt.AlignVCenter - active: control.closeButtonVisible - sourceComponent: DelCaptionButton { - topPadding: 0 - bottomPadding: 0 - leftPadding: 2 - rightPadding: 2 - hoverCursorShape: Qt.PointingHandCursor - iconSource: DelIcon.CloseOutlined - colorIcon: hovered ? DelTheme.DelMessage.colorCloseHover : DelTheme.DelMessage.colorClose - onClicked: { - __timer.stop(); - __removeAniamtion.restart(); - } - } - } - } - } - } - } - } -} diff --git a/DelegateUI/Controls/DelMoveMouseArea.qml b/DelegateUI/Controls/DelMoveMouseArea.qml deleted file mode 100644 index 87716ab..0000000 --- a/DelegateUI/Controls/DelMoveMouseArea.qml +++ /dev/null @@ -1,53 +0,0 @@ -import QtQuick 2.15 - -MouseArea { - id: root - - property var target: undefined - property real minimumX: Number.NaN - property real maximumX: Number.NaN - property real minimumY: Number.NaN - property real maximumY: Number.NaN - - QtObject { - id: __private - property point startPos: Qt.point(0, 0) - property point offsetPos: Qt.point(0, 0) - } - - onClicked: (mouse) => mouse.accepted = false; - onPressed: - (mouse) => { - __private.startPos = Qt.point(mouse.x, mouse.y); - cursorShape = Qt.SizeAllCursor; - } - onReleased: - (mouse) => { - __private.startPos = Qt.point(mouse.x, mouse.y); - cursorShape = Qt.ArrowCursor; - } - onPositionChanged: - (mouse) => { - if (pressed) { - __private.offsetPos = Qt.point(mouse.x - __private.startPos.x, mouse.y - __private.startPos.y); - if (target) { - // x - if (minimumX != Number.NaN && minimumX > (target.x + __private.offsetPos.x)) { - target.x = minimumX; - } else if (maximumX != Number.NaN && maximumX < (target.x + __private.offsetPos.x)) { - target.x = maximumX; - } else { - target.x = target.x + __private.offsetPos.x; - } - // y - if (minimumY != Number.NaN && minimumY > (target.y + __private.offsetPos.y)) { - target.y = minimumY; - } else if (maximumY != Number.NaN && maximumY < (target.y + __private.offsetPos.y)) { - target.y = maximumY; - } else { - target.y = target.y + __private.offsetPos.y; - } - } - } - } -} diff --git a/DelegateUI/Controls/DelNotification.qml b/DelegateUI/Controls/DelNotification.qml deleted file mode 100644 index 45dfafa..0000000 --- a/DelegateUI/Controls/DelNotification.qml +++ /dev/null @@ -1,9 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - - -} diff --git a/DelegateUI/Controls/DelOTPInput.qml b/DelegateUI/Controls/DelOTPInput.qml deleted file mode 100644 index 21de7a3..0000000 --- a/DelegateUI/Controls/DelOTPInput.qml +++ /dev/null @@ -1,158 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -Item { - id: control - - width: __row.width - height: __row.height - - signal finished(input: string) - - property bool animationEnabled: DelTheme.animationEnabled - property int length: 6 - property int characterLength: 1 - property int currentIndex: 0 - property string currentInput: '' - property int itemWidth: 45 - property int itemHeight: 32 - property alias itemSpacing: __row.spacing - property var itemValidator: IntValidator { top: 9; bottom: 0 } - property int itemInputMethodHints: Qt.ImhHiddenText - property bool itemPassword: false - property string itemPasswordCharacter: '' - property var formatter: (text) => text - - property color colorItemText: enabled ? DelTheme.DelInput.colorText : DelTheme.DelInput.colorTextDisabled - property color colorItemBorder: enabled ? DelTheme.DelInput.colorBorder : DelTheme.DelInput.colorBorderDisabled - property color colorItemBorderActive: enabled ? DelTheme.DelInput.colorBorderHover : DelTheme.DelInput.colorBorderDisabled - property color colorItemBg: enabled ? DelTheme.DelInput.colorBg : DelTheme.DelInput.colorBgDisabled - property int radiusBg: 6 - - property Component dividerDelegate: Item { } - - onCurrentIndexChanged: { - const item = __repeater.itemAt(currentIndex << 1); - if (item && item.index % 2 == 0) - item.item.selectThis(); - } - - function setInput(inputs) { - for (let i = 0; i < inputs.length; i++) { - setInputAtIndex(i, input); - } - } - - function setInputAtIndex(index, input) { - const item = __repeater.itemAt(index << 1); - if (item) { - currentIndex = index; - item.item.text = formatter(input); - } - } - - function getInput() { - let input = ''; - for (let i = 0; i < __repeater.count; i++) { - const item = __repeater.itemAt(i); - if (item && item.index % 2 == 0) { - input += item.item.text; - } - } - return input; - } - - function getInputAtIndex(index) { - const item = __repeater.itemAt(index << 1); - if (item) { - return item.item.text; - } - return ''; - } - - Component { - id: __inputDelegate - - DelInput { - id: __rootItem - width: control.itemWidth - height: control.itemHeight - verticalAlignment: DelInput.AlignVCenter - horizontalAlignment: DelInput.AlignHCenter - enabled: control.enabled - colorText: control.colorItemText - colorBorder: active ? control.colorItemBorderActive : control.colorItemBorder - colorBg: control.colorItemBg - radiusBg: control.radiusBg - validator: control.itemValidator - inputMethodHints: control.itemInputMethodHints - echoMode: control.itemPassword ? DelInput.Password : DelInput.Normal - passwordCharacter:control.itemPasswordCharacter - onReleased: __timer.restart(); - onTextEdited: { - text = control.formatter(text); - const isFull = length >= control.characterLength; - if (isFull) selectAll(); - - if (isBackspace) isBackspace = false; - - const input = control.getInput(); - control.currentInput = input; - - if (isFull) { - if (control.currentIndex < (control.length - 1)) - control.currentIndex++; - else - control.finished(input); - } - } - - property int __index: index - property bool isBackspace: false - - function selectThis() { - forceActiveFocus(); - selectAll(); - } - - Keys.onPressed: function(event) { - if (event.key === Qt.Key_Backspace) { - clear(); - const input = control.getInput(); - control.currentInput = input; - isBackspace = true; - if (control.currentIndex != 0) - control.currentIndex--; - } else if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { - if (control.currentIndex < (control.length - 1)) - control.currentIndex++; - else - control.finished(control.getInput()); - } - } - - Timer { - id: __timer - interval: 100 - onTriggered: { - control.currentIndex = __rootItem.__index >> 1; - __rootItem.selectAll(); - } - } - } - } - - Row { - id: __row - spacing: 8 - - Repeater { - id: __repeater - model: control.length * 2 - 1 - delegate: Loader { - sourceComponent: index % 2 == 0 ? __inputDelegate : dividerDelegate - required property int index - } - } - } -} diff --git a/DelegateUI/Controls/DelPagination.qml b/DelegateUI/Controls/DelPagination.qml deleted file mode 100644 index 925a384..0000000 --- a/DelegateUI/Controls/DelPagination.qml +++ /dev/null @@ -1,293 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -Item { - id: control - - width: __row.width - height: __row.height - - property bool animationEnabled: DelTheme.animationEnabled - property int defaultButtonWidth: 32 - property int defaultButtonHeight: 32 - property int defaultButtonSpacing: 8 - property bool showQuickJumper: false - property int currentPageIndex: 0 - property int total: 0 - property int pageTotal: pageSize > 0 ? Math.ceil(total / pageSize) : 0 - property int pageButtonMaxCount: 7 - property int pageSize: 10 - property var pageSizeModel: [] - property string prevButtonTooltip: qsTr("上一页") - property string nextButtonTooltip: qsTr("下一页") - property Component prevButtonDelegate: ActionButton { - iconSource: DelIcon.LeftOutlined - tooltipText: control.prevButtonTooltip - disabled: control.currentPageIndex == 0 - onClicked: control.gotoPrevPage(); - } - property Component nextButtonDelegate: ActionButton { - iconSource: DelIcon.RightOutlined - tooltipText: control.nextButtonTooltip - disabled: control.currentPageIndex == (control.pageTotal - 1) - onClicked: control.gotoNextPage(); - } - property Component quickJumperDelegate: Row { - height: control.defaultButtonHeight - spacing: control.defaultButtonSpacing - - Text { - anchors.verticalCenter: parent.verticalCenter - text: qsTr("跳至") - font { - family: DelTheme.DelCopyableText.fontFamily - pixelSize: DelTheme.DelCopyableText.fontSize - } - color: DelTheme.Primary.colorTextBase - } - - DelInput { - width: 48 - anchors.verticalCenter: parent.verticalCenter - horizontalAlignment: DelInput.AlignHCenter - animationEnabled: control.animationEnabled - enabled: control.enabled - validator: IntValidator { top: 99999; bottom: 0 } - onEditingFinished: { - control.gotoPageIndex(parseInt(text) - 1); - clear(); - } - } - - Text { - anchors.verticalCenter: parent.verticalCenter - text: qsTr("页") - font { - family: DelTheme.Primary.fontPrimaryFamily - pixelSize: DelTheme.Primary.fontPrimarySize - } - color: DelTheme.Primary.colorTextBase - } - } - - Component.onCompleted: currentPageIndexChanged(); - - onPageSizeChanged: { - const __pageTotal = (pageSize > 0 ? Math.ceil(total / pageSize) : 0); - if (currentPageIndex > __pageTotal) { - currentPageIndex = __pageTotal - 1; - } - } - - function gotoPageIndex(index: int) { - if (index <= 0) - control.currentPageIndex = 0; - else if (index < pageTotal) - control.currentPageIndex = index; - else - control.currentPageIndex = (pageTotal - 1); - } - - function gotoPrevPage() { - if (currentPageIndex > 0) - currentPageIndex--; - } - - function gotoPrev5Page() { - if (currentPageIndex > 5) - currentPageIndex -= 5; - else - currentPageIndex = 0; - } - - function gotoNextPage() { - if (currentPageIndex < pageTotal) - currentPageIndex++; - } - - function gotoNext5Page() { - if ((currentPageIndex + 5) < pageTotal) - currentPageIndex += 5; - else - currentPageIndex = pageTotal - 1; - } - - component PaginationButton: DelButton { - padding: 0 - width: control.defaultButtonWidth - height: control.defaultButtonHeight - animationEnabled: false - effectEnabled: false - enabled: control.enabled - text: (pageIndex + 1) - checked: control.currentPageIndex == pageIndex - font.bold: checked - colorText: { - if (enabled) - return checked ? DelTheme.DelPagination.colorButtonTextActive : DelTheme.DelPagination.colorButtonText; - else - return DelTheme.DelPagination.colorButtonTextDisabled; - } - colorBg: { - if (enabled) { - if (checked) - return DelTheme.DelPagination.colorButtonBg; - else - return down ? DelTheme.DelPagination.colorButtonBgActive : - hovered ? DelTheme.DelPagination.colorButtonBgHover : - DelTheme.DelPagination.colorButtonBg; - } else { - return checked ? DelTheme.DelPagination.colorButtonBgDisabled : "transparent"; - } - } - colorBorder: checked ? DelTheme.DelPagination.colorBorderActive : "transparent" - onClicked: { - control.currentPageIndex = pageIndex; - } - property int pageIndex: 0 - - DelToolTip { - arrowVisible: false - text: parent.text - visible: parent.hovered && parent.enabled - } - } - - component PaginationMoreButton: DelIconButton { - padding: 0 - width: control.defaultButtonWidth - height: control.defaultButtonHeight - animationEnabled: false - effectEnabled: false - enabled: control.enabled - colorBg: "transparent" - colorBorder: "transparent" - text: (enabled && (down || hovered)) ? "" : "•••" - iconSource: (enabled && (down || hovered)) ? (isPrev ? DelIcon.DoubleLeftOutlined : DelIcon.DoubleRightOutlined) : 0 - property bool isPrev: false - property alias tooltipText: __moreTooltip.text - - DelToolTip { - id: __moreTooltip - arrowVisible: false - visible: parent.enabled && parent.hovered && text !== "" - } - } - - component ActionButton: Item { - id: __actionRoot - width: __actionButton.width - height: __actionButton.height - - signal clicked() - property bool disabled: false - property alias iconSource: __actionButton.iconSource - property alias tooltipText: __tooltip.text - - DelIconButton { - id: __actionButton - padding: 0 - width: control.defaultButtonWidth - height: control.defaultButtonHeight - animationEnabled: control.animationEnabled - enabled: control.enabled && !__actionRoot.disabled - effectEnabled: false - colorBorder: "transparent" - colorBg: enabled ? (down ? DelTheme.DelPagination.colorButtonBgActive : - hovered ? DelTheme.DelPagination.colorButtonBgHover : "transparent") : "transparent" - onClicked: __actionRoot.clicked(); - - DelToolTip { - id: __tooltip - arrowVisible: false - visible: parent.hovered && parent.enabled && text !== "" - } - } - - HoverHandler { - enabled: __actionRoot.disabled - cursorShape: Qt.ForbiddenCursor - } - } - - QtObject { - id: __private - property int pageButtonHalfCount: Math.ceil(control.pageButtonMaxCount * 0.5) - } - - Row { - id: __row - spacing: control.defaultButtonSpacing - - Loader { - anchors.verticalCenter: parent.verticalCenter - sourceComponent: control.prevButtonDelegate - } - - PaginationButton { - pageIndex: 0 - visible: control.pageTotal > 0 - } - - PaginationMoreButton { - isPrev: true - tooltipText: qsTr("向前5页") - visible: control.pageTotal > control.pageButtonMaxCount && (control.currentPageIndex + 1) > __private.pageButtonHalfCount - onClicked: control.gotoPrev5Page(); - } - - Repeater { - id: __repeater - model: (control.pageTotal < 2) ? 0 : - (control.pageTotal >= control.pageButtonMaxCount) ? (control.pageButtonMaxCount - 2) : - (control.pageTotal - 2) - delegate: Loader { - sourceComponent: PaginationButton { - pageIndex: { - if ((control.currentPageIndex + 1) <= __private.pageButtonHalfCount) - return index + 1; - else if (control.pageTotal - (control.currentPageIndex + 1) <= (control.pageButtonMaxCount - __private.pageButtonHalfCount)) - return (control.pageTotal - __repeater.count + index - 1); - else - return (control.currentPageIndex + index + 2 - __private.pageButtonHalfCount); - } - } - required property int index - } - } - - PaginationMoreButton { - isPrev: false - tooltipText: qsTr("向后5页") - visible: control.pageTotal > control.pageButtonMaxCount && - (control.pageTotal - (control.currentPageIndex + 1) > (control.pageButtonMaxCount - __private.pageButtonHalfCount)) - onClicked: control.gotoNext5Page(); - } - - PaginationButton { - pageIndex: control.pageTotal - 1 - visible: control.pageTotal > 1 - } - - Loader { - anchors.verticalCenter: parent.verticalCenter - sourceComponent: control.nextButtonDelegate - } - - DelSelect { - anchors.verticalCenter: parent.verticalCenter - animationEnabled: control.animationEnabled - model: control.pageSizeModel - visible: count > 0 - onActivated: - (index) => { - control.pageSize = currentValue; - } - } - - Loader { - anchors.verticalCenter: parent.verticalCenter - sourceComponent: control.showQuickJumper ? control.quickJumperDelegate : null - } - } -} diff --git a/DelegateUI/Controls/DelPopup.qml b/DelegateUI/Controls/DelPopup.qml deleted file mode 100644 index 15bdf7a..0000000 --- a/DelegateUI/Controls/DelPopup.qml +++ /dev/null @@ -1,77 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Popup { - id: control - - property bool animationEnabled: DelTheme.animationEnabled - property bool movable: false - property bool resizable: false - property real minimumX: Number.NaN - property real maximumX: Number.NaN - property real minimumY: Number.NaN - property real maximumY: Number.NaN - property real minimumWidth: 0 - property real maximumWidth: Number.NaN - property real minimumHeight: 0 - property real maximumHeight: Number.NaN - property color colorShadow: DelTheme.DelPopup.colorShadow - property color colorBg: DelTheme.isDark ? DelTheme.DelPopup.colorBgDark : DelTheme.DelPopup.colorBg - property int radiusBg: DelTheme.DelPopup.radiusBg - - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: implicitContentHeight + topPadding + bottomPadding - enter: Transition { - NumberAnimation { - property: "opacity"; - from: 0.0 - to: 1.0 - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - exit: Transition { - NumberAnimation { - property: "opacity" - from: 1.0 - to: 0 - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - background: Item { - DropShadow { - anchors.fill: __popupRect - radius: 16 - samples: 17 - color: DelThemeFunctions.alpha(control.colorShadow, DelTheme.isDark ? 0.1 : 0.2) - source: __popupRect - } - - Rectangle { - id: __popupRect - anchors.fill: parent - color: control.colorBg - radius: control.radiusBg - } - Loader { - active: control.movable || control.resizable - sourceComponent: DelResizeMouseArea { - anchors.fill: parent - target: control - movable: control.movable - resizable: control.resizable - minimumX: control.minimumX - maximumX: control.maximumX - minimumY: control.minimumY - maximumY: control.maximumY - minimumWidth: control.minimumWidth - maximumWidth: control.maximumWidth - minimumHeight: control.minimumHeight - maximumHeight: control.maximumHeight - } - } - } - - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } -} diff --git a/DelegateUI/Controls/DelProgress.qml b/DelegateUI/Controls/DelProgress.qml deleted file mode 100644 index cfca285..0000000 --- a/DelegateUI/Controls/DelProgress.qml +++ /dev/null @@ -1,312 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -Item { - id: control - - width: parent.width - height: 16 - - enum Type { - Type_Line = 0, - Type_Circle = 1, - Type_Dashboard = 2 - } - - enum Status { - Status_Normal = 0, - Status_Success = 1, - Status_Exception = 2, - Status_Active = 3 - } - - property bool animationEnabled: DelTheme.animationEnabled - property int type: DelProgress.Type_Line - property int status: DelProgress.Status_Normal - property real percent: 0 - property real barThickness: 8 - property string strokeLineCap: 'round' - property int steps: 0 - property int currentStep: 0 - property real gap: 4 - property real gapDegree: 60 - property bool useGradient: false - property var gradientStops: ({ - '0%': control.colorBar, - '100%': control.colorBar - }) - - property bool showInfo: true - property int precision: 0 - property var formatter: function() { - switch (control.status) { - case DelProgress.Status_Success: - return control.type === DelProgress.Type_Line ? DelIcon.CheckCircleFilled : DelIcon.CheckOutlined; - case DelProgress.Status_Exception: - return control.type === DelProgress.Type_Line ? DelIcon.CloseCircleFilled : DelIcon.CloseOutlined; - default: return `${control.percent.toFixed(control.precision)}%`; - } - } - property color colorBar: { - switch (control.status) { - case DelProgress.Status_Success: return DelTheme.DelProgress.colorBarSuccess; - case DelProgress.Status_Exception: return DelTheme.DelProgress.colorBarException; - case DelProgress.Status_Normal: return DelTheme.DelProgress.colorBarNormal; - case DelProgress.Status_Active : return DelTheme.DelProgress.colorBarNormal; - default: return DelTheme.DelProgress.colorBarNormal; - } - } - property color colorTrack: DelTheme.DelProgress.colorTrack - property color colorInfo: { - switch (control.status) { - case DelProgress.Status_Success: return DelTheme.DelProgress.colorInfoSuccess; - case DelProgress.Status_Exception: return DelTheme.DelProgress.colorInfoException; - default: return DelTheme.DelProgress.colorInfoNormal; - } - } - property Component infoDelegate: DelIconText { - color: control.colorInfo - font.family: DelTheme.DelProgress.fontFamily - font.pixelSize: type === DelProgress.Type_Line ? DelTheme.DelProgress.fontSize + (!isIcon ? 0 : 2) : - DelTheme.DelProgress.fontSize + (!isIcon ? 8 : 16) - text: isIcon ? String.fromCharCode(formatText) : formatText - property var formatText: control.formatter() - property bool isIcon: typeof formatText == 'number' - } - - onPercentChanged: __canvas.requestPaint(); - onStepsChanged: __canvas.requestPaint(); - onCurrentStepChanged: __canvas.requestPaint(); - onBarThicknessChanged: __canvas.requestPaint(); - onStrokeLineCapChanged: __canvas.requestPaint(); - onGapChanged: __canvas.requestPaint(); - onGapDegreeChanged: __canvas.requestPaint(); - onUseGradientChanged: __canvas.requestPaint(); - onGradientStopsChanged: __canvas.requestPaint(); - onColorBarChanged: __canvas.requestPaint(); - onColorTrackChanged: __canvas.requestPaint(); - onColorInfoChanged: __canvas.requestPaint(); - - Behavior on percent { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - - Behavior on colorBar { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on colorTrack { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on colorInfo { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - Canvas { - id: __canvas - height: parent.height - anchors.left: parent.left - anchors.right: control.type === DelProgress.Type_Line ? __infoLoader.left : parent.right - anchors.rightMargin: control.type === DelProgress.Type_Line ? 5 : 0 - antialiasing: true - onWidthChanged: requestPaint(); - onHeightChanged: requestPaint(); - onActiveWidthChanged: requestPaint(); - - property color activeColor: DelThemeFunctions.alpha(DelTheme.Primary.colorBgBase, 0.15) - property real activeWidth: 0 - property real progressWidth: control.percent * 0.01 * width - - NumberAnimation on activeWidth { - running: control.type == DelProgress.Type_Line && control.status == DelProgress.Status_Active - from: 0 - to: __canvas.progressWidth - loops: Animation.Infinite - duration: 2000 - easing.type: Easing.OutQuint - } - - function createGradient(ctx) { - let gradient = ctx.createLinearGradient(0, 0, width, height); - Object.keys(control.gradientStops).forEach( - stop => { - const percentage = parseFloat(stop) / 100; - gradient.addColorStop(percentage, control.gradientStops[stop]); - }); - - return gradient; - } - - function getCurrentColor(ctx) { - return control.useGradient ? createGradient(ctx) : control.colorBar; - } - - function drawStrokeWithRadius(ctx, x, y, radius, startAngle, endAngle, color) { - ctx.beginPath(); - ctx.arc(x, y, radius, startAngle, endAngle); - ctx.lineWidth = control.barThickness; - ctx.strokeStyle = color; - ctx.stroke(); - } - - function drawRoundLine(ctx, x, y, width, height, radius, color) { - ctx.beginPath(); - if (control.strokeLineCap === 'butt') { - ctx.moveTo(x, y + height * 0.5); - ctx.lineTo(x + width, y + height * 0.5); - } else { - ctx.moveTo(x + radius, y + height * 0.5); - ctx.lineTo(x + width - radius * 2, y + radius); - } - ctx.lineWidth = control.barThickness; - ctx.lineCap = control.strokeLineCap; - ctx.strokeStyle = color; - ctx.stroke(); - } - - function drawLine(ctx) { - const color = getCurrentColor(ctx); - if (control.steps > 0) { - const stepWidth = (width - ((control.steps - 1) * control.gap)) / control.steps; - const stepHeight = control.barThickness; - const stepY = (__canvas.height - stepHeight) * 0.5; - - for (let i = 0; i < control.steps; i++) { - const stepX = i * control.gap + i * stepWidth; - ctx.fillStyle = control.colorTrack; - ctx.fillRect(stepX, stepY, stepWidth, stepHeight); - } - - for (let ii = 0; ii < control.currentStep; ii++) { - const stepX = ii * control.gap + ii * stepWidth; - ctx.fillStyle = color; - ctx.fillRect(stepX, stepY, stepWidth, stepHeight); - } - } else { - const x = 0; - const y = (height - control.barThickness) * 0.5; - const progressWidth = control.percent * 0.01 * width; - const radius = control.strokeLineCap === 'round' ? control.barThickness * 0.5 : 0; - - drawRoundLine(ctx, x, y, width, control.barThickness, radius, control.colorTrack); - - if (progressWidth > 0) { - drawRoundLine(ctx, x, y, progressWidth, control.barThickness, radius, color); - /*! 绘制激活状态动画 */ - if (control.status == DelProgress.Status_Active) { - drawRoundLine(ctx, x, y, __canvas.activeWidth, control.barThickness, radius, __canvas.activeColor); - } - } - } - } - - function drawCircle(ctx, centerX, centerY, radius) { - /*! 确保绘制不会超出边界 */ - radius = Math.min(radius, Math.min(width, height) * 0.5 - control.barThickness); - const color = getCurrentColor(ctx); - if (control.steps > 0) { - /*! 计算每个步骤的弧长,考虑圆角影响 */ - const gap = control.gap; - const circumference = Math.PI * 2 * radius; - const totalGapLength = gap * control.steps; - const availableLength = circumference - totalGapLength; - const stepLength = availableLength / control.steps; - - /*! 绘制背景圆环段 */ - for (let i = 0; i < control.steps; i++) { - const gapDistance = (gap * i) / radius; - const stepAngle = stepLength / radius; - const startAngle = (i * stepAngle) + gapDistance - Math.PI / 2; - const endAngle = startAngle + stepLength / radius; - - drawStrokeWithRadius(ctx, centerX, centerY, radius, startAngle, endAngle, control.colorTrack); - } - - /*! 绘制已完成的步骤 */ - for (let ii = 0; ii < control.currentStep; ii++) { - const gapDistance = (gap * ii) / radius; - const stepAngle = stepLength / radius; - const startAngle = (ii * stepAngle) + gapDistance - Math.PI / 2; - const endAngle = startAngle + stepLength / radius; - - drawStrokeWithRadius(ctx, centerX, centerY, radius, startAngle, endAngle, color); - } - } else { - /*! 非步骤条需要使用线帽 */ - ctx.lineCap = control.strokeLineCap; - - /*! 绘制轨道 */ - drawStrokeWithRadius(ctx, centerX, centerY, radius, 0, Math.PI * 2, control.colorTrack); - - /*! 绘制进度 */ - const progress = control.percent * 0.01 * Math.PI * 2; - drawStrokeWithRadius(ctx, centerX, centerY, radius, -Math.PI / 2, progress - Math.PI / 2, color); - } - } - - function drawDashboard(ctx, centerX, centerY, radius) { - radius = Math.min(radius, Math.min(width, height) * 0.5 - control.barThickness); - /* ! 计算开始和结束角度 */ - const gapRad = Math.min(Math.max(control.gapDegree, 0), 295) * Math.PI / 180; - const startAngle = Math.PI * 0.5 + gapRad * 0.5; - const endAngle = Math.PI * 2.5 - gapRad * 0.5; - const color = getCurrentColor(ctx); - - if (control.steps > 0) { - /*! 计算每个步骤的弧长,考虑仪表盘缺口和步进间隔 */ - const gap = control.gap; - const availableAngle = endAngle - startAngle; - const totalGapAngle = (gap / radius) * (control.steps - 1); - const stepAngle = (availableAngle - totalGapAngle) / control.steps; - - /*! 绘制背景圆环段 */ - for (let i = 0; i < control.steps; i++) { - const stepStartAngle = startAngle + i * (stepAngle + gap / radius); - const stepEndAngle = stepStartAngle + stepAngle; - drawStrokeWithRadius(ctx, centerX, centerY, radius, stepStartAngle, stepEndAngle, control.colorTrack); - } - - /*! 绘制已完成的步骤 */ - for (let ii = 0; ii < control.currentStep; ii++) { - const stepStartAngle = startAngle + ii * (stepAngle + gap / radius); - const stepEndAngle = stepStartAngle + stepAngle; - drawStrokeWithRadius(ctx, centerX, centerY, radius, stepStartAngle, stepEndAngle, color); - } - } else { - /*! 非步骤条需要使用线帽 */ - ctx.lineCap = control.strokeLineCap; - - /*!绘制背景轨道 */ - drawStrokeWithRadius(ctx, centerX, centerY, radius, startAngle, endAngle, control.colorTrack); - - /*计算进度条角度 */ - const progressRange = endAngle - startAngle; - const progress = control.percent * 0.01 * progressRange; - - /*绘制进度 */ - drawStrokeWithRadius(ctx, centerX, centerY, radius, startAngle, startAngle + progress, color); - } - } - - onPaint: { - let ctx = getContext('2d'); - - let centerX = width / 2; - let centerY = height / 2; - let radius = Math.min(width, height) / 2 - control.barThickness; - - /*! 清除画布 */ - ctx.clearRect(0, 0, width, height); - - switch (control.type) { - case DelProgress.Type_Line: - drawLine(ctx); break; - case DelProgress.Type_Circle: - drawCircle(ctx, centerX, centerY, radius); break; - case DelProgress.Type_Dashboard: - drawDashboard(ctx, centerX, centerY, radius); break; - default: break; - } - } - } - - Loader { - id: __infoLoader - active: control.showInfo - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: control.type === DelProgress.Type_Line ? undefined : parent.horizontalCenter - anchors.right: control.type === DelProgress.Type_Line ? parent.right : undefined - sourceComponent: control.infoDelegate - } -} diff --git a/DelegateUI/Controls/DelRadio.qml b/DelegateUI/Controls/DelRadio.qml deleted file mode 100644 index 4e8200c..0000000 --- a/DelegateUI/Controls/DelRadio.qml +++ /dev/null @@ -1,117 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.RadioButton { - id: control - - property bool animationEnabled: DelTheme.animationEnabled - property bool effectEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property int radiusIndicator: 8 - property color colorText: enabled ? DelTheme.DelRadio.colorText : DelTheme.DelRadio.colorTextDisabled - property color colorIndicator: enabled ? - checked ? DelTheme.DelRadio.colorIndicatorChecked : - DelTheme.DelRadio.colorIndicator : DelTheme.DelRadio.colorIndicatorDisabled - property color colorIndicatorBorder: (enabled && (hovered || checked)) ? DelTheme.DelRadio.colorIndicatorBorderChecked : - DelTheme.DelRadio.colorIndicatorBorder - property string contentDescription: "" - - font { - family: DelTheme.DelRadio.fontFamily - pixelSize: DelTheme.DelRadio.fontSize - } - - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: Math.max(implicitContentHeight, implicitIndicatorHeight) + topPadding + bottomPadding - spacing: 8 - indicator: Item { - x: control.leftPadding - implicitWidth: __bg.width - implicitHeight: __bg.height - anchors.verticalCenter: parent.verticalCenter - - Rectangle { - id: __effect - width: __bg.width - height: __bg.height - radius: width * 0.5 - anchors.centerIn: parent - visible: control.effectEnabled - color: "transparent" - border.width: 0 - border.color: control.enabled ? DelTheme.DelRadio.colorEffectBg : "transparent" - opacity: 0.2 - - ParallelAnimation { - id: __animation - onFinished: __effect.border.width = 0; - NumberAnimation { - target: __effect; property: "width"; from: __bg.width + 3; to: __bg.width + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "height"; from: __bg.height + 3; to: __bg.height + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "opacity"; from: 0.2; to: 0; - duration: DelTheme.Primary.durationSlow - } - } - - Connections { - target: control - function onReleased() { - if (control.animationEnabled && control.effectEnabled) { - __effect.border.width = 8; - __animation.restart(); - } - } - } - } - - Rectangle { - id: __bg - width: control.radiusIndicator * 2 - height: width - anchors.centerIn: parent - radius: height * 0.5 - color: control.colorIndicator - border.color: control.colorIndicatorBorder - border.width: control.checked ? 0 : 1 - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on border.color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - Rectangle { - width: control.checked ? control.radiusIndicator - 2 : 0 - height: width - anchors.centerIn: parent - radius: width * 0.5 - - Behavior on width { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - } - } - } - contentItem: Text { - text: control.text - font: control.font - opacity: enabled ? 1.0 : 0.3 - color: control.colorText - verticalAlignment: Text.AlignVCenter - leftPadding: control.indicator.width + control.spacing - } - background: Item { } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Accessible.role: Accessible.RadioButton - Accessible.name: control.text - Accessible.description: control.contentDescription - Accessible.onPressAction: control.clicked(); -} diff --git a/DelegateUI/Controls/DelRadioBlock.qml b/DelegateUI/Controls/DelRadioBlock.qml deleted file mode 100644 index 45c32e7..0000000 --- a/DelegateUI/Controls/DelRadioBlock.qml +++ /dev/null @@ -1,197 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - - implicitWidth: __loader.width - implicitHeight: __loader.height - - font { - family: DelTheme.DelRadio.fontFamily - pixelSize: DelTheme.DelRadio.fontSize - } - - enum Type { - Type_Filled = 0, - Type_Outlined = 1 - } - - enum Size { - Size_Auto = 0, - Size_Fixed = 1 - } - - signal clicked(radioData: var) - - property bool animationEnabled: DelTheme.animationEnabled - property bool effectEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property var model: [] - property int count: model.length - property int initCheckedIndex: -1 - property int currentCheckedIndex: -1 - property var currentCheckedValue: undefined - property int type: DelRadioBlock.Type_Filled - property int size: DelRadioBlock.Size_Auto - property int radioWidth: 120 - property int radioHeight: 30 - property font font - property int radiusBg: 6 - property Component radioDelegate: DelButton { - id: __rootItem - - required property var modelData - required property int index - - T.ButtonGroup.group: __buttonGroup - Component.onCompleted: { - if (control.initCheckedIndex == index) { - checked = true; - __buttonGroup.clicked(__rootItem); - } - } - - animationEnabled: control.animationEnabled - effectEnabled: control.effectEnabled - hoverCursorShape: control.hoverCursorShape - implicitWidth: control.size == DelRadioBlock.Size_Auto ? (implicitContentWidth + leftPadding + rightPadding) : - control.radioWidth - implicitHeight: control.size == DelRadioBlock.Size_Auto ? (implicitContentHeight + topPadding + bottomPadding) : - control.radioHeight - z: (hovered || checked) ? 1 : 0 - enabled: control.enabled && (modelData.enabled === undefined ? true : modelData.enabled) - font: control.font - type: DelButton.Type_Default - text: modelData.label - colorBorder: (enabled && checked) ? DelTheme.DelRadio.colorBlockBorderChecked : - DelTheme.DelRadio.colorBlockBorder; - colorText: { - if (enabled) { - if (control.type == DelRadioBlock.Type_Filled) { - return checked ? DelTheme.DelRadio.colorBlockTextFilledChecked : - hovered ? DelTheme.DelRadio.colorBlockTextChecked : - DelTheme.DelRadio.colorBlockText; - } else { - return (checked || hovered) ? DelTheme.DelRadio.colorBlockTextChecked : - DelTheme.DelRadio.colorBlockText; - } - } else { - return DelTheme.DelRadio.colorTextDisabled; - } - } - colorBg: { - if (enabled) { - if (control.type == DelRadioBlock.Type_Filled) { - return down ? (checked ? DelTheme.DelRadio.colorBlockBgActive : DelTheme.DelRadio.colorBlockBg) : - hovered ? (checked ? DelTheme.DelRadio.colorBlockBgHover : DelTheme.DelRadio.colorBlockBg) : - checked ? DelTheme.DelRadio.colorBlockBgChecked : - DelTheme.DelRadio.colorBlockBg; - } else { - return DelTheme.DelRadio.colorBlockBg; - } - } else { - return checked ? DelTheme.DelRadio.colorBlockBgCheckedDisabled : DelTheme.DelRadio.colorBlockBgDisabled; - } - } - checkable: true - background: Item { - Rectangle { - id: __effect - width: __bg.width - height: __bg.height - anchors.centerIn: parent - visible: __rootItem.effectEnabled - color: "transparent" - border.width: 0 - border.color: __rootItem.enabled ? DelTheme.DelRadio.colorBlockEffectBg : "transparent" - opacity: 0.2 - - ParallelAnimation { - id: __animation - onFinished: __effect.border.width = 0; - NumberAnimation { - target: __effect; property: "width"; from: __bg.width + 3; to: __bg.width + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "height"; from: __bg.height + 3; to: __bg.height + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "opacity"; from: 0.2; to: 0; - duration: DelTheme.Primary.durationSlow - } - } - - Connections { - target: __rootItem - function onReleased() { - if (__rootItem.animationEnabled && __rootItem.effectEnabled) { - __effect.border.width = 8; - __animation.restart(); - } - } - } - } - - DelRectangle { - id: __bg - width: parent.width - height: parent.height - anchors.centerIn: parent - color: __rootItem.colorBg - topLeftRadius: index == 0 ? control.radiusBg : 0 - bottomLeftRadius: index == 0 ? control.radiusBg : 0 - topRightRadius: index === (count - 1) ? control.radiusBg : 0 - bottomRightRadius: index === (count - 1) ? control.radiusBg : 0 - border.width: 1 - border.color: __rootItem.colorBorder - - Behavior on color { enabled: __rootItem.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on border.color { enabled: __rootItem.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - } - } - - Connections { - target: control - function onCurrentCheckedIndexChanged() { - if (__rootItem.index == control.currentCheckedIndex) { - __rootItem.checked = true; - } - } - } - } - property string contentDescription: "" - - Loader { - id: __loader - sourceComponent: Row { - spacing: -1 - - Repeater { - id: __repeater - model: control.model - delegate: radioDelegate - } - } - - T.ButtonGroup { - id: __buttonGroup - onClicked: - button => { - control.currentCheckedIndex = button.index; - control.currentCheckedValue = button.modelData.value; - control.clicked(button.modelData); - } - } - } - - Accessible.role: Accessible.RadioButton - Accessible.name: control.contentDescription - Accessible.description: control.contentDescription - Accessible.onPressAction: control.clicked(); -} diff --git a/DelegateUI/Controls/DelRate.qml b/DelegateUI/Controls/DelRate.qml deleted file mode 100644 index eec330d..0000000 --- a/DelegateUI/Controls/DelRate.qml +++ /dev/null @@ -1,230 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import DelegateUI 1.0 - -Item { - id: control - - implicitWidth: __mouseArea.width - implicitHeight: __mouseArea.height - toolTipFont { - family: DelTheme.DelRate.fontFamily - pixelSize: DelTheme.DelRate.fontSize - } - - property bool animationEnabled: DelTheme.animationEnabled - property int hoverCursorShape: Qt.PointingHandCursor - property int count: 5 - property real initValue: -1 - property real value: 0 - property alias spacing: __row.spacing - property int iconSize: 24 - /* 文字提示 */ - property font toolTipFont - property bool toolTipVisible: false - property var toolTipTexts: [] - property color colorFill: DelTheme.DelRate.colorFill - property color colorEmpty: DelTheme.DelRate.colorEmpty - property color colorHalf: DelTheme.DelRate.colorHalf - property color colorToolTipText: DelTheme.DelRate.colorToolTipText - property color colorToolTipBg: DelTheme.isDark ? DelTheme.DelRate.colorToolTipBgDark : DelTheme.DelRate.colorToolTipBg - /* 允许半星 */ - property bool allowHalf: false - property bool isDone: false - property int fillIcon: DelIcon.StarFilled - property int emptyIcon: DelIcon.StarFilled - property int halfIcon: DelIcon.StarFilled - property Component fillDelegate: DelIconText { - colorIcon: control.colorFill - iconSource: control.fillIcon - iconSize: control.iconSize - } - property Component emptyDelegate: DelIconText { - colorIcon: control.colorEmpty - iconSource: control.emptyIcon - iconSize: control.iconSize - } - property Component halfDelegate: DelIconText { - colorIcon: control.colorEmpty - iconSource: control.emptyIcon - iconSize: control.iconSize - - DelIconText { - id: __source - colorIcon: control.colorHalf - iconSource: control.halfIcon - iconSize: control.iconSize - layer.enabled: true - layer.effect: halfRateHelper - } - } - property Component toolTipDelegate: Item { - width: 12 - height: 6 - opacity: hovered ? 1 : 0 - - Behavior on opacity { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - - DropShadow { - anchors.fill: __item - radius: 16 - samples: 17 - color: DelThemeFunctions.alpha(control.colorToolTipText, DelTheme.isDark ? 0.1 : 0.2) - source: __item - } - - Item { - id: __item - width: __toolTipBg.width - height: __arrow.height + __toolTipBg.height - 1 - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom - - Rectangle { - id: __toolTipBg - width: __toolTipText.implicitWidth + 14 - height: __toolTipText.implicitHeight + 12 - anchors.bottom: __arrow.top - anchors.bottomMargin: -1 - anchors.horizontalCenter: parent.horizontalCenter - color: control.colorToolTipBg - radius: 4 - - Text { - id: __toolTipText - color: control.colorToolTipText - text: control.toolTipTexts[index] - font: control.toolTipFont - anchors.centerIn: parent - } - } - - Canvas { - id: __arrow - width: 12 - height: 6 - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - onColorBgChanged: requestPaint(); - onPaint: { - const ctx = getContext("2d"); - ctx.beginPath(); - ctx.moveTo(0, 0); - ctx.lineTo(width, 0); - ctx.lineTo(width * 0.5, height); - ctx.closePath(); - ctx.fillStyle = colorBg; - ctx.fill(); - } - property color colorBg: control.colorToolTipBg - } - } - } - - property Component halfRateHelper: ShaderEffect { - fragmentShader: "qrc:/DelegateUI/shaders/delrate.frag" - } - - onInitValueChanged: { - __private.doneValue = value = initValue; - isDone = true; - } - - /* 结束 */ - signal done(int value); - - QtObject { - id: __private - property real doneValue: 0 - } - - MouseArea { - id: __mouseArea - width: __row.width - height: control.iconSize - hoverEnabled: true - enabled: control.enabled - onExited: { - if (control.isDone) { - control.value = __private.doneValue; - } - } - - Row { - id: __row - spacing: 4 - - Repeater { - id: __repeater - - property int fillCount: Math.floor(control.value) - property int emptyStartIndex: Math.round(control.value) - property bool hasHalf: control.value - fillCount > 0 - - model: control.count - delegate: MouseArea { - id: __rootItem - width: control.iconSize - height: control.iconSize - hoverEnabled: true - cursorShape: hovered ? control.hoverCursorShape : Qt.ArrowCursor - enabled: control.enabled - onEntered: hovered = true; - onExited: hovered = false; - onClicked: { - control.isDone = !control.isDone; - if (control.isDone) { - __private.doneValue = control.value; - control.done(__private.doneValue); - } - } - onPositionChanged: function(mouse) { - if (control.allowHalf) { - if (mouse.x > (width * 0.5)) { - control.value = index + 1; - } else { - control.value = index + 0.5; - } - - } else { - control.value = index + 1; - } - } - required property int index - property bool hovered: false - - Loader { - active: index < __repeater.fillCount - sourceComponent: control.fillDelegate - property int index: __rootItem.index - property bool hovered: __rootItem.hovered - } - - Loader { - active: __repeater.hasHalf && index === (__repeater.emptyStartIndex - 1) - sourceComponent: control.halfDelegate - property int index: __rootItem.index - property bool hovered: __rootItem.hovered - } - - Loader { - active: index >= __repeater.emptyStartIndex - sourceComponent: control.emptyDelegate - property int index: __rootItem.index - property bool hovered: __rootItem.hovered - } - - Loader { - x: (parent.width - width) * 0.5 - y: -height - 4 - z: 10 - active: control.toolTipVisible - sourceComponent: control.toolTipDelegate - property int index: __rootItem.index - property bool hovered: __rootItem.hovered - } - } - } - } - } -} diff --git a/DelegateUI/Controls/DelResizeMouseArea.qml b/DelegateUI/Controls/DelResizeMouseArea.qml deleted file mode 100644 index 3c2e9ca..0000000 --- a/DelegateUI/Controls/DelResizeMouseArea.qml +++ /dev/null @@ -1,354 +0,0 @@ -import QtQuick 2.15 - -/* - ↑ ↑ ↑ - ←|1| |2| |3|→ - ←|4| |5| |6|→ - ←|7| |8| |9|→ - ↓ ↓ ↓ - 分8个缩放区域 - |5|为移动区域{MoveMouseArea} - target 缩放目标 - __private.startPos 鼠标起始点 - __private.fixedPos 用于固定目标的点 - 每一个area 大小 areaMarginSize x areaMarginSize -*/ - -Item { - id: root - - property var target: undefined - property real areaMarginSize: 8 - property bool resizable: true - property real minimumWidth: 0 - property real maximumWidth: Number.NaN - property real minimumHeight: 0 - property real maximumHeight: Number.NaN - - property alias movable: area5.enabled - property alias minimumX: area5.minimumX - property alias maximumX: area5.maximumX - property alias minimumY: area5.minimumY - property alias maximumY: area5.maximumY - - QtObject { - id: __private - property point startPos: Qt.point(0, 0) - property point fixedPos: Qt.point(0, 0) - } - - MouseArea { - id: area1 - x: 0 - y: 0 - width: areaMarginSize - height: areaMarginSize - enabled: resizable - hoverEnabled: true - onEntered: cursorShape = Qt.SizeFDiagCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: (mouse) => __private.startPos = Qt.point(mouseX, mouseY); - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - let offsetY = mouse.y - __private.startPos.y; - //如果本次调整小于最小限制,则调整为最小,大于最大则调整为最大 - if (maximumWidth != Number.NaN && (target.width - offsetX) > maximumWidth) { - target.x += (target.width - maximumWidth); - target.width = maximumWidth; - } else if ((target.width - offsetX) < minimumWidth) { - target.x += (target.width - minimumWidth); - target.width = minimumWidth; - } else { - target.x += offsetX; - target.width -= offsetX; - } - - if (maximumHeight != Number.NaN && (target.height - offsetY) > maximumHeight) { - target.y += (target.height - maximumHeight); - target.height = maximumHeight; - } else if ((target.height - offsetY) < minimumHeight) { - target.y += (target.height - minimumHeight); - target.height = minimumHeight; - } else { - target.y += offsetY; - target.height -= offsetY; - } - } - } - } - - MouseArea { - id: area2 - x: areaMarginSize - y: 0 - width: target.width - areaMarginSize * 2 - height: areaMarginSize - enabled: resizable - hoverEnabled: true - onEntered: cursorShape = Qt.SizeVerCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: (mouse) => __private.startPos = Qt.point(mouseX, mouseY); - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetY = mouse.y - __private.startPos.y; - if (maximumHeight != Number.NaN && (target.height - offsetY) > maximumHeight) { - target.y += (target.height - maximumHeight); - target.height = maximumHeight; - } else if ((target.height - offsetY) < minimumHeight) { - target.y += (target.height - minimumHeight); - target.height = minimumHeight; - } else { - target.y += offsetY; - target.height -= offsetY; - } - } - } - } - - MouseArea { - id: area3 - x: target.width - areaMarginSize - y: 0 - width: areaMarginSize - height: areaMarginSize - enabled: resizable - hoverEnabled: true - onEntered: cursorShape = Qt.SizeBDiagCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - if (root.target) { - __private.startPos = Qt.point(mouseX, mouseY); - __private.fixedPos = Qt.point(target.x, target.y); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - let offsetY = mouse.y - __private.startPos.y; - target.x = __private.fixedPos.x; - if (maximumWidth != Number.NaN && (target.width + offsetX) > maximumWidth) { - target.width = maximumWidth; - } else if ((target.width + offsetX) < minimumWidth) { - target.width = minimumWidth; - } else { - target.width += offsetX; - } - - if (maximumHeight != Number.NaN && (target.height - offsetY) > maximumHeight) { - target.y += (target.height - maximumHeight); - target.height = maximumHeight; - } else if ((target.height - offsetY) < minimumHeight) { - target.y += (target.height - minimumHeight); - target.height = minimumHeight; - } else { - target.y += offsetY; - target.height -= offsetY; - } - } - } - } - - MouseArea { - id: area4 - x: 0 - y: areaMarginSize - width: areaMarginSize - height: target.height - areaMarginSize * 2 - enabled: resizable - hoverEnabled: true - onEntered: cursorShape = Qt.SizeHorCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - __private.startPos = Qt.point(mouseX, mouseY); - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - if (maximumWidth != Number.NaN && (target.width - offsetX) > maximumWidth) { - target.x += (target.width - maximumWidth); - target.width = maximumWidth; - } else if ((target.width - offsetX) < minimumWidth) { - target.x += (target.width - minimumWidth); - target.width = minimumWidth; - } else { - target.x += offsetX; - target.width -= offsetX; - } - } - } - } - - DelMoveMouseArea { - id: area5 - x: areaMarginSize - y: areaMarginSize - width: root.target.width - areaMarginSize * 2 - height: root.target.height - areaMarginSize * 2 - enabled: false - target: root.target - } - - MouseArea { - id: area6 - x: target.width - areaMarginSize - y: areaMarginSize - width: areaMarginSize - height: target.height - areaMarginSize * 2 - enabled: resizable - hoverEnabled: true - property real fixedX: 0 - onEntered: cursorShape = Qt.SizeHorCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - if (target) { - __private.startPos = Qt.point(mouseX, mouseY); - __private.fixedPos = Qt.point(target.x, target.y); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - target.x = __private.fixedPos.x; - if (maximumWidth != Number.NaN && (target.width + offsetX) > maximumWidth) { - target.width = maximumWidth; - } else if ((target.width + offsetX) < minimumWidth) { - target.width = minimumWidth; - } else { - target.width += offsetX; - } - } - } - } - - MouseArea { - id: area7 - x: 0 - y: target.height - areaMarginSize - width: areaMarginSize - height: target.height - areaMarginSize * 2 - enabled: resizable - hoverEnabled: true - property real fixedX: 0 - onEntered: cursorShape = Qt.SizeBDiagCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - if (target) { - __private.startPos = Qt.point(mouseX, mouseY); - __private.fixedPos = Qt.point(target.x, target.y); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - let offsetY = mouse.y - __private.startPos.y; - if (maximumWidth != Number.NaN && (target.width - offsetX) > maximumWidth) { - target.x += (target.width - maximumWidth); - target.width = maximumWidth; - } else if ((target.width - offsetX) < minimumWidth) { - target.x += (target.width - minimumWidth); - target.width = minimumWidth; - } else { - target.x += offsetX; - target.width -= offsetX; - } - - target.y = __private.fixedPos.y; - if (maximumHeight != Number.NaN && (target.height + offsetY) > maximumHeight) { - target.height = maximumHeight; - } else if ((target.height + offsetY) < minimumHeight) { - target.height = minimumHeight; - } else { - target.height += offsetY; - } - } - } - } - - MouseArea { - id: area8 - x: areaMarginSize - y: target.height - areaMarginSize - width: target.height - areaMarginSize * 2 - height: areaMarginSize - enabled: resizable - hoverEnabled: true - property real fixedX: 0 - onEntered: cursorShape = Qt.SizeVerCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - if (target) { - __private.startPos = Qt.point(mouseX, mouseY); - __private.fixedPos = Qt.point(target.x, target.y); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetY = mouse.y - __private.startPos.y; - target.y = __private.fixedPos.y; - if (maximumHeight != Number.NaN && (target.height + offsetY) > maximumHeight) { - target.height = maximumHeight; - } else if ((target.height + offsetY) < minimumHeight) { - target.height = minimumHeight; - } else { - target.height += offsetY; - } - } - } - } - - MouseArea { - id: area9 - x: target.width - areaMarginSize - y: target.height - areaMarginSize - width: areaMarginSize - height: areaMarginSize - enabled: resizable - hoverEnabled: true - onEntered: cursorShape = Qt.SizeFDiagCursor; - onExited: cursorShape = Qt.ArrowCursor; - onPressed: - (mouse) => { - if (target) { - __private.startPos = Qt.point(mouseX, mouseY); - __private.fixedPos = Qt.point(target.x, target.y); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - let offsetX = mouse.x - __private.startPos.x; - let offsetY = mouse.y - __private.startPos.y; - target.x = __private.fixedPos.x; - if (maximumWidth != Number.NaN && (target.width + offsetX) > maximumWidth) { - target.width = maximumWidth; - } else if ((target.width + offsetX) < minimumWidth) { - target.width = minimumWidth; - } else { - target.width += offsetX; - } - - target.y = __private.fixedPos.y; - if (maximumHeight != Number.NaN && (target.height + offsetY) > maximumHeight) { - target.height = maximumHeight; - } else if ((target.height + offsetY) < minimumHeight) { - target.height = minimumHeight; - } else { - target.height += offsetY; - } - } - } - } -} diff --git a/DelegateUI/Controls/DelScrollBar.qml b/DelegateUI/Controls/DelScrollBar.qml deleted file mode 100644 index e15a3d8..0000000 --- a/DelegateUI/Controls/DelScrollBar.qml +++ /dev/null @@ -1,138 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.ScrollBar { - id: control - - property bool animationEnabled: DelTheme.animationEnabled - property color colorBar: control.pressed ? DelTheme.DelScrollBar.colorBarActive : - control.hovered ? DelTheme.DelScrollBar.colorBarHover : - DelTheme.DelScrollBar.colorBar - property color colorBg: control.pressed ? DelTheme.DelScrollBar.colorBgActive : - control.hovered ? DelTheme.DelScrollBar.colorBgHover : - DelTheme.DelScrollBar.colorBg - property string contentDescription: "" - - QtObject { - id: __private - property bool visible: control.hovered || control.pressed - } - - width: control.orientation == Qt.Vertical ? 10 : parent.width - height: control.orientation == Qt.Horizontal ? 10 : parent.height - anchors.right: control.orientation == Qt.Vertical ? parent.right : undefined - anchors.bottom: control.orientation == Qt.Horizontal ? parent.bottom : undefined - leftPadding: control.orientation == Qt.Horizontal ? (leftInset + 10) : leftInset - rightPadding: control.orientation == Qt.Horizontal ? (rightInset + 10) : rightInset - topPadding: control.orientation == Qt.Vertical ? (topInset + 10) : topInset - bottomPadding: control.orientation == Qt.Vertical ? (bottomInset + 10) : bottomInset - policy: T.ScrollBar.AlwaysOn - visible: (control.policy != T.ScrollBar.AlwaysOff) && control.size !== 1 - contentItem: Item { - Rectangle { - width: { - if (control.orientation == Qt.Vertical) { - return __private.visible ? 6 : 2; - } else { - return parent.width; - } - } - height: { - if (control.orientation == Qt.Vertical) { - return parent.height; - } else { - return __private.visible ? 6 : 2; - } - } - anchors.verticalCenter: parent.verticalCenter - anchors.horizontalCenter: parent.horizontalCenter - radius: control.orientation == Qt.Vertical ? width * 0.5 : height * 0.5 - color: control.colorBar - opacity: { - if (control.policy == T.ScrollBar.AlwaysOn) { - return 1; - } else if (control.policy == T.ScrollBar.AsNeeded) { - return __private.visible ? 1 : 0; - } else { - return 0; - } - } - - Behavior on width { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on height { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on opacity { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - } - } - background: Rectangle { - color: control.colorBg - opacity: __private.visible ? 1 : 0 - - Behavior on opacity { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - } - - component HoverIcon: DelIconText { - signal clicked() - property bool hovered: false - - colorIcon: hovered ? DelTheme.DelScrollBar.colorIconHover : DelTheme.DelScrollBar.colorIcon - opacity: __private.visible ? 1 : 0 - - Behavior on opacity { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - onEntered: parent.hovered = true; - onExited: parent.hovered = false; - onClicked: parent.clicked(); - } - } - - Loader { - active: control.orientation == Qt.Vertical - anchors.horizontalCenter: parent.horizontalCenter - anchors.top: parent.top - sourceComponent: HoverIcon { - iconSize: parent.width - iconSource: DelIcon.CaretUpOutlined - onClicked: control.decrease(); - } - } - - Loader { - active: control.orientation == Qt.Vertical - anchors.horizontalCenter: parent.horizontalCenter - anchors.bottom: parent.bottom - sourceComponent: HoverIcon { - iconSize: parent.width - iconSource: DelIcon.CaretDownOutlined - onClicked: control.increase(); - } - } - - Loader { - active: control.orientation == Qt.Horizontal - anchors.verticalCenter: parent.verticalCenter - anchors.left: parent.left - sourceComponent: HoverIcon { - iconSize: parent.height - iconSource: DelIcon.CaretLeftOutlined - onClicked: control.decrease(); - } - } - - Loader { - active: control.orientation == Qt.Horizontal - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - sourceComponent: HoverIcon { - iconSize: parent.height - iconSource: DelIcon.CaretRightOutlined - onClicked: control.increase(); - } - } - - Accessible.role: Accessible.ScrollBar - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelSelect.qml b/DelegateUI/Controls/DelSelect.qml deleted file mode 100644 index aae91ce..0000000 --- a/DelegateUI/Controls/DelSelect.qml +++ /dev/null @@ -1,196 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.ComboBox { - id: control - - property bool animationEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property bool tooltipVisible: false - property bool loading: false - property int defaulPopupMaxHeight: 240 - property color colorText: enabled ? - popup.visible ? DelTheme.DelSelect.colorTextActive : - DelTheme.DelSelect.colorText : DelTheme.DelSelect.colorTextDisabled - property color colorBorder: enabled ? - hovered ? DelTheme.DelSelect.colorBorderHover : - DelTheme.DelSelect.colorBorder : DelTheme.DelSelect.colorBorderDisabled - property color colorBg: enabled ? DelTheme.DelSelect.colorBg : DelTheme.DelSelect.colorBgDisabled - - property int radiusBg: 6 - property int radiusPopupBg: 6 - property string contentDescription: "" - - property Component indicatorDelegate: DelIconText { - iconSize: 12 - iconSource: control.loading ? DelIcon.LoadingOutlined : DelIcon.DownOutlined - - NumberAnimation on rotation { - running: control.loading - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - - Behavior on colorText { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBorder { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - rightPadding: 8 - topPadding: 5 - bottomPadding: 5 - implicitWidth: implicitContentWidth + implicitIndicatorWidth + leftPadding + rightPadding - implicitHeight: implicitContentHeight + topPadding + bottomPadding - textRole: "label" - valueRole: "value" - objectName: "__DelSelect__" - font { - family: DelTheme.DelSelect.fontFamily - pixelSize: DelTheme.DelSelect.fontSize - } - delegate: T.ItemDelegate { } - indicator: Loader { - x: control.width - width - control.rightPadding - y: control.topPadding + (control.availableHeight - height) / 2 - sourceComponent: indicatorDelegate - } - contentItem: Text { - leftPadding: 8 - rightPadding: control.indicator.width + control.spacing - text: control.displayText - font: control.font - color: control.colorText - verticalAlignment: Text.AlignVCenter - elide: Text.ElideRight - } - background: Rectangle { - color: control.colorBg - border.color: control.colorBorder - border.width: control.visualFocus ? 2 : 1 - radius: control.radiusBg - } - popup: DelPopup { - id: __popup - y: control.height + 2 - implicitWidth: control.width - implicitHeight: implicitContentHeight + topPadding + bottomPadding - leftPadding: 4 - rightPadding: 4 - topPadding: 6 - bottomPadding: 6 - enter: Transition { - NumberAnimation { - property: 'opacity' - from: 0.0 - to: 1.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - NumberAnimation { - property: 'height' - from: 0 - to: __popup.implicitHeight - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - exit: Transition { - NumberAnimation { - property: 'opacity' - from: 1.0 - to: 0.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - NumberAnimation { - property: 'height' - to: 0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - contentItem: ListView { - id: __popupListView - implicitHeight: Math.min(control.defaulPopupMaxHeight, contentHeight) - clip: true - model: control.popup.visible ? control.model : null - currentIndex: control.highlightedIndex - boundsBehavior: Flickable.StopAtBounds - delegate: T.ItemDelegate { - id: __popupDelegate - - required property var modelData - required property int index - property alias model: __popupDelegate.modelData - - width: __popupListView.width - height: implicitContentHeight + topPadding + bottomPadding - leftPadding: 8 - rightPadding: 8 - topPadding: 4 - bottomPadding: 4 - enabled: model.enabled ?? true - contentItem: Text { - text: __popupDelegate.model[control.textRole] - color: __popupDelegate.enabled ? DelTheme.DelSelect.colorItemText : DelTheme.DelSelect.colorItemTextDisabled; - font { - family: DelTheme.DelSelect.fontFamily - pixelSize: DelTheme.DelSelect.fontSize - weight: highlighted ? Font.DemiBold : Font.Normal - } - elide: Text.ElideRight - verticalAlignment: Text.AlignVCenter - } - background: Rectangle { - radius: 2 - color: { - if (__popupDelegate.enabled) - return highlighted ? DelTheme.DelSelect.colorItemBgActive : - hovered ? DelTheme.DelSelect.colorItemBgHover : - DelTheme.DelSelect.colorItemBg; - else - return DelTheme.DelSelect.colorItemBgDisabled; - } - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - highlighted: control.highlightedIndex === index - onClicked: { - control.currentIndex = index; - control.activated(index); - control.popup.close(); - } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Loader { - y: __popupDelegate.height - anchors.horizontalCenter: parent.horizontalCenter - active: control.tooltipVisible - sourceComponent: DelToolTip { - arrowVisible: false - visible: __popupDelegate.hovered - text: __popupDelegate.model[control.textRole] - position: DelToolTip.Position_Bottom - } - } - } - T.ScrollBar.vertical: DelScrollBar { } - - Behavior on height { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - } - } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Accessible.role: Accessible.ComboBox - Accessible.name: control.displayText - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelSlider.qml b/DelegateUI/Controls/DelSlider.qml deleted file mode 100644 index 2f21744..0000000 --- a/DelegateUI/Controls/DelSlider.qml +++ /dev/null @@ -1,273 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - - enum SnapMode - { - NoSnap = 0, - SnapAlways = 1, - SnapOnRelease = 2 - } - - signal firstMoved() - signal firstReleased() - signal secondMoved() - signal secondReleased() - - property bool animationEnabled: DelTheme.animationEnabled - property int hoverCursorShape: Qt.PointingHandCursor - property real min: 0 - property real max: 100 - property real stepSize: 0.0 - property var value: range ? [0, 0] : 0 - readonly property var currentValue: { - if (__sliderLoader.item) { - return range ? [__sliderLoader.item.first.value, __sliderLoader.item.second.value] : __sliderLoader.item.value; - } else { - return value; - } - } - property bool range: false - property bool hovered: __sliderLoader.item ? __sliderLoader.item.hovered : false - property int snapMode: DelSlider.NoSnap - property int orientation: Qt.Horizontal - property int radiusBg: 6 - property color colorBg: (enabled && hovered) ? DelTheme.DelSlider.colorBgHover : DelTheme.DelSlider.colorBg - property color colorHandle: DelTheme.DelSlider.colorHandle - property color colorTrack: { - if (!enabled) return DelTheme.DelSlider.colorTrackDisabled; - - if (DelTheme.isDark) - return hovered ? DelTheme.DelSlider.colorTrackHoverDark : DelTheme.DelSlider.colorTrackDark; - else - return hovered ? DelTheme.DelSlider.colorTrackHover : DelTheme.DelSlider.colorTrack; - } - property Component handleToolTipDelegate: Item { } - property Component handleDelegate: Rectangle { - id: __handleItem - x: { - if (control.orientation == Qt.Horizontal) { - return slider.leftPadding + visualPosition * (slider.availableWidth - width); - } else { - return slider.topPadding + (slider.availableWidth - width) * 0.5; - } - } - y: { - if (control.orientation == Qt.Horizontal) { - return slider.topPadding + (slider.availableHeight - height) * 0.5; - } else { - return slider.leftPadding + visualPosition * (slider.availableHeight - height); - } - } - implicitWidth: active ? 18 : 14 - implicitHeight: active ? 18 : 14 - radius: height * 0.5 - color: control.colorHandle - border.color: { - if (control.enabled) { - if (DelTheme.isDark) - return active ? DelTheme.DelSlider.colorHandleBorderHoverDark : DelTheme.DelSlider.colorHandleBorderDark; - else - return active ? DelTheme.DelSlider.colorHandleBorderHover : DelTheme.DelSlider.colorHandleBorder; - } else { - return DelTheme.DelSlider.colorHandleBorderDisabled; - } - } - border.width: active ? 4 : 2 - - property bool down: pressed - property bool active: __hoverHandler.hovered || down - - Behavior on implicitWidth { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on implicitHeight { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on border.width { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on border.color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - HoverHandler { - id: __hoverHandler - cursorShape: control.hoverCursorShape - } - - Loader { - sourceComponent: handleToolTipDelegate - onLoaded: item.parent = __handleItem; - property alias handleHovered: __hoverHandler.hovered - property alias handlePressed: __handleItem.down - } - } - property Component bgDelegate: Item { - Rectangle { - width: control.orientation == Qt.Horizontal ? parent.width : 4 - height: control.orientation == Qt.Horizontal ? 4 : parent.height - anchors.horizontalCenter: control.orientation == Qt.Horizontal ? undefined : parent.horizontalCenter - anchors.verticalCenter: control.orientation == Qt.Horizontal ? parent.verticalCenter : undefined - radius: control.radiusBg - color: control.colorBg - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - Rectangle { - x: { - if (control.orientation == Qt.Horizontal) - return range ? (slider.first.visualPosition * parent.width) : 0; - else - return 0; - } - y: { - if (control.orientation == Qt.Horizontal) - return 0; - else - return range ? (slider.second.visualPosition * parent.height) : slider.visualPosition * parent.height; - } - width: { - if (control.orientation == Qt.Horizontal) - return range ? (slider.second.visualPosition * parent.width - x) : slider.visualPosition * parent.width; - else - return parent.width; - } - height: { - if (control.orientation == Qt.Horizontal) - return parent.height; - else - return range ? (slider.first.visualPosition * parent.height - y) : ((1.0 - slider.visualPosition) * parent.height); - } - color: colorTrack - radius: parent.radius - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - } - } - property string contentDescription: "" - - onValueChanged: __fromValueUpdate(); - - function decrease(first = true) { - if (__sliderLoader.item) { - if (range) { - if (first) - __sliderLoader.item.first.decrease(); - else - __sliderLoader.item.second.decrease(); - } else { - __sliderLoader.item.decrease(); - } - } - } - function increase(first = true) { - if (range) { - if (first) - __sliderLoader.item.first.increase(); - else - __sliderLoader.item.second.increase(); - } else { - __sliderLoader.item.decrease(); - } - } - function __fromValueUpdate() { - if (__sliderLoader.item) { - if (range) { - __sliderLoader.item.setValues(...value); - } else { - __sliderLoader.item.value = value; - } - } - } - - Component { - id: __sliderComponent - - T.Slider { - id: __control - from: min - to: max - stepSize: control.stepSize - orientation: control.orientation - snapMode: { - switch (control.snapMode) { - case DelSlider.SnapAlways: return T.Slider.SnapAlways; - case DelSlider.SnapOnRelease: return T.Slider.SnapOnRelease; - default: return T.Slider.NoSnap; - } - } - handle: Loader { - sourceComponent: handleDelegate - property alias slider: __control - property alias visualPosition: __control.visualPosition - property alias pressed: __control.pressed - } - background: Loader { - sourceComponent: bgDelegate - property alias slider: __control - property alias visualPosition: __control.visualPosition - } - onMoved: control.firstMoved(); - onPressedChanged: { - if (!pressed) - control.firstReleased(); - } - } - } - - Component { - id: __rangeSliderComponent - - T.RangeSlider { - id: __control - from: min - to: max - stepSize: control.stepSize - snapMode: { - switch (control.snapMode) { - case DelSlider.SnapAlways: return T.RangeSlider.SnapAlways; - case DelSlider.SnapOnRelease: return T.RangeSlider.SnapOnRelease; - default: return T.RangeSlider.NoSnap; - } - } - orientation: control.orientation - first.handle: Loader { - sourceComponent: handleDelegate - property alias slider: __control - property alias visualPosition: __control.first.visualPosition - property alias pressed: __control.first.pressed - } - first.onMoved: control.firstMoved(); - first.onPressedChanged: { - if (!first.pressed) - control.firstReleased(); - } - second.handle: Loader { - sourceComponent: handleDelegate - property alias slider: __control - property alias visualPosition: __control.second.visualPosition - property alias pressed: __control.second.pressed - } - second.onMoved: control.secondMoved(); - second.onPressedChanged: { - if (!second.pressed) - control.secondReleased(); - } - background: Loader { - sourceComponent: bgDelegate - property alias slider: __control - } - } - } - - Loader { - id: __sliderLoader - anchors.fill: parent - sourceComponent: control.range ? __rangeSliderComponent : __sliderComponent - onLoaded: __fromValueUpdate(); - } - - Accessible.role: Accessible.Slider - Accessible.name: control.contentDescription - Accessible.description: control.contentDescription - Accessible.onIncreaseAction: increase(); - Accessible.onDecreaseAction: decrease(); -} diff --git a/DelegateUI/Controls/DelSwitch.qml b/DelegateUI/Controls/DelSwitch.qml deleted file mode 100644 index 6f95fe4..0000000 --- a/DelegateUI/Controls/DelSwitch.qml +++ /dev/null @@ -1,193 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Switch { - id: control - - property bool animationEnabled: DelTheme.animationEnabled - property bool effectEnabled: true - property int hoverCursorShape: Qt.PointingHandCursor - property bool loading: false - property string checkedText: "" - property string uncheckedText: "" - property int checkedIconSource: 0 - property int uncheckedIconSource: 0 - property string contentDescription: "" - property int radiusBg: __bg.height * 0.5 - property color colorHandle: DelTheme.DelSwitch.colorHandle - property color colorBg: { - if (!enabled) - return checked ? DelTheme.DelSwitch.colorCheckedBgDisabled : DelTheme.DelSwitch.colorBgDisabled; - - if (checked) - return control.down ? DelTheme.DelSwitch.colorCheckedBgActive : - control.hovered ? DelTheme.DelSwitch.colorCheckedBgHover : - DelTheme.DelSwitch.colorCheckedBg; - else - return control.down ? DelTheme.DelSwitch.colorBgActive : - control.hovered ? DelTheme.DelSwitch.colorBgHover : - DelTheme.DelSwitch.colorBg; - } - property Component handleDelegate: Rectangle { - radius: height * 0.5 - color: control.colorHandle - - DelIconText { - anchors.centerIn: parent - iconSize: parent.height - 4 - iconSource: DelIcon.LoadingOutlined - colorIcon: control.colorBg - visible: control.loading - transformOrigin: Item.Center - - NumberAnimation on rotation { - running: control.loading - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - } - - width: implicitIndicatorWidth + leftPadding + rightPadding - height: implicitIndicatorHeight + topPadding + bottomPadding - font { - family: DelTheme.DelSwitch.fontFamily - pixelSize: DelTheme.DelSwitch.fontSize - 2 - } - indicator: Item { - implicitWidth: __bg.width - implicitHeight: __bg.height - - Rectangle { - id: __effect - width: __bg.width - height: __bg.height - radius: __bg.radius - anchors.centerIn: parent - visible: control.effectEnabled - color: "transparent" - border.width: 0 - border.color: control.enabled ? DelTheme.DelSwitch.colorBgHover : "transparent" - opacity: 0.2 - - ParallelAnimation { - id: __animation - onFinished: __effect.border.width = 0; - NumberAnimation { - target: __effect; property: "width"; from: __bg.width + 3; to: __bg.width + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "height"; from: __bg.height + 3; to: __bg.height + 8; - duration: DelTheme.Primary.durationFast - easing.type: Easing.OutQuart - } - NumberAnimation { - target: __effect; property: "opacity"; from: 0.2; to: 0; - duration: DelTheme.Primary.durationSlow - } - } - - Connections { - target: control - function onReleased() { - if (control.animationEnabled && control.effectEnabled) { - __effect.border.width = 8; - __animation.restart(); - } - } - } - } - Rectangle { - id: __bg - width: Math.max(Math.max(checkedWidth, uncheckedWidth) + __handle.width, height * 2) - height: hasText ? Math.max(checkedHeight, uncheckedHeight, 22) : 22 - anchors.centerIn: parent - radius: control.radiusBg - color: control.colorBg - clip: true - - property bool hasText: control.checkedIconSource !== 0 || control.uncheckedIconSource !== 0 || - control.checkedText.length !== 0 || control.uncheckedText.length !== 0 - property real checkedWidth: control.checkedIconSource == 0 ? __checkedText.width + 6 : __checkedIcon.width + 6 - property real uncheckedWidth: control.checkedIconSource == 0 ? __uncheckedText.width + 6 : __uncheckedIcon.width + 6 - property real checkedHeight: control.checkedIconSource == 0 ? __checkedText.height + 4 : __checkedIcon.height + 4 - property real uncheckedHeight: control.checkedIconSource == 0 ? __uncheckedText.height + 4 : __uncheckedIcon.height + 4 - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - Text { - id: __checkedText - width: text.length === 0 ? 0 : Math.max(implicitWidth + 8, __uncheckedText.implicitWidth + 8) - anchors.verticalCenter: parent.verticalCenter - anchors.right: __handle.left - font: control.font - text: control.checkedText - color: control.colorHandle - horizontalAlignment: Text.AlignHCenter - visible: !__checkedIcon.visible - } - - Text { - id: __uncheckedText - width: text.length === 0 ? 0 : Math.max(implicitWidth + 8, __checkedText.implicitWidth + 8) - anchors.verticalCenter: parent.verticalCenter - anchors.left: __handle.right - font: control.font - text: control.uncheckedText - color: control.colorHandle - horizontalAlignment: Text.AlignHCenter - visible: !__uncheckedIcon.visible - } - - DelIconText { - id: __checkedIcon - width: text.length === 0 ? 0 : implicitWidth + 8 - anchors.verticalCenter: parent.verticalCenter - anchors.right: __handle.left - iconSize: control.font.pixelSize - iconSource: control.checkedIconSource - colorIcon: control.colorHandle - horizontalAlignment: Text.AlignHCenter - visible: iconSource != 0 - } - - DelIconText { - id: __uncheckedIcon - width: text.length === 0 ? 0 : implicitWidth + 8 - anchors.verticalCenter: parent.verticalCenter - anchors.left: __handle.right - iconSize: control.font.pixelSize - iconSource: control.uncheckedIconSource - colorIcon: control.colorHandle - horizontalAlignment: Text.AlignHCenter - visible: iconSource != 0 - } - - Loader { - id: __handle - x: control.checked ? (parent.width - (control.pressed ? height + 6 : height) - 2) : 2 - width: control.pressed ? height + 6 : height - height: parent.height - 4 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: handleDelegate - - Behavior on width { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on x { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - } - } - } - - HoverHandler { - cursorShape: control.hoverCursorShape - } - - Accessible.role: Accessible.CheckBox - Accessible.name: control.checked ? control.checkedText : control.uncheckedText - Accessible.description: control.contentDescription - Accessible.onToggleAction: control.toggle(); -} diff --git a/DelegateUI/Controls/DelTabView.qml b/DelegateUI/Controls/DelTabView.qml deleted file mode 100644 index ebae9c5..0000000 --- a/DelegateUI/Controls/DelTabView.qml +++ /dev/null @@ -1,710 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Layouts 1.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - clip: true - - enum TabPosition - { - Position_Top = 0, - Position_Bottom = 1, - Position_Left = 2, - Position_Right = 3 - } - - enum TabType - { - Type_Default = 0, - Type_Card = 1, - Type_CardEditable = 2 - } - - enum TabSize - { - Size_Auto = 0, - Size_Fixed = 1 - } - - property bool animationEnabled: DelTheme.animationEnabled - property var initModel: [] - property alias count: __tabModel.count - property alias currentIndex: __tabView.currentIndex - property int tabType: DelTabView.Type_Default - property int tabSize: DelTabView.Size_Auto - property int tabPosition: DelTabView.Position_Top - property bool tabCentered: false - property bool tabCardMovable: true - property int defaultTabWidth: 80 - property int defaultTabHeight: DelTheme.DelTabView.fontSize + 16 - property int defaultTabSpacing: 2 - property int defaultTabBgRadius: DelTheme.DelTabView.radiusTabBg - property int defaultHighlightWidth: __private.isHorizontal ? 30 : 20 - property var addTabCallback: - () => { - append({ title: `New Tab ${__tabView.count + 1}` }); - positionViewAtEnd(); - } - property Component addButtonDelegate: DelCaptionButton { - id: __addButton - iconSize: DelTheme.DelTabView.fontSize - iconSource: DelIcon.PlusOutlined - colorIcon: DelTheme.DelTabView.colorTabCloseHover - background: Rectangle { - radius: DelTheme.DelTabView.radiusButton - color: __addButton.colorBg - } - onClicked: addTabCallback(); - } - property Component tabDelegate: tabType == DelTabView.Type_Default ? __defaultTabDelegate : __cardTabDelegate - property Component contentDelegate: Item { } - property Component highlightDelegate: Item { - Loader { - id: __highlight - width: __private.isHorizontal ? defaultHighlightWidth : 2 - height: __private.isHorizontal ? 2 : defaultHighlightWidth - anchors { - bottom: control.tabPosition == DelTabView.Position_Top ? parent.bottom : undefined - right: control.tabPosition == DelTabView.Position_Left ? parent.right : undefined - } - state: __content.state - states: [ - State { - name: "top" - AnchorChanges { - target: __highlight - anchors.top: undefined - anchors.bottom: parent.bottom - anchors.left: undefined - anchors.right: undefined - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: undefined - } - }, - State { - name: "bottom" - AnchorChanges { - target: __highlight - anchors.top: parent.top - anchors.bottom: undefined - anchors.left: undefined - anchors.right: undefined - anchors.horizontalCenter: parent.horizontalCenter - anchors.verticalCenter: undefined - } - }, - State { - name: "left" - AnchorChanges { - target: __highlight - anchors.top: undefined - anchors.bottom: undefined - anchors.left: undefined - anchors.right: parent.right - anchors.horizontalCenter: undefined - anchors.verticalCenter: parent.verticalCenter - } - }, - State { - name: "right" - AnchorChanges { - target: __highlight - anchors.top: undefined - anchors.bottom: undefined - anchors.left: parent.left - anchors.right: undefined - anchors.horizontalCenter: undefined - anchors.verticalCenter: parent.verticalCenter - } - } - ] - active: control.tabType === DelTabView.Type_Default - sourceComponent: Rectangle { - color: DelTheme.isDark ? DelTheme.DelTabView.colorHightlightDark : DelTheme.DelTabView.colorHightlight - } - } - } - - onInitModelChanged: { - clear(); - for (const object of initModel) { - append(object); - } - } - - function flick(xVelocity: real, yVelocity: real) { - __tabView.flick(xVelocity, yVelocity); - } - - function positionViewAtBeginning() { - __tabView.positionViewAtBeginning(); - } - - function positionViewAtIndex(index, mode) { - __tabView.positionViewAtIndex(index, mode); - } - - function positionViewAtEnd() { - __tabView.positionViewAtEnd(); - } - - function get(index) { - return __tabModel.get(index); - } - - function set(index, object) { - //默认为true - if (object.editable === undefined) - object.editable = true; - __tabModel.set(index, object); - } - - function setProperty(index, propertyName, value) { - __tabModel.setProperty(index, propertyName, value); - } - - function move(from, to, count = 1) { - __tabModel.move(from, to, count); - } - - function insert(index, object) { - //默认为true - if (object.editable === undefined) - object.editable = true; - __tabModel.insert(index, object); - } - - function append(object) { - //默认为true - if (object.editable === undefined) - object.editable = true; - __tabModel.append(object); - } - - function remove(index, count = 1) { - __tabModel.remove(index, count); - } - - function clear() { - __tabModel.clear(); - } - - Component { - id: __defaultTabDelegate - - DelIconButton { - id: __tabItem - width: (!__private.isHorizontal && control.tabSize == DelTabView.Size_Auto) ? Math.max(__private.tabMaxWidth, tabWidth) : tabWidth - height: tabHeight - leftPadding: 5 - rightPadding: 5 - iconSize: tabIconSize - iconSource: tabIcon - text: tabTitle - effectEnabled: false - colorBg: "transparent" - colorBorder: "transparent" - colorText: { - if (isCurrent) { - return DelTheme.isDark ? DelTheme.DelTabView.colorHightlightDark : DelTheme.DelTabView.colorHightlight; - } else { - return down ? DelTheme.DelTabView.colorTabActive : - hovered ? DelTheme.DelTabView.colorTabHover : - DelTheme.DelTabView.colorTab; - } - } - font { - family: DelTheme.DelTabView.fontFamily - pixelSize: DelTheme.DelTabView.fontSize - } - contentItem: Item { - implicitWidth: control.tabSize == DelTabView.Size_Auto ? (__text.width + calcIconWidth) : __tabItem.tabFixedWidth - implicitHeight: Math.max(__icon.implicitHeight, __text.implicitHeight) - - property int calcIconWidth: iconSource == 0 ? 0 : (__icon.implicitWidth + __tabItem.tabIconSpacing) - - DelIconText { - id: __icon - width: iconSource == 0 ? 0 : implicitWidth - anchors.left: parent.left - anchors.verticalCenter: parent.verticalCenter - color: __tabItem.colorIcon - iconSize: __tabItem.iconSize - iconSource: __tabItem.iconSource - verticalAlignment: Text.AlignVCenter - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - Text { - id: __text - width: control.tabSize == DelTabView.Size_Auto ? implicitWidth : - Math.max(0, __tabItem.tabFixedWidth - 5 - parent.calcIconWidth) - anchors.left: __icon.right - anchors.leftMargin: __icon.iconSource == 0 ? 0 : __tabItem.tabIconSpacing - anchors.verticalCenter: parent.verticalCenter - text: __tabItem.text - font: __tabItem.font - color: __tabItem.colorText - elide: Text.ElideRight - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - } - onTabWidthChanged: { - if (index == 0) - __private.tabMaxWidth = 0; - __private.tabMaxWidth = Math.max(__private.tabMaxWidth, __tabItem.tabWidth); - } - onClicked: __tabView.currentIndex = index; - - required property int index - required property var model - property alias modelData: __tabItem.model - property bool isCurrent: __tabView.currentIndex === index - property string tabKey: modelData.key || "" - property int tabIcon: modelData.icon || 0 - property int tabIconSize: modelData.iconSize || DelTheme.DelTabView.fontSize - property int tabIconSpacing: modelData.iconSpacing || 5 - property string tabTitle: modelData.title || "" - property int tabFixedWidth: modelData.tabWidth || defaultTabWidth - property int tabWidth: control.tabSize == DelTabView.Size_Auto ? (implicitContentWidth + leftPadding + rightPadding) : - implicitContentWidth - property int tabHeight: modelData.tabHeight || defaultTabHeight - } - } - - Component { - id: __cardTabDelegate - - Item { - id: __tabContainer - width: __tabItem.width - height: __tabItem.height - - required property int index - required property var model - property alias modelData: __tabContainer.model - property alias tabItem: __tabItem - property bool isCurrent: __tabView.currentIndex === index - property string tabKey: modelData.key || "" - property int tabIcon: modelData.icon || 0 - property int tabIconSize: modelData.iconSize || DelTheme.DelTabView.fontSize - property int tabIconSpacing: modelData.iconSpacing || 5 - property string tabTitle: modelData.title || "" - property int tabFixedWidth: modelData.tabWidth || defaultTabWidth - property int tabWidth: __tabItem.calcWidth - property int tabHeight: modelData.tabHeight || defaultTabHeight - - property bool tabEditable: modelData.editable && control.tabType == DelTabView.Type_CardEditable - - onTabWidthChanged: { - if (__private.needResetTabMaxWidth) { - __private.needResetTabMaxWidth = false; - __private.tabMaxWidth = 0; - } - __private.tabMaxWidth = Math.max(__private.tabMaxWidth, __tabItem.calcWidth); - } - - DelRectangle { - id: __tabItem - width: (!__private.isHorizontal && control.tabSize == DelTabView.Size_Auto) ? Math.max(__private.tabMaxWidth, tabWidth) : tabWidth - height: tabHeight - z: __dragHandler.drag.active ? 1 : 0 - color: { - if (DelTheme.isDark) - return isCurrent ? DelTheme.DelTabView.colorTabCardBgCheckedDark : DelTheme.DelTabView.colorTabCardBgDark; - else - return isCurrent ? DelTheme.DelTabView.colorTabCardBgChecked : DelTheme.DelTabView.colorTabCardBg; - } - border.color: DelTheme.DelTabView.colorTabCardBorder - topLeftRadius: control.tabPosition == DelTabView.Position_Top || control.tabPosition == DelTabView.Position_Left ? defaultTabBgRadius : 0 - topRightRadius: control.tabPosition == DelTabView.Position_Top || control.tabPosition == DelTabView.Position_Right ? defaultTabBgRadius : 0 - bottomLeftRadius: control.tabPosition == DelTabView.Position_Bottom || control.tabPosition == DelTabView.Position_Left ? defaultTabBgRadius : 0 - bottomRightRadius: control.tabPosition == DelTabView.Position_Bottom || control.tabPosition == DelTabView.Position_Right ? defaultTabBgRadius : 0 - - property int calcIconWidth: __icon.iconSource == 0 ? 0 : (__icon.implicitWidth + __tabContainer.tabIconSpacing) - property int calcCloseWidth: __close.visible ? (__close.implicitWidth + 5) : 0 - property real calcWidth: control.tabSize == DelTabView.Size_Auto ? (__text.width + calcIconWidth + calcCloseWidth + 10) - : __tabContainer.tabFixedWidth - property real calcHeight: Math.max(__icon.implicitHeight, __text.implicitHeight, __close.height) - property color colorText: { - if (isCurrent) { - return DelTheme.isDark ? DelTheme.DelTabView.colorHightlightDark : DelTheme.DelTabView.colorHightlight; - } else { - return down ? DelTheme.DelTabView.colorTabActive : - hovered ? DelTheme.DelTabView.colorTabHover : - DelTheme.DelTabView.colorTab; - } - } - property bool down: false - property bool hovered: false - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - MouseArea { - id: __dragHandler - anchors.fill: parent - hoverEnabled: true - drag.target: control.tabCardMovable ? __tabItem : null - drag.axis: __private.isHorizontal ? Drag.XAxis : Drag.YAxis - onEntered: __tabItem.hovered = true; - onExited: __tabItem.hovered = false; - onClicked: __tabView.currentIndex = index; - onPressed: - (mouse) => { - __tabView.currentIndex = index; - __tabItem.down = true; - - if (control.tabCardMovable) { - const pos = __tabView.mapFromItem(__tabContainer, 0, 0); - __tabItem.parent = __tabView; - __tabItem.x = pos.x; - __tabItem.y = pos.y; - } - } - onPositionChanged: move(); - onReleased: { - __keepMovingTimer.stop(); - __tabItem.down = false; - __tabItem.parent = __tabContainer; - __tabItem.x = __tabItem.y = 0; - __tabView.forceLayout(); - } - - function move() { - if (pressed && control.tabCardMovable) { - if (!__keepMovingTimer.running) - __keepMovingTimer.restart(); - const pos = __tabView.mapFromItem(__tabItem, width * 0.5, height * 0.5); - const item = __tabView.itemAt(pos.x + __tabView.contentX + 1, pos.y + __tabView.contentY + 1); - if (item) { - if (item.index !== __tabContainer.index) { - __tabModel.move(item.index, __tabContainer.index, 1); - } - } - } - } - - Timer { - id: __keepMovingTimer - repeat: true - interval: 100 - onTriggered: __dragHandler.move(); - } - } - - DelIconText { - id: __icon - anchors.left: parent.left - anchors.leftMargin: 5 - anchors.verticalCenter: parent.verticalCenter - color: __tabItem.colorText - iconSize: tabIconSize - iconSource: tabIcon - verticalAlignment: Text.AlignVCenter - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - Text { - id: __text - width: control.tabSize == DelTabView.Size_Auto ? implicitWidth : - Math.max(0, __tabContainer.tabFixedWidth - 5 - __tabItem.calcIconWidth - __tabItem.calcCloseWidth) - anchors.left: __icon.right - anchors.leftMargin: __icon.iconSource == 0 ? 0 : __tabContainer.tabIconSpacing - anchors.verticalCenter: parent.verticalCenter - text: tabTitle - font { - family: DelTheme.DelTabView.fontFamily - pixelSize: DelTheme.DelTabView.fontSize - } - color: __tabItem.colorText - elide: Text.ElideRight - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - DelCaptionButton { - id: __close - visible: __tabContainer.tabEditable - enabled: visible - implicitWidth: visible ? (implicitContentWidth + leftPadding + rightPadding) : 0 - topPadding: 0 - bottomPadding: 0 - leftPadding: 2 - rightPadding: 2 - anchors.right: parent.right - anchors.rightMargin: 5 - anchors.verticalCenter: parent.verticalCenter - iconSize: tabIconSize - iconSource: DelIcon.CloseOutlined - colorIcon: hovered ? DelTheme.DelTabView.colorTabCloseHover : DelTheme.DelTabView.colorTabClose - onClicked: { - control.remove(index); - } - - HoverHandler { - cursorShape: Qt.PointingHandCursor - } - } - } - } - } - - Connections { - target: control - function onTabTypeChanged() { - __private.needResetTabMaxWidth = true; - } - function onTabSizeChanged() { - __private.needResetTabMaxWidth = true; - } - } - - QtObject { - id: __private - property bool isHorizontal: control.tabPosition == DelTabView.Position_Top || control.tabPosition == DelTabView.Position_Bottom - property int tabMaxWidth: 0 - property bool needResetTabMaxWidth: false - } - - MouseArea { - anchors.fill: __tabView - onWheel: - (wheel) => { - if (__private.isHorizontal) - __tabView.flick(wheel.angleDelta.y * 6.5, 0); - else - __tabView.flick(0, wheel.angleDelta.y * 6.5); - } - } - - ListView { - id: __tabView - width: { - if (__private.isHorizontal) { - const maxWidth = control.width - (__addButtonLoader.width + 5) * (control.tabCentered ? 2 : 1); - return (control.tabCentered ? Math.min(contentWidth, maxWidth) : maxWidth); - } else { - return __private.tabMaxWidth; - } - } - height: { - if (__private.isHorizontal) { - return defaultTabHeight; - } else { - const maxHeight = control.height - (__addButtonLoader.height + 5) * (control.tabCentered ? 2 : 1); - return (control.tabCentered ? Math.min(contentHeight, maxHeight) : maxHeight) - } - } - clip: true - onContentWidthChanged: if (__private.isHorizontal) cacheBuffer = contentWidth; - onContentHeightChanged: if (!__private.isHorizontal) cacheBuffer = contentHeight; - spacing: defaultTabSpacing - move: Transition { - NumberAnimation { properties: "x,y"; duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } - } - model: ListModel { id: __tabModel } - delegate: tabDelegate - highlight: highlightDelegate - highlightMoveDuration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - orientation: __private.isHorizontal ? Qt.Horizontal : Qt.Vertical - boundsBehavior: Flickable.StopAtBounds - state: control.tabCentered ? (__content.state + "Center") : __content.state - states: [ - State { - name: "top" - AnchorChanges { - target: __tabView - anchors.top: control.top - anchors.bottom: undefined - anchors.left: control.left - anchors.right: undefined - anchors.horizontalCenter: undefined - anchors.verticalCenter: undefined - } - }, - State { - name: "topCenter" - AnchorChanges { - target: __tabView - anchors.top: control.top - anchors.bottom: undefined - anchors.left: undefined - anchors.right: undefined - anchors.horizontalCenter: control.horizontalCenter - anchors.verticalCenter: undefined - } - }, - State { - name: "bottom" - AnchorChanges { - target: __tabView - anchors.top: undefined - anchors.bottom: control.bottom - anchors.left: control.left - anchors.right: undefined - anchors.horizontalCenter: undefined - anchors.verticalCenter: undefined - } - }, - State { - name: "bottomCenter" - AnchorChanges { - target: __tabView - anchors.top: undefined - anchors.bottom: control.bottom - anchors.left: undefined - anchors.right: undefined - anchors.horizontalCenter: control.horizontalCenter - anchors.verticalCenter: undefined - } - }, - State { - name: "left" - AnchorChanges { - target: __tabView - anchors.top: control.top - anchors.bottom: undefined - anchors.left: control.left - anchors.right: undefined - anchors.horizontalCenter: undefined - anchors.verticalCenter: undefined - } - }, - State { - name: "leftCenter" - AnchorChanges { - target: __tabView - anchors.top: undefined - anchors.bottom: undefined - anchors.left: control.left - anchors.right: undefined - anchors.horizontalCenter: undefined - anchors.verticalCenter: control.verticalCenter - } - }, - State { - name: "right" - AnchorChanges { - target: __tabView - anchors.top: control.top - anchors.bottom: undefined - anchors.left: undefined - anchors.right: control.right - anchors.horizontalCenter: undefined - anchors.verticalCenter: undefined - } - }, - State { - name: "rightCenter" - AnchorChanges { - target: __tabView - anchors.top: undefined - anchors.bottom: undefined - anchors.left: undefined - anchors.right: control.right - anchors.horizontalCenter: undefined - anchors.verticalCenter: control.verticalCenter - } - } - ] - } - - Loader { - id: __addButtonLoader - x: { - switch (tabPosition) { - case DelTabView.Position_Top: - case DelTabView.Position_Bottom: - return Math.min(__tabView.x + __tabView.contentWidth + 5, control.width - width); - case DelTabView.Position_Left: - return Math.max(0, __tabView.width - width); - case DelTabView.Position_Right: - return Math.max(0, __tabView.x); - } - } - y: { - switch (tabPosition) { - case DelTabView.Position_Top: - return Math.max(0, __tabView.y + __tabView.height - height); - case DelTabView.Position_Bottom: - return __tabView.y; - case DelTabView.Position_Left: - case DelTabView.Position_Right: - return Math.min(__tabView.y + __tabView.contentHeight + 5, control.height - height); - } - } - z: 10 - sourceComponent: addButtonDelegate - } - - Item { - id: __content - state: { - switch (tabPosition) { - case DelTabView.Position_Top: return "top"; - case DelTabView.Position_Bottom: return "bottom"; - case DelTabView.Position_Left: return "left"; - case DelTabView.Position_Right: return "right"; - } - } - states: [ - State { - name: "top" - AnchorChanges { - target: __content - anchors.top: __tabView.bottom - anchors.bottom: control.bottom - anchors.left: control.left - anchors.right: control.right - } - }, - State { - name: "bottom" - AnchorChanges { - target: __content - anchors.top: control.top - anchors.bottom: __tabView.top - anchors.left: control.left - anchors.right: control.right - } - }, - State { - name: "left" - AnchorChanges { - target: __content - anchors.top: control.top - anchors.bottom: control.bottom - anchors.left: __tabView.right - anchors.right: control.right - } - }, - State { - name: "right" - AnchorChanges { - target: __content - anchors.top: control.top - anchors.bottom: control.bottom - anchors.left: control.left - anchors.right: __tabView.left - } - } - ] - - Repeater { - model: __tabModel - delegate: Loader { - id: __contentLoader - anchors.fill: parent - sourceComponent: contentDelegate - visible: __tabView.currentIndex === index - required property int index - required property var model - } - } - } -} diff --git a/DelegateUI/Controls/DelTableView.qml b/DelegateUI/Controls/DelTableView.qml deleted file mode 100644 index 4c45f7f..0000000 --- a/DelegateUI/Controls/DelTableView.qml +++ /dev/null @@ -1,986 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import Qt.labs.qmlmodels 1.0 -import DelegateUI 1.0 - -DelRectangle { - id: control - - clip: true - color: DelTheme.Primary.colorBgBase - topLeftRadius : 6 - topRightRadius: 6 - - columnHeaderTitleFont { - family: DelTheme.DelTableView.fontFamily - pixelSize: DelTheme.DelTableView.fontSize - } - rowHeaderTitleFont { - family: DelTheme.DelTableView.fontFamily - pixelSize: DelTheme.DelTableView.fontSize - } - - property bool animationEnabled: DelTheme.animationEnabled - property bool alternatingRow: false - property int defaultColumnHeaderWidth: 100 - property int defaultColumnHeaderHeight: 40 - property int defaultRowHeaderWidth: 40 - property int defaultRowHeaderHeight: 40 - property bool columnGridVisible: false - property bool rowGridVisible: false - property real minimumRowHeight: 40 - property real maximumRowHeight: Number.NaN - property var initModel: [] - property var columns: [] - property var checkedKeys: [] - - property color colorGridLine: DelTheme.DelTableView.colorGridLine - - property bool columnHeaderVisible: true - property font columnHeaderTitleFont - property color colorColumnHeaderTitle: DelTheme.DelTableView.colorColumnTitle - property color colorColumnHeaderBg: DelTheme.DelTableView.colorColumnHeaderBg - - property bool rowHeaderVisible: true - property font rowHeaderTitleFont - property color colorRowHeaderTitle: DelTheme.DelTableView.colorRowTitle - property color colorRowHeaderBg: DelTheme.DelTableView.colorRowHeaderBg - - property color colorResizeBlockBg: DelTheme.DelTableView.colorResizeBlockBg - - property Component columnHeaderDelegate: Item { - id: __columnHeaderDelegate - property string align: headerData.align ?? 'center' - property string selectionType: headerData.selectionType ?? '' - property var sorter: headerData.sorter - property var sortDirections: headerData.sortDirections ?? [] - property var onFilter: headerData.onFilter - - Text { - anchors { - left: __checkBoxLoader.active ? __checkBoxLoader.right : parent.left - leftMargin: __checkBoxLoader.active ? 0 : 10 - right: parent.right - rightMargin: 10 - top: parent.top - topMargin: 4 - bottom: parent.bottom - bottomMargin: 4 - } - font: control.columnHeaderTitleFont - text: headerData.title - color: control.colorColumnHeaderTitle - verticalAlignment: Text.AlignVCenter - horizontalAlignment: { - if (__columnHeaderDelegate.align == 'left') - return Text.AlignLeft; - else if (__columnHeaderDelegate.align == 'right') - return Text.AlignRight; - else - return Text.AlignHCenter; - } - } - - MouseArea { - enabled: __sorterLoader.active - hoverEnabled: true - height: parent.height - anchors.left: __checkBoxLoader.right - anchors.right: __sorterLoader.right - onEntered: cursorShape = Qt.PointingHandCursor; - onExited: cursorShape = Qt.ArrowCursor; - onClicked: { - control.sort(column); - __sorterLoader.updateIcon(); - } - } - - Loader { - id: __checkBoxLoader - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.verticalCenter: parent.verticalCenter - active: __columnHeaderDelegate.selectionType == 'checkbox' - sourceComponent: DelCheckBox { - id: __parentBox - - Component.onCompleted: { - __parentBox.checkState = __private.parentCheckState; - } - - onToggled: { - if (checkState == Qt.Unchecked) { - __private.model.forEach( - object => { - __private.checkedKeysMap.delete(object.key); - }); - __private.checkedKeysMapChanged(); - } else { - __private.model.forEach( - object => { - __private.checkedKeysMap.set(object.key, true); - }); - __private.checkedKeysMapChanged(); - } - } - - Connections { - target: __private - function onParentCheckStateChanged() { - __parentBox.checkState = __private.parentCheckState; - } - } - } - } - - Loader { - id: __sorterLoader - anchors.right: __filterLoader.active ? __filterLoader.left : parent.right - anchors.rightMargin: 8 - anchors.verticalCenter: parent.verticalCenter - active: sorter !== undefined - sourceComponent: columnHeaderSorterIconDelegate - onLoaded: { - if (sortDirections.length === 0) return; - - let ref = control.columns[column]; - if (!ref.hasOwnProperty('activeSorter')) { - ref.activeSorter = false; - } - if (!ref.hasOwnProperty('sortIndex')) { - ref.sortIndex = -1; - } - if (!ref.hasOwnProperty('sortMode')) { - ref.sortMode = 'false'; - } - updateIcon(); - } - property int column: model.column - property alias sorter: __columnHeaderDelegate.sorter - property alias sortDirections: __columnHeaderDelegate.sortDirections - property string sortMode: 'false' - - function updateIcon() { - if (sortDirections.length === 0) return; - - let ref = control.columns[column]; - if (ref.activeSorter) { - sortMode = ref.sortMode; - } else { - sortMode = 'false'; - } - } - } - - Loader { - id: __filterLoader - anchors.right: parent.right - anchors.rightMargin: 8 - anchors.verticalCenter: parent.verticalCenter - active: onFilter !== undefined - sourceComponent: columnHeaderFilterIconDelegate - property int column: model.column - property alias onFilter: __columnHeaderDelegate.onFilter - } - } - property Component rowHeaderDelegate: Item { - Text { - anchors { - left: parent.left - leftMargin: 8 - right: parent.right - rightMargin: 8 - top: parent.top - topMargin: 4 - bottom: parent.bottom - bottomMargin: 4 - } - font: control.rowHeaderTitleFont - text: (row + 1) - color: control.colorRowHeaderTitle - verticalAlignment: Text.AlignVCenter - horizontalAlignment: Text.AlignHCenter - } - } - property Component columnHeaderSorterIconDelegate: Item { - id: __sorterIconDelegate - width: __sorterIconColumn.width - height: __sorterIconColumn.height + 12 - - Column { - id: __sorterIconColumn - anchors.verticalCenter: parent.verticalCenter - spacing: -2 - - DelIconText { - visible: sortDirections.indexOf('ascend') !== -1 - colorIcon: sortMode === 'ascend' ? DelTheme.DelTableView.colorIconHover : - DelTheme.DelTableView.colorIcon - iconSource: DelIcon.CaretUpOutlined - iconSize: DelTheme.DelTableView.fontSize - 2 - } - - DelIconText { - visible: sortDirections.indexOf('descend') !== -1 - colorIcon: sortMode === 'descend' ? DelTheme.DelTableView.colorIconHover : - DelTheme.DelTableView.colorIcon - iconSource: DelIcon.CaretDownOutlined - iconSize: DelTheme.DelTableView.fontSize - 2 - } - } - } - property Component columnHeaderFilterIconDelegate: Item { - width: __headerFilterIcon.width - height: __headerFilterIcon.height + 12 - - HoverIcon { - id: __headerFilterIcon - anchors.centerIn: parent - iconSource: DelIcon.SearchOutlined - colorIcon: hovered ? DelTheme.DelTableView.colorIconHover : DelTheme.DelTableView.colorIcon - onClicked: { - __filterPopup.open(); - } - } - - DelPopup { - id: __filterPopup - x: -width * 0.5 - y: parent.height - padding: 5 - animationEnabled: false - contentItem: Column { - spacing: 5 - - DelInput { - id: __searchInput - width: parent.width - anchors.horizontalCenter: parent.horizontalCenter - placeholderText: qsTr('Search ') + control.columns[column].dataIndex - onEditingFinished: __searchButton.clicked(); - Component.onCompleted: { - let ref = control.columns[column]; - if (ref.hasOwnProperty('filterInput')) { - text = ref.filterInput; - } else { - ref.filterInput = ''; - } - } - } - - Row { - anchors.horizontalCenter: parent.horizontalCenter - spacing: 5 - - DelIconButton { - id: __searchButton - text: qsTr('Search') - iconSource: DelIcon.SearchOutlined - type: DelButton.Type_Primary - onClicked: { - __filterPopup.close(); - control.columns[column].filterInput = __searchInput.text; - control.filter(); - } - } - - DelButton { - text: qsTr('Reset') - onClicked: { - __filterPopup.close(); - control.columns[column].filterInput = ''; - control.filter(); - } - } - - DelButton { - text: qsTr('Close') - type: DelButton.Type_Link - onClicked: { - __filterPopup.close(); - } - } - } - } - } - } - - onColumnsChanged: { - let headerColumns = []; - let headerRow = {}; - for (const object of columns) { - let column = Qt.createQmlObject('import Qt.labs.qmlmodels 1.0; TableModelColumn {}', __columnHeaderModel); - column.display = object.dataIndex; - headerColumns.push(column); - headerRow[object.dataIndex] = object; - } - - __columnHeaderModel.clear(); - if (columnHeaderVisible) { - __columnHeaderModel.columns = headerColumns; - __columnHeaderModel.rows = [headerRow]; - } - - let cellColumns = []; - for (let i = 0; i < columns.length; i++) { - let column = Qt.createQmlObject('import Qt.labs.qmlmodels 1.0; TableModelColumn {}', __cellModel); - column.display = `__data${i}`; - cellColumns.push(column); - } - __cellModel.columns = cellColumns; - } - - onInitModelChanged: { - clearSort(); - filter(); - } - - function checkForRows(rows) { - rows.forEach( - row => { - if (row >= 0 && row < __private.model.length) { - const key = __private.model[row].key; - __private.checkedKeysMap.set(key, true); - } - }); - __private.checkedKeysMapChanged(); - } - - function checkForKeys(keys) { - keys.forEach(key => __private.checkedKeysMap.set(object.key, true)); - __private.checkedKeysMapChanged(); - } - - function getCheckedKeys() { - return [...__private.checkedKeysMap.keys()]; - } - - function clearAllCheckedKeys() { - __private.checkedKeysMap.clear(); - __private.checkedKeysMapChanged(); - __private.parentCheckState = Qt.Unchecked; - __private.parentCheckStateChanged(); - } - - function sort(column) { - /*! 仅需设置排序相关属性, 真正的排序在 filter() 中完成 */ - if (columns[column].hasOwnProperty('sorter')) { - columns.forEach( - (object, index) => { - if (object.hasOwnProperty('sorter')) { - if (column === index) { - object.activeSorter = true; - object.sortIndex = (object.sortIndex + 1) % object.sortDirections.length; - object.sortMode = object.sortDirections[object.sortIndex]; - } else { - object.activeSorter = false; - object.sortIndex = -1; - object.sortMode = 'false'; - } - } - }); - } - - filter(); - } - - function clearSort() { - columns.forEach( - object => { - if (object.sortDirections && object.sortDirections.length !== 0) { - object.activeSorter = false; - object.sortIndex = -1; - object.sortMode = 'false'; - } - }); - __private.model = [...initModel]; - } - - function filter() { - let changed = false; - let model = [...initModel]; - columns.forEach( - object => { - if (object.hasOwnProperty('onFilter') && object.hasOwnProperty('filterInput')) { - model = model.filter((record, index) => object.onFilter(object.filterInput, record)); - changed = true; - } - }); - if (changed) - __private.model = model; - - /*! 根据 activeSorter 列排序 */ - columns.forEach( - object => { - if (object.activeSorter === true) { - if (object.sortMode === 'ascend') { - /*! sorter 作为上升处理 */ - __private.model.sort(object.sorter); - __private.modelChanged(); - } else if (object.sortMode === 'descend') { - /*! 返回 ascend 相反结果即可 */ - __private.model.sort((a, b) => object.sorter(b, a)); - __private.modelChanged(); - } else { - /*! 还原 */ - __private.model = model; - } - } - }); - } - - function clearFilter() { - columns.forEach( - object => { - if (object.hasOwnProperty('onFilter') || object.hasOwnProperty('filterInput')) - object.filterInput = ''; - }); - __private.model = [...initModel]; - } - - function clear() { - __private.model = initModel = []; - __cellModel.clear(); - columns.forEach( - object => { - if (object.sortDirections && object.sortDirections.length !== 0) { - object.activeSorter = false; - object.sortIndex = -1; - object.sortMode = 'false'; - } - if (object.hasOwnProperty('onFilter') || object.hasOwnProperty('filterInput')) { - object.filterInput = ''; - } - }); - } - - function appendRow(object) { - __private.model.push(object); - __cellModel.appendRow(__private.toCellObject(object)); - } - - function getRow(rowIndex) { - if (rowIndex >= 0 && rowIndex < __private.model.length) { - return __private.model[rowIndex]; - } - return undefined; - } - - function insertRow(rowIndex, object) { - __private.model.splice(rowIndex, 0, object); - __cellModel.insertRow(rowIndex, __private.toCellObject(object)); - } - - function moveRow(fromRowIndex, toRowIndex, count = 1) { - if (fromRowIndex >= 0 && fromRowIndex < __private.model.length && - toRowIndex >= 0 && toRowIndex < __private.model.length) { - const objects = __private.model.splice(from, count); - __private.model.splice(to, 0, ...objects); - __cellModel.moveRow(fromRowIndex, toRowIndex, count); - } - } - - function removeRow(rowIndex, count = 1) { - if (rowIndex >= 0 && rowIndex < __private.model.length) { - __private.model.splice(rowIndex, count); - __cellModel.removeRow(rowIndex, count); - } - } - - function setRow(rowIndex, object) { - if (rowIndex >= 0 && rowIndex < __private.model.length) { - __private.model[rowIndex] = object; - __cellModel.setRow(rowIndex, __private.toCellObject(object)); - } - } - - component HoverIcon: DelIconText { - signal clicked() - property alias hovered: __hoverHandler.hovered - - HoverHandler { - id: __hoverHandler - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - onTapped: parent.clicked(); - } - } - - component ResizeArea: MouseArea { - property bool isHorizontal: true - property var target: __columnHeaderItem - property point startPos: Qt.point(0, 0) - property real minimumWidth: 0 - property real maximumWidth: Number.NaN - property real minimumHeight: 0 - property real maximumHeight: Number.NaN - property var resizeCallback: (result) => { } - - preventStealing: true - hoverEnabled: true - onEntered: cursorShape = isHorizontal ? Qt.SplitHCursor : Qt.SplitVCursor; - onPressed: - (mouse) => { - if (target) { - startPos = Qt.point(mouseX, mouseY); - } - } - onPositionChanged: - (mouse) => { - if (pressed && target) { - if (isHorizontal) { - var resultWidth = 0; - var offsetX = mouse.x - startPos.x; - if (maximumWidth != Number.NaN && (target.width + offsetX) > maximumWidth) { - resultWidth = maximumWidth; - } else if ((target.width + offsetX) < minimumWidth) { - resultWidth = minimumWidth; - } else { - resultWidth = target.width + offsetX; - } - resizeCallback(resultWidth); - } else { - var resultHeight = 0; - var offsetY = mouse.y - startPos.y; - if (maximumHeight != Number.NaN && (target.height + offsetY) > maximumHeight) { - resultHeight = maximumHeight; - } else if ((target.height + offsetY) < minimumHeight) { - resultHeight = minimumHeight; - } else { - resultHeight = target.height + offsetY; - } - resizeCallback(resultHeight); - } - mouse.accepted = true; - } - } - } - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationMid } } - - QtObject { - id: __private - property var model: [] - property int parentCheckState: Qt.Unchecked - property var checkedKeysMap: new Map - - function updateParentCheckBox() { - let checkCount = 0; - model.forEach( - object => { - if (checkedKeysMap.has(object.key)) { - checkCount++; - } - }); - parentCheckState = checkCount == 0 ? Qt.Unchecked : checkCount == model.length ? Qt.Checked : Qt.PartiallyChecked; - parentCheckStateChanged(); - } - - function updateCheckedKeys() { - control.checkedKeys = [...checkedKeysMap.keys()]; - } - - function toCellObject(object) { - let dataObject = new Object; - for (let i = 0; i < control.columns.length; i++) { - const dataIndex = control.columns[i].dataIndex ?? ''; - if (object.hasOwnProperty(dataIndex)) { - dataObject[`__data${i}`] = object[dataIndex]; - } else { - dataObject[`__data${i}`] = null; - } - } - return dataObject; - } - - onModelChanged: { - __cellView.contentY = 0; - __cellModel.clear(); - - let cellRows = []; - model.forEach( - (object, index) => { - let data = { }; - for (let i = 0; i < columns.length; i++) { - const dataIndex = columns[i].dataIndex ?? ''; - if (object.hasOwnProperty(dataIndex)) { - data[`__data${i}`] = object[dataIndex]; - } else { - data[`__data${i}`] = null; - } - } - cellRows.push(data); - }); - __cellModel.rows = cellRows; - - __cellView.rowHeights = Array.from({ length: model.length }, () => control.defaultRowHeaderHeight); - __rowHeaderModel.rows = model; - - updateParentCheckBox(); - } - onParentCheckStateChanged: updateCheckedKeys(); - onCheckedKeysMapChanged: updateCheckedKeys(); - } - - DelRectangle { - id: __columnHeaderViewBg - height: control.defaultColumnHeaderHeight - anchors.left: control.rowHeaderVisible ? __rowHeaderViewBg.right : parent.left - anchors.right: parent.right - topLeftRadius: control.rowHeaderVisible ? 0 : 6 - topRightRadius: 6 - color: control.colorColumnHeaderBg - visible: control.columnHeaderVisible - - TableView { - id: __columnHeaderView - anchors.fill: parent - syncDirection: Qt.Horizontal - syncView: __cellModel.rowCount == 0 ? null : __cellView - columnWidthProvider: __cellView.columnWidthProvider - boundsBehavior: Flickable.StopAtBounds - clip: true - model: TableModel { - id: __columnHeaderModel - } - delegate: Item { - id: __columnHeaderItem - implicitHeight: control.defaultColumnHeaderHeight - clip: true - - required property var model - required property var display - property int row: model.row - property int column: model.column - property string selectionType: display.selectionType ?? '' - property bool editable: display.editable ?? false - property real minimumWidth: display.minimumWidth ?? 40 - property real maximumWidth: display.maximumWidth ?? Number.NaN - - TableView.onReused: { - if (selectionType == 'checkbox') - __private.updateParentCheckBox(); - } - - Loader { - anchors.fill: parent - sourceComponent: control.columnHeaderDelegate - property alias model: __columnHeaderItem.model - property var headerData: control.columns[column] - property alias column: __columnHeaderItem.column - } - - Rectangle { - z: 2 - width: 1 - color: control.colorGridLine - height: parent.height * 0.5 - anchors.right: parent.right - anchors.verticalCenter: parent.verticalCenter - } - - ResizeArea { - width: 8 - height: parent.height - minimumWidth: __columnHeaderItem.minimumWidth - maximumWidth: __columnHeaderItem.maximumWidth - anchors.right: parent.right - anchors.rightMargin: -width * 0.5 - target: __columnHeaderItem - isHorizontal: true - resizeCallback: result => __cellView.setColumnWidth(__columnHeaderItem.column, result); - } - } - } - - Rectangle { - width: parent.width - height: 1 - anchors.bottom: parent.bottom - color: control.colorGridLine - } - } - - Rectangle { - id: __rowHeaderViewBg - width: control.defaultRowHeaderWidth - anchors.top: control.columnHeaderVisible ? __columnHeaderViewBg.bottom : __cellMouseArea.top - anchors.bottom: __cellMouseArea.bottom - color: control.colorRowHeaderBg - visible: control.rowHeaderVisible - - TableView { - id: __rowHeaderView - anchors.fill: parent - syncDirection: Qt.Vertical - syncView: __cellView - boundsBehavior: Flickable.StopAtBounds - clip: true - model: TableModel { - id: __rowHeaderModel - TableModelColumn { } - } - delegate: Item { - id: __rowHeaderItem - implicitWidth: control.defaultRowHeaderWidth - clip: true - - required property var model - property int row: model.row - - Loader { - anchors.fill: parent - sourceComponent: control.rowHeaderDelegate - property alias model: __rowHeaderItem.model - property alias row: __rowHeaderItem.row - } - - Rectangle { - z: 2 - width: parent.width * 0.5 - color: control.colorGridLine - height: 1 - anchors.bottom: parent.bottom - anchors.horizontalCenter: parent.horizontalCenter - } - - ResizeArea { - width: parent.width - height: 8 - minimumHeight: control.minimumRowHeight - maximumHeight: control.maximumRowHeight - anchors.bottom: parent.bottom - anchors.bottomMargin: -height * 0.5 - target: __rowHeaderItem - isHorizontal: false - resizeCallback: result => __cellView.setRowHeight(__rowHeaderItem.row, result); - } - } - } - - Rectangle { - width: 1 - height: parent.height - anchors.right: parent.right - color: control.colorGridLine - } - } - - MouseArea { - id: __cellMouseArea - anchors.top: control.columnHeaderVisible ? __columnHeaderViewBg.bottom : parent.top - anchors.bottom: parent.bottom - anchors.left: __columnHeaderViewBg.left - anchors.right: __columnHeaderViewBg.right - hoverEnabled: true - onExited: __cellView.currentHoverRow = -1; - onWheel: wheel => wheel.accepted = true; - - TableView { - id: __cellView - - property int currentHoverRow: -1 - property var rowHeights: [] - - function setRowHeight(row, rowHeight) { - rowHeights[row] = rowHeight; - forceLayout(); - } - - function setColumnWidth(column, columnWidth) { - control.columns[column].width = columnWidth; - __columnHeaderView.forceLayout() - forceLayout(); - } - - rowHeightProvider: row => rowHeights[row]; - columnWidthProvider: - column => { - let object = control.columns[column]; - if (object.hasOwnProperty('width')) - return object.width; - else - return control.defaultColumnHeaderWidth; - } - anchors.fill: parent - boundsBehavior: Flickable.StopAtBounds - T.ScrollBar.horizontal: __hScrollBar - T.ScrollBar.vertical: __vScrollBar - clip: true - reuseItems: false /*! 重用有未知BUG */ - model: TableModel { - id: __cellModel - } - delegate: Rectangle { - id: __rootItem - implicitHeight: control.defaultRowHeaderWidth - clip: true - color: { - if (__private.checkedKeysMap.has(key)) { - if (row == __cellView.currentHoverRow) - return DelTheme.isDark ? DelTheme.DelTableView.colorCellBgDarkHoverChecked : - DelTheme.DelTableView.colorCellBgHoverChecked; - else - return DelTheme.isDark ? DelTheme.DelTableView.colorCellBgDarkChecked : - DelTheme.DelTableView.colorCellBgChecked; - } else { - return row == __cellView.currentHoverRow ? DelTheme.DelTableView.colorCellBgHover : - control.alternatingRow && __rootItem.row % 2 !== 0 ? - DelTheme.DelTableView.colorCellBgHover : DelTheme.DelTableView.colorCellBg; - } - } - - TableView.onReused: { - checked = __private.checkedKeysMap.has(key); - if (__childCheckBoxLoader.item) { - __childCheckBoxLoader.item.checked = checked; - } - } - - required property var model - required property var index - required property var display - - property int row: model.row - property int column: model.column - property string key: __private.model[row] ? (__private.model[row].key ?? '') : '' - property string selectionType: control.columns[column].selectionType ?? '' - property string dataIndex: control.columns[column].dataIndex ?? '' - property string filterInput: control.columns[column].filterInput ?? '' - property alias cellData: __rootItem.display - property bool checked: false - - Loader { - active: control.rowGridVisible - width: parent.width - height: 1 - anchors.bottom: parent.bottom - sourceComponent: Rectangle { color: control.colorGridLine } - } - - Loader { - active: control.columnGridVisible - width: 1 - height: parent.height - anchors.right: parent.right - sourceComponent: Rectangle { color: control.colorGridLine } - } - - MouseArea { - anchors.fill: parent - hoverEnabled: true - onEntered: __cellView.currentHoverRow = __rootItem.row; - - Loader { - id: __childCheckBoxLoader - active: selectionType == 'checkbox' - anchors.left: parent.left - anchors.leftMargin: 10 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: DelCheckBox { - id: __childBox - - Component.onCompleted: { - __childBox.checked = __rootItem.checked = __private.checkedKeysMap.has(key); - } - - onToggled: { - if (checkState == Qt.Checked) { - __private.checkedKeysMap.set(__rootItem.key, true); - __rootItem.checked = true; - } else { - __private.checkedKeysMap.delete(__rootItem.key); - __rootItem.checked = false; - } - __private.updateParentCheckBox(); - __cellView.currentHoverRowChanged(); - } - - Connections { - target: __private - function onCheckedKeysMapChanged() { - __childBox.checked = __rootItem.checked = __private.checkedKeysMap.has(__rootItem.key); - } - } - } - property alias key: __rootItem.key - } - - Loader { - anchors.left: __childCheckBoxLoader.active ? __childCheckBoxLoader.right : parent.left - anchors.right: parent.right - anchors.top: parent.top - anchors.bottom: parent.bottom - sourceComponent: { - if (control.columns[__rootItem.column].delegate) { - return control.columns[__rootItem.column].delegate; - } else { - return null; - } - } - property alias row: __rootItem.row - property alias column: __rootItem.column - property alias cellData: __rootItem.cellData - property alias cellIndex: __rootItem.index - property alias dataIndex: __rootItem.dataIndex - property alias filterInput: __rootItem.filterInput - } - } - } - - Behavior on contentY { NumberAnimation {}} - } - } - - Loader { - id: __resizeRectLoader - z: 10 - width: __rowHeaderViewBg.width - height: __columnHeaderViewBg.height - active: control.rowHeaderVisible && control.columnHeaderVisible - sourceComponent: DelRectangle { - color: control.colorResizeBlockBg - topLeftRadius: 6 - - ResizeArea { - width: parent.width - height: 8 - minimumHeight: control.defaultColumnHeaderHeight - anchors.bottom: parent.bottom - anchors.bottomMargin: -height * 0.5 - target: __columnHeaderViewBg - isHorizontal: false - resizeCallback: result => __columnHeaderViewBg.height = result; - } - - ResizeArea { - width: 8 - height: parent.height - minimumWidth: control.defaultRowHeaderWidth - anchors.right: parent.right - anchors.rightMargin: -width * 0.5 - target: __rowHeaderViewBg - isHorizontal: true - resizeCallback: result => __rowHeaderViewBg.width = result; - } - } - } - - DelScrollBar { - id: __hScrollBar - z: 11 - anchors.left: control.rowHeaderVisible ? __rowHeaderViewBg.right : __cellMouseArea.left - anchors.right: __cellMouseArea.right - anchors.bottom: __cellMouseArea.bottom - } - - DelScrollBar { - id: __vScrollBar - z: 12 - anchors.right: __cellMouseArea.right - anchors.top: control.columnHeaderVisible ? __columnHeaderViewBg.bottom : __cellMouseArea.top - anchors.bottom: __cellMouseArea.bottom - } -} diff --git a/DelegateUI/Controls/DelTag.qml b/DelegateUI/Controls/DelTag.qml deleted file mode 100644 index 52c7be6..0000000 --- a/DelegateUI/Controls/DelTag.qml +++ /dev/null @@ -1,152 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -Rectangle { - id: control - - enum State { - State_Default = 0, - State_Success = 1, - State_Processing = 2, - State_Error = 3, - State_Warning = 4 - } - - signal close() - - property bool animationEnabled: DelTheme.animationEnabled - property int tagState: DelTag.State_Default - property string text: "" - property font font - property bool rotating: false - property int iconSource: 0 - property int iconSize: DelTheme.DelButton.fontSize - property int closeIconSource: 0 - property int closeIconSize: DelTheme.DelButton.fontSize - property alias spacing: __row.spacing - property string presetColor: "" - property color colorText: presetColor == "" ? DelTheme.DelTag.colorDefaultText : __private.isCustom ? "#fff" : __private.colorArray[5] - property color colorBg: presetColor == "" ? DelTheme.DelTag.colorDefaultBg : __private.isCustom ? presetColor : __private.colorArray[0] - property color colorBorder: presetColor == "" ? DelTheme.DelTag.colorDefaultBorder : __private.isCustom ? "transparent" : __private.colorArray[2] - property color colorIcon: colorText - - onTagStateChanged: { - switch (tagState) { - case DelTag.State_Success: presetColor = "#52c41a"; break; - case DelTag.State_Processing: presetColor = "#1677ff"; break; - case DelTag.State_Error: presetColor = "#ff4d4f"; break; - case DelTag.State_Warning: presetColor = "#faad14"; break; - case DelTag.State_Default: - default: presetColor = ""; - } - } - - onPresetColorChanged: { - let preset = -1; - switch (presetColor) { - case "red": preset = DelColorGenerator.Preset_Red; break; - case "volcano": preset = DelColorGenerator.Preset_Volcano; break; - case "orange": preset = DelColorGenerator.Preset_Orange; break; - case "gold": preset = DelColorGenerator.Preset_Gold; break; - case "yellow": preset = DelColorGenerator.Preset_Yellow; break; - case "lime": preset = DelColorGenerator.Preset_Lime; break; - case "green": preset = DelColorGenerator.Preset_Green; break; - case "cyan": preset = DelColorGenerator.Preset_Cyan; break; - case "blue": preset = DelColorGenerator.Preset_Blue; break; - case "geekblue": preset = DelColorGenerator.Preset_Geekblue; break; - case "purple": preset = DelColorGenerator.Preset_Purple; break; - case "magenta": preset = DelColorGenerator.Preset_Magenta; break; - } - - if (tagState == DelTag.State_Default) { - __private.isCustom = preset == -1 ? true : false; - __private.presetColor = preset == -1 ? "#000" : delColorGenerator.presetToColor(preset); - } else { - __private.isCustom = false; - __private.presetColor = presetColor; - } - } - - implicitWidth: __row.implicitWidth + 16 - implicitHeight: Math.max(__icon.implicitHeight, __text.implicitHeight, __closeIcon.implicitHeight) + 8 - font.family: DelTheme.DelTag.fontFamily - font.pixelSize: DelTheme.DelTag.fontSize - 2 - color: colorBg - border.color: colorBorder - radius: 4 - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - DelColorGenerator { - id: delColorGenerator - } - - QtObject { - id: __private - property bool isCustom: false - property color presetColor: "#000" - property var colorArray: DelThemeFunctions.genColorString(presetColor, !DelTheme.isDark, DelTheme.Primary.colorBgBase) - } - - Row { - id: __row - anchors.centerIn: parent - spacing: 5 - - DelIconText { - id: __icon - anchors.verticalCenter: parent.verticalCenter - color: control.colorIcon - iconSize: control.iconSize - iconSource: control.iconSource - verticalAlignment: Text.AlignVCenter - visible: iconSource != 0 - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - NumberAnimation on rotation { - id: __animation - running: control.rotating - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - - DelCopyableText { - id: __text - anchors.verticalCenter: parent.verticalCenter - text: control.text - font: control.font - color: control.colorText - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - } - - DelIconText { - id: __closeIcon - anchors.verticalCenter: parent.verticalCenter - color: hovered ? DelTheme.DelTag.colorCloseIconHover : DelTheme.DelTag.colorCloseIcon - iconSize: control.closeIconSize - iconSource: control.closeIconSource - verticalAlignment: Text.AlignVCenter - visible: iconSource != 0 - - property alias hovered: __hoverHander.hovered - property alias down: __tapHander.pressed - - Behavior on color { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - HoverHandler { - id: __hoverHander - cursorShape: Qt.PointingHandCursor - } - - TapHandler { - id: __tapHander - onTapped: control.close(); - } - } - } -} diff --git a/DelegateUI/Controls/DelText.qml b/DelegateUI/Controls/DelText.qml deleted file mode 100644 index d10e249..0000000 --- a/DelegateUI/Controls/DelText.qml +++ /dev/null @@ -1,13 +0,0 @@ -import QtQuick 2.15 -import DelegateUI 1.0 - -Text { - id: control - - renderType: DelTheme.textRenderType - color: DelTheme.Primary.colorTextBase - font { - family: DelTheme.Primary.fontPrimaryFamily - pixelSize: DelTheme.Primary.fontPrimarySize - } -} diff --git a/DelegateUI/Controls/DelTimePicker.qml b/DelegateUI/Controls/DelTimePicker.qml deleted file mode 100644 index 8eeacc8..0000000 --- a/DelegateUI/Controls/DelTimePicker.qml +++ /dev/null @@ -1,469 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import QtQuick.Controls 2.15 as T -import QtQuick.Window 2.15 -import DelegateUI 1.0 - -T.TextField { - id: control - - enum IconPosition { - Position_Left = 0, - Position_Right = 1 - } - - enum TimeFormat { - Format_HHMMSS = 0, - Format_HHMM = 1, - Format_MMSS = 2 - } - - popupFont { - family: DelTheme.DelTimePicker.fontFamily - pixelSize: DelTheme.DelTimePicker.fontSize - } - - signal acceptedTime(time: string) - - property bool animationEnabled: DelTheme.animationEnabled - readonly property bool active: hovered || activeFocus - property int format: DelTimePicker.Format_HHMMSS - property int iconSize: DelTheme.DelTimePicker.fontIconSize - property int iconPosition: DelTimePicker.Position_Right - property color colorText: enabled ? DelTheme.DelTimePicker.colorText : DelTheme.DelTimePicker.colorTextDisabled - property color colorBorder: enabled ? - active ? DelTheme.DelTimePicker.colorBorderHover : - DelTheme.DelTimePicker.colorBorder : DelTheme.DelTimePicker.colorBorderDisabled - property color colorBg: enabled ? DelTheme.DelTimePicker.colorBg : DelTheme.DelTimePicker.colorBgDisabled - property color colorPopupText: DelTheme.DelTimePicker.colorPopupText - property font popupFont - property int radiusBg: 6 - property int radiusPopupBg: 6 - property string contentDescription: '' - - function clearTime() { - if (__private.cleared) { - control.text = ''; - } else { - control.text = __private.getTime(); - } - } - - Behavior on colorText { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBorder { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on colorBg { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - Behavior on placeholderTextColor { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - objectName: '__DelTimePicker__' - focus: __picker.opened - padding: 5 - leftPadding: 10 + (iconPosition == DelTimePicker.Position_Left ? iconSize : 0) - rightPadding: 10 + (iconPosition == DelTimePicker.Position_Right ? iconSize : 0) - width: 130 - implicitWidth: contentWidth + leftPadding + rightPadding - implicitHeight: contentHeight + topPadding + bottomPadding - placeholderText: qsTr('请选择时间') - color: colorText - placeholderTextColor: enabled ? DelTheme.DelTimePicker.colorPlaceholderText : DelTheme.DelTimePicker.colorPlaceholderTextDisabled - selectedTextColor: DelTheme.DelTimePicker.colorSelectedText - selectionColor: DelTheme.DelTimePicker.colorSelection - font { - family: DelTheme.DelTimePicker.fontFamily - pixelSize: DelTheme.DelTimePicker.fontSize - } - background: Rectangle { - color: control.colorBg - border.color: control.colorBorder - radius: control.radiusBg - } - onActiveFocusChanged: { - if (activeFocus) - __picker.open(); - } - onTextEdited: { - __private.commit(); - } - onEditingFinished: { - clearTime(); - } - - Keys.onPressed: function(event) { - if (event.key === Qt.Key_Enter || event.key === Qt.Key_Return) { - __confirmButton.clicked(); - } - } - - component TimeListView: MouseArea { - id: __rootItem - - property string value: '00' - property string checkValue: '00' - property string tempValue: '00' - property alias model: __listView.model - - function clearCheck() { - value = checkValue = tempValue = '00'; - if (__buttonGroup.checkedButton != null) - __buttonGroup.checkedButton.checked = false; - var item = __listView.itemAtIndex(0); - if (item) - item.checked = true; - __listView.positionViewAtBeginning(); - } - - function initValue(v) { - value = checkValue = tempValue = v; - } - - function checkIndex(index) { - checkValue = tempValue = (String(index).padStart(2, '0')); - var item = __listView.itemAtIndex(index); - if (item) { - item.checked = true; - item.clicked(); - } - __listView.positionViewAtIndex(index, ListView.Beginning); - } - - function positionViewAtIndex(index, mode) { - __listView.positionViewAtIndex(index, mode); - } - - width: 50 - height: parent.height - hoverEnabled: true - onExited: { - tempValue = checkValue; - control.text = __private.getCheckTime(); - } - - ListView { - id: __listView - height: parent.height - anchors.left: parent.left - anchors.right: parent.right - anchors.margins: 2 - clip: true - boundsBehavior: Flickable.StopAtBounds - delegate: T.AbstractButton { - width: __listView.width - height: 28 - checkable: true - contentItem: Text { - id: __viewText - font: control.popupFont - text: String(index).padStart(2, '0') - color: control.colorPopupText - horizontalAlignment: Text.AlignHCenter - verticalAlignment: Text.AlignVCenter - } - background: Rectangle { - radius: 4 - color: hovered ? DelTheme.DelTimePicker.colorButtonBgHover : - checked ? DelTheme.DelTimePicker.colorButtonBgActive : 'transparent' - } - T.ButtonGroup.group: __buttonGroup - onClicked: { - __rootItem.checkValue = __viewText.text; - } - onHoveredChanged: { - if (hovered) { - __rootItem.tempValue = __viewText.text; - control.text = __private.getTempTime(); - } - } - Component.onCompleted: checked = (index == 0); - } - onContentHeightChanged: cacheBuffer = contentHeight; - T.ScrollBar.vertical: DelScrollBar { policy: T.ScrollBar.AsNeeded } - - T.ButtonGroup { - id: __buttonGroup - } - } - } - - Item { - id: __private - property var window: Window.window - property bool cleared: true - function getTime() { - switch (control.format) { - case DelTimePicker.Format_HHMMSS: - return`${__hourListView.value}:${__minuteListView.value}:${__secondListView.value}`; - case DelTimePicker.Format_HHMM: - return`${__hourListView.value}:${__minuteListView.value}`; - case DelTimePicker.Format_MMSS: - return`${__minuteListView.value}:${__secondListView.value}`; - } - } - function getCheckTime() { - switch (control.format) { - case DelTimePicker.Format_HHMMSS: - return`${__hourListView.checkValue}:${__minuteListView.checkValue}:${__secondListView.checkValue}`; - case DelTimePicker.Format_HHMM: - return`${__hourListView.checkValue}:${__minuteListView.checkValue}`; - case DelTimePicker.Format_MMSS: - return`${__minuteListView.checkValue}:${__secondListView.checkValue}`; - } - } - function getTempTime() { - switch (control.format) { - case DelTimePicker.Format_HHMMSS: - return`${__hourListView.tempValue}:${__minuteListView.tempValue}:${__secondListView.tempValue}`; - case DelTimePicker.Format_HHMM: - return`${__hourListView.tempValue}:${__minuteListView.tempValue}`; - case DelTimePicker.Format_MMSS: - return`${__minuteListView.tempValue}:${__secondListView.tempValue}`; - } - } - function testValid() { - let reg; - switch (control.format) { - case DelTimePicker.Format_HHMMSS: - reg = /^([0-1]\d|2[0-3]):([0-5]\d):([0-5]\d)$/; - break; - case DelTimePicker.Format_HHMM: - reg = /^([0-1]\d|2[0-3]):([0-5]\d)$/; - break; - case DelTimePicker.Format_MMSS: - reg = /^([0-5]\d):([0-5]\d)$/; - break; - } - return reg.test(control.text); - } - - function commit() { - let hour = ''; - let minute = ''; - let second = ''; - - if (testValid()) { - switch (control.format) { - case DelTimePicker.Format_HHMMSS: - hour = control.getText(0, 2); - minute = control.getText(3, 5); - second = control.getText(6, 8); - break; - case DelTimePicker.Format_HHMM: - hour = control.getText(0, 2); - minute = control.getText(3, 5); - break; - case DelTimePicker.Format_MMSS: - minute = control.getText(0, 2); - second = control.getText(3, 5); - break; - } - - if (hour.length === 2) { - const index = parseInt(hour); - __hourListView.value = hour; - __hourListView.checkIndex(index); - } - if (minute.length === 2) { - const index = parseInt(minute); - __minuteListView.value = minute; - __minuteListView.checkIndex(index); - } - if (second.length === 2) { - const index = parseInt(second); - __secondListView.value = second; - __secondListView.checkIndex(index); - } - } - } - } - - TapHandler { - onTapped: { - __picker.open(); - } - } - - DelIconText { - anchors.left: control.iconPosition == DelTimePicker.Position_Left ? parent.left : undefined - anchors.right: control.iconPosition == DelTimePicker.Position_Right ? parent.right : undefined - anchors.margins: 5 - anchors.verticalCenter: parent.verticalCenter - iconSource: (control.hovered && control.text.length !== 0) ? DelIcon.CloseCircleFilled : DelIcon.ClockCircleOutlined - iconSize: control.iconSize - colorIcon: control.enabled ? - __iconMouse.hovered ? DelTheme.DelTimePicker.colorIconHover : - DelTheme.DelTimePicker.colorIcon : DelTheme.DelTimePicker.colorIconDisabled - - Behavior on colorIcon { enabled: control.animationEnabled; ColorAnimation { duration: DelTheme.Primary.durationFast } } - - MouseArea { - id: __iconMouse - anchors.fill: parent - hoverEnabled: true - cursorShape: parent.iconSource == DelIcon.CloseCircleFilled ? Qt.PointingHandCursor : Qt.ArrowCursor - onEntered: hovered = true; - onExited: hovered = false; - property bool hovered: false - onClicked: { - __hourListView.clearCheck(); - __minuteListView.clearCheck(); - __secondListView.clearCheck(); - __private.cleared = true; - control.text = ''; - } - } - } - - DelPopup { - id: __picker - implicitWidth: implicitContentWidth + leftPadding + rightPadding - implicitHeight: implicitContentHeight + topPadding + bottomPadding - leftPadding: 2 - rightPadding: 2 - topPadding: 6 - bottomPadding: 6 - closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent - enter: Transition { - NumberAnimation { - property: 'opacity' - from: 0.0 - to: 1.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - exit: Transition { - NumberAnimation { - property: 'opacity' - from: 1.0 - to: 0.0 - easing.type: Easing.InOutQuad - duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 - } - } - onAboutToShow: { - const pos = control.mapToItem(null, 0, 0); - x = (control.width - width) * 0.5; - if (__private.window.height > (pos.y + control.height + height + 6)){ - y = control.height + 6; - } else if (pos.y > height) { - y = -height - 6; - } else { - y = __private.window.height - (pos.y + height + 6); - } - __private.commit(); - } - onAboutToHide: { - control.editingFinished(); - } - contentItem: Item { - implicitWidth: __row.width - implicitHeight: 250 - - Row { - id: __row - height: parent.height - 30 - - TimeListView { - id: __hourListView - model: 24 - visible: control.format == DelTimePicker.Format_HHMMSS || - control.format == DelTimePicker.Format_HHMM - - DelDivider { - width: 1 - height: parent.height - anchors.right: parent.right - orientation: Qt.Vertical - } - } - - TimeListView { - id: __minuteListView - model: 60 - visible: control.format == DelTimePicker.Format_HHMMSS || - control.format == DelTimePicker.Format_HHMM || - control.format == DelTimePicker.Format_MMSS - - DelDivider { - width: 1 - height: parent.height - anchors.right: parent.right - orientation: Qt.Vertical - visible: control.format == DelTimePicker.Format_HHMMSS || - control.format == DelTimePicker.Format_MMSS - } - } - - TimeListView { - id: __secondListView - model: 60 - visible: control.format == DelTimePicker.Format_HHMMSS || - control.format == DelTimePicker.Format_MMSS - } - } - - Item { - width: parent.width - anchors.top: __row.bottom - anchors.bottom: parent.bottom - - DelDivider { - width: parent.width - height: 1 - } - - DelButton { - padding: 2 - topPadding: 2 - bottomPadding: 2 - anchors.left: parent.left - anchors.leftMargin: 5 - anchors.bottom: parent.bottom - type: DelButton.Type_Text - text: qsTr('此刻') - colorBg: 'transparent' - onClicked: { - const now = new Date(); - __hourListView.initValue(String(now.getHours()).padStart(2, '0')); - __hourListView.checkIndex(now.getHours()); - __minuteListView.initValue(String(now.getMinutes()).padStart(2, '0')); - __minuteListView.checkIndex(now.getMinutes()); - __secondListView.initValue(String(now.getSeconds()).padStart(2, '0')); - __secondListView.checkIndex(now.getSeconds()); - - __private.cleared = false; - __picker.close(); - - control.acceptedTime(__private.getTime()); - control.text = __private.getTime(); - } - } - - DelButton { - id: __confirmButton - topPadding: 2 - bottomPadding: 2 - leftPadding: 10 - rightPadding: 10 - anchors.right: parent.right - anchors.rightMargin: 5 - anchors.bottom: parent.bottom - type: DelButton.Type_Primary - text: qsTr('确定') - onClicked: { - __hourListView.initValue(__hourListView.tempValue); - __minuteListView.initValue(__minuteListView.tempValue); - __secondListView.initValue(__secondListView.tempValue); - __private.cleared = false; - __picker.close(); - - control.acceptedTime(__private.getTime()); - control.text = __private.getTime(); - } - } - } - } - } - - Accessible.role: Accessible.EditableText - Accessible.editable: true - Accessible.description: control.contentDescription -} diff --git a/DelegateUI/Controls/DelTimeline.qml b/DelegateUI/Controls/DelTimeline.qml deleted file mode 100644 index 5763984..0000000 --- a/DelegateUI/Controls/DelTimeline.qml +++ /dev/null @@ -1,307 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -Item { - id: control - - enum Mode { - Mode_Left = 0, - Mode_Right = 1, - Mode_Alternate = 2 - } - - timeFont { - family: DelTheme.DelTimeline.fontFamily - pixelSize: DelTheme.DelTimeline.fontSize - } - contentFont { - family: DelTheme.DelTimeline.fontFamily - pixelSize: DelTheme.DelTimeline.fontSize - } - - property bool animationEnabled: DelTheme.animationEnabled - property var initModel: [] - property int mode: DelTimeline.Mode_Left - property bool reverse: false - property int defaultNodeSize: 11 - property int defaultLineWidth: 1 - property string defaultTimeFormat: "yyyy-MM-dd" - property int defaultContentFormat: Text.AutoText - property color colorNode: DelTheme.DelTimeline.colorNode - property color colorNodeBg: DelTheme.DelTimeline.colorNodeBg - property color colorLine: DelTheme.DelTimeline.colorLine - property font timeFont - property color colorTimeText: DelTheme.DelTimeline.colorTimeText - property font contentFont - property color colorContentText: DelTheme.DelTimeline.colorContentText - property Component nodeDelegate: Component { - Item { - height: __loading.active ? __loading.height : __icon.active ? __icon.height : defaultNodeSize - - Loader { - id: __dot - width: parent.height - height: parent.height - anchors.horizontalCenter: parent.horizontalCenter - active: !__icon.active && !__loading.active - sourceComponent: Rectangle { - radius: width >> 1 - color: control.colorNodeBg - border.color: model.colorNode - border.width: radius * 0.5 - } - } - - Loader { - id: __icon - anchors.horizontalCenter: parent.horizontalCenter - active: !__loading.active && model.icon !== 0 - sourceComponent: DelIconText { - iconSource: model.icon - iconSize: model.iconSize - colorIcon: model.colorNode - } - } - - Loader { - id: __loading - anchors.horizontalCenter: parent.horizontalCenter - active: model.loading - sourceComponent: DelIconText { - iconSize: model.iconSize - iconSource: DelIcon.LoadingOutlined - colorIcon: model.colorNode - - NumberAnimation on rotation { - running: model.loading - from: 0 - to: 360 - loops: Animation.Infinite - duration: 1000 - } - } - } - } - } - property Component lineDelegate: Component { - Rectangle { - color: control.colorLine - } - } - property Component timeDelegate: Component { - Text { - id: __timeText - color: control.colorTimeText - font: control.timeFont - text: { - if (!isNaN(model.time)) - return model.time.toLocaleString(Qt.locale(), model.timeFormat); - else - return ""; - } - horizontalAlignment: onLeft ? Text.AlignRight : Text.AlignLeft - } - } - property Component contentDelegate: Component { - Text { - id: __contentText - color: control.colorContentText - font: control.contentFont - text: model.content - textFormat: model.contentFormat - wrapMode: Text.WrapAnywhere - horizontalAlignment: onLeft ? Text.AlignRight : Text.AlignLeft - } - } - - onInitModelChanged: { - clear(); - for (const object of initModel) { - append(object); - } - } - - function flick(xVelocity: real, yVelocity: real) { - __listView.flick(xVelocity, yVelocity); - } - - function positionViewAtBeginning() { - __listView.positionViewAtBeginning(); - } - - function positionViewAtIndex(index: int, mode: int) { - __listView.positionViewAtIndex(index, mode); - } - - function positionViewAtEnd() { - __listView.positionViewAtEnd(); - } - - function get(index) { - return __listModel.get(index); - } - - function set(index, object) { - __listModel.set(index, __private.initObject(object)); - } - - function setProperty(index, propertyName, value) { - if (propertyName === "time") - __private.noTime = false; - __listModel.setProperty(index, propertyName, value); - } - - function move(from, to, count = 1) { - __listModel.move(from, to, count); - } - - function insert(index, object) { - __listModel.insert(index, __private.initObject(object)); - } - - function remove(index, count = 1) { - __listModel.remove(index, count); - for (let i = 0; i < __listModel.count; i++) { - if (__listModel.get(i).hasOwnProperty("time")) { - __private.noTime = false; - break; - } - } - } - - function append(object) { - __listModel.append(__private.initObject(object)); - } - - function clear() { - __private.noTime = true; - __listModel.clear(); - } - - QtObject { - id: __private - property bool noTime: true - function initObject(object) { - /*! 静态角色类型下会有颜色不兼容问题, 统一转换为string即可 */ - if (object.hasOwnProperty("colorNode")) { - object.colorNode = String(object.colorNode); - } - - if (!object.hasOwnProperty("colorNode")) object.colorNode = String(control.colorNode); - if (!object.hasOwnProperty("icon")) object.icon = 0; - if (!object.hasOwnProperty("iconSize")) object.iconSize = control.defaultNodeSize; - if (!object.hasOwnProperty("loading")) object.loading = false; - - if (!object.hasOwnProperty("time")) object.time = new Date(undefined); - if (!object.hasOwnProperty("timeFormat")) object.timeFormat = control.defaultTimeFormat; - - if (!object.hasOwnProperty("content")) object.content = ""; - if (!object.hasOwnProperty("contentFormat")) object.contentFormat = control.defaultContentFormat; - - /*! 判断是否存在有效时间 */ - if (__private.noTime && object.hasOwnProperty("time") && !isNaN(object.time)) - __private.noTime = false; - - return object; - } - } - - ListView { - id: __listView - anchors.fill: parent - clip: true - verticalLayoutDirection: control.reverse ? ListView.BottomToTop : ListView.TopToBottom - model: ListModel { id: __listModel } - T.ScrollBar.vertical: DelScrollBar { } - add: Transition { - NumberAnimation { property: "opacity"; from: 0; to: 1; duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } - } - remove: Transition { - NumberAnimation { property: "opacity"; from: 1; to: 0; duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } - } - delegate: Item { - id: __rootItem - width: __listView.width - height: contentLoader.height + 25 - - required property var model - required property int index - property bool timeOnLeft: { - if (control.mode == DelTimeline.Mode_Right) - return false; - else if (control.mode == DelTimeline.Mode_Alternate) - return index % 2 == 0; - else - return true; - } - - Loader { - id: lineLoader - active: { - if (control.reverse) - return __rootItem.index != 0; - else - __rootItem.index !== (__listModel.count - 1); - } - width: defaultLineWidth - height: parent.height - nodeLoader.height - anchors.horizontalCenter: nodeLoader.horizontalCenter - anchors.top: nodeLoader.bottom - sourceComponent: lineDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - } - - Loader { - id: nodeLoader - x: { - if (__private.noTime && control.mode != DelTimeline.Mode_Alternate) - return control.mode == DelTimeline.Mode_Left ? 0 : parent.width - width; - else - return (__rootItem.width - width) * 0.5; - } - width: 30 - sourceComponent: nodeDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - } - - Loader { - id: timeLoader - y: (nodeLoader.height - __timeFontMetrics.height) * 0.5 - anchors.left: __rootItem.timeOnLeft ? parent.left : nodeLoader.right - anchors.leftMargin: __rootItem.timeOnLeft ? 0 : 5 - anchors.right: __rootItem.timeOnLeft ? nodeLoader.left : parent.right - anchors.rightMargin: __rootItem.timeOnLeft ? 5 : 0 - sourceComponent: timeDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - property bool onLeft: __rootItem.timeOnLeft - - FontMetrics { - id: __timeFontMetrics - font: control.timeFont - } - } - - Loader { - id: contentLoader - y: (nodeLoader.height - __contentFontMetrics.height) * 0.5 - anchors.left: !__rootItem.timeOnLeft ? parent.left : nodeLoader.right - anchors.leftMargin: !__rootItem.timeOnLeft ? 0 : 5 - anchors.right: !__rootItem.timeOnLeft ? nodeLoader.left : parent.right - anchors.rightMargin: !__rootItem.timeOnLeft ? 5 : 0 - sourceComponent: contentDelegate - property alias model: __rootItem.model - property alias index: __rootItem.index - property bool onLeft: !__rootItem.timeOnLeft - - FontMetrics { - id: __contentFontMetrics - font: control.contentFont - } - } - } - } -} diff --git a/DelegateUI/Controls/DelToolTip.qml b/DelegateUI/Controls/DelToolTip.qml deleted file mode 100644 index 0aaca99..0000000 --- a/DelegateUI/Controls/DelToolTip.qml +++ /dev/null @@ -1,165 +0,0 @@ -import QtQuick 2.15 -import QtGraphicalEffects 1.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.ToolTip { - id: control - - enum Position - { - Position_Top = 0, - Position_Bottom = 1, - Position_Left = 2, - Position_Right = 3 - } - - property bool animationEnabled: DelTheme.animationEnabled - property bool arrowVisible: false - property int position: DelToolTip.Position_Top - property color colorText: DelTheme.DelToolTip.colorText - property color colorBg: DelTheme.isDark ? DelTheme.DelToolTip.colorBgDark : DelTheme.DelToolTip.colorBg - - component Arrow: Canvas { - onWidthChanged: requestPaint(); - onHeightChanged: requestPaint(); - onColorBgChanged: requestPaint(); - onPaint: { - var ctx = getContext("2d"); - ctx.fillStyle = colorBg; - ctx.beginPath(); - switch (position) { - case DelToolTip.Position_Top: { - ctx.moveTo(0, 0); - ctx.lineTo(width, 0); - ctx.lineTo(width * 0.5, height); - } break; - case DelToolTip.Position_Bottom: { - ctx.moveTo(0, height); - ctx.lineTo(width, height); - ctx.lineTo(width * 0.5, 0); - } break; - case DelToolTip.Position_Left: { - ctx.moveTo(0, 0); - ctx.lineTo(0, height); - ctx.lineTo(width, height * 0.5); - } break; - case DelToolTip.Position_Right: { - ctx.moveTo(width, 0); - ctx.lineTo(width, height); - ctx.lineTo(0, height * 0.5); - } break; - } - ctx.closePath(); - ctx.fill(); - } - property color colorBg: control.colorBg - } - - x: { - switch (position) { - case DelToolTip.Position_Top: - case DelToolTip.Position_Bottom: - return (__private.controlParentWidth - implicitWidth) * 0.5; - case DelToolTip.Position_Left: - return -implicitWidth - 4; - case DelToolTip.Position_Right: - return __private.controlParentWidth + 4; - } - } - y: { - switch (position) { - case DelToolTip.Position_Top: - return -implicitHeight - 4; - case DelToolTip.Position_Bottom: - return __private.controlParentHeight + 4; - case DelToolTip.Position_Left: - case DelToolTip.Position_Right: - return (__private.controlParentHeight - implicitHeight) * 0.5; - } - } - - enter: Transition { - NumberAnimation { property: "opacity"; from: 0.0; to: 1.0; duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } - } - exit: Transition { - NumberAnimation { property: "opacity"; from: 1.0; to: 0.0; duration: control.animationEnabled ? DelTheme.Primary.durationMid : 0 } - } - - delay: 300 - padding: 0 - implicitWidth: implicitContentWidth - implicitHeight: implicitContentHeight - font { - family: DelTheme.DelToolTip.fontFamily - pixelSize: DelTheme.DelToolTip.fontSize - } - closePolicy: T.Popup.CloseOnEscape | T.Popup.CloseOnPressOutsideParent | T.Popup.CloseOnReleaseOutsideParent - contentItem: Item { - implicitWidth: __bg.width + (__private.isHorizontal ? 0 : __arrow.width) - implicitHeight: __bg.height + (__private.isHorizontal ? __arrow.height : 0) - - DropShadow { - anchors.fill: __item - radius: 16 - samples: 17 - color: DelThemeFunctions.alpha(control.colorText, DelTheme.isDark ? 0.1 : 0.2) - source: __item - } - - Item { - id: __item - anchors.fill: parent - - Arrow { - id: __arrow - x: __private.isHorizontal ? (-control.x + (__private.controlParentWidth - width) * 0.5) : 0 - y: __private.isHorizontal ? 0 : (-control.y + (__private.controlParentHeight - height)) * 0.5 - width: __private.arrowSize.width - height: __private.arrowSize.height - anchors.top: control.position == DelToolTip.Position_Bottom ? parent.top : undefined - anchors.bottom: control.position == DelToolTip.Position_Top ? parent.bottom : undefined - anchors.left: control.position == DelToolTip.Position_Right ? parent.left : undefined - anchors.right: control.position == DelToolTip.Position_Left ? parent.right : undefined - - Connections { - target: control - function onPositionChanged() { - __arrow.requestPaint(); - } - } - } - - Rectangle { - id: __bg - width: __text.implicitWidth + 14 - height: __text.implicitHeight + 12 - anchors.top: control.position == DelToolTip.Position_Top ? parent.top : undefined - anchors.bottom: control.position == DelToolTip.Position_Bottom ? parent.bottom : undefined - anchors.left: control.position == DelToolTip.Position_Left ? parent.left : undefined - anchors.right: control.position == DelToolTip.Position_Right ? parent.right : undefined - anchors.margins: 1 - radius: 4 - color: control.colorBg - - Text { - id: __text - text: control.text - font: control.font - color: control.colorText - wrapMode: Text.Wrap - anchors.centerIn: parent - } - } - } - } - background: Item { } - - QtObject { - id: __private - property bool isHorizontal: control.position == DelToolTip.Position_Top || control.position == DelToolTip.Position_Bottom - property size arrowSize: control.arrowVisible ? (isHorizontal ? Qt.size(12, 6) : Qt.size(6, 12)) : Qt.size(0, 0) - property real controlParentWidth: control.parent ? control.parent.width : 0 - property real controlParentHeight: control.parent ? control.parent.height : 0 - } -} diff --git a/DelegateUI/Controls/DelTourFocus.qml b/DelegateUI/Controls/DelTourFocus.qml deleted file mode 100644 index 8c6bae9..0000000 --- a/DelegateUI/Controls/DelTourFocus.qml +++ /dev/null @@ -1,49 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Popup { - id: control - - property Item target: null - property color colorOverlay: DelTheme.DelTour.colorOverlay - property real focusMargin: 5 - - onAboutToShow: __private.recalcPosition(); - - QtObject { - id: __private - property real focusX: 0 - property real focusY: 0 - property real focusWidth: control.target ? (control.target.width + control.focusMargin * 2) : 0 - property real focusHeight: control.target ? (control.target.height + control.focusMargin * 2) : 0 - function recalcPosition() { - if (!control.target) return; - const pos = control.target.mapToItem(null, 0, 0); - focusX = pos.x - control.focusMargin; - focusY = pos.y - control.focusMargin; - } - } - - T.Overlay.modal: Item { - onWidthChanged: __private.recalcPosition(); - onHeightChanged: __private.recalcPosition(); - - Rectangle { - id: source - color: control.colorOverlay - anchors.fill: parent - layer.enabled: true - layer.effect: ShaderEffect { - property real xMin: __private.focusX / source.width - property real xMax: (__private.focusX + __private.focusWidth) / source.width - property real yMin: __private.focusY / source.height - property real yMax: (__private.focusY + __private.focusHeight) / source.height - fragmentShader: "qrc:/DelegateUI/shaders/deltour.frag" - } - } - } - parent: T.Overlay.overlay - modal: true - background: Item { } -} diff --git a/DelegateUI/Controls/DelTourStep.qml b/DelegateUI/Controls/DelTourStep.qml deleted file mode 100644 index d3c8694..0000000 --- a/DelegateUI/Controls/DelTourStep.qml +++ /dev/null @@ -1,284 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Templates 2.15 as T -import DelegateUI 1.0 - -T.Popup { - id: control - - x: __private.focusX - (stepCardWidth - focusWidth) * 0.5 - y: __private.focusY + focusHeight + 5 - - stepTitleFont { - bold: true - family: DelTheme.DelTour.fontFamily - pixelSize: DelTheme.DelTour.fontSizeTitle - } - stepDescriptionFont { - family: DelTheme.DelTour.fontFamily - pixelSize: DelTheme.DelTour.fontSizeDescription - } - indicatorFont { - family: DelTheme.DelTour.fontFamily - pixelSize: DelTheme.DelTour.fontSizeIndicator - } - buttonFont { - family: DelTheme.DelTour.fontFamily - pixelSize: DelTheme.DelTour.fontSizeButton - } - - property bool animationEnabled: DelTheme.animationEnabled - property var stepModel: [] - property Item currentTarget: null - property int currentStep: 0 - property color colorOverlay: DelTheme.DelTour.colorOverlay - property bool showArrow: true - property real arrowWidth: 20 - property real arrowHeight: 10 - property real focusMargin: 5 - property real focusWidth: currentTarget ? (currentTarget.width + focusMargin * 2) : 0 - property real focusHeight: currentTarget ? (currentTarget.height + focusMargin * 2) : 0 - property real stepCardWidth: 250 - property real radiusStepCard: DelTheme.DelTour.radiusCard - property color colorStepCard: DelTheme.DelTour.colorBg - property font stepTitleFont - property color colorStepTitle: DelTheme.DelTour.colorText - property font stepDescriptionFont - property color colorStepDescription: DelTheme.DelTour.colorText - property font indicatorFont - property color colorIndicator: DelTheme.DelTour.colorText - property font buttonFont - property Component arrowDelegate: Canvas { - id: __arrowDelegate - width: arrowWidth - height: arrowHeight - onWidthChanged: requestPaint(); - onHeightChanged: requestPaint(); - onFillStyleChanged: requestPaint(); - onPaint: { - const ctx = getContext("2d"); - ctx.fillStyle = fillStyle; - ctx.beginPath(); - ctx.moveTo(0, height); - ctx.lineTo(width * 0.5, 0); - ctx.lineTo(width, height); - ctx.closePath(); - ctx.fill(); - } - property color fillStyle: control.colorStepCard - - Connections { - target: control - function onCurrentTargetChanged() { - if (control.stepModel.length > control.currentStep) { - const stepData = control.stepModel[control.currentStep]; - __arrowDelegate.fillStyle = Qt.binding(() => stepData.cardColor ? stepData.cardColor : control.colorStepCard); - } - __arrowDelegate.requestPaint(); - } - } - } - property Component stepCardDelegate: Rectangle { - id: __stepCardDelegate - width: stepData.cardWidth ? stepData.cardWidth : control.stepCardWidth - height: stepData.cardHeight ? stepData.cardHeight : (__stepCardColumn.height + 20) - color: stepData.cardColor ? stepData.cardColor : control.colorStepCard - radius: stepData.cardRadius ? stepData.cardRadius : control.radiusStepCard - clip: true - - property var stepData: new Object - - Connections { - target: control - function onCurrentTargetChanged() { - if (control.stepModel.length > control.currentStep) - stepData = control.stepModel[control.currentStep]; - } - } - - Column { - id: __stepCardColumn - width: parent.width - anchors.verticalCenter: parent.verticalCenter - spacing: 10 - - Text { - anchors.horizontalCenter: parent.horizontalCenter - text: stepData.title ? stepData.title : "" - color: stepData.titleColor ? stepData.titleColor : control.colorStepTitle - font: control.stepTitleFont - } - - Text { - width: parent.width - 20 - anchors.horizontalCenter: parent.horizontalCenter - horizontalAlignment: Text.AlignHCenter - wrapMode: Text.WrapAnywhere - text: stepData.description || "" - visible: text.length !== 0 - color: stepData.descriptionColor ? stepData.descriptionColor : control.colorStepDescription - font: control.stepDescriptionFont - } - - Item { - width: parent.width - height: 30 - - Loader { - anchors.left: parent.left - anchors.leftMargin: 15 - anchors.verticalCenter: parent.verticalCenter - sourceComponent: control.indicatorDelegate - } - - DelButton { - id: __prevButton - anchors.verticalCenter: parent.verticalCenter - anchors.right: __nextButton.left - anchors.rightMargin: 15 - anchors.bottom: __nextButton.bottom - visible: control.currentStep != 0 - text: qsTr("上一步") - font: control.buttonFont - type: DelButton.Type_Outlined - onClicked: { - if (control.currentStep > 0) { - control.currentStep -= 1; - __stepCardDelegate.stepData = control.stepModel[control.currentStep]; - control.currentTarget = __stepCardDelegate.stepData.target; - } - } - } - - DelButton { - id: __nextButton - anchors.verticalCenter: parent.verticalCenter - anchors.right: parent.right - anchors.rightMargin: 15 - anchors.bottom: parent.bottom - text: (control.currentStep + 1 == control.stepModel.length) ? qsTr("结束导览") : qsTr("下一步") - font: control.buttonFont - type: DelButton.Type_Primary - onClicked: { - if ((control.currentStep + 1 == control.stepModel.length)) { - control.resetStep(); - control.close(); - } else if (control.currentStep + 1 < control.stepModel.length) { - control.currentStep += 1; - __stepCardDelegate.stepData = control.stepModel[control.currentStep]; - control.currentTarget = __stepCardDelegate.stepData.target; - } - } - } - } - } - - DelCaptionButton { - radiusBg: 4 - anchors.right: parent.right - anchors.rightMargin: 2 - anchors.top: parent.top - anchors.topMargin: 2 - iconSource: DelIcon.CloseOutlined - onClicked: { - control.resetStep(); - control.close(); - } - } - } - property Component indicatorDelegate: Text { - text: (control.currentStep + 1) + " / " + control.stepModel.length - font: control.indicatorFont - color: control.colorIndicator - } - - function resetStep() { - control.currentStep = 0; - if (control.stepModel.length > control.currentStep) { - const stepData = control.stepModel[control.currentStep]; - currentTarget = stepData.target; - } - } - - function appendStep(object) { - stepModel.push(object); - } - - onStepModelChanged: __private.recalcPosition(); - onCurrentTargetChanged: __private.recalcPosition(); - onAboutToShow: __private.recalcPosition(); - - Behavior on x { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on y { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - - QtObject { - id: __private - property bool first: true - property real focusX: 0 - property real focusY: 0 - function recalcPosition() { - /*! 需要延时计算 */ - __privateTimer.restart(); - } - } - - Timer { - id: __privateTimer - interval: 40 - onTriggered: { - if (!control.currentTarget) return; - const pos = control.currentTarget.mapToItem(null, 0, 0); - __private.focusX = pos.x - control.focusMargin; - __private.focusY = pos.y - control.focusMargin; - } - } - - T.Overlay.modal: Item { - id: __overlayItem - onWidthChanged: __private.recalcPosition(); - onHeightChanged: __private.recalcPosition(); - - Rectangle { - id: source - color: colorOverlay - anchors.fill: parent - layer.enabled: true - layer.effect: ShaderEffect { - property real xMin: __private.focusX / __overlayItem.width - property real xMax: (__private.focusX + focusWidth) / __overlayItem.width - property real yMin: __private.focusY / __overlayItem.height - property real yMax: (__private.focusY + focusHeight) / __overlayItem.height - - Behavior on xMin { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on xMax { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on yMin { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - Behavior on yMax { enabled: control.animationEnabled; NumberAnimation { duration: DelTheme.Primary.durationMid } } - - fragmentShader: "qrc:/DelegateUI/shaders/deltour.frag" - } - } - } - closePolicy: T.Popup.CloseOnEscape - parent: T.Overlay.overlay - focus: true - modal: true - background: Item { - width: stepLoader.item == null ? control.arrowWidth : Math.max(control.arrowWidth, stepLoader.item.width) - height: stepLoader.item == null ? control.arrowHeight : (control.arrowHeight + stepLoader.item.height - 1) - - Loader { - id: arrowLoader - width: control.arrowWidth - height: control.arrowHeight - anchors.horizontalCenter: parent.horizontalCenter - sourceComponent: control.arrowDelegate - } - - Loader { - id: stepLoader - anchors.top: arrowLoader.bottom - anchors.topMargin: -1 - anchors.horizontalCenter: parent.horizontalCenter - sourceComponent: control.stepCardDelegate - } - } -} diff --git a/DelegateUI/Controls/DelWindow.qml b/DelegateUI/Controls/DelWindow.qml deleted file mode 100644 index d248ca3..0000000 --- a/DelegateUI/Controls/DelWindow.qml +++ /dev/null @@ -1,160 +0,0 @@ -import QtQuick 2.15 -import QtQuick.Window 2.15 -import DelegateUI 1.0 - -Window { - id: window - - enum SpecialEffect - { - None = 0, - - Win_DwmBlur = 1, - Win_AcrylicMaterial = 2, - Win_Mica = 3, - Win_MicaAlt = 4, - - Mac_BlurEffect = 10 - } - - property real contentHeight: height - captionBar.height - property alias captionBar: __captionBar - property alias windowAgent: __windowAgent - property bool followThemeSwitch: true - property bool initialized: false - property int specialEffect: DelWindow.None - - visible: true - objectName: '__DelWindow__' - Component.onCompleted: { - initialized = true; - setWindowMode(DelTheme.isDark); - __captionBar.windowAgent = __windowAgent; - if (followThemeSwitch) - __connections.onIsDarkChanged(); - } - - function setMacSystemButtonsVisble(visible) { - if (Qt.platform.os === 'osx') { - windowAgent.setWindowAttribute('no-system-buttons', !visible); - } - } - - function setWindowMode(isDark) { - if (window.initialized) - return windowAgent.setWindowAttribute('dark-mode', isDark); - return false; - } - - function setSpecialEffect(specialEffect) { - if (Qt.platform.os === 'windows') { - switch (specialEffect) - { - case DelWindow.Win_DwmBlur: - windowAgent.setWindowAttribute('acrylic-material', false); - windowAgent.setWindowAttribute('mica', false); - windowAgent.setWindowAttribute('mica-alt', false); - if (windowAgent.setWindowAttribute('dwm-blur', true)) { - window.specialEffect = DelWindow.Win_DwmBlur; - window.color = 'transparent' - return true; - } else { - return false; - } - case DelWindow.Win_AcrylicMaterial: - windowAgent.setWindowAttribute('dwm-blur', false); - windowAgent.setWindowAttribute('mica', false); - windowAgent.setWindowAttribute('mica-alt', false); - if (windowAgent.setWindowAttribute('acrylic-material', true)) { - window.specialEffect = DelWindow.Win_AcrylicMaterial; - window.color = 'transparent'; - return true; - } else { - return false; - } - case DelWindow.Win_Mica: - windowAgent.setWindowAttribute('dwm-blur', false); - windowAgent.setWindowAttribute('acrylic-material', false); - windowAgent.setWindowAttribute('mica-alt', false); - if (windowAgent.setWindowAttribute('mica', true)) { - window.specialEffect = DelWindow.Win_Mica; - window.color = 'transparent'; - return true; - } else { - return false; - } - case DelWindow.Win_MicaAlt: - windowAgent.setWindowAttribute('dwm-blur', false); - windowAgent.setWindowAttribute('acrylic-material', false); - windowAgent.setWindowAttribute('mica', false); - if (windowAgent.setWindowAttribute('mica-alt', true)) { - window.specialEffect = DelWindow.Win_MicaAlt; - window.color = 'transparent'; - return true; - } else { - return false; - } - case DelWindow.None: - default: - windowAgent.setWindowAttribute('dwm-blur', false); - windowAgent.setWindowAttribute('acrylic-material', false); - windowAgent.setWindowAttribute('mica', false); - windowAgent.setWindowAttribute('mica-alt', false); - window.specialEffect = DelWindow.None; - break; - } - } else if (Qt.platform.os === 'osx') { - switch (specialEffect) - { - case DelWindow.Mac_BlurEffect: - if (windowAgent.setWindowAttribute('blur-effect', DelTheme.isDark ? 'dark' : 'light')) { - window.specialEffect = DelWindow.Mac_BlurEffect; - window.color = 'transparent' - return true; - } else { - return false; - } - case DelWindow.None: - default: - windowAgent.setWindowAttribute('blur-effect', 'none'); - window.specialEffect = DelWindow.None; - break; - } - } - - return false; - } - - Connections { - target: DelTheme - enabled: Qt.platform.os === 'osx' /*! 需额外为 MACOSX 处理*/ - function onIsDarkChanged() { - if (window.specialEffect === DelWindow.Mac_BlurEffect) - windowAgent.setWindowAttribute('blur-effect', DelTheme.isDark ? 'dark' : 'light'); - } - } - - Connections { - id: __connections - target: DelTheme - enabled: window.followThemeSwitch - function onIsDarkChanged() { - if (window.specialEffect == DelWindow.None) - window.color = DelTheme.Primary.colorBgBase; - window.setWindowMode(DelTheme.isDark); - } - } - - DelWindowAgent { - id: __windowAgent - } - - DelCaptionBar { - id: __captionBar - z: 65535 - width: parent.width - height: 30 - anchors.top: parent.top - targetWindow: window - } -} diff --git a/DelegateUI/DelegateUI.dll b/DelegateUI/DelegateUI.dll deleted file mode 100644 index 23999a44b44858a3d787870c139e45d0b8604539..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 828928 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

VAho-dSb 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

  • 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

    CQ1O^>;^ntPSGRdZiq?jGho@+%+jUUT1T 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 } + QVariant statusCodeVariant = m_currentDownload->attribute(QNetworkRequest::HttpStatusCodeAttribute); + if (statusCodeVariant.isValid()) { + int statusCode = statusCodeVariant.toInt(); + qDebug() << "HTTP Status Code:" << statusCode; + } + bool success = !m_currentDownload->error(); QString message = success ? additionalobj : m_currentDownload->errorString(); diff --git a/MyGlobals/GlobalVars.qml b/MyGlobals/GlobalVars.qml index 34dae80..2122cb9 100644 --- a/MyGlobals/GlobalVars.qml +++ b/MyGlobals/GlobalVars.qml @@ -6,7 +6,7 @@ import QmlTool 1.0 QtObject { //是否处于开发模式 property bool devModel : false - property string tool_version:"1.9" + property string tool_version:"2.0" property var all_Version : null @@ -29,7 +29,7 @@ QtObject { property var serverConsoleWindow: null //客户端Token - property string token: "Bearer eyJhbGciOiJIUzI1NiJ9.eyJhdXRob3JpdGllcyI6WyJST0xFX0FMTCJdLCJ1c2VybmFtZSI6IjEyMyIsInN1YiI6IjEyMyIsImlhdCI6MTc0NDkwMTYwMiwiZXhwIjoxNzUyMTAxNjAyfQ.SlJxDukrOV4QbHXn0EBXLQhk8kEC2R0Ka431AGgWEe8" + property string token: "" //活跃人数 property string active_count : "666" //服务器插件项目 @@ -87,10 +87,9 @@ QtObject { xhr.onreadystatechange = function() { if (xhr.readyState === XMLHttpRequest.DONE) { if (xhr.status === 200) { - // console.log(xhr.responseText) callback(null, JSON.parse(xhr.responseText)) } else { - // console.log(xhr.responseText) + console.log(xhr.status) callback(new Error("请求失败,状态码: " + xhr.status), xhr.responseText) } } diff --git a/Page/Page_Home.qml b/Page/Page_Home.qml index 012c156..4b7318a 100644 --- a/Page/Page_Home.qml +++ b/Page/Page_Home.qml @@ -1,6 +1,6 @@ import QtQuick 2.15 import QtQuick.Window 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 import SSHManager 1.0 @@ -26,12 +26,12 @@ Item { var component = Qt.createComponent("Window_DownloadQuest.qml"); var windowbuf = component.createObject(parent); - // 绑定关闭时 - windowbuf.closing.connect(function() { - windowbuf.close.accepted = false // 阻止默认关闭行为 - windowbuf.width = 799 - windowbuf.hide() // 隐藏窗口 - }) + // // 绑定关闭时 + // windowbuf.closing.connect(function() { + // windowbuf.close.accepted = false // 阻止默认关闭行为 + // windowbuf.width = 799 + // windowbuf.hide() // 隐藏窗口 + // }) pageLoader.source = "Tab_home.qml" @@ -50,7 +50,7 @@ Item { port:obj.port, user:obj.userName, passwd:obj.password, - iconSource: DelIcon.HomeOutlined + iconSource: HusIcon.HomeOutlined } arrbuf.push(buf); } @@ -71,14 +71,14 @@ Item { width: 220 height: parent.height color: "transparent" - DelMenu { + HusMenu { id: menu anchors.fill: parent // showEdge: true initModel: [ { label: qsTr("首页"), - iconSource: DelIcon.HomeOutlined, + iconSource: HusIcon.HomeOutlined, source:"Tab_home.qml" }, { @@ -86,31 +86,31 @@ Item { }, { label: qsTr("我的服务器"), - iconSource: DelIcon.CloudServerOutlined, + iconSource: HusIcon.CloudServerOutlined, }, { label: qsTr("插件市场(服务端)"), - iconSource: DelIcon.ShopOutlined, + iconSource: HusIcon.ShopOutlined, source:"Tab_shop.qml" }, { label: qsTr("插件市场(双端)"), - iconSource: DelIcon.ShopOutlined, + iconSource: HusIcon.ShopOutlined, source:"Tab_shopex.qml" }, { label: qsTr("个人中心"), - iconSource: DelIcon.ProductOutlined, + iconSource: HusIcon.ProductOutlined, source:"Tab_personal.qml" }, { label: qsTr("更新日志"), - iconSource: DelIcon.ClockCircleOutlined, + iconSource: HusIcon.ClockCircleOutlined, source:"Tab_update.qml" }, { label: qsTr("关于(赞助请看这里)"), - iconSource: DelIcon.InfoCircleOutlined, + iconSource: HusIcon.InfoCircleOutlined, source:"Tab_about.qml" } ] diff --git a/Page/Page_Login.qml b/Page/Page_Login.qml index 486fc9f..72b199c 100644 --- a/Page/Page_Login.qml +++ b/Page/Page_Login.qml @@ -1,7 +1,7 @@ import QtQuick 2.15 import QtQuick.Window 2.15 import Qt.labs.settings 1.1 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 Item { @@ -72,11 +72,11 @@ Item { text: qsTr("登录您的DP-S账号") anchors.horizontalCenter: parent.horizontalCenter font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase } - DelInput { + HusInput { id: userInput width: 280 selectByMouse:true @@ -86,7 +86,7 @@ Item { onTextChanged: username = text } - DelInput { + HusInput { id: pwdInput width: 280 text :password @@ -96,7 +96,7 @@ Item { onTextChanged: password = text } - DelInput { + HusInput { id: qqInput visible: false width: 280 @@ -105,18 +105,18 @@ Item { placeholderText: qsTr("安全口令") anchors.horizontalCenter: parent.horizontalCenter onTextChanged: bindqq = text - DelToolTip { + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("请牢记自己设置的安全口令,并注意不要泄露") - position: DelToolTip.Position_Top + position: HusToolTip.Position_Top } } Row{ anchors.horizontalCenter: parent.horizontalCenter spacing: 15 - DelButton { + HusButton { width:100 text: { switch(mode){ @@ -140,7 +140,7 @@ Item { } height: 35 - type: DelButton.Type_Primary + type: HusButton.Type_Primary onClicked: { switch(mode){ case 0: @@ -154,22 +154,22 @@ Item { } } - DelButton { + HusButton { id:savecode width:120 text: "强制更改密码" colorBg:"#dd2c2c" height: 35 visible: false - type: DelButton.Type_Primary + type: HusButton.Type_Primary onClicked: { } - DelToolTip { + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("可使用注册时的安全口令强制更改密码") - position: DelToolTip.Position_Right + position: HusToolTip.Position_Right } } } @@ -223,17 +223,17 @@ Item { } anchors.verticalCenter: parent.verticalCenter - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family:HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase } - DelButton { + HusButton { text:{ if(mode === 0)return qsTr("点击注册") else if(mode === 1)return qsTr("点击登录") } height: 35 - type: DelButton.Type_Link + type: HusButton.Type_Link onClicked: { if(mode === 0)mode = 1 else if(mode === 1)mode = 0 @@ -242,7 +242,7 @@ Item { } - DelSelect { + HusSelect { id:network_line anchors.bottom: parent.bottom anchors.bottomMargin: 20 diff --git a/Page/Tab_about.qml b/Page/Tab_about.qml index f9f7fa2..b88bc67 100644 --- a/Page/Tab_about.qml +++ b/Page/Tab_about.qml @@ -2,7 +2,7 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 Item { @@ -40,7 +40,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true color: "transparent" - border.color: DelTheme.isDark ? DelTheme.DelCollapse.colorBorderDark : DelTheme.DelCollapse.colorBorder + border.color: HusTheme.isDark ? HusTheme.HusCollapse.colorBorderDark : HusTheme.HusCollapse.colorBorder border.width: 1 radius: 8 @@ -51,36 +51,36 @@ Item { Text{ font.pixelSize: 32 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text:"DP-S客户端插件管理工具" } Text{ font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text:"作者: 倾泪寒" } Text{ font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text:"联系QQ:947330670" } Text{ font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text:"开发文档:" } Text { font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text: "https://dps-doc.senzo.online" textFormat: Text.RichText onLinkActivated: (url) => Qt.openUrlExternally(url) @@ -94,15 +94,15 @@ Item { Text{ font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text:"QQ交流群:" } Text { font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase text: "点击链接加入群聊【DP-S插件】" textFormat: Text.RichText onLinkActivated: (url) => Qt.openUrlExternally(url) @@ -117,8 +117,8 @@ Item { Text{ text:"捐赠:" font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase } Image{ diff --git a/Page/Tab_home.qml b/Page/Tab_home.qml index 6e5d544..70f11a5 100644 --- a/Page/Tab_home.qml +++ b/Page/Tab_home.qml @@ -2,7 +2,7 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import "../MyGlobals" 1.0 import "../Component" @@ -33,14 +33,14 @@ Item { popup.open() } - DelPopup { + HusPopup { id: popup x: (parent.width - width) * 0.5 y: (parent.height - height) * 0.5 width: 800 height: 660 parent: Overlay.overlay - closePolicy: DelPopup.NoAutoClose + closePolicy: HusPopup.NoAutoClose movable: true resizable: true minimumX: 0 @@ -80,9 +80,9 @@ Item { wrapMode: Text.WordWrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase text:"dps管理工具使用申明及免责条款 重要提示: @@ -151,13 +151,13 @@ Item { } - DelButton { + HusButton { anchors.bottom: parent.bottom anchors.right: parent.right height: 30 radiusBg: popup.radiusBg * 0.5 text: qsTr("我同意") - type: DelButton.Type_Primary + type: HusButton.Type_Primary onClicked: popup.close(); } @@ -169,7 +169,7 @@ Item { anchors.right: parent.right anchors.margins: 15 height: 400 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" radius:8 diff --git a/Page/Tab_personal.qml b/Page/Tab_personal.qml index 660e120..354ce73 100644 --- a/Page/Tab_personal.qml +++ b/Page/Tab_personal.qml @@ -3,7 +3,7 @@ import QtQuick.Window 2.15 import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 import QmlTool 1.0 import "../Component" 1.0 @@ -157,18 +157,18 @@ Item { anchors.rightMargin: 15 height: 50 radius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" // 头像部分 - DelAvatar { + HusAvatar { id: avatarImg size:parent.height * 0.65 anchors.left: top_rect.left anchors.leftMargin: 20 anchors.verticalCenter: parent.verticalCenter - iconSource: DelIcon.UserOutlined + iconSource: HusIcon.UserOutlined } //用户名 @@ -180,49 +180,49 @@ Item { text: user_name font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } - DelButton { + HusButton { anchors.right: lxkf.left anchors.rightMargin: 2 anchors.verticalCenter: parent.verticalCenter - type: DelButton.Type_Link + type: HusButton.Type_Link text: qsTr(`关于贡献点`) - DelToolTip { + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("扫描赞助码赞助时备注DPS管理工具账号即可(如果长时间未增加贡献点可联系客服)") - position: DelToolTip.Position_Left + position: HusToolTip.Position_Left } } - DelButton { + HusButton { id:lxkf anchors.right: change_zl.left anchors.rightMargin: 2 anchors.verticalCenter: parent.verticalCenter - type: DelButton.Type_Link + type: HusButton.Type_Link text: qsTr(`联系客服`) onClicked: { Qt.openUrlExternally("tencent://message/?uin=1713381454") } - DelToolTip { + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("如无法跳转QQ链接,可手动添加客服QQ:1713381454") - position: DelToolTip.Position_Top + position: HusToolTip.Position_Top } } - DelButton { + HusButton { id:change_zl anchors.right: top_rect.right anchors.rightMargin: 10 anchors.verticalCenter: parent.verticalCenter - type: DelButton.Type_Link + type: HusButton.Type_Link text: qsTr(`修改资料`) onClicked: { GlobalVars.msg_control.warning('暂未开放此功能'); @@ -240,7 +240,7 @@ Item { anchors.bottom:bottom_rect.top anchors.topMargin: 10 anchors.top:top_rect.bottom - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" radius: 8 @@ -256,14 +256,14 @@ Item { width:(parent.width) / 3 - 14 height: parent.height*0.8 anchors.verticalCenter: parent.verticalCenter - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark content: Item { anchors.fill:parent - DelIconButton { + HusIconButton { id:points_icon - type: DelButton.Type_Primary - iconSource: DelIcon.CreditCardOutlined + type: HusButton.Type_Primary + iconSource: HusIcon.CreditCardOutlined iconSize: 54 anchors.top:parent.top anchors.topMargin: 20 @@ -275,9 +275,9 @@ Item { text: "贡献点: " + user_points font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight anchors.top:points_icon.bottom anchors.topMargin: 20 @@ -292,14 +292,14 @@ Item { width:(parent.width) / 3 - 14 height: parent.height*0.8 anchors.verticalCenter: parent.verticalCenter - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark content: Item { anchors.fill:parent - DelIconButton { + HusIconButton { id:vip_icon - type: DelButton.Type_Primary - iconSource: DelIcon.SketchOutlined + type: HusButton.Type_Primary + iconSource: HusIcon.SketchOutlined iconSize: 54 anchors.top:parent.top anchors.topMargin: 20 @@ -311,9 +311,9 @@ Item { text: "VIP等级: " + user_level font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight anchors.top:vip_icon.bottom anchors.topMargin: 20 @@ -327,13 +327,13 @@ Item { width:(parent.width) / 3 - 14 height: parent.height*0.8 anchors.verticalCenter: parent.verticalCenter - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark content: Item { anchors.fill:parent - DelIconButton { + HusIconButton { id:cash_icon - type: DelButton.Type_Primary - iconSource:DelIcon.WalletOutlined + type: HusButton.Type_Primary + iconSource:HusIcon.WalletOutlined iconSize: 54 anchors.top:parent.top anchors.topMargin: 20 @@ -345,9 +345,9 @@ Item { text: "暂无代金券" font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight anchors.top:cash_icon.bottom anchors.topMargin: 20 @@ -367,7 +367,7 @@ Item { anchors.rightMargin: 15 anchors.bottomMargin: 15 anchors.bottom:parent.bottom - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" radius: 8 @@ -391,14 +391,14 @@ Item { text: "我的服务器" font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } - DelButton { - type: DelButton.Type_Link + HusButton { + type: HusButton.Type_Link text: qsTr(`新增服务器`) anchors.right: parent.right anchors.rightMargin: 6 @@ -409,7 +409,7 @@ Item { } } - DelTableView { + HusTableView { width: parent.width height: parent.height - serverlist_header.height - 1 rowHeaderVisible: false @@ -471,11 +471,11 @@ Item { leftPadding: 8 rightPadding: 8 font { - family: DelTheme.Primary.fontPrimaryFamily - pixelSize: DelTheme.Primary.fontPrimarySize + family: HusTheme.Primary.fontPrimaryFamily + pixelSize: HusTheme.Primary.fontPrimarySize } text: cellData - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase horizontalAlignment: Text.AlignHCenter verticalAlignment: Text.AlignVCenter @@ -524,7 +524,7 @@ Item { anchors.verticalCenter: parent.verticalCenter spacing: 6 - DelTag { + HusTag { visible: cellData != -1 text: { switch(cellData) @@ -567,24 +567,24 @@ Item { anchors.horizontalCenter: parent.horizontalCenter spacing: 4 - DelButton { - type: DelButton.Type_Link + HusButton { + type: HusButton.Type_Link text: qsTr(`测试`) onClicked: { if (!addServerWindow) testConnect(cellData) } } - DelButton { - type: DelButton.Type_Link + HusButton { + type: HusButton.Type_Link text: qsTr(`修改`) onClicked: { if (!addServerWindow) openAddServerWindow(cellData) } } - DelButton { - type: DelButton.Type_Link + HusButton { + type: HusButton.Type_Link text: qsTr(`删除`) onClicked: { if (!addServerWindow) { diff --git a/Page/Tab_server.qml b/Page/Tab_server.qml index 16b1389..20c1355 100644 --- a/Page/Tab_server.qml +++ b/Page/Tab_server.qml @@ -4,7 +4,7 @@ import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 import QtQuick.Dialogs 1.3 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import SSHManager 1.0 import FileTransfer 1.0 @@ -270,10 +270,10 @@ Item { anchors.centerIn: parent font { pixelSize: 24 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } // 新增:服务器信息区域 @@ -283,7 +283,7 @@ Item { anchors.fill: parent color:"transparent" - DelRectangle{ + HusRectangle{ id: top_rect anchors { top: parent.top @@ -296,7 +296,7 @@ Item { height: 50 topLeftRadius: 8 topRightRadius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" @@ -309,10 +309,10 @@ Item { text: "服务器IP:" font { pixelSize: 22 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } //用户名 @@ -324,15 +324,15 @@ Item { text: server_ip font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } - DelButton { + HusButton { text: qsTr("查看我的服务器插件") - type: DelButton.Type_Text + type: HusButton.Type_Text anchors.right: parent.right anchors.rightMargin: 10 anchors.verticalCenter: parent.verticalCenter @@ -357,7 +357,7 @@ Item { } // 服务器信息卡片 - DelRectangle { + HusRectangle { id:server_info anchors { top: top_rect.bottom @@ -371,14 +371,14 @@ Item { bottomLeftRadius: 8 bottomRightRadius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 antialiasing: true - DelButton { + HusButton { id:download_clientplugins text: qsTr("下载双端插件包") - type: DelButton.Type_Text + type: HusButton.Type_Text anchors.right: parent.right anchors.rightMargin: 10 anchors.bottom:parent.bottom @@ -388,12 +388,12 @@ Item { fileDialog.open() } - DelToolTip { + HusToolTip { x: 0 visible: parent.hovered arrowVisible: true text: qsTr("使用双端插件才需要安装,仅使用dps服务端插件不需要安装!") - position: DelToolTip.Position_Top + position: HusToolTip.Position_Top } } // DelButton { @@ -427,9 +427,9 @@ Item { text: "DP-S插件状态: " font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary } Text { id:state_label_javap @@ -440,9 +440,9 @@ Item { text: "JAVA插件状态: " font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary } Text { id:state_label_java @@ -453,9 +453,9 @@ Item { text: "JAVA版本状态: " font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary } @@ -493,7 +493,7 @@ Item { } - DelTag { + HusTag { id:dps_tag anchors.left: state_label_dps.right anchors.leftMargin: 6 @@ -504,7 +504,7 @@ Item { presetColor: dps_version_ready === "noinstall" ? "red" : "green" } - DelTag { + HusTag { anchors.left: state_label_javap.right anchors.leftMargin: 6 anchors.top: state_label_javap.top @@ -514,7 +514,7 @@ Item { presetColor: java_p_version_ready === "noinstall" ? "red" : "green" } - DelTag { + HusTag { anchors.left: state_label_java.right anchors.leftMargin: 6 anchors.top: state_label_java.top @@ -525,7 +525,7 @@ Item { } - DelIconButton { + HusIconButton { id:dps_install anchors.left: plugins_group.left anchors.leftMargin: 200 @@ -533,7 +533,7 @@ Item { anchors.topMargin: 5 visible: dpsInstallationFlag === 2 ? false : true text: dpsInstallationFlag === 1 ? "更新DP-S插件" : "安装DP-S插件" - type: DelButton.Type_Text + type: HusButton.Type_Text onClicked: { FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download/all", "download/dp_s.tar",{key : "dps"},"dps") visible = false; @@ -551,7 +551,7 @@ Item { } - DelIconButton { + HusIconButton { id:javap_install anchors.left: plugins_group.left anchors.leftMargin: 200 @@ -559,7 +559,7 @@ Item { anchors.topMargin: 32 visible: javapInstallationFlag === 2 ? false : true text: javapInstallationFlag === 1 ? "更新JAVA插件" : "安装JAVA插件" - type: DelButton.Type_Text + type: HusButton.Type_Text onClicked: { FileTransfer.postDownload(GlobalVars.server_url + "/rindro/download/all", "download/RT.tar.gz",{key : "javap"},"javap") visible = false; @@ -576,7 +576,7 @@ Item { visible: false } - DelIconButton { + HusIconButton { id:java_install anchors.left: plugins_group.left anchors.leftMargin: 200 @@ -584,7 +584,7 @@ Item { anchors.topMargin: 59 visible: javaInstallationFlag === 0 ? true : false text: "安装JAVA" - type: DelButton.Type_Text + type: HusButton.Type_Text onClicked: { SSHManager.sendInput("yum install -y java") SSHManager.sendInput("echo -e \"\\033[32mJAVA安装成功\\033[0m\"") @@ -612,7 +612,7 @@ Item { anchors.bottom: parent.bottom anchors.margins: 10 radius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" diff --git a/Page/Tab_shop.qml b/Page/Tab_shop.qml index f7db1fb..71d98b5 100644 --- a/Page/Tab_shop.qml +++ b/Page/Tab_shop.qml @@ -4,7 +4,7 @@ import QtQuick.Controls 2.15 import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 import QmlTool 1.0 import "../Component" 1.0 @@ -76,10 +76,10 @@ Item { height: 80 color:"transparent" radius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 - DelIconText { + HusIconText { id:server_label anchors.left: parent.left anchors.leftMargin: 10 @@ -88,11 +88,11 @@ Item { text:"选择要安装插件的服务器:" font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } } - DelSelect { + HusSelect { id:server_select anchors.left: server_label.right anchors.leftMargin: 10 @@ -114,50 +114,50 @@ Item { ButtonGroup { id: radioGroup } - DelRadio { + HusRadio { text: qsTr("索引插件名") ButtonGroup.group: radioGroup checked:true onCheckedChanged: {searchMode = 0} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top iconSize: 24 - iconSource: DelIcon.ReadOutlined + iconSource: HusIcon.ReadOutlined } } - DelRadio { + HusRadio { text: qsTr("索引作者名") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 1} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 - iconSource: DelIcon.TeamOutlined + iconSource: HusIcon.TeamOutlined } } - DelRadio { + HusRadio { text: qsTr("索引描述内容") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 2} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 - iconSource: DelIcon.ProfileOutlined + iconSource: HusIcon.ProfileOutlined } } } - DelAutoComplete { + HusAutoComplete { anchors.right: search_rect.right anchors.rightMargin: 10 anchors.verticalCenter: search_rect.verticalCenter @@ -166,7 +166,8 @@ Item { tooltipVisible: true placeholderText: qsTr("输入插件名以查找插件") selectByMouse: true - clearIconSource: DelIcon.CloseSquareFilled + clearEnabled:true + iconSource: HusIcon.CloseSquareFilled onSearch: function(input) { if (!input) { options = []; @@ -240,7 +241,7 @@ Item { anchors.centerIn: parent // 在格子容器中居中 width: parent.width - 24 // 改用相对尺寸 height: parent.height - 24 - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark onClicked:function(){ if (!pluginInfoWidow) { // 创建新窗口 @@ -272,10 +273,10 @@ Item { text: model.ProjectName font { pixelSize: 24 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } @@ -289,10 +290,10 @@ Item { text: "作者:" + model.ProjectAuthor font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } } @@ -304,9 +305,9 @@ Item { maximumLineCount: 2 font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary elide: Text.ElideRight } diff --git a/Page/Tab_shopex.qml b/Page/Tab_shopex.qml index af81ecb..f1d0a24 100644 --- a/Page/Tab_shopex.qml +++ b/Page/Tab_shopex.qml @@ -4,7 +4,7 @@ import QtQuick.Controls 2.15 import QtGraphicalEffects 1.15 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 import QmlTool 1.0 import "../Component" 1.0 @@ -76,10 +76,10 @@ Item { height: 80 color:"transparent" radius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 - DelIconText { + HusIconText { id:server_label anchors.left: parent.left anchors.leftMargin: 10 @@ -88,11 +88,11 @@ Item { text:"选择要安装插件的服务器:" font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } } - DelSelect { + HusSelect { id:server_select anchors.left: server_label.right anchors.leftMargin: 10 @@ -114,50 +114,50 @@ Item { ButtonGroup { id: radioGroup } - DelRadio { + HusRadio { text: qsTr("索引插件名") ButtonGroup.group: radioGroup checked:true onCheckedChanged: {searchMode = 0} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top iconSize: 24 - iconSource: DelIcon.ReadOutlined + iconSource: HusIcon.ReadOutlined } } - DelRadio { + HusRadio { text: qsTr("索引作者名") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 1} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 - iconSource: DelIcon.TeamOutlined + iconSource: HusIcon.TeamOutlined } } - DelRadio { + HusRadio { text: qsTr("索引描述内容") ButtonGroup.group: radioGroup onCheckedChanged: {searchMode = 2} - DelIconText { + HusIconText { anchors.left: parent.right anchors.leftMargin: 2 anchors.top: parent.top anchors.topMargin: -2 iconSize: 24 - iconSource: DelIcon.ProfileOutlined + iconSource: HusIcon.ProfileOutlined } } } - DelAutoComplete { + HusAutoComplete { anchors.right: search_rect.right anchors.rightMargin: 10 anchors.verticalCenter: search_rect.verticalCenter @@ -166,7 +166,8 @@ Item { tooltipVisible: true placeholderText: qsTr("输入插件名以查找插件") selectByMouse: true - clearIconSource: DelIcon.CloseSquareFilled + clearEnabled:true + iconSource: HusIcon.CloseSquareFilled onSearch: function(input) { if (!input) { options = []; @@ -240,7 +241,7 @@ Item { anchors.centerIn: parent // 在格子容器中居中 width: parent.width - 24 // 改用相对尺寸 height: parent.height - 24 - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark onClicked:function(){ if (!pluginInfoWidow) { // 创建新窗口 @@ -272,10 +273,10 @@ Item { text: model.ProjectName font { pixelSize: 24 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } @@ -289,10 +290,10 @@ Item { text: "作者:" + model.ProjectAuthor font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } } @@ -304,9 +305,9 @@ Item { maximumLineCount: 2 font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary elide: Text.ElideRight } @@ -314,7 +315,7 @@ Item { Layout.fillWidth: true Layout.fillHeight: true height:300 - DelRectangle { + HusRectangle { id: imageContainer anchors.fill: parent radius: 6 diff --git a/Page/Tab_update.qml b/Page/Tab_update.qml index 21cf9f8..8979eae 100644 --- a/Page/Tab_update.qml +++ b/Page/Tab_update.qml @@ -2,7 +2,7 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "../MyGlobals" 1.0 Item { @@ -14,7 +14,7 @@ Item { anchors.margins: 15 anchors.bottomMargin: 45 color: "transparent" - border.color: DelTheme.isDark ? DelTheme.DelCollapse.colorBorderDark : DelTheme.DelCollapse.colorBorder + border.color: HusTheme.isDark ? HusTheme.HusCollapse.colorBorderDark : HusTheme.HusCollapse.colorBorder border.width: 1 radius: 8 @@ -29,11 +29,11 @@ Item { width: parent.width spacing: 10 - DelTimeline { + HusTimeline { id: reverseTimeline width: parent.width height: snik.height - mode: DelTimeline.Mode_Left + mode: HusTimeline.Mode_Left initModel: [ { time: new Date(2025, 2, 21), diff --git a/Page/Window_AddServer.qml b/Page/Window_AddServer.qml index c5af401..2b8c01f 100644 --- a/Page/Window_AddServer.qml +++ b/Page/Window_AddServer.qml @@ -1,11 +1,11 @@ import QtQuick 2.15 import QtQuick.Window 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import SSHManager 1.0 import "../MyGlobals" 1.0 import "../Component" -DelWindow { +HusWindow { id:addsw width: 560 height: 580 @@ -107,12 +107,12 @@ DelWindow { Text { text: qsTr("登记您的服务器信息") font.pixelSize: 20 - font.family: DelTheme.Primary.fontPrimaryFamily - color:DelTheme.Primary.colorTextBase + font.family: HusTheme.Primary.fontPrimaryFamily + color:HusTheme.Primary.colorTextBase } } - DelInput { + HusInput { id: ipField readOnly: addsw.state === 1 ? true : false placeholderText: qsTr("请输入 IP 地址") @@ -120,24 +120,24 @@ DelWindow { anchors.horizontalCenter: parent.horizontalCenter text: serverIP onTextChanged: serverIP = text - iconPosition: DelInput.Position_Left - iconSource: DelIcon.HddOutlined - DelToolTip { + iconPosition: HusInput.Position_Left + iconSource: HusIcon.HddOutlined + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("请输入 IP 地址") - position: DelToolTip.Position_Right + position: HusToolTip.Position_Right } } - DelInput { + HusInput { id: portField readOnly: addsw.state === 1 ? true : false placeholderText: qsTr("请输入端口号") width: parent.width * 0.6 anchors.horizontalCenter: parent.horizontalCenter - iconPosition: DelInput.Position_Left - iconSource: DelIcon.GoldOutlined + iconPosition: HusInput.Position_Left + iconSource: HusIcon.GoldOutlined validator: IntValidator { bottom: 0 top: 65535 @@ -150,15 +150,15 @@ DelWindow { serverPort = 0 } } - DelToolTip { + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("请输入端口号") - position: DelToolTip.Position_Right + position: HusToolTip.Position_Right } } - DelInput { + HusInput { id: usernameField readOnly: addsw.state === 1 ? true : false placeholderText: qsTr("请输入服务器用户名") @@ -166,17 +166,17 @@ DelWindow { anchors.horizontalCenter: parent.horizontalCenter text: serverUsername onTextChanged: serverUsername = text - iconPosition: DelInput.Position_Left - iconSource: DelIcon.UserOutlined - DelToolTip { + iconPosition: HusInput.Position_Left + iconSource: HusIcon.UserOutlined + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("请输入服务器用户名") - position: DelToolTip.Position_Right + position: HusToolTip.Position_Right } } - DelInput { + HusInput { id: passwordField readOnly: addsw.state === 1 ? true : false placeholderText: qsTr("请输入服务器密码") @@ -184,20 +184,20 @@ DelWindow { anchors.horizontalCenter: parent.horizontalCenter text: serverPassword onTextChanged: serverPassword = text - iconPosition: DelInput.Position_Left - iconSource: DelIcon.LockFilled - DelToolTip { + iconPosition: HusInput.Position_Left + iconSource: HusIcon.LockFilled + HusToolTip { visible: parent.hovered arrowVisible: true text: qsTr("请输入服务器密码") - position: DelToolTip.Position_Right + position: HusToolTip.Position_Right } } - DelButton { + HusButton { visible: addsw.state === 0 ? true : false anchors.horizontalCenter: parent.horizontalCenter - type: DelButton.Type_Primary + type: HusButton.Type_Primary text: { switch(mode){ case 0 :return qsTr("添加"); @@ -237,7 +237,7 @@ DelWindow { anchors.bottom: parent.bottom anchors.margins: 10 radius: 8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 color:"transparent" diff --git a/Page/Window_DownloadQuest.qml b/Page/Window_DownloadQuest.qml index 308a500..bfd7049 100644 --- a/Page/Window_DownloadQuest.qml +++ b/Page/Window_DownloadQuest.qml @@ -3,7 +3,7 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Layouts 1.15 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import Qt.labs.platform 1.1 // 系统托盘支持 import FileTransfer 1.0 @@ -150,7 +150,7 @@ DelWindow { anchors.margins: 15 color:"transparent" radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 3 // 任务列表 @@ -163,7 +163,7 @@ DelWindow { model: downloadModel clip: true - delegate: DownloadItemDelegate { + delegate: DownloadItemHusegate { width: listView.width } } diff --git a/Page/Window_ExPluginInfo_Goods.qml b/Page/Window_ExPluginInfo_Goods.qml index 32e0f64..393a99a 100644 --- a/Page/Window_ExPluginInfo_Goods.qml +++ b/Page/Window_ExPluginInfo_Goods.qml @@ -2,13 +2,13 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import FileTransfer 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 -DelWindow { +HusWindow { id:plugininfo_goods width: 1110 height: 630 @@ -106,7 +106,7 @@ DelWindow { anchors.topMargin: 45 height:78 + headerdiv.height + description.height radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" @@ -122,7 +122,7 @@ DelWindow { } - DelDivider { + HusDivider { id:headerdiv anchors.top: logo.bottom anchors.left: parent.left @@ -143,9 +143,9 @@ DelWindow { wrapMode: Text.WordWrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } Text { @@ -157,9 +157,9 @@ DelWindow { text: p_name font { pixelSize: 20 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } @@ -171,12 +171,12 @@ DelWindow { text: "作者: " + p_author font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } - DelTag { + HusTag { id:version_tag anchors.left: pluginname.right anchors.leftMargin: 15 @@ -186,7 +186,7 @@ DelWindow { presetColor:"green" } - DelTag { + HusTag { id:price_tag anchors.top: parent.top anchors.topMargin: 15 @@ -196,7 +196,7 @@ DelWindow { presetColor:"green" } - DelButton { + HusButton { id:buy_button anchors.right: parent.right anchors.rightMargin: 10 @@ -222,7 +222,7 @@ DelWindow { anchors.bottom:parent.bottom anchors.bottomMargin: 10 radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" clip: true @@ -270,9 +270,9 @@ DelWindow { wrapMode: Text.Wrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } } @@ -483,7 +483,7 @@ DelWindow { visible: true z: 2 // 确保控制按钮在最上层 - DelButton { + HusButton { id: playPauseButton text: videoPlayer.playbackState === MediaPlayer.PlayingState ? "暂停" : "播放" onClicked: { @@ -494,13 +494,13 @@ DelWindow { } } - DelButton { + HusButton { id: muteButton text: videoPlayer.muted ? "取消静音" : "静音" onClicked: videoPlayer.muted = !videoPlayer.muted } - DelButton { + HusButton { id: replayButton text: "重播" onClicked: { @@ -509,7 +509,7 @@ DelWindow { } } - DelButton { + HusButton { text: "外部浏览器打开" onClicked: { Qt.openUrlExternally(GlobalVars.server_url + "/api/videos/" + p_name + "/" + itemData.index) diff --git a/Page/Window_ExPluginInfo_Private.qml b/Page/Window_ExPluginInfo_Private.qml index 92b97ca..638e869 100644 --- a/Page/Window_ExPluginInfo_Private.qml +++ b/Page/Window_ExPluginInfo_Private.qml @@ -3,14 +3,14 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtQuick.Dialogs 1.3 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import FileTransfer 1.0 import SSHManager 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 -DelWindow { +HusWindow { id:plugininfo_goods width: 890 height: 630 @@ -148,7 +148,7 @@ DelWindow { anchors.topMargin: 45 height:78 + headerdiv.height + description.height radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" @@ -164,7 +164,7 @@ DelWindow { } - DelDivider { + HusDivider { id:headerdiv anchors.top: logo.bottom anchors.left: parent.left @@ -185,9 +185,9 @@ DelWindow { wrapMode: Text.WordWrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } Text { @@ -199,9 +199,9 @@ DelWindow { text: p_name font { pixelSize: 20 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } @@ -213,12 +213,12 @@ DelWindow { text: "作者: " + p_author font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } - DelTag { + HusTag { id:version_tag anchors.left: pluginname.right anchors.leftMargin: 15 @@ -228,7 +228,7 @@ DelWindow { presetColor:"green" } - DelTag { + HusTag { id:endTime_tag anchors.left: version_tag.right anchors.leftMargin: 15 @@ -238,7 +238,7 @@ DelWindow { presetColor:"geekblue" } - DelSwitch { + HusSwitch { id:plugins_check anchors.right: parent.right anchors.rightMargin: 10 @@ -252,7 +252,7 @@ DelWindow { } - DelButton { + HusButton { id:delete_button visible: true anchors.right: parent.right @@ -280,7 +280,7 @@ DelWindow { anchors.bottom:parent.bottom anchors.bottomMargin: 10 radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" clip: true @@ -328,9 +328,9 @@ DelWindow { wrapMode: Text.Wrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } } @@ -388,12 +388,12 @@ DelWindow { anchors.horizontalCenter: parent.horizontalCenter spacing: 10 - DelButton { + HusButton { text: videoPlayer.playbackState === MediaPlayer.PlayingState ? "暂停" : "播放" onClicked: videoPlayer.playbackState === MediaPlayer.PlayingState ? videoPlayer.pause() : videoPlayer.play() } - DelButton { + HusButton { text: "静音" onClicked: videoPlayer.muted = !videoPlayer.muted } diff --git a/Page/Window_PluginInfo_Goods.qml b/Page/Window_PluginInfo_Goods.qml index 41e093e..72abbdf 100644 --- a/Page/Window_PluginInfo_Goods.qml +++ b/Page/Window_PluginInfo_Goods.qml @@ -2,13 +2,13 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import FileTransfer 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 -DelWindow { +HusWindow { id:plugininfo_goods width: 890 height: 630 @@ -124,7 +124,7 @@ DelWindow { anchors.topMargin: 45 height:78 + headerdiv.height + description.height radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" @@ -140,7 +140,7 @@ DelWindow { } - DelDivider { + HusDivider { id:headerdiv anchors.top: logo.bottom anchors.left: parent.left @@ -161,9 +161,9 @@ DelWindow { wrapMode: Text.WordWrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } Text { @@ -175,9 +175,9 @@ DelWindow { text: p_name font { pixelSize: 20 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } @@ -189,12 +189,12 @@ DelWindow { text: "作者: " + p_author font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } - DelTag { + HusTag { id:version_tag anchors.left: pluginname.right anchors.leftMargin: 15 @@ -204,7 +204,7 @@ DelWindow { presetColor:"green" } - DelTag { + HusTag { id:price_tag anchors.top: parent.top anchors.topMargin: 15 @@ -214,7 +214,7 @@ DelWindow { presetColor:"green" } - DelButton { + HusButton { id:buy_button anchors.right: parent.right anchors.rightMargin: 10 @@ -241,7 +241,7 @@ DelWindow { anchors.bottom:parent.bottom anchors.bottomMargin: 10 radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" clip: true @@ -289,9 +289,9 @@ DelWindow { wrapMode: Text.Wrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } } @@ -349,12 +349,12 @@ DelWindow { anchors.horizontalCenter: parent.horizontalCenter spacing: 10 - DelButton { + HusButton { text: videoPlayer.playbackState === MediaPlayer.PlayingState ? "暂停" : "播放" onClicked: videoPlayer.playbackState === MediaPlayer.PlayingState ? videoPlayer.pause() : videoPlayer.play() } - DelButton { + HusButton { text: "静音" onClicked: videoPlayer.muted = !videoPlayer.muted } diff --git a/Page/Window_PluginInfo_Private.qml b/Page/Window_PluginInfo_Private.qml index 26f88ea..9ba4aec 100644 --- a/Page/Window_PluginInfo_Private.qml +++ b/Page/Window_PluginInfo_Private.qml @@ -2,14 +2,14 @@ import QtQuick.Window 2.15 import QtQuick.Controls 2.15 import QtMultimedia 5.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import QmlTool 1.0 import FileTransfer 1.0 import SSHManager 1.0 import "../MyGlobals" 1.0 import "../Component" 1.0 -DelWindow { +HusWindow { id:plugininfo_goods width: 890 height: 630 @@ -108,7 +108,7 @@ DelWindow { if(config.newcontent){ model.push({ key: "1", - icon: DelIcon.CreditCardOutlined, + icon: HusIcon.CreditCardOutlined, title: "配置文件", config:config.newcontent }) @@ -116,7 +116,7 @@ DelWindow { if(config.oldcontent){ model.push({ key: "2", - icon: DelIcon.CreditCardOutlined, + icon: HusIcon.CreditCardOutlined, title: "配置文件(旧)", config:config.oldcontent }) @@ -177,7 +177,7 @@ DelWindow { anchors.topMargin: 45 height:78 + headerdiv.height + description.height radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" @@ -193,7 +193,7 @@ DelWindow { } - DelDivider { + HusDivider { id:headerdiv anchors.top: logo.bottom anchors.left: parent.left @@ -214,9 +214,9 @@ DelWindow { wrapMode: Text.WordWrap font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } Text { @@ -228,9 +228,9 @@ DelWindow { text: p_name font { pixelSize: 20 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } @@ -242,12 +242,12 @@ DelWindow { text: "作者: " + p_author font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase } - DelTag { + HusTag { id:version_tag anchors.left: pluginname.right anchors.leftMargin: 15 @@ -257,7 +257,7 @@ DelWindow { presetColor:"green" } - DelButton { + HusButton { id:update_button visible: false anchors.right: parent.right @@ -287,7 +287,7 @@ DelWindow { } } - DelButton { + HusButton { id:delete_button visible: true anchors.right: parent.right @@ -317,16 +317,16 @@ DelWindow { anchors.bottom:parent.bottom anchors.bottomMargin: 10 radius:8 - border.color: DelTheme.isDark ? "#23272e" : "#f0f4f7" + border.color: HusTheme.isDark ? "#23272e" : "#f0f4f7" border.width: 2 color:"transparent" clip: true - DelTabView { + HusTabView { id: configTabView visible: false anchors.fill: parent - tabSize: DelTabView.Size_Auto + tabSize: HusTabView.Size_Auto tabCentered: true addButtonDelegate:Item{} contentDelegate: Rectangle { diff --git a/Page/Window_ServerPlugins.qml b/Page/Window_ServerPlugins.qml index 091d907..28e6f8d 100644 --- a/Page/Window_ServerPlugins.qml +++ b/Page/Window_ServerPlugins.qml @@ -1,7 +1,7 @@ import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import SSHManager 1.0 import QtQuick.Shapes 1.15 import QtQuick.Layouts 1.15 @@ -9,7 +9,7 @@ import QtGraphicalEffects 1.15 import "../MyGlobals" 1.0 import "../Component" -DelWindow { +HusWindow { id:addsw width: 890 height: 630 @@ -117,11 +117,11 @@ DelWindow { - DelTabView { + HusTabView { id: defaultTabView anchors.fill: parent anchors.topMargin: 30 - tabSize: DelTabView.Size_Auto + tabSize: HusTabView.Size_Auto tabCentered: true addButtonDelegate:Item{} // 监听标签页变化 @@ -155,7 +155,7 @@ DelWindow { anchors.centerIn: parent // 在格子容器中居中 width: parent.width - 24 // 改用相对尺寸 height: parent.height - 24 - isDarkMode: DelTheme.isDark + isDarkMode: HusTheme.isDark onClicked:function(){ if (!pluginInfoWidow) { var Path = "Window_PluginInfo_Private.qml"; @@ -192,10 +192,10 @@ DelWindow { text: modelData.ProjectName font { pixelSize: 24 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } - color: DelTheme.Primary.colorTextBase + color: HusTheme.Primary.colorTextBase elide: Text.ElideRight } @@ -212,12 +212,12 @@ DelWindow { font { pixelSize: 16 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily bold: true } color: { if(modelData.needupdate === true)return "#32CD32"; - else return DelTheme.Primary.colorTextBase + else return HusTheme.Primary.colorTextBase } elide: Text.ElideRight @@ -231,9 +231,9 @@ DelWindow { maximumLineCount: 2 font { pixelSize: 14 - family: DelTheme.Primary.fontPrimaryFamily + family: HusTheme.Primary.fontPrimaryFamily } - color: DelTheme.Primary.colorTextSecondary + color: HusTheme.Primary.colorTextSecondary elide: Text.ElideRight } @@ -242,7 +242,7 @@ DelWindow { Layout.fillWidth: true Layout.fillHeight: true height:300 - DelRectangle { + HusRectangle { id: imageContainer anchors.fill: parent radius: 6 @@ -277,12 +277,12 @@ DelWindow { initModel: [ { key: "1", - icon: DelIcon.CreditCardOutlined, + icon: HusIcon.CreditCardOutlined, title: "服务端插件" }, { key: "2", - icon: DelIcon.CreditCardOutlined, + icon: HusIcon.CreditCardOutlined, title: "双端插件" } ] diff --git a/main.cpp b/main.cpp index c6dd995..65fa177 100644 --- a/main.cpp +++ b/main.cpp @@ -9,7 +9,7 @@ #include "sshmanager.h" #include "FileTransfer.h" #include "jsonhighlighter.h" -#include "delapp.h" +#include "HuskarUI/husapp.h" void runPowerShellCommandAsAdmin(const QString& command) { QString powershellCommand = QString("powershell -Command \"%1\"").arg(command); @@ -44,6 +44,10 @@ int main(int argc, char *argv[]) QQuickWindow::setDefaultAlphaBuffer(true); QGuiApplication app(argc, argv); + // 设置组织信息 + app.setOrganizationName("Yosin"); // 替换为你的组织名称 + app.setOrganizationDomain("dps-doc.senzo.online"); // 替换为你的组织域名 + app.setApplicationName("DPS后台管理工具"); // 替换为你的应用程序名称 // 注册 C++ 类到 QML qmlRegisterType("JsonEditor", 1, 0, "JsonHighlighter"); @@ -53,7 +57,7 @@ int main(int argc, char *argv[]) qmlRegisterSingletonInstance("FileTransfer", 1, 0, "FileTransfer", FileTransfer::instance()); QQmlApplicationEngine engine; - DelApp::initialize(&engine); + HusApp::initialize(&engine); const QUrl url(QStringLiteral("qrc:/main.qml")); QObject::connect( &engine, diff --git a/main.qml b/main.qml index fd10a03..32465a1 100644 --- a/main.qml +++ b/main.qml @@ -1,10 +1,10 @@ import QtQuick 2.15 import QtQuick.Window 2.15 -import DelegateUI 1.0 +import HuskarUI.Basic 1.0 import "./MyGlobals" 1.0 import "Page" 1.0 -DelWindow { +HusWindow { id:mainWindow width: 1080 height: 760 @@ -20,16 +20,16 @@ DelWindow { source: "qrc:/image/logo.png" } } - captionBar.topCallback: (checked) => {DelApi.setWindowStaysOnTopHint(mainWindow, checked);} + captionBar.topCallback: (checked) => {HusApi.setWindowStaysOnTopHint(mainWindow, checked);} Component.onCompleted: { // setSpecialEffect(2) GlobalVars.main_Window = this GlobalVars.msg_control = message1 - DelTheme.installThemePrimaryFontFamiliesBase('"Microsoft YaHei UI", BlinkMacSystemFont, "Segoe UI", Roboto'); + HusTheme.installThemePrimaryFontFamiliesBase('"Microsoft YaHei UI", BlinkMacSystemFont, "Segoe UI", Roboto'); } - DelMessage { + HusMessage { id: message1 z: 999 parent: mainWindow.captionBar